. ** ** itjs.class - functions to handle javascript inclusion */ class itjs { /** * Send HTTP headers (content-type) to transmit javascript code */ function send_headers() { if (!preg_match('/Opera/', $_SERVER['HTTP_USER_AGENT']) && !$_REQUEST['itjs_iframe']) # text/plain breaks Opera 8.51/Linux and IFrame fallback header('Content-Type: text/plain; charset=iso-8859-1'); # Berni reported some Firewalls to require this header('Expires: ' . gmdate('D, d M Y H:i:s', time()+10) . ' GMT'); # prevent broken data on IE reloads } /** * Serialize the result into a javascript script * @param $values Array with values to be serialized * @param $envelope Encapsulate the data when callback function is provided (iframe solution) * @return String with javascript code to be sent to client */ function serialize($values, $envelope = false) { if (($envelope || isset($values['eof'])) && ($callback = it::replace(array('[^\w.]' => ""), $_REQUEST['itjs_call']))) { $target = $_REQUEST['itjs_iframe'] ? "parent" : "window"; $header = "$target.it_loader && $target.$callback && $target.$callback.dataReady("; $footer = "," . intval($_REQUEST['itjs_callid']) . ");"; if ($_REQUEST['itjs_iframe']) # iframe-based loading required by Opera 7 { $header = '"; } } return $header . itjs::encode($values) . $footer; } /* * Encode the result into a javascript array to transfer and eval() in client */ function encode($values) { $texts = ($values === array_values($values)) ? "[]0 " : "{}1\n"; # Numerical or associative array $result = $texts{0}; foreach ($values as $key => $value) { $result .= $separator; if ($texts{2}) { if (!preg_match('/^[a-z_]\w*$/i', $key)) $key = "'$key'"; $result .= "$key:"; } if ($value === true) $result .= 'true'; else if ($value === false) $result .= 'false'; else if (!is_array($value)) { $quote = (strval(intval($value)) === strval($value)) ? "" : '"'; $result .= $quote . preg_replace('/([\xa0-\xff])/e', 'sprintf("\\u%04x", ord("\\1"))', strtr($value, array("\0" => '\\0', '"' => '\\"', ""<\\/", "\n" => '\\n', "\r" => '\\r', "\t" => '\\t', "\\" => '\\\\'))) . $quote; } else $result .= itjs::encode($value); $separator = "," . $texts{3}; } $result .= $texts{1}; return $result; } function filenames($filelist) { $result = array(); $path = $GLOBALS['ULTRAHOME'] . "/itjs"; $itjs = "/www/server/phpinclude/itools/itjs"; $searchlib = "/www/lib.search.ch/doc"; $special = array( "itools" => "$itjs/it.js,$itjs/loader.js,$itjs/state.js,$itjs/timer.js", "boot.js" => "$itjs/boot.js", "state.html" => "$itjs/state.html", "error.gif" => "$itjs/error.gif", "search.css" => "$searchlib/search.css", "prettyprint.css" => "$searchlib/prettyprint.css", ); foreach (explode(",", it::replace(array('\?.*' => ""), $filelist)) as $file) { $filenames = $special[$file] ? $special[$file] : "$path/$file"; foreach (explode(",", $filenames) as $filename) $result[] = $filename; } return $result; } /** * Strip comments and trim lines * @param $code String containing javascript code to be stripped * @return Naked code */ function strip($code) { if (!preg_match("/^devel/", $GLOBALS['ULTRASERVERTYPE'])) $code = preg_replace(array('|\s//.*$|m', '|/\*.*?\*/|s', '|^\s+|m'), array(), $code); return $code; } /** * Compute checksum for list of files * @param $files Array of filenames to calculate checksum for * @return Checksum for given files */ function checksum($files = array()) { foreach (array_merge($files, array('itjs.php', 'itjs.class')) as $file) { if (!preg_match("/^devel/", $GLOBALS['ULTRASERVERTYPE'])) $result += @filesize($file); else $result = md5($result . @file_get_contents($file)); } return $result; } } ?>