. * * For more information, contact Colosa Inc, 2566 Le Jeune Rd., * Coral Gables, FL, 33134, USA, or email info@colosa.com. * */ /** * Class headPublisher * * @author David S. Callizaya S. * @package gulliver.system * @access public */ class headPublisher { public static $instance = null; public $scriptFiles = array(); public $cssFiles = array(); public $leimnudLoad = array(); /* extJsSkin init coreLoad flag */ public $extJsInit = 'false'; /* extJsSkin store the current skin for the ExtJs */ public $extJsSkin = ''; /* extJsScript Array, to store the file to be include */ public $extJsScript = array(); /* extJsLibrary Array, to store extended ExtJs lybraries */ public $extJsLibrary = array(); /* extJsContent Array, to store the file to be include in the skin content */ public $extJsContent = array(); /* extVariable array, to store the variables generated in PHP, and used in JavaScript */ public $extVariable = array(); /* variable array, to store the variables generated in PHP, and used in JavaScript */ public $vars = array(); /* tplVariable array, to store the variables for template power */ public $tplVariable = array(); public $translationsFile; public $leimnudInitString = ' var leimnud = new maborak(); leimnud.make({ zip:true, inGulliver:true, modules :"dom,abbr,rpc,drag,drop,app,panel,fx,grid,xmlform,validator,dashboard", files :"" });'; public $headerScript = ' try{ leimnud.exec(leimnud.fix.memoryLeak); if(leimnud.browser.isIphone){ leimnud.iphone.make(); } }catch(e){}'; public $disableHeaderScripts = false; public $title = ''; /** * Function headPublisher * * @author David S. Callizaya S. * @access public * @return string */ public function __construct() { $this->addScriptFile("/js/maborak/core/maborak.js"); $this->translationsFile = "/js/ext/translation." . SYS_LANG . ".js"; $this->addScriptCode(' var __usernameLogged__ = "' . (isset($_SESSION['USR_USERNAME']) ? $_SESSION['USR_USERNAME'] : '') . '";var SYS_LANG = "' . SYS_LANG . '";'); } public function &getSingleton() { if (self::$instance == null) { self::$instance = new headPublisher(); } return self::$instance; } /** * Function setTitle * * @author David S. Callizaya S. * @access public * @param eter string url * @param eter string LoadType * @return string */ public function setTitle($title) { $this->title = $title; } /** * Function addScriptFile * * @author David S. Callizaya S. * @access public * @param eter string url * @param eter string LoadType * @return string */ public function addScriptFile($url, $LoadType = 1) { if ($LoadType == 1) { $this->scriptFiles[$url] = $url; } if ($LoadType == 2) { $this->leimnudLoad[$url] = $url; } } public function addCssFile($url) { $this->cssFiles[$url] = $url; } /** * Function addInstanceModule * * @author David S. Callizaya S. * @access public * @param eter string instance * @param eter string module * @return string */ public function addInstanceModule($instance, $module) { $this->headerScript .= "leimnud.Package.Load('" . $module . "',{Instance:" . $instance . ",Type:'module'});\n"; } /** * Function addClassModule * * @author David S. Callizaya S. * @access public * @param eter string class * @param eter string module * @return string */ public function addClassModule($class, $module) { $this->headerScript .= "leimnud.Package.Load('" . $module . "',{Class:" . $class . ",Type:'module'});\n"; } /** * Function addScriptCode * * @author David S. Callizaya S. * @access public * @param eter string script * @return string */ public function addScriptCode($script) { $this->headerScript .= $script; } /** * Function printHeader * * @author David S. Callizaya S. * @access public * @return string */ public function printHeader() { $jslabel = 'labels/en.js'; if (defined('SYS_LANG')) { $jslabel = 'labels' . PATH_SEP . SYS_LANG . '.js'; if (!file_exists(PATH_CORE . 'js' . PATH_SEP . $jslabel)) { $jslabel = 'labels/en.js'; } } if (file_exists(PATH_CORE . 'js' . PATH_SEP . $jslabel)) { $this->addScriptFile('/jscore/' . $jslabel, 1); } if ($this->disableHeaderScripts) { return ''; } // available js-calendar languages array $availableJsCalendarLang = array('ca', 'cn', 'cz', 'de', 'en', 'es', 'fr', 'it', 'jp', 'nl', 'pl', 'pt', 'ro', 'ru', 'sv'); // get the system language without locale $sysLang = explode('-', SYS_LANG); $sysLang = $sysLang[0]; // verify if the requested lang by the system is supported by js-calendar library, if not set english by default $sysLang = in_array($sysLang, $availableJsCalendarLang) ? $sysLang : 'en'; $this->addScriptFile("/js/widgets/js-calendar/unicode-letter.js"); //$this->addScriptFile( "/js/widgets/js-calendar/lang/" . $sysLang . ".js" ); $head = ''; $head .= '' . $this->title . "\n"; foreach ($this->cssFiles as $file) { $head = $head . " \n"; } $head = $head . " "; foreach ($this->scriptFiles as $file) { $head = $head . "\n"; } if (!in_array($this->translationsFile, $this->scriptFiles)) { $head = $head . "\n"; } $head .= "\n"; $head .= "\n"; return $head; } /** * Function printRawHeader * Its prupose is to load el HEADs initialization javascript * into a single SCRIPT tag, it is usefull when it is needed * to load a page by leimnud floating panel of by another ajax * method. (See also RAW skin) * * @author David S. Callizaya S. * @access public * @return string */ public function printRawHeader() { $jslabel = '/jscore/labels/en.js'; if (defined('SYS_LANG')) { $jslabel1 = 'labels' . PATH_SEP . SYS_LANG . '.js'; if (!file_exists(PATH_CORE . 'js' . PATH_SEP . $jslabel1)) { $jslabel = '/jscore/labels/en.js'; } } $head = ''; //$head .= "\n"; return $head; } /** * Function clearScripts * Its prupose is to clear all the scripts of the header. * * @author David S. Callizaya S. * @access public * @return string */ public function clearScripts() { $this->scriptFiles = array(); $this->leimnudLoad = array(); $this->leimnudInitString = ''; $this->headerScript = ''; } /** * Function includeExtJs * with this function we are using the ExtJs library, this library is not compatible with * previous libraries, for that reason oHeadPublisher will clear previous libraries like maborak * we need to check if we need the language file * this function returns the header needed to render a page using ExtJs * * @author Fernando Ontiveros * @access public * @return string */ public function includeExtJs() { $this->clearScripts(); $head = ""; $head = $head . " \n"; $head = $head . " \n"; $head = $head . " \n"; $head = $head . " \n"; if (SYS_LANG != 'en') { $tempLang = str_replace('-', '_', SYS_LANG); if (file_exists(PATH_GULLIVER_HOME . 'js' . PATH_SEP . 'ext' . PATH_SEP . 'locale' . PATH_SEP . 'ext-lang-' . $tempLang . '.js')) { $head = $head . " \n"; } else { $aux = explode('-', strtolower(SYS_LANG)); if (file_exists(PATH_GULLIVER_HOME . 'js' . PATH_SEP . 'ext' . PATH_SEP . 'locale' . PATH_SEP . 'ext-lang-' . $aux[0] . '.js')) { $head = $head . " \n"; } } } // enabled for particular use $head .= $this->getExtJsLibraries(); // $head .= " \n"; // $head .= " \n"; if (!isset($this->extJsSkin) || $this->extJsSkin == '') { $this->extJsSkin = 'xtheme-gray'; //$this->extJsSkin = 'gtheme'; } //$head .= $this->getExtJsStylesheets(); $head .= $this->getExtJsScripts(); $head .= $this->getExtJsVariablesScript(); $oServerConf = & serverConf::getSingleton(); if ($oServerConf->isRtl(SYS_LANG)) { $head = $head . " \n"; } return $head; } public function getExtJsStylesheets($skinName) { $script = " \n"; //$script .= " \n"; /* $script .= " \n"; $script .= " \n"; // //new interactive css decorator $script .= " \n"; $script .= " \n"; */ // Load external/plugin css // NOTE is necesary to move this to decorator server if (class_exists('PMPluginRegistry') && defined('SYS_SYS')) { $oPluginRegistry = & PMPluginRegistry::getSingleton(); $registeredCss = $oPluginRegistry->getRegisteredCss(); foreach ($registeredCss as $cssFile) { $script .= " \n"; } } return $script; } public function getExtJsScripts() { $script = ''; if (isset($this->extJsScript) && is_array($this->extJsScript)) { foreach ($this->extJsScript as $key => $file) { $script = $script . " \n"; } } return $script; } public function getExtJsVariablesScript() { $script = ''; if (count($this->extVariable) > 0) { $script = "\n"; } return $script; } public function getExtJsLibraries() { $script = ''; if (isset($this->extJsLibrary) && is_array($this->extJsLibrary)) { foreach ($this->extJsLibrary as $file) { $script = $script . " \n"; } } if (!in_array($this->translationsFile, $this->extJsLibrary)) { $script = $script . " \n"; } return $script; } /** * add a ExtJS extended library * * @author Erik A. Ortiz * @access public * @param (String) http js path library * @return none */ public function usingExtJs($library) { if (!is_string($library)) { throw new Exception('headPublisher::usingExt->ERROR - the parameter should be a js path string'); } array_push($this->extJsLibrary, $library); } /** * Function setExtSkin * * @author Fernando Ontiveros * @access public * @return string */ public function setExtSkin($skin) { $this->extJsSkin = $skin; } /** * Function addExtJsScript * adding a javascript file . * * js * add a js file in the extension Javascript Array, * later, when we use the includeExtJs function, all the files in this array will be included in the output * if the second argument is true, the file will not be minified, this is useful for debug purposes. * * Feature added - * - Hook to find javascript registered from plugins and load them * * @author Fernando Ontiveros * @author Erik Amaru Ortiz * @access public * @return string */ public function addExtJsScript($filename, $debug = false, $isExternal = false) { $sPath = PATH_TPL; //if the template file doesn't exists, then try with the plugins folders if (!is_file($sPath . $filename . ".js")) { $aux = explode(PATH_SEP, $filename); //check if G_PLUGIN_CLASS is defined, because publisher can be called without an environment if (count($aux) > 1 && defined('G_PLUGIN_CLASS')) { $flagPlugin = false; $keyPlugin = count($aux)-2; $oPluginRegistry = & PMPluginRegistry::getSingleton(); if ($oPluginRegistry->isRegisteredFolder($aux[$keyPlugin])) { $flagPlugin = true; } else { $keyPlugin --; if ($oPluginRegistry->isRegisteredFolder($aux[$keyPlugin])) { $flagPlugin = true; } } if ($flagPlugin) { array_push($this->extJsLibrary, 'translation.' . trim($aux[$keyPlugin]) . '.' . SYS_LANG); $sPath = PATH_PLUGINS; } } } if (!$isExternal) { $jsFilename = $sPath . $filename . '.js'; } else { $jsFilename = $filename . '.js'; } if (!file_exists($jsFilename)) { return; } $mtime = filemtime($jsFilename); G::mk_dir(PATH_C . 'ExtJs'); if ($debug) { $cacheName = str_replace('/', '_', $filename); $cacheFilename = PATH_C . 'ExtJs' . PATH_SEP . $cacheName . '.js'; file_put_contents($cacheFilename, file_get_contents($jsFilename)); } else { $cacheName = G::encryptOld($mtime . $jsFilename); $cacheFilename = PATH_C . 'ExtJs' . PATH_SEP . $cacheName . '.js'; if (!file_exists($cacheFilename)) { $content = JSMin::minify(file_get_contents($jsFilename)); file_put_contents($cacheFilename, $content); } } $this->extJsScript[] = '/extjs/' . $cacheName; //hook for registered javascripts from plugins if (class_exists('PMPluginRegistry') && defined('SYS_SYS')) { $oPluginRegistry = & PMPluginRegistry::getSingleton(); $pluginJavascripts = $oPluginRegistry->getRegisteredJavascriptBy($filename); } else { $pluginJavascripts = array(); } if (count($pluginJavascripts) > 0) { if ($debug) { foreach ($pluginJavascripts as $pluginJsFile) { $jsPluginCacheName = ''; if (substr($pluginJsFile, - 3) != '.js') { $pluginJsFile .= '.js'; } if (file_exists(PATH_PLUGINS . $pluginJsFile)) { $jsPluginCacheName = str_replace('/', '_', str_replace('.js', '', $pluginJsFile)); $cacheFilename = PATH_C . 'ExtJs' . PATH_SEP . $jsPluginCacheName . ".js"; file_put_contents($cacheFilename, file_get_contents(PATH_PLUGINS . $pluginJsFile)); } if ($jsPluginCacheName != '') { $this->extJsScript[] = '/extjs/' . $jsPluginCacheName; } } } else { foreach ($pluginJavascripts as $pluginJsFile) { $jsPluginCacheName = ''; if (substr($pluginJsFile, - 3) !== '.js') { $pluginJsFile .= '.js'; } if (file_exists(PATH_PLUGINS . $pluginJsFile)) { $mtime = filemtime(PATH_PLUGINS . $pluginJsFile); $jsPluginCacheName = G::encryptOld($mtime . $pluginJsFile); $cacheFilename = PATH_C . 'ExtJs' . PATH_SEP . $jsPluginCacheName . '.js'; if (!file_exists($cacheFilename)) { $content = JSMin::minify(file_get_contents(PATH_PLUGINS . $pluginJsFile)); file_put_contents($cacheFilename, $content); } } if ($jsPluginCacheName != '') { $this->extJsScript[] = '/extjs/' . $jsPluginCacheName; } } } } //end hook for registered javascripts from plugins } /** * Function AddContent * adding a html file . * * html. * the main idea for this function, is to be a replacement to homonymous function in Publisher class. * with this function you are adding Content to the output, the class HeadPublisher will maintain a list of * files to render in the body of the output page * * @author Fernando Ontiveros * @access public * @return string */ public function AddContent($templateHtml) { $this->extJsContent[] = $templateHtml; } public function getContent() { return $this->extJsContent; } /** * Function assign * assign a STRING value to a JS variable * use this function to send from PHP variables to be used in JavaScript * * @author Fernando Ontiveros * @access public * @return string */ public function Assign($variable, $value) { $this->extVariable[] = array('name' => $variable, 'value' => $value, 'type' => 'string' ); } public function AssignVar($name, $value) { $this->vars[$name] = $value; } public function getVars() { return $this->vars; } /** * Function assignNumber * assign a Number value to a JS variable * use this function to send from PHP variables to be used in JavaScript * * @author Fernando Ontiveros * @access public * @return string */ public function AssignNumber($variable, $value) { $this->extVariable[] = array('name' => $variable, 'value' => $value, 'type' => 'number'); } /** * Function renderExtJs * this function returns the content rendered using ExtJs * extJsContent have an array, and we iterate this array to draw the content * * @author Fernando Ontiveros * @access public * @return string */ public function renderExtJs() { $body = ''; if (isset($this->extJsContent) && is_array($this->extJsContent)) { foreach ($this->extJsContent as $key => $file) { $sPath = PATH_TPL; //if the template file doesn't exists, then try with the plugins folders if (!is_file($sPath . $file . ".html")) { $aux = explode(PATH_SEP, $file); //check if G_PLUGIN_CLASS is defined, because publisher can be called without an environment if (count($aux) == 2 && defined('G_PLUGIN_CLASS')) { $oPluginRegistry = & PMPluginRegistry::getSingleton(); if ($oPluginRegistry->isRegisteredFolder($aux[0])) { $sPath = PATH_PLUGINS; } } } $template = new TemplatePower($sPath . $file . '.html'); $template->prepare(); foreach ($this->getVars() as $k => $v) { $template->assign($k, $v); } $body .= $template->getOutputContent(); } } return $body; } public function stripCodeQuotes($sJson) { $fields = array("editor", "renderer" ); foreach ($fields as $field) { $pattern = '/"(' . $field . ')":"[a-zA-Z.()]*"/'; // echo $pattern."
"; preg_match($pattern, $sJson, $matches); // var_dump ($matches); // echo "
"; if (!empty($matches)) { $rendererMatch = $matches[0]; $replaceBy = explode(":", $matches[0]); $replaceBy[1] = str_replace('"', '', $replaceBy[1]); $tmpString = implode(":", $replaceBy); $sJson = str_replace($rendererMatch, $tmpString, $sJson); // var_dump ($sJson); // echo "
"; } } return $sJson; } /** * Function disableHeaderScripts * this function sets disableHeaderScripts to true * to avoid print scripts into the header * * @author Enrique Ponce de Leom * @access public * @return string */ public function disableHeaderScripts() { $this->disableHeaderScripts = true; } /** * Gets an array that contains the status of the view. * * @return array $views */ public function getExtJsViewState() { $views = array(); $keyState = "extJsViewState"; $prefixExtJs = "ys-"; $oServerConf = &serverConf::getSingleton(); $deleteCache = true; $sjson = $oServerConf->getProperty($keyState); if ($sjson !== "") { $json = G::json_decode($sjson); if ((is_array($json) || is_object($json)) && sizeof($json)){ foreach ($json as $key => $value) { $views[$key] = $value; } } } $httpCookies = explode("; ", $_SERVER['HTTP_COOKIE']); foreach ($httpCookies as $cookie) { $value = explode("=", $cookie); if (count($value) > 1 && substr($value[0], 0, 3) === $prefixExtJs) { $deleteCache = false; $key = substr($value[0], 3); $views[$key] = $value[1]; } } $oServerConf->setProperty($keyState, G::json_encode($views)); return $views; } }