Merge branch 'bootstrap' of https://github.com/PrestaShop/PrestaShop into bootstrap

Conflicts:
	modules/themeconfigurator/themeconfigurator.php
This commit is contained in:
Jerome Nadaud
2013-11-18 14:49:27 +01:00
68 changed files with 1072 additions and 861 deletions
@@ -128,6 +128,22 @@
<dd><a href="http://www.prestashop.com/en/contact-us?utm_source=backoffice_dashboard" target="_blank">{l s="Go to prestashop.com"}</a></dd>
</dl>
</section>
<section class="dash_simulation panel">
<h3><i class="icon-link"></i> {l s="Simulation Mode"}</h3>
<span class="switch prestashop-switch">
<input id="PS_DASHBOARD_SIMULATION_on" class="ps_dashboard_simulation" type="radio" checked="checked" value="1" name="PS_DASHBOARD_SIMULATION">
<label class="radioCheck" for="PS_DASHBOARD_SIMULATION_on">
<i class="icon-check-sign color_success"></i> {l s='Yes'}
</label>
<input id="PS_DASHBOARD_SIMULATION_off" class="ps_dashboard_simulation" type="radio" value="0" name="PS_DASHBOARD_SIMULATION">
<label class="radioCheck" for="PS_DASHBOARD_SIMULATION_off">
<i class="icon-ban-circle color_danger"></i> {l s='No'}
</label>
<span class="slide-button btn btn-default"></span>
</span>
</section>
</div>
</div>
</div>
@@ -24,7 +24,7 @@
*}
<div class="page-head">
<h2 class="page-title">
{l s='Configure'} : {$module_display_name} ({$module_name}}
{l s='Configure:'} {$module_display_name} ({$module_name})
</h2>
<div class="page-bar toolbarBox">
<div class="btn-toolbar">
@@ -309,7 +309,13 @@ class AdminDashboardControllerCore extends AdminController
die(Tools::jsonEncode(Hook::exec('dashboardData', $params, $id_module, true, true, (int)Tools::getValue('dashboard_use_push'))));
}
public function ajaxProcessSetSimulationMode()
{
Configuration::updateValue('PS_DASHBOARD_SIMULATION', (int)Tools::getValue('PS_DASHBOARD_SIMULATION'));
die ('k'.Configuration::get('PS_DASHBOARD_SIMULATION').'k');
}
public function ajaxProcessGetBlogRss()
{
$return = array('has_errors' => false, 'rss' => array());
+4 -1
View File
@@ -321,13 +321,16 @@ abstract class InstallControllerHttp
*/
public function getPhone()
{
if (InstallSession::getInstance()->support_phone != null)
return InstallSession::getInstance()->support_phone;
if ($this->phone === null)
{
$this->phone = $this->language->getInformation('phone', false);
if ($iframe = Tools::file_get_contents('http://api.prestashop.com/iframe/install.php?lang='.$this->language->getLanguageIso()))
if ($iframe = Tools::file_get_contents('http://api.prestashop.com/iframe/install.php?lang='.$this->language->getLanguageIso(), false, null, 3))
if (preg_match('/<img.+alt="([^"]+)".*>/Ui', $iframe, $matches) && isset($matches[1]))
$this->phone = $matches[1];
}
InstallSession::getInstance()->support_phone = $this->phone;
return $this->phone;
}
+1
View File
@@ -67,6 +67,7 @@ UPDATE `PREFIX_configuration` SET value = '1' WHERE name = 'BLOCK_CATEG_NBR_COLU
UPDATE `PREFIX_configuration` SET value = '' WHERE name = 'UPGRADER_BACKUPDB_FILENAME';
UPDATE `PREFIX_configuration` SET value = '' WHERE name = 'UPGRADER_BACKUPFILES_FILENAME';
UPDATE `PREFIX_configuration` SET value = '40' WHERE name = 'CONF_AVERAGE_PRODUCT_MARGIN';
UPDATE `PREFIX_configuration` SET value = '1' WHERE name = 'PS_DASHBOARD_SIMULATION';
/* No right column */
DELETE FROM `PREFIX_hook_module` WHERE id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayRightColumn');
+6
View File
@@ -781,5 +781,11 @@ Country</value>
<configuration id="PS_ATTRIBUTE_ANCHOR_SEPARATOR" name="PS_ATTRIBUTE_ANCHOR_SEPARATOR">
<value>-</value>
</configuration>
<configuration id="CONF_AVERAGE_PRODUCT_MARGIN" name="CONF_AVERAGE_PRODUCT_MARGIN">
<value>40</value>
</configuration>
<configuration id="PS_DASHBOARD_SIMULATION" name="PS_DASHBOARD_SIMULATION">
<value>1</value>
</configuration>
</entities>
</entity_configuration>
+24
View File
@@ -1,3 +1,27 @@
/*
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2013 PrestaShop SA
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
$(document).ready(function()
{
// Change logo
+24
View File
@@ -1,3 +1,27 @@
/*
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2013 PrestaShop SA
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
$(document).ready(function()
{
// Check database configuration
+24
View File
@@ -1,3 +1,27 @@
/*
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2013 PrestaShop SA
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
$(document).ready(function()
{
$('#mainForm').submit(function()
+24
View File
@@ -1,3 +1,27 @@
/*
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2013 PrestaShop SA
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
$(document).ready(function()
{
// Desactivate next button if licence checkbox is not checked
+24
View File
@@ -1,3 +1,27 @@
/*
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2013 PrestaShop SA
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
var is_installing = false;
$(document).ready(function()
{
+27 -8
View File
@@ -1,10 +1,29 @@
$(document).ready(function()
{
// Submit change of language
$('#langList').change(function()
{
var form = $('#mainForm');
form.attr('action', form.attr('action')+'#licenses-agreement');
form.submit();
/*
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2013 PrestaShop SA
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
$(document).ready(function() {
$('#langList').change(function() {
$('#mainForm').submit();
});
});
+14
View File
@@ -289,4 +289,18 @@ $(document).ready( function () {
getBlogRss();
bindSubmitDashConfig();
bindCancelDashConfig();
$('.ps_dashboard_simulation').change(function(e) {
$.ajax({
url : dashboard_ajax_url,
data : {
ajax:true,
action:'setSimulationMode',
PS_DASHBOARD_SIMULATION: $(this).val()
},
success : function(result) {
refreshDashboard(false, false);
}
});
});
});
+1 -1
View File
@@ -29,7 +29,7 @@
<div class="container">
<a href="{$banner_link}" title="{$banner_desc}">
{if isset($banner_img)}
<img src="{$module_dir}{$banner_img}" alt=""/>
<img class="img-responsive" src="{$module_dir}{$banner_img}" alt=""/>
{else}
{$banner_desc}
{/if}
+2 -2
View File
@@ -490,13 +490,13 @@ class Blocktopmenu extends Module
if ($category->level_depth == 2)
{
$files = scandir(_PS_CAT_IMG_DIR_);
$this->_menu .= '<div id="category-thumbnail">';
$this->_menu .= '<li id="category-thumbnail">';
foreach ($files as $file)
if (preg_match('/'.$category->id.'-([0-9])?_thumb.jpg/i', $file) === 1)
$this->_menu .= '<div>'.ImageManager::thumbnail(_PS_CAT_IMG_DIR_.$file, 'category_'.$file, 100, 'jpg', true, true).'</div>';
$this->_menu .= '</div>';
$this->_menu .= '</li>';
}
$this->_menu .= '</ul>';
+41 -2
View File
@@ -97,6 +97,45 @@ class Dashactivity extends Module
public function hookDashboardData($params)
{
if (Configuration::get('PS_DASHBOARD_SIMULATION'))
{
$days = round((strtotime($params['date_to']) - strtotime($params['date_from'])) / 3600 / 24);
$online_visitor = round(rand(10, 50));
$visits = round(rand(200, 2000) * $days);
return array(
'data_value' => array(
'pending_orders' => round(rand(0, 5)),
'return_exchanges' => round(rand(0, 5)),
'abandoned_cart' => round(rand(5, 50)),
'products_out_of_stock' => round(rand(1, 10)),
'new_messages' => round(rand(1, 10) * $days),
'order_inquires' => 42,
'product_reviews' => round(rand(5, 50) * $days),
'new_customers' => round(rand(1, 5) * $days),
'online_visitor' => $online_visitor,
'active_shopping_cart' => round($online_visitor / 10),
'new_registrations' => round(rand(1, 5) * $days),
'total_suscribers' => round(rand(200, 2000)),
'visits' => $visits,
'unique_visitors' => round($visits * 0.6),
),
'data_trends' => array(
'orders_trends' => array('way' => 'down', 'value' => 0.42),
),
'data_list_small' => array(
'dash_traffic_source' => array('prestashop.com' => round($visits / 2), 'google.com' => round($visits / 3), 'Direct Traffic' => round($visits / 4))
),
'data_chart' => array(
'dash_trends_chart1' => array('chart_type' => 'pie_chart_trends', 'data' => array(
array('key' => 'prestashop.com', 'y' => round($visits / 2)),
array('key' => 'google.com', 'y' => round($visits / 3)),
array('key' => 'Direct Traffic', 'y' => round($visits / 4))
))
)
);
}
$gapi = Module::isInstalled('gapi') ? Module::getInstanceByName('gapi') : false;
if (Validate::isLoadedObject($gapi) && $gapi->isConfigured())
{
@@ -353,14 +392,14 @@ class Dashactivity extends Module
$fields_form['form']['input'][] = array(
'label' => $this->l('Cart abandoned (min)'),
'desc' => $this->l('Default time range (min) to consider a Shopping cart as abandoned (default 24hrs)'),
'name' => 'DASHACTIVITY_CART_ABANDONED_MIN',
'name' => 'DASHACTIVITY_CART_ABANDONED',
'type' => 'text',
'suffix' => $this->l('hrs'),
);
$fields_form['form']['input'][] = array(
'label' => $this->l('Cart abandoned (max)'),
'desc' => $this->l('Default time range (max) to consider a Shopping cart as abandoned (default 48hrs)'),
'name' => 'DASHACTIVITY_CART_ABANDONED_MAX',
'name' => 'DASHACTIVITY_CART_ABANDONED',
'type' => 'text',
'suffix' => $this->l('hrs'),
);
+28 -6
View File
@@ -75,11 +75,30 @@ class Dashtrends extends Module
'total_expenses' => array()
);
$tmp_data['visits'] = AdminStatsControllerCore::getVisits(false, $date_from, $date_to, 'day');
$tmp_data['orders'] = AdminStatsControllerCore::getOrders($date_from, $date_to, 'day');
$tmp_data['total_paid_tax_excl'] = AdminStatsControllerCore::getTotalSales($date_from, $date_to, 'day');
$tmp_data['total_purchases'] = AdminStatsControllerCore::getPurchases($date_from, $date_to, 'day');
$tmp_data['total_expenses'] = AdminStatsControllerCore::getExpenses($date_from, $date_to, 'day');
if (Configuration::get('PS_DASHBOARD_SIMULATION'))
{
$from = strtotime($date_from.' 00:00:00');
$to = min(time(), strtotime($date_to.' 23:59:59'));
for ($date = $from; $date <= $to; $date = strtotime('+1 day', $date))
{
$tmp_data['visits'][$date] = round(rand(2000, 20000));
$tmp_data['conversion_rate'][$date] = rand(80, 250) / 100;
$tmp_data['average_cart_value'][$date] = round(rand(60, 200), 2);
$tmp_data['orders'][$date] = round($tmp_data['visits'][$date] * $tmp_data['conversion_rate'][$date] / 100);
$tmp_data['total_paid_tax_excl'][$date] = $tmp_data['orders'][$date] * $tmp_data['average_cart_value'][$date];
$tmp_data['total_purchases'][$date] = $tmp_data['total_paid_tax_excl'][$date] * rand(50, 70) / 100;
$tmp_data['total_expenses'][$date] = $tmp_data['total_paid_tax_excl'][$date] * rand(0, 10) / 100;
}
}
else
{
$tmp_data['visits'] = AdminStatsControllerCore::getVisits(false, $date_from, $date_to, 'day');
$tmp_data['orders'] = AdminStatsControllerCore::getOrders($date_from, $date_to, 'day');
$tmp_data['total_paid_tax_excl'] = AdminStatsControllerCore::getTotalSales($date_from, $date_to, 'day');
$tmp_data['total_purchases'] = AdminStatsControllerCore::getPurchases($date_from, $date_to, 'day');
$tmp_data['total_expenses'] = AdminStatsControllerCore::getExpenses($date_from, $date_to, 'day');
}
return $tmp_data;
}
@@ -93,7 +112,10 @@ class Dashtrends extends Module
'conversion_rate' => array(),
'net_profits' => array()
);
$from = max(strtotime(_PS_CREATION_DATE_.' 00:00:00'), strtotime($date_from.' 00:00:00'));
$from = strtotime($date_from.' 00:00:00');
if (!Configuration::get('PS_DASHBOARD_SIMULATION'))
$from = max(strtotime(_PS_CREATION_DATE_.' 00:00:00'), $from);
$to = min(time(), strtotime($date_to.' 23:59:59'));
for ($date = $from; $date <= $to; $date = strtotime('+1 day', $date))
{

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 158 KiB

@@ -1,16 +1,13 @@
<div id="htmlcontent">
<h2>{$htmlcontent.info.name} (v.{$htmlcontent.info.version})</h2>
{if $error}
{if isset($error) && $error}
{include file="{$htmlcontent.admin_tpl_path}messages.tpl" id="main" text=$error class='error'}
{/if}
{if $confirmation}
{if isset($confirmation) && $confirmation}
{include file="{$htmlcontent.admin_tpl_path}messages.tpl" id="main" text=$confirmation class='conf'}
{/if}
<!-- New -->
{include file="{$htmlcontent.admin_tpl_path}new.tpl"}
<!-- Slides -->
{include file="{$htmlcontent.admin_tpl_path}items.tpl"}
</div>
</div>
@@ -9,7 +9,7 @@
<div id="items-{$lang}" class="lang-content" style="display:{if $lang == $htmlitems.lang.default.id_lang}block{else}none{/if};">
{foreach name=hooks from=$langItems key=hook item=hookItems}
<h4 class="hook-title">{l s='Hook' mod='tmhtmlcontent'} "{$hook}"</h4>
<h4 class="hook-title">{l s='Hook' mod='themeconfigurator'} "{$hook}"</h4>
{if $hookItems}
<ul id="items">
{foreach name=items from=$hookItems item=hItem}
@@ -17,37 +17,37 @@
<span class="item-order">{if $hItem.item_order le 9}0{/if}{$hItem.item_order}</span>
<!--<i class="icon-sort"></i>-->
<span class="item-title">{$hItem.title}</span>
<span class="button btn btn-default button-edit pull-right"><i class="icon-edit"></i>{l s='Edit' mod='tmhtmlcontent'}</span>
<span class="button btn btn-default button-close pull-right"><i class="icon-remove"></i>{l s='Close' mod='tmhtmlcontent'}</span>
<span class="button btn btn-default button-edit pull-right"><i class="icon-edit"></i>{l s='Edit' mod='themeconfigurator'}</span>
<span class="button btn btn-default button-close pull-right"><i class="icon-remove"></i>{l s='Close' mod='themeconfigurator'}</span>
<div class="item-container">
<form method="post" action="{$htmlitems.postAction}" enctype="multipart/form-data" class="item-form defaultForm form-horizontal">
<input type="hidden" name="lang_id" value="{$lang}" />
<input type="hidden" name="id_lang" value="{$lang}" />
<input type="hidden" name="item_id" value="{$hItem.id_item}" />
<input type="hidden" name="item_order" value="{$hItem.item_order}" />
<div class="image-display item-field form-group">
<img src="{$module_dir}images/{$hItem.image}" alt="" title="" style="width:{$hItem.image_w}px; height:{$hItem.image_h}px;{if !$hItem.image} display:none;{/if}" class="preview" />
</div>
<div class="active item-field form-group">
<label class="control-label col-lg-3">{l s='Active' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Active' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input type="checkbox" name="item_active" value="1"{if $hItem.active == 1} checked="checked"{/if} />
</div>
</div>
<div class="title item-field form-group">
<label class="control-label col-lg-3">{l s='Title' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Title' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input type="text" name="item_title" size="48" value="{$hItem.title}" />
</div>
</div>
<div class="title_use item-field form-group">
<label class="control-label col-lg-3">{l s='Use title in front' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Use title in front' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input type="checkbox" name="item_title_use" value="1"{if $hItem.title_use == 1} checked="checked"{/if} />
</div>
</div>
<div class="hook item-field form-group">
<label class="control-label col-lg-3">{l s='Hook' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Hook' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<select name="item_hook" default="home">
<option value="home"{if $hItem.hook == 'home'} selected="selected"{/if}>home</option>
@@ -59,45 +59,45 @@
</div>
</div>
<div class="image item-field form-group">
<label class="control-label col-lg-3">{l s='Image' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Image' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input type="file" name="item_img" />
</div>
</div>
<div class="image_w item-field form-group">
<label class="control-label col-lg-3">{l s='Image width' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Image width' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input name="item_img_w" type="text" maxlength="4" size="4" value="{$hItem.image_w}"/>
</div>
</div>
<div class="image_h item-field form-group">
<label class="control-label col-lg-3">{l s='Image height' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Image height' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input name="item_img_h" type="text" maxlength="4" size="4" value="{$hItem.image_h}"/>
</div>
</div>
<div class="url item-field form-group">
<label class="control-label col-lg-3">{l s='URL' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='URL' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input type="text" name="item_url" size="48" value="{$hItem.url}" />
</div>
</div>
<div class="target item-field form-group">
<label class="control-label col-lg-3">{l s='Target blank' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Target blank' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input type="checkbox" name="item_target" value="1"{if $hItem.target == 1} checked="checked"{/if} />
</div>
</div>
<div class="html item-field form-group">
<label class="control-label col-lg-3">{l s='HTML' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='HTML' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<textarea name="item_html" cols="65" rows="12">{$hItem.html}</textarea>
</div>
</div>
<div class="form-group">
<div class="col-lg-9 col-lg-offset-3">
<button type="submit" name="removeItem" class="button btn btn-default button-remove" onClick="this.form.submit();"><i class="icon-remove-sign"></i>{l s='Remove' mod='tmhtmlcontent'}</button>
<button type="submit" name="updateItem" class="button btn btn-default button-save" onClick="this.form.submit();"><i class="icon-save"></i>{l s='Save' mod='tmhtmlcontent'}</button>
<button type="submit" name="removeItem" class="button btn btn-default button-remove" onClick="this.form.submit();"><i class="icon-remove-sign"></i>{l s='Remove' mod='themeconfigurator'}</button>
<button type="submit" name="updateItem" class="button btn btn-default button-save" onClick="this.form.submit();"><i class="icon-save"></i>{l s='Save' mod='themeconfigurator'}</button>
</div>
</div>
</form>
@@ -107,7 +107,7 @@
</ul>
{else}
<div class="item">
{l s='No items available' mod='tmhtmlcontent'}
{l s='No items available' mod='themeconfigurator'}
</div>
{/if}
{/foreach}
@@ -1,12 +1,12 @@
<div class="new-item">
<div class="form-group clearfix">
<span class="button btn btn-default new-item"><i class="icon-plus-sign"></i>{l s='Add item' mod='tmhtmlcontent'}</span>
<span class="button btn btn-default new-item"><i class="icon-plus-sign"></i>{l s='Add item' mod='themeconfigurator'}</span>
</div>
<div class="item-container">
<form method="post" action="{$htmlitems.postAction}" enctype="multipart/form-data" class="item-form defaultForm form-horizontal">
<div class="panel">
<div class="language item-field form-group">
<label class="control-label col-lg-3">{l s='Language' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Language' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" >
{foreach from=$htmlitems.lang.all item=lang}
@@ -19,21 +19,21 @@
<li id="lang-{$lang.id_lang}" class="new-lang-flag"><a href="javascript:hideOtherLanguage({$lang.id_lang});">{$lang.name}</a></li>
{/foreach}
</ul>
<input type="hidden" id="lang-id" name="lang_id" value="{$htmlitems.lang.default.id_lang}" />
<input type="hidden" id="lang-id" name="id_lang" value="{$htmlitems.lang.default.id_lang}" />
</div>
</div>
<div class="title item-field form-group">
<label class="control-label col-lg-3 ">{l s='Title' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3 ">{l s='Title' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input class="form-control" type="text" name="item_title" size="48" value="" />
</div>
</div>
<div class="title_use item-field form-group">
<label class="control-label col-lg-3">{l s='Use title in front' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Use title in front' mod='themeconfigurator'}</label>
<input type="checkbox" name="item_title_use" value="1" />
</div>
<div class="hook item-field form-group">
<label class="control-label col-lg-3">{l s='Hook' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Hook' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<select class="form-control" name="item_hook" default="home">
<option value="home">home</option>
@@ -45,44 +45,44 @@
</div>
</div>
<div class="image item-field form-group">
<label class="control-label col-lg-3">{l s='Image' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Image' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input type="file" name="item_img" />
</div>
</div>
<div class="image_w item-field form-group">
<label class="control-label col-lg-3">{l s='Image width' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Image width' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input name="item_img_w" type="text" maxlength="4" size="4" value=""/>
</div>
</div>
<div class="image_h item-field form-group">
<label class="control-label col-lg-3">{l s='Image height' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Image height' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input name="item_img_h" type="text" maxlength="4" size="4" value=""/>
</div>
</div>
<div class="url item-field form-group">
<label class="control-label col-lg-3">{l s='URL' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='URL' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input type="text" name="item_url" size="48" value="http://" />
</div>
</div>
<div class="target item-field form-group">
<label class="control-label col-lg-3">{l s='Target blank' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='Target blank' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<input type="checkbox" name="item_target" value="1" />
</div>
</div>
<div class="html item-field form-group">
<label class="control-label col-lg-3">{l s='HTML' mod='tmhtmlcontent'}</label>
<label class="control-label col-lg-3">{l s='HTML' mod='themeconfigurator'}</label>
<div class="col-lg-7">
<textarea name="item_html" cols="65" rows="12"></textarea>
</div>
</div>
<div class="form-group">
<div class="col-lg-9 col-lg-offset-3">
<button type="submit" name="newItem" class="button-save btn btn-default" onClick="this.form.submit();">{l s='Save' mod='tmhtmlcontent'}</button>
<button type="submit" name="newItem" class="button-save btn btn-default" onClick="this.form.submit();">{l s='Save' mod='themeconfigurator'}</button>
</div>
</div>
</div>
@@ -1,7 +1,7 @@
{if isset($htmlitems.items) && $htmlitems.items}
<div id="htmlcontent_home">
{if isset($htmlitems) && $htmlitems}
<div id="htmlcontent_{$hook}">
<ul class="htmlcontent-home clearfix row">
{foreach name=items from=$htmlitems.items item=hItem}
{foreach name=items from=$htmlitems item=hItem}
<li class="htmlcontent-item col-xs-4">
{if $hItem.url}
<a href="{$hItem.url}" class="item-link"{if $hItem.target == 1} target="_blank"{/if}>
@@ -1,36 +1,10 @@
<?php
/*
* 2007-2013 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2013 PrestaShop SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Location: ../");
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header('Location: ../../../../');
exit;
-12
View File
@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<module>
<name>tmhtmlcontent</name>
<displayName><![CDATA[TM HTML content]]></displayName>
<version><![CDATA[1.0]]></version>
<description><![CDATA[]]></description>
<author><![CDATA[TemplateMonster]]></author>
<tab><![CDATA[other]]></tab>
<is_configurable>1</is_configurable>
<need_instance>1</need_instance>
<limited_countries></limited_countries>
</module>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

-8
View File
@@ -1,8 +0,0 @@
<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Location: ../");
exit;
-387
View File
@@ -1,387 +0,0 @@
<?php
if(!defined('_PS_VERSION_'))
exit;
class TmHtmlContent extends Module {
protected $maxImageSize = 1048576;
private $_html = '';
protected $_defaultLanguage;
protected $_languages;
public function __construct() {
$this->name = 'tmhtmlcontent'; // Defines module name
$this->tab = 'other'; // Defines module tab name/module category in the admin panel
$this->author = 'TemplateMonster'; // Defines module author
$this->version = '1.0'; // Defines module version
$this->secure_key = Tools::encrypt($this->name);
$this->bootstrap = true;
$this->_defaultLanguage = Language::getLanguage(Configuration::get('PS_LANG_DEFAULT'));
$this->_languages = Language::getLanguages();
parent::__construct();
$this->displayName = $this->l('TM HTML content');
$this->desctiption = $this->l('Module for HTML content with images and links.');
// Paths
$this->module_path = _PS_MODULE_DIR_.$this->name.'/';
$this->uploads_path = _PS_MODULE_DIR_.$this->name.'/images/';
$this->admin_tpl_path = _PS_MODULE_DIR_.$this->name.'/views/templates/admin/';
$this->hooks_tpl_path = _PS_MODULE_DIR_.$this->name.'/views/templates/hooks/';
}
private function installDB() {
Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'tmhtmlcontent`');
if (!Db::getInstance()->Execute('
CREATE TABLE `'._DB_PREFIX_.'tmhtmlcontent` (
`id_item` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_shop` int(10) unsigned NOT NULL,
`id_lang` int(10) unsigned NOT NULL,
`item_order` int(10) unsigned NOT NULL,
`title` VARCHAR(100),
`title_use` tinyint(1) unsigned NOT NULL DEFAULT \'0\',
`hook` VARCHAR(100),
`url` VARCHAR(100),
`target` tinyint(1) unsigned NOT NULL DEFAULT \'0\',
`image` VARCHAR(100),
`image_w` VARCHAR(10),
`image_h` VARCHAR(10),
`html` TEXT,
`active` tinyint(1) unsigned NOT NULL DEFAULT \'1\',
PRIMARY KEY (`id_item`)
) ENGINE = '._MYSQL_ENGINE_.' DEFAULT CHARSET=UTF8;'))
return false;
return true;
}
public function install() {
/* Adds Module */
if (!parent::install() ||
$this->installDB() &&
!$this->registerHook('displayHeader') ||
!$this->registerHook('displayTop') ||
!$this->registerHook('displayLeftColumn') ||
!$this->registerHook('displayRightColumn') ||
!$this->registerHook('displayHome') ||
!$this->registerHook('displayFooter') ||
!$this->registerHook('displayBackOfficeHeader'))
return false;
return true;
}
public function uninstall() {
$images = Db::getInstance()->ExecuteS('SELECT image FROM `'._DB_PREFIX_.'tmhtmlcontent`');
foreach ($images as $image)
$this->_deleteImages($image);
if (!Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'tmhtmlcontent`') OR
!parent::uninstall())
return false;
return true;
}
public function getContent() {
$this->context->smarty->assign('error', 0);
$this->context->smarty->assign('confirmation', 0);
if (Tools::isSubmit('newItem')){
$this->_addItem();
} elseif (Tools::isSubmit('updateItem')){
$this->_updateItem();
} elseif (Tools::isSubmit('removeItem')) {
$this->_removeItem();
}
return $this->_displayForm();
}
private function _displayForm() {
$id_shop = (int)$this->context->shop->id;
$items = array();
$this->context->smarty->assign('htmlcontent', array(
'admin_tpl_path' => $this->admin_tpl_path,
'hooks_tpl_path' => $this->hooks_tpl_path,
'info' => array(
'module' => $this->name,
'name' => $this->displayName,
'version' => $this->version,
'psVersion' => _PS_VERSION_,
'context' => (Configuration::get('PS_MULTISHOP_FEATURE_ACTIVE') == 0) ? 1 : ($this->context->shop->getTotalShops() != 1) ? $this->context->shop->getContext() : 1
)
));
foreach ($this->_languages as $language) {
$hooks[$language['id_lang']] = array('home', 'top', 'left', 'right', 'footer');
foreach ($hooks[$language['id_lang']] as $hook) {
$items[$language['id_lang']][$hook] = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.$language['id_lang'].' AND hook = \''.$hook.'\' ORDER BY item_order ASC');
}
}
$this->context->smarty->assign('htmlitems', array(
'items' => $items,
'lang' => array(
'default' => $this->_defaultLanguage,
'all' => $this->_languages,
'lang_dir' => _THEME_LANG_DIR_,
'user' => $this->context->language->id
),
'postAction' => 'index.php?tab=AdminModules&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&tab_module=other&module_name='.$this->name.'',
'id_shop' => $id_shop
));
return $this->display(__FILE__, 'views/templates/admin/admin.tpl');
}
private function _addItem() {
$id_shop = (int)$this->context->shop->id;
$lastOrder = Db::getInstance()->ExecuteS('SELECT item_order FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.(int)Tools::getValue('lang_id').' AND hook = \''.Tools::getValue('item_hook').'\' ORDER BY item_order DESC LIMIT 1');
$currentOrder = ($lastOrder) ? $lastOrder[0]['item_order']+1 : 1 ;
$image_w = (is_numeric(Tools::getValue('item_img_w'))) ? intval(Tools::getValue('item_img_w')) : '';
$image_h = (is_numeric(Tools::getValue('item_img_h'))) ? intval(Tools::getValue('item_img_h')) : '';
if(!empty($_FILES['item_img']['name'])){
$image = $this->_uploadImage($_FILES['item_img'], $image_w, $image_h);
if(empty($image))
return false;
} else {
$image = '';
$image_w = '';
$image_h = '';
}
$insert = Db::getInstance()->Execute('
INSERT INTO `'._DB_PREFIX_.'tmhtmlcontent` (
`id_shop`, `id_lang`, `item_order`, `title`, `title_use`, `hook`, `url`, `target`, `image`, `image_w`, `image_h`, `html`, `active`
) VALUES (
\''.$id_shop.'\',
\''.(int)Tools::getValue('lang_id').'\',
\''.$currentOrder.'\',
\''.Tools::getValue('item_title').'\',
\''.(int)Tools::getValue('item_title_use').'\',
\''.Tools::getValue('item_hook').'\',
\''.Tools::getValue('item_url').'\',
\''.(int)Tools::getValue('item_target').'\',
\''.$image.'\',
\''.$image_w.'\',
\''.$image_h.'\',
\''.str_replace("'", "&acute;", Tools::getValue('item_html')).'\',
1)
');
if(!$insert){
$this->_deleteImages($image);
$this->context->smarty->assign('error', $this->l('An error occured while saving data.'));
return false;
}
$this->context->smarty->assign('confirmation', $this->l('New item added successfull.'));
}
private function _updateItem() {
$newImage = '';
$image_w = (is_numeric(Tools::getValue('item_img_w'))) ? intval(Tools::getValue('item_img_w')) : '';
$image_h = (is_numeric(Tools::getValue('item_img_h'))) ? intval(Tools::getValue('item_img_h')) : '';
if(!empty($_FILES['item_img']['name'])){
if ($oldImage = Db::getInstance()->ExecuteS('SELECT image FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_item = '.(int)Tools::getValue('item_id')))
$this->_deleteImages($oldImage[0]);
$image = $this->_uploadImage($_FILES['item_img'], $image_w, $image_h);
if(empty($image))
return false;
$newImage = 'image = \''.$image.'\',';
} else {
$image_w = '';
$image_h = '';
}
$update = Db::getInstance()->Execute('
UPDATE `'._DB_PREFIX_.'tmhtmlcontent` SET
title = \''.Tools::getValue('item_title').'\',
title_use = \''.(int)Tools::getValue('item_title_use').'\',
hook = \''.Tools::getValue('item_hook').'\',
url = \''.Tools::getValue('item_url').'\',
target = \''.(int)Tools::getValue('item_target').'\',
'.$newImage.'
image_w = \''.$image_w.'\',
image_h = \''.$image_h.'\',
active = \''.(int)Tools::getValue('item_active').'\',
html = \''.str_replace("'", "&acute;", Tools::getValue('item_html')).'\'
WHERE id_item = '.(int)Tools::getValue('item_id'));
if(!$update){
if ($newImage = Db::getInstance()->ExecuteS('SELECT image FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_item = '.(int)Tools::getValue('item_id')))
$this->_deleteImages($oldImage[0]);
$this->context->smarty->assign('error', $this->l('An error occured while saving data.'));
return false;
}
$this->context->smarty->assign('confirmation', $this->l('Saved succsessfull.'));
}
public function _removeItem() {
$id_shop = (int)$this->context->shop->id;
if ($delImage = Db::getInstance()->ExecuteS('SELECT image FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_item = '.(int)Tools::getValue('item_id')))
$this->_deleteImages($delImage[0]);
Db::getInstance()->delete(_DB_PREFIX_.'tmhtmlcontent', 'id_item = '.(int)Tools::getValue('item_id'));
if(Db::getInstance()->Affected_Rows() == 1){
Db::getInstance()->Execute('
UPDATE `'._DB_PREFIX_.'tmhtmlcontent`
SET item_order = item_order-1
WHERE (
item_order > '.Tools::getValue('item_order').' AND
id_shop = '.$id_shop.' AND
hook = \''.Tools::getValue('item_hook').'\')
');
$this->context->smarty->assign('confirmation', $this->l('Deleted succsessfull.'));
}else{
$this->context->smarty->assign('error', $this->l('Cant delete slide data from database.'));
}
}
private function _uploadImage($image, $image_w = '', $image_h = '') {
/* Uploads image */
$type = @strtolower(substr(strrchr($image['name'], '.'), 1));
$imagesize = array();
$imagesize = @getimagesize($image['tmp_name']);
Configuration::set('PS_IMAGE_QUALITY','png_all');
$salt = sha1(microtime());
if (isset($image) &&
isset($image['tmp_name']) &&
!empty($image['tmp_name']) &&
!empty($imagesize) &&
in_array(strtolower(substr(strrchr($imagesize['mime'], '/'), 1)), array('jpg', 'gif', 'jpeg', 'png')) &&
in_array($type, array('jpg', 'gif', 'jpeg', 'png')))
{
$temp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS');
if ($error = ImageManager::validateUpload($image))
$errors[] = $error;
elseif (!$temp_name || !move_uploaded_file($image['tmp_name'], $temp_name))
return false;
elseif (ImageManager::resize($temp_name, dirname(__FILE__).'/images/'.Tools::encrypt($image['name'].$salt).'.'.$type, $image_w, $image_h))
return Tools::encrypt($image['name'].$salt).'.'.$type;
else
$this->context->smarty->assign('error', $this->l('An error occurred during the image upload.'));
if (isset($temp_name))
@unlink($temp_name);
}
}
private function _deleteImages($image) {
if ($image && $image['image']!='' && is_file($this->uploads_path.$image['image']))
unlink($this->uploads_path.$image['image']);
}
public function hookDisplayBackOfficeHeader() {
// Check if module is loaded
if (Tools::getValue('configure') != $this->name)
return false;
// CSS
$this->context->controller->addCSS($this->_path.'views/css/admin.css');
// JS
$this->context->controller->addJquery();
$this->context->controller->addJS($this->_path.'views/js/admin.js');
}
public function hookdisplayHeader($params) {
$this->context->controller->addCss($this->_path.'views/css/hooks.css', 'all');
}
public function hookDisplayTop() {
$id_shop = (int)$this->context->shop->id;
$id_lang = $this->context->language->id;
$hook_name = 'top';
$items = array();
$items = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.$id_lang.' AND hook = \''.$hook_name.'\' AND active = 1 ORDER BY item_order ASC');
$this->context->smarty->assign('htmlitems', array(
'items' => $items
));
return $this->display(__FILE__, 'views/templates/hooks/top.tpl');
}
public function hookDisplayHome() {
$id_shop = (int)$this->context->shop->id;
$id_lang = $this->context->language->id;
$hook_name = 'home';
$items = array();
$items = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.$id_lang.' AND hook = \''.$hook_name.'\' AND active = 1 ORDER BY item_order ASC');
$this->context->smarty->assign('htmlitems', array(
'items' => $items
));
return $this->display(__FILE__, 'views/templates/hooks/home.tpl');
}
public function hookDisplayLeftColumn() {
$id_shop = (int)$this->context->shop->id;
$id_lang = $this->context->language->id;
$hook_name = 'left';
$items = array();
$items = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.$id_lang.' AND hook = \''.$hook_name.'\' AND active = 1 ORDER BY item_order ASC');
$this->context->smarty->assign('htmlitems', array(
'items' => $items
));
return $this->display(__FILE__, 'views/templates/hooks/left.tpl');
}
public function hookDisplayRightColumn() {
$id_shop = (int)$this->context->shop->id;
$id_lang = $this->context->language->id;
$hook_name = 'right';
$items = array();
$items = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.$id_lang.' AND hook = \''.$hook_name.'\' AND active = 1 ORDER BY item_order ASC');
$this->context->smarty->assign('htmlitems', array(
'items' => $items
));
return $this->display(__FILE__, 'views/templates/hooks/right.tpl');
}
public function hookDisplayFooter() {
$id_shop = (int)$this->context->shop->id;
$id_lang = $this->context->language->id;
$hook_name = 'footer';
$items = array();
$items = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.$id_lang.' AND hook = \''.$hook_name.'\' AND active = 1 ORDER BY item_order ASC');
$this->context->smarty->assign('htmlitems', array(
'items' => $items
));
return $this->display(__FILE__, 'views/templates/hooks/footer.tpl');
}
}
-10
View File
@@ -1,10 +0,0 @@
<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Location: ../");
exit;
@@ -1,10 +0,0 @@
<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Location: ../");
exit;
@@ -1,27 +0,0 @@
{if isset($htmlitems.items) && $htmlitems.items}
<div id="htmlcontent_footer">
<ul class="htmlcontent-home clearfix row">
{foreach name=items from=$htmlitems.items item=hItem}
<li class="htmlcontent-item col-xs-4">
{if $hItem.url}
<a href="{$hItem.url}" class="item-link"{if $hItem.target == 1} target="_blank"{/if}>
{/if}
{if $hItem.image}
<img src="{$module_dir}images/{$hItem.image}" class="item-img" alt="" />
{/if}
{if $hItem.title && $hItem.title_use == 1}
<h3 class="item-title">{$hItem.title}</h3>
{/if}
{if $hItem.html}
<div class="item-html">
{$hItem.html} <i class="icon-double-angle-right"></i>
</div>
{/if}
{if $hItem.url}
</a>
{/if}
</li>
{/foreach}
</ul>
</div>
{/if}
@@ -1,27 +0,0 @@
{if isset($htmlitems.items) && $htmlitems.items}
<div id="htmlcontent_left">
<ul class="htmlcontent-home clearfix row">
{foreach name=items from=$htmlitems.items item=hItem}
<li class="htmlcontent-item span4">
{if $hItem.url}
<a href="{$hItem.url}" class="item-link"{if $hItem.target == 1} target="_blank"{/if}>
{/if}
{if $hItem.image}
<img src="{$module_dir}images/{$hItem.image}" class="item-img" alt="" />
{/if}
{if $hItem.title && $hItem.title_use == 1}
<h3 class="item-title">{$hItem.title}</h3>
{/if}
{if $hItem.html}
<div class="item-html">
{$hItem.html} <i class="icon-double-angle-right"></i>
</div>
{/if}
{if $hItem.url}
</a>
{/if}
</li>
{/foreach}
</ul>
</div>
{/if}
@@ -1,27 +0,0 @@
{if isset($htmlitems.items) && $htmlitems.items}
<div id="htmlcontent_right">
<ul class="htmlcontent-home clearfix row">
{foreach name=items from=$htmlitems.items item=hItem}
<li class="htmlcontent-item col-xs-4">
{if $hItem.url}
<a href="{$hItem.url}" class="item-link"{if $hItem.target == 1} target="_blank"{/if}>
{/if}
{if $hItem.image}
<img src="{$module_dir}images/{$hItem.image}" class="item-img" alt="" />
{/if}
{if $hItem.title && $hItem.title_use == 1}
<h3 class="item-title">{$hItem.title}</h3>
{/if}
{if $hItem.html}
<div class="item-html">
{$hItem.html} <i class="icon-double-angle-right"></i>
</div>
{/if}
{if $hItem.url}
</a>
{/if}
</li>
{/foreach}
</ul>
</div>
{/if}
@@ -1,27 +0,0 @@
{if isset($htmlitems.items) && $htmlitems.items}
<div id="htmlcontent_top">
<ul class="htmlcontent-home clearfix row">
{foreach name=items from=$htmlitems.items item=hItem}
<li class="htmlcontent-item col-xs-4">
{if $hItem.url}
<a href="{$hItem.url}" class="item-link"{if $hItem.target == 1} target="_blank"{/if}>
{/if}
{if $hItem.image}
<img src="{$module_dir}images/{$hItem.image}" class="item-img" alt="" />
{/if}
{if $hItem.title && $hItem.title_use == 1}
<h3 class="item-title">{$hItem.title}</h3>
{/if}
{if $hItem.html}
<div class="item-html">
{$hItem.html} <i class="icon-double-angle-right"></i>
</div>
{/if}
{if $hItem.url}
</a>
{/if}
</li>
{/foreach}
</ul>
</div>
{/if}
@@ -1,10 +0,0 @@
<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Location: ../");
exit;
@@ -2,6 +2,19 @@
/*** ESSENTIAL STYLES ***/
.sf-contener {
clear: both;
float: left;
width: 100%;
margin: 50px 0 0;
}
@media (min-width: 480px) and (max-width: 767px) {
.sf-contener {
margin-top: 80px;
}
}
@media (max-width: 479px) {
.sf-contener {
margin-top: 70px;
}
}
.sf-menu, .sf-menu * {
@@ -11,30 +24,28 @@
}
.sf-menu {
margin: 50px 0 0;
position: relative;
padding: 0;
width: 100%;
border-bottom: 3px solid #e9e9e9;
background: #f6f6f6;
}
@media (min-width: 480px) and (max-width: 767px) {
@media (max-width: 767px) {
.sf-menu {
margin-top: 80px;
}
}
@media (max-width: 479px) {
.sf-menu {
margin-top: 70px;
display: none;
}
}
.sf-menu ul {
position: absolute;
top: -999em;
width: 10em;
/* left offset of submenus need to match (see below) */
background: white;
}
@media (max-width: 767px) {
.sf-menu ul {
position: relative;
}
}
.sf-menu ul li {
width: 100%;
@@ -45,15 +56,32 @@
/* fixes IE7 'sticky bug' */
}
.sf-menu li {
position: relative;
}
.sf-menu > li {
float: left;
border-right: 1px solid #d6d4d4;
margin-bottom: -3px;
}
@media (max-width: 767px) {
.sf-menu > li {
float: none;
position: relative;
border-right: none;
}
.sf-menu > li span {
position: absolute;
right: 6px;
top: 20px;
display: none;
width: 30px;
height: 30px;
z-index: 2;
}
.sf-menu > li span:after {
font-family: "FontAwesome";
content: "";
font-size: 26px;
}
}
.sf-menu > li > a {
font: 600 18px/22px "Open Sans", sans-serif;
text-transform: uppercase;
@@ -62,14 +90,25 @@
padding: 17px 20px;
border-bottom: 3px solid #e9e9e9;
}
@media (max-width: 767px) {
.sf-menu > li > a.sf-with-ul:after {
position: absolute;
right: 15px;
top: 18px;
font-family: "FontAwesome";
content: "";
font-size: 26px;
z-index: 1;
}
}
.sf-menu > li.sfHover > a, .sf-menu > li > a:hover, .sf-menu > li.sfHoverForce > a {
background: #333333;
border-bottom-color: #666666;
color: white;
}
.sf-menu li li a {
display: block;
.sf-menu li li li a {
display: inline-block;
position: relative;
color: #777777;
font-size: 13px;
@@ -77,13 +116,13 @@
font-weight: bold;
padding-bottom: 10px;
}
.sf-menu li li a:before {
.sf-menu li li li a:before {
content: "";
display: inline-block;
font-family: "FontAwesome";
padding-right: 10px;
}
.sf-menu li li a:hover {
.sf-menu li li li a:hover {
color: #333333;
}
@@ -93,12 +132,34 @@
top: 59px;
/* match top ul list item height */
z-index: 99;
width: 220px;
padding: 25px 30px;
padding: 12px 0px 18px 0px;
-webkit-box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 13px;
-moz-box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 13px;
box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 13px;
}
@media (max-width: 767px) {
.sf-menu li ul {
top: 0;
}
}
.sf-menu li li ul {
position: static;
display: block !important;
opacity: 1 !important;
background: none;
-webkit-box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px;
-moz-box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px;
box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px;
}
.sf-menu li li li ul {
padding: 0 0 0 20px;
}
.sf-menu li li li ul {
width: 220px;
}
ul.sf-menu li:hover li ul,
ul.sf-menu li.sfHover li ul {
@@ -123,3 +184,113 @@ ul.sf-menu li li li.sfHover ul {
/* match ul width */
top: 0;
}
.sf-menu > li > ul {
padding: 26px 30px 31px;
width: 100%;
}
.sf-menu > li > ul > li > a {
text-transform: uppercase;
font: 600 16px/20px "Open Sans", sans-serif;
color: #333333;
}
.sf-menu > li > ul > li > a:hover {
color: #515151;
}
.sf-menu > li > ul > li:not(#category-thumbnail) {
float: left;
width: 20%;
padding-right: 15px;
}
@media (max-width: 767px) {
.sf-menu > li > ul > li:not(#category-thumbnail) {
width: 50%;
}
}
@media (max-width: 479px) {
.sf-menu > li > ul > li:not(#category-thumbnail) {
width: 100%;
}
}
@media (min-width: 768px) {
.sf-menu > li > ul > li:not(#category-thumbnail).first-in-line-lg {
clear: left;
}
}
@media (min-width: 480px) and (max-width: 767px) {
.sf-menu > li > ul > li:not(#category-thumbnail).first-in-line-xs {
clear: left;
}
}
.sf-menu > li > ul > li#category-thumbnail {
width: 100%;
clear: both;
overflow: hidden;
}
.sf-menu > li > ul > li#category-thumbnail > div {
float: left;
padding-left: 10px;
width: 33.333%;
}
@media (max-width: 479px) {
.sf-menu > li > ul > li#category-thumbnail > div {
width: 100%;
padding-left: 0;
padding-top: 10px;
text-align: center;
}
}
.sf-menu > li > ul > li#category-thumbnail > div:first-child {
padding-left: 0;
}
.sf-menu > li > ul > li#category-thumbnail > div img {
max-width: 100%;
width: 100%;
display: block;
}
.cat-title {
display: none;
}
@media (max-width: 767px) {
.cat-title {
display: block;
font: 600 18px/22px "Open Sans", sans-serif;
text-transform: uppercase;
color: #484848;
display: block;
padding: 17px 20px;
border-bottom: 3px solid #e9e9e9;
background: #f6f6f6;
position: relative;
}
.cat-title:hover {
background: #333333;
border-bottom-color: #666666;
color: white;
}
.cat-title:after {
display: block;
font-family: "FontAwesome";
content: "";
position: absolute;
right: 15px;
top: 18px;
font-size: 26px;
}
.cat-title.active:after {
content: "";
}
}
@media (max-width: 767px) {
.sf-menu > li.sfHover > a.sf-with-ul:after, .sf-menu > li.sfHoverForce > a.sf-with-ul:after {
display: none;
}
.sf-menu > li.sfHover > span, .sf-menu > li.sfHoverForce > span {
display: block;
}
}
+3 -3
View File
@@ -78,7 +78,7 @@ function accordion(status){
}
function resposiveResize(){
function responsiveResize(){
if ($(document).width() <= 767 && responsiveflag == false){
accordion('enable'),
accordionFooter('enable'),
@@ -91,8 +91,8 @@ function resposiveResize(){
}
}
$(document).ready(resposiveResize);
$(window).resize(resposiveResize);
$(document).ready(responsiveResize);
$(window).resize(responsiveResize);
//replace top banner to top of page, before #header
$(document).ready(function(){
@@ -1,84 +1,114 @@
(function($){
/* hoverIntent by Brian Cherne */
$.fn.hoverIntent = function(f,g) {
// default configuration options
var cfg = {
sensitivity: 7,
interval: 100,
timeout: 0
};
// override configuration options with user supplied object
cfg = $.extend(cfg, g ? { over: f, out: g } : f );
/**
* hoverIntent is similar to jQuery's built-in "hover" method except that
* instead of firing the handlerIn function immediately, hoverIntent checks
* to see if the user's mouse has slowed down (beneath the sensitivity
* threshold) before firing the event. The handlerOut function is only
* called after a matching handlerIn.
*
* hoverIntent r7 // 2013.03.11 // jQuery 1.9.1+
* http://cherne.net/brian/resources/jquery.hoverIntent.html
*
* You may use hoverIntent under the terms of the MIT license. Basically that
* means you are free to use hoverIntent as long as this header is left intact.
* Copyright 2007, 2013 Brian Cherne
*
* // basic usage ... just like .hover()
* .hoverIntent( handlerIn, handlerOut )
* .hoverIntent( handlerInOut )
*
* // basic usage ... with event delegation!
* .hoverIntent( handlerIn, handlerOut, selector )
* .hoverIntent( handlerInOut, selector )
*
* // using a basic configuration object
* .hoverIntent( config )
*
* @param handlerIn function OR configuration object
* @param handlerOut function OR selector for delegation OR undefined
* @param selector selector OR undefined
* @author Brian Cherne <brian(at)cherne(dot)net>
**/
(function($) {
$.fn.hoverIntent = function(handlerIn,handlerOut,selector) {
// instantiate variables
// cX, cY = current X and Y position of mouse, updated by mousemove event
// pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
var cX, cY, pX, pY;
// default configuration values
var cfg = {
interval: 100,
sensitivity: 7,
timeout: 0
};
// A private function for getting mouse position
var track = function(ev) {
cX = ev.pageX;
cY = ev.pageY;
};
if ( typeof handlerIn === "object" ) {
cfg = $.extend(cfg, handlerIn );
} else if ($.isFunction(handlerOut)) {
cfg = $.extend(cfg, { over: handlerIn, out: handlerOut, selector: selector } );
} else {
cfg = $.extend(cfg, { over: handlerIn, out: handlerIn, selector: handlerOut } );
}
// A private function for comparing current and previous mouse position
var compare = function(ev,ob) {
ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
// compare mouse positions to see if they've crossed the threshold
if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
$(ob).unbind("mousemove",track);
// set hoverIntent state to true (so mouseOut can be called)
ob.hoverIntent_s = 1;
return cfg.over.apply(ob,[ev]);
} else {
// set previous coordinates for next time
pX = cX; pY = cY;
// use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
}
};
// instantiate variables
// cX, cY = current X and Y position of mouse, updated by mousemove event
// pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
var cX, cY, pX, pY;
// A private function for delaying the mouseOut function
var delay = function(ev,ob) {
ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
ob.hoverIntent_s = 0;
return cfg.out.apply(ob,[ev]);
};
// A private function for getting mouse position
var track = function(ev) {
cX = ev.pageX;
cY = ev.pageY;
};
// A private function for handling mouse 'hovering'
var handleHover = function(e) {
// next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } }
if ( p == this ) { return false; }
// A private function for comparing current and previous mouse position
var compare = function(ev,ob) {
ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
// compare mouse positions to see if they've crossed the threshold
if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
$(ob).off("mousemove.hoverIntent",track);
// set hoverIntent state to true (so mouseOut can be called)
ob.hoverIntent_s = 1;
return cfg.over.apply(ob,[ev]);
} else {
// set previous coordinates for next time
pX = cX; pY = cY;
// use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
}
};
// copy objects to be passed into t (required for event object to be passed in IE)
var ev = jQuery.extend({},e);
var ob = this;
// A private function for delaying the mouseOut function
var delay = function(ev,ob) {
ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
ob.hoverIntent_s = 0;
return cfg.out.apply(ob,[ev]);
};
// cancel hoverIntent timer if it exists
if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
// A private function for handling mouse 'hovering'
var handleHover = function(e) {
// copy objects to be passed into t (required for event object to be passed in IE)
var ev = jQuery.extend({},e);
var ob = this;
// else e.type == "onmouseover"
if (e.type == "mouseover") {
// set "previous" X and Y position based on initial entry point
pX = ev.pageX; pY = ev.pageY;
// update "current" X and Y position based on mousemove
$(ob).bind("mousemove",track);
// start polling interval (self-calling timeout) to compare mouse coordinates over time
if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
// cancel hoverIntent timer if it exists
if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
// else e.type == "onmouseout"
} else {
// unbind expensive mousemove event
$(ob).unbind("mousemove",track);
// if hoverIntent state is true, then call the mouseOut function after the specified delay
if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
}
};
// if e.type == "mouseenter"
if (e.type == "mouseenter") {
// set "previous" X and Y position based on initial entry point
pX = ev.pageX; pY = ev.pageY;
// update "current" X and Y position based on mousemove
$(ob).on("mousemove.hoverIntent",track);
// start polling interval (self-calling timeout) to compare mouse coordinates over time
if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
// bind the function to the two event listeners
return this.mouseover(handleHover).mouseout(handleHover);
};
// else e.type == "mouseleave"
} else {
// unbind expensive mousemove event
$(ob).off("mousemove.hoverIntent",track);
// if hoverIntent state is true, then call the mouseOut function after the specified delay
if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
}
};
// listen for mouseenter and mouseleave
return this.on({'mouseenter.hoverIntent':handleHover,'mouseleave.hoverIntent':handleHover}, cfg.selector);
};
})(jQuery);
@@ -1,124 +1,257 @@
/*
* Superfish v1.4.8 - jQuery menu widget
* Copyright (c) 2008 Joel Birch
* jQuery Superfish Menu Plugin - v1.7.4
* Copyright (c) 2013 Joel Birch
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*/
;(function($){
$.fn.superfish = function(op){
;(function ($) {
"use strict";
var sf = $.fn.superfish,
c = sf.c,
$arrow = $(['<span class="',c.arrowClass,'"> &#187;</span>'].join('')),
over = function(){
var $$ = $(this), menu = getMenu($$);
clearTimeout(menu.sfTimer);
$$.showSuperfishUl().siblings().hideSuperfishUl();
var methods = (function () {
// private properties and methods go here
var c = {
bcClass: 'sf-breadcrumb',
menuClass: 'sf-js-enabled',
anchorClass: 'sf-with-ul',
menuArrowClass: 'sf-arrows'
},
out = function(){
var $$ = $(this), menu = getMenu($$), o = sf.op;
clearTimeout(menu.sfTimer);
menu.sfTimer=setTimeout(function(){
o.retainPath=($.inArray($$[0],o.$path)>-1);
$$.hideSuperfishUl();
if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
},o.delay);
ios = (function () {
var ios = /iPhone|iPad|iPod/i.test(navigator.userAgent);
if (ios) {
// iOS clicks only bubble as far as body children
$(window).load(function () {
$('body').children().on('click', $.noop);
});
}
return ios;
})(),
wp7 = (function () {
var style = document.documentElement.style;
return ('behavior' in style && 'fill' in style && /iemobile/i.test(navigator.userAgent));
})(),
toggleMenuClasses = function ($menu, o) {
var classes = c.menuClass;
if (o.cssArrows) {
classes += ' ' + c.menuArrowClass;
}
$menu.toggleClass(classes);
},
getMenu = function($menu){
var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
sf.op = sf.o[menu.serial];
return menu;
setPathToCurrent = function ($menu, o) {
return $menu.find('li.' + o.pathClass).slice(0, o.pathLevels)
.addClass(o.hoverClass + ' ' + c.bcClass)
.filter(function () {
return ($(this).children(o.popUpSelector).hide().show().length);
}).removeClass(o.pathClass);
},
addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
return this.each(function() {
var s = this.serial = sf.o.length;
var o = $.extend({},sf.defaults,op);
o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
$(this).addClass([o.hoverClass,c.bcClass].join(' '))
.filter('li:has(ul)').removeClass(o.pathClass);
});
sf.o[s] = sf.op = o;
$('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
if (o.autoArrows) addArrow( $('>a:first-child',this) );
})
.not('.'+c.bcClass)
.hideSuperfishUl();
var $a = $('a',this);
$a.each(function(i){
var $li = $a.eq(i).parents('li');
$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
});
o.onInit.call(this);
}).each(function() {
menuClasses = [c.menuClass];
if (sf.op.dropShadows && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
$(this).addClass(menuClasses.join(' '));
});
};
toggleAnchorClass = function ($li) {
$li.children('a').toggleClass(c.anchorClass);
},
toggleTouchAction = function ($menu) {
var touchAction = $menu.css('ms-touch-action');
touchAction = (touchAction === 'pan-y') ? 'auto' : 'pan-y';
$menu.css('ms-touch-action', touchAction);
},
applyHandlers = function ($menu, o) {
var targets = 'li:has(' + o.popUpSelector + ')';
if ($.fn.hoverIntent && !o.disableHI) {
$menu.hoverIntent(over, out, targets);
}
else {
$menu
.on('mouseenter.superfish', targets, over)
.on('mouseleave.superfish', targets, out);
}
var touchevent = 'MSPointerDown.superfish';
if (!ios) {
touchevent += ' touchend.superfish';
}
if (wp7) {
touchevent += ' mousedown.superfish';
}
$menu
.on('focusin.superfish', 'li', over)
.on('focusout.superfish', 'li', out)
.on(touchevent, 'a', o, touchHandler);
},
touchHandler = function (e) {
var $this = $(this),
$ul = $this.siblings(e.data.popUpSelector);
var sf = $.fn.superfish;
sf.o = [];
sf.op = {};
sf.IE7fix = function(){
var o = sf.op;
if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
this.toggleClass(sf.c.shadowClass+'-off');
if ($ul.length > 0 && $ul.is(':hidden')) {
$this.one('click.superfish', false);
if (e.type === 'MSPointerDown') {
$this.trigger('focus');
} else {
$.proxy(over, $this.parent('li'))();
}
}
},
over = function () {
var $this = $(this),
o = getOptions($this);
clearTimeout(o.sfTimer);
$this.siblings().superfish('hide').end().superfish('show');
},
out = function () {
var $this = $(this),
o = getOptions($this);
if (ios) {
$.proxy(close, $this, o)();
}
else {
clearTimeout(o.sfTimer);
o.sfTimer = setTimeout($.proxy(close, $this, o), o.delay);
}
},
close = function (o) {
o.retainPath = ($.inArray(this[0], o.$path) > -1);
this.superfish('hide');
if (!this.parents('.' + o.hoverClass).length) {
o.onIdle.call(getMenu(this));
if (o.$path.length) {
$.proxy(over, o.$path)();
}
}
},
getMenu = function ($el) {
return $el.closest('.' + c.menuClass);
},
getOptions = function ($el) {
return getMenu($el).data('sf-options');
};
return {
// public methods
hide: function (instant) {
if (this.length) {
var $this = this,
o = getOptions($this);
if (!o) {
return this;
}
var not = (o.retainPath === true) ? o.$path : '',
$ul = $this.find('li.' + o.hoverClass).add(this).not(not).removeClass(o.hoverClass).children(o.popUpSelector),
speed = o.speedOut;
if (instant) {
$ul.show();
speed = 0;
}
o.retainPath = false;
o.onBeforeHide.call($ul);
$ul.stop(true, true).animate(o.animationOut, speed, function () {
var $this = $(this);
o.onHide.call($this);
});
}
return this;
},
show: function () {
var o = getOptions(this);
if (!o) {
return this;
}
var $this = this.addClass(o.hoverClass),
$ul = $this.children(o.popUpSelector);
o.onBeforeShow.call($ul);
$ul.stop(true, true).animate(o.animation, o.speed, function () {
o.onShow.call($ul);
});
return this;
},
destroy: function () {
return this.each(function () {
var $this = $(this),
o = $this.data('sf-options'),
$hasPopUp;
if (!o) {
return false;
}
$hasPopUp = $this.find(o.popUpSelector).parent('li');
clearTimeout(o.sfTimer);
toggleMenuClasses($this, o);
toggleAnchorClass($hasPopUp);
toggleTouchAction($this);
// remove event handlers
$this.off('.superfish').off('.hoverIntent');
// clear animation's inline display style
$hasPopUp.children(o.popUpSelector).attr('style', function (i, style) {
return style.replace(/display[^;]+;?/g, '');
});
// reset 'current' path classes
o.$path.removeClass(o.hoverClass + ' ' + c.bcClass).addClass(o.pathClass);
$this.find('.' + o.hoverClass).removeClass(o.hoverClass);
o.onDestroy.call($this);
$this.removeData('sf-options');
});
},
init: function (op) {
return this.each(function () {
var $this = $(this);
if ($this.data('sf-options')) {
return false;
}
var o = $.extend({}, $.fn.superfish.defaults, op),
$hasPopUp = $this.find(o.popUpSelector).parent('li');
o.$path = setPathToCurrent($this, o);
$this.data('sf-options', o);
toggleMenuClasses($this, o);
toggleAnchorClass($hasPopUp);
toggleTouchAction($this);
applyHandlers($this, o);
$hasPopUp.not('.' + c.bcClass).superfish('hide', true);
o.onInit.call(this);
});
}
};
sf.c = {
bcClass : 'sf-breadcrumb',
menuClass : 'sf-js-enabled',
anchorClass : 'sf-with-ul',
arrowClass : 'sf-sub-indicator',
shadowClass : 'sf-shadow'
};
sf.defaults = {
hoverClass : 'sfHover',
pathClass : 'overideThisToUse',
pathLevels : 1,
delay : 800,
animation : {opacity:'show'},
speed : 'fast',
autoArrows : false,
dropShadows : false,
disableHI : false, // true disables hoverIntent detection
onInit : function(){}, // callback functions
onBeforeShow: function(){},
onShow : function(){},
onHide : function(){}
};
$.fn.extend({
hideSuperfishUl : function(){
var o = sf.op,
not = (o.retainPath===true) ? o.$path : '';
o.retainPath = false;
var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
.find('>ul').hide().css('visibility','hidden');
o.onHide.call($ul);
return this;
},
showSuperfishUl : function(){
var o = sf.op,
sh = sf.c.shadowClass+'-off',
$ul = this.addClass(o.hoverClass)
.find('>ul:hidden').css('visibility','visible');
sf.IE7fix.call($ul);
o.onBeforeShow.call($ul);
$ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
return this;
})();
$.fn.superfish = function (method, args) {
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 {
return $.error('Method ' + method + ' does not exist on jQuery.fn.superfish');
}
};
$.fn.superfish.defaults = {
popUpSelector: 'ul,.sf-mega', // within menu context
hoverClass: 'sfHover',
pathClass: 'overrideThisToUse',
pathLevels: 1,
delay: 800,
animation: {opacity: 'show'},
animationOut: {opacity: 'hide'},
speed: 'normal',
speedOut: 'fast',
cssArrows: true,
disableHI: false,
onInit: $.noop,
onBeforeShow: $.noop,
onShow: $.noop,
onBeforeHide: $.noop,
onHide: $.noop,
onIdle: $.noop,
onDestroy: $.noop
};
// soon to be deprecated
$.fn.extend({
hideSuperfishUl: methods.hide,
showSuperfishUl: methods.show
});
})(jQuery);
jQuery(function(){
jQuery('ul.sf-menu').superfish();
});
})(jQuery);
@@ -2,7 +2,8 @@
<!-- Menu -->
<div class="sf-contener clearfix">
<ul class="sf-menu clearfix">
<div class="cat-title">{l s="Categories" mod="blocktopmenu"}</div>
<ul class="sf-menu clearfix menu-content">
{$MENU}
{if $MENU_SEARCH}
<li class="sf-search noBack" style="float:right">
@@ -20,4 +21,58 @@
</div>
<!--/ Menu -->
{/if}
{literal}
<script type="text/javascript">
$(document).ready(function() {
categoryMenu = $('ul.sf-menu'); //var rich menu
categoryMenu.superfish(); //menu initialization
$('.sf-menu > li > ul').addClass('container'); //add class for width define
i = 0;
$('.sf-menu > li > ul > li:not(#category-thumbnail)').each(function() { //add classes for clearing
i++;
if(i%2==1)
$(this).addClass('first-in-line-xs');
else if (i%5==1)
$(this).addClass('first-in-line-lg');
});
});
// accordion for definition smaller that 767px
responsiveflagMenu = false;
function menuChange(status){
if(status == 'enable'){
$('.sf-menu > li > ul').removeAttr('style');
$('.sf-menu').removeAttr('style');
$('.sf-contener .cat-title').on('click', function(){
$(this).toggleClass('active').parent().find('ul.menu-content').stop().slideToggle('medium');
}),
$('.sf-menu > li:has(ul)').each(function() {
$(this).prepend('<span></span>'),
$(this).find('span').on('click touchend', function(){
categoryMenu.superfish('hide');
});
});
}else{
$('.sf-contener .cat-title').off();
$('.sf-menu').removeAttr('style');
$('.sf-menu > li > ul').removeAttr('style');
$('.sf-contener .cat-title').removeClass('active');
}
}
function responsiveMenu(){
if ($(document).width() <= 767 && responsiveflagMenu == false){
menuChange('enable'),
responsiveflagMenu = true
}
else if ($(document).width() >= 768){
menuChange('disable'),
responsiveflagMenu = false
}
}
$(document).ready(responsiveMenu);
$(window).resize(responsiveMenu);
</script>
{/literal}
{/if}
@@ -2,6 +2,15 @@
/*** ESSENTIAL STYLES ***/
.sf-contener {
clear:both;
float:left;
width:100%;
margin: 50px 0 0;
@media (min-width: $screen-xs) and (max-width: $screen-xs-max) { // min 480px max 767px
margin-top:80px;
}
@media (max-width: $screen-xs - 1) { // max 479px
margin-top:70px;
}
}
.sf-right {
}
@@ -11,23 +20,22 @@
list-style: none;
}
.sf-menu {
margin: 50px 0 0;
position: relative;
padding: 0;
width: 100%;
border-bottom: 3px solid #e9e9e9;
background: #f6f6f6;
@media (min-width: $screen-xs) and (max-width: $screen-xs-max) { // min 480px max 767px
margin-top:80px;
}
@media (max-width: $screen-xs - 1) { // max 479px
margin-top:70px;
@media (max-width: $screen-xs-max) { // max 767px
display:none;
}
}
.sf-menu ul {
position: absolute;
top: -999em;
width: 10em; /* left offset of submenus need to match (see below) */
background: $light-background;
@media (max-width: $screen-xs-max) { // max 767px
position:relative;
}
}
.sf-menu ul li {
width: 100%;
@@ -35,14 +43,31 @@
.sf-menu li:hover {
visibility: inherit; /* fixes IE7 'sticky bug' */
}
.sf-menu li {
position: relative;
}
.sf-menu > li {
float: left;
border-right: 1px solid $base-border-color;
margin-bottom: -3px;
@media (max-width: $screen-xs-max) { // max 767px
float:none;
position:relative;
border-right:none;
span {
position:absolute;
right:6px;
top:20px;
display:none;
width:30px;
height:30px;
z-index:2;
&:after {
font-family:$font-icon;
content:"";
font-size:26px;
}
}
}
> a {
font: 600 18px/22px $font-custom;
text-transform: uppercase;
@@ -50,6 +75,19 @@
display: block;
padding: 17px 20px;
border-bottom: 3px solid #e9e9e9;
@media (max-width: $screen-xs-max) { // max 767px
&.sf-with-ul {
&:after {
position:absolute;
right:15px;
top:18px;
font-family:$font-icon;
content:"";
font-size:26px;
z-index:1;
}
}
}
}
&.sfHover > a, > a:hover, &.sfHoverForce > a {
@@ -58,8 +96,8 @@
color: $light-text-color;
}
}
.sf-menu li li a {
display: block;
.sf-menu li li li a {
display: inline-block;
position: relative;
color: #777777;
font-size: 13px;
@@ -83,9 +121,24 @@
left: 0;
top: 59px; /* match top ul list item height */
z-index: 99;
width: 220px;
padding: 25px 30px;
padding: 12px 0px 18px 0px;
@include box-shadow(rgba(black, 0.20) 0px 5px 13px);
@media (max-width: $screen-xs-max) { // max 767px
top:0;
}
}
.sf-menu li li ul {
position:static;
display:block !important;
opacity:1 !important;
background:none;
@include box-shadow(rgba(black, 0) 0px 0px 0px);
}
.sf-menu li li li ul {
padding:0 0 0 20px;
}
.sf-menu li li li ul {
width: 220px;
}
ul.sf-menu li:hover li ul,
ul.sf-menu li.sfHover li ul {
@@ -105,3 +158,100 @@ ul.sf-menu li li li.sfHover ul {
left: 200px; /* match ul width */
top: 0;
}
.sf-menu > li > ul {
padding:26px 30px 31px;
width:100%;
> li {
> a {
text-transform:uppercase;
font:600 16px/20px $font-custom;
color:$base-text-color;
&:hover {
color:$link-hover-color;
}
}
}
}
.sf-menu > li > ul > li:not(#category-thumbnail) {
float:left;
width:20%;
padding-right:15px;
@media (max-width: $screen-xs-max) { // max 767px
width:50%;
}
@media (max-width: $screen-xs - 1) { // max 479px
width:100%;
}
@media (min-width: $screen-sm) { // min 768px
&.first-in-line-lg {clear:left;}
}
@media (min-width: $screen-xs) and (max-width: $screen-xs-max) { // min 480px max 767px
&.first-in-line-xs {clear:left;}
}
}
.sf-menu > li > ul > li#category-thumbnail {
width:100%;
clear:both;
overflow:hidden;
> div {
float:left;
padding-left:10px;
width:33.333%;
@media (max-width: $screen-xs - 1) { // max 479px
width:100%;
padding-left:0;
padding-top:10px;
text-align:center;
}
&:first-child {padding-left:0;}
img {
max-width:100%;
width:100%;
display:block;
}
}
}
.cat-title {
display:none;
@media (max-width: $screen-xs-max) { // max 767px
display: block;
font: 600 18px/22px $font-custom;
text-transform: uppercase;
color: #484848;
display: block;
padding: 17px 20px;
border-bottom: 3px solid #e9e9e9;
background: #f6f6f6;
position:relative;
&:hover {
background: $dark-background;
border-bottom-color: #666666;
color: $light-text-color;
}
&:after {
display:block;
font-family:$font-icon;
content:"";
position:absolute;
right:15px;
top:18px;
font-size:26px;
}
&.active:after{
content:"";
}
}
}
@media (max-width: $screen-xs-max) { // max 767px
.sf-menu > li.sfHover > a.sf-with-ul:after, .sf-menu > li.sfHoverForce > a.sf-with-ul:after {
display:none;
}
.sf-menu > li.sfHover > span, .sf-menu > li.sfHoverForce > span {
display:block;
}
}