PageRenderTime 34ms CodeModel.GetById 7ms RepoModel.GetById 0ms app.codeStats 1ms

/bluepen/bluepen-local.php

https://github.com/maxpestun/vrorchestra
PHP | 946 lines | 869 code | 75 blank | 2 comment | 34 complexity | 298065e460daacb965db82b015f5ff15 MD5 | raw file
  1. <?php
  2. @error_reporting(0);
  3. @ini_set('display_errors', 0);
  4. set_error_handler("bluePenErrorHandler");
  5. ob_start();
  6. $BP = new BP_AJAX();
  7. $BP->importData();
  8. $BP->checkVersion();
  9. $BP->run();
  10. class BP_AJAX {
  11. var $version = '1.0';
  12. var $valid_vars = array(
  13. "GET" => array("callback", "_", "task", "base_url", "file_name", "img_dir", "sub_dir", "selector", "nth_selector", "hrefs", "site_bluepen_dir", "site_image_dir", "fontFamily", "version", "cssReloadCnt", "pauseMillisec"),
  14. "POST" => array("task", "base_url", "file_name", "selector", "nth_selector", "settings_array", "parent_selector", "selector_body", "target_file", "new_selector", "version"),
  15. "FILES" => array("task", "base_url")
  16. );
  17. var $allowed_tasks = array("getFontFamilies", "getCSSfile", "getsettings", "getfiles", "uploadFile", "listBackups", "restoreBackup", "saveCSS", "deletecss", "savesettings", "getStylesheets", "getHTML", "embedFontFamily", "pause");
  18. var $data_source;
  19. var $base_url;
  20. var $vars;
  21. var $task;
  22. var $step_back;
  23. var $fontFamilies = 'Abel, Aclonica, Actor, Allan, Allerta, Allerta Stencil, Amaranth, Annie Use Your Telescope, Anonymous Pro, Anton, Architects Daughter, Arimo, Artifika, Arvo, Asset, Astloch, Aubrey, Bangers, Bentham, Bevan, Bigshot One, Black Ops One, Bowlby One, Bowlby One SC, Brawler, Buda, Cabin, Cabin Sketch, Calligraffitti, Candal, Cantarell, Cardo, Carme, Carter One, Caudex, Cedarville Cursive, Cherry Cream Soda, Chewy, Coda, Coda Caption, Coming Soon, Copse, Corben, Cousine, Covered By Your Grace, Crafty Girls, Crimson Text, Crushed, Cuprum, Damion, Dancing Script, Dawning of a New Day, Delius, Delius Swash Caps, Didact Gothic, Droid Sans, Droid Sans Mono, Droid Serif, EB Garamond, Expletus Sans, Federo, Fontdiner Swanky, Forum, Francois One, Gentium Basic, Geo, Give You Glory, Gloria Hallelujah, Goblin One, Goudy Bookletter 1911, Gravitas One, Gruppo, Hammersmith One, Holtwood One SC, Homemade Apple, IM Fell DW Pica, IM Fell DW Pica SC, IM Fell Double Pica, IM Fell Double Pica SC, IM Fell English, IM Fell English SC, IM Fell French Canon, IM Fell French Canon SC, IM Fell Great Primer, IM Fell Great Primer SC, Inconsolata, Indie Flower, Irish Grover, Istok Web, Josefin Sans, Josefin Slab, Judson, Jura, Just Another Hand, Just Me Again Down Here, Kameron, Kelly Slab, Kenia, Kranky, Kreon, Kristi, La Belle Aurore, Lato, League Script, Leckerli One, Lekton, Limelight, Lobster, Lobster Two, Lora, Love Ya Like A Sister, Loved by the King, Luckiest Guy, Maiden Orange, Mako, Marvel, Maven Pro, Meddon, MedievalSharp, Megrim, Merriweather, Metrophobic, Michroma, Miltonian, Miltonian Tattoo, Modern Antiqua, Molengo, Monofett, Mountains of Christmas, Muli, Neucha, Neuton, News Cycle, Nixie One, Nobile, Nothing You Could Do, Nova Cut, Nova Flat, Nova Mono, Nova Oval, Nova Round, Nova Script, Nova Slim, Nova Square, Nunito, OFL Sorts Mill Goudy TT, Old Standard TT, Open Sans, Open Sans Condensed, Orbitron, Oswald, Over the Rainbow, Ovo, PT Sans, PT Sans Caption, PT Sans Narrow, PT Serif, PT Serif Caption, Pacifico, Patrick Hand, Paytone One, Permanent Marker, Philosopher, Play, Playfair Display, Podkova, Pompiere, Puritan, Quattrocento, Quattrocento Sans, Radley, Raleway, Rationale, Redressed, Reenie Beanie, Rochester, Rock Salt, Rokkitt, Rosario, Ruslan Display, Schoolbell, Shadows Into Light, Shanti, Sigmar One, Six Caps, Slackey, Smokum, Smythe, Sniglet, Snippet, Special Elite, Stardos Stencil, Sue Ellen Francisco, Sunshiney, Swanky and Moo Moo, Syncopate, Tangerine, Tenor Sans, Terminal Dosis Light, The Girl Next Door, Tienne, Tinos, Tulpen One, Ubuntu, Ultra, UnifrakturCook, UnifrakturMaguntia, Unkempt, Unna, VT323, Varela, Varela Round, Vibur, Vollkorn, Waiting for the Sunrise, Wallpoet, Walter Turncoat, Wire One, Yanone Kaffeesatz, Yellowtail, Yeseva One, Zeyada';
  24. function BP_AJAX() {
  25. $this->_checkBackupDir();
  26. $this->_checkDb();
  27. }
  28. function importData() {
  29. $has_post = count($_POST) > 0;
  30. $has_get = count($_GET) > 0;
  31. $has_files = count($_FILES) > 0;
  32. if ($has_post || $has_get || $has_files) {
  33. if (($has_post + $has_get + $has_files) > 1) {
  34. echo '<pre>GET:
  35. ';
  36. print_r($_GET);
  37. echo 'POST:
  38. ';
  39. print_r($_POST);
  40. echo 'FILES:
  41. ';
  42. print_r($_FILES);
  43. echo '</pre>';
  44. trigger_error("TOO_MUCH_PARAMS", E_WARNING);
  45. }
  46. if ($has_post) {
  47. $this->data_source = "POST";
  48. $this->_importVars($_POST);
  49. } else if ($has_get) {
  50. $this->data_source = "GET";
  51. $this->_importVars($_GET);
  52. } else {
  53. $this->data_source = "FILES";
  54. $this->_importVars($_FILES);
  55. }
  56. } else {
  57. trigger_error("NO_DATA", E_USER_ERROR);
  58. send_output();
  59. }
  60. }
  61. function _importVars(&$vars) {
  62. $not_valid_keys = array();
  63. $keys = array_keys($vars);
  64. $valid_keys = $this->valid_vars[$this->data_source];
  65. foreach ($keys as $key) {
  66. if (!in_array($key, $valid_keys)) {
  67. $not_valid_keys[] = $key;
  68. }
  69. }
  70. if (count($not_valid_keys) > 0) {
  71. echo 'Not valid parameter' . (count($not_valid_keys) > 1 ? 's' : '') . ': ';
  72. echo '<ul>';
  73. foreach ($not_valid_keys as $key) {
  74. echo '<li><b>' . $key . '</b></li>';
  75. }
  76. echo '</ul>';
  77. trigger_error("NOT_ALLOWED_PARAMS", E_USER_WARNING);
  78. }
  79. $this->_setTask($vars["task"]);
  80. $this->_setBaseUrl($vars["base_url"]);
  81. $this->_setStepBack();
  82. $this->_setParams($vars);
  83. }
  84. function checkVersion() {
  85. if (!isset($this->vars["version"])) {
  86. trigger_error("NO_VERSION_NUMBER_DEFINED", E_USER_WARNING);
  87. } else if ($this->vars["version"] !== $this->version) {
  88. trigger_error("VERSION_MISMATCH", E_USER_WARNING);
  89. }
  90. }
  91. function _setTask(&$task) {
  92. $task = $this->_clean($task, true);
  93. if ($task == '') {
  94. trigger_error("NO_TASK", E_USER_ERROR);
  95. send_output();
  96. }
  97. if (!in_array($task, $this->allowed_tasks)) {
  98. trigger_error("NOT_ALLOWED_TASK", E_USER_ERROR);
  99. send_output();
  100. }
  101. $this->task = $task;
  102. }
  103. function _setBaseUrl(&$base_url) {
  104. $base_url = $this->_clean($base_url, true);
  105. if ($base_url == '') {
  106. trigger_error("NO_BASE_URL", E_USER_ERROR);
  107. send_output();
  108. }
  109. if (substr($base_url, 0, 7) !== "http://") {
  110. echo "" . $base_url . "";
  111. trigger_error("INVALID_BASE_URL", E_USER_ERROR);
  112. send_output();
  113. }
  114. $server_name = preg_replace('/(http:\/\/)|(www\.)|(\/)/', "", $_SERVER["SERVER_NAME"]);
  115. $base_url_server = preg_replace('/(http:\/\/)|(www\.)|(\/)/', "", $base_url);
  116. if (substr($base_url_server, 0, strlen($server_name)) !== $server_name) {
  117. echo $base_url_server . " - " . $server_name;
  118. trigger_error("WRONG_SERVER_NAME", E_USER_ERROR);
  119. send_output();
  120. }
  121. $this->base_url = $base_url;
  122. }
  123. function _setParams(&$vars) {
  124. if (count($vars) == 0) {
  125. trigger_error("NO_VAR_TO_PROCESS", E_USER_ERROR);
  126. send_output();
  127. }
  128. unset($vars["task"]);
  129. unset($vars["base_url"]);
  130. foreach ($vars as $key => $val) {
  131. $val = $this->_clean($val);
  132. $this->vars[$key] = $val;
  133. unset($vars[$key]);
  134. }
  135. }
  136. function _clean($str, $noWhiteSpace = false) {
  137. $str = stripslashes(trim(strip_tags(nl2br($str))));
  138. if ($noWhiteSpace) {
  139. $str = preg_replace('/\s\s+/', ' ', $str);
  140. }
  141. return $str;
  142. }
  143. function _getFileName($file_name) {
  144. $file_name = str_replace( str_replace("www.", "", $this->base_url), "", str_replace("www.", "", $file_name));
  145. $qm_pos = strpos($file_name, "?");
  146. if ($qm_pos > -1)
  147. $file_name = substr($file_name, 0, $qm_pos);
  148. $bpfile_pos = strpos($file_name, "bluepen-local.php");
  149. if ($bpfile_pos > -1)
  150. $file_name = substr($file_name, $bpfile_pos + 17, strlen($file_name));
  151. if (preg_match("/http:/", $file_name)) {
  152. echo "" . $file_name . "";
  153. trigger_error("EXTERNAL_FILE", E_USER_NOTICE);
  154. return $file_name;
  155. }
  156. return $this->step_back . $file_name;
  157. }
  158. function stripProtocolls( $str ) {
  159. return preg_replace("/http:\/\/|www./", "", $str);
  160. }
  161. function _saveSettings() {
  162. $settings = array();
  163. $settings_array = $this->vars["settings_array"];
  164. if (!@file_put_contents("bp-db.txt", $settings_array)) {
  165. trigger_error("SETTINGS_NOT_SAVED", E_USER_NOTICE);
  166. }
  167. }
  168. function _getSettings() {
  169. if (is_file("bp-db.txt")) {
  170. $setArr = file_get_contents("bp-db.txt");
  171. if ($setArr == "")
  172. $setArr = "{}";
  173. echo $setArr;
  174. } else {
  175. trigger_error("NO_DB_FILE", E_USER_NOTICE);
  176. }
  177. }
  178. function _getFontFamilies() {
  179. echo $this->fontFamilies;
  180. }
  181. function _getCSSfile() {
  182. $file_name = $this->_getFileName($this->vars["file_name"]);
  183. $ext = substr($file_name, -4);
  184. if ($ext !== '.css') {
  185. echo $file_name;
  186. trigger_error("NO_CSS_FILE", E_USER_ERROR);
  187. send_output();
  188. }
  189. header('content-type:text/css');
  190. header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  191. header("Cache-Control: no-cache");
  192. header("Pragma: no-cache");
  193. $base_url = $this->base_url;
  194. // a sajat import fajlokat kiszuri
  195. function filter_imports($matches) {
  196. global $BP;
  197. $url = preg_replace("/('|\"|\(|\)|url|\s)/", "", $matches[1]);
  198. $url = str_replace($BP->base_url, "", $url);
  199. // ha kulso hivatkozas, akkor maradjon benne
  200. if (strpos($url, "http://") !== FALSE) {
  201. return $matches[0];
  202. }
  203. // kulonben ezt is at kell irni, php-s betoltesre
  204. return '@import "' . $BP->absolute_url($BP->base_url, $_SERVER["PHP_SELF"]) . '?cssReloadCnt=' . date("YmdGis") . '&task=getCSSfile&base_url=' . $BP->base_url . '&version=' . $BP->version . '&file_name=' . $BP->absolute_url($BP->absolute_url($BP->base_url, $BP->vars["file_name"]), $url) . '";';
  205. }
  206. // a relativ hivatkozasokat abszolutra csereli
  207. function absolutize_urls($matches) {
  208. global $BP;
  209. $source_css = $BP->absolute_url($BP->base_url, $BP->vars["file_name"]);
  210. $path = preg_replace("/url\(|\);|\"|\'/", "", $matches[0]);
  211. return 'url("'.$BP->absolute_url($source_css, $path).'");';
  212. }
  213. $css = file_get_contents($file_name);
  214. $css = preg_replace_callback("|@import(.*);|", "filter_imports", $css);
  215. // a relative hivatkozasokbol absolute-ot kell csinalni
  216. $css = preg_replace_callback("|url\([^\)]*\);|", "absolutize_urls", $css);
  217. echo $css;
  218. }
  219. function absolute_url($base_url, $relative_url) {
  220. $base_url_info = parse_url($base_url);
  221. $base_url_path = explode("/", $base_url_info["path"]);
  222. $base_url_file = $base_url_path[count($base_url_path) - 1];
  223. unset($base_url_path[count($base_url_path) - 1]);
  224. $relative_url_path = explode("/", $relative_url);
  225. if (parse_url($relative_url, PHP_URL_SCHEME) != "") {
  226. return $relative_url;
  227. } else {
  228. switch ($relative_url_path[0]) {
  229. case ".":
  230. unset($relative_url_path[0]);
  231. return $this->absolute_url
  232. ($base_url
  233. , implode("/", $relative_url_path)
  234. );
  235. break;
  236. case "..":
  237. unset($relative_url_path[0]);
  238. return $this->absolute_url
  239. (str_replace($base_url_info["path"], "", $base_url)
  240. . implode("/", $base_url_path)
  241. , implode("/", $relative_url_path)
  242. );
  243. break;
  244. case "":
  245. return str_replace($base_url_info["path"], "", $base_url)
  246. . $relative_url
  247. ;
  248. break;
  249. default:
  250. return str_replace($base_url_info["path"], "", $base_url)
  251. . implode("/", $base_url_path)
  252. . "/"
  253. . $relative_url
  254. ;
  255. break;
  256. }
  257. }
  258. }
  259. function _listBackups() {
  260. if (!is_dir("backup")) {
  261. trigger_error("NO_BACKUP_DIR", E_USER_ERROR);
  262. send_output();
  263. }
  264. $i = 0;
  265. $files = array();
  266. $handler = opendir("backup");
  267. while (false !== ($file = readdir($handler))) {
  268. if ($file !== '.' && $file !== '..' && $file !== '.svn' && !is_dir("backup/" . $file)) {
  269. $files[$i] = array();
  270. $files[$i]["datetime"] = date("Y-m-d G:i:s", substr($file, 0, strpos($file, "-")));
  271. $files[$i]["filename"] = $file;
  272. $files[$i]["path"] = urldecode(substr($file, strpos($file, "-") + 1));
  273. $i++;
  274. }
  275. }
  276. rsort($files);
  277. if (count($files) > 0) {
  278. echo json_encode($files);
  279. } else {
  280. trigger_error("NO_BACKUPS", E_USER_NOTICE);
  281. }
  282. }
  283. function _restoreBackup() {
  284. $file_name = $this->vars["file_name"];
  285. $target_file = urldecode(substr($file_name, strpos($file_name, "-") + 1));
  286. $step_back = $this->step_back;
  287. if (!is_file("backup/" . $file_name)) {
  288. echo '' . $file_name . '';
  289. trigger_error("BACKUP_FILE_NOT_FOUND", E_USER_ERROR);
  290. send_output();
  291. }
  292. if (!is_file($step_back . $target_file)) {
  293. echo "" . $step_back . $target_file . "";
  294. trigger_error("BACKUP_TARGET_NOT_FOUND", E_USER_NOTICE);
  295. send_output();
  296. }
  297. if (@copy("backup/" . $file_name, $step_back . $target_file)) {
  298. echo 'File restoring successfull';
  299. } else {
  300. echo 'error by restoring file <br /><br />(source: <br />' . $file_name . '<br /> -> <br />target: <br />' . $target_file . ')';
  301. trigger_error("CAN_NOT_RESTORE", E_USER_NOTICE);
  302. send_output();
  303. }
  304. }
  305. function _saveCSS() {
  306. $file_name = $this->vars["file_name"];
  307. $selector = preg_replace("/\s+/", " ", $this->vars["selector"]);
  308. $parent_selector = $this->vars["parent_selector"];
  309. $nth_selector = $this->vars["nth_selector"];
  310. $new_selector = $this->vars["new_selector"];
  311. $selector_body = str_replace("|", ";\n\t", stripcslashes($this->vars["selector_body"]));
  312. $nth_selector = $nth_selector == -1 ? -1 : $nth_selector + 1;
  313. $relative_path = $this->_getFileName($file_name);
  314. // $selector_body = substr($selector_body, 0, -1);
  315. if (!is_file($relative_path)) {
  316. echo 'saveCSS: ' . $relative_path . '';
  317. trigger_error("FILE_NOT_FOUND", E_USER_NOTICE);
  318. send_output();
  319. }
  320. if (!is_writable($relative_path) && !@chmod($relative_path, 0664)) {
  321. $chmod = substr(sprintf('%o', fileperms($relative_path)), -4);
  322. echo 'No permission to write file: ' . $relative_path . '. <br /> Current chmod: ' . $chmod . ' <br /><br /> Set group writing permission, and try again!';
  323. trigger_error("NO_PERMISSION", E_USER_NOTICE);
  324. send_output();
  325. }
  326. $backup_filename = time() . '-' . urlencode(str_replace($this->base_url, "", $file_name));
  327. if (@!copy($relative_path, 'backup/' . $backup_filename)) {
  328. echo '';
  329. }
  330. @chmod('backup/' . $backup_filename, 0755);
  331. $hol = file_get_contents($relative_path);
  332. $hol_len = strlen($hol);
  333. if (!$this->__isCSSvalid($hol)) {
  334. echo "The source CSS (" . $relative_path . ") is NOT VALID!";
  335. trigger_error("NOT_VALID_SOURCE_CSS", E_USER_NOTICE);
  336. send_output();
  337. }
  338. if ($new_selector == "false") {
  339. echo '<br />Updating existing selector<br />';
  340. $pos_close = $prev_pos_close = $pos_open = 0;
  341. for ($i = 0; $i < $nth_selector; $i++) {
  342. $pos_open = $this->__strpos($hol, "{", $pos_open + 1);
  343. }
  344. $prev_pos_close = $this->__strrpos($hol, "}", $pos_open);
  345. $pos_close = $this->__strpos($hol, "}", $pos_open);
  346. $prev_pos_close = !$prev_pos_close ? 0 : $prev_pos_close + 1;
  347. $nth_selector_text = $this->__stripComments(substr($hol, $prev_pos_close, $pos_open - $prev_pos_close));
  348. $nth_selector_text = trim(preg_replace("/(\s)+/", " ", $nth_selector_text));
  349. if ($selector == $nth_selector_text) {
  350. $hol = substr_replace($hol, "{
  351. " . $selector_body . "}", $pos_open, $pos_close - $pos_open + 1);
  352. } else {
  353. echo 'This two selector does not match: <br />' . $selector . '<br /><br />' . $nth_selector_text . '<br />';
  354. trigger_error("SELECTOR_MISMATCH", E_USER_NOTICE);
  355. send_output();
  356. }
  357. } else {
  358. if ($parent_selector !== '') {
  359. echo '<br />Saving after parent selector: ' . $parent_selector . '<br />';
  360. $parent_selector_text = "";
  361. $pos = -1;
  362. $i = 0;
  363. while ($i < 20 && $parent_selector_text !== $parent_selector) {
  364. $pos = $this->__strpos(preg_replace("/\s/", ' ', $hol), $parent_selector, ++$pos);
  365. $pos_open = $this->__strpos($hol, "{", $pos);
  366. $prev_pos_close = $this->__strrpos($hol, "}", $pos_open);
  367. $pos_close = $this->__strpos($hol, "}", $pos_open);
  368. $prev_pos_close = !$prev_pos_close ? 0 : $prev_pos_close + 1;
  369. $parent_selector_text = $this->__stripComments(substr($hol, $prev_pos_close, $pos_open - $prev_pos_close));
  370. $parent_selector_text = trim(preg_replace("/(\s)+/", " ", $parent_selector_text));
  371. echo 'Parent kereses nr (' . $i . '): ' . $parent_selector_text . '<br />';
  372. $i++;
  373. }
  374. if ($parent_selector == $parent_selector_text) {
  375. $hol = substr_replace($hol, "
  376. " . $selector . " {
  377. " . $selector_body . "}", $pos_close + 1, 0);
  378. } else {
  379. echo 'A ket selector nem egyezik meg: <br />' . $selector . '<br /><br />' . $nth_selector_text . '<br />';
  380. trigger_error("SELECTOR_MISMATCH", E_USER_NOTICE);
  381. send_output();
  382. }
  383. } else {
  384. echo '<br />Saving at the end of the Stylesheet<br />';
  385. $pos_close = $this->__strrpos($hol, "}", $hol_len);
  386. $pos_close++;
  387. $hol = substr_replace($hol, "
  388. " . $selector . " {
  389. " . $selector_body . "}", $pos_close, 0);
  390. }
  391. }
  392. if (!$this->__isCSSvalid($hol)) {
  393. echo "The CSS to save is NOT VALID!<br /><br /> ";
  394. trigger_error("NOT_VALID_SOURCE_CSS", E_USER_NOTICE);
  395. send_output();
  396. }
  397. if (is_file($relative_path)) {
  398. $file_css = fopen($relative_path, "w");
  399. $fw_css = fwrite($file_css, $hol);
  400. fclose($file_css);
  401. echo '<b>SAVED</b><br /> <br /> <b>Filename:</b> ' . $file_name . '<br /><br /> <b>Selector: </b>' . $selector . '<br />';
  402. } else {
  403. echo "(saveCSS)<br />" . $relative_path . "";
  404. echo "";
  405. }
  406. }
  407. function _deleteCSS() {
  408. $file_name = $this->vars["file_name"];
  409. $selector = preg_replace("/\s+/", " ", $this->vars["selector"]);
  410. $nth_selector = $this->vars["nth_selector"];
  411. $nth_selector = $nth_selector == -1 ? -1 : $nth_selector + 1;
  412. $relative_path = $this->_getFileName($file_name);
  413. if (!is_file($relative_path)) {
  414. echo '(deleteCSS)<br />' . $relative_path . '';
  415. trigger_error("FILE_NOT_FOUND", E_USER_NOTICE);
  416. send_output();
  417. }
  418. if (!is_writable($relative_path) && !@chmod($relative_path, 0664)) {
  419. $chmod = substr(sprintf('%o', fileperms($relative_path)), -4);
  420. echo 'No permission to write file: ' . $relative_path . '. <br /> Current chmod: ' . $chmod . ' <br /><br /> Set group writing permission, and try again!';
  421. trigger_error("NO_PERMISSION", E_USER_NOTICE);
  422. send_output();
  423. }
  424. $backup_filename = time() . '-' . urlencode(str_replace($this->base_url, "", $file_name));
  425. if (@!copy($relative_path, 'backup/' . $backup_filename)) {
  426. echo '';
  427. }
  428. @chmod('backup/' . $backup_filename, 0755);
  429. $hol = file_get_contents($relative_path);
  430. $hol_len = strlen($hol);
  431. if (!$this->__isCSSvalid($hol)) {
  432. echo "The source CSS (" . $relative_path . ") is NOT VALID!";
  433. trigger_error("NOT_VALID_SOURCE_CSS", E_USER_NOTICE);
  434. send_output();
  435. }
  436. echo '<br />Deleting existing selector<br />';
  437. $pos_close = $prev_pos_close = $pos_open = 0;
  438. for ($i = 0; $i < $nth_selector; $i++) {
  439. $pos_open = $this->__strpos($hol, "{", $pos_open + 1);
  440. }
  441. $prev_pos_close = $this->__strrpos($hol, "}", $pos_open);
  442. $pos_close = $this->__strpos($hol, "}", $pos_open);
  443. $prev_pos_close = !$prev_pos_close ? 0 : $prev_pos_close + 1;
  444. $nth_selector_text = $this->__stripComments(substr($hol, $prev_pos_close, $pos_open - $prev_pos_close));
  445. $nth_selector_text = trim(preg_replace("/(\s)+/", " ", $nth_selector_text));
  446. if ($selector == $nth_selector_text) {
  447. $hol = substr_replace($hol, "
  448. ", $prev_pos_close, $pos_close - $prev_pos_close + 1);
  449. } else {
  450. echo 'This two selector does not match: <br />' . $selector . '<br /><br />' . $nth_selector_text . '<br />';
  451. trigger_error("SELECTOR_MISMATCH", E_USER_NOTICE);
  452. send_output();
  453. }
  454. if (!$this->__isCSSvalid($hol)) {
  455. echo "The target CSS to save is NOT VALID!<br /><br /> ";
  456. trigger_error("NOT_VALID_SOURCE_CSS", E_USER_NOTICE);
  457. send_output();
  458. }
  459. if (is_file($relative_path)) {
  460. $file_css = fopen($relative_path, "w");
  461. $fw_css = fwrite($file_css, $hol);
  462. fclose($file_css);
  463. echo '<b>Selector Deleted</b><br /> <br /> <b>Filename:</b> ' . $file_name . '<br /><br /> <b>Selector: </b>' . $selector . '<br />';
  464. } else {
  465. echo "(deleteCSS)<br />" . $relative_path . "";
  466. echo "";
  467. }
  468. }
  469. function _getFiles() {
  470. $sub_dir = $this->vars["sub_dir"];
  471. $img_dir = $this->vars["img_dir"];
  472. $step_back = $this->step_back;
  473. if ($sub_dir !== "" && substr($sub_dir, -1) !== "/") {
  474. $sub_dir = $sub_dir . "/";
  475. }
  476. if (is_dir($step_back . $img_dir . $sub_dir)) {
  477. $i = 0;
  478. $firstFile = "";
  479. $dirs = $files = array();
  480. $handler = opendir($step_back . $img_dir . $sub_dir);
  481. while (false !== ($file = readdir($handler))) {
  482. if ($file !== '.' && $file !== '..' && $file !== '.svn') {
  483. if (is_dir($step_back . $img_dir . $sub_dir . $file)) {
  484. $dirs[] = $file;
  485. } else {
  486. $files[] = $file;
  487. }
  488. }
  489. }
  490. sort($dirs);
  491. sort($files);
  492. // itt kezdem osszeallitani a kimenetet
  493. $ret = array();
  494. $retI = 0;
  495. if (strlen($sub_dir) > 0 && $sub_dir !== "/") {
  496. $ret["dirs"][$retI++]["name"] = "..";
  497. $i++;
  498. }
  499. // mappak hozzaadasa
  500. if (count($dirs) > 0) {
  501. foreach ($dirs as $dir) {
  502. $ret["dirs"][$retI++]["name"] = $dir;
  503. $i++;
  504. }
  505. }
  506. $retI = 0;
  507. // fajlok hozzaadasa (kepek eseten meretet is adja at)
  508. if (count($files) > 0) {
  509. foreach ($files as $file) {
  510. $ret["files"][$retI]["name"] = $file;
  511. // ha kep, akkor meretet is adjon at az elonezet miatt
  512. $ext = pathinfo($step_back . $img_dir . $sub_dir . $file, PATHINFO_EXTENSION);
  513. if (preg_match("/gif|png|jpg|jpeg|bmp/", $ext)) {
  514. $sizes = getimagesize($step_back . $img_dir . $sub_dir . $file);
  515. $ret["files"][$retI]["sizes"] = Array("width" => $sizes[0], "height" => $sizes[1]);
  516. }
  517. $retI++;
  518. $i++;
  519. }
  520. }
  521. echo json_encode($ret);
  522. } else {
  523. echo 'Image directory not found! (' . $img_dir . $sub_dir . ')';
  524. echo '<!--bp-error-->';
  525. }
  526. }
  527. function _getStylesheets() {
  528. $hrefs = $this->vars["hrefs"];
  529. $file_names = explode(";", $hrefs);
  530. $data = Array();
  531. foreach ($file_names as $file_name) {
  532. if ($file_name == "")
  533. continue;
  534. $relative_path = $this->_getFileName($file_name);
  535. if (!is_file($relative_path)) {
  536. echo 'getStylesheets: ' . $relative_path . '';
  537. trigger_error("FILE_NOT_FOUND", E_USER_NOTICE);
  538. continue;
  539. }
  540. if (!is_writable($relative_path) && !@chmod($relative_path, 0664)) {
  541. $chmod = substr(sprintf('%o', fileperms($relative_path)), -4);
  542. echo 'No permission to write file: ' . $relative_path . '. <br /> Current chmod: ' . $chmod . ' <br /><br /> Set group writing permission, and try again!';
  543. trigger_error("NO_PERMISSION", E_USER_NOTICE);
  544. send_output();
  545. continue;
  546. }
  547. $file = file_get_contents($relative_path);
  548. $file_len = strlen($file);
  549. if (!$this->__isCSSvalid($file)) {
  550. echo "" . $relative_path . "";
  551. trigger_error("NOT_VALID_SOURCE_CSS", E_USER_NOTICE);
  552. continue;
  553. }
  554. $file = $this->__stripComments($file);
  555. $file = $this->__clearWhiteSpace($file);
  556. $i = 0;
  557. $file_arr = Array();
  558. $selectors = explode("}", $file);
  559. if (count($selectors) > 1) {
  560. foreach ($selectors as $selector) {
  561. $selector_arr = explode("{", $selector);
  562. $selector_text = isset($selector_arr[0]) ? $selector_arr[0] : '';
  563. $selector_body = isset($selector_arr[1]) ? $selector_arr[1] : '';
  564. $selector_text = trim($selector_text);
  565. $selector_body = trim($selector_body);
  566. $file_arr[$i]["selector"] = $selector_text;
  567. $file_arr[$i++]["selector_body"] = $selector_body;
  568. }
  569. }
  570. $data[$file_name] = $file_arr;
  571. }
  572. echo json_encode($data);
  573. }
  574. function _embedFontFamily() {
  575. $fontFamily = $this->vars["fontFamily"];
  576. $file_name = $this->_getFileName($this->vars["file_name"]);
  577. if (!is_file($file_name)) {
  578. echo 'Target CSS file name: ' . $file_name;
  579. trigger_error("FILE_NOT_FOUND", E_USER_NOTICE);
  580. send_output();
  581. }
  582. $css = file_get_contents($file_name);
  583. $css = '@import url("http://fonts.googleapis.com/css?family=' . urlencode($fontFamily) . '");
  584. ' . $css;
  585. file_put_contents($file_name, $css);
  586. }
  587. function _pause() {
  588. $millisec = $this->vars["pauseMillisec"];
  589. sleep(ceil($millisec / 1000));
  590. }
  591. function _uploadFile() {
  592. $img_dir = $this->vars["img_dir"];
  593. if (move_uploaded_file($_FILES["Filedata"]["tmp_name"], $img_dir . $_FILES["Filedata"]["name"])) {
  594. echo 'File upload successfull.';
  595. } else {
  596. echo '<pre>';
  597. print_r($_FILES);
  598. print_r($this->vars);
  599. echo '</pre>';
  600. echo 'Error by uploading file. ';
  601. }
  602. }
  603. function run() {
  604. $task = "_" . $this->task;
  605. $this->$task();
  606. }
  607. function _checkBackupDir() {
  608. if (!is_dir("backup") && !@mkdir("backup")) {
  609. trigger_error("BACKUP_DIR_PERMISSION", E_USER_NOTICE);
  610. }
  611. }
  612. function _checkDb() {
  613. if (!is_file("bp-db.txt") && !@touch("bp-db.txt")) {
  614. trigger_error("UNABLE_TO_CREATE_DB", E_USER_NOTICE);
  615. }
  616. }
  617. function _setStepBack() {
  618. $base_url = $this->base_url;
  619. $php_self_arr = explode('/', $_SERVER["PHP_SELF"]);
  620. array_shift($php_self_arr);
  621. array_pop($php_self_arr);
  622. $step_back = str_repeat('../', count(array_diff($php_self_arr, explode("/", $base_url))));
  623. $this->step_back = $step_back;
  624. }
  625. function __isCSSvalid($css) {
  626. $css = $this->__stripComments($css);
  627. if (preg_match("/\{([^}]*){/", $css) == 1) {
  628. return false;
  629. }
  630. return true;
  631. }
  632. function __stripComments($ret) {
  633. return preg_replace("/\/\*[\s\S]*?\*\//", "", $ret);
  634. }
  635. function __clearWhiteSpace($ret) {
  636. $ret = preg_replace("/\t/", "", $ret);
  637. $ret = preg_replace("/[\r|\n]/", " ", $ret);
  638. $ret = preg_replace("/\s{1,300}/", " ", $ret);
  639. return $ret;
  640. }
  641. function __strrpos($hol, $mit, $visszafele_honnan) {
  642. $is_in_comment = true;
  643. $hol_len = strlen($hol);
  644. $pos = $visszafele_honnan;
  645. while ($is_in_comment) {
  646. $rev_pos = -($hol_len - $pos) - 1;
  647. $pos = strrpos($hol, $mit, $rev_pos);
  648. if ($pos == false)
  649. return false;
  650. $pos_prev_comm_open = strrpos($hol, "/*", -($hol_len - $pos));
  651. $pos_prev_comm_close = strrpos($hol, "*/", -($hol_len - $pos));
  652. if (
  653. !($pos_prev_comm_open !== false && $pos_prev_comm_close == false ) &&
  654. $pos_prev_comm_open <= $pos_prev_comm_close
  655. ) {
  656. $is_in_comment = false;
  657. }
  658. }
  659. return $pos;
  660. }
  661. function __strpos($hol, $mit, $honnan) {
  662. $is_in_comment = true;
  663. $hol_len = strlen($hol);
  664. $pos = $honnan - 1;
  665. while ($is_in_comment) {
  666. $pos = strpos($hol, $mit, $pos + 1);
  667. if ($pos == false)
  668. return false;
  669. $pos_prev_comm_open = strrpos($hol, "/*", -($hol_len - $pos));
  670. $pos_prev_comm_close = strrpos($hol, "*/", -($hol_len - $pos));
  671. if (
  672. !($pos_prev_comm_open !== false && $pos_prev_comm_close == false ) &&
  673. $pos_prev_comm_open <= $pos_prev_comm_close
  674. ) {
  675. $is_in_comment = false;
  676. }
  677. }
  678. return $pos;
  679. }
  680. function _getHTML() {
  681. $bpConf["siteBpDir"] = $_GET["site_bluepen_dir"];
  682. $bpConf["siteImgDir"] = $_GET["site_image_dir"];
  683. $step_back = str_repeat('../', count(explode("/", $bpConf["siteBpDir"])) - 1);
  684. ?>
  685. <a href="javascript:void(null)" class="bp-toggle-btn">&nbsp;</a><div id="bp-cont"><div id="bp-panel" class="bp-panel"><div class="bp-title" id="bp-panel-dragger"><div class="bp-title-left">&nbsp;</div><div class="bp-title-repeat"><div class="bp-title-text bp-title-logo">Main panel</div><div class="bp-title-btns"><a href="javascript:void(null)" class="bp-btn-minimize">&nbsp;</a><a href="javascript:void(null)" class="bp-btn-close">&nbsp;</a></div></div><div class="bp-title-right">&nbsp;</div></div><div class="bp-repeat" id="bp-panel-repeat"><div id="bp-message">&nbsp;</div><div id="bp-dialog-holder"><div class="bp-title bp-dialog-title"><div class="bp-title-left">&nbsp;</div><div class="bp-title-repeat bp-dialog-title-repeat"><div class="bp-title-text" id="bp-dialog-title">Dialog</div><div class="bp-title-btns bp-dialog-btns"><a href="javascript:void(null)" class="bp-btn-close" id="bp-dialog-close-btn">&nbsp;</a></div></div><div class="bp-title-right">&nbsp;</div></div><div id="bp-dialog-repeat"><div id="bp-dialog-content"><a class="bp-dialog-item" href="javascript:void(null)">small-caps</a><a class="bp-dialog-item" href="javascript:void(null)">small-caps</a><a class="bp-dialog-item" href="javascript:void(null)">small-caps</a><a class="bp-dialog-item" href="javascript:void(null)">small-caps</a><a class="bp-dialog-item" href="javascript:void(null)">small-caps</a></div></div><div id="bp-dialog-footer"><div class="bp-footer-left">&nbsp;</div><div class="bp-footer-repeat bp-dialog-footer-repeat"><a href="javascript:void(null)" id="bp-dialog-btn-ok">OK</a><a href="javascript:void(null)" id="bp-dialog-btn-cancel">Cancel</a><div class="bp-clear">&nbsp;</div></div><div class="bp-footer-right bp-footer-right">&nbsp;</div><div class="bp-clear">&nbsp;</div></div></div><a href="javascript:void(null)" class="bp-tab-btn" id="bp-selected-layers-btn" > Selected layer / parent layers <span class="bp-hotkey-title">[S]</span></a><div id="bp-selected-layers-content" class="bp-tab-content"></div><a href="javascript:void(null)" class="bp-tab-btn" id="bp-file-manager-btn" > File manager <span class="bp-hotkey-title">[M]</span></a><div id="bp-file-manager-content" class="bp-tab-content"><div id="bp-files"><h2>Files</h2><div id="bp-filemanager-files"><object width="273" height="300" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=6,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"><param value="scroller.swf?bp_list_id=bp-filemanager-files-flash" name="movie"/><param value="autohigh" name="quality"/><param value="always" name="allowScriptAccess"/><param value="opaque" name="wmode"/><param value="bgcolor" name="#000000"/><param value="LT" name="salign" /><embed id="bp-filemanager-files-flash" width="273" height="300" salign="LT" src="scroller.swf?bp_list_id=bp-filemanager-files-flash" bgcolor="black" pluginspace="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" wmode="opaque" quality="autohigh" allowscriptaccess="always" /></object></div></div><div class="bp-clear">&nbsp;</div><div id="bp-file-upload-holder"><a href="javascript:void(null)" id="bp-reload-files">reloadfiles</a><object width="65" height="20" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=6,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="bp-file-upload-flash"><param value="http://bluebros.net/bluepen/images/bp-multifile.swf?phpUrl=<?php echo urlencode($this->base_url . $bpConf["siteBpDir"]); ?>bp-ajax.php%3Fimg_upl_dir%3D<?php echo urlencode($step_back . $bpConf["siteImgDir"]); ?>" name="movie"/><param value="autohigh" name="quality"/><param value="always" name="allowScriptAccess"/><param value="opaque" name="wmode"/><embed width="65" height="20" src="http://bluebros.net/bluepen/images/bp-multifile.swf?phpUrl=<?php echo urlencode($this->base_url . $bpConf["siteBpDir"]); ?>bp-ajax.php%3Fimg_upl_dir%3D<?php echo urlencode($step_back . $bpConf["siteImgDir"]); ?>" pluginspace="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" wmode="opaque" quality="autohigh" allowscriptaccess="always" /></object><div class="bp-clear">&nbsp;</div></div><div id="bp-uploading-files"></div><div id="bp-uploading-files-template" class="bp-dn"><div class="bp-uploading-file"> filename <div class="bp-uploading-file-progressbar"><div id="bp-uploading-file-#i#" class="bp-uploading-file-stripe">&nbsp;</div></div></div></div><div id="bp-row-template-edited" class="bp-dn"><div class="bp-row-#isEven#" id="#row_id#"><a href="javascript:void(null)" class="bp-checkbox2-inactive" id="#toggle_id#">&nbsp;</a><a href="javascript:void(null)" onclick="return false;" title="#title#">#title#</a><a href="javascript:void(null)" class="bp-filemanager-file-preview" id="#preview_id#">&nbsp;</a></div></div><div id="bp-rowtitle-template-edited" class="bp-dn"><div class="bp-row-title"><a href="javascript:void(null)" onclick="" title="#title#">#title#</a></div></div><div id="bp-rowtitle-template-edited-active" class="bp-dn"><div class="bp-row-title-active"><a href="javascript:void(null)" onclick="" title="#title#">#title#</a></div></div><div id="bp-background-selection-btns"><a href="javascript:void(null)" id="bp-select-image" class="bp-btn-ok">Ok</a><a href="javascript:void(null)" id="bp-cancel-image" class="bp-btn-cancel">Cancel</a></div><br /><br /></div><a href="javascript:void(null)" class="bp-tab-btn" id="bp-css-editor-btn" > CSS editor <span class="bp-hotkey-title">[C]</span></a><div id="bp-css-editor-content" class="bp-tab-content"><a href="javascript:void(null)" class="bp-slider-title-inactive" id="bp-slider-actual-styles"> Style overview <span class="bp-shortcut-key"><span>[<b>F</b>]</span></span></a><div class="bp-slider-content" id="bp-slider-actual-styles-content"><h2>Now edited</h2><div class="bp-scroll-holder" id="bp-edited-list" style="height: 300px;"><div class="bp-scroll-content" id="bp-now-edited"><object width="273" height="300" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=6,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"><param value="scroller.swf?bp_list_id=bp-now-edited-flash" name="movie"/><param value="autohigh" name="quality"/><param value="always" name="allowScriptAccess"/><param value="opaque" name="wmode"/><param value="bgcolor" name="#000000"/><param value="LT" name="salign" /><embed id="bp-now-edited-flash" width="273" height="300" salign="LT" src="scroller.swf?bp_list_id=bp-now-edited-flash" bgcolor="black" pluginspace="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" wmode="opaque" quality="autohigh" allowscriptaccess="always" /></object><br /></div></div></div><a href="javascript:void(null)" class="bp-slider-title-inactive" id="bp-slider-font-text-properties"> Font / Text properties <span class="bp-shortcut-key"><span>[<b>F</b>]</span></span></a><div class="bp-slider-content" id="bp-slider-font-text-properties-content"><h2>Font properties</h2><div class="bp-fieldset"><div class="bp-input-title-medium"> Font-family </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="font-family" id="font-family" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Font-size </div><div class="bp-input-holder-medium bp-slider-bg-medium"><div class="bp-slider-btn" id="font-size-dragger"><input type="text" name="font-size" id="font-size" class="bp-drag" /><input type="text" name="font-size-unit" id="font-size-unit" class="bp-drag-unit" /></div></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Font-weight </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="font-weight" id="font-weight" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Line-height </div><div class="bp-input-holder-medium bp-slider-bg-medium"><a href="javascript:void(null)" onclick="return false;" class="bp-slider-btn" id="line-height-dragger"><input type="text" name="line-height" id="line-height" class="bp-drag" /><input type="text" name="line-height-unit" id="line-height-unit" class="bp-drag-unit" /></a></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Font-variant </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="font-variant" id="font-variant" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Letter-spacing </div><div class="bp-input-holder-medium bp-slider-bg-medium"><a href="javascript:void(null)" onclick="return false;" class="bp-slider-btn" id="letter-spacing-dragger"><input type="text" name="letter-spacing" id="letter-spacing" class="bp-drag" /><input type="text" name="letter-spacing-unit" id="letter-spacing-unit" class="bp-drag-unit" /></a></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Font-style </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="font-style" id="font-style" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Color </div><div class="bp-input-holder-medium bp-color-select"><input type="text" name="color" id="color" class="bp-color-input" /><a href="javascript:void(null)" class="bp-color-picker-btn bp-color-select-btn"> &nbsp; </a></div><div class="bp-clear">&nbsp;</div></div><h2>Text properties</h2><div class="bp-fieldset"><div class="bp-input-title-medium"> Text-align </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="text-align" id="text-align" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Text-decoration </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="text-decoration" id="text-decoration" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Text-transform </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="text-transform" id="text-transform" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Text-indent </div><div class="bp-input-holder-medium bp-slider-bg-medium"><a href="javascript:void(null)" onclick="return false;" class="bp-slider-btn" id="text-indent-dragger"><input type="text" name="text-indent" id="text-indent" class="bp-drag" /><input type="text" name="text-indent-unit" id="text-indent-unit" class="bp-drag-unit" /></a></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Word-wrap </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="word-wrap" id="word-wrap" class="bp-select" /></div><div class="bp-clear">&nbsp;</div></div></div><a href="javascript:void(null)" class="bp-slider-title-inactive" id="bp-slider-box-properties">Box properties <span class="bp-shortcut-key"><span>[<b>B</b>]</span></span></a><div class="bp-slider-content" id="bp-slider-box-properties-content"><div id="bp-box-holder"><div id="bp-box-properties-holder"><table border="0" cellpadding="0" cellspacing="0"><tr><td id="bp-margin-all"><a href="javascript:void(null)" id="margin-dragger"><input type="hidden" name="margin-unit" id="margin-unit" class="bp-box-input-unit" /></a></td><td id="bp-margin-top" colspan="5"><input type="text" id="margin-top-view" class="bp-box-input" /><a href="javascript:void(null)" id="margin-top-dragger" class="bp-box-controller"><input type="text" name="margin-top" id="margin-top" class="bp-box-popup-input" /><input type="text" name="margin-top-unit" id="margin-top-unit" class="bp-box-input-unit" /></a></td><td id="bp-margin-righttop">&nbsp;</td></tr><tr><td id="bp-margin-left" rowspan="5"><input type="text" id="margin-left-view" class="bp-box-input" /><a href="javascript:void(null)" id="margin-left-dragger" class="bp-box-controller"><input type="text" name="margin-left" id="margin-left" class="bp-box-popup-input" /><input type="text" name="margin-left-unit" id="margin-left-unit" class="bp-box-input-unit" /></a></td><td id="bp-border-all"><a href="javascript:void(null)" id="border-dragger"><input type="text" name="border" id="border" class="bp-box-input" /></a></td><td id="bp-border-top" colspan="3"><a href="javascript:void(null)" id="border-top-dragger"><input type="text" name="border-top" id="border-top" class="bp-box-input" /></a></td><td id="bp-border-righttop">&nbsp;</td><td id="bp-margin-right" rowspan="5"><input type="text" id="margin-right-view" class="bp-box-input" /><a href="javascript:void(null)" id="margin-right-dragger" class="bp-box-controller"><input type="text" name="margin-right" id="margin-right" class="bp-box-popup-input" /><input type="text" name="margin-right-unit" id="margin-right-unit" class="bp-box-input-unit" /></a></td></tr><tr><td id="bp-border-left" rowspan="3"><a href="javascript:void(null)" id="border-left-dragger"><input type="text" name="border-left" id="border-left" class="bp-box-input" /></a></td><td id="bp-padding-all"><a href="javascript:void(null)" id="padding-dragger"><input type="hidden" name="padding" id="padding" value="" class="bp-drag" /><input type="hidden" name="padding-unit" id="padding-unit" class="bp-drag-unit" /></a></td><td id="bp-padding-top"><input type="text" id="padding-top-view" class="bp-box-input" /><a href="javascript:void(null)" id="padding-top-dragger" class="bp-box-controller"><input type="text" name="padding-top" id="padding-top" class="bp-box-popup-input" /><input type="text" name="padding-top-unit" id="padding-top-unit" class="bp-box-input-unit" /></a></td><td id="bp-padding-righttop">&nbsp;</td><td id="bp-border-right" rowspan="3"><a href="javascript:void(null)" id="border-right-dragger"><input type="text" name="border-right" id="border-right" class="bp-box-input" /></a></td></tr><tr><td id="bp-padding-left"><input type="text" id="padding-left-view" class="bp-box-input" /><a href="javascript:void(null)" id="padding-left-dragger" class="bp-box-controller"><input type="text" name="padding-left" id="padding-left" class="bp-box-popup-input" /><input type="text" name="padding-left-unit" id="padding-left-unit" class="bp-box-input-unit" /></a></td><td id="bp-dimensions"> &nbsp; </td><td id="bp-padding-right"><input type="text" id="padding-right-view" class="bp-box-input" /><a href="javascript:void(null)" id="padding-right-dragger" class="bp-box-controller"><input type="text" name="padding-right" id="padding-right" class="bp-box-popup-input" /><input type="text" name="padding-right-unit" id="padding-right-unit" class="bp-box-input-unit" /></a></td></tr><tr><td>&nbsp;</td><td id="bp-padding-bottom"><input type="text" id="padding-bottom-view" class="bp-box-input" /><a href="javascript:void(null)" id="padding-bottom-dragger" class="bp-box-controller"><input type="text" name="padding-bottom" id="padding-bottom" class="bp-box-popup-input" /><input type="text" name="padding-bottom-unit" id="padding-bottom-unit" class="bp-box-input-unit" /></a></td><td>&nbsp;</td></tr><tr><td>&nbsp;</td><td id="bp-border-bottom" colspan="3"><a href="javascript:void(null)" id="border-bottom-dragger"><input type="text" name="border-bottom" id="border-bottom" class="bp-box-input" /></a></td><td>&nbsp;</td></tr><tr><td>&nbsp;</td><td id="bp-margin-bottom" colspan="5"><input type="text" id="margin-bottom-view" class="bp-box-input" /><a href="javascript:void(null)" id="margin-bottom-dragger" class="bp-box-controller"><input type="text" name="margin-bottom" id="margin-bottom" class="bp-box-popup-input" /><input type="text" name="margin-bottom-unit" id="margin-bottom-unit" class="bp-box-input-unit" /></a></td><td>&nbsp;</td></tr></table></div><a href="javascript:void(null)" id="bp-setdimensions-tobg">Set To Bg</a><a href="javascript:void(null)" id="bp-show-bg-onchange-btn">Bg indicator</a><a href="javascript:void(null)" id="bp-dimension-correction-btn">Auto adjust</a><div class="bp-clear">&nbsp;</div></div><h2>Dimensions <span>(position prop required)</span></h2><div class="bp-fieldset"><div class="bp-input-title">Width</div><div class="bp-input-holder bp-slider-bg"><a href="javascript:void(null)" id="width-dragger" class="bp-slider-btn" ><input type="text" name="width" id="width" class="bp-drag bp-drag-wide" /><input type="text" name="width-unit" id="width-unit" class="bp-drag-unit" /></a><br /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title">Height</div><div class="bp-input-holder bp-slider-bg"><a href="javascript:void(null)" id="height-dragger" class="bp-slider-btn" ><input type="text" name="height" id="height" class="bp-drag bp-drag-wide" /><input type="text" name="height-unit" id="height-unit" class="bp-drag-unit" /></a></div><div class="bp-clear">&nbsp;</div><a href="javascript:void(null)" class="bp-move" id="bp-dimensions-move">Resize</a><div class="bp-clear">&nbsp;</div></div><h2>Offset <span>(position prop required)</span></h2><div class="bp-fieldset"><div class="bp-input-title">Left</div><div class="bp-input-holder bp-slider-bg"><a href="javascript:void(null)" id="bp-left-dragger" class="bp-slider-btn" ><input type="text" name="bp-left" id="bp-left" class="bp-drag bp-drag-wide" /><input type="text" name="bp-left-unit" id="bp-left-unit" class="bp-drag-unit" /></a><br /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title">Top</div><div class="bp-input-holder bp-slider-bg"><a href="javascript:void(null)" id="bp-top-dragger" class="bp-slider-btn" ><input type="text" name="bp-top" id="bp-top" class="bp-drag bp-drag-wide" /><input type="text" name="bp-top-unit" id="bp-top-unit" class="bp-drag-unit" /></a></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title">Right</div><div class="bp-input-holder bp-slider-bg"><a href="javascript:void(null)" id="bp-right-dragger" class="bp-slider-btn" ><input type="text" name="bp-right" id="bp-right" class="bp-drag bp-drag-wide" /><input type="text" name="bp-right-unit" id="bp-right-unit" class="bp-drag-unit" /></a><br /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title">Bottom</div><div class="bp-input-holder bp-slider-bg"><a href="javascript:void(null)" id="bp-bottom-dragger" class="bp-slider-btn" ><input type="text" name="bp-bottom" id="bp-bottom" class="bp-drag bp-drag-wide" /><input type="text" name="bp-bottom-unit" id="bp-bottom-unit" class="bp-drag-unit" /></a></div><div class="bp-clear">&nbsp;</div><a href="javascript:void(null)" id="bp-offset-move">Move</a><div class="bp-clear">&nbsp;</div></div></div><a href="javascript:void(null)" class="bp-slider-title-inactive" id="bp-slider-positioning-properties">Positioning / background properties <span class="bp-shortcut-key"><b>[P]</b></span></a><div class="bp-slider-content" id="bp-slider-positioning-properties-content"><h2>Positioning properties</h2><div class="bp-fieldset"><div class="bp-input-title-medium"> Display </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="display" id="display" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Float </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="float" id="float" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Overflow </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="overflow" id="overflow" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Position </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="position" id="position" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Opacity </div><div class="bp-input-holder-medium bp-slider-bg-medium"><a href="javascript:void(null)" onclick="return false;" class="bp-slider-btn" id="opacity-dragger"><input type="text" name="opacity" id="opacity" class="bp-drag" /></a></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Visibility </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="visibility" id="visibility" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Clear </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="clear" id="clear" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Cursor </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="cursor" id="cursor" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Z-index </div><div class="bp-input-holder-medium bp-slider-bg-medium"><a href="javascript:void(null)" onclick="return false;" class="bp-slider-btn" id="z-index-dragger"><input type="text" name="z-index" id="z-index" class="bp-drag" /></a></div><div class="bp-clear">&nbsp;</div></div><h2>Background properties</h2><div class="bp-fieldset"><div class="bp-input-title-medium"> Bg-color </div><div class="bp-input-holder bp-color-select"><input type="text" name="background-color" id="background-color" value="" class="bp-color-input" /><a href="javascript:void(null)" class="bp-background-color-picker-btn bp-color-select-btn">&nbsp;</a></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Image </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="background-image" id="background-image" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Repeat </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="background-repeat" id="background-repeat" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Attachment </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="background-attachment" id="background-attachment" class="bp-select" /></div><div class="bp-clear">&nbsp;</div><div class="bp-input-title-medium"> Position </div><div class="bp-input-holder-medium bp-popup-bg-medium"><input type="text" name="background-position" id="background-position" class="bp-select" /><div class="bp-clear">&nbsp;</div></div><div class="bp-clear">&nbsp;</div><a href="javascript:void(null)" id="bp-bg-pos-2d">Move</a><div class="bp-clear">&nbsp;</div></div></div><a href="javascript:void(null)" class="bp-slider-title-inactive" id="bp-slider-textarea">Edit all <span class="bp-shortcut-key"><b>[T]</b></span></a><div class="bp-slider-content" id="bp-slider-textarea-content"><h2>Edit in textarea</h2><div class="bp-fieldset"><div id="bp-textarea-message"></div><textarea id="bp-editor-textarea" class="bp-textarea">asdf</textarea><a href="javascript:void(null)" id="bp-update-textarea">Update [F9]</a><div class="bp-clear">&nbsp;</div></div></div></div></div><div class="bp-footer"><div class="bp-footer-left">&nbsp;</div><div class="bp-footer-repeat bp-footer-repeat-drag"><a href="javascript:void(null)" id="bp-save-btn">Save</a><a href="javascript:void(null)" id="bp-cancel-btn">Restore</a><a href="javascript:void(null)" class="bp-bluepen-link">www.bluepeneditor.com</a></div><div class="bp-footer-right bp-footer-right-drag">&nbsp;</div></div></div><div id="bp-toolbar"><div id="bp-toolbar-overlay">&nbsp;</div><div id="bp-toolbar-top">&nbsp;</div><div id="bp-toolbar-repeat"><a href="javascript:void(null)" id="bp-select-layer" class="bp-toolbar-btn">&nbsp;</a><div class="bp-toolbar-separator">&nbsp;</div><a href="javascript:void(null)" id="bp-icon-css-editor" class="bp-toolbar-btn">&nbsp;</a><a href="javascript:void(null)" id="bp-icon-font-props" class="bp-toolbar-btn">&nbsp;</a><a href="javascript:void(null)" id="bp-icon-box-props" class="bp-toolbar-btn">&nbsp;</a><a href="javascript:void(null)" id="bp-icon-position-props" class="bp-toolbar-btn">&nbsp;</a><div class="bp-toolbar-separator">&nbsp;</div><a href="javascript:void(null)" id="bp-ruler-horizontal-creator" class="bp-toolbar-btn">&nbsp;</a><a href="javascript:void(null)" id="bp-ruler-vertical-creator" class="bp-toolbar-btn">&nbsp;</a><a href="javascript:void(null)" id="bp-debug-mode-btn" class="bp-toolbar-btn">&nbsp;</a><a href="javascript:void(null)" id="bp-toggle-info-win" class="bp-toolbar-btn bp-toolbar-btn-active">&nbsp;</a><a href="javascript:void(null)" id="bp-toggle-help-win" class="bp-toolbar-btn bp-toolbar-btn-active">&nbsp;</a><a href="javascript:void(null)" id="bp-toggle-backup-win" class="bp-toolbar-btn bp-toolbar-btn">&nbsp;</a></div><div id="bp-toolbar-bottom">&nbsp;</div></div><div id="bp-info-win" class="bp-panel"><div class="bp-title" id="bp-info-win-dragger"><div class="bp-title-left">&nbsp;</div><div class="bp-title-repeat"><div class="bp-title-text bp-title-info">Information panel</div><div class="bp-title-btns"><a href="javascript:void(null)" class="bp-btn-minimize">&nbsp;</a><a href="javascript:void(null)" class="bp-btn-close">&nbsp;</a></div></div><div class="bp-title-right">&nbsp;</div></div><div class="bp-repeat"><h2>Coordinates</h2><div class="bp-fieldset" id="bp-coordinates"><div id="bp-mouse-pos-x"></div><div id="bp-mouse-pos-y"></div><div class="bp-clear">&nbsp;</div></div><h2>Edited</h2><div class="bp-fieldset" id="bp-edited-box"><div id="bp-edited-helptext"><center>To edit a selector, please select a layer!</center></div><a href="javascript:void(null)" id="bp-select-css-file-label">File:</a><span id="bp-edited-file" class="bp-blue">&nbsp;</span><a href="javascript:void(null)" id="bp-select-css-file">...</a><div class="bp-clear">&nbsp;</div><div id="bp-edited-style-label">Style:</div><div id="bp-edited-style" class="bp-blue">&nbsp;</div><textarea name="bp-new-style-textarea" id="bp-new-style-textarea"></textarea><div class="bp-clear">&nbsp;</div><div id="bp-new-style-selection-btns"><a href="javascript:void(null)" id="bp-inlinestyle-ok" class="bp-btn-ok">[Inline style]</a><a href="javascript:void(null)" id="bp-newstyle-ok" class="bp-btn-ok">OK</a><a href="javascript:void(null)" id="bp-newstyle-cancel" class="bp-btn-cancel">Cancel</a><div class="bp-clear">&nbsp;</div></div><a href="javascript:void(null)" id="bp-newstyle-btn">New style</a><a href="javascript:void(null)" id="bp-deletestyle-btn">Delete style</a><div class="bp-clear">&nbsp;</div></div><h2>State</h2><div id="bp-state-table"><div class="bp-row-even" id="bp-state-layer-sel"><a href="javascript:void(null)">layer selection mode</a><b class="bp-on">&nbsp;</b></div><div class="bp-row-odd" id="bp-state-debug-mode"><a href="javascript:void(null)">debug mode</a><b class="bp-on">&nbsp;</b></div><div class="bp-row-even" id="bp-state-editing"><a href="javascript:void(null)">editing</a><b class="bp-on">&nbsp;</b></div><div class="bp-row-odd" id="bp-state-dimm-corr"><a href="javascript:void(null)">dimension correction</a><b class="bp-on">&nbsp;</b></div><div class="bp-row-even" id="bp-state-show-bg"><a href="javascript:void(null)">background indicator</a><b class="bp-on">&nbsp;</b></div></div></div><div class="bp-footer"><div class="bp-footer-left">&nbsp;</div><div class="bp-footer-repeat bp-footer-repeat-drag"><div id="bp-infowin-holder"><div id="bp-infowin-text-default">Done</div><div id="bp-infowin-text-message">Info panel</div></div></div><div class="bp-footer-right bp-footer-right-drag">&nbsp;</div></div></div><div id="bp-default-colorpicker"><div id="bp-default-picker-holder" class="bp-panel bp-colorpicker-holder"><div class="bp-title bp-colorp-title"><div class="bp-title-left">&nbsp;</div><div class="bp-title-repeat bp-colorp-title-repeat"><div class="bp-title-text bp-colorp-text">default colorpicker</div><div class="bp-title-btns"><a href="javascript:void(null)" class="bp-btn-minimize">&nbsp;</a><a href="javascript:void(null)" class="bp-btn-close">&nbsp;</a></div></div><div class="bp-title-right">&nbsp;</div></div><div class="bp-repeat bp-colorp-repeat"><div id="bp-default-color-picker-bg"><div id="bp-colorpicker-default"><div id="bp-color-picker-holder-paramsname" class="bp-color-picker-holder bp-popup"><div class="bp-selected-color"><span>Selected color:</span><input type="text" name="paramsname" id="paramsname-preview" class="bp-colorp-preview-input" /><a href="javascript:void(null)" class="bp-transparent" id="bp-paramsname-transparent">&nbsp;</a><div id="bp-color-preview-paramsname" class="bp-colorp-preview">&nbsp;</div><div id="bp-color-preview-paramsname-live" class="bp-colorp-preview-live">&nbsp;</div><div class="bp-clear">&nbsp;</div></div><div class="bp-clear">&nbsp;</div><div class="bp-popup-cp-top">&nbsp;</div><div class="bp-popup-cp-repeat"><div id="bp-saturation-value-paramsname" class="bp-saturation-value"><div class="bp-saturation-img"><div class="bp-saturation-crosshair" id="bp-saturation-crosshair-paramsname">&nbsp;</div></div></div><div id="bp-hue-paramsname" class="bp-hue"><div class="bp-hue-img"><div id="bp-hue-position-paramsname" class="bp-hue-position">&nbsp;</div></div></div><div class="bp-saved-colors"><div class="bp-colorp-archive-top">&nbsp;</div><div id="bp-saved-colors-paramsname"></div></div><div class="bp-clear">&nbsp;</div></div><div class="bp-popup-cp-bottom">&nbsp;</div></div></div></div></div><div class="bp-footer bp-colorp-footer"><div class="bp-footer-left">&nbsp;</div><div class="bp-footer-repeat bp-colorp-footer-repeat"><a href="javascript:void(null)" id="bp-cancel-btn-default" class="bp-cancel-btn">Cancel</a><a href="javascript:void(null)" id="bp-ok-btn-default" class="bp-ok-btn">Ok</a></div><div class="bp-footer-right">&nbsp;</div></div></div></div><div id="bp-debugger-holder" class="bp-panel bp-debugger-holder"><div class="bp-title bp-debugger-title" id="bp-info-win-dragger"><div class="bp-title-left">&nbsp;</div><div class="bp-title-repeat bp-debugger-title-repeat"><div class="bp-title-text bp-title-logo bp-debugger-text">Debug panel</div><div class="bp-title-btns"><a href="javascript:void(null)" class="bp-btn-minimize">&nbsp;</a><a href="javascript:void(null)" class="bp-btn-close" id="bp-debugger-close">&nbsp;</a></div></div><div class="bp-title-right">&nbsp;</div></div><div class="bp-repeat bp-debugger-repeat"><h2><a href="javascript:void(null)" id="bp-debugger-clear">Clear</a></h2><div class="bp-fieldset" id="bp-debugger-content"></div></div></div><div id="bp-message"></div><div id="bp-top-message-holder"><div id="bp-top-message-top">BluePen message</div><div id="bp-top-message">&nbsp;</div><div id="bp-top-message-bottom">&nbsp;</div></div><div id="bp-tooltip"><table border="0" cellpadding="0" cellspacing="0"><tr><td class="bp-tooltip-left">&nbsp;</td><td class="bp-tooltip-content" id="bp-tooltip-html"> </td><td class="bp-tooltip-right"></td></tr></table></div><div id="bp-img-preview"><div class="bp-title"><div class="bp-title-left">&nbsp;</div><div class="bp-title-repeat"><div class="bp-title-text bp-title-info">File preview</div><div class="bp-title-btns">&nbsp;</div></div><div class="bp-title-right">&nbsp;</div></div><div class="bp-repeat" id="bp-file-preview-img"> &nbsp; </div><div class="bp-footer"><div class="bp-footer-left">&nbsp;</div><div class="bp-footer-repeat bp-footer-repeat" id="bp-file-preview-size"> file size </div><div class="bp-footer-right bp-footer-right">&nbsp;</div></div></div><div id="bp-help-win" class="bp-panel"><div class="bp-title" id="bp-help-win-dragger"><div class="bp-title-left">&nbsp;</div><div class="bp-title-repeat"><div class="bp-title-text bp-title-help">Help panel</div><div class="bp-title-btns"><a href="javascript:void(null)" class="bp-btn-minimize">&nbsp;</a><a href="javascript:void(null)" class="bp-btn-close">&nbsp;</a></div></div><div class="bp-title-right">&nbsp;</div></div><div class="bp-repeat"><h2>Tutorials</h2><div class="bp-fieldset" id="bp-help-results"><center><img src="http://bluebros.net/bluepen/images/bp-help-search.png" alt="" /></center><br /><div class="hr">&nbsp;</div><div class="bp-help-result bp-fieldset"><h1><b>CSS</b> modul</h1><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p><a href="#" class="bp-more">More info</a></div><div class="hr">&nbsp;</div><div class="bp-help-result bp-fieldset"><h1><b>CSS</b> modul</h1><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.</p><a href="#" class="bp-more">More info</a></div><div class="hr">&nbsp;</div><div class="bp-help-result bp-fieldset"><h1><b>CSS</b> modul</h1><p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. </p><a href="#" class="bp-more">More info</a></div></div></div><div class="bp-footer"><div class="bp-footer-left">&nbsp;</div><div class="bp-footer-repeat" id="bp-help-footer"><a href="javascript:void(null)" class="bp-bluepen-link">www.bluepeneditor.com</a></div><div class="bp-footer-right">&nbsp;</div></div></div><div id="bp-backup-win" class="bp-panel"><div class="bp-title" id="bp-backup-win-dragger"><div class="bp-title-left">&nbsp;</div><div class="bp-title-repeat"><div class="bp-title-text bp-title-backup">Backup panel</div><div class="bp-title-btns"><a href="javascript:void(null)" class="bp-btn-minimize">&nbsp;</a><a href="javascript:void(null)" class="bp-btn-close">&nbsp;</a></div></div><div class="bp-title-right">&nbsp;</div></div><div class="bp-repeat"><div id="bp-backup-list"></div><center><a href="javascript:void(null)" id="bp-backup-ok" class="bp-btn-ok">OK</a><a href="javascript:void(null)" id="bp-backup-cancel" class="bp-btn-cancel">Cancel</a></center></div><div class="bp-footer"><div class="bp-footer-left">&nbsp;</div><div class="bp-footer-repeat" id="bp-help-footer"><a href="javascript:void(null)" class="bp-bluepen-link">www.bluepeneditor.com</a></div><div class="bp-footer-right">&nbsp;</div></div></div><div id="bp-highlight">&nbsp;</div></div><div id="bp-msg-rendering"><img src="http://bluebros.net/bluepen/images/89.gif" alt="" /></div><div id="bp-prop-applied-dummy">&nbsp;</div>
  686. <?php
  687. }
  688. }
  689. $error_messages = array();
  690. // error handler function
  691. function bluePenErrorHandler($errno, $errstr, $errfile, $errline)
  692. {
  693. global $error_messages;
  694. if (!(error_reporting() & $errno)) {
  695. // This error code is not included in error_reporting
  696. return;
  697. }
  698. $output_so_far = ob_get_contents();
  699. ob_end_clean();
  700. $ei = count($error_messages);
  701. $error_messages[$ei]["errno"] = $errno;
  702. $error_messages[$ei]["errstr"] = $errstr;
  703. $error_messages[$ei]["errline"] = $errline;
  704. $error_messages[$ei]["errfile"] = $errfile;
  705. $error_messages[$ei]["php_version"] = PHP_VERSION;
  706. $error_messages[$ei]["php_os"] = PHP_OS;
  707. $error_messages[$ei]["message"] = $output_so_far;
  708. /* Don't execute PHP internal error handler */
  709. return true;
  710. }
  711. // egyseges output formatum. Csak a vegpontokban hivhato meg.
  712. function send_output() {
  713. global $error_messages;
  714. $output_so_far = ob_get_contents();
  715. ob_end_clean();
  716. $output = array();
  717. if (count($error_messages)) {
  718. $output["error_reporting"] = $error_messages;
  719. }
  720. $output["output"] = $output_so_far;
  721. echo json_encode($output);
  722. exit();
  723. }
  724. ?>