From 36c0e2fbe837ea0b62aa0c6027c9d5e6ef424bd0 Mon Sep 17 00:00:00 2001 From: Shea Bunge Date: Mon, 17 Jun 2013 17:32:40 +1000 Subject: [PATCH] Updated to version 1.2 --- code-snippets.php | 359 ++--- css/style.css | 12 +- {img => images}/icon16.png | Bin {img => images}/icon32.png | Bin img/icon-big.png | Bin 34722 -> 0 bytes img/icon-horiz.png | Bin 13650 -> 0 bytes img/icon-med.png | Bin 15744 -> 0 bytes img/icon-small.png | Bin 4534 -> 0 bytes img/icon.odg | Bin 3191 -> 0 bytes img/icon.svg | 58 - inc/uninstall-plugin.php | 30 - .../admin-edit.php | 32 +- .../admin-manage.php | 36 +- includes/edit_area/autocompletion.js | 491 +++++++ includes/edit_area/edit_area.css | 530 ++++++++ includes/edit_area/edit_area.js | 527 ++++++++ includes/edit_area/edit_area_compressor.php | 428 ++++++ includes/edit_area/edit_area_full.gz | Bin 0 -> 29377 bytes includes/edit_area/edit_area_full.js | 38 + includes/edit_area/edit_area_functions.js | 1202 +++++++++++++++++ includes/edit_area/edit_area_loader.js | 1081 +++++++++++++++ includes/edit_area/elements_functions.js | 336 +++++ includes/edit_area/highlight.js | 407 ++++++ includes/edit_area/images/autocompletion.gif | Bin 0 -> 359 bytes includes/edit_area/images/close.gif | Bin 0 -> 102 bytes includes/edit_area/images/fullscreen.gif | Bin 0 -> 198 bytes includes/edit_area/images/go_to_line.gif | Bin 0 -> 1053 bytes includes/edit_area/images/help.gif | Bin 0 -> 295 bytes includes/edit_area/images/highlight.gif | Bin 0 -> 256 bytes includes/edit_area/images/load.gif | Bin 0 -> 1041 bytes includes/edit_area/images/move.gif | Bin 0 -> 257 bytes includes/edit_area/images/newdocument.gif | Bin 0 -> 170 bytes includes/edit_area/images/opacity.png | Bin 0 -> 146 bytes includes/edit_area/images/processing.gif | Bin 0 -> 825 bytes includes/edit_area/images/redo.gif | Bin 0 -> 169 bytes includes/edit_area/images/reset_highlight.gif | Bin 0 -> 168 bytes includes/edit_area/images/save.gif | Bin 0 -> 285 bytes includes/edit_area/images/search.gif | Bin 0 -> 191 bytes .../edit_area/images/smooth_selection.gif | Bin 0 -> 174 bytes includes/edit_area/images/spacer.gif | Bin 0 -> 43 bytes .../edit_area/images/statusbar_resize.gif | Bin 0 -> 79 bytes includes/edit_area/images/undo.gif | Bin 0 -> 175 bytes includes/edit_area/images/word_wrap.gif | Bin 0 -> 951 bytes includes/edit_area/keyboard.js | 145 ++ includes/edit_area/langs/bg.js | 54 + includes/edit_area/langs/cs.js | 48 + includes/edit_area/langs/de.js | 48 + includes/edit_area/langs/dk.js | 48 + includes/edit_area/langs/en.js | 48 + includes/edit_area/langs/eo.js | 48 + includes/edit_area/langs/es.js | 48 + includes/edit_area/langs/fi.js | 48 + includes/edit_area/langs/fr.js | 48 + includes/edit_area/langs/hr.js | 48 + includes/edit_area/langs/it.js | 48 + includes/edit_area/langs/ja.js | 48 + includes/edit_area/langs/mk.js | 48 + includes/edit_area/langs/nl.js | 48 + includes/edit_area/langs/pl.js | 48 + includes/edit_area/langs/pt.js | 48 + includes/edit_area/langs/ru.js | 48 + includes/edit_area/langs/sk.js | 48 + includes/edit_area/langs/zh.js | 48 + includes/edit_area/license_apache.txt | 7 + includes/edit_area/license_bsd.txt | 10 + includes/edit_area/license_lgpl.txt | 458 +++++++ includes/edit_area/manage_area.js | 623 +++++++++ includes/edit_area/plugins/charmap/charmap.js | 90 ++ .../edit_area/plugins/charmap/css/charmap.css | 64 + .../plugins/charmap/images/charmap.gif | Bin 0 -> 245 bytes .../edit_area/plugins/charmap/jscripts/map.js | 373 +++++ .../edit_area/plugins/charmap/langs/bg.js | 12 + .../edit_area/plugins/charmap/langs/cs.js | 6 + .../edit_area/plugins/charmap/langs/de.js | 6 + .../edit_area/plugins/charmap/langs/dk.js | 6 + .../edit_area/plugins/charmap/langs/en.js | 6 + .../edit_area/plugins/charmap/langs/eo.js | 6 + .../edit_area/plugins/charmap/langs/es.js | 6 + .../edit_area/plugins/charmap/langs/fr.js | 6 + .../edit_area/plugins/charmap/langs/hr.js | 6 + .../edit_area/plugins/charmap/langs/it.js | 6 + .../edit_area/plugins/charmap/langs/ja.js | 6 + .../edit_area/plugins/charmap/langs/mk.js | 6 + .../edit_area/plugins/charmap/langs/nl.js | 6 + .../edit_area/plugins/charmap/langs/pl.js | 6 + .../edit_area/plugins/charmap/langs/pt.js | 6 + .../edit_area/plugins/charmap/langs/ru.js | 6 + .../edit_area/plugins/charmap/langs/sk.js | 6 + .../edit_area/plugins/charmap/langs/zh.js | 6 + includes/edit_area/plugins/charmap/popup.html | 24 + includes/edit_area/plugins/test/css/test.css | 3 + .../edit_area/plugins/test/images/test.gif | Bin 0 -> 87 bytes includes/edit_area/plugins/test/langs/bg.js | 10 + includes/edit_area/plugins/test/langs/cs.js | 4 + includes/edit_area/plugins/test/langs/de.js | 4 + includes/edit_area/plugins/test/langs/dk.js | 4 + includes/edit_area/plugins/test/langs/en.js | 4 + includes/edit_area/plugins/test/langs/eo.js | 4 + includes/edit_area/plugins/test/langs/es.js | 4 + includes/edit_area/plugins/test/langs/fr.js | 4 + includes/edit_area/plugins/test/langs/hr.js | 4 + includes/edit_area/plugins/test/langs/it.js | 4 + includes/edit_area/plugins/test/langs/ja.js | 4 + includes/edit_area/plugins/test/langs/mk.js | 4 + includes/edit_area/plugins/test/langs/nl.js | 4 + includes/edit_area/plugins/test/langs/pl.js | 4 + includes/edit_area/plugins/test/langs/pt.js | 4 + includes/edit_area/plugins/test/langs/ru.js | 4 + includes/edit_area/plugins/test/langs/sk.js | 4 + includes/edit_area/plugins/test/langs/zh.js | 4 + includes/edit_area/plugins/test/test.js | 110 ++ includes/edit_area/plugins/test/test2.js | 1 + includes/edit_area/reg_syntax.js | 166 +++ includes/edit_area/reg_syntax/basic.js | 70 + includes/edit_area/reg_syntax/brainfuck.js | 45 + includes/edit_area/reg_syntax/c.js | 63 + includes/edit_area/reg_syntax/coldfusion.js | 120 ++ includes/edit_area/reg_syntax/cpp.js | 66 + includes/edit_area/reg_syntax/css.js | 85 ++ includes/edit_area/reg_syntax/html.js | 51 + includes/edit_area/reg_syntax/java.js | 57 + includes/edit_area/reg_syntax/js.js | 94 ++ includes/edit_area/reg_syntax/pas.js | 83 ++ includes/edit_area/reg_syntax/perl.js | 88 ++ includes/edit_area/reg_syntax/php.js | 157 +++ includes/edit_area/reg_syntax/python.js | 145 ++ includes/edit_area/reg_syntax/robotstxt.js | 25 + includes/edit_area/reg_syntax/ruby.js | 68 + includes/edit_area/reg_syntax/sql.js | 56 + includes/edit_area/reg_syntax/tsql.js | 88 ++ includes/edit_area/reg_syntax/vb.js | 53 + includes/edit_area/reg_syntax/xml.js | 57 + includes/edit_area/regexp.js | 139 ++ includes/edit_area/resize_area.js | 73 + includes/edit_area/search_replace.js | 174 +++ includes/edit_area/template.html | 100 ++ js/jquery.textarea.js | 267 ---- readme.txt | 44 +- screenshot-1.jpg | Bin 288113 -> 305935 bytes screenshot-2.jpg | Bin 145233 -> 166071 bytes screenshot-3.jpg | Bin 202034 -> 261813 bytes screenshot-4.jpg | Bin 542574 -> 305982 bytes screenshot-5.jpg | Bin 276403 -> 0 bytes 143 files changed, 10404 insertions(+), 615 deletions(-) rename {img => images}/icon16.png (100%) rename {img => images}/icon32.png (100%) delete mode 100644 img/icon-big.png delete mode 100644 img/icon-horiz.png delete mode 100644 img/icon-med.png delete mode 100644 img/icon-small.png delete mode 100644 img/icon.odg delete mode 100644 img/icon.svg delete mode 100644 inc/uninstall-plugin.php rename inc/edit-snippets.php => includes/admin-edit.php (68%) rename inc/manage-snippets.php => includes/admin-manage.php (56%) create mode 100644 includes/edit_area/autocompletion.js create mode 100644 includes/edit_area/edit_area.css create mode 100644 includes/edit_area/edit_area.js create mode 100644 includes/edit_area/edit_area_compressor.php create mode 100644 includes/edit_area/edit_area_full.gz create mode 100644 includes/edit_area/edit_area_full.js create mode 100644 includes/edit_area/edit_area_functions.js create mode 100644 includes/edit_area/edit_area_loader.js create mode 100644 includes/edit_area/elements_functions.js create mode 100644 includes/edit_area/highlight.js create mode 100644 includes/edit_area/images/autocompletion.gif create mode 100644 includes/edit_area/images/close.gif create mode 100644 includes/edit_area/images/fullscreen.gif create mode 100644 includes/edit_area/images/go_to_line.gif create mode 100644 includes/edit_area/images/help.gif create mode 100644 includes/edit_area/images/highlight.gif create mode 100644 includes/edit_area/images/load.gif create mode 100644 includes/edit_area/images/move.gif create mode 100644 includes/edit_area/images/newdocument.gif create mode 100644 includes/edit_area/images/opacity.png create mode 100644 includes/edit_area/images/processing.gif create mode 100644 includes/edit_area/images/redo.gif create mode 100644 includes/edit_area/images/reset_highlight.gif create mode 100644 includes/edit_area/images/save.gif create mode 100644 includes/edit_area/images/search.gif create mode 100644 includes/edit_area/images/smooth_selection.gif create mode 100644 includes/edit_area/images/spacer.gif create mode 100644 includes/edit_area/images/statusbar_resize.gif create mode 100644 includes/edit_area/images/undo.gif create mode 100644 includes/edit_area/images/word_wrap.gif create mode 100644 includes/edit_area/keyboard.js create mode 100644 includes/edit_area/langs/bg.js create mode 100644 includes/edit_area/langs/cs.js create mode 100644 includes/edit_area/langs/de.js create mode 100644 includes/edit_area/langs/dk.js create mode 100644 includes/edit_area/langs/en.js create mode 100644 includes/edit_area/langs/eo.js create mode 100644 includes/edit_area/langs/es.js create mode 100644 includes/edit_area/langs/fi.js create mode 100644 includes/edit_area/langs/fr.js create mode 100644 includes/edit_area/langs/hr.js create mode 100644 includes/edit_area/langs/it.js create mode 100644 includes/edit_area/langs/ja.js create mode 100644 includes/edit_area/langs/mk.js create mode 100644 includes/edit_area/langs/nl.js create mode 100644 includes/edit_area/langs/pl.js create mode 100644 includes/edit_area/langs/pt.js create mode 100644 includes/edit_area/langs/ru.js create mode 100644 includes/edit_area/langs/sk.js create mode 100644 includes/edit_area/langs/zh.js create mode 100644 includes/edit_area/license_apache.txt create mode 100644 includes/edit_area/license_bsd.txt create mode 100644 includes/edit_area/license_lgpl.txt create mode 100644 includes/edit_area/manage_area.js create mode 100644 includes/edit_area/plugins/charmap/charmap.js create mode 100644 includes/edit_area/plugins/charmap/css/charmap.css create mode 100644 includes/edit_area/plugins/charmap/images/charmap.gif create mode 100644 includes/edit_area/plugins/charmap/jscripts/map.js create mode 100644 includes/edit_area/plugins/charmap/langs/bg.js create mode 100644 includes/edit_area/plugins/charmap/langs/cs.js create mode 100644 includes/edit_area/plugins/charmap/langs/de.js create mode 100644 includes/edit_area/plugins/charmap/langs/dk.js create mode 100644 includes/edit_area/plugins/charmap/langs/en.js create mode 100644 includes/edit_area/plugins/charmap/langs/eo.js create mode 100644 includes/edit_area/plugins/charmap/langs/es.js create mode 100644 includes/edit_area/plugins/charmap/langs/fr.js create mode 100644 includes/edit_area/plugins/charmap/langs/hr.js create mode 100644 includes/edit_area/plugins/charmap/langs/it.js create mode 100644 includes/edit_area/plugins/charmap/langs/ja.js create mode 100644 includes/edit_area/plugins/charmap/langs/mk.js create mode 100644 includes/edit_area/plugins/charmap/langs/nl.js create mode 100644 includes/edit_area/plugins/charmap/langs/pl.js create mode 100644 includes/edit_area/plugins/charmap/langs/pt.js create mode 100644 includes/edit_area/plugins/charmap/langs/ru.js create mode 100644 includes/edit_area/plugins/charmap/langs/sk.js create mode 100644 includes/edit_area/plugins/charmap/langs/zh.js create mode 100644 includes/edit_area/plugins/charmap/popup.html create mode 100644 includes/edit_area/plugins/test/css/test.css create mode 100644 includes/edit_area/plugins/test/images/test.gif create mode 100644 includes/edit_area/plugins/test/langs/bg.js create mode 100644 includes/edit_area/plugins/test/langs/cs.js create mode 100644 includes/edit_area/plugins/test/langs/de.js create mode 100644 includes/edit_area/plugins/test/langs/dk.js create mode 100644 includes/edit_area/plugins/test/langs/en.js create mode 100644 includes/edit_area/plugins/test/langs/eo.js create mode 100644 includes/edit_area/plugins/test/langs/es.js create mode 100644 includes/edit_area/plugins/test/langs/fr.js create mode 100644 includes/edit_area/plugins/test/langs/hr.js create mode 100644 includes/edit_area/plugins/test/langs/it.js create mode 100644 includes/edit_area/plugins/test/langs/ja.js create mode 100644 includes/edit_area/plugins/test/langs/mk.js create mode 100644 includes/edit_area/plugins/test/langs/nl.js create mode 100644 includes/edit_area/plugins/test/langs/pl.js create mode 100644 includes/edit_area/plugins/test/langs/pt.js create mode 100644 includes/edit_area/plugins/test/langs/ru.js create mode 100644 includes/edit_area/plugins/test/langs/sk.js create mode 100644 includes/edit_area/plugins/test/langs/zh.js create mode 100644 includes/edit_area/plugins/test/test.js create mode 100644 includes/edit_area/plugins/test/test2.js create mode 100644 includes/edit_area/reg_syntax.js create mode 100644 includes/edit_area/reg_syntax/basic.js create mode 100644 includes/edit_area/reg_syntax/brainfuck.js create mode 100644 includes/edit_area/reg_syntax/c.js create mode 100644 includes/edit_area/reg_syntax/coldfusion.js create mode 100644 includes/edit_area/reg_syntax/cpp.js create mode 100644 includes/edit_area/reg_syntax/css.js create mode 100644 includes/edit_area/reg_syntax/html.js create mode 100644 includes/edit_area/reg_syntax/java.js create mode 100644 includes/edit_area/reg_syntax/js.js create mode 100644 includes/edit_area/reg_syntax/pas.js create mode 100644 includes/edit_area/reg_syntax/perl.js create mode 100644 includes/edit_area/reg_syntax/php.js create mode 100644 includes/edit_area/reg_syntax/python.js create mode 100644 includes/edit_area/reg_syntax/robotstxt.js create mode 100644 includes/edit_area/reg_syntax/ruby.js create mode 100644 includes/edit_area/reg_syntax/sql.js create mode 100644 includes/edit_area/reg_syntax/tsql.js create mode 100644 includes/edit_area/reg_syntax/vb.js create mode 100644 includes/edit_area/reg_syntax/xml.js create mode 100644 includes/edit_area/regexp.js create mode 100644 includes/edit_area/resize_area.js create mode 100644 includes/edit_area/search_replace.js create mode 100644 includes/edit_area/template.html delete mode 100644 js/jquery.textarea.js delete mode 100644 screenshot-5.jpg diff --git a/code-snippets.php b/code-snippets.php index b195bc74..7e5c89cb 100644 --- a/code-snippets.php +++ b/code-snippets.php @@ -2,11 +2,11 @@ /* Plugin Name: Code Snippets - Plugin URI: http://wordpress.org/extend/plugins/code-snippets + Plugin URI: http://bungeshea.wordpress.com/plugins/code-snippets/ Description: Provides an easy-to-manage GUI interface for adding code snippets to your blog. Author: Shea Bunge - Version: 1.1 - Author URI: http://bungeshea.wordpress.com/plugins/code-snippets/ + Version: 1.2 + Author URI: http://bungeshea.wordpress.com/ License: GPLv3 or later Code Snippets - WordPress Plugin @@ -29,60 +29,50 @@ // Exit if accessed directly if ( !defined( 'ABSPATH' ) ) exit; -if( !class_exists('code_snippets') ) : +if( !class_exists('Code_Snippets') ) : -class code_snippets { +class Code_Snippets { - public $table_name = ''; - public $version = '0.1'; - public $current_version = ''; - public $plugin_url = ''; - public $plugin_dir = ''; - public $dirname = ''; - - public $manage_snippets_url = ''; - public $edit_snippets_url = ''; - public $uninstall_plugin_url = ''; + public $table = 'snippets'; + public $version = '1.2'; + + public $file; + public $plugin_dir; + public $plugin_url; + public $basename; - public $manage_snippets_page; - public $edit_snippets_page; - public $uninstall_plugin_page; + var $admin_manage_url = 'snippets'; + var $admin_edit_url = 'snippet'; - public function code_snippets(){ - $this->__construct(); - } - - function __construct() { - $this->setup_vars(); // initialise the varables - $this->setup_actions(); // run the actions and filters - $this->run_snippets(); // execute the snippets + public function Code_Snippets() { + $this->setup(); // initialise the varables and run the hooks + $this->create_table(); // create the snippet tables if they do not exist + $this->upgrade(); // check if we need to change some stuff + $this->run_snippets(); // execute the snippets } - function setup_vars(){ + function setup() { global $wpdb; - $this->table_name = $wpdb->prefix . 'snippets'; - $this->current_version = get_option( 'cs_db_version' ); - $this->file = __FILE__; - $this->basename = plugin_basename( $this->file ); - $this->plugin_dir = plugin_dir_path( $this->file ); - $this->plugin_url = plugin_dir_url ( $this->file ); - $this->dirname = dirname( $this->file ); - $this->manage_snippets_url = admin_url( 'admin.php?page=snippets' ); - $this->edit_snippets_url = admin_url( 'admin.php?page=snippet-new' ); - $this->uninstall_plugin_url = admin_url( 'admin.php?page=uninstall-cs' ); - } + $this->file = __FILE__; + $this->table = $wpdb->prefix . $this->table; + $this->current_version = get_option( 'cs_db_version' ); + + $this->basename = plugin_basename( $this->file ); + $this->plugin_dir = plugin_dir_path( $this->file ); + $this->plugin_url = plugin_dir_url ( $this->file ); - private function setup_actions(){ - add_action( 'activate_' . $this->basename, array( &$this, 'install' ) ); - add_action( 'deactivate_' . $this->basename, array( &$this, 'uninstall' ) ); - add_action( 'admin_menu', array( &$this, 'add_admin_menus' ) ); - add_filter( 'plugin_action_links', array( $this, 'settings_link' ), 10, 2 ); + $this->admin_manage_url = admin_url( 'admin.php?page=' . $this->admin_manage_url ); + $this->admin_edit_url = admin_url( 'admin.php?page=' . $this->admin_edit_url ); + + add_action( 'admin_menu', array( $this, 'add_admin_menus' ) ); + add_filter( 'plugin_action_links_' . $this->basename, array( $this, 'settings_link' ) ); + add_filter( 'plugin_row_meta', array( $this, 'plugin_meta' ), 10, 2 ); } - function install() { + function create_table() { global $wpdb; - if($wpdb->get_var("SHOW TABLES LIKE '$this->table_name'") != $this->table_name) { - $sql = 'CREATE TABLE ' . $this->table_name . ' ( + if( $wpdb->get_var( "SHOW TABLES LIKE '$this->table'" ) != $this->table ) { + $sql = 'CREATE TABLE ' . $this->table . ' ( id mediumint(9) NOT NULL AUTO_INCREMENT, name varchar(36) NOT NULL, description text NOT NULL, @@ -96,42 +86,36 @@ function install() { } } - function uninstall() { - if( get_option( 'cs_complete_uninstall', 0 ) == 1 ) { - global $wpdb; - if( $wpdb->get_var("SHOW TABLES LIKE '$table_name'") == $table_name ) { - $sql = 'DROP TABLE ' . $table_name; - $wpdb->query( $sql ); - delete_option( 'cs_db_version' ); - delete_option( 'cs_complete_uninstall' ); - } + function upgrade() { + if( $this->current_version < $this->version ) { + delete_option( 'cs_complete_uninstall' ); + update_option( 'cs_db_version', $this->version ); } } function add_admin_menus() { - $this->manage_snippets_page = add_menu_page( 'Snippets', 'Snippets', 'install_plugins', 'snippets', array( &$this, 'manage_snippets' ), $this->plugin_url . 'img/icon16.png', 67 ); - add_submenu_page('snippets', 'Snippets', 'Manage Snippets' , 'install_plugins', 'snippets', array( &$this, 'manage_snippets') ); - $this->edit_snippets_page = add_submenu_page( 'snippets', 'Add New Snippet', 'Add New', 'install_plugins', 'snippet-new', array( &$this, 'edit_snippets' ) ); - $this->uninstall_plugin_page = add_submenu_page( 'snippets', 'Uninstall Code Snippets', 'Uninstall', 'install_plugins', 'uninstall-cs', array( &$this, 'uninstall_plugin' ) ); + $this->admin_manage_page = add_menu_page( __('Snippets'), __('Snippets'), 'install_plugins', 'snippets', array( $this, 'admin_manage_loader' ), $this->plugin_url . 'images/icon16.png', 67 ); + add_submenu_page('snippets', __('Snippets'), __('Manage Snippets') , 'install_plugins', 'snippets', array( $this, 'admin_manage_loader') ); + $this->admin_edit_page = add_submenu_page( 'snippets', __('Add New Snippet'), __('Add New'), 'install_plugins', 'snippet', array( $this, 'admin_edit_loader' ) ); - add_action( 'admin_print_styles-' . $this->manage_snippets_page, array( $this, 'load_stylesheet' ), 5 ); - add_action( 'admin_print_styles-' . $this->edit_snippets_page, array( $this, 'load_stylesheet' ), 5 ); - add_action( 'admin_print_styles-' . $this->uninstall_plugin_page, array( $this, 'load_stylesheet' ), 5 ); - add_action( 'admin_print_scripts-' . $this->edit_snippets_page, array( $this, 'load_tabby' ), 5 ); - add_action( 'load-' . $this->manage_snippets_page, array( $this, 'manage_snippets_help' ), 5 ); - add_action( 'load-' . $this->edit_snippets_page, array( $this, 'edit_snippets_help' ), 5 ); - add_action( 'load-' . $this->uninstall_plugin_page, array( $this, 'uninstall_plugin_help' ), 5 ); + add_action( "admin_print_styles-$this->admin_manage_page", array( $this, 'load_stylesheet' ), 5 ); + add_action( "admin_print_styles-$this->admin_edit_page", array( $this, 'load_stylesheet' ), 5 ); + add_action( "admin_print_scripts-$this->admin_edit_page", array( $this, 'load_editarea' ), 5 ); + add_action( "load-$this->admin_manage_page", array( $this, 'admin_manage_help' ), 5 ); + add_action( "load-$this->admin_edit_page", array( $this, 'admin_edit_help' ), 5 ); } - + function load_stylesheet() { wp_enqueue_style('code-snippets-admin-style', plugins_url( 'css/style.css', $this->file), false, $this->version ); } - - function load_tabby() { - wp_enqueue_script( 'tabby', plugins_url( 'js/jquery.textarea.js', $this->file), array( 'jquery' ), 0.12 ); + + function load_editarea() { + wp_register_script( 'editarea', plugins_url( 'includes/edit_area/edit_area_full.js', $this->file ), array( 'jquery' ), '0.8.2' ); + wp_enqueue_script( 'editarea' ); } - function manage_snippets_help() { + function admin_manage_help() { + $screen = get_current_screen(); $screen->add_help_tab( array( 'id' => 'overview', @@ -144,21 +128,33 @@ function manage_snippets_help() { 'title' => 'Troubleshooting', 'content' => "

Be sure to check your snippets for errors before you activate them as a faulty snippet could bring your whole blog down. If your site starts doing strange things, deactivate all your snippets and activate them one at a time.

" . - "

If something goes wrong with a snippet and you can’t use WordPress, you can use a database manager like phpMyAdmin to access the $this->table_name table in your WordPress database. Locate the offending snippet (if you know which one is the trouble) and change the 1 in the 'active' column into a 0. If this doesn't work try doing this for all snippets.

" + "

If something goes wrong with a snippet and you can’t use WordPress, you can use a database manager like phpMyAdmin to access the $this->table table in your WordPress database. Locate the offending snippet (if you know which one is the trouble) and change the 1 in the 'active' column into a 0. If this doesn't work try doing this for all snippets.
You can also delete or rename the $this->table table and the table will automaticly be reconstructed so you can re-add snippets one at a time.

" + ) ); + + $screen->add_help_tab( array( + 'id' => 'uninstall', + 'title' => 'Uninstall', + 'content' => + "

When you delete Code Snippets through the Plugins menu in WordPress it will clear up the $this->table table and a few other bits of data stored in the database. If you want to keep this data (ie you are only temporally uninstalling Code Snippets) then remove the ".dirname(__FILE__)." folder using FTP." . + "

Even if you're sure that you don't want to use Code Snippets ever again on this WordPress installaion, you may want to use phpMyAdmin to back up the $this->table table in the database. You can later use phpMyAdmin to import it back.

" ) ); $screen->set_help_sidebar( "

For more information:

" . "

WordPress Extend

" . "

Support Forums

" . - "

SheaPress

" + "

SheaPress

" ); } - function edit_snippets_help() { + function admin_edit_title( $title ) { + return str_ireplace( 'Add New Snippet', 'Edit Snippet', $title ); + } + + function admin_edit_help() { if( isset( $_GET['action'] ) && @$_GET['action'] == 'edit' ) - add_filter('admin_title', array( &$this, 'edit_snippets_title' ), 10, 2); + add_filter( 'admin_title', array( $this, 'admin_edit_title' ) ); $screen = get_current_screen(); $screen->add_help_tab( array( @@ -173,12 +169,23 @@ function edit_snippets_help() { 'content' => "

Here are some links to websites which host a large number of snippets that you can add to your site.

- Snippets can be installed through the Add New Snippet page or by addng them to the $this->table_name table in the database (Warning: for advanced users only). Once a snippet has been installed, you can activate it here.

" + And below is a selection of snippets to get you started: + + Snippets can be installed through the Add New Snippet page or by addng them to the $this->table table in the database (Warning: for advanced users only). Once a snippet has been installed, you can activate it here.

" ) ); $screen->add_help_tab( array( 'id' => 'adding', @@ -193,112 +200,69 @@ function edit_snippets_help() { "

For more information:

" . "

WordPress Extend

" . "

Support Forums

" . - "

SheaPress

" - ); - } - - function uninstall_plugin_help() { - $screen = get_current_screen(); - $screen->add_help_tab( array( - 'id' => 'overview', - 'title' => 'Overview', - 'content' => - "

If you are absolutly sure that you will never, ever want to use the Code Snippets plugin ever again in your entire life on this WordPress installation, you can use this page to tell Code Snippets to clear all of its data when deactivated. Simply check the box below and click on the submit button. If you realise what a cool plugin Code Snippets actually is before you get around to deactivating the plugin you can come back here and uncheck the box. If the box is selected when Code Snippets is deactivated it will clear up the $this->table_name table and a few other bits of data stored in the database.

" . - "

Even if you're sure that you don't want to use Code Snippets on this WordPress installaion, you may want to use phpMyAdmin to back up the $this->table_name table in the database. You can later use phpMyAdmin to import it back.

" - ) ); - - $screen->set_help_sidebar( - "

For more information:

" . - "

WordPress Extend

" . - "

Support Forums

" . - "

SheaPress

" + "

SheaPress

" ); } - function manage_snippets() { + function bulk_action( $action, $ids ) { + if( !isset( $action ) && !isset( $ids ) && !is_array( $ids ) ) + return false; global $wpdb; - $msg = ''; - if( isset( $_POST['action'] ) && isset( $_POST['snippets'] ) && is_array( $_POST['snippets'] ) ) { - $count = 0; - switch( $_POST['action'] ) { + $count = 0; + switch( $action ) { - case 'activate': - foreach($_POST['snippets'] as $bd) { - $wpdb->query('update ' . $this->table_name . ' set active=1 where id=' . intval( $bd ) . ' limit 1' ); - $count++; - } - $msg = "Activated $count snippets."; - break; + case 'activate': + foreach( $ids as $id ) { + $wpdb->query('update ' . $this->table . ' set active=1 where id=' . intval( $id ) . ' limit 1' ); + $count++; + } + $msg = "Activated $count snippets."; + break; - case 'deactivate': - foreach($_POST['snippets'] as $bd) { - $wpdb->query('update ' . $this->table_name . ' set active=0 where id=' . intval( $bd ) . ' limit 1' ); - $count++; - } - $msg = "Deactivated $count snippets."; - break; + case 'deactivate': + foreach( $ids as $id ) { + $wpdb->query( 'update ' . $this->table . ' set active=0 where id=' . intval( $id ) . ' limit 1' ); + $count++; + } + $msg = "Deactivated $count snippets."; + break; - case 'delete': - foreach( $_POST['snippets'] as $bd) { - $wpdb->query("delete from ".$wpdb->prefix."snippets where id=".intval($bd)." limit 1"); - $count++; - } - $msg = "Deleted $count snippets."; - break; - } + case 'delete': + foreach( $ids as $id ) { + $wpdb->query( 'delete from ' . $this->table . ' where id=' . intval( $id ) . ' limit 1' ); + $count++; + } + $msg = "Deleted $count snippets."; + break; } + } + + function admin_manage_loader() { + global $wpdb; - if( isset( $_POST['action2'] ) && isset( $_POST['snippets'] ) && is_array( $_POST['snippets'] ) ) { - $count = 0; - switch( $_POST['action2'] ) { - - case 'activate': - foreach($_POST['snippets'] as $bd) { - $wpdb->query('update ' . $this->table_name . ' set active=1 where id=' . intval( $bd ) . ' limit 1' ); - $count++; - } - $msg = "Activated $count snippets."; - break; - - case 'deactivate': - foreach($_POST['snippets'] as $bd) { - $wpdb->query('update ' . $this->table_name . ' set active=0 where id=' . intval( $bd ) . ' limit 1' ); - $count++; - } - $msg = "Deactivated $count snippets."; - break; - - case 'delete': - foreach( $_POST['snippets'] as $bd) { - $wpdb->query("delete from ".$wpdb->prefix."snippets where id=".intval($bd)." limit 1"); - $count++; - } - $msg = "Deleted $count snippets."; - break; - } - } + $this->bulk_action( @$_POST['action'], @$_POST['ids'] ); + $this->bulk_action( @$_POST['action2'], @$_POST['ids'] ); if( isset( $_GET['action'] ) && isset( $_GET['id'] ) ) { if( $_GET['action'] == 'delete') { - $wpdb->query( 'delete from ' . $this->table_name . ' where id=' . intval( $_GET['id'] ) . ' limit 1' ); + $wpdb->query( 'delete from ' . $this->table . ' where id=' . intval( $_GET['id'] ) . ' limit 1' ); $msg = 'Snippet deleted.'; } elseif( $_GET['action'] == 'activate' ) { - $wpdb->query('update ' . $this->table_name . ' set active=1 where id=' . intval( $_GET['id'] ) . ' limit 1' ); + $wpdb->query('update ' . $this->table . ' set active=1 where id=' . intval( $_GET['id'] ) . ' limit 1' ); $msg = 'Snippet activated.'; } elseif( $_GET['action'] == 'deactivate' ) { - $wpdb->query('update ' . $this->table_name . ' set active=0 where id=' . intval( $_GET['id'] ) . ' limit 1' ); + $wpdb->query('update ' . $this->table . ' set active=0 where id=' . intval( $_GET['id'] ) . ' limit 1' ); $msg = 'Snippet deactivated.'; } } - - require_once( $this->dirname . '/inc/manage-snippets.php'); + + require_once $this->plugin_dir . 'includes/admin-manage.php'; } - function edit_snippets() { + function admin_edit_loader() { global $wpdb; - $msg = ''; if( isset( $_POST['save_snippet'] ) ) { $name = mysql_real_escape_string( htmlspecialchars( $_POST['snippet_name' ] ) ); $description = mysql_real_escape_string( htmlspecialchars( $_POST['snippet_description'] ) ); @@ -306,14 +270,14 @@ function edit_snippets() { if( strlen( $name ) && strlen( $code ) ) { if( isset($_POST['edit_id'] ) ) { - $wpdb-> query( "update $this->table_name set name='".$name."', + $wpdb-> query( "update $this->table set name='".$name."', description='".$description."', code='".$code."' where id=" . intval($_POST["edit_id"]." limit 1")); $msg = 'Snippet updated.'; } else { - $wpdb->query( "insert into $this->table_name(name,description,code,active) VALUES ('$name','$description','$code',0)" ); + $wpdb->query( "insert into $this->table(name,description,code,active) VALUES ('$name','$description','$code',0)" ); $msg = 'Snippet added.'; } } @@ -321,62 +285,31 @@ function edit_snippets() { $msg = 'Please provide a name for the snippet and the code.'; } } - require_once( $this->dirname . '/inc/edit-snippets.php'); + require_once $this->plugin_dir . 'includes/admin-edit.php'; } - - function edit_snippets_title( $admin_title, $title ) { - - $title = 'Edit Snippet'; - - if ( is_network_admin() ) - $admin_title = __( 'Network Admin' ); - elseif ( is_user_admin() ) - $admin_title = __( 'Global Dashboard' ); - else - $admin_title = get_bloginfo( 'name' ); - - if ( $admin_title == $title ) - $admin_title = sprintf( __( '%1$s — WordPress' ), $title ); - else - $admin_title = sprintf( __( '%1$s ‹ %2$s — WordPress' ), $title, $admin_title ); - - return $admin_title; + + function settings_link( $links ) { + array_unshift( $links, '' . __('Manage') . '' ); + return $links; } - function uninstall_plugin(){ - $msg = ''; - if( isset( $_POST['uninstall'] ) ) { - if(isset( $_POST['ch_unin']) ) { - update_option('cs_complete_uninstall' , 1); - $msg = 'Option updated. Please deactivate the Code Snippets plugin to clear all data.'; - } - else { - update_option('cs_complete_uninstall', 0); - $msg = 'Option updated. Code Snippets will retain its data when deactivated'; - } - } - require_once( $this->dirname . '/inc/uninstall-plugin.php'); - } - - function settings_link( $links, $file ){ - static $this_plugin; - if ( ! $this_plugin ) { - $this_plugin = plugin_basename( __FILE__ ); - } - if ( $file == $this_plugin ) { - $settings_link = 'Settings'; - array_unshift( $links, $settings_link ); + function plugin_meta( $links, $file ) { + if ( $file == $this->basename ) { + return array_merge( $links, array( + '' . __( 'About' ) . '', + '' . __( 'Support' ) . '' + ) ); } return $links; } - + function run_snippets() { global $wpdb; // grab the active snippets from the database - $active_snippets = $wpdb->get_results( 'select * FROM `' . $this->table_name . '` WHERE `active` = 1;' ); + $active_snippets = $wpdb->get_results( 'select * FROM `' . $this->table . '` WHERE `active` = 1;' ); if( count( $active_snippets ) ) { foreach( $active_snippets as $snippet ) { - // execute the php code + // execute the php code $result = @eval( htmlspecialchars_decode( stripslashes( $snippet->code ) ) ); } } @@ -386,6 +319,12 @@ function run_snippets() { endif; // class exists check global $cs; -$cs = new code_snippets; +$cs = new Code_Snippets; + +register_uninstall_hook( __FILE__, 'cs_uninstall' ); -?> \ No newline at end of file +function cs_uninstall() { + global $wpdb, $cs; + $wpdb->query( "DROP TABLE IF EXISTS `$cs->table`" ); + delete_option( 'cs_db_version' ); +} \ No newline at end of file diff --git a/css/style.css b/css/style.css index 5d828b97..39c20b50 100644 --- a/css/style.css +++ b/css/style.css @@ -1,10 +1,10 @@ -#icon-snippets.icon32{ - background: url('../img/icon32.png') no-repeat scroll transparent; +#icon-snippets.icon32 { + background: url('../images/icon32.png') no-repeat scroll transparent; } /* Snippets > Manage Snippets */ -.inactive a:hover{ +.inactive a:hover { color: #d54e21; } @@ -13,17 +13,17 @@ a.delete:hover { border-bottom-color: #f00; } -a.delete{ +a.delete { color: #21759b; } -tr{ +tr { background-color: #fcfcfc; } .inactive, .inactive th, -.inactive td{ +.inactive td { background-color: #f4f4f4; } diff --git a/img/icon16.png b/images/icon16.png similarity index 100% rename from img/icon16.png rename to images/icon16.png diff --git a/img/icon32.png b/images/icon32.png similarity index 100% rename from img/icon32.png rename to images/icon32.png diff --git a/img/icon-big.png b/img/icon-big.png deleted file mode 100644 index 3889159d23eb0858c077424c4224d13b1983c08d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34722 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 Dvnu9E diff --git a/img/icon-horiz.png b/img/icon-horiz.png deleted file mode 100644 index 2f383c6619ae74ab56ded717112e8a18203bb3ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13650 zcmYMb1ymc~^Z%U?+}#RAihGgbPH=a3x8f8JuEpIc6nB^6?rxT+q!juAbXAoS15{6u z96?uLtwa?>0f4$Vlot~?=sLNXw5kFC;7tPnKtce3C+Js@Ljb^?4FEVc1_1cd0RRH0 z>~<9a=nqIv(mJjH0HW}JFQB(wDs%xr>;~3$Q~PS^=4s+$0Z=xvadcx*1gn#KaIkQ( zd}d?2btwPTx=w{>?*M@~QIv!;Cxn?}Y*`-5OLkWn3y?%$yhgs! zAX22ahpG|~y#!ejQRSKu;pdCG*!vFU~MN`M&1@CqUfYiS@ zy;8om$rL5|E9ruCL7`QFofZ!t3SmnbG|IoN9zVA2zstO{5R_@H)X2se+T~wzDvO8t z78*f*+mz&}zdqe*WPNc^S5ZkIW;2Em3w*037V>RnU}4ehIB%~Y=CF(*=5;B$diQ(& zry=NltDM8{sad7hqRD^ptAPwM*7c9^=%S8N1LeZ~2+Ix)Hy2)aJRS+_5|)_DZb|)Y ztwl>b4E3`JT_wP})93z6PqksEckWaC;# zak)~SP#0vhvGfJ98iDmmeK?j>sJ~xiWo8ODqvM$vbAwg%#M*FIoxI~^>|~LyfIAjrBYj9_S%6!q4UmA*tG3T zzG(9ju@Ea@{LJf`x3{oC^*Z*Jtq~qs7t}F&_n90e}$Taq)M(Hc9{h zF15Q1Fmc#wssGIaliYDyAHC)Y&qol4umsGJmTI~XN{^d zz{Mx@uPP7^*927hzdohhgzESbgu^DWU7rEHH@@)nwhwy?pKV2D-7QFZy#8 zSru147p5x6zKMx|?MlvJt@#c{6=R$OkT7Peup7M}aq84i&;F_j8^(Gy;?o!AF#^qQR6uubToZ_MhVKxK z&-`aQzE)&YWZJVI!6Oqf-v&i2Lx@q;-M+e$W+QlZqXxRMvLVQQH!q+?x0d9tBRf%$ z{@yttTQ|XNXpYZ3hG&kqZJ?f#Z~?xQr(j@gLBUSMj+};=XL<_8Ir6Z0q;Kjok+=tU z>9>YKM}7B`C9cHm$Wl*f)BR+X|Jf{|b$;EgN%&$AbZE6FVI0`Cl^CEtT`a&^M+moo z7!$MV%1IR2t%iJk+kJFFaD_l*c5RqMaa?Y!-A~v*D4GKywxOTvt3s!dd+KL<#gT{# z&x@Bt%DEsI`yVR6$70Vu9(|4VHKc^%2%zzx$pdY(|Czt4|m?P(A4aQmc{a*uWFoq&?+>zyvBMVncfWYQyA_btFtY%#2Rj6Evn5(ObZKR6^- z%Tv#e9FI6ZaRNgVvWuzLC|*4+Pp+6r$BO1_8r^Y3Sy;Dy)4|L&;9tfj`h&gvK? zN#DWX)mtj=?M|jh0BIi^Je5~Z`-Lt@X1T{e(|Dm$hlBRS)P4?u`IVMnR&MHt*JLYh zj1GpV9eDzADRt-Ds%>u~id92=fqz-n$ZYDxt%^`!)G`16U6m*ZrwX63j2&}(m1&pD z>(Gj&D-ob2*TtOWtTYa$z2#_v-hKaYv2EC@xIDqVw@n6h{(Y^BZ0qB=%8iMjvVxlG zTv1>qdpbHL+iATSj|}XR!HOG2v49lpanTK!1sBN5g4d?MJ53oaQH@P;7fXtqQf|EW zUEm;1VjCH<&|sxh=$N}`^^;U~d|YhR@Kt^Ir^SpnN!c=h_R-uFKoTB3f#0UO>zF_w z@g+(-_x4#E!|^2Spa#cFcUKb2dU7=d6|e049!;B_x`!5hx>cb>>hU#^&`60XJ*#hW zngR!EVC0I#*5o-9p=f|sv0dkcIPgm==dY=Ex|-+k+be1;rp7DE*ub61DtvmcuPjLI zK0`+ep{FQoyfv)Gaq$~Jp>rJK4`Az}^b@U*c^G0f0Y0zA`md?=RwF6Em&ZmzP*X!n zW6Pq5Oa`zNQK?pCposi;?2(|<^S9N^W9nko&lc;)lsmlgup85Ml+B?5eiQ4hAPviR z{{&|&c8w*bwi4YYTMGc*-l_v`Aolzm`t4PHNAZ8HP&X^Wc!VVUk`|#X%(3iWNCni) zAUgq8fNfJPzs?tbU(dfD4gYwDYWCseZjUSaY5eX6Sr&w5(Kx}48X^U@f1LH5kg0K9 zzUG@7q+5Wo8+o|eS=c-{sFXQ;MVOsMb*C#iV!>XF^{pDsc zl)$ivrR!T)`|X_EVh~)~hj*c)qNK$@gpZ|?u_QLi)NO3l-_BfhD)&z`kqfRr$}BOs1bfj$IUJ}EauwO0Nw41ZR0{uUJd|{UK7o^;Qo-o?{;X+whTi~oBQoYCckH{ zZoPR~`}4Wa!dMF9VkVc};xO6Qv5ZQC=Um-7)1U3H|JD}!LQxiptg;K>F+QGJ=>s}u zm$d0)!-4APcjr8o@^TIGip?`9{xDEe%;xODAi87BP^*x5qh0P%FHs~d#JqfazNoRB z%=}s1wy%4)pr%v-ok90eAumB|2xPvcsmyvb>Fi69$7{$vV;*cIW}2aDVIta>hf{mCqDrFD;(Ebc5Re=h1&J$LxOjXc`IY-V#d0zUG&ExEgB`(Rwnmg!Y zrZ*xsJ8nNE)&N^46fxV3cJ<<1hsR$SI^fZHVnTOf`4yQByqmm_ex{kBNoSCUQn#3o zVi(+fJkr#hR;0C$D;xDH9Z}qOdz_V>EtHD;0*QKM_A$sxo8^CWol=I)zA&W0mPcvF z%Z1NOWy$Ow$3d7r zA;WT6S&EX_2ZV2Y$GHne=NsXn_t{O5GToEAKJn3QaqQfpBI6uM3l?zge62aWr%xEA zjCJQ2y)Ua(<}K%x%W-uvZb-kly8XT5H;YRq0#+?{Jemif6lw3mBxr%(&dd~B-$vX| zS7vKdooKqB&y8@b=%J0i6DMpEGg^=ulx5hQcHB|5d~{p7DEHa!4^R{8_%%GMjwvR1 zUKFd}+$1FlD6ikU5Fb*%XVQy_b?sI64gaF!4lo|b;j~Gt`ySoVuoedgF72gG z)Bo{wdvxO7X>K%(ME8wDbigwqIl9siu~)YkJosfMFq8WzFfZ>ZJw9MATCk3Ib2EIv z;8@e~`fAF6fZEQYW!;0rG&$G*DMMXbJ_GP?MjWGpUJYF(L=<-6L&@GjR3jpX&(o?O zFS-y;B}q9#0Qo)b-7N+(s_@vd2%crJ##^WTku;?djp-=n_RZ@D*U)V;w&;oU&uZ%d z@1Q6`3gJ{4>}rc>Sy=D;bFlxC)PB=Dw!u1Wy-)JPW$q%%r^demudb!;QU?*g6il;@ zTz}Z+N4@LOocPy|kWwb>PSj=5F)*kOlekv4Kkn--_*_)Uk+NlMdQA)7myagVGKQBQ zI`)KaxwK0|U7r*p50q3~;`wqHr|g8Vq{gtXlh>uICRr7M47p$10^Lp!vHGMaky`E7 z+negvDLx)nwft3NW&Mr&P(tUG@!C~X`v{9A8^OU_lr5Z;%4DubY<`?cQ>>rq@- z=X(p(HAhCa{9xeA`mXdDas9dw2m{=@q7jEYd}s+Zf94gP5D!P^(gvoo2FTYr^)tN` z{dpexP=P85i=c_io#P@lCc~@V=Vf<#!pv{$2qYb|a^6TClU#;m266m$$qq4f8j~^3 zo#dL?KGgIgK4dg<4;=Z;)-%v40f{5!*DRG`QTy86*-j2Y0t~JO?0n}g6a2T*Pd`3@ zmaiF&9!C&}MtOmTu;S@~^TTerI?N(8&oNt@V~oMR#iqeBKofdc&Xl zM7QYnUHXs>#$Q@Sr8nx^`zsop880yT1Gm5N%r7V1i&{n}5DWTnag_QdbKF{p?~i7Zn*9fpW+xDT21HG3+7u#qa490YF_{y$Or@3cO| zPrBt=J(twKPcFq*e#0;uKo+D!V*MiJM?ycnS478lLwynEz}=fxq1mZZn~Gz6e^@xa zXcA6}U;G2*21}THP)=<_#6(Z3F#~0f1C|VBw{8whirZ*A`kEYM$YeTNVFAZv-ti19 zlb@k%>H}#zqak32s)FKo9h>h5X1x}b+D_8Nad8V^=bjlp_;o7O+p* zXA*frequm%nr~YRcfb)nuvLf@RVNMkYd993k<=zG{ysby#W*tNcUn^8fr+5%LXz<@ z1TyVSr58kYJ9ha_0}mLMQDVN?l?P|(F&@Tp^k)%UI7 zMVPuhs9nK@$6))$nx@(e_VW_FCPH-9nX$xPj$pSs6J6`y95IX^FwBakzOix4j3tTA z=r-i3vC?lndi?lXhCXLMt2_U-2SsDH)SvPY^4v@`#CQ>5W~Xy|Mk#NqbH@=|vn~f7 z$I1>r+CPOjrJAl|2Jd+o%}gWBoX-7>wg6bE_n6<242|6LCF3`I;HU$WAP)4}(@G^V z!&1N*%0;AnAlQP1B~N_FN)>}QX--P+Y~M@OTZFo(udT@S2gvTUy!5P$U(cPtACJp& z0rp0-9P?qmrKhA#f)$a`$t8VNA%h10DC@GJUZW)&+rFvK0l^kl8A+BK{~CK)*TQ2@71P_xYw&REz79{Ea4Ew4~mC_0INBtFwu} z??%eK%MWR$Lv_lY@D;&rwxa~QRSJAoy`EA4#rgCVR@+wuV*B2ekBS6!mEtkx6zZF)X9_fE7Jny_WbngKogvr>LWT6*I7VP>CVTZi9 zA)B%oW|j;Nn1(8*lFRaov1PYs!*1UfY{IHs+5p&w0NSp7M3lCxNx7r+{FgnT#dXh( zLT1{!Y(O*jhVOW({0>L2klF^DrvN>>4poX9gFn7Mc8vp74h_q|JSDO>X*7mE6BBH+ zrl=0~cD)}gga~DAhpwthr@^ufpI^JdvdViql6C=&`%mdduU)L*IR45M?BQqL&R>uF zS>Nfr$sV&-Z&u_H9diZ-%bxXBK)cA;Hd$&tW4=NOmjf190eA;1jI5g@UlL$Gkc5Ww ziVFN&F=G}D2X{DaiH(bZZ+VgsFq&<=p1snyyn zjX9~!zf6Ngu_~pE-Q;Wb_Sp8I6Mx_|GZjB3~M90p_JO7!oxIa27$y1pxCfy0$ z*-$jH4Ba$wHjr;OYFh@}UC~7Sp{o}}X)H~ylL^u10i3xe^du}gLL!>PMgW`f(}>|xtMOmpBLL0ll??fC+0HPp*4o}wdS`nZ7b2CUw(iFgpvS9~N^D@TBV>O6P zU?(O=WYr8zr(BS=B*Ke^iHh)@p)&W5*{y#m;gbzhj}->ZYO)`qxf4pLO2R0o~yNw((Y;y70}p2D?W+QHok!Zqcd`f7Y9 zPC=k(d27h|;mb#BwW=rjHn}CT&td4bw>T2W08>rto9r23oqLtfD7Hc1gXXj?ZOkw` z%>M`912<2~L~s?TQDgYG;hh&N`?Fb?iljit96J6ddaj~>>1NHy6d0OP&Q*a;?w{sn;zltR7(btDP7%TZ14?07xGH^JB@a!F4v%g7hBOn`4bJDh(_3* zIf8nB7@DWSg0}3cXpUt&DkohMtrE*UYIBf(;e5Y~AX>u0j~fCe7p((r8l)J zuusZLE?Q~%<0H4_3!hGxH-KZXEQ++0)am?RSqGSAAL^C zas%E%kpXyc%Q*Bh2RYnQRfeyzS1$^BE#+t3Z^s{s>H|;IMC=wB+{;7sMSc+O8;o~8 zG_HJ9trY!=fdZtzW|O3|FgE|C2|JeFlhiDmQVx%YawS7Oft>P{6z+AZH#mGH_Bq$* zoJ%CgVQnmBnn)gb*(e~`dn=THIpe?1*ovW@6MD&>MJQ9Y(^M$ z{1aTeSfg6&Vm5l|G(WkI!#?mzzCMc0TZrDy&J%LA#7)J|zbi%5=;sR1knN=^H^EBh zRW~mld8ITTMrh8Q@L9c%??xapNbIF=xFF^Cs9!*NW8}|A9>0@-eO@S23mtl(*J7JE z?=MzrE@citX!O`cZ8Y>gVdfGa3j@~*Qn?>cU|E~FQSX*&dQRktzpXnZe5A~vj>vb~ za&t^Xyqo7K*wJFZ^feq&+RFC7KDK937W)k4z}1wfW3Ux{6T! z>w1ix90_{xZy-%#&d(R!-M!o*I)Ro*)_yuLx>$NTk|X^}!t^3``$Sd}Kwb5!eW@FA zEQZLFR7y0r)VgfiYeW1?ky+7E7bT7K*C7048aC2oHnIUvz3@1sr_H6RH9{^-@no-h zSa&goJ{Lig6esqF?PyjojG~98A(3@tzkpT#-M=;4{nJ$y2>zdw`v`gbz(bXm5ZnCd z+blnSD$Rs7SAW``6U)o!VWMnA&%>F5!V5}NN4|(_*C2LYybx+!TYPRKt%bY~`FB6H zb$MZ{(%>2`bG$5Z^Y0oC-xRTq;jA@hLjd^0zw9^O@b>!Zyz!$Wt5o7X3YuMDA_#Q2 z9sQ`ib*V~Yn;s6}{!e`V&aJ7z$Fr)dt0zD6L@$-PG=03cSh09ym7@`8LJ48<91(1Z z6ge(sWE#e7q+4)`8PNh7R+kLQ0nA>X&;~XZ6wAwRQ|2zN(5cC{(i})t&P3ZPU4D*F z9H>47HD*E+yZm1^cUuLM=ldNt-pOOX9UT56UmI2mU;tL>z%0EWhAjxw&a2~*v5N70 zcl25k;eUM767O0-P6`qkELO-ON=1xy>Tc|O{Qb5?VE6Y|XvxTBsr&wcmwHa%)y=x+ zJFyR>9=2K`Yms(MSWU0{QPbi5@nEEiS>)tri`EAr<_=^Lp<4xTc9ujw;auaW7l3Iy z)BpCVkEeHxr7sfHrdjn{5)Us5BffuVRI3X@b9le)(|1J@csKA5xJjFSCy_8O8<5fc zuiUERq*k_0vZm|l*gPl+w)Xc|td`V=rWoxi>ndhN3?t|j&Qt9IQFwQKAa$UzQ)kLk z3AgbAc*Ky7$#E1=#HAl9(e*PD$y#&5r)V5AYTiICB#|a)D5SoaL0jLANI~N9-Dtax zaycR-YUrTTnZdgciMI6lykk1TFzz=+?(_kc@zbbPUWLPke@XK@wvc;?eqW=u?sSc} zS`Gu!Quczk4hVgDlVJ-1Dary(7Yl?Rn4Yz6h?xrK6wJlN za|>5y$3$wg*eY!rX<3Ism8tJ}kvRljG114s?)XZM!+K^j8D_!h(+oR61k0dXxyT6d zb#0wbT8NxJ3z@k99~GZ1Fb5Zgnw5>9Ct=zO`{{C&z$ile?O7W8r-Geb7Gz1b)Fxyv zu-=Yh1LV5LfCW>;W&NnlX3xLk!qWv1gKzh|$d!fkWhlMi$V@nTk35jPlPWHJPT|?| z9``gLub+|QczgWnJv5dBv%thEqszBcLs$O>4F)c>9C5$JTK@P$B~+4{CN}Rcl8)2a_G=;#|Rh z-F*TKg@#qb`gp4J1{CxLD3oNUF=lypxT&;j9_eN!2s|-rK}Ewf zIq$ntAEc9WBoKni_trZ_WpZiNl2ZobsZ}vMe+@j!zDihu01wiL;7yM0qIUNan#HK_ zfgbh`g?ygpr?d+Yy1hqAG*g~vKIuF~0v&4X^s@zh9(yb#^Bic-h`L5Yk(nZVzI&uA z?J|6t>Saq0Dd1r*O}dg9)EMIUXl~*a0ciX(+R>^`MNl0=sA%-e;_Um>iF3SMs-h-( zlVDRPk_FR(QveT91{f)>ehC>ASu|2Cg-0dSF6#jU;b7zi-;NU+Mp#MlvXW+WrD@}E zbXdgdtCpRA8zSVB1-x7h(QiwU`DOEMEbUjVK~JD!M4PO6RMQo1;-`zZHmmOtOxI{M zc;z2~dhp#$T^}1cr&xJJI{9MvJ0O_h3o2V1Ga(b3FHPHieBY1$jr}FEM-t+AFy$n+ z0KarO^`pV3AQXQI|QY7rq*mfXBXk*QRTBXR_tL{(^zBjzXy33Xf@$MR@lQ6L71-{whR7 zmMZi6H-Kp7k@6xU+1QxOrnpYecP8l?HV zeuT7Yf>$*!BqNLR-wBT7;9gK=>5m_j^eoDPm@^Ux#u_oq`-iiI;$NY&dmOrJbHBtc zftVeAuz9pJ@11mW#4jJ7#W=oWI`@7w?qU|lanvtdzIwvpHx3TeyFj5TXj<_5035c< zdS%KpuXdm}{j5Vdj&y=Qup6r@OY-~6VlqmZ@iKvguHr`5o}Y!k;!{*~G#Vuz#;dPx zwaFE}sabSu%?KK0!KWPs12fY5iw&b3x4F^29Cs`8B3~69Ig>m!mqhJM=`&TD33>q- zxf9-p#wlJcE;OT+?V2C&4H7}{BnJ*}WM{Cd+KN04ylpp!9ixV~r&(8l@hy@nBc0#~ zlp}^YDf7k=e@c6P(br*c*ByXluPaj;Ol#HU+5oeujo|wf|8Wejt2#E=--{e70zL z7*JKHimrZe)Fi06$tGg9p+(4WSD}Wr(6G}$fPXEr=O1RgRFG2%rWsv`ULCs^G=c8% z%}>j)`V*H$P3J%C;&7D3C_F|r_e^d7EJCJDw`knvZ(Hl0i>F>U>RJEJ`XTsl(o3uI z316JE8hvEK-^{p8=#-J9A4klBTpqL&^qpjPc3-0-Dr#VjlGaAaKZ`&)A9tTRNR=Y~ z9k<=6DIpEJ)Giq7_@M1*_2yt#>!VXopzT(laK$oJJp1Vqlj8k{wE@+xDsp#BVJyi7 zg7<&i?*Bpw%41#lK8jsHmQE<=!Pn=<g>CE%lgH*qk&(Gl zM61fS^OMVNq3!0Ng2m->PpgJ#`KHSdi&v+}>)~kg0!bNuhr6Bx5SXow z@~<|%&T(a9KN!`X`|+<*wjsdS!kyAu%amb92lnf6>Ibw-@nAVX-rg_;e*E5_!SLTz zdY*-Z$G$p6al&sBwl27GkP|sj>x;I2R%qeL-u+)S*P=JmI3d5j0X`UA?a|AkQ0Jp> znL6fXJC)78vut+QdAnPsx#$ParAfMWu}gS(hU_^f*}5)4N3|j>*F|7I6?NjC$mqOV z#{||wc$Qo#L8%piVg-IlW}SMf13dRWZ599X^`|-tvZvn+?Zml;nI7U-!LXw!J&{#O}7>ob&Ys5aiz- zKiwU}T-~GL`ZrbjLxt2moV|BZdI)EE2LcxhX09yI=pQ{TD|3mu9qmeY(d%GwcSX6+N}G z<@htb=-0@YtU{3>)qW~Sd)R3u%$sz)_kHq+3gun!L>P_Be4K|7dIRu{WWqcgy^oIQ zz@x%oqf9_RS>7OP`l@MAD3)p}s-~!`Zn2~s}=uEbrrHKwc%G{xK=AVX;iO{chQ_x&dl2kbRWe)S*okC z>=1-%tdU#8HfJOPk_m&Y+z)w7g~iVGiEn0wmr~n8Z0o{uXqe0xC^Ufso{^i`aa6*y zjwXqO7!Fv!^h@OG!tH80rvSB3PJm|a$pyqJa&q_m!(xzKjfUB9oR)iVU0Uw3`y2jf zXew@>eRRbB(CQ&1(|nQp^2x%h%dvi)r=D@sTwf}r$?<3gAcWmVamk%nn2v+s_m70} zk;1-a==+C~Siyfh?q%7vy-`oi$$zeQ$m9B(RyX0e1(ue>6T1FRmhR@RnimCas(F0*kbTQs`1GCxvTZOxn?xOB&A_ZXtOmBCS<;HUF3K6 zocGrv3Dp4U54~h4 zc9x2-215H*s{-&mJeNU_%}@bK(uuKmmCEI!ZaCL=u1F^AhO9P&eGik%d0S%V9rzIv zpX7(0s@rUDvp`Md$Sy4`@K=0)+{ExNE-h6m>CvAyIURB;bg`_HM0*=2_T4+`T8;m3 zAw3Y4RX!r7*Rp{p7o^;%`%N(_D2Tf3 zyRN4pZSR^4Y0U= zT)aEFhT@g*-*lK`;YHjvv_kgI?(@Wmg@MN|90Gd?5j|xd9f-mZ;h(tq5rV#|A?AC^ zu)cm(xDvT~G;P@+ewarsnXlu1@`>5BIy43u?eBqH01ae~oZ_h3?*oBKUCi=XggA9K zp%#@Nti3l41C&E#xgWCg_4`T)WU{QAq(_~f1Z6y9)KpCsvC%#eW!#6e(f`UEF8n2| zX;j9ASq5)AGS3&mhVU+D-aN9c>I5OMts1e!@<0sHl#ofeQS$mIk+ue20Vk{j6+S-z zL0_jbRPs$rYo*Knn!@0ve0RWSSM2BHBq=ZqJWl6C)s8DL=7bbxHu3;sCC&>dmC1l? z5YkXxbo>I`--KAD-AJRG-eVn$c#&}QRHfP`35oMoFdEajou~Mp!KiaH$K&L`G8Z$0 z8PLA!$5A*F=M##;k@tBy!la0w>t*6s$;mvildfmAa#!+Ka>c`-$=Ab_(SkHhw&$>!gAUQF_yb?yaH=WJfO-8*P#L8C! zvau-wdaXV=EBw@2m5xrl<7tHNvxc0>hk|8)%OfeDnYKW9&*kMhrVx}9JPQ8@Vp7{} zqE~=_7eIl-Qj#BYeg`M&*R3zUq$)jz%naz{Zu3yYy3`y^d91jPGW0Jn-=!2H|D>S% zn^_2QT-1oF8z*i@E<=213GLAPV8LEs>73i~eHTXl^~70rkxc$`IafR^ny*EZ^7B1e zKJgcO>lW(F?2tgO!%vYzhM(qV2lE63)Qo;W!OeIOnt(B!I_7MP?c#6rQYVp;0^X(1 zjWZ~E7XM>Xuk(S;9C&~-%Sm0yN%ky<*W!`N{tu7Zlkn+53m^W{zF8=z(u#0{%`^z60yy&;|A62=TUVpo+USqiKxYd;@ z0=LirvPk0XGx?Q+&11N3Q5C3elOG*3G*@=MSpw5TLo1DP$*)G#kNqu@^uuSx;Lxn{X9i`BJg(#9XKNY+U0jd^80Hb_lBKsniZ5f&LlwfB(l=4v2uV zZFQgsYLj_&HzROqh^eD4vY-e`vzY=k8Z0Nz02!uL|KFC{lG@UE_>7MM=v^PG!$Zld z&#aHq9gqs3H#;Korju$jbttTS3X$cY9k@F?_QxxN|JT?cK!RV_)=DrSZ-y)S>+j#h zr(jA=dng^`xF+bT5Ua0dHUCzK^wQxu6NOpvi_A1Z9Jty7>-a9S(j8? zZZm{tnwQ-2LdsJL3i9TwgE-Fc`4*E&9~LIzls<>FrC1vPl>=~{tLDRN97f`?4|v&a z7wGolHxP_8m>7nRGs^x0hE+fVBvnnI3KoO*az1za7TJs?q#ox?>3$M=B4J#2cy2x& z<$Wvnlk-YCjjutt0bd+`FN|geAxr)r5^QH2ay!Y6n5-sZ8cV{Ia60&&B@k_zH;5I} zk{}R#wjNB`{S8Q0Z8Q7BLMN0Ir?lPeXd71bWKW26m#7zIK5mA1qzOKPtX_ZOp#mCl zT4!f_!9~xV_{R$y;p$MqL<2P(q#Y=9cyI`7kEQii<#urs1}SSIUWTXdHLBW^7@!X; zFi`y^5A+?)Y_83(E!W`bQ5S?|V@%)`d)8bIr4P3+h|0Zh4=FxNH}eMi2cB;HOvMg( z>TLOQm;AyW%*)Z@lf%!it17TFjdi3XEcstsCUQbFZmLMFH?u!-TGu*9?e{ceB0Ign z;7|FdW3u;-q8{5XS9j_e8KzxCi${Q|I}KmCbU{b6J#<9Kv|g#v*~T+a#3>Cnyd1o#pj8wlK$4YM4L#^oNk9BbEt(7f!BGlG zG={^_HfKW<-&%f8>W%q_2-L?iNzPYNvj~+#y`lHIchG8vxspH|b}A_=kF($I3q66s zV@$+9x}o_rRp_vYLT!Xf)>Xe7Z3^jxm11*K;NV1{NVkF_jhzp$&w;)A{K&_^TLOCg z3SeopLrWm_nt1DQmR5ugjB*&-2S@eR0xGRS$?yM_Lxf5e7bo1t+<_0pBk$C}Tb1F? zIC52LC5lkTXUd1snEf5Yh{&HVjp|tbQkT|`hS=!;N*rt;g+8W*Bvp6-gm@yp1tR@y z$ndz;Cn@|7Tkr~*oOtmS$AdxaHD2mNGvpQ*k{JJ)F}XPCb?+jVvJc3a=>H$FO2o1W z7gJwD(f3QOWJ>ZU3C3HA{bkT6L#>qAc^$ia5l&^jA)E1R8!P9!^-u1h%*3gffrZ-O z!NEcXL_I;pYp8_6w4}pm#yFBXGnwi7@PhtW=^XfrOi=#6G7MC-Q^tUI2H0;Qz>hWe z*kn!N{&xRY+XBRn+bX=y4$wmC8A957rR+z3UOb$&gO(|n+vP{T4C7IWx(yG z+Kzth0S?rz7_z|iQ*H>(asOAVV~xgRZEW>uAAyL=nie5I1#>^YA-CuHc*Bu!M!6>O wB|?D3<>yEwrM5gEZ$D~oUfzzJn)pFji6X_9fR>;VTE+yB0V_&Wix~&~KXtd|ga7~l diff --git a/img/icon-med.png b/img/icon-med.png deleted file mode 100644 index 7f13caafc97515cae52524a537e36e36d0f8c6ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15744 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 diff --git a/img/icon-small.png b/img/icon-small.png deleted file mode 100644 index 196cd0d8cd02c129d3ca6f2d56634377a6bb54de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4534 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 Uk;I5!-T(jq07*qoM6N<$g2d~6WdHyG diff --git a/img/icon.odg b/img/icon.odg deleted file mode 100644 index 23d41ef6af9456629d3a34452ac80a5fdf613735..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3191 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 diff --git a/img/icon.svg b/img/icon.svg deleted file mode 100644 index 37572988..00000000 --- a/img/icon.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - Clipart by Nicu Buculei - book_01 - - - - hash - - education - - - - - Nicu Buculei - - - - - Nicu Buculei - - - - - Nicu Buculei - - - - image/svg+xml - - - en - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/inc/uninstall-plugin.php b/inc/uninstall-plugin.php deleted file mode 100644 index 2a146ed9..00000000 --- a/inc/uninstall-plugin.php +++ /dev/null @@ -1,30 +0,0 @@ -
-

Uninstall Code Snippets

- -

- -

Checking this box will remove all snippets and the table from the database when the plugin is deactivated.

-

Only use if permanently uninstalling the Code Snippets plugin.

-

You can come back here before deactivating the plugin and change your choice.

-
- - style="margin-right: 5px" /> - -
- -
\ No newline at end of file diff --git a/inc/edit-snippets.php b/includes/admin-edit.php similarity index 68% rename from inc/edit-snippets.php rename to includes/admin-edit.php index 9c80ffc7..12b0a38c 100644 --- a/inc/edit-snippets.php +++ b/includes/admin-edit.php @@ -1,23 +1,25 @@

Edit SnippetAdd New

Edit SnippetAdd NewAdd New Snippet - +


- get_row( "SELECT * FROM `$this->table_name` WHERE `id` = '$id';" ); ?> + get_row( "SELECT * FROM `$this->table` WHERE `id` = '$id';" ); ?>

Code

Enter or paste the snippet code without the <?php and ?> tags.
- +

- description ) ), 'description', array( 'textarea_name' => 'snippet_description', 'textarea_rows' => 10 ) ); ?> + description ) ), 'description', array( 'textarea_name' => 'snippet_description', 'textarea_rows' => 10 ) ); ?>

- Cancel + Cancel

\ No newline at end of file diff --git a/inc/manage-snippets.php b/includes/admin-manage.php similarity index 56% rename from inc/manage-snippets.php rename to includes/admin-manage.php index 0381f296..e86feb2e 100644 --- a/inc/manage-snippets.php +++ b/includes/admin-manage.php @@ -1,10 +1,13 @@ - +
-

Snippets Add New

- +

Snippets Add New

+

- get_results( 'select * from ' . $this->table_name ); ?> + get_results( 'select * from ' . $this->table ); ?>
@@ -21,7 +24,7 @@ - Name + Name Description @@ -33,16 +36,16 @@ else echo 'active'; ?>'> - - name);?> + + name );?>
active == 0 ) : ?> - Activate | + Activate | - Deactivate | + Deactivate | - Edit | - Delete + Edit | + Delete
description ) ); ?> @@ -51,16 +54,23 @@   - You do not appear to have any snippets available at this time. + You do not appear to have any snippets available at this time. Add New→ + + + + Name + Description + +
diff --git a/includes/edit_area/autocompletion.js b/includes/edit_area/autocompletion.js new file mode 100644 index 00000000..3f174b2f --- /dev/null +++ b/includes/edit_area/autocompletion.js @@ -0,0 +1,491 @@ +/** + * Autocompletion class + * + * An auto completion box appear while you're writing. It's possible to force it to appear with Ctrl+Space short cut + * + * Loaded as a plugin inside editArea (everything made here could have been made in the plugin directory) + * But is definitly linked to syntax selection (no need to do 2 different files for color and auto complete for each syntax language) + * and add a too important feature that many people would miss if included as a plugin + * + * - init param: autocompletion_start + * - Button name: "autocompletion" + */ + +var EditArea_autocompletion= { + + /** + * Get called once this file is loaded (editArea still not initialized) + * + * @return nothing + */ + init: function(){ + // alert("test init: "+ this._someInternalFunction(2, 3)); + + if(editArea.settings["autocompletion"]) + this.enabled= true; + else + this.enabled= false; + this.current_word = false; + this.shown = false; + this.selectIndex = -1; + this.forceDisplay = false; + this.isInMiddleWord = false; + this.autoSelectIfOneResult = false; + this.delayBeforeDisplay = 100; + this.checkDelayTimer = false; + this.curr_syntax_str = ''; + + this.file_syntax_datas = {}; + } + /** + * Returns the HTML code for a specific control string or false if this plugin doesn't have that control. + * A control can be a button, select list or any other HTML item to present in the EditArea user interface. + * Language variables such as {$lang_somekey} will also be replaced with contents from + * the language packs. + * + * @param {string} ctrl_name: the name of the control to add + * @return HTML code for a specific control or false. + * @type string or boolean + */ + /*,get_control_html: function(ctrl_name){ + switch( ctrl_name ){ + case 'autocompletion': + // Control id, button img, command + return parent.editAreaLoader.get_button_html('autocompletion_but', 'autocompletion.gif', 'toggle_autocompletion', false, this.baseURL); + break; + } + return false; + }*/ + /** + * Get called once EditArea is fully loaded and initialised + * + * @return nothing + */ + ,onload: function(){ + if(this.enabled) + { + var icon= document.getElementById("autocompletion"); + if(icon) + editArea.switchClassSticky(icon, 'editAreaButtonSelected', true); + } + + this.container = document.createElement('div'); + this.container.id = "auto_completion_area"; + editArea.container.insertBefore( this.container, editArea.container.firstChild ); + + // add event detection for hiding suggestion box + parent.editAreaLoader.add_event( document, "click", function(){ editArea.plugins['autocompletion']._hide();} ); + parent.editAreaLoader.add_event( editArea.textarea, "blur", function(){ editArea.plugins['autocompletion']._hide();} ); + + } + + /** + * Is called each time the user touch a keyboard key. + * + * @param (event) e: the keydown event + * @return true - pass to next handler in chain, false - stop chain execution + * @type boolean + */ + ,onkeydown: function(e){ + if(!this.enabled) + return true; + + if (EA_keys[e.keyCode]) + letter=EA_keys[e.keyCode]; + else + letter=String.fromCharCode(e.keyCode); + // shown + if( this._isShown() ) + { + // if escape, hide the box + if(letter=="Esc") + { + this._hide(); + return false; + } + // Enter + else if( letter=="Entrer") + { + var as = this.container.getElementsByTagName('A'); + // select a suggested entry + if( this.selectIndex >= 0 && this.selectIndex < as.length ) + { + as[ this.selectIndex ].onmousedown(); + return false + } + // simply add an enter in the code + else + { + this._hide(); + return true; + } + } + else if( letter=="Tab" || letter=="Down") + { + this._selectNext(); + return false; + } + else if( letter=="Up") + { + this._selectBefore(); + return false; + } + } + // hidden + else + { + + } + + // show current suggestion list and do autoSelect if possible (no matter it's shown or hidden) + if( letter=="Space" && CtrlPressed(e) ) + { + //parent.console.log('SHOW SUGGEST'); + this.forceDisplay = true; + this.autoSelectIfOneResult = true; + this._checkLetter(); + return false; + } + + // wait a short period for check that the cursor isn't moving + setTimeout("editArea.plugins['autocompletion']._checkDelayAndCursorBeforeDisplay();", editArea.check_line_selection_timer +5 ); + this.checkDelayTimer = false; + return true; + } + /** + * Executes a specific command, this function handles plugin commands. + * + * @param {string} cmd: the name of the command being executed + * @param {unknown} param: the parameter of the command + * @return true - pass to next handler in chain, false - stop chain execution + * @type boolean + */ + ,execCommand: function(cmd, param){ + switch( cmd ){ + case 'toggle_autocompletion': + var icon= document.getElementById("autocompletion"); + if(!this.enabled) + { + if(icon != null){ + editArea.restoreClass(icon); + editArea.switchClassSticky(icon, 'editAreaButtonSelected', true); + } + this.enabled= true; + } + else + { + this.enabled= false; + if(icon != null) + editArea.switchClassSticky(icon, 'editAreaButtonNormal', false); + } + return true; + } + return true; + } + ,_checkDelayAndCursorBeforeDisplay: function() + { + this.checkDelayTimer = setTimeout("if(editArea.textarea.selectionStart == "+ editArea.textarea.selectionStart +") EditArea_autocompletion._checkLetter();", this.delayBeforeDisplay - editArea.check_line_selection_timer - 5 ); + } + // hide the suggested box + ,_hide: function(){ + this.container.style.display="none"; + this.selectIndex = -1; + this.shown = false; + this.forceDisplay = false; + this.autoSelectIfOneResult = false; + } + // display the suggested box + ,_show: function(){ + if( !this._isShown() ) + { + this.container.style.display="block"; + this.selectIndex = -1; + this.shown = true; + } + } + // is the suggested box displayed? + ,_isShown: function(){ + return this.shown; + } + // setter and getter + ,_isInMiddleWord: function( new_value ){ + if( typeof( new_value ) == "undefined" ) + return this.isInMiddleWord; + else + this.isInMiddleWord = new_value; + } + // select the next element in the suggested box + ,_selectNext: function() + { + var as = this.container.getElementsByTagName('A'); + + // clean existing elements + for( var i=0; i= as.length || this.selectIndex < 0 ) ? 0 : this.selectIndex; + as[ this.selectIndex ].className += " focus"; + } + // select the previous element in the suggested box + ,_selectBefore: function() + { + var as = this.container.getElementsByTagName('A'); + + // clean existing elements + for( var i=0; i= as.length || this.selectIndex < 0 ) ? as.length-1 : this.selectIndex; + as[ this.selectIndex ].className += " focus"; + } + ,_select: function( content ) + { + cursor_forced_position = content.indexOf( '{@}' ); + content = content.replace(/{@}/g, '' ); + editArea.getIESelection(); + + // retrive the number of matching characters + var start_index = Math.max( 0, editArea.textarea.selectionEnd - content.length ); + + line_string = editArea.textarea.value.substring( start_index, editArea.textarea.selectionEnd + 1); + limit = line_string.length -1; + nbMatch = 0; + for( i =0; i 0 ) + parent.editAreaLoader.setSelectionRange(editArea.id, editArea.textarea.selectionStart - nbMatch , editArea.textarea.selectionEnd); + + parent.editAreaLoader.setSelectedText(editArea.id, content ); + range= parent.editAreaLoader.getSelectionRange(editArea.id); + + if( cursor_forced_position != -1 ) + new_pos = range["end"] - ( content.length-cursor_forced_position ); + else + new_pos = range["end"]; + parent.editAreaLoader.setSelectionRange(editArea.id, new_pos, new_pos); + this._hide(); + } + + + /** + * Parse the AUTO_COMPLETION part of syntax definition files + */ + ,_parseSyntaxAutoCompletionDatas: function(){ + //foreach syntax loaded + for(var lang in parent.editAreaLoader.load_syntax) + { + if(!parent.editAreaLoader.syntax[lang]['autocompletion']) // init the regexp if not already initialized + { + parent.editAreaLoader.syntax[lang]['autocompletion']= {}; + // the file has auto completion datas + if(parent.editAreaLoader.load_syntax[lang]['AUTO_COMPLETION']) + { + // parse them + for(var i in parent.editAreaLoader.load_syntax[lang]['AUTO_COMPLETION']) + { + datas = parent.editAreaLoader.load_syntax[lang]['AUTO_COMPLETION'][i]; + tmp = {}; + if(datas["CASE_SENSITIVE"]!="undefined" && datas["CASE_SENSITIVE"]==false) + tmp["modifiers"]="i"; + else + tmp["modifiers"]=""; + tmp["prefix_separator"]= datas["REGEXP"]["prefix_separator"]; + tmp["match_prefix_separator"]= new RegExp( datas["REGEXP"]["prefix_separator"] +"$", tmp["modifiers"]); + tmp["match_word"]= new RegExp("(?:"+ datas["REGEXP"]["before_word"] +")("+ datas["REGEXP"]["possible_words_letters"] +")$", tmp["modifiers"]); + tmp["match_next_letter"]= new RegExp("^("+ datas["REGEXP"]["letter_after_word_must_match"] +")$", tmp["modifiers"]); + tmp["keywords"]= {}; + //console.log( datas["KEYWORDS"] ); + for( var prefix in datas["KEYWORDS"] ) + { + tmp["keywords"][prefix]= { + prefix: prefix, + prefix_name: prefix, + prefix_reg: new RegExp("(?:"+ parent.editAreaLoader.get_escaped_regexp( prefix ) +")(?:"+ tmp["prefix_separator"] +")$", tmp["modifiers"] ), + datas: [] + }; + for( var j=0; j it's valid + if( !match_prefix_separator && this.curr_syntax[i]["keywords"][prefix]['prefix'].length == 0 ) + { + if( ! before.match( this.curr_syntax[i]["keywords"][prefix]['prefix_reg'] ) ) + hasMatch = true; + } + // we still need to check the prefix if there is one + else if( this.curr_syntax[i]["keywords"][prefix]['prefix'].length > 0 ) + { + if( before.match( this.curr_syntax[i]["keywords"][prefix]['prefix_reg'] ) ) + hasMatch = true; + } + + if( hasMatch ) + results[results.length]= [ this.curr_syntax[i]["keywords"][prefix], this.curr_syntax[i]["keywords"][prefix]['datas'][j] ]; + } + } + } + } + // it doesn't match any possible word but we want to display something + // we'll display to list of all available words + else if( this.forceDisplay || match_prefix_separator ) + { + for(var prefix in this.curr_syntax[i]["keywords"]) + { + for(var j=0; j it's valid + if( !match_prefix_separator && this.curr_syntax[i]["keywords"][prefix]['prefix'].length == 0 ) + { + hasMatch = true; + } + // we still need to check the prefix if there is one + else if( match_prefix_separator && this.curr_syntax[i]["keywords"][prefix]['prefix'].length > 0 ) + { + var before = last_chars; //.substr( 0, last_chars.length ); + if( before.match( this.curr_syntax[i]["keywords"][prefix]['prefix_reg'] ) ) + hasMatch = true; + } + + if( hasMatch ) + results[results.length]= [ this.curr_syntax[i]["keywords"][prefix], this.curr_syntax[i]["keywords"][prefix]['datas'][j] ]; + } + } + } + } + } + + // there is only one result, and we can select it automatically + if( results.length == 1 && this.autoSelectIfOneResult ) + { + // console.log( results ); + this._select( results[0][1]['replace_with'] ); + } + else if( results.length == 0 ) + { + this._hide(); + } + else + { + // build the suggestion box content + var lines=[]; + for(var i=0; i"+ results[i][1]['comment']; + if(results[i][0]['prefix_name'].length>0) + line+=''+ results[i][0]['prefix_name'] +''; + line+=''; + lines[lines.length]=line; + } + // sort results + this.container.innerHTML = '
    '+ lines.sort().join('') +'
'; + + var cursor = _$("cursor_pos"); + this.container.style.top = ( cursor.cursor_top + editArea.lineHeight ) +"px"; + this.container.style.left = ( cursor.cursor_left + 8 ) +"px"; + this._show(); + } + + this.autoSelectIfOneResult = false; + time=new Date; + t2= time.getTime(); + + //parent.console.log( begin_word +"\n"+ (t2-t1) +"\n"+ html ); + } + } +}; + +// Load as a plugin +editArea.settings['plugins'][ editArea.settings['plugins'].length ] = 'autocompletion'; +editArea.add_plugin('autocompletion', EditArea_autocompletion); \ No newline at end of file diff --git a/includes/edit_area/edit_area.css b/includes/edit_area/edit_area.css new file mode 100644 index 00000000..5022371b --- /dev/null +++ b/includes/edit_area/edit_area.css @@ -0,0 +1,530 @@ +body, html{ + margin: 0; + padding: 0; + height: 100%; + border: none; + overflow: hidden; + background-color: #FFF; +} + +body, html, table, form, textarea{ + font: 12px monospace, sans-serif; +} + +#editor{ + border: solid #888 1px; + overflow: hidden; +} + +#result{ + z-index: 4; + overflow-x: auto; + overflow-y: scroll; + border-top: solid #888 1px; + border-bottom: solid #888 1px; + position: relative; + clear: both; +} + +#result.empty{ + overflow: hidden; +} + +#container{ + overflow: hidden; + border: solid blue 0; + position: relative; + z-index: 10; + padding: 0 5px 0 45px; + /*padding-right: 5px;*/ +} + +#textarea{ + position: relative; + top: 0; + left: 0; + margin: 0; + padding: 0; + width: 100%; + height: 100%; + overflow: hidden; + z-index: 7; + border-width: 0; + background-color: transparent; + resize: none; +} + +#textarea, #textarea:hover{ + outline: none; /* safari outline fix */ +} + +#content_highlight{ + white-space: pre; + margin: 0; + padding: 0; + position : absolute; + z-index: 4; + overflow: visible; +} + + +#selection_field, #selection_field_text{ + margin: 0; + background-color: #E1F2F9; +/* height: 1px; */ + position: absolute; + z-index: 5; + top: -100px; + padding: 0; + white-space: pre; + overflow: hidden; +} + +#selection_field.show_colors { + z-index: 3; + background-color:#EDF9FC; + +} + +#selection_field strong{ + font-weight:normal; +} + +#selection_field.show_colors *, #selection_field_text * { + visibility: hidden; +} + +#selection_field_text{ + background-color:transparent; +} + +#selection_field_text strong{ + font-weight:normal; + background-color:#3399FE; + color: #FFF; + visibility:visible; +} + +#container.word_wrap #content_highlight, +#container.word_wrap #selection_field, +#container.word_wrap #selection_field_text, +#container.word_wrap #test_font_size{ + white-space: pre-wrap; /* css-3 */ + white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + word-wrap: break-word; /* Internet Explorer 5.5+ */ + width: 99%; +} + +#line_number{ + position: absolute; + overflow: hidden; + border-right: solid black 1px; + z-index:8; + width: 38px; + padding: 0 5px 0 0; + margin: 0 0 0 -45px; + text-align: right; + color: #AAAAAA; +} + +#test_font_size{ + padding: 0; + margin: 0; + visibility: hidden; + position: absolute; + white-space: pre; +} + +pre{ + margin: 0; + padding: 0; +} + +.hidden{ + opacity: 0.2; + filter:alpha(opacity=20); +} + +#result .edit_area_cursor{ + position: absolute; + z-index:6; + background-color: #FF6633; + top: -100px; + margin: 0; +} + +#result .edit_area_selection_field .overline{ + background-color: #996600; +} + + +/* area popup */ +.editarea_popup{ + border: solid 1px #888888; + background-color: #ECE9D8; + width: 250px; + padding: 4px; + position: absolute; + visibility: hidden; + z-index: 15; + top: -500px; +} + +.editarea_popup, .editarea_popup table{ + font-family: sans-serif; + font-size: 10pt; +} + +.editarea_popup img{ + border: 0; +} + +.editarea_popup .close_popup{ + float: right; + line-height: 16px; + border: 0; + padding: 0; +} + +.editarea_popup h1,.editarea_popup h2,.editarea_popup h3,.editarea_popup h4,.editarea_popup h5,.editarea_popup h6{ + margin: 0; + padding: 0; +} + +.editarea_popup .copyright{ + text-align: right; +} + +/* Area_search */ +div#area_search_replace{ + /*width: 250px;*/ +} + +div#area_search_replace img{ + border: 0; +} + +div#area_search_replace div.button{ + text-align: center; + line-height: 1.7em; +} + +div#area_search_replace .button a{ + cursor: pointer; + border: solid 1px #888888; + background-color: #DEDEDE; + text-decoration: none; + padding: 0 2px; + color: #000000; + white-space: nowrap; +} + +div#area_search_replace a:hover{ + /*border: solid 1px #888888;*/ + background-color: #EDEDED; +} + +div#area_search_replace #move_area_search_replace{ + cursor: move; + border: solid 1px #888; +} + +div#area_search_replace #close_area_search_replace{ + text-align: right; + vertical-align: top; + white-space: nowrap; +} + +div#area_search_replace #area_search_msg{ + height: 18px; + overflow: hidden; + border-top: solid 1px #888; + margin-top: 3px; +} + +/* area help */ +#edit_area_help{ + width: 350px; +} + +#edit_area_help div.close_popup{ + float: right; +} + +/* area_toolbar */ +.area_toolbar{ + /*font: 11px sans-serif;*/ + width: 100%; + /*height: 21px; */ + margin: 0; + padding: 0; + background-color: #ECE9D8; + text-align: center; +} + +.area_toolbar, .area_toolbar table{ + font: 11px sans-serif; +} + +.area_toolbar img{ + border: 0; + vertical-align: middle; +} + +.area_toolbar input{ + margin: 0; + padding: 0; +} + +.area_toolbar select{ + font-family: 'MS Sans Serif',sans-serif,Verdana,Arial; + font-size: 7pt; + font-weight: normal; + margin: 2px 0 0 0 ; + padding: 0; + vertical-align: top; + background-color: #F0F0EE; +} + +table.statusbar{ + width: 100%; +} + +.area_toolbar td.infos{ + text-align: center; + width: 130px; + border-right: solid 1px #888; + border-width: 0 1px 0 0; + padding: 0; +} + +.area_toolbar td.total{ + text-align: right; + width: 50px; + padding: 0; +} + +.area_toolbar td.resize{ + text-align: right; +} +/* +.area_toolbar span{ + line-height: 1px; + padding: 0; + margin: 0; +}*/ + +.area_toolbar span#resize_area{ + cursor: nw-resize; + visibility: hidden; +} + +/* toolbar buttons */ +.editAreaButtonNormal, .editAreaButtonOver, .editAreaButtonDown, .editAreaSeparator, .editAreaSeparatorLine, .editAreaButtonDisabled, .editAreaButtonSelected { + border: 0; margin: 0; padding: 0; background: transparent; + margin-top: 0; + margin-left: 1px; + padding: 0; +} + +.editAreaButtonNormal { + border: 1px solid #ECE9D8 !important; + cursor: pointer; +} + +.editAreaButtonOver { + border: 1px solid #0A246A !important; + cursor: pointer; + background-color: #B6BDD2; +} + +.editAreaButtonDown { + cursor: pointer; + border: 1px solid #0A246A !important; + background-color: #8592B5; +} + +.editAreaButtonSelected { + border: 1px solid #C0C0BB !important; + cursor: pointer; + background-color: #F4F2E8; +} + +.editAreaButtonDisabled { + filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); + -moz-opacity:0.3; + opacity: 0.3; + border: 1px solid #F0F0EE !important; + cursor: pointer; +} + +.editAreaSeparatorLine { + margin: 1px 2px; + background-color: #C0C0BB; + width: 2px; + height: 18px; +} + +/* waiting screen */ +#processing{ + display: none; + background-color:#ECE9D8; + border: solid #888 1px; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + z-index: 100; + text-align: center; +} + +#processing_text{ + position:absolute; + left: 50%; + top: 50%; + width: 200px; + height: 20px; + margin-left: -100px; + margin-top: -10px; + text-align: center; +} +/* end */ + + +/**** tab browsing area ****/ +#tab_browsing_area{ + display: none; + background-color: #CCC9A8; + border-top: 1px solid #888; + text-align: left; + margin: 0; +} + +#tab_browsing_list { + padding: 0; + margin: 0; + list-style-type: none; + white-space: nowrap; +} +#tab_browsing_list li { + float: left; + margin: -1px; +} +#tab_browsing_list a { + position: relative; + display: block; + text-decoration: none; + float: left; + cursor: pointer; + line-height:14px; +} + +#tab_browsing_list a span { + display: block; + color: #000; + background: #ECE9D8; + border: 1px solid #888; + border-width: 1px 1px 0; + text-align: center; + padding: 2px 2px 1px 4px; + position: relative; /*IE 6 hack */ +} + +#tab_browsing_list a b { + display: block; + border-bottom: 2px solid #617994; +} + +#tab_browsing_list a .edited { + display: none; +} + +#tab_browsing_list a.edited .edited { + display: inline; +} + +#tab_browsing_list a img{ + margin-left: 7px; +} + +#tab_browsing_list a.edited img{ + margin-left: 3px; +} + +#tab_browsing_list a:hover span { + background: #F4F2E8; + border-color: #0A246A; +} + +#tab_browsing_list .selected a span{ + background: #046380; + color: #FFF; +} + + +#no_file_selected{ + height: 100%; + width: 150%; /* Opera need more than 100% */ + background: #CCC; + display: none; + z-index: 20; + position: absolute; +} + + +/*** Non-editable mode ***/ +.non_editable #editor +{ + border-width: 0 1px; +} + +.non_editable .area_toolbar +{ + display: none; +} + +/*** Auto completion ***/ +#auto_completion_area +{ + background: #FFF; + border: solid 1px #888; + position: absolute; + z-index: 15; + width: 280px; + height: 180px; + overflow: auto; + display:none; +} + +#auto_completion_area a, #auto_completion_area a:visited +{ + display: block; + padding: 0 2px 1px; + color: #000; + text-decoration:none; +} + +#auto_completion_area a:hover, #auto_completion_area a:focus, #auto_completion_area a.focus +{ + background: #D6E1FE; + text-decoration:none; +} + +#auto_completion_area ul +{ + margin: 0; + padding: 0; + list-style: none inside; +} +#auto_completion_area li +{ + padding: 0; +} +#auto_completion_area .prefix +{ + font-style: italic; + padding: 0 3px; +} \ No newline at end of file diff --git a/includes/edit_area/edit_area.js b/includes/edit_area/edit_area.js new file mode 100644 index 00000000..f288a702 --- /dev/null +++ b/includes/edit_area/edit_area.js @@ -0,0 +1,527 @@ +/****** + * + * EditArea + * Developped by Christophe Dolivet + * Released under LGPL, Apache and BSD licenses (use the one you want) + * +******/ + + function EditArea(){ + var t=this; + t.error= false; // to know if load is interrrupt + + t.inlinePopup= [{popup_id: "area_search_replace", icon_id: "search"}, + {popup_id: "edit_area_help", icon_id: "help"}]; + t.plugins= {}; + + t.line_number=0; + + parent.editAreaLoader.set_browser_infos(t); // navigator identification + // fix IE8 detection as we run in IE7 emulate mode through X-UA tag + if( t.isIE >= 8 ) + t.isIE = 7; + + t.last_selection={}; + t.last_text_to_highlight=""; + t.last_hightlighted_text= ""; + t.syntax_list= []; + t.allready_used_syntax= {}; + t.check_line_selection_timer= 50; // the timer delay for modification and/or selection change detection + + t.textareaFocused= false; + t.highlight_selection_line= null; + t.previous= []; + t.next= []; + t.last_undo=""; + t.files= {}; + t.filesIdAssoc= {}; + t.curr_file= ''; + //t.loaded= false; + t.assocBracket={}; + t.revertAssocBracket= {}; + // bracket selection init + t.assocBracket["("]=")"; + t.assocBracket["{"]="}"; + t.assocBracket["["]="]"; + for(var index in t.assocBracket){ + t.revertAssocBracket[t.assocBracket[index]]=index; + } + t.is_editable= true; + + + /*t.textarea=""; + + t.state="declare"; + t.code = []; // store highlight syntax for languagues*/ + // font datas + t.lineHeight= 16; + /*t.default_font_family= "monospace"; + t.default_font_size= 10;*/ + t.tab_nb_char= 8; //nb of white spaces corresponding to a tabulation + if(t.isOpera) + t.tab_nb_char= 6; + + t.is_tabbing= false; + + t.fullscreen= {'isFull': false}; + + t.isResizing=false; // resize var + + // init with settings and ID (area_id is a global var defined by editAreaLoader on iframe creation + t.id= area_id; + t.settings= editAreas[t.id]["settings"]; + + if((""+t.settings['replace_tab_by_spaces']).match(/^[0-9]+$/)) + { + t.tab_nb_char= t.settings['replace_tab_by_spaces']; + t.tabulation=""; + for(var i=0; i0) + t.syntax_list= t.settings["syntax_selection_allow"].replace(/ /g,"").split(","); + + if(t.settings['syntax']) + t.allready_used_syntax[t.settings['syntax']]=true; + + + }; + EditArea.prototype.init= function(){ + var t=this, a, s=t.settings; + t.textarea = _$("textarea"); + t.container = _$("container"); + t.result = _$("result"); + t.content_highlight = _$("content_highlight"); + t.selection_field = _$("selection_field"); + t.selection_field_text= _$("selection_field_text"); + t.processing_screen = _$("processing"); + t.editor_area = _$("editor"); + t.tab_browsing_area = _$("tab_browsing_area"); + t.test_font_size = _$("test_font_size"); + a = t.textarea; + + if(!s['is_editable']) + t.set_editable(false); + + t.set_show_line_colors( s['show_line_colors'] ); + + if(syntax_selec= _$("syntax_selection")) + { + // set up syntax selection lsit in the toolbar + for(var i=0; i= '3' ) { + t.content_highlight.style.paddingLeft= "1px"; + t.selection_field.style.paddingLeft= "1px"; + t.selection_field_text.style.paddingLeft= "1px"; + } + + if(t.isIE && t.isIE < 8 ){ + a.style.marginTop= "-1px"; + } + /* + if(t.isOpera){ + t.editor_area.style.position= "absolute"; + }*/ + + if( t.isSafari ){ + t.editor_area.style.position = "absolute"; + a.style.marginLeft ="-3px"; + if( t.isSafari < 3.2 ) // Safari 3.0 (3.1?) + a.style.marginTop ="1px"; + } + + // si le textarea n'est pas grand, un click sous le textarea doit provoquer un focus sur le textarea + parent.editAreaLoader.add_event(t.result, "click", function(e){ if((e.target || e.srcElement)==editArea.result) { editArea.area_select(editArea.textarea.value.length, 0);} }); + + if(s['is_multi_files']!=false) + t.open_file({'id': t.curr_file, 'text': ''}); + + t.set_word_wrap( s['word_wrap'] ); + + setTimeout("editArea.focus();editArea.manage_size();editArea.execCommand('EA_load');", 10); + //start checkup routine + t.check_undo(); + t.check_line_selection(true); + t.scroll_to_view(); + + for(var i in t.plugins){ + if(typeof(t.plugins[i].onload)=="function") + t.plugins[i].onload(); + } + if(s['fullscreen']==true) + t.toggle_full_screen(true); + + parent.editAreaLoader.add_event(window, "resize", editArea.update_size); + parent.editAreaLoader.add_event(parent.window, "resize", editArea.update_size); + parent.editAreaLoader.add_event(top.window, "resize", editArea.update_size); + parent.editAreaLoader.add_event(window, "unload", function(){ + // in case where editAreaLoader have been already cleaned + if( parent.editAreaLoader ) + { + parent.editAreaLoader.remove_event(parent.window, "resize", editArea.update_size); + parent.editAreaLoader.remove_event(top.window, "resize", editArea.update_size); + } + if(editAreas[editArea.id] && editAreas[editArea.id]["displayed"]){ + editArea.execCommand("EA_unload"); + } + }); + + + /*date= new Date(); + alert(date.getTime()- parent.editAreaLoader.start_time);*/ + }; + + + + //called by the toggle_on + EditArea.prototype.update_size= function(){ + var d=document,pd=parent.document,height,width,popup,maxLeft,maxTop; + + if( typeof editAreas != 'undefined' && editAreas[editArea.id] && editAreas[editArea.id]["displayed"]==true){ + if(editArea.fullscreen['isFull']){ + pd.getElementById("frame_"+editArea.id).style.width = pd.getElementsByTagName("html")[0].clientWidth + "px"; + pd.getElementById("frame_"+editArea.id).style.height = pd.getElementsByTagName("html")[0].clientHeight + "px"; + } + + if(editArea.tab_browsing_area.style.display=='block' && ( !editArea.isIE || editArea.isIE >= 8 ) ) + { + editArea.tab_browsing_area.style.height = "0px"; + editArea.tab_browsing_area.style.height = (editArea.result.offsetTop - editArea.tab_browsing_area.offsetTop -1)+"px"; + } + + height = d.body.offsetHeight - editArea.get_all_toolbar_height() - 4; + editArea.result.style.height = height +"px"; + + width = d.body.offsetWidth -2; + editArea.result.style.width = width+"px"; + //alert("result h: "+ height+" w: "+width+"\ntoolbar h: "+this.get_all_toolbar_height()+"\nbody_h: "+document.body.offsetHeight); + + // check that the popups don't get out of the screen + for( i=0; i < editArea.inlinePopup.length; i++ ) + { + popup = _$(editArea.inlinePopup[i]["popup_id"]); + maxLeft = d.body.offsetWidth - popup.offsetWidth; + maxTop = d.body.offsetHeight - popup.offsetHeight; + if( popup.offsetTop > maxTop ) + popup.style.top = maxTop+"px"; + if( popup.offsetLeft > maxLeft ) + popup.style.left = maxLeft+"px"; + } + + editArea.manage_size( true ); + editArea.fixLinesHeight( editArea.textarea.value, 0,-1); + } + }; + + + EditArea.prototype.manage_size= function(onlyOneTime){ + if(!editAreas[this.id]) + return false; + + if(editAreas[this.id]["displayed"]==true && this.textareaFocused) + { + var area_height,resized= false; + + //1) Manage display width + //1.1) Calc the new width to use for display + if( !this.settings['word_wrap'] ) + { + var area_width= this.textarea.scrollWidth; + area_height= this.textarea.scrollHeight; + // bug on old opera versions + if(this.isOpera && this.isOpera < 9.6 ){ + area_width=10000; + } + //1.2) the width is not the same, we must resize elements + if(this.textarea.previous_scrollWidth!=area_width) + { + this.container.style.width= area_width+"px"; + this.textarea.style.width= area_width+"px"; + this.content_highlight.style.width= area_width+"px"; + this.textarea.previous_scrollWidth=area_width; + resized=true; + } + } + // manage wrap width + if( this.settings['word_wrap'] ) + { + newW=this.textarea.offsetWidth; + if( this.isFirefox || this.isIE ) + newW-=2; + if( this.isSafari ) + newW-=6; + this.content_highlight.style.width=this.selection_field_text.style.width=this.selection_field.style.width=this.test_font_size.style.width=newW+"px"; + } + + //2) Manage display height + //2.1) Calc the new height to use for display + if( this.isOpera || this.isFirefox || this.isSafari ) { + area_height= this.getLinePosTop( this.last_selection["nb_line"] + 1 ); + } else { + area_height = this.textarea.scrollHeight; + } + //2.2) the width is not the same, we must resize elements + if(this.textarea.previous_scrollHeight!=area_height) + { + this.container.style.height= (area_height+2)+"px"; + this.textarea.style.height= area_height+"px"; + this.content_highlight.style.height= area_height+"px"; + this.textarea.previous_scrollHeight= area_height; + resized=true; + } + + //3) if there is new lines, we add new line numbers in the line numeration area + if(this.last_selection["nb_line"] >= this.line_number) + { + var newLines= '', destDiv=_$("line_number"), start=this.line_number, end=this.last_selection["nb_line"]+100; + for( i = start+1; i < end; i++ ) + { + newLines+='
'+i+"
"; + this.line_number++; + } + destDiv.innerHTML= destDiv.innerHTML + newLines; + if(this.settings['word_wrap']){ + this.fixLinesHeight( this.textarea.value, start, -1 ); + } + } + + //4) be sure the text is well displayed + this.textarea.scrollTop="0px"; + this.textarea.scrollLeft="0px"; + if(resized==true){ + this.scroll_to_view(); + } + } + + if(!onlyOneTime) + setTimeout("editArea.manage_size();", 100); + }; + + EditArea.prototype.execCommand= function(cmd, param){ + + for(var i in this.plugins){ + if(typeof(this.plugins[i].execCommand)=="function"){ + if(!this.plugins[i].execCommand(cmd, param)) + return; + } + } + switch(cmd){ + case "save": + if(this.settings["save_callback"].length>0) + eval("parent."+this.settings["save_callback"]+"('"+ this.id +"', editArea.textarea.value);"); + break; + case "load": + if(this.settings["load_callback"].length>0) + eval("parent."+this.settings["load_callback"]+"('"+ this.id +"');"); + break; + case "onchange": + if(this.settings["change_callback"].length>0) + eval("parent."+this.settings["change_callback"]+"('"+ this.id +"');"); + break; + case "EA_load": + if(this.settings["EA_load_callback"].length>0) + eval("parent."+this.settings["EA_load_callback"]+"('"+ this.id +"');"); + break; + case "EA_unload": + if(this.settings["EA_unload_callback"].length>0) + eval("parent."+this.settings["EA_unload_callback"]+"('"+ this.id +"');"); + break; + case "toggle_on": + if(this.settings["EA_toggle_on_callback"].length>0) + eval("parent."+this.settings["EA_toggle_on_callback"]+"('"+ this.id +"');"); + break; + case "toggle_off": + if(this.settings["EA_toggle_off_callback"].length>0) + eval("parent."+this.settings["EA_toggle_off_callback"]+"('"+ this.id +"');"); + break; + case "re_sync": + if(!this.do_highlight) + break; + case "file_switch_on": + if(this.settings["EA_file_switch_on_callback"].length>0) + eval("parent."+this.settings["EA_file_switch_on_callback"]+"(param);"); + break; + case "file_switch_off": + if(this.settings["EA_file_switch_off_callback"].length>0) + eval("parent."+this.settings["EA_file_switch_off_callback"]+"(param);"); + break; + case "file_close": + if(this.settings["EA_file_close_callback"].length>0) + return eval("parent."+this.settings["EA_file_close_callback"]+"(param);"); + break; + + default: + if(typeof(eval("editArea."+cmd))=="function") + { + if(this.settings["debug"]) + eval("editArea."+ cmd +"(param);"); + else + try{eval("editArea."+ cmd +"(param);");}catch(e){}; + } + } + }; + + EditArea.prototype.get_translation= function(word, mode){ + if(mode=="template") + return parent.editAreaLoader.translate(word, this.settings["language"], mode); + else + return parent.editAreaLoader.get_word_translation(word, this.settings["language"]); + }; + + EditArea.prototype.add_plugin= function(plug_name, plug_obj){ + for(var i=0; i"); + } + }; + + EditArea.prototype.load_script= function(url){ + try{ + script = document.createElement("script"); + script.type = "text/javascript"; + script.src = url; + script.charset= "UTF-8"; + head = document.getElementsByTagName("head"); + head[0].appendChild(script); + }catch(e){ + document.write("\";\n", $sub_scripts); + + + // add the script and use a last compression + if( $this->param['compress'] ) + { + $last_comp = array( 'Ã' => 'this', + 'Â' => 'textarea', + 'Ã' => 'function', + 'Ä' => 'prototype', + 'Ã…' => 'settings', + 'Æ' => 'length', + 'Ç' => 'style', + 'È' => 'parent', + 'É' => 'last_selection', + 'Ê' => 'value', + 'Ë' => 'true', + 'ÃŒ' => 'false' + /*, + 'ÃŽ' => '"', + 'Ã' => "\n", + 'À' => "\r"*/); + } + else + { + $last_comp = array(); + } + + $js_replace= ''; + foreach( $last_comp as $key => $val ) + $js_replace .= ".replace(/". $key ."/g,'". str_replace( array("\n", "\r"), array('\n','\r'), $val ) ."')"; + + $this->datas.= sprintf("editAreaLoader.iframe_script= \"\"%s;\n", + str_replace( array_values($last_comp), array_keys($last_comp), $sub_scripts ), + $js_replace); + + if($this->load_all_plugins) + $this->datas.="editAreaLoader.all_plugins_loaded=true;\n"; + + + // load the template + $this->datas.= sprintf("editAreaLoader.template= \"%s\";\n", $this->get_html_content("template.html")); + // load the css + $this->datas.= sprintf("editAreaLoader.iframe_css= \"\";\n", $this->get_css_content("edit_area.css")); + + // $this->datas= "function editArea(){};editArea.prototype.loader= function(){alert('bouhbouh');} var a= new editArea();a.loader();"; + + } + + function send_datas() + { + if($this->param['debug']){ + $header=sprintf("/* USE PHP COMPRESSION\n"); + $header.=sprintf("javascript size: based files: %s => PHP COMPRESSION => %s ", $this->file_loaded_size, strlen($this->datas)); + if($this->use_gzip){ + $gzip_datas= gzencode($this->datas, 9, FORCE_GZIP); + $header.=sprintf("=> GZIP COMPRESSION => %s", strlen($gzip_datas)); + $ratio = round(100 - strlen($gzip_datas) / $this->file_loaded_size * 100.0); + }else{ + $ratio = round(100 - strlen($this->datas) / $this->file_loaded_size * 100.0); + } + $header.=sprintf(", reduced by %s%%\n", $ratio); + $header.=sprintf("compression time: %s\n", $this->get_microtime()-$this->start_time); + $header.=sprintf("%s\n", implode("\n", $this->infos)); + $header.=sprintf("*/\n"); + $this->datas= $header.$this->datas; + } + $mtime= time(); // ensure that the 2 disk files will have the same update time + // generate gzip file and cahce it if using disk cache + if($this->use_gzip){ + $this->gzip_datas= gzencode($this->datas, 9, FORCE_GZIP); + if($this->param['use_disk_cache']) + $this->file_put_contents($this->gzip_cache_file, $this->gzip_datas, $mtime); + } + + // generate full js file and cache it if using disk cache + if($this->param['use_disk_cache']) + $this->file_put_contents($this->full_cache_file, $this->datas, $mtime); + + // generate output + if($this->use_gzip) + echo $this->gzip_datas; + else + echo $this->datas; + +// die; + } + + + function get_content($end_uri) + { + $end_uri=preg_replace("/\.\./", "", $end_uri); // Remove any .. (security) + $file= $this->path.$end_uri; + if(file_exists($file)){ + $this->infos[]=sprintf("'%s' loaded", $end_uri); + /*$fd = fopen($file, 'rb'); + $content = fread($fd, filesize($file)); + fclose($fd); + return $content;*/ + return $this->file_get_contents($file); + }else{ + $this->infos[]=sprintf("'%s' not loaded", $end_uri); + return ""; + } + } + + function get_javascript_content($end_uri) + { + $val=$this->get_content($end_uri); + + $this->compress_javascript($val); + $this->prepare_string_for_quotes($val); + return $val; + } + + function compress_javascript(&$code) + { + if($this->param['compress']) + { + // remove all comments + // (\"(?:[^\"\\]*(?:\\\\)*(?:\\\"?)?)*(?:\"|$))|(\'(?:[^\'\\]*(?:\\\\)*(?:\\'?)?)*(?:\'|$))|(?:\/\/(?:.|\r|\t)*?(\n|$))|(?:\/\*(?:.|\n|\r|\t)*?(?:\*\/|$)) + $code= preg_replace("/(\"(?:[^\"\\\\]*(?:\\\\\\\\)*(?:\\\\\"?)?)*(?:\"|$))|(\'(?:[^\'\\\\]*(?:\\\\\\\\)*(?:\\\\\'?)?)*(?:\'|$))|(?:\/\/(?:.|\r|\t)*?(\n|$))|(?:\/\*(?:.|\n|\r|\t)*?(?:\*\/|$))/s", "$1$2$3", $code); + // remove line return, empty line and tabulation + $code= preg_replace('/(( |\t|\r)*\n( |\t)*)+/s', " ", $code); + // add line break before "else" otherwise navigators can't manage to parse the file + $code= preg_replace('/(\b(else)\b)/', "\n$1", $code); + // remove unnecessary spaces + $code= preg_replace('/( |\t|\r)*(;|\{|\}|=|==|\-|\+|,|\(|\)|\|\||&\&|\:)( |\t|\r)*/', "$2", $code); + } + } + + function get_css_content($end_uri){ + $code=$this->get_content($end_uri); + // remove comments + $code= preg_replace("/(?:\/\*(?:.|\n|\r|\t)*?(?:\*\/|$))/s", "", $code); + // remove spaces + $code= preg_replace('/(( |\t|\r)*\n( |\t)*)+/s', "", $code); + // remove spaces + $code= preg_replace('/( |\t|\r)?(\:|,|\{|\})( |\t|\r)+/', "$2", $code); + + $this->prepare_string_for_quotes($code); + return $code; + } + + function get_html_content($end_uri){ + $code=$this->get_content($end_uri); + //$code= preg_replace('/(\"(?:\\\"|[^\"])*(?:\"|$))|' . "(\'(?:\\\'|[^\'])*(?:\'|$))|(?:\/\/(?:.|\r|\t)*?(\n|$))|(?:\/\*(?:.|\n|\r|\t)*?(?:\*\/|$))/s", "$1$2$3", $code); + $code= preg_replace('/(( |\t|\r)*\n( |\t)*)+/s', " ", $code); + $this->prepare_string_for_quotes($code); + return $code; + } + + function prepare_string_for_quotes(&$str){ + // prepare the code to be putted into quotes + /*$pattern= array("/(\\\\)?\"/", '/\\\n/' , '/\\\r/' , "/(\r?\n)/"); + $replace= array('$1$1\\"', '\\\\\\n', '\\\\\\r' , '\\\n"$1+"');*/ + $pattern= array("/(\\\\)?\"/", '/\\\n/' , '/\\\r/' , "/(\r?\n)/"); + if($this->param['compress']) + $replace= array('$1$1\\"', '\\\\\\n', '\\\\\\r' , '\n'); + else + $replace= array('$1$1\\"', '\\\\\\n', '\\\\\\r' , "\\n\"\n+\""); + $str= preg_replace($pattern, $replace, $str); + } + + function replace_scripts($var, $param1, $param2) + { + $this->$var=stripslashes($param2); + return $param1."[];"; + } + + /* for php version that have not thoses functions */ + function file_get_contents($file) + { + $fd = fopen($file, 'rb'); + $content = fread($fd, filesize($file)); + fclose($fd); + $this->file_loaded_size+= strlen($content); + return $content; + } + + function file_put_contents($file, &$content, $mtime=-1) + { + if($mtime==-1) + $mtime=time(); + $fp = @fopen($file, "wb"); + if ($fp) { + fwrite($fp, $content); + fclose($fp); + touch($file, $mtime); + return true; + } + return false; + } + + function get_microtime() + { + list($usec, $sec) = explode(" ", microtime()); + return ((float)$usec + (float)$sec); + } + } +?> diff --git a/includes/edit_area/edit_area_full.gz b/includes/edit_area/edit_area_full.gz new file mode 100644 index 0000000000000000000000000000000000000000..29bcc50eb6986d64b9ec3d663bc953533cc5a615 GIT binary patch literal 29377 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 qWNr)Z`Jn&XUxIzf?#IuR?rs zV>EpKmnCJ=g?g!-bsbw`Z%ijY7B`?`R#gT+@KuqN7yMQTklrhiaIQQw_6mAdIZazo zjHuimAhyfVS*fsvqGTu2nF1A2ASAjd4BB^h4cXUA@@{}0q)n)d4zh(91mR4A{0H-n zg*k;xCtuaeDYR=SG!&Yl*xzt7XrT?gNnvON2{9abN*Jlfas|XS6ssmpiWXG%OdsIe zU}m!Dn!YFO3R>%mi4?1ZD*Zywou!gi-CuUt;@Ls0uF-FO~|7dx3Rmeuj1Pr3tZ-NSP0OuebDaN@Q3+XJ}Z3eD4v}XH^GHKib%iy|zWug40#B{EpObfd}aEDBuDZ z9lq(>bipsfaI)h1@-6%{!>b~D{sD9!U>JJybisNWDSwwxpyc>4(J?K3{C)=|bzpZk zigt|sZbCMXXeWvma$?X!5BPj9)~G&E88n=@LH6ydi$3rZW?_ELZ#;5>IXk0+eX{dJ zaSC0>xZ~0cfE)Bq++Yxd%ij4>t#s{<_TpdL-JgWX~7weX;t64-2*g(L}8nz4~9Yo;1Hc`@u2dfb1 z4cdKb?H;g>5~Rl6q+l7Hy%npj$QxpT3#3qq49F$-Sq$BYd!MJeS&hquMJ680k$L65<8pMHRu!cCvLaOtn6nz8tj0-KUgMpQit$oQXwoNzY#~L5Q4&Q5 zEDtv?CIzl~>@tZH{Qd87g2zg?l7S~VJuvat*C9*UwS@~boB2uduyiDYH@1Pmf3lZe zU4(go>JuxY@SN85S-E-~5IuQOR{xgwWR1$V`tTpkVXjD;*oQ`YYnd(p3&-!ZeNQv2 zhLB^!^(_YoYMRR{3?XO$r;5Hm@sVhVz~~Gu2xoG;q?=HP@9yXeG;@SU|9%M|6irV4 z@}7=BZjd-1E{+ld(0&7{1{O8u+!2KO~{(y7E6gf+C+jS3=)mw zITdt)#84JR$p}XA+wv{jR1HY9u&~#YT?1Zv&qBk|?~C<--IKO>Rlu9*xDLoB@#WZ2 z`4*o^6wT2CLWA}m{vEV;Hz9YAX<)R9PMiW$!^Y*MbY(MX!vupgM+S=l{F{g#z;f7R zBHmT?je#*jjmiuT=|qD;Iu=eH{}BiZR%QrucPnG>Uuc)o*9xVfcjBsm0Ubp!N84!i z`_N`Yr{adgsLHTt3b7xCGuo4H*Qu9Ybri`#yUO1JKkO*_bBYRgsLqloRv@(e*9}nm znm~aeIuYlWBlw6Cxnv@Ftay!sHY?#~%j5*HTFWk|*K(ji8S~z5RM>!4Yt{!|rD3s? zwc8bmD>fW}Ua@7l+i}|Fv;*icbCqqT|zZDL!-!K8y+n z6ZWt$!=5%F;}s3!A!3s4Xn`#%1$hURqJXspwQNQm!np8GGr~@b*X!?rG;W@gpA;`X z&XE-^K)A5F@7h|2SaNS7Z0_>eS1zaouXsZgE#6d_MAa@Gd{?%qBE4p!;fdEX#2A0^ zqw4f)dh*6SF_x8yHIPSI*~9%@^ta1YwY2Wb1|qkY&P`xm2K83*qDZY-FIoRI_p(hSrtbAAJVhECM6Y;1BoX5*xLmN;8HGRQxm5k&P^nxoTJJ6 zzg0rtVFO3_UF(Pj{ACu!a4a z<{-Ahv+mYa>cwOfXAX<>zcE?p*n$niysMDs7^aoR^mGaxPGEWRS{zdD)l5b-My;|+ z$nBCI1gbg49-AVPl6qNhW%V}v{}BE@%4*&b*0{aH&VNf`qL4<|8;(}pXm~=^!#y2c zU-uM}Td`qp$ql*aCY!96TdoWjK60g?z6nEtaaPNorg%(BBtQTn4Mv7Jc#9`&bO&5* zieMW{$1P;~h>ktinJC)vp_s6C!L;6Pq?_C>>!3!sH($%R8Yi91A{u;h5`d+|yE~bt z@L*6`-b|)iK?Io8sU0j@S9G?9# zv1~WS$wLpLHigYu0*59`n23{zs2XPBwFcY5GIQCzwzehqG~3=NY(3`GVygqqeLPep zPr?v)CnJ=ysarcKG_k`g(W?S+;_>ezYvKZJ8BX zYQigxZ}8P{IxXfQz0BWe+&l6ypTz>SjAbjNjobSA16DWECB>4zfnjawDN;++fk4W# zEj|Q;)m$L0+tDdm=E8*R#=Z)WNCd_z=$@Ano4olUHL`tLC~HmB4044*I)_^Va>xKS zQo|YtP&Pa&kkO!atOb--nqhor!a_*!mW+-b7SQZ3I~~G~Y)k>IQFC@FLA*>%fc$1% zRnd)0P0735Vt@df+im?_@Gz*2BUpGu5pF%v1wp%{b(-BaC!^sB0}^}w#SAAqXw%0S z-NE>>!PUH)iVi;zSj#buNg6^y1AZ)h6qm2kQ;wXwT1OS^!fIi~LJz_Q*9EZ?c|CnX z4ZIZYdQOXBMJKFEBq82TOm2#o@NKZ6hIt(a&!7mDCm6o&ykxWIOi_1R+vF>U9$mj* za=*^738Sz>Mg6(#U zuD-ulu9ot^`EMD`LUpT5onuO3(3{$H65BC~_n&tlDN%S>hVmPy8J$@*rRm@B+Z;dDVTo}6X@mPMm-F0Te1XVzF+S-j^# zW#M&xlKEW;?U^`stGP##6#$VX$P--4Oc1|n7?BRw1!K()v_6o*7pQ(SV~Fbck5P%B zfL6*f&eG{9qB;EuT`D|d2HX4;e}adWV&`Ot36d9+@^k^ z-ziXKS9+_!E}wd@jks?WzyfA{IVJ3e2b3bB7nER3d2j5;y&aP!Ls zW`_=%A0}9W#X)eD!ES}rRR@*S*IYA8jWrJI@1LO6^sJ7Qw5S@SMb2~K-p2!c5n;X` zkXzKqH|`x3>+OKX(qU>s*^hiPApb|a8IXVAn*n*_n*sU5-V88L3atY#K6|aGuZgga z$)iHtWugDUVO`9!?S4Nwoz+>Nwpp%7=8vgtWF@h$x9X82n#>ewD(bvB+(=N^`n z9P2azbkNXYo`Wieh;wFi7ZWp0iKfo)W&QPaS)M-bAp`;TXh0fCVq_Ct zdQ2Bp`e9`HzIcaIQP2qzobjwcFBE!RKquCUmi`2I^T< zwK32IRCgL7x<)-cV`Q38U;+q0hsykVuL4cXI$~lc(N^XRVYr~cHkOPikZIsV(M*^X zxdPdJmx20DgH3gamT7O>U`DS%LBkh@Ei1QyJ*XTUAyIAq46;zg8o5<#7HIobt5<=Q z?8Ez1mA$CR11T9TNV+duiD)klS(fy9XwbSO4?qJJCJvue5jQycfxQPMNPKv(GG26( zX@!2yO;kn)8GY$B!iFGM`Jfrtwd_q@7mS*Anzf7IERi@UKtp~wr^HQo1Wf{{nL@oG z>M&+hHkhr<5cTD3Ib~hTjWHYsVW1j|t!yI1+Tx~A>WYfGq6aP+71ctfJ!~RTRRN8= zdSGL|bH;_y%Hvgp28y8Ks0S#ZGm2`AvsrQW>e^9V-z6)=mb#FjkFacjg^tRE#{W4ZGGmSb zL6^K-5PG5b;}iq&b`E-bjGcpoz>0S7N{UsU6z8RgO4+n1>IP+n+M}j()Ed;spT!%W zZJuAM5L(iBbZGQ6jGAvqhtV-`k{o__=O)hWL@7}9ATA!_Qe@OFJeF`t*QsjtasXYZ zCiTkfv{9fN03%@-I&14%y~UF^XJK|ZGSj>nV#dtiOZkG5;W=!3CE(Oy$Al9Z%v1BS zJYaTDKZJk9{4yU8`8_=LuWD+q{|E|2Bu6&{ozwR;A<7-&qvt)uB3+IS!s&^+)a1s}IJJAqiPB=pL4 z!Z;=Ow95k61Y$L^whw zXdggf(#K!;ocCFI{gR_#CG~X1#}kMw8cz8sX3uLm#TqldZ;@)pVsaD3JKvEFKBN<_ z2z@*aYz?agcO`zH!z=lM3O`oaFey+~{S=yLYVV_4W9RUdmnwS5`XA}<>QtyaT*a8- zxL9-mU0jZ9CSdf*RH}zRo8g_GXA?SgyDtcv;V_Ke>Kyo&wjRV?pMTM{o1(BOowc(1 zKL5U>+l<%O6>_b;R=@RiOK0x%slwNx`vZC=#9dW`F)r)tVw|zo^>rT^(muHMZf2c_ zk>E6^(i*w*AZ%6(U%|a3H!=SX_D)&*?t;8_Pd*I$7ZTy*?AO}PcS8IW$x3L_N zU*a3xiMF_o`RGX;1=7}Afq8rLvyK2)i##3PNn`t#p}Du@e~44MfwteAp3&g9lt7PZ2z=2wEp7WPd&&+4L%!VGhr z*eaN3WdO@nHp6$JHE&lCI4y26_~Dj3WZ;uLdT%5qS!b>TeW2pNcl*901jxd*^DDTeCKt9j-3 zq8t@Ln%&<6j`zE~p}$*U65js>>wf#CsJ>yNK(@8R4QgwcEs;dB*7OX66b1xyU7eZC6P3}7m+vt zy~y~?=&!HyU-Ck4$CVd-I^$pDGzUFhU&nv(c~&PNbw;Y18A6;xBb$o}UTV^nN9bL7 zIh{=D5fo+yMJ*0PMhk=ayaXHhRj5e`ZN}!%iTok~$F~0)DEQ%wEOWaO2O-s?4Ki+@ z5t&*GcE0E*`WDMh#Ftp21UvJTsJ`P5G36dY-*;R}pqP>t4VJJw=36~N ziX~#xw-fcFgd;m)R;nEX&hu>RGyuQ3vMKfXoM-O1BxJ| zA_#+{R@pj6A%I6GL^d~Z!KtPTDkZ>_-LGLiKe?)lPDJe{lyAKQV+#{#vpJWljZ;F* zczlC#`db#|zboeT%~d&_{k9sNonO59aeNsyg3BM>=-u_{+mp#}W}m(Pe?MK@Ns|N% zot+5?<92(G>N3M^0ymNhnV(c0EEDf#+wrY8n%z{9`6qmaN%xOqB{%in%oV*SUPlX} z@MPk8*Vic>H`E|B!@D`DzH62w(bM($(gH>P%o_MJ^|o$(ekDx5D&=ps^cf;aVjXk1j*H<*Su)6uuKTw-5C$Bk)WF8 zb66|!(2rgKNha6OffM+~_sihd7!7~n1NJ0vxX#sCOq0hlwVYHiJH7#-IWIc7XbQQ_ zzlVh8Tyav2nwk+7#fYfQ3HR(TL~uR*c9HgoS1%cPOATIG5{n)zcf5zqfe4PQim2xVr*rq+CNEG`!&@G9ju&V- z%QSve9n5!ZDpX9o{73OO@HFBSH(p2*?_n0qavx+l6e}k`$fDklQE`)10PXy$o?=*V znITs>>td_94fKLO@3#D?&m#7;8N#)>g5FkNg>((!AyA|Uo}4eAZkWhe${41D>~%b3 z<`$;4x$VcWhD7zs51Rk1V$#&J9SCQQ1?}L|vT3gef#@Y3_OvLd5)Idi)s!N3Zszy~ zuKq8_yWi948F233L!8@iVc4RPJLNNeY-1%#D7j(DjC+Wq%ra79T03uix>M~PJ+amC zpZ(P3k%8pQF#}eC7DEOa=Y*RrM8*|gKQg^>*&y&h9bcKjBW~|CF$7OAK-62_Dd8yc zt2T&$XvBEthBN}MQMBB5cu_Q@NH6y3nMkMCIZX9o5jL)#Pw|p9J74^a zNK|>^0XD#rU7Gibc;38dyff`+8^PD3$cl_7D^ki?VbO%kBVCOI7{v-QA)| z+ZSn7ystAB+_K(CKy9b8;yn=8f$-;v^*iV~AMc5J-g_*Yo<+3B8vDztbLhZi#25^l$8uox8H-I6x+M+ zvaGlV4m#F}P|vR&`y|Vvan!Clvp>5M(sUrTK|pxf7~8gYUY&|M2;q>2PS&08t^)3U(QhDH$^+tA8Yf&TN(R>;pL~EdXE)mlue&tZh}rjK@yd@WdhB&b8#-BYd(cpg+9KGMr834H5ysCm zRVBZdLr&U z(kSyjpXWOdtt65?n=sFy9ey^^&d)PxCvr{N=_ElrA7&ZtR+uOcrkzD8bh~=+(Afgd z7U0&1z(m#U&=YS&;x&BWQW2FNd!unWI>zU^J_?s*D(0%(s1-Y11sM|ftSF%kFh{gU zRS@;1TI@IR`-whX(ZS;lK*wi>&&r@)wF42~8`REoD46Nesnr6%KxCI+U+)+&cXw-E zb+K+@Iv!E?@MJc#05K)?QZn6la}v_dd4DoGypLe&(9py;fT6b`7a;Cj2{qv%=He4X zB1DleYCcgyWz!&uu`TO>`-vK3gI*?Ad8o!q*(1QZ%>DnDGH{SHgQO2}uGqQF@^dm4 z(0d$}cr&z|XZ%gNBp&1^r0)#rLKGmcaw%C}*H~^nk)~%*n6rKYViE6%=fdTbo%Aqb z4EbP_A3vL9>gge2x_>#nlE?LGi)d}TdXM@>sI=Fj98^fBo8*9sJrkjp@S=nTM>d+% zq8xYZCjA&Se4-bOftZ#(Y)z<;UUtuJ6QFxR7sN8g1L?D~t{E@E_soP{sfXNRVYkuC zup%$~pdEcm(FD7uMj{ozc3YO;;C;O^tXrZ2@g5rvy)<))9BJ&*oM4&Csw4Z8wh59| zVl12lqQ>H8olF4+%f`TP4e`5r0=1q(!dGq>cLk78%ssSt;M+_y!@wgFrTHQKAcA)N zD9OF8{}NQTF6kTH^MbD>9!+6=`?K~}4UoJsJX}xQq&o9UwRT(0$%a$ zFj7#Y%V(KCDI{Z~+swVS<2>m8BPOVK6?FAk87F2q%zLF_-<$>Jr24RNc6d!6m;4tT z-KHhxA2-Un&feDQBhGjQq;Mjx>-(Z~uhkR))1BTAW1J<9`+h`e{Kq(Hrh7sB5UM!u z7SAVf8Xn7Y%wT-vJ$3WA_%#AR(XU&@2CBoq+M#!sHm-v)7Rgc_uIR?8=+~m6o5o;` zY$xFR7HlDq=VAQFx^tJpYt{>C%9Xe={hEr&fXe$`$N*8qq%WP-8>jr@5lOmms$IqF zso|qM%ijMr$+H^$lrQSbadI}tjh8e4C2Sf>V6T$k8JMx6qFPm-L>;Da4?Ejq-Ey6|U zbuhpSA%=r?x86XX7NpJ;FDb5N&|wUFVRj9YhSGlsIyj@F_fy#R&F0e?I*N8^1O{yh zgnjj^;M1q26);G+IGxTcElm*N!fIYX1qf|SlqO)DjW#sRPamA!mcy7aR}R|0>roT} z<2oPtGsd@6z3D)<)$jidU&|Bed^r)}9u)bZ`&}^#^#x5LKGlJ$ATzDXho$t1`2DqUo`=Vn20X%xD?a z4Eh##G7IfoZD=Y&iVHx_SmJN$y}HRI61+KdRTXF*qf3&8LZs(iL+wiDD+LTa)gMwn z9|aiFC!@cv!+CWxsq<^33#!=sm6Vmd$wylxox{7NKOIH<8ELIvm!=y&JW#_(u8>}5GxXr={^JQGNM2U%qsTAF&QlA`s$^5pr za{3HLdM3lh0LS3PWPBss4UOW|Gr=Ow6-}lSRU%O7PhO=Qv23{ukawNM*~h6E?#ko3 zk}sfRYVZY8i-J}K);5rLfJ^Uee#JiCcKz6~y6G@m!QFc>ZpU>)%&-`{$%+v5&NHrJ zD7snH(&*SghDO3e6pT`1faHOVf}x^_yHdNYpHpm33EHu4ruV*xjayqEKp0!^m7Hjh zgYGkisgZ?~b#MXI@aB0EMe&CXozhi)Qr8Ql$I8&SiI_!E8q5_J-5@*XE1Ifv6iCv) zqN(y@>yd%m=3uW$L!j4HuD5;ArM2MEgL7-mojUb2{kXeqbY%nmXXujtpLm&vM#@oi z?3{v&`vxGlMZP-grSi9nRQ~4dtQ;9Bby<%KFOi<3!Y(?njliWM#kv- z8Dlo0SUJkATzEt`CKKInwPs8&S;4BTUf>4;0pdCpC32O>LFfJo;|G6Ax4Q=y% z0KBG#F|*3c^Hw!K%?1Oy)$Q#7%FFz`s5S|HQDN9FSY{P2g*ZpJiL+>rI|qxo@NMJPQcwGxgdxkCHhbc(Ldb#f_+on^5s)zQ=c1B8w|=M;gUeWCe;tcRy3o zV$saR#WPAw)D7=FNl20kKUtd-VY>3SD4N4K{HEM>>-tG!&)+J6 zBOTj)IziMS|em_24XE%6{-trW}$^oe3gw+dw>lH^qQo9ckpWI!p6sSYYk3~B8U z0=kkQ+X{M;;BmGh$;;Ll!M*9^GnXMH*mNYyo8}{tgqEOlYomr!;&4`+mS^Q@6lYm< zQ&drWt0oohFkoI~b_G5X5dcMW_Nt147A8GwaSL*Ju03r%Agsd#B3EYv$aJ|CaF$oJ zL);@l+v6hxZ&cD$l^}7H2w9!bT)?HasK%zZNPG~*tsY30z&;q2VK1x%n0$+cA={{r z>P1of9Wcuo3bcqhjq3ILzg31A64wlsYOPr%YvYhXL7SYQ)?w)_Tot4iPlDVO<65u_ zt7TFqZ{)fcMQFJ(&2;sB>alr=c*5(_P#QrS@7^j|WSR_%%UONH7Ns>w=LnYT+gfkr zJGbR%CyEx%v7T_aFqR|ei`v~s*1HHYj%5f1vT>>IuhpiBa>XtRdep0KD=@T_x_Ltu z;M%+$ClaJGg1a9Y(Ja(JSYpt=#Fko~%n~f0nTxlnGAS5CJ(nbiq_z?QiqeHLqL_+7 z&R4aZjcBa{2Q_S_li+^bJ%e6i1V|c90KFxpumMm%^K+p|@vwL=PK50hX<+Hi8Y~#8 zR#38#K__KJC3B5BX>DC|3s`s3RT$0Gv{mE-Gty#{nWwQZt20(fb!OLCCKL|BuENv7 z{K_nYzE#??|4S_(U}I6sn~t+5pjo$v^%|r0$M-DN0BkPG#u{%e-Kn)I`%t_lr|z0; z0ov=gwfF}6rxri6hawS{0=Y(rZi=r|KOUtZP@ud~0!1E(z2W0Ba~+MXsu03HGP7?$ z$*m5>5JkBQ-*{@701BrCu<{wqtP5(@%wDs0aCdhOw6)E&_IhH&sS?(3Neu2l1%7zg zptqrBQQm%;YqfeYXF>Ayq$|_L)k*VeHZZz_6B|j~#ID{c2~>epS@dD~w1sFN--Y(T^eVwR%4heNDC@<-2lR7FV4ah=|tY>av)Z zzr89j@Wa+4$UT_Ua}2edY<&q|hkP9~+4?zrJgMgxl57jx+8+P~$)iV9=)7o=lhUKln1_35wXesf3eN~K&>@6CE zr(5(BL7#5ZPek|WBl?MWKK-12B9>3Tpr6?Nr(e=f?ETZ9(@*UF)30c3vGY$K)6Xqx zqEElMIcjg4+S{TAi9R%3-(Ou)0yeu3ovB+WgJGx_>H9ynfWMHU9T`0)zAZBHI7=7S zuDRIXn2oPss8}Bp+d!R4f#@bs8xAu$ zZDHeVKD~T$koprUab0<3dWSYMnba+z!!w?d4{9!2Z zdz;EViCDrvl>6+G8!2f6A!uJWp$1Sn(ivX zaX{1=?yM72R_t75ki<;fZ=k1AMHo=SPD;s=($?F={!uPR9k1jYzZe6OURah1@Bb|5 zE}o@cnZMRN{xaBAIkNLDblCtsA9+6sgVC4;FhAlW4w0-@aHtR|jc~(!IUg3+GYZLr z;Z=H^UG2}tKc~ynB}~> zl+7QoD3RKHIir_P6)yYHgf>3GNpqhK)~!qm`B*j7OeBsed$ zjHK>k6DS;I)oKAUtBF&7^h_xasw<#YN&LH^2W9z+5C(FRVnDndjOvG0!S2NXtLUP2 z>i*WmDyhh-iS@s2i8QuejwpK|0-DaN;4nSK6SHDMr{qNJQRsrP9o)y=n8=&O3-zk6 zYwtm+C(`ucBDru%HxWKu?XRyZFt)umM+7#FNy{%$E{iIRM|G>$WM9X0o+imM-9-%; zidioAUFHicPOu&cg7@|OsN`v=br_1fJDYs$h=3h1ZX3tOX<;$(GDG`N=Ot~0d+0T7 zfpz#rZSBcuw~GuSTqe*3FYMR&;^Ym+TN=`-C8f}>wD!(5oz1rgz=F_&3f_YaheZ(h zWT8T*-RJdSroN$b0f6KmGB1j-v7jo=anhK9pkb|Jo2X=U(|> z-qfxCQNqD?@?UxZy!mON+`216jCbjs z39P1TF#g0U^G^po(cHF-MPU(anW0Qp;W>4)J#JvWPoC0$AIf}g0H+UTKQlJYDnlE% zt-?On-or-s4ga!fvpR1tpFTga`>Y))1Hr;!G9))%=5K6PBqd%12QN;p&dEuUWN=c? zOL0&p1e7X1_bwqNdO!y^4HT}C=^4RjAS%D zB*o|jw)_6?@coPWaxA|9=Nne7bJ2wFyrE9nX-T$u3*`-8U_Tn_b%rVb`f zwZKG@L|M(2bPgp$$wE=B@F_>EALF@dYXOJgS6Tz4Q7H>YjZQDhEM z6q!a20~>4KhA$dbf*@pK4ooIZe0RDBfO%&w?)#DaR@T?k3t1pF1iQtHUk}>&=Mokg zUW0Z9?eC{(Z8FkGNuXr_-wZ#!z%CHWKzfH$6c<5K3`tM`pBe-_b&>CjcgO`+8I@)f zLN?Q-B=cCsbRw4nYKh0=i6up8K_$q~_F6Reca#u-JiDBdjH0ld)xpx3=@bX7>}F{s z35Kc;0Gg7IAvM?RNahzDO_QpJRs;hQsI_BE5^W_WYeQFZ(PDuD2T9v3ZM>zJHg2HK zVSG9yOUGX$X4U>#UCdtztD;w@HF2y3I`u{3{Kh;n7=1IIo+f27IpGa;6v58}nsca$ zVpYleKff4{;9uaO)GW3{QkhmQJw21g0`LFaGXxZd^@b)hvoW-^5ek_{LCjLO%P_t_ z7G7WHpHO0b-Kq!!XYbdYGR^{3sZ73{wvcowbqigQX0&7_HMU65y%J>6l9s7F0Vxb{ zILZ_$hr?l0MN?X!z@ycpQncl#GJbQRg4nVs$VNykt4x|wlJjwypSx*hOKclT2eOUg z;#dN?=CGavL%zVM6UFEdAmHl>x>CrGAEabJXVfaeN=VB>(?e>`g`ZMc;eC7y^V(ut zIl7vhvhzw^Ss&La>MOgEp;@h;bK;(rm|xB)bv;6>y3w;t;^(iNXlXaP?L%&wp!hpz z4hr9U;G#z@3z^n2Y*MK$%uX-!Ya#*149?&axI}!=`HJ0>%)~anWdl6dC#*vFG^LN> z`nm+5*)={uV&AJN5KQJp61{grL1+Egj3D|Uy=!!)%9 z&}o^~F{}4kh(dRFK?-G(qb~0!jw`}Ac8yceWH21z!>bc)mTjk5U*8#Gjq2sJx}SD? z?jXb{GVGdN2G;e*K{-OlOHLhf!%IXItT6&H5vX0xlfpgCV zkKHXVa&VkVLP{J!AI>|TCZJRd!=^A{n*yq$-V&~I{SjNSAzdq7Z#<==d@wdw&8vY!`9^(*u|ZVWm5WgLf&m3C+If`gQa z;A9*$-#%!?FlTsB>~+=*Nrn}{)=Gt=3bgg{%`86!6Qj>3SPwk~Qzu!AMyqGY=$SU@ zsF@#P3i#}h?nbSs+tKXX`np9Sb9SQ1G&1UA{%;oZO*z(su$CPf&HBQ?Ji!S06jR%^H~*xbfcD2;20oUj+%RHB zeN6#o>C{WPIN%*kV7cjh_}i;#UFcIUeKJMnco~-QT-fSwl6;PF)T*1z4vmi2Imj8K z9%5w7;TWXdaSFg$xWx^~q6M^~CwXKXhw26xj{qpPIt6B!pDT3=H{gBquvP+J=JOw+ zM5^(%YvNEu!cB%xcZJp7x|>Ob1gfhdpuyeNjf%K^L_otxOQO1?H)#K_|2Z6r0Qgir zaMp16zy2pAArflc=?n(*uc2)G^{1Pc2^Bl|{#yY2bjx(daa_v8fT6L!s7~`4$N~}Z zUg3mX{V5%DU&?13pk2eIn%tpQL$_<-rKRy|W$n-q=FtSjI49qx20xs=K5lSK*7Tr` z)d$xp$bjQ5BRZG|3m;q?knz(;raz@+w9`EiUWh12NjNw5OvMGrXS4B*d@_NK>%0Ow zI)!1Su+%kBT?TDZ#ZXUD>ARc`%AA$F$I0hTvKnH_R%@dTG3*@Wz2EKk{-1vD@o_gE zDsXcd{&WkMT*LX)=%b`nf?`EPZM;cE$OKE~WcW{NJZ>R|jpUIzyuJuyk%i|2GMC_| zdUTu!oP__NDY2B4)-JEdf=vU>HJ3>!a=o3+J7FsMV{wB)jVh}ZpSD4;24n)T(CH*X znn&HT8##20%-)ZRF=#cQ1FY0k5Sm*uvPdXf&B@mA4Ya(TuGUxxnA_4h%}x0nk)x`! zDl04ChjFqf_K##_v&s-3oAa9ke@Lf|tX1r%2lC@!KLt@mL6`U1T2#INJ#Odfi?T9z ztMC6nsZb|6vRXNR#GJFM35WACbN&bB%;wX2iat+P)}Jt|Dr$5Au^aj`=8TKUd3|A} z|Ak7_H)Fe^zfv1H3P3CU->Di@9(AZOGyiXx|27|A+133--JCnAf2S_yuyzAS{gWi; zb5J)iMniE4aG*c7+Phz0UyfTa5EVa6wzbixGeeNfXk{6+e|Y`0_tl{N^#0fkm?z5L;u=g*$N>et)c{I^F>HaEY0{cY=4sQkCKHnui555A|h@uIG0JDZ#D z-o4v+_h@4}Ki_=)YV#Uv*xJG(^7qE59u3;i3RMnBO;AhoOK&}X{Fuu?^#Ha*%g3ON z-c~IvUgRVALxHdNBF=sOLt?ZxgEjrC_rrbNg)yfW$y6|>kWU5dijaTN+k8^U+UnbF?*G?qKER4 zbK(g|0MzdgoVKo6WQM+%1!V)$MIQwcl{pz-%~vZz(kjJK-jrGRn|reo=L)vp#yTjL ziiE}I7OyG-JT1m!&|gncx#F_{NfR{AVP~)@Vv_2J`k)`Ih5i2e2Jk1<1(b z6lmRkO01EeoXi(3R-hHbyae#QzEHvw0Hp_?O;Ew|a|^QNwH!v3Qa=Junx^!`_zGA~ zPS8}k3`y}E;+|2+c!m)8SH4scf$aKb|M1|4SI{xlG9>f~d0Zohm^36a=gIWi<2vKgB2_=mPl|C1b~?>a&gkhZ z7(gn%a@%5mwya?V;_(cn8%+vEd(gbF@7;QhoR#GJcU>=#l|Q6zePK6h=K7DS8t)n} zsUEWz)dkShs%@d)Mr#dKbuUey(<0FVO97R=Sf4*bQ}Qt`KdN7(YL zUUW5tc!Jjg!bnDo?ipr_(K==FxFB<`fd{_<<^o}q4(#ThW3G5*ue=Kemtpfz&cR*#n{8L;4$@7!xRXvyjoF zq=|fs3#YT2IV=9__&aSqxtPPAYC5|pTHj8`<=dieZTI^>?``+D`VRZcKVpAK+tj^Q z+uP}vyc(QBgDt$V3wpyImPxR{?PWekzu0~%lneO9&x!A#PLZBW=TOHE&c9T?;=RM` zcdBnF^~gNFgBO(2g{nKD^#DU>UnWwUzs0@G&erzqx^+37Oi{xrk}986y{ed(XX)Y- z-rwGehASY#sP)NLUwzfunq7M+EI#4wwLpF*&^?=H5 z^&;nF3X9gIn<>@(oq2)xnBNxZ=@@u_2cRz$A{!L2;MT`eZDGAUtEaG4Dq8(OTe5>& z#z?ik05bMlpTi$$L6O)mj9u-g81Wze1V)^-NE&c+@LfzL4nLQK;&OeT6X>2KYb7b` z7o#cuBKg5b4pu92rQ{+v$qWF7C}@BRX%91r#ni zHPQhC`o%#Zd-yE`z~je111cHzt6QJ5!_uoqtC*5uFhC?SC8K^N8hG@TISqvP(h>LF%zx?viBU6Sb+(K=*Q+@*n3y0I6 zfS){m{N&>eLXpx@;%nG+n84mrLpdfvNH~(gv zrxbPBrsc-Zi_7MEL?x~KmS@n;Y+6zs4`9@95Agq3ri_Zy>72aZSkutb2y{{@W%~4= zB^@SHlAeutN;M|5BIExxmu!8~WF?Ya#{6)9m(|*6uk)Dz4`IvGd@K@SDn6+1txueN z`>hFfUWiBT{MYo&Bv?L`c%OnZ$5Sb9b>}o)p{~>TY2AGzvPOkL`LB z>&p;QJ6qUAbC+X7S~JQS3%=0ol|X}5czm`_^ryxcJ7?1> zAX7x4M}57IGnEp>WcJpD(oqL#Bq20Orzifb;VQncReQfQ?|%Z4*BPo=KKaBr1(B0~ z@~+3Jf#s7Wy&IV$aZ+EvV7O`c-i1y(EI=1WSCl{!9{PBtMFb5uU4|HGX?AWYCT(dV zwKOkSTLD7=NJXwkyVfm-#-VPjMrpF~-koQzsVqCI$Ra?iP(}Uy?a#m5Us93J-QRrq z&9~ofdo3X4TMdiZ(gyt&zWUGHeEX|sXzhHB!-}S#jql3S`Lvpz)f@Ykru+yrW!lqdo%&H~{`RqFfw9tX zTKwCRq7v)Eb>8nK6Gket0Aem-i%;|^->rxj#_B`kViC4q`8u&>nrX1ZXxmRevn@-4;!4>-_~!I%~_(6PplwZ>CW2JVx##(~~Dp9`Ao;Dg(wi zqntKcL2S&OkLQEZ3hn9-jO#A|bUVP~W(02?fGzySK%LHV-^+1&nTz0QB-| zSot)Xa2VOrkUwv1mX6PF?Uu9-YmnXLONZFjqKJ94ECxne(s`RF62W~QG>(Q5K5?|EAc!1AS_XnOsfR2DA6S+3KmYR4SAEkWw)n*Lv${29j2L>94Q4$sO;d};QWkB8 ztgVZU3BGPCUNLIfwtQ3Nav^Q~+!<6f=h+4@4tz_0qI zwC|fc7CJy!0h?ByG^CUD5ov96y|wEkf*7+lC@Pv7W_D_9p4_#Xa`_&TMapl#JlJ}A z@E{bff`>?2`ch%ou~g-#v5s+RNbm+2e7EVWyynde*9_b8_=(yYVqvv|nWPXFou M1MNl0yM)340KP9L^8f$< literal 0 HcmV?d00001 diff --git a/includes/edit_area/edit_area_full.js b/includes/edit_area/edit_area_full.js new file mode 100644 index 00000000..267574c3 --- /dev/null +++ b/includes/edit_area/edit_area_full.js @@ -0,0 +1,38 @@ + function EAL(){var t=this;t.version="0.8.2";date=new Date();t.start_time=date.getTime();t.win="loading";t.error=false;t.baseURL="";t.template="";t.lang={};t.load_syntax={};t.syntax={};t.loadedFiles=[];t.waiting_loading={};t.scripts_to_load=[];t.sub_scripts_to_load=[];t.syntax_display_name={'basic':'Basic','brainfuck':'Brainfuck','c':'C','coldfusion':'Coldfusion','cpp':'CPP','css':'CSS','html':'HTML','java':'Java','js':'Javascript','pas':'Pascal','perl':'Perl','php':'Php','python':'Python','robotstxt':'Robots txt','ruby':'Ruby','sql':'SQL','tsql':'T-SQL','vb':'Visual Basic','xml':'XML'};t.resize=[];t.hidden={};t.default_settings={debug:false,smooth_selection:true,font_size:"10",font_family:"monospace",start_highlight:false,toolbar:"search,go_to_line,fullscreen,|,undo,redo,|,select_font,|,change_smooth_selection,highlight,reset_highlight,word_wrap,|,help",begin_toolbar:"",end_toolbar:"",is_multi_files:false,allow_resize:"both",show_line_colors:false,min_width:400,min_height:125,replace_tab_by_spaces:false,allow_toggle:true,language:"en",syntax:"",syntax_selection_allow:"basic,brainfuck,c,coldfusion,cpp,css,html,java,js,pas,perl,php,python,ruby,robotstxt,sql,tsql,vb,xml",display:"onload",max_undo:30,browsers:"known",plugins:"",gecko_spellcheck:false,fullscreen:false,is_editable:true,cursor_position:"begin",word_wrap:false,autocompletion:false,load_callback:"",save_callback:"",change_callback:"",submit_callback:"",EA_init_callback:"",EA_delete_callback:"",EA_load_callback:"",EA_unload_callback:"",EA_toggle_on_callback:"",EA_toggle_off_callback:"",EA_file_switch_on_callback:"",EA_file_switch_off_callback:"",EA_file_close_callback:""};t.advanced_buttons=[ ['new_document','newdocument.gif','new_document',false],['search','search.gif','show_search',false],['go_to_line','go_to_line.gif','go_to_line',false],['undo','undo.gif','undo',true],['redo','redo.gif','redo',true],['change_smooth_selection','smooth_selection.gif','change_smooth_selection_mode',true],['reset_highlight','reset_highlight.gif','resync_highlight',true],['highlight','highlight.gif','change_highlight',true],['help','help.gif','show_help',false],['save','save.gif','save',false],['load','load.gif','load',false],['fullscreen','fullscreen.gif','toggle_full_screen',false],['word_wrap','word_wrap.gif','toggle_word_wrap',true],['autocompletion','autocompletion.gif','toggle_autocompletion',true] ];t.set_browser_infos(t);if(t.isIE>=6||t.isGecko||(t.isWebKit&&!t.isSafari<3)||t.isOpera>=9||t.isCamino)t.isValidBrowser=true; +else t.isValidBrowser=false;t.set_base_url();for(var i=0;i0)s["toolbar"]=s["begin_toolbar"]+","+s["toolbar"];if(s["end_toolbar"].length>0)s["toolbar"]=s["toolbar"]+","+s["end_toolbar"];s["tab_toolbar"]=s["toolbar"].replace(/ /g,"").split(",");s["plugins"]=s["plugins"].replace(/ /g,"").split(",");for(i=0;i0){s["syntax"]=s["syntax"].toLowerCase();t.load_script(t.baseURL+"reg_syntax/"+s["syntax"]+".js");}eAs[s["id"]]={"settings":s};eAs[s["id"]]["displayed"]=false;eAs[s["id"]]["hidden"]=false;t.start(s["id"]);},delete_instance:function(id){var d=document,fs=window.frames,span,iframe;eAL.execCommand(id,"EA_delete");if(fs["frame_"+id]&&fs["frame_"+id].editArea){if(eAs[id]["displayed"])eAL.toggle(id,"off");fs["frame_"+id].editArea.execCommand("EA_unload");}span=d.getElementById("EditAreaArroundInfos_"+id);if(span)span.parentNode.removeChild(span);iframe=d.getElementById("frame_"+id);if(iframe){iframe.parentNode.removeChild(iframe);try{delete fs["frame_"+id];}catch(e){}}delete eAs[id];},start:function(id){var t=this,d=document,f,span,father,next,html='',html_toolbar_content='',template,content,i;if(t.win!="loaded"){setTimeout("eAL.start('"+id+"');",50);return;}for(i in t.waiting_loading){if(t.waiting_loading[i]!="loaded"&&typeof(t.waiting_loading[i])!="function"){setTimeout("eAL.start('"+id+"');",50);return;}}if(!t.lang[eAs[id]["settings"]["language"]]||(eAs[id]["settings"]["syntax"].length>0&&!t.load_syntax[eAs[id]["settings"]["syntax"]])){setTimeout("eAL.start('"+id+"');",50);return;}if(eAs[id]["settings"]["syntax"].length>0)t.init_syntax_regexp();if(!d.getElementById("EditAreaArroundInfos_"+id)&&(eAs[id]["settings"]["debug"]||eAs[id]["settings"]["allow_toggle"])){span=d.createElement("span");span.id="EditAreaArroundInfos_"+id;if(eAs[id]["settings"]["allow_toggle"]){checked=(eAs[id]["settings"]["display"]=="onload")?"checked='checked'":"";html+="
";html+="";html+="
";}if(eAs[id]["settings"]["debug"])html+="
";html=t.translate(html,eAs[id]["settings"]["language"]);span.innerHTML=html;father=d.getElementById(id).parentNode;next=d.getElementById(id).nextSibling;if(next==null)father.appendChild(span); +else father.insertBefore(span,next);}if(!eAs[id]["initialized"]){t.execCommand(id,"EA_init");if(eAs[id]["settings"]["display"]=="later"){eAs[id]["initialized"]=true;return;}}if(t.isIE){t.init_ie_textarea(id);}var area=eAs[id];for(i=0;i';}for(i=0;i';t.iframe_script+='';}if(!t.iframe_css){t.iframe_css="";}template=t.template.replace(/\[__BASEURL__\]/g,t.baseURL);template=template.replace("[__TOOLBAR__]",html_toolbar_content);template=t.translate(template,area["settings"]["language"],"template");template=template.replace("[__CSSRULES__]",t.iframe_css);template=template.replace("[__JSCODE__]",t.iframe_script);template=template.replace("[__EA_VERSION__]",t.version);area.textarea=d.getElementById(area["settings"]["id"]);eAs[area["settings"]["id"]]["textarea"]=area.textarea;if(typeof(window.frames["frame_"+area["settings"]["id"]])!='undefined')delete window.frames["frame_"+area["settings"]["id"]];father=area.textarea.parentNode;content=d.createElement("iframe");content.name="frame_"+area["settings"]["id"];content.id="frame_"+area["settings"]["id"];content.style.borderWidth="0px";setAttribute(content,"frameBorder","0");content.style.overflow="hidden";content.style.display="none";next=area.textarea.nextSibling;if(next==null)father.appendChild(content); +else father.insertBefore(content,next);f=window.frames["frame_"+area["settings"]["id"]];f.document.open();f.eAs=eAs;f.area_id=area["settings"]["id"];f.document.area_id=area["settings"]["id"];f.document.write(template);f.document.close();},toggle:function(id,toggle_to){if(!toggle_to)toggle_to=(eAs[id]["displayed"]==true)?"off":"on";if(eAs[id]["displayed"]==true&&toggle_to=="off"){this.toggle_off(id);} +else if(eAs[id]["displayed"]==false&&toggle_to=="on"){this.toggle_on(id);}return false;},toggle_off:function(id){var fs=window.frames,f,t,parNod,nxtSib,selStart,selEnd,scrollTop,scrollLeft;if(fs["frame_"+id]){f=fs["frame_"+id];t=eAs[id]["textarea"];if(f.editArea.fullscreen['isFull'])f.editArea.toggle_full_screen(false);eAs[id]["displayed"]=false;t.wrap="off";setAttribute(t,"wrap","off");parNod=t.parentNode;nxtSib=t.nextSibling;parNod.removeChild(t);parNod.insertBefore(t,nxtSib);t.value=f.editArea.textarea.value;selStart=f.editArea.last_selection["selectionStart"];selEnd=f.editArea.last_selection["selectionEnd"];scrollTop=f.document.getElementById("result").scrollTop;scrollLeft=f.document.getElementById("result").scrollLeft;document.getElementById("frame_"+id).style.display='none';t.style.display="inline";try{t.focus();}catch(e){};if(this.isIE){t.selectionStart=selStart;t.selectionEnd=selEnd;t.focused=true;set_IE_selection(t);} +else{if(this.isOpera&&this.isOpera < 9.6){t.setSelectionRange(0,0);}try{t.setSelectionRange(selStart,selEnd);}catch(e){};}t.scrollTop=scrollTop;t.scrollLeft=scrollLeft;f.editArea.execCommand("toggle_off");}},toggle_on:function(id){var fs=window.frames,f,t,selStart=0,selEnd=0,scrollTop=0,scrollLeft=0,curPos,elem;if(fs["frame_"+id]){f=fs["frame_"+id];t=eAs[id]["textarea"];area=f.editArea;area.textarea.value=t.value;curPos=eAs[id]["settings"]["cursor_position"];if(t.use_last==true){selStart=t.last_selectionStart;selEnd=t.last_selectionEnd;scrollTop=t.last_scrollTop;scrollLeft=t.last_scrollLeft;t.use_last=false;} +else if(curPos=="auto"){try{selStart=t.selectionStart;selEnd=t.selectionEnd;scrollTop=t.scrollTop;scrollLeft=t.scrollLeft;}catch(ex){}}this.set_editarea_size_from_textarea(id,document.getElementById("frame_"+id));t.style.display="none";document.getElementById("frame_"+id).style.display="inline";area.execCommand("focus");eAs[id]["displayed"]=true;area.execCommand("update_size");f.document.getElementById("result").scrollTop=scrollTop;f.document.getElementById("result").scrollLeft=scrollLeft;area.area_select(selStart,selEnd-selStart);area.execCommand("toggle_on");} +else{elem=document.getElementById(id);elem.last_selectionStart=elem.selectionStart;elem.last_selectionEnd=elem.selectionEnd;elem.last_scrollTop=elem.scrollTop;elem.last_scrollLeft=elem.scrollLeft;elem.use_last=true;eAL.start(id);}},set_editarea_size_from_textarea:function(id,frame){var elem,width,height;elem=document.getElementById(id);width=Math.max(eAs[id]["settings"]["min_width"],elem.offsetWidth)+"px";height=Math.max(eAs[id]["settings"]["min_height"],elem.offsetHeight)+"px";if(elem.style.width.indexOf("%")!=-1)width=elem.style.width;if(elem.style.height.indexOf("%")!=-1)height=elem.style.height;frame.style.width=width;frame.style.height=height;},set_base_url:function(){var t=this,elems,i,docBasePath;if(!this.baseURL){elems=document.getElementsByTagName('script');for(i=0;i';html+='';return html;},get_control_html:function(button_name,lang){var t=this,i,but,html,si;for(i=0;i";case "|":case "separator":return '';case "select_font":html="";return html;case "syntax_selection":html="";return html;}return "["+button_name+"]";},get_template:function(){if(this.template==""){var xhr_object=null;if(window.XMLHttpRequest)xhr_object=new XMLHttpRequest(); +else if(window.ActiveXObject)xhr_object=new ActiveXObject("Microsoft.XMLHTTP"); +else{alert("XMLHTTPRequest not supported. EditArea not loaded");return;}xhr_object.open("GET",this.baseURL+"template.html",false);xhr_object.send(null);if(xhr_object.readyState==4)this.template=xhr_object.responseText; +else this.has_error();}},translate:function(text,lang,mode){if(mode=="word")text=eAL.get_word_translation(text,lang); +else if(mode="template"){eAL.current_language=lang;text=text.replace(/\{\$([^\}]+)\}/gm,eAL.translate_template);}return text;},translate_template:function(){return eAL.get_word_translation(EAL.prototype.translate_template.arguments[1],eAL.current_language);},get_word_translation:function(val,lang){var i;for(i in eAL.lang[lang]){if(i==val)return eAL.lang[lang][i];}return "_"+val;},load_script:function(url){var t=this,d=document,script,head;if(t.loadedFiles[url])return;try{script=d.createElement("script");script.type="text/javascript";script.src=url;script.charset="UTF-8";d.getElementsByTagName("head")[0].appendChild(script);}catch(e){d.write('');}t.loadedFiles[url]=true;},add_event:function(obj,name,handler){try{if(obj.attachEvent){obj.attachEvent("on"+name,handler);} +else{obj.addEventListener(name,handler,false);}}catch(e){}},remove_event:function(obj,name,handler){try{if(obj.detachEvent)obj.detachEvent("on"+name,handler); +else obj.removeEventListener(name,handler,false);}catch(e){}},reset:function(e){var formObj,is_child,i,x;formObj=eAL.isIE ? window.event.srcElement:e.target;if(formObj.tagName!='FORM')formObj=formObj.form;for(i in eAs){is_child=false;for(x=0;x old_sel["start"])this.setSelectionRange(id,new_sel["end"],new_sel["end"]); +else this.setSelectionRange(id,old_sel["start"]+open_tag.length,old_sel["start"]+open_tag.length);},hide:function(id){var fs=window.frames,d=document,t=this,scrollTop,scrollLeft,span;if(d.getElementById(id)&&!t.hidden[id]){t.hidden[id]={};t.hidden[id]["selectionRange"]=t.getSelectionRange(id);if(d.getElementById(id).style.display!="none"){t.hidden[id]["scrollTop"]=d.getElementById(id).scrollTop;t.hidden[id]["scrollLeft"]=d.getElementById(id).scrollLeft;}if(fs["frame_"+id]){t.hidden[id]["toggle"]=eAs[id]["displayed"];if(fs["frame_"+id]&&eAs[id]["displayed"]==true){scrollTop=fs["frame_"+id].document.getElementById("result").scrollTop;scrollLeft=fs["frame_"+id].document.getElementById("result").scrollLeft;} +else{scrollTop=d.getElementById(id).scrollTop;scrollLeft=d.getElementById(id).scrollLeft;}t.hidden[id]["scrollTop"]=scrollTop;t.hidden[id]["scrollLeft"]=scrollLeft;if(eAs[id]["displayed"]==true)eAL.toggle_off(id);}span=d.getElementById("EditAreaArroundInfos_"+id);if(span){span.style.display='none';}d.getElementById(id).style.display="none";}},show:function(id){var fs=window.frames,d=document,t=this,span;if((elem=d.getElementById(id))&&t.hidden[id]){elem.style.display="inline";elem.scrollTop=t.hidden[id]["scrollTop"];elem.scrollLeft=t.hidden[id]["scrollLeft"];span=d.getElementById("EditAreaArroundInfos_"+id);if(span){span.style.display='inline';}if(fs["frame_"+id]){elem.style.display="inline";if(t.hidden[id]["toggle"]==true)eAL.toggle_on(id);scrollTop=t.hidden[id]["scrollTop"];scrollLeft=t.hidden[id]["scrollLeft"];if(fs["frame_"+id]&&eAs[id]["displayed"]==true){fs["frame_"+id].document.getElementById("result").scrollTop=scrollTop;fs["frame_"+id].document.getElementById("result").scrollLeft=scrollLeft;} +else{elem.scrollTop=scrollTop;elem.scrollLeft=scrollLeft;}}sel=t.hidden[id]["selectionRange"];t.setSelectionRange(id,sel["start"],sel["end"]);delete t.hidden[id];}},getCurrentFile:function(id){return this.execCommand(id,'get_file',this.execCommand(id,'curr_file'));},getFile:function(id,file_id){return this.execCommand(id,'get_file',file_id);},getAllFiles:function(id){return this.execCommand(id,'get_all_files()');},openFile:function(id,file_infos){return this.execCommand(id,'open_file',file_infos);},closeFile:function(id,file_id){return this.execCommand(id,'close_file',file_id);},setFileEditedMode:function(id,file_id,to){var reg1,reg2;reg1=new RegExp('\\\\','g');reg2=new RegExp('"','g');return this.execCommand(id,'set_file_edited_mode("'+file_id.replace(reg1,'\\\\').replace(reg2,'\\"')+'",'+to+')');},execCommand:function(id,cmd,fct_param){switch(cmd){case "EA_init":if(eAs[id]['settings']["EA_init_callback"].length>0)eval(eAs[id]['settings']["EA_init_callback"]+"('"+id+"');");break;case "EA_delete":if(eAs[id]['settings']["EA_delete_callback"].length>0)eval(eAs[id]['settings']["EA_delete_callback"]+"('"+id+"');");break;case "EA_submit":if(eAs[id]['settings']["submit_callback"].length>0)eval(eAs[id]['settings']["submit_callback"]+"('"+id+"');");break;}if(window.frames["frame_"+id]&&window.frames["frame_"+id].editArea){if(fct_param!=undefined)return eval('window.frames["frame_'+id+'"].editArea.'+cmd+'(fct_param);'); +else return eval('window.frames["frame_'+id+'"].editArea.'+cmd+';');}return false;}};var eAL=new EAL();var eAs={}; function getAttribute(elm,aName){var aValue,taName,i;try{aValue=elm.getAttribute(aName);}catch(exept){}if(! aValue){for(i=0;i < elm.attributes.length;i++){taName=elm.attributes[i] .name.toLowerCase();if(taName==aName){aValue=elm.attributes[i] .value;return aValue;}}}return aValue;};function setAttribute(elm,attr,val){if(attr=="class"){elm.setAttribute("className",val);elm.setAttribute("class",val);} +else{elm.setAttribute(attr,val);}};function getChildren(elem,elem_type,elem_attribute,elem_attribute_match,option,depth){if(!option)var option="single";if(!depth)var depth=-1;if(elem){var children=elem.childNodes;var result=null;var results=[];for(var x=0;x0){results=results.concat(result);}} +else if(result!=null){return result;}}}}if(option=="all")return results;}return null;};function isChildOf(elem,parent){if(elem){if(elem==parent)return true;while(elem.parentNode !='undefined'){return isChildOf(elem.parentNode,parent);}}return false;};function getMouseX(e){if(e!=null&&typeof(e.pageX)!="undefined"){return e.pageX;} +else{return(e!=null?e.x:event.x)+document.documentElement.scrollLeft;}};function getMouseY(e){if(e!=null&&typeof(e.pageY)!="undefined"){return e.pageY;} +else{return(e!=null?e.y:event.y)+document.documentElement.scrollTop;}};function calculeOffsetLeft(r){return calculeOffset(r,"offsetLeft")};function calculeOffsetTop(r){return calculeOffset(r,"offsetTop")};function calculeOffset(element,attr){var offset=0;while(element){offset+=element[attr];element=element.offsetParent}return offset;};function get_css_property(elem,prop){if(document.defaultView){return document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop);} +else if(elem.currentStyle){var prop=prop.replace(/-\D/gi,function(sMatch){return sMatch.charAt(sMatch.length-1).toUpperCase();});return elem.currentStyle[prop];} +else return null;}var _mCE;function start_move_element(e,id,frame){var elem_id=(e.target||e.srcElement).id;if(id)elem_id=id;if(!frame)frame=window;if(frame.event)e=frame.event;_mCE=frame.document.getElementById(elem_id);_mCE.frame=frame;frame.document.onmousemove=move_element;frame.document.onmouseup=end_move_element;mouse_x=getMouseX(e);mouse_y=getMouseY(e);_mCE.start_pos_x=mouse_x-(_mCE.style.left.replace("px","")||calculeOffsetLeft(_mCE));_mCE.start_pos_y=mouse_y-(_mCE.style.top.replace("px","")||calculeOffsetTop(_mCE));return false;};function end_move_element(e){_mCE.frame.document.onmousemove="";_mCE.frame.document.onmouseup="";_mCE=null;};function move_element(e){var newTop,newLeft,maxLeft;if(_mCE.frame&&_mCE.frame.event)e=_mCE.frame.event;newTop=getMouseY(e)-_mCE.start_pos_y;newLeft=getMouseX(e)-_mCE.start_pos_x;maxLeft=_mCE.frame.document.body.offsetWidth-_mCE.offsetWidth;max_top=_mCE.frame.document.body.offsetHeight-_mCE.offsetHeight;newTop=Math.min(Math.max(0,newTop),max_top);newLeft=Math.min(Math.max(0,newLeft),maxLeft);_mCE.style.top=newTop+"px";_mCE.style.left=newLeft+"px";return false;};var nav=eAL.nav;function getSelectionRange(textarea){return{"start":textarea.selectionStart,"end":textarea.selectionEnd};};function setSelectionRange(t,start,end){t.focus();start=Math.max(0,Math.min(t.value.length,start));end=Math.max(start,Math.min(t.value.length,end));if(nav.isOpera&&nav.isOpera < 9.6){t.selectionEnd=1;t.selectionStart=0;t.selectionEnd=1;t.selectionStart=0;}t.selectionStart=start;t.selectionEnd=end;if(nav.isIE)set_IE_selection(t);};function get_IE_selection(t){var d=document,div,range,stored_range,elem,scrollTop,relative_top,line_start,line_nb,range_start,range_end,tab;if(t&&t.focused){if(!t.ea_line_height){div=d.createElement("div");div.style.fontFamily=get_css_property(t,"font-family");div.style.fontSize=get_css_property(t,"font-size");div.style.visibility="hidden";div.innerHTML="0";d.body.appendChild(div);t.ea_line_height=div.offsetHeight;d.body.removeChild(div);}range=d.selection.createRange();try{stored_range=range.duplicate();stored_range.moveToElementText(t);stored_range.setEndPoint('EndToEnd',range);if(stored_range.parentElement()==t){elem=t;scrollTop=0;while(elem.parentNode){scrollTop+=elem.scrollTop;elem=elem.parentNode;}relative_top=range.offsetTop-calculeOffsetTop(t)+scrollTop;line_start=Math.round((relative_top / t.ea_line_height)+1);line_nb=Math.round(range.boundingHeight / t.ea_line_height);range_start=stored_range.text.length-range.text.length;tab=t.value.substr(0,range_start).split("\n");range_start+=(line_start-tab.length)*2;t.selectionStart=range_start;range_end=t.selectionStart+range.text.length;tab=t.value.substr(0,range_start+range.text.length).split("\n");range_end+=(line_start+line_nb-1-tab.length)*2;t.selectionEnd=range_end;}}catch(e){}}if(t&&t.id){setTimeout("get_IE_selection(document.getElementById('"+t.id+"'));",50);}};function IE_textarea_focus(){event.srcElement.focused=true;}function IE_textarea_blur(){event.srcElement.focused=false;}function set_IE_selection(t){var nbLineStart,nbLineStart,nbLineEnd,range;if(!window.closed){nbLineStart=t.value.substr(0,t.selectionStart).split("\n").length-1;nbLineEnd=t.value.substr(0,t.selectionEnd).split("\n").length-1;try{range=document.selection.createRange();range.moveToElementText(t);range.setEndPoint('EndToStart',range);range.moveStart('character',t.selectionStart-nbLineStart);range.moveEnd('character',t.selectionEnd-nbLineEnd-(t.selectionStart-nbLineStart));range.select();}catch(e){}}};eAL.waiting_loading["elements_functions.js"]="loaded"; + EAL.prototype.start_resize_area=function(){var d=document,a,div,width,height,father;d.onmouseup=eAL.end_resize_area;d.onmousemove=eAL.resize_area;eAL.toggle(eAL.resize["id"]);a=eAs[eAL.resize["id"]]["textarea"];div=d.getElementById("edit_area_resize");if(!div){div=d.createElement("div");div.id="edit_area_resize";div.style.border="dashed #888888 1px";}width=a.offsetWidth-2;height=a.offsetHeight-2;div.style.display="block";div.style.width=width+"px";div.style.height=height+"px";father=a.parentNode;father.insertBefore(div,a);a.style.display="none";eAL.resize["start_top"]=calculeOffsetTop(div);eAL.resize["start_left"]=calculeOffsetLeft(div);};EAL.prototype.end_resize_area=function(e){var d=document,div,a,width,height;d.onmouseup="";d.onmousemove="";div=d.getElementById("edit_area_resize");a=eAs[eAL.resize["id"]]["textarea"];width=Math.max(eAs[eAL.resize["id"]]["settings"]["min_width"],div.offsetWidth-4);height=Math.max(eAs[eAL.resize["id"]]["settings"]["min_height"],div.offsetHeight-4);if(eAL.isIE==6){width-=2;height-=2;}a.style.width=width+"px";a.style.height=height+"px";div.style.display="none";a.style.display="inline";a.selectionStart=eAL.resize["selectionStart"];a.selectionEnd=eAL.resize["selectionEnd"];eAL.toggle(eAL.resize["id"]);return false;};EAL.prototype.resize_area=function(e){var allow,newHeight,newWidth;allow=eAs[eAL.resize["id"]]["settings"]["allow_resize"];if(allow=="both"||allow=="y"){newHeight=Math.max(20,getMouseY(e)-eAL.resize["start_top"]);document.getElementById("edit_area_resize").style.height=newHeight+"px";}if(allow=="both"||allow=="x"){newWidth=Math.max(20,getMouseX(e)-eAL.resize["start_left"]);document.getElementById("edit_area_resize").style.width=newWidth+"px";}return false;};eAL.waiting_loading["resize_area.js"]="loaded"; + EAL.prototype.get_regexp=function(text_array){res="(\\b)(";for(i=0;i0)res+="|";res+=this.get_escaped_regexp(text_array[i]);}res+=")(\\b)";reg=new RegExp(res);return res;};EAL.prototype.get_escaped_regexp=function(str){return str.toString().replace(/(\.|\?|\*|\+|\\|\(|\)|\[|\]|\}|\{|\$|\^|\|)/g,"\\$1");};EAL.prototype.init_syntax_regexp=function(){var lang_style={};for(var lang in this.load_syntax){if(!this.syntax[lang]){this.syntax[lang]={};this.syntax[lang]["keywords_reg_exp"]={};this.keywords_reg_exp_nb=0;if(this.load_syntax[lang]['KEYWORDS']){param="g";if(this.load_syntax[lang]['KEYWORD_CASE_SENSITIVE']===false)param+="i";for(var i in this.load_syntax[lang]['KEYWORDS']){if(typeof(this.load_syntax[lang]['KEYWORDS'][i])=="function")continue;this.syntax[lang]["keywords_reg_exp"][i]=new RegExp(this.get_regexp(this.load_syntax[lang]['KEYWORDS'][i]),param);this.keywords_reg_exp_nb++;}}if(this.load_syntax[lang]['OPERATORS']){var str="";var nb=0;for(var i in this.load_syntax[lang]['OPERATORS']){if(typeof(this.load_syntax[lang]['OPERATORS'][i])=="function")continue;if(nb>0)str+="|";str+=this.get_escaped_regexp(this.load_syntax[lang]['OPERATORS'][i]);nb++;}if(str.length>0)this.syntax[lang]["operators_reg_exp"]=new RegExp("("+str+")","g");}if(this.load_syntax[lang]['DELIMITERS']){var str="";var nb=0;for(var i in this.load_syntax[lang]['DELIMITERS']){if(typeof(this.load_syntax[lang]['DELIMITERS'][i])=="function")continue;if(nb>0)str+="|";str+=this.get_escaped_regexp(this.load_syntax[lang]['DELIMITERS'][i]);nb++;}if(str.length>0)this.syntax[lang]["delimiters_reg_exp"]=new RegExp("("+str+")","g");}var syntax_trace=[];this.syntax[lang]["quotes"]={};var quote_tab=[];if(this.load_syntax[lang]['QUOTEMARKS']){for(var i in this.load_syntax[lang]['QUOTEMARKS']){if(typeof(this.load_syntax[lang]['QUOTEMARKS'][i])=="function")continue;var x=this.get_escaped_regexp(this.load_syntax[lang]['QUOTEMARKS'][i]);this.syntax[lang]["quotes"][x]=x;quote_tab[quote_tab.length]="("+x+"(\\\\.|[^"+x+"])*(?:"+x+"|$))";syntax_trace.push(x);}}this.syntax[lang]["comments"]={};if(this.load_syntax[lang]['COMMENT_SINGLE']){for(var i in this.load_syntax[lang]['COMMENT_SINGLE']){if(typeof(this.load_syntax[lang]['COMMENT_SINGLE'][i])=="function")continue;var x=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_SINGLE'][i]);quote_tab[quote_tab.length]="("+x+"(.|\\r|\\t)*(\\n|$))";syntax_trace.push(x);this.syntax[lang]["comments"][x]="\n";}}if(this.load_syntax[lang]['COMMENT_MULTI']){for(var i in this.load_syntax[lang]['COMMENT_MULTI']){if(typeof(this.load_syntax[lang]['COMMENT_MULTI'][i])=="function")continue;var start=this.get_escaped_regexp(i);var end=this.get_escaped_regexp(this.load_syntax[lang]['COMMENT_MULTI'][i]);quote_tab[quote_tab.length]="("+start+"(.|\\n|\\r)*?("+end+"|$))";syntax_trace.push(start);syntax_trace.push(end);this.syntax[lang]["comments"][i]=this.load_syntax[lang]['COMMENT_MULTI'][i];}}if(quote_tab.length>0)this.syntax[lang]["comment_or_quote_reg_exp"]=new RegExp("("+quote_tab.join("|")+")","gi");if(syntax_trace.length>0)this.syntax[lang]["syntax_trace_regexp"]=new RegExp("((.|\n)*?)(\\\\*("+syntax_trace.join("|")+"|$))","gmi");if(this.load_syntax[lang]['SCRIPT_DELIMITERS']){this.syntax[lang]["script_delimiters"]={};for(var i in this.load_syntax[lang]['SCRIPT_DELIMITERS']){if(typeof(this.load_syntax[lang]['SCRIPT_DELIMITERS'][i])=="function")continue;this.syntax[lang]["script_delimiters"][i]=this.load_syntax[lang]['SCRIPT_DELIMITERS'];}}this.syntax[lang]["custom_regexp"]={};if(this.load_syntax[lang]['REGEXPS']){for(var i in this.load_syntax[lang]['REGEXPS']){if(typeof(this.load_syntax[lang]['REGEXPS'][i])=="function")continue;var val=this.load_syntax[lang]['REGEXPS'][i];if(!this.syntax[lang]["custom_regexp"][val['execute']])this.syntax[lang]["custom_regexp"][val['execute']]={};this.syntax[lang]["custom_regexp"][val['execute']][i]={'regexp':new RegExp(val['search'],val['modifiers']),'class':val['class']};}}if(this.load_syntax[lang]['STYLES']){lang_style[lang]={};for(var i in this.load_syntax[lang]['STYLES']){if(typeof(this.load_syntax[lang]['STYLES'][i])=="function")continue;if(typeof(this.load_syntax[lang]['STYLES'][i])!="string"){for(var j in this.load_syntax[lang]['STYLES'][i]){lang_style[lang][j]=this.load_syntax[lang]['STYLES'][i][j];}} +else{lang_style[lang][i]=this.load_syntax[lang]['STYLES'][i];}}}var style="";for(var i in lang_style[lang]){if(lang_style[lang][i].length>0){style+="."+lang+" ."+i.toLowerCase()+" span{"+lang_style[lang][i]+"}\n";style+="."+lang+" ."+i.toLowerCase()+"{"+lang_style[lang][i]+"}\n";}}this.syntax[lang]["styles"]=style;}}};eAL.waiting_loading["reg_syntax.js"]="loaded"; +var editAreaLoader= eAL;var editAreas=eAs;EditAreaLoader=EAL;editAreaLoader.iframe_script= "".replace(/Ã/g,'this').replace(/Â/g,'textarea').replace(/Ã/g,'function').replace(/Ä/g,'prototype').replace(/Ã…/g,'settings').replace(/Æ/g,'length').replace(/Ç/g,'style').replace(/È/g,'parent').replace(/É/g,'last_selection').replace(/Ê/g,'value').replace(/Ë/g,'true').replace(/ÃŒ/g,'false'); +editAreaLoader.template= " EditArea [__CSSRULES__] [__JSCODE__]
[__TOOLBAR__]
 
 
{$position}: {$line_abbr} 0, {$char_abbr} 0 {$total}: {$line_abbr} 0, {$char_abbr} 0 resize
{$processing}
{$search} {$close_popup}
{$replace} {$move_popup}

{$find_next} {$replace} {$replace_all}
{$close_popup}

Editarea [__EA_VERSION__]


{$shortcuts}:

{$tab}: {$add_tab}
{$shift}+{$tab}: {$remove_tab}
{$ctrl}+f: {$search_command}
{$ctrl}+r: {$replace_command}
{$ctrl}+h: {$highlight}
{$ctrl}+g: {$go_to_line}
{$ctrl}+z: {$undo}
{$ctrl}+y: {$redo}
{$ctrl}+e: {$help}
{$ctrl}+q, {$esc}: {$close_popup}
{$accesskey} E: {$toggle}

{$about_notice}
"; +editAreaLoader.iframe_css= ""; diff --git a/includes/edit_area/edit_area_functions.js b/includes/edit_area/edit_area_functions.js new file mode 100644 index 00000000..cccbe243 --- /dev/null +++ b/includes/edit_area/edit_area_functions.js @@ -0,0 +1,1202 @@ + //replace tabulation by the good number of white spaces + EditArea.prototype.replace_tab= function(text){ + return text.replace(/((\n?)([^\t\n]*)\t)/gi, editArea.smartTab); // slower than simple replace... + }; + + // call by the replace_tab function + EditArea.prototype.smartTab= function(){ + val=" "; + return EditArea.prototype.smartTab.arguments[2] + EditArea.prototype.smartTab.arguments[3] + val.substr(0, editArea.tab_nb_char - (EditArea.prototype.smartTab.arguments[3].length)%editArea.tab_nb_char); + }; + + EditArea.prototype.show_waiting_screen= function(){ + width = this.editor_area.offsetWidth; + height = this.editor_area.offsetHeight; + if( !(this.isIE && this.isIE<6) ) + { + width -= 2; + height -= 2; + } + this.processing_screen.style.display= "block"; + this.processing_screen.style.width = width+"px"; + this.processing_screen.style.height = height+"px"; + this.waiting_screen_displayed = true; + }; + + EditArea.prototype.hide_waiting_screen= function(){ + this.processing_screen.style.display="none"; + this.waiting_screen_displayed= false; + }; + + EditArea.prototype.add_style= function(styles){ + if(styles.length>0){ + newcss = document.createElement("style"); + newcss.type="text/css"; + newcss.media="all"; + if(newcss.styleSheet){ // IE + newcss.styleSheet.cssText = styles; + } else { // W3C + newcss.appendChild(document.createTextNode(styles)); + } + document.getElementsByTagName("head")[0].appendChild(newcss); + } + }; + + EditArea.prototype.set_font= function(family, size){ + var t=this, a=this.textarea, s=this.settings, elem_font, i, elem; + // list all elements concerned by font changes + var elems= ["textarea", "content_highlight", "cursor_pos", "end_bracket", "selection_field", "selection_field_text", "line_number"]; + + if(family && family!="") + s["font_family"]= family; + if(size && size>0) + s["font_size"] = size; + if( t.isOpera && t.isOpera < 9.6 ) // opera<9.6 can't manage non monospace font + s['font_family']="monospace"; + + // update the select tag + if( elem_font = _$("area_font_size") ) + { + for( i = 0; i < elem_font.length; i++ ) + { + if( elem_font.options[i].value && elem_font.options[i].value == s["font_size"] ) + elem_font.options[i].selected=true; + } + } + + /* + * somethimes firefox has rendering mistake with non-monospace font for text width in textarea vs in div for changing font size (eg: verdana change between 11pt to 12pt) + * => looks like a browser internal random bug as text width can change while content_highlight is updated + * we'll check if the font-size produce the same text width inside textarea and div and if not, we'll increment the font-size + * + * This is an ugly fix + */ + if( t.isFirefox ) + { + var nbTry = 3; + do { + var div1 = document.createElement( 'div' ), text1 = document.createElement( 'textarea' ); + var styles = { + width: '40px', + overflow: 'scroll', + zIndex: 50, + visibility: 'hidden', + fontFamily: s["font_family"], + fontSize: s["font_size"]+"pt", + lineHeight: t.lineHeight+"px", + padding: '0', + margin: '0', + border: 'none', + whiteSpace: 'nowrap' + }; + var diff, changed = false; + for( i in styles ) + { + div1.style[ i ] = styles[i]; + text1.style[ i ] = styles[i]; + } + // no wrap for this text + text1.wrap = 'off'; + text1.setAttribute('wrap', 'off'); + t.container.appendChild( div1 ); + t.container.appendChild( text1 ); + // try to make FF to bug + div1.innerHTML = text1.value = 'azertyuiopqsdfghjklm'; + div1.innerHTML = text1.value = text1.value+'wxcvbn^p*ù$!:;,,'; + diff = text1.scrollWidth - div1.scrollWidth; + + // firefox return here a diff of 1 px between equals scrollWidth (can't explain) + if( Math.abs( diff ) >= 2 ) + { + s["font_size"]++; + changed = true; + } + t.container.removeChild( div1 ); + t.container.removeChild( text1 ); + nbTry--; + }while( changed && nbTry > 0 ); + } + + + // calc line height + elem = t.test_font_size; + elem.style.fontFamily = ""+s["font_family"]; + elem.style.fontSize = s["font_size"]+"pt"; + elem.innerHTML = "0"; + t.lineHeight = elem.offsetHeight; + + // update font for all concerned elements + for( i=0; i tags + t.add_style("pre{font-family:"+s["font_family"]+"}"); + + // old opera and IE>=8 doesn't update font changes to the textarea + if( ( t.isOpera && t.isOpera < 9.6 ) || t.isIE >= 8 ) + { + var parNod = a.parentNode, nxtSib = a.nextSibling, start= a.selectionStart, end= a.selectionEnd; + parNod.removeChild(a); + parNod.insertBefore(a, nxtSib); + t.area_select(start, end-start); + } + + // force update of selection field + this.focus(); + this.update_size(); + this.check_line_selection(); + }; + + EditArea.prototype.change_font_size= function(){ + var size=_$("area_font_size").value; + if(size>0) + this.set_font("", size); + }; + + + EditArea.prototype.open_inline_popup= function(popup_id){ + this.close_all_inline_popup(); + var popup= _$(popup_id); + var editor= _$("editor"); + + // search matching icon + for(var i=0; i lines.length) + start= this.textarea.value.length; + else{ + for(var i=0; i0){ + //alert(miss_top); + zone.scrollTop= zone.scrollTop + miss_top; + }else if( zone.scrollTop > cursor_pos_top){ + // when erase all the content -> does'nt scroll back to the top + //alert("else: "+cursor_pos_top); + zone.scrollTop= cursor_pos_top; + } + + // manage left scroll + //var cursor_pos_left= parseInt(_$("cursor_pos").style.left.replace("px","")); + var cursor_pos_left= _$("cursor_pos").cursor_left; + var max_width_visible= zone.clientWidth + zone.scrollLeft; + var miss_left= cursor_pos_left + 10 - max_width_visible; + if(miss_left>0){ + zone.scrollLeft= zone.scrollLeft + miss_left + 50; + }else if( zone.scrollLeft > cursor_pos_left){ + zone.scrollLeft= cursor_pos_left ; + }else if( zone.scrollLeft == 45){ + // show the line numbers if textarea align to it's left + zone.scrollLeft=0; + } + }; + + EditArea.prototype.check_undo= function(only_once){ + if(!editAreas[this.id]) + return false; + if(this.textareaFocused && editAreas[this.id]["displayed"]==true){ + var text=this.textarea.value; + if(this.previous.length<=1) + this.switchClassSticky(_$("undo"), 'editAreaButtonDisabled', true); + + if(!this.previous[this.previous.length-1] || this.previous[this.previous.length-1]["text"] != text){ + this.previous.push({"text": text, "selStart": this.textarea.selectionStart, "selEnd": this.textarea.selectionEnd}); + if(this.previous.length > this.settings["max_undo"]+1) + this.previous.shift(); + + } + if(this.previous.length >= 2) + this.switchClassSticky(_$("undo"), 'editAreaButtonNormal', false); + } + + if(!only_once) + setTimeout("editArea.check_undo()", 3000); + }; + + EditArea.prototype.undo= function(){ + //alert("undo"+this.previous.length); + if(this.previous.length > 0) + { + this.getIESelection(); + // var pos_cursor=this.textarea.selectionStart; + this.next.push( { "text": this.textarea.value, "selStart": this.textarea.selectionStart, "selEnd": this.textarea.selectionEnd } ); + var prev= this.previous.pop(); + if( prev["text"] == this.textarea.value && this.previous.length > 0 ) + prev =this.previous.pop(); + this.textarea.value = prev["text"]; + this.last_undo = prev["text"]; + this.area_select(prev["selStart"], prev["selEnd"]-prev["selStart"]); + this.switchClassSticky(_$("redo"), 'editAreaButtonNormal', false); + this.resync_highlight(true); + //alert("undo"+this.previous.length); + this.check_file_changes(); + } + }; + + EditArea.prototype.redo= function(){ + if(this.next.length > 0) + { + /*this.getIESelection();*/ + //var pos_cursor=this.textarea.selectionStart; + var next= this.next.pop(); + this.previous.push(next); + this.textarea.value= next["text"]; + this.last_undo= next["text"]; + this.area_select(next["selStart"], next["selEnd"]-next["selStart"]); + this.switchClassSticky(_$("undo"), 'editAreaButtonNormal', false); + this.resync_highlight(true); + this.check_file_changes(); + } + if( this.next.length == 0) + this.switchClassSticky(_$("redo"), 'editAreaButtonDisabled', true); + }; + + EditArea.prototype.check_redo= function(){ + if(editArea.next.length == 0 || editArea.textarea.value!=editArea.last_undo){ + editArea.next= []; // undo the ability to use "redo" button + editArea.switchClassSticky(_$("redo"), 'editAreaButtonDisabled', true); + } + else + { + this.switchClassSticky(_$("redo"), 'editAreaButtonNormal', false); + } + }; + + + // functions that manage icons roll over, disabled, etc... + EditArea.prototype.switchClass = function(element, class_name, lock_state) { + var lockChanged = false; + + if (typeof(lock_state) != "undefined" && element != null) { + element.classLock = lock_state; + lockChanged = true; + } + + if (element != null && (lockChanged || !element.classLock)) { + element.oldClassName = element.className; + element.className = class_name; + } + }; + + EditArea.prototype.restoreAndSwitchClass = function(element, class_name) { + if (element != null && !element.classLock) { + this.restoreClass(element); + this.switchClass(element, class_name); + } + }; + + EditArea.prototype.restoreClass = function(element) { + if (element != null && element.oldClassName && !element.classLock) { + element.className = element.oldClassName; + element.oldClassName = null; + } + }; + + EditArea.prototype.setClassLock = function(element, lock_state) { + if (element != null) + element.classLock = lock_state; + }; + + EditArea.prototype.switchClassSticky = function(element, class_name, lock_state) { + var lockChanged = false; + if (typeof(lock_state) != "undefined" && element != null) { + element.classLock = lock_state; + lockChanged = true; + } + + if (element != null && (lockChanged || !element.classLock)) { + element.className = class_name; + element.oldClassName = class_name; + } + }; + + //make the "page up" and "page down" buttons works correctly + EditArea.prototype.scroll_page= function(params){ + var dir= params["dir"], shift_pressed= params["shift"]; + var lines= this.textarea.value.split("\n"); + var new_pos=0, length=0, char_left=0, line_nb=0, curLine=0; + var toScrollAmount = _$("result").clientHeight -30; + var nbLineToScroll = 0, diff= 0; + + if(dir=="up"){ + nbLineToScroll = Math.ceil( toScrollAmount / this.lineHeight ); + + // fix number of line to scroll + for( i = this.last_selection["line_start"]; i - diff > this.last_selection["line_start"] - nbLineToScroll ; i-- ) + { + if( elem = _$('line_'+ i) ) + { + diff += Math.floor( ( elem.offsetHeight - 1 ) / this.lineHeight ); + } + } + nbLineToScroll -= diff; + + if(this.last_selection["selec_direction"]=="up"){ + for(line_nb=0; line_nb< Math.min(this.last_selection["line_start"]-nbLineToScroll, lines.length); line_nb++){ + new_pos+= lines[line_nb].length + 1; + } + char_left=Math.min(lines[Math.min(lines.length-1, line_nb)].length, this.last_selection["curr_pos"]-1); + if(shift_pressed) + length=this.last_selection["selectionEnd"]-new_pos-char_left; + this.area_select(new_pos+char_left, length); + view="top"; + }else{ + view="bottom"; + for(line_nb=0; line_nb< Math.min(this.last_selection["line_start"]+this.last_selection["line_nb"]-1-nbLineToScroll, lines.length); line_nb++){ + new_pos+= lines[line_nb].length + 1; + } + char_left=Math.min(lines[Math.min(lines.length-1, line_nb)].length, this.last_selection["curr_pos"]-1); + if(shift_pressed){ + //length=this.last_selection["selectionEnd"]-new_pos-char_left; + start= Math.min(this.last_selection["selectionStart"], new_pos+char_left); + length= Math.max(new_pos+char_left, this.last_selection["selectionStart"] )- start ; + if(new_pos+char_left < this.last_selection["selectionStart"]) + view="top"; + }else + start=new_pos+char_left; + this.area_select(start, length); + + } + } + else + { + var nbLineToScroll= Math.floor( toScrollAmount / this.lineHeight ); + // fix number of line to scroll + for( i = this.last_selection["line_start"]; i + diff < this.last_selection["line_start"] + nbLineToScroll ; i++ ) + { + if( elem = _$('line_'+ i) ) + { + diff += Math.floor( ( elem.offsetHeight - 1 ) / this.lineHeight ); + } + } + nbLineToScroll -= diff; + + if(this.last_selection["selec_direction"]=="down"){ + view="bottom"; + for(line_nb=0; line_nb< Math.min(this.last_selection["line_start"]+this.last_selection["line_nb"]-2+nbLineToScroll, lines.length); line_nb++){ + if(line_nb==this.last_selection["line_start"]-1) + char_left= this.last_selection["selectionStart"] -new_pos; + new_pos+= lines[line_nb].length + 1; + + } + if(shift_pressed){ + length=Math.abs(this.last_selection["selectionStart"]-new_pos); + length+=Math.min(lines[Math.min(lines.length-1, line_nb)].length, this.last_selection["curr_pos"]); + //length+=Math.min(lines[Math.min(lines.length-1, line_nb)].length, char_left); + this.area_select(Math.min(this.last_selection["selectionStart"], new_pos), length); + }else{ + this.area_select(new_pos+char_left, 0); + } + + }else{ + view="top"; + for(line_nb=0; line_nb< Math.min(this.last_selection["line_start"]+nbLineToScroll-1, lines.length, lines.length); line_nb++){ + if(line_nb==this.last_selection["line_start"]-1) + char_left= this.last_selection["selectionStart"] -new_pos; + new_pos+= lines[line_nb].length + 1; + } + if(shift_pressed){ + length=Math.abs(this.last_selection["selectionEnd"]-new_pos-char_left); + length+=Math.min(lines[Math.min(lines.length-1, line_nb)].length, this.last_selection["curr_pos"])- char_left-1; + //length+=Math.min(lines[Math.min(lines.length-1, line_nb)].length, char_left); + this.area_select(Math.min(this.last_selection["selectionEnd"], new_pos+char_left), length); + if(new_pos+char_left > this.last_selection["selectionEnd"]) + view="bottom"; + }else{ + this.area_select(new_pos+char_left, 0); + } + + } + } + //console.log( new_pos, char_left, length, nbLineToScroll, toScrollAmount, _$("result").clientHeigh ); + this.check_line_selection(); + this.scroll_to_view(view); + }; + + EditArea.prototype.start_resize= function(e){ + parent.editAreaLoader.resize["id"] = editArea.id; + parent.editAreaLoader.resize["start_x"] = (e)? e.pageX : event.x + document.body.scrollLeft; + parent.editAreaLoader.resize["start_y"] = (e)? e.pageY : event.y + document.body.scrollTop; + if(editArea.isIE) + { + editArea.textarea.focus(); + editArea.getIESelection(); + } + parent.editAreaLoader.resize["selectionStart"] = editArea.textarea.selectionStart; + parent.editAreaLoader.resize["selectionEnd"] = editArea.textarea.selectionEnd; + parent.editAreaLoader.start_resize_area(); + }; + + EditArea.prototype.toggle_full_screen= function(to){ + var t=this, p=parent, a=t.textarea, html, frame, selStart, selEnd, old, icon; + if(typeof(to)=="undefined") + to= !t.fullscreen['isFull']; + old = t.fullscreen['isFull']; + t.fullscreen['isFull']= to; + icon = _$("fullscreen"); + selStart = t.textarea.selectionStart; + selEnd = t.textarea.selectionEnd; + html = p.document.getElementsByTagName("html")[0]; + frame = p.document.getElementById("frame_"+t.id); + + if(to && to!=old) + { // toogle on fullscreen + + t.fullscreen['old_overflow'] = p.get_css_property(html, "overflow"); + t.fullscreen['old_height'] = p.get_css_property(html, "height"); + t.fullscreen['old_width'] = p.get_css_property(html, "width"); + t.fullscreen['old_scrollTop'] = html.scrollTop; + t.fullscreen['old_scrollLeft'] = html.scrollLeft; + t.fullscreen['old_zIndex'] = p.get_css_property(frame, "z-index"); + if(t.isOpera){ + html.style.height = "100%"; + html.style.width = "100%"; + } + html.style.overflow = "hidden"; + html.scrollTop = 0; + html.scrollLeft = 0; + + frame.style.position = "absolute"; + frame.style.width = html.clientWidth+"px"; + frame.style.height = html.clientHeight+"px"; + frame.style.display = "block"; + frame.style.zIndex = "999999"; + frame.style.top = "0px"; + frame.style.left = "0px"; + + // if the iframe was in a div with position absolute, the top and left are the one of the div, + // so I fix it by seeing at witch position the iframe start and correcting it + frame.style.top = "-"+p.calculeOffsetTop(frame)+"px"; + frame.style.left = "-"+p.calculeOffsetLeft(frame)+"px"; + + // parent.editAreaLoader.execCommand(t.id, "update_size();"); + // var body=parent.document.getElementsByTagName("body")[0]; + // body.appendChild(frame); + + t.switchClassSticky(icon, 'editAreaButtonSelected', false); + t.fullscreen['allow_resize']= t.resize_allowed; + t.allow_resize(false); + + //t.area_select(selStart, selEnd-selStart); + + + // opera can't manage to do a direct size update + if(t.isFirefox){ + p.editAreaLoader.execCommand(t.id, "update_size();"); + t.area_select(selStart, selEnd-selStart); + t.scroll_to_view(); + t.focus(); + }else{ + setTimeout("parent.editAreaLoader.execCommand('"+ t.id +"', 'update_size();');editArea.focus();", 10); + } + + + } + else if(to!=old) + { // toogle off fullscreen + frame.style.position="static"; + frame.style.zIndex= t.fullscreen['old_zIndex']; + + if(t.isOpera) + { + html.style.height = "auto"; + html.style.width = "auto"; + html.style.overflow = "auto"; + } + else if(t.isIE && p!=top) + { // IE doesn't manage html overflow in frames like in normal page... + html.style.overflow = "auto"; + } + else + { + html.style.overflow = t.fullscreen['old_overflow']; + } + html.scrollTop = t.fullscreen['old_scrollTop']; + html.scrollLeft = t.fullscreen['old_scrollLeft']; + + p.editAreaLoader.hide(t.id); + p.editAreaLoader.show(t.id); + + t.switchClassSticky(icon, 'editAreaButtonNormal', false); + if(t.fullscreen['allow_resize']) + t.allow_resize(t.fullscreen['allow_resize']); + if(t.isFirefox){ + t.area_select(selStart, selEnd-selStart); + setTimeout("editArea.scroll_to_view();", 10); + } + + //p.editAreaLoader.remove_event(p.window, "resize", editArea.update_size); + } + + }; + + EditArea.prototype.allow_resize= function(allow){ + var resize= _$("resize_area"); + if(allow){ + + resize.style.visibility="visible"; + parent.editAreaLoader.add_event(resize, "mouseup", editArea.start_resize); + }else{ + resize.style.visibility="hidden"; + parent.editAreaLoader.remove_event(resize, "mouseup", editArea.start_resize); + } + this.resize_allowed= allow; + }; + + + EditArea.prototype.change_syntax= function(new_syntax, is_waiting){ + // alert("cahnge to "+new_syntax); + // the syntax is the same + if(new_syntax==this.settings['syntax']) + return true; + + // check that the syntax is one allowed + var founded= false; + for(var i=0; i"; + elem.innerHTML= "*"+ this.files[id]['title'] + close +""; + _$('tab_browsing_list').appendChild(elem); + var elem= document.createElement('text'); + this.update_size(); + } + + // open file callback (for plugin) + if(id!="") + this.execCommand('file_open', this.files[id]); + + this.switch_to_file(id, true); + return true; + } + else + return false; + }; + + // close the given file + EditArea.prototype.close_file= function(id){ + if(this.files[id]) + { + this.save_file(id); + + // close file callback + if(this.execCommand('file_close', this.files[id])!==false) + { + // remove the tab in the toolbar + var li= _$(this.files[id]['html_id']); + li.parentNode.removeChild(li); + // select a new file + if(id== this.curr_file) + { + var next_file= ""; + var is_next= false; + for(var i in this.files) + { + if( is_next ) + { + next_file = i; + break; + } + else if( i == id ) + is_next = true; + else + next_file = i; + } + // display the next file + this.switch_to_file(next_file); + } + // clear datas + delete (this.files[id]); + this.update_size(); + } + } + }; + + // backup current file datas + EditArea.prototype.save_file= function(id){ + var t= this, save, a_links, a_selects, save_butt, img, i; + if(t.files[id]) + { + var save= t.files[id]; + save['last_selection'] = t.last_selection; + save['last_text_to_highlight'] = t.last_text_to_highlight; + save['last_hightlighted_text'] = t.last_hightlighted_text; + save['previous'] = t.previous; + save['next'] = t.next; + save['last_undo'] = t.last_undo; + save['smooth_selection'] = t.smooth_selection; + save['do_highlight'] = t.do_highlight; + save['syntax'] = t.settings['syntax']; + save['text'] = t.textarea.value; + save['scroll_top'] = t.result.scrollTop; + save['scroll_left'] = t.result.scrollLeft; + save['selection_start'] = t.last_selection["selectionStart"]; + save['selection_end'] = t.last_selection["selectionEnd"]; + save['font_size'] = t.settings["font_size"]; + save['font_family'] = t.settings["font_family"]; + save['word_wrap'] = t.settings["word_wrap"]; + save['toolbar'] = {'links':{}, 'selects': {}}; + + // save toolbar buttons state for fileSpecific buttons + a_links= _$("toolbar_1").getElementsByTagName("a"); + for( i=0; i