PageRenderTime 56ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/bluepen/bluepen-local.php

https://github.com/maxpestun/vrorchestra
PHP | 946 lines | 869 code | 75 blank | 2 comment | 34 complexity | 298065e460daacb965db82b015f5ff15 MD5 | raw file

Large files files are truncated, but you can click here to view the full 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></d

Large files files are truncated, but you can click here to view the full file