= 0) { $decoded = json_decode($in, $array, 128,JSON_INVALID_UTF8_SUBSTITUTE | JSON_BIGINT_AS_STRING); } else { $decoded = json_decode($in, $array, 128,JSON_BIGINT_AS_STRING); } $jsl = json_last_error(); if($jsl == JSON_ERROR_NONE) { return $decoded; } else if($jsl == JSON_ERROR_SYNTAX) { //This happens, if we tried to decode a normal string return $in; } else { self::json_error_msg($jsl, $in, 'Json Decode'); return $decoded;//''; } return ''; //if some other error } public static function safe_json_encode($in){ if (version_compare(PHP_VERSION, '7.2.0') >= 0) { $encoded = json_encode($in, JSON_PRETTY_PRINT | JSON_INVALID_UTF8_SUBSTITUTE /*| JSON_NUMERIC_CHECK*/ | JSON_PARTIAL_OUTPUT_ON_ERROR | JSON_PRESERVE_ZERO_FRACTION); } else { $encoded = json_encode($in, JSON_PRETTY_PRINT); } $jsl = json_last_error(); if($jsl == JSON_ERROR_NONE){ return $encoded; } else { self::json_error_msg($jsl, $in,'Json Encode'); return $encoded; } } static public function json_error_msg($jsl, $in, $context){ switch($jsl) { case JSON_ERROR_DEPTH: $msg = 'The maximum stack depth has been exceeded'; break; case JSON_ERROR_STATE_MISMATCH: $msg = 'Invalid or malformed JSON, underflow or the modes mismatch'; break; case JSON_ERROR_CTRL_CHAR: $msg = 'Control character error, possibly incorrectly encoded'; return; break; case JSON_ERROR_UTF8: $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; break; //$clean = self::utf8ize($value); //return self::safe_json_encode($clean); case JSON_ERROR_RECURSION: $msg = 'One or more recursive references in the value to be encoded'; break; case JSON_ERROR_INF_OR_NAN: $msg = 'One or more NAN or INF values in the value to be encoded'; break; case JSON_ERROR_UNSUPPORTED_TYPE: $msg = 'A value of a type that cannot be encoded was given'; break; case JSON_ERROR_INVALID_PROPERTY_NAME: $msg = 'A property name that cannot be encoded was given'; break; case JSON_ERROR_UTF16: $msg = 'Malformed UTF-16 characters, possibly incorrectly encoded'; break; default: $msg = ' - Unknown error '.$jsl.' '.json_last_error_msg(); } vmdebug($context.': - '.$msg.' '.$in); vmError($context.': - '.$msg.' '.$in,'',7); return ''; } static public function utf8ize($mixed) { if (is_array($mixed)) { foreach ($mixed as $key => $value) { $mixed[$key] = self::utf8ize($value); } } else if (is_string ($mixed)) { if (function_exists ('mb_convert_encoding')) { return mb_convert_encoding($mixed, "UTF-8", "auto"); } else { return utf8_encode($mixed); } } return $mixed; } /** * * @param $name * @param bool $script * @param bool $min * @param bool $defer http://peter.sh/experiments/asynchronous-and-deferred-javascript-execution-explained/ * @param bool $async */ public static function addJScript($name, $script = false, $defer = false, $async = false, $inline = false, $ver = 0){ self::$_jsAdd[$name]['script'] = trim($script); self::$_jsAdd[$name]['defer'] = $defer; self::$_jsAdd[$name]['async'] = $async; if(!isset(self::$_jsAdd[$name]['written']))self::$_jsAdd[$name]['written'] = false; self::$_jsAdd[$name]['inline'] = $inline; self::$_jsAdd[$name]['ver'] = $ver; } public static function getJScripts(){ return self::$_jsAdd; } public static function removeJScript($name){ unset(self::$_jsAdd[$name]); } public static function jhtml(...$j_args) { $name = reset($j_args); self::$_jsAddJhtml[$name] = $j_args; } public static function writeJS(){ $html = ''; $headInline = ''; $document = JFactory::getDocument(); foreach (self::$_jsAddJhtml as $name => $j_args) { if (empty($j_args)) { JHtml::_($name); } else { //injects the framework as first param: call_user_func_array('JHtml::_', $j_args); } } foreach(self::$_jsAdd as $name => &$jsToAdd){ if($jsToAdd['written']) continue; $urlType = 0; if(!$jsToAdd['script']){ $file = $name; $cdata = false; } else { $file = $jsToAdd['script']; $cdata = (strpos($file,'//'; /*$content = file_get_contents(VMPATH_ROOT.$file); $html .= '';*/ $script = trim($jsToAdd['script']); if(!empty($script)) { $script = trim( $script, chr( 13 ) ); $script = trim( $script, chr( 10 ) ); $headInline .= $script. chr(13); //$document->addScript( $script,"text/javascript",$jsToAdd['defer'],$jsToAdd['async'] ); } } else { $ver = ''; if($jsToAdd['ver']===0){ $ver = '?vmver='.VM_JS_VER; } else if(!empty($jsToAdd['ver'])) { $ver = '?vmver='.$jsToAdd['ver']; } $options = array(); $attribs = array(); if($jsToAdd['defer']){ $attribs['defer'] = 'defer'; } if($jsToAdd['async']){ $attribs['async'] = 'async'; } $attribs['mime'] = "text/javascript"; $document->addScript( $file .$ver, $options, $attribs ); } } else { $script = trim($jsToAdd['script']); if(!empty($script)) { $script = trim($script,chr(13)); $script = trim($script,chr(10)); $defer = ''; if($jsToAdd['defer']){ $defer = 'defer'; } $async = ''; if($jsToAdd['async']){ $async = 'async'; } if($cdata===false){ $html .= ''; } else { $html .= ''; } } } $html .= chr(13); $jsToAdd['written'] = true; } if(!empty($headInline)){ $document->addScriptDeclaration( '//'.chr(10) ); } return $html; } /** * Write a element * @deprecated * @param string path to file * @param string library name * @param string library version * @param boolean load minified version * @return nothing */ public static function js($namespace, $path=FALSE, $version='', $minified = false) { self::addJScript($namespace,false,false); } /** * Write a element * @param string path to file * @param string library name * @param string library version * @param boolean library version * @return nothing */ public static function css($namespace, $path = FALSE, $version='', $minified = NULL) { static $loaded = array(); // Only load once // using of namespace assume same css have same namespace // loading 2 time css with this method simply return and do not load it the second time if (!empty($loaded[$namespace])) { return; } $file = vmJsApi::setPath( $namespace, $path, $version='', $minified, 'css'); if(empty($file)){ vmError('Could not load Css with params $namespace:'.$namespace.' $path:'.$path .' $version:'.$version.' $minified:'.$minified); } else { $document = JFactory::getDocument(); $document->addStyleSheet($file.'?vmver='.VM_JS_VER); } $loaded[$namespace] = TRUE; } static public function addBECSS ($namespace){ $url = ''; if(VmConfig::get('backendTemplate',true) or JVM_VERSION>3){ if(JFile::exists(JPATH_ROOT .'/administrator/templates/vmadmin/html/com_virtuemart/assets/css/'.$namespace.'.css')){ $url = '/administrator/templates/vmadmin/html/com_virtuemart/assets/css/'.$namespace.'.css'; //vmdebug('Added backend css vmadmin '.$namespace); } } if(empty($url)){ if(JFile::exists(JPATH_ROOT .'/administrator/components/com_virtuemart/assets/css/'.$namespace.'.css')){ $url = '/administrator/components/com_virtuemart/assets/css/'.$namespace.'.css'; //vmdebug('Added backend css default '.$namespace); } } $document = JFactory::getDocument(); $document->addStyleSheet(JURI::root(TRUE) .$url.'?vmver='.VM_JS_VER); } static public function loadBECSS(){ $admin = 'administrator/components/com_virtuemart/assets/css'; //loading defaut admin CSS vmJsApi::addBECSS('admin_ui',$admin); vmJsApi::addBECSS('admin.styles',$admin); vmJsApi::addBECSS('toolbar_images',$admin); vmJsApi::addBECSS('menu_images',$admin); vmJsApi::css('vtip'); if(VmConfig::isSiteByApp() and VmConfig::get('FEmanageloadIsisCss',true)){ vmJsApi::css('template','administrator/templates/isis/css'); } } /** * Get the file path of the asset. * * @param string $fileName The name of the file without extension. * @param string $directory The directory of the file. * @param string $version The version number. * @param bool $useMinified If true, minified vesion of the file will be used. * @param string $extension The extension of the file. i.e., js, css, jpg etc. * @param bool $absoluteFilePath If true, absolute file path will be returned. * * @return string The full file path. */ public static function setPath($fileName, $directory = '', $version = '', $useMinified = false, $extension = 'js', $absoluteFilePath = false) { if ($version) { $fileName .= '.' . $version; } $extension = strtolower($extension); $folderName = $extension; $baseName = $fileName . '.' . $extension; $miniBaseName = $fileName . '.min.' . $extension; $directory = is_string($directory) ? ltrim(rtrim($directory, '/'), '/') : ''; $client = empty($directory) && !VmConfig::isSiteByApp() ? 'administrator/' : ''; $template = VmTemplate::loadVmTemplateStyle(); $assetsDirectory = VmConfig::get('assets_general_path', ''); $assetsDirectory = empty($assetsDirectory) ? 'components/com_virtuemart/assets' : $assetsDirectory; $assetsDirectory = rtrim($assetsDirectory, '/'); $relativePaths = array(); $miniRelativePaths = array(); $path = null; // Default VirtueMart file path $relativePaths[] = $assetsDirectory . '/' . $folderName . '/' . $baseName; // Default VirtueMart minified file path $miniRelativePaths[] = $assetsDirectory . '/' . $folderName . '/' . $miniBaseName; // Client based VirtueMart file path $relativePaths[] = $client . $assetsDirectory . '/' . $folderName . '/' . $baseName; // Client based VirtueMart minified file path $miniRelativePaths[] = $client . $assetsDirectory . '/' . $folderName . '/' . $miniBaseName; // Standard file path $relativePaths[] = $directory . '/' . $baseName; // Standard minified file path $miniRelativePaths[] = $directory . '/' . $miniBaseName; // Parent template's file paths if (!empty($template['parent'])) { // Parent template's file path $relativePaths[] = $client . 'templates/' . $template['parent'] . '/' . $folderName . '/' . $baseName; // Parent template's minified file path $miniRelativePaths[] = $client . 'templates/' . $template['parent'] . '/' . $folderName . '/' . $baseName; } // Default template's file path $relativePaths[] = $client . 'templates/' . $template['template'] . '/' . $folderName . '/' . $baseName; // Default template's minified file path $miniRelativePaths[] = $client . 'templates/' . $template['template'] . '/' . $folderName . '/' . $baseName; // Look for the correct minified file if ($useMinified) { foreach (array_reverse($miniRelativePaths, false) as $miniRelativePath) { $miniRelativePath = ltrim($miniRelativePath, '/'); if (is_file(VMPATH_ROOT . '/' . $miniRelativePath)) { $path = $miniRelativePath; break; } } } if (!$path) { foreach (array_reverse($relativePaths, false) as $relativePath) { $relativePath = ltrim($relativePath, '/'); if (is_file(VMPATH_ROOT . '/' . $relativePath)) { $path = $relativePath; break; } } } // If the path is still not found, fallback to the default VirtueMart file path. if (!$path) { $path = ltrim($relativePaths[0], '/'); } // If absolute path if ($absoluteFilePath) { return VMPATH_ROOT . '/' . $path; } return JUri::root(true) . '/' . $path; } /** * Adds jQuery if needed */ static function jQuery($isSite=-1) { if($isSite===-1) $isSite = VmConfig::isSiteByApp(); //Maybe VmConfig::isSite() if(VmConfig::get('jquery_framework',true)){ self::jhtml('jquery.framework'); } if (!VmConfig::get ('jquery', true) and $isSite) { vmdebug('Common jQuery is disabled'); return FALSE; } self::jQueryUi(); self::addJScript( 'jquery.noconflict',false,false,true,false,''); self::vmVariables(); return TRUE; } static function jQueryUi(){ self::addJScript('jquery-ui.min', false, false, false, false,'1.13.2'); self::addJScript('jquery.ui.autocomplete.html', false, false, false, false,''); } static function vmVariables(){ static $e = true; if($e){ $v = 'if (typeof Virtuemart === "undefined"){ var Virtuemart = {};}'."\n"; $v .= "var vmSiteurl = '".JURI::root()."' ;\n"; $v .= "Virtuemart.vmSiteurl = vmSiteurl;\n"; $v .= "var vmLang = '&lang=".VmConfig::$vmlangSef."';\n"; $v .= "Virtuemart.vmLang = vmLang; \n"; $v .= "var vmLangTag = '".VmConfig::$vmlangSef."';\n"; $v .= "Virtuemart.vmLangTag = vmLangTag;\n"; $itemId = vRequest::getInt('Itemid',false,'GET'); if(!empty($itemId)){ $v .= "var Itemid = '&Itemid=".$itemId."';\n"; } else { $v .= 'var Itemid = "";'."\n"; } $v .= 'Virtuemart.addtocart_popup = "'.VmConfig::get('addtocart_popup',1).'"'." ; \n"; $v .= 'var vmCartError = Virtuemart.vmCartError = "'. addslashes( vmText::_('COM_VIRTUEMART_MINICART_ERROR_JS') ).'";'."\n" ; if(VmConfig::get('usefancy',1)) { $v .= "var usefancy = true;\n"; } else {//This is just there for the backward compatibility $v .= "var vmCartText = '". addslashes( vmText::_('COM_VIRTUEMART_CART_PRODUCT_ADDED') )."' ;\n" ; //This is necessary though and should not be removed without rethinking the whole construction $v .= "usefancy = false;\n"; } vmJsApi::addJScript('vm-vars',$v,false,true,true); $e = false; } } static function mediaHandler(){ vmJsApi::addJScript('mediahandler'); vmJsApi::fancybox(); } // Virtuemart product and price script static function jPrice() { if(!VmConfig::get( 'jprice', TRUE ) or !VmConfig::isSite()) { return FALSE; } static $jPrice = false; // If exist exit if($jPrice) { return; } vmJsApi::jQuery(); vmLanguage::loadJLang( 'com_virtuemart', true ); vmJsApi::jSite(); if(VmConfig::isSite() and VmConfig::get('addtocart_popup',1)) { self::loadPopUpLib(); } vmJsApi::addJScript( 'vmprices',false,false); self::vmVariables(); $onReady = 'jQuery(document).ready(function($) { Virtuemart.product($("form.product")); });'; vmJsApi::addJScript('ready.vmprices',$onReady); $jPrice = TRUE; return TRUE; } static function jSite() { if(VmConfig::get ('jsite', TRUE) or !VmConfig::isSite()){ self::addJScript('vmsite',false,false); } } static function jDynUpdate($containerSelector = null) { $updateListener = 'Virtuemart.updateDynamicUpdateListeners();'; if($containerSelector === null){ $view = vRequest::getCmd('view'); if($view == 'category'){ $containerSelector = '.category-view'; } else if ($view == 'orders'){ $containerSelector = '.vm-orders-information'; } else if ($view == 'productdetails'){ $containerSelector = '.productdetails-view'; } else { $containerSelector = '#cart-view'; } } if($containerSelector == '#cart-view'){ $updateListener = 'Virtuemart.updDynFormListeners();'; } self::addJScript('dynupdate',false,false); self::addJScript('updDynamicListeners'," jQuery(document).ready(function() { // GALT: Start listening for dynamic content update. // If template is aware of dynamic update and provided a variable let's // set-up the event listeners. if (typeof Virtuemart.containerSelector === 'undefined') { Virtuemart.containerSelector = '".$containerSelector."'; } if (typeof Virtuemart.container === 'undefined') { Virtuemart.container = jQuery(Virtuemart.containerSelector); } if (Virtuemart.container){ ".$updateListener." } }); "); } static function JcountryStateList($stateIds, $prefix='', $suffix='_field') { static $JcountryStateList = array(); if (isset($JcountryStateList[$prefix]) or !VmConfig::get ('jsite', TRUE)) { return; } VmJsApi::jSite(); $updateTrigger = ''; if(JVM_VERSION>3){ $updateTrigger = '$("#'.$prefix.'virtuemart_country_id'.$suffix.'").vm2front("setOpt",{field_update_trigger : "chosen:updated"});'; } self::addJScript('vm-countryState'.$prefix,' jQuery(document).ready( function($) { $("#'.$prefix.'virtuemart_country_id'.$suffix.'").vm2front("list",{dest : "#'.$prefix.'virtuemart_state_id'.$suffix.'",ids : "'.$stateIds.'",prefiks : "'.$prefix.'"}); '.$updateTrigger.' }); '); $JcountryStateList[$prefix] = TRUE; return; } static function fancybox(){ vmJsApi::addJScript( 'fancybox/jquery.fancybox-1.3.4.2.pack',false,false,false,false,'1.3.4.2'); vmJsApi::css('jquery.fancybox-1.3.4'); if(!VmConfig::isSite()){ vmJsApi::addJScript('fancybox/jquery.mousewheel-3.0.4.pack',false,false); vmJsApi::addJScript('fancybox/jquery.easing-1.3.pack',false,false); } } static function loadPopUpLib(){ static $fancy = null; if(isset($fancy)){ return $fancy; } self::vmVariables(); if($fancy = VmConfig::get('usefancy',1)){ self::fancybox(); } else { vmJsApi::addJScript( 'facebox', false, true, false, false, '' ); vmJsApi::css( 'facebox' ); } } /** * Creates popup, fancy or other for TOS */ static function popup($container,$activator){ static $done = false; if ($done) return true; self::loadPopUpLib(); if(VmConfig::get('usefancy',1)) { $exeL = "$.fancybox ({ div: '".$container."', content: con });"; } else { $exeL = "$.facebox( { div: '".$container."' }, 'my-groovy-style');"; } $box = " jQuery(document).ready(function($) { $('div".$container."').hide(); var con = $('div".$container."').html(); $('a".$activator."').click(function(event) { event.preventDefault(); ".$exeL." }); }); "; self::addJScript('box',$box); $done = true; return; } static function chosenDropDowns(){ static $loaded = false; if(!$loaded){ if(VmConfig::get ('jchosen', 0) or !VmConfig::isSite()){ if(JVM_VERSION >3){ self::jhtml('formbehavior.chosen'); } else { vmJsApi::addJScript('chosen.jquery.min',false,false); vmJsApi::css('chosen'); } //vmdebug('chosenDropDowns jchosen or not isSite'); if(VmConfig::isSite()) { vmJsApi::addJScript('vmprices'); $selector = 'jQuery("select.vm-chzn-select")';; } else { $selector = 'jQuery("select:not(.vm-chzn-add)")'; } $selectText = 'COM_VIRTUEMART_DRDOWN_AVA2ALL'; $vm2string = "editImage: 'edit image',select_all_text: '".vmText::_('COM_VIRTUEMART_DRDOWN_SELALL')."',select_some_options_text: '".vmText::_($selectText)."', width: '100%'" ; $script = 'if (typeof Virtuemart === "undefined") var Virtuemart = {}; Virtuemart.updateChosenDropdownLayout = function() { var vm2string = {'.$vm2string.'}; '.$selector.'.chosen({enable_select_all: true,select_all_text : vm2string.select_all_text,select_some_options_text:vm2string.select_some_options_text,disable_search_threshold: 5, width:vm2string.width}); //console.log("updateChosenDropdownLayout"); } jQuery(document).ready( function() { Virtuemart.updateChosenDropdownLayout($); }); '; self::addJScript('updateChosen',$script); } $loaded = true; } return; } static function JvalideForm($name='#adminForm') { static $jvalideForm; // If exist exit if ($jvalideForm === $name) { return; } self::addJScript('vEngine', " jQuery(document).ready(function($) { $('".$name."').validationEngine(); }); " ); if ($jvalideForm) { return; } vmJsApi::addJScript( 'jquery.validationEngine'); $lg = vmLanguage::getLanguage(); $lang = substr($lg->getTag(), 0, 2); $vlePath = vmJsApi::setPath('languages/jquery.validationEngine-'.$lang, FALSE , '' ,$minified = NULL , 'js', true); if(!file_exists($vlePath) or is_dir($vlePath)){ $lang = 'en'; } vmJsApi::addJScript( 'languages/jquery.validationEngine-'.$lang ); vmJsApi::css ( 'validationEngine.template' ); vmJsApi::css ( 'validationEngine.jquery' ); $jvalideForm = $name; } static public function vmValidator ($guest=null, $userFields = 0, $prefiks=''){ if(!isset($guest)){ $guest = JFactory::getUser()->guest; } // Implement Joomla's form validation self::jhtml('behavior.formvalidator'); self::vmVariables(); $regfields = array(); if(empty($userFields)){ $regfields = array('username', 'name'); if($guest){ $regfields[] = 'password'; $regfields[] = 'password2'; } } else { foreach($userFields as $field){ if(!empty($field['register'])){ $regfields[] = $field['name']; } } } //vmdebug('vmValidator $regfields',$regfields); if(empty($regfields)){ $jsRegfields = '[]'; } else { $jsRegfields = "['".implode("','",$regfields)."']"; } $js = "Virtuemart.regfields = ".$jsRegfields."; Virtuemart.prefiks = '".$prefiks."'; Virtuemart.requiredMsg = '" .addslashes (vmText::_ ('COM_VIRTUEMART_MISSING_REQUIRED_JS'))."'; "; vmJsApi::addJScript('vm-validator',$js); vmJsApi::addJScript('/components/com_virtuemart/assets/js/vmvalidator.js'); } // Virtuemart product and price script static function jCreditCard() { static $jCreditCard; // If exist exit if ($jCreditCard) { return; } vmLanguage::loadJLang('com_virtuemart',true); $js = " var ccErrors = new Array () ccErrors [0] = '" . addslashes( vmText::_('COM_VIRTUEMART_CREDIT_CARD_UNKNOWN_TYPE') ). "'; ccErrors [1] = '" . addslashes( vmText::_("COM_VIRTUEMART_CREDIT_CARD_NO_NUMBER") ). "'; ccErrors [2] = '" . addslashes( vmText::_('COM_VIRTUEMART_CREDIT_CARD_INVALID_FORMAT')) . "'; ccErrors [3] = '" . addslashes( vmText::_('COM_VIRTUEMART_CREDIT_CARD_INVALID_NUMBER')) . "'; ccErrors [4] = '" . addslashes( vmText::_('COM_VIRTUEMART_CREDIT_CARD_WRONG_DIGIT')) . "'; ccErrors [5] = '" . addslashes( vmText::_('COM_VIRTUEMART_CREDIT_CARD_INVALID_EXPIRE_DATE')) . "'; "; self::addJScript('creditcard',$js); $jCreditCard = TRUE; return TRUE; } /** * ADD some CSS if needed * Prevent duplicate load of CSS stylesheet * @author Max Milbers */ static function cssSite() { static $cssSite; if ($cssSite) return; // we load one common css and put styles in there // that we need and which are can't be covered by bootstrap $bootstrapVersion = VmConfig::get('bootstrap', ''); if ($bootstrapVersion !== '') { // Load The Common CSS File $cssFile = 'vm-' . $bootstrapVersion . '-common'; vmJsApi::css($cssFile); // Right To Left Support if (JFactory::getDocument()->getDirection() == 'rtl') { $cssFile = 'vm-' . $bootstrapVersion . '-common-rtl'; vmJsApi::css($cssFile); } return FALSE; } if (!VmConfig::get('css', TRUE)) { return FALSE; } // Get the Page direction for right to left support $document = JFactory::getDocument (); $direction = $document->getDirection (); $cssFile = 'vmsite-' . $direction ; $vmStyle = VmTemplate::loadVmTemplateStyle(); $template = $vmStyle['template']; if($template){ //Fallback for old templates $path= 'templates/'.$template.'/css/'. $cssFile.'.css' ; if(file_exists($path)){ // If exist exit vmJsApi::css ( $cssFile ) ; } else { // quorvia allow a combined by hidden cfg and dont load ratings/reviews css if none are used $combined = VmConfig::get( 'VMcombinedCssFE', 0 ); if($combined) { $cssFile = 'vm-'.$direction.'-combined-min'; vmJsApi::css( $cssFile ); } else { $cssFile = 'vm-' . $direction .'-common'; vmJsApi::css ( $cssFile ) ; $cssFile = 'vm-' . $direction .'-site'; vmJsApi::css ( $cssFile ) ; if(VmConfig::get( 'showReviewFor', 'none' ) != 'none' and VmConfig::get( 'showRatingFor', 'none' ) !='none') { $cssFile = 'vm-'.$direction.'-reviews'; vmJsApi::css( $cssFile ); } } } $cssSite = TRUE; } return TRUE; } // $yearRange format >> 1980:2010 // Virtuemart Datepicker script static function jDate($date='',$name="date",$id=NULL,$resetBt = TRUE, $yearRange='', $minMax='', $onSelectCallback = '') { if ($yearRange) { $yearRange = 'yearRange: "' . $yearRange . '",'; } if(empty($date)){ $date = 0; } else { $test = (int) str_replace(array('-',' ',':'),'',$date); if(empty($test)){ $date = 0; } } if (empty($id)) { $id = str_replace(array('[]','[',']','.'),'_',$name); $id = trim(str_replace('__','_',$id),'.'); } static $jDate; $id = VmHtml::ensureUniqueId($id); $dateFormat = vmText::_('COM_VIRTUEMART_DATE_FORMAT_INPUT_J16');//="m/d/y" $search = array('m', 'd', 'Y'); $replace = array('mm', 'dd', 'yy'); $jsDateFormat = str_replace($search, $replace, $dateFormat); if ($date) { $formatedDate = JHtml::_('date', $date, $dateFormat, false ); /*$date1 = new DateTime($date); $formatedDate = $date1->format($dateFormat);*/ } else { $formatedDate = vmText::_('COM_VIRTUEMART_DATE_NOTSET'); } $display = ''; $display .= ''; if ($resetBt) { $display .= ''; } $debug= ''; if(vmEcho::$_debug){ $debug= 'console.log("datepicker on select triggered");'; } self::addJScript('datepicker'.$id,' jQuery(document).ready( function($) { $(document).on( "focus","#'.$id.'_text", function() { $( this ).datepicker({ onSelect: function(dateText, inst) { '.$debug.' '.$onSelectCallback.' }, changeMonth: true, changeYear: true, '.$yearRange.' '.$minMax.' dateFormat:"'.$jsDateFormat.'", altField: $(this).prev(), altFormat: "yy-mm-dd" }); }); $(document).on( "click",".js-date-reset", function() { $(this).prev("input").val("'.vmText::_('COM_VIRTUEMART_DATE_NOTSET').'").prev("input").val("0"); }); }); '); // If exist exit if ($jDate) { return $display; } vmJsApi::css('ui/jquery.ui.all'); $lg = vmLanguage::getLanguage(); $lang = $lg->getTag(); $sh_lang = substr($lang, 0, 2); $vlePath = vmJsApi::setPath('i18n/jquery.ui.datepicker-'.$lang, FALSE , '' ,$minified = NULL , 'js', true); if(!file_exists($vlePath) or is_dir($vlePath)){ $vlePath = vmJsApi::setPath('i18n/jquery.ui.datepicker-'.$sh_lang, FALSE , '' ,$minified = NULL , 'js', true); $lang = $sh_lang; if(!file_exists($vlePath) or is_dir($vlePath)){ $lang = 'en-GB'; } } vmJsApi::addJScript( 'i18n/jquery.ui.datepicker-'.$lang ); $jDate = TRUE; return $display; } /* * Convert formated date; * @$date the date to convert * @$format Joomla DATE_FORMAT Key endding eg. 'LC2' for DATE_FORMAT_LC2 * @tz Timezone offset, defaults to false, which is the general joomla timezone */ static function date($date , $format ='LC2', $joomla=FALSE , $tz=false ){ if (empty($date) or $date == '0000-00-00 00:00:00') { return vmText::_ ('COM_VIRTUEMART_DATE_NOTSET'); } If ($joomla) { $formatedDate = JHtml::_('date', $date, vmText::_('DATE_FORMAT_'.$format),$tz); } else { $J16 = "_J16"; $formatedDate = JHtml::_('date', $date, vmText::_('COM_VIRTUEMART_DATE_FORMAT_'.$format.$J16),$tz); } return $formatedDate; } static function keepAlive($minlps = 2, $maxlps=5){ static $done = false; if($done) return; $done = true; $config = JFactory::getConfig(); $refTime = ($config->get('lifetime') ); // the longest refresh period is 30 min to prevent integer overflow. if ($refTime > 30 || $refTime <= 0) { $refTime = 30; } $url = 'index.php?option=com_virtuemart&view=virtuemart&task=keepalive'; vmJsApi::addJScript('keepAliveTime','var sessMin = '.$refTime.';var vmAliveUrl = "'.$url.'";var maxlps = "'.$maxlps.'";var minlps = "'.$minlps.'";',false,true,true); vmJsApi::addJScript('vmkeepalive',false, true, false); } static function ajaxCategoryDropDown($name, $param, $emptyOpt){ vmJsApi::addJScript('ajax_catree'); $j = "jQuery(document).ready(function($) { jQuery(document).ready(function($) { Virtuemart.emptyCatOpt = '".$emptyOpt."'; Virtuemart.param = '".$param."'; Virtuemart.isAdmin = '".!VmConfig::isSiteByApp()."'; Virtuemart.loadCategoryTree('".$name."'); Virtuemart.selectSomeCategory = '".vmText::_('COM_VIRTUEMART_DRDOWN_FILTER_BY_CATEGORY')."'; }); }); "; vmJsApi::addJScript('pro-tech.AjaxCategoriesLoad', $j, false, true, true); } }