diff --git a/htdocs/core/js/lib_foot.js.php b/htdocs/core/js/lib_foot.js.php
new file mode 100644
index 00000000000..ff45a5d1017
--- /dev/null
+++ b/htdocs/core/js/lib_foot.js.php
@@ -0,0 +1,142 @@
+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ * or see http://www.gnu.org/
+ */
+
+/**
+ * \file htdocs/core/js/lib_foot.js.php
+ * \brief File that include javascript functions (included if option use_javascript activated)
+ */
+
+//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); // Not disabled cause need to load personalized language
+//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1');
+if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1');
+//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); // Not disabled cause need to do translations
+if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK',1);
+if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL',1);
+if (! defined('NOLOGIN')) define('NOLOGIN',1);
+if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU',1);
+if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML',1);
+if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1');
+
+session_cache_limiter(FALSE);
+
+require_once '../../main.inc.php';
+
+// Define javascript type
+top_httphead('text/javascript; charset=UTF-8');
+// Important: Following code is to avoid page request by browser and PHP CPU at each Dolibarr page access.
+if (empty($dolibarr_nocache)) header('Cache-Control: max-age=3600, public, must-revalidate');
+else header('Cache-Control: no-cache');
+
+//var_dump($conf);
+
+print '/* Reposition management (does not work if a redirect is done after action of submission) */'."\n";
+print 'jQuery(document).ready(function() {'."\n";
+print '/* If page_y set, we set scollbar with it */'."\n";
+print "page_y=getParameterByName('page_y', 0); if (page_y > 0) $('html, body').scrollTop(page_y);\n";
+print '/* Set handler to add page_y param on some a href links */'."\n";
+print 'jQuery(".reposition").click(function() {
+ var page_y = $(document).scrollTop();
+ this.href=this.href+\'&page_y=\'+page_y;
+ console.log("this.ref is now "+this.href)
+ });'."\n";
+print '});'."\n";
+
+
+// Wrapper to show tooltips (html or onclick popup)
+if (empty($conf->dol_no_mouse_hover))
+{
+ print "\n/* JS CODE TO ENABLE Tooltips on all object with class classfortooltip */\n";
+ print '
+ jQuery(document).ready(function () {
+ jQuery(".classfortooltip").tooltip({
+ show: { collision: "flipfit", effect:\'toggle\', delay:50 },
+ hide: { effect:\'toggle\', delay: 50 },
+ tooltipClass: "mytooltip",
+ content: function () {
+ return $(this).prop(\'title\'); /* To force to get title as is */
+ }
+ });
+ jQuery(".classfortooltiponclicktext").dialog({ closeOnEscape: true, classes: { "ui-dialog": "highlight" }, maxHeight: window.innerHeight-60, width: '.($conf->browser->layout == 'phone' ? 400 : 700).', autoOpen: false }).css("z-index: 5000");
+ jQuery(".classfortooltiponclick").click(function () {
+ console.log("We click on tooltip for element with dolid="+$(this).attr(\'dolid\'));
+ if ($(this).attr(\'dolid\'))
+ {
+ obj=$("#idfortooltiponclick_"+$(this).attr(\'dolid\')); /* obj is a div component */
+ obj.dialog("open");
+
+ }
+ });
+ });
+ ' . "\n";
+}
+
+// Wrapper to manage dropdown
+if (! defined('JS_JQUERY_DISABLE_DROPDOWN'))
+{
+ print "\n/* JS CODE TO ENABLE dropdown */\n";
+ print '
+ jQuery(document).ready(function () {
+ $(".dropdown dt a").on(\'click\', function () {
+ //console.log($(this).parent().parent().find(\'dd ul\'));
+ $(this).parent().parent().find(\'dd ul\').slideToggle(\'fast\');
+ // Note: Did not find a way to get exact height (value is update at exit) so i calculate a generic from nb of lines
+ heigthofcontent = 21 * $(this).parent().parent().find(\'dd div ul li\').length;
+ if (heigthofcontent > 300) heigthofcontent = 300; // limited by max-height on css .dropdown dd ul
+ posbottom = $(this).parent().parent().find(\'dd\').offset().top + heigthofcontent + 8;
+ //console.log(posbottom);
+ var scrollBottom = $(window).scrollTop() + $(window).height();
+ //console.log(scrollBottom);
+ diffoutsidebottom = (posbottom - scrollBottom);
+ console.log("heigthofcontent="+heigthofcontent+", diffoutsidebottom (posbottom="+posbottom+" - scrollBottom="+scrollBottom+") = "+diffoutsidebottom);
+ if (diffoutsidebottom > 0)
+ {
+ pix = "-"+(diffoutsidebottom+8)+"px";
+ console.log("We reposition top by "+pix);
+ $(this).parent().parent().find(\'dd\').css("top", pix);
+ }
+ // $(".dropdown dd ul").slideToggle(\'fast\');
+ });
+ $(".dropdowncloseonclick").on(\'click\', function () {
+ console.log("Link has class dropdowncloseonclick, so we close/hide the popup ul");
+ $(this).parent().parent().hide();
+ });
+
+ $(document).bind(\'click\', function (e) {
+ var $clicked = $(e.target);
+ if (!$clicked.parents().hasClass("dropdown")) $(".dropdown dd ul").hide();
+ });
+ });
+ ';
+}
+
+// Wrapper to manage document_preview
+if ($conf->browser->layout != 'phone')
+{
+ print "\n/* JS CODE TO ENABLE document_preview */\n";
+ print '
+ jQuery(document).ready(function () {
+ jQuery(".documentpreview").click(function () {
+ console.log("We click on preview for element with href="+$(this).attr(\'href\')+" mime="+$(this).attr(\'mime\'));
+ document_preview($(this).attr(\'href\'), $(this).attr(\'mime\'), \''.dol_escape_js($langs->transnoentities("Preview")).'\');
+ return false;
+ });
+ });
+ console.log("end of js code to manage preview");
+ ' . "\n";
+}
+
diff --git a/htdocs/core/js/lib_head.js.php b/htdocs/core/js/lib_head.js.php
index ddfe5d257e1..76817294e4d 100644
--- a/htdocs/core/js/lib_head.js.php
+++ b/htdocs/core/js/lib_head.js.php
@@ -853,7 +853,7 @@ function document_preview(file, type, title)
if ($.inArray(type, ValidImageTypes) < 0) {
var width='85%';
var object_width='100%';
- var height = $( window ).height()*0.90;
+ var height = ($( window ).height() - 60) * 0.90;
var object_height='98%';
show_preview('notimage');
diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php
index bb468fa6cc7..e13d8a2febf 100644
--- a/htdocs/core/lib/functions.lib.php
+++ b/htdocs/core/lib/functions.lib.php
@@ -6304,112 +6304,101 @@ function printCommonFooter($zone='private')
if ($zone == 'private') print "\n".''."\n";
else print "\n".''."\n";
- if (! empty($conf->global->MAIN_HTML_FOOTER)) print $conf->global->MAIN_HTML_FOOTER."\n";
-
- print "\n";
- if (! empty($conf->use_javascript_ajax))
+ $parameters=array();
+ $reshook=$hookmanager->executeHooks('printCommonFooter',$parameters); // Note that $action and $object may have been modified by some hooks
+ if (empty($reshook))
{
- print ''."\n";
- print ''."\n";
- }
-
- // Google Analytics (need Google module)
- if (! empty($conf->google->enabled) && ! empty($conf->global->MAIN_GOOGLE_AN_ID))
- {
- if (($conf->dol_use_jmobile != 4))
- {
- print "\n";
- print ''."\n";
+ if (empty($conf->dol_use_jmobile))
+ {
+ print "\n";
+ print '/* Set handler to switch left menu page (menuhider) */'."\n";
+ print 'jQuery(".menuhider").click(function() {';
+ print ' console.log("We click on .menuhider");'."\n";
+ //print " $('.side-nav').animate({width:'toggle'},200);\n"; // OK with eldy theme but not with md
+ print " $('.side-nav').toggle()\n";
+ print " $('.login_block').toggle()\n";
+ print '});'."\n";
+ }
+
+ // Google Analytics (need Google module)
+ if (! empty($conf->google->enabled) && ! empty($conf->global->MAIN_GOOGLE_AN_ID))
+ {
+ if (($conf->dol_use_jmobile != 4))
+ {
+ print "\n";
+ print "/* Set google analtics tag */\n";
+ print ' var _gaq = _gaq || [];'."\n";
+ print ' _gaq.push([\'_setAccount\', \''.$conf->global->MAIN_GOOGLE_AN_ID.'\']);'."\n";
+ print ' _gaq.push([\'_trackPageview\']);'."\n";
+ print ''."\n";
+ print ' (function() {'."\n";
+ print ' var ga = document.createElement(\'script\'); ga.type = \'text/javascript\'; ga.async = true;'."\n";
+ print ' ga.src = (\'https:\' == document.location.protocol ? \'https://ssl\' : \'http://www\') + \'.google-analytics.com/ga.js\';'."\n";
+ print ' var s = document.getElementsByTagName(\'script\')[0]; s.parentNode.insertBefore(ga, s);'."\n";
+ print ' })();'."\n";
+ }
+ }
+
+ // End of tuning
+ if (! empty($_SERVER['MAIN_SHOW_TUNING_INFO']) || ! empty($conf->global->MAIN_SHOW_TUNING_INFO))
+ {
+ print "\n";
+ print "/* Add memory info */\n";
+ print 'window.console && console.log("';
+ if (! empty($conf->global->MEMCACHED_SERVER)) print 'MEMCACHED_SERVER='.$conf->global->MEMCACHED_SERVER.' - ';
+ print 'MAIN_OPTIMIZE_SPEED='.(isset($conf->global->MAIN_OPTIMIZE_SPEED)?$conf->global->MAIN_OPTIMIZE_SPEED:'off');
+ if (! empty($micro_start_time)) // Works only if MAIN_SHOW_TUNING_INFO is defined at $_SERVER level. Not in global variable.
+ {
+ $micro_end_time = microtime(true);
+ print ' - Build time: '.ceil(1000*($micro_end_time-$micro_start_time)).' ms';
+ }
+ if (function_exists("memory_get_usage"))
+ {
+ print ' - Mem: '.memory_get_usage();
+ }
+ if (function_exists("xdebug_memory_usage"))
+ {
+ print ' - XDebug time: '.ceil(1000*xdebug_time_index()).' ms';
+ print ' - XDebug mem: '.xdebug_memory_usage();
+ print ' - XDebug mem peak: '.xdebug_peak_memory_usage();
+ }
+ if (function_exists("zend_loader_file_encoded"))
+ {
+ print ' - Zend encoded file: '.(zend_loader_file_encoded()?'yes':'no');
+ }
+ print '");'."\n";
+ }
+
+ print "\n".''."\n";
}
- }
-
- // End of tuning
- if (! empty($_SERVER['MAIN_SHOW_TUNING_INFO']) || ! empty($conf->global->MAIN_SHOW_TUNING_INFO))
- {
- print "\n".''."\n";
// Add Xdebug coverage of code
if (defined('XDEBUGCOVERAGE'))
{
print_r(xdebug_get_code_coverage());
}
- }
-
- // If there is some logs in buffer to show
- if (count($conf->logbuffer))
- {
- print "\n";
- print "\n";
}
- //print ''."\n";
- print "End of log output -->\n";
}
-
- $parameters=array();
- $reshook=$hookmanager->executeHooks('printCommonFooter',$parameters); // Note that $action and $object may have been modified by some hooks
}
/**
diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php
index 29546764f9b..93b4327620b 100644
--- a/htdocs/main.inc.php
+++ b/htdocs/main.inc.php
@@ -1928,101 +1928,23 @@ if (! function_exists("llxFooter"))
print ' '."\n"; // End div fiche
- if (empty($conf->dol_hide_leftmenu)) print ' '; // End div id-right
+ if (empty($conf->dol_hide_leftmenu)) print ' '."\n"; // End div id-right
+
+ if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) print ' '."\n"; // End div container
print "\n";
if ($comment) print ''."\n";
printCommonFooter($zone);
- if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) print ' '."\n"; // End div container
-
if (! empty($delayedhtmlcontent)) print $delayedhtmlcontent;
- // TODO Move this in lib_head.js.php
-
- // Wrapper to show tooltips (html or onclick popup)
- if (! empty($conf->use_javascript_ajax) && empty($conf->dol_no_mouse_hover))
+ if (! empty($conf->use_javascript_ajax))
{
- print "\n\n";
- print '' . "\n";
+ print "\n".''."\n";
+ print ''."\n";
}
-
- // Wrapper to manage document_preview
- if (! empty($conf->use_javascript_ajax) && ($conf->browser->layout != 'phone'))
- {
- print "\n\n";
- print '' . "\n";
- }
-
- // Wrapper to manage dropdown
- if (! empty($conf->use_javascript_ajax) && ! defined('JS_JQUERY_DISABLE_DROPDOWN'))
- {
- print "\n\n";
- print '';
- }
-
+
// Wrapper to add log when clicking on download or preview
if (! empty($conf->blockedlog->enabled) && is_object($object) && $object->id > 0 && $object->statut > 0)
{
@@ -2056,7 +1978,6 @@ if (! function_exists("llxFooter"))
}
}
-
// A div for the address popup
print "\n\n";
print '
'."\n";