Version Description
Download this release
Release Info
| Developer | ashokrane |
| Plugin | |
| Version | 1.8 |
| Comparing to | |
| See all releases | |
Code changes from version 1.6 to 1.8
- cron/send_email.php +24 -25
- images/handbag.jpg +0 -0
- images/shoes.jpg +0 -0
- js/jquery.tipTip.minified.js +20 -20
- js/tinymce/changelog.txt +477 -477
- js/tinymce/examples/accessibility.html +10 -10
- js/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin_src.js +184 -184
- js/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js +119 -119
- js/tinymce/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js +1 -1
- js/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin_src.js +50 -50
- js/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css +90 -90
- js/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js +2 -2
- js/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin_src.js +955 -955
- js/tinymce/jscripts/tiny_mce/plugins/media/langs/en_dlg.js +1 -1
- js/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js +52 -52
- js/tinymce/jscripts/tiny_mce/plugins/style/langs/en_dlg.js +1 -1
- js/tinymce/jscripts/tiny_mce/plugins/style/props.htm +845 -845
- js/tinymce/jscripts/tiny_mce/plugins/style/readme.txt +19 -19
- js/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js +122 -122
- js/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js +1456 -1456
- js/tinymce/jscripts/tiny_mce/plugins/table/js/table.js +3 -3
- js/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js +345 -345
- js/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js +1 -1
- js/tinymce/jscripts/tiny_mce/tiny_mce_popup.js +4 -4
- languages/messages.pot +98 -48
- languages/woocommerce-ac.mo +0 -0
- languages/woocommerce-ac.po +99 -49
- readme.txt +3 -14
- woo-includes/class-wc-dependencies.php +29 -29
- woo-includes/woo-functions.php +96 -96
- woocommerce-ac.php +186 -161
cron/send_email.php
CHANGED
|
@@ -1,6 +1,5 @@
|
|
| 1 |
<?php
|
| 2 |
|
| 3 |
-
//require_once('../../../../wp-load.php');
|
| 4 |
require_once( ABSPATH . 'wp-load.php' );
|
| 5 |
//if (is_woocommerce_active())
|
| 6 |
{
|
|
@@ -32,10 +31,7 @@ require_once( ABSPATH . 'wp-load.php' );
|
|
| 32 |
*/
|
| 33 |
function woocommerce_ac_send_email() {
|
| 34 |
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
//$cart_abandon_cut_off_time_cron = ($cart_settings[0]->cart_time) * 60;
|
| 38 |
-
|
| 39 |
{
|
| 40 |
|
| 41 |
global $wpdb, $woocommerce;
|
|
@@ -109,16 +105,16 @@ require_once( ABSPATH . 'wp-load.php' );
|
|
| 109 |
|
| 110 |
$var = '';
|
| 111 |
if( preg_match( "{{products.cart}}", $email_body, $matched ) ) {
|
| 112 |
-
$var = '
|
| 113 |
-
|
| 114 |
-
<table border="0" cellpadding="10" cellspacing="0" class="templateDataTable">
|
| 115 |
<tr>
|
| 116 |
-
<th> Item </th>
|
| 117 |
-
<th> Name </th>
|
| 118 |
-
<th> Quantity </th>
|
| 119 |
-
<th> Price </th>
|
| 120 |
-
<th> Line Subtotal </th>
|
| 121 |
-
</tr>';
|
|
|
|
| 122 |
$cart_details = $cart_info_db_field->cart;
|
| 123 |
$cart_total = $item_subtotal = $item_total = 0;
|
| 124 |
$sub_line_prod_name = '';
|
|
@@ -145,35 +141,38 @@ require_once( ABSPATH . 'wp-load.php' );
|
|
| 145 |
$item_subtotal = number_format( $item_subtotal, 2 );
|
| 146 |
$product = get_product( $product_id );
|
| 147 |
$prod_image = $product->get_image();
|
| 148 |
-
$
|
| 149 |
-
|
| 150 |
-
<td> <a href="'.$product_link_track.'">'
|
|
|
|
| 151 |
<td> '.$quantity_total.'</td>
|
| 152 |
-
<td> '.get_woocommerce_currency_symbol()."
|
| 153 |
-
<td> '.get_woocommerce_currency_symbol()."
|
| 154 |
</tr>';
|
| 155 |
$cart_total += $item_total;
|
| 156 |
$item_subtotal = $item_total = 0;
|
| 157 |
}
|
| 158 |
$cart_total = number_format( $cart_total, 2 );
|
| 159 |
-
$var .= '<tr>
|
| 160 |
<td> </td>
|
| 161 |
<td> </td>
|
| 162 |
<td> </td>
|
| 163 |
-
<td> Cart Total
|
| 164 |
-
<td> '.get_woocommerce_currency_symbol()."
|
| 165 |
</tr>';
|
| 166 |
$var .= '</table>
|
| 167 |
';
|
| 168 |
$email_body = str_replace( "{{products.cart}}", $var, $email_body );
|
| 169 |
-
$email_subject = str_replace( "{{product.name}}", $sub_line_prod_name, $email_subject );
|
| 170 |
}
|
| 171 |
|
| 172 |
$user_email = $value->user_email;
|
| 173 |
|
| 174 |
//echo $email_body."<hr>";
|
|
|
|
|
|
|
|
|
|
| 175 |
|
| 176 |
-
wp_mail( $user_email, $email_subject, $email_body, $headers );
|
| 177 |
|
| 178 |
}
|
| 179 |
|
|
@@ -196,7 +195,7 @@ require_once( ABSPATH . 'wp-load.php' );
|
|
| 196 |
|
| 197 |
$query = "SELECT wpac . * , wpu.user_login, wpu.user_email
|
| 198 |
FROM `".$wpdb->prefix."ac_abandoned_cart_history_lite` AS wpac
|
| 199 |
-
LEFT JOIN ".$wpdb->
|
| 200 |
WHERE cart_ignored = '0'
|
| 201 |
AND abandoned_cart_time < $cart_time
|
| 202 |
ORDER BY `id` ASC ";
|
| 1 |
<?php
|
| 2 |
|
|
|
|
| 3 |
require_once( ABSPATH . 'wp-load.php' );
|
| 4 |
//if (is_woocommerce_active())
|
| 5 |
{
|
| 31 |
*/
|
| 32 |
function woocommerce_ac_send_email() {
|
| 33 |
|
| 34 |
+
|
|
|
|
|
|
|
|
|
|
| 35 |
{
|
| 36 |
|
| 37 |
global $wpdb, $woocommerce;
|
| 105 |
|
| 106 |
$var = '';
|
| 107 |
if( preg_match( "{{products.cart}}", $email_body, $matched ) ) {
|
| 108 |
+
$var = '<h3>'.__( "Your Shopping Cart", "woocommerce-ac" ).'</h3>
|
| 109 |
+
<table border="0" cellpadding="10" cellspacing="0" class="templateDataTable">
|
|
|
|
| 110 |
<tr>
|
| 111 |
+
<th>'.__( "Item", "woocommerce-ac" ).'</th>
|
| 112 |
+
<th>'.__( "Name", "woocommerce-ac" ).'</th>
|
| 113 |
+
<th>'.__( "Quantity", "woocommerce-ac" ).'</th>
|
| 114 |
+
<th>'.__( "Price", "woocommerce-ac" ).'</th>
|
| 115 |
+
<th>'.__( "Line Subtotal", "woocommerce-ac" ).'</th>
|
| 116 |
+
</tr>';
|
| 117 |
+
|
| 118 |
$cart_details = $cart_info_db_field->cart;
|
| 119 |
$cart_total = $item_subtotal = $item_total = 0;
|
| 120 |
$sub_line_prod_name = '';
|
| 141 |
$item_subtotal = number_format( $item_subtotal, 2 );
|
| 142 |
$product = get_product( $product_id );
|
| 143 |
$prod_image = $product->get_image();
|
| 144 |
+
$image_url = wp_get_attachment_url( get_post_thumbnail_id($product_id) );
|
| 145 |
+
$var .='<tr align="center">
|
| 146 |
+
<td> <a href="'.$product_link_track.'"> <img src="' . $image_url . '" alt="" height="42" width="42" /> </a></td>
|
| 147 |
+
<td> <a href="'.$product_link_track.'">'.__($product_name, "woocommerce-ac").'</a></td>
|
| 148 |
<td> '.$quantity_total.'</td>
|
| 149 |
+
<td> '.get_woocommerce_currency_symbol()."".$item_subtotal.'</td>
|
| 150 |
+
<td> '.get_woocommerce_currency_symbol()."".$item_total_display.'</td>
|
| 151 |
</tr>';
|
| 152 |
$cart_total += $item_total;
|
| 153 |
$item_subtotal = $item_total = 0;
|
| 154 |
}
|
| 155 |
$cart_total = number_format( $cart_total, 2 );
|
| 156 |
+
$var .= '<tr align="center">
|
| 157 |
<td> </td>
|
| 158 |
<td> </td>
|
| 159 |
<td> </td>
|
| 160 |
+
<td>'.__( "Cart Total:", "woocommerce-ac" ).'</td>
|
| 161 |
+
<td> '.get_woocommerce_currency_symbol()."".$cart_total.'</td>
|
| 162 |
</tr>';
|
| 163 |
$var .= '</table>
|
| 164 |
';
|
| 165 |
$email_body = str_replace( "{{products.cart}}", $var, $email_body );
|
| 166 |
+
$email_subject = str_replace( "{{product.name}}", __( $sub_line_prod_name, "woocommerce-ac" ), $email_subject );
|
| 167 |
}
|
| 168 |
|
| 169 |
$user_email = $value->user_email;
|
| 170 |
|
| 171 |
//echo $email_body."<hr>";
|
| 172 |
+
$email_body_final = stripslashes($email_body);
|
| 173 |
+
wp_mail( $user_email, $email_subject, __( $email_body_final, 'woocommerce-ac' ), $headers );
|
| 174 |
+
|
| 175 |
|
|
|
|
| 176 |
|
| 177 |
}
|
| 178 |
|
| 195 |
|
| 196 |
$query = "SELECT wpac . * , wpu.user_login, wpu.user_email
|
| 197 |
FROM `".$wpdb->prefix."ac_abandoned_cart_history_lite` AS wpac
|
| 198 |
+
LEFT JOIN ".$wpdb->base_prefix."users AS wpu ON wpac.user_id = wpu.id
|
| 199 |
WHERE cart_ignored = '0'
|
| 200 |
AND abandoned_cart_time < $cart_time
|
| 201 |
ORDER BY `id` ASC ";
|
images/handbag.jpg
ADDED
|
Binary file
|
images/shoes.jpg
ADDED
|
Binary file
|
js/jquery.tipTip.minified.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
| 1 |
-
/*
|
| 2 |
-
* TipTip
|
| 3 |
-
* Copyright 2010 Drew Wilson
|
| 4 |
-
* www.drewwilson.com
|
| 5 |
-
* code.drewwilson.com/entry/tiptip-jquery-plugin
|
| 6 |
-
*
|
| 7 |
-
* Version 1.3 - Updated: Mar. 23, 2010
|
| 8 |
-
*
|
| 9 |
-
* This Plug-In will create a custom tooltip to replace the default
|
| 10 |
-
* browser tooltip. It is extremely lightweight and very smart in
|
| 11 |
-
* that it detects the edges of the browser window and will make sure
|
| 12 |
-
* the tooltip stays within the current window size. As a result the
|
| 13 |
-
* tooltip will adjust itself to be displayed above, below, to the left
|
| 14 |
-
* or to the right depending on what is necessary to stay within the
|
| 15 |
-
* browser window. It is completely customizable as well via CSS.
|
| 16 |
-
*
|
| 17 |
-
* This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses:
|
| 18 |
-
* http://www.opensource.org/licenses/mit-license.php
|
| 19 |
-
* http://www.gnu.org/licenses/gpl.html
|
| 20 |
-
*/
|
| 21 |
(function($){$.fn.tipTip=function(options){var defaults={activation:"hover",keepAlive:false,maxWidth:"200px",edgeOffset:3,defaultPosition:"bottom",delay:400,fadeIn:200,fadeOut:200,attribute:"title",content:false,enter:function(){},exit:function(){}};var opts=$.extend(defaults,options);if($("#tiptip_holder").length<=0){var tiptip_holder=$('<div id="tiptip_holder" style="max-width:'+opts.maxWidth+';"></div>');var tiptip_content=$('<div id="tiptip_content"></div>');var tiptip_arrow=$('<div id="tiptip_arrow"></div>');$("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id="tiptip_arrow_inner"></div>')))}else{var tiptip_holder=$("#tiptip_holder");var tiptip_content=$("#tiptip_content");var tiptip_arrow=$("#tiptip_arrow")}return this.each(function(){var org_elem=$(this);if(opts.content){var org_title=opts.content}else{var org_title=org_elem.attr(opts.attribute)}if(org_title!=""){if(!opts.content){org_elem.removeAttr(opts.attribute)}var timeout=false;if(opts.activation=="hover"){org_elem.hover(function(){active_tiptip()},function(){if(!opts.keepAlive){deactive_tiptip()}});if(opts.keepAlive){tiptip_holder.hover(function(){},function(){deactive_tiptip()})}}else if(opts.activation=="focus"){org_elem.focus(function(){active_tiptip()}).blur(function(){deactive_tiptip()})}else if(opts.activation=="click"){org_elem.click(function(){active_tiptip();return false}).hover(function(){},function(){if(!opts.keepAlive){deactive_tiptip()}});if(opts.keepAlive){tiptip_holder.hover(function(){},function(){deactive_tiptip()})}}function active_tiptip(){opts.enter.call(this);tiptip_content.html(org_title);tiptip_holder.hide().removeAttr("class").css("margin","0");tiptip_arrow.removeAttr("style");var top=parseInt(org_elem.offset()['top']);var left=parseInt(org_elem.offset()['left']);var org_width=parseInt(org_elem.outerWidth());var org_height=parseInt(org_elem.outerHeight());var tip_w=tiptip_holder.outerWidth();var tip_h=tiptip_holder.outerHeight();var w_compare=Math.round((org_width-tip_w)/2);var h_compare=Math.round((org_height-tip_h)/2);var marg_left=Math.round(left+w_compare);var marg_top=Math.round(top+org_height+opts.edgeOffset);var t_class="";var arrow_top="";var arrow_left=Math.round(tip_w-12)/2;if(opts.defaultPosition=="bottom"){t_class="_bottom"}else if(opts.defaultPosition=="top"){t_class="_top"}else if(opts.defaultPosition=="left"){t_class="_left"}else if(opts.defaultPosition=="right"){t_class="_right"}var right_compare=(w_compare+left)<parseInt($(window).scrollLeft());var left_compare=(tip_w+left)>parseInt($(window).width());if((right_compare&&w_compare<0)||(t_class=="_right"&&!left_compare)||(t_class=="_left"&&left<(tip_w+opts.edgeOffset+5))){t_class="_right";arrow_top=Math.round(tip_h-13)/2;arrow_left=-12;marg_left=Math.round(left+org_width+opts.edgeOffset);marg_top=Math.round(top+h_compare)}else if((left_compare&&w_compare<0)||(t_class=="_left"&&!right_compare)){t_class="_left";arrow_top=Math.round(tip_h-13)/2;arrow_left=Math.round(tip_w);marg_left=Math.round(left-(tip_w+opts.edgeOffset+5));marg_top=Math.round(top+h_compare)}var top_compare=(top+org_height+opts.edgeOffset+tip_h+8)>parseInt($(window).height()+$(window).scrollTop());var bottom_compare=((top+org_height)-(opts.edgeOffset+tip_h+8))<0;if(top_compare||(t_class=="_bottom"&&top_compare)||(t_class=="_top"&&!bottom_compare)){if(t_class=="_top"||t_class=="_bottom"){t_class="_top"}else{t_class=t_class+"_top"}arrow_top=tip_h;marg_top=Math.round(top-(tip_h+5+opts.edgeOffset))}else if(bottom_compare|(t_class=="_top"&&bottom_compare)||(t_class=="_bottom"&&!top_compare)){if(t_class=="_top"||t_class=="_bottom"){t_class="_bottom"}else{t_class=t_class+"_bottom"}arrow_top=-12;marg_top=Math.round(top+org_height+opts.edgeOffset)}if(t_class=="_right_top"||t_class=="_left_top"){marg_top=marg_top+5}else if(t_class=="_right_bottom"||t_class=="_left_bottom"){marg_top=marg_top-5}if(t_class=="_left_top"||t_class=="_left_bottom"){marg_left=marg_left+5}tiptip_arrow.css({"margin-left":arrow_left+"px","margin-top":arrow_top+"px"});tiptip_holder.css({"margin-left":marg_left+"px","margin-top":marg_top+"px"}).attr("class","tip"+t_class);if(timeout){clearTimeout(timeout)}timeout=setTimeout(function(){tiptip_holder.stop(true,true).fadeIn(opts.fadeIn)},opts.delay)}function deactive_tiptip(){opts.exit.call(this);if(timeout){clearTimeout(timeout)}tiptip_holder.fadeOut(opts.fadeOut)}}})}})(jQuery);
|
| 1 |
+
/*
|
| 2 |
+
* TipTip
|
| 3 |
+
* Copyright 2010 Drew Wilson
|
| 4 |
+
* www.drewwilson.com
|
| 5 |
+
* code.drewwilson.com/entry/tiptip-jquery-plugin
|
| 6 |
+
*
|
| 7 |
+
* Version 1.3 - Updated: Mar. 23, 2010
|
| 8 |
+
*
|
| 9 |
+
* This Plug-In will create a custom tooltip to replace the default
|
| 10 |
+
* browser tooltip. It is extremely lightweight and very smart in
|
| 11 |
+
* that it detects the edges of the browser window and will make sure
|
| 12 |
+
* the tooltip stays within the current window size. As a result the
|
| 13 |
+
* tooltip will adjust itself to be displayed above, below, to the left
|
| 14 |
+
* or to the right depending on what is necessary to stay within the
|
| 15 |
+
* browser window. It is completely customizable as well via CSS.
|
| 16 |
+
*
|
| 17 |
+
* This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses:
|
| 18 |
+
* http://www.opensource.org/licenses/mit-license.php
|
| 19 |
+
* http://www.gnu.org/licenses/gpl.html
|
| 20 |
+
*/
|
| 21 |
(function($){$.fn.tipTip=function(options){var defaults={activation:"hover",keepAlive:false,maxWidth:"200px",edgeOffset:3,defaultPosition:"bottom",delay:400,fadeIn:200,fadeOut:200,attribute:"title",content:false,enter:function(){},exit:function(){}};var opts=$.extend(defaults,options);if($("#tiptip_holder").length<=0){var tiptip_holder=$('<div id="tiptip_holder" style="max-width:'+opts.maxWidth+';"></div>');var tiptip_content=$('<div id="tiptip_content"></div>');var tiptip_arrow=$('<div id="tiptip_arrow"></div>');$("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id="tiptip_arrow_inner"></div>')))}else{var tiptip_holder=$("#tiptip_holder");var tiptip_content=$("#tiptip_content");var tiptip_arrow=$("#tiptip_arrow")}return this.each(function(){var org_elem=$(this);if(opts.content){var org_title=opts.content}else{var org_title=org_elem.attr(opts.attribute)}if(org_title!=""){if(!opts.content){org_elem.removeAttr(opts.attribute)}var timeout=false;if(opts.activation=="hover"){org_elem.hover(function(){active_tiptip()},function(){if(!opts.keepAlive){deactive_tiptip()}});if(opts.keepAlive){tiptip_holder.hover(function(){},function(){deactive_tiptip()})}}else if(opts.activation=="focus"){org_elem.focus(function(){active_tiptip()}).blur(function(){deactive_tiptip()})}else if(opts.activation=="click"){org_elem.click(function(){active_tiptip();return false}).hover(function(){},function(){if(!opts.keepAlive){deactive_tiptip()}});if(opts.keepAlive){tiptip_holder.hover(function(){},function(){deactive_tiptip()})}}function active_tiptip(){opts.enter.call(this);tiptip_content.html(org_title);tiptip_holder.hide().removeAttr("class").css("margin","0");tiptip_arrow.removeAttr("style");var top=parseInt(org_elem.offset()['top']);var left=parseInt(org_elem.offset()['left']);var org_width=parseInt(org_elem.outerWidth());var org_height=parseInt(org_elem.outerHeight());var tip_w=tiptip_holder.outerWidth();var tip_h=tiptip_holder.outerHeight();var w_compare=Math.round((org_width-tip_w)/2);var h_compare=Math.round((org_height-tip_h)/2);var marg_left=Math.round(left+w_compare);var marg_top=Math.round(top+org_height+opts.edgeOffset);var t_class="";var arrow_top="";var arrow_left=Math.round(tip_w-12)/2;if(opts.defaultPosition=="bottom"){t_class="_bottom"}else if(opts.defaultPosition=="top"){t_class="_top"}else if(opts.defaultPosition=="left"){t_class="_left"}else if(opts.defaultPosition=="right"){t_class="_right"}var right_compare=(w_compare+left)<parseInt($(window).scrollLeft());var left_compare=(tip_w+left)>parseInt($(window).width());if((right_compare&&w_compare<0)||(t_class=="_right"&&!left_compare)||(t_class=="_left"&&left<(tip_w+opts.edgeOffset+5))){t_class="_right";arrow_top=Math.round(tip_h-13)/2;arrow_left=-12;marg_left=Math.round(left+org_width+opts.edgeOffset);marg_top=Math.round(top+h_compare)}else if((left_compare&&w_compare<0)||(t_class=="_left"&&!right_compare)){t_class="_left";arrow_top=Math.round(tip_h-13)/2;arrow_left=Math.round(tip_w);marg_left=Math.round(left-(tip_w+opts.edgeOffset+5));marg_top=Math.round(top+h_compare)}var top_compare=(top+org_height+opts.edgeOffset+tip_h+8)>parseInt($(window).height()+$(window).scrollTop());var bottom_compare=((top+org_height)-(opts.edgeOffset+tip_h+8))<0;if(top_compare||(t_class=="_bottom"&&top_compare)||(t_class=="_top"&&!bottom_compare)){if(t_class=="_top"||t_class=="_bottom"){t_class="_top"}else{t_class=t_class+"_top"}arrow_top=tip_h;marg_top=Math.round(top-(tip_h+5+opts.edgeOffset))}else if(bottom_compare|(t_class=="_top"&&bottom_compare)||(t_class=="_bottom"&&!top_compare)){if(t_class=="_top"||t_class=="_bottom"){t_class="_bottom"}else{t_class=t_class+"_bottom"}arrow_top=-12;marg_top=Math.round(top+org_height+opts.edgeOffset)}if(t_class=="_right_top"||t_class=="_left_top"){marg_top=marg_top+5}else if(t_class=="_right_bottom"||t_class=="_left_bottom"){marg_top=marg_top-5}if(t_class=="_left_top"||t_class=="_left_bottom"){marg_left=marg_left+5}tiptip_arrow.css({"margin-left":arrow_left+"px","margin-top":arrow_top+"px"});tiptip_holder.css({"margin-left":marg_left+"px","margin-top":marg_top+"px"}).attr("class","tip"+t_class);if(timeout){clearTimeout(timeout)}timeout=setTimeout(function(){tiptip_holder.stop(true,true).fadeIn(opts.fadeIn)},opts.delay)}function deactive_tiptip(){opts.exit.call(this);if(timeout){clearTimeout(timeout)}tiptip_holder.fadeOut(opts.fadeOut)}}})}})(jQuery);
|
js/tinymce/changelog.txt
CHANGED
|
@@ -1,477 +1,477 @@
|
|
| 1 |
-
Version 3.5.8 (2012-11-20)
|
| 2 |
-
Fixed bug where html5 data attributes where stripped from contents.
|
| 3 |
-
Fixed bug where toolbar was annouced multiple times with JAWS on Firefox.
|
| 4 |
-
Fixed bug where the editor view whouldn't scroll to BR elements when using shift+enter or br enter mode.
|
| 5 |
-
Fixed bug where a JS error would be thrown when trying to paste table rows then the rows clipboard was empty.
|
| 6 |
-
Fixed bug with auto detection logic for youtube urls in the media plugin.
|
| 7 |
-
Fixed bug where the formatter would throw errors if you used the jQuery version of TinyMCE and the latest jQuery.
|
| 8 |
-
Fixed bug where the latest WebKit versions would produce span elements when deleting text between blocks.
|
| 9 |
-
Fixed bug where the autolink plugin would produce DOM exceptions when pressing shift+enter inside a block element.
|
| 10 |
-
Fixed bug where toggling of blockquotes when using br enter mode would produce an exception.
|
| 11 |
-
Fixed bug where focusing out of the body of the editor wouldn't properly add an undo level.
|
| 12 |
-
Fixed issue with warning message being displayed on IE 9+ about the meta header fix for IE 8.
|
| 13 |
-
Version 3.5.7 (2012-09-20)
|
| 14 |
-
Changed table row properties dialog to not update multiple rows when row type is header or footer.
|
| 15 |
-
Fixed bug in hyperlink dialog for IE9 where links with no target attr set had target value of --
|
| 16 |
-
Changing toolbars to have a toolbar role for FF keyboard navigation works correctly.
|
| 17 |
-
Fixed bug where applying formatting to an empty block element would produce redundant spans.
|
| 18 |
-
Fixed bug where caret formatting on IE wouldn't properly apply if you pressed enter/return.
|
| 19 |
-
Fixed bug where loading TinyMCE using an async script wouldn't properly initialize editors.
|
| 20 |
-
Fixed bug where some white space would be removed after inline elements before block elements.
|
| 21 |
-
Fixed bug where it wouldn't properly parse attributes with a single backslash as it's contents.
|
| 22 |
-
Fixed bug where noscript elements would loose it's contents on older IE versions.
|
| 23 |
-
Fixed bug where backspace inside empty blockquote wouldn't delete it properly.
|
| 24 |
-
Fixed bug where custom elements with . in their names wouldn't work properly.
|
| 25 |
-
Fixed bug where the custom_elements option didn't properly setup the block elements schema structure.
|
| 26 |
-
Fixed bug where the custom_elements option didn't auto populate the extended_valid_elements.
|
| 27 |
-
Fixed bug where the whole TD element would get blcok formatted when there where BR elements in it.
|
| 28 |
-
Fixed bug where IE 9 might crash if the editor was hidden and specific styles where applied to surrounding contents.
|
| 29 |
-
Fixed bug where shift+enter inside a table cell on Gecko would produce an zero width non breaking space between tr:s.
|
| 30 |
-
Fixed bug where the advlink dialog wouldn't properly populate the anchors dropdown if the HTML5 schema was used.
|
| 31 |
-
Fixed issue with missing autofocus attribute on input element when using the HTML5 schema.
|
| 32 |
-
Fixed issue where enter inside a block contained within an LI element wouldn't produce a new LI.
|
| 33 |
-
Version 3.5.6 (2012-07-26)
|
| 34 |
-
Added "text" as a valid option to the editor.getContent format option. Makes it easier to get a text representation of the editor contents.
|
| 35 |
-
Fixed bug where resizing an image to less that 0x0 pixels would display the ghost image at an incorrect position.
|
| 36 |
-
Fixed bug where the remove format button would produce extra paragraphs on WebKit if all of the contents was selected.
|
| 37 |
-
Fixed issue where edge resize handles on images of wouldn't scale it with the same aspect ratio.
|
| 38 |
-
Fixed so force_p_newlines option works again since some users want mixed mode paragraphs.
|
| 39 |
-
Fixed so directionality plugin modifies the dir attribute of all selected blocks in the editor.
|
| 40 |
-
Fixed bug where backspace/delete of a custom element would move it's attributes to the parent block on Gecko.
|
| 41 |
-
Version 3.5.5 (2012-07-19)
|
| 42 |
-
Added full resize support for images and tables on WebKit/Opera. It now behaves just like Gecko.
|
| 43 |
-
Added automatic embed support for Vimeo, Stream.cz and Google Maps in media plugin. Patch contributed by Jakub Matas.
|
| 44 |
-
Fixed bug where the lists plugin wouldn't properly remove all li elements when toggling selected items of. Patched by Taku AMANO.
|
| 45 |
-
Fixed bug where the lists plugin would remove the entire list if you pressed deleted at the beginning of the first element. Patched by Taku AMANO.
|
| 46 |
-
Fixed bug where the ordered/unordered list buttons could both be enabled if you nested lists. Patch contributed by Craig Petchell.
|
| 47 |
-
Fixed bug where shift+enter wouldn't produce a BR in a LI when having forced_root_blocks set to false.
|
| 48 |
-
Fixed bug where scrollbars aren't visible in fullscreen when window is resized.
|
| 49 |
-
Fixed bug with updating the border size using the advimage dialog on IE 9.
|
| 50 |
-
Fixed bug where the selection of inner elements on IE 8 in contentEditable mode would select the whole parent element.
|
| 51 |
-
Fixed bug where the enter key would produce an empty anchor if you pressed it at the space after a link on IE.
|
| 52 |
-
Fixed bug where autolink plugin would produce an exception for specific html see bug #5365
|
| 53 |
-
Fixed so the formatChanged function takes an optional "similar" parameter to use while matching the format.
|
| 54 |
-
Version 3.5.4.1 (2012-06-24)
|
| 55 |
-
Fixed issue with Shift+A selecting all contents on Chrome.
|
| 56 |
-
Version 3.5.4 (2012-06-21)
|
| 57 |
-
Added missing mouse events to HTML5 schema. Some events needs to be manually defined though since the spec is huge.
|
| 58 |
-
Added image resizing for WebKit browsers by faking the whole resize behavior.
|
| 59 |
-
Fixed bug in context menu plugin where listener to hide menu wasn't removed correctly.
|
| 60 |
-
Fixed bug where media plugin wouldn't use placeholder size for the object/video elements.
|
| 61 |
-
Fixed bug where jQuery plugin would break attr function in jQuery 1.7.2.
|
| 62 |
-
Fixed bug where jQuery plugin would throw an error if you used the tinymce pseudo selector when TinyMCE wasn't loaded.
|
| 63 |
-
Fixed so encoding option gets applied when using jQuery val() or attr() to extract the contents.
|
| 64 |
-
Fixed so any non valid width/height passed to media plugin would get parsed to proper integer or percent values.
|
| 65 |
-
Version 3.5.3 (2012-06-19)
|
| 66 |
-
Added missing wbr element to HTML5 schema.
|
| 67 |
-
Added new mceToggleFormat command. Enabled you to toggle a specific format on/off.
|
| 68 |
-
Fixed bug where undo/redo state didn't update correctly after executing an execCommand call.
|
| 69 |
-
Fixed bug where the editor would get auto focused on IE running in quirks mode.
|
| 70 |
-
Fixed bug where pressing enter before an IMG or INPUT element wouldn't properly split the block.
|
| 71 |
-
Fixed bug where backspace would navigate back when selecting control types on IE.
|
| 72 |
-
Fixed bug where the editor remove method would unbind events for controls outside the editor instance UI.
|
| 73 |
-
Fixed bug where the autosave plugin would try to store a draft copy of editors that where removed.
|
| 74 |
-
Fixed bug where floated elements wouldn't expand the block created when pressing enter on non IE browsers.
|
| 75 |
-
Fixed bug where the caret would be placed in the wrong location when pressing enter at the beginning of a block.
|
| 76 |
-
Fixed bug where it wasn't possible to block events using the handle_event_callback option.
|
| 77 |
-
Fixed bug where keyboard navigation of the ColorSplitButton.js didn't work correctly.
|
| 78 |
-
Fixed bug where keyboard navigation didn't work correctly on split buttons.
|
| 79 |
-
Fixed bug where the legacy Event.add function didn't properly handle multiple id:s passed in.
|
| 80 |
-
Fixed bug where the caret would disappear on IE when selecting all contents and pressing backspace/delete.
|
| 81 |
-
Fixed bug where the getStart/getEnd methods would sometimes return elements from the wrong document on IE.
|
| 82 |
-
Fixed so paragraphs gets created if you press enter inside a form element.
|
| 83 |
-
Version 3.5.2 (2012-05-31)
|
| 84 |
-
Added new formatChanged method to tinymce.Formatter class. Enables easier state change handling of formats.
|
| 85 |
-
Added new selectorChanged method to tinymce.dom.Selection class. Enables easier state change handling of matching CSS selectors.
|
| 86 |
-
Changed the default theme to be advanced instead of simple since most users uses the advanced theme.
|
| 87 |
-
Changed so the theme_advanced_buttons doesn't have a default set if one button row is specified.
|
| 88 |
-
Changed the theme_advanced_toolbar_align default value to "left".
|
| 89 |
-
Changed the theme_advanced_toolbar_location default value to "top".
|
| 90 |
-
Changed the theme_advanced_statusbar_location default value to "bottom".
|
| 91 |
-
Fixed bug where the simple link dialog would remove class and target attributes from links when updating them if the drop downs wasn't visible.
|
| 92 |
-
Fixed bug where the link/unlink buttons wouldn't get disabled once a link was created by the autolink plugin logic.
|
| 93 |
-
Fixed bug where the border attribute was missing in the HTML5 schema.
|
| 94 |
-
Fixed bug where the legacyoutput plugin would use inline styles for font color.
|
| 95 |
-
Fixed bug where editing of anchor names wouldn't produce an undo level.
|
| 96 |
-
Fixed bug where the table plugin would delete the last empty block element in the editor.
|
| 97 |
-
Fixed bug where pasting table rows when they where selected would make it impossible to editor that table row.
|
| 98 |
-
Fixed bug with pressing enter in IE while having a select list focused would produce a JS error.
|
| 99 |
-
Fixed bug where it wasn't possible to merge table cells by selecting them and using merge from context menu.
|
| 100 |
-
Removed summary from HTML5 table attributes and fixed so this and other deprecated table fields gets hidden in the table dialog.
|
| 101 |
-
Version 3.5.1.1 (2012-05-25)
|
| 102 |
-
Fixed bug with control creation where plugin specific controls didn't work as expected.
|
| 103 |
-
Version 3.5.1 (2012-05-25)
|
| 104 |
-
Added new onBeforeAdd event to UndoManager patch contributed by Dan Rumney.
|
| 105 |
-
Added support for overriding the theme rendering logic by using a custom function.
|
| 106 |
-
Fixed bug where links wasn't automatically created by the autolink plugin on old IE versions when pressing enter in BR mode.
|
| 107 |
-
Fixed bug where enter on older IE versions wouldn't produce a new paragraph if the previous sibling paragraph was empty.
|
| 108 |
-
Fixed bug where toString on a faked DOM range on older IE versions wouldn't return a proper string.
|
| 109 |
-
Fixed bug where named anchors wouldn't work properly when schema was set to HTML5.
|
| 110 |
-
Fixed bug where HTML5 datalist options wasn't correctly parsed or indented.
|
| 111 |
-
Fixed bug where linking would add anchors around block elements when the HTML5 schema was used.
|
| 112 |
-
Fixed issue where the autolink plugin wouldn't properly handle mailto:user@domain.com.
|
| 113 |
-
Optimized initialization and reduced rendering flicker by hiding the target element while initializing.
|
| 114 |
-
Version 3.5.0.1 (2012-05-10)
|
| 115 |
-
Fixed bug where selection normalization logic would break the selections of parent elements using the element path.
|
| 116 |
-
Fixed bug where the autolink plugin would include trailing dots in domain names in the link creation.
|
| 117 |
-
Fixed bug where the autolink plugin would produce an error on older IE versions when pressing enter.
|
| 118 |
-
Fixed bug where old IE versions would throw an error during initialization when the editor was placed in an size restricted div.
|
| 119 |
-
Version 3.5 (2012-05-03)
|
| 120 |
-
Fixed menu rendering issue if the document was in rtl mode.
|
| 121 |
-
Fixed bug where the hide function would throw an error about a missing variable.
|
| 122 |
-
Fixed bug where autolink wouldn't convert URLs when hitting enter on IE due to the new enter key logic.
|
| 123 |
-
Fixed bug where formatting using shortcuts like ctrl+b wouldn't work properly the first time.
|
| 124 |
-
Fixed bug where selection.setContent after a formatter call wouldn't generate formatted contents.
|
| 125 |
-
Fixed bug where whitespace would be removed before/after invalid_elements when they where removed.
|
| 126 |
-
Fixed bug where updating styles using the theme image dialog in non inline mode on IE9 would produce errors.
|
| 127 |
-
Fixed bug where IE 8 would produce an error when using the contextmenu plugin.
|
| 128 |
-
Fixed bug where delete/backspace could remove contents of noneditable elements.
|
| 129 |
-
Fixed so background color in style preview gets computed from body element if the current style element is transparent.
|
| 130 |
-
Version 3.5b3 (2012-03-29)
|
| 131 |
-
Added cancel button to colour picker dialog.
|
| 132 |
-
Added figure and figcaption to the html5 visualblocks plugin.
|
| 133 |
-
Added default alignment options for the figure element.
|
| 134 |
-
Fixed bug where empty inline elements within block elements would sometimes produce a br child element.
|
| 135 |
-
Fixed bug where urls pointing to the same domain as the current one would cause undefined errors. Patch contributed by Paul Giberson.
|
| 136 |
-
Fixed bug where enter inside an editable element inside an non editable element would split the element.
|
| 137 |
-
Fixed bug where cut/copy/paste of noneditable elements didn't work.
|
| 138 |
-
Fixed bug where backspace would sometimes produce font elements on WebKit.
|
| 139 |
-
Fixed bug where WebKit would produce spans out of various inline elements when using backspace.
|
| 140 |
-
Fixed bug where IE9 wouldn't properly update image styles when images where resized.
|
| 141 |
-
Fixed bug where drag/drop of noneditable elements didn't work correctly.
|
| 142 |
-
Fixed bug where applying formatting to all contents wouldn't work correctly when an end point was inside an empty bock. Patch contributed by Jose Luiz.
|
| 143 |
-
Fixed bug where IE10 removed the scopeName from the DOM element interface and there for it produced an undefined string in element path.
|
| 144 |
-
Fixed bug where the caret would be placed at an incorrect location if you applied block formatting while having the caret at the end of the block.
|
| 145 |
-
Fixed bug where applying column changes using the cell dialog would only update the first column. Patch contributed by krzyko.
|
| 146 |
-
Fixed bug where the visualblocks plugin would force editor focus if it was turned on by default.
|
| 147 |
-
Fixed bug where the tabfocus plugin would tab to iframes these are now ignored.
|
| 148 |
-
Fixed bug where format drop down list wouldn't show the currently active format for a parent element.
|
| 149 |
-
Fixed bug where paste of plain text in IE 9 would remove the new line characters from text.
|
| 150 |
-
Fixed bug where the menu buttons/split button menus wouldn't be opened at the right location on older IE versions.
|
| 151 |
-
Fixed bug where Gecko browsers wouldn't properly display the right format when having the selection as specific places.
|
| 152 |
-
Fixed bug where shift+enter inside the body when having forced_root_blocks set to false would throw an error.
|
| 153 |
-
Fixed bug where the jQuery plugin would break the attr method of jQuery 1.7.2. Patch contributed by Markus Kemmerling.
|
| 154 |
-
Fixed so options like content_css accepts and array as well as a comma separated string as input.
|
| 155 |
-
Restructured the internal logic to make it more separate from Editor.js.
|
| 156 |
-
Updated the Sizzle engine to the latest version.
|
| 157 |
-
Version 3.5b2 (2012-03-15)
|
| 158 |
-
Rewrote the enter key logic to normalize browser behavior.
|
| 159 |
-
Fixed so enter within PRE elements produces a BR and shift+enter breaks/end the PRE. Can be disabled using the br_in_pre option.
|
| 160 |
-
Fixed bug where the selection wouldn't be correct after applying formatting and having the caret at the end of the new format node.
|
| 161 |
-
Fixed bug where the noneditable plugin would process contents on raw input calls for example on undo/redo calls.
|
| 162 |
-
Fixed bug where WebKit could produce an exception when a bookmark was requested when there wasn't a proper selection.
|
| 163 |
-
Fixed bug where WebKit would fail to open the image dialog since it would be returning false for a class name instead of a string.
|
| 164 |
-
Fixed so alignment and indentation works properly when forced_root_blocks is set to false. It will produce a DIV by default.
|
| 165 |
-
Version 3.5b1 (2012-03-08)
|
| 166 |
-
Added new event class that is faster and enables support for faking events.
|
| 167 |
-
Added new self_closing_elements, short_ended_elements, boolean_attributes, non_empty_elements and block_elements options to control the HTML Schema.
|
| 168 |
-
Added new schema option and support for the HTML5 schema.
|
| 169 |
-
Added new visualblocks plugin that shows html5 blocks with visual borders.
|
| 170 |
-
Added new types and selector options to make it easier to create editor instances with different configs.
|
| 171 |
-
Added new preview of formatting options in various listboxes.
|
| 172 |
-
Added new preview_styles option that enables control over what gets previewed.
|
| 173 |
-
Fixed bug where content css would be loaded twice into iframe.
|
| 174 |
-
Fixed bug where start elements with only whitespace in the attribute part wouldn't be correctly parsed.
|
| 175 |
-
Fixed bug where the advlink dialog would produce an error about the addSelectAccessibility function not being defined.
|
| 176 |
-
Fixed bug where the caret would be placed at an incorrect position if span was removed by the invalid_elements setting.
|
| 177 |
-
Fixed bug where elements inside a white space preserve element like pre didn't inherit the behavior while parsing.
|
| 178 |
-
Version 3.4.9 (2012-02-23)
|
| 179 |
-
Added settings to wordcount plugin to configure update rate and checking wordcount on backspace and delete using wordcount_update_rate and wordcount_update_on_delete.
|
| 180 |
-
Fixed bug in Webkit and IE where deleting empty paragraphs would remove entire editor contents.
|
| 181 |
-
Fixed bug where pressing enter on end of list item with a heading would create a new item with heading.
|
| 182 |
-
Fixed edit css style dialog text-decoration none checkbox so it disables other text-decoration options when enabled.
|
| 183 |
-
Fixed bug in Gecko where undo wasn't added when focus was lost.
|
| 184 |
-
Fixed bug in Gecko where shift-enter in table cell ending with BR doesn't move caret to new line.
|
| 185 |
-
Fixed bug where right-click on formatted text in IE selected the entire line.
|
| 186 |
-
Fixed bug where text ending with space could not be unformatted in IE.
|
| 187 |
-
Fixed bug where caret formatting would be removed when moving the caret when a selector expression was used.
|
| 188 |
-
Fixed bug where formatting would be applied to the body element when all contents where selected and format had both inline and selector parts.
|
| 189 |
-
Fixed bug where the media plugin would throw errors if you had iframe set as an invalid element in config.
|
| 190 |
-
Fixed bug where the caret would be placed at the top of the document if you inserted a table and undo:ed that operation. Patch contributed by Wesley Walser.
|
| 191 |
-
Fixed bug where content css files where loaded twice into the iframe.
|
| 192 |
-
Fixed so elements with comments would be trated as non empty elements. Patch contributed by Arjan Scherpenisse.
|
| 193 |
-
Version 3.4.8 (2012-02-02)
|
| 194 |
-
Fixed bug in IE where selected text ending with space cannot be formatted then formatted again to get original text.
|
| 195 |
-
Fixed bug in IE where images larger than editor area were being deselected when toolbar buttons are clicked.
|
| 196 |
-
Fixed bug where wrong text align buttons are active when multiple block elements are selected.
|
| 197 |
-
Fixed bug where selected link not showing in target field of link dialog in some selection cases.
|
| 198 |
-
Use settings for remove_trailing_br so this can be turned off instead of hard coding the value.
|
| 199 |
-
Fixed bug in IE where the media plugin displayed null text when some values aren't filled in.
|
| 200 |
-
Added API method 'onSetAttrib' that fires when the attribute value on a node changes.
|
| 201 |
-
Fix font size dropdown value not being updated when text already has a font size in the advanced template.
|
| 202 |
-
Fixed bug in IE where IE doesn't use ARIA attributes properly on options - causing labels to be read out 2 times.
|
| 203 |
-
Fixed bug where caret cannot be placed after table if table is at end of document in IE.
|
| 204 |
-
Fixed bug where adding range isn't always successful so we need to check range count otherwise an exception can occur.
|
| 205 |
-
Added spacebar onclick handler to toolbar buttons to ensure that the accessibility behaviour works correctly.
|
| 206 |
-
Fixed bug where a stranded bullet point would get created in WebKit.
|
| 207 |
-
Fixed bug where selecting text in a blockquote and pressing backspace toggles the style.
|
| 208 |
-
Fixed bug where pressing enter from a heading in IE, the resulting P tag below it shares the style property.
|
| 209 |
-
Fix white space in between spans from being deleted.
|
| 210 |
-
Fixed bug where scrollbars where visible in the character map dialog on Gecko.
|
| 211 |
-
Fixed issue with missing translation for one of the emoticons.
|
| 212 |
-
Fixed bug where dots in id:s where causing problems. Patch provided by Abhishek Dev.
|
| 213 |
-
Fixed bug where urls with an at sign in the path wouldn't be parsed correctly. Patch contributed by Jason Grout.
|
| 214 |
-
Fixed bug where Opera would remove the first character of a inline formatted word if you pressed backspace.
|
| 215 |
-
Fixed bugs with the autoresize plugin on various browsers and removed the need for the throbber.
|
| 216 |
-
Fixed performance issue where the contextmenu plugin would try to remove the menu even if it was removed. Patch contributed by mhu.
|
| 217 |
-
Version 3.4.7 (2011-11-03)
|
| 218 |
-
Modified the caret formatting behavior to word similar to common desktop wordprocessors like Word or Libre Office.
|
| 219 |
-
Fixed bug in Webkit - Cursor positioning does not work vertically within a table cell with multiple lines of text.
|
| 220 |
-
Fixed bug in IE where Inserting a table in IE8 places cursor in the second cell of the first row.
|
| 221 |
-
Fixed bug in IE where editor in a frame doesn't give focus to the toolbar using ALT-F10.
|
| 222 |
-
Fix for webkit and gecko so that deleting bullet from start of list outdents inner list items and moves first item into paragraph.
|
| 223 |
-
Fix new list items in IE8 not displayed on a new line when list contains nested list items.
|
| 224 |
-
Clear formatting in table cell breaks the cell.
|
| 225 |
-
Made media type list localisable.
|
| 226 |
-
Fix out of memory error when using prototype in media dialog.
|
| 227 |
-
Fixed bug where could not add a space in the middle of a th cell.
|
| 228 |
-
Fixed bug where adding a bullet between two existing bullets adds an extra one
|
| 229 |
-
Fixed bug where trying to insert a new entry midway through a bulleted list fails dismally when the next entry is tabbed in.
|
| 230 |
-
Fixed bug where pressing enter on an empty list item does not outdent properly in FF
|
| 231 |
-
Fixed bug where adding a heading after a list item in a table cell changes all styles in that cell
|
| 232 |
-
Fixed bug where hitting enter to exit from a bullet list moves cursor to the top of the page in Firefox.
|
| 233 |
-
Fixed bug where pressing backspace would not delete HRs in Firefox and IE when next to an empty paragraph.
|
| 234 |
-
Fixed bug where deleting part of the link text can cause a link with no destination to be saved.
|
| 235 |
-
Fixed bug where css style border widths wasn't handled correctly in table dialog.
|
| 236 |
-
Fixed bug where parsing invalid html contents on IE or WebKit could produce an infinite loop.
|
| 237 |
-
Fixed bug where scripts with custom script types wasn't properly passed though the editor.
|
| 238 |
-
Fixed issue where some Japanese kanji characters wasn't properly entity encoded when numeric entity mode was enabled.
|
| 239 |
-
Made emoticons dialog use the keyboard naviation.
|
| 240 |
-
Added navigation instructions to the symbols dialog.
|
| 241 |
-
Added ability to set default values for the media plugin.
|
| 242 |
-
Added new font_size_legacy_values option for converting old font element sizes to span with font-size properties.
|
| 243 |
-
Fixed bug where the symbols dialog was not accessible.
|
| 244 |
-
Added quirk for IE ensuring that the body of the document containing tinyMCE has a role="application" for accessibility.
|
| 245 |
-
Fixed bug where the advanced color picker wasn't working properly on FF 7.
|
| 246 |
-
Fixed issue where the advanced color picker was producing uppercase hex codes.
|
| 247 |
-
Fixed bug where IE 8 could throw exceptions if the contents contained resizable content elements.
|
| 248 |
-
Fixed bug where caret formatting wouldn't be correctly applied to previous sibling on WebKit.
|
| 249 |
-
Fixed bug where the select boxes for font size/family would loose it's value on WebKit due to recent iOS fixes.
|
| 250 |
-
Version 3.4.6 (2011-09-29)
|
| 251 |
-
Fixed bug where list items were being created for empty divs.
|
| 252 |
-
Added support in Media plugin for audio media using the embed tag
|
| 253 |
-
Fixed accessibility bugs in WebKit and IE8 where toolbar items were not being read.
|
| 254 |
-
Added new use_accessible_selects option to ensure accessible list boxes are used in all browsers (custom widget in firefox native on other browsers)
|
| 255 |
-
Fixed bug where classid attribute was not being checked from embed objects.
|
| 256 |
-
Fixed bug in jsrobot tests with intermittently failing.
|
| 257 |
-
Fixed bug where anchors wasn't updated properly if you edited them using IE 8.
|
| 258 |
-
Fixed bug where input method on WebKit on Mac OS X would fail to initialize when sometimes focusing the editor.
|
| 259 |
-
Fixed bug where it wasn't possible to select HR elements on WebKit by simply clicking on them.
|
| 260 |
-
Fixed bug where the media plugin wouldn't work on IE9 when not using the inlinepopups plugin.
|
| 261 |
-
Fixed bug where hspace,vspace,align and bgcolor would be removed from object elements in the media plugin.
|
| 262 |
-
Fixed bug where the new youtube format wouldn't be properly parsed by the media plugin.
|
| 263 |
-
Fixed bug where the style attribute of layers wasn't properly updated on IE and Gecko.
|
| 264 |
-
Fixed bug where editing contents in a layer would fail on Gecko since contentEditable doesn't inherit properly.
|
| 265 |
-
Fixed bug where IE 6/7 would produce JS errors when serializing contents containing layers.
|
| 266 |
-
Version 3.4.5 (2011-09-06)
|
| 267 |
-
Fixed accessibility bug in WebKit where the right and left arrow keys would update native list boxes.
|
| 268 |
-
Added new whitespace_elements option to enable users to specify specific elements where the whitespace is preserved.
|
| 269 |
-
Added new merge_siblings option to formats. This option makes it possible to disable the auto merging of siblings when applying formats.
|
| 270 |
-
Fixed bug in IE where trailing comma in paste plugin would cause plugin to not run correctly.
|
| 271 |
-
Fixed bug in WebKit where console messages would be logged when deleting an empty document.
|
| 272 |
-
Fixed bug in IE8 where caret positioned is on list item instead of paragraph when outdent splits the list
|
| 273 |
-
Fixed bug with image dialogs not inserting an image if id was omitted from valid_elements.
|
| 274 |
-
Fixed bug where the selection normalization logic wouldn't properly handle image elements in specific config cases.
|
| 275 |
-
Fixed bug where the map elements coords attribute would be messed up by IE when serializing the DOM.
|
| 276 |
-
Fixed bug where IE wouldn't properly handle custom elements when the contents was serialized.
|
| 277 |
-
Fixed bug where you couldn't move the caret in Gecko if you focused the editor using the API or a UI control.
|
| 278 |
-
Fixed bug where adjacent links would get merged on IE due to bugs in their link command.
|
| 279 |
-
Fixed bug where the color split buttons would loose the selection on IE if the editor was placed in a frame/iframe.
|
| 280 |
-
Fixed bug where floated images in WebKit wouldn't get properly linked.
|
| 281 |
-
Fixed bug where the fullscreen mode in a separate window wasn't forced into IE9+ standards mode.
|
| 282 |
-
Fixed bug where pressing enter in an empty editor on WebKit could produce DIV elements instead of P.
|
| 283 |
-
Fixed bug where spans would get removed incorrectly when merging two blocks on backspace/delete on WebKit.
|
| 284 |
-
Fixed bug where the editor contents wouldn't be completely removed on backspace/delete on WebKit.
|
| 285 |
-
Fixed bug where the fullpage plugin wouldn't properly render style elements in the head on IE 6/7.
|
| 286 |
-
Fixed bug where the nonbreaking_force_tab option in the nonbreaking plugin wouldn't work on Gecko/WebKit.
|
| 287 |
-
Fixed bug where the isDirty state would become true on non IE browsers if there was an table at the end of the contents.
|
| 288 |
-
Fixed bug where entities wasn't properly encoded on WebKit when pasting text as plain text.
|
| 289 |
-
Fixed bug where empty editors would produce an exception of valid_elements didn't include body and forced_root_blocks where disabled.
|
| 290 |
-
Fixed bug where the fullscreen mode wouldn't retain the header/footer in the fullpage plugin.
|
| 291 |
-
Fixed issue where the plaintext_mode and plaintext_mode_sticky language keys where swapped.
|
| 292 |
-
Version 3.4.4 (2011-08-04)
|
| 293 |
-
Added new html5 audio support. Patch contributed by Ronald M. Clifford.
|
| 294 |
-
Added mute option for video elements and preload options for video/audio patch contributed by Dmitry Kalinkin.
|
| 295 |
-
Fixed selection to match visual selection before applying formatting changes.
|
| 296 |
-
Fixed browser specific bugs in lists for WebKit and IE.
|
| 297 |
-
Fixed bug where IE would scroll the window if you closed an inline dialog that was larger than the viewport. Patch by Laurence Keijmel.
|
| 298 |
-
Fixed bug where pasting contents near a span element could remove parts of that span. Patch contributed by Wesley Walser.
|
| 299 |
-
Fixed bug where formatting change would be lost after pressing enter.
|
| 300 |
-
Fixed bug in WebKit where deleting across blocks would add extra styles.
|
| 301 |
-
Fixed bug where moving cursor vertically in tables in WebKit wasn't working.
|
| 302 |
-
Fixed bug in IE where deleting would cause error in console.
|
| 303 |
-
Fixed bug where the formatter was not applying formats across list elements.
|
| 304 |
-
Fixed bug where the wordcount plugin would try and update the wordcount if tinymce had been destroyed.
|
| 305 |
-
Fixed bug where tabfocus plugin would attempt to focus elements not displayed when their parent element was hidden.
|
| 306 |
-
Fixed bug where the contentEditable state would sometimes be removed if you deleted contents in Gecko.
|
| 307 |
-
Fixed bug where inserting contents using mceInsertContent would fail if "span" was disabled in valid_elements.
|
| 308 |
-
Fixed bug where initialization might fail if some resource on gecko wouldn't load properly and fire the onload event.
|
| 309 |
-
Fixed bug where ctrl+7/8/9 keys wouldn't properly add the specific formats associated with them.
|
| 310 |
-
Fixed bug where the HTML tags wasn't properly closed in the style plugins properties dialog.
|
| 311 |
-
Fixed bug where the list plugin would produce an exception if the user tried to delete an element at the very first location.
|
| 312 |
-
Version 3.4.3.2 (2011-06-30)
|
| 313 |
-
Fixed bug where deleting all of a paragraph inside a table cell would behave badly in webkit.
|
| 314 |
-
Fixed bugs in tests in firefox5 and WebKit.
|
| 315 |
-
Fixed bug where selection of table cells would produce an exception on Gecko.
|
| 316 |
-
Fixed bug where the caret wasn't properly rendered on Gecko when the editor was hidden.
|
| 317 |
-
Fixed bug where pasting plain text into WebKit would produce a pre element it will now produce more semantic markup.
|
| 318 |
-
Fixed bug where selecting list type formats using the advlist plugin on IE8 would loose editor selection.
|
| 319 |
-
Fixed bug where forced root blocks logic wouldn't properly pad elements created if they contained data attributes.
|
| 320 |
-
Fixed bug where it would remove all contents of the editor if you inserted an image when not having a caret in the document.
|
| 321 |
-
Fixed bug where the YUI compressor wouldn't properly encode strings with only a quote in them.
|
| 322 |
-
Fixed bug where WebKit on iOS5 wouldn't call nodeChanged when the selection was changed.
|
| 323 |
-
Fixed bug where mceFocus command wouldn't work properly on Gecko since it didn't focus the body element.
|
| 324 |
-
Fixed performance issue with the noneditable plugin where it would enable/disable controls to often.
|
| 325 |
-
Version 3.4.3.1 (2011-06-16)
|
| 326 |
-
Fixed bug where listboxes were not being handled correctly by JAWS in firefox with the o2k7 skin.
|
| 327 |
-
Fixed bug where custom buttons were not being rendered correctly when in high contrast mode.
|
| 328 |
-
Added support for iOS 5 that now supporting contentEditable in it's latest beta.
|
| 329 |
-
Fixed bug where urls in style attributes with a _ character followed by a number would cause incorrect output.
|
| 330 |
-
Fixed bug where custom_elements option wasn't working properly on IE browsers.
|
| 331 |
-
Fixed bug where custom_elements marked as block elements wouldn't get correctly treated as block elements.
|
| 332 |
-
Fixed bug where attributes with </> wasn't properly encoded as XML entities.
|
| 333 |
-
Version 3.4.3 (2011-06-09)
|
| 334 |
-
Fixed bug where deleting backwards before an image into a list would put the cursor in the wrong location.
|
| 335 |
-
Fixed bug where styles plugin would not apply styles across multiple selected block elements correctly.
|
| 336 |
-
Fixed bug where cursor would jump to start of document when selection contained empty table cells in IE8.
|
| 337 |
-
Fixed bug where applied styles wouldn't be kept if you pressed enter twice to produce two paragraphs.
|
| 338 |
-
Fixed bug where a ghost like caret would appear on Gecko when pressing enter while having a text color applied.
|
| 339 |
-
Fixed bug where IE would produce absolute urls if you inserted a image/link and reloaded the page.
|
| 340 |
-
Fixed bug where applying a heading style to a list item would cascade style to children list items.
|
| 341 |
-
Fixed bug where Editor loses focus when backspacing and changing styles in WebKit.
|
| 342 |
-
Fixed bug where exception was thrown in tinymce.util.URI when parsing a relative URI and no base_uri setting was provided.
|
| 343 |
-
Fixed bug where alt-f10 was not always giving focus to the toolbar on Safari.
|
| 344 |
-
Added new 'allow_html_in_named_anchor' option to allow html to occur within a named anchor tag. Use at own risk.
|
| 345 |
-
Added plugin dependency support. Will autoload plugins specified as a dependency if they haven't been loaded.
|
| 346 |
-
Fixed bug where the autolink plugin didn't work with non-English keyboards when pressing ).
|
| 347 |
-
Added possibility to change properties of all table cells in a column.
|
| 348 |
-
Added external_image_list option to get images list from user-defined variable or function.
|
| 349 |
-
Fixed bug where the autoresize plugin wouldn't reduce the editors height on Chrome.
|
| 350 |
-
Fixed bug where table size inputs were to small for values with size units.
|
| 351 |
-
Fixed bug where table cell/row size input values were not validated.
|
| 352 |
-
Fixed bug where menu item line-height would be set to wrong value by external styles.
|
| 353 |
-
Fixed bug where hasUndo() would return wrong answer.
|
| 354 |
-
Fixed bug where page title would be set to undefined by fullpage plugin.
|
| 355 |
-
Fixed bug where HTML5 video properties were not updated in embedded media settings.
|
| 356 |
-
Fixed bug where HTML comment on the first line would cause an error.
|
| 357 |
-
Fixed bug where spellchecker menu was positioned incorrectly on IE.
|
| 358 |
-
Fixed bug where breaking out of list elements on WebKit would produce a DIV instead of P after the list.
|
| 359 |
-
Fixed bug where pasting from Word in IE9 would add extra BR elements when text was word wrapped.
|
| 360 |
-
Fixed bug where numeric entities with leading zeros would produce incorrect decoding.
|
| 361 |
-
Fixed bug where hexadecimal entities wasn't properly decoded.
|
| 362 |
-
Fixed bug where bookmarks wasn't properly stored/restored on undo/redo.
|
| 363 |
-
Fixed bug where the mceInsertCommand didn't retain the values of links if they contained non url contents.
|
| 364 |
-
Fixed bug where the valid_styles option wouldn't be properly used on styles for specific elements.
|
| 365 |
-
Fixed so contentEditable is used for the body of the editor if it's supported.
|
| 366 |
-
Fixed so trailing BR elements gets removed even when forced_root_blocks option was set to false/null.
|
| 367 |
-
Fixed performance issue with mceInsertCommand and inserting very simple contents.
|
| 368 |
-
Fixed performance issue with older IE version and huge documents by optimizing the forced root blocks logic.
|
| 369 |
-
Fixed performance issue with table plugin where it checked for selected cells to often.
|
| 370 |
-
Fixed bug where creating a link on centered/floated image would produce an error on WebKit browsers.
|
| 371 |
-
Fixed bug where Gecko would remove single paragraphs if there where contents before/after it.
|
| 372 |
-
Fixed bug where the scrollbar would move up/down when pasting contents using the paste plugin.
|
| 373 |
-
Version 3.4.2 (2011-04-07)
|
| 374 |
-
Added new 'paste_text_sticky_default' option to paste plugin, enables you to set the default state for paste as plain text.
|
| 375 |
-
Added new autoresize_bottom_margin option to autoresize plugin that enables you to add an extra margin at the bottom. Patch contributed by Andrew Ozz.
|
| 376 |
-
Rewritten the fullpage plugin to handle style contents better and have a more normalized behavior across browsers.
|
| 377 |
-
Fixed bug where contents inserted with mceInsertContent wasn't parsed using the default dom parser.
|
| 378 |
-
Fixed bug where blocks containing a single anchor element would be treated as empty.
|
| 379 |
-
Fixed bug where merging of table cells on IE 6, 7 wouldn't look correctly until the contents was refreshed.
|
| 380 |
-
Fixed bug where context menu wouldn't work properly on Safari since it was passing out the ctrl key as pressed.
|
| 381 |
-
Fixed bug where image border color/style values were overwritten by advimage plugin.
|
| 382 |
-
Fixed bug where setting border in advimage plugin would throw error in IE.
|
| 383 |
-
Fixed bug where empty anchors list in link settings wasn't hidden.
|
| 384 |
-
Fixed bug where xhtmlextras popups were missing localized popup-size parameters.
|
| 385 |
-
Fixed bug where the context menu wouldn't select images on WebKit browsers.
|
| 386 |
-
Fixed bug where paste plugin wouldn't properly extract the contents on WebKit due to recent changes in browser behavior.
|
| 387 |
-
Fixed bug where focus of the editor would get on control contents on IE lost due to a bug in the ColorSplitButton control.
|
| 388 |
-
Fixed bug where contextmenu wasn't disabled on noneditable elements.
|
| 389 |
-
Fixed bug where getStyle function would trigger error when called on element without style property.
|
| 390 |
-
Fixed bug where editor fail to load if Javascript Compressor was used.
|
| 391 |
-
Fixed bug where list-style-type=lower-greek would produce errors in IE<8.
|
| 392 |
-
Fixed bug where spellchecker plugin would produce errors on IE6-7.
|
| 393 |
-
Fixed bug where theme_advanced_containers configuration option causes error.
|
| 394 |
-
Fixed bug where the mceReplaceContent command would produce an error since it didn't correctly handle a return value.
|
| 395 |
-
Fixed bug where you couldn't enter float point values for em in dialog input fields since it wouldn't be considered a valid size.
|
| 396 |
-
Fixed bug in xhtmlxtras plugin where it wasn't possible to remove some attributes in the attributes dialog.
|
| 397 |
-
Version 3.4.1 (2011-03-24)
|
| 398 |
-
Added significantly improved list handling via the new 'lists' plugin.
|
| 399 |
-
Added 'autolink' plugin to enable automatically linking URLs. Similar to the behavior IE has by default.
|
| 400 |
-
Added 'theme_advanced_show_current_color' setting to enable the forecolor and backcolor buttons to continuously show the current text color.
|
| 401 |
-
Added 'contextmenu_never_use_native' setting to disable the ctrl-right-click showing the native browser context menu behaviour.
|
| 402 |
-
Added 'paste_enable_default_filters' setting to enable the default paste filters to be disabled.
|
| 403 |
-
Fixed bug where selection locations on undo/redo didn't work correctly on specific contents.
|
| 404 |
-
Fixed bug where an exception would be trown on IE when loading TinyMCE inside an iframe.
|
| 405 |
-
Fixed bug where some ascii numeric entities wasn't properly decoded.
|
| 406 |
-
Fixed bug where some non western language codes wasn't properly decoded/encoded.
|
| 407 |
-
Fixed bug where undo levels wasn't created when deleting contents on IE.
|
| 408 |
-
Fixed bug where the initial undo levels bookmark wasn't updated correctly.
|
| 409 |
-
Fixed bug where search/replace wouldn't be scoped to editor instances on IE8.
|
| 410 |
-
Fixed bug where IE9 would produce two br elements after block elements when pasting.
|
| 411 |
-
Fixed bug where IE would place the caret at an incorrect position after a paste operation.
|
| 412 |
-
Fixed bug where a paste operation using the keyboard would add an extra undo level.
|
| 413 |
-
Fixed bug where some attributes/elements wasn't correctly filtered when invalid contents was inserted.
|
| 414 |
-
Fixed bug where the table plugin couldn't correctly handle invalid table structures.
|
| 415 |
-
Fixed bug where charset and title of the page were handled incorrectly by the fullpage plugin.
|
| 416 |
-
Fixed bug where toggle states on some of the list boxes didn't update correctly.
|
| 417 |
-
Fixed bug where sub/sub wouldn't work correctly when done as a caret action in Chrome 10.
|
| 418 |
-
Fixed bug where the constrain proportions checkbox wouldn't work in the media plugin.
|
| 419 |
-
Fixed bug where block elements containing trailing br elements wouldn't treated properly if they where invalid.
|
| 420 |
-
Fixed bug where the color picker dialog wouldn't be rendered correctly when using the o2k7 theme.
|
| 421 |
-
Fixed bug where setting border=0 using advimage plugin invalid style attribute content was created in Chrome.
|
| 422 |
-
Fixed bug with references to non-existing images in css of fullpage plugin.
|
| 423 |
-
Fixed bug where item could be unselected in spellchecker's language selector.
|
| 424 |
-
Fixed bug where some mispelled words could be not highlighted using spellchecker plugin.
|
| 425 |
-
Fixed bug where spellchecking would merge some words on IE.
|
| 426 |
-
Fixed bug where spellchecker context menu was not always positioned correctly.
|
| 427 |
-
Fixed bug with empty anchors list in advlink popup when Invisible Elements feature was disabled.
|
| 428 |
-
Fixed bug where older IE versions wouldn't properly handle some elements if they where placed at the top of editor contents.
|
| 429 |
-
Fixed bug where selecting the whole table would enable table tools for cells and rows.
|
| 430 |
-
Fixed bug where it wasn't possible to replace selected contents on IE when pasting using the paste plugin.
|
| 431 |
-
Fixed bug where setting text color in fullpage plugin doesn't work.
|
| 432 |
-
Fixed bug where the state of checkboxes in media plugin wouldn't be set correctly.
|
| 433 |
-
Fixed bug where black spade suit character was not included in special character selector.
|
| 434 |
-
Fixed bug where setting invalid values for table cell size would throw an error in IE.
|
| 435 |
-
Fixed bug where spellchecking would remove whitespace characters from PRE block in IE.
|
| 436 |
-
Fixed bug where HR was inserted inside P elements instead of splitting them.
|
| 437 |
-
Fixed bug where extra, empty span tags were added when using a format with both selector and inline modes.
|
| 438 |
-
Fixed bug where bullet lists weren't always detected correctly.
|
| 439 |
-
Fixed bug where deleting some paragraphs on IE would cause an exception.
|
| 440 |
-
Fixed bug where the json encoder logic wouldn't properly encode \ characters.
|
| 441 |
-
Fixed bug where the onChange event would be fired when the editor was first initialized.
|
| 442 |
-
Fixed bug where mceSelected wouldn't be removed properly from output even if it's an internal class.
|
| 443 |
-
Fixed issue with table background colors not being transparent. This improves compliance with users browser color preferences.
|
| 444 |
-
Fixed issue where styles were not included when using the full page plugin.
|
| 445 |
-
Fixed issue where drag/drop operations wasn't properly added to the undo levels.
|
| 446 |
-
Fixed issue where colors wasn't correctly applied to elements with underline decoration.
|
| 447 |
-
Fixed issue where deleting some paragraphs on IE would cause an exception.
|
| 448 |
-
Version 3.4 (2011-03-10)
|
| 449 |
-
Added accessibility example with various accessibility options contributed by Ephox.
|
| 450 |
-
Fixed bug where attributes wasn't properly handled in the xhtmlxtras plugin.
|
| 451 |
-
Fixed bug where the image.htm had some strange td artifacts probably due to auto merging.
|
| 452 |
-
Fixed bug where the ToolbarGroup had an missing reference to this in it's destroy method.
|
| 453 |
-
Fixed bug with the resizeBy function in the advanced theme where it was scaled by the wrong parent.
|
| 454 |
-
Fixed bug where an exception would be thrown by the element if the page was served in xhtml mode.
|
| 455 |
-
Fixed bug where mceInsertContent would throw an exception when page was served in xhtml mode.
|
| 456 |
-
Fixed bug where you couldn't select a forground/background color when page was served in xhtml mode.
|
| 457 |
-
Fixed bug where the editor would scroll to the toolbar when clicked due to a call to focus in ListBox.
|
| 458 |
-
Fixed bug where pages with rtl dir wouldn't render split buttons correctly when using the o2k7 theme.
|
| 459 |
-
Fixed bug where anchor elements with names wasn't properly collapsed as they where in 3.3.x.
|
| 460 |
-
Fixed bug where WebKit wouldn't properly handle image selection if it was done left to right.
|
| 461 |
-
Fixed bug where the formatter would align images when the selection range was collapsed.
|
| 462 |
-
Fixed bug where the image button would be active when the selection range was collapsed.
|
| 463 |
-
Fixed bug where the element_format option wasn't used by the new (X)HTML serializer logic.
|
| 464 |
-
Fixed bug where the table cell/row dialogs would produce empty attributes.
|
| 465 |
-
Fixed bug where the tfoot wouldn't be added to the top of the table.
|
| 466 |
-
Fixed bug where the formatter would merge siblings with white space between them.
|
| 467 |
-
Fixed bug where pasting headers and paragraphs would produce an extra paragraph.
|
| 468 |
-
Fixed bug where the ColorSplitButton would throw an exception if you clicked out side a color.
|
| 469 |
-
Fixed bug where IE9 wouldn't properly produce new paragraphs on enter if the current paragraph had formatting.
|
| 470 |
-
Fixed bug where multiple BR elements at end of block elements where removed.
|
| 471 |
-
Fixed bug where fullscreen plugin wouldn't correctly display the edit area on IE6 for long pages.
|
| 472 |
-
Fixed bug where paste plugin wouldn't properly encode raw entities when pasting in plain text mode.
|
| 473 |
-
Fixed bug where the search/replace plugin wouldn't work correctly on IE 9.
|
| 474 |
-
Fixed so the drop menus doesn't get an outline border visible when focused, patch contributed by Ephox.
|
| 475 |
-
Fixed so the values entered in the color picker are forced to hex values.
|
| 476 |
-
Removed dialog workaround for IE 9 beta since the RC is now out and people should upgrade.
|
| 477 |
-
Removed obsolete calls in various plugins to the mceBeginUndoLevel command.
|
| 1 |
+
Version 3.5.8 (2012-11-20)
|
| 2 |
+
Fixed bug where html5 data attributes where stripped from contents.
|
| 3 |
+
Fixed bug where toolbar was annouced multiple times with JAWS on Firefox.
|
| 4 |
+
Fixed bug where the editor view whouldn't scroll to BR elements when using shift+enter or br enter mode.
|
| 5 |
+
Fixed bug where a JS error would be thrown when trying to paste table rows then the rows clipboard was empty.
|
| 6 |
+
Fixed bug with auto detection logic for youtube urls in the media plugin.
|
| 7 |
+
Fixed bug where the formatter would throw errors if you used the jQuery version of TinyMCE and the latest jQuery.
|
| 8 |
+
Fixed bug where the latest WebKit versions would produce span elements when deleting text between blocks.
|
| 9 |
+
Fixed bug where the autolink plugin would produce DOM exceptions when pressing shift+enter inside a block element.
|
| 10 |
+
Fixed bug where toggling of blockquotes when using br enter mode would produce an exception.
|
| 11 |
+
Fixed bug where focusing out of the body of the editor wouldn't properly add an undo level.
|
| 12 |
+
Fixed issue with warning message being displayed on IE 9+ about the meta header fix for IE 8.
|
| 13 |
+
Version 3.5.7 (2012-09-20)
|
| 14 |
+
Changed table row properties dialog to not update multiple rows when row type is header or footer.
|
| 15 |
+
Fixed bug in hyperlink dialog for IE9 where links with no target attr set had target value of --
|
| 16 |
+
Changing toolbars to have a toolbar role for FF keyboard navigation works correctly.
|
| 17 |
+
Fixed bug where applying formatting to an empty block element would produce redundant spans.
|
| 18 |
+
Fixed bug where caret formatting on IE wouldn't properly apply if you pressed enter/return.
|
| 19 |
+
Fixed bug where loading TinyMCE using an async script wouldn't properly initialize editors.
|
| 20 |
+
Fixed bug where some white space would be removed after inline elements before block elements.
|
| 21 |
+
Fixed bug where it wouldn't properly parse attributes with a single backslash as it's contents.
|
| 22 |
+
Fixed bug where noscript elements would loose it's contents on older IE versions.
|
| 23 |
+
Fixed bug where backspace inside empty blockquote wouldn't delete it properly.
|
| 24 |
+
Fixed bug where custom elements with . in their names wouldn't work properly.
|
| 25 |
+
Fixed bug where the custom_elements option didn't properly setup the block elements schema structure.
|
| 26 |
+
Fixed bug where the custom_elements option didn't auto populate the extended_valid_elements.
|
| 27 |
+
Fixed bug where the whole TD element would get blcok formatted when there where BR elements in it.
|
| 28 |
+
Fixed bug where IE 9 might crash if the editor was hidden and specific styles where applied to surrounding contents.
|
| 29 |
+
Fixed bug where shift+enter inside a table cell on Gecko would produce an zero width non breaking space between tr:s.
|
| 30 |
+
Fixed bug where the advlink dialog wouldn't properly populate the anchors dropdown if the HTML5 schema was used.
|
| 31 |
+
Fixed issue with missing autofocus attribute on input element when using the HTML5 schema.
|
| 32 |
+
Fixed issue where enter inside a block contained within an LI element wouldn't produce a new LI.
|
| 33 |
+
Version 3.5.6 (2012-07-26)
|
| 34 |
+
Added "text" as a valid option to the editor.getContent format option. Makes it easier to get a text representation of the editor contents.
|
| 35 |
+
Fixed bug where resizing an image to less that 0x0 pixels would display the ghost image at an incorrect position.
|
| 36 |
+
Fixed bug where the remove format button would produce extra paragraphs on WebKit if all of the contents was selected.
|
| 37 |
+
Fixed issue where edge resize handles on images of wouldn't scale it with the same aspect ratio.
|
| 38 |
+
Fixed so force_p_newlines option works again since some users want mixed mode paragraphs.
|
| 39 |
+
Fixed so directionality plugin modifies the dir attribute of all selected blocks in the editor.
|
| 40 |
+
Fixed bug where backspace/delete of a custom element would move it's attributes to the parent block on Gecko.
|
| 41 |
+
Version 3.5.5 (2012-07-19)
|
| 42 |
+
Added full resize support for images and tables on WebKit/Opera. It now behaves just like Gecko.
|
| 43 |
+
Added automatic embed support for Vimeo, Stream.cz and Google Maps in media plugin. Patch contributed by Jakub Matas.
|
| 44 |
+
Fixed bug where the lists plugin wouldn't properly remove all li elements when toggling selected items of. Patched by Taku AMANO.
|
| 45 |
+
Fixed bug where the lists plugin would remove the entire list if you pressed deleted at the beginning of the first element. Patched by Taku AMANO.
|
| 46 |
+
Fixed bug where the ordered/unordered list buttons could both be enabled if you nested lists. Patch contributed by Craig Petchell.
|
| 47 |
+
Fixed bug where shift+enter wouldn't produce a BR in a LI when having forced_root_blocks set to false.
|
| 48 |
+
Fixed bug where scrollbars aren't visible in fullscreen when window is resized.
|
| 49 |
+
Fixed bug with updating the border size using the advimage dialog on IE 9.
|
| 50 |
+
Fixed bug where the selection of inner elements on IE 8 in contentEditable mode would select the whole parent element.
|
| 51 |
+
Fixed bug where the enter key would produce an empty anchor if you pressed it at the space after a link on IE.
|
| 52 |
+
Fixed bug where autolink plugin would produce an exception for specific html see bug #5365
|
| 53 |
+
Fixed so the formatChanged function takes an optional "similar" parameter to use while matching the format.
|
| 54 |
+
Version 3.5.4.1 (2012-06-24)
|
| 55 |
+
Fixed issue with Shift+A selecting all contents on Chrome.
|
| 56 |
+
Version 3.5.4 (2012-06-21)
|
| 57 |
+
Added missing mouse events to HTML5 schema. Some events needs to be manually defined though since the spec is huge.
|
| 58 |
+
Added image resizing for WebKit browsers by faking the whole resize behavior.
|
| 59 |
+
Fixed bug in context menu plugin where listener to hide menu wasn't removed correctly.
|
| 60 |
+
Fixed bug where media plugin wouldn't use placeholder size for the object/video elements.
|
| 61 |
+
Fixed bug where jQuery plugin would break attr function in jQuery 1.7.2.
|
| 62 |
+
Fixed bug where jQuery plugin would throw an error if you used the tinymce pseudo selector when TinyMCE wasn't loaded.
|
| 63 |
+
Fixed so encoding option gets applied when using jQuery val() or attr() to extract the contents.
|
| 64 |
+
Fixed so any non valid width/height passed to media plugin would get parsed to proper integer or percent values.
|
| 65 |
+
Version 3.5.3 (2012-06-19)
|
| 66 |
+
Added missing wbr element to HTML5 schema.
|
| 67 |
+
Added new mceToggleFormat command. Enabled you to toggle a specific format on/off.
|
| 68 |
+
Fixed bug where undo/redo state didn't update correctly after executing an execCommand call.
|
| 69 |
+
Fixed bug where the editor would get auto focused on IE running in quirks mode.
|
| 70 |
+
Fixed bug where pressing enter before an IMG or INPUT element wouldn't properly split the block.
|
| 71 |
+
Fixed bug where backspace would navigate back when selecting control types on IE.
|
| 72 |
+
Fixed bug where the editor remove method would unbind events for controls outside the editor instance UI.
|
| 73 |
+
Fixed bug where the autosave plugin would try to store a draft copy of editors that where removed.
|
| 74 |
+
Fixed bug where floated elements wouldn't expand the block created when pressing enter on non IE browsers.
|
| 75 |
+
Fixed bug where the caret would be placed in the wrong location when pressing enter at the beginning of a block.
|
| 76 |
+
Fixed bug where it wasn't possible to block events using the handle_event_callback option.
|
| 77 |
+
Fixed bug where keyboard navigation of the ColorSplitButton.js didn't work correctly.
|
| 78 |
+
Fixed bug where keyboard navigation didn't work correctly on split buttons.
|
| 79 |
+
Fixed bug where the legacy Event.add function didn't properly handle multiple id:s passed in.
|
| 80 |
+
Fixed bug where the caret would disappear on IE when selecting all contents and pressing backspace/delete.
|
| 81 |
+
Fixed bug where the getStart/getEnd methods would sometimes return elements from the wrong document on IE.
|
| 82 |
+
Fixed so paragraphs gets created if you press enter inside a form element.
|
| 83 |
+
Version 3.5.2 (2012-05-31)
|
| 84 |
+
Added new formatChanged method to tinymce.Formatter class. Enables easier state change handling of formats.
|
| 85 |
+
Added new selectorChanged method to tinymce.dom.Selection class. Enables easier state change handling of matching CSS selectors.
|
| 86 |
+
Changed the default theme to be advanced instead of simple since most users uses the advanced theme.
|
| 87 |
+
Changed so the theme_advanced_buttons doesn't have a default set if one button row is specified.
|
| 88 |
+
Changed the theme_advanced_toolbar_align default value to "left".
|
| 89 |
+
Changed the theme_advanced_toolbar_location default value to "top".
|
| 90 |
+
Changed the theme_advanced_statusbar_location default value to "bottom".
|
| 91 |
+
Fixed bug where the simple link dialog would remove class and target attributes from links when updating them if the drop downs wasn't visible.
|
| 92 |
+
Fixed bug where the link/unlink buttons wouldn't get disabled once a link was created by the autolink plugin logic.
|
| 93 |
+
Fixed bug where the border attribute was missing in the HTML5 schema.
|
| 94 |
+
Fixed bug where the legacyoutput plugin would use inline styles for font color.
|
| 95 |
+
Fixed bug where editing of anchor names wouldn't produce an undo level.
|
| 96 |
+
Fixed bug where the table plugin would delete the last empty block element in the editor.
|
| 97 |
+
Fixed bug where pasting table rows when they where selected would make it impossible to editor that table row.
|
| 98 |
+
Fixed bug with pressing enter in IE while having a select list focused would produce a JS error.
|
| 99 |
+
Fixed bug where it wasn't possible to merge table cells by selecting them and using merge from context menu.
|
| 100 |
+
Removed summary from HTML5 table attributes and fixed so this and other deprecated table fields gets hidden in the table dialog.
|
| 101 |
+
Version 3.5.1.1 (2012-05-25)
|
| 102 |
+
Fixed bug with control creation where plugin specific controls didn't work as expected.
|
| 103 |
+
Version 3.5.1 (2012-05-25)
|
| 104 |
+
Added new onBeforeAdd event to UndoManager patch contributed by Dan Rumney.
|
| 105 |
+
Added support for overriding the theme rendering logic by using a custom function.
|
| 106 |
+
Fixed bug where links wasn't automatically created by the autolink plugin on old IE versions when pressing enter in BR mode.
|
| 107 |
+
Fixed bug where enter on older IE versions wouldn't produce a new paragraph if the previous sibling paragraph was empty.
|
| 108 |
+
Fixed bug where toString on a faked DOM range on older IE versions wouldn't return a proper string.
|
| 109 |
+
Fixed bug where named anchors wouldn't work properly when schema was set to HTML5.
|
| 110 |
+
Fixed bug where HTML5 datalist options wasn't correctly parsed or indented.
|
| 111 |
+
Fixed bug where linking would add anchors around block elements when the HTML5 schema was used.
|
| 112 |
+
Fixed issue where the autolink plugin wouldn't properly handle mailto:user@domain.com.
|
| 113 |
+
Optimized initialization and reduced rendering flicker by hiding the target element while initializing.
|
| 114 |
+
Version 3.5.0.1 (2012-05-10)
|
| 115 |
+
Fixed bug where selection normalization logic would break the selections of parent elements using the element path.
|
| 116 |
+
Fixed bug where the autolink plugin would include trailing dots in domain names in the link creation.
|
| 117 |
+
Fixed bug where the autolink plugin would produce an error on older IE versions when pressing enter.
|
| 118 |
+
Fixed bug where old IE versions would throw an error during initialization when the editor was placed in an size restricted div.
|
| 119 |
+
Version 3.5 (2012-05-03)
|
| 120 |
+
Fixed menu rendering issue if the document was in rtl mode.
|
| 121 |
+
Fixed bug where the hide function would throw an error about a missing variable.
|
| 122 |
+
Fixed bug where autolink wouldn't convert URLs when hitting enter on IE due to the new enter key logic.
|
| 123 |
+
Fixed bug where formatting using shortcuts like ctrl+b wouldn't work properly the first time.
|
| 124 |
+
Fixed bug where selection.setContent after a formatter call wouldn't generate formatted contents.
|
| 125 |
+
Fixed bug where whitespace would be removed before/after invalid_elements when they where removed.
|
| 126 |
+
Fixed bug where updating styles using the theme image dialog in non inline mode on IE9 would produce errors.
|
| 127 |
+
Fixed bug where IE 8 would produce an error when using the contextmenu plugin.
|
| 128 |
+
Fixed bug where delete/backspace could remove contents of noneditable elements.
|
| 129 |
+
Fixed so background color in style preview gets computed from body element if the current style element is transparent.
|
| 130 |
+
Version 3.5b3 (2012-03-29)
|
| 131 |
+
Added cancel button to colour picker dialog.
|
| 132 |
+
Added figure and figcaption to the html5 visualblocks plugin.
|
| 133 |
+
Added default alignment options for the figure element.
|
| 134 |
+
Fixed bug where empty inline elements within block elements would sometimes produce a br child element.
|
| 135 |
+
Fixed bug where urls pointing to the same domain as the current one would cause undefined errors. Patch contributed by Paul Giberson.
|
| 136 |
+
Fixed bug where enter inside an editable element inside an non editable element would split the element.
|
| 137 |
+
Fixed bug where cut/copy/paste of noneditable elements didn't work.
|
| 138 |
+
Fixed bug where backspace would sometimes produce font elements on WebKit.
|
| 139 |
+
Fixed bug where WebKit would produce spans out of various inline elements when using backspace.
|
| 140 |
+
Fixed bug where IE9 wouldn't properly update image styles when images where resized.
|
| 141 |
+
Fixed bug where drag/drop of noneditable elements didn't work correctly.
|
| 142 |
+
Fixed bug where applying formatting to all contents wouldn't work correctly when an end point was inside an empty bock. Patch contributed by Jose Luiz.
|
| 143 |
+
Fixed bug where IE10 removed the scopeName from the DOM element interface and there for it produced an undefined string in element path.
|
| 144 |
+
Fixed bug where the caret would be placed at an incorrect location if you applied block formatting while having the caret at the end of the block.
|
| 145 |
+
Fixed bug where applying column changes using the cell dialog would only update the first column. Patch contributed by krzyko.
|
| 146 |
+
Fixed bug where the visualblocks plugin would force editor focus if it was turned on by default.
|
| 147 |
+
Fixed bug where the tabfocus plugin would tab to iframes these are now ignored.
|
| 148 |
+
Fixed bug where format drop down list wouldn't show the currently active format for a parent element.
|
| 149 |
+
Fixed bug where paste of plain text in IE 9 would remove the new line characters from text.
|
| 150 |
+
Fixed bug where the menu buttons/split button menus wouldn't be opened at the right location on older IE versions.
|
| 151 |
+
Fixed bug where Gecko browsers wouldn't properly display the right format when having the selection as specific places.
|
| 152 |
+
Fixed bug where shift+enter inside the body when having forced_root_blocks set to false would throw an error.
|
| 153 |
+
Fixed bug where the jQuery plugin would break the attr method of jQuery 1.7.2. Patch contributed by Markus Kemmerling.
|
| 154 |
+
Fixed so options like content_css accepts and array as well as a comma separated string as input.
|
| 155 |
+
Restructured the internal logic to make it more separate from Editor.js.
|
| 156 |
+
Updated the Sizzle engine to the latest version.
|
| 157 |
+
Version 3.5b2 (2012-03-15)
|
| 158 |
+
Rewrote the enter key logic to normalize browser behavior.
|
| 159 |
+
Fixed so enter within PRE elements produces a BR and shift+enter breaks/end the PRE. Can be disabled using the br_in_pre option.
|
| 160 |
+
Fixed bug where the selection wouldn't be correct after applying formatting and having the caret at the end of the new format node.
|
| 161 |
+
Fixed bug where the noneditable plugin would process contents on raw input calls for example on undo/redo calls.
|
| 162 |
+
Fixed bug where WebKit could produce an exception when a bookmark was requested when there wasn't a proper selection.
|
| 163 |
+
Fixed bug where WebKit would fail to open the image dialog since it would be returning false for a class name instead of a string.
|
| 164 |
+
Fixed so alignment and indentation works properly when forced_root_blocks is set to false. It will produce a DIV by default.
|
| 165 |
+
Version 3.5b1 (2012-03-08)
|
| 166 |
+
Added new event class that is faster and enables support for faking events.
|
| 167 |
+
Added new self_closing_elements, short_ended_elements, boolean_attributes, non_empty_elements and block_elements options to control the HTML Schema.
|
| 168 |
+
Added new schema option and support for the HTML5 schema.
|
| 169 |
+
Added new visualblocks plugin that shows html5 blocks with visual borders.
|
| 170 |
+
Added new types and selector options to make it easier to create editor instances with different configs.
|
| 171 |
+
Added new preview of formatting options in various listboxes.
|
| 172 |
+
Added new preview_styles option that enables control over what gets previewed.
|
| 173 |
+
Fixed bug where content css would be loaded twice into iframe.
|
| 174 |
+
Fixed bug where start elements with only whitespace in the attribute part wouldn't be correctly parsed.
|
| 175 |
+
Fixed bug where the advlink dialog would produce an error about the addSelectAccessibility function not being defined.
|
| 176 |
+
Fixed bug where the caret would be placed at an incorrect position if span was removed by the invalid_elements setting.
|
| 177 |
+
Fixed bug where elements inside a white space preserve element like pre didn't inherit the behavior while parsing.
|
| 178 |
+
Version 3.4.9 (2012-02-23)
|
| 179 |
+
Added settings to wordcount plugin to configure update rate and checking wordcount on backspace and delete using wordcount_update_rate and wordcount_update_on_delete.
|
| 180 |
+
Fixed bug in Webkit and IE where deleting empty paragraphs would remove entire editor contents.
|
| 181 |
+
Fixed bug where pressing enter on end of list item with a heading would create a new item with heading.
|
| 182 |
+
Fixed edit css style dialog text-decoration none checkbox so it disables other text-decoration options when enabled.
|
| 183 |
+
Fixed bug in Gecko where undo wasn't added when focus was lost.
|
| 184 |
+
Fixed bug in Gecko where shift-enter in table cell ending with BR doesn't move caret to new line.
|
| 185 |
+
Fixed bug where right-click on formatted text in IE selected the entire line.
|
| 186 |
+
Fixed bug where text ending with space could not be unformatted in IE.
|
| 187 |
+
Fixed bug where caret formatting would be removed when moving the caret when a selector expression was used.
|
| 188 |
+
Fixed bug where formatting would be applied to the body element when all contents where selected and format had both inline and selector parts.
|
| 189 |
+
Fixed bug where the media plugin would throw errors if you had iframe set as an invalid element in config.
|
| 190 |
+
Fixed bug where the caret would be placed at the top of the document if you inserted a table and undo:ed that operation. Patch contributed by Wesley Walser.
|
| 191 |
+
Fixed bug where content css files where loaded twice into the iframe.
|
| 192 |
+
Fixed so elements with comments would be trated as non empty elements. Patch contributed by Arjan Scherpenisse.
|
| 193 |
+
Version 3.4.8 (2012-02-02)
|
| 194 |
+
Fixed bug in IE where selected text ending with space cannot be formatted then formatted again to get original text.
|
| 195 |
+
Fixed bug in IE where images larger than editor area were being deselected when toolbar buttons are clicked.
|
| 196 |
+
Fixed bug where wrong text align buttons are active when multiple block elements are selected.
|
| 197 |
+
Fixed bug where selected link not showing in target field of link dialog in some selection cases.
|
| 198 |
+
Use settings for remove_trailing_br so this can be turned off instead of hard coding the value.
|
| 199 |
+
Fixed bug in IE where the media plugin displayed null text when some values aren't filled in.
|
| 200 |
+
Added API method 'onSetAttrib' that fires when the attribute value on a node changes.
|
| 201 |
+
Fix font size dropdown value not being updated when text already has a font size in the advanced template.
|
| 202 |
+
Fixed bug in IE where IE doesn't use ARIA attributes properly on options - causing labels to be read out 2 times.
|
| 203 |
+
Fixed bug where caret cannot be placed after table if table is at end of document in IE.
|
| 204 |
+
Fixed bug where adding range isn't always successful so we need to check range count otherwise an exception can occur.
|
| 205 |
+
Added spacebar onclick handler to toolbar buttons to ensure that the accessibility behaviour works correctly.
|
| 206 |
+
Fixed bug where a stranded bullet point would get created in WebKit.
|
| 207 |
+
Fixed bug where selecting text in a blockquote and pressing backspace toggles the style.
|
| 208 |
+
Fixed bug where pressing enter from a heading in IE, the resulting P tag below it shares the style property.
|
| 209 |
+
Fix white space in between spans from being deleted.
|
| 210 |
+
Fixed bug where scrollbars where visible in the character map dialog on Gecko.
|
| 211 |
+
Fixed issue with missing translation for one of the emoticons.
|
| 212 |
+
Fixed bug where dots in id:s where causing problems. Patch provided by Abhishek Dev.
|
| 213 |
+
Fixed bug where urls with an at sign in the path wouldn't be parsed correctly. Patch contributed by Jason Grout.
|
| 214 |
+
Fixed bug where Opera would remove the first character of a inline formatted word if you pressed backspace.
|
| 215 |
+
Fixed bugs with the autoresize plugin on various browsers and removed the need for the throbber.
|
| 216 |
+
Fixed performance issue where the contextmenu plugin would try to remove the menu even if it was removed. Patch contributed by mhu.
|
| 217 |
+
Version 3.4.7 (2011-11-03)
|
| 218 |
+
Modified the caret formatting behavior to word similar to common desktop wordprocessors like Word or Libre Office.
|
| 219 |
+
Fixed bug in Webkit - Cursor positioning does not work vertically within a table cell with multiple lines of text.
|
| 220 |
+
Fixed bug in IE where Inserting a table in IE8 places cursor in the second cell of the first row.
|
| 221 |
+
Fixed bug in IE where editor in a frame doesn't give focus to the toolbar using ALT-F10.
|
| 222 |
+
Fix for webkit and gecko so that deleting bullet from start of list outdents inner list items and moves first item into paragraph.
|
| 223 |
+
Fix new list items in IE8 not displayed on a new line when list contains nested list items.
|
| 224 |
+
Clear formatting in table cell breaks the cell.
|
| 225 |
+
Made media type list localisable.
|
| 226 |
+
Fix out of memory error when using prototype in media dialog.
|
| 227 |
+
Fixed bug where could not add a space in the middle of a th cell.
|
| 228 |
+
Fixed bug where adding a bullet between two existing bullets adds an extra one
|
| 229 |
+
Fixed bug where trying to insert a new entry midway through a bulleted list fails dismally when the next entry is tabbed in.
|
| 230 |
+
Fixed bug where pressing enter on an empty list item does not outdent properly in FF
|
| 231 |
+
Fixed bug where adding a heading after a list item in a table cell changes all styles in that cell
|
| 232 |
+
Fixed bug where hitting enter to exit from a bullet list moves cursor to the top of the page in Firefox.
|
| 233 |
+
Fixed bug where pressing backspace would not delete HRs in Firefox and IE when next to an empty paragraph.
|
| 234 |
+
Fixed bug where deleting part of the link text can cause a link with no destination to be saved.
|
| 235 |
+
Fixed bug where css style border widths wasn't handled correctly in table dialog.
|
| 236 |
+
Fixed bug where parsing invalid html contents on IE or WebKit could produce an infinite loop.
|
| 237 |
+
Fixed bug where scripts with custom script types wasn't properly passed though the editor.
|
| 238 |
+
Fixed issue where some Japanese kanji characters wasn't properly entity encoded when numeric entity mode was enabled.
|
| 239 |
+
Made emoticons dialog use the keyboard naviation.
|
| 240 |
+
Added navigation instructions to the symbols dialog.
|
| 241 |
+
Added ability to set default values for the media plugin.
|
| 242 |
+
Added new font_size_legacy_values option for converting old font element sizes to span with font-size properties.
|
| 243 |
+
Fixed bug where the symbols dialog was not accessible.
|
| 244 |
+
Added quirk for IE ensuring that the body of the document containing tinyMCE has a role="application" for accessibility.
|
| 245 |
+
Fixed bug where the advanced color picker wasn't working properly on FF 7.
|
| 246 |
+
Fixed issue where the advanced color picker was producing uppercase hex codes.
|
| 247 |
+
Fixed bug where IE 8 could throw exceptions if the contents contained resizable content elements.
|
| 248 |
+
Fixed bug where caret formatting wouldn't be correctly applied to previous sibling on WebKit.
|
| 249 |
+
Fixed bug where the select boxes for font size/family would loose it's value on WebKit due to recent iOS fixes.
|
| 250 |
+
Version 3.4.6 (2011-09-29)
|
| 251 |
+
Fixed bug where list items were being created for empty divs.
|
| 252 |
+
Added support in Media plugin for audio media using the embed tag
|
| 253 |
+
Fixed accessibility bugs in WebKit and IE8 where toolbar items were not being read.
|
| 254 |
+
Added new use_accessible_selects option to ensure accessible list boxes are used in all browsers (custom widget in firefox native on other browsers)
|
| 255 |
+
Fixed bug where classid attribute was not being checked from embed objects.
|
| 256 |
+
Fixed bug in jsrobot tests with intermittently failing.
|
| 257 |
+
Fixed bug where anchors wasn't updated properly if you edited them using IE 8.
|
| 258 |
+
Fixed bug where input method on WebKit on Mac OS X would fail to initialize when sometimes focusing the editor.
|
| 259 |
+
Fixed bug where it wasn't possible to select HR elements on WebKit by simply clicking on them.
|
| 260 |
+
Fixed bug where the media plugin wouldn't work on IE9 when not using the inlinepopups plugin.
|
| 261 |
+
Fixed bug where hspace,vspace,align and bgcolor would be removed from object elements in the media plugin.
|
| 262 |
+
Fixed bug where the new youtube format wouldn't be properly parsed by the media plugin.
|
| 263 |
+
Fixed bug where the style attribute of layers wasn't properly updated on IE and Gecko.
|
| 264 |
+
Fixed bug where editing contents in a layer would fail on Gecko since contentEditable doesn't inherit properly.
|
| 265 |
+
Fixed bug where IE 6/7 would produce JS errors when serializing contents containing layers.
|
| 266 |
+
Version 3.4.5 (2011-09-06)
|
| 267 |
+
Fixed accessibility bug in WebKit where the right and left arrow keys would update native list boxes.
|
| 268 |
+
Added new whitespace_elements option to enable users to specify specific elements where the whitespace is preserved.
|
| 269 |
+
Added new merge_siblings option to formats. This option makes it possible to disable the auto merging of siblings when applying formats.
|
| 270 |
+
Fixed bug in IE where trailing comma in paste plugin would cause plugin to not run correctly.
|
| 271 |
+
Fixed bug in WebKit where console messages would be logged when deleting an empty document.
|
| 272 |
+
Fixed bug in IE8 where caret positioned is on list item instead of paragraph when outdent splits the list
|
| 273 |
+
Fixed bug with image dialogs not inserting an image if id was omitted from valid_elements.
|
| 274 |
+
Fixed bug where the selection normalization logic wouldn't properly handle image elements in specific config cases.
|
| 275 |
+
Fixed bug where the map elements coords attribute would be messed up by IE when serializing the DOM.
|
| 276 |
+
Fixed bug where IE wouldn't properly handle custom elements when the contents was serialized.
|
| 277 |
+
Fixed bug where you couldn't move the caret in Gecko if you focused the editor using the API or a UI control.
|
| 278 |
+
Fixed bug where adjacent links would get merged on IE due to bugs in their link command.
|
| 279 |
+
Fixed bug where the color split buttons would loose the selection on IE if the editor was placed in a frame/iframe.
|
| 280 |
+
Fixed bug where floated images in WebKit wouldn't get properly linked.
|
| 281 |
+
Fixed bug where the fullscreen mode in a separate window wasn't forced into IE9+ standards mode.
|
| 282 |
+
Fixed bug where pressing enter in an empty editor on WebKit could produce DIV elements instead of P.
|
| 283 |
+
Fixed bug where spans would get removed incorrectly when merging two blocks on backspace/delete on WebKit.
|
| 284 |
+
Fixed bug where the editor contents wouldn't be completely removed on backspace/delete on WebKit.
|
| 285 |
+
Fixed bug where the fullpage plugin wouldn't properly render style elements in the head on IE 6/7.
|
| 286 |
+
Fixed bug where the nonbreaking_force_tab option in the nonbreaking plugin wouldn't work on Gecko/WebKit.
|
| 287 |
+
Fixed bug where the isDirty state would become true on non IE browsers if there was an table at the end of the contents.
|
| 288 |
+
Fixed bug where entities wasn't properly encoded on WebKit when pasting text as plain text.
|
| 289 |
+
Fixed bug where empty editors would produce an exception of valid_elements didn't include body and forced_root_blocks where disabled.
|
| 290 |
+
Fixed bug where the fullscreen mode wouldn't retain the header/footer in the fullpage plugin.
|
| 291 |
+
Fixed issue where the plaintext_mode and plaintext_mode_sticky language keys where swapped.
|
| 292 |
+
Version 3.4.4 (2011-08-04)
|
| 293 |
+
Added new html5 audio support. Patch contributed by Ronald M. Clifford.
|
| 294 |
+
Added mute option for video elements and preload options for video/audio patch contributed by Dmitry Kalinkin.
|
| 295 |
+
Fixed selection to match visual selection before applying formatting changes.
|
| 296 |
+
Fixed browser specific bugs in lists for WebKit and IE.
|
| 297 |
+
Fixed bug where IE would scroll the window if you closed an inline dialog that was larger than the viewport. Patch by Laurence Keijmel.
|
| 298 |
+
Fixed bug where pasting contents near a span element could remove parts of that span. Patch contributed by Wesley Walser.
|
| 299 |
+
Fixed bug where formatting change would be lost after pressing enter.
|
| 300 |
+
Fixed bug in WebKit where deleting across blocks would add extra styles.
|
| 301 |
+
Fixed bug where moving cursor vertically in tables in WebKit wasn't working.
|
| 302 |
+
Fixed bug in IE where deleting would cause error in console.
|
| 303 |
+
Fixed bug where the formatter was not applying formats across list elements.
|
| 304 |
+
Fixed bug where the wordcount plugin would try and update the wordcount if tinymce had been destroyed.
|
| 305 |
+
Fixed bug where tabfocus plugin would attempt to focus elements not displayed when their parent element was hidden.
|
| 306 |
+
Fixed bug where the contentEditable state would sometimes be removed if you deleted contents in Gecko.
|
| 307 |
+
Fixed bug where inserting contents using mceInsertContent would fail if "span" was disabled in valid_elements.
|
| 308 |
+
Fixed bug where initialization might fail if some resource on gecko wouldn't load properly and fire the onload event.
|
| 309 |
+
Fixed bug where ctrl+7/8/9 keys wouldn't properly add the specific formats associated with them.
|
| 310 |
+
Fixed bug where the HTML tags wasn't properly closed in the style plugins properties dialog.
|
| 311 |
+
Fixed bug where the list plugin would produce an exception if the user tried to delete an element at the very first location.
|
| 312 |
+
Version 3.4.3.2 (2011-06-30)
|
| 313 |
+
Fixed bug where deleting all of a paragraph inside a table cell would behave badly in webkit.
|
| 314 |
+
Fixed bugs in tests in firefox5 and WebKit.
|
| 315 |
+
Fixed bug where selection of table cells would produce an exception on Gecko.
|
| 316 |
+
Fixed bug where the caret wasn't properly rendered on Gecko when the editor was hidden.
|
| 317 |
+
Fixed bug where pasting plain text into WebKit would produce a pre element it will now produce more semantic markup.
|
| 318 |
+
Fixed bug where selecting list type formats using the advlist plugin on IE8 would loose editor selection.
|
| 319 |
+
Fixed bug where forced root blocks logic wouldn't properly pad elements created if they contained data attributes.
|
| 320 |
+
Fixed bug where it would remove all contents of the editor if you inserted an image when not having a caret in the document.
|
| 321 |
+
Fixed bug where the YUI compressor wouldn't properly encode strings with only a quote in them.
|
| 322 |
+
Fixed bug where WebKit on iOS5 wouldn't call nodeChanged when the selection was changed.
|
| 323 |
+
Fixed bug where mceFocus command wouldn't work properly on Gecko since it didn't focus the body element.
|
| 324 |
+
Fixed performance issue with the noneditable plugin where it would enable/disable controls to often.
|
| 325 |
+
Version 3.4.3.1 (2011-06-16)
|
| 326 |
+
Fixed bug where listboxes were not being handled correctly by JAWS in firefox with the o2k7 skin.
|
| 327 |
+
Fixed bug where custom buttons were not being rendered correctly when in high contrast mode.
|
| 328 |
+
Added support for iOS 5 that now supporting contentEditable in it's latest beta.
|
| 329 |
+
Fixed bug where urls in style attributes with a _ character followed by a number would cause incorrect output.
|
| 330 |
+
Fixed bug where custom_elements option wasn't working properly on IE browsers.
|
| 331 |
+
Fixed bug where custom_elements marked as block elements wouldn't get correctly treated as block elements.
|
| 332 |
+
Fixed bug where attributes with </> wasn't properly encoded as XML entities.
|
| 333 |
+
Version 3.4.3 (2011-06-09)
|
| 334 |
+
Fixed bug where deleting backwards before an image into a list would put the cursor in the wrong location.
|
| 335 |
+
Fixed bug where styles plugin would not apply styles across multiple selected block elements correctly.
|
| 336 |
+
Fixed bug where cursor would jump to start of document when selection contained empty table cells in IE8.
|
| 337 |
+
Fixed bug where applied styles wouldn't be kept if you pressed enter twice to produce two paragraphs.
|
| 338 |
+
Fixed bug where a ghost like caret would appear on Gecko when pressing enter while having a text color applied.
|
| 339 |
+
Fixed bug where IE would produce absolute urls if you inserted a image/link and reloaded the page.
|
| 340 |
+
Fixed bug where applying a heading style to a list item would cascade style to children list items.
|
| 341 |
+
Fixed bug where Editor loses focus when backspacing and changing styles in WebKit.
|
| 342 |
+
Fixed bug where exception was thrown in tinymce.util.URI when parsing a relative URI and no base_uri setting was provided.
|
| 343 |
+
Fixed bug where alt-f10 was not always giving focus to the toolbar on Safari.
|
| 344 |
+
Added new 'allow_html_in_named_anchor' option to allow html to occur within a named anchor tag. Use at own risk.
|
| 345 |
+
Added plugin dependency support. Will autoload plugins specified as a dependency if they haven't been loaded.
|
| 346 |
+
Fixed bug where the autolink plugin didn't work with non-English keyboards when pressing ).
|
| 347 |
+
Added possibility to change properties of all table cells in a column.
|
| 348 |
+
Added external_image_list option to get images list from user-defined variable or function.
|
| 349 |
+
Fixed bug where the autoresize plugin wouldn't reduce the editors height on Chrome.
|
| 350 |
+
Fixed bug where table size inputs were to small for values with size units.
|
| 351 |
+
Fixed bug where table cell/row size input values were not validated.
|
| 352 |
+
Fixed bug where menu item line-height would be set to wrong value by external styles.
|
| 353 |
+
Fixed bug where hasUndo() would return wrong answer.
|
| 354 |
+
Fixed bug where page title would be set to undefined by fullpage plugin.
|
| 355 |
+
Fixed bug where HTML5 video properties were not updated in embedded media settings.
|
| 356 |
+
Fixed bug where HTML comment on the first line would cause an error.
|
| 357 |
+
Fixed bug where spellchecker menu was positioned incorrectly on IE.
|
| 358 |
+
Fixed bug where breaking out of list elements on WebKit would produce a DIV instead of P after the list.
|
| 359 |
+
Fixed bug where pasting from Word in IE9 would add extra BR elements when text was word wrapped.
|
| 360 |
+
Fixed bug where numeric entities with leading zeros would produce incorrect decoding.
|
| 361 |
+
Fixed bug where hexadecimal entities wasn't properly decoded.
|
| 362 |
+
Fixed bug where bookmarks wasn't properly stored/restored on undo/redo.
|
| 363 |
+
Fixed bug where the mceInsertCommand didn't retain the values of links if they contained non url contents.
|
| 364 |
+
Fixed bug where the valid_styles option wouldn't be properly used on styles for specific elements.
|
| 365 |
+
Fixed so contentEditable is used for the body of the editor if it's supported.
|
| 366 |
+
Fixed so trailing BR elements gets removed even when forced_root_blocks option was set to false/null.
|
| 367 |
+
Fixed performance issue with mceInsertCommand and inserting very simple contents.
|
| 368 |
+
Fixed performance issue with older IE version and huge documents by optimizing the forced root blocks logic.
|
| 369 |
+
Fixed performance issue with table plugin where it checked for selected cells to often.
|
| 370 |
+
Fixed bug where creating a link on centered/floated image would produce an error on WebKit browsers.
|
| 371 |
+
Fixed bug where Gecko would remove single paragraphs if there where contents before/after it.
|
| 372 |
+
Fixed bug where the scrollbar would move up/down when pasting contents using the paste plugin.
|
| 373 |
+
Version 3.4.2 (2011-04-07)
|
| 374 |
+
Added new 'paste_text_sticky_default' option to paste plugin, enables you to set the default state for paste as plain text.
|
| 375 |
+
Added new autoresize_bottom_margin option to autoresize plugin that enables you to add an extra margin at the bottom. Patch contributed by Andrew Ozz.
|
| 376 |
+
Rewritten the fullpage plugin to handle style contents better and have a more normalized behavior across browsers.
|
| 377 |
+
Fixed bug where contents inserted with mceInsertContent wasn't parsed using the default dom parser.
|
| 378 |
+
Fixed bug where blocks containing a single anchor element would be treated as empty.
|
| 379 |
+
Fixed bug where merging of table cells on IE 6, 7 wouldn't look correctly until the contents was refreshed.
|
| 380 |
+
Fixed bug where context menu wouldn't work properly on Safari since it was passing out the ctrl key as pressed.
|
| 381 |
+
Fixed bug where image border color/style values were overwritten by advimage plugin.
|
| 382 |
+
Fixed bug where setting border in advimage plugin would throw error in IE.
|
| 383 |
+
Fixed bug where empty anchors list in link settings wasn't hidden.
|
| 384 |
+
Fixed bug where xhtmlextras popups were missing localized popup-size parameters.
|
| 385 |
+
Fixed bug where the context menu wouldn't select images on WebKit browsers.
|
| 386 |
+
Fixed bug where paste plugin wouldn't properly extract the contents on WebKit due to recent changes in browser behavior.
|
| 387 |
+
Fixed bug where focus of the editor would get on control contents on IE lost due to a bug in the ColorSplitButton control.
|
| 388 |
+
Fixed bug where contextmenu wasn't disabled on noneditable elements.
|
| 389 |
+
Fixed bug where getStyle function would trigger error when called on element without style property.
|
| 390 |
+
Fixed bug where editor fail to load if Javascript Compressor was used.
|
| 391 |
+
Fixed bug where list-style-type=lower-greek would produce errors in IE<8.
|
| 392 |
+
Fixed bug where spellchecker plugin would produce errors on IE6-7.
|
| 393 |
+
Fixed bug where theme_advanced_containers configuration option causes error.
|
| 394 |
+
Fixed bug where the mceReplaceContent command would produce an error since it didn't correctly handle a return value.
|
| 395 |
+
Fixed bug where you couldn't enter float point values for em in dialog input fields since it wouldn't be considered a valid size.
|
| 396 |
+
Fixed bug in xhtmlxtras plugin where it wasn't possible to remove some attributes in the attributes dialog.
|
| 397 |
+
Version 3.4.1 (2011-03-24)
|
| 398 |
+
Added significantly improved list handling via the new 'lists' plugin.
|
| 399 |
+
Added 'autolink' plugin to enable automatically linking URLs. Similar to the behavior IE has by default.
|
| 400 |
+
Added 'theme_advanced_show_current_color' setting to enable the forecolor and backcolor buttons to continuously show the current text color.
|
| 401 |
+
Added 'contextmenu_never_use_native' setting to disable the ctrl-right-click showing the native browser context menu behaviour.
|
| 402 |
+
Added 'paste_enable_default_filters' setting to enable the default paste filters to be disabled.
|
| 403 |
+
Fixed bug where selection locations on undo/redo didn't work correctly on specific contents.
|
| 404 |
+
Fixed bug where an exception would be trown on IE when loading TinyMCE inside an iframe.
|
| 405 |
+
Fixed bug where some ascii numeric entities wasn't properly decoded.
|
| 406 |
+
Fixed bug where some non western language codes wasn't properly decoded/encoded.
|
| 407 |
+
Fixed bug where undo levels wasn't created when deleting contents on IE.
|
| 408 |
+
Fixed bug where the initial undo levels bookmark wasn't updated correctly.
|
| 409 |
+
Fixed bug where search/replace wouldn't be scoped to editor instances on IE8.
|
| 410 |
+
Fixed bug where IE9 would produce two br elements after block elements when pasting.
|
| 411 |
+
Fixed bug where IE would place the caret at an incorrect position after a paste operation.
|
| 412 |
+
Fixed bug where a paste operation using the keyboard would add an extra undo level.
|
| 413 |
+
Fixed bug where some attributes/elements wasn't correctly filtered when invalid contents was inserted.
|
| 414 |
+
Fixed bug where the table plugin couldn't correctly handle invalid table structures.
|
| 415 |
+
Fixed bug where charset and title of the page were handled incorrectly by the fullpage plugin.
|
| 416 |
+
Fixed bug where toggle states on some of the list boxes didn't update correctly.
|
| 417 |
+
Fixed bug where sub/sub wouldn't work correctly when done as a caret action in Chrome 10.
|
| 418 |
+
Fixed bug where the constrain proportions checkbox wouldn't work in the media plugin.
|
| 419 |
+
Fixed bug where block elements containing trailing br elements wouldn't treated properly if they where invalid.
|
| 420 |
+
Fixed bug where the color picker dialog wouldn't be rendered correctly when using the o2k7 theme.
|
| 421 |
+
Fixed bug where setting border=0 using advimage plugin invalid style attribute content was created in Chrome.
|
| 422 |
+
Fixed bug with references to non-existing images in css of fullpage plugin.
|
| 423 |
+
Fixed bug where item could be unselected in spellchecker's language selector.
|
| 424 |
+
Fixed bug where some mispelled words could be not highlighted using spellchecker plugin.
|
| 425 |
+
Fixed bug where spellchecking would merge some words on IE.
|
| 426 |
+
Fixed bug where spellchecker context menu was not always positioned correctly.
|
| 427 |
+
Fixed bug with empty anchors list in advlink popup when Invisible Elements feature was disabled.
|
| 428 |
+
Fixed bug where older IE versions wouldn't properly handle some elements if they where placed at the top of editor contents.
|
| 429 |
+
Fixed bug where selecting the whole table would enable table tools for cells and rows.
|
| 430 |
+
Fixed bug where it wasn't possible to replace selected contents on IE when pasting using the paste plugin.
|
| 431 |
+
Fixed bug where setting text color in fullpage plugin doesn't work.
|
| 432 |
+
Fixed bug where the state of checkboxes in media plugin wouldn't be set correctly.
|
| 433 |
+
Fixed bug where black spade suit character was not included in special character selector.
|
| 434 |
+
Fixed bug where setting invalid values for table cell size would throw an error in IE.
|
| 435 |
+
Fixed bug where spellchecking would remove whitespace characters from PRE block in IE.
|
| 436 |
+
Fixed bug where HR was inserted inside P elements instead of splitting them.
|
| 437 |
+
Fixed bug where extra, empty span tags were added when using a format with both selector and inline modes.
|
| 438 |
+
Fixed bug where bullet lists weren't always detected correctly.
|
| 439 |
+
Fixed bug where deleting some paragraphs on IE would cause an exception.
|
| 440 |
+
Fixed bug where the json encoder logic wouldn't properly encode \ characters.
|
| 441 |
+
Fixed bug where the onChange event would be fired when the editor was first initialized.
|
| 442 |
+
Fixed bug where mceSelected wouldn't be removed properly from output even if it's an internal class.
|
| 443 |
+
Fixed issue with table background colors not being transparent. This improves compliance with users browser color preferences.
|
| 444 |
+
Fixed issue where styles were not included when using the full page plugin.
|
| 445 |
+
Fixed issue where drag/drop operations wasn't properly added to the undo levels.
|
| 446 |
+
Fixed issue where colors wasn't correctly applied to elements with underline decoration.
|
| 447 |
+
Fixed issue where deleting some paragraphs on IE would cause an exception.
|
| 448 |
+
Version 3.4 (2011-03-10)
|
| 449 |
+
Added accessibility example with various accessibility options contributed by Ephox.
|
| 450 |
+
Fixed bug where attributes wasn't properly handled in the xhtmlxtras plugin.
|
| 451 |
+
Fixed bug where the image.htm had some strange td artifacts probably due to auto merging.
|
| 452 |
+
Fixed bug where the ToolbarGroup had an missing reference to this in it's destroy method.
|
| 453 |
+
Fixed bug with the resizeBy function in the advanced theme where it was scaled by the wrong parent.
|
| 454 |
+
Fixed bug where an exception would be thrown by the element if the page was served in xhtml mode.
|
| 455 |
+
Fixed bug where mceInsertContent would throw an exception when page was served in xhtml mode.
|
| 456 |
+
Fixed bug where you couldn't select a forground/background color when page was served in xhtml mode.
|
| 457 |
+
Fixed bug where the editor would scroll to the toolbar when clicked due to a call to focus in ListBox.
|
| 458 |
+
Fixed bug where pages with rtl dir wouldn't render split buttons correctly when using the o2k7 theme.
|
| 459 |
+
Fixed bug where anchor elements with names wasn't properly collapsed as they where in 3.3.x.
|
| 460 |
+
Fixed bug where WebKit wouldn't properly handle image selection if it was done left to right.
|
| 461 |
+
Fixed bug where the formatter would align images when the selection range was collapsed.
|
| 462 |
+
Fixed bug where the image button would be active when the selection range was collapsed.
|
| 463 |
+
Fixed bug where the element_format option wasn't used by the new (X)HTML serializer logic.
|
| 464 |
+
Fixed bug where the table cell/row dialogs would produce empty attributes.
|
| 465 |
+
Fixed bug where the tfoot wouldn't be added to the top of the table.
|
| 466 |
+
Fixed bug where the formatter would merge siblings with white space between them.
|
| 467 |
+
Fixed bug where pasting headers and paragraphs would produce an extra paragraph.
|
| 468 |
+
Fixed bug where the ColorSplitButton would throw an exception if you clicked out side a color.
|
| 469 |
+
Fixed bug where IE9 wouldn't properly produce new paragraphs on enter if the current paragraph had formatting.
|
| 470 |
+
Fixed bug where multiple BR elements at end of block elements where removed.
|
| 471 |
+
Fixed bug where fullscreen plugin wouldn't correctly display the edit area on IE6 for long pages.
|
| 472 |
+
Fixed bug where paste plugin wouldn't properly encode raw entities when pasting in plain text mode.
|
| 473 |
+
Fixed bug where the search/replace plugin wouldn't work correctly on IE 9.
|
| 474 |
+
Fixed so the drop menus doesn't get an outline border visible when focused, patch contributed by Ephox.
|
| 475 |
+
Fixed so the values entered in the color picker are forced to hex values.
|
| 476 |
+
Removed dialog workaround for IE 9 beta since the RC is now out and people should upgrade.
|
| 477 |
+
Removed obsolete calls in various plugins to the mceBeginUndoLevel command.
|
js/tinymce/examples/accessibility.html
CHANGED
|
@@ -24,9 +24,9 @@
|
|
| 24 |
|
| 25 |
// Example content CSS (should be your site CSS)
|
| 26 |
// using false to ensure that the default browser settings are used for best Accessibility
|
| 27 |
-
// ACCESSIBILITY SETTINGS
|
| 28 |
content_css : false,
|
| 29 |
-
// Use browser preferred colors for dialogs.
|
| 30 |
browser_preferred_colors : true,
|
| 31 |
detect_highcontrast : true,
|
| 32 |
|
|
@@ -65,13 +65,13 @@
|
|
| 65 |
|
| 66 |
<p>
|
| 67 |
This page has got the TinyMCE set up to work with configurations related to accessiblity enabled.
|
| 68 |
-
In particular
|
| 69 |
-
<ul>
|
| 70 |
-
<li>the <strong>content_css</strong> is set to false, to ensure that all default browser styles are used, </li>
|
| 71 |
-
<li>the <strong>browser_preferred_colors</strong> dialog option is used to ensure that default css is used for dialogs, </li>
|
| 72 |
-
<li>and the <strong>detect_highcontrast</strong> option has been set to ensure that highcontrast mode in Windows browsers
|
| 73 |
-
is detected and the toolbars are displayed in a high contrast mode.</li>
|
| 74 |
-
</ul>
|
| 75 |
</p>
|
| 76 |
|
| 77 |
<!-- Gets replaced with TinyMCE, remember HTML in a textarea should be encoded -->
|
|
@@ -98,4 +98,4 @@ if (document.location.protocol == 'file:') {
|
|
| 98 |
}
|
| 99 |
</script>
|
| 100 |
</body>
|
| 101 |
-
</html>
|
| 24 |
|
| 25 |
// Example content CSS (should be your site CSS)
|
| 26 |
// using false to ensure that the default browser settings are used for best Accessibility
|
| 27 |
+
// ACCESSIBILITY SETTINGS
|
| 28 |
content_css : false,
|
| 29 |
+
// Use browser preferred colors for dialogs.
|
| 30 |
browser_preferred_colors : true,
|
| 31 |
detect_highcontrast : true,
|
| 32 |
|
| 65 |
|
| 66 |
<p>
|
| 67 |
This page has got the TinyMCE set up to work with configurations related to accessiblity enabled.
|
| 68 |
+
In particular
|
| 69 |
+
<ul>
|
| 70 |
+
<li>the <strong>content_css</strong> is set to false, to ensure that all default browser styles are used, </li>
|
| 71 |
+
<li>the <strong>browser_preferred_colors</strong> dialog option is used to ensure that default css is used for dialogs, </li>
|
| 72 |
+
<li>and the <strong>detect_highcontrast</strong> option has been set to ensure that highcontrast mode in Windows browsers
|
| 73 |
+
is detected and the toolbars are displayed in a high contrast mode.</li>
|
| 74 |
+
</ul>
|
| 75 |
</p>
|
| 76 |
|
| 77 |
<!-- Gets replaced with TinyMCE, remember HTML in a textarea should be encoded -->
|
| 98 |
}
|
| 99 |
</script>
|
| 100 |
</body>
|
| 101 |
+
</html>
|
js/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin_src.js
CHANGED
|
@@ -1,184 +1,184 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* editor_plugin_src.js
|
| 3 |
-
*
|
| 4 |
-
* Copyright 2011, Moxiecode Systems AB
|
| 5 |
-
* Released under LGPL License.
|
| 6 |
-
*
|
| 7 |
-
* License: http://tinymce.moxiecode.com/license
|
| 8 |
-
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
-
*/
|
| 10 |
-
|
| 11 |
-
(function() {
|
| 12 |
-
tinymce.create('tinymce.plugins.AutolinkPlugin', {
|
| 13 |
-
/**
|
| 14 |
-
* Initializes the plugin, this will be executed after the plugin has been created.
|
| 15 |
-
* This call is done before the editor instance has finished it's initialization so use the onInit event
|
| 16 |
-
* of the editor instance to intercept that event.
|
| 17 |
-
*
|
| 18 |
-
* @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
|
| 19 |
-
* @param {string} url Absolute URL to where the plugin is located.
|
| 20 |
-
*/
|
| 21 |
-
|
| 22 |
-
init : function(ed, url) {
|
| 23 |
-
var t = this;
|
| 24 |
-
|
| 25 |
-
// Add a key down handler
|
| 26 |
-
ed.onKeyDown.addToTop(function(ed, e) {
|
| 27 |
-
if (e.keyCode == 13)
|
| 28 |
-
return t.handleEnter(ed);
|
| 29 |
-
});
|
| 30 |
-
|
| 31 |
-
// Internet Explorer has built-in automatic linking for most cases
|
| 32 |
-
if (tinyMCE.isIE)
|
| 33 |
-
return;
|
| 34 |
-
|
| 35 |
-
ed.onKeyPress.add(function(ed, e) {
|
| 36 |
-
if (e.which == 41)
|
| 37 |
-
return t.handleEclipse(ed);
|
| 38 |
-
});
|
| 39 |
-
|
| 40 |
-
// Add a key up handler
|
| 41 |
-
ed.onKeyUp.add(function(ed, e) {
|
| 42 |
-
if (e.keyCode == 32)
|
| 43 |
-
return t.handleSpacebar(ed);
|
| 44 |
-
});
|
| 45 |
-
},
|
| 46 |
-
|
| 47 |
-
handleEclipse : function(ed) {
|
| 48 |
-
this.parseCurrentLine(ed, -1, '(', true);
|
| 49 |
-
},
|
| 50 |
-
|
| 51 |
-
handleSpacebar : function(ed) {
|
| 52 |
-
this.parseCurrentLine(ed, 0, '', true);
|
| 53 |
-
},
|
| 54 |
-
|
| 55 |
-
handleEnter : function(ed) {
|
| 56 |
-
this.parseCurrentLine(ed, -1, '', false);
|
| 57 |
-
},
|
| 58 |
-
|
| 59 |
-
parseCurrentLine : function(ed, end_offset, delimiter, goback) {
|
| 60 |
-
var r, end, start, endContainer, bookmark, text, matches, prev, len;
|
| 61 |
-
|
| 62 |
-
// We need at least five characters to form a URL,
|
| 63 |
-
// hence, at minimum, five characters from the beginning of the line.
|
| 64 |
-
r = ed.selection.getRng(true).cloneRange();
|
| 65 |
-
if (r.startOffset < 5) {
|
| 66 |
-
// During testing, the caret is placed inbetween two text nodes.
|
| 67 |
-
// The previous text node contains the URL.
|
| 68 |
-
prev = r.endContainer.previousSibling;
|
| 69 |
-
if (prev == null) {
|
| 70 |
-
if (r.endContainer.firstChild == null || r.endContainer.firstChild.nextSibling == null)
|
| 71 |
-
return;
|
| 72 |
-
|
| 73 |
-
prev = r.endContainer.firstChild.nextSibling;
|
| 74 |
-
}
|
| 75 |
-
len = prev.length;
|
| 76 |
-
r.setStart(prev, len);
|
| 77 |
-
r.setEnd(prev, len);
|
| 78 |
-
|
| 79 |
-
if (r.endOffset < 5)
|
| 80 |
-
return;
|
| 81 |
-
|
| 82 |
-
end = r.endOffset;
|
| 83 |
-
endContainer = prev;
|
| 84 |
-
} else {
|
| 85 |
-
endContainer = r.endContainer;
|
| 86 |
-
|
| 87 |
-
// Get a text node
|
| 88 |
-
if (endContainer.nodeType != 3 && endContainer.firstChild) {
|
| 89 |
-
while (endContainer.nodeType != 3 && endContainer.firstChild)
|
| 90 |
-
endContainer = endContainer.firstChild;
|
| 91 |
-
|
| 92 |
-
// Move range to text node
|
| 93 |
-
if (endContainer.nodeType == 3) {
|
| 94 |
-
r.setStart(endContainer, 0);
|
| 95 |
-
r.setEnd(endContainer, endContainer.nodeValue.length);
|
| 96 |
-
}
|
| 97 |
-
}
|
| 98 |
-
|
| 99 |
-
if (r.endOffset == 1)
|
| 100 |
-
end = 2;
|
| 101 |
-
else
|
| 102 |
-
end = r.endOffset - 1 - end_offset;
|
| 103 |
-
}
|
| 104 |
-
|
| 105 |
-
start = end;
|
| 106 |
-
|
| 107 |
-
do
|
| 108 |
-
{
|
| 109 |
-
// Move the selection one character backwards.
|
| 110 |
-
r.setStart(endContainer, end >= 2 ? end - 2 : 0);
|
| 111 |
-
r.setEnd(endContainer, end >= 1 ? end - 1 : 0);
|
| 112 |
-
end -= 1;
|
| 113 |
-
|
| 114 |
-
// Loop until one of the following is found: a blank space, , delimeter, (end-2) >= 0
|
| 115 |
-
} while (r.toString() != ' ' && r.toString() != '' && r.toString().charCodeAt(0) != 160 && (end -2) >= 0 && r.toString() != delimiter);
|
| 116 |
-
|
| 117 |
-
if (r.toString() == delimiter || r.toString().charCodeAt(0) == 160) {
|
| 118 |
-
r.setStart(endContainer, end);
|
| 119 |
-
r.setEnd(endContainer, start);
|
| 120 |
-
end += 1;
|
| 121 |
-
} else if (r.startOffset == 0) {
|
| 122 |
-
r.setStart(endContainer, 0);
|
| 123 |
-
r.setEnd(endContainer, start);
|
| 124 |
-
}
|
| 125 |
-
else {
|
| 126 |
-
r.setStart(endContainer, end);
|
| 127 |
-
r.setEnd(endContainer, start);
|
| 128 |
-
}
|
| 129 |
-
|
| 130 |
-
// Exclude last . from word like "www.site.com."
|
| 131 |
-
var text = r.toString();
|
| 132 |
-
if (text.charAt(text.length - 1) == '.') {
|
| 133 |
-
r.setEnd(endContainer, start - 1);
|
| 134 |
-
}
|
| 135 |
-
|
| 136 |
-
text = r.toString();
|
| 137 |
-
matches = text.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+-]+@)(.+)$/i);
|
| 138 |
-
|
| 139 |
-
if (matches) {
|
| 140 |
-
if (matches[1] == 'www.') {
|
| 141 |
-
matches[1] = 'http://www.';
|
| 142 |
-
} else if (/@$/.test(matches[1]) && !/^mailto:/.test(matches[1])) {
|
| 143 |
-
matches[1] = 'mailto:' + matches[1];
|
| 144 |
-
}
|
| 145 |
-
|
| 146 |
-
bookmark = ed.selection.getBookmark();
|
| 147 |
-
|
| 148 |
-
ed.selection.setRng(r);
|
| 149 |
-
tinyMCE.execCommand('createlink',false, matches[1] + matches[2]);
|
| 150 |
-
ed.selection.moveToBookmark(bookmark);
|
| 151 |
-
ed.nodeChanged();
|
| 152 |
-
|
| 153 |
-
// TODO: Determine if this is still needed.
|
| 154 |
-
if (tinyMCE.isWebKit) {
|
| 155 |
-
// move the caret to its original position
|
| 156 |
-
ed.selection.collapse(false);
|
| 157 |
-
var max = Math.min(endContainer.length, start + 1);
|
| 158 |
-
r.setStart(endContainer, max);
|
| 159 |
-
r.setEnd(endContainer, max);
|
| 160 |
-
ed.selection.setRng(r);
|
| 161 |
-
}
|
| 162 |
-
}
|
| 163 |
-
},
|
| 164 |
-
|
| 165 |
-
/**
|
| 166 |
-
* Returns information about the plugin as a name/value array.
|
| 167 |
-
* The current keys are longname, author, authorurl, infourl and version.
|
| 168 |
-
*
|
| 169 |
-
* @return {Object} Name/value array containing information about the plugin.
|
| 170 |
-
*/
|
| 171 |
-
getInfo : function() {
|
| 172 |
-
return {
|
| 173 |
-
longname : 'Autolink',
|
| 174 |
-
author : 'Moxiecode Systems AB',
|
| 175 |
-
authorurl : 'http://tinymce.moxiecode.com',
|
| 176 |
-
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink',
|
| 177 |
-
version : tinymce.majorVersion + "." + tinymce.minorVersion
|
| 178 |
-
};
|
| 179 |
-
}
|
| 180 |
-
});
|
| 181 |
-
|
| 182 |
-
// Register plugin
|
| 183 |
-
tinymce.PluginManager.add('autolink', tinymce.plugins.AutolinkPlugin);
|
| 184 |
-
})();
|
| 1 |
+
/**
|
| 2 |
+
* editor_plugin_src.js
|
| 3 |
+
*
|
| 4 |
+
* Copyright 2011, Moxiecode Systems AB
|
| 5 |
+
* Released under LGPL License.
|
| 6 |
+
*
|
| 7 |
+
* License: http://tinymce.moxiecode.com/license
|
| 8 |
+
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
+
*/
|
| 10 |
+
|
| 11 |
+
(function() {
|
| 12 |
+
tinymce.create('tinymce.plugins.AutolinkPlugin', {
|
| 13 |
+
/**
|
| 14 |
+
* Initializes the plugin, this will be executed after the plugin has been created.
|
| 15 |
+
* This call is done before the editor instance has finished it's initialization so use the onInit event
|
| 16 |
+
* of the editor instance to intercept that event.
|
| 17 |
+
*
|
| 18 |
+
* @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
|
| 19 |
+
* @param {string} url Absolute URL to where the plugin is located.
|
| 20 |
+
*/
|
| 21 |
+
|
| 22 |
+
init : function(ed, url) {
|
| 23 |
+
var t = this;
|
| 24 |
+
|
| 25 |
+
// Add a key down handler
|
| 26 |
+
ed.onKeyDown.addToTop(function(ed, e) {
|
| 27 |
+
if (e.keyCode == 13)
|
| 28 |
+
return t.handleEnter(ed);
|
| 29 |
+
});
|
| 30 |
+
|
| 31 |
+
// Internet Explorer has built-in automatic linking for most cases
|
| 32 |
+
if (tinyMCE.isIE)
|
| 33 |
+
return;
|
| 34 |
+
|
| 35 |
+
ed.onKeyPress.add(function(ed, e) {
|
| 36 |
+
if (e.which == 41)
|
| 37 |
+
return t.handleEclipse(ed);
|
| 38 |
+
});
|
| 39 |
+
|
| 40 |
+
// Add a key up handler
|
| 41 |
+
ed.onKeyUp.add(function(ed, e) {
|
| 42 |
+
if (e.keyCode == 32)
|
| 43 |
+
return t.handleSpacebar(ed);
|
| 44 |
+
});
|
| 45 |
+
},
|
| 46 |
+
|
| 47 |
+
handleEclipse : function(ed) {
|
| 48 |
+
this.parseCurrentLine(ed, -1, '(', true);
|
| 49 |
+
},
|
| 50 |
+
|
| 51 |
+
handleSpacebar : function(ed) {
|
| 52 |
+
this.parseCurrentLine(ed, 0, '', true);
|
| 53 |
+
},
|
| 54 |
+
|
| 55 |
+
handleEnter : function(ed) {
|
| 56 |
+
this.parseCurrentLine(ed, -1, '', false);
|
| 57 |
+
},
|
| 58 |
+
|
| 59 |
+
parseCurrentLine : function(ed, end_offset, delimiter, goback) {
|
| 60 |
+
var r, end, start, endContainer, bookmark, text, matches, prev, len;
|
| 61 |
+
|
| 62 |
+
// We need at least five characters to form a URL,
|
| 63 |
+
// hence, at minimum, five characters from the beginning of the line.
|
| 64 |
+
r = ed.selection.getRng(true).cloneRange();
|
| 65 |
+
if (r.startOffset < 5) {
|
| 66 |
+
// During testing, the caret is placed inbetween two text nodes.
|
| 67 |
+
// The previous text node contains the URL.
|
| 68 |
+
prev = r.endContainer.previousSibling;
|
| 69 |
+
if (prev == null) {
|
| 70 |
+
if (r.endContainer.firstChild == null || r.endContainer.firstChild.nextSibling == null)
|
| 71 |
+
return;
|
| 72 |
+
|
| 73 |
+
prev = r.endContainer.firstChild.nextSibling;
|
| 74 |
+
}
|
| 75 |
+
len = prev.length;
|
| 76 |
+
r.setStart(prev, len);
|
| 77 |
+
r.setEnd(prev, len);
|
| 78 |
+
|
| 79 |
+
if (r.endOffset < 5)
|
| 80 |
+
return;
|
| 81 |
+
|
| 82 |
+
end = r.endOffset;
|
| 83 |
+
endContainer = prev;
|
| 84 |
+
} else {
|
| 85 |
+
endContainer = r.endContainer;
|
| 86 |
+
|
| 87 |
+
// Get a text node
|
| 88 |
+
if (endContainer.nodeType != 3 && endContainer.firstChild) {
|
| 89 |
+
while (endContainer.nodeType != 3 && endContainer.firstChild)
|
| 90 |
+
endContainer = endContainer.firstChild;
|
| 91 |
+
|
| 92 |
+
// Move range to text node
|
| 93 |
+
if (endContainer.nodeType == 3) {
|
| 94 |
+
r.setStart(endContainer, 0);
|
| 95 |
+
r.setEnd(endContainer, endContainer.nodeValue.length);
|
| 96 |
+
}
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
if (r.endOffset == 1)
|
| 100 |
+
end = 2;
|
| 101 |
+
else
|
| 102 |
+
end = r.endOffset - 1 - end_offset;
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
start = end;
|
| 106 |
+
|
| 107 |
+
do
|
| 108 |
+
{
|
| 109 |
+
// Move the selection one character backwards.
|
| 110 |
+
r.setStart(endContainer, end >= 2 ? end - 2 : 0);
|
| 111 |
+
r.setEnd(endContainer, end >= 1 ? end - 1 : 0);
|
| 112 |
+
end -= 1;
|
| 113 |
+
|
| 114 |
+
// Loop until one of the following is found: a blank space, , delimeter, (end-2) >= 0
|
| 115 |
+
} while (r.toString() != ' ' && r.toString() != '' && r.toString().charCodeAt(0) != 160 && (end -2) >= 0 && r.toString() != delimiter);
|
| 116 |
+
|
| 117 |
+
if (r.toString() == delimiter || r.toString().charCodeAt(0) == 160) {
|
| 118 |
+
r.setStart(endContainer, end);
|
| 119 |
+
r.setEnd(endContainer, start);
|
| 120 |
+
end += 1;
|
| 121 |
+
} else if (r.startOffset == 0) {
|
| 122 |
+
r.setStart(endContainer, 0);
|
| 123 |
+
r.setEnd(endContainer, start);
|
| 124 |
+
}
|
| 125 |
+
else {
|
| 126 |
+
r.setStart(endContainer, end);
|
| 127 |
+
r.setEnd(endContainer, start);
|
| 128 |
+
}
|
| 129 |
+
|
| 130 |
+
// Exclude last . from word like "www.site.com."
|
| 131 |
+
var text = r.toString();
|
| 132 |
+
if (text.charAt(text.length - 1) == '.') {
|
| 133 |
+
r.setEnd(endContainer, start - 1);
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
text = r.toString();
|
| 137 |
+
matches = text.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+-]+@)(.+)$/i);
|
| 138 |
+
|
| 139 |
+
if (matches) {
|
| 140 |
+
if (matches[1] == 'www.') {
|
| 141 |
+
matches[1] = 'http://www.';
|
| 142 |
+
} else if (/@$/.test(matches[1]) && !/^mailto:/.test(matches[1])) {
|
| 143 |
+
matches[1] = 'mailto:' + matches[1];
|
| 144 |
+
}
|
| 145 |
+
|
| 146 |
+
bookmark = ed.selection.getBookmark();
|
| 147 |
+
|
| 148 |
+
ed.selection.setRng(r);
|
| 149 |
+
tinyMCE.execCommand('createlink',false, matches[1] + matches[2]);
|
| 150 |
+
ed.selection.moveToBookmark(bookmark);
|
| 151 |
+
ed.nodeChanged();
|
| 152 |
+
|
| 153 |
+
// TODO: Determine if this is still needed.
|
| 154 |
+
if (tinyMCE.isWebKit) {
|
| 155 |
+
// move the caret to its original position
|
| 156 |
+
ed.selection.collapse(false);
|
| 157 |
+
var max = Math.min(endContainer.length, start + 1);
|
| 158 |
+
r.setStart(endContainer, max);
|
| 159 |
+
r.setEnd(endContainer, max);
|
| 160 |
+
ed.selection.setRng(r);
|
| 161 |
+
}
|
| 162 |
+
}
|
| 163 |
+
},
|
| 164 |
+
|
| 165 |
+
/**
|
| 166 |
+
* Returns information about the plugin as a name/value array.
|
| 167 |
+
* The current keys are longname, author, authorurl, infourl and version.
|
| 168 |
+
*
|
| 169 |
+
* @return {Object} Name/value array containing information about the plugin.
|
| 170 |
+
*/
|
| 171 |
+
getInfo : function() {
|
| 172 |
+
return {
|
| 173 |
+
longname : 'Autolink',
|
| 174 |
+
author : 'Moxiecode Systems AB',
|
| 175 |
+
authorurl : 'http://tinymce.moxiecode.com',
|
| 176 |
+
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink',
|
| 177 |
+
version : tinymce.majorVersion + "." + tinymce.minorVersion
|
| 178 |
+
};
|
| 179 |
+
}
|
| 180 |
+
});
|
| 181 |
+
|
| 182 |
+
// Register plugin
|
| 183 |
+
tinymce.PluginManager.add('autolink', tinymce.plugins.AutolinkPlugin);
|
| 184 |
+
})();
|
js/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js
CHANGED
|
@@ -1,119 +1,119 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* editor_plugin_src.js
|
| 3 |
-
*
|
| 4 |
-
* Copyright 2009, Moxiecode Systems AB
|
| 5 |
-
* Released under LGPL License.
|
| 6 |
-
*
|
| 7 |
-
* License: http://tinymce.moxiecode.com/license
|
| 8 |
-
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
-
*/
|
| 10 |
-
|
| 11 |
-
(function() {
|
| 12 |
-
/**
|
| 13 |
-
* Auto Resize
|
| 14 |
-
*
|
| 15 |
-
* This plugin automatically resizes the content area to fit its content height.
|
| 16 |
-
* It will retain a minimum height, which is the height of the content area when
|
| 17 |
-
* it's initialized.
|
| 18 |
-
*/
|
| 19 |
-
tinymce.create('tinymce.plugins.AutoResizePlugin', {
|
| 20 |
-
/**
|
| 21 |
-
* Initializes the plugin, this will be executed after the plugin has been created.
|
| 22 |
-
* This call is done before the editor instance has finished it's initialization so use the onInit event
|
| 23 |
-
* of the editor instance to intercept that event.
|
| 24 |
-
*
|
| 25 |
-
* @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
|
| 26 |
-
* @param {string} url Absolute URL to where the plugin is located.
|
| 27 |
-
*/
|
| 28 |
-
init : function(ed, url) {
|
| 29 |
-
var t = this, oldSize = 0;
|
| 30 |
-
|
| 31 |
-
if (ed.getParam('fullscreen_is_enabled'))
|
| 32 |
-
return;
|
| 33 |
-
|
| 34 |
-
/**
|
| 35 |
-
* This method gets executed each time the editor needs to resize.
|
| 36 |
-
*/
|
| 37 |
-
function resize() {
|
| 38 |
-
var deltaSize, d = ed.getDoc(), body = d.body, de = d.documentElement, DOM = tinymce.DOM, resizeHeight = t.autoresize_min_height, myHeight;
|
| 39 |
-
|
| 40 |
-
// Get height differently depending on the browser used
|
| 41 |
-
myHeight = tinymce.isIE ? body.scrollHeight : (tinymce.isWebKit && body.clientHeight == 0 ? 0 : body.offsetHeight);
|
| 42 |
-
|
| 43 |
-
// Don't make it smaller than the minimum height
|
| 44 |
-
if (myHeight > t.autoresize_min_height)
|
| 45 |
-
resizeHeight = myHeight;
|
| 46 |
-
|
| 47 |
-
// If a maximum height has been defined don't exceed this height
|
| 48 |
-
if (t.autoresize_max_height && myHeight > t.autoresize_max_height) {
|
| 49 |
-
resizeHeight = t.autoresize_max_height;
|
| 50 |
-
body.style.overflowY = "auto";
|
| 51 |
-
de.style.overflowY = "auto"; // Old IE
|
| 52 |
-
} else {
|
| 53 |
-
body.style.overflowY = "hidden";
|
| 54 |
-
de.style.overflowY = "hidden"; // Old IE
|
| 55 |
-
body.scrollTop = 0;
|
| 56 |
-
}
|
| 57 |
-
|
| 58 |
-
// Resize content element
|
| 59 |
-
if (resizeHeight !== oldSize) {
|
| 60 |
-
deltaSize = resizeHeight - oldSize;
|
| 61 |
-
DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px');
|
| 62 |
-
oldSize = resizeHeight;
|
| 63 |
-
|
| 64 |
-
// WebKit doesn't decrease the size of the body element until the iframe gets resized
|
| 65 |
-
// So we need to continue to resize the iframe down until the size gets fixed
|
| 66 |
-
if (tinymce.isWebKit && deltaSize < 0)
|
| 67 |
-
resize();
|
| 68 |
-
}
|
| 69 |
-
};
|
| 70 |
-
|
| 71 |
-
t.editor = ed;
|
| 72 |
-
|
| 73 |
-
// Define minimum height
|
| 74 |
-
t.autoresize_min_height = parseInt(ed.getParam('autoresize_min_height', ed.getElement().offsetHeight));
|
| 75 |
-
|
| 76 |
-
// Define maximum height
|
| 77 |
-
t.autoresize_max_height = parseInt(ed.getParam('autoresize_max_height', 0));
|
| 78 |
-
|
| 79 |
-
// Add padding at the bottom for better UX
|
| 80 |
-
ed.onInit.add(function(ed){
|
| 81 |
-
ed.dom.setStyle(ed.getBody(), 'paddingBottom', ed.getParam('autoresize_bottom_margin', 50) + 'px');
|
| 82 |
-
});
|
| 83 |
-
|
| 84 |
-
// Add appropriate listeners for resizing content area
|
| 85 |
-
ed.onChange.add(resize);
|
| 86 |
-
ed.onSetContent.add(resize);
|
| 87 |
-
ed.onPaste.add(resize);
|
| 88 |
-
ed.onKeyUp.add(resize);
|
| 89 |
-
ed.onPostRender.add(resize);
|
| 90 |
-
|
| 91 |
-
if (ed.getParam('autoresize_on_init', true)) {
|
| 92 |
-
ed.onLoad.add(resize);
|
| 93 |
-
ed.onLoadContent.add(resize);
|
| 94 |
-
}
|
| 95 |
-
|
| 96 |
-
// Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample');
|
| 97 |
-
ed.addCommand('mceAutoResize', resize);
|
| 98 |
-
},
|
| 99 |
-
|
| 100 |
-
/**
|
| 101 |
-
* Returns information about the plugin as a name/value array.
|
| 102 |
-
* The current keys are longname, author, authorurl, infourl and version.
|
| 103 |
-
*
|
| 104 |
-
* @return {Object} Name/value array containing information about the plugin.
|
| 105 |
-
*/
|
| 106 |
-
getInfo : function() {
|
| 107 |
-
return {
|
| 108 |
-
longname : 'Auto Resize',
|
| 109 |
-
author : 'Moxiecode Systems AB',
|
| 110 |
-
authorurl : 'http://tinymce.moxiecode.com',
|
| 111 |
-
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize',
|
| 112 |
-
version : tinymce.majorVersion + "." + tinymce.minorVersion
|
| 113 |
-
};
|
| 114 |
-
}
|
| 115 |
-
});
|
| 116 |
-
|
| 117 |
-
// Register plugin
|
| 118 |
-
tinymce.PluginManager.add('autoresize', tinymce.plugins.AutoResizePlugin);
|
| 119 |
-
})();
|
| 1 |
+
/**
|
| 2 |
+
* editor_plugin_src.js
|
| 3 |
+
*
|
| 4 |
+
* Copyright 2009, Moxiecode Systems AB
|
| 5 |
+
* Released under LGPL License.
|
| 6 |
+
*
|
| 7 |
+
* License: http://tinymce.moxiecode.com/license
|
| 8 |
+
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
+
*/
|
| 10 |
+
|
| 11 |
+
(function() {
|
| 12 |
+
/**
|
| 13 |
+
* Auto Resize
|
| 14 |
+
*
|
| 15 |
+
* This plugin automatically resizes the content area to fit its content height.
|
| 16 |
+
* It will retain a minimum height, which is the height of the content area when
|
| 17 |
+
* it's initialized.
|
| 18 |
+
*/
|
| 19 |
+
tinymce.create('tinymce.plugins.AutoResizePlugin', {
|
| 20 |
+
/**
|
| 21 |
+
* Initializes the plugin, this will be executed after the plugin has been created.
|
| 22 |
+
* This call is done before the editor instance has finished it's initialization so use the onInit event
|
| 23 |
+
* of the editor instance to intercept that event.
|
| 24 |
+
*
|
| 25 |
+
* @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
|
| 26 |
+
* @param {string} url Absolute URL to where the plugin is located.
|
| 27 |
+
*/
|
| 28 |
+
init : function(ed, url) {
|
| 29 |
+
var t = this, oldSize = 0;
|
| 30 |
+
|
| 31 |
+
if (ed.getParam('fullscreen_is_enabled'))
|
| 32 |
+
return;
|
| 33 |
+
|
| 34 |
+
/**
|
| 35 |
+
* This method gets executed each time the editor needs to resize.
|
| 36 |
+
*/
|
| 37 |
+
function resize() {
|
| 38 |
+
var deltaSize, d = ed.getDoc(), body = d.body, de = d.documentElement, DOM = tinymce.DOM, resizeHeight = t.autoresize_min_height, myHeight;
|
| 39 |
+
|
| 40 |
+
// Get height differently depending on the browser used
|
| 41 |
+
myHeight = tinymce.isIE ? body.scrollHeight : (tinymce.isWebKit && body.clientHeight == 0 ? 0 : body.offsetHeight);
|
| 42 |
+
|
| 43 |
+
// Don't make it smaller than the minimum height
|
| 44 |
+
if (myHeight > t.autoresize_min_height)
|
| 45 |
+
resizeHeight = myHeight;
|
| 46 |
+
|
| 47 |
+
// If a maximum height has been defined don't exceed this height
|
| 48 |
+
if (t.autoresize_max_height && myHeight > t.autoresize_max_height) {
|
| 49 |
+
resizeHeight = t.autoresize_max_height;
|
| 50 |
+
body.style.overflowY = "auto";
|
| 51 |
+
de.style.overflowY = "auto"; // Old IE
|
| 52 |
+
} else {
|
| 53 |
+
body.style.overflowY = "hidden";
|
| 54 |
+
de.style.overflowY = "hidden"; // Old IE
|
| 55 |
+
body.scrollTop = 0;
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
// Resize content element
|
| 59 |
+
if (resizeHeight !== oldSize) {
|
| 60 |
+
deltaSize = resizeHeight - oldSize;
|
| 61 |
+
DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px');
|
| 62 |
+
oldSize = resizeHeight;
|
| 63 |
+
|
| 64 |
+
// WebKit doesn't decrease the size of the body element until the iframe gets resized
|
| 65 |
+
// So we need to continue to resize the iframe down until the size gets fixed
|
| 66 |
+
if (tinymce.isWebKit && deltaSize < 0)
|
| 67 |
+
resize();
|
| 68 |
+
}
|
| 69 |
+
};
|
| 70 |
+
|
| 71 |
+
t.editor = ed;
|
| 72 |
+
|
| 73 |
+
// Define minimum height
|
| 74 |
+
t.autoresize_min_height = parseInt(ed.getParam('autoresize_min_height', ed.getElement().offsetHeight));
|
| 75 |
+
|
| 76 |
+
// Define maximum height
|
| 77 |
+
t.autoresize_max_height = parseInt(ed.getParam('autoresize_max_height', 0));
|
| 78 |
+
|
| 79 |
+
// Add padding at the bottom for better UX
|
| 80 |
+
ed.onInit.add(function(ed){
|
| 81 |
+
ed.dom.setStyle(ed.getBody(), 'paddingBottom', ed.getParam('autoresize_bottom_margin', 50) + 'px');
|
| 82 |
+
});
|
| 83 |
+
|
| 84 |
+
// Add appropriate listeners for resizing content area
|
| 85 |
+
ed.onChange.add(resize);
|
| 86 |
+
ed.onSetContent.add(resize);
|
| 87 |
+
ed.onPaste.add(resize);
|
| 88 |
+
ed.onKeyUp.add(resize);
|
| 89 |
+
ed.onPostRender.add(resize);
|
| 90 |
+
|
| 91 |
+
if (ed.getParam('autoresize_on_init', true)) {
|
| 92 |
+
ed.onLoad.add(resize);
|
| 93 |
+
ed.onLoadContent.add(resize);
|
| 94 |
+
}
|
| 95 |
+
|
| 96 |
+
// Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample');
|
| 97 |
+
ed.addCommand('mceAutoResize', resize);
|
| 98 |
+
},
|
| 99 |
+
|
| 100 |
+
/**
|
| 101 |
+
* Returns information about the plugin as a name/value array.
|
| 102 |
+
* The current keys are longname, author, authorurl, infourl and version.
|
| 103 |
+
*
|
| 104 |
+
* @return {Object} Name/value array containing information about the plugin.
|
| 105 |
+
*/
|
| 106 |
+
getInfo : function() {
|
| 107 |
+
return {
|
| 108 |
+
longname : 'Auto Resize',
|
| 109 |
+
author : 'Moxiecode Systems AB',
|
| 110 |
+
authorurl : 'http://tinymce.moxiecode.com',
|
| 111 |
+
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize',
|
| 112 |
+
version : tinymce.majorVersion + "." + tinymce.minorVersion
|
| 113 |
+
};
|
| 114 |
+
}
|
| 115 |
+
});
|
| 116 |
+
|
| 117 |
+
// Register plugin
|
| 118 |
+
tinymce.PluginManager.add('autoresize', tinymce.plugins.AutoResizePlugin);
|
| 119 |
+
})();
|
js/tinymce/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
tinyMCE.addI18n('en.emotions_dlg',{cry:"Cry",cool:"Cool",desc:"Emotions",title:"Insert Emotion",usage:"Use left and right arrows to navigate.",yell:"Yell",wink:"Wink",undecided:"Undecided","tongue_out":"Tongue Out",surprised:"Surprised",smile:"Smile",sealed:"Sealed","money_mouth":"Money Mouth",laughing:"Laughing",kiss:"Kiss",innocent:"Innocent",frown:"Frown","foot_in_mouth":"Foot in Mouth",embarassed:"Embarassed"});
|
| 1 |
+
tinyMCE.addI18n('en.emotions_dlg',{cry:"Cry",cool:"Cool",desc:"Emotions",title:"Insert Emotion",usage:"Use left and right arrows to navigate.",yell:"Yell",wink:"Wink",undecided:"Undecided","tongue_out":"Tongue Out",surprised:"Surprised",smile:"Smile",sealed:"Sealed","money_mouth":"Money Mouth",laughing:"Laughing",kiss:"Kiss",innocent:"Innocent",frown:"Frown","foot_in_mouth":"Foot in Mouth",embarassed:"Embarassed"});
|
js/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin_src.js
CHANGED
|
@@ -1,50 +1,50 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* editor_plugin_src.js
|
| 3 |
-
*
|
| 4 |
-
* Copyright 2009, Moxiecode Systems AB
|
| 5 |
-
* Released under LGPL License.
|
| 6 |
-
*
|
| 7 |
-
* License: http://tinymce.moxiecode.com/license
|
| 8 |
-
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
-
*/
|
| 10 |
-
|
| 11 |
-
(function() {
|
| 12 |
-
|
| 13 |
-
tinymce.create('tinymce.plugins.ExampleDependencyPlugin', {
|
| 14 |
-
/**
|
| 15 |
-
* Initializes the plugin, this will be executed after the plugin has been created.
|
| 16 |
-
* This call is done before the editor instance has finished it's initialization so use the onInit event
|
| 17 |
-
* of the editor instance to intercept that event.
|
| 18 |
-
*
|
| 19 |
-
* @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
|
| 20 |
-
* @param {string} url Absolute URL to where the plugin is located.
|
| 21 |
-
*/
|
| 22 |
-
init : function(ed, url) {
|
| 23 |
-
},
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
/**
|
| 27 |
-
* Returns information about the plugin as a name/value array.
|
| 28 |
-
* The current keys are longname, author, authorurl, infourl and version.
|
| 29 |
-
*
|
| 30 |
-
* @return {Object} Name/value array containing information about the plugin.
|
| 31 |
-
*/
|
| 32 |
-
getInfo : function() {
|
| 33 |
-
return {
|
| 34 |
-
longname : 'Example Dependency plugin',
|
| 35 |
-
author : 'Some author',
|
| 36 |
-
authorurl : 'http://tinymce.moxiecode.com',
|
| 37 |
-
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example_dependency',
|
| 38 |
-
version : "1.0"
|
| 39 |
-
};
|
| 40 |
-
}
|
| 41 |
-
});
|
| 42 |
-
|
| 43 |
-
/**
|
| 44 |
-
* Register the plugin, specifying the list of the plugins that this plugin depends on. They are specified in a list, with the list loaded in order.
|
| 45 |
-
* plugins in this list will be initialised when this plugin is initialized. (before the init method is called).
|
| 46 |
-
* plugins in a depends list should typically be specified using the short name). If neccesary this can be done
|
| 47 |
-
* with an object which has the url to the plugin and the shortname.
|
| 48 |
-
*/
|
| 49 |
-
tinymce.PluginManager.add('example_dependency', tinymce.plugins.ExampleDependencyPlugin, ['example']);
|
| 50 |
-
})();
|
| 1 |
+
/**
|
| 2 |
+
* editor_plugin_src.js
|
| 3 |
+
*
|
| 4 |
+
* Copyright 2009, Moxiecode Systems AB
|
| 5 |
+
* Released under LGPL License.
|
| 6 |
+
*
|
| 7 |
+
* License: http://tinymce.moxiecode.com/license
|
| 8 |
+
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
+
*/
|
| 10 |
+
|
| 11 |
+
(function() {
|
| 12 |
+
|
| 13 |
+
tinymce.create('tinymce.plugins.ExampleDependencyPlugin', {
|
| 14 |
+
/**
|
| 15 |
+
* Initializes the plugin, this will be executed after the plugin has been created.
|
| 16 |
+
* This call is done before the editor instance has finished it's initialization so use the onInit event
|
| 17 |
+
* of the editor instance to intercept that event.
|
| 18 |
+
*
|
| 19 |
+
* @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
|
| 20 |
+
* @param {string} url Absolute URL to where the plugin is located.
|
| 21 |
+
*/
|
| 22 |
+
init : function(ed, url) {
|
| 23 |
+
},
|
| 24 |
+
|
| 25 |
+
|
| 26 |
+
/**
|
| 27 |
+
* Returns information about the plugin as a name/value array.
|
| 28 |
+
* The current keys are longname, author, authorurl, infourl and version.
|
| 29 |
+
*
|
| 30 |
+
* @return {Object} Name/value array containing information about the plugin.
|
| 31 |
+
*/
|
| 32 |
+
getInfo : function() {
|
| 33 |
+
return {
|
| 34 |
+
longname : 'Example Dependency plugin',
|
| 35 |
+
author : 'Some author',
|
| 36 |
+
authorurl : 'http://tinymce.moxiecode.com',
|
| 37 |
+
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example_dependency',
|
| 38 |
+
version : "1.0"
|
| 39 |
+
};
|
| 40 |
+
}
|
| 41 |
+
});
|
| 42 |
+
|
| 43 |
+
/**
|
| 44 |
+
* Register the plugin, specifying the list of the plugins that this plugin depends on. They are specified in a list, with the list loaded in order.
|
| 45 |
+
* plugins in this list will be initialised when this plugin is initialized. (before the init method is called).
|
| 46 |
+
* plugins in a depends list should typically be specified using the short name). If neccesary this can be done
|
| 47 |
+
* with an object which has the url to the plugin and the shortname.
|
| 48 |
+
*/
|
| 49 |
+
tinymce.PluginManager.add('example_dependency', tinymce.plugins.ExampleDependencyPlugin, ['example']);
|
| 50 |
+
})();
|
js/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css
CHANGED
|
@@ -1,90 +1,90 @@
|
|
| 1 |
-
/* Clearlooks 2 */
|
| 2 |
-
|
| 3 |
-
/* Reset */
|
| 4 |
-
.clearlooks2, .clearlooks2 div, .clearlooks2 span, .clearlooks2 a {vertical-align:baseline; text-align:left; position:absolute; border:0; padding:0; margin:0; background:transparent; font-family:Arial,Verdana; font-size:11px; color:#000; text-decoration:none; font-weight:normal; width:auto; height:auto; overflow:hidden; display:block}
|
| 5 |
-
|
| 6 |
-
/* General */
|
| 7 |
-
.clearlooks2 {position:absolute; direction:ltr}
|
| 8 |
-
.clearlooks2 .mceWrapper {position:static}
|
| 9 |
-
.mceEventBlocker {position:fixed; left:0; top:0; background:url(img/horizontal.gif) no-repeat 0 -75px; width:100%; height:100%}
|
| 10 |
-
.clearlooks2 .mcePlaceHolder {border:1px solid #000; background:#888; top:0; left:0; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50)}
|
| 11 |
-
.clearlooks2_modalBlocker {position:fixed; left:0; top:0; width:100%; height:100%; background:#FFF; opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60); display:none}
|
| 12 |
-
|
| 13 |
-
/* Top */
|
| 14 |
-
.clearlooks2 .mceTop, .clearlooks2 .mceTop div {top:0; width:100%; height:23px}
|
| 15 |
-
.clearlooks2 .mceTop .mceLeft {width:6px; background:url(img/corners.gif)}
|
| 16 |
-
.clearlooks2 .mceTop .mceCenter {right:6px; width:100%; height:23px; background:url(img/horizontal.gif) 12px 0; clip:rect(auto auto auto 12px)}
|
| 17 |
-
.clearlooks2 .mceTop .mceRight {right:0; width:6px; height:23px; background:url(img/corners.gif) -12px 0}
|
| 18 |
-
.clearlooks2 .mceTop span {width:100%; text-align:center; vertical-align:middle; line-height:23px; font-weight:bold}
|
| 19 |
-
.clearlooks2 .mceFocus .mceTop .mceLeft {background:url(img/corners.gif) -6px 0}
|
| 20 |
-
.clearlooks2 .mceFocus .mceTop .mceCenter {background:url(img/horizontal.gif) 0 -23px}
|
| 21 |
-
.clearlooks2 .mceFocus .mceTop .mceRight {background:url(img/corners.gif) -18px 0}
|
| 22 |
-
.clearlooks2 .mceFocus .mceTop span {color:#FFF}
|
| 23 |
-
|
| 24 |
-
/* Middle */
|
| 25 |
-
.clearlooks2 .mceMiddle, .clearlooks2 .mceMiddle div {top:0}
|
| 26 |
-
.clearlooks2 .mceMiddle {width:100%; height:100%; clip:rect(23px auto auto auto)}
|
| 27 |
-
.clearlooks2 .mceMiddle .mceLeft {left:0; width:5px; height:100%; background:url(img/vertical.gif) -5px 0}
|
| 28 |
-
.clearlooks2 .mceMiddle span {top:23px; left:5px; width:100%; height:100%; background:#FFF}
|
| 29 |
-
.clearlooks2 .mceMiddle .mceRight {right:0; width:5px; height:100%; background:url(img/vertical.gif)}
|
| 30 |
-
|
| 31 |
-
/* Bottom */
|
| 32 |
-
.clearlooks2 .mceBottom, .clearlooks2 .mceBottom div {height:6px}
|
| 33 |
-
.clearlooks2 .mceBottom {left:0; bottom:0; width:100%}
|
| 34 |
-
.clearlooks2 .mceBottom div {top:0}
|
| 35 |
-
.clearlooks2 .mceBottom .mceLeft {left:0; width:5px; background:url(img/corners.gif) -34px -6px}
|
| 36 |
-
.clearlooks2 .mceBottom .mceCenter {left:5px; width:100%; background:url(img/horizontal.gif) 0 -46px}
|
| 37 |
-
.clearlooks2 .mceBottom .mceRight {right:0; width:5px; background: url(img/corners.gif) -34px 0}
|
| 38 |
-
.clearlooks2 .mceBottom span {display:none}
|
| 39 |
-
.clearlooks2 .mceStatusbar .mceBottom, .clearlooks2 .mceStatusbar .mceBottom div {height:23px}
|
| 40 |
-
.clearlooks2 .mceStatusbar .mceBottom .mceLeft {background:url(img/corners.gif) -29px 0}
|
| 41 |
-
.clearlooks2 .mceStatusbar .mceBottom .mceCenter {background:url(img/horizontal.gif) 0 -52px}
|
| 42 |
-
.clearlooks2 .mceStatusbar .mceBottom .mceRight {background:url(img/corners.gif) -24px 0}
|
| 43 |
-
.clearlooks2 .mceStatusbar .mceBottom span {display:block; left:7px; font-family:Arial, Verdana; font-size:11px; line-height:23px}
|
| 44 |
-
|
| 45 |
-
/* Actions */
|
| 46 |
-
.clearlooks2 a {width:29px; height:16px; top:3px;}
|
| 47 |
-
.clearlooks2 .mceClose {right:6px; background:url(img/buttons.gif) -87px 0}
|
| 48 |
-
.clearlooks2 .mceMin {display:none; right:68px; background:url(img/buttons.gif) 0 0}
|
| 49 |
-
.clearlooks2 .mceMed {display:none; right:37px; background:url(img/buttons.gif) -29px 0}
|
| 50 |
-
.clearlooks2 .mceMax {display:none; right:37px; background:url(img/buttons.gif) -58px 0}
|
| 51 |
-
.clearlooks2 .mceMove {display:none;width:100%;cursor:move;background:url(img/corners.gif) no-repeat -100px -100px}
|
| 52 |
-
.clearlooks2 .mceMovable .mceMove {display:block}
|
| 53 |
-
.clearlooks2 .mceFocus .mceClose {right:6px; background:url(img/buttons.gif) -87px -16px}
|
| 54 |
-
.clearlooks2 .mceFocus .mceMin {right:68px; background:url(img/buttons.gif) 0 -16px}
|
| 55 |
-
.clearlooks2 .mceFocus .mceMed {right:37px; background:url(img/buttons.gif) -29px -16px}
|
| 56 |
-
.clearlooks2 .mceFocus .mceMax {right:37px; background:url(img/buttons.gif) -58px -16px}
|
| 57 |
-
.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px}
|
| 58 |
-
.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px}
|
| 59 |
-
.clearlooks2 .mceFocus .mceMin:hover {right:68px; background:url(img/buttons.gif) 0 -32px}
|
| 60 |
-
.clearlooks2 .mceFocus .mceMed:hover {right:37px; background:url(img/buttons.gif) -29px -32px}
|
| 61 |
-
.clearlooks2 .mceFocus .mceMax:hover {right:37px; background:url(img/buttons.gif) -58px -32px}
|
| 62 |
-
|
| 63 |
-
/* Resize */
|
| 64 |
-
.clearlooks2 .mceResize {top:auto; left:auto; display:none; width:5px; height:5px; background:url(img/horizontal.gif) no-repeat 0 -75px}
|
| 65 |
-
.clearlooks2 .mceResizable .mceResize {display:block}
|
| 66 |
-
.clearlooks2 .mceResizable .mceMin, .clearlooks2 .mceMax {display:none}
|
| 67 |
-
.clearlooks2 .mceMinimizable .mceMin {display:block}
|
| 68 |
-
.clearlooks2 .mceMaximizable .mceMax {display:block}
|
| 69 |
-
.clearlooks2 .mceMaximized .mceMed {display:block}
|
| 70 |
-
.clearlooks2 .mceMaximized .mceMax {display:none}
|
| 71 |
-
.clearlooks2 a.mceResizeN {top:0; left:0; width:100%; cursor:n-resize}
|
| 72 |
-
.clearlooks2 a.mceResizeNW {top:0; left:0; cursor:nw-resize}
|
| 73 |
-
.clearlooks2 a.mceResizeNE {top:0; right:0; cursor:ne-resize}
|
| 74 |
-
.clearlooks2 a.mceResizeW {top:0; left:0; height:100%; cursor:w-resize;}
|
| 75 |
-
.clearlooks2 a.mceResizeE {top:0; right:0; height:100%; cursor:e-resize}
|
| 76 |
-
.clearlooks2 a.mceResizeS {bottom:0; left:0; width:100%; cursor:s-resize}
|
| 77 |
-
.clearlooks2 a.mceResizeSW {bottom:0; left:0; cursor:sw-resize}
|
| 78 |
-
.clearlooks2 a.mceResizeSE {bottom:0; right:0; cursor:se-resize}
|
| 79 |
-
|
| 80 |
-
/* Alert/Confirm */
|
| 81 |
-
.clearlooks2 .mceButton {font-weight:bold; bottom:10px; width:80px; height:30px; background:url(img/button.gif); line-height:30px; vertical-align:middle; text-align:center; outline:0}
|
| 82 |
-
.clearlooks2 .mceMiddle .mceIcon {left:15px; top:35px; width:32px; height:32px}
|
| 83 |
-
.clearlooks2 .mceAlert .mceMiddle span, .clearlooks2 .mceConfirm .mceMiddle span {background:transparent;left:60px; top:35px; width:320px; height:50px; font-weight:bold; overflow:auto; white-space:normal}
|
| 84 |
-
.clearlooks2 a:hover {font-weight:bold;}
|
| 85 |
-
.clearlooks2 .mceAlert .mceMiddle, .clearlooks2 .mceConfirm .mceMiddle {background:#D6D7D5}
|
| 86 |
-
.clearlooks2 .mceAlert .mceOk {left:50%; top:auto; margin-left: -40px}
|
| 87 |
-
.clearlooks2 .mceAlert .mceIcon {background:url(img/alert.gif)}
|
| 88 |
-
.clearlooks2 .mceConfirm .mceOk {left:50%; top:auto; margin-left: -90px}
|
| 89 |
-
.clearlooks2 .mceConfirm .mceCancel {left:50%; top:auto}
|
| 90 |
-
.clearlooks2 .mceConfirm .mceIcon {background:url(img/confirm.gif)}
|
| 1 |
+
/* Clearlooks 2 */
|
| 2 |
+
|
| 3 |
+
/* Reset */
|
| 4 |
+
.clearlooks2, .clearlooks2 div, .clearlooks2 span, .clearlooks2 a {vertical-align:baseline; text-align:left; position:absolute; border:0; padding:0; margin:0; background:transparent; font-family:Arial,Verdana; font-size:11px; color:#000; text-decoration:none; font-weight:normal; width:auto; height:auto; overflow:hidden; display:block}
|
| 5 |
+
|
| 6 |
+
/* General */
|
| 7 |
+
.clearlooks2 {position:absolute; direction:ltr}
|
| 8 |
+
.clearlooks2 .mceWrapper {position:static}
|
| 9 |
+
.mceEventBlocker {position:fixed; left:0; top:0; background:url(img/horizontal.gif) no-repeat 0 -75px; width:100%; height:100%}
|
| 10 |
+
.clearlooks2 .mcePlaceHolder {border:1px solid #000; background:#888; top:0; left:0; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50)}
|
| 11 |
+
.clearlooks2_modalBlocker {position:fixed; left:0; top:0; width:100%; height:100%; background:#FFF; opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60); display:none}
|
| 12 |
+
|
| 13 |
+
/* Top */
|
| 14 |
+
.clearlooks2 .mceTop, .clearlooks2 .mceTop div {top:0; width:100%; height:23px}
|
| 15 |
+
.clearlooks2 .mceTop .mceLeft {width:6px; background:url(img/corners.gif)}
|
| 16 |
+
.clearlooks2 .mceTop .mceCenter {right:6px; width:100%; height:23px; background:url(img/horizontal.gif) 12px 0; clip:rect(auto auto auto 12px)}
|
| 17 |
+
.clearlooks2 .mceTop .mceRight {right:0; width:6px; height:23px; background:url(img/corners.gif) -12px 0}
|
| 18 |
+
.clearlooks2 .mceTop span {width:100%; text-align:center; vertical-align:middle; line-height:23px; font-weight:bold}
|
| 19 |
+
.clearlooks2 .mceFocus .mceTop .mceLeft {background:url(img/corners.gif) -6px 0}
|
| 20 |
+
.clearlooks2 .mceFocus .mceTop .mceCenter {background:url(img/horizontal.gif) 0 -23px}
|
| 21 |
+
.clearlooks2 .mceFocus .mceTop .mceRight {background:url(img/corners.gif) -18px 0}
|
| 22 |
+
.clearlooks2 .mceFocus .mceTop span {color:#FFF}
|
| 23 |
+
|
| 24 |
+
/* Middle */
|
| 25 |
+
.clearlooks2 .mceMiddle, .clearlooks2 .mceMiddle div {top:0}
|
| 26 |
+
.clearlooks2 .mceMiddle {width:100%; height:100%; clip:rect(23px auto auto auto)}
|
| 27 |
+
.clearlooks2 .mceMiddle .mceLeft {left:0; width:5px; height:100%; background:url(img/vertical.gif) -5px 0}
|
| 28 |
+
.clearlooks2 .mceMiddle span {top:23px; left:5px; width:100%; height:100%; background:#FFF}
|
| 29 |
+
.clearlooks2 .mceMiddle .mceRight {right:0; width:5px; height:100%; background:url(img/vertical.gif)}
|
| 30 |
+
|
| 31 |
+
/* Bottom */
|
| 32 |
+
.clearlooks2 .mceBottom, .clearlooks2 .mceBottom div {height:6px}
|
| 33 |
+
.clearlooks2 .mceBottom {left:0; bottom:0; width:100%}
|
| 34 |
+
.clearlooks2 .mceBottom div {top:0}
|
| 35 |
+
.clearlooks2 .mceBottom .mceLeft {left:0; width:5px; background:url(img/corners.gif) -34px -6px}
|
| 36 |
+
.clearlooks2 .mceBottom .mceCenter {left:5px; width:100%; background:url(img/horizontal.gif) 0 -46px}
|
| 37 |
+
.clearlooks2 .mceBottom .mceRight {right:0; width:5px; background: url(img/corners.gif) -34px 0}
|
| 38 |
+
.clearlooks2 .mceBottom span {display:none}
|
| 39 |
+
.clearlooks2 .mceStatusbar .mceBottom, .clearlooks2 .mceStatusbar .mceBottom div {height:23px}
|
| 40 |
+
.clearlooks2 .mceStatusbar .mceBottom .mceLeft {background:url(img/corners.gif) -29px 0}
|
| 41 |
+
.clearlooks2 .mceStatusbar .mceBottom .mceCenter {background:url(img/horizontal.gif) 0 -52px}
|
| 42 |
+
.clearlooks2 .mceStatusbar .mceBottom .mceRight {background:url(img/corners.gif) -24px 0}
|
| 43 |
+
.clearlooks2 .mceStatusbar .mceBottom span {display:block; left:7px; font-family:Arial, Verdana; font-size:11px; line-height:23px}
|
| 44 |
+
|
| 45 |
+
/* Actions */
|
| 46 |
+
.clearlooks2 a {width:29px; height:16px; top:3px;}
|
| 47 |
+
.clearlooks2 .mceClose {right:6px; background:url(img/buttons.gif) -87px 0}
|
| 48 |
+
.clearlooks2 .mceMin {display:none; right:68px; background:url(img/buttons.gif) 0 0}
|
| 49 |
+
.clearlooks2 .mceMed {display:none; right:37px; background:url(img/buttons.gif) -29px 0}
|
| 50 |
+
.clearlooks2 .mceMax {display:none; right:37px; background:url(img/buttons.gif) -58px 0}
|
| 51 |
+
.clearlooks2 .mceMove {display:none;width:100%;cursor:move;background:url(img/corners.gif) no-repeat -100px -100px}
|
| 52 |
+
.clearlooks2 .mceMovable .mceMove {display:block}
|
| 53 |
+
.clearlooks2 .mceFocus .mceClose {right:6px; background:url(img/buttons.gif) -87px -16px}
|
| 54 |
+
.clearlooks2 .mceFocus .mceMin {right:68px; background:url(img/buttons.gif) 0 -16px}
|
| 55 |
+
.clearlooks2 .mceFocus .mceMed {right:37px; background:url(img/buttons.gif) -29px -16px}
|
| 56 |
+
.clearlooks2 .mceFocus .mceMax {right:37px; background:url(img/buttons.gif) -58px -16px}
|
| 57 |
+
.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px}
|
| 58 |
+
.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px}
|
| 59 |
+
.clearlooks2 .mceFocus .mceMin:hover {right:68px; background:url(img/buttons.gif) 0 -32px}
|
| 60 |
+
.clearlooks2 .mceFocus .mceMed:hover {right:37px; background:url(img/buttons.gif) -29px -32px}
|
| 61 |
+
.clearlooks2 .mceFocus .mceMax:hover {right:37px; background:url(img/buttons.gif) -58px -32px}
|
| 62 |
+
|
| 63 |
+
/* Resize */
|
| 64 |
+
.clearlooks2 .mceResize {top:auto; left:auto; display:none; width:5px; height:5px; background:url(img/horizontal.gif) no-repeat 0 -75px}
|
| 65 |
+
.clearlooks2 .mceResizable .mceResize {display:block}
|
| 66 |
+
.clearlooks2 .mceResizable .mceMin, .clearlooks2 .mceMax {display:none}
|
| 67 |
+
.clearlooks2 .mceMinimizable .mceMin {display:block}
|
| 68 |
+
.clearlooks2 .mceMaximizable .mceMax {display:block}
|
| 69 |
+
.clearlooks2 .mceMaximized .mceMed {display:block}
|
| 70 |
+
.clearlooks2 .mceMaximized .mceMax {display:none}
|
| 71 |
+
.clearlooks2 a.mceResizeN {top:0; left:0; width:100%; cursor:n-resize}
|
| 72 |
+
.clearlooks2 a.mceResizeNW {top:0; left:0; cursor:nw-resize}
|
| 73 |
+
.clearlooks2 a.mceResizeNE {top:0; right:0; cursor:ne-resize}
|
| 74 |
+
.clearlooks2 a.mceResizeW {top:0; left:0; height:100%; cursor:w-resize;}
|
| 75 |
+
.clearlooks2 a.mceResizeE {top:0; right:0; height:100%; cursor:e-resize}
|
| 76 |
+
.clearlooks2 a.mceResizeS {bottom:0; left:0; width:100%; cursor:s-resize}
|
| 77 |
+
.clearlooks2 a.mceResizeSW {bottom:0; left:0; cursor:sw-resize}
|
| 78 |
+
.clearlooks2 a.mceResizeSE {bottom:0; right:0; cursor:se-resize}
|
| 79 |
+
|
| 80 |
+
/* Alert/Confirm */
|
| 81 |
+
.clearlooks2 .mceButton {font-weight:bold; bottom:10px; width:80px; height:30px; background:url(img/button.gif); line-height:30px; vertical-align:middle; text-align:center; outline:0}
|
| 82 |
+
.clearlooks2 .mceMiddle .mceIcon {left:15px; top:35px; width:32px; height:32px}
|
| 83 |
+
.clearlooks2 .mceAlert .mceMiddle span, .clearlooks2 .mceConfirm .mceMiddle span {background:transparent;left:60px; top:35px; width:320px; height:50px; font-weight:bold; overflow:auto; white-space:normal}
|
| 84 |
+
.clearlooks2 a:hover {font-weight:bold;}
|
| 85 |
+
.clearlooks2 .mceAlert .mceMiddle, .clearlooks2 .mceConfirm .mceMiddle {background:#D6D7D5}
|
| 86 |
+
.clearlooks2 .mceAlert .mceOk {left:50%; top:auto; margin-left: -40px}
|
| 87 |
+
.clearlooks2 .mceAlert .mceIcon {background:url(img/alert.gif)}
|
| 88 |
+
.clearlooks2 .mceConfirm .mceOk {left:50%; top:auto; margin-left: -90px}
|
| 89 |
+
.clearlooks2 .mceConfirm .mceCancel {left:50%; top:auto}
|
| 90 |
+
.clearlooks2 .mceConfirm .mceIcon {background:url(img/confirm.gif)}
|
js/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js
CHANGED
|
@@ -36,7 +36,7 @@
|
|
| 36 |
alignright : {selector : alignElements, attributes : {align : 'right'}},
|
| 37 |
alignfull : {selector : alignElements, attributes : {align : 'justify'}},
|
| 38 |
|
| 39 |
-
// Change the basic formatting elements to use deprecated element types
|
| 40 |
bold : [
|
| 41 |
{inline : 'b', remove : 'all'},
|
| 42 |
{inline : 'strong', remove : 'all'},
|
|
@@ -54,7 +54,7 @@
|
|
| 54 |
strikethrough : [
|
| 55 |
{inline : 'strike', remove : 'all'},
|
| 56 |
{inline : 'span', styles : {textDecoration: 'line-through'}, exact : true}
|
| 57 |
-
],
|
| 58 |
|
| 59 |
// Change font size and font family to use the deprecated font element
|
| 60 |
fontname : {inline : 'font', attributes : {face : '%value'}},
|
| 36 |
alignright : {selector : alignElements, attributes : {align : 'right'}},
|
| 37 |
alignfull : {selector : alignElements, attributes : {align : 'justify'}},
|
| 38 |
|
| 39 |
+
// Change the basic formatting elements to use deprecated element types
|
| 40 |
bold : [
|
| 41 |
{inline : 'b', remove : 'all'},
|
| 42 |
{inline : 'strong', remove : 'all'},
|
| 54 |
strikethrough : [
|
| 55 |
{inline : 'strike', remove : 'all'},
|
| 56 |
{inline : 'span', styles : {textDecoration: 'line-through'}, exact : true}
|
| 57 |
+
],
|
| 58 |
|
| 59 |
// Change font size and font family to use the deprecated font element
|
| 60 |
fontname : {inline : 'font', attributes : {face : '%value'}},
|
js/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin_src.js
CHANGED
|
@@ -1,955 +1,955 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* editor_plugin_src.js
|
| 3 |
-
*
|
| 4 |
-
* Copyright 2011, Moxiecode Systems AB
|
| 5 |
-
* Released under LGPL License.
|
| 6 |
-
*
|
| 7 |
-
* License: http://tinymce.moxiecode.com/license
|
| 8 |
-
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
-
*/
|
| 10 |
-
|
| 11 |
-
(function() {
|
| 12 |
-
var each = tinymce.each, Event = tinymce.dom.Event, bookmark;
|
| 13 |
-
|
| 14 |
-
// Skips text nodes that only contain whitespace since they aren't semantically important.
|
| 15 |
-
function skipWhitespaceNodes(e, next) {
|
| 16 |
-
while (e && (e.nodeType === 8 || (e.nodeType === 3 && /^[ \t\n\r]*$/.test(e.nodeValue)))) {
|
| 17 |
-
e = next(e);
|
| 18 |
-
}
|
| 19 |
-
return e;
|
| 20 |
-
}
|
| 21 |
-
|
| 22 |
-
function skipWhitespaceNodesBackwards(e) {
|
| 23 |
-
return skipWhitespaceNodes(e, function(e) {
|
| 24 |
-
return e.previousSibling;
|
| 25 |
-
});
|
| 26 |
-
}
|
| 27 |
-
|
| 28 |
-
function skipWhitespaceNodesForwards(e) {
|
| 29 |
-
return skipWhitespaceNodes(e, function(e) {
|
| 30 |
-
return e.nextSibling;
|
| 31 |
-
});
|
| 32 |
-
}
|
| 33 |
-
|
| 34 |
-
function hasParentInList(ed, e, list) {
|
| 35 |
-
return ed.dom.getParent(e, function(p) {
|
| 36 |
-
return tinymce.inArray(list, p) !== -1;
|
| 37 |
-
});
|
| 38 |
-
}
|
| 39 |
-
|
| 40 |
-
function isList(e) {
|
| 41 |
-
return e && (e.tagName === 'OL' || e.tagName === 'UL');
|
| 42 |
-
}
|
| 43 |
-
|
| 44 |
-
function splitNestedLists(element, dom) {
|
| 45 |
-
var tmp, nested, wrapItem;
|
| 46 |
-
tmp = skipWhitespaceNodesBackwards(element.lastChild);
|
| 47 |
-
while (isList(tmp)) {
|
| 48 |
-
nested = tmp;
|
| 49 |
-
tmp = skipWhitespaceNodesBackwards(nested.previousSibling);
|
| 50 |
-
}
|
| 51 |
-
if (nested) {
|
| 52 |
-
wrapItem = dom.create('li', { style: 'list-style-type: none;'});
|
| 53 |
-
dom.split(element, nested);
|
| 54 |
-
dom.insertAfter(wrapItem, nested);
|
| 55 |
-
wrapItem.appendChild(nested);
|
| 56 |
-
wrapItem.appendChild(nested);
|
| 57 |
-
element = wrapItem.previousSibling;
|
| 58 |
-
}
|
| 59 |
-
return element;
|
| 60 |
-
}
|
| 61 |
-
|
| 62 |
-
function attemptMergeWithAdjacent(e, allowDifferentListStyles, mergeParagraphs) {
|
| 63 |
-
e = attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs);
|
| 64 |
-
return attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs);
|
| 65 |
-
}
|
| 66 |
-
|
| 67 |
-
function attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs) {
|
| 68 |
-
var prev = skipWhitespaceNodesBackwards(e.previousSibling);
|
| 69 |
-
if (prev) {
|
| 70 |
-
return attemptMerge(prev, e, allowDifferentListStyles ? prev : false, mergeParagraphs);
|
| 71 |
-
} else {
|
| 72 |
-
return e;
|
| 73 |
-
}
|
| 74 |
-
}
|
| 75 |
-
|
| 76 |
-
function attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs) {
|
| 77 |
-
var next = skipWhitespaceNodesForwards(e.nextSibling);
|
| 78 |
-
if (next) {
|
| 79 |
-
return attemptMerge(e, next, allowDifferentListStyles ? next : false, mergeParagraphs);
|
| 80 |
-
} else {
|
| 81 |
-
return e;
|
| 82 |
-
}
|
| 83 |
-
}
|
| 84 |
-
|
| 85 |
-
function attemptMerge(e1, e2, differentStylesMasterElement, mergeParagraphs) {
|
| 86 |
-
if (canMerge(e1, e2, !!differentStylesMasterElement, mergeParagraphs)) {
|
| 87 |
-
return merge(e1, e2, differentStylesMasterElement);
|
| 88 |
-
} else if (e1 && e1.tagName === 'LI' && isList(e2)) {
|
| 89 |
-
// Fix invalidly nested lists.
|
| 90 |
-
e1.appendChild(e2);
|
| 91 |
-
}
|
| 92 |
-
return e2;
|
| 93 |
-
}
|
| 94 |
-
|
| 95 |
-
function canMerge(e1, e2, allowDifferentListStyles, mergeParagraphs) {
|
| 96 |
-
if (!e1 || !e2) {
|
| 97 |
-
return false;
|
| 98 |
-
} else if (e1.tagName === 'LI' && e2.tagName === 'LI') {
|
| 99 |
-
return e2.style.listStyleType === 'none' || containsOnlyAList(e2);
|
| 100 |
-
} else if (isList(e1)) {
|
| 101 |
-
return (e1.tagName === e2.tagName && (allowDifferentListStyles || e1.style.listStyleType === e2.style.listStyleType)) || isListForIndent(e2);
|
| 102 |
-
} else return mergeParagraphs && e1.tagName === 'P' && e2.tagName === 'P';
|
| 103 |
-
}
|
| 104 |
-
|
| 105 |
-
function isListForIndent(e) {
|
| 106 |
-
var firstLI = skipWhitespaceNodesForwards(e.firstChild), lastLI = skipWhitespaceNodesBackwards(e.lastChild);
|
| 107 |
-
return firstLI && lastLI && isList(e) && firstLI === lastLI && (isList(firstLI) || firstLI.style.listStyleType === 'none' || containsOnlyAList(firstLI));
|
| 108 |
-
}
|
| 109 |
-
|
| 110 |
-
function containsOnlyAList(e) {
|
| 111 |
-
var firstChild = skipWhitespaceNodesForwards(e.firstChild), lastChild = skipWhitespaceNodesBackwards(e.lastChild);
|
| 112 |
-
return firstChild && lastChild && firstChild === lastChild && isList(firstChild);
|
| 113 |
-
}
|
| 114 |
-
|
| 115 |
-
function merge(e1, e2, masterElement) {
|
| 116 |
-
var lastOriginal = skipWhitespaceNodesBackwards(e1.lastChild), firstNew = skipWhitespaceNodesForwards(e2.firstChild);
|
| 117 |
-
if (e1.tagName === 'P') {
|
| 118 |
-
e1.appendChild(e1.ownerDocument.createElement('br'));
|
| 119 |
-
}
|
| 120 |
-
while (e2.firstChild) {
|
| 121 |
-
e1.appendChild(e2.firstChild);
|
| 122 |
-
}
|
| 123 |
-
if (masterElement) {
|
| 124 |
-
e1.style.listStyleType = masterElement.style.listStyleType;
|
| 125 |
-
}
|
| 126 |
-
e2.parentNode.removeChild(e2);
|
| 127 |
-
attemptMerge(lastOriginal, firstNew, false);
|
| 128 |
-
return e1;
|
| 129 |
-
}
|
| 130 |
-
|
| 131 |
-
function findItemToOperateOn(e, dom) {
|
| 132 |
-
var item;
|
| 133 |
-
if (!dom.is(e, 'li,ol,ul')) {
|
| 134 |
-
item = dom.getParent(e, 'li');
|
| 135 |
-
if (item) {
|
| 136 |
-
e = item;
|
| 137 |
-
}
|
| 138 |
-
}
|
| 139 |
-
return e;
|
| 140 |
-
}
|
| 141 |
-
|
| 142 |
-
tinymce.create('tinymce.plugins.Lists', {
|
| 143 |
-
init: function(ed) {
|
| 144 |
-
var LIST_TABBING = 'TABBING';
|
| 145 |
-
var LIST_EMPTY_ITEM = 'EMPTY';
|
| 146 |
-
var LIST_ESCAPE = 'ESCAPE';
|
| 147 |
-
var LIST_PARAGRAPH = 'PARAGRAPH';
|
| 148 |
-
var LIST_UNKNOWN = 'UNKNOWN';
|
| 149 |
-
var state = LIST_UNKNOWN;
|
| 150 |
-
|
| 151 |
-
function isTabInList(e) {
|
| 152 |
-
// Don't indent on Ctrl+Tab or Alt+Tab
|
| 153 |
-
return e.keyCode === tinymce.VK.TAB && !(e.altKey || e.ctrlKey) &&
|
| 154 |
-
(ed.queryCommandState('InsertUnorderedList') || ed.queryCommandState('InsertOrderedList'));
|
| 155 |
-
}
|
| 156 |
-
|
| 157 |
-
function isOnLastListItem() {
|
| 158 |
-
var li = getLi();
|
| 159 |
-
var grandParent = li.parentNode.parentNode;
|
| 160 |
-
var isLastItem = li.parentNode.lastChild === li;
|
| 161 |
-
return isLastItem && !isNestedList(grandParent) && isEmptyListItem(li);
|
| 162 |
-
}
|
| 163 |
-
|
| 164 |
-
function isNestedList(grandParent) {
|
| 165 |
-
if (isList(grandParent)) {
|
| 166 |
-
return grandParent.parentNode && grandParent.parentNode.tagName === 'LI';
|
| 167 |
-
} else {
|
| 168 |
-
return grandParent.tagName === 'LI';
|
| 169 |
-
}
|
| 170 |
-
}
|
| 171 |
-
|
| 172 |
-
function isInEmptyListItem() {
|
| 173 |
-
return ed.selection.isCollapsed() && isEmptyListItem(getLi());
|
| 174 |
-
}
|
| 175 |
-
|
| 176 |
-
function getLi() {
|
| 177 |
-
var n = ed.selection.getStart();
|
| 178 |
-
// Get start will return BR if the LI only contains a BR or an empty element as we use these to fix caret position
|
| 179 |
-
return ((n.tagName == 'BR' || n.tagName == '') && n.parentNode.tagName == 'LI') ? n.parentNode : n;
|
| 180 |
-
}
|
| 181 |
-
|
| 182 |
-
function isEmptyListItem(li) {
|
| 183 |
-
var numChildren = li.childNodes.length;
|
| 184 |
-
if (li.tagName === 'LI') {
|
| 185 |
-
return numChildren == 0 ? true : numChildren == 1 && (li.firstChild.tagName == '' || li.firstChild.tagName == 'BR' || isEmptyIE9Li(li));
|
| 186 |
-
}
|
| 187 |
-
return false;
|
| 188 |
-
}
|
| 189 |
-
|
| 190 |
-
function isEmptyIE9Li(li) {
|
| 191 |
-
// only consider this to be last item if there is no list item content or that content is nbsp or space since IE9 creates these
|
| 192 |
-
var lis = tinymce.grep(li.parentNode.childNodes, function(n) {return n.tagName == 'LI'});
|
| 193 |
-
var isLastLi = li == lis[lis.length - 1];
|
| 194 |
-
var child = li.firstChild;
|
| 195 |
-
return tinymce.isIE9 && isLastLi && (child.nodeValue == String.fromCharCode(160) || child.nodeValue == String.fromCharCode(32));
|
| 196 |
-
}
|
| 197 |
-
|
| 198 |
-
function isEnter(e) {
|
| 199 |
-
return e.keyCode === tinymce.VK.ENTER;
|
| 200 |
-
}
|
| 201 |
-
|
| 202 |
-
function isEnterWithoutShift(e) {
|
| 203 |
-
return isEnter(e) && !e.shiftKey;
|
| 204 |
-
}
|
| 205 |
-
|
| 206 |
-
function getListKeyState(e) {
|
| 207 |
-
if (isTabInList(e)) {
|
| 208 |
-
return LIST_TABBING;
|
| 209 |
-
} else if (isEnterWithoutShift(e) && isOnLastListItem()) {
|
| 210 |
-
// Returns LIST_UNKNOWN since breaking out of lists is handled by the EnterKey.js logic now
|
| 211 |
-
//return LIST_ESCAPE;
|
| 212 |
-
return LIST_UNKNOWN;
|
| 213 |
-
} else if (isEnterWithoutShift(e) && isInEmptyListItem()) {
|
| 214 |
-
return LIST_EMPTY_ITEM;
|
| 215 |
-
} else {
|
| 216 |
-
return LIST_UNKNOWN;
|
| 217 |
-
}
|
| 218 |
-
}
|
| 219 |
-
|
| 220 |
-
function cancelDefaultEvents(ed, e) {
|
| 221 |
-
// list escape is done manually using outdent as it does not create paragraphs correctly in td's
|
| 222 |
-
if (state == LIST_TABBING || state == LIST_EMPTY_ITEM || tinymce.isGecko && state == LIST_ESCAPE) {
|
| 223 |
-
Event.cancel(e);
|
| 224 |
-
}
|
| 225 |
-
}
|
| 226 |
-
|
| 227 |
-
function isCursorAtEndOfContainer() {
|
| 228 |
-
var range = ed.selection.getRng(true);
|
| 229 |
-
var startContainer = range.startContainer;
|
| 230 |
-
if (startContainer.nodeType == 3) {
|
| 231 |
-
var value = startContainer.nodeValue;
|
| 232 |
-
if (tinymce.isIE9 && value.length > 1 && value.charCodeAt(value.length-1) == 32) {
|
| 233 |
-
// IE9 places a space on the end of the text in some cases so ignore last char
|
| 234 |
-
return (range.endOffset == value.length-1);
|
| 235 |
-
} else {
|
| 236 |
-
return (range.endOffset == value.length);
|
| 237 |
-
}
|
| 238 |
-
} else if (startContainer.nodeType == 1) {
|
| 239 |
-
return range.endOffset == startContainer.childNodes.length;
|
| 240 |
-
}
|
| 241 |
-
return false;
|
| 242 |
-
}
|
| 243 |
-
|
| 244 |
-
/*
|
| 245 |
-
If we are at the end of a list item surrounded with an element, pressing enter should create a
|
| 246 |
-
new list item instead without splitting the element e.g. don't want to create new P or H1 tag
|
| 247 |
-
*/
|
| 248 |
-
function isEndOfListItem() {
|
| 249 |
-
var node = ed.selection.getNode();
|
| 250 |
-
var validElements = 'h1,h2,h3,h4,h5,h6,p,div';
|
| 251 |
-
var isLastParagraphOfLi = ed.dom.is(node, validElements) && node.parentNode.tagName === 'LI' && node.parentNode.lastChild === node;
|
| 252 |
-
return ed.selection.isCollapsed() && isLastParagraphOfLi && isCursorAtEndOfContainer();
|
| 253 |
-
}
|
| 254 |
-
|
| 255 |
-
// Creates a new list item after the current selection's list item parent
|
| 256 |
-
function createNewLi(ed, e) {
|
| 257 |
-
if (isEnterWithoutShift(e) && isEndOfListItem()) {
|
| 258 |
-
var node = ed.selection.getNode();
|
| 259 |
-
var li = ed.dom.create("li");
|
| 260 |
-
var parentLi = ed.dom.getParent(node, 'li');
|
| 261 |
-
ed.dom.insertAfter(li, parentLi);
|
| 262 |
-
|
| 263 |
-
// Move caret to new list element.
|
| 264 |
-
if (tinymce.isIE6 || tinymce.isIE7 || tinyMCE.isIE8) {
|
| 265 |
-
// Removed this line since it would create an odd < > tag and placing the caret inside an empty LI is handled and should be handled by the selection logic
|
| 266 |
-
//li.appendChild(ed.dom.create(" ")); // IE needs an element within the bullet point
|
| 267 |
-
ed.selection.setCursorLocation(li, 1);
|
| 268 |
-
} else {
|
| 269 |
-
ed.selection.setCursorLocation(li, 0);
|
| 270 |
-
}
|
| 271 |
-
e.preventDefault();
|
| 272 |
-
}
|
| 273 |
-
}
|
| 274 |
-
|
| 275 |
-
function imageJoiningListItem(ed, e) {
|
| 276 |
-
var prevSibling;
|
| 277 |
-
|
| 278 |
-
if (!tinymce.isGecko)
|
| 279 |
-
return;
|
| 280 |
-
|
| 281 |
-
var n = ed.selection.getStart();
|
| 282 |
-
if (e.keyCode != tinymce.VK.BACKSPACE || n.tagName !== 'IMG')
|
| 283 |
-
return;
|
| 284 |
-
|
| 285 |
-
function lastLI(node) {
|
| 286 |
-
var child = node.firstChild;
|
| 287 |
-
var li = null;
|
| 288 |
-
do {
|
| 289 |
-
if (!child)
|
| 290 |
-
break;
|
| 291 |
-
|
| 292 |
-
if (child.tagName === 'LI')
|
| 293 |
-
li = child;
|
| 294 |
-
} while (child = child.nextSibling);
|
| 295 |
-
|
| 296 |
-
return li;
|
| 297 |
-
}
|
| 298 |
-
|
| 299 |
-
function addChildren(parentNode, destination) {
|
| 300 |
-
while (parentNode.childNodes.length > 0)
|
| 301 |
-
destination.appendChild(parentNode.childNodes[0]);
|
| 302 |
-
}
|
| 303 |
-
|
| 304 |
-
// Check if there is a previous sibling
|
| 305 |
-
prevSibling = n.parentNode.previousSibling;
|
| 306 |
-
if (!prevSibling)
|
| 307 |
-
return;
|
| 308 |
-
|
| 309 |
-
var ul;
|
| 310 |
-
if (prevSibling.tagName === 'UL' || prevSibling.tagName === 'OL')
|
| 311 |
-
ul = prevSibling;
|
| 312 |
-
else if (prevSibling.previousSibling && (prevSibling.previousSibling.tagName === 'UL' || prevSibling.previousSibling.tagName === 'OL'))
|
| 313 |
-
ul = prevSibling.previousSibling;
|
| 314 |
-
else
|
| 315 |
-
return;
|
| 316 |
-
|
| 317 |
-
var li = lastLI(ul);
|
| 318 |
-
|
| 319 |
-
// move the caret to the end of the list item
|
| 320 |
-
var rng = ed.dom.createRng();
|
| 321 |
-
rng.setStart(li, 1);
|
| 322 |
-
rng.setEnd(li, 1);
|
| 323 |
-
ed.selection.setRng(rng);
|
| 324 |
-
ed.selection.collapse(true);
|
| 325 |
-
|
| 326 |
-
// save a bookmark at the end of the list item
|
| 327 |
-
var bookmark = ed.selection.getBookmark();
|
| 328 |
-
|
| 329 |
-
// copy the image an its text to the list item
|
| 330 |
-
var clone = n.parentNode.cloneNode(true);
|
| 331 |
-
if (clone.tagName === 'P' || clone.tagName === 'DIV')
|
| 332 |
-
addChildren(clone, li);
|
| 333 |
-
else
|
| 334 |
-
li.appendChild(clone);
|
| 335 |
-
|
| 336 |
-
// remove the old copy of the image
|
| 337 |
-
n.parentNode.parentNode.removeChild(n.parentNode);
|
| 338 |
-
|
| 339 |
-
// move the caret where we saved the bookmark
|
| 340 |
-
ed.selection.moveToBookmark(bookmark);
|
| 341 |
-
}
|
| 342 |
-
|
| 343 |
-
// fix the cursor position to ensure it is correct in IE
|
| 344 |
-
function setCursorPositionToOriginalLi(li) {
|
| 345 |
-
var list = ed.dom.getParent(li, 'ol,ul');
|
| 346 |
-
if (list != null) {
|
| 347 |
-
var lastLi = list.lastChild;
|
| 348 |
-
// Removed this line since IE9 would report an DOM character error and placing the caret inside an empty LI is handled and should be handled by the selection logic
|
| 349 |
-
//lastLi.appendChild(ed.getDoc().createElement(''));
|
| 350 |
-
ed.selection.setCursorLocation(lastLi, 0);
|
| 351 |
-
}
|
| 352 |
-
}
|
| 353 |
-
|
| 354 |
-
this.ed = ed;
|
| 355 |
-
ed.addCommand('Indent', this.indent, this);
|
| 356 |
-
ed.addCommand('Outdent', this.outdent, this);
|
| 357 |
-
ed.addCommand('InsertUnorderedList', function() {
|
| 358 |
-
this.applyList('UL', 'OL');
|
| 359 |
-
}, this);
|
| 360 |
-
ed.addCommand('InsertOrderedList', function() {
|
| 361 |
-
this.applyList('OL', 'UL');
|
| 362 |
-
}, this);
|
| 363 |
-
|
| 364 |
-
ed.onInit.add(function() {
|
| 365 |
-
ed.editorCommands.addCommands({
|
| 366 |
-
'outdent': function() {
|
| 367 |
-
var sel = ed.selection, dom = ed.dom;
|
| 368 |
-
|
| 369 |
-
function hasStyleIndent(n) {
|
| 370 |
-
n = dom.getParent(n, dom.isBlock);
|
| 371 |
-
return n && (parseInt(ed.dom.getStyle(n, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(n, 'padding-left') || 0, 10)) > 0;
|
| 372 |
-
}
|
| 373 |
-
|
| 374 |
-
return hasStyleIndent(sel.getStart()) || hasStyleIndent(sel.getEnd()) || ed.queryCommandState('InsertOrderedList') || ed.queryCommandState('InsertUnorderedList');
|
| 375 |
-
}
|
| 376 |
-
}, 'state');
|
| 377 |
-
});
|
| 378 |
-
|
| 379 |
-
ed.onKeyUp.add(function(ed, e) {
|
| 380 |
-
if (state == LIST_TABBING) {
|
| 381 |
-
ed.execCommand(e.shiftKey ? 'Outdent' : 'Indent', true, null);
|
| 382 |
-
state = LIST_UNKNOWN;
|
| 383 |
-
return Event.cancel(e);
|
| 384 |
-
} else if (state == LIST_EMPTY_ITEM) {
|
| 385 |
-
var li = getLi();
|
| 386 |
-
var shouldOutdent = ed.settings.list_outdent_on_enter === true || e.shiftKey;
|
| 387 |
-
ed.execCommand(shouldOutdent ? 'Outdent' : 'Indent', true, null);
|
| 388 |
-
if (tinymce.isIE) {
|
| 389 |
-
setCursorPositionToOriginalLi(li);
|
| 390 |
-
}
|
| 391 |
-
|
| 392 |
-
return Event.cancel(e);
|
| 393 |
-
} else if (state == LIST_ESCAPE) {
|
| 394 |
-
if (tinymce.isIE6 || tinymce.isIE7 || tinymce.isIE8) {
|
| 395 |
-
// append a zero sized nbsp so that caret is positioned correctly in IE after escaping and applying formatting.
|
| 396 |
-
// if there is no text then applying formatting for e.g a H1 to the P tag immediately following list after
|
| 397 |
-
// escaping from it will cause the caret to be positioned on the last li instead of staying the in P tag.
|
| 398 |
-
var n = ed.getDoc().createTextNode('\uFEFF');
|
| 399 |
-
ed.selection.getNode().appendChild(n);
|
| 400 |
-
} else if (tinymce.isIE9 || tinymce.isGecko) {
|
| 401 |
-
// IE9 does not escape the list so we use outdent to do this and cancel the default behaviour
|
| 402 |
-
// Gecko does not create a paragraph outdenting inside a TD so default behaviour is cancelled and we outdent ourselves
|
| 403 |
-
ed.execCommand('Outdent');
|
| 404 |
-
return Event.cancel(e);
|
| 405 |
-
}
|
| 406 |
-
}
|
| 407 |
-
});
|
| 408 |
-
|
| 409 |
-
function fixListItem(parent, reference) {
|
| 410 |
-
// a zero-sized non-breaking space is placed in the empty list item so that the nested list is
|
| 411 |
-
// displayed on the below line instead of next to it
|
| 412 |
-
var n = ed.getDoc().createTextNode('\uFEFF');
|
| 413 |
-
parent.insertBefore(n, reference);
|
| 414 |
-
ed.selection.setCursorLocation(n, 0);
|
| 415 |
-
// repaint to remove rendering artifact. only visible when creating new list
|
| 416 |
-
ed.execCommand('mceRepaint');
|
| 417 |
-
}
|
| 418 |
-
|
| 419 |
-
function fixIndentedListItemForGecko(ed, e) {
|
| 420 |
-
if (isEnter(e)) {
|
| 421 |
-
var li = getLi();
|
| 422 |
-
if (li) {
|
| 423 |
-
var parent = li.parentNode;
|
| 424 |
-
var grandParent = parent && parent.parentNode;
|
| 425 |
-
if (grandParent && grandParent.nodeName == 'LI' && grandParent.firstChild == parent && li == parent.firstChild) {
|
| 426 |
-
fixListItem(grandParent, parent);
|
| 427 |
-
}
|
| 428 |
-
}
|
| 429 |
-
}
|
| 430 |
-
}
|
| 431 |
-
|
| 432 |
-
function fixIndentedListItemForIE8(ed, e) {
|
| 433 |
-
if (isEnter(e)) {
|
| 434 |
-
var li = getLi();
|
| 435 |
-
if (ed.dom.select('ul li', li).length === 1) {
|
| 436 |
-
var list = li.firstChild;
|
| 437 |
-
fixListItem(li, list);
|
| 438 |
-
}
|
| 439 |
-
}
|
| 440 |
-
}
|
| 441 |
-
|
| 442 |
-
function fixDeletingFirstCharOfList(ed, e) {
|
| 443 |
-
function listElements(li) {
|
| 444 |
-
var elements = [];
|
| 445 |
-
var walker = new tinymce.dom.TreeWalker(li.firstChild, li);
|
| 446 |
-
for (var node = walker.current(); node; node = walker.next()) {
|
| 447 |
-
if (ed.dom.is(node, 'ol,ul,li')) {
|
| 448 |
-
elements.push(node);
|
| 449 |
-
}
|
| 450 |
-
}
|
| 451 |
-
return elements;
|
| 452 |
-
}
|
| 453 |
-
|
| 454 |
-
if (e.keyCode == tinymce.VK.BACKSPACE) {
|
| 455 |
-
var li = getLi();
|
| 456 |
-
if (li) {
|
| 457 |
-
var list = ed.dom.getParent(li, 'ol,ul'),
|
| 458 |
-
rng = ed.selection.getRng();
|
| 459 |
-
if (list && list.firstChild === li && rng.startOffset == 0) {
|
| 460 |
-
var elements = listElements(li);
|
| 461 |
-
elements.unshift(li);
|
| 462 |
-
ed.execCommand("Outdent", false, elements);
|
| 463 |
-
ed.undoManager.add();
|
| 464 |
-
return Event.cancel(e);
|
| 465 |
-
}
|
| 466 |
-
}
|
| 467 |
-
}
|
| 468 |
-
}
|
| 469 |
-
|
| 470 |
-
function fixDeletingEmptyLiInWebkit(ed, e) {
|
| 471 |
-
var li = getLi();
|
| 472 |
-
if (e.keyCode === tinymce.VK.BACKSPACE && ed.dom.is(li, 'li') && li.parentNode.firstChild!==li) {
|
| 473 |
-
if (ed.dom.select('ul,ol', li).length === 1) {
|
| 474 |
-
var prevLi = li.previousSibling;
|
| 475 |
-
ed.dom.remove(ed.dom.select('br', li));
|
| 476 |
-
ed.dom.remove(li, true);
|
| 477 |
-
var textNodes = tinymce.grep(prevLi.childNodes, function(n){ return n.nodeType === 3 });
|
| 478 |
-
if (textNodes.length === 1) {
|
| 479 |
-
var textNode = textNodes[0];
|
| 480 |
-
ed.selection.setCursorLocation(textNode, textNode.length);
|
| 481 |
-
}
|
| 482 |
-
ed.undoManager.add();
|
| 483 |
-
return Event.cancel(e);
|
| 484 |
-
}
|
| 485 |
-
}
|
| 486 |
-
}
|
| 487 |
-
|
| 488 |
-
ed.onKeyDown.add(function(_, e) { state = getListKeyState(e); });
|
| 489 |
-
ed.onKeyDown.add(cancelDefaultEvents);
|
| 490 |
-
ed.onKeyDown.add(imageJoiningListItem);
|
| 491 |
-
ed.onKeyDown.add(createNewLi);
|
| 492 |
-
|
| 493 |
-
if (tinymce.isGecko) {
|
| 494 |
-
ed.onKeyUp.add(fixIndentedListItemForGecko);
|
| 495 |
-
}
|
| 496 |
-
if (tinymce.isIE8) {
|
| 497 |
-
ed.onKeyUp.add(fixIndentedListItemForIE8);
|
| 498 |
-
}
|
| 499 |
-
if (tinymce.isGecko || tinymce.isWebKit) {
|
| 500 |
-
ed.onKeyDown.add(fixDeletingFirstCharOfList);
|
| 501 |
-
}
|
| 502 |
-
if (tinymce.isWebKit) {
|
| 503 |
-
ed.onKeyDown.add(fixDeletingEmptyLiInWebkit);
|
| 504 |
-
}
|
| 505 |
-
},
|
| 506 |
-
|
| 507 |
-
applyList: function(targetListType, oppositeListType) {
|
| 508 |
-
var t = this, ed = t.ed, dom = ed.dom, applied = [], hasSameType = false, hasOppositeType = false, hasNonList = false, actions,
|
| 509 |
-
selectedBlocks = ed.selection.getSelectedBlocks();
|
| 510 |
-
|
| 511 |
-
function cleanupBr(e) {
|
| 512 |
-
if (e && e.tagName === 'BR') {
|
| 513 |
-
dom.remove(e);
|
| 514 |
-
}
|
| 515 |
-
}
|
| 516 |
-
|
| 517 |
-
function makeList(element) {
|
| 518 |
-
var list = dom.create(targetListType), li;
|
| 519 |
-
|
| 520 |
-
function adjustIndentForNewList(element) {
|
| 521 |
-
// If there's a margin-left, outdent one level to account for the extra list margin.
|
| 522 |
-
if (element.style.marginLeft || element.style.paddingLeft) {
|
| 523 |
-
t.adjustPaddingFunction(false)(element);
|
| 524 |
-
}
|
| 525 |
-
}
|
| 526 |
-
|
| 527 |
-
if (element.tagName === 'LI') {
|
| 528 |
-
// No change required.
|
| 529 |
-
} else if (element.tagName === 'P' || element.tagName === 'DIV' || element.tagName === 'BODY') {
|
| 530 |
-
processBrs(element, function(startSection, br) {
|
| 531 |
-
doWrapList(startSection, br, element.tagName === 'BODY' ? null : startSection.parentNode);
|
| 532 |
-
li = startSection.parentNode;
|
| 533 |
-
adjustIndentForNewList(li);
|
| 534 |
-
cleanupBr(br);
|
| 535 |
-
});
|
| 536 |
-
if (li) {
|
| 537 |
-
if (li.tagName === 'LI' && (element.tagName === 'P' || selectedBlocks.length > 1)) {
|
| 538 |
-
dom.split(li.parentNode.parentNode, li.parentNode);
|
| 539 |
-
}
|
| 540 |
-
attemptMergeWithAdjacent(li.parentNode, true);
|
| 541 |
-
}
|
| 542 |
-
return;
|
| 543 |
-
} else {
|
| 544 |
-
// Put the list around the element.
|
| 545 |
-
li = dom.create('li');
|
| 546 |
-
dom.insertAfter(li, element);
|
| 547 |
-
li.appendChild(element);
|
| 548 |
-
adjustIndentForNewList(element);
|
| 549 |
-
element = li;
|
| 550 |
-
}
|
| 551 |
-
dom.insertAfter(list, element);
|
| 552 |
-
list.appendChild(element);
|
| 553 |
-
attemptMergeWithAdjacent(list, true);
|
| 554 |
-
applied.push(element);
|
| 555 |
-
}
|
| 556 |
-
|
| 557 |
-
function doWrapList(start, end, template) {
|
| 558 |
-
var li, n = start, tmp;
|
| 559 |
-
while (!dom.isBlock(start.parentNode) && start.parentNode !== dom.getRoot()) {
|
| 560 |
-
start = dom.split(start.parentNode, start.previousSibling);
|
| 561 |
-
start = start.nextSibling;
|
| 562 |
-
n = start;
|
| 563 |
-
}
|
| 564 |
-
if (template) {
|
| 565 |
-
li = template.cloneNode(true);
|
| 566 |
-
start.parentNode.insertBefore(li, start);
|
| 567 |
-
while (li.firstChild) dom.remove(li.firstChild);
|
| 568 |
-
li = dom.rename(li, 'li');
|
| 569 |
-
} else {
|
| 570 |
-
li = dom.create('li');
|
| 571 |
-
start.parentNode.insertBefore(li, start);
|
| 572 |
-
}
|
| 573 |
-
while (n && n != end) {
|
| 574 |
-
tmp = n.nextSibling;
|
| 575 |
-
li.appendChild(n);
|
| 576 |
-
n = tmp;
|
| 577 |
-
}
|
| 578 |
-
if (li.childNodes.length === 0) {
|
| 579 |
-
li.innerHTML = '<br _mce_bogus="1" />';
|
| 580 |
-
}
|
| 581 |
-
makeList(li);
|
| 582 |
-
}
|
| 583 |
-
|
| 584 |
-
function processBrs(element, callback) {
|
| 585 |
-
var startSection, previousBR, END_TO_START = 3, START_TO_END = 1,
|
| 586 |
-
breakElements = 'br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl';
|
| 587 |
-
|
| 588 |
-
function isAnyPartSelected(start, end) {
|
| 589 |
-
var r = dom.createRng(), sel;
|
| 590 |
-
bookmark.keep = true;
|
| 591 |
-
ed.selection.moveToBookmark(bookmark);
|
| 592 |
-
bookmark.keep = false;
|
| 593 |
-
sel = ed.selection.getRng(true);
|
| 594 |
-
if (!end) {
|
| 595 |
-
end = start.parentNode.lastChild;
|
| 596 |
-
}
|
| 597 |
-
r.setStartBefore(start);
|
| 598 |
-
r.setEndAfter(end);
|
| 599 |
-
return !(r.compareBoundaryPoints(END_TO_START, sel) > 0 || r.compareBoundaryPoints(START_TO_END, sel) <= 0);
|
| 600 |
-
}
|
| 601 |
-
|
| 602 |
-
function nextLeaf(br) {
|
| 603 |
-
if (br.nextSibling)
|
| 604 |
-
return br.nextSibling;
|
| 605 |
-
if (!dom.isBlock(br.parentNode) && br.parentNode !== dom.getRoot())
|
| 606 |
-
return nextLeaf(br.parentNode);
|
| 607 |
-
}
|
| 608 |
-
|
| 609 |
-
// Split on BRs within the range and process those.
|
| 610 |
-
startSection = element.firstChild;
|
| 611 |
-
// First mark the BRs that have any part of the previous section selected.
|
| 612 |
-
var trailingContentSelected = false;
|
| 613 |
-
each(dom.select(breakElements, element), function(br) {
|
| 614 |
-
if (br.hasAttribute && br.hasAttribute('_mce_bogus')) {
|
| 615 |
-
return true; // Skip the bogus Brs that are put in to appease Firefox and Safari.
|
| 616 |
-
}
|
| 617 |
-
if (isAnyPartSelected(startSection, br)) {
|
| 618 |
-
dom.addClass(br, '_mce_tagged_br');
|
| 619 |
-
startSection = nextLeaf(br);
|
| 620 |
-
}
|
| 621 |
-
});
|
| 622 |
-
trailingContentSelected = (startSection && isAnyPartSelected(startSection, undefined));
|
| 623 |
-
startSection = element.firstChild;
|
| 624 |
-
each(dom.select(breakElements, element), function(br) {
|
| 625 |
-
// Got a section from start to br.
|
| 626 |
-
var tmp = nextLeaf(br);
|
| 627 |
-
if (br.hasAttribute && br.hasAttribute('_mce_bogus')) {
|
| 628 |
-
return true; // Skip the bogus Brs that are put in to appease Firefox and Safari.
|
| 629 |
-
}
|
| 630 |
-
if (dom.hasClass(br, '_mce_tagged_br')) {
|
| 631 |
-
callback(startSection, br, previousBR);
|
| 632 |
-
previousBR = null;
|
| 633 |
-
} else {
|
| 634 |
-
previousBR = br;
|
| 635 |
-
}
|
| 636 |
-
startSection = tmp;
|
| 637 |
-
});
|
| 638 |
-
if (trailingContentSelected) {
|
| 639 |
-
callback(startSection, undefined, previousBR);
|
| 640 |
-
}
|
| 641 |
-
}
|
| 642 |
-
|
| 643 |
-
function wrapList(element) {
|
| 644 |
-
processBrs(element, function(startSection, br, previousBR) {
|
| 645 |
-
// Need to indent this part
|
| 646 |
-
doWrapList(startSection, br);
|
| 647 |
-
cleanupBr(br);
|
| 648 |
-
cleanupBr(previousBR);
|
| 649 |
-
});
|
| 650 |
-
}
|
| 651 |
-
|
| 652 |
-
function changeList(element) {
|
| 653 |
-
if (tinymce.inArray(applied, element) !== -1) {
|
| 654 |
-
return;
|
| 655 |
-
}
|
| 656 |
-
if (element.parentNode.tagName === oppositeListType) {
|
| 657 |
-
dom.split(element.parentNode, element);
|
| 658 |
-
makeList(element);
|
| 659 |
-
attemptMergeWithNext(element.parentNode, false);
|
| 660 |
-
}
|
| 661 |
-
applied.push(element);
|
| 662 |
-
}
|
| 663 |
-
|
| 664 |
-
function convertListItemToParagraph(element) {
|
| 665 |
-
var child, nextChild, mergedElement, splitLast;
|
| 666 |
-
if (tinymce.inArray(applied, element) !== -1) {
|
| 667 |
-
return;
|
| 668 |
-
}
|
| 669 |
-
element = splitNestedLists(element, dom);
|
| 670 |
-
while (dom.is(element.parentNode, 'ol,ul,li')) {
|
| 671 |
-
dom.split(element.parentNode, element);
|
| 672 |
-
}
|
| 673 |
-
// Push the original element we have from the selection, not the renamed one.
|
| 674 |
-
applied.push(element);
|
| 675 |
-
element = dom.rename(element, 'p');
|
| 676 |
-
mergedElement = attemptMergeWithAdjacent(element, false, ed.settings.force_br_newlines);
|
| 677 |
-
if (mergedElement === element) {
|
| 678 |
-
// Now split out any block elements that can't be contained within a P.
|
| 679 |
-
// Manually iterate to ensure we handle modifications correctly (doesn't work with tinymce.each)
|
| 680 |
-
child = element.firstChild;
|
| 681 |
-
while (child) {
|
| 682 |
-
if (dom.isBlock(child)) {
|
| 683 |
-
child = dom.split(child.parentNode, child);
|
| 684 |
-
splitLast = true;
|
| 685 |
-
nextChild = child.nextSibling && child.nextSibling.firstChild;
|
| 686 |
-
} else {
|
| 687 |
-
nextChild = child.nextSibling;
|
| 688 |
-
if (splitLast && child.tagName === 'BR') {
|
| 689 |
-
dom.remove(child);
|
| 690 |
-
}
|
| 691 |
-
splitLast = false;
|
| 692 |
-
}
|
| 693 |
-
child = nextChild;
|
| 694 |
-
}
|
| 695 |
-
}
|
| 696 |
-
}
|
| 697 |
-
|
| 698 |
-
each(selectedBlocks, function(e) {
|
| 699 |
-
e = findItemToOperateOn(e, dom);
|
| 700 |
-
if (e.tagName === oppositeListType || (e.tagName === 'LI' && e.parentNode.tagName === oppositeListType)) {
|
| 701 |
-
hasOppositeType = true;
|
| 702 |
-
} else if (e.tagName === targetListType || (e.tagName === 'LI' && e.parentNode.tagName === targetListType)) {
|
| 703 |
-
hasSameType = true;
|
| 704 |
-
} else {
|
| 705 |
-
hasNonList = true;
|
| 706 |
-
}
|
| 707 |
-
});
|
| 708 |
-
|
| 709 |
-
if (hasNonList &&!hasSameType || hasOppositeType || selectedBlocks.length === 0) {
|
| 710 |
-
actions = {
|
| 711 |
-
'LI': changeList,
|
| 712 |
-
'H1': makeList,
|
| 713 |
-
'H2': makeList,
|
| 714 |
-
'H3': makeList,
|
| 715 |
-
'H4': makeList,
|
| 716 |
-
'H5': makeList,
|
| 717 |
-
'H6': makeList,
|
| 718 |
-
'P': makeList,
|
| 719 |
-
'BODY': makeList,
|
| 720 |
-
'DIV': selectedBlocks.length > 1 ? makeList : wrapList,
|
| 721 |
-
defaultAction: wrapList,
|
| 722 |
-
elements: this.selectedBlocks()
|
| 723 |
-
};
|
| 724 |
-
} else {
|
| 725 |
-
actions = {
|
| 726 |
-
defaultAction: convertListItemToParagraph,
|
| 727 |
-
elements: this.selectedBlocks(),
|
| 728 |
-
processEvenIfEmpty: true
|
| 729 |
-
};
|
| 730 |
-
}
|
| 731 |
-
this.process(actions);
|
| 732 |
-
},
|
| 733 |
-
|
| 734 |
-
indent: function() {
|
| 735 |
-
var ed = this.ed, dom = ed.dom, indented = [];
|
| 736 |
-
|
| 737 |
-
function createWrapItem(element) {
|
| 738 |
-
var wrapItem = dom.create('li', { style: 'list-style-type: none;'});
|
| 739 |
-
dom.insertAfter(wrapItem, element);
|
| 740 |
-
return wrapItem;
|
| 741 |
-
}
|
| 742 |
-
|
| 743 |
-
function createWrapList(element) {
|
| 744 |
-
var wrapItem = createWrapItem(element),
|
| 745 |
-
list = dom.getParent(element, 'ol,ul'),
|
| 746 |
-
listType = list.tagName,
|
| 747 |
-
listStyle = dom.getStyle(list, 'list-style-type'),
|
| 748 |
-
attrs = {},
|
| 749 |
-
wrapList;
|
| 750 |
-
if (listStyle !== '') {
|
| 751 |
-
attrs.style = 'list-style-type: ' + listStyle + ';';
|
| 752 |
-
}
|
| 753 |
-
wrapList = dom.create(listType, attrs);
|
| 754 |
-
wrapItem.appendChild(wrapList);
|
| 755 |
-
return wrapList;
|
| 756 |
-
}
|
| 757 |
-
|
| 758 |
-
function indentLI(element) {
|
| 759 |
-
if (!hasParentInList(ed, element, indented)) {
|
| 760 |
-
element = splitNestedLists(element, dom);
|
| 761 |
-
var wrapList = createWrapList(element);
|
| 762 |
-
wrapList.appendChild(element);
|
| 763 |
-
attemptMergeWithAdjacent(wrapList.parentNode, false);
|
| 764 |
-
attemptMergeWithAdjacent(wrapList, false);
|
| 765 |
-
indented.push(element);
|
| 766 |
-
}
|
| 767 |
-
}
|
| 768 |
-
|
| 769 |
-
this.process({
|
| 770 |
-
'LI': indentLI,
|
| 771 |
-
defaultAction: this.adjustPaddingFunction(true),
|
| 772 |
-
elements: this.selectedBlocks()
|
| 773 |
-
});
|
| 774 |
-
|
| 775 |
-
},
|
| 776 |
-
|
| 777 |
-
outdent: function(ui, elements) {
|
| 778 |
-
var t = this, ed = t.ed, dom = ed.dom, outdented = [];
|
| 779 |
-
|
| 780 |
-
function outdentLI(element) {
|
| 781 |
-
var listElement, targetParent, align;
|
| 782 |
-
if (!hasParentInList(ed, element, outdented)) {
|
| 783 |
-
if (dom.getStyle(element, 'margin-left') !== '' || dom.getStyle(element, 'padding-left') !== '') {
|
| 784 |
-
return t.adjustPaddingFunction(false)(element);
|
| 785 |
-
}
|
| 786 |
-
align = dom.getStyle(element, 'text-align', true);
|
| 787 |
-
if (align === 'center' || align === 'right') {
|
| 788 |
-
dom.setStyle(element, 'text-align', 'left');
|
| 789 |
-
return;
|
| 790 |
-
}
|
| 791 |
-
element = splitNestedLists(element, dom);
|
| 792 |
-
listElement = element.parentNode;
|
| 793 |
-
targetParent = element.parentNode.parentNode;
|
| 794 |
-
if (targetParent.tagName === 'P') {
|
| 795 |
-
dom.split(targetParent, element.parentNode);
|
| 796 |
-
} else {
|
| 797 |
-
dom.split(listElement, element);
|
| 798 |
-
if (targetParent.tagName === 'LI') {
|
| 799 |
-
// Nested list, need to split the LI and go back out to the OL/UL element.
|
| 800 |
-
dom.split(targetParent, element);
|
| 801 |
-
} else if (!dom.is(targetParent, 'ol,ul')) {
|
| 802 |
-
dom.rename(element, 'p');
|
| 803 |
-
}
|
| 804 |
-
}
|
| 805 |
-
outdented.push(element);
|
| 806 |
-
}
|
| 807 |
-
}
|
| 808 |
-
|
| 809 |
-
var listElements = elements && tinymce.is(elements, 'array') ? elements : this.selectedBlocks();
|
| 810 |
-
this.process({
|
| 811 |
-
'LI': outdentLI,
|
| 812 |
-
defaultAction: this.adjustPaddingFunction(false),
|
| 813 |
-
elements: listElements
|
| 814 |
-
});
|
| 815 |
-
|
| 816 |
-
each(outdented, attemptMergeWithAdjacent);
|
| 817 |
-
},
|
| 818 |
-
|
| 819 |
-
process: function(actions) {
|
| 820 |
-
var t = this, sel = t.ed.selection, dom = t.ed.dom, selectedBlocks, r;
|
| 821 |
-
|
| 822 |
-
function isEmptyElement(element) {
|
| 823 |
-
var excludeBrsAndBookmarks = tinymce.grep(element.childNodes, function(n) {
|
| 824 |
-
return !(n.nodeName === 'BR' || n.nodeName === 'SPAN' && dom.getAttrib(n, 'data-mce-type') == 'bookmark'
|
| 825 |
-
|| n.nodeType == 3 && (n.nodeValue == String.fromCharCode(160) || n.nodeValue == ''));
|
| 826 |
-
});
|
| 827 |
-
return excludeBrsAndBookmarks.length === 0;
|
| 828 |
-
}
|
| 829 |
-
|
| 830 |
-
function processElement(element) {
|
| 831 |
-
dom.removeClass(element, '_mce_act_on');
|
| 832 |
-
if (!element || element.nodeType !== 1 || ! actions.processEvenIfEmpty && selectedBlocks.length > 1 && isEmptyElement(element)) {
|
| 833 |
-
return;
|
| 834 |
-
}
|
| 835 |
-
element = findItemToOperateOn(element, dom);
|
| 836 |
-
var action = actions[element.tagName];
|
| 837 |
-
if (!action) {
|
| 838 |
-
action = actions.defaultAction;
|
| 839 |
-
}
|
| 840 |
-
action(element);
|
| 841 |
-
}
|
| 842 |
-
|
| 843 |
-
function recurse(element) {
|
| 844 |
-
t.splitSafeEach(element.childNodes, processElement, true);
|
| 845 |
-
}
|
| 846 |
-
|
| 847 |
-
function brAtEdgeOfSelection(container, offset) {
|
| 848 |
-
return offset >= 0 && container.hasChildNodes() && offset < container.childNodes.length &&
|
| 849 |
-
container.childNodes[offset].tagName === 'BR';
|
| 850 |
-
}
|
| 851 |
-
|
| 852 |
-
function isInTable() {
|
| 853 |
-
var n = sel.getNode();
|
| 854 |
-
var p = dom.getParent(n, 'td');
|
| 855 |
-
return p !== null;
|
| 856 |
-
}
|
| 857 |
-
|
| 858 |
-
selectedBlocks = actions.elements;
|
| 859 |
-
|
| 860 |
-
r = sel.getRng(true);
|
| 861 |
-
if (!r.collapsed) {
|
| 862 |
-
if (brAtEdgeOfSelection(r.endContainer, r.endOffset - 1)) {
|
| 863 |
-
r.setEnd(r.endContainer, r.endOffset - 1);
|
| 864 |
-
sel.setRng(r);
|
| 865 |
-
}
|
| 866 |
-
if (brAtEdgeOfSelection(r.startContainer, r.startOffset)) {
|
| 867 |
-
r.setStart(r.startContainer, r.startOffset + 1);
|
| 868 |
-
sel.setRng(r);
|
| 869 |
-
}
|
| 870 |
-
}
|
| 871 |
-
|
| 872 |
-
|
| 873 |
-
if (tinymce.isIE8) {
|
| 874 |
-
// append a zero sized nbsp so that caret is restored correctly using bookmark
|
| 875 |
-
var s = t.ed.selection.getNode();
|
| 876 |
-
if (s.tagName === 'LI' && !(s.parentNode.lastChild === s)) {
|
| 877 |
-
var i = t.ed.getDoc().createTextNode('\uFEFF');
|
| 878 |
-
s.appendChild(i);
|
| 879 |
-
}
|
| 880 |
-
}
|
| 881 |
-
|
| 882 |
-
bookmark = sel.getBookmark();
|
| 883 |
-
actions.OL = actions.UL = recurse;
|
| 884 |
-
t.splitSafeEach(selectedBlocks, processElement);
|
| 885 |
-
sel.moveToBookmark(bookmark);
|
| 886 |
-
bookmark = null;
|
| 887 |
-
|
| 888 |
-
// we avoid doing repaint in a table as this will move the caret out of the table in Firefox 3.6
|
| 889 |
-
if (!isInTable()) {
|
| 890 |
-
// Avoids table or image handles being left behind in Firefox.
|
| 891 |
-
t.ed.execCommand('mceRepaint');
|
| 892 |
-
}
|
| 893 |
-
},
|
| 894 |
-
|
| 895 |
-
splitSafeEach: function(elements, f, forceClassBase) {
|
| 896 |
-
if (forceClassBase ||
|
| 897 |
-
(tinymce.isGecko &&
|
| 898 |
-
(/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) ||
|
| 899 |
-
/Firefox\/3\.[0-4]/.test(navigator.userAgent)))) {
|
| 900 |
-
this.classBasedEach(elements, f);
|
| 901 |
-
} else {
|
| 902 |
-
each(elements, f);
|
| 903 |
-
}
|
| 904 |
-
},
|
| 905 |
-
|
| 906 |
-
classBasedEach: function(elements, f) {
|
| 907 |
-
var dom = this.ed.dom, nodes, element;
|
| 908 |
-
// Mark nodes
|
| 909 |
-
each(elements, function(element) {
|
| 910 |
-
dom.addClass(element, '_mce_act_on');
|
| 911 |
-
});
|
| 912 |
-
nodes = dom.select('._mce_act_on');
|
| 913 |
-
while (nodes.length > 0) {
|
| 914 |
-
element = nodes.shift();
|
| 915 |
-
dom.removeClass(element, '_mce_act_on');
|
| 916 |
-
f(element);
|
| 917 |
-
nodes = dom.select('._mce_act_on');
|
| 918 |
-
}
|
| 919 |
-
},
|
| 920 |
-
|
| 921 |
-
adjustPaddingFunction: function(isIndent) {
|
| 922 |
-
var indentAmount, indentUnits, ed = this.ed;
|
| 923 |
-
indentAmount = ed.settings.indentation;
|
| 924 |
-
indentUnits = /[a-z%]+/i.exec(indentAmount);
|
| 925 |
-
indentAmount = parseInt(indentAmount, 10);
|
| 926 |
-
return function(element) {
|
| 927 |
-
var currentIndent, newIndentAmount;
|
| 928 |
-
currentIndent = parseInt(ed.dom.getStyle(element, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(element, 'padding-left') || 0, 10);
|
| 929 |
-
if (isIndent) {
|
| 930 |
-
newIndentAmount = currentIndent + indentAmount;
|
| 931 |
-
} else {
|
| 932 |
-
newIndentAmount = currentIndent - indentAmount;
|
| 933 |
-
}
|
| 934 |
-
ed.dom.setStyle(element, 'padding-left', '');
|
| 935 |
-
ed.dom.setStyle(element, 'margin-left', newIndentAmount > 0 ? newIndentAmount + indentUnits : '');
|
| 936 |
-
};
|
| 937 |
-
},
|
| 938 |
-
|
| 939 |
-
selectedBlocks: function() {
|
| 940 |
-
var ed = this.ed, selectedBlocks = ed.selection.getSelectedBlocks();
|
| 941 |
-
return selectedBlocks.length == 0 ? [ ed.dom.getRoot() ] : selectedBlocks;
|
| 942 |
-
},
|
| 943 |
-
|
| 944 |
-
getInfo: function() {
|
| 945 |
-
return {
|
| 946 |
-
longname : 'Lists',
|
| 947 |
-
author : 'Moxiecode Systems AB',
|
| 948 |
-
authorurl : 'http://tinymce.moxiecode.com',
|
| 949 |
-
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists',
|
| 950 |
-
version : tinymce.majorVersion + "." + tinymce.minorVersion
|
| 951 |
-
};
|
| 952 |
-
}
|
| 953 |
-
});
|
| 954 |
-
tinymce.PluginManager.add("lists", tinymce.plugins.Lists);
|
| 955 |
-
}());
|
| 1 |
+
/**
|
| 2 |
+
* editor_plugin_src.js
|
| 3 |
+
*
|
| 4 |
+
* Copyright 2011, Moxiecode Systems AB
|
| 5 |
+
* Released under LGPL License.
|
| 6 |
+
*
|
| 7 |
+
* License: http://tinymce.moxiecode.com/license
|
| 8 |
+
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
+
*/
|
| 10 |
+
|
| 11 |
+
(function() {
|
| 12 |
+
var each = tinymce.each, Event = tinymce.dom.Event, bookmark;
|
| 13 |
+
|
| 14 |
+
// Skips text nodes that only contain whitespace since they aren't semantically important.
|
| 15 |
+
function skipWhitespaceNodes(e, next) {
|
| 16 |
+
while (e && (e.nodeType === 8 || (e.nodeType === 3 && /^[ \t\n\r]*$/.test(e.nodeValue)))) {
|
| 17 |
+
e = next(e);
|
| 18 |
+
}
|
| 19 |
+
return e;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
function skipWhitespaceNodesBackwards(e) {
|
| 23 |
+
return skipWhitespaceNodes(e, function(e) {
|
| 24 |
+
return e.previousSibling;
|
| 25 |
+
});
|
| 26 |
+
}
|
| 27 |
+
|
| 28 |
+
function skipWhitespaceNodesForwards(e) {
|
| 29 |
+
return skipWhitespaceNodes(e, function(e) {
|
| 30 |
+
return e.nextSibling;
|
| 31 |
+
});
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
function hasParentInList(ed, e, list) {
|
| 35 |
+
return ed.dom.getParent(e, function(p) {
|
| 36 |
+
return tinymce.inArray(list, p) !== -1;
|
| 37 |
+
});
|
| 38 |
+
}
|
| 39 |
+
|
| 40 |
+
function isList(e) {
|
| 41 |
+
return e && (e.tagName === 'OL' || e.tagName === 'UL');
|
| 42 |
+
}
|
| 43 |
+
|
| 44 |
+
function splitNestedLists(element, dom) {
|
| 45 |
+
var tmp, nested, wrapItem;
|
| 46 |
+
tmp = skipWhitespaceNodesBackwards(element.lastChild);
|
| 47 |
+
while (isList(tmp)) {
|
| 48 |
+
nested = tmp;
|
| 49 |
+
tmp = skipWhitespaceNodesBackwards(nested.previousSibling);
|
| 50 |
+
}
|
| 51 |
+
if (nested) {
|
| 52 |
+
wrapItem = dom.create('li', { style: 'list-style-type: none;'});
|
| 53 |
+
dom.split(element, nested);
|
| 54 |
+
dom.insertAfter(wrapItem, nested);
|
| 55 |
+
wrapItem.appendChild(nested);
|
| 56 |
+
wrapItem.appendChild(nested);
|
| 57 |
+
element = wrapItem.previousSibling;
|
| 58 |
+
}
|
| 59 |
+
return element;
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
function attemptMergeWithAdjacent(e, allowDifferentListStyles, mergeParagraphs) {
|
| 63 |
+
e = attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs);
|
| 64 |
+
return attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs);
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
function attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs) {
|
| 68 |
+
var prev = skipWhitespaceNodesBackwards(e.previousSibling);
|
| 69 |
+
if (prev) {
|
| 70 |
+
return attemptMerge(prev, e, allowDifferentListStyles ? prev : false, mergeParagraphs);
|
| 71 |
+
} else {
|
| 72 |
+
return e;
|
| 73 |
+
}
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
function attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs) {
|
| 77 |
+
var next = skipWhitespaceNodesForwards(e.nextSibling);
|
| 78 |
+
if (next) {
|
| 79 |
+
return attemptMerge(e, next, allowDifferentListStyles ? next : false, mergeParagraphs);
|
| 80 |
+
} else {
|
| 81 |
+
return e;
|
| 82 |
+
}
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
function attemptMerge(e1, e2, differentStylesMasterElement, mergeParagraphs) {
|
| 86 |
+
if (canMerge(e1, e2, !!differentStylesMasterElement, mergeParagraphs)) {
|
| 87 |
+
return merge(e1, e2, differentStylesMasterElement);
|
| 88 |
+
} else if (e1 && e1.tagName === 'LI' && isList(e2)) {
|
| 89 |
+
// Fix invalidly nested lists.
|
| 90 |
+
e1.appendChild(e2);
|
| 91 |
+
}
|
| 92 |
+
return e2;
|
| 93 |
+
}
|
| 94 |
+
|
| 95 |
+
function canMerge(e1, e2, allowDifferentListStyles, mergeParagraphs) {
|
| 96 |
+
if (!e1 || !e2) {
|
| 97 |
+
return false;
|
| 98 |
+
} else if (e1.tagName === 'LI' && e2.tagName === 'LI') {
|
| 99 |
+
return e2.style.listStyleType === 'none' || containsOnlyAList(e2);
|
| 100 |
+
} else if (isList(e1)) {
|
| 101 |
+
return (e1.tagName === e2.tagName && (allowDifferentListStyles || e1.style.listStyleType === e2.style.listStyleType)) || isListForIndent(e2);
|
| 102 |
+
} else return mergeParagraphs && e1.tagName === 'P' && e2.tagName === 'P';
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
function isListForIndent(e) {
|
| 106 |
+
var firstLI = skipWhitespaceNodesForwards(e.firstChild), lastLI = skipWhitespaceNodesBackwards(e.lastChild);
|
| 107 |
+
return firstLI && lastLI && isList(e) && firstLI === lastLI && (isList(firstLI) || firstLI.style.listStyleType === 'none' || containsOnlyAList(firstLI));
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
function containsOnlyAList(e) {
|
| 111 |
+
var firstChild = skipWhitespaceNodesForwards(e.firstChild), lastChild = skipWhitespaceNodesBackwards(e.lastChild);
|
| 112 |
+
return firstChild && lastChild && firstChild === lastChild && isList(firstChild);
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
function merge(e1, e2, masterElement) {
|
| 116 |
+
var lastOriginal = skipWhitespaceNodesBackwards(e1.lastChild), firstNew = skipWhitespaceNodesForwards(e2.firstChild);
|
| 117 |
+
if (e1.tagName === 'P') {
|
| 118 |
+
e1.appendChild(e1.ownerDocument.createElement('br'));
|
| 119 |
+
}
|
| 120 |
+
while (e2.firstChild) {
|
| 121 |
+
e1.appendChild(e2.firstChild);
|
| 122 |
+
}
|
| 123 |
+
if (masterElement) {
|
| 124 |
+
e1.style.listStyleType = masterElement.style.listStyleType;
|
| 125 |
+
}
|
| 126 |
+
e2.parentNode.removeChild(e2);
|
| 127 |
+
attemptMerge(lastOriginal, firstNew, false);
|
| 128 |
+
return e1;
|
| 129 |
+
}
|
| 130 |
+
|
| 131 |
+
function findItemToOperateOn(e, dom) {
|
| 132 |
+
var item;
|
| 133 |
+
if (!dom.is(e, 'li,ol,ul')) {
|
| 134 |
+
item = dom.getParent(e, 'li');
|
| 135 |
+
if (item) {
|
| 136 |
+
e = item;
|
| 137 |
+
}
|
| 138 |
+
}
|
| 139 |
+
return e;
|
| 140 |
+
}
|
| 141 |
+
|
| 142 |
+
tinymce.create('tinymce.plugins.Lists', {
|
| 143 |
+
init: function(ed) {
|
| 144 |
+
var LIST_TABBING = 'TABBING';
|
| 145 |
+
var LIST_EMPTY_ITEM = 'EMPTY';
|
| 146 |
+
var LIST_ESCAPE = 'ESCAPE';
|
| 147 |
+
var LIST_PARAGRAPH = 'PARAGRAPH';
|
| 148 |
+
var LIST_UNKNOWN = 'UNKNOWN';
|
| 149 |
+
var state = LIST_UNKNOWN;
|
| 150 |
+
|
| 151 |
+
function isTabInList(e) {
|
| 152 |
+
// Don't indent on Ctrl+Tab or Alt+Tab
|
| 153 |
+
return e.keyCode === tinymce.VK.TAB && !(e.altKey || e.ctrlKey) &&
|
| 154 |
+
(ed.queryCommandState('InsertUnorderedList') || ed.queryCommandState('InsertOrderedList'));
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
function isOnLastListItem() {
|
| 158 |
+
var li = getLi();
|
| 159 |
+
var grandParent = li.parentNode.parentNode;
|
| 160 |
+
var isLastItem = li.parentNode.lastChild === li;
|
| 161 |
+
return isLastItem && !isNestedList(grandParent) && isEmptyListItem(li);
|
| 162 |
+
}
|
| 163 |
+
|
| 164 |
+
function isNestedList(grandParent) {
|
| 165 |
+
if (isList(grandParent)) {
|
| 166 |
+
return grandParent.parentNode && grandParent.parentNode.tagName === 'LI';
|
| 167 |
+
} else {
|
| 168 |
+
return grandParent.tagName === 'LI';
|
| 169 |
+
}
|
| 170 |
+
}
|
| 171 |
+
|
| 172 |
+
function isInEmptyListItem() {
|
| 173 |
+
return ed.selection.isCollapsed() && isEmptyListItem(getLi());
|
| 174 |
+
}
|
| 175 |
+
|
| 176 |
+
function getLi() {
|
| 177 |
+
var n = ed.selection.getStart();
|
| 178 |
+
// Get start will return BR if the LI only contains a BR or an empty element as we use these to fix caret position
|
| 179 |
+
return ((n.tagName == 'BR' || n.tagName == '') && n.parentNode.tagName == 'LI') ? n.parentNode : n;
|
| 180 |
+
}
|
| 181 |
+
|
| 182 |
+
function isEmptyListItem(li) {
|
| 183 |
+
var numChildren = li.childNodes.length;
|
| 184 |
+
if (li.tagName === 'LI') {
|
| 185 |
+
return numChildren == 0 ? true : numChildren == 1 && (li.firstChild.tagName == '' || li.firstChild.tagName == 'BR' || isEmptyIE9Li(li));
|
| 186 |
+
}
|
| 187 |
+
return false;
|
| 188 |
+
}
|
| 189 |
+
|
| 190 |
+
function isEmptyIE9Li(li) {
|
| 191 |
+
// only consider this to be last item if there is no list item content or that content is nbsp or space since IE9 creates these
|
| 192 |
+
var lis = tinymce.grep(li.parentNode.childNodes, function(n) {return n.tagName == 'LI'});
|
| 193 |
+
var isLastLi = li == lis[lis.length - 1];
|
| 194 |
+
var child = li.firstChild;
|
| 195 |
+
return tinymce.isIE9 && isLastLi && (child.nodeValue == String.fromCharCode(160) || child.nodeValue == String.fromCharCode(32));
|
| 196 |
+
}
|
| 197 |
+
|
| 198 |
+
function isEnter(e) {
|
| 199 |
+
return e.keyCode === tinymce.VK.ENTER;
|
| 200 |
+
}
|
| 201 |
+
|
| 202 |
+
function isEnterWithoutShift(e) {
|
| 203 |
+
return isEnter(e) && !e.shiftKey;
|
| 204 |
+
}
|
| 205 |
+
|
| 206 |
+
function getListKeyState(e) {
|
| 207 |
+
if (isTabInList(e)) {
|
| 208 |
+
return LIST_TABBING;
|
| 209 |
+
} else if (isEnterWithoutShift(e) && isOnLastListItem()) {
|
| 210 |
+
// Returns LIST_UNKNOWN since breaking out of lists is handled by the EnterKey.js logic now
|
| 211 |
+
//return LIST_ESCAPE;
|
| 212 |
+
return LIST_UNKNOWN;
|
| 213 |
+
} else if (isEnterWithoutShift(e) && isInEmptyListItem()) {
|
| 214 |
+
return LIST_EMPTY_ITEM;
|
| 215 |
+
} else {
|
| 216 |
+
return LIST_UNKNOWN;
|
| 217 |
+
}
|
| 218 |
+
}
|
| 219 |
+
|
| 220 |
+
function cancelDefaultEvents(ed, e) {
|
| 221 |
+
// list escape is done manually using outdent as it does not create paragraphs correctly in td's
|
| 222 |
+
if (state == LIST_TABBING || state == LIST_EMPTY_ITEM || tinymce.isGecko && state == LIST_ESCAPE) {
|
| 223 |
+
Event.cancel(e);
|
| 224 |
+
}
|
| 225 |
+
}
|
| 226 |
+
|
| 227 |
+
function isCursorAtEndOfContainer() {
|
| 228 |
+
var range = ed.selection.getRng(true);
|
| 229 |
+
var startContainer = range.startContainer;
|
| 230 |
+
if (startContainer.nodeType == 3) {
|
| 231 |
+
var value = startContainer.nodeValue;
|
| 232 |
+
if (tinymce.isIE9 && value.length > 1 && value.charCodeAt(value.length-1) == 32) {
|
| 233 |
+
// IE9 places a space on the end of the text in some cases so ignore last char
|
| 234 |
+
return (range.endOffset == value.length-1);
|
| 235 |
+
} else {
|
| 236 |
+
return (range.endOffset == value.length);
|
| 237 |
+
}
|
| 238 |
+
} else if (startContainer.nodeType == 1) {
|
| 239 |
+
return range.endOffset == startContainer.childNodes.length;
|
| 240 |
+
}
|
| 241 |
+
return false;
|
| 242 |
+
}
|
| 243 |
+
|
| 244 |
+
/*
|
| 245 |
+
If we are at the end of a list item surrounded with an element, pressing enter should create a
|
| 246 |
+
new list item instead without splitting the element e.g. don't want to create new P or H1 tag
|
| 247 |
+
*/
|
| 248 |
+
function isEndOfListItem() {
|
| 249 |
+
var node = ed.selection.getNode();
|
| 250 |
+
var validElements = 'h1,h2,h3,h4,h5,h6,p,div';
|
| 251 |
+
var isLastParagraphOfLi = ed.dom.is(node, validElements) && node.parentNode.tagName === 'LI' && node.parentNode.lastChild === node;
|
| 252 |
+
return ed.selection.isCollapsed() && isLastParagraphOfLi && isCursorAtEndOfContainer();
|
| 253 |
+
}
|
| 254 |
+
|
| 255 |
+
// Creates a new list item after the current selection's list item parent
|
| 256 |
+
function createNewLi(ed, e) {
|
| 257 |
+
if (isEnterWithoutShift(e) && isEndOfListItem()) {
|
| 258 |
+
var node = ed.selection.getNode();
|
| 259 |
+
var li = ed.dom.create("li");
|
| 260 |
+
var parentLi = ed.dom.getParent(node, 'li');
|
| 261 |
+
ed.dom.insertAfter(li, parentLi);
|
| 262 |
+
|
| 263 |
+
// Move caret to new list element.
|
| 264 |
+
if (tinymce.isIE6 || tinymce.isIE7 || tinyMCE.isIE8) {
|
| 265 |
+
// Removed this line since it would create an odd < > tag and placing the caret inside an empty LI is handled and should be handled by the selection logic
|
| 266 |
+
//li.appendChild(ed.dom.create(" ")); // IE needs an element within the bullet point
|
| 267 |
+
ed.selection.setCursorLocation(li, 1);
|
| 268 |
+
} else {
|
| 269 |
+
ed.selection.setCursorLocation(li, 0);
|
| 270 |
+
}
|
| 271 |
+
e.preventDefault();
|
| 272 |
+
}
|
| 273 |
+
}
|
| 274 |
+
|
| 275 |
+
function imageJoiningListItem(ed, e) {
|
| 276 |
+
var prevSibling;
|
| 277 |
+
|
| 278 |
+
if (!tinymce.isGecko)
|
| 279 |
+
return;
|
| 280 |
+
|
| 281 |
+
var n = ed.selection.getStart();
|
| 282 |
+
if (e.keyCode != tinymce.VK.BACKSPACE || n.tagName !== 'IMG')
|
| 283 |
+
return;
|
| 284 |
+
|
| 285 |
+
function lastLI(node) {
|
| 286 |
+
var child = node.firstChild;
|
| 287 |
+
var li = null;
|
| 288 |
+
do {
|
| 289 |
+
if (!child)
|
| 290 |
+
break;
|
| 291 |
+
|
| 292 |
+
if (child.tagName === 'LI')
|
| 293 |
+
li = child;
|
| 294 |
+
} while (child = child.nextSibling);
|
| 295 |
+
|
| 296 |
+
return li;
|
| 297 |
+
}
|
| 298 |
+
|
| 299 |
+
function addChildren(parentNode, destination) {
|
| 300 |
+
while (parentNode.childNodes.length > 0)
|
| 301 |
+
destination.appendChild(parentNode.childNodes[0]);
|
| 302 |
+
}
|
| 303 |
+
|
| 304 |
+
// Check if there is a previous sibling
|
| 305 |
+
prevSibling = n.parentNode.previousSibling;
|
| 306 |
+
if (!prevSibling)
|
| 307 |
+
return;
|
| 308 |
+
|
| 309 |
+
var ul;
|
| 310 |
+
if (prevSibling.tagName === 'UL' || prevSibling.tagName === 'OL')
|
| 311 |
+
ul = prevSibling;
|
| 312 |
+
else if (prevSibling.previousSibling && (prevSibling.previousSibling.tagName === 'UL' || prevSibling.previousSibling.tagName === 'OL'))
|
| 313 |
+
ul = prevSibling.previousSibling;
|
| 314 |
+
else
|
| 315 |
+
return;
|
| 316 |
+
|
| 317 |
+
var li = lastLI(ul);
|
| 318 |
+
|
| 319 |
+
// move the caret to the end of the list item
|
| 320 |
+
var rng = ed.dom.createRng();
|
| 321 |
+
rng.setStart(li, 1);
|
| 322 |
+
rng.setEnd(li, 1);
|
| 323 |
+
ed.selection.setRng(rng);
|
| 324 |
+
ed.selection.collapse(true);
|
| 325 |
+
|
| 326 |
+
// save a bookmark at the end of the list item
|
| 327 |
+
var bookmark = ed.selection.getBookmark();
|
| 328 |
+
|
| 329 |
+
// copy the image an its text to the list item
|
| 330 |
+
var clone = n.parentNode.cloneNode(true);
|
| 331 |
+
if (clone.tagName === 'P' || clone.tagName === 'DIV')
|
| 332 |
+
addChildren(clone, li);
|
| 333 |
+
else
|
| 334 |
+
li.appendChild(clone);
|
| 335 |
+
|
| 336 |
+
// remove the old copy of the image
|
| 337 |
+
n.parentNode.parentNode.removeChild(n.parentNode);
|
| 338 |
+
|
| 339 |
+
// move the caret where we saved the bookmark
|
| 340 |
+
ed.selection.moveToBookmark(bookmark);
|
| 341 |
+
}
|
| 342 |
+
|
| 343 |
+
// fix the cursor position to ensure it is correct in IE
|
| 344 |
+
function setCursorPositionToOriginalLi(li) {
|
| 345 |
+
var list = ed.dom.getParent(li, 'ol,ul');
|
| 346 |
+
if (list != null) {
|
| 347 |
+
var lastLi = list.lastChild;
|
| 348 |
+
// Removed this line since IE9 would report an DOM character error and placing the caret inside an empty LI is handled and should be handled by the selection logic
|
| 349 |
+
//lastLi.appendChild(ed.getDoc().createElement(''));
|
| 350 |
+
ed.selection.setCursorLocation(lastLi, 0);
|
| 351 |
+
}
|
| 352 |
+
}
|
| 353 |
+
|
| 354 |
+
this.ed = ed;
|
| 355 |
+
ed.addCommand('Indent', this.indent, this);
|
| 356 |
+
ed.addCommand('Outdent', this.outdent, this);
|
| 357 |
+
ed.addCommand('InsertUnorderedList', function() {
|
| 358 |
+
this.applyList('UL', 'OL');
|
| 359 |
+
}, this);
|
| 360 |
+
ed.addCommand('InsertOrderedList', function() {
|
| 361 |
+
this.applyList('OL', 'UL');
|
| 362 |
+
}, this);
|
| 363 |
+
|
| 364 |
+
ed.onInit.add(function() {
|
| 365 |
+
ed.editorCommands.addCommands({
|
| 366 |
+
'outdent': function() {
|
| 367 |
+
var sel = ed.selection, dom = ed.dom;
|
| 368 |
+
|
| 369 |
+
function hasStyleIndent(n) {
|
| 370 |
+
n = dom.getParent(n, dom.isBlock);
|
| 371 |
+
return n && (parseInt(ed.dom.getStyle(n, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(n, 'padding-left') || 0, 10)) > 0;
|
| 372 |
+
}
|
| 373 |
+
|
| 374 |
+
return hasStyleIndent(sel.getStart()) || hasStyleIndent(sel.getEnd()) || ed.queryCommandState('InsertOrderedList') || ed.queryCommandState('InsertUnorderedList');
|
| 375 |
+
}
|
| 376 |
+
}, 'state');
|
| 377 |
+
});
|
| 378 |
+
|
| 379 |
+
ed.onKeyUp.add(function(ed, e) {
|
| 380 |
+
if (state == LIST_TABBING) {
|
| 381 |
+
ed.execCommand(e.shiftKey ? 'Outdent' : 'Indent', true, null);
|
| 382 |
+
state = LIST_UNKNOWN;
|
| 383 |
+
return Event.cancel(e);
|
| 384 |
+
} else if (state == LIST_EMPTY_ITEM) {
|
| 385 |
+
var li = getLi();
|
| 386 |
+
var shouldOutdent = ed.settings.list_outdent_on_enter === true || e.shiftKey;
|
| 387 |
+
ed.execCommand(shouldOutdent ? 'Outdent' : 'Indent', true, null);
|
| 388 |
+
if (tinymce.isIE) {
|
| 389 |
+
setCursorPositionToOriginalLi(li);
|
| 390 |
+
}
|
| 391 |
+
|
| 392 |
+
return Event.cancel(e);
|
| 393 |
+
} else if (state == LIST_ESCAPE) {
|
| 394 |
+
if (tinymce.isIE6 || tinymce.isIE7 || tinymce.isIE8) {
|
| 395 |
+
// append a zero sized nbsp so that caret is positioned correctly in IE after escaping and applying formatting.
|
| 396 |
+
// if there is no text then applying formatting for e.g a H1 to the P tag immediately following list after
|
| 397 |
+
// escaping from it will cause the caret to be positioned on the last li instead of staying the in P tag.
|
| 398 |
+
var n = ed.getDoc().createTextNode('\uFEFF');
|
| 399 |
+
ed.selection.getNode().appendChild(n);
|
| 400 |
+
} else if (tinymce.isIE9 || tinymce.isGecko) {
|
| 401 |
+
// IE9 does not escape the list so we use outdent to do this and cancel the default behaviour
|
| 402 |
+
// Gecko does not create a paragraph outdenting inside a TD so default behaviour is cancelled and we outdent ourselves
|
| 403 |
+
ed.execCommand('Outdent');
|
| 404 |
+
return Event.cancel(e);
|
| 405 |
+
}
|
| 406 |
+
}
|
| 407 |
+
});
|
| 408 |
+
|
| 409 |
+
function fixListItem(parent, reference) {
|
| 410 |
+
// a zero-sized non-breaking space is placed in the empty list item so that the nested list is
|
| 411 |
+
// displayed on the below line instead of next to it
|
| 412 |
+
var n = ed.getDoc().createTextNode('\uFEFF');
|
| 413 |
+
parent.insertBefore(n, reference);
|
| 414 |
+
ed.selection.setCursorLocation(n, 0);
|
| 415 |
+
// repaint to remove rendering artifact. only visible when creating new list
|
| 416 |
+
ed.execCommand('mceRepaint');
|
| 417 |
+
}
|
| 418 |
+
|
| 419 |
+
function fixIndentedListItemForGecko(ed, e) {
|
| 420 |
+
if (isEnter(e)) {
|
| 421 |
+
var li = getLi();
|
| 422 |
+
if (li) {
|
| 423 |
+
var parent = li.parentNode;
|
| 424 |
+
var grandParent = parent && parent.parentNode;
|
| 425 |
+
if (grandParent && grandParent.nodeName == 'LI' && grandParent.firstChild == parent && li == parent.firstChild) {
|
| 426 |
+
fixListItem(grandParent, parent);
|
| 427 |
+
}
|
| 428 |
+
}
|
| 429 |
+
}
|
| 430 |
+
}
|
| 431 |
+
|
| 432 |
+
function fixIndentedListItemForIE8(ed, e) {
|
| 433 |
+
if (isEnter(e)) {
|
| 434 |
+
var li = getLi();
|
| 435 |
+
if (ed.dom.select('ul li', li).length === 1) {
|
| 436 |
+
var list = li.firstChild;
|
| 437 |
+
fixListItem(li, list);
|
| 438 |
+
}
|
| 439 |
+
}
|
| 440 |
+
}
|
| 441 |
+
|
| 442 |
+
function fixDeletingFirstCharOfList(ed, e) {
|
| 443 |
+
function listElements(li) {
|
| 444 |
+
var elements = [];
|
| 445 |
+
var walker = new tinymce.dom.TreeWalker(li.firstChild, li);
|
| 446 |
+
for (var node = walker.current(); node; node = walker.next()) {
|
| 447 |
+
if (ed.dom.is(node, 'ol,ul,li')) {
|
| 448 |
+
elements.push(node);
|
| 449 |
+
}
|
| 450 |
+
}
|
| 451 |
+
return elements;
|
| 452 |
+
}
|
| 453 |
+
|
| 454 |
+
if (e.keyCode == tinymce.VK.BACKSPACE) {
|
| 455 |
+
var li = getLi();
|
| 456 |
+
if (li) {
|
| 457 |
+
var list = ed.dom.getParent(li, 'ol,ul'),
|
| 458 |
+
rng = ed.selection.getRng();
|
| 459 |
+
if (list && list.firstChild === li && rng.startOffset == 0) {
|
| 460 |
+
var elements = listElements(li);
|
| 461 |
+
elements.unshift(li);
|
| 462 |
+
ed.execCommand("Outdent", false, elements);
|
| 463 |
+
ed.undoManager.add();
|
| 464 |
+
return Event.cancel(e);
|
| 465 |
+
}
|
| 466 |
+
}
|
| 467 |
+
}
|
| 468 |
+
}
|
| 469 |
+
|
| 470 |
+
function fixDeletingEmptyLiInWebkit(ed, e) {
|
| 471 |
+
var li = getLi();
|
| 472 |
+
if (e.keyCode === tinymce.VK.BACKSPACE && ed.dom.is(li, 'li') && li.parentNode.firstChild!==li) {
|
| 473 |
+
if (ed.dom.select('ul,ol', li).length === 1) {
|
| 474 |
+
var prevLi = li.previousSibling;
|
| 475 |
+
ed.dom.remove(ed.dom.select('br', li));
|
| 476 |
+
ed.dom.remove(li, true);
|
| 477 |
+
var textNodes = tinymce.grep(prevLi.childNodes, function(n){ return n.nodeType === 3 });
|
| 478 |
+
if (textNodes.length === 1) {
|
| 479 |
+
var textNode = textNodes[0];
|
| 480 |
+
ed.selection.setCursorLocation(textNode, textNode.length);
|
| 481 |
+
}
|
| 482 |
+
ed.undoManager.add();
|
| 483 |
+
return Event.cancel(e);
|
| 484 |
+
}
|
| 485 |
+
}
|
| 486 |
+
}
|
| 487 |
+
|
| 488 |
+
ed.onKeyDown.add(function(_, e) { state = getListKeyState(e); });
|
| 489 |
+
ed.onKeyDown.add(cancelDefaultEvents);
|
| 490 |
+
ed.onKeyDown.add(imageJoiningListItem);
|
| 491 |
+
ed.onKeyDown.add(createNewLi);
|
| 492 |
+
|
| 493 |
+
if (tinymce.isGecko) {
|
| 494 |
+
ed.onKeyUp.add(fixIndentedListItemForGecko);
|
| 495 |
+
}
|
| 496 |
+
if (tinymce.isIE8) {
|
| 497 |
+
ed.onKeyUp.add(fixIndentedListItemForIE8);
|
| 498 |
+
}
|
| 499 |
+
if (tinymce.isGecko || tinymce.isWebKit) {
|
| 500 |
+
ed.onKeyDown.add(fixDeletingFirstCharOfList);
|
| 501 |
+
}
|
| 502 |
+
if (tinymce.isWebKit) {
|
| 503 |
+
ed.onKeyDown.add(fixDeletingEmptyLiInWebkit);
|
| 504 |
+
}
|
| 505 |
+
},
|
| 506 |
+
|
| 507 |
+
applyList: function(targetListType, oppositeListType) {
|
| 508 |
+
var t = this, ed = t.ed, dom = ed.dom, applied = [], hasSameType = false, hasOppositeType = false, hasNonList = false, actions,
|
| 509 |
+
selectedBlocks = ed.selection.getSelectedBlocks();
|
| 510 |
+
|
| 511 |
+
function cleanupBr(e) {
|
| 512 |
+
if (e && e.tagName === 'BR') {
|
| 513 |
+
dom.remove(e);
|
| 514 |
+
}
|
| 515 |
+
}
|
| 516 |
+
|
| 517 |
+
function makeList(element) {
|
| 518 |
+
var list = dom.create(targetListType), li;
|
| 519 |
+
|
| 520 |
+
function adjustIndentForNewList(element) {
|
| 521 |
+
// If there's a margin-left, outdent one level to account for the extra list margin.
|
| 522 |
+
if (element.style.marginLeft || element.style.paddingLeft) {
|
| 523 |
+
t.adjustPaddingFunction(false)(element);
|
| 524 |
+
}
|
| 525 |
+
}
|
| 526 |
+
|
| 527 |
+
if (element.tagName === 'LI') {
|
| 528 |
+
// No change required.
|
| 529 |
+
} else if (element.tagName === 'P' || element.tagName === 'DIV' || element.tagName === 'BODY') {
|
| 530 |
+
processBrs(element, function(startSection, br) {
|
| 531 |
+
doWrapList(startSection, br, element.tagName === 'BODY' ? null : startSection.parentNode);
|
| 532 |
+
li = startSection.parentNode;
|
| 533 |
+
adjustIndentForNewList(li);
|
| 534 |
+
cleanupBr(br);
|
| 535 |
+
});
|
| 536 |
+
if (li) {
|
| 537 |
+
if (li.tagName === 'LI' && (element.tagName === 'P' || selectedBlocks.length > 1)) {
|
| 538 |
+
dom.split(li.parentNode.parentNode, li.parentNode);
|
| 539 |
+
}
|
| 540 |
+
attemptMergeWithAdjacent(li.parentNode, true);
|
| 541 |
+
}
|
| 542 |
+
return;
|
| 543 |
+
} else {
|
| 544 |
+
// Put the list around the element.
|
| 545 |
+
li = dom.create('li');
|
| 546 |
+
dom.insertAfter(li, element);
|
| 547 |
+
li.appendChild(element);
|
| 548 |
+
adjustIndentForNewList(element);
|
| 549 |
+
element = li;
|
| 550 |
+
}
|
| 551 |
+
dom.insertAfter(list, element);
|
| 552 |
+
list.appendChild(element);
|
| 553 |
+
attemptMergeWithAdjacent(list, true);
|
| 554 |
+
applied.push(element);
|
| 555 |
+
}
|
| 556 |
+
|
| 557 |
+
function doWrapList(start, end, template) {
|
| 558 |
+
var li, n = start, tmp;
|
| 559 |
+
while (!dom.isBlock(start.parentNode) && start.parentNode !== dom.getRoot()) {
|
| 560 |
+
start = dom.split(start.parentNode, start.previousSibling);
|
| 561 |
+
start = start.nextSibling;
|
| 562 |
+
n = start;
|
| 563 |
+
}
|
| 564 |
+
if (template) {
|
| 565 |
+
li = template.cloneNode(true);
|
| 566 |
+
start.parentNode.insertBefore(li, start);
|
| 567 |
+
while (li.firstChild) dom.remove(li.firstChild);
|
| 568 |
+
li = dom.rename(li, 'li');
|
| 569 |
+
} else {
|
| 570 |
+
li = dom.create('li');
|
| 571 |
+
start.parentNode.insertBefore(li, start);
|
| 572 |
+
}
|
| 573 |
+
while (n && n != end) {
|
| 574 |
+
tmp = n.nextSibling;
|
| 575 |
+
li.appendChild(n);
|
| 576 |
+
n = tmp;
|
| 577 |
+
}
|
| 578 |
+
if (li.childNodes.length === 0) {
|
| 579 |
+
li.innerHTML = '<br _mce_bogus="1" />';
|
| 580 |
+
}
|
| 581 |
+
makeList(li);
|
| 582 |
+
}
|
| 583 |
+
|
| 584 |
+
function processBrs(element, callback) {
|
| 585 |
+
var startSection, previousBR, END_TO_START = 3, START_TO_END = 1,
|
| 586 |
+
breakElements = 'br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl';
|
| 587 |
+
|
| 588 |
+
function isAnyPartSelected(start, end) {
|
| 589 |
+
var r = dom.createRng(), sel;
|
| 590 |
+
bookmark.keep = true;
|
| 591 |
+
ed.selection.moveToBookmark(bookmark);
|
| 592 |
+
bookmark.keep = false;
|
| 593 |
+
sel = ed.selection.getRng(true);
|
| 594 |
+
if (!end) {
|
| 595 |
+
end = start.parentNode.lastChild;
|
| 596 |
+
}
|
| 597 |
+
r.setStartBefore(start);
|
| 598 |
+
r.setEndAfter(end);
|
| 599 |
+
return !(r.compareBoundaryPoints(END_TO_START, sel) > 0 || r.compareBoundaryPoints(START_TO_END, sel) <= 0);
|
| 600 |
+
}
|
| 601 |
+
|
| 602 |
+
function nextLeaf(br) {
|
| 603 |
+
if (br.nextSibling)
|
| 604 |
+
return br.nextSibling;
|
| 605 |
+
if (!dom.isBlock(br.parentNode) && br.parentNode !== dom.getRoot())
|
| 606 |
+
return nextLeaf(br.parentNode);
|
| 607 |
+
}
|
| 608 |
+
|
| 609 |
+
// Split on BRs within the range and process those.
|
| 610 |
+
startSection = element.firstChild;
|
| 611 |
+
// First mark the BRs that have any part of the previous section selected.
|
| 612 |
+
var trailingContentSelected = false;
|
| 613 |
+
each(dom.select(breakElements, element), function(br) {
|
| 614 |
+
if (br.hasAttribute && br.hasAttribute('_mce_bogus')) {
|
| 615 |
+
return true; // Skip the bogus Brs that are put in to appease Firefox and Safari.
|
| 616 |
+
}
|
| 617 |
+
if (isAnyPartSelected(startSection, br)) {
|
| 618 |
+
dom.addClass(br, '_mce_tagged_br');
|
| 619 |
+
startSection = nextLeaf(br);
|
| 620 |
+
}
|
| 621 |
+
});
|
| 622 |
+
trailingContentSelected = (startSection && isAnyPartSelected(startSection, undefined));
|
| 623 |
+
startSection = element.firstChild;
|
| 624 |
+
each(dom.select(breakElements, element), function(br) {
|
| 625 |
+
// Got a section from start to br.
|
| 626 |
+
var tmp = nextLeaf(br);
|
| 627 |
+
if (br.hasAttribute && br.hasAttribute('_mce_bogus')) {
|
| 628 |
+
return true; // Skip the bogus Brs that are put in to appease Firefox and Safari.
|
| 629 |
+
}
|
| 630 |
+
if (dom.hasClass(br, '_mce_tagged_br')) {
|
| 631 |
+
callback(startSection, br, previousBR);
|
| 632 |
+
previousBR = null;
|
| 633 |
+
} else {
|
| 634 |
+
previousBR = br;
|
| 635 |
+
}
|
| 636 |
+
startSection = tmp;
|
| 637 |
+
});
|
| 638 |
+
if (trailingContentSelected) {
|
| 639 |
+
callback(startSection, undefined, previousBR);
|
| 640 |
+
}
|
| 641 |
+
}
|
| 642 |
+
|
| 643 |
+
function wrapList(element) {
|
| 644 |
+
processBrs(element, function(startSection, br, previousBR) {
|
| 645 |
+
// Need to indent this part
|
| 646 |
+
doWrapList(startSection, br);
|
| 647 |
+
cleanupBr(br);
|
| 648 |
+
cleanupBr(previousBR);
|
| 649 |
+
});
|
| 650 |
+
}
|
| 651 |
+
|
| 652 |
+
function changeList(element) {
|
| 653 |
+
if (tinymce.inArray(applied, element) !== -1) {
|
| 654 |
+
return;
|
| 655 |
+
}
|
| 656 |
+
if (element.parentNode.tagName === oppositeListType) {
|
| 657 |
+
dom.split(element.parentNode, element);
|
| 658 |
+
makeList(element);
|
| 659 |
+
attemptMergeWithNext(element.parentNode, false);
|
| 660 |
+
}
|
| 661 |
+
applied.push(element);
|
| 662 |
+
}
|
| 663 |
+
|
| 664 |
+
function convertListItemToParagraph(element) {
|
| 665 |
+
var child, nextChild, mergedElement, splitLast;
|
| 666 |
+
if (tinymce.inArray(applied, element) !== -1) {
|
| 667 |
+
return;
|
| 668 |
+
}
|
| 669 |
+
element = splitNestedLists(element, dom);
|
| 670 |
+
while (dom.is(element.parentNode, 'ol,ul,li')) {
|
| 671 |
+
dom.split(element.parentNode, element);
|
| 672 |
+
}
|
| 673 |
+
// Push the original element we have from the selection, not the renamed one.
|
| 674 |
+
applied.push(element);
|
| 675 |
+
element = dom.rename(element, 'p');
|
| 676 |
+
mergedElement = attemptMergeWithAdjacent(element, false, ed.settings.force_br_newlines);
|
| 677 |
+
if (mergedElement === element) {
|
| 678 |
+
// Now split out any block elements that can't be contained within a P.
|
| 679 |
+
// Manually iterate to ensure we handle modifications correctly (doesn't work with tinymce.each)
|
| 680 |
+
child = element.firstChild;
|
| 681 |
+
while (child) {
|
| 682 |
+
if (dom.isBlock(child)) {
|
| 683 |
+
child = dom.split(child.parentNode, child);
|
| 684 |
+
splitLast = true;
|
| 685 |
+
nextChild = child.nextSibling && child.nextSibling.firstChild;
|
| 686 |
+
} else {
|
| 687 |
+
nextChild = child.nextSibling;
|
| 688 |
+
if (splitLast && child.tagName === 'BR') {
|
| 689 |
+
dom.remove(child);
|
| 690 |
+
}
|
| 691 |
+
splitLast = false;
|
| 692 |
+
}
|
| 693 |
+
child = nextChild;
|
| 694 |
+
}
|
| 695 |
+
}
|
| 696 |
+
}
|
| 697 |
+
|
| 698 |
+
each(selectedBlocks, function(e) {
|
| 699 |
+
e = findItemToOperateOn(e, dom);
|
| 700 |
+
if (e.tagName === oppositeListType || (e.tagName === 'LI' && e.parentNode.tagName === oppositeListType)) {
|
| 701 |
+
hasOppositeType = true;
|
| 702 |
+
} else if (e.tagName === targetListType || (e.tagName === 'LI' && e.parentNode.tagName === targetListType)) {
|
| 703 |
+
hasSameType = true;
|
| 704 |
+
} else {
|
| 705 |
+
hasNonList = true;
|
| 706 |
+
}
|
| 707 |
+
});
|
| 708 |
+
|
| 709 |
+
if (hasNonList &&!hasSameType || hasOppositeType || selectedBlocks.length === 0) {
|
| 710 |
+
actions = {
|
| 711 |
+
'LI': changeList,
|
| 712 |
+
'H1': makeList,
|
| 713 |
+
'H2': makeList,
|
| 714 |
+
'H3': makeList,
|
| 715 |
+
'H4': makeList,
|
| 716 |
+
'H5': makeList,
|
| 717 |
+
'H6': makeList,
|
| 718 |
+
'P': makeList,
|
| 719 |
+
'BODY': makeList,
|
| 720 |
+
'DIV': selectedBlocks.length > 1 ? makeList : wrapList,
|
| 721 |
+
defaultAction: wrapList,
|
| 722 |
+
elements: this.selectedBlocks()
|
| 723 |
+
};
|
| 724 |
+
} else {
|
| 725 |
+
actions = {
|
| 726 |
+
defaultAction: convertListItemToParagraph,
|
| 727 |
+
elements: this.selectedBlocks(),
|
| 728 |
+
processEvenIfEmpty: true
|
| 729 |
+
};
|
| 730 |
+
}
|
| 731 |
+
this.process(actions);
|
| 732 |
+
},
|
| 733 |
+
|
| 734 |
+
indent: function() {
|
| 735 |
+
var ed = this.ed, dom = ed.dom, indented = [];
|
| 736 |
+
|
| 737 |
+
function createWrapItem(element) {
|
| 738 |
+
var wrapItem = dom.create('li', { style: 'list-style-type: none;'});
|
| 739 |
+
dom.insertAfter(wrapItem, element);
|
| 740 |
+
return wrapItem;
|
| 741 |
+
}
|
| 742 |
+
|
| 743 |
+
function createWrapList(element) {
|
| 744 |
+
var wrapItem = createWrapItem(element),
|
| 745 |
+
list = dom.getParent(element, 'ol,ul'),
|
| 746 |
+
listType = list.tagName,
|
| 747 |
+
listStyle = dom.getStyle(list, 'list-style-type'),
|
| 748 |
+
attrs = {},
|
| 749 |
+
wrapList;
|
| 750 |
+
if (listStyle !== '') {
|
| 751 |
+
attrs.style = 'list-style-type: ' + listStyle + ';';
|
| 752 |
+
}
|
| 753 |
+
wrapList = dom.create(listType, attrs);
|
| 754 |
+
wrapItem.appendChild(wrapList);
|
| 755 |
+
return wrapList;
|
| 756 |
+
}
|
| 757 |
+
|
| 758 |
+
function indentLI(element) {
|
| 759 |
+
if (!hasParentInList(ed, element, indented)) {
|
| 760 |
+
element = splitNestedLists(element, dom);
|
| 761 |
+
var wrapList = createWrapList(element);
|
| 762 |
+
wrapList.appendChild(element);
|
| 763 |
+
attemptMergeWithAdjacent(wrapList.parentNode, false);
|
| 764 |
+
attemptMergeWithAdjacent(wrapList, false);
|
| 765 |
+
indented.push(element);
|
| 766 |
+
}
|
| 767 |
+
}
|
| 768 |
+
|
| 769 |
+
this.process({
|
| 770 |
+
'LI': indentLI,
|
| 771 |
+
defaultAction: this.adjustPaddingFunction(true),
|
| 772 |
+
elements: this.selectedBlocks()
|
| 773 |
+
});
|
| 774 |
+
|
| 775 |
+
},
|
| 776 |
+
|
| 777 |
+
outdent: function(ui, elements) {
|
| 778 |
+
var t = this, ed = t.ed, dom = ed.dom, outdented = [];
|
| 779 |
+
|
| 780 |
+
function outdentLI(element) {
|
| 781 |
+
var listElement, targetParent, align;
|
| 782 |
+
if (!hasParentInList(ed, element, outdented)) {
|
| 783 |
+
if (dom.getStyle(element, 'margin-left') !== '' || dom.getStyle(element, 'padding-left') !== '') {
|
| 784 |
+
return t.adjustPaddingFunction(false)(element);
|
| 785 |
+
}
|
| 786 |
+
align = dom.getStyle(element, 'text-align', true);
|
| 787 |
+
if (align === 'center' || align === 'right') {
|
| 788 |
+
dom.setStyle(element, 'text-align', 'left');
|
| 789 |
+
return;
|
| 790 |
+
}
|
| 791 |
+
element = splitNestedLists(element, dom);
|
| 792 |
+
listElement = element.parentNode;
|
| 793 |
+
targetParent = element.parentNode.parentNode;
|
| 794 |
+
if (targetParent.tagName === 'P') {
|
| 795 |
+
dom.split(targetParent, element.parentNode);
|
| 796 |
+
} else {
|
| 797 |
+
dom.split(listElement, element);
|
| 798 |
+
if (targetParent.tagName === 'LI') {
|
| 799 |
+
// Nested list, need to split the LI and go back out to the OL/UL element.
|
| 800 |
+
dom.split(targetParent, element);
|
| 801 |
+
} else if (!dom.is(targetParent, 'ol,ul')) {
|
| 802 |
+
dom.rename(element, 'p');
|
| 803 |
+
}
|
| 804 |
+
}
|
| 805 |
+
outdented.push(element);
|
| 806 |
+
}
|
| 807 |
+
}
|
| 808 |
+
|
| 809 |
+
var listElements = elements && tinymce.is(elements, 'array') ? elements : this.selectedBlocks();
|
| 810 |
+
this.process({
|
| 811 |
+
'LI': outdentLI,
|
| 812 |
+
defaultAction: this.adjustPaddingFunction(false),
|
| 813 |
+
elements: listElements
|
| 814 |
+
});
|
| 815 |
+
|
| 816 |
+
each(outdented, attemptMergeWithAdjacent);
|
| 817 |
+
},
|
| 818 |
+
|
| 819 |
+
process: function(actions) {
|
| 820 |
+
var t = this, sel = t.ed.selection, dom = t.ed.dom, selectedBlocks, r;
|
| 821 |
+
|
| 822 |
+
function isEmptyElement(element) {
|
| 823 |
+
var excludeBrsAndBookmarks = tinymce.grep(element.childNodes, function(n) {
|
| 824 |
+
return !(n.nodeName === 'BR' || n.nodeName === 'SPAN' && dom.getAttrib(n, 'data-mce-type') == 'bookmark'
|
| 825 |
+
|| n.nodeType == 3 && (n.nodeValue == String.fromCharCode(160) || n.nodeValue == ''));
|
| 826 |
+
});
|
| 827 |
+
return excludeBrsAndBookmarks.length === 0;
|
| 828 |
+
}
|
| 829 |
+
|
| 830 |
+
function processElement(element) {
|
| 831 |
+
dom.removeClass(element, '_mce_act_on');
|
| 832 |
+
if (!element || element.nodeType !== 1 || ! actions.processEvenIfEmpty && selectedBlocks.length > 1 && isEmptyElement(element)) {
|
| 833 |
+
return;
|
| 834 |
+
}
|
| 835 |
+
element = findItemToOperateOn(element, dom);
|
| 836 |
+
var action = actions[element.tagName];
|
| 837 |
+
if (!action) {
|
| 838 |
+
action = actions.defaultAction;
|
| 839 |
+
}
|
| 840 |
+
action(element);
|
| 841 |
+
}
|
| 842 |
+
|
| 843 |
+
function recurse(element) {
|
| 844 |
+
t.splitSafeEach(element.childNodes, processElement, true);
|
| 845 |
+
}
|
| 846 |
+
|
| 847 |
+
function brAtEdgeOfSelection(container, offset) {
|
| 848 |
+
return offset >= 0 && container.hasChildNodes() && offset < container.childNodes.length &&
|
| 849 |
+
container.childNodes[offset].tagName === 'BR';
|
| 850 |
+
}
|
| 851 |
+
|
| 852 |
+
function isInTable() {
|
| 853 |
+
var n = sel.getNode();
|
| 854 |
+
var p = dom.getParent(n, 'td');
|
| 855 |
+
return p !== null;
|
| 856 |
+
}
|
| 857 |
+
|
| 858 |
+
selectedBlocks = actions.elements;
|
| 859 |
+
|
| 860 |
+
r = sel.getRng(true);
|
| 861 |
+
if (!r.collapsed) {
|
| 862 |
+
if (brAtEdgeOfSelection(r.endContainer, r.endOffset - 1)) {
|
| 863 |
+
r.setEnd(r.endContainer, r.endOffset - 1);
|
| 864 |
+
sel.setRng(r);
|
| 865 |
+
}
|
| 866 |
+
if (brAtEdgeOfSelection(r.startContainer, r.startOffset)) {
|
| 867 |
+
r.setStart(r.startContainer, r.startOffset + 1);
|
| 868 |
+
sel.setRng(r);
|
| 869 |
+
}
|
| 870 |
+
}
|
| 871 |
+
|
| 872 |
+
|
| 873 |
+
if (tinymce.isIE8) {
|
| 874 |
+
// append a zero sized nbsp so that caret is restored correctly using bookmark
|
| 875 |
+
var s = t.ed.selection.getNode();
|
| 876 |
+
if (s.tagName === 'LI' && !(s.parentNode.lastChild === s)) {
|
| 877 |
+
var i = t.ed.getDoc().createTextNode('\uFEFF');
|
| 878 |
+
s.appendChild(i);
|
| 879 |
+
}
|
| 880 |
+
}
|
| 881 |
+
|
| 882 |
+
bookmark = sel.getBookmark();
|
| 883 |
+
actions.OL = actions.UL = recurse;
|
| 884 |
+
t.splitSafeEach(selectedBlocks, processElement);
|
| 885 |
+
sel.moveToBookmark(bookmark);
|
| 886 |
+
bookmark = null;
|
| 887 |
+
|
| 888 |
+
// we avoid doing repaint in a table as this will move the caret out of the table in Firefox 3.6
|
| 889 |
+
if (!isInTable()) {
|
| 890 |
+
// Avoids table or image handles being left behind in Firefox.
|
| 891 |
+
t.ed.execCommand('mceRepaint');
|
| 892 |
+
}
|
| 893 |
+
},
|
| 894 |
+
|
| 895 |
+
splitSafeEach: function(elements, f, forceClassBase) {
|
| 896 |
+
if (forceClassBase ||
|
| 897 |
+
(tinymce.isGecko &&
|
| 898 |
+
(/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) ||
|
| 899 |
+
/Firefox\/3\.[0-4]/.test(navigator.userAgent)))) {
|
| 900 |
+
this.classBasedEach(elements, f);
|
| 901 |
+
} else {
|
| 902 |
+
each(elements, f);
|
| 903 |
+
}
|
| 904 |
+
},
|
| 905 |
+
|
| 906 |
+
classBasedEach: function(elements, f) {
|
| 907 |
+
var dom = this.ed.dom, nodes, element;
|
| 908 |
+
// Mark nodes
|
| 909 |
+
each(elements, function(element) {
|
| 910 |
+
dom.addClass(element, '_mce_act_on');
|
| 911 |
+
});
|
| 912 |
+
nodes = dom.select('._mce_act_on');
|
| 913 |
+
while (nodes.length > 0) {
|
| 914 |
+
element = nodes.shift();
|
| 915 |
+
dom.removeClass(element, '_mce_act_on');
|
| 916 |
+
f(element);
|
| 917 |
+
nodes = dom.select('._mce_act_on');
|
| 918 |
+
}
|
| 919 |
+
},
|
| 920 |
+
|
| 921 |
+
adjustPaddingFunction: function(isIndent) {
|
| 922 |
+
var indentAmount, indentUnits, ed = this.ed;
|
| 923 |
+
indentAmount = ed.settings.indentation;
|
| 924 |
+
indentUnits = /[a-z%]+/i.exec(indentAmount);
|
| 925 |
+
indentAmount = parseInt(indentAmount, 10);
|
| 926 |
+
return function(element) {
|
| 927 |
+
var currentIndent, newIndentAmount;
|
| 928 |
+
currentIndent = parseInt(ed.dom.getStyle(element, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(element, 'padding-left') || 0, 10);
|
| 929 |
+
if (isIndent) {
|
| 930 |
+
newIndentAmount = currentIndent + indentAmount;
|
| 931 |
+
} else {
|
| 932 |
+
newIndentAmount = currentIndent - indentAmount;
|
| 933 |
+
}
|
| 934 |
+
ed.dom.setStyle(element, 'padding-left', '');
|
| 935 |
+
ed.dom.setStyle(element, 'margin-left', newIndentAmount > 0 ? newIndentAmount + indentUnits : '');
|
| 936 |
+
};
|
| 937 |
+
},
|
| 938 |
+
|
| 939 |
+
selectedBlocks: function() {
|
| 940 |
+
var ed = this.ed, selectedBlocks = ed.selection.getSelectedBlocks();
|
| 941 |
+
return selectedBlocks.length == 0 ? [ ed.dom.getRoot() ] : selectedBlocks;
|
| 942 |
+
},
|
| 943 |
+
|
| 944 |
+
getInfo: function() {
|
| 945 |
+
return {
|
| 946 |
+
longname : 'Lists',
|
| 947 |
+
author : 'Moxiecode Systems AB',
|
| 948 |
+
authorurl : 'http://tinymce.moxiecode.com',
|
| 949 |
+
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists',
|
| 950 |
+
version : tinymce.majorVersion + "." + tinymce.minorVersion
|
| 951 |
+
};
|
| 952 |
+
}
|
| 953 |
+
});
|
| 954 |
+
tinymce.PluginManager.add("lists", tinymce.plugins.Lists);
|
| 955 |
+
}());
|
js/tinymce/jscripts/tiny_mce/plugins/media/langs/en_dlg.js
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
tinyMCE.addI18n('en.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert/Edit Embedded Media","align_top_left":"Top Left","align_center":"Center","align_left":"Left","align_bottom":"Bottom","align_right":"Right","align_top":"Top","qt_stream_warn":"Streamed RTSP resources should be added to the QT Source field under the Advanced tab.\nYou should also add a non-streamed version to the Source field.",qtsrc:"QT Source",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch Style",scriptcallbacks:"Script Callbacks","align_top_right":"Top Right",uimode:"UI Mode",rate:"Rate",playcount:"Play Count",defaultframe:"Default Frame",currentposition:"Current Position",currentmarker:"Current Marker",captioningid:"Captioning ID",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless Video",stretchtofit:"Stretch to Fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Full Screen",enabled:"Enabled",autostart:"Auto Start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke Speed",href:"HREF",endtime:"End Time",starttime:"Start Time",enablejavascript:"Enable JavaScript",correction:"No Correction",targetcache:"Target Cache",playeveryframe:"Play Every Frame",kioskmode:"Kiosk Mode",controller:"Controller",menu:"Show Menu",loop:"Loop",play:"Auto Play",hspace:"H-Space",vspace:"V-Space","class_name":"Class",name:"Name",id:"ID",type:"Type",size:"Dimensions",preview:"Preview","constrain_proportions":"Constrain Proportions",controls:"Controls",numloop:"Num Loops",console:"Console",cache:"Cache",autohref:"Auto HREF",liveconnect:"SWLiveConnect",flashvars:"Flash Vars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No Java",maintainaspect:"Maintain Aspect",imagestatus:"Image Status",center:"Center",autogotourl:"Auto Goto URL","shockwave_options":"Shockwave Options","rmp_options":"Real Media Player Options","wmp_options":"Windows Media Player Options","qt_options":"QuickTime Options","flash_options":"Flash Options",hidden:"Hidden","align_bottom_left":"Bottom Left","align_bottom_right":"Bottom Right","html5_video_options":"HTML5 Video Options",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"Poster",source:"Source","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide", "embedded_audio_options":"Embedded Audio Options", video:"HTML5 Video", audio:"HTML5 Audio", flash:"Flash", quicktime:"QuickTime", shockwave:"Shockwave", windowsmedia:"Windows Media", realmedia:"Real Media", iframe:"Iframe", embeddedaudio:"Embedded Audio" });
|
| 1 |
+
tinyMCE.addI18n('en.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert/Edit Embedded Media","align_top_left":"Top Left","align_center":"Center","align_left":"Left","align_bottom":"Bottom","align_right":"Right","align_top":"Top","qt_stream_warn":"Streamed RTSP resources should be added to the QT Source field under the Advanced tab.\nYou should also add a non-streamed version to the Source field.",qtsrc:"QT Source",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch Style",scriptcallbacks:"Script Callbacks","align_top_right":"Top Right",uimode:"UI Mode",rate:"Rate",playcount:"Play Count",defaultframe:"Default Frame",currentposition:"Current Position",currentmarker:"Current Marker",captioningid:"Captioning ID",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless Video",stretchtofit:"Stretch to Fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Full Screen",enabled:"Enabled",autostart:"Auto Start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke Speed",href:"HREF",endtime:"End Time",starttime:"Start Time",enablejavascript:"Enable JavaScript",correction:"No Correction",targetcache:"Target Cache",playeveryframe:"Play Every Frame",kioskmode:"Kiosk Mode",controller:"Controller",menu:"Show Menu",loop:"Loop",play:"Auto Play",hspace:"H-Space",vspace:"V-Space","class_name":"Class",name:"Name",id:"ID",type:"Type",size:"Dimensions",preview:"Preview","constrain_proportions":"Constrain Proportions",controls:"Controls",numloop:"Num Loops",console:"Console",cache:"Cache",autohref:"Auto HREF",liveconnect:"SWLiveConnect",flashvars:"Flash Vars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No Java",maintainaspect:"Maintain Aspect",imagestatus:"Image Status",center:"Center",autogotourl:"Auto Goto URL","shockwave_options":"Shockwave Options","rmp_options":"Real Media Player Options","wmp_options":"Windows Media Player Options","qt_options":"QuickTime Options","flash_options":"Flash Options",hidden:"Hidden","align_bottom_left":"Bottom Left","align_bottom_right":"Bottom Right","html5_video_options":"HTML5 Video Options",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"Poster",source:"Source","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide", "embedded_audio_options":"Embedded Audio Options", video:"HTML5 Video", audio:"HTML5 Audio", flash:"Flash", quicktime:"QuickTime", shockwave:"Shockwave", windowsmedia:"Windows Media", realmedia:"Real Media", iframe:"Iframe", embeddedaudio:"Embedded Audio" });
|
js/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js
CHANGED
|
@@ -1,53 +1,53 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* editor_plugin_src.js
|
| 3 |
-
*
|
| 4 |
-
* Copyright 2009, Moxiecode Systems AB
|
| 5 |
-
* Released under LGPL License.
|
| 6 |
-
*
|
| 7 |
-
* License: http://tinymce.moxiecode.com/license
|
| 8 |
-
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
-
*/
|
| 10 |
-
|
| 11 |
-
(function() {
|
| 12 |
-
tinymce.create('tinymce.plugins.Preview', {
|
| 13 |
-
init : function(ed, url) {
|
| 14 |
-
var t = this, css = tinymce.explode(ed.settings.content_css);
|
| 15 |
-
|
| 16 |
-
t.editor = ed;
|
| 17 |
-
|
| 18 |
-
// Force absolute CSS urls
|
| 19 |
-
tinymce.each(css, function(u, k) {
|
| 20 |
-
css[k] = ed.documentBaseURI.toAbsolute(u);
|
| 21 |
-
});
|
| 22 |
-
|
| 23 |
-
ed.addCommand('mcePreview', function() {
|
| 24 |
-
ed.windowManager.open({
|
| 25 |
-
file : ed.getParam("plugin_preview_pageurl", url + "/preview.html"),
|
| 26 |
-
width : parseInt(ed.getParam("plugin_preview_width", "550")),
|
| 27 |
-
height : parseInt(ed.getParam("plugin_preview_height", "600")),
|
| 28 |
-
resizable : "yes",
|
| 29 |
-
scrollbars : "yes",
|
| 30 |
-
popup_css : css ? css.join(',') : ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css"),
|
| 31 |
-
inline : ed.getParam("plugin_preview_inline", 1)
|
| 32 |
-
}, {
|
| 33 |
-
base : ed.documentBaseURI.getURI()
|
| 34 |
-
});
|
| 35 |
-
});
|
| 36 |
-
|
| 37 |
-
ed.addButton('preview', {title : 'preview.preview_desc', cmd : 'mcePreview'});
|
| 38 |
-
},
|
| 39 |
-
|
| 40 |
-
getInfo : function() {
|
| 41 |
-
return {
|
| 42 |
-
longname : 'Preview',
|
| 43 |
-
author : 'Moxiecode Systems AB',
|
| 44 |
-
authorurl : 'http://tinymce.moxiecode.com',
|
| 45 |
-
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview',
|
| 46 |
-
version : tinymce.majorVersion + "." + tinymce.minorVersion
|
| 47 |
-
};
|
| 48 |
-
}
|
| 49 |
-
});
|
| 50 |
-
|
| 51 |
-
// Register plugin
|
| 52 |
-
tinymce.PluginManager.add('preview', tinymce.plugins.Preview);
|
| 53 |
})();
|
| 1 |
+
/**
|
| 2 |
+
* editor_plugin_src.js
|
| 3 |
+
*
|
| 4 |
+
* Copyright 2009, Moxiecode Systems AB
|
| 5 |
+
* Released under LGPL License.
|
| 6 |
+
*
|
| 7 |
+
* License: http://tinymce.moxiecode.com/license
|
| 8 |
+
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
+
*/
|
| 10 |
+
|
| 11 |
+
(function() {
|
| 12 |
+
tinymce.create('tinymce.plugins.Preview', {
|
| 13 |
+
init : function(ed, url) {
|
| 14 |
+
var t = this, css = tinymce.explode(ed.settings.content_css);
|
| 15 |
+
|
| 16 |
+
t.editor = ed;
|
| 17 |
+
|
| 18 |
+
// Force absolute CSS urls
|
| 19 |
+
tinymce.each(css, function(u, k) {
|
| 20 |
+
css[k] = ed.documentBaseURI.toAbsolute(u);
|
| 21 |
+
});
|
| 22 |
+
|
| 23 |
+
ed.addCommand('mcePreview', function() {
|
| 24 |
+
ed.windowManager.open({
|
| 25 |
+
file : ed.getParam("plugin_preview_pageurl", url + "/preview.html"),
|
| 26 |
+
width : parseInt(ed.getParam("plugin_preview_width", "550")),
|
| 27 |
+
height : parseInt(ed.getParam("plugin_preview_height", "600")),
|
| 28 |
+
resizable : "yes",
|
| 29 |
+
scrollbars : "yes",
|
| 30 |
+
popup_css : css ? css.join(',') : ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css"),
|
| 31 |
+
inline : ed.getParam("plugin_preview_inline", 1)
|
| 32 |
+
}, {
|
| 33 |
+
base : ed.documentBaseURI.getURI()
|
| 34 |
+
});
|
| 35 |
+
});
|
| 36 |
+
|
| 37 |
+
ed.addButton('preview', {title : 'preview.preview_desc', cmd : 'mcePreview'});
|
| 38 |
+
},
|
| 39 |
+
|
| 40 |
+
getInfo : function() {
|
| 41 |
+
return {
|
| 42 |
+
longname : 'Preview',
|
| 43 |
+
author : 'Moxiecode Systems AB',
|
| 44 |
+
authorurl : 'http://tinymce.moxiecode.com',
|
| 45 |
+
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview',
|
| 46 |
+
version : tinymce.majorVersion + "." + tinymce.minorVersion
|
| 47 |
+
};
|
| 48 |
+
}
|
| 49 |
+
});
|
| 50 |
+
|
| 51 |
+
// Register plugin
|
| 52 |
+
tinymce.PluginManager.add('preview', tinymce.plugins.Preview);
|
| 53 |
})();
|
js/tinymce/jscripts/tiny_mce/plugins/style/langs/en_dlg.js
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
tinyMCE.addI18n('en.style_dlg',{"text_lineheight":"Line Height","text_variant":"Variant","text_style":"Style","text_weight":"Weight","text_size":"Size","text_font":"Font","text_props":"Text","positioning_tab":"Positioning","list_tab":"List","border_tab":"Border","box_tab":"Box","block_tab":"Block","background_tab":"Background","text_tab":"Text",apply:"Apply",toggle_insert_span:"Insert span at selection",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility","positioning_type":"Type",position:"Position","bullet_image":"Bullet Image","list_type":"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for All",padding:"Padding","box_clear":"Clear","box_float":"Float","box_height":"Height","box_width":"Width","block_display":"Display","block_whitespace":"Whitespace","block_text_indent":"Text Indent","block_text_align":"Text Align","block_vertical_alignment":"Vertical Alignment","block_letterspacing":"Letter Spacing","block_wordspacing":"Word Spacing","background_vpos":"Vertical Position","background_hpos":"Horizontal Position","background_attachment":"Attachment","background_repeat":"Repeat","background_image":"Background Image","background_color":"Background Color","text_none":"None","text_blink":"Blink","text_case":"Case","text_striketrough":"Strikethrough","text_underline":"Underline","text_overline":"Overline","text_decoration":"Decoration","text_color":"Color",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
|
| 1 |
+
tinyMCE.addI18n('en.style_dlg',{"text_lineheight":"Line Height","text_variant":"Variant","text_style":"Style","text_weight":"Weight","text_size":"Size","text_font":"Font","text_props":"Text","positioning_tab":"Positioning","list_tab":"List","border_tab":"Border","box_tab":"Box","block_tab":"Block","background_tab":"Background","text_tab":"Text",apply:"Apply",toggle_insert_span:"Insert span at selection",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility","positioning_type":"Type",position:"Position","bullet_image":"Bullet Image","list_type":"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for All",padding:"Padding","box_clear":"Clear","box_float":"Float","box_height":"Height","box_width":"Width","block_display":"Display","block_whitespace":"Whitespace","block_text_indent":"Text Indent","block_text_align":"Text Align","block_vertical_alignment":"Vertical Alignment","block_letterspacing":"Letter Spacing","block_wordspacing":"Word Spacing","background_vpos":"Vertical Position","background_hpos":"Horizontal Position","background_attachment":"Attachment","background_repeat":"Repeat","background_image":"Background Image","background_color":"Background Color","text_none":"None","text_blink":"Blink","text_case":"Case","text_striketrough":"Strikethrough","text_underline":"Underline","text_overline":"Overline","text_decoration":"Decoration","text_color":"Color",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
|
js/tinymce/jscripts/tiny_mce/plugins/style/props.htm
CHANGED
|
@@ -1,845 +1,845 @@
|
|
| 1 |
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
| 2 |
-
<html xmlns="http://www.w3.org/1999/xhtml">
|
| 3 |
-
<head>
|
| 4 |
-
<title>{#style_dlg.title}</title>
|
| 5 |
-
<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
|
| 6 |
-
<script type="text/javascript" src="../../utils/mctabs.js"></script>
|
| 7 |
-
<script type="text/javascript" src="../../utils/editable_selects.js"></script>
|
| 8 |
-
<script type="text/javascript" src="../../utils/form_utils.js"></script>
|
| 9 |
-
<script type="text/javascript" src="js/props.js"></script>
|
| 10 |
-
<link href="css/props.css" rel="stylesheet" type="text/css" />
|
| 11 |
-
</head>
|
| 12 |
-
|
| 13 |
-
<body id="styleprops" style="display: none" role="application" aria-labelledby="app_title">
|
| 14 |
-
<span id="app_title" style="display:none">{#style_dlg.title}</span>
|
| 15 |
-
<form onsubmit="updateAction();return false;" action="#">
|
| 16 |
-
<div class="tabs">
|
| 17 |
-
<ul>
|
| 18 |
-
<li id="text_tab" class="current" aria-controls="text_panel"><span><a href="javascript:mcTabs.displayTab('text_tab','text_panel');" onMouseDown="return false;">{#style_dlg.text_tab}</a></span></li>
|
| 19 |
-
<li id="background_tab" aria-controls="background_panel"><span><a href="javascript:mcTabs.displayTab('background_tab','background_panel');" onMouseDown="return false;">{#style_dlg.background_tab}</a></span></li>
|
| 20 |
-
<li id="block_tab" aria-controls="block_panel"><span><a href="javascript:mcTabs.displayTab('block_tab','block_panel');" onMouseDown="return false;">{#style_dlg.block_tab}</a></span></li>
|
| 21 |
-
<li id="box_tab" aria-controls="box_panel"><span><a href="javascript:mcTabs.displayTab('box_tab','box_panel');" onMouseDown="return false;">{#style_dlg.box_tab}</a></span></li>
|
| 22 |
-
<li id="border_tab" aria-controls="border_panel"><span><a href="javascript:mcTabs.displayTab('border_tab','border_panel');" onMouseDown="return false;">{#style_dlg.border_tab}</a></span></li>
|
| 23 |
-
<li id="list_tab" aria-controls="list_panel"><span><a href="javascript:mcTabs.displayTab('list_tab','list_panel');" onMouseDown="return false;">{#style_dlg.list_tab}</a></span></li>
|
| 24 |
-
<li id="positioning_tab" aria-controls="positioning_panel"><span><a href="javascript:mcTabs.displayTab('positioning_tab','positioning_panel');" onMouseDown="return false;">{#style_dlg.positioning_tab}</a></span></li>
|
| 25 |
-
</ul>
|
| 26 |
-
</div>
|
| 27 |
-
|
| 28 |
-
<div class="panel_wrapper">
|
| 29 |
-
<div id="text_panel" class="panel current">
|
| 30 |
-
<fieldset>
|
| 31 |
-
<legend>{#style_dlg.text}</legend>
|
| 32 |
-
<table role="presentation" border="0" width="100%">
|
| 33 |
-
<tr>
|
| 34 |
-
<td><label for="text_font">{#style_dlg.text_font}</label></td>
|
| 35 |
-
<td colspan="3">
|
| 36 |
-
<select id="text_font" name="text_font" class="mceEditableSelect mceFocus"></select>
|
| 37 |
-
</td>
|
| 38 |
-
</tr>
|
| 39 |
-
<tr>
|
| 40 |
-
<td><label for="text_size">{#style_dlg.text_size}</label></td>
|
| 41 |
-
<td>
|
| 42 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 43 |
-
<tr>
|
| 44 |
-
<td><select id="text_size" name="text_size" class="mceEditableSelect"></select></td>
|
| 45 |
-
<td> </td>
|
| 46 |
-
<td>
|
| 47 |
-
<label id="text_size_measurement_label" for="text_size_measurement" style="display: none; visibility: hidden;">Text Size Measurement Unit</label>
|
| 48 |
-
<select id="text_size_measurement" name="text_size_measurement" aria-labelledby="text_size_measurement_label"></select>
|
| 49 |
-
</td>
|
| 50 |
-
</tr>
|
| 51 |
-
</table>
|
| 52 |
-
</td>
|
| 53 |
-
<td><label for="text_weight">{#style_dlg.text_weight}</label></td>
|
| 54 |
-
<td>
|
| 55 |
-
<select id="text_weight" name="text_weight"></select>
|
| 56 |
-
</td>
|
| 57 |
-
</tr>
|
| 58 |
-
<tr>
|
| 59 |
-
<td><label for="text_style">{#style_dlg.text_style}</label></td>
|
| 60 |
-
<td>
|
| 61 |
-
<select id="text_style" name="text_style" class="mceEditableSelect"></select>
|
| 62 |
-
</td>
|
| 63 |
-
<td><label for="text_variant">{#style_dlg.text_variant}</label></td>
|
| 64 |
-
<td>
|
| 65 |
-
<select id="text_variant" name="text_variant"></select>
|
| 66 |
-
</td>
|
| 67 |
-
</tr>
|
| 68 |
-
<tr>
|
| 69 |
-
<td><label for="text_lineheight">{#style_dlg.text_lineheight}</label></td>
|
| 70 |
-
<td>
|
| 71 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 72 |
-
<tr>
|
| 73 |
-
<td>
|
| 74 |
-
<select id="text_lineheight" name="text_lineheight" class="mceEditableSelect"></select>
|
| 75 |
-
</td>
|
| 76 |
-
<td> </td>
|
| 77 |
-
<td>
|
| 78 |
-
<label id="text_lineheight_measurement_label" for="text_lineheight_measurement" style="display: none; visibility: hidden;">Line Height Measurement Unit</label>
|
| 79 |
-
<select id="text_lineheight_measurement" name="text_lineheight_measurement" aria-labelledby="text_lineheight_measurement_label"></select>
|
| 80 |
-
</td>
|
| 81 |
-
</tr>
|
| 82 |
-
</table>
|
| 83 |
-
</td>
|
| 84 |
-
<td><label for="text_case">{#style_dlg.text_case}</label></td>
|
| 85 |
-
<td>
|
| 86 |
-
<select id="text_case" name="text_case"></select>
|
| 87 |
-
</td>
|
| 88 |
-
</tr>
|
| 89 |
-
<tr>
|
| 90 |
-
<td><label for="text_color">{#style_dlg.text_color}</label></td>
|
| 91 |
-
<td colspan="2">
|
| 92 |
-
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
| 93 |
-
<tr>
|
| 94 |
-
<td><input id="text_color" name="text_color" type="text" value="" size="9" onChange="updateColor('text_color_pick','text_color');" /></td>
|
| 95 |
-
<td id="text_color_pickcontainer"> </td>
|
| 96 |
-
</tr>
|
| 97 |
-
</table>
|
| 98 |
-
</td>
|
| 99 |
-
</tr>
|
| 100 |
-
<tr>
|
| 101 |
-
<td valign="top" style="vertical-align: top; padding-top: 3px;">{#style_dlg.text_decoration}</td>
|
| 102 |
-
<td colspan="2">
|
| 103 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 104 |
-
<tr>
|
| 105 |
-
<td><input id="text_underline" name="text_underline" class="checkbox" type="checkbox" /></td>
|
| 106 |
-
<td><label for="text_underline">{#style_dlg.text_underline}</label></td>
|
| 107 |
-
</tr>
|
| 108 |
-
<tr>
|
| 109 |
-
<td><input id="text_overline" name="text_overline" class="checkbox" type="checkbox" /></td>
|
| 110 |
-
<td><label for="text_overline">{#style_dlg.text_overline}</label></td>
|
| 111 |
-
</tr>
|
| 112 |
-
<tr>
|
| 113 |
-
<td><input id="text_linethrough" name="text_linethrough" class="checkbox" type="checkbox" /></td>
|
| 114 |
-
<td><label for="text_linethrough">{#style_dlg.text_striketrough}</label></td>
|
| 115 |
-
</tr>
|
| 116 |
-
<tr>
|
| 117 |
-
<td><input id="text_blink" name="text_blink" class="checkbox" type="checkbox" /></td>
|
| 118 |
-
<td><label for="text_blink">{#style_dlg.text_blink}</label></td>
|
| 119 |
-
</tr>
|
| 120 |
-
<tr>
|
| 121 |
-
<td><input id="text_none" name="text_none" class="checkbox" type="checkbox" onclick="updateTextDecorations();"/></td>
|
| 122 |
-
<td><label for="text_none">{#style_dlg.text_none}</label></td>
|
| 123 |
-
</tr>
|
| 124 |
-
</table>
|
| 125 |
-
</td>
|
| 126 |
-
</tr>
|
| 127 |
-
</table>
|
| 128 |
-
</fieldset>
|
| 129 |
-
</div>
|
| 130 |
-
|
| 131 |
-
<div id="background_panel" class="panel">
|
| 132 |
-
<fieldset>
|
| 133 |
-
<legend>{#style_dlg.background}</legend>
|
| 134 |
-
<table role="presentation" border="0">
|
| 135 |
-
<tr>
|
| 136 |
-
<td><label for="background_color">{#style_dlg.background_color}</label></td>
|
| 137 |
-
<td>
|
| 138 |
-
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
| 139 |
-
<tr>
|
| 140 |
-
<td><input id="background_color" name="background_color" type="text" value="" size="9" onChange="updateColor('background_color_pick','background_color');" /></td>
|
| 141 |
-
<td id="background_color_pickcontainer"> </td>
|
| 142 |
-
</tr>
|
| 143 |
-
</table>
|
| 144 |
-
</td>
|
| 145 |
-
</tr>
|
| 146 |
-
|
| 147 |
-
<tr>
|
| 148 |
-
<td><label for="background_image">{#style_dlg.background_image}</label></td>
|
| 149 |
-
<td><table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 150 |
-
<tr>
|
| 151 |
-
<td><input id="background_image" name="background_image" type="text" /></td>
|
| 152 |
-
<td id="background_image_browser"> </td>
|
| 153 |
-
</tr>
|
| 154 |
-
</table>
|
| 155 |
-
</td>
|
| 156 |
-
</tr>
|
| 157 |
-
|
| 158 |
-
<tr>
|
| 159 |
-
<td><label for="background_repeat">{#style_dlg.background_repeat}</label></td>
|
| 160 |
-
<td><select id="background_repeat" name="background_repeat" class="mceEditableSelect"></select></td>
|
| 161 |
-
</tr>
|
| 162 |
-
|
| 163 |
-
<tr>
|
| 164 |
-
<td><label for="background_attachment">{#style_dlg.background_attachment}</label></td>
|
| 165 |
-
<td><select id="background_attachment" name="background_attachment" class="mceEditableSelect"></select></td>
|
| 166 |
-
</tr>
|
| 167 |
-
|
| 168 |
-
<tr>
|
| 169 |
-
<td><label for="background_hpos">{#style_dlg.background_hpos}</label></td>
|
| 170 |
-
<td>
|
| 171 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 172 |
-
<tr>
|
| 173 |
-
<td><select id="background_hpos" name="background_hpos" class="mceEditableSelect"></select></td>
|
| 174 |
-
<td> </td>
|
| 175 |
-
<td>
|
| 176 |
-
<label id="background_hpos_measurement_label" for="background_hpos_measurement" style="display: none; visibility: hidden;">Horizontal position measurement unit</label>
|
| 177 |
-
<select id="background_hpos_measurement" name="background_hpos_measurement" aria-labelledby="background_hpos_measurement_label"></select>
|
| 178 |
-
</td>
|
| 179 |
-
</tr>
|
| 180 |
-
</table>
|
| 181 |
-
</td>
|
| 182 |
-
</tr>
|
| 183 |
-
|
| 184 |
-
<tr>
|
| 185 |
-
<td><label for="background_vpos">{#style_dlg.background_vpos}</label></td>
|
| 186 |
-
<td>
|
| 187 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 188 |
-
<tr>
|
| 189 |
-
<td><select id="background_vpos" name="background_vpos" class="mceEditableSelect"></select></td>
|
| 190 |
-
<td> </td>
|
| 191 |
-
<td>
|
| 192 |
-
|
| 193 |
-
<label id="background_vpos_measurement_label" for="background_vpos_measurement" style="display: none; visibility: hidden;">Vertical position measurement unit</label>
|
| 194 |
-
<select id="background_vpos_measurement" name="background_vpos_measurement" aria-labelledby="background_vpos_measurement_label">></select></td>
|
| 195 |
-
</tr>
|
| 196 |
-
</table>
|
| 197 |
-
</td>
|
| 198 |
-
</tr>
|
| 199 |
-
</table>
|
| 200 |
-
</fieldset>
|
| 201 |
-
</div>
|
| 202 |
-
|
| 203 |
-
<div id="block_panel" class="panel">
|
| 204 |
-
<fieldset>
|
| 205 |
-
<legend>{#style_dlg.block}</legend>
|
| 206 |
-
<table role="presentation" border="0">
|
| 207 |
-
<tr>
|
| 208 |
-
<td><label for="block_wordspacing">{#style_dlg.block_wordspacing}</label></td>
|
| 209 |
-
<td>
|
| 210 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 211 |
-
<tr>
|
| 212 |
-
<td><select id="block_wordspacing" name="block_wordspacing" class="mceEditableSelect"></select></td>
|
| 213 |
-
<td> </td>
|
| 214 |
-
<td>
|
| 215 |
-
<label id="block_wordspacing_measurement_label" for="block_wordspacing_measurement" style="display: none; visibility: hidden;">Word spacing measurement unit</label>
|
| 216 |
-
<select id="block_wordspacing_measurement" name="block_wordspacing_measurement" aria-labelledby="block_wordspacing_measurement_label"></select>
|
| 217 |
-
</td>
|
| 218 |
-
</tr>
|
| 219 |
-
</table>
|
| 220 |
-
</td>
|
| 221 |
-
</tr>
|
| 222 |
-
|
| 223 |
-
<tr>
|
| 224 |
-
<td><label for="block_letterspacing">{#style_dlg.block_letterspacing}</label></td>
|
| 225 |
-
<td>
|
| 226 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 227 |
-
<tr>
|
| 228 |
-
<td><select id="block_letterspacing" name="block_letterspacing" class="mceEditableSelect"></select></td>
|
| 229 |
-
<td> </td>
|
| 230 |
-
<td>
|
| 231 |
-
<label id="block_letterspacing_measurement_label" for="block_letterspacing_measurement" style="display: none; visibility: hidden;">Letter spacing measurement unit</label>
|
| 232 |
-
<select id="block_letterspacing_measurement" name="block_letterspacing_measurement" aria-labelledby="block_letterspacing_measurement_label"></select>
|
| 233 |
-
</td>
|
| 234 |
-
</tr>
|
| 235 |
-
</table>
|
| 236 |
-
</td>
|
| 237 |
-
</tr>
|
| 238 |
-
|
| 239 |
-
<tr>
|
| 240 |
-
<td><label for="block_vertical_alignment">{#style_dlg.block_vertical_alignment}</label></td>
|
| 241 |
-
<td><select id="block_vertical_alignment" name="block_vertical_alignment" class="mceEditableSelect"></select></td>
|
| 242 |
-
</tr>
|
| 243 |
-
|
| 244 |
-
<tr>
|
| 245 |
-
<td><label for="block_text_align">{#style_dlg.block_text_align}</label></td>
|
| 246 |
-
<td><select id="block_text_align" name="block_text_align" class="mceEditableSelect"></select></td>
|
| 247 |
-
</tr>
|
| 248 |
-
|
| 249 |
-
<tr>
|
| 250 |
-
<td><label for="block_text_indent">{#style_dlg.block_text_indent}</label></td>
|
| 251 |
-
<td>
|
| 252 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 253 |
-
<tr>
|
| 254 |
-
<td><input type="text" id="block_text_indent" name="block_text_indent" /></td>
|
| 255 |
-
<td> </td>
|
| 256 |
-
<td>
|
| 257 |
-
<label id="block_text_indent_measurement_label" for="block_text_indent_measurement" style="display: none; visibility: hidden;">Text Indent Measurement Unit</label>
|
| 258 |
-
|
| 259 |
-
<select id="block_text_indent_measurement" name="block_text_indent_measurement" aria-labelledby="block_text_indent_measurement_label"></select>
|
| 260 |
-
</td>
|
| 261 |
-
</tr>
|
| 262 |
-
</table>
|
| 263 |
-
</td>
|
| 264 |
-
</tr>
|
| 265 |
-
|
| 266 |
-
<tr>
|
| 267 |
-
<td><label for="block_whitespace">{#style_dlg.block_whitespace}</label></td>
|
| 268 |
-
<td><select id="block_whitespace" name="block_whitespace" class="mceEditableSelect"></select></td>
|
| 269 |
-
</tr>
|
| 270 |
-
|
| 271 |
-
<tr>
|
| 272 |
-
<td><label for="block_display">{#style_dlg.block_display}</label></td>
|
| 273 |
-
<td><select id="block_display" name="block_display" class="mceEditableSelect"></select></td>
|
| 274 |
-
</tr>
|
| 275 |
-
</table>
|
| 276 |
-
</fieldset>
|
| 277 |
-
</div>
|
| 278 |
-
|
| 279 |
-
<div id="box_panel" class="panel">
|
| 280 |
-
<fieldset>
|
| 281 |
-
<legend>{#style_dlg.box}</legend>
|
| 282 |
-
<table role="presentation" border="0">
|
| 283 |
-
<tr>
|
| 284 |
-
<td><label for="box_width">{#style_dlg.box_width}</label></td>
|
| 285 |
-
<td>
|
| 286 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 287 |
-
<tr>
|
| 288 |
-
<td><input type="text" id="box_width" name="box_width" class="mceEditableSelect" onChange="synch('box_width','positioning_width');" /></td>
|
| 289 |
-
<td> </td>
|
| 290 |
-
<td>
|
| 291 |
-
<label id="box_width_measurement_label" for="box_width_measurement" style="display: none; visibility: hidden;">Box Width Measurement Unit</label>
|
| 292 |
-
<select id="box_width_measurement" name="box_width_measurement" aria-labelledby="box_width_measurement_label"></select>
|
| 293 |
-
</td>
|
| 294 |
-
</tr>
|
| 295 |
-
</table>
|
| 296 |
-
</td>
|
| 297 |
-
<td> <label for="box_float">{#style_dlg.box_float}</label></td>
|
| 298 |
-
<td><select id="box_float" name="box_float" class="mceEditableSelect"></select></td>
|
| 299 |
-
</tr>
|
| 300 |
-
|
| 301 |
-
<tr>
|
| 302 |
-
<td><label for="box_height">{#style_dlg.box_height}</label></td>
|
| 303 |
-
<td>
|
| 304 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 305 |
-
<tr>
|
| 306 |
-
<td><input type="text" id="box_height" name="box_height" class="mceEditableSelect" onChange="synch('box_height','positioning_height');" /></td>
|
| 307 |
-
<td> </td>
|
| 308 |
-
<td>
|
| 309 |
-
<label id="box_height_measurement_label" for="box_height_measurement" style="display: none; visibility: hidden;">Box Height Measurement Unit</label>
|
| 310 |
-
<select id="box_height_measurement" name="box_height_measurement" aria-labelledby="box_height_measurement_label"></select>
|
| 311 |
-
</td>
|
| 312 |
-
</tr>
|
| 313 |
-
</table>
|
| 314 |
-
</td>
|
| 315 |
-
<td> <label for="box_clear">{#style_dlg.box_clear}</label></td>
|
| 316 |
-
<td><select id="box_clear" name="box_clear" class="mceEditableSelect"></select></td>
|
| 317 |
-
</tr>
|
| 318 |
-
</table>
|
| 319 |
-
</fieldset>
|
| 320 |
-
|
| 321 |
-
<div style="float: left; width: 49%">
|
| 322 |
-
<fieldset>
|
| 323 |
-
<legend>{#style_dlg.padding}</legend>
|
| 324 |
-
|
| 325 |
-
<table role="presentation" border="0">
|
| 326 |
-
<tr>
|
| 327 |
-
<td> </td>
|
| 328 |
-
<td><input type="checkbox" id="box_padding_same" name="box_padding_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_padding');" /> <label for="box_padding_same">{#style_dlg.same}</label></td>
|
| 329 |
-
</tr>
|
| 330 |
-
<tr>
|
| 331 |
-
<td><label for="box_padding_top">{#style_dlg.top}</label></td>
|
| 332 |
-
<td>
|
| 333 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 334 |
-
<tr>
|
| 335 |
-
<td><input type="text" id="box_padding_top" name="box_padding_top" class="mceEditableSelect" /></td>
|
| 336 |
-
<td> </td>
|
| 337 |
-
<td>
|
| 338 |
-
<label id="box_padding_top_measurement_label" for="box_padding_top_measurement" style="display: none; visibility: hidden;">Padding Top Measurement Unit</label>
|
| 339 |
-
<select id="box_padding_top_measurement" name="box_padding_top_measurement" aria-labelledby="box_padding_top_measurement_label"></select>
|
| 340 |
-
</td>
|
| 341 |
-
</tr>
|
| 342 |
-
</table>
|
| 343 |
-
</td>
|
| 344 |
-
</tr>
|
| 345 |
-
<tr>
|
| 346 |
-
<td><label for="box_padding_right">{#style_dlg.right}</label></td>
|
| 347 |
-
<td>
|
| 348 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 349 |
-
<tr>
|
| 350 |
-
<td><input type="text" id="box_padding_right" name="box_padding_right" class="mceEditableSelect" disabled="disabled" /></td>
|
| 351 |
-
<td> </td>
|
| 352 |
-
<td>
|
| 353 |
-
<label id="box_padding_right_measurement_label" for="box_padding_right_measurement" style="display: none; visibility: hidden;">Padding Right Measurement Unit</label>
|
| 354 |
-
<select id="box_padding_right_measurement" name="box_padding_right_measurement" disabled="disabled" aria-labelledby="box_padding_right_measurement_label"></select>
|
| 355 |
-
</td>
|
| 356 |
-
</tr>
|
| 357 |
-
</table>
|
| 358 |
-
</td>
|
| 359 |
-
</tr>
|
| 360 |
-
<tr>
|
| 361 |
-
<td><label for="box_padding_bottom">{#style_dlg.bottom}</label></td>
|
| 362 |
-
<td>
|
| 363 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 364 |
-
<tr>
|
| 365 |
-
<td><input type="text" id="box_padding_bottom" name="box_padding_bottom" class="mceEditableSelect" disabled="disabled" /></td>
|
| 366 |
-
<td> </td>
|
| 367 |
-
<td>
|
| 368 |
-
<label id="box_padding_bottom_measurement_label" for="box_padding_bottom_measurement" style="display: none; visibility: hidden;">Padding Bottom Measurement Unit</label>
|
| 369 |
-
<select id="box_padding_bottom_measurement" name="box_padding_bottom_measurement" disabled="disabled" aria-labelledby="box_padding_bottom_measurement_label"></select>
|
| 370 |
-
</td>
|
| 371 |
-
</tr>
|
| 372 |
-
</table>
|
| 373 |
-
</td>
|
| 374 |
-
</tr>
|
| 375 |
-
<tr>
|
| 376 |
-
<td><label for="box_padding_left">{#style_dlg.left}</label></td>
|
| 377 |
-
<td>
|
| 378 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 379 |
-
<tr>
|
| 380 |
-
<td><input type="text" id="box_padding_left" name="box_padding_left" class="mceEditableSelect" disabled="disabled" /></td>
|
| 381 |
-
<td> </td>
|
| 382 |
-
<td>
|
| 383 |
-
<label id="box_padding_left_measurement_label" for="box_padding_left_measurement" style="display: none; visibility: hidden;">Padding Left Measurement Unit</label>
|
| 384 |
-
<select id="box_padding_left_measurement" name="box_padding_left_measurement" disabled="disabled" aria-labelledby="box_padding_left_measurement_label"></select>
|
| 385 |
-
</td>
|
| 386 |
-
</tr>
|
| 387 |
-
</table>
|
| 388 |
-
</td>
|
| 389 |
-
</tr>
|
| 390 |
-
</table>
|
| 391 |
-
</fieldset>
|
| 392 |
-
</div>
|
| 393 |
-
|
| 394 |
-
<div style="float: right; width: 49%">
|
| 395 |
-
<fieldset>
|
| 396 |
-
<legend>{#style_dlg.margin}</legend>
|
| 397 |
-
|
| 398 |
-
<table role="presentation" border="0">
|
| 399 |
-
<tr>
|
| 400 |
-
<td> </td>
|
| 401 |
-
<td><input type="checkbox" id="box_margin_same" name="box_margin_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_margin');" /> <label for="box_margin_same">{#style_dlg.same}</label></td>
|
| 402 |
-
</tr>
|
| 403 |
-
<tr>
|
| 404 |
-
<td><label for="box_margin_top">{#style_dlg.top}</label></td>
|
| 405 |
-
<td>
|
| 406 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 407 |
-
<tr>
|
| 408 |
-
<td><input type="text" id="box_margin_top" name="box_margin_top" class="mceEditableSelect" /></td>
|
| 409 |
-
<td> </td>
|
| 410 |
-
<td>
|
| 411 |
-
<label id="box_margin_top_measurement_label" for="box_margin_top_measurement" style="display: none; visibility: hidden;">Margin Top Measurement Unit</label>
|
| 412 |
-
<select id="box_margin_top_measurement" name="box_margin_top_measurement" aria-labelledby="box_margin_top_measurement_label"></select>
|
| 413 |
-
</td>
|
| 414 |
-
</tr>
|
| 415 |
-
</table>
|
| 416 |
-
</td>
|
| 417 |
-
</tr>
|
| 418 |
-
<tr>
|
| 419 |
-
<td><label for="box_margin_right">{#style_dlg.right}</label></td>
|
| 420 |
-
<td>
|
| 421 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 422 |
-
<tr>
|
| 423 |
-
<td><input type="text" id="box_margin_right" name="box_margin_right" class="mceEditableSelect" disabled="disabled" /></td>
|
| 424 |
-
<td> </td>
|
| 425 |
-
<td>
|
| 426 |
-
<label id="box_margin_right_measurement_label" for="box_margin_right_measurement" style="display: none; visibility: hidden;">Margin Right Measurement Unit</label>
|
| 427 |
-
<select id="box_margin_right_measurement" name="box_margin_right_measurement" disabled="disabled" aria-labelledby="box_margin_right_measurement_label"></select>
|
| 428 |
-
</td>
|
| 429 |
-
</tr>
|
| 430 |
-
</table>
|
| 431 |
-
</td>
|
| 432 |
-
</tr>
|
| 433 |
-
<tr>
|
| 434 |
-
<td><label for="box_margin_bottom">{#style_dlg.bottom}</label></td>
|
| 435 |
-
<td>
|
| 436 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 437 |
-
<tr>
|
| 438 |
-
<td><input type="text" id="box_margin_bottom" name="box_margin_bottom" class="mceEditableSelect" disabled="disabled" /></td>
|
| 439 |
-
<td> </td>
|
| 440 |
-
<td>
|
| 441 |
-
<label id="box_margin_bottom_measurement_label" for="box_margin_bottom_measurement" style="display: none; visibility: hidden;">Margin Bottom Measurement Unit</label>
|
| 442 |
-
<select id="box_margin_bottom_measurement" name="box_margin_bottom_measurement" disabled="disabled" aria-labelledby="box_margin_bottom_measurement_label"></select>
|
| 443 |
-
</td>
|
| 444 |
-
</tr>
|
| 445 |
-
</table>
|
| 446 |
-
</td>
|
| 447 |
-
</tr>
|
| 448 |
-
<tr>
|
| 449 |
-
<td><label for="box_margin_left">{#style_dlg.left}</label></td>
|
| 450 |
-
<td>
|
| 451 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 452 |
-
<tr>
|
| 453 |
-
<td><input type="text" id="box_margin_left" name="box_margin_left" class="mceEditableSelect" disabled="disabled" /></td>
|
| 454 |
-
<td> </td>
|
| 455 |
-
<td>
|
| 456 |
-
<label id="box_margin_left_measurement_label" for="box_margin_left_measurement" style="display: none; visibility: hidden;">Margin Left Measurement Unit</label>
|
| 457 |
-
<select id="box_margin_left_measurement" name="box_margin_left_measurement" disabled="disabled" aria-labelledby="box_margin_left_measurement_label"></select>
|
| 458 |
-
</td>
|
| 459 |
-
</tr>
|
| 460 |
-
</table>
|
| 461 |
-
</td>
|
| 462 |
-
</tr>
|
| 463 |
-
</table>
|
| 464 |
-
</fieldset>
|
| 465 |
-
</div>
|
| 466 |
-
<br style="clear: both" />
|
| 467 |
-
</div>
|
| 468 |
-
|
| 469 |
-
<div id="border_panel" class="panel">
|
| 470 |
-
<fieldset>
|
| 471 |
-
<legend>{#style_dlg.border}</legend>
|
| 472 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0" width="100%">
|
| 473 |
-
<tr>
|
| 474 |
-
<td class="tdelim"> </td>
|
| 475 |
-
<td class="tdelim delim"> </td>
|
| 476 |
-
<td class="tdelim">{#style_dlg.style}</td>
|
| 477 |
-
<td class="tdelim delim"> </td>
|
| 478 |
-
<td class="tdelim">{#style_dlg.width}</td>
|
| 479 |
-
<td class="tdelim delim"> </td>
|
| 480 |
-
<td class="tdelim">{#style_dlg.color}</td>
|
| 481 |
-
</tr>
|
| 482 |
-
|
| 483 |
-
<tr>
|
| 484 |
-
<td> </td>
|
| 485 |
-
<td class="delim"> </td>
|
| 486 |
-
<td><input type="checkbox" id="border_style_same" name="border_style_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_style');" /> <label for="border_style_same">{#style_dlg.same}</label></td>
|
| 487 |
-
<td class="delim"> </td>
|
| 488 |
-
<td><input type="checkbox" id="border_width_same" name="border_width_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_width');" /> <label for="border_width_same">{#style_dlg.same}</label></td>
|
| 489 |
-
<td class="delim"> </td>
|
| 490 |
-
<td><input type="checkbox" id="border_color_same" name="border_color_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_color');" /> <label for="border_color_same">{#style_dlg.same}</label></td>
|
| 491 |
-
</tr>
|
| 492 |
-
|
| 493 |
-
<tr>
|
| 494 |
-
<td>{#style_dlg.top}</td>
|
| 495 |
-
<td class="delim"> </td>
|
| 496 |
-
<td><select id="border_style_top" name="border_style_top" class="mceEditableSelect"></select></td>
|
| 497 |
-
<td class="delim"> </td>
|
| 498 |
-
<td>
|
| 499 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 500 |
-
<tr>
|
| 501 |
-
<td><select id="border_width_top" name="border_width_top" class="mceEditableSelect"></select></td>
|
| 502 |
-
<td> </td>
|
| 503 |
-
<td>
|
| 504 |
-
<label id="border_width_top_measurement_label" for="border_width_top_measurement" style="display: none; visibility: hidden;">Width top Measurement Unit</label>
|
| 505 |
-
<select id="border_width_top_measurement" name="border_width_top_measurement" aria-labelledby="border_width_top_measurement_label"></select>
|
| 506 |
-
</td>
|
| 507 |
-
</tr>
|
| 508 |
-
</table>
|
| 509 |
-
</td>
|
| 510 |
-
<td class="delim"> </td>
|
| 511 |
-
<td>
|
| 512 |
-
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
| 513 |
-
<tr>
|
| 514 |
-
<td><input id="border_color_top" name="border_color_top" type="text" value="" size="9" onChange="updateColor('border_color_top_pick','border_color_top');" /></td>
|
| 515 |
-
<td id="border_color_top_pickcontainer"> </td>
|
| 516 |
-
</tr>
|
| 517 |
-
</table>
|
| 518 |
-
</td>
|
| 519 |
-
</tr>
|
| 520 |
-
|
| 521 |
-
<tr>
|
| 522 |
-
<td>{#style_dlg.right}</td>
|
| 523 |
-
<td class="delim"> </td>
|
| 524 |
-
<td><select id="border_style_right" name="border_style_right" class="mceEditableSelect" disabled="disabled"></select></td>
|
| 525 |
-
<td class="delim"> </td>
|
| 526 |
-
<td>
|
| 527 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 528 |
-
<tr>
|
| 529 |
-
<td><select id="border_width_right" name="border_width_right" class="mceEditableSelect" disabled="disabled"></select></td>
|
| 530 |
-
<td> </td>
|
| 531 |
-
<td>
|
| 532 |
-
<label id="border_width_right_measurement_label" for="border_width_right_measurement" style="display: none; visibility: hidden;">Width Right Measurement Unit</label>
|
| 533 |
-
<select id="border_width_right_measurement" name="border_width_right_measurement" disabled="disabled" aria-labelledby="border_width_right_measurement_label"></select>
|
| 534 |
-
</td>
|
| 535 |
-
</tr>
|
| 536 |
-
</table>
|
| 537 |
-
</td>
|
| 538 |
-
<td class="delim"> </td>
|
| 539 |
-
<td>
|
| 540 |
-
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
| 541 |
-
<tr>
|
| 542 |
-
<td><input id="border_color_right" name="border_color_right" type="text" value="" size="9" onChange="updateColor('border_color_right_pick','border_color_right');" disabled="disabled" /></td>
|
| 543 |
-
<td id="border_color_right_pickcontainer"> </td>
|
| 544 |
-
</tr>
|
| 545 |
-
</table>
|
| 546 |
-
</td>
|
| 547 |
-
</tr>
|
| 548 |
-
|
| 549 |
-
<tr>
|
| 550 |
-
<td>{#style_dlg.bottom}</td>
|
| 551 |
-
<td class="delim"> </td>
|
| 552 |
-
<td><select id="border_style_bottom" name="border_style_bottom" class="mceEditableSelect" disabled="disabled"></select></td>
|
| 553 |
-
<td class="delim"> </td>
|
| 554 |
-
<td>
|
| 555 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 556 |
-
<tr>
|
| 557 |
-
<td><select id="border_width_bottom" name="border_width_bottom" class="mceEditableSelect" disabled="disabled"></select></td>
|
| 558 |
-
<td> </td>
|
| 559 |
-
<td>
|
| 560 |
-
<label id="border_width_bottom_measurement_label" for="border_width_bottom_measurement" style="display: none; visibility: hidden;">Width Bottom Measurement Unit</label>
|
| 561 |
-
<select id="border_width_bottom_measurement" name="border_width_bottom_measurement" disabled="disabled" aria-labelledby="border_width_bottom_measurement_label"></select>
|
| 562 |
-
</td>
|
| 563 |
-
</tr>
|
| 564 |
-
</table>
|
| 565 |
-
</td>
|
| 566 |
-
<td class="delim"> </td>
|
| 567 |
-
<td>
|
| 568 |
-
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
| 569 |
-
<tr>
|
| 570 |
-
<td><input id="border_color_bottom" name="border_color_bottom" type="text" value="" size="9" onChange="updateColor('border_color_bottom_pick','border_color_bottom');" disabled="disabled" /></td>
|
| 571 |
-
<td id="border_color_bottom_pickcontainer"> </td>
|
| 572 |
-
</tr>
|
| 573 |
-
</table>
|
| 574 |
-
</td>
|
| 575 |
-
</tr>
|
| 576 |
-
|
| 577 |
-
<tr>
|
| 578 |
-
<td>{#style_dlg.left}</td>
|
| 579 |
-
<td class="delim"> </td>
|
| 580 |
-
<td><select id="border_style_left" name="border_style_left" class="mceEditableSelect" disabled="disabled"></select></td>
|
| 581 |
-
<td class="delim"> </td>
|
| 582 |
-
<td>
|
| 583 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 584 |
-
<tr>
|
| 585 |
-
<td><select id="border_width_left" name="border_width_left" class="mceEditableSelect" disabled="disabled"></select></td>
|
| 586 |
-
<td> </td>
|
| 587 |
-
<td>
|
| 588 |
-
<label id="border_width_left_measurement_label" for="border_width_left_measurement" style="display: none; visibility: hidden;">Width Left Measurement Unit</label>
|
| 589 |
-
<select id="border_width_left_measurement" name="border_width_left_measurement" disabled="disabled" aria-labelledby="border_width_left_measurement_label"></select>
|
| 590 |
-
</td>
|
| 591 |
-
</tr>
|
| 592 |
-
</table>
|
| 593 |
-
</td>
|
| 594 |
-
<td class="delim"> </td>
|
| 595 |
-
<td>
|
| 596 |
-
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
| 597 |
-
<tr>
|
| 598 |
-
<td><input id="border_color_left" name="border_color_left" type="text" value="" size="9" onChange="updateColor('border_color_left_pick','border_color_left');" disabled="disabled" /></td>
|
| 599 |
-
<td id="border_color_left_pickcontainer"> </td>
|
| 600 |
-
</tr>
|
| 601 |
-
</table>
|
| 602 |
-
</td>
|
| 603 |
-
</tr>
|
| 604 |
-
</table>
|
| 605 |
-
</fieldset>
|
| 606 |
-
</div>
|
| 607 |
-
|
| 608 |
-
<div id="list_panel" class="panel">
|
| 609 |
-
<fieldset>
|
| 610 |
-
<legend>{#style_dlg.list}</legend>
|
| 611 |
-
<table role="presentation" border="0">
|
| 612 |
-
<tr>
|
| 613 |
-
<td><label for="list_type">{#style_dlg.list_type}</label></td>
|
| 614 |
-
<td><select id="list_type" name="list_type" class="mceEditableSelect"></select></td>
|
| 615 |
-
</tr>
|
| 616 |
-
|
| 617 |
-
<tr>
|
| 618 |
-
<td><label for="list_bullet_image">{#style_dlg.bullet_image}</label></td>
|
| 619 |
-
<td><input id="list_bullet_image" name="list_bullet_image" type="text" /></td>
|
| 620 |
-
</tr>
|
| 621 |
-
|
| 622 |
-
<tr>
|
| 623 |
-
<td><label for="list_position">{#style_dlg.position}</label></td>
|
| 624 |
-
<td><select id="list_position" name="list_position" class="mceEditableSelect"></select></td>
|
| 625 |
-
</tr>
|
| 626 |
-
</table>
|
| 627 |
-
</fieldset>
|
| 628 |
-
</div>
|
| 629 |
-
|
| 630 |
-
<div id="positioning_panel" class="panel">
|
| 631 |
-
<fieldset>
|
| 632 |
-
<legend>{#style_dlg.position}</legend>
|
| 633 |
-
<table role="presentation" border="0">
|
| 634 |
-
<tr>
|
| 635 |
-
<td><label for="positioning_type">{#style_dlg.positioning_type}</label></td>
|
| 636 |
-
<td><select id="positioning_type" name="positioning_type" class="mceEditableSelect"></select></td>
|
| 637 |
-
<td> <label for="positioning_visibility">{#style_dlg.visibility}</label></td>
|
| 638 |
-
<td><select id="positioning_visibility" name="positioning_visibility" class="mceEditableSelect"></select></td>
|
| 639 |
-
</tr>
|
| 640 |
-
|
| 641 |
-
<tr>
|
| 642 |
-
<td><label for="positioning_width">{#style_dlg.width}</label></td>
|
| 643 |
-
<td>
|
| 644 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 645 |
-
<tr>
|
| 646 |
-
<td><input type="text" id="positioning_width" name="positioning_width" onChange="synch('positioning_width','box_width');" /></td>
|
| 647 |
-
<td> </td>
|
| 648 |
-
<td>
|
| 649 |
-
<label id="positioning_width_measurement_label" for="positioning_width_measurement" style="display: none; visibility: hidden;">Positioning width Measurement Unit</label>
|
| 650 |
-
<select id="positioning_width_measurement" name="positioning_width_measurement" aria-labelledby="positioning_width_measurement_label"></select>
|
| 651 |
-
</td>
|
| 652 |
-
</tr>
|
| 653 |
-
</table>
|
| 654 |
-
</td>
|
| 655 |
-
<td> <label for="positioning_zindex">{#style_dlg.zindex}</label></td>
|
| 656 |
-
<td><input type="text" id="positioning_zindex" name="positioning_zindex" /></td>
|
| 657 |
-
</tr>
|
| 658 |
-
|
| 659 |
-
<tr>
|
| 660 |
-
<td><label for="positioning_height">{#style_dlg.height}</label></td>
|
| 661 |
-
<td>
|
| 662 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 663 |
-
<tr>
|
| 664 |
-
<td><input type="text" id="positioning_height" name="positioning_height" onChange="synch('positioning_height','box_height');" /></td>
|
| 665 |
-
<td> </td>
|
| 666 |
-
<td>
|
| 667 |
-
<label id="positioning_height_measurement_label" for="positioning_height_measurement" style="display: none; visibility: hidden;">Positioning Height Measurement Unit</label>
|
| 668 |
-
<select id="positioning_height_measurement" name="positioning_height_measurement" aria-labelledby="positioning_height_measurement_label"></select>
|
| 669 |
-
</td>
|
| 670 |
-
</tr>
|
| 671 |
-
</table>
|
| 672 |
-
</td>
|
| 673 |
-
<td> <label for="positioning_overflow">{#style_dlg.overflow}</label></td>
|
| 674 |
-
<td><select id="positioning_overflow" name="positioning_overflow" class="mceEditableSelect"></select></td>
|
| 675 |
-
</tr>
|
| 676 |
-
</table>
|
| 677 |
-
</fieldset>
|
| 678 |
-
|
| 679 |
-
<div style="float: left; width: 49%">
|
| 680 |
-
<fieldset>
|
| 681 |
-
<legend>{#style_dlg.placement}</legend>
|
| 682 |
-
|
| 683 |
-
<table role="presentation" border="0">
|
| 684 |
-
<tr>
|
| 685 |
-
<td> </td>
|
| 686 |
-
<td><input type="checkbox" id="positioning_placement_same" name="positioning_placement_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_placement');" /> <label for="positioning_placement_same">{#style_dlg.same}</label></td>
|
| 687 |
-
</tr>
|
| 688 |
-
<tr>
|
| 689 |
-
<td>{#style_dlg.top}</td>
|
| 690 |
-
<td>
|
| 691 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 692 |
-
<tr>
|
| 693 |
-
<td><input type="text" id="positioning_placement_top" name="positioning_placement_top" /></td>
|
| 694 |
-
<td> </td>
|
| 695 |
-
<td>
|
| 696 |
-
<label id="positioning_placement_top_measurement_label" for="positioning_placement_top_measurement" style="display: none; visibility: hidden;">Placement Top Measurement Unit</label>
|
| 697 |
-
<select id="positioning_placement_top_measurement" name="positioning_placement_top_measurement" aria-labelledby="positioning_placement_top_measurement_label"></select>
|
| 698 |
-
</td>
|
| 699 |
-
</tr>
|
| 700 |
-
</table>
|
| 701 |
-
</td>
|
| 702 |
-
</tr>
|
| 703 |
-
<tr>
|
| 704 |
-
<td>{#style_dlg.right}</td>
|
| 705 |
-
<td>
|
| 706 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 707 |
-
<tr>
|
| 708 |
-
<td><input type="text" id="positioning_placement_right" name="positioning_placement_right" disabled="disabled" /></td>
|
| 709 |
-
<td> </td>
|
| 710 |
-
<td>
|
| 711 |
-
<label id="positioning_placement_right_measurement_label" for="positioning_placement_right_measurement" style="display: none; visibility: hidden;">Placement Right Measurement Unit</label>
|
| 712 |
-
<select id="positioning_placement_right_measurement" name="positioning_placement_right_measurement" disabled="disabled" aria-labelledby="positioning_placement_right_measurement_label"></select>
|
| 713 |
-
</td>
|
| 714 |
-
</tr>
|
| 715 |
-
</table>
|
| 716 |
-
</td>
|
| 717 |
-
</tr>
|
| 718 |
-
<tr>
|
| 719 |
-
<td>{#style_dlg.bottom}</td>
|
| 720 |
-
<td>
|
| 721 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 722 |
-
<tr>
|
| 723 |
-
<td><input type="text" id="positioning_placement_bottom" name="positioning_placement_bottom" disabled="disabled" /></td>
|
| 724 |
-
<td> </td>
|
| 725 |
-
<td>
|
| 726 |
-
<label id="positioning_placement_bottom_measurement_label" for="positioning_placement_bottom_measurement" style="display: none; visibility: hidden;">Placement Bottom Measurement Unit</label>
|
| 727 |
-
<select id="positioning_placement_bottom_measurement" name="positioning_placement_bottom_measurement" disabled="disabled" aria-labelledby="positioning_placement_bottom_measurement_label"></select>
|
| 728 |
-
</td>
|
| 729 |
-
</tr>
|
| 730 |
-
</table>
|
| 731 |
-
</td>
|
| 732 |
-
</tr>
|
| 733 |
-
<tr>
|
| 734 |
-
<td>{#style_dlg.left}</td>
|
| 735 |
-
<td>
|
| 736 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 737 |
-
<tr>
|
| 738 |
-
<td><input type="text" id="positioning_placement_left" name="positioning_placement_left" disabled="disabled" /></td>
|
| 739 |
-
<td> </td>
|
| 740 |
-
<td>
|
| 741 |
-
<label id="positioning_placement_left_measurement_label" for="positioning_placement_left_measurement" style="display: none; visibility: hidden;">Placement Left Measurement Unit</label>
|
| 742 |
-
<select id="positioning_placement_left_measurement" name="positioning_placement_left_measurement" disabled="disabled" aria-labelledby="positioning_placement_left_measurement_label"></select>
|
| 743 |
-
</td>
|
| 744 |
-
</tr>
|
| 745 |
-
</table>
|
| 746 |
-
</td>
|
| 747 |
-
</tr>
|
| 748 |
-
</table>
|
| 749 |
-
</fieldset>
|
| 750 |
-
</div>
|
| 751 |
-
|
| 752 |
-
<div style="float: right; width: 49%">
|
| 753 |
-
<fieldset>
|
| 754 |
-
<legend>{#style_dlg.clip}</legend>
|
| 755 |
-
|
| 756 |
-
<table role="presentation" border="0">
|
| 757 |
-
<tr>
|
| 758 |
-
<td> </td>
|
| 759 |
-
<td><input type="checkbox" id="positioning_clip_same" name="positioning_clip_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_clip');" /> <label for="positioning_clip_same">{#style_dlg.same}</label></td>
|
| 760 |
-
</tr>
|
| 761 |
-
<tr>
|
| 762 |
-
<td>{#style_dlg.top}</td>
|
| 763 |
-
<td>
|
| 764 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 765 |
-
<tr>
|
| 766 |
-
<td><input type="text" id="positioning_clip_top" name="positioning_clip_top" /></td>
|
| 767 |
-
<td> </td>
|
| 768 |
-
<td>
|
| 769 |
-
<label id="positioning_clip_top_measurement_label" for="positioning_clip_top_measurement" style="display: none; visibility: hidden;">Clip Top Measurement Unit</label>
|
| 770 |
-
<select id="positioning_clip_top_measurement" name="positioning_clip_top_measurement" aria-labelledby="positioning_clip_top_measurement_label"></select>
|
| 771 |
-
</td>
|
| 772 |
-
</tr>
|
| 773 |
-
</table>
|
| 774 |
-
</td>
|
| 775 |
-
</tr>
|
| 776 |
-
<tr>
|
| 777 |
-
<td>{#style_dlg.right}</td>
|
| 778 |
-
<td>
|
| 779 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 780 |
-
<tr>
|
| 781 |
-
<td><input type="text" id="positioning_clip_right" name="positioning_clip_right" disabled="disabled" /></td>
|
| 782 |
-
<td> </td>
|
| 783 |
-
<td>
|
| 784 |
-
<label id="positioning_clip_right_measurement_label" for="positioning_clip_right_measurement" style="display: none; visibility: hidden;">Clip Right Measurement Unit</label>
|
| 785 |
-
<select id="positioning_clip_right_measurement" name="positioning_clip_right_measurement" disabled="disabled" aria-labelledby="positioning_clip_right_measurement_label"></select>
|
| 786 |
-
</td>
|
| 787 |
-
</tr>
|
| 788 |
-
</table>
|
| 789 |
-
</td>
|
| 790 |
-
</tr>
|
| 791 |
-
<tr>
|
| 792 |
-
<td>{#style_dlg.bottom}</td>
|
| 793 |
-
<td>
|
| 794 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 795 |
-
<tr>
|
| 796 |
-
<td><input type="text" id="positioning_clip_bottom" name="positioning_clip_bottom" disabled="disabled" /></td>
|
| 797 |
-
<td> </td>
|
| 798 |
-
<td>
|
| 799 |
-
<label id="positioning_clip_bottom_measurement_label" for="positioning_clip_bottom_measurement" style="display: none; visibility: hidden;">Clip Bottom Measurement Unit</label>
|
| 800 |
-
<select id="positioning_clip_bottom_measurement" name="positioning_clip_bottom_measurement" disabled="disabled" aria-labelledby="positioning_clip_bottom_measurement_label"></select>
|
| 801 |
-
</td>
|
| 802 |
-
</tr>
|
| 803 |
-
</table>
|
| 804 |
-
</td>
|
| 805 |
-
</tr>
|
| 806 |
-
<tr>
|
| 807 |
-
<td>{#style_dlg.left}</td>
|
| 808 |
-
<td>
|
| 809 |
-
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 810 |
-
<tr>
|
| 811 |
-
<td><input type="text" id="positioning_clip_left" name="positioning_clip_left" disabled="disabled" /></td>
|
| 812 |
-
<td> </td>
|
| 813 |
-
<td>
|
| 814 |
-
<label id="positioning_clip_left_measurement_label" for="positioning_clip_left_measurement" style="display: none; visibility: hidden;">Clip Left Measurement Unit</label>
|
| 815 |
-
<select id="positioning_clip_left_measurement" name="positioning_clip_left_measurement" disabled="disabled" aria-labelledby="positioning_clip_left_measurement_label"></select>
|
| 816 |
-
</td>
|
| 817 |
-
</tr>
|
| 818 |
-
</table>
|
| 819 |
-
</td>
|
| 820 |
-
</tr>
|
| 821 |
-
</table>
|
| 822 |
-
</fieldset>
|
| 823 |
-
</div>
|
| 824 |
-
<br style="clear: both" />
|
| 825 |
-
</div>
|
| 826 |
-
</div>
|
| 827 |
-
|
| 828 |
-
<div class="panel_toggle_insert_span">
|
| 829 |
-
<input type="checkbox" class="checkbox" id="toggle_insert_span" name="toggle_insert_span" onClick="toggleApplyAction();" />
|
| 830 |
-
<label for="toggle_insert_span">{#style_dlg.toggle_insert_span}</label>
|
| 831 |
-
</div>
|
| 832 |
-
|
| 833 |
-
<div class="mceActionPanel">
|
| 834 |
-
<input type="submit" id="insert" name="insert" value="{#update}" />
|
| 835 |
-
<input type="button" class="button" id="apply" name="apply" value="{#style_dlg.apply}" onClick="applyAction();" />
|
| 836 |
-
<input type="button" id="cancel" name="cancel" value="{#cancel}" onClick="tinyMCEPopup.close();" />
|
| 837 |
-
</div>
|
| 838 |
-
</form>
|
| 839 |
-
|
| 840 |
-
<div style="display: none">
|
| 841 |
-
<div id="container"></div>
|
| 842 |
-
</div>
|
| 843 |
-
|
| 844 |
-
</body>
|
| 845 |
-
</html>
|
| 1 |
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
| 2 |
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
| 3 |
+
<head>
|
| 4 |
+
<title>{#style_dlg.title}</title>
|
| 5 |
+
<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
|
| 6 |
+
<script type="text/javascript" src="../../utils/mctabs.js"></script>
|
| 7 |
+
<script type="text/javascript" src="../../utils/editable_selects.js"></script>
|
| 8 |
+
<script type="text/javascript" src="../../utils/form_utils.js"></script>
|
| 9 |
+
<script type="text/javascript" src="js/props.js"></script>
|
| 10 |
+
<link href="css/props.css" rel="stylesheet" type="text/css" />
|
| 11 |
+
</head>
|
| 12 |
+
|
| 13 |
+
<body id="styleprops" style="display: none" role="application" aria-labelledby="app_title">
|
| 14 |
+
<span id="app_title" style="display:none">{#style_dlg.title}</span>
|
| 15 |
+
<form onsubmit="updateAction();return false;" action="#">
|
| 16 |
+
<div class="tabs">
|
| 17 |
+
<ul>
|
| 18 |
+
<li id="text_tab" class="current" aria-controls="text_panel"><span><a href="javascript:mcTabs.displayTab('text_tab','text_panel');" onMouseDown="return false;">{#style_dlg.text_tab}</a></span></li>
|
| 19 |
+
<li id="background_tab" aria-controls="background_panel"><span><a href="javascript:mcTabs.displayTab('background_tab','background_panel');" onMouseDown="return false;">{#style_dlg.background_tab}</a></span></li>
|
| 20 |
+
<li id="block_tab" aria-controls="block_panel"><span><a href="javascript:mcTabs.displayTab('block_tab','block_panel');" onMouseDown="return false;">{#style_dlg.block_tab}</a></span></li>
|
| 21 |
+
<li id="box_tab" aria-controls="box_panel"><span><a href="javascript:mcTabs.displayTab('box_tab','box_panel');" onMouseDown="return false;">{#style_dlg.box_tab}</a></span></li>
|
| 22 |
+
<li id="border_tab" aria-controls="border_panel"><span><a href="javascript:mcTabs.displayTab('border_tab','border_panel');" onMouseDown="return false;">{#style_dlg.border_tab}</a></span></li>
|
| 23 |
+
<li id="list_tab" aria-controls="list_panel"><span><a href="javascript:mcTabs.displayTab('list_tab','list_panel');" onMouseDown="return false;">{#style_dlg.list_tab}</a></span></li>
|
| 24 |
+
<li id="positioning_tab" aria-controls="positioning_panel"><span><a href="javascript:mcTabs.displayTab('positioning_tab','positioning_panel');" onMouseDown="return false;">{#style_dlg.positioning_tab}</a></span></li>
|
| 25 |
+
</ul>
|
| 26 |
+
</div>
|
| 27 |
+
|
| 28 |
+
<div class="panel_wrapper">
|
| 29 |
+
<div id="text_panel" class="panel current">
|
| 30 |
+
<fieldset>
|
| 31 |
+
<legend>{#style_dlg.text}</legend>
|
| 32 |
+
<table role="presentation" border="0" width="100%">
|
| 33 |
+
<tr>
|
| 34 |
+
<td><label for="text_font">{#style_dlg.text_font}</label></td>
|
| 35 |
+
<td colspan="3">
|
| 36 |
+
<select id="text_font" name="text_font" class="mceEditableSelect mceFocus"></select>
|
| 37 |
+
</td>
|
| 38 |
+
</tr>
|
| 39 |
+
<tr>
|
| 40 |
+
<td><label for="text_size">{#style_dlg.text_size}</label></td>
|
| 41 |
+
<td>
|
| 42 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 43 |
+
<tr>
|
| 44 |
+
<td><select id="text_size" name="text_size" class="mceEditableSelect"></select></td>
|
| 45 |
+
<td> </td>
|
| 46 |
+
<td>
|
| 47 |
+
<label id="text_size_measurement_label" for="text_size_measurement" style="display: none; visibility: hidden;">Text Size Measurement Unit</label>
|
| 48 |
+
<select id="text_size_measurement" name="text_size_measurement" aria-labelledby="text_size_measurement_label"></select>
|
| 49 |
+
</td>
|
| 50 |
+
</tr>
|
| 51 |
+
</table>
|
| 52 |
+
</td>
|
| 53 |
+
<td><label for="text_weight">{#style_dlg.text_weight}</label></td>
|
| 54 |
+
<td>
|
| 55 |
+
<select id="text_weight" name="text_weight"></select>
|
| 56 |
+
</td>
|
| 57 |
+
</tr>
|
| 58 |
+
<tr>
|
| 59 |
+
<td><label for="text_style">{#style_dlg.text_style}</label></td>
|
| 60 |
+
<td>
|
| 61 |
+
<select id="text_style" name="text_style" class="mceEditableSelect"></select>
|
| 62 |
+
</td>
|
| 63 |
+
<td><label for="text_variant">{#style_dlg.text_variant}</label></td>
|
| 64 |
+
<td>
|
| 65 |
+
<select id="text_variant" name="text_variant"></select>
|
| 66 |
+
</td>
|
| 67 |
+
</tr>
|
| 68 |
+
<tr>
|
| 69 |
+
<td><label for="text_lineheight">{#style_dlg.text_lineheight}</label></td>
|
| 70 |
+
<td>
|
| 71 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 72 |
+
<tr>
|
| 73 |
+
<td>
|
| 74 |
+
<select id="text_lineheight" name="text_lineheight" class="mceEditableSelect"></select>
|
| 75 |
+
</td>
|
| 76 |
+
<td> </td>
|
| 77 |
+
<td>
|
| 78 |
+
<label id="text_lineheight_measurement_label" for="text_lineheight_measurement" style="display: none; visibility: hidden;">Line Height Measurement Unit</label>
|
| 79 |
+
<select id="text_lineheight_measurement" name="text_lineheight_measurement" aria-labelledby="text_lineheight_measurement_label"></select>
|
| 80 |
+
</td>
|
| 81 |
+
</tr>
|
| 82 |
+
</table>
|
| 83 |
+
</td>
|
| 84 |
+
<td><label for="text_case">{#style_dlg.text_case}</label></td>
|
| 85 |
+
<td>
|
| 86 |
+
<select id="text_case" name="text_case"></select>
|
| 87 |
+
</td>
|
| 88 |
+
</tr>
|
| 89 |
+
<tr>
|
| 90 |
+
<td><label for="text_color">{#style_dlg.text_color}</label></td>
|
| 91 |
+
<td colspan="2">
|
| 92 |
+
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
| 93 |
+
<tr>
|
| 94 |
+
<td><input id="text_color" name="text_color" type="text" value="" size="9" onChange="updateColor('text_color_pick','text_color');" /></td>
|
| 95 |
+
<td id="text_color_pickcontainer"> </td>
|
| 96 |
+
</tr>
|
| 97 |
+
</table>
|
| 98 |
+
</td>
|
| 99 |
+
</tr>
|
| 100 |
+
<tr>
|
| 101 |
+
<td valign="top" style="vertical-align: top; padding-top: 3px;">{#style_dlg.text_decoration}</td>
|
| 102 |
+
<td colspan="2">
|
| 103 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 104 |
+
<tr>
|
| 105 |
+
<td><input id="text_underline" name="text_underline" class="checkbox" type="checkbox" /></td>
|
| 106 |
+
<td><label for="text_underline">{#style_dlg.text_underline}</label></td>
|
| 107 |
+
</tr>
|
| 108 |
+
<tr>
|
| 109 |
+
<td><input id="text_overline" name="text_overline" class="checkbox" type="checkbox" /></td>
|
| 110 |
+
<td><label for="text_overline">{#style_dlg.text_overline}</label></td>
|
| 111 |
+
</tr>
|
| 112 |
+
<tr>
|
| 113 |
+
<td><input id="text_linethrough" name="text_linethrough" class="checkbox" type="checkbox" /></td>
|
| 114 |
+
<td><label for="text_linethrough">{#style_dlg.text_striketrough}</label></td>
|
| 115 |
+
</tr>
|
| 116 |
+
<tr>
|
| 117 |
+
<td><input id="text_blink" name="text_blink" class="checkbox" type="checkbox" /></td>
|
| 118 |
+
<td><label for="text_blink">{#style_dlg.text_blink}</label></td>
|
| 119 |
+
</tr>
|
| 120 |
+
<tr>
|
| 121 |
+
<td><input id="text_none" name="text_none" class="checkbox" type="checkbox" onclick="updateTextDecorations();"/></td>
|
| 122 |
+
<td><label for="text_none">{#style_dlg.text_none}</label></td>
|
| 123 |
+
</tr>
|
| 124 |
+
</table>
|
| 125 |
+
</td>
|
| 126 |
+
</tr>
|
| 127 |
+
</table>
|
| 128 |
+
</fieldset>
|
| 129 |
+
</div>
|
| 130 |
+
|
| 131 |
+
<div id="background_panel" class="panel">
|
| 132 |
+
<fieldset>
|
| 133 |
+
<legend>{#style_dlg.background}</legend>
|
| 134 |
+
<table role="presentation" border="0">
|
| 135 |
+
<tr>
|
| 136 |
+
<td><label for="background_color">{#style_dlg.background_color}</label></td>
|
| 137 |
+
<td>
|
| 138 |
+
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
| 139 |
+
<tr>
|
| 140 |
+
<td><input id="background_color" name="background_color" type="text" value="" size="9" onChange="updateColor('background_color_pick','background_color');" /></td>
|
| 141 |
+
<td id="background_color_pickcontainer"> </td>
|
| 142 |
+
</tr>
|
| 143 |
+
</table>
|
| 144 |
+
</td>
|
| 145 |
+
</tr>
|
| 146 |
+
|
| 147 |
+
<tr>
|
| 148 |
+
<td><label for="background_image">{#style_dlg.background_image}</label></td>
|
| 149 |
+
<td><table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 150 |
+
<tr>
|
| 151 |
+
<td><input id="background_image" name="background_image" type="text" /></td>
|
| 152 |
+
<td id="background_image_browser"> </td>
|
| 153 |
+
</tr>
|
| 154 |
+
</table>
|
| 155 |
+
</td>
|
| 156 |
+
</tr>
|
| 157 |
+
|
| 158 |
+
<tr>
|
| 159 |
+
<td><label for="background_repeat">{#style_dlg.background_repeat}</label></td>
|
| 160 |
+
<td><select id="background_repeat" name="background_repeat" class="mceEditableSelect"></select></td>
|
| 161 |
+
</tr>
|
| 162 |
+
|
| 163 |
+
<tr>
|
| 164 |
+
<td><label for="background_attachment">{#style_dlg.background_attachment}</label></td>
|
| 165 |
+
<td><select id="background_attachment" name="background_attachment" class="mceEditableSelect"></select></td>
|
| 166 |
+
</tr>
|
| 167 |
+
|
| 168 |
+
<tr>
|
| 169 |
+
<td><label for="background_hpos">{#style_dlg.background_hpos}</label></td>
|
| 170 |
+
<td>
|
| 171 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 172 |
+
<tr>
|
| 173 |
+
<td><select id="background_hpos" name="background_hpos" class="mceEditableSelect"></select></td>
|
| 174 |
+
<td> </td>
|
| 175 |
+
<td>
|
| 176 |
+
<label id="background_hpos_measurement_label" for="background_hpos_measurement" style="display: none; visibility: hidden;">Horizontal position measurement unit</label>
|
| 177 |
+
<select id="background_hpos_measurement" name="background_hpos_measurement" aria-labelledby="background_hpos_measurement_label"></select>
|
| 178 |
+
</td>
|
| 179 |
+
</tr>
|
| 180 |
+
</table>
|
| 181 |
+
</td>
|
| 182 |
+
</tr>
|
| 183 |
+
|
| 184 |
+
<tr>
|
| 185 |
+
<td><label for="background_vpos">{#style_dlg.background_vpos}</label></td>
|
| 186 |
+
<td>
|
| 187 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 188 |
+
<tr>
|
| 189 |
+
<td><select id="background_vpos" name="background_vpos" class="mceEditableSelect"></select></td>
|
| 190 |
+
<td> </td>
|
| 191 |
+
<td>
|
| 192 |
+
|
| 193 |
+
<label id="background_vpos_measurement_label" for="background_vpos_measurement" style="display: none; visibility: hidden;">Vertical position measurement unit</label>
|
| 194 |
+
<select id="background_vpos_measurement" name="background_vpos_measurement" aria-labelledby="background_vpos_measurement_label">></select></td>
|
| 195 |
+
</tr>
|
| 196 |
+
</table>
|
| 197 |
+
</td>
|
| 198 |
+
</tr>
|
| 199 |
+
</table>
|
| 200 |
+
</fieldset>
|
| 201 |
+
</div>
|
| 202 |
+
|
| 203 |
+
<div id="block_panel" class="panel">
|
| 204 |
+
<fieldset>
|
| 205 |
+
<legend>{#style_dlg.block}</legend>
|
| 206 |
+
<table role="presentation" border="0">
|
| 207 |
+
<tr>
|
| 208 |
+
<td><label for="block_wordspacing">{#style_dlg.block_wordspacing}</label></td>
|
| 209 |
+
<td>
|
| 210 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 211 |
+
<tr>
|
| 212 |
+
<td><select id="block_wordspacing" name="block_wordspacing" class="mceEditableSelect"></select></td>
|
| 213 |
+
<td> </td>
|
| 214 |
+
<td>
|
| 215 |
+
<label id="block_wordspacing_measurement_label" for="block_wordspacing_measurement" style="display: none; visibility: hidden;">Word spacing measurement unit</label>
|
| 216 |
+
<select id="block_wordspacing_measurement" name="block_wordspacing_measurement" aria-labelledby="block_wordspacing_measurement_label"></select>
|
| 217 |
+
</td>
|
| 218 |
+
</tr>
|
| 219 |
+
</table>
|
| 220 |
+
</td>
|
| 221 |
+
</tr>
|
| 222 |
+
|
| 223 |
+
<tr>
|
| 224 |
+
<td><label for="block_letterspacing">{#style_dlg.block_letterspacing}</label></td>
|
| 225 |
+
<td>
|
| 226 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 227 |
+
<tr>
|
| 228 |
+
<td><select id="block_letterspacing" name="block_letterspacing" class="mceEditableSelect"></select></td>
|
| 229 |
+
<td> </td>
|
| 230 |
+
<td>
|
| 231 |
+
<label id="block_letterspacing_measurement_label" for="block_letterspacing_measurement" style="display: none; visibility: hidden;">Letter spacing measurement unit</label>
|
| 232 |
+
<select id="block_letterspacing_measurement" name="block_letterspacing_measurement" aria-labelledby="block_letterspacing_measurement_label"></select>
|
| 233 |
+
</td>
|
| 234 |
+
</tr>
|
| 235 |
+
</table>
|
| 236 |
+
</td>
|
| 237 |
+
</tr>
|
| 238 |
+
|
| 239 |
+
<tr>
|
| 240 |
+
<td><label for="block_vertical_alignment">{#style_dlg.block_vertical_alignment}</label></td>
|
| 241 |
+
<td><select id="block_vertical_alignment" name="block_vertical_alignment" class="mceEditableSelect"></select></td>
|
| 242 |
+
</tr>
|
| 243 |
+
|
| 244 |
+
<tr>
|
| 245 |
+
<td><label for="block_text_align">{#style_dlg.block_text_align}</label></td>
|
| 246 |
+
<td><select id="block_text_align" name="block_text_align" class="mceEditableSelect"></select></td>
|
| 247 |
+
</tr>
|
| 248 |
+
|
| 249 |
+
<tr>
|
| 250 |
+
<td><label for="block_text_indent">{#style_dlg.block_text_indent}</label></td>
|
| 251 |
+
<td>
|
| 252 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 253 |
+
<tr>
|
| 254 |
+
<td><input type="text" id="block_text_indent" name="block_text_indent" /></td>
|
| 255 |
+
<td> </td>
|
| 256 |
+
<td>
|
| 257 |
+
<label id="block_text_indent_measurement_label" for="block_text_indent_measurement" style="display: none; visibility: hidden;">Text Indent Measurement Unit</label>
|
| 258 |
+
|
| 259 |
+
<select id="block_text_indent_measurement" name="block_text_indent_measurement" aria-labelledby="block_text_indent_measurement_label"></select>
|
| 260 |
+
</td>
|
| 261 |
+
</tr>
|
| 262 |
+
</table>
|
| 263 |
+
</td>
|
| 264 |
+
</tr>
|
| 265 |
+
|
| 266 |
+
<tr>
|
| 267 |
+
<td><label for="block_whitespace">{#style_dlg.block_whitespace}</label></td>
|
| 268 |
+
<td><select id="block_whitespace" name="block_whitespace" class="mceEditableSelect"></select></td>
|
| 269 |
+
</tr>
|
| 270 |
+
|
| 271 |
+
<tr>
|
| 272 |
+
<td><label for="block_display">{#style_dlg.block_display}</label></td>
|
| 273 |
+
<td><select id="block_display" name="block_display" class="mceEditableSelect"></select></td>
|
| 274 |
+
</tr>
|
| 275 |
+
</table>
|
| 276 |
+
</fieldset>
|
| 277 |
+
</div>
|
| 278 |
+
|
| 279 |
+
<div id="box_panel" class="panel">
|
| 280 |
+
<fieldset>
|
| 281 |
+
<legend>{#style_dlg.box}</legend>
|
| 282 |
+
<table role="presentation" border="0">
|
| 283 |
+
<tr>
|
| 284 |
+
<td><label for="box_width">{#style_dlg.box_width}</label></td>
|
| 285 |
+
<td>
|
| 286 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 287 |
+
<tr>
|
| 288 |
+
<td><input type="text" id="box_width" name="box_width" class="mceEditableSelect" onChange="synch('box_width','positioning_width');" /></td>
|
| 289 |
+
<td> </td>
|
| 290 |
+
<td>
|
| 291 |
+
<label id="box_width_measurement_label" for="box_width_measurement" style="display: none; visibility: hidden;">Box Width Measurement Unit</label>
|
| 292 |
+
<select id="box_width_measurement" name="box_width_measurement" aria-labelledby="box_width_measurement_label"></select>
|
| 293 |
+
</td>
|
| 294 |
+
</tr>
|
| 295 |
+
</table>
|
| 296 |
+
</td>
|
| 297 |
+
<td> <label for="box_float">{#style_dlg.box_float}</label></td>
|
| 298 |
+
<td><select id="box_float" name="box_float" class="mceEditableSelect"></select></td>
|
| 299 |
+
</tr>
|
| 300 |
+
|
| 301 |
+
<tr>
|
| 302 |
+
<td><label for="box_height">{#style_dlg.box_height}</label></td>
|
| 303 |
+
<td>
|
| 304 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 305 |
+
<tr>
|
| 306 |
+
<td><input type="text" id="box_height" name="box_height" class="mceEditableSelect" onChange="synch('box_height','positioning_height');" /></td>
|
| 307 |
+
<td> </td>
|
| 308 |
+
<td>
|
| 309 |
+
<label id="box_height_measurement_label" for="box_height_measurement" style="display: none; visibility: hidden;">Box Height Measurement Unit</label>
|
| 310 |
+
<select id="box_height_measurement" name="box_height_measurement" aria-labelledby="box_height_measurement_label"></select>
|
| 311 |
+
</td>
|
| 312 |
+
</tr>
|
| 313 |
+
</table>
|
| 314 |
+
</td>
|
| 315 |
+
<td> <label for="box_clear">{#style_dlg.box_clear}</label></td>
|
| 316 |
+
<td><select id="box_clear" name="box_clear" class="mceEditableSelect"></select></td>
|
| 317 |
+
</tr>
|
| 318 |
+
</table>
|
| 319 |
+
</fieldset>
|
| 320 |
+
|
| 321 |
+
<div style="float: left; width: 49%">
|
| 322 |
+
<fieldset>
|
| 323 |
+
<legend>{#style_dlg.padding}</legend>
|
| 324 |
+
|
| 325 |
+
<table role="presentation" border="0">
|
| 326 |
+
<tr>
|
| 327 |
+
<td> </td>
|
| 328 |
+
<td><input type="checkbox" id="box_padding_same" name="box_padding_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_padding');" /> <label for="box_padding_same">{#style_dlg.same}</label></td>
|
| 329 |
+
</tr>
|
| 330 |
+
<tr>
|
| 331 |
+
<td><label for="box_padding_top">{#style_dlg.top}</label></td>
|
| 332 |
+
<td>
|
| 333 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 334 |
+
<tr>
|
| 335 |
+
<td><input type="text" id="box_padding_top" name="box_padding_top" class="mceEditableSelect" /></td>
|
| 336 |
+
<td> </td>
|
| 337 |
+
<td>
|
| 338 |
+
<label id="box_padding_top_measurement_label" for="box_padding_top_measurement" style="display: none; visibility: hidden;">Padding Top Measurement Unit</label>
|
| 339 |
+
<select id="box_padding_top_measurement" name="box_padding_top_measurement" aria-labelledby="box_padding_top_measurement_label"></select>
|
| 340 |
+
</td>
|
| 341 |
+
</tr>
|
| 342 |
+
</table>
|
| 343 |
+
</td>
|
| 344 |
+
</tr>
|
| 345 |
+
<tr>
|
| 346 |
+
<td><label for="box_padding_right">{#style_dlg.right}</label></td>
|
| 347 |
+
<td>
|
| 348 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 349 |
+
<tr>
|
| 350 |
+
<td><input type="text" id="box_padding_right" name="box_padding_right" class="mceEditableSelect" disabled="disabled" /></td>
|
| 351 |
+
<td> </td>
|
| 352 |
+
<td>
|
| 353 |
+
<label id="box_padding_right_measurement_label" for="box_padding_right_measurement" style="display: none; visibility: hidden;">Padding Right Measurement Unit</label>
|
| 354 |
+
<select id="box_padding_right_measurement" name="box_padding_right_measurement" disabled="disabled" aria-labelledby="box_padding_right_measurement_label"></select>
|
| 355 |
+
</td>
|
| 356 |
+
</tr>
|
| 357 |
+
</table>
|
| 358 |
+
</td>
|
| 359 |
+
</tr>
|
| 360 |
+
<tr>
|
| 361 |
+
<td><label for="box_padding_bottom">{#style_dlg.bottom}</label></td>
|
| 362 |
+
<td>
|
| 363 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 364 |
+
<tr>
|
| 365 |
+
<td><input type="text" id="box_padding_bottom" name="box_padding_bottom" class="mceEditableSelect" disabled="disabled" /></td>
|
| 366 |
+
<td> </td>
|
| 367 |
+
<td>
|
| 368 |
+
<label id="box_padding_bottom_measurement_label" for="box_padding_bottom_measurement" style="display: none; visibility: hidden;">Padding Bottom Measurement Unit</label>
|
| 369 |
+
<select id="box_padding_bottom_measurement" name="box_padding_bottom_measurement" disabled="disabled" aria-labelledby="box_padding_bottom_measurement_label"></select>
|
| 370 |
+
</td>
|
| 371 |
+
</tr>
|
| 372 |
+
</table>
|
| 373 |
+
</td>
|
| 374 |
+
</tr>
|
| 375 |
+
<tr>
|
| 376 |
+
<td><label for="box_padding_left">{#style_dlg.left}</label></td>
|
| 377 |
+
<td>
|
| 378 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 379 |
+
<tr>
|
| 380 |
+
<td><input type="text" id="box_padding_left" name="box_padding_left" class="mceEditableSelect" disabled="disabled" /></td>
|
| 381 |
+
<td> </td>
|
| 382 |
+
<td>
|
| 383 |
+
<label id="box_padding_left_measurement_label" for="box_padding_left_measurement" style="display: none; visibility: hidden;">Padding Left Measurement Unit</label>
|
| 384 |
+
<select id="box_padding_left_measurement" name="box_padding_left_measurement" disabled="disabled" aria-labelledby="box_padding_left_measurement_label"></select>
|
| 385 |
+
</td>
|
| 386 |
+
</tr>
|
| 387 |
+
</table>
|
| 388 |
+
</td>
|
| 389 |
+
</tr>
|
| 390 |
+
</table>
|
| 391 |
+
</fieldset>
|
| 392 |
+
</div>
|
| 393 |
+
|
| 394 |
+
<div style="float: right; width: 49%">
|
| 395 |
+
<fieldset>
|
| 396 |
+
<legend>{#style_dlg.margin}</legend>
|
| 397 |
+
|
| 398 |
+
<table role="presentation" border="0">
|
| 399 |
+
<tr>
|
| 400 |
+
<td> </td>
|
| 401 |
+
<td><input type="checkbox" id="box_margin_same" name="box_margin_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_margin');" /> <label for="box_margin_same">{#style_dlg.same}</label></td>
|
| 402 |
+
</tr>
|
| 403 |
+
<tr>
|
| 404 |
+
<td><label for="box_margin_top">{#style_dlg.top}</label></td>
|
| 405 |
+
<td>
|
| 406 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 407 |
+
<tr>
|
| 408 |
+
<td><input type="text" id="box_margin_top" name="box_margin_top" class="mceEditableSelect" /></td>
|
| 409 |
+
<td> </td>
|
| 410 |
+
<td>
|
| 411 |
+
<label id="box_margin_top_measurement_label" for="box_margin_top_measurement" style="display: none; visibility: hidden;">Margin Top Measurement Unit</label>
|
| 412 |
+
<select id="box_margin_top_measurement" name="box_margin_top_measurement" aria-labelledby="box_margin_top_measurement_label"></select>
|
| 413 |
+
</td>
|
| 414 |
+
</tr>
|
| 415 |
+
</table>
|
| 416 |
+
</td>
|
| 417 |
+
</tr>
|
| 418 |
+
<tr>
|
| 419 |
+
<td><label for="box_margin_right">{#style_dlg.right}</label></td>
|
| 420 |
+
<td>
|
| 421 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 422 |
+
<tr>
|
| 423 |
+
<td><input type="text" id="box_margin_right" name="box_margin_right" class="mceEditableSelect" disabled="disabled" /></td>
|
| 424 |
+
<td> </td>
|
| 425 |
+
<td>
|
| 426 |
+
<label id="box_margin_right_measurement_label" for="box_margin_right_measurement" style="display: none; visibility: hidden;">Margin Right Measurement Unit</label>
|
| 427 |
+
<select id="box_margin_right_measurement" name="box_margin_right_measurement" disabled="disabled" aria-labelledby="box_margin_right_measurement_label"></select>
|
| 428 |
+
</td>
|
| 429 |
+
</tr>
|
| 430 |
+
</table>
|
| 431 |
+
</td>
|
| 432 |
+
</tr>
|
| 433 |
+
<tr>
|
| 434 |
+
<td><label for="box_margin_bottom">{#style_dlg.bottom}</label></td>
|
| 435 |
+
<td>
|
| 436 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 437 |
+
<tr>
|
| 438 |
+
<td><input type="text" id="box_margin_bottom" name="box_margin_bottom" class="mceEditableSelect" disabled="disabled" /></td>
|
| 439 |
+
<td> </td>
|
| 440 |
+
<td>
|
| 441 |
+
<label id="box_margin_bottom_measurement_label" for="box_margin_bottom_measurement" style="display: none; visibility: hidden;">Margin Bottom Measurement Unit</label>
|
| 442 |
+
<select id="box_margin_bottom_measurement" name="box_margin_bottom_measurement" disabled="disabled" aria-labelledby="box_margin_bottom_measurement_label"></select>
|
| 443 |
+
</td>
|
| 444 |
+
</tr>
|
| 445 |
+
</table>
|
| 446 |
+
</td>
|
| 447 |
+
</tr>
|
| 448 |
+
<tr>
|
| 449 |
+
<td><label for="box_margin_left">{#style_dlg.left}</label></td>
|
| 450 |
+
<td>
|
| 451 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 452 |
+
<tr>
|
| 453 |
+
<td><input type="text" id="box_margin_left" name="box_margin_left" class="mceEditableSelect" disabled="disabled" /></td>
|
| 454 |
+
<td> </td>
|
| 455 |
+
<td>
|
| 456 |
+
<label id="box_margin_left_measurement_label" for="box_margin_left_measurement" style="display: none; visibility: hidden;">Margin Left Measurement Unit</label>
|
| 457 |
+
<select id="box_margin_left_measurement" name="box_margin_left_measurement" disabled="disabled" aria-labelledby="box_margin_left_measurement_label"></select>
|
| 458 |
+
</td>
|
| 459 |
+
</tr>
|
| 460 |
+
</table>
|
| 461 |
+
</td>
|
| 462 |
+
</tr>
|
| 463 |
+
</table>
|
| 464 |
+
</fieldset>
|
| 465 |
+
</div>
|
| 466 |
+
<br style="clear: both" />
|
| 467 |
+
</div>
|
| 468 |
+
|
| 469 |
+
<div id="border_panel" class="panel">
|
| 470 |
+
<fieldset>
|
| 471 |
+
<legend>{#style_dlg.border}</legend>
|
| 472 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0" width="100%">
|
| 473 |
+
<tr>
|
| 474 |
+
<td class="tdelim"> </td>
|
| 475 |
+
<td class="tdelim delim"> </td>
|
| 476 |
+
<td class="tdelim">{#style_dlg.style}</td>
|
| 477 |
+
<td class="tdelim delim"> </td>
|
| 478 |
+
<td class="tdelim">{#style_dlg.width}</td>
|
| 479 |
+
<td class="tdelim delim"> </td>
|
| 480 |
+
<td class="tdelim">{#style_dlg.color}</td>
|
| 481 |
+
</tr>
|
| 482 |
+
|
| 483 |
+
<tr>
|
| 484 |
+
<td> </td>
|
| 485 |
+
<td class="delim"> </td>
|
| 486 |
+
<td><input type="checkbox" id="border_style_same" name="border_style_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_style');" /> <label for="border_style_same">{#style_dlg.same}</label></td>
|
| 487 |
+
<td class="delim"> </td>
|
| 488 |
+
<td><input type="checkbox" id="border_width_same" name="border_width_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_width');" /> <label for="border_width_same">{#style_dlg.same}</label></td>
|
| 489 |
+
<td class="delim"> </td>
|
| 490 |
+
<td><input type="checkbox" id="border_color_same" name="border_color_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_color');" /> <label for="border_color_same">{#style_dlg.same}</label></td>
|
| 491 |
+
</tr>
|
| 492 |
+
|
| 493 |
+
<tr>
|
| 494 |
+
<td>{#style_dlg.top}</td>
|
| 495 |
+
<td class="delim"> </td>
|
| 496 |
+
<td><select id="border_style_top" name="border_style_top" class="mceEditableSelect"></select></td>
|
| 497 |
+
<td class="delim"> </td>
|
| 498 |
+
<td>
|
| 499 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 500 |
+
<tr>
|
| 501 |
+
<td><select id="border_width_top" name="border_width_top" class="mceEditableSelect"></select></td>
|
| 502 |
+
<td> </td>
|
| 503 |
+
<td>
|
| 504 |
+
<label id="border_width_top_measurement_label" for="border_width_top_measurement" style="display: none; visibility: hidden;">Width top Measurement Unit</label>
|
| 505 |
+
<select id="border_width_top_measurement" name="border_width_top_measurement" aria-labelledby="border_width_top_measurement_label"></select>
|
| 506 |
+
</td>
|
| 507 |
+
</tr>
|
| 508 |
+
</table>
|
| 509 |
+
</td>
|
| 510 |
+
<td class="delim"> </td>
|
| 511 |
+
<td>
|
| 512 |
+
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
| 513 |
+
<tr>
|
| 514 |
+
<td><input id="border_color_top" name="border_color_top" type="text" value="" size="9" onChange="updateColor('border_color_top_pick','border_color_top');" /></td>
|
| 515 |
+
<td id="border_color_top_pickcontainer"> </td>
|
| 516 |
+
</tr>
|
| 517 |
+
</table>
|
| 518 |
+
</td>
|
| 519 |
+
</tr>
|
| 520 |
+
|
| 521 |
+
<tr>
|
| 522 |
+
<td>{#style_dlg.right}</td>
|
| 523 |
+
<td class="delim"> </td>
|
| 524 |
+
<td><select id="border_style_right" name="border_style_right" class="mceEditableSelect" disabled="disabled"></select></td>
|
| 525 |
+
<td class="delim"> </td>
|
| 526 |
+
<td>
|
| 527 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 528 |
+
<tr>
|
| 529 |
+
<td><select id="border_width_right" name="border_width_right" class="mceEditableSelect" disabled="disabled"></select></td>
|
| 530 |
+
<td> </td>
|
| 531 |
+
<td>
|
| 532 |
+
<label id="border_width_right_measurement_label" for="border_width_right_measurement" style="display: none; visibility: hidden;">Width Right Measurement Unit</label>
|
| 533 |
+
<select id="border_width_right_measurement" name="border_width_right_measurement" disabled="disabled" aria-labelledby="border_width_right_measurement_label"></select>
|
| 534 |
+
</td>
|
| 535 |
+
</tr>
|
| 536 |
+
</table>
|
| 537 |
+
</td>
|
| 538 |
+
<td class="delim"> </td>
|
| 539 |
+
<td>
|
| 540 |
+
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
| 541 |
+
<tr>
|
| 542 |
+
<td><input id="border_color_right" name="border_color_right" type="text" value="" size="9" onChange="updateColor('border_color_right_pick','border_color_right');" disabled="disabled" /></td>
|
| 543 |
+
<td id="border_color_right_pickcontainer"> </td>
|
| 544 |
+
</tr>
|
| 545 |
+
</table>
|
| 546 |
+
</td>
|
| 547 |
+
</tr>
|
| 548 |
+
|
| 549 |
+
<tr>
|
| 550 |
+
<td>{#style_dlg.bottom}</td>
|
| 551 |
+
<td class="delim"> </td>
|
| 552 |
+
<td><select id="border_style_bottom" name="border_style_bottom" class="mceEditableSelect" disabled="disabled"></select></td>
|
| 553 |
+
<td class="delim"> </td>
|
| 554 |
+
<td>
|
| 555 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 556 |
+
<tr>
|
| 557 |
+
<td><select id="border_width_bottom" name="border_width_bottom" class="mceEditableSelect" disabled="disabled"></select></td>
|
| 558 |
+
<td> </td>
|
| 559 |
+
<td>
|
| 560 |
+
<label id="border_width_bottom_measurement_label" for="border_width_bottom_measurement" style="display: none; visibility: hidden;">Width Bottom Measurement Unit</label>
|
| 561 |
+
<select id="border_width_bottom_measurement" name="border_width_bottom_measurement" disabled="disabled" aria-labelledby="border_width_bottom_measurement_label"></select>
|
| 562 |
+
</td>
|
| 563 |
+
</tr>
|
| 564 |
+
</table>
|
| 565 |
+
</td>
|
| 566 |
+
<td class="delim"> </td>
|
| 567 |
+
<td>
|
| 568 |
+
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
| 569 |
+
<tr>
|
| 570 |
+
<td><input id="border_color_bottom" name="border_color_bottom" type="text" value="" size="9" onChange="updateColor('border_color_bottom_pick','border_color_bottom');" disabled="disabled" /></td>
|
| 571 |
+
<td id="border_color_bottom_pickcontainer"> </td>
|
| 572 |
+
</tr>
|
| 573 |
+
</table>
|
| 574 |
+
</td>
|
| 575 |
+
</tr>
|
| 576 |
+
|
| 577 |
+
<tr>
|
| 578 |
+
<td>{#style_dlg.left}</td>
|
| 579 |
+
<td class="delim"> </td>
|
| 580 |
+
<td><select id="border_style_left" name="border_style_left" class="mceEditableSelect" disabled="disabled"></select></td>
|
| 581 |
+
<td class="delim"> </td>
|
| 582 |
+
<td>
|
| 583 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 584 |
+
<tr>
|
| 585 |
+
<td><select id="border_width_left" name="border_width_left" class="mceEditableSelect" disabled="disabled"></select></td>
|
| 586 |
+
<td> </td>
|
| 587 |
+
<td>
|
| 588 |
+
<label id="border_width_left_measurement_label" for="border_width_left_measurement" style="display: none; visibility: hidden;">Width Left Measurement Unit</label>
|
| 589 |
+
<select id="border_width_left_measurement" name="border_width_left_measurement" disabled="disabled" aria-labelledby="border_width_left_measurement_label"></select>
|
| 590 |
+
</td>
|
| 591 |
+
</tr>
|
| 592 |
+
</table>
|
| 593 |
+
</td>
|
| 594 |
+
<td class="delim"> </td>
|
| 595 |
+
<td>
|
| 596 |
+
<table role="presentation" border="0" cellpadding="0" cellspacing="0">
|
| 597 |
+
<tr>
|
| 598 |
+
<td><input id="border_color_left" name="border_color_left" type="text" value="" size="9" onChange="updateColor('border_color_left_pick','border_color_left');" disabled="disabled" /></td>
|
| 599 |
+
<td id="border_color_left_pickcontainer"> </td>
|
| 600 |
+
</tr>
|
| 601 |
+
</table>
|
| 602 |
+
</td>
|
| 603 |
+
</tr>
|
| 604 |
+
</table>
|
| 605 |
+
</fieldset>
|
| 606 |
+
</div>
|
| 607 |
+
|
| 608 |
+
<div id="list_panel" class="panel">
|
| 609 |
+
<fieldset>
|
| 610 |
+
<legend>{#style_dlg.list}</legend>
|
| 611 |
+
<table role="presentation" border="0">
|
| 612 |
+
<tr>
|
| 613 |
+
<td><label for="list_type">{#style_dlg.list_type}</label></td>
|
| 614 |
+
<td><select id="list_type" name="list_type" class="mceEditableSelect"></select></td>
|
| 615 |
+
</tr>
|
| 616 |
+
|
| 617 |
+
<tr>
|
| 618 |
+
<td><label for="list_bullet_image">{#style_dlg.bullet_image}</label></td>
|
| 619 |
+
<td><input id="list_bullet_image" name="list_bullet_image" type="text" /></td>
|
| 620 |
+
</tr>
|
| 621 |
+
|
| 622 |
+
<tr>
|
| 623 |
+
<td><label for="list_position">{#style_dlg.position}</label></td>
|
| 624 |
+
<td><select id="list_position" name="list_position" class="mceEditableSelect"></select></td>
|
| 625 |
+
</tr>
|
| 626 |
+
</table>
|
| 627 |
+
</fieldset>
|
| 628 |
+
</div>
|
| 629 |
+
|
| 630 |
+
<div id="positioning_panel" class="panel">
|
| 631 |
+
<fieldset>
|
| 632 |
+
<legend>{#style_dlg.position}</legend>
|
| 633 |
+
<table role="presentation" border="0">
|
| 634 |
+
<tr>
|
| 635 |
+
<td><label for="positioning_type">{#style_dlg.positioning_type}</label></td>
|
| 636 |
+
<td><select id="positioning_type" name="positioning_type" class="mceEditableSelect"></select></td>
|
| 637 |
+
<td> <label for="positioning_visibility">{#style_dlg.visibility}</label></td>
|
| 638 |
+
<td><select id="positioning_visibility" name="positioning_visibility" class="mceEditableSelect"></select></td>
|
| 639 |
+
</tr>
|
| 640 |
+
|
| 641 |
+
<tr>
|
| 642 |
+
<td><label for="positioning_width">{#style_dlg.width}</label></td>
|
| 643 |
+
<td>
|
| 644 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 645 |
+
<tr>
|
| 646 |
+
<td><input type="text" id="positioning_width" name="positioning_width" onChange="synch('positioning_width','box_width');" /></td>
|
| 647 |
+
<td> </td>
|
| 648 |
+
<td>
|
| 649 |
+
<label id="positioning_width_measurement_label" for="positioning_width_measurement" style="display: none; visibility: hidden;">Positioning width Measurement Unit</label>
|
| 650 |
+
<select id="positioning_width_measurement" name="positioning_width_measurement" aria-labelledby="positioning_width_measurement_label"></select>
|
| 651 |
+
</td>
|
| 652 |
+
</tr>
|
| 653 |
+
</table>
|
| 654 |
+
</td>
|
| 655 |
+
<td> <label for="positioning_zindex">{#style_dlg.zindex}</label></td>
|
| 656 |
+
<td><input type="text" id="positioning_zindex" name="positioning_zindex" /></td>
|
| 657 |
+
</tr>
|
| 658 |
+
|
| 659 |
+
<tr>
|
| 660 |
+
<td><label for="positioning_height">{#style_dlg.height}</label></td>
|
| 661 |
+
<td>
|
| 662 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 663 |
+
<tr>
|
| 664 |
+
<td><input type="text" id="positioning_height" name="positioning_height" onChange="synch('positioning_height','box_height');" /></td>
|
| 665 |
+
<td> </td>
|
| 666 |
+
<td>
|
| 667 |
+
<label id="positioning_height_measurement_label" for="positioning_height_measurement" style="display: none; visibility: hidden;">Positioning Height Measurement Unit</label>
|
| 668 |
+
<select id="positioning_height_measurement" name="positioning_height_measurement" aria-labelledby="positioning_height_measurement_label"></select>
|
| 669 |
+
</td>
|
| 670 |
+
</tr>
|
| 671 |
+
</table>
|
| 672 |
+
</td>
|
| 673 |
+
<td> <label for="positioning_overflow">{#style_dlg.overflow}</label></td>
|
| 674 |
+
<td><select id="positioning_overflow" name="positioning_overflow" class="mceEditableSelect"></select></td>
|
| 675 |
+
</tr>
|
| 676 |
+
</table>
|
| 677 |
+
</fieldset>
|
| 678 |
+
|
| 679 |
+
<div style="float: left; width: 49%">
|
| 680 |
+
<fieldset>
|
| 681 |
+
<legend>{#style_dlg.placement}</legend>
|
| 682 |
+
|
| 683 |
+
<table role="presentation" border="0">
|
| 684 |
+
<tr>
|
| 685 |
+
<td> </td>
|
| 686 |
+
<td><input type="checkbox" id="positioning_placement_same" name="positioning_placement_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_placement');" /> <label for="positioning_placement_same">{#style_dlg.same}</label></td>
|
| 687 |
+
</tr>
|
| 688 |
+
<tr>
|
| 689 |
+
<td>{#style_dlg.top}</td>
|
| 690 |
+
<td>
|
| 691 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 692 |
+
<tr>
|
| 693 |
+
<td><input type="text" id="positioning_placement_top" name="positioning_placement_top" /></td>
|
| 694 |
+
<td> </td>
|
| 695 |
+
<td>
|
| 696 |
+
<label id="positioning_placement_top_measurement_label" for="positioning_placement_top_measurement" style="display: none; visibility: hidden;">Placement Top Measurement Unit</label>
|
| 697 |
+
<select id="positioning_placement_top_measurement" name="positioning_placement_top_measurement" aria-labelledby="positioning_placement_top_measurement_label"></select>
|
| 698 |
+
</td>
|
| 699 |
+
</tr>
|
| 700 |
+
</table>
|
| 701 |
+
</td>
|
| 702 |
+
</tr>
|
| 703 |
+
<tr>
|
| 704 |
+
<td>{#style_dlg.right}</td>
|
| 705 |
+
<td>
|
| 706 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 707 |
+
<tr>
|
| 708 |
+
<td><input type="text" id="positioning_placement_right" name="positioning_placement_right" disabled="disabled" /></td>
|
| 709 |
+
<td> </td>
|
| 710 |
+
<td>
|
| 711 |
+
<label id="positioning_placement_right_measurement_label" for="positioning_placement_right_measurement" style="display: none; visibility: hidden;">Placement Right Measurement Unit</label>
|
| 712 |
+
<select id="positioning_placement_right_measurement" name="positioning_placement_right_measurement" disabled="disabled" aria-labelledby="positioning_placement_right_measurement_label"></select>
|
| 713 |
+
</td>
|
| 714 |
+
</tr>
|
| 715 |
+
</table>
|
| 716 |
+
</td>
|
| 717 |
+
</tr>
|
| 718 |
+
<tr>
|
| 719 |
+
<td>{#style_dlg.bottom}</td>
|
| 720 |
+
<td>
|
| 721 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 722 |
+
<tr>
|
| 723 |
+
<td><input type="text" id="positioning_placement_bottom" name="positioning_placement_bottom" disabled="disabled" /></td>
|
| 724 |
+
<td> </td>
|
| 725 |
+
<td>
|
| 726 |
+
<label id="positioning_placement_bottom_measurement_label" for="positioning_placement_bottom_measurement" style="display: none; visibility: hidden;">Placement Bottom Measurement Unit</label>
|
| 727 |
+
<select id="positioning_placement_bottom_measurement" name="positioning_placement_bottom_measurement" disabled="disabled" aria-labelledby="positioning_placement_bottom_measurement_label"></select>
|
| 728 |
+
</td>
|
| 729 |
+
</tr>
|
| 730 |
+
</table>
|
| 731 |
+
</td>
|
| 732 |
+
</tr>
|
| 733 |
+
<tr>
|
| 734 |
+
<td>{#style_dlg.left}</td>
|
| 735 |
+
<td>
|
| 736 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 737 |
+
<tr>
|
| 738 |
+
<td><input type="text" id="positioning_placement_left" name="positioning_placement_left" disabled="disabled" /></td>
|
| 739 |
+
<td> </td>
|
| 740 |
+
<td>
|
| 741 |
+
<label id="positioning_placement_left_measurement_label" for="positioning_placement_left_measurement" style="display: none; visibility: hidden;">Placement Left Measurement Unit</label>
|
| 742 |
+
<select id="positioning_placement_left_measurement" name="positioning_placement_left_measurement" disabled="disabled" aria-labelledby="positioning_placement_left_measurement_label"></select>
|
| 743 |
+
</td>
|
| 744 |
+
</tr>
|
| 745 |
+
</table>
|
| 746 |
+
</td>
|
| 747 |
+
</tr>
|
| 748 |
+
</table>
|
| 749 |
+
</fieldset>
|
| 750 |
+
</div>
|
| 751 |
+
|
| 752 |
+
<div style="float: right; width: 49%">
|
| 753 |
+
<fieldset>
|
| 754 |
+
<legend>{#style_dlg.clip}</legend>
|
| 755 |
+
|
| 756 |
+
<table role="presentation" border="0">
|
| 757 |
+
<tr>
|
| 758 |
+
<td> </td>
|
| 759 |
+
<td><input type="checkbox" id="positioning_clip_same" name="positioning_clip_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_clip');" /> <label for="positioning_clip_same">{#style_dlg.same}</label></td>
|
| 760 |
+
</tr>
|
| 761 |
+
<tr>
|
| 762 |
+
<td>{#style_dlg.top}</td>
|
| 763 |
+
<td>
|
| 764 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 765 |
+
<tr>
|
| 766 |
+
<td><input type="text" id="positioning_clip_top" name="positioning_clip_top" /></td>
|
| 767 |
+
<td> </td>
|
| 768 |
+
<td>
|
| 769 |
+
<label id="positioning_clip_top_measurement_label" for="positioning_clip_top_measurement" style="display: none; visibility: hidden;">Clip Top Measurement Unit</label>
|
| 770 |
+
<select id="positioning_clip_top_measurement" name="positioning_clip_top_measurement" aria-labelledby="positioning_clip_top_measurement_label"></select>
|
| 771 |
+
</td>
|
| 772 |
+
</tr>
|
| 773 |
+
</table>
|
| 774 |
+
</td>
|
| 775 |
+
</tr>
|
| 776 |
+
<tr>
|
| 777 |
+
<td>{#style_dlg.right}</td>
|
| 778 |
+
<td>
|
| 779 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 780 |
+
<tr>
|
| 781 |
+
<td><input type="text" id="positioning_clip_right" name="positioning_clip_right" disabled="disabled" /></td>
|
| 782 |
+
<td> </td>
|
| 783 |
+
<td>
|
| 784 |
+
<label id="positioning_clip_right_measurement_label" for="positioning_clip_right_measurement" style="display: none; visibility: hidden;">Clip Right Measurement Unit</label>
|
| 785 |
+
<select id="positioning_clip_right_measurement" name="positioning_clip_right_measurement" disabled="disabled" aria-labelledby="positioning_clip_right_measurement_label"></select>
|
| 786 |
+
</td>
|
| 787 |
+
</tr>
|
| 788 |
+
</table>
|
| 789 |
+
</td>
|
| 790 |
+
</tr>
|
| 791 |
+
<tr>
|
| 792 |
+
<td>{#style_dlg.bottom}</td>
|
| 793 |
+
<td>
|
| 794 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 795 |
+
<tr>
|
| 796 |
+
<td><input type="text" id="positioning_clip_bottom" name="positioning_clip_bottom" disabled="disabled" /></td>
|
| 797 |
+
<td> </td>
|
| 798 |
+
<td>
|
| 799 |
+
<label id="positioning_clip_bottom_measurement_label" for="positioning_clip_bottom_measurement" style="display: none; visibility: hidden;">Clip Bottom Measurement Unit</label>
|
| 800 |
+
<select id="positioning_clip_bottom_measurement" name="positioning_clip_bottom_measurement" disabled="disabled" aria-labelledby="positioning_clip_bottom_measurement_label"></select>
|
| 801 |
+
</td>
|
| 802 |
+
</tr>
|
| 803 |
+
</table>
|
| 804 |
+
</td>
|
| 805 |
+
</tr>
|
| 806 |
+
<tr>
|
| 807 |
+
<td>{#style_dlg.left}</td>
|
| 808 |
+
<td>
|
| 809 |
+
<table role="presentation" border="0" cellspacing="0" cellpadding="0">
|
| 810 |
+
<tr>
|
| 811 |
+
<td><input type="text" id="positioning_clip_left" name="positioning_clip_left" disabled="disabled" /></td>
|
| 812 |
+
<td> </td>
|
| 813 |
+
<td>
|
| 814 |
+
<label id="positioning_clip_left_measurement_label" for="positioning_clip_left_measurement" style="display: none; visibility: hidden;">Clip Left Measurement Unit</label>
|
| 815 |
+
<select id="positioning_clip_left_measurement" name="positioning_clip_left_measurement" disabled="disabled" aria-labelledby="positioning_clip_left_measurement_label"></select>
|
| 816 |
+
</td>
|
| 817 |
+
</tr>
|
| 818 |
+
</table>
|
| 819 |
+
</td>
|
| 820 |
+
</tr>
|
| 821 |
+
</table>
|
| 822 |
+
</fieldset>
|
| 823 |
+
</div>
|
| 824 |
+
<br style="clear: both" />
|
| 825 |
+
</div>
|
| 826 |
+
</div>
|
| 827 |
+
|
| 828 |
+
<div class="panel_toggle_insert_span">
|
| 829 |
+
<input type="checkbox" class="checkbox" id="toggle_insert_span" name="toggle_insert_span" onClick="toggleApplyAction();" />
|
| 830 |
+
<label for="toggle_insert_span">{#style_dlg.toggle_insert_span}</label>
|
| 831 |
+
</div>
|
| 832 |
+
|
| 833 |
+
<div class="mceActionPanel">
|
| 834 |
+
<input type="submit" id="insert" name="insert" value="{#update}" />
|
| 835 |
+
<input type="button" class="button" id="apply" name="apply" value="{#style_dlg.apply}" onClick="applyAction();" />
|
| 836 |
+
<input type="button" id="cancel" name="cancel" value="{#cancel}" onClick="tinyMCEPopup.close();" />
|
| 837 |
+
</div>
|
| 838 |
+
</form>
|
| 839 |
+
|
| 840 |
+
<div style="display: none">
|
| 841 |
+
<div id="container"></div>
|
| 842 |
+
</div>
|
| 843 |
+
|
| 844 |
+
</body>
|
| 845 |
+
</html>
|
js/tinymce/jscripts/tiny_mce/plugins/style/readme.txt
CHANGED
|
@@ -1,19 +1,19 @@
|
|
| 1 |
-
Edit CSS Style plug-in notes
|
| 2 |
-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| 3 |
-
Unlike WYSIWYG editor functionality that operates only on the selected text,
|
| 4 |
-
typically by inserting new HTML elements with the specified styles.
|
| 5 |
-
This plug-in operates on the HTML blocks surrounding the selected text.
|
| 6 |
-
No new HTML elements are created.
|
| 7 |
-
|
| 8 |
-
This plug-in only operates on the surrounding blocks and not the nearest
|
| 9 |
-
parent node. This means that if a block encapsulates a node,
|
| 10 |
-
e.g <p><span>text</span></p>, then only the styles in the block are
|
| 11 |
-
recognized, not those in the span.
|
| 12 |
-
|
| 13 |
-
When selecting text that includes multiple blocks at the same level (peers),
|
| 14 |
-
this plug-in accumulates the specified styles in all of the surrounding blocks
|
| 15 |
-
and populates the dialogue checkboxes accordingly. There is no differentiation
|
| 16 |
-
between styles set in all the blocks versus styles set in some of the blocks.
|
| 17 |
-
|
| 18 |
-
When the [Update] or [Apply] buttons are pressed, the styles selected in the
|
| 19 |
-
checkboxes are applied to all blocks that surround the selected text.
|
| 1 |
+
Edit CSS Style plug-in notes
|
| 2 |
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
| 3 |
+
Unlike WYSIWYG editor functionality that operates only on the selected text,
|
| 4 |
+
typically by inserting new HTML elements with the specified styles.
|
| 5 |
+
This plug-in operates on the HTML blocks surrounding the selected text.
|
| 6 |
+
No new HTML elements are created.
|
| 7 |
+
|
| 8 |
+
This plug-in only operates on the surrounding blocks and not the nearest
|
| 9 |
+
parent node. This means that if a block encapsulates a node,
|
| 10 |
+
e.g <p><span>text</span></p>, then only the styles in the block are
|
| 11 |
+
recognized, not those in the span.
|
| 12 |
+
|
| 13 |
+
When selecting text that includes multiple blocks at the same level (peers),
|
| 14 |
+
this plug-in accumulates the specified styles in all of the surrounding blocks
|
| 15 |
+
and populates the dialogue checkboxes accordingly. There is no differentiation
|
| 16 |
+
between styles set in all the blocks versus styles set in some of the blocks.
|
| 17 |
+
|
| 18 |
+
When the [Update] or [Apply] buttons are pressed, the styles selected in the
|
| 19 |
+
checkboxes are applied to all blocks that surround the selected text.
|
js/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js
CHANGED
|
@@ -1,122 +1,122 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* editor_plugin_src.js
|
| 3 |
-
*
|
| 4 |
-
* Copyright 2009, Moxiecode Systems AB
|
| 5 |
-
* Released under LGPL License.
|
| 6 |
-
*
|
| 7 |
-
* License: http://tinymce.moxiecode.com/license
|
| 8 |
-
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
-
*/
|
| 10 |
-
|
| 11 |
-
(function() {
|
| 12 |
-
var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode;
|
| 13 |
-
|
| 14 |
-
tinymce.create('tinymce.plugins.TabFocusPlugin', {
|
| 15 |
-
init : function(ed, url) {
|
| 16 |
-
function tabCancel(ed, e) {
|
| 17 |
-
if (e.keyCode === 9)
|
| 18 |
-
return Event.cancel(e);
|
| 19 |
-
}
|
| 20 |
-
|
| 21 |
-
function tabHandler(ed, e) {
|
| 22 |
-
var x, i, f, el, v;
|
| 23 |
-
|
| 24 |
-
function find(d) {
|
| 25 |
-
el = DOM.select(':input:enabled,*[tabindex]:not(iframe)');
|
| 26 |
-
|
| 27 |
-
function canSelectRecursive(e) {
|
| 28 |
-
return e.nodeName==="BODY" || (e.type != 'hidden' &&
|
| 29 |
-
!(e.style.display == "none") &&
|
| 30 |
-
!(e.style.visibility == "hidden") && canSelectRecursive(e.parentNode));
|
| 31 |
-
}
|
| 32 |
-
function canSelectInOldIe(el) {
|
| 33 |
-
return el.attributes["tabIndex"].specified || el.nodeName == "INPUT" || el.nodeName == "TEXTAREA";
|
| 34 |
-
}
|
| 35 |
-
function isOldIe() {
|
| 36 |
-
return tinymce.isIE6 || tinymce.isIE7;
|
| 37 |
-
}
|
| 38 |
-
function canSelect(el) {
|
| 39 |
-
return ((!isOldIe() || canSelectInOldIe(el))) && el.getAttribute("tabindex") != '-1' && canSelectRecursive(el);
|
| 40 |
-
}
|
| 41 |
-
|
| 42 |
-
each(el, function(e, i) {
|
| 43 |
-
if (e.id == ed.id) {
|
| 44 |
-
x = i;
|
| 45 |
-
return false;
|
| 46 |
-
}
|
| 47 |
-
});
|
| 48 |
-
if (d > 0) {
|
| 49 |
-
for (i = x + 1; i < el.length; i++) {
|
| 50 |
-
if (canSelect(el[i]))
|
| 51 |
-
return el[i];
|
| 52 |
-
}
|
| 53 |
-
} else {
|
| 54 |
-
for (i = x - 1; i >= 0; i--) {
|
| 55 |
-
if (canSelect(el[i]))
|
| 56 |
-
return el[i];
|
| 57 |
-
}
|
| 58 |
-
}
|
| 59 |
-
|
| 60 |
-
return null;
|
| 61 |
-
}
|
| 62 |
-
|
| 63 |
-
if (e.keyCode === 9) {
|
| 64 |
-
v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next')));
|
| 65 |
-
|
| 66 |
-
if (v.length == 1) {
|
| 67 |
-
v[1] = v[0];
|
| 68 |
-
v[0] = ':prev';
|
| 69 |
-
}
|
| 70 |
-
|
| 71 |
-
// Find element to focus
|
| 72 |
-
if (e.shiftKey) {
|
| 73 |
-
if (v[0] == ':prev')
|
| 74 |
-
el = find(-1);
|
| 75 |
-
else
|
| 76 |
-
el = DOM.get(v[0]);
|
| 77 |
-
} else {
|
| 78 |
-
if (v[1] == ':next')
|
| 79 |
-
el = find(1);
|
| 80 |
-
else
|
| 81 |
-
el = DOM.get(v[1]);
|
| 82 |
-
}
|
| 83 |
-
|
| 84 |
-
if (el) {
|
| 85 |
-
if (el.id && (ed = tinymce.get(el.id || el.name)))
|
| 86 |
-
ed.focus();
|
| 87 |
-
else
|
| 88 |
-
window.setTimeout(function() {
|
| 89 |
-
if (!tinymce.isWebKit)
|
| 90 |
-
window.focus();
|
| 91 |
-
el.focus();
|
| 92 |
-
}, 10);
|
| 93 |
-
|
| 94 |
-
return Event.cancel(e);
|
| 95 |
-
}
|
| 96 |
-
}
|
| 97 |
-
}
|
| 98 |
-
|
| 99 |
-
ed.onKeyUp.add(tabCancel);
|
| 100 |
-
|
| 101 |
-
if (tinymce.isGecko) {
|
| 102 |
-
ed.onKeyPress.add(tabHandler);
|
| 103 |
-
ed.onKeyDown.add(tabCancel);
|
| 104 |
-
} else
|
| 105 |
-
ed.onKeyDown.add(tabHandler);
|
| 106 |
-
|
| 107 |
-
},
|
| 108 |
-
|
| 109 |
-
getInfo : function() {
|
| 110 |
-
return {
|
| 111 |
-
longname : 'Tabfocus',
|
| 112 |
-
author : 'Moxiecode Systems AB',
|
| 113 |
-
authorurl : 'http://tinymce.moxiecode.com',
|
| 114 |
-
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus',
|
| 115 |
-
version : tinymce.majorVersion + "." + tinymce.minorVersion
|
| 116 |
-
};
|
| 117 |
-
}
|
| 118 |
-
});
|
| 119 |
-
|
| 120 |
-
// Register plugin
|
| 121 |
-
tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin);
|
| 122 |
-
})();
|
| 1 |
+
/**
|
| 2 |
+
* editor_plugin_src.js
|
| 3 |
+
*
|
| 4 |
+
* Copyright 2009, Moxiecode Systems AB
|
| 5 |
+
* Released under LGPL License.
|
| 6 |
+
*
|
| 7 |
+
* License: http://tinymce.moxiecode.com/license
|
| 8 |
+
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
+
*/
|
| 10 |
+
|
| 11 |
+
(function() {
|
| 12 |
+
var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode;
|
| 13 |
+
|
| 14 |
+
tinymce.create('tinymce.plugins.TabFocusPlugin', {
|
| 15 |
+
init : function(ed, url) {
|
| 16 |
+
function tabCancel(ed, e) {
|
| 17 |
+
if (e.keyCode === 9)
|
| 18 |
+
return Event.cancel(e);
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
function tabHandler(ed, e) {
|
| 22 |
+
var x, i, f, el, v;
|
| 23 |
+
|
| 24 |
+
function find(d) {
|
| 25 |
+
el = DOM.select(':input:enabled,*[tabindex]:not(iframe)');
|
| 26 |
+
|
| 27 |
+
function canSelectRecursive(e) {
|
| 28 |
+
return e.nodeName==="BODY" || (e.type != 'hidden' &&
|
| 29 |
+
!(e.style.display == "none") &&
|
| 30 |
+
!(e.style.visibility == "hidden") && canSelectRecursive(e.parentNode));
|
| 31 |
+
}
|
| 32 |
+
function canSelectInOldIe(el) {
|
| 33 |
+
return el.attributes["tabIndex"].specified || el.nodeName == "INPUT" || el.nodeName == "TEXTAREA";
|
| 34 |
+
}
|
| 35 |
+
function isOldIe() {
|
| 36 |
+
return tinymce.isIE6 || tinymce.isIE7;
|
| 37 |
+
}
|
| 38 |
+
function canSelect(el) {
|
| 39 |
+
return ((!isOldIe() || canSelectInOldIe(el))) && el.getAttribute("tabindex") != '-1' && canSelectRecursive(el);
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
each(el, function(e, i) {
|
| 43 |
+
if (e.id == ed.id) {
|
| 44 |
+
x = i;
|
| 45 |
+
return false;
|
| 46 |
+
}
|
| 47 |
+
});
|
| 48 |
+
if (d > 0) {
|
| 49 |
+
for (i = x + 1; i < el.length; i++) {
|
| 50 |
+
if (canSelect(el[i]))
|
| 51 |
+
return el[i];
|
| 52 |
+
}
|
| 53 |
+
} else {
|
| 54 |
+
for (i = x - 1; i >= 0; i--) {
|
| 55 |
+
if (canSelect(el[i]))
|
| 56 |
+
return el[i];
|
| 57 |
+
}
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
return null;
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
if (e.keyCode === 9) {
|
| 64 |
+
v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next')));
|
| 65 |
+
|
| 66 |
+
if (v.length == 1) {
|
| 67 |
+
v[1] = v[0];
|
| 68 |
+
v[0] = ':prev';
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
+
// Find element to focus
|
| 72 |
+
if (e.shiftKey) {
|
| 73 |
+
if (v[0] == ':prev')
|
| 74 |
+
el = find(-1);
|
| 75 |
+
else
|
| 76 |
+
el = DOM.get(v[0]);
|
| 77 |
+
} else {
|
| 78 |
+
if (v[1] == ':next')
|
| 79 |
+
el = find(1);
|
| 80 |
+
else
|
| 81 |
+
el = DOM.get(v[1]);
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
if (el) {
|
| 85 |
+
if (el.id && (ed = tinymce.get(el.id || el.name)))
|
| 86 |
+
ed.focus();
|
| 87 |
+
else
|
| 88 |
+
window.setTimeout(function() {
|
| 89 |
+
if (!tinymce.isWebKit)
|
| 90 |
+
window.focus();
|
| 91 |
+
el.focus();
|
| 92 |
+
}, 10);
|
| 93 |
+
|
| 94 |
+
return Event.cancel(e);
|
| 95 |
+
}
|
| 96 |
+
}
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
ed.onKeyUp.add(tabCancel);
|
| 100 |
+
|
| 101 |
+
if (tinymce.isGecko) {
|
| 102 |
+
ed.onKeyPress.add(tabHandler);
|
| 103 |
+
ed.onKeyDown.add(tabCancel);
|
| 104 |
+
} else
|
| 105 |
+
ed.onKeyDown.add(tabHandler);
|
| 106 |
+
|
| 107 |
+
},
|
| 108 |
+
|
| 109 |
+
getInfo : function() {
|
| 110 |
+
return {
|
| 111 |
+
longname : 'Tabfocus',
|
| 112 |
+
author : 'Moxiecode Systems AB',
|
| 113 |
+
authorurl : 'http://tinymce.moxiecode.com',
|
| 114 |
+
infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus',
|
| 115 |
+
version : tinymce.majorVersion + "." + tinymce.minorVersion
|
| 116 |
+
};
|
| 117 |
+
}
|
| 118 |
+
});
|
| 119 |
+
|
| 120 |
+
// Register plugin
|
| 121 |
+
tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin);
|
| 122 |
+
})();
|
js/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js
CHANGED
|
@@ -1,1456 +1,1456 @@
|
|
| 1 |
-
/**
|
| 2 |
-
* editor_plugin_src.js
|
| 3 |
-
*
|
| 4 |
-
* Copyright 2009, Moxiecode Systems AB
|
| 5 |
-
* Released under LGPL License.
|
| 6 |
-
*
|
| 7 |
-
* License: http://tinymce.moxiecode.com/license
|
| 8 |
-
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
-
*/
|
| 10 |
-
|
| 11 |
-
(function(tinymce) {
|
| 12 |
-
var each = tinymce.each;
|
| 13 |
-
|
| 14 |
-
// Checks if the selection/caret is at the start of the specified block element
|
| 15 |
-
function isAtStart(rng, par) {
|
| 16 |
-
var doc = par.ownerDocument, rng2 = doc.createRange(), elm;
|
| 17 |
-
|
| 18 |
-
rng2.setStartBefore(par);
|
| 19 |
-
rng2.setEnd(rng.endContainer, rng.endOffset);
|
| 20 |
-
|
| 21 |
-
elm = doc.createElement('body');
|
| 22 |
-
elm.appendChild(rng2.cloneContents());
|
| 23 |
-
|
| 24 |
-
// Check for text characters of other elements that should be treated as content
|
| 25 |
-
return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0;
|
| 26 |
-
};
|
| 27 |
-
|
| 28 |
-
function getSpanVal(td, name) {
|
| 29 |
-
return parseInt(td.getAttribute(name) || 1);
|
| 30 |
-
}
|
| 31 |
-
|
| 32 |
-
/**
|
| 33 |
-
* Table Grid class.
|
| 34 |
-
*/
|
| 35 |
-
function TableGrid(table, dom, selection) {
|
| 36 |
-
var grid, startPos, endPos, selectedCell;
|
| 37 |
-
|
| 38 |
-
buildGrid();
|
| 39 |
-
selectedCell = dom.getParent(selection.getStart(), 'th,td');
|
| 40 |
-
if (selectedCell) {
|
| 41 |
-
startPos = getPos(selectedCell);
|
| 42 |
-
endPos = findEndPos();
|
| 43 |
-
selectedCell = getCell(startPos.x, startPos.y);
|
| 44 |
-
}
|
| 45 |
-
|
| 46 |
-
function cloneNode(node, children) {
|
| 47 |
-
node = node.cloneNode(children);
|
| 48 |
-
node.removeAttribute('id');
|
| 49 |
-
|
| 50 |
-
return node;
|
| 51 |
-
}
|
| 52 |
-
|
| 53 |
-
function buildGrid() {
|
| 54 |
-
var startY = 0;
|
| 55 |
-
|
| 56 |
-
grid = [];
|
| 57 |
-
|
| 58 |
-
each(['thead', 'tbody', 'tfoot'], function(part) {
|
| 59 |
-
var rows = dom.select('> ' + part + ' tr', table);
|
| 60 |
-
|
| 61 |
-
each(rows, function(tr, y) {
|
| 62 |
-
y += startY;
|
| 63 |
-
|
| 64 |
-
each(dom.select('> td, > th', tr), function(td, x) {
|
| 65 |
-
var x2, y2, rowspan, colspan;
|
| 66 |
-
|
| 67 |
-
// Skip over existing cells produced by rowspan
|
| 68 |
-
if (grid[y]) {
|
| 69 |
-
while (grid[y][x])
|
| 70 |
-
x++;
|
| 71 |
-
}
|
| 72 |
-
|
| 73 |
-
// Get col/rowspan from cell
|
| 74 |
-
rowspan = getSpanVal(td, 'rowspan');
|
| 75 |
-
colspan = getSpanVal(td, 'colspan');
|
| 76 |
-
|
| 77 |
-
// Fill out rowspan/colspan right and down
|
| 78 |
-
for (y2 = y; y2 < y + rowspan; y2++) {
|
| 79 |
-
if (!grid[y2])
|
| 80 |
-
grid[y2] = [];
|
| 81 |
-
|
| 82 |
-
for (x2 = x; x2 < x + colspan; x2++) {
|
| 83 |
-
grid[y2][x2] = {
|
| 84 |
-
part : part,
|
| 85 |
-
real : y2 == y && x2 == x,
|
| 86 |
-
elm : td,
|
| 87 |
-
rowspan : rowspan,
|
| 88 |
-
colspan : colspan
|
| 89 |
-
};
|
| 90 |
-
}
|
| 91 |
-
}
|
| 92 |
-
});
|
| 93 |
-
});
|
| 94 |
-
|
| 95 |
-
startY += rows.length;
|
| 96 |
-
});
|
| 97 |
-
};
|
| 98 |
-
|
| 99 |
-
function getCell(x, y) {
|
| 100 |
-
var row;
|
| 101 |
-
|
| 102 |
-
row = grid[y];
|
| 103 |
-
if (row)
|
| 104 |
-
return row[x];
|
| 105 |
-
};
|
| 106 |
-
|
| 107 |
-
function setSpanVal(td, name, val) {
|
| 108 |
-
if (td) {
|
| 109 |
-
val = parseInt(val);
|
| 110 |
-
|
| 111 |
-
if (val === 1)
|
| 112 |
-
td.removeAttribute(name, 1);
|
| 113 |
-
else
|
| 114 |
-
td.setAttribute(name, val, 1);
|
| 115 |
-
}
|
| 116 |
-
}
|
| 117 |
-
|
| 118 |
-
function isCellSelected(cell) {
|
| 119 |
-
return cell && (dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell);
|
| 120 |
-
};
|
| 121 |
-
|
| 122 |
-
function getSelectedRows() {
|
| 123 |
-
var rows = [];
|
| 124 |
-
|
| 125 |
-
each(table.rows, function(row) {
|
| 126 |
-
each(row.cells, function(cell) {
|
| 127 |
-
if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) {
|
| 128 |
-
rows.push(row);
|
| 129 |
-
return false;
|
| 130 |
-
}
|
| 131 |
-
});
|
| 132 |
-
});
|
| 133 |
-
|
| 134 |
-
return rows;
|
| 135 |
-
};
|
| 136 |
-
|
| 137 |
-
function deleteTable() {
|
| 138 |
-
var rng = dom.createRng();
|
| 139 |
-
|
| 140 |
-
rng.setStartAfter(table);
|
| 141 |
-
rng.setEndAfter(table);
|
| 142 |
-
|
| 143 |
-
selection.setRng(rng);
|
| 144 |
-
|
| 145 |
-
dom.remove(table);
|
| 146 |
-
};
|
| 147 |
-
|
| 148 |
-
function cloneCell(cell) {
|
| 149 |
-
var formatNode;
|
| 150 |
-
|
| 151 |
-
// Clone formats
|
| 152 |
-
tinymce.walk(cell, function(node) {
|
| 153 |
-
var curNode;
|
| 154 |
-
|
| 155 |
-
if (node.nodeType == 3) {
|
| 156 |
-
each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) {
|
| 157 |
-
node = cloneNode(node, false);
|
| 158 |
-
|
| 159 |
-
if (!formatNode)
|
| 160 |
-
formatNode = curNode = node;
|
| 161 |
-
else if (curNode)
|
| 162 |
-
curNode.appendChild(node);
|
| 163 |
-
|
| 164 |
-
curNode = node;
|
| 165 |
-
});
|
| 166 |
-
|
| 167 |
-
// Add something to the inner node
|
| 168 |
-
if (curNode)
|
| 169 |
-
curNode.innerHTML = tinymce.isIE ? ' ' : '<br data-mce-bogus="1" />';
|
| 170 |
-
|
| 171 |
-
return false;
|
| 172 |
-
}
|
| 173 |
-
}, 'childNodes');
|
| 174 |
-
|
| 175 |
-
cell = cloneNode(cell, false);
|
| 176 |
-
setSpanVal(cell, 'rowSpan', 1);
|
| 177 |
-
setSpanVal(cell, 'colSpan', 1);
|
| 178 |
-
|
| 179 |
-
if (formatNode) {
|
| 180 |
-
cell.appendChild(formatNode);
|
| 181 |
-
} else {
|
| 182 |
-
if (!tinymce.isIE)
|
| 183 |
-
cell.innerHTML = '<br data-mce-bogus="1" />';
|
| 184 |
-
}
|
| 185 |
-
|
| 186 |
-
return cell;
|
| 187 |
-
};
|
| 188 |
-
|
| 189 |
-
function cleanup() {
|
| 190 |
-
var rng = dom.createRng();
|
| 191 |
-
|
| 192 |
-
// Empty rows
|
| 193 |
-
each(dom.select('tr', table), function(tr) {
|
| 194 |
-
if (tr.cells.length == 0)
|
| 195 |
-
dom.remove(tr);
|
| 196 |
-
});
|
| 197 |
-
|
| 198 |
-
// Empty table
|
| 199 |
-
if (dom.select('tr', table).length == 0) {
|
| 200 |
-
rng.setStartAfter(table);
|
| 201 |
-
rng.setEndAfter(table);
|
| 202 |
-
selection.setRng(rng);
|
| 203 |
-
dom.remove(table);
|
| 204 |
-
return;
|
| 205 |
-
}
|
| 206 |
-
|
| 207 |
-
// Empty header/body/footer
|
| 208 |
-
each(dom.select('thead,tbody,tfoot', table), function(part) {
|
| 209 |
-
if (part.rows.length == 0)
|
| 210 |
-
dom.remove(part);
|
| 211 |
-
});
|
| 212 |
-
|
| 213 |
-
// Restore selection to start position if it still exists
|
| 214 |
-
buildGrid();
|
| 215 |
-
|
| 216 |
-
// Restore the selection to the closest table position
|
| 217 |
-
row = grid[Math.min(grid.length - 1, startPos.y)];
|
| 218 |
-
if (row) {
|
| 219 |
-
selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true);
|
| 220 |
-
selection.collapse(true);
|
| 221 |
-
}
|
| 222 |
-
};
|
| 223 |
-
|
| 224 |
-
function fillLeftDown(x, y, rows, cols) {
|
| 225 |
-
var tr, x2, r, c, cell;
|
| 226 |
-
|
| 227 |
-
tr = grid[y][x].elm.parentNode;
|
| 228 |
-
for (r = 1; r <= rows; r++) {
|
| 229 |
-
tr = dom.getNext(tr, 'tr');
|
| 230 |
-
|
| 231 |
-
if (tr) {
|
| 232 |
-
// Loop left to find real cell
|
| 233 |
-
for (x2 = x; x2 >= 0; x2--) {
|
| 234 |
-
cell = grid[y + r][x2].elm;
|
| 235 |
-
|
| 236 |
-
if (cell.parentNode == tr) {
|
| 237 |
-
// Append clones after
|
| 238 |
-
for (c = 1; c <= cols; c++)
|
| 239 |
-
dom.insertAfter(cloneCell(cell), cell);
|
| 240 |
-
|
| 241 |
-
break;
|
| 242 |
-
}
|
| 243 |
-
}
|
| 244 |
-
|
| 245 |
-
if (x2 == -1) {
|
| 246 |
-
// Insert nodes before first cell
|
| 247 |
-
for (c = 1; c <= cols; c++)
|
| 248 |
-
tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]);
|
| 249 |
-
}
|
| 250 |
-
}
|
| 251 |
-
}
|
| 252 |
-
};
|
| 253 |
-
|
| 254 |
-
function split() {
|
| 255 |
-
each(grid, function(row, y) {
|
| 256 |
-
each(row, function(cell, x) {
|
| 257 |
-
var colSpan, rowSpan, newCell, i;
|
| 258 |
-
|
| 259 |
-
if (isCellSelected(cell)) {
|
| 260 |
-
cell = cell.elm;
|
| 261 |
-
colSpan = getSpanVal(cell, 'colspan');
|
| 262 |
-
rowSpan = getSpanVal(cell, 'rowspan');
|
| 263 |
-
|
| 264 |
-
if (colSpan > 1 || rowSpan > 1) {
|
| 265 |
-
setSpanVal(cell, 'rowSpan', 1);
|
| 266 |
-
setSpanVal(cell, 'colSpan', 1);
|
| 267 |
-
|
| 268 |
-
// Insert cells right
|
| 269 |
-
for (i = 0; i < colSpan - 1; i++)
|
| 270 |
-
dom.insertAfter(cloneCell(cell), cell);
|
| 271 |
-
|
| 272 |
-
fillLeftDown(x, y, rowSpan - 1, colSpan);
|
| 273 |
-
}
|
| 274 |
-
}
|
| 275 |
-
});
|
| 276 |
-
});
|
| 277 |
-
};
|
| 278 |
-
|
| 279 |
-
function merge(cell, cols, rows) {
|
| 280 |
-
var startX, startY, endX, endY, x, y, startCell, endCell, cell, children, count;
|
| 281 |
-
|
| 282 |
-
// Use specified cell and cols/rows
|
| 283 |
-
if (cell) {
|
| 284 |
-
pos = getPos(cell);
|
| 285 |
-
startX = pos.x;
|
| 286 |
-
startY = pos.y;
|
| 287 |
-
endX = startX + (cols - 1);
|
| 288 |
-
endY = startY + (rows - 1);
|
| 289 |
-
} else {
|
| 290 |
-
startPos = endPos = null;
|
| 291 |
-
|
| 292 |
-
// Calculate start/end pos by checking for selected cells in grid works better with context menu
|
| 293 |
-
each(grid, function(row, y) {
|
| 294 |
-
each(row, function(cell, x) {
|
| 295 |
-
if (isCellSelected(cell)) {
|
| 296 |
-
if (!startPos) {
|
| 297 |
-
startPos = {x: x, y: y};
|
| 298 |
-
}
|
| 299 |
-
|
| 300 |
-
endPos = {x: x, y: y};
|
| 301 |
-
}
|
| 302 |
-
});
|
| 303 |
-
});
|
| 304 |
-
|
| 305 |
-
// Use selection
|
| 306 |
-
startX = startPos.x;
|
| 307 |
-
startY = startPos.y;
|
| 308 |
-
endX = endPos.x;
|
| 309 |
-
endY = endPos.y;
|
| 310 |
-
}
|
| 311 |
-
|
| 312 |
-
// Find start/end cells
|
| 313 |
-
startCell = getCell(startX, startY);
|
| 314 |
-
endCell = getCell(endX, endY);
|
| 315 |
-
|
| 316 |
-
// Check if the cells exists and if they are of the same part for example tbody = tbody
|
| 317 |
-
if (startCell && endCell && startCell.part == endCell.part) {
|
| 318 |
-
// Split and rebuild grid
|
| 319 |
-
split();
|
| 320 |
-
buildGrid();
|
| 321 |
-
|
| 322 |
-
// Set row/col span to start cell
|
| 323 |
-
startCell = getCell(startX, startY).elm;
|
| 324 |
-
setSpanVal(startCell, 'colSpan', (endX - startX) + 1);
|
| 325 |
-
setSpanVal(startCell, 'rowSpan', (endY - startY) + 1);
|
| 326 |
-
|
| 327 |
-
// Remove other cells and add it's contents to the start cell
|
| 328 |
-
for (y = startY; y <= endY; y++) {
|
| 329 |
-
for (x = startX; x <= endX; x++) {
|
| 330 |
-
if (!grid[y] || !grid[y][x])
|
| 331 |
-
continue;
|
| 332 |
-
|
| 333 |
-
cell = grid[y][x].elm;
|
| 334 |
-
|
| 335 |
-
if (cell != startCell) {
|
| 336 |
-
// Move children to startCell
|
| 337 |
-
children = tinymce.grep(cell.childNodes);
|
| 338 |
-
each(children, function(node) {
|
| 339 |
-
startCell.appendChild(node);
|
| 340 |
-
});
|
| 341 |
-
|
| 342 |
-
// Remove bogus nodes if there is children in the target cell
|
| 343 |
-
if (children.length) {
|
| 344 |
-
children = tinymce.grep(startCell.childNodes);
|
| 345 |
-
count = 0;
|
| 346 |
-
each(children, function(node) {
|
| 347 |
-
if (node.nodeName == 'BR' && dom.getAttrib(node, 'data-mce-bogus') && count++ < children.length - 1)
|
| 348 |
-
startCell.removeChild(node);
|
| 349 |
-
});
|
| 350 |
-
}
|
| 351 |
-
|
| 352 |
-
// Remove cell
|
| 353 |
-
dom.remove(cell);
|
| 354 |
-
}
|
| 355 |
-
}
|
| 356 |
-
}
|
| 357 |
-
|
| 358 |
-
// Remove empty rows etc and restore caret location
|
| 359 |
-
cleanup();
|
| 360 |
-
}
|
| 361 |
-
};
|
| 362 |
-
|
| 363 |
-
function insertRow(before) {
|
| 364 |
-
var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan;
|
| 365 |
-
|
| 366 |
-
// Find first/last row
|
| 367 |
-
each(grid, function(row, y) {
|
| 368 |
-
each(row, function(cell, x) {
|
| 369 |
-
if (isCellSelected(cell)) {
|
| 370 |
-
cell = cell.elm;
|
| 371 |
-
rowElm = cell.parentNode;
|
| 372 |
-
newRow = cloneNode(rowElm, false);
|
| 373 |
-
posY = y;
|
| 374 |
-
|
| 375 |
-
if (before)
|
| 376 |
-
return false;
|
| 377 |
-
}
|
| 378 |
-
});
|
| 379 |
-
|
| 380 |
-
if (before)
|
| 381 |
-
return !posY;
|
| 382 |
-
});
|
| 383 |
-
|
| 384 |
-
for (x = 0; x < grid[0].length; x++) {
|
| 385 |
-
// Cell not found could be because of an invalid table structure
|
| 386 |
-
if (!grid[posY][x])
|
| 387 |
-
continue;
|
| 388 |
-
|
| 389 |
-
cell = grid[posY][x].elm;
|
| 390 |
-
|
| 391 |
-
if (cell != lastCell) {
|
| 392 |
-
if (!before) {
|
| 393 |
-
rowSpan = getSpanVal(cell, 'rowspan');
|
| 394 |
-
if (rowSpan > 1) {
|
| 395 |
-
setSpanVal(cell, 'rowSpan', rowSpan + 1);
|
| 396 |
-
continue;
|
| 397 |
-
}
|
| 398 |
-
} else {
|
| 399 |
-
// Check if cell above can be expanded
|
| 400 |
-
if (posY > 0 && grid[posY - 1][x]) {
|
| 401 |
-
otherCell = grid[posY - 1][x].elm;
|
| 402 |
-
rowSpan = getSpanVal(otherCell, 'rowSpan');
|
| 403 |
-
if (rowSpan > 1) {
|
| 404 |
-
setSpanVal(otherCell, 'rowSpan', rowSpan + 1);
|
| 405 |
-
continue;
|
| 406 |
-
}
|
| 407 |
-
}
|
| 408 |
-
}
|
| 409 |
-
|
| 410 |
-
// Insert new cell into new row
|
| 411 |
-
newCell = cloneCell(cell);
|
| 412 |
-
setSpanVal(newCell, 'colSpan', cell.colSpan);
|
| 413 |
-
|
| 414 |
-
newRow.appendChild(newCell);
|
| 415 |
-
|
| 416 |
-
lastCell = cell;
|
| 417 |
-
}
|
| 418 |
-
}
|
| 419 |
-
|
| 420 |
-
if (newRow.hasChildNodes()) {
|
| 421 |
-
if (!before)
|
| 422 |
-
dom.insertAfter(newRow, rowElm);
|
| 423 |
-
else
|
| 424 |
-
rowElm.parentNode.insertBefore(newRow, rowElm);
|
| 425 |
-
}
|
| 426 |
-
};
|
| 427 |
-
|
| 428 |
-
function insertCol(before) {
|
| 429 |
-
var posX, lastCell;
|
| 430 |
-
|
| 431 |
-
// Find first/last column
|
| 432 |
-
each(grid, function(row, y) {
|
| 433 |
-
each(row, function(cell, x) {
|
| 434 |
-
if (isCellSelected(cell)) {
|
| 435 |
-
posX = x;
|
| 436 |
-
|
| 437 |
-
if (before)
|
| 438 |
-
return false;
|
| 439 |
-
}
|
| 440 |
-
});
|
| 441 |
-
|
| 442 |
-
if (before)
|
| 443 |
-
return !posX;
|
| 444 |
-
});
|
| 445 |
-
|
| 446 |
-
each(grid, function(row, y) {
|
| 447 |
-
var cell, rowSpan, colSpan;
|
| 448 |
-
|
| 449 |
-
if (!row[posX])
|
| 450 |
-
return;
|
| 451 |
-
|
| 452 |
-
cell = row[posX].elm;
|
| 453 |
-
if (cell != lastCell) {
|
| 454 |
-
colSpan = getSpanVal(cell, 'colspan');
|
| 455 |
-
rowSpan = getSpanVal(cell, 'rowspan');
|
| 456 |
-
|
| 457 |
-
if (colSpan == 1) {
|
| 458 |
-
if (!before) {
|
| 459 |
-
dom.insertAfter(cloneCell(cell), cell);
|
| 460 |
-
fillLeftDown(posX, y, rowSpan - 1, colSpan);
|
| 461 |
-
} else {
|
| 462 |
-
cell.parentNode.insertBefore(cloneCell(cell), cell);
|
| 463 |
-
fillLeftDown(posX, y, rowSpan - 1, colSpan);
|
| 464 |
-
}
|
| 465 |
-
} else
|
| 466 |
-
setSpanVal(cell, 'colSpan', cell.colSpan + 1);
|
| 467 |
-
|
| 468 |
-
lastCell = cell;
|
| 469 |
-
}
|
| 470 |
-
});
|
| 471 |
-
};
|
| 472 |
-
|
| 473 |
-
function deleteCols() {
|
| 474 |
-
var cols = [];
|
| 475 |
-
|
| 476 |
-
// Get selected column indexes
|
| 477 |
-
each(grid, function(row, y) {
|
| 478 |
-
each(row, function(cell, x) {
|
| 479 |
-
if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) {
|
| 480 |
-
each(grid, function(row) {
|
| 481 |
-
var cell = row[x].elm, colSpan;
|
| 482 |
-
|
| 483 |
-
colSpan = getSpanVal(cell, 'colSpan');
|
| 484 |
-
|
| 485 |
-
if (colSpan > 1)
|
| 486 |
-
setSpanVal(cell, 'colSpan', colSpan - 1);
|
| 487 |
-
else
|
| 488 |
-
dom.remove(cell);
|
| 489 |
-
});
|
| 490 |
-
|
| 491 |
-
cols.push(x);
|
| 492 |
-
}
|
| 493 |
-
});
|
| 494 |
-
});
|
| 495 |
-
|
| 496 |
-
cleanup();
|
| 497 |
-
};
|
| 498 |
-
|
| 499 |
-
function deleteRows() {
|
| 500 |
-
var rows;
|
| 501 |
-
|
| 502 |
-
function deleteRow(tr) {
|
| 503 |
-
var nextTr, pos, lastCell;
|
| 504 |
-
|
| 505 |
-
nextTr = dom.getNext(tr, 'tr');
|
| 506 |
-
|
| 507 |
-
// Move down row spanned cells
|
| 508 |
-
each(tr.cells, function(cell) {
|
| 509 |
-
var rowSpan = getSpanVal(cell, 'rowSpan');
|
| 510 |
-
|
| 511 |
-
if (rowSpan > 1) {
|
| 512 |
-
setSpanVal(cell, 'rowSpan', rowSpan - 1);
|
| 513 |
-
pos = getPos(cell);
|
| 514 |
-
fillLeftDown(pos.x, pos.y, 1, 1);
|
| 515 |
-
}
|
| 516 |
-
});
|
| 517 |
-
|
| 518 |
-
// Delete cells
|
| 519 |
-
pos = getPos(tr.cells[0]);
|
| 520 |
-
each(grid[pos.y], function(cell) {
|
| 521 |
-
var rowSpan;
|
| 522 |
-
|
| 523 |
-
cell = cell.elm;
|
| 524 |
-
|
| 525 |
-
if (cell != lastCell) {
|
| 526 |
-
rowSpan = getSpanVal(cell, 'rowSpan');
|
| 527 |
-
|
| 528 |
-
if (rowSpan <= 1)
|
| 529 |
-
dom.remove(cell);
|
| 530 |
-
else
|
| 531 |
-
setSpanVal(cell, 'rowSpan', rowSpan - 1);
|
| 532 |
-
|
| 533 |
-
lastCell = cell;
|
| 534 |
-
}
|
| 535 |
-
});
|
| 536 |
-
};
|
| 537 |
-
|
| 538 |
-
// Get selected rows and move selection out of scope
|
| 539 |
-
rows = getSelectedRows();
|
| 540 |
-
|
| 541 |
-
// Delete all selected rows
|
| 542 |
-
each(rows.reverse(), function(tr) {
|
| 543 |
-
deleteRow(tr);
|
| 544 |
-
});
|
| 545 |
-
|
| 546 |
-
cleanup();
|
| 547 |
-
};
|
| 548 |
-
|
| 549 |
-
function cutRows() {
|
| 550 |
-
var rows = getSelectedRows();
|
| 551 |
-
|
| 552 |
-
dom.remove(rows);
|
| 553 |
-
cleanup();
|
| 554 |
-
|
| 555 |
-
return rows;
|
| 556 |
-
};
|
| 557 |
-
|
| 558 |
-
function copyRows() {
|
| 559 |
-
var rows = getSelectedRows();
|
| 560 |
-
|
| 561 |
-
each(rows, function(row, i) {
|
| 562 |
-
rows[i] = cloneNode(row, true);
|
| 563 |
-
});
|
| 564 |
-
|
| 565 |
-
return rows;
|
| 566 |
-
};
|
| 567 |
-
|
| 568 |
-
function pasteRows(rows, before) {
|
| 569 |
-
// If we don't have any rows in the clipboard, return immediately
|
| 570 |
-
if(!rows)
|
| 571 |
-
return;
|
| 572 |
-
|
| 573 |
-
var selectedRows = getSelectedRows(),
|
| 574 |
-
targetRow = selectedRows[before ? 0 : selectedRows.length - 1],
|
| 575 |
-
targetCellCount = targetRow.cells.length;
|
| 576 |
-
|
| 577 |
-
// Calc target cell count
|
| 578 |
-
each(grid, function(row) {
|
| 579 |
-
var match;
|
| 580 |
-
|
| 581 |
-
targetCellCount = 0;
|
| 582 |
-
each(row, function(cell, x) {
|
| 583 |
-
if (cell.real)
|
| 584 |
-
targetCellCount += cell.colspan;
|
| 585 |
-
|
| 586 |
-
if (cell.elm.parentNode == targetRow)
|
| 587 |
-
match = 1;
|
| 588 |
-
});
|
| 589 |
-
|
| 590 |
-
if (match)
|
| 591 |
-
return false;
|
| 592 |
-
});
|
| 593 |
-
|
| 594 |
-
if (!before)
|
| 595 |
-
rows.reverse();
|
| 596 |
-
|
| 597 |
-
each(rows, function(row) {
|
| 598 |
-
var cellCount = row.cells.length, cell;
|
| 599 |
-
|
| 600 |
-
// Remove col/rowspans
|
| 601 |
-
for (i = 0; i < cellCount; i++) {
|
| 602 |
-
cell = row.cells[i];
|
| 603 |
-
setSpanVal(cell, 'colSpan', 1);
|
| 604 |
-
setSpanVal(cell, 'rowSpan', 1);
|
| 605 |
-
}
|
| 606 |
-
|
| 607 |
-
// Needs more cells
|
| 608 |
-
for (i = cellCount; i < targetCellCount; i++)
|
| 609 |
-
row.appendChild(cloneCell(row.cells[cellCount - 1]));
|
| 610 |
-
|
| 611 |
-
// Needs less cells
|
| 612 |
-
for (i = targetCellCount; i < cellCount; i++)
|
| 613 |
-
dom.remove(row.cells[i]);
|
| 614 |
-
|
| 615 |
-
// Add before/after
|
| 616 |
-
if (before)
|
| 617 |
-
targetRow.parentNode.insertBefore(row, targetRow);
|
| 618 |
-
else
|
| 619 |
-
dom.insertAfter(row, targetRow);
|
| 620 |
-
});
|
| 621 |
-
|
| 622 |
-
// Remove current selection
|
| 623 |
-
dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
|
| 624 |
-
};
|
| 625 |
-
|
| 626 |
-
function getPos(target) {
|
| 627 |
-
var pos;
|
| 628 |
-
|
| 629 |
-
each(grid, function(row, y) {
|
| 630 |
-
each(row, function(cell, x) {
|
| 631 |
-
if (cell.elm == target) {
|
| 632 |
-
pos = {x : x, y : y};
|
| 633 |
-
return false;
|
| 634 |
-
}
|
| 635 |
-
});
|
| 636 |
-
|
| 637 |
-
return !pos;
|
| 638 |
-
});
|
| 639 |
-
|
| 640 |
-
return pos;
|
| 641 |
-
};
|
| 642 |
-
|
| 643 |
-
function setStartCell(cell) {
|
| 644 |
-
startPos = getPos(cell);
|
| 645 |
-
};
|
| 646 |
-
|
| 647 |
-
function findEndPos() {
|
| 648 |
-
var pos, maxX, maxY;
|
| 649 |
-
|
| 650 |
-
maxX = maxY = 0;
|
| 651 |
-
|
| 652 |
-
each(grid, function(row, y) {
|
| 653 |
-
each(row, function(cell, x) {
|
| 654 |
-
var colSpan, rowSpan;
|
| 655 |
-
|
| 656 |
-
if (isCellSelected(cell)) {
|
| 657 |
-
cell = grid[y][x];
|
| 658 |
-
|
| 659 |
-
if (x > maxX)
|
| 660 |
-
maxX = x;
|
| 661 |
-
|
| 662 |
-
if (y > maxY)
|
| 663 |
-
maxY = y;
|
| 664 |
-
|
| 665 |
-
if (cell.real) {
|
| 666 |
-
colSpan = cell.colspan - 1;
|
| 667 |
-
rowSpan = cell.rowspan - 1;
|
| 668 |
-
|
| 669 |
-
if (colSpan) {
|
| 670 |
-
if (x + colSpan > maxX)
|
| 671 |
-
maxX = x + colSpan;
|
| 672 |
-
}
|
| 673 |
-
|
| 674 |
-
if (rowSpan) {
|
| 675 |
-
if (y + rowSpan > maxY)
|
| 676 |
-
maxY = y + rowSpan;
|
| 677 |
-
}
|
| 678 |
-
}
|
| 679 |
-
}
|
| 680 |
-
});
|
| 681 |
-
});
|
| 682 |
-
|
| 683 |
-
return {x : maxX, y : maxY};
|
| 684 |
-
};
|
| 685 |
-
|
| 686 |
-
function setEndCell(cell) {
|
| 687 |
-
var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan;
|
| 688 |
-
|
| 689 |
-
endPos = getPos(cell);
|
| 690 |
-
|
| 691 |
-
if (startPos && endPos) {
|
| 692 |
-
// Get start/end positions
|
| 693 |
-
startX = Math.min(startPos.x, endPos.x);
|
| 694 |
-
startY = Math.min(startPos.y, endPos.y);
|
| 695 |
-
endX = Math.max(startPos.x, endPos.x);
|
| 696 |
-
endY = Math.max(startPos.y, endPos.y);
|
| 697 |
-
|
| 698 |
-
// Expand end positon to include spans
|
| 699 |
-
maxX = endX;
|
| 700 |
-
maxY = endY;
|
| 701 |
-
|
| 702 |
-
// Expand startX
|
| 703 |
-
for (y = startY; y <= maxY; y++) {
|
| 704 |
-
cell = grid[y][startX];
|
| 705 |
-
|
| 706 |
-
if (!cell.real) {
|
| 707 |
-
if (startX - (cell.colspan - 1) < startX)
|
| 708 |
-
startX -= cell.colspan - 1;
|
| 709 |
-
}
|
| 710 |
-
}
|
| 711 |
-
|
| 712 |
-
// Expand startY
|
| 713 |
-
for (x = startX; x <= maxX; x++) {
|
| 714 |
-
cell = grid[startY][x];
|
| 715 |
-
|
| 716 |
-
if (!cell.real) {
|
| 717 |
-
if (startY - (cell.rowspan - 1) < startY)
|
| 718 |
-
startY -= cell.rowspan - 1;
|
| 719 |
-
}
|
| 720 |
-
}
|
| 721 |
-
|
| 722 |
-
// Find max X, Y
|
| 723 |
-
for (y = startY; y <= endY; y++) {
|
| 724 |
-
for (x = startX; x <= endX; x++) {
|
| 725 |
-
cell = grid[y][x];
|
| 726 |
-
|
| 727 |
-
if (cell.real) {
|
| 728 |
-
colSpan = cell.colspan - 1;
|
| 729 |
-
rowSpan = cell.rowspan - 1;
|
| 730 |
-
|
| 731 |
-
if (colSpan) {
|
| 732 |
-
if (x + colSpan > maxX)
|
| 733 |
-
maxX = x + colSpan;
|
| 734 |
-
}
|
| 735 |
-
|
| 736 |
-
if (rowSpan) {
|
| 737 |
-
if (y + rowSpan > maxY)
|
| 738 |
-
maxY = y + rowSpan;
|
| 739 |
-
}
|
| 740 |
-
}
|
| 741 |
-
}
|
| 742 |
-
}
|
| 743 |
-
|
| 744 |
-
// Remove current selection
|
| 745 |
-
dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
|
| 746 |
-
|
| 747 |
-
// Add new selection
|
| 748 |
-
for (y = startY; y <= maxY; y++) {
|
| 749 |
-
for (x = startX; x <= maxX; x++) {
|
| 750 |
-
if (grid[y][x])
|
| 751 |
-
dom.addClass(grid[y][x].elm, 'mceSelected');
|
| 752 |
-
}
|
| 753 |
-
}
|
| 754 |
-
}
|
| 755 |
-
};
|
| 756 |
-
|
| 757 |
-
// Expose to public
|
| 758 |
-
tinymce.extend(this, {
|
| 759 |
-
deleteTable : deleteTable,
|
| 760 |
-
split : split,
|
| 761 |
-
merge : merge,
|
| 762 |
-
insertRow : insertRow,
|
| 763 |
-
insertCol : insertCol,
|
| 764 |
-
deleteCols : deleteCols,
|
| 765 |
-
deleteRows : deleteRows,
|
| 766 |
-
cutRows : cutRows,
|
| 767 |
-
copyRows : copyRows,
|
| 768 |
-
pasteRows : pasteRows,
|
| 769 |
-
getPos : getPos,
|
| 770 |
-
setStartCell : setStartCell,
|
| 771 |
-
setEndCell : setEndCell
|
| 772 |
-
});
|
| 773 |
-
};
|
| 774 |
-
|
| 775 |
-
tinymce.create('tinymce.plugins.TablePlugin', {
|
| 776 |
-
init : function(ed, url) {
|
| 777 |
-
var winMan, clipboardRows, hasCellSelection = true; // Might be selected cells on reload
|
| 778 |
-
|
| 779 |
-
function createTableGrid(node) {
|
| 780 |
-
var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table');
|
| 781 |
-
|
| 782 |
-
if (tblElm)
|
| 783 |
-
return new TableGrid(tblElm, ed.dom, selection);
|
| 784 |
-
};
|
| 785 |
-
|
| 786 |
-
function cleanup() {
|
| 787 |
-
// Restore selection possibilities
|
| 788 |
-
ed.getBody().style.webkitUserSelect = '';
|
| 789 |
-
|
| 790 |
-
if (hasCellSelection) {
|
| 791 |
-
ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
|
| 792 |
-
hasCellSelection = false;
|
| 793 |
-
}
|
| 794 |
-
};
|
| 795 |
-
|
| 796 |
-
// Register buttons
|
| 797 |
-
each([
|
| 798 |
-
['table', 'table.desc', 'mceInsertTable', true],
|
| 799 |
-
['delete_table', 'table.del', 'mceTableDelete'],
|
| 800 |
-
['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'],
|
| 801 |
-
['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'],
|
| 802 |
-
['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'],
|
| 803 |
-
['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'],
|
| 804 |
-
['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'],
|
| 805 |
-
['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'],
|
| 806 |
-
['row_props', 'table.row_desc', 'mceTableRowProps', true],
|
| 807 |
-
['cell_props', 'table.cell_desc', 'mceTableCellProps', true],
|
| 808 |
-
['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true],
|
| 809 |
-
['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true]
|
| 810 |
-
], function(c) {
|
| 811 |
-
ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]});
|
| 812 |
-
});
|
| 813 |
-
|
| 814 |
-
// Select whole table is a table border is clicked
|
| 815 |
-
if (!tinymce.isIE) {
|
| 816 |
-
ed.onClick.add(function(ed, e) {
|
| 817 |
-
e = e.target;
|
| 818 |
-
|
| 819 |
-
if (e.nodeName === 'TABLE') {
|
| 820 |
-
ed.selection.select(e);
|
| 821 |
-
ed.nodeChanged();
|
| 822 |
-
}
|
| 823 |
-
});
|
| 824 |
-
}
|
| 825 |
-
|
| 826 |
-
ed.onPreProcess.add(function(ed, args) {
|
| 827 |
-
var nodes, i, node, dom = ed.dom, value;
|
| 828 |
-
|
| 829 |
-
nodes = dom.select('table', args.node);
|
| 830 |
-
i = nodes.length;
|
| 831 |
-
while (i--) {
|
| 832 |
-
node = nodes[i];
|
| 833 |
-
dom.setAttrib(node, 'data-mce-style', '');
|
| 834 |
-
|
| 835 |
-
if ((value = dom.getAttrib(node, 'width'))) {
|
| 836 |
-
dom.setStyle(node, 'width', value);
|
| 837 |
-
dom.setAttrib(node, 'width', '');
|
| 838 |
-
}
|
| 839 |
-
|
| 840 |
-
if ((value = dom.getAttrib(node, 'height'))) {
|
| 841 |
-
dom.setStyle(node, 'height', value);
|
| 842 |
-
dom.setAttrib(node, 'height', '');
|
| 843 |
-
}
|
| 844 |
-
}
|
| 845 |
-
});
|
| 846 |
-
|
| 847 |
-
// Handle node change updates
|
| 848 |
-
ed.onNodeChange.add(function(ed, cm, n) {
|
| 849 |
-
var p;
|
| 850 |
-
|
| 851 |
-
n = ed.selection.getStart();
|
| 852 |
-
p = ed.dom.getParent(n, 'td,th,caption');
|
| 853 |
-
cm.setActive('table', n.nodeName === 'TABLE' || !!p);
|
| 854 |
-
|
| 855 |
-
// Disable table tools if we are in caption
|
| 856 |
-
if (p && p.nodeName === 'CAPTION')
|
| 857 |
-
p = 0;
|
| 858 |
-
|
| 859 |
-
cm.setDisabled('delete_table', !p);
|
| 860 |
-
cm.setDisabled('delete_col', !p);
|
| 861 |
-
cm.setDisabled('delete_table', !p);
|
| 862 |
-
cm.setDisabled('delete_row', !p);
|
| 863 |
-
cm.setDisabled('col_after', !p);
|
| 864 |
-
cm.setDisabled('col_before', !p);
|
| 865 |
-
cm.setDisabled('row_after', !p);
|
| 866 |
-
cm.setDisabled('row_before', !p);
|
| 867 |
-
cm.setDisabled('row_props', !p);
|
| 868 |
-
cm.setDisabled('cell_props', !p);
|
| 869 |
-
cm.setDisabled('split_cells', !p);
|
| 870 |
-
cm.setDisabled('merge_cells', !p);
|
| 871 |
-
});
|
| 872 |
-
|
| 873 |
-
ed.onInit.add(function(ed) {
|
| 874 |
-
var startTable, startCell, dom = ed.dom, tableGrid;
|
| 875 |
-
|
| 876 |
-
winMan = ed.windowManager;
|
| 877 |
-
|
| 878 |
-
// Add cell selection logic
|
| 879 |
-
ed.onMouseDown.add(function(ed, e) {
|
| 880 |
-
if (e.button != 2) {
|
| 881 |
-
cleanup();
|
| 882 |
-
|
| 883 |
-
startCell = dom.getParent(e.target, 'td,th');
|
| 884 |
-
startTable = dom.getParent(startCell, 'table');
|
| 885 |
-
}
|
| 886 |
-
});
|
| 887 |
-
|
| 888 |
-
dom.bind(ed.getDoc(), 'mouseover', function(e) {
|
| 889 |
-
var sel, table, target = e.target;
|
| 890 |
-
|
| 891 |
-
if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) {
|
| 892 |
-
table = dom.getParent(target, 'table');
|
| 893 |
-
if (table == startTable) {
|
| 894 |
-
if (!tableGrid) {
|
| 895 |
-
tableGrid = createTableGrid(table);
|
| 896 |
-
tableGrid.setStartCell(startCell);
|
| 897 |
-
|
| 898 |
-
ed.getBody().style.webkitUserSelect = 'none';
|
| 899 |
-
}
|
| 900 |
-
|
| 901 |
-
tableGrid.setEndCell(target);
|
| 902 |
-
hasCellSelection = true;
|
| 903 |
-
}
|
| 904 |
-
|
| 905 |
-
// Remove current selection
|
| 906 |
-
sel = ed.selection.getSel();
|
| 907 |
-
|
| 908 |
-
try {
|
| 909 |
-
if (sel.removeAllRanges)
|
| 910 |
-
sel.removeAllRanges();
|
| 911 |
-
else
|
| 912 |
-
sel.empty();
|
| 913 |
-
} catch (ex) {
|
| 914 |
-
// IE9 might throw errors here
|
| 915 |
-
}
|
| 916 |
-
|
| 917 |
-
e.preventDefault();
|
| 918 |
-
}
|
| 919 |
-
});
|
| 920 |
-
|
| 921 |
-
ed.onMouseUp.add(function(ed, e) {
|
| 922 |
-
var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode;
|
| 923 |
-
|
| 924 |
-
// Move selection to startCell
|
| 925 |
-
if (startCell) {
|
| 926 |
-
if (tableGrid)
|
| 927 |
-
ed.getBody().style.webkitUserSelect = '';
|
| 928 |
-
|
| 929 |
-
function setPoint(node, start) {
|
| 930 |
-
var walker = new tinymce.dom.TreeWalker(node, node);
|
| 931 |
-
|
| 932 |
-
do {
|
| 933 |
-
// Text node
|
| 934 |
-
if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) {
|
| 935 |
-
if (start)
|
| 936 |
-
rng.setStart(node, 0);
|
| 937 |
-
else
|
| 938 |
-
rng.setEnd(node, node.nodeValue.length);
|
| 939 |
-
|
| 940 |
-
return;
|
| 941 |
-
}
|
| 942 |
-
|
| 943 |
-
// BR element
|
| 944 |
-
if (node.nodeName == 'BR') {
|
| 945 |
-
if (start)
|
| 946 |
-
rng.setStartBefore(node);
|
| 947 |
-
else
|
| 948 |
-
rng.setEndBefore(node);
|
| 949 |
-
|
| 950 |
-
return;
|
| 951 |
-
}
|
| 952 |
-
} while (node = (start ? walker.next() : walker.prev()));
|
| 953 |
-
}
|
| 954 |
-
|
| 955 |
-
// Try to expand text selection as much as we can only Gecko supports cell selection
|
| 956 |
-
selectedCells = dom.select('td.mceSelected,th.mceSelected');
|
| 957 |
-
if (selectedCells.length > 0) {
|
| 958 |
-
rng = dom.createRng();
|
| 959 |
-
node = selectedCells[0];
|
| 960 |
-
endNode = selectedCells[selectedCells.length - 1];
|
| 961 |
-
rng.setStartBefore(node);
|
| 962 |
-
rng.setEndAfter(node);
|
| 963 |
-
|
| 964 |
-
setPoint(node, 1);
|
| 965 |
-
walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table'));
|
| 966 |
-
|
| 967 |
-
do {
|
| 968 |
-
if (node.nodeName == 'TD' || node.nodeName == 'TH') {
|
| 969 |
-
if (!dom.hasClass(node, 'mceSelected'))
|
| 970 |
-
break;
|
| 971 |
-
|
| 972 |
-
lastNode = node;
|
| 973 |
-
}
|
| 974 |
-
} while (node = walker.next());
|
| 975 |
-
|
| 976 |
-
setPoint(lastNode);
|
| 977 |
-
|
| 978 |
-
sel.setRng(rng);
|
| 979 |
-
}
|
| 980 |
-
|
| 981 |
-
ed.nodeChanged();
|
| 982 |
-
startCell = tableGrid = startTable = null;
|
| 983 |
-
}
|
| 984 |
-
});
|
| 985 |
-
|
| 986 |
-
ed.onKeyUp.add(function(ed, e) {
|
| 987 |
-
cleanup();
|
| 988 |
-
});
|
| 989 |
-
|
| 990 |
-
ed.onKeyDown.add(function (ed, e) {
|
| 991 |
-
fixTableCellSelection(ed);
|
| 992 |
-
});
|
| 993 |
-
|
| 994 |
-
ed.onMouseDown.add(function (ed, e) {
|
| 995 |
-
if (e.button != 2) {
|
| 996 |
-
fixTableCellSelection(ed);
|
| 997 |
-
}
|
| 998 |
-
});
|
| 999 |
-
function tableCellSelected(ed, rng, n, currentCell) {
|
| 1000 |
-
// The decision of when a table cell is selected is somewhat involved. The fact that this code is
|
| 1001 |
-
// required is actually a pointer to the root cause of this bug. A cell is selected when the start
|
| 1002 |
-
// and end offsets are 0, the start container is a text, and the selection node is either a TR (most cases)
|
| 1003 |
-
// or the parent of the table (in the case of the selection containing the last cell of a table).
|
| 1004 |
-
var TEXT_NODE = 3, table = ed.dom.getParent(rng.startContainer, 'TABLE'),
|
| 1005 |
-
tableParent, allOfCellSelected, tableCellSelection;
|
| 1006 |
-
if (table)
|
| 1007 |
-
tableParent = table.parentNode;
|
| 1008 |
-
allOfCellSelected =rng.startContainer.nodeType == TEXT_NODE &&
|
| 1009 |
-
rng.startOffset == 0 &&
|
| 1010 |
-
rng.endOffset == 0 &&
|
| 1011 |
-
currentCell &&
|
| 1012 |
-
(n.nodeName=="TR" || n==tableParent);
|
| 1013 |
-
tableCellSelection = (n.nodeName=="TD"||n.nodeName=="TH")&& !currentCell;
|
| 1014 |
-
return allOfCellSelected || tableCellSelection;
|
| 1015 |
-
// return false;
|
| 1016 |
-
}
|
| 1017 |
-
|
| 1018 |
-
// this nasty hack is here to work around some WebKit selection bugs.
|
| 1019 |
-
function fixTableCellSelection(ed) {
|
| 1020 |
-
if (!tinymce.isWebKit)
|
| 1021 |
-
return;
|
| 1022 |
-
|
| 1023 |
-
var rng = ed.selection.getRng();
|
| 1024 |
-
var n = ed.selection.getNode();
|
| 1025 |
-
var currentCell = ed.dom.getParent(rng.startContainer, 'TD,TH');
|
| 1026 |
-
|
| 1027 |
-
if (!tableCellSelected(ed, rng, n, currentCell))
|
| 1028 |
-
return;
|
| 1029 |
-
if (!currentCell) {
|
| 1030 |
-
currentCell=n;
|
| 1031 |
-
}
|
| 1032 |
-
|
| 1033 |
-
// Get the very last node inside the table cell
|
| 1034 |
-
var end = currentCell.lastChild;
|
| 1035 |
-
while (end.lastChild)
|
| 1036 |
-
end = end.lastChild;
|
| 1037 |
-
|
| 1038 |
-
// Select the entire table cell. Nothing outside of the table cell should be selected.
|
| 1039 |
-
rng.setEnd(end, end.nodeValue.length);
|
| 1040 |
-
ed.selection.setRng(rng);
|
| 1041 |
-
}
|
| 1042 |
-
ed.plugins.table.fixTableCellSelection=fixTableCellSelection;
|
| 1043 |
-
|
| 1044 |
-
// Add context menu
|
| 1045 |
-
if (ed && ed.plugins.contextmenu) {
|
| 1046 |
-
ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {
|
| 1047 |
-
var sm, se = ed.selection, el = se.getNode() || ed.getBody();
|
| 1048 |
-
|
| 1049 |
-
if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th') || ed.dom.select('td.mceSelected,th.mceSelected').length) {
|
| 1050 |
-
m.removeAll();
|
| 1051 |
-
|
| 1052 |
-
if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) {
|
| 1053 |
-
m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});
|
| 1054 |
-
m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});
|
| 1055 |
-
m.addSeparator();
|
| 1056 |
-
}
|
| 1057 |
-
|
| 1058 |
-
if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) {
|
| 1059 |
-
m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});
|
| 1060 |
-
m.addSeparator();
|
| 1061 |
-
}
|
| 1062 |
-
|
| 1063 |
-
m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}});
|
| 1064 |
-
m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'});
|
| 1065 |
-
m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'});
|
| 1066 |
-
m.addSeparator();
|
| 1067 |
-
|
| 1068 |
-
// Cell menu
|
| 1069 |
-
sm = m.addMenu({title : 'table.cell'});
|
| 1070 |
-
sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'});
|
| 1071 |
-
sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'});
|
| 1072 |
-
sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'});
|
| 1073 |
-
|
| 1074 |
-
// Row menu
|
| 1075 |
-
sm = m.addMenu({title : 'table.row'});
|
| 1076 |
-
sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'});
|
| 1077 |
-
sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'});
|
| 1078 |
-
sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'});
|
| 1079 |
-
sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'});
|
| 1080 |
-
sm.addSeparator();
|
| 1081 |
-
sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'});
|
| 1082 |
-
sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'});
|
| 1083 |
-
sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows);
|
| 1084 |
-
sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows);
|
| 1085 |
-
|
| 1086 |
-
// Column menu
|
| 1087 |
-
sm = m.addMenu({title : 'table.col'});
|
| 1088 |
-
sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'});
|
| 1089 |
-
sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'});
|
| 1090 |
-
sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'});
|
| 1091 |
-
} else
|
| 1092 |
-
m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'});
|
| 1093 |
-
});
|
| 1094 |
-
}
|
| 1095 |
-
|
| 1096 |
-
// Fix to allow navigating up and down in a table in WebKit browsers.
|
| 1097 |
-
if (tinymce.isWebKit) {
|
| 1098 |
-
function moveSelection(ed, e) {
|
| 1099 |
-
var VK = tinymce.VK;
|
| 1100 |
-
var key = e.keyCode;
|
| 1101 |
-
|
| 1102 |
-
function handle(upBool, sourceNode, event) {
|
| 1103 |
-
var siblingDirection = upBool ? 'previousSibling' : 'nextSibling';
|
| 1104 |
-
var currentRow = ed.dom.getParent(sourceNode, 'tr');
|
| 1105 |
-
var siblingRow = currentRow[siblingDirection];
|
| 1106 |
-
|
| 1107 |
-
if (siblingRow) {
|
| 1108 |
-
moveCursorToRow(ed, sourceNode, siblingRow, upBool);
|
| 1109 |
-
tinymce.dom.Event.cancel(event);
|
| 1110 |
-
return true;
|
| 1111 |
-
} else {
|
| 1112 |
-
var tableNode = ed.dom.getParent(currentRow, 'table');
|
| 1113 |
-
var middleNode = currentRow.parentNode;
|
| 1114 |
-
var parentNodeName = middleNode.nodeName.toLowerCase();
|
| 1115 |
-
if (parentNodeName === 'tbody' || parentNodeName === (upBool ? 'tfoot' : 'thead')) {
|
| 1116 |
-
var targetParent = getTargetParent(upBool, tableNode, middleNode, 'tbody');
|
| 1117 |
-
if (targetParent !== null) {
|
| 1118 |
-
return moveToRowInTarget(upBool, targetParent, sourceNode, event);
|
| 1119 |
-
}
|
| 1120 |
-
}
|
| 1121 |
-
return escapeTable(upBool, currentRow, siblingDirection, tableNode, event);
|
| 1122 |
-
}
|
| 1123 |
-
}
|
| 1124 |
-
|
| 1125 |
-
function getTargetParent(upBool, topNode, secondNode, nodeName) {
|
| 1126 |
-
var tbodies = ed.dom.select('>' + nodeName, topNode);
|
| 1127 |
-
var position = tbodies.indexOf(secondNode);
|
| 1128 |
-
if (upBool && position === 0 || !upBool && position === tbodies.length - 1) {
|
| 1129 |
-
return getFirstHeadOrFoot(upBool, topNode);
|
| 1130 |
-
} else if (position === -1) {
|
| 1131 |
-
var topOrBottom = secondNode.tagName.toLowerCase() === 'thead' ? 0 : tbodies.length - 1;
|
| 1132 |
-
return tbodies[topOrBottom];
|
| 1133 |
-
} else {
|
| 1134 |
-
return tbodies[position + (upBool ? -1 : 1)];
|
| 1135 |
-
}
|
| 1136 |
-
}
|
| 1137 |
-
|
| 1138 |
-
function getFirstHeadOrFoot(upBool, parent) {
|
| 1139 |
-
var tagName = upBool ? 'thead' : 'tfoot';
|
| 1140 |
-
var headOrFoot = ed.dom.select('>' + tagName, parent);
|
| 1141 |
-
return headOrFoot.length !== 0 ? headOrFoot[0] : null;
|
| 1142 |
-
}
|
| 1143 |
-
|
| 1144 |
-
function moveToRowInTarget(upBool, targetParent, sourceNode, event) {
|
| 1145 |
-
var targetRow = getChildForDirection(targetParent, upBool);
|
| 1146 |
-
targetRow && moveCursorToRow(ed, sourceNode, targetRow, upBool);
|
| 1147 |
-
tinymce.dom.Event.cancel(event);
|
| 1148 |
-
return true;
|
| 1149 |
-
}
|
| 1150 |
-
|
| 1151 |
-
function escapeTable(upBool, currentRow, siblingDirection, table, event) {
|
| 1152 |
-
var tableSibling = table[siblingDirection];
|
| 1153 |
-
if (tableSibling) {
|
| 1154 |
-
moveCursorToStartOfElement(tableSibling);
|
| 1155 |
-
return true;
|
| 1156 |
-
} else {
|
| 1157 |
-
var parentCell = ed.dom.getParent(table, 'td,th');
|
| 1158 |
-
if (parentCell) {
|
| 1159 |
-
return handle(upBool, parentCell, event);
|
| 1160 |
-
} else {
|
| 1161 |
-
var backUpSibling = getChildForDirection(currentRow, !upBool);
|
| 1162 |
-
moveCursorToStartOfElement(backUpSibling);
|
| 1163 |
-
return tinymce.dom.Event.cancel(event);
|
| 1164 |
-
}
|
| 1165 |
-
}
|
| 1166 |
-
}
|
| 1167 |
-
|
| 1168 |
-
function getChildForDirection(parent, up) {
|
| 1169 |
-
var child = parent && parent[up ? 'lastChild' : 'firstChild'];
|
| 1170 |
-
// BR is not a valid table child to return in this case we return the table cell
|
| 1171 |
-
return child && child.nodeName === 'BR' ? ed.dom.getParent(child, 'td,th') : child;
|
| 1172 |
-
}
|
| 1173 |
-
|
| 1174 |
-
function moveCursorToStartOfElement(n) {
|
| 1175 |
-
ed.selection.setCursorLocation(n, 0);
|
| 1176 |
-
}
|
| 1177 |
-
|
| 1178 |
-
function isVerticalMovement() {
|
| 1179 |
-
return key == VK.UP || key == VK.DOWN;
|
| 1180 |
-
}
|
| 1181 |
-
|
| 1182 |
-
function isInTable(ed) {
|
| 1183 |
-
var node = ed.selection.getNode();
|
| 1184 |
-
var currentRow = ed.dom.getParent(node, 'tr');
|
| 1185 |
-
return currentRow !== null;
|
| 1186 |
-
}
|
| 1187 |
-
|
| 1188 |
-
function columnIndex(column) {
|
| 1189 |
-
var colIndex = 0;
|
| 1190 |
-
var c = column;
|
| 1191 |
-
while (c.previousSibling) {
|
| 1192 |
-
c = c.previousSibling;
|
| 1193 |
-
colIndex = colIndex + getSpanVal(c, "colspan");
|
| 1194 |
-
}
|
| 1195 |
-
return colIndex;
|
| 1196 |
-
}
|
| 1197 |
-
|
| 1198 |
-
function findColumn(rowElement, columnIndex) {
|
| 1199 |
-
var c = 0;
|
| 1200 |
-
var r = 0;
|
| 1201 |
-
each(rowElement.children, function(cell, i) {
|
| 1202 |
-
c = c + getSpanVal(cell, "colspan");
|
| 1203 |
-
r = i;
|
| 1204 |
-
if (c > columnIndex)
|
| 1205 |
-
return false;
|
| 1206 |
-
});
|
| 1207 |
-
return r;
|
| 1208 |
-
}
|
| 1209 |
-
|
| 1210 |
-
function moveCursorToRow(ed, node, row, upBool) {
|
| 1211 |
-
var srcColumnIndex = columnIndex(ed.dom.getParent(node, 'td,th'));
|
| 1212 |
-
var tgtColumnIndex = findColumn(row, srcColumnIndex);
|
| 1213 |
-
var tgtNode = row.childNodes[tgtColumnIndex];
|
| 1214 |
-
var rowCellTarget = getChildForDirection(tgtNode, upBool);
|
| 1215 |
-
moveCursorToStartOfElement(rowCellTarget || tgtNode);
|
| 1216 |
-
}
|
| 1217 |
-
|
| 1218 |
-
function shouldFixCaret(preBrowserNode) {
|
| 1219 |
-
var newNode = ed.selection.getNode();
|
| 1220 |
-
var newParent = ed.dom.getParent(newNode, 'td,th');
|
| 1221 |
-
var oldParent = ed.dom.getParent(preBrowserNode, 'td,th');
|
| 1222 |
-
return newParent && newParent !== oldParent && checkSameParentTable(newParent, oldParent)
|
| 1223 |
-
}
|
| 1224 |
-
|
| 1225 |
-
function checkSameParentTable(nodeOne, NodeTwo) {
|
| 1226 |
-
return ed.dom.getParent(nodeOne, 'TABLE') === ed.dom.getParent(NodeTwo, 'TABLE');
|
| 1227 |
-
}
|
| 1228 |
-
|
| 1229 |
-
if (isVerticalMovement() && isInTable(ed)) {
|
| 1230 |
-
var preBrowserNode = ed.selection.getNode();
|
| 1231 |
-
setTimeout(function() {
|
| 1232 |
-
if (shouldFixCaret(preBrowserNode)) {
|
| 1233 |
-
handle(!e.shiftKey && key === VK.UP, preBrowserNode, e);
|
| 1234 |
-
}
|
| 1235 |
-
}, 0);
|
| 1236 |
-
}
|
| 1237 |
-
}
|
| 1238 |
-
|
| 1239 |
-
ed.onKeyDown.add(moveSelection);
|
| 1240 |
-
}
|
| 1241 |
-
|
| 1242 |
-
// Fixes an issue on Gecko where it's impossible to place the caret behind a table
|
| 1243 |
-
// This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled
|
| 1244 |
-
function fixTableCaretPos() {
|
| 1245 |
-
var last;
|
| 1246 |
-
|
| 1247 |
-
// Skip empty text nodes form the end
|
| 1248 |
-
for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ;
|
| 1249 |
-
|
| 1250 |
-
if (last && last.nodeName == 'TABLE') {
|
| 1251 |
-
if (ed.settings.forced_root_block)
|
| 1252 |
-
ed.dom.add(ed.getBody(), ed.settings.forced_root_block, null, tinymce.isIE ? ' ' : '<br data-mce-bogus="1" />');
|
| 1253 |
-
else
|
| 1254 |
-
ed.dom.add(ed.getBody(), 'br', {'data-mce-bogus': '1'});
|
| 1255 |
-
}
|
| 1256 |
-
};
|
| 1257 |
-
|
| 1258 |
-
// Fixes an bug where it's impossible to place the caret before a table in Gecko
|
| 1259 |
-
// this fix solves it by detecting when the caret is at the beginning of such a table
|
| 1260 |
-
// and then manually moves the caret infront of the table
|
| 1261 |
-
if (tinymce.isGecko) {
|
| 1262 |
-
ed.onKeyDown.add(function(ed, e) {
|
| 1263 |
-
var rng, table, dom = ed.dom;
|
| 1264 |
-
|
| 1265 |
-
// On gecko it's not possible to place the caret before a table
|
| 1266 |
-
if (e.keyCode == 37 || e.keyCode == 38) {
|
| 1267 |
-
rng = ed.selection.getRng();
|
| 1268 |
-
table = dom.getParent(rng.startContainer, 'table');
|
| 1269 |
-
|
| 1270 |
-
if (table && ed.getBody().firstChild == table) {
|
| 1271 |
-
if (isAtStart(rng, table)) {
|
| 1272 |
-
rng = dom.createRng();
|
| 1273 |
-
|
| 1274 |
-
rng.setStartBefore(table);
|
| 1275 |
-
rng.setEndBefore(table);
|
| 1276 |
-
|
| 1277 |
-
ed.selection.setRng(rng);
|
| 1278 |
-
|
| 1279 |
-
e.preventDefault();
|
| 1280 |
-
}
|
| 1281 |
-
}
|
| 1282 |
-
}
|
| 1283 |
-
});
|
| 1284 |
-
}
|
| 1285 |
-
|
| 1286 |
-
ed.onKeyUp.add(fixTableCaretPos);
|
| 1287 |
-
ed.onSetContent.add(fixTableCaretPos);
|
| 1288 |
-
ed.onVisualAid.add(fixTableCaretPos);
|
| 1289 |
-
|
| 1290 |
-
ed.onPreProcess.add(function(ed, o) {
|
| 1291 |
-
var last = o.node.lastChild;
|
| 1292 |
-
|
| 1293 |
-
if (last && (last.nodeName == "BR" || (last.childNodes.length == 1 && (last.firstChild.nodeName == 'BR' || last.firstChild.nodeValue == '\u00a0'))) && last.previousSibling && last.previousSibling.nodeName == "TABLE") {
|
| 1294 |
-
ed.dom.remove(last);
|
| 1295 |
-
}
|
| 1296 |
-
});
|
| 1297 |
-
|
| 1298 |
-
|
| 1299 |
-
/**
|
| 1300 |
-
* Fixes bug in Gecko where shift-enter in table cell does not place caret on new line
|
| 1301 |
-
*
|
| 1302 |
-
* Removed: Since the new enter logic seems to fix this one.
|
| 1303 |
-
*/
|
| 1304 |
-
/*
|
| 1305 |
-
if (tinymce.isGecko) {
|
| 1306 |
-
ed.onKeyDown.add(function(ed, e) {
|
| 1307 |
-
if (e.keyCode === tinymce.VK.ENTER && e.shiftKey) {
|
| 1308 |
-
var node = ed.selection.getRng().startContainer;
|
| 1309 |
-
var tableCell = dom.getParent(node, 'td,th');
|
| 1310 |
-
if (tableCell) {
|
| 1311 |
-
var zeroSizedNbsp = ed.getDoc().createTextNode("\uFEFF");
|
| 1312 |
-
dom.insertAfter(zeroSizedNbsp, node);
|
| 1313 |
-
}
|
| 1314 |
-
}
|
| 1315 |
-
});
|
| 1316 |
-
}
|
| 1317 |
-
*/
|
| 1318 |
-
|
| 1319 |
-
fixTableCaretPos();
|
| 1320 |
-
ed.startContent = ed.getContent({format : 'raw'});
|
| 1321 |
-
});
|
| 1322 |
-
|
| 1323 |
-
// Register action commands
|
| 1324 |
-
each({
|
| 1325 |
-
mceTableSplitCells : function(grid) {
|
| 1326 |
-
grid.split();
|
| 1327 |
-
},
|
| 1328 |
-
|
| 1329 |
-
mceTableMergeCells : function(grid) {
|
| 1330 |
-
var rowSpan, colSpan, cell;
|
| 1331 |
-
|
| 1332 |
-
cell = ed.dom.getParent(ed.selection.getNode(), 'th,td');
|
| 1333 |
-
if (cell) {
|
| 1334 |
-
rowSpan = cell.rowSpan;
|
| 1335 |
-
colSpan = cell.colSpan;
|
| 1336 |
-
}
|
| 1337 |
-
|
| 1338 |
-
if (!ed.dom.select('td.mceSelected,th.mceSelected').length) {
|
| 1339 |
-
winMan.open({
|
| 1340 |
-
url : url + '/merge_cells.htm',
|
| 1341 |
-
width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)),
|
| 1342 |
-
height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)),
|
| 1343 |
-
inline : 1
|
| 1344 |
-
}, {
|
| 1345 |
-
rows : rowSpan,
|
| 1346 |
-
cols : colSpan,
|
| 1347 |
-
onaction : function(data) {
|
| 1348 |
-
grid.merge(cell, data.cols, data.rows);
|
| 1349 |
-
},
|
| 1350 |
-
plugin_url : url
|
| 1351 |
-
});
|
| 1352 |
-
} else
|
| 1353 |
-
grid.merge();
|
| 1354 |
-
},
|
| 1355 |
-
|
| 1356 |
-
mceTableInsertRowBefore : function(grid) {
|
| 1357 |
-
grid.insertRow(true);
|
| 1358 |
-
},
|
| 1359 |
-
|
| 1360 |
-
mceTableInsertRowAfter : function(grid) {
|
| 1361 |
-
grid.insertRow();
|
| 1362 |
-
},
|
| 1363 |
-
|
| 1364 |
-
mceTableInsertColBefore : function(grid) {
|
| 1365 |
-
grid.insertCol(true);
|
| 1366 |
-
},
|
| 1367 |
-
|
| 1368 |
-
mceTableInsertColAfter : function(grid) {
|
| 1369 |
-
grid.insertCol();
|
| 1370 |
-
},
|
| 1371 |
-
|
| 1372 |
-
mceTableDeleteCol : function(grid) {
|
| 1373 |
-
grid.deleteCols();
|
| 1374 |
-
},
|
| 1375 |
-
|
| 1376 |
-
mceTableDeleteRow : function(grid) {
|
| 1377 |
-
grid.deleteRows();
|
| 1378 |
-
},
|
| 1379 |
-
|
| 1380 |
-
mceTableCutRow : function(grid) {
|
| 1381 |
-
clipboardRows = grid.cutRows();
|
| 1382 |
-
},
|
| 1383 |
-
|
| 1384 |
-
mceTableCopyRow : function(grid) {
|
| 1385 |
-
clipboardRows = grid.copyRows();
|
| 1386 |
-
},
|
| 1387 |
-
|
| 1388 |
-
mceTablePasteRowBefore : function(grid) {
|
| 1389 |
-
grid.pasteRows(clipboardRows, true);
|
| 1390 |
-
},
|
| 1391 |
-
|
| 1392 |
-
mceTablePasteRowAfter : function(grid) {
|
| 1393 |
-
grid.pasteRows(clipboardRows);
|
| 1394 |
-
},
|
| 1395 |
-
|
| 1396 |
-
mceTableDelete : function(grid) {
|
| 1397 |
-
grid.deleteTable();
|
| 1398 |
-
}
|
| 1399 |
-
}, function(func, name) {
|
| 1400 |
-
ed.addCommand(name, function() {
|
| 1401 |
-
var grid = createTableGrid();
|
| 1402 |
-
|
| 1403 |
-
if (grid) {
|
| 1404 |
-
func(grid);
|
| 1405 |
-
ed.execCommand('mceRepaint');
|
| 1406 |
-
cleanup();
|
| 1407 |
-
}
|
| 1408 |
-
});
|
| 1409 |
-
});
|
| 1410 |
-
|
| 1411 |
-
// Register dialog commands
|
| 1412 |
-
each({
|
| 1413 |
-
mceInsertTable : function(val) {
|
| 1414 |
-
winMan.open({
|
| 1415 |
-
url : url + '/table.htm',
|
| 1416 |
-
width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)),
|
| 1417 |
-
height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)),
|
| 1418 |
-
inline : 1
|
| 1419 |
-
}, {
|
| 1420 |
-
plugin_url : url,
|
| 1421 |
-
action : val ? val.action : 0
|
| 1422 |
-
});
|
| 1423 |
-
},
|
| 1424 |
-
|
| 1425 |
-
mceTableRowProps : function() {
|
| 1426 |
-
winMan.open({
|
| 1427 |
-
url : url + '/row.htm',
|
| 1428 |
-
width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)),
|
| 1429 |
-
height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)),
|
| 1430 |
-
inline : 1
|
| 1431 |
-
}, {
|
| 1432 |
-
plugin_url : url
|
| 1433 |
-
});
|
| 1434 |
-
},
|
| 1435 |
-
|
| 1436 |
-
mceTableCellProps : function() {
|
| 1437 |
-
winMan.open({
|
| 1438 |
-
url : url + '/cell.htm',
|
| 1439 |
-
width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)),
|
| 1440 |
-
height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)),
|
| 1441 |
-
inline : 1
|
| 1442 |
-
}, {
|
| 1443 |
-
plugin_url : url
|
| 1444 |
-
});
|
| 1445 |
-
}
|
| 1446 |
-
}, function(func, name) {
|
| 1447 |
-
ed.addCommand(name, function(ui, val) {
|
| 1448 |
-
func(val);
|
| 1449 |
-
});
|
| 1450 |
-
});
|
| 1451 |
-
}
|
| 1452 |
-
});
|
| 1453 |
-
|
| 1454 |
-
// Register plugin
|
| 1455 |
-
tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin);
|
| 1456 |
-
})(tinymce);
|
| 1 |
+
/**
|
| 2 |
+
* editor_plugin_src.js
|
| 3 |
+
*
|
| 4 |
+
* Copyright 2009, Moxiecode Systems AB
|
| 5 |
+
* Released under LGPL License.
|
| 6 |
+
*
|
| 7 |
+
* License: http://tinymce.moxiecode.com/license
|
| 8 |
+
* Contributing: http://tinymce.moxiecode.com/contributing
|
| 9 |
+
*/
|
| 10 |
+
|
| 11 |
+
(function(tinymce) {
|
| 12 |
+
var each = tinymce.each;
|
| 13 |
+
|
| 14 |
+
// Checks if the selection/caret is at the start of the specified block element
|
| 15 |
+
function isAtStart(rng, par) {
|
| 16 |
+
var doc = par.ownerDocument, rng2 = doc.createRange(), elm;
|
| 17 |
+
|
| 18 |
+
rng2.setStartBefore(par);
|
| 19 |
+
rng2.setEnd(rng.endContainer, rng.endOffset);
|
| 20 |
+
|
| 21 |
+
elm = doc.createElement('body');
|
| 22 |
+
elm.appendChild(rng2.cloneContents());
|
| 23 |
+
|
| 24 |
+
// Check for text characters of other elements that should be treated as content
|
| 25 |
+
return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0;
|
| 26 |
+
};
|
| 27 |
+
|
| 28 |
+
function getSpanVal(td, name) {
|
| 29 |
+
return parseInt(td.getAttribute(name) || 1);
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
/**
|
| 33 |
+
* Table Grid class.
|
| 34 |
+
*/
|
| 35 |
+
function TableGrid(table, dom, selection) {
|
| 36 |
+
var grid, startPos, endPos, selectedCell;
|
| 37 |
+
|
| 38 |
+
buildGrid();
|
| 39 |
+
selectedCell = dom.getParent(selection.getStart(), 'th,td');
|
| 40 |
+
if (selectedCell) {
|
| 41 |
+
startPos = getPos(selectedCell);
|
| 42 |
+
endPos = findEndPos();
|
| 43 |
+
selectedCell = getCell(startPos.x, startPos.y);
|
| 44 |
+
}
|
| 45 |
+
|
| 46 |
+
function cloneNode(node, children) {
|
| 47 |
+
node = node.cloneNode(children);
|
| 48 |
+
node.removeAttribute('id');
|
| 49 |
+
|
| 50 |
+
return node;
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
function buildGrid() {
|
| 54 |
+
var startY = 0;
|
| 55 |
+
|
| 56 |
+
grid = [];
|
| 57 |
+
|
| 58 |
+
each(['thead', 'tbody', 'tfoot'], function(part) {
|
| 59 |
+
var rows = dom.select('> ' + part + ' tr', table);
|
| 60 |
+
|
| 61 |
+
each(rows, function(tr, y) {
|
| 62 |
+
y += startY;
|
| 63 |
+
|
| 64 |
+
each(dom.select('> td, > th', tr), function(td, x) {
|
| 65 |
+
var x2, y2, rowspan, colspan;
|
| 66 |
+
|
| 67 |
+
// Skip over existing cells produced by rowspan
|
| 68 |
+
if (grid[y]) {
|
| 69 |
+
while (grid[y][x])
|
| 70 |
+
x++;
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
// Get col/rowspan from cell
|
| 74 |
+
rowspan = getSpanVal(td, 'rowspan');
|
| 75 |
+
colspan = getSpanVal(td, 'colspan');
|
| 76 |
+
|
| 77 |
+
// Fill out rowspan/colspan right and down
|
| 78 |
+
for (y2 = y; y2 < y + rowspan; y2++) {
|
| 79 |
+
if (!grid[y2])
|
| 80 |
+
grid[y2] = [];
|
| 81 |
+
|
| 82 |
+
for (x2 = x; x2 < x + colspan; x2++) {
|
| 83 |
+
grid[y2][x2] = {
|
| 84 |
+
part : part,
|
| 85 |
+
real : y2 == y && x2 == x,
|
| 86 |
+
elm : td,
|
| 87 |
+
rowspan : rowspan,
|
| 88 |
+
colspan : colspan
|
| 89 |
+
};
|
| 90 |
+
}
|
| 91 |
+
}
|
| 92 |
+
});
|
| 93 |
+
});
|
| 94 |
+
|
| 95 |
+
startY += rows.length;
|
| 96 |
+
});
|
| 97 |
+
};
|
| 98 |
+
|
| 99 |
+
function getCell(x, y) {
|
| 100 |
+
var row;
|
| 101 |
+
|
| 102 |
+
row = grid[y];
|
| 103 |
+
if (row)
|
| 104 |
+
return row[x];
|
| 105 |
+
};
|
| 106 |
+
|
| 107 |
+
function setSpanVal(td, name, val) {
|
| 108 |
+
if (td) {
|
| 109 |
+
val = parseInt(val);
|
| 110 |
+
|
| 111 |
+
if (val === 1)
|
| 112 |
+
td.removeAttribute(name, 1);
|
| 113 |
+
else
|
| 114 |
+
td.setAttribute(name, val, 1);
|
| 115 |
+
}
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
function isCellSelected(cell) {
|
| 119 |
+
return cell && (dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell);
|
| 120 |
+
};
|
| 121 |
+
|
| 122 |
+
function getSelectedRows() {
|
| 123 |
+
var rows = [];
|
| 124 |
+
|
| 125 |
+
each(table.rows, function(row) {
|
| 126 |
+
each(row.cells, function(cell) {
|
| 127 |
+
if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) {
|
| 128 |
+
rows.push(row);
|
| 129 |
+
return false;
|
| 130 |
+
}
|
| 131 |
+
});
|
| 132 |
+
});
|
| 133 |
+
|
| 134 |
+
return rows;
|
| 135 |
+
};
|
| 136 |
+
|
| 137 |
+
function deleteTable() {
|
| 138 |
+
var rng = dom.createRng();
|
| 139 |
+
|
| 140 |
+
rng.setStartAfter(table);
|
| 141 |
+
rng.setEndAfter(table);
|
| 142 |
+
|
| 143 |
+
selection.setRng(rng);
|
| 144 |
+
|
| 145 |
+
dom.remove(table);
|
| 146 |
+
};
|
| 147 |
+
|
| 148 |
+
function cloneCell(cell) {
|
| 149 |
+
var formatNode;
|
| 150 |
+
|
| 151 |
+
// Clone formats
|
| 152 |
+
tinymce.walk(cell, function(node) {
|
| 153 |
+
var curNode;
|
| 154 |
+
|
| 155 |
+
if (node.nodeType == 3) {
|
| 156 |
+
each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) {
|
| 157 |
+
node = cloneNode(node, false);
|
| 158 |
+
|
| 159 |
+
if (!formatNode)
|
| 160 |
+
formatNode = curNode = node;
|
| 161 |
+
else if (curNode)
|
| 162 |
+
curNode.appendChild(node);
|
| 163 |
+
|
| 164 |
+
curNode = node;
|
| 165 |
+
});
|
| 166 |
+
|
| 167 |
+
// Add something to the inner node
|
| 168 |
+
if (curNode)
|
| 169 |
+
curNode.innerHTML = tinymce.isIE ? ' ' : '<br data-mce-bogus="1" />';
|
| 170 |
+
|
| 171 |
+
return false;
|
| 172 |
+
}
|
| 173 |
+
}, 'childNodes');
|
| 174 |
+
|
| 175 |
+
cell = cloneNode(cell, false);
|
| 176 |
+
setSpanVal(cell, 'rowSpan', 1);
|
| 177 |
+
setSpanVal(cell, 'colSpan', 1);
|
| 178 |
+
|
| 179 |
+
if (formatNode) {
|
| 180 |
+
cell.appendChild(formatNode);
|
| 181 |
+
} else {
|
| 182 |
+
if (!tinymce.isIE)
|
| 183 |
+
cell.innerHTML = '<br data-mce-bogus="1" />';
|
| 184 |
+
}
|
| 185 |
+
|
| 186 |
+
return cell;
|
| 187 |
+
};
|
| 188 |
+
|
| 189 |
+
function cleanup() {
|
| 190 |
+
var rng = dom.createRng();
|
| 191 |
+
|
| 192 |
+
// Empty rows
|
| 193 |
+
each(dom.select('tr', table), function(tr) {
|
| 194 |
+
if (tr.cells.length == 0)
|
| 195 |
+
dom.remove(tr);
|
| 196 |
+
});
|
| 197 |
+
|
| 198 |
+
// Empty table
|
| 199 |
+
if (dom.select('tr', table).length == 0) {
|
| 200 |
+
rng.setStartAfter(table);
|
| 201 |
+
rng.setEndAfter(table);
|
| 202 |
+
selection.setRng(rng);
|
| 203 |
+
dom.remove(table);
|
| 204 |
+
return;
|
| 205 |
+
}
|
| 206 |
+
|
| 207 |
+
// Empty header/body/footer
|
| 208 |
+
each(dom.select('thead,tbody,tfoot', table), function(part) {
|
| 209 |
+
if (part.rows.length == 0)
|
| 210 |
+
dom.remove(part);
|
| 211 |
+
});
|
| 212 |
+
|
| 213 |
+
// Restore selection to start position if it still exists
|
| 214 |
+
buildGrid();
|
| 215 |
+
|
| 216 |
+
// Restore the selection to the closest table position
|
| 217 |
+
row = grid[Math.min(grid.length - 1, startPos.y)];
|
| 218 |
+
if (row) {
|
| 219 |
+
selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true);
|
| 220 |
+
selection.collapse(true);
|
| 221 |
+
}
|
| 222 |
+
};
|
| 223 |
+
|
| 224 |
+
function fillLeftDown(x, y, rows, cols) {
|
| 225 |
+
var tr, x2, r, c, cell;
|
| 226 |
+
|
| 227 |
+
tr = grid[y][x].elm.parentNode;
|
| 228 |
+
for (r = 1; r <= rows; r++) {
|
| 229 |
+
tr = dom.getNext(tr, 'tr');
|
| 230 |
+
|
| 231 |
+
if (tr) {
|
| 232 |
+
// Loop left to find real cell
|
| 233 |
+
for (x2 = x; x2 >= 0; x2--) {
|
| 234 |
+
cell = grid[y + r][x2].elm;
|
| 235 |
+
|
| 236 |
+
if (cell.parentNode == tr) {
|
| 237 |
+
// Append clones after
|
| 238 |
+
for (c = 1; c <= cols; c++)
|
| 239 |
+
dom.insertAfter(cloneCell(cell), cell);
|
| 240 |
+
|
| 241 |
+
break;
|
| 242 |
+
}
|
| 243 |
+
}
|
| 244 |
+
|
| 245 |
+
if (x2 == -1) {
|
| 246 |
+
// Insert nodes before first cell
|
| 247 |
+
for (c = 1; c <= cols; c++)
|
| 248 |
+
tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]);
|
| 249 |
+
}
|
| 250 |
+
}
|
| 251 |
+
}
|
| 252 |
+
};
|
| 253 |
+
|
| 254 |
+
function split() {
|
| 255 |
+
each(grid, function(row, y) {
|
| 256 |
+
each(row, function(cell, x) {
|
| 257 |
+
var colSpan, rowSpan, newCell, i;
|
| 258 |
+
|
| 259 |
+
if (isCellSelected(cell)) {
|
| 260 |
+
cell = cell.elm;
|
| 261 |
+
colSpan = getSpanVal(cell, 'colspan');
|
| 262 |
+
rowSpan = getSpanVal(cell, 'rowspan');
|
| 263 |
+
|
| 264 |
+
if (colSpan > 1 || rowSpan > 1) {
|
| 265 |
+
setSpanVal(cell, 'rowSpan', 1);
|
| 266 |
+
setSpanVal(cell, 'colSpan', 1);
|
| 267 |
+
|
| 268 |
+
// Insert cells right
|
| 269 |
+
for (i = 0; i < colSpan - 1; i++)
|
| 270 |
+
dom.insertAfter(cloneCell(cell), cell);
|
| 271 |
+
|
| 272 |
+
fillLeftDown(x, y, rowSpan - 1, colSpan);
|
| 273 |
+
}
|
| 274 |
+
}
|
| 275 |
+
});
|
| 276 |
+
});
|
| 277 |
+
};
|
| 278 |
+
|
| 279 |
+
function merge(cell, cols, rows) {
|
| 280 |
+
var startX, startY, endX, endY, x, y, startCell, endCell, cell, children, count;
|
| 281 |
+
|
| 282 |
+
// Use specified cell and cols/rows
|
| 283 |
+
if (cell) {
|
| 284 |
+
pos = getPos(cell);
|
| 285 |
+
startX = pos.x;
|
| 286 |
+
startY = pos.y;
|
| 287 |
+
endX = startX + (cols - 1);
|
| 288 |
+
endY = startY + (rows - 1);
|
| 289 |
+
} else {
|
| 290 |
+
startPos = endPos = null;
|
| 291 |
+
|
| 292 |
+
// Calculate start/end pos by checking for selected cells in grid works better with context menu
|
| 293 |
+
each(grid, function(row, y) {
|
| 294 |
+
each(row, function(cell, x) {
|
| 295 |
+
if (isCellSelected(cell)) {
|
| 296 |
+
if (!startPos) {
|
| 297 |
+
startPos = {x: x, y: y};
|
| 298 |
+
}
|
| 299 |
+
|
| 300 |
+
endPos = {x: x, y: y};
|
| 301 |
+
}
|
| 302 |
+
});
|
| 303 |
+
});
|
| 304 |
+
|
| 305 |
+
// Use selection
|
| 306 |
+
startX = startPos.x;
|
| 307 |
+
startY = startPos.y;
|
| 308 |
+
endX = endPos.x;
|
| 309 |
+
endY = endPos.y;
|
| 310 |
+
}
|
| 311 |
+
|
| 312 |
+
// Find start/end cells
|
| 313 |
+
startCell = getCell(startX, startY);
|
| 314 |
+
endCell = getCell(endX, endY);
|
| 315 |
+
|
| 316 |
+
// Check if the cells exists and if they are of the same part for example tbody = tbody
|
| 317 |
+
if (startCell && endCell && startCell.part == endCell.part) {
|
| 318 |
+
// Split and rebuild grid
|
| 319 |
+
split();
|
| 320 |
+
buildGrid();
|
| 321 |
+
|
| 322 |
+
// Set row/col span to start cell
|
| 323 |
+
startCell = getCell(startX, startY).elm;
|
| 324 |
+
setSpanVal(startCell, 'colSpan', (endX - startX) + 1);
|
| 325 |
+
setSpanVal(startCell, 'rowSpan', (endY - startY) + 1);
|
| 326 |
+
|
| 327 |
+
// Remove other cells and add it's contents to the start cell
|
| 328 |
+
for (y = startY; y <= endY; y++) {
|
| 329 |
+
for (x = startX; x <= endX; x++) {
|
| 330 |
+
if (!grid[y] || !grid[y][x])
|
| 331 |
+
continue;
|
| 332 |
+
|
| 333 |
+
cell = grid[y][x].elm;
|
| 334 |
+
|
| 335 |
+
if (cell != startCell) {
|
| 336 |
+
// Move children to startCell
|
| 337 |
+
children = tinymce.grep(cell.childNodes);
|
| 338 |
+
each(children, function(node) {
|
| 339 |
+
startCell.appendChild(node);
|
| 340 |
+
});
|
| 341 |
+
|
| 342 |
+
// Remove bogus nodes if there is children in the target cell
|
| 343 |
+
if (children.length) {
|
| 344 |
+
children = tinymce.grep(startCell.childNodes);
|
| 345 |
+
count = 0;
|
| 346 |
+
each(children, function(node) {
|
| 347 |
+
if (node.nodeName == 'BR' && dom.getAttrib(node, 'data-mce-bogus') && count++ < children.length - 1)
|
| 348 |
+
startCell.removeChild(node);
|
| 349 |
+
});
|
| 350 |
+
}
|
| 351 |
+
|
| 352 |
+
// Remove cell
|
| 353 |
+
dom.remove(cell);
|
| 354 |
+
}
|
| 355 |
+
}
|
| 356 |
+
}
|
| 357 |
+
|
| 358 |
+
// Remove empty rows etc and restore caret location
|
| 359 |
+
cleanup();
|
| 360 |
+
}
|
| 361 |
+
};
|
| 362 |
+
|
| 363 |
+
function insertRow(before) {
|
| 364 |
+
var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan;
|
| 365 |
+
|
| 366 |
+
// Find first/last row
|
| 367 |
+
each(grid, function(row, y) {
|
| 368 |
+
each(row, function(cell, x) {
|
| 369 |
+
if (isCellSelected(cell)) {
|
| 370 |
+
cell = cell.elm;
|
| 371 |
+
rowElm = cell.parentNode;
|
| 372 |
+
newRow = cloneNode(rowElm, false);
|
| 373 |
+
posY = y;
|
| 374 |
+
|
| 375 |
+
if (before)
|
| 376 |
+
return false;
|
| 377 |
+
}
|
| 378 |
+
});
|
| 379 |
+
|
| 380 |
+
if (before)
|
| 381 |
+
return !posY;
|
| 382 |
+
});
|
| 383 |
+
|
| 384 |
+
for (x = 0; x < grid[0].length; x++) {
|
| 385 |
+
// Cell not found could be because of an invalid table structure
|
| 386 |
+
if (!grid[posY][x])
|
| 387 |
+
continue;
|
| 388 |
+
|
| 389 |
+
cell = grid[posY][x].elm;
|
| 390 |
+
|
| 391 |
+
if (cell != lastCell) {
|
| 392 |
+
if (!before) {
|
| 393 |
+
rowSpan = getSpanVal(cell, 'rowspan');
|
| 394 |
+
if (rowSpan > 1) {
|
| 395 |
+
setSpanVal(cell, 'rowSpan', rowSpan + 1);
|
| 396 |
+
continue;
|
| 397 |
+
}
|
| 398 |
+
} else {
|
| 399 |
+
// Check if cell above can be expanded
|
| 400 |
+
if (posY > 0 && grid[posY - 1][x]) {
|
| 401 |
+
otherCell = grid[posY - 1][x].elm;
|
| 402 |
+
rowSpan = getSpanVal(otherCell, 'rowSpan');
|
| 403 |
+
if (rowSpan > 1) {
|
| 404 |
+
setSpanVal(otherCell, 'rowSpan', rowSpan + 1);
|
| 405 |
+
continue;
|
| 406 |
+
}
|
| 407 |
+
}
|
| 408 |
+
}
|
| 409 |
+
|
| 410 |
+
// Insert new cell into new row
|
| 411 |
+
newCell = cloneCell(cell);
|
| 412 |
+
setSpanVal(newCell, 'colSpan', cell.colSpan);
|
| 413 |
+
|
| 414 |
+
newRow.appendChild(newCell);
|
| 415 |
+
|
| 416 |
+
lastCell = cell;
|
| 417 |
+
}
|
| 418 |
+
}
|
| 419 |
+
|
| 420 |
+
if (newRow.hasChildNodes()) {
|
| 421 |
+
if (!before)
|
| 422 |
+
dom.insertAfter(newRow, rowElm);
|
| 423 |
+
else
|
| 424 |
+
rowElm.parentNode.insertBefore(newRow, rowElm);
|
| 425 |
+
}
|
| 426 |
+
};
|
| 427 |
+
|
| 428 |
+
function insertCol(before) {
|
| 429 |
+
var posX, lastCell;
|
| 430 |
+
|
| 431 |
+
// Find first/last column
|
| 432 |
+
each(grid, function(row, y) {
|
| 433 |
+
each(row, function(cell, x) {
|
| 434 |
+
if (isCellSelected(cell)) {
|
| 435 |
+
posX = x;
|
| 436 |
+
|
| 437 |
+
if (before)
|
| 438 |
+
return false;
|
| 439 |
+
}
|
| 440 |
+
});
|
| 441 |
+
|
| 442 |
+
if (before)
|
| 443 |
+
return !posX;
|
| 444 |
+
});
|
| 445 |
+
|
| 446 |
+
each(grid, function(row, y) {
|
| 447 |
+
var cell, rowSpan, colSpan;
|
| 448 |
+
|
| 449 |
+
if (!row[posX])
|
| 450 |
+
return;
|
| 451 |
+
|
| 452 |
+
cell = row[posX].elm;
|
| 453 |
+
if (cell != lastCell) {
|
| 454 |
+
colSpan = getSpanVal(cell, 'colspan');
|
| 455 |
+
rowSpan = getSpanVal(cell, 'rowspan');
|
| 456 |
+
|
| 457 |
+
if (colSpan == 1) {
|
| 458 |
+
if (!before) {
|
| 459 |
+
dom.insertAfter(cloneCell(cell), cell);
|
| 460 |
+
fillLeftDown(posX, y, rowSpan - 1, colSpan);
|
| 461 |
+
} else {
|
| 462 |
+
cell.parentNode.insertBefore(cloneCell(cell), cell);
|
| 463 |
+
fillLeftDown(posX, y, rowSpan - 1, colSpan);
|
| 464 |
+
}
|
| 465 |
+
} else
|
| 466 |
+
setSpanVal(cell, 'colSpan', cell.colSpan + 1);
|
| 467 |
+
|
| 468 |
+
lastCell = cell;
|
| 469 |
+
}
|
| 470 |
+
});
|
| 471 |
+
};
|
| 472 |
+
|
| 473 |
+
function deleteCols() {
|
| 474 |
+
var cols = [];
|
| 475 |
+
|
| 476 |
+
// Get selected column indexes
|
| 477 |
+
each(grid, function(row, y) {
|
| 478 |
+
each(row, function(cell, x) {
|
| 479 |
+
if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) {
|
| 480 |
+
each(grid, function(row) {
|
| 481 |
+
var cell = row[x].elm, colSpan;
|
| 482 |
+
|
| 483 |
+
colSpan = getSpanVal(cell, 'colSpan');
|
| 484 |
+
|
| 485 |
+
if (colSpan > 1)
|
| 486 |
+
setSpanVal(cell, 'colSpan', colSpan - 1);
|
| 487 |
+
else
|
| 488 |
+
dom.remove(cell);
|
| 489 |
+
});
|
| 490 |
+
|
| 491 |
+
cols.push(x);
|
| 492 |
+
}
|
| 493 |
+
});
|
| 494 |
+
});
|
| 495 |
+
|
| 496 |
+
cleanup();
|
| 497 |
+
};
|
| 498 |
+
|
| 499 |
+
function deleteRows() {
|
| 500 |
+
var rows;
|
| 501 |
+
|
| 502 |
+
function deleteRow(tr) {
|
| 503 |
+
var nextTr, pos, lastCell;
|
| 504 |
+
|
| 505 |
+
nextTr = dom.getNext(tr, 'tr');
|
| 506 |
+
|
| 507 |
+
// Move down row spanned cells
|
| 508 |
+
each(tr.cells, function(cell) {
|
| 509 |
+
var rowSpan = getSpanVal(cell, 'rowSpan');
|
| 510 |
+
|
| 511 |
+
if (rowSpan > 1) {
|
| 512 |
+
setSpanVal(cell, 'rowSpan', rowSpan - 1);
|
| 513 |
+
pos = getPos(cell);
|
| 514 |
+
fillLeftDown(pos.x, pos.y, 1, 1);
|
| 515 |
+
}
|
| 516 |
+
});
|
| 517 |
+
|
| 518 |
+
// Delete cells
|
| 519 |
+
pos = getPos(tr.cells[0]);
|
| 520 |
+
each(grid[pos.y], function(cell) {
|
| 521 |
+
var rowSpan;
|
| 522 |
+
|
| 523 |
+
cell = cell.elm;
|
| 524 |
+
|
| 525 |
+
if (cell != lastCell) {
|
| 526 |
+
rowSpan = getSpanVal(cell, 'rowSpan');
|
| 527 |
+
|
| 528 |
+
if (rowSpan <= 1)
|
| 529 |
+
dom.remove(cell);
|
| 530 |
+
else
|
| 531 |
+
setSpanVal(cell, 'rowSpan', rowSpan - 1);
|
| 532 |
+
|
| 533 |
+
lastCell = cell;
|
| 534 |
+
}
|
| 535 |
+
});
|
| 536 |
+
};
|
| 537 |
+
|
| 538 |
+
// Get selected rows and move selection out of scope
|
| 539 |
+
rows = getSelectedRows();
|
| 540 |
+
|
| 541 |
+
// Delete all selected rows
|
| 542 |
+
each(rows.reverse(), function(tr) {
|
| 543 |
+
deleteRow(tr);
|
| 544 |
+
});
|
| 545 |
+
|
| 546 |
+
cleanup();
|
| 547 |
+
};
|
| 548 |
+
|
| 549 |
+
function cutRows() {
|
| 550 |
+
var rows = getSelectedRows();
|
| 551 |
+
|
| 552 |
+
dom.remove(rows);
|
| 553 |
+
cleanup();
|
| 554 |
+
|
| 555 |
+
return rows;
|
| 556 |
+
};
|
| 557 |
+
|
| 558 |
+
function copyRows() {
|
| 559 |
+
var rows = getSelectedRows();
|
| 560 |
+
|
| 561 |
+
each(rows, function(row, i) {
|
| 562 |
+
rows[i] = cloneNode(row, true);
|
| 563 |
+
});
|
| 564 |
+
|
| 565 |
+
return rows;
|
| 566 |
+
};
|
| 567 |
+
|
| 568 |
+
function pasteRows(rows, before) {
|
| 569 |
+
// If we don't have any rows in the clipboard, return immediately
|
| 570 |
+
if(!rows)
|
| 571 |
+
return;
|
| 572 |
+
|
| 573 |
+
var selectedRows = getSelectedRows(),
|
| 574 |
+
targetRow = selectedRows[before ? 0 : selectedRows.length - 1],
|
| 575 |
+
targetCellCount = targetRow.cells.length;
|
| 576 |
+
|
| 577 |
+
// Calc target cell count
|
| 578 |
+
each(grid, function(row) {
|
| 579 |
+
var match;
|
| 580 |
+
|
| 581 |
+
targetCellCount = 0;
|
| 582 |
+
each(row, function(cell, x) {
|
| 583 |
+
if (cell.real)
|
| 584 |
+
targetCellCount += cell.colspan;
|
| 585 |
+
|
| 586 |
+
if (cell.elm.parentNode == targetRow)
|
| 587 |
+
match = 1;
|
| 588 |
+
});
|
| 589 |
+
|
| 590 |
+
if (match)
|
| 591 |
+
return false;
|
| 592 |
+
});
|
| 593 |
+
|
| 594 |
+
if (!before)
|
| 595 |
+
rows.reverse();
|
| 596 |
+
|
| 597 |
+
each(rows, function(row) {
|
| 598 |
+
var cellCount = row.cells.length, cell;
|
| 599 |
+
|
| 600 |
+
// Remove col/rowspans
|
| 601 |
+
for (i = 0; i < cellCount; i++) {
|
| 602 |
+
cell = row.cells[i];
|
| 603 |
+
setSpanVal(cell, 'colSpan', 1);
|
| 604 |
+
setSpanVal(cell, 'rowSpan', 1);
|
| 605 |
+
}
|
| 606 |
+
|
| 607 |
+
// Needs more cells
|
| 608 |
+
for (i = cellCount; i < targetCellCount; i++)
|
| 609 |
+
row.appendChild(cloneCell(row.cells[cellCount - 1]));
|
| 610 |
+
|
| 611 |
+
// Needs less cells
|
| 612 |
+
for (i = targetCellCount; i < cellCount; i++)
|
| 613 |
+
dom.remove(row.cells[i]);
|
| 614 |
+
|
| 615 |
+
// Add before/after
|
| 616 |
+
if (before)
|
| 617 |
+
targetRow.parentNode.insertBefore(row, targetRow);
|
| 618 |
+
else
|
| 619 |
+
dom.insertAfter(row, targetRow);
|
| 620 |
+
});
|
| 621 |
+
|
| 622 |
+
// Remove current selection
|
| 623 |
+
dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
|
| 624 |
+
};
|
| 625 |
+
|
| 626 |
+
function getPos(target) {
|
| 627 |
+
var pos;
|
| 628 |
+
|
| 629 |
+
each(grid, function(row, y) {
|
| 630 |
+
each(row, function(cell, x) {
|
| 631 |
+
if (cell.elm == target) {
|
| 632 |
+
pos = {x : x, y : y};
|
| 633 |
+
return false;
|
| 634 |
+
}
|
| 635 |
+
});
|
| 636 |
+
|
| 637 |
+
return !pos;
|
| 638 |
+
});
|
| 639 |
+
|
| 640 |
+
return pos;
|
| 641 |
+
};
|
| 642 |
+
|
| 643 |
+
function setStartCell(cell) {
|
| 644 |
+
startPos = getPos(cell);
|
| 645 |
+
};
|
| 646 |
+
|
| 647 |
+
function findEndPos() {
|
| 648 |
+
var pos, maxX, maxY;
|
| 649 |
+
|
| 650 |
+
maxX = maxY = 0;
|
| 651 |
+
|
| 652 |
+
each(grid, function(row, y) {
|
| 653 |
+
each(row, function(cell, x) {
|
| 654 |
+
var colSpan, rowSpan;
|
| 655 |
+
|
| 656 |
+
if (isCellSelected(cell)) {
|
| 657 |
+
cell = grid[y][x];
|
| 658 |
+
|
| 659 |
+
if (x > maxX)
|
| 660 |
+
maxX = x;
|
| 661 |
+
|
| 662 |
+
if (y > maxY)
|
| 663 |
+
maxY = y;
|
| 664 |
+
|
| 665 |
+
if (cell.real) {
|
| 666 |
+
colSpan = cell.colspan - 1;
|
| 667 |
+
rowSpan = cell.rowspan - 1;
|
| 668 |
+
|
| 669 |
+
if (colSpan) {
|
| 670 |
+
if (x + colSpan > maxX)
|
| 671 |
+
maxX = x + colSpan;
|
| 672 |
+
}
|
| 673 |
+
|
| 674 |
+
if (rowSpan) {
|
| 675 |
+
if (y + rowSpan > maxY)
|
| 676 |
+
maxY = y + rowSpan;
|
| 677 |
+
}
|
| 678 |
+
}
|
| 679 |
+
}
|
| 680 |
+
});
|
| 681 |
+
});
|
| 682 |
+
|
| 683 |
+
return {x : maxX, y : maxY};
|
| 684 |
+
};
|
| 685 |
+
|
| 686 |
+
function setEndCell(cell) {
|
| 687 |
+
var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan;
|
| 688 |
+
|
| 689 |
+
endPos = getPos(cell);
|
| 690 |
+
|
| 691 |
+
if (startPos && endPos) {
|
| 692 |
+
// Get start/end positions
|
| 693 |
+
startX = Math.min(startPos.x, endPos.x);
|
| 694 |
+
startY = Math.min(startPos.y, endPos.y);
|
| 695 |
+
endX = Math.max(startPos.x, endPos.x);
|
| 696 |
+
endY = Math.max(startPos.y, endPos.y);
|
| 697 |
+
|
| 698 |
+
// Expand end positon to include spans
|
| 699 |
+
maxX = endX;
|
| 700 |
+
maxY = endY;
|
| 701 |
+
|
| 702 |
+
// Expand startX
|
| 703 |
+
for (y = startY; y <= maxY; y++) {
|
| 704 |
+
cell = grid[y][startX];
|
| 705 |
+
|
| 706 |
+
if (!cell.real) {
|
| 707 |
+
if (startX - (cell.colspan - 1) < startX)
|
| 708 |
+
startX -= cell.colspan - 1;
|
| 709 |
+
}
|
| 710 |
+
}
|
| 711 |
+
|
| 712 |
+
// Expand startY
|
| 713 |
+
for (x = startX; x <= maxX; x++) {
|
| 714 |
+
cell = grid[startY][x];
|
| 715 |
+
|
| 716 |
+
if (!cell.real) {
|
| 717 |
+
if (startY - (cell.rowspan - 1) < startY)
|
| 718 |
+
startY -= cell.rowspan - 1;
|
| 719 |
+
}
|
| 720 |
+
}
|
| 721 |
+
|
| 722 |
+
// Find max X, Y
|
| 723 |
+
for (y = startY; y <= endY; y++) {
|
| 724 |
+
for (x = startX; x <= endX; x++) {
|
| 725 |
+
cell = grid[y][x];
|
| 726 |
+
|
| 727 |
+
if (cell.real) {
|
| 728 |
+
colSpan = cell.colspan - 1;
|
| 729 |
+
rowSpan = cell.rowspan - 1;
|
| 730 |
+
|
| 731 |
+
if (colSpan) {
|
| 732 |
+
if (x + colSpan > maxX)
|
| 733 |
+
maxX = x + colSpan;
|
| 734 |
+
}
|
| 735 |
+
|
| 736 |
+
if (rowSpan) {
|
| 737 |
+
if (y + rowSpan > maxY)
|
| 738 |
+
maxY = y + rowSpan;
|
| 739 |
+
}
|
| 740 |
+
}
|
| 741 |
+
}
|
| 742 |
+
}
|
| 743 |
+
|
| 744 |
+
// Remove current selection
|
| 745 |
+
dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
|
| 746 |
+
|
| 747 |
+
// Add new selection
|
| 748 |
+
for (y = startY; y <= maxY; y++) {
|
| 749 |
+
for (x = startX; x <= maxX; x++) {
|
| 750 |
+
if (grid[y][x])
|
| 751 |
+
dom.addClass(grid[y][x].elm, 'mceSelected');
|
| 752 |
+
}
|
| 753 |
+
}
|
| 754 |
+
}
|
| 755 |
+
};
|
| 756 |
+
|
| 757 |
+
// Expose to public
|
| 758 |
+
tinymce.extend(this, {
|
| 759 |
+
deleteTable : deleteTable,
|
| 760 |
+
split : split,
|
| 761 |
+
merge : merge,
|
| 762 |
+
insertRow : insertRow,
|
| 763 |
+
insertCol : insertCol,
|
| 764 |
+
deleteCols : deleteCols,
|
| 765 |
+
deleteRows : deleteRows,
|
| 766 |
+
cutRows : cutRows,
|
| 767 |
+
copyRows : copyRows,
|
| 768 |
+
pasteRows : pasteRows,
|
| 769 |
+
getPos : getPos,
|
| 770 |
+
setStartCell : setStartCell,
|
| 771 |
+
setEndCell : setEndCell
|
| 772 |
+
});
|
| 773 |
+
};
|
| 774 |
+
|
| 775 |
+
tinymce.create('tinymce.plugins.TablePlugin', {
|
| 776 |
+
init : function(ed, url) {
|
| 777 |
+
var winMan, clipboardRows, hasCellSelection = true; // Might be selected cells on reload
|
| 778 |
+
|
| 779 |
+
function createTableGrid(node) {
|
| 780 |
+
var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table');
|
| 781 |
+
|
| 782 |
+
if (tblElm)
|
| 783 |
+
return new TableGrid(tblElm, ed.dom, selection);
|
| 784 |
+
};
|
| 785 |
+
|
| 786 |
+
function cleanup() {
|
| 787 |
+
// Restore selection possibilities
|
| 788 |
+
ed.getBody().style.webkitUserSelect = '';
|
| 789 |
+
|
| 790 |
+
if (hasCellSelection) {
|
| 791 |
+
ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
|
| 792 |
+
hasCellSelection = false;
|
| 793 |
+
}
|
| 794 |
+
};
|
| 795 |
+
|
| 796 |
+
// Register buttons
|
| 797 |
+
each([
|
| 798 |
+
['table', 'table.desc', 'mceInsertTable', true],
|
| 799 |
+
['delete_table', 'table.del', 'mceTableDelete'],
|
| 800 |
+
['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'],
|
| 801 |
+
['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'],
|
| 802 |
+
['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'],
|
| 803 |
+
['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'],
|
| 804 |
+
['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'],
|
| 805 |
+
['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'],
|
| 806 |
+
['row_props', 'table.row_desc', 'mceTableRowProps', true],
|
| 807 |
+
['cell_props', 'table.cell_desc', 'mceTableCellProps', true],
|
| 808 |
+
['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true],
|
| 809 |
+
['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true]
|
| 810 |
+
], function(c) {
|
| 811 |
+
ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]});
|
| 812 |
+
});
|
| 813 |
+
|
| 814 |
+
// Select whole table is a table border is clicked
|
| 815 |
+
if (!tinymce.isIE) {
|
| 816 |
+
ed.onClick.add(function(ed, e) {
|
| 817 |
+
e = e.target;
|
| 818 |
+
|
| 819 |
+
if (e.nodeName === 'TABLE') {
|
| 820 |
+
ed.selection.select(e);
|
| 821 |
+
ed.nodeChanged();
|
| 822 |
+
}
|
| 823 |
+
});
|
| 824 |
+
}
|
| 825 |
+
|
| 826 |
+
ed.onPreProcess.add(function(ed, args) {
|
| 827 |
+
var nodes, i, node, dom = ed.dom, value;
|
| 828 |
+
|
| 829 |
+
nodes = dom.select('table', args.node);
|
| 830 |
+
i = nodes.length;
|
| 831 |
+
while (i--) {
|
| 832 |
+
node = nodes[i];
|
| 833 |
+
dom.setAttrib(node, 'data-mce-style', '');
|
| 834 |
+
|
| 835 |
+
if ((value = dom.getAttrib(node, 'width'))) {
|
| 836 |
+
dom.setStyle(node, 'width', value);
|
| 837 |
+
dom.setAttrib(node, 'width', '');
|
| 838 |
+
}
|
| 839 |
+
|
| 840 |
+
if ((value = dom.getAttrib(node, 'height'))) {
|
| 841 |
+
dom.setStyle(node, 'height', value);
|
| 842 |
+
dom.setAttrib(node, 'height', '');
|
| 843 |
+
}
|
| 844 |
+
}
|
| 845 |
+
});
|
| 846 |
+
|
| 847 |
+
// Handle node change updates
|
| 848 |
+
ed.onNodeChange.add(function(ed, cm, n) {
|
| 849 |
+
var p;
|
| 850 |
+
|
| 851 |
+
n = ed.selection.getStart();
|
| 852 |
+
p = ed.dom.getParent(n, 'td,th,caption');
|
| 853 |
+
cm.setActive('table', n.nodeName === 'TABLE' || !!p);
|
| 854 |
+
|
| 855 |
+
// Disable table tools if we are in caption
|
| 856 |
+
if (p && p.nodeName === 'CAPTION')
|
| 857 |
+
p = 0;
|
| 858 |
+
|
| 859 |
+
cm.setDisabled('delete_table', !p);
|
| 860 |
+
cm.setDisabled('delete_col', !p);
|
| 861 |
+
cm.setDisabled('delete_table', !p);
|
| 862 |
+
cm.setDisabled('delete_row', !p);
|
| 863 |
+
cm.setDisabled('col_after', !p);
|
| 864 |
+
cm.setDisabled('col_before', !p);
|
| 865 |
+
cm.setDisabled('row_after', !p);
|
| 866 |
+
cm.setDisabled('row_before', !p);
|
| 867 |
+
cm.setDisabled('row_props', !p);
|
| 868 |
+
cm.setDisabled('cell_props', !p);
|
| 869 |
+
cm.setDisabled('split_cells', !p);
|
| 870 |
+
cm.setDisabled('merge_cells', !p);
|
| 871 |
+
});
|
| 872 |
+
|
| 873 |
+
ed.onInit.add(function(ed) {
|
| 874 |
+
var startTable, startCell, dom = ed.dom, tableGrid;
|
| 875 |
+
|
| 876 |
+
winMan = ed.windowManager;
|
| 877 |
+
|
| 878 |
+
// Add cell selection logic
|
| 879 |
+
ed.onMouseDown.add(function(ed, e) {
|
| 880 |
+
if (e.button != 2) {
|
| 881 |
+
cleanup();
|
| 882 |
+
|
| 883 |
+
startCell = dom.getParent(e.target, 'td,th');
|
| 884 |
+
startTable = dom.getParent(startCell, 'table');
|
| 885 |
+
}
|
| 886 |
+
});
|
| 887 |
+
|
| 888 |
+
dom.bind(ed.getDoc(), 'mouseover', function(e) {
|
| 889 |
+
var sel, table, target = e.target;
|
| 890 |
+
|
| 891 |
+
if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) {
|
| 892 |
+
table = dom.getParent(target, 'table');
|
| 893 |
+
if (table == startTable) {
|
| 894 |
+
if (!tableGrid) {
|
| 895 |
+
tableGrid = createTableGrid(table);
|
| 896 |
+
tableGrid.setStartCell(startCell);
|
| 897 |
+
|
| 898 |
+
ed.getBody().style.webkitUserSelect = 'none';
|
| 899 |
+
}
|
| 900 |
+
|
| 901 |
+
tableGrid.setEndCell(target);
|
| 902 |
+
hasCellSelection = true;
|
| 903 |
+
}
|
| 904 |
+
|
| 905 |
+
// Remove current selection
|
| 906 |
+
sel = ed.selection.getSel();
|
| 907 |
+
|
| 908 |
+
try {
|
| 909 |
+
if (sel.removeAllRanges)
|
| 910 |
+
sel.removeAllRanges();
|
| 911 |
+
else
|
| 912 |
+
sel.empty();
|
| 913 |
+
} catch (ex) {
|
| 914 |
+
// IE9 might throw errors here
|
| 915 |
+
}
|
| 916 |
+
|
| 917 |
+
e.preventDefault();
|
| 918 |
+
}
|
| 919 |
+
});
|
| 920 |
+
|
| 921 |
+
ed.onMouseUp.add(function(ed, e) {
|
| 922 |
+
var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode;
|
| 923 |
+
|
| 924 |
+
// Move selection to startCell
|
| 925 |
+
if (startCell) {
|
| 926 |
+
if (tableGrid)
|
| 927 |
+
ed.getBody().style.webkitUserSelect = '';
|
| 928 |
+
|
| 929 |
+
function setPoint(node, start) {
|
| 930 |
+
var walker = new tinymce.dom.TreeWalker(node, node);
|
| 931 |
+
|
| 932 |
+
do {
|
| 933 |
+
// Text node
|
| 934 |
+
if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) {
|
| 935 |
+
if (start)
|
| 936 |
+
rng.setStart(node, 0);
|
| 937 |
+
else
|
| 938 |
+
rng.setEnd(node, node.nodeValue.length);
|
| 939 |
+
|
| 940 |
+
return;
|
| 941 |
+
}
|
| 942 |
+
|
| 943 |
+
// BR element
|
| 944 |
+
if (node.nodeName == 'BR') {
|
| 945 |
+
if (start)
|
| 946 |
+
rng.setStartBefore(node);
|
| 947 |
+
else
|
| 948 |
+
rng.setEndBefore(node);
|
| 949 |
+
|
| 950 |
+
return;
|
| 951 |
+
}
|
| 952 |
+
} while (node = (start ? walker.next() : walker.prev()));
|
| 953 |
+
}
|
| 954 |
+
|
| 955 |
+
// Try to expand text selection as much as we can only Gecko supports cell selection
|
| 956 |
+
selectedCells = dom.select('td.mceSelected,th.mceSelected');
|
| 957 |
+
if (selectedCells.length > 0) {
|
| 958 |
+
rng = dom.createRng();
|
| 959 |
+
node = selectedCells[0];
|
| 960 |
+
endNode = selectedCells[selectedCells.length - 1];
|
| 961 |
+
rng.setStartBefore(node);
|
| 962 |
+
rng.setEndAfter(node);
|
| 963 |
+
|
| 964 |
+
setPoint(node, 1);
|
| 965 |
+
walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table'));
|
| 966 |
+
|
| 967 |
+
do {
|
| 968 |
+
if (node.nodeName == 'TD' || node.nodeName == 'TH') {
|
| 969 |
+
if (!dom.hasClass(node, 'mceSelected'))
|
| 970 |
+
break;
|
| 971 |
+
|
| 972 |
+
lastNode = node;
|
| 973 |
+
}
|
| 974 |
+
} while (node = walker.next());
|
| 975 |
+
|
| 976 |
+
setPoint(lastNode);
|
| 977 |
+
|
| 978 |
+
sel.setRng(rng);
|
| 979 |
+
}
|
| 980 |
+
|
| 981 |
+
ed.nodeChanged();
|
| 982 |
+
startCell = tableGrid = startTable = null;
|
| 983 |
+
}
|
| 984 |
+
});
|
| 985 |
+
|
| 986 |
+
ed.onKeyUp.add(function(ed, e) {
|
| 987 |
+
cleanup();
|
| 988 |
+
});
|
| 989 |
+
|
| 990 |
+
ed.onKeyDown.add(function (ed, e) {
|
| 991 |
+
fixTableCellSelection(ed);
|
| 992 |
+
});
|
| 993 |
+
|
| 994 |
+
ed.onMouseDown.add(function (ed, e) {
|
| 995 |
+
if (e.button != 2) {
|
| 996 |
+
fixTableCellSelection(ed);
|
| 997 |
+
}
|
| 998 |
+
});
|
| 999 |
+
function tableCellSelected(ed, rng, n, currentCell) {
|
| 1000 |
+
// The decision of when a table cell is selected is somewhat involved. The fact that this code is
|
| 1001 |
+
// required is actually a pointer to the root cause of this bug. A cell is selected when the start
|
| 1002 |
+
// and end offsets are 0, the start container is a text, and the selection node is either a TR (most cases)
|
| 1003 |
+
// or the parent of the table (in the case of the selection containing the last cell of a table).
|
| 1004 |
+
var TEXT_NODE = 3, table = ed.dom.getParent(rng.startContainer, 'TABLE'),
|
| 1005 |
+
tableParent, allOfCellSelected, tableCellSelection;
|
| 1006 |
+
if (table)
|
| 1007 |
+
tableParent = table.parentNode;
|
| 1008 |
+
allOfCellSelected =rng.startContainer.nodeType == TEXT_NODE &&
|
| 1009 |
+
rng.startOffset == 0 &&
|
| 1010 |
+
rng.endOffset == 0 &&
|
| 1011 |
+
currentCell &&
|
| 1012 |
+
(n.nodeName=="TR" || n==tableParent);
|
| 1013 |
+
tableCellSelection = (n.nodeName=="TD"||n.nodeName=="TH")&& !currentCell;
|
| 1014 |
+
return allOfCellSelected || tableCellSelection;
|
| 1015 |
+
// return false;
|
| 1016 |
+
}
|
| 1017 |
+
|
| 1018 |
+
// this nasty hack is here to work around some WebKit selection bugs.
|
| 1019 |
+
function fixTableCellSelection(ed) {
|
| 1020 |
+
if (!tinymce.isWebKit)
|
| 1021 |
+
return;
|
| 1022 |
+
|
| 1023 |
+
var rng = ed.selection.getRng();
|
| 1024 |
+
var n = ed.selection.getNode();
|
| 1025 |
+
var currentCell = ed.dom.getParent(rng.startContainer, 'TD,TH');
|
| 1026 |
+
|
| 1027 |
+
if (!tableCellSelected(ed, rng, n, currentCell))
|
| 1028 |
+
return;
|
| 1029 |
+
if (!currentCell) {
|
| 1030 |
+
currentCell=n;
|
| 1031 |
+
}
|
| 1032 |
+
|
| 1033 |
+
// Get the very last node inside the table cell
|
| 1034 |
+
var end = currentCell.lastChild;
|
| 1035 |
+
while (end.lastChild)
|
| 1036 |
+
end = end.lastChild;
|
| 1037 |
+
|
| 1038 |
+
// Select the entire table cell. Nothing outside of the table cell should be selected.
|
| 1039 |
+
rng.setEnd(end, end.nodeValue.length);
|
| 1040 |
+
ed.selection.setRng(rng);
|
| 1041 |
+
}
|
| 1042 |
+
ed.plugins.table.fixTableCellSelection=fixTableCellSelection;
|
| 1043 |
+
|
| 1044 |
+
// Add context menu
|
| 1045 |
+
if (ed && ed.plugins.contextmenu) {
|
| 1046 |
+
ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {
|
| 1047 |
+
var sm, se = ed.selection, el = se.getNode() || ed.getBody();
|
| 1048 |
+
|
| 1049 |
+
if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th') || ed.dom.select('td.mceSelected,th.mceSelected').length) {
|
| 1050 |
+
m.removeAll();
|
| 1051 |
+
|
| 1052 |
+
if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) {
|
| 1053 |
+
m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});
|
| 1054 |
+
m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});
|
| 1055 |
+
m.addSeparator();
|
| 1056 |
+
}
|
| 1057 |
+
|
| 1058 |
+
if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) {
|
| 1059 |
+
m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});
|
| 1060 |
+
m.addSeparator();
|
| 1061 |
+
}
|
| 1062 |
+
|
| 1063 |
+
m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}});
|
| 1064 |
+
m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'});
|
| 1065 |
+
m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'});
|
| 1066 |
+
m.addSeparator();
|
| 1067 |
+
|
| 1068 |
+
// Cell menu
|
| 1069 |
+
sm = m.addMenu({title : 'table.cell'});
|
| 1070 |
+
sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'});
|
| 1071 |
+
sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'});
|
| 1072 |
+
sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'});
|
| 1073 |
+
|
| 1074 |
+
// Row menu
|
| 1075 |
+
sm = m.addMenu({title : 'table.row'});
|
| 1076 |
+
sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'});
|
| 1077 |
+
sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'});
|
| 1078 |
+
sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'});
|
| 1079 |
+
sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'});
|
| 1080 |
+
sm.addSeparator();
|
| 1081 |
+
sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'});
|
| 1082 |
+
sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'});
|
| 1083 |
+
sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows);
|
| 1084 |
+
sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows);
|
| 1085 |
+
|
| 1086 |
+
// Column menu
|
| 1087 |
+
sm = m.addMenu({title : 'table.col'});
|
| 1088 |
+
sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'});
|
| 1089 |
+
sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'});
|
| 1090 |
+
sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'});
|
| 1091 |
+
} else
|
| 1092 |
+
m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'});
|
| 1093 |
+
});
|
| 1094 |
+
}
|
| 1095 |
+
|
| 1096 |
+
// Fix to allow navigating up and down in a table in WebKit browsers.
|
| 1097 |
+
if (tinymce.isWebKit) {
|
| 1098 |
+
function moveSelection(ed, e) {
|
| 1099 |
+
var VK = tinymce.VK;
|
| 1100 |
+
var key = e.keyCode;
|
| 1101 |
+
|
| 1102 |
+
function handle(upBool, sourceNode, event) {
|
| 1103 |
+
var siblingDirection = upBool ? 'previousSibling' : 'nextSibling';
|
| 1104 |
+
var currentRow = ed.dom.getParent(sourceNode, 'tr');
|
| 1105 |
+
var siblingRow = currentRow[siblingDirection];
|
| 1106 |
+
|
| 1107 |
+
if (siblingRow) {
|
| 1108 |
+
moveCursorToRow(ed, sourceNode, siblingRow, upBool);
|
| 1109 |
+
tinymce.dom.Event.cancel(event);
|
| 1110 |
+
return true;
|
| 1111 |
+
} else {
|
| 1112 |
+
var tableNode = ed.dom.getParent(currentRow, 'table');
|
| 1113 |
+
var middleNode = currentRow.parentNode;
|
| 1114 |
+
var parentNodeName = middleNode.nodeName.toLowerCase();
|
| 1115 |
+
if (parentNodeName === 'tbody' || parentNodeName === (upBool ? 'tfoot' : 'thead')) {
|
| 1116 |
+
var targetParent = getTargetParent(upBool, tableNode, middleNode, 'tbody');
|
| 1117 |
+
if (targetParent !== null) {
|
| 1118 |
+
return moveToRowInTarget(upBool, targetParent, sourceNode, event);
|
| 1119 |
+
}
|
| 1120 |
+
}
|
| 1121 |
+
return escapeTable(upBool, currentRow, siblingDirection, tableNode, event);
|
| 1122 |
+
}
|
| 1123 |
+
}
|
| 1124 |
+
|
| 1125 |
+
function getTargetParent(upBool, topNode, secondNode, nodeName) {
|
| 1126 |
+
var tbodies = ed.dom.select('>' + nodeName, topNode);
|
| 1127 |
+
var position = tbodies.indexOf(secondNode);
|
| 1128 |
+
if (upBool && position === 0 || !upBool && position === tbodies.length - 1) {
|
| 1129 |
+
return getFirstHeadOrFoot(upBool, topNode);
|
| 1130 |
+
} else if (position === -1) {
|
| 1131 |
+
var topOrBottom = secondNode.tagName.toLowerCase() === 'thead' ? 0 : tbodies.length - 1;
|
| 1132 |
+
return tbodies[topOrBottom];
|
| 1133 |
+
} else {
|
| 1134 |
+
return tbodies[position + (upBool ? -1 : 1)];
|
| 1135 |
+
}
|
| 1136 |
+
}
|
| 1137 |
+
|
| 1138 |
+
function getFirstHeadOrFoot(upBool, parent) {
|
| 1139 |
+
var tagName = upBool ? 'thead' : 'tfoot';
|
| 1140 |
+
var headOrFoot = ed.dom.select('>' + tagName, parent);
|
| 1141 |
+
return headOrFoot.length !== 0 ? headOrFoot[0] : null;
|
| 1142 |
+
}
|
| 1143 |
+
|
| 1144 |
+
function moveToRowInTarget(upBool, targetParent, sourceNode, event) {
|
| 1145 |
+
var targetRow = getChildForDirection(targetParent, upBool);
|
| 1146 |
+
targetRow && moveCursorToRow(ed, sourceNode, targetRow, upBool);
|
| 1147 |
+
tinymce.dom.Event.cancel(event);
|
| 1148 |
+
return true;
|
| 1149 |
+
}
|
| 1150 |
+
|
| 1151 |
+
function escapeTable(upBool, currentRow, siblingDirection, table, event) {
|
| 1152 |
+
var tableSibling = table[siblingDirection];
|
| 1153 |
+
if (tableSibling) {
|
| 1154 |
+
moveCursorToStartOfElement(tableSibling);
|
| 1155 |
+
return true;
|
| 1156 |
+
} else {
|
| 1157 |
+
var parentCell = ed.dom.getParent(table, 'td,th');
|
| 1158 |
+
if (parentCell) {
|
| 1159 |
+
return handle(upBool, parentCell, event);
|
| 1160 |
+
} else {
|
| 1161 |
+
var backUpSibling = getChildForDirection(currentRow, !upBool);
|
| 1162 |
+
moveCursorToStartOfElement(backUpSibling);
|
| 1163 |
+
return tinymce.dom.Event.cancel(event);
|
| 1164 |
+
}
|
| 1165 |
+
}
|
| 1166 |
+
}
|
| 1167 |
+
|
| 1168 |
+
function getChildForDirection(parent, up) {
|
| 1169 |
+
var child = parent && parent[up ? 'lastChild' : 'firstChild'];
|
| 1170 |
+
// BR is not a valid table child to return in this case we return the table cell
|
| 1171 |
+
return child && child.nodeName === 'BR' ? ed.dom.getParent(child, 'td,th') : child;
|
| 1172 |
+
}
|
| 1173 |
+
|
| 1174 |
+
function moveCursorToStartOfElement(n) {
|
| 1175 |
+
ed.selection.setCursorLocation(n, 0);
|
| 1176 |
+
}
|
| 1177 |
+
|
| 1178 |
+
function isVerticalMovement() {
|
| 1179 |
+
return key == VK.UP || key == VK.DOWN;
|
| 1180 |
+
}
|
| 1181 |
+
|
| 1182 |
+
function isInTable(ed) {
|
| 1183 |
+
var node = ed.selection.getNode();
|
| 1184 |
+
var currentRow = ed.dom.getParent(node, 'tr');
|
| 1185 |
+
return currentRow !== null;
|
| 1186 |
+
}
|
| 1187 |
+
|
| 1188 |
+
function columnIndex(column) {
|
| 1189 |
+
var colIndex = 0;
|
| 1190 |
+
var c = column;
|
| 1191 |
+
while (c.previousSibling) {
|
| 1192 |
+
c = c.previousSibling;
|
| 1193 |
+
colIndex = colIndex + getSpanVal(c, "colspan");
|
| 1194 |
+
}
|
| 1195 |
+
return colIndex;
|
| 1196 |
+
}
|
| 1197 |
+
|
| 1198 |
+
function findColumn(rowElement, columnIndex) {
|
| 1199 |
+
var c = 0;
|
| 1200 |
+
var r = 0;
|
| 1201 |
+
each(rowElement.children, function(cell, i) {
|
| 1202 |
+
c = c + getSpanVal(cell, "colspan");
|
| 1203 |
+
r = i;
|
| 1204 |
+
if (c > columnIndex)
|
| 1205 |
+
return false;
|
| 1206 |
+
});
|
| 1207 |
+
return r;
|
| 1208 |
+
}
|
| 1209 |
+
|
| 1210 |
+
function moveCursorToRow(ed, node, row, upBool) {
|
| 1211 |
+
var srcColumnIndex = columnIndex(ed.dom.getParent(node, 'td,th'));
|
| 1212 |
+
var tgtColumnIndex = findColumn(row, srcColumnIndex);
|
| 1213 |
+
var tgtNode = row.childNodes[tgtColumnIndex];
|
| 1214 |
+
var rowCellTarget = getChildForDirection(tgtNode, upBool);
|
| 1215 |
+
moveCursorToStartOfElement(rowCellTarget || tgtNode);
|
| 1216 |
+
}
|
| 1217 |
+
|
| 1218 |
+
function shouldFixCaret(preBrowserNode) {
|
| 1219 |
+
var newNode = ed.selection.getNode();
|
| 1220 |
+
var newParent = ed.dom.getParent(newNode, 'td,th');
|
| 1221 |
+
var oldParent = ed.dom.getParent(preBrowserNode, 'td,th');
|
| 1222 |
+
return newParent && newParent !== oldParent && checkSameParentTable(newParent, oldParent)
|
| 1223 |
+
}
|
| 1224 |
+
|
| 1225 |
+
function checkSameParentTable(nodeOne, NodeTwo) {
|
| 1226 |
+
return ed.dom.getParent(nodeOne, 'TABLE') === ed.dom.getParent(NodeTwo, 'TABLE');
|
| 1227 |
+
}
|
| 1228 |
+
|
| 1229 |
+
if (isVerticalMovement() && isInTable(ed)) {
|
| 1230 |
+
var preBrowserNode = ed.selection.getNode();
|
| 1231 |
+
setTimeout(function() {
|
| 1232 |
+
if (shouldFixCaret(preBrowserNode)) {
|
| 1233 |
+
handle(!e.shiftKey && key === VK.UP, preBrowserNode, e);
|
| 1234 |
+
}
|
| 1235 |
+
}, 0);
|
| 1236 |
+
}
|
| 1237 |
+
}
|
| 1238 |
+
|
| 1239 |
+
ed.onKeyDown.add(moveSelection);
|
| 1240 |
+
}
|
| 1241 |
+
|
| 1242 |
+
// Fixes an issue on Gecko where it's impossible to place the caret behind a table
|
| 1243 |
+
// This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled
|
| 1244 |
+
function fixTableCaretPos() {
|
| 1245 |
+
var last;
|
| 1246 |
+
|
| 1247 |
+
// Skip empty text nodes form the end
|
| 1248 |
+
for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ;
|
| 1249 |
+
|
| 1250 |
+
if (last && last.nodeName == 'TABLE') {
|
| 1251 |
+
if (ed.settings.forced_root_block)
|
| 1252 |
+
ed.dom.add(ed.getBody(), ed.settings.forced_root_block, null, tinymce.isIE ? ' ' : '<br data-mce-bogus="1" />');
|
| 1253 |
+
else
|
| 1254 |
+
ed.dom.add(ed.getBody(), 'br', {'data-mce-bogus': '1'});
|
| 1255 |
+
}
|
| 1256 |
+
};
|
| 1257 |
+
|
| 1258 |
+
// Fixes an bug where it's impossible to place the caret before a table in Gecko
|
| 1259 |
+
// this fix solves it by detecting when the caret is at the beginning of such a table
|
| 1260 |
+
// and then manually moves the caret infront of the table
|
| 1261 |
+
if (tinymce.isGecko) {
|
| 1262 |
+
ed.onKeyDown.add(function(ed, e) {
|
| 1263 |
+
var rng, table, dom = ed.dom;
|
| 1264 |
+
|
| 1265 |
+
// On gecko it's not possible to place the caret before a table
|
| 1266 |
+
if (e.keyCode == 37 || e.keyCode == 38) {
|
| 1267 |
+
rng = ed.selection.getRng();
|
| 1268 |
+
table = dom.getParent(rng.startContainer, 'table');
|
| 1269 |
+
|
| 1270 |
+
if (table && ed.getBody().firstChild == table) {
|
| 1271 |
+
if (isAtStart(rng, table)) {
|
| 1272 |
+
rng = dom.createRng();
|
| 1273 |
+
|
| 1274 |
+
rng.setStartBefore(table);
|
| 1275 |
+
rng.setEndBefore(table);
|
| 1276 |
+
|
| 1277 |
+
ed.selection.setRng(rng);
|
| 1278 |
+
|
| 1279 |
+
e.preventDefault();
|
| 1280 |
+
}
|
| 1281 |
+
}
|
| 1282 |
+
}
|
| 1283 |
+
});
|
| 1284 |
+
}
|
| 1285 |
+
|
| 1286 |
+
ed.onKeyUp.add(fixTableCaretPos);
|
| 1287 |
+
ed.onSetContent.add(fixTableCaretPos);
|
| 1288 |
+
ed.onVisualAid.add(fixTableCaretPos);
|
| 1289 |
+
|
| 1290 |
+
ed.onPreProcess.add(function(ed, o) {
|
| 1291 |
+
var last = o.node.lastChild;
|
| 1292 |
+
|
| 1293 |
+
if (last && (last.nodeName == "BR" || (last.childNodes.length == 1 && (last.firstChild.nodeName == 'BR' || last.firstChild.nodeValue == '\u00a0'))) && last.previousSibling && last.previousSibling.nodeName == "TABLE") {
|
| 1294 |
+
ed.dom.remove(last);
|
| 1295 |
+
}
|
| 1296 |
+
});
|
| 1297 |
+
|
| 1298 |
+
|
| 1299 |
+
/**
|
| 1300 |
+
* Fixes bug in Gecko where shift-enter in table cell does not place caret on new line
|
| 1301 |
+
*
|
| 1302 |
+
* Removed: Since the new enter logic seems to fix this one.
|
| 1303 |
+
*/
|
| 1304 |
+
/*
|
| 1305 |
+
if (tinymce.isGecko) {
|
| 1306 |
+
ed.onKeyDown.add(function(ed, e) {
|
| 1307 |
+
if (e.keyCode === tinymce.VK.ENTER && e.shiftKey) {
|
| 1308 |
+
var node = ed.selection.getRng().startContainer;
|
| 1309 |
+
var tableCell = dom.getParent(node, 'td,th');
|
| 1310 |
+
if (tableCell) {
|
| 1311 |
+
var zeroSizedNbsp = ed.getDoc().createTextNode("\uFEFF");
|
| 1312 |
+
dom.insertAfter(zeroSizedNbsp, node);
|
| 1313 |
+
}
|
| 1314 |
+
}
|
| 1315 |
+
});
|
| 1316 |
+
}
|
| 1317 |
+
*/
|
| 1318 |
+
|
| 1319 |
+
fixTableCaretPos();
|
| 1320 |
+
ed.startContent = ed.getContent({format : 'raw'});
|
| 1321 |
+
});
|
| 1322 |
+
|
| 1323 |
+
// Register action commands
|
| 1324 |
+
each({
|
| 1325 |
+
mceTableSplitCells : function(grid) {
|
| 1326 |
+
grid.split();
|
| 1327 |
+
},
|
| 1328 |
+
|
| 1329 |
+
mceTableMergeCells : function(grid) {
|
| 1330 |
+
var rowSpan, colSpan, cell;
|
| 1331 |
+
|
| 1332 |
+
cell = ed.dom.getParent(ed.selection.getNode(), 'th,td');
|
| 1333 |
+
if (cell) {
|
| 1334 |
+
rowSpan = cell.rowSpan;
|
| 1335 |
+
colSpan = cell.colSpan;
|
| 1336 |
+
}
|
| 1337 |
+
|
| 1338 |
+
if (!ed.dom.select('td.mceSelected,th.mceSelected').length) {
|
| 1339 |
+
winMan.open({
|
| 1340 |
+
url : url + '/merge_cells.htm',
|
| 1341 |
+
width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)),
|
| 1342 |
+
height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)),
|
| 1343 |
+
inline : 1
|
| 1344 |
+
}, {
|
| 1345 |
+
rows : rowSpan,
|
| 1346 |
+
cols : colSpan,
|
| 1347 |
+
onaction : function(data) {
|
| 1348 |
+
grid.merge(cell, data.cols, data.rows);
|
| 1349 |
+
},
|
| 1350 |
+
plugin_url : url
|
| 1351 |
+
});
|
| 1352 |
+
} else
|
| 1353 |
+
grid.merge();
|
| 1354 |
+
},
|
| 1355 |
+
|
| 1356 |
+
mceTableInsertRowBefore : function(grid) {
|
| 1357 |
+
grid.insertRow(true);
|
| 1358 |
+
},
|
| 1359 |
+
|
| 1360 |
+
mceTableInsertRowAfter : function(grid) {
|
| 1361 |
+
grid.insertRow();
|
| 1362 |
+
},
|
| 1363 |
+
|
| 1364 |
+
mceTableInsertColBefore : function(grid) {
|
| 1365 |
+
grid.insertCol(true);
|
| 1366 |
+
},
|
| 1367 |
+
|
| 1368 |
+
mceTableInsertColAfter : function(grid) {
|
| 1369 |
+
grid.insertCol();
|
| 1370 |
+
},
|
| 1371 |
+
|
| 1372 |
+
mceTableDeleteCol : function(grid) {
|
| 1373 |
+
grid.deleteCols();
|
| 1374 |
+
},
|
| 1375 |
+
|
| 1376 |
+
mceTableDeleteRow : function(grid) {
|
| 1377 |
+
grid.deleteRows();
|
| 1378 |
+
},
|
| 1379 |
+
|
| 1380 |
+
mceTableCutRow : function(grid) {
|
| 1381 |
+
clipboardRows = grid.cutRows();
|
| 1382 |
+
},
|
| 1383 |
+
|
| 1384 |
+
mceTableCopyRow : function(grid) {
|
| 1385 |
+
clipboardRows = grid.copyRows();
|
| 1386 |
+
},
|
| 1387 |
+
|
| 1388 |
+
mceTablePasteRowBefore : function(grid) {
|
| 1389 |
+
grid.pasteRows(clipboardRows, true);
|
| 1390 |
+
},
|
| 1391 |
+
|
| 1392 |
+
mceTablePasteRowAfter : function(grid) {
|
| 1393 |
+
grid.pasteRows(clipboardRows);
|
| 1394 |
+
},
|
| 1395 |
+
|
| 1396 |
+
mceTableDelete : function(grid) {
|
| 1397 |
+
grid.deleteTable();
|
| 1398 |
+
}
|
| 1399 |
+
}, function(func, name) {
|
| 1400 |
+
ed.addCommand(name, function() {
|
| 1401 |
+
var grid = createTableGrid();
|
| 1402 |
+
|
| 1403 |
+
if (grid) {
|
| 1404 |
+
func(grid);
|
| 1405 |
+
ed.execCommand('mceRepaint');
|
| 1406 |
+
cleanup();
|
| 1407 |
+
}
|
| 1408 |
+
});
|
| 1409 |
+
});
|
| 1410 |
+
|
| 1411 |
+
// Register dialog commands
|
| 1412 |
+
each({
|
| 1413 |
+
mceInsertTable : function(val) {
|
| 1414 |
+
winMan.open({
|
| 1415 |
+
url : url + '/table.htm',
|
| 1416 |
+
width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)),
|
| 1417 |
+
height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)),
|
| 1418 |
+
inline : 1
|
| 1419 |
+
}, {
|
| 1420 |
+
plugin_url : url,
|
| 1421 |
+
action : val ? val.action : 0
|
| 1422 |
+
});
|
| 1423 |
+
},
|
| 1424 |
+
|
| 1425 |
+
mceTableRowProps : function() {
|
| 1426 |
+
winMan.open({
|
| 1427 |
+
url : url + '/row.htm',
|
| 1428 |
+
width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)),
|
| 1429 |
+
height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)),
|
| 1430 |
+
inline : 1
|
| 1431 |
+
}, {
|
| 1432 |
+
plugin_url : url
|
| 1433 |
+
});
|
| 1434 |
+
},
|
| 1435 |
+
|
| 1436 |
+
mceTableCellProps : function() {
|
| 1437 |
+
winMan.open({
|
| 1438 |
+
url : url + '/cell.htm',
|
| 1439 |
+
width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)),
|
| 1440 |
+
height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)),
|
| 1441 |
+
inline : 1
|
| 1442 |
+
}, {
|
| 1443 |
+
plugin_url : url
|
| 1444 |
+
});
|
| 1445 |
+
}
|
| 1446 |
+
}, function(func, name) {
|
| 1447 |
+
ed.addCommand(name, function(ui, val) {
|
| 1448 |
+
func(val);
|
| 1449 |
+
});
|
| 1450 |
+
});
|
| 1451 |
+
}
|
| 1452 |
+
});
|
| 1453 |
+
|
| 1454 |
+
// Register plugin
|
| 1455 |
+
tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin);
|
| 1456 |
+
})(tinymce);
|
js/tinymce/jscripts/tiny_mce/plugins/table/js/table.js
CHANGED
|
@@ -242,16 +242,16 @@ function insertTable() {
|
|
| 242 |
} else
|
| 243 |
inst.execCommand('mceInsertContent', false, html);
|
| 244 |
|
| 245 |
-
tinymce.each(dom.select('table[data-mce-new]'), function(node) {
|
| 246 |
var tdorth = dom.select('td,th', node);
|
| 247 |
-
|
| 248 |
// Fixes a bug in IE where the caret cannot be placed after the table if the table is at the end of the document
|
| 249 |
if (tinymce.isIE && node.nextSibling == null) {
|
| 250 |
if (inst.settings.forced_root_block)
|
| 251 |
dom.insertAfter(dom.create(inst.settings.forced_root_block), node);
|
| 252 |
else
|
| 253 |
dom.insertAfter(dom.create('br', {'data-mce-bogus': '1'}), node);
|
| 254 |
-
}
|
| 255 |
|
| 256 |
try {
|
| 257 |
// IE9 might fail to do this selection
|
| 242 |
} else
|
| 243 |
inst.execCommand('mceInsertContent', false, html);
|
| 244 |
|
| 245 |
+
tinymce.each(dom.select('table[data-mce-new]'), function(node) {
|
| 246 |
var tdorth = dom.select('td,th', node);
|
| 247 |
+
|
| 248 |
// Fixes a bug in IE where the caret cannot be placed after the table if the table is at the end of the document
|
| 249 |
if (tinymce.isIE && node.nextSibling == null) {
|
| 250 |
if (inst.settings.forced_root_block)
|
| 251 |
dom.insertAfter(dom.create(inst.settings.forced_root_block), node);
|
| 252 |
else
|
| 253 |
dom.insertAfter(dom.create('br', {'data-mce-bogus': '1'}), node);
|
| 254 |
+
}
|
| 255 |
|
| 256 |
try {
|
| 257 |
// IE9 might fail to do this selection
|
js/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js
CHANGED
|
@@ -1,345 +1,345 @@
|
|
| 1 |
-
tinyMCEPopup.requireLangPack();
|
| 2 |
-
|
| 3 |
-
var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false;
|
| 4 |
-
|
| 5 |
-
var colors = [
|
| 6 |
-
"#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",
|
| 7 |
-
"#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099",
|
| 8 |
-
"#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff",
|
| 9 |
-
"#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033",
|
| 10 |
-
"#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399",
|
| 11 |
-
"#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff",
|
| 12 |
-
"#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333",
|
| 13 |
-
"#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399",
|
| 14 |
-
"#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff",
|
| 15 |
-
"#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633",
|
| 16 |
-
"#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699",
|
| 17 |
-
"#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff",
|
| 18 |
-
"#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633",
|
| 19 |
-
"#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999",
|
| 20 |
-
"#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff",
|
| 21 |
-
"#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933",
|
| 22 |
-
"#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999",
|
| 23 |
-
"#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff",
|
| 24 |
-
"#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33",
|
| 25 |
-
"#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99",
|
| 26 |
-
"#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff",
|
| 27 |
-
"#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33",
|
| 28 |
-
"#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99",
|
| 29 |
-
"#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff",
|
| 30 |
-
"#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33",
|
| 31 |
-
"#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99",
|
| 32 |
-
"#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff"
|
| 33 |
-
];
|
| 34 |
-
|
| 35 |
-
var named = {
|
| 36 |
-
'#F0F8FF':'Alice Blue','#FAEBD7':'Antique White','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige',
|
| 37 |
-
'#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'Blanched Almond','#0000FF':'Blue','#8A2BE2':'Blue Violet','#A52A2A':'Brown',
|
| 38 |
-
'#DEB887':'Burly Wood','#5F9EA0':'Cadet Blue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'Cornflower Blue',
|
| 39 |
-
'#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'Dark Blue','#008B8B':'Dark Cyan','#B8860B':'Dark Golden Rod',
|
| 40 |
-
'#A9A9A9':'Dark Gray','#A9A9A9':'Dark Grey','#006400':'Dark Green','#BDB76B':'Dark Khaki','#8B008B':'Dark Magenta','#556B2F':'Dark Olive Green',
|
| 41 |
-
'#FF8C00':'Darkorange','#9932CC':'Dark Orchid','#8B0000':'Dark Red','#E9967A':'Dark Salmon','#8FBC8F':'Dark Sea Green','#483D8B':'Dark Slate Blue',
|
| 42 |
-
'#2F4F4F':'Dark Slate Gray','#2F4F4F':'Dark Slate Grey','#00CED1':'Dark Turquoise','#9400D3':'Dark Violet','#FF1493':'Deep Pink','#00BFFF':'Deep Sky Blue',
|
| 43 |
-
'#696969':'Dim Gray','#696969':'Dim Grey','#1E90FF':'Dodger Blue','#B22222':'Fire Brick','#FFFAF0':'Floral White','#228B22':'Forest Green',
|
| 44 |
-
'#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'Ghost White','#FFD700':'Gold','#DAA520':'Golden Rod','#808080':'Gray','#808080':'Grey',
|
| 45 |
-
'#008000':'Green','#ADFF2F':'Green Yellow','#F0FFF0':'Honey Dew','#FF69B4':'Hot Pink','#CD5C5C':'Indian Red','#4B0082':'Indigo','#FFFFF0':'Ivory',
|
| 46 |
-
'#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'Lavender Blush','#7CFC00':'Lawn Green','#FFFACD':'Lemon Chiffon','#ADD8E6':'Light Blue',
|
| 47 |
-
'#F08080':'Light Coral','#E0FFFF':'Light Cyan','#FAFAD2':'Light Golden Rod Yellow','#D3D3D3':'Light Gray','#D3D3D3':'Light Grey','#90EE90':'Light Green',
|
| 48 |
-
'#FFB6C1':'Light Pink','#FFA07A':'Light Salmon','#20B2AA':'Light Sea Green','#87CEFA':'Light Sky Blue','#778899':'Light Slate Gray','#778899':'Light Slate Grey',
|
| 49 |
-
'#B0C4DE':'Light Steel Blue','#FFFFE0':'Light Yellow','#00FF00':'Lime','#32CD32':'Lime Green','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon',
|
| 50 |
-
'#66CDAA':'Medium Aqua Marine','#0000CD':'Medium Blue','#BA55D3':'Medium Orchid','#9370D8':'Medium Purple','#3CB371':'Medium Sea Green','#7B68EE':'Medium Slate Blue',
|
| 51 |
-
'#00FA9A':'Medium Spring Green','#48D1CC':'Medium Turquoise','#C71585':'Medium Violet Red','#191970':'Midnight Blue','#F5FFFA':'Mint Cream','#FFE4E1':'Misty Rose','#FFE4B5':'Moccasin',
|
| 52 |
-
'#FFDEAD':'Navajo White','#000080':'Navy','#FDF5E6':'Old Lace','#808000':'Olive','#6B8E23':'Olive Drab','#FFA500':'Orange','#FF4500':'Orange Red','#DA70D6':'Orchid',
|
| 53 |
-
'#EEE8AA':'Pale Golden Rod','#98FB98':'Pale Green','#AFEEEE':'Pale Turquoise','#D87093':'Pale Violet Red','#FFEFD5':'Papaya Whip','#FFDAB9':'Peach Puff',
|
| 54 |
-
'#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'Powder Blue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'Rosy Brown','#4169E1':'Royal Blue',
|
| 55 |
-
'#8B4513':'Saddle Brown','#FA8072':'Salmon','#F4A460':'Sandy Brown','#2E8B57':'Sea Green','#FFF5EE':'Sea Shell','#A0522D':'Sienna','#C0C0C0':'Silver',
|
| 56 |
-
'#87CEEB':'Sky Blue','#6A5ACD':'Slate Blue','#708090':'Slate Gray','#708090':'Slate Grey','#FFFAFA':'Snow','#00FF7F':'Spring Green',
|
| 57 |
-
'#4682B4':'Steel Blue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet',
|
| 58 |
-
'#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'White Smoke','#FFFF00':'Yellow','#9ACD32':'Yellow Green'
|
| 59 |
-
};
|
| 60 |
-
|
| 61 |
-
var namedLookup = {};
|
| 62 |
-
|
| 63 |
-
function init() {
|
| 64 |
-
var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')), key, value;
|
| 65 |
-
|
| 66 |
-
tinyMCEPopup.resizeToInnerSize();
|
| 67 |
-
|
| 68 |
-
generatePicker();
|
| 69 |
-
generateWebColors();
|
| 70 |
-
generateNamedColors();
|
| 71 |
-
|
| 72 |
-
if (inputColor) {
|
| 73 |
-
changeFinalColor(inputColor);
|
| 74 |
-
|
| 75 |
-
col = convertHexToRGB(inputColor);
|
| 76 |
-
|
| 77 |
-
if (col)
|
| 78 |
-
updateLight(col.r, col.g, col.b);
|
| 79 |
-
}
|
| 80 |
-
|
| 81 |
-
for (key in named) {
|
| 82 |
-
value = named[key];
|
| 83 |
-
namedLookup[value.replace(/\s+/, '').toLowerCase()] = key.replace(/#/, '').toLowerCase();
|
| 84 |
-
}
|
| 85 |
-
}
|
| 86 |
-
|
| 87 |
-
function toHexColor(color) {
|
| 88 |
-
var matches, red, green, blue, toInt = parseInt;
|
| 89 |
-
|
| 90 |
-
function hex(value) {
|
| 91 |
-
value = parseInt(value).toString(16);
|
| 92 |
-
|
| 93 |
-
return value.length > 1 ? value : '0' + value; // Padd with leading zero
|
| 94 |
-
};
|
| 95 |
-
|
| 96 |
-
color = tinymce.trim(color);
|
| 97 |
-
color = color.replace(/^[#]/, '').toLowerCase(); // remove leading '#'
|
| 98 |
-
color = namedLookup[color] || color;
|
| 99 |
-
|
| 100 |
-
matches = /^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/.exec(color);
|
| 101 |
-
|
| 102 |
-
if (matches) {
|
| 103 |
-
red = toInt(matches[1]);
|
| 104 |
-
green = toInt(matches[2]);
|
| 105 |
-
blue = toInt(matches[3]);
|
| 106 |
-
} else {
|
| 107 |
-
matches = /^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/.exec(color);
|
| 108 |
-
|
| 109 |
-
if (matches) {
|
| 110 |
-
red = toInt(matches[1], 16);
|
| 111 |
-
green = toInt(matches[2], 16);
|
| 112 |
-
blue = toInt(matches[3], 16);
|
| 113 |
-
} else {
|
| 114 |
-
matches = /^([0-9a-f])([0-9a-f])([0-9a-f])$/.exec(color);
|
| 115 |
-
|
| 116 |
-
if (matches) {
|
| 117 |
-
red = toInt(matches[1] + matches[1], 16);
|
| 118 |
-
green = toInt(matches[2] + matches[2], 16);
|
| 119 |
-
blue = toInt(matches[3] + matches[3], 16);
|
| 120 |
-
} else {
|
| 121 |
-
return '';
|
| 122 |
-
}
|
| 123 |
-
}
|
| 124 |
-
}
|
| 125 |
-
|
| 126 |
-
return '#' + hex(red) + hex(green) + hex(blue);
|
| 127 |
-
}
|
| 128 |
-
|
| 129 |
-
function insertAction() {
|
| 130 |
-
var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func');
|
| 131 |
-
|
| 132 |
-
var hexColor = toHexColor(color);
|
| 133 |
-
|
| 134 |
-
if (hexColor === '') {
|
| 135 |
-
var text = tinyMCEPopup.editor.getLang('advanced_dlg.invalid_color_value');
|
| 136 |
-
tinyMCEPopup.alert(text + ': ' + color);
|
| 137 |
-
}
|
| 138 |
-
else {
|
| 139 |
-
tinyMCEPopup.restoreSelection();
|
| 140 |
-
|
| 141 |
-
if (f)
|
| 142 |
-
f(hexColor);
|
| 143 |
-
|
| 144 |
-
tinyMCEPopup.close();
|
| 145 |
-
}
|
| 146 |
-
}
|
| 147 |
-
|
| 148 |
-
function showColor(color, name) {
|
| 149 |
-
if (name)
|
| 150 |
-
document.getElementById("colorname").innerHTML = name;
|
| 151 |
-
|
| 152 |
-
document.getElementById("preview").style.backgroundColor = color;
|
| 153 |
-
document.getElementById("color").value = color.toUpperCase();
|
| 154 |
-
}
|
| 155 |
-
|
| 156 |
-
function convertRGBToHex(col) {
|
| 157 |
-
var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");
|
| 158 |
-
|
| 159 |
-
if (!col)
|
| 160 |
-
return col;
|
| 161 |
-
|
| 162 |
-
var rgb = col.replace(re, "$1,$2,$3").split(',');
|
| 163 |
-
if (rgb.length == 3) {
|
| 164 |
-
r = parseInt(rgb[0]).toString(16);
|
| 165 |
-
g = parseInt(rgb[1]).toString(16);
|
| 166 |
-
b = parseInt(rgb[2]).toString(16);
|
| 167 |
-
|
| 168 |
-
r = r.length == 1 ? '0' + r : r;
|
| 169 |
-
g = g.length == 1 ? '0' + g : g;
|
| 170 |
-
b = b.length == 1 ? '0' + b : b;
|
| 171 |
-
|
| 172 |
-
return "#" + r + g + b;
|
| 173 |
-
}
|
| 174 |
-
|
| 175 |
-
return col;
|
| 176 |
-
}
|
| 177 |
-
|
| 178 |
-
function convertHexToRGB(col) {
|
| 179 |
-
if (col.indexOf('#') != -1) {
|
| 180 |
-
col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');
|
| 181 |
-
|
| 182 |
-
r = parseInt(col.substring(0, 2), 16);
|
| 183 |
-
g = parseInt(col.substring(2, 4), 16);
|
| 184 |
-
b = parseInt(col.substring(4, 6), 16);
|
| 185 |
-
|
| 186 |
-
return {r : r, g : g, b : b};
|
| 187 |
-
}
|
| 188 |
-
|
| 189 |
-
return null;
|
| 190 |
-
}
|
| 191 |
-
|
| 192 |
-
function generatePicker() {
|
| 193 |
-
var el = document.getElementById('light'), h = '', i;
|
| 194 |
-
|
| 195 |
-
for (i = 0; i < detail; i++){
|
| 196 |
-
h += '<div id="gs'+i+'" style="background-color:#000000; width:15px; height:3px; border-style:none; border-width:0px;"'
|
| 197 |
-
+ ' onclick="changeFinalColor(this.style.backgroundColor)"'
|
| 198 |
-
+ ' onmousedown="isMouseDown = true; return false;"'
|
| 199 |
-
+ ' onmouseup="isMouseDown = false;"'
|
| 200 |
-
+ ' onmousemove="if (isMouseDown && isMouseOver) changeFinalColor(this.style.backgroundColor); return false;"'
|
| 201 |
-
+ ' onmouseover="isMouseOver = true;"'
|
| 202 |
-
+ ' onmouseout="isMouseOver = false;"'
|
| 203 |
-
+ '></div>';
|
| 204 |
-
}
|
| 205 |
-
|
| 206 |
-
el.innerHTML = h;
|
| 207 |
-
}
|
| 208 |
-
|
| 209 |
-
function generateWebColors() {
|
| 210 |
-
var el = document.getElementById('webcolors'), h = '', i;
|
| 211 |
-
|
| 212 |
-
if (el.className == 'generated')
|
| 213 |
-
return;
|
| 214 |
-
|
| 215 |
-
// TODO: VoiceOver doesn't seem to support legend as a label referenced by labelledby.
|
| 216 |
-
h += '<div role="listbox" aria-labelledby="webcolors_title" tabindex="0"><table role="presentation" border="0" cellspacing="1" cellpadding="0">'
|
| 217 |
-
+ '<tr>';
|
| 218 |
-
|
| 219 |
-
for (i=0; i<colors.length; i++) {
|
| 220 |
-
h += '<td bgcolor="' + colors[i] + '" width="10" height="10">'
|
| 221 |
-
+ '<a href="javascript:insertAction();" role="option" tabindex="-1" aria-labelledby="web_colors_' + i + '" onfocus="showColor(\'' + colors[i] + '\');" onmouseover="showColor(\'' + colors[i] + '\');" style="display:block;width:10px;height:10px;overflow:hidden;">';
|
| 222 |
-
if (tinyMCEPopup.editor.forcedHighContrastMode) {
|
| 223 |
-
h += '<canvas class="mceColorSwatch" height="10" width="10" data-color="' + colors[i] + '"></canvas>';
|
| 224 |
-
}
|
| 225 |
-
h += '<span class="mceVoiceLabel" style="display:none;" id="web_colors_' + i + '">' + colors[i].toUpperCase() + '</span>';
|
| 226 |
-
h += '</a></td>';
|
| 227 |
-
if ((i+1) % 18 == 0)
|
| 228 |
-
h += '</tr><tr>';
|
| 229 |
-
}
|
| 230 |
-
|
| 231 |
-
h += '</table></div>';
|
| 232 |
-
|
| 233 |
-
el.innerHTML = h;
|
| 234 |
-
el.className = 'generated';
|
| 235 |
-
|
| 236 |
-
paintCanvas(el);
|
| 237 |
-
enableKeyboardNavigation(el.firstChild);
|
| 238 |
-
}
|
| 239 |
-
|
| 240 |
-
function paintCanvas(el) {
|
| 241 |
-
tinyMCEPopup.getWin().tinymce.each(tinyMCEPopup.dom.select('canvas.mceColorSwatch', el), function(canvas) {
|
| 242 |
-
var context;
|
| 243 |
-
if (canvas.getContext && (context = canvas.getContext("2d"))) {
|
| 244 |
-
context.fillStyle = canvas.getAttribute('data-color');
|
| 245 |
-
context.fillRect(0, 0, 10, 10);
|
| 246 |
-
}
|
| 247 |
-
});
|
| 248 |
-
}
|
| 249 |
-
function generateNamedColors() {
|
| 250 |
-
var el = document.getElementById('namedcolors'), h = '', n, v, i = 0;
|
| 251 |
-
|
| 252 |
-
if (el.className == 'generated')
|
| 253 |
-
return;
|
| 254 |
-
|
| 255 |
-
for (n in named) {
|
| 256 |
-
v = named[n];
|
| 257 |
-
h += '<a href="javascript:insertAction();" role="option" tabindex="-1" aria-labelledby="named_colors_' + i + '" onfocus="showColor(\'' + n + '\',\'' + v + '\');" onmouseover="showColor(\'' + n + '\',\'' + v + '\');" style="background-color: ' + n + '">';
|
| 258 |
-
if (tinyMCEPopup.editor.forcedHighContrastMode) {
|
| 259 |
-
h += '<canvas class="mceColorSwatch" height="10" width="10" data-color="' + colors[i] + '"></canvas>';
|
| 260 |
-
}
|
| 261 |
-
h += '<span class="mceVoiceLabel" style="display:none;" id="named_colors_' + i + '">' + v + '</span>';
|
| 262 |
-
h += '</a>';
|
| 263 |
-
i++;
|
| 264 |
-
}
|
| 265 |
-
|
| 266 |
-
el.innerHTML = h;
|
| 267 |
-
el.className = 'generated';
|
| 268 |
-
|
| 269 |
-
paintCanvas(el);
|
| 270 |
-
enableKeyboardNavigation(el);
|
| 271 |
-
}
|
| 272 |
-
|
| 273 |
-
function enableKeyboardNavigation(el) {
|
| 274 |
-
tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', {
|
| 275 |
-
root: el,
|
| 276 |
-
items: tinyMCEPopup.dom.select('a', el)
|
| 277 |
-
}, tinyMCEPopup.dom);
|
| 278 |
-
}
|
| 279 |
-
|
| 280 |
-
function dechex(n) {
|
| 281 |
-
return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16);
|
| 282 |
-
}
|
| 283 |
-
|
| 284 |
-
function computeColor(e) {
|
| 285 |
-
var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB, pos = tinyMCEPopup.dom.getPos(e.target);
|
| 286 |
-
|
| 287 |
-
x = e.offsetX ? e.offsetX : (e.target ? e.clientX - pos.x : 0);
|
| 288 |
-
y = e.offsetY ? e.offsetY : (e.target ? e.clientY - pos.y : 0);
|
| 289 |
-
|
| 290 |
-
partWidth = document.getElementById('colors').width / 6;
|
| 291 |
-
partDetail = detail / 2;
|
| 292 |
-
imHeight = document.getElementById('colors').height;
|
| 293 |
-
|
| 294 |
-
r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255;
|
| 295 |
-
g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255 + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth);
|
| 296 |
-
b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth);
|
| 297 |
-
|
| 298 |
-
coef = (imHeight - y) / imHeight;
|
| 299 |
-
r = 128 + (r - 128) * coef;
|
| 300 |
-
g = 128 + (g - 128) * coef;
|
| 301 |
-
b = 128 + (b - 128) * coef;
|
| 302 |
-
|
| 303 |
-
changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b));
|
| 304 |
-
updateLight(r, g, b);
|
| 305 |
-
}
|
| 306 |
-
|
| 307 |
-
function updateLight(r, g, b) {
|
| 308 |
-
var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color;
|
| 309 |
-
|
| 310 |
-
for (i=0; i<detail; i++) {
|
| 311 |
-
if ((i>=0) && (i<partDetail)) {
|
| 312 |
-
finalCoef = i / partDetail;
|
| 313 |
-
finalR = dechex(255 - (255 - r) * finalCoef);
|
| 314 |
-
finalG = dechex(255 - (255 - g) * finalCoef);
|
| 315 |
-
finalB = dechex(255 - (255 - b) * finalCoef);
|
| 316 |
-
} else {
|
| 317 |
-
finalCoef = 2 - i / partDetail;
|
| 318 |
-
finalR = dechex(r * finalCoef);
|
| 319 |
-
finalG = dechex(g * finalCoef);
|
| 320 |
-
finalB = dechex(b * finalCoef);
|
| 321 |
-
}
|
| 322 |
-
|
| 323 |
-
color = finalR + finalG + finalB;
|
| 324 |
-
|
| 325 |
-
setCol('gs' + i, '#'+color);
|
| 326 |
-
}
|
| 327 |
-
}
|
| 328 |
-
|
| 329 |
-
function changeFinalColor(color) {
|
| 330 |
-
if (color.indexOf('#') == -1)
|
| 331 |
-
color = convertRGBToHex(color);
|
| 332 |
-
|
| 333 |
-
setCol('preview', color);
|
| 334 |
-
document.getElementById('color').value = color;
|
| 335 |
-
}
|
| 336 |
-
|
| 337 |
-
function setCol(e, c) {
|
| 338 |
-
try {
|
| 339 |
-
document.getElementById(e).style.backgroundColor = c;
|
| 340 |
-
} catch (ex) {
|
| 341 |
-
// Ignore IE warning
|
| 342 |
-
}
|
| 343 |
-
}
|
| 344 |
-
|
| 345 |
-
tinyMCEPopup.onInit.add(init);
|
| 1 |
+
tinyMCEPopup.requireLangPack();
|
| 2 |
+
|
| 3 |
+
var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false;
|
| 4 |
+
|
| 5 |
+
var colors = [
|
| 6 |
+
"#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",
|
| 7 |
+
"#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099",
|
| 8 |
+
"#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff",
|
| 9 |
+
"#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033",
|
| 10 |
+
"#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399",
|
| 11 |
+
"#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff",
|
| 12 |
+
"#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333",
|
| 13 |
+
"#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399",
|
| 14 |
+
"#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff",
|
| 15 |
+
"#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633",
|
| 16 |
+
"#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699",
|
| 17 |
+
"#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff",
|
| 18 |
+
"#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633",
|
| 19 |
+
"#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999",
|
| 20 |
+
"#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff",
|
| 21 |
+
"#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933",
|
| 22 |
+
"#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999",
|
| 23 |
+
"#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff",
|
| 24 |
+
"#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33",
|
| 25 |
+
"#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99",
|
| 26 |
+
"#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff",
|
| 27 |
+
"#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33",
|
| 28 |
+
"#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99",
|
| 29 |
+
"#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff",
|
| 30 |
+
"#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33",
|
| 31 |
+
"#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99",
|
| 32 |
+
"#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff"
|
| 33 |
+
];
|
| 34 |
+
|
| 35 |
+
var named = {
|
| 36 |
+
'#F0F8FF':'Alice Blue','#FAEBD7':'Antique White','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige',
|
| 37 |
+
'#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'Blanched Almond','#0000FF':'Blue','#8A2BE2':'Blue Violet','#A52A2A':'Brown',
|
| 38 |
+
'#DEB887':'Burly Wood','#5F9EA0':'Cadet Blue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'Cornflower Blue',
|
| 39 |
+
'#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'Dark Blue','#008B8B':'Dark Cyan','#B8860B':'Dark Golden Rod',
|
| 40 |
+
'#A9A9A9':'Dark Gray','#A9A9A9':'Dark Grey','#006400':'Dark Green','#BDB76B':'Dark Khaki','#8B008B':'Dark Magenta','#556B2F':'Dark Olive Green',
|
| 41 |
+
'#FF8C00':'Darkorange','#9932CC':'Dark Orchid','#8B0000':'Dark Red','#E9967A':'Dark Salmon','#8FBC8F':'Dark Sea Green','#483D8B':'Dark Slate Blue',
|
| 42 |
+
'#2F4F4F':'Dark Slate Gray','#2F4F4F':'Dark Slate Grey','#00CED1':'Dark Turquoise','#9400D3':'Dark Violet','#FF1493':'Deep Pink','#00BFFF':'Deep Sky Blue',
|
| 43 |
+
'#696969':'Dim Gray','#696969':'Dim Grey','#1E90FF':'Dodger Blue','#B22222':'Fire Brick','#FFFAF0':'Floral White','#228B22':'Forest Green',
|
| 44 |
+
'#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'Ghost White','#FFD700':'Gold','#DAA520':'Golden Rod','#808080':'Gray','#808080':'Grey',
|
| 45 |
+
'#008000':'Green','#ADFF2F':'Green Yellow','#F0FFF0':'Honey Dew','#FF69B4':'Hot Pink','#CD5C5C':'Indian Red','#4B0082':'Indigo','#FFFFF0':'Ivory',
|
| 46 |
+
'#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'Lavender Blush','#7CFC00':'Lawn Green','#FFFACD':'Lemon Chiffon','#ADD8E6':'Light Blue',
|
| 47 |
+
'#F08080':'Light Coral','#E0FFFF':'Light Cyan','#FAFAD2':'Light Golden Rod Yellow','#D3D3D3':'Light Gray','#D3D3D3':'Light Grey','#90EE90':'Light Green',
|
| 48 |
+
'#FFB6C1':'Light Pink','#FFA07A':'Light Salmon','#20B2AA':'Light Sea Green','#87CEFA':'Light Sky Blue','#778899':'Light Slate Gray','#778899':'Light Slate Grey',
|
| 49 |
+
'#B0C4DE':'Light Steel Blue','#FFFFE0':'Light Yellow','#00FF00':'Lime','#32CD32':'Lime Green','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon',
|
| 50 |
+
'#66CDAA':'Medium Aqua Marine','#0000CD':'Medium Blue','#BA55D3':'Medium Orchid','#9370D8':'Medium Purple','#3CB371':'Medium Sea Green','#7B68EE':'Medium Slate Blue',
|
| 51 |
+
'#00FA9A':'Medium Spring Green','#48D1CC':'Medium Turquoise','#C71585':'Medium Violet Red','#191970':'Midnight Blue','#F5FFFA':'Mint Cream','#FFE4E1':'Misty Rose','#FFE4B5':'Moccasin',
|
| 52 |
+
'#FFDEAD':'Navajo White','#000080':'Navy','#FDF5E6':'Old Lace','#808000':'Olive','#6B8E23':'Olive Drab','#FFA500':'Orange','#FF4500':'Orange Red','#DA70D6':'Orchid',
|
| 53 |
+
'#EEE8AA':'Pale Golden Rod','#98FB98':'Pale Green','#AFEEEE':'Pale Turquoise','#D87093':'Pale Violet Red','#FFEFD5':'Papaya Whip','#FFDAB9':'Peach Puff',
|
| 54 |
+
'#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'Powder Blue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'Rosy Brown','#4169E1':'Royal Blue',
|
| 55 |
+
'#8B4513':'Saddle Brown','#FA8072':'Salmon','#F4A460':'Sandy Brown','#2E8B57':'Sea Green','#FFF5EE':'Sea Shell','#A0522D':'Sienna','#C0C0C0':'Silver',
|
| 56 |
+
'#87CEEB':'Sky Blue','#6A5ACD':'Slate Blue','#708090':'Slate Gray','#708090':'Slate Grey','#FFFAFA':'Snow','#00FF7F':'Spring Green',
|
| 57 |
+
'#4682B4':'Steel Blue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet',
|
| 58 |
+
'#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'White Smoke','#FFFF00':'Yellow','#9ACD32':'Yellow Green'
|
| 59 |
+
};
|
| 60 |
+
|
| 61 |
+
var namedLookup = {};
|
| 62 |
+
|
| 63 |
+
function init() {
|
| 64 |
+
var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')), key, value;
|
| 65 |
+
|
| 66 |
+
tinyMCEPopup.resizeToInnerSize();
|
| 67 |
+
|
| 68 |
+
generatePicker();
|
| 69 |
+
generateWebColors();
|
| 70 |
+
generateNamedColors();
|
| 71 |
+
|
| 72 |
+
if (inputColor) {
|
| 73 |
+
changeFinalColor(inputColor);
|
| 74 |
+
|
| 75 |
+
col = convertHexToRGB(inputColor);
|
| 76 |
+
|
| 77 |
+
if (col)
|
| 78 |
+
updateLight(col.r, col.g, col.b);
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
for (key in named) {
|
| 82 |
+
value = named[key];
|
| 83 |
+
namedLookup[value.replace(/\s+/, '').toLowerCase()] = key.replace(/#/, '').toLowerCase();
|
| 84 |
+
}
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
function toHexColor(color) {
|
| 88 |
+
var matches, red, green, blue, toInt = parseInt;
|
| 89 |
+
|
| 90 |
+
function hex(value) {
|
| 91 |
+
value = parseInt(value).toString(16);
|
| 92 |
+
|
| 93 |
+
return value.length > 1 ? value : '0' + value; // Padd with leading zero
|
| 94 |
+
};
|
| 95 |
+
|
| 96 |
+
color = tinymce.trim(color);
|
| 97 |
+
color = color.replace(/^[#]/, '').toLowerCase(); // remove leading '#'
|
| 98 |
+
color = namedLookup[color] || color;
|
| 99 |
+
|
| 100 |
+
matches = /^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/.exec(color);
|
| 101 |
+
|
| 102 |
+
if (matches) {
|
| 103 |
+
red = toInt(matches[1]);
|
| 104 |
+
green = toInt(matches[2]);
|
| 105 |
+
blue = toInt(matches[3]);
|
| 106 |
+
} else {
|
| 107 |
+
matches = /^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/.exec(color);
|
| 108 |
+
|
| 109 |
+
if (matches) {
|
| 110 |
+
red = toInt(matches[1], 16);
|
| 111 |
+
green = toInt(matches[2], 16);
|
| 112 |
+
blue = toInt(matches[3], 16);
|
| 113 |
+
} else {
|
| 114 |
+
matches = /^([0-9a-f])([0-9a-f])([0-9a-f])$/.exec(color);
|
| 115 |
+
|
| 116 |
+
if (matches) {
|
| 117 |
+
red = toInt(matches[1] + matches[1], 16);
|
| 118 |
+
green = toInt(matches[2] + matches[2], 16);
|
| 119 |
+
blue = toInt(matches[3] + matches[3], 16);
|
| 120 |
+
} else {
|
| 121 |
+
return '';
|
| 122 |
+
}
|
| 123 |
+
}
|
| 124 |
+
}
|
| 125 |
+
|
| 126 |
+
return '#' + hex(red) + hex(green) + hex(blue);
|
| 127 |
+
}
|
| 128 |
+
|
| 129 |
+
function insertAction() {
|
| 130 |
+
var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func');
|
| 131 |
+
|
| 132 |
+
var hexColor = toHexColor(color);
|
| 133 |
+
|
| 134 |
+
if (hexColor === '') {
|
| 135 |
+
var text = tinyMCEPopup.editor.getLang('advanced_dlg.invalid_color_value');
|
| 136 |
+
tinyMCEPopup.alert(text + ': ' + color);
|
| 137 |
+
}
|
| 138 |
+
else {
|
| 139 |
+
tinyMCEPopup.restoreSelection();
|
| 140 |
+
|
| 141 |
+
if (f)
|
| 142 |
+
f(hexColor);
|
| 143 |
+
|
| 144 |
+
tinyMCEPopup.close();
|
| 145 |
+
}
|
| 146 |
+
}
|
| 147 |
+
|
| 148 |
+
function showColor(color, name) {
|
| 149 |
+
if (name)
|
| 150 |
+
document.getElementById("colorname").innerHTML = name;
|
| 151 |
+
|
| 152 |
+
document.getElementById("preview").style.backgroundColor = color;
|
| 153 |
+
document.getElementById("color").value = color.toUpperCase();
|
| 154 |
+
}
|
| 155 |
+
|
| 156 |
+
function convertRGBToHex(col) {
|
| 157 |
+
var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");
|
| 158 |
+
|
| 159 |
+
if (!col)
|
| 160 |
+
return col;
|
| 161 |
+
|
| 162 |
+
var rgb = col.replace(re, "$1,$2,$3").split(',');
|
| 163 |
+
if (rgb.length == 3) {
|
| 164 |
+
r = parseInt(rgb[0]).toString(16);
|
| 165 |
+
g = parseInt(rgb[1]).toString(16);
|
| 166 |
+
b = parseInt(rgb[2]).toString(16);
|
| 167 |
+
|
| 168 |
+
r = r.length == 1 ? '0' + r : r;
|
| 169 |
+
g = g.length == 1 ? '0' + g : g;
|
| 170 |
+
b = b.length == 1 ? '0' + b : b;
|
| 171 |
+
|
| 172 |
+
return "#" + r + g + b;
|
| 173 |
+
}
|
| 174 |
+
|
| 175 |
+
return col;
|
| 176 |
+
}
|
| 177 |
+
|
| 178 |
+
function convertHexToRGB(col) {
|
| 179 |
+
if (col.indexOf('#') != -1) {
|
| 180 |
+
col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');
|
| 181 |
+
|
| 182 |
+
r = parseInt(col.substring(0, 2), 16);
|
| 183 |
+
g = parseInt(col.substring(2, 4), 16);
|
| 184 |
+
b = parseInt(col.substring(4, 6), 16);
|
| 185 |
+
|
| 186 |
+
return {r : r, g : g, b : b};
|
| 187 |
+
}
|
| 188 |
+
|
| 189 |
+
return null;
|
| 190 |
+
}
|
| 191 |
+
|
| 192 |
+
function generatePicker() {
|
| 193 |
+
var el = document.getElementById('light'), h = '', i;
|
| 194 |
+
|
| 195 |
+
for (i = 0; i < detail; i++){
|
| 196 |
+
h += '<div id="gs'+i+'" style="background-color:#000000; width:15px; height:3px; border-style:none; border-width:0px;"'
|
| 197 |
+
+ ' onclick="changeFinalColor(this.style.backgroundColor)"'
|
| 198 |
+
+ ' onmousedown="isMouseDown = true; return false;"'
|
| 199 |
+
+ ' onmouseup="isMouseDown = false;"'
|
| 200 |
+
+ ' onmousemove="if (isMouseDown && isMouseOver) changeFinalColor(this.style.backgroundColor); return false;"'
|
| 201 |
+
+ ' onmouseover="isMouseOver = true;"'
|
| 202 |
+
+ ' onmouseout="isMouseOver = false;"'
|
| 203 |
+
+ '></div>';
|
| 204 |
+
}
|
| 205 |
+
|
| 206 |
+
el.innerHTML = h;
|
| 207 |
+
}
|
| 208 |
+
|
| 209 |
+
function generateWebColors() {
|
| 210 |
+
var el = document.getElementById('webcolors'), h = '', i;
|
| 211 |
+
|
| 212 |
+
if (el.className == 'generated')
|
| 213 |
+
return;
|
| 214 |
+
|
| 215 |
+
// TODO: VoiceOver doesn't seem to support legend as a label referenced by labelledby.
|
| 216 |
+
h += '<div role="listbox" aria-labelledby="webcolors_title" tabindex="0"><table role="presentation" border="0" cellspacing="1" cellpadding="0">'
|
| 217 |
+
+ '<tr>';
|
| 218 |
+
|
| 219 |
+
for (i=0; i<colors.length; i++) {
|
| 220 |
+
h += '<td bgcolor="' + colors[i] + '" width="10" height="10">'
|
| 221 |
+
+ '<a href="javascript:insertAction();" role="option" tabindex="-1" aria-labelledby="web_colors_' + i + '" onfocus="showColor(\'' + colors[i] + '\');" onmouseover="showColor(\'' + colors[i] + '\');" style="display:block;width:10px;height:10px;overflow:hidden;">';
|
| 222 |
+
if (tinyMCEPopup.editor.forcedHighContrastMode) {
|
| 223 |
+
h += '<canvas class="mceColorSwatch" height="10" width="10" data-color="' + colors[i] + '"></canvas>';
|
| 224 |
+
}
|
| 225 |
+
h += '<span class="mceVoiceLabel" style="display:none;" id="web_colors_' + i + '">' + colors[i].toUpperCase() + '</span>';
|
| 226 |
+
h += '</a></td>';
|
| 227 |
+
if ((i+1) % 18 == 0)
|
| 228 |
+
h += '</tr><tr>';
|
| 229 |
+
}
|
| 230 |
+
|
| 231 |
+
h += '</table></div>';
|
| 232 |
+
|
| 233 |
+
el.innerHTML = h;
|
| 234 |
+
el.className = 'generated';
|
| 235 |
+
|
| 236 |
+
paintCanvas(el);
|
| 237 |
+
enableKeyboardNavigation(el.firstChild);
|
| 238 |
+
}
|
| 239 |
+
|
| 240 |
+
function paintCanvas(el) {
|
| 241 |
+
tinyMCEPopup.getWin().tinymce.each(tinyMCEPopup.dom.select('canvas.mceColorSwatch', el), function(canvas) {
|
| 242 |
+
var context;
|
| 243 |
+
if (canvas.getContext && (context = canvas.getContext("2d"))) {
|
| 244 |
+
context.fillStyle = canvas.getAttribute('data-color');
|
| 245 |
+
context.fillRect(0, 0, 10, 10);
|
| 246 |
+
}
|
| 247 |
+
});
|
| 248 |
+
}
|
| 249 |
+
function generateNamedColors() {
|
| 250 |
+
var el = document.getElementById('namedcolors'), h = '', n, v, i = 0;
|
| 251 |
+
|
| 252 |
+
if (el.className == 'generated')
|
| 253 |
+
return;
|
| 254 |
+
|
| 255 |
+
for (n in named) {
|
| 256 |
+
v = named[n];
|
| 257 |
+
h += '<a href="javascript:insertAction();" role="option" tabindex="-1" aria-labelledby="named_colors_' + i + '" onfocus="showColor(\'' + n + '\',\'' + v + '\');" onmouseover="showColor(\'' + n + '\',\'' + v + '\');" style="background-color: ' + n + '">';
|
| 258 |
+
if (tinyMCEPopup.editor.forcedHighContrastMode) {
|
| 259 |
+
h += '<canvas class="mceColorSwatch" height="10" width="10" data-color="' + colors[i] + '"></canvas>';
|
| 260 |
+
}
|
| 261 |
+
h += '<span class="mceVoiceLabel" style="display:none;" id="named_colors_' + i + '">' + v + '</span>';
|
| 262 |
+
h += '</a>';
|
| 263 |
+
i++;
|
| 264 |
+
}
|
| 265 |
+
|
| 266 |
+
el.innerHTML = h;
|
| 267 |
+
el.className = 'generated';
|
| 268 |
+
|
| 269 |
+
paintCanvas(el);
|
| 270 |
+
enableKeyboardNavigation(el);
|
| 271 |
+
}
|
| 272 |
+
|
| 273 |
+
function enableKeyboardNavigation(el) {
|
| 274 |
+
tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', {
|
| 275 |
+
root: el,
|
| 276 |
+
items: tinyMCEPopup.dom.select('a', el)
|
| 277 |
+
}, tinyMCEPopup.dom);
|
| 278 |
+
}
|
| 279 |
+
|
| 280 |
+
function dechex(n) {
|
| 281 |
+
return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16);
|
| 282 |
+
}
|
| 283 |
+
|
| 284 |
+
function computeColor(e) {
|
| 285 |
+
var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB, pos = tinyMCEPopup.dom.getPos(e.target);
|
| 286 |
+
|
| 287 |
+
x = e.offsetX ? e.offsetX : (e.target ? e.clientX - pos.x : 0);
|
| 288 |
+
y = e.offsetY ? e.offsetY : (e.target ? e.clientY - pos.y : 0);
|
| 289 |
+
|
| 290 |
+
partWidth = document.getElementById('colors').width / 6;
|
| 291 |
+
partDetail = detail / 2;
|
| 292 |
+
imHeight = document.getElementById('colors').height;
|
| 293 |
+
|
| 294 |
+
r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255;
|
| 295 |
+
g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255 + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth);
|
| 296 |
+
b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth);
|
| 297 |
+
|
| 298 |
+
coef = (imHeight - y) / imHeight;
|
| 299 |
+
r = 128 + (r - 128) * coef;
|
| 300 |
+
g = 128 + (g - 128) * coef;
|
| 301 |
+
b = 128 + (b - 128) * coef;
|
| 302 |
+
|
| 303 |
+
changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b));
|
| 304 |
+
updateLight(r, g, b);
|
| 305 |
+
}
|
| 306 |
+
|
| 307 |
+
function updateLight(r, g, b) {
|
| 308 |
+
var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color;
|
| 309 |
+
|
| 310 |
+
for (i=0; i<detail; i++) {
|
| 311 |
+
if ((i>=0) && (i<partDetail)) {
|
| 312 |
+
finalCoef = i / partDetail;
|
| 313 |
+
finalR = dechex(255 - (255 - r) * finalCoef);
|
| 314 |
+
finalG = dechex(255 - (255 - g) * finalCoef);
|
| 315 |
+
finalB = dechex(255 - (255 - b) * finalCoef);
|
| 316 |
+
} else {
|
| 317 |
+
finalCoef = 2 - i / partDetail;
|
| 318 |
+
finalR = dechex(r * finalCoef);
|
| 319 |
+
finalG = dechex(g * finalCoef);
|
| 320 |
+
finalB = dechex(b * finalCoef);
|
| 321 |
+
}
|
| 322 |
+
|
| 323 |
+
color = finalR + finalG + finalB;
|
| 324 |
+
|
| 325 |
+
setCol('gs' + i, '#'+color);
|
| 326 |
+
}
|
| 327 |
+
}
|
| 328 |
+
|
| 329 |
+
function changeFinalColor(color) {
|
| 330 |
+
if (color.indexOf('#') == -1)
|
| 331 |
+
color = convertRGBToHex(color);
|
| 332 |
+
|
| 333 |
+
setCol('preview', color);
|
| 334 |
+
document.getElementById('color').value = color;
|
| 335 |
+
}
|
| 336 |
+
|
| 337 |
+
function setCol(e, c) {
|
| 338 |
+
try {
|
| 339 |
+
document.getElementById(e).style.backgroundColor = c;
|
| 340 |
+
} catch (ex) {
|
| 341 |
+
// Ignore IE warning
|
| 342 |
+
}
|
| 343 |
+
}
|
| 344 |
+
|
| 345 |
+
tinyMCEPopup.onInit.add(init);
|
js/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
tinyMCE.addI18n('en.advanced_dlg', {"link_list":"Link List","link_is_external":"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?","link_is_email":"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?","link_titlefield":"Title","link_target_blank":"Open Link in a New Window","link_target_same":"Open Link in the Same Window","link_target":"Target","link_url":"Link URL","link_title":"Insert/Edit Link","image_align_right":"Right","image_align_left":"Left","image_align_textbottom":"Text Bottom","image_align_texttop":"Text Top","image_align_bottom":"Bottom","image_align_middle":"Middle","image_align_top":"Top","image_align_baseline":"Baseline","image_align":"Alignment","image_hspace":"Horizontal Space","image_vspace":"Vertical Space","image_dimensions":"Dimensions","image_alt":"Image Description","image_list":"Image List","image_border":"Border","image_src":"Image URL","image_title":"Insert/Edit Image","charmap_title":"Select Special Character", "charmap_usage":"Use left and right arrows to navigate.","colorpicker_name":"Name:","colorpicker_color":"Color:","colorpicker_named_title":"Named Colors","colorpicker_named_tab":"Named","colorpicker_palette_title":"Palette Colors","colorpicker_palette_tab":"Palette","colorpicker_picker_title":"Color Picker","colorpicker_picker_tab":"Picker","colorpicker_title":"Select a Color","code_wordwrap":"Word Wrap","code_title":"HTML Source Editor","anchor_name":"Anchor Name","anchor_title":"Insert/Edit Anchor","about_loaded":"Loaded Plugins","about_version":"Version","about_author":"Author","about_plugin":"Plugin","about_plugins":"Plugins","about_license":"License","about_help":"Help","about_general":"About","about_title":"About TinyMCE","anchor_invalid":"Please specify a valid anchor name.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage","invalid_color_value":"Invalid color value","":""});
|
| 1 |
+
tinyMCE.addI18n('en.advanced_dlg', {"link_list":"Link List","link_is_external":"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?","link_is_email":"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?","link_titlefield":"Title","link_target_blank":"Open Link in a New Window","link_target_same":"Open Link in the Same Window","link_target":"Target","link_url":"Link URL","link_title":"Insert/Edit Link","image_align_right":"Right","image_align_left":"Left","image_align_textbottom":"Text Bottom","image_align_texttop":"Text Top","image_align_bottom":"Bottom","image_align_middle":"Middle","image_align_top":"Top","image_align_baseline":"Baseline","image_align":"Alignment","image_hspace":"Horizontal Space","image_vspace":"Vertical Space","image_dimensions":"Dimensions","image_alt":"Image Description","image_list":"Image List","image_border":"Border","image_src":"Image URL","image_title":"Insert/Edit Image","charmap_title":"Select Special Character", "charmap_usage":"Use left and right arrows to navigate.","colorpicker_name":"Name:","colorpicker_color":"Color:","colorpicker_named_title":"Named Colors","colorpicker_named_tab":"Named","colorpicker_palette_title":"Palette Colors","colorpicker_palette_tab":"Palette","colorpicker_picker_title":"Color Picker","colorpicker_picker_tab":"Picker","colorpicker_title":"Select a Color","code_wordwrap":"Word Wrap","code_title":"HTML Source Editor","anchor_name":"Anchor Name","anchor_title":"Insert/Edit Anchor","about_loaded":"Loaded Plugins","about_version":"Version","about_author":"Author","about_plugin":"Plugin","about_plugins":"Plugins","about_license":"License","about_help":"Help","about_general":"About","about_title":"About TinyMCE","anchor_invalid":"Please specify a valid anchor name.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage","invalid_color_value":"Invalid color value","":""});
|
js/tinymce/jscripts/tiny_mce/tiny_mce_popup.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
-
|
| 2 |
-
// Uncomment and change this document.domain value if you are loading the script cross subdomains
|
| 3 |
-
// document.domain = 'moxiecode.com';
|
| 4 |
-
|
| 5 |
var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document,{ownEvents:true,proxy:tinyMCEPopup._eventProxy});b.dom.bind(window,"ready",b._onDOMLoaded,b);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return(!window.frameElement&&window.dialogArguments)||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},10)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false&&b.editor.settings.language_load!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write('<script type="text/javascript" src="'+tinymce._addVer(a)+'"><\/script>');tinymce.ScriptLoader.markDone(a)}}},pickColor:function(b,a){this.execCommand("mceColorPicker",true,{color:document.getElementById(a).value,func:function(e){document.getElementById(a).value=e;try{document.getElementById(a).onchange()}catch(d){}}})},openBrowser:function(a,c,b){tinyMCEPopup.restoreSelection();this.editor.execCallback("file_browser_callback",a,document.getElementById(a).value,c,window)},confirm:function(b,a,c){this.editor.windowManager.confirm(b,a,c,window)},alert:function(b,a,c){this.editor.windowManager.alert(b,a,c,window)},close:function(){var a=this;function b(){a.editor.windowManager.close(window);tinymce=tinyMCE=a.editor=a.params=a.dom=a.dom.doc=null}if(tinymce.isOpera){a.getWin().setTimeout(b,0)}else{b()}},_restoreSelection:function(){var a=window.event.srcElement;if(a.nodeName=="INPUT"&&(a.type=="submit"||a.type=="button")){tinyMCEPopup.restoreSelection()}},_onDOMLoaded:function(){var b=tinyMCEPopup,d=document.title,e,c,a;if(b.features.translate_i18n!==false){c=document.body.innerHTML;if(tinymce.isIE){c=c.replace(/ (value|title|alt)=([^"][^\s>]+)/gi,' $1="$2"')}document.dir=b.editor.getParam("directionality","");if((a=b.editor.translate(c))&&a!=c){document.body.innerHTML=a}if((a=b.editor.translate(d))&&a!=d){document.title=d=a}}if(!b.editor.getParam("browser_preferred_colors",false)||!b.isWindow){b.dom.addClass(document.body,"forceColors")}document.body.style.display="";if(tinymce.isIE){document.attachEvent("onmouseup",tinyMCEPopup._restoreSelection);b.dom.add(b.dom.select("head")[0],"base",{target:"_self"})}b.restoreSelection();b.resizeToInnerSize();if(!b.isWindow){b.editor.windowManager.setTitle(window,d)}else{window.focus()}if(!tinymce.isIE&&!b.isWindow){b.dom.bind(document,"focus",function(){b.editor.windowManager.focus(b.id)})}tinymce.each(b.dom.select("select"),function(f){f.onkeydown=tinyMCEPopup._accessHandler});tinymce.each(b.listeners,function(f){f.func.call(f.scope,b.editor)});if(b.getWindowArg("mce_auto_focus",true)){window.focus();tinymce.each(document.forms,function(g){tinymce.each(g.elements,function(f){if(b.dom.hasClass(f,"mceFocus")&&!f.disabled){f.focus();return false}})})}document.onkeyup=tinyMCEPopup._closeWinKeyHandler},_accessHandler:function(a){a=a||window.event;if(a.keyCode==13||a.keyCode==32){var b=a.target||a.srcElement;if(b.onchange){b.onchange()}return tinymce.dom.Event.cancel(a)}},_closeWinKeyHandler:function(a){a=a||window.event;if(a.keyCode==27){tinyMCEPopup.close()}},_eventProxy:function(a){return function(b){tinyMCEPopup.dom.events.callNativeHandler(a,b)}}};tinyMCEPopup.init();
|
| 1 |
+
|
| 2 |
+
// Uncomment and change this document.domain value if you are loading the script cross subdomains
|
| 3 |
+
// document.domain = 'moxiecode.com';
|
| 4 |
+
|
| 5 |
var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document,{ownEvents:true,proxy:tinyMCEPopup._eventProxy});b.dom.bind(window,"ready",b._onDOMLoaded,b);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return(!window.frameElement&&window.dialogArguments)||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},10)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false&&b.editor.settings.language_load!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write('<script type="text/javascript" src="'+tinymce._addVer(a)+'"><\/script>');tinymce.ScriptLoader.markDone(a)}}},pickColor:function(b,a){this.execCommand("mceColorPicker",true,{color:document.getElementById(a).value,func:function(e){document.getElementById(a).value=e;try{document.getElementById(a).onchange()}catch(d){}}})},openBrowser:function(a,c,b){tinyMCEPopup.restoreSelection();this.editor.execCallback("file_browser_callback",a,document.getElementById(a).value,c,window)},confirm:function(b,a,c){this.editor.windowManager.confirm(b,a,c,window)},alert:function(b,a,c){this.editor.windowManager.alert(b,a,c,window)},close:function(){var a=this;function b(){a.editor.windowManager.close(window);tinymce=tinyMCE=a.editor=a.params=a.dom=a.dom.doc=null}if(tinymce.isOpera){a.getWin().setTimeout(b,0)}else{b()}},_restoreSelection:function(){var a=window.event.srcElement;if(a.nodeName=="INPUT"&&(a.type=="submit"||a.type=="button")){tinyMCEPopup.restoreSelection()}},_onDOMLoaded:function(){var b=tinyMCEPopup,d=document.title,e,c,a;if(b.features.translate_i18n!==false){c=document.body.innerHTML;if(tinymce.isIE){c=c.replace(/ (value|title|alt)=([^"][^\s>]+)/gi,' $1="$2"')}document.dir=b.editor.getParam("directionality","");if((a=b.editor.translate(c))&&a!=c){document.body.innerHTML=a}if((a=b.editor.translate(d))&&a!=d){document.title=d=a}}if(!b.editor.getParam("browser_preferred_colors",false)||!b.isWindow){b.dom.addClass(document.body,"forceColors")}document.body.style.display="";if(tinymce.isIE){document.attachEvent("onmouseup",tinyMCEPopup._restoreSelection);b.dom.add(b.dom.select("head")[0],"base",{target:"_self"})}b.restoreSelection();b.resizeToInnerSize();if(!b.isWindow){b.editor.windowManager.setTitle(window,d)}else{window.focus()}if(!tinymce.isIE&&!b.isWindow){b.dom.bind(document,"focus",function(){b.editor.windowManager.focus(b.id)})}tinymce.each(b.dom.select("select"),function(f){f.onkeydown=tinyMCEPopup._accessHandler});tinymce.each(b.listeners,function(f){f.func.call(f.scope,b.editor)});if(b.getWindowArg("mce_auto_focus",true)){window.focus();tinymce.each(document.forms,function(g){tinymce.each(g.elements,function(f){if(b.dom.hasClass(f,"mceFocus")&&!f.disabled){f.focus();return false}})})}document.onkeyup=tinyMCEPopup._closeWinKeyHandler},_accessHandler:function(a){a=a||window.event;if(a.keyCode==13||a.keyCode==32){var b=a.target||a.srcElement;if(b.onchange){b.onchange()}return tinymce.dom.Event.cancel(a)}},_closeWinKeyHandler:function(a){a=a||window.event;if(a.keyCode==27){tinyMCEPopup.close()}},_eventProxy:function(a){return function(b){tinyMCEPopup.dom.events.callNativeHandler(a,b)}}};tinyMCEPopup.init();
|
languages/messages.pot
CHANGED
|
@@ -8,7 +8,7 @@ msgid ""
|
|
| 8 |
msgstr ""
|
| 9 |
"Project-Id-Version: PACKAGE VERSION\n"
|
| 10 |
"Report-Msgid-Bugs-To: \n"
|
| 11 |
-
"POT-Creation-Date: 2015-
|
| 12 |
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
| 13 |
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
| 14 |
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
@@ -21,198 +21,248 @@ msgstr ""
|
|
| 21 |
msgid "Once Every Five Minutes"
|
| 22 |
msgstr ""
|
| 23 |
|
| 24 |
-
#: woocommerce-ac.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
msgid "Abandoned Carts"
|
| 26 |
msgstr ""
|
| 27 |
|
| 28 |
-
#: woocommerce-ac.php:
|
| 29 |
msgid "Abandoned Orders"
|
| 30 |
msgstr ""
|
| 31 |
|
| 32 |
-
#: woocommerce-ac.php:
|
| 33 |
msgid "Email Templates"
|
| 34 |
msgstr ""
|
| 35 |
|
| 36 |
-
#: woocommerce-ac.php:
|
| 37 |
msgid "Settings"
|
| 38 |
msgstr ""
|
| 39 |
|
| 40 |
-
#: woocommerce-ac.php:
|
| 41 |
msgid "Recovered Orders"
|
| 42 |
msgstr ""
|
| 43 |
|
| 44 |
-
#: woocommerce-ac.php:
|
| 45 |
msgid "You do not have sufficient permissions to access this page."
|
| 46 |
msgstr ""
|
| 47 |
|
| 48 |
-
#: woocommerce-ac.php:
|
| 49 |
msgid "WooCommerce - Abandon Cart Lite"
|
| 50 |
msgstr ""
|
| 51 |
|
| 52 |
-
#: woocommerce-ac.php:
|
| 53 |
msgid "Your settings have been saved."
|
| 54 |
msgstr ""
|
| 55 |
|
| 56 |
-
#: woocommerce-ac.php:
|
| 57 |
msgid "Cart abandoned cut-off time"
|
| 58 |
msgstr ""
|
| 59 |
|
| 60 |
-
#: woocommerce-ac.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
msgid ""
|
| 62 |
"Consider cart abandoned after X minutes of item being added to cart & order "
|
| 63 |
"not placed"
|
| 64 |
msgstr ""
|
| 65 |
|
| 66 |
-
#: woocommerce-ac.php:
|
| 67 |
msgid "Save Changes"
|
| 68 |
msgstr ""
|
| 69 |
|
| 70 |
-
#: woocommerce-ac.php:
|
| 71 |
msgid ""
|
| 72 |
"The list below shows all Abandoned Carts which have remained in cart for a "
|
| 73 |
"time higher than the \"Cart abandoned cut-off time\" setting."
|
| 74 |
msgstr ""
|
| 75 |
|
| 76 |
-
#: woocommerce-ac.php:
|
| 77 |
msgid "Customer"
|
| 78 |
msgstr ""
|
| 79 |
|
| 80 |
-
#: woocommerce-ac.php:
|
| 81 |
msgid "Order Total"
|
| 82 |
msgstr ""
|
| 83 |
|
| 84 |
-
#: woocommerce-ac.php:
|
| 85 |
msgid "Date"
|
| 86 |
msgstr ""
|
| 87 |
|
| 88 |
-
#: woocommerce-ac.php:
|
| 89 |
msgid "Status"
|
| 90 |
msgstr ""
|
| 91 |
|
| 92 |
-
#: woocommerce-ac.php:
|
| 93 |
msgid "Actions"
|
| 94 |
msgstr ""
|
| 95 |
|
| 96 |
-
#: woocommerce-ac.php:
|
| 97 |
msgid ""
|
| 98 |
"Add email templates at different intervals to maximize the possibility of "
|
| 99 |
"recovering your abandoned carts."
|
| 100 |
msgstr ""
|
| 101 |
|
| 102 |
-
#: woocommerce-ac.php:
|
| 103 |
msgid "The Email Template has been successfully added."
|
| 104 |
msgstr ""
|
| 105 |
|
| 106 |
-
#: woocommerce-ac.php:
|
| 107 |
msgid "The Email Template has been successfully updated."
|
| 108 |
msgstr ""
|
| 109 |
|
| 110 |
-
#: woocommerce-ac.php:
|
| 111 |
msgid "Sr"
|
| 112 |
msgstr ""
|
| 113 |
|
| 114 |
-
#: woocommerce-ac.php:
|
| 115 |
msgid "Template Name"
|
| 116 |
msgstr ""
|
| 117 |
|
| 118 |
-
#: woocommerce-ac.php:
|
| 119 |
msgid "Sent"
|
| 120 |
msgstr ""
|
| 121 |
|
| 122 |
-
#: woocommerce-ac.php:
|
| 123 |
msgid "Active ?"
|
| 124 |
msgstr ""
|
| 125 |
|
| 126 |
-
#: woocommerce-ac.php:
|
| 127 |
msgid ""
|
| 128 |
"The Report below shows how many Abandoned Carts we were able to recover for "
|
| 129 |
"you by sending automatic emails to encourage shoppers."
|
| 130 |
msgstr ""
|
| 131 |
|
| 132 |
-
#: woocommerce-ac.php:
|
| 133 |
msgid "Start Date:"
|
| 134 |
msgstr ""
|
| 135 |
|
| 136 |
-
#: woocommerce-ac.php:
|
| 137 |
msgid "End Date:"
|
| 138 |
msgstr ""
|
| 139 |
|
| 140 |
-
#: woocommerce-ac.php:
|
| 141 |
msgid "Go"
|
| 142 |
msgstr ""
|
| 143 |
|
| 144 |
-
#: woocommerce-ac.php:
|
| 145 |
msgid "During the selected range"
|
| 146 |
msgstr ""
|
| 147 |
|
| 148 |
-
#: woocommerce-ac.php:
|
| 149 |
msgid "carts totaling"
|
| 150 |
msgstr ""
|
| 151 |
|
| 152 |
-
#: woocommerce-ac.php:
|
| 153 |
msgid "were abandoned. We were able to recover"
|
| 154 |
msgstr ""
|
| 155 |
|
| 156 |
-
#: woocommerce-ac.php:
|
| 157 |
msgid "of them, which led to an extra"
|
| 158 |
msgstr ""
|
| 159 |
|
| 160 |
-
#: woocommerce-ac.php:
|
| 161 |
msgid "in sales"
|
| 162 |
msgstr ""
|
| 163 |
|
| 164 |
-
#: woocommerce-ac.php:
|
| 165 |
msgid "Created On"
|
| 166 |
msgstr ""
|
| 167 |
|
| 168 |
-
#: woocommerce-ac.php:
|
| 169 |
msgid "Recovered Date"
|
| 170 |
msgstr ""
|
| 171 |
|
| 172 |
-
#: woocommerce-ac.php:
|
| 173 |
msgid "Template Name:"
|
| 174 |
msgstr ""
|
| 175 |
|
| 176 |
-
#: woocommerce-ac.php:
|
| 177 |
msgid "Enter a template name for reference"
|
| 178 |
msgstr ""
|
| 179 |
|
| 180 |
-
#: woocommerce-ac.php:
|
| 181 |
msgid "Send From This Name:"
|
| 182 |
msgstr ""
|
| 183 |
|
| 184 |
-
#: woocommerce-ac.php:
|
| 185 |
msgid "Enter the name that should appear in the email sent"
|
| 186 |
msgstr ""
|
| 187 |
|
| 188 |
-
#: woocommerce-ac.php:
|
| 189 |
msgid "Subject:"
|
| 190 |
msgstr ""
|
| 191 |
|
| 192 |
-
#: woocommerce-ac.php:
|
| 193 |
msgid "Enter the subject that should appear in the email sent"
|
| 194 |
msgstr ""
|
| 195 |
|
| 196 |
-
#: woocommerce-ac.php:
|
| 197 |
msgid "Email Body:"
|
| 198 |
msgstr ""
|
| 199 |
|
| 200 |
-
#: woocommerce-ac.php:
|
| 201 |
msgid "Message to be sent in the reminder email."
|
| 202 |
msgstr ""
|
| 203 |
|
| 204 |
-
#: woocommerce-ac.php:
|
| 205 |
msgid "Send this email:"
|
| 206 |
msgstr ""
|
| 207 |
|
| 208 |
-
#: woocommerce-ac.php:
|
| 209 |
msgid "after cart is abandoned."
|
| 210 |
msgstr ""
|
| 211 |
|
| 212 |
-
#: woocommerce-ac.php:
|
| 213 |
msgid "Send a test email to:"
|
| 214 |
msgstr ""
|
| 215 |
|
| 216 |
-
#: woocommerce-ac.php:
|
| 217 |
msgid "Enter the email id to which the test email needs to be sent."
|
| 218 |
msgstr ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
msgstr ""
|
| 9 |
"Project-Id-Version: PACKAGE VERSION\n"
|
| 10 |
"Report-Msgid-Bugs-To: \n"
|
| 11 |
+
"POT-Creation-Date: 2015-07-08 16:30+0530\n"
|
| 12 |
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
| 13 |
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
| 14 |
"Language-Team: LANGUAGE <LL@li.org>\n"
|
| 21 |
msgid "Once Every Five Minutes"
|
| 22 |
msgstr ""
|
| 23 |
|
| 24 |
+
#: woocommerce-ac.php:204
|
| 25 |
+
#, php-format
|
| 26 |
+
msgid ""
|
| 27 |
+
"You can upgrade to the <a href=\"https://www.tychesoftwares.com/store/"
|
| 28 |
+
"premium-plugins/woocommerce-abandoned-cart-pro/\">PRO version of WooCommerce "
|
| 29 |
+
"Abandoned Cart plugin</a> at a <b>20% discount</b>. Use the coupon code: "
|
| 30 |
+
"<b>ACPRO20</b>.<a href=\"https://www.tychesoftwares.com/store/premium-"
|
| 31 |
+
"plugins/woocommerce-abandoned-cart-pro/\"> Purchase now </a> & save $24!"
|
| 32 |
+
msgstr ""
|
| 33 |
+
|
| 34 |
+
#: woocommerce-ac.php:314
|
| 35 |
msgid "Abandoned Carts"
|
| 36 |
msgstr ""
|
| 37 |
|
| 38 |
+
#: woocommerce-ac.php:516
|
| 39 |
msgid "Abandoned Orders"
|
| 40 |
msgstr ""
|
| 41 |
|
| 42 |
+
#: woocommerce-ac.php:517
|
| 43 |
msgid "Email Templates"
|
| 44 |
msgstr ""
|
| 45 |
|
| 46 |
+
#: woocommerce-ac.php:518 woocommerce-ac.php:712
|
| 47 |
msgid "Settings"
|
| 48 |
msgstr ""
|
| 49 |
|
| 50 |
+
#: woocommerce-ac.php:519
|
| 51 |
msgid "Recovered Orders"
|
| 52 |
msgstr ""
|
| 53 |
|
| 54 |
+
#: woocommerce-ac.php:661
|
| 55 |
msgid "You do not have sufficient permissions to access this page."
|
| 56 |
msgstr ""
|
| 57 |
|
| 58 |
+
#: woocommerce-ac.php:670
|
| 59 |
msgid "WooCommerce - Abandon Cart Lite"
|
| 60 |
msgstr ""
|
| 61 |
|
| 62 |
+
#: woocommerce-ac.php:696
|
| 63 |
msgid "Your settings have been saved."
|
| 64 |
msgstr ""
|
| 65 |
|
| 66 |
+
#: woocommerce-ac.php:718
|
| 67 |
msgid "Cart abandoned cut-off time"
|
| 68 |
msgstr ""
|
| 69 |
|
| 70 |
+
#: woocommerce-ac.php:741
|
| 71 |
+
msgid "minutes"
|
| 72 |
+
msgstr ""
|
| 73 |
+
|
| 74 |
+
#: woocommerce-ac.php:742 woocommerce-ac.php:743
|
| 75 |
msgid ""
|
| 76 |
"Consider cart abandoned after X minutes of item being added to cart & order "
|
| 77 |
"not placed"
|
| 78 |
msgstr ""
|
| 79 |
|
| 80 |
+
#: woocommerce-ac.php:753
|
| 81 |
msgid "Save Changes"
|
| 82 |
msgstr ""
|
| 83 |
|
| 84 |
+
#: woocommerce-ac.php:763
|
| 85 |
msgid ""
|
| 86 |
"The list below shows all Abandoned Carts which have remained in cart for a "
|
| 87 |
"time higher than the \"Cart abandoned cut-off time\" setting."
|
| 88 |
msgstr ""
|
| 89 |
|
| 90 |
+
#: woocommerce-ac.php:858 woocommerce-ac.php:1501
|
| 91 |
msgid "Customer"
|
| 92 |
msgstr ""
|
| 93 |
|
| 94 |
+
#: woocommerce-ac.php:859 woocommerce-ac.php:1514
|
| 95 |
msgid "Order Total"
|
| 96 |
msgstr ""
|
| 97 |
|
| 98 |
+
#: woocommerce-ac.php:862
|
| 99 |
msgid "Date"
|
| 100 |
msgstr ""
|
| 101 |
|
| 102 |
+
#: woocommerce-ac.php:868
|
| 103 |
msgid "Status"
|
| 104 |
msgstr ""
|
| 105 |
|
| 106 |
+
#: woocommerce-ac.php:872 woocommerce-ac.php:1159
|
| 107 |
msgid "Actions"
|
| 108 |
msgstr ""
|
| 109 |
|
| 110 |
+
#: woocommerce-ac.php:953
|
| 111 |
msgid ""
|
| 112 |
"Add email templates at different intervals to maximize the possibility of "
|
| 113 |
"recovering your abandoned carts."
|
| 114 |
msgstr ""
|
| 115 |
|
| 116 |
+
#: woocommerce-ac.php:1054
|
| 117 |
msgid "The Email Template has been successfully added."
|
| 118 |
msgstr ""
|
| 119 |
|
| 120 |
+
#: woocommerce-ac.php:1057
|
| 121 |
msgid "The Email Template has been successfully updated."
|
| 122 |
msgstr ""
|
| 123 |
|
| 124 |
+
#: woocommerce-ac.php:1145
|
| 125 |
msgid "Sr"
|
| 126 |
msgstr ""
|
| 127 |
|
| 128 |
+
#: woocommerce-ac.php:1148
|
| 129 |
msgid "Template Name"
|
| 130 |
msgstr ""
|
| 131 |
|
| 132 |
+
#: woocommerce-ac.php:1154
|
| 133 |
msgid "Sent"
|
| 134 |
msgstr ""
|
| 135 |
|
| 136 |
+
#: woocommerce-ac.php:1158
|
| 137 |
msgid "Active ?"
|
| 138 |
msgstr ""
|
| 139 |
|
| 140 |
+
#: woocommerce-ac.php:1276
|
| 141 |
msgid ""
|
| 142 |
"The Report below shows how many Abandoned Carts we were able to recover for "
|
| 143 |
"you by sending automatic emails to encourage shoppers."
|
| 144 |
msgstr ""
|
| 145 |
|
| 146 |
+
#: woocommerce-ac.php:1331
|
| 147 |
msgid "Start Date:"
|
| 148 |
msgstr ""
|
| 149 |
|
| 150 |
+
#: woocommerce-ac.php:1334
|
| 151 |
msgid "End Date:"
|
| 152 |
msgstr ""
|
| 153 |
|
| 154 |
+
#: woocommerce-ac.php:1337
|
| 155 |
msgid "Go"
|
| 156 |
msgstr ""
|
| 157 |
|
| 158 |
+
#: woocommerce-ac.php:1495
|
| 159 |
msgid "During the selected range"
|
| 160 |
msgstr ""
|
| 161 |
|
| 162 |
+
#: woocommerce-ac.php:1495
|
| 163 |
msgid "carts totaling"
|
| 164 |
msgstr ""
|
| 165 |
|
| 166 |
+
#: woocommerce-ac.php:1495
|
| 167 |
msgid "were abandoned. We were able to recover"
|
| 168 |
msgstr ""
|
| 169 |
|
| 170 |
+
#: woocommerce-ac.php:1495
|
| 171 |
msgid "of them, which led to an extra"
|
| 172 |
msgstr ""
|
| 173 |
|
| 174 |
+
#: woocommerce-ac.php:1495
|
| 175 |
msgid "in sales"
|
| 176 |
msgstr ""
|
| 177 |
|
| 178 |
+
#: woocommerce-ac.php:1504
|
| 179 |
msgid "Created On"
|
| 180 |
msgstr ""
|
| 181 |
|
| 182 |
+
#: woocommerce-ac.php:1510
|
| 183 |
msgid "Recovered Date"
|
| 184 |
msgstr ""
|
| 185 |
|
| 186 |
+
#: woocommerce-ac.php:1561
|
| 187 |
msgid "Template Name:"
|
| 188 |
msgstr ""
|
| 189 |
|
| 190 |
+
#: woocommerce-ac.php:1572
|
| 191 |
msgid "Enter a template name for reference"
|
| 192 |
msgstr ""
|
| 193 |
|
| 194 |
+
#: woocommerce-ac.php:1577
|
| 195 |
msgid "Send From This Name:"
|
| 196 |
msgstr ""
|
| 197 |
|
| 198 |
+
#: woocommerce-ac.php:1588
|
| 199 |
msgid "Enter the name that should appear in the email sent"
|
| 200 |
msgstr ""
|
| 201 |
|
| 202 |
+
#: woocommerce-ac.php:1594
|
| 203 |
msgid "Subject:"
|
| 204 |
msgstr ""
|
| 205 |
|
| 206 |
+
#: woocommerce-ac.php:1605
|
| 207 |
msgid "Enter the subject that should appear in the email sent"
|
| 208 |
msgstr ""
|
| 209 |
|
| 210 |
+
#: woocommerce-ac.php:1611
|
| 211 |
msgid "Email Body:"
|
| 212 |
msgstr ""
|
| 213 |
|
| 214 |
+
#: woocommerce-ac.php:1627
|
| 215 |
msgid "Message to be sent in the reminder email."
|
| 216 |
msgstr ""
|
| 217 |
|
| 218 |
+
#: woocommerce-ac.php:1634
|
| 219 |
msgid "Send this email:"
|
| 220 |
msgstr ""
|
| 221 |
|
| 222 |
+
#: woocommerce-ac.php:1686
|
| 223 |
msgid "after cart is abandoned."
|
| 224 |
msgstr ""
|
| 225 |
|
| 226 |
+
#: woocommerce-ac.php:1693
|
| 227 |
msgid "Send a test email to:"
|
| 228 |
msgstr ""
|
| 229 |
|
| 230 |
+
#: woocommerce-ac.php:1699
|
| 231 |
msgid "Enter the email id to which the test email needs to be sent."
|
| 232 |
msgstr ""
|
| 233 |
+
|
| 234 |
+
#: woocommerce-ac.php:1835 send_email.php:109
|
| 235 |
+
msgid "Your Shopping Cart"
|
| 236 |
+
msgstr ""
|
| 237 |
+
|
| 238 |
+
#: woocommerce-ac.php:1838 send_email.php:112
|
| 239 |
+
msgid "Item"
|
| 240 |
+
msgstr ""
|
| 241 |
+
|
| 242 |
+
#: woocommerce-ac.php:1839 send_email.php:113
|
| 243 |
+
msgid "Name"
|
| 244 |
+
msgstr ""
|
| 245 |
+
|
| 246 |
+
#: woocommerce-ac.php:1840 send_email.php:114
|
| 247 |
+
msgid "Quantity"
|
| 248 |
+
msgstr ""
|
| 249 |
+
|
| 250 |
+
#: woocommerce-ac.php:1841 send_email.php:115
|
| 251 |
+
msgid "Price"
|
| 252 |
+
msgstr ""
|
| 253 |
+
|
| 254 |
+
#: woocommerce-ac.php:1842 send_email.php:116
|
| 255 |
+
msgid "Line Subtotal"
|
| 256 |
+
msgstr ""
|
| 257 |
+
|
| 258 |
+
#: woocommerce-ac.php:1846
|
| 259 |
+
msgid "Men\\'\\s Formal Shoes"
|
| 260 |
+
msgstr ""
|
| 261 |
+
|
| 262 |
+
#: woocommerce-ac.php:1853
|
| 263 |
+
msgid "Woman\\'\\s Hand Bags"
|
| 264 |
+
msgstr ""
|
| 265 |
+
|
| 266 |
+
#: woocommerce-ac.php:1862 send_email.php:160
|
| 267 |
+
msgid "Cart Total:"
|
| 268 |
+
msgstr ""
|
languages/woocommerce-ac.mo
CHANGED
|
Binary file
|
languages/woocommerce-ac.po
CHANGED
|
@@ -7,8 +7,8 @@ msgid ""
|
|
| 7 |
msgstr ""
|
| 8 |
"Project-Id-Version: woocommerce-ac\n"
|
| 9 |
"Report-Msgid-Bugs-To: \n"
|
| 10 |
-
"POT-Creation-Date: 2015-
|
| 11 |
-
"PO-Revision-Date: 2015-
|
| 12 |
"Last-Translator: \n"
|
| 13 |
"Language-Team: \n"
|
| 14 |
"MIME-Version: 1.0\n"
|
|
@@ -22,198 +22,248 @@ msgstr ""
|
|
| 22 |
msgid "Once Every Five Minutes"
|
| 23 |
msgstr ""
|
| 24 |
|
| 25 |
-
#: woocommerce-ac.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
msgid "Abandoned Carts"
|
| 27 |
msgstr ""
|
| 28 |
|
| 29 |
-
#: woocommerce-ac.php:
|
| 30 |
msgid "Abandoned Orders"
|
| 31 |
msgstr ""
|
| 32 |
|
| 33 |
-
#: woocommerce-ac.php:
|
| 34 |
msgid "Email Templates"
|
| 35 |
msgstr ""
|
| 36 |
|
| 37 |
-
#: woocommerce-ac.php:
|
| 38 |
msgid "Settings"
|
| 39 |
msgstr ""
|
| 40 |
|
| 41 |
-
#: woocommerce-ac.php:
|
| 42 |
msgid "Recovered Orders"
|
| 43 |
msgstr ""
|
| 44 |
|
| 45 |
-
#: woocommerce-ac.php:
|
| 46 |
msgid "You do not have sufficient permissions to access this page."
|
| 47 |
msgstr ""
|
| 48 |
|
| 49 |
-
#: woocommerce-ac.php:
|
| 50 |
msgid "WooCommerce - Abandon Cart Lite"
|
| 51 |
msgstr ""
|
| 52 |
|
| 53 |
-
#: woocommerce-ac.php:
|
| 54 |
msgid "Your settings have been saved."
|
| 55 |
msgstr ""
|
| 56 |
|
| 57 |
-
#: woocommerce-ac.php:
|
| 58 |
msgid "Cart abandoned cut-off time"
|
| 59 |
msgstr ""
|
| 60 |
|
| 61 |
-
#: woocommerce-ac.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
msgid ""
|
| 63 |
"Consider cart abandoned after X minutes of item being added to cart & order "
|
| 64 |
"not placed"
|
| 65 |
msgstr ""
|
| 66 |
|
| 67 |
-
#: woocommerce-ac.php:
|
| 68 |
msgid "Save Changes"
|
| 69 |
msgstr ""
|
| 70 |
|
| 71 |
-
#: woocommerce-ac.php:
|
| 72 |
msgid ""
|
| 73 |
"The list below shows all Abandoned Carts which have remained in cart for a "
|
| 74 |
"time higher than the \"Cart abandoned cut-off time\" setting."
|
| 75 |
msgstr ""
|
| 76 |
|
| 77 |
-
#: woocommerce-ac.php:
|
| 78 |
msgid "Customer"
|
| 79 |
msgstr ""
|
| 80 |
|
| 81 |
-
#: woocommerce-ac.php:
|
| 82 |
msgid "Order Total"
|
| 83 |
msgstr ""
|
| 84 |
|
| 85 |
-
#: woocommerce-ac.php:
|
| 86 |
msgid "Date"
|
| 87 |
msgstr ""
|
| 88 |
|
| 89 |
-
#: woocommerce-ac.php:
|
| 90 |
msgid "Status"
|
| 91 |
msgstr ""
|
| 92 |
|
| 93 |
-
#: woocommerce-ac.php:
|
| 94 |
msgid "Actions"
|
| 95 |
msgstr ""
|
| 96 |
|
| 97 |
-
#: woocommerce-ac.php:
|
| 98 |
msgid ""
|
| 99 |
"Add email templates at different intervals to maximize the possibility of "
|
| 100 |
"recovering your abandoned carts."
|
| 101 |
msgstr ""
|
| 102 |
|
| 103 |
-
#: woocommerce-ac.php:
|
| 104 |
msgid "The Email Template has been successfully added."
|
| 105 |
msgstr ""
|
| 106 |
|
| 107 |
-
#: woocommerce-ac.php:
|
| 108 |
msgid "The Email Template has been successfully updated."
|
| 109 |
msgstr ""
|
| 110 |
|
| 111 |
-
#: woocommerce-ac.php:
|
| 112 |
msgid "Sr"
|
| 113 |
msgstr ""
|
| 114 |
|
| 115 |
-
#: woocommerce-ac.php:
|
| 116 |
msgid "Template Name"
|
| 117 |
msgstr ""
|
| 118 |
|
| 119 |
-
#: woocommerce-ac.php:
|
| 120 |
msgid "Sent"
|
| 121 |
msgstr ""
|
| 122 |
|
| 123 |
-
#: woocommerce-ac.php:
|
| 124 |
msgid "Active ?"
|
| 125 |
msgstr ""
|
| 126 |
|
| 127 |
-
#: woocommerce-ac.php:
|
| 128 |
msgid ""
|
| 129 |
"The Report below shows how many Abandoned Carts we were able to recover for "
|
| 130 |
"you by sending automatic emails to encourage shoppers."
|
| 131 |
msgstr ""
|
| 132 |
|
| 133 |
-
#: woocommerce-ac.php:
|
| 134 |
msgid "Start Date:"
|
| 135 |
msgstr ""
|
| 136 |
|
| 137 |
-
#: woocommerce-ac.php:
|
| 138 |
msgid "End Date:"
|
| 139 |
msgstr ""
|
| 140 |
|
| 141 |
-
#: woocommerce-ac.php:
|
| 142 |
msgid "Go"
|
| 143 |
msgstr ""
|
| 144 |
|
| 145 |
-
#: woocommerce-ac.php:
|
| 146 |
msgid "During the selected range"
|
| 147 |
msgstr ""
|
| 148 |
|
| 149 |
-
#: woocommerce-ac.php:
|
| 150 |
msgid "carts totaling"
|
| 151 |
msgstr ""
|
| 152 |
|
| 153 |
-
#: woocommerce-ac.php:
|
| 154 |
msgid "were abandoned. We were able to recover"
|
| 155 |
msgstr ""
|
| 156 |
|
| 157 |
-
#: woocommerce-ac.php:
|
| 158 |
msgid "of them, which led to an extra"
|
| 159 |
msgstr ""
|
| 160 |
|
| 161 |
-
#: woocommerce-ac.php:
|
| 162 |
msgid "in sales"
|
| 163 |
msgstr ""
|
| 164 |
|
| 165 |
-
#: woocommerce-ac.php:
|
| 166 |
msgid "Created On"
|
| 167 |
msgstr ""
|
| 168 |
|
| 169 |
-
#: woocommerce-ac.php:
|
| 170 |
msgid "Recovered Date"
|
| 171 |
msgstr ""
|
| 172 |
|
| 173 |
-
#: woocommerce-ac.php:
|
| 174 |
msgid "Template Name:"
|
| 175 |
msgstr ""
|
| 176 |
|
| 177 |
-
#: woocommerce-ac.php:
|
| 178 |
msgid "Enter a template name for reference"
|
| 179 |
msgstr ""
|
| 180 |
|
| 181 |
-
#: woocommerce-ac.php:
|
| 182 |
msgid "Send From This Name:"
|
| 183 |
msgstr ""
|
| 184 |
|
| 185 |
-
#: woocommerce-ac.php:
|
| 186 |
msgid "Enter the name that should appear in the email sent"
|
| 187 |
msgstr ""
|
| 188 |
|
| 189 |
-
#: woocommerce-ac.php:
|
| 190 |
msgid "Subject:"
|
| 191 |
msgstr ""
|
| 192 |
|
| 193 |
-
#: woocommerce-ac.php:
|
| 194 |
msgid "Enter the subject that should appear in the email sent"
|
| 195 |
msgstr ""
|
| 196 |
|
| 197 |
-
#: woocommerce-ac.php:
|
| 198 |
msgid "Email Body:"
|
| 199 |
msgstr ""
|
| 200 |
|
| 201 |
-
#: woocommerce-ac.php:
|
| 202 |
msgid "Message to be sent in the reminder email."
|
| 203 |
msgstr ""
|
| 204 |
|
| 205 |
-
#: woocommerce-ac.php:
|
| 206 |
msgid "Send this email:"
|
| 207 |
msgstr ""
|
| 208 |
|
| 209 |
-
#: woocommerce-ac.php:
|
| 210 |
msgid "after cart is abandoned."
|
| 211 |
msgstr ""
|
| 212 |
|
| 213 |
-
#: woocommerce-ac.php:
|
| 214 |
msgid "Send a test email to:"
|
| 215 |
msgstr ""
|
| 216 |
|
| 217 |
-
#: woocommerce-ac.php:
|
| 218 |
msgid "Enter the email id to which the test email needs to be sent."
|
| 219 |
msgstr ""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
msgstr ""
|
| 8 |
"Project-Id-Version: woocommerce-ac\n"
|
| 9 |
"Report-Msgid-Bugs-To: \n"
|
| 10 |
+
"POT-Creation-Date: 2015-07-08 16:30+0530\n"
|
| 11 |
+
"PO-Revision-Date: 2015-07-16 11:02+0530\n"
|
| 12 |
"Last-Translator: \n"
|
| 13 |
"Language-Team: \n"
|
| 14 |
"MIME-Version: 1.0\n"
|
| 22 |
msgid "Once Every Five Minutes"
|
| 23 |
msgstr ""
|
| 24 |
|
| 25 |
+
#: woocommerce-ac.php:204
|
| 26 |
+
#, php-format
|
| 27 |
+
msgid ""
|
| 28 |
+
"You can upgrade to the <a href=\"https://www.tychesoftwares.com/store/"
|
| 29 |
+
"premium-plugins/woocommerce-abandoned-cart-pro/\">PRO version of WooCommerce "
|
| 30 |
+
"Abandoned Cart plugin</a> at a <b>20% discount</b>. Use the coupon code: "
|
| 31 |
+
"<b>ACPRO20</b>.<a href=\"https://www.tychesoftwares.com/store/premium-"
|
| 32 |
+
"plugins/woocommerce-abandoned-cart-pro/\"> Purchase now </a> & save $24!"
|
| 33 |
+
msgstr ""
|
| 34 |
+
|
| 35 |
+
#: woocommerce-ac.php:314
|
| 36 |
msgid "Abandoned Carts"
|
| 37 |
msgstr ""
|
| 38 |
|
| 39 |
+
#: woocommerce-ac.php:516
|
| 40 |
msgid "Abandoned Orders"
|
| 41 |
msgstr ""
|
| 42 |
|
| 43 |
+
#: woocommerce-ac.php:517
|
| 44 |
msgid "Email Templates"
|
| 45 |
msgstr ""
|
| 46 |
|
| 47 |
+
#: woocommerce-ac.php:518 woocommerce-ac.php:712
|
| 48 |
msgid "Settings"
|
| 49 |
msgstr ""
|
| 50 |
|
| 51 |
+
#: woocommerce-ac.php:519
|
| 52 |
msgid "Recovered Orders"
|
| 53 |
msgstr ""
|
| 54 |
|
| 55 |
+
#: woocommerce-ac.php:661
|
| 56 |
msgid "You do not have sufficient permissions to access this page."
|
| 57 |
msgstr ""
|
| 58 |
|
| 59 |
+
#: woocommerce-ac.php:670
|
| 60 |
msgid "WooCommerce - Abandon Cart Lite"
|
| 61 |
msgstr ""
|
| 62 |
|
| 63 |
+
#: woocommerce-ac.php:696
|
| 64 |
msgid "Your settings have been saved."
|
| 65 |
msgstr ""
|
| 66 |
|
| 67 |
+
#: woocommerce-ac.php:718
|
| 68 |
msgid "Cart abandoned cut-off time"
|
| 69 |
msgstr ""
|
| 70 |
|
| 71 |
+
#: woocommerce-ac.php:741
|
| 72 |
+
msgid "minutes"
|
| 73 |
+
msgstr ""
|
| 74 |
+
|
| 75 |
+
#: woocommerce-ac.php:742 woocommerce-ac.php:743
|
| 76 |
msgid ""
|
| 77 |
"Consider cart abandoned after X minutes of item being added to cart & order "
|
| 78 |
"not placed"
|
| 79 |
msgstr ""
|
| 80 |
|
| 81 |
+
#: woocommerce-ac.php:753
|
| 82 |
msgid "Save Changes"
|
| 83 |
msgstr ""
|
| 84 |
|
| 85 |
+
#: woocommerce-ac.php:763
|
| 86 |
msgid ""
|
| 87 |
"The list below shows all Abandoned Carts which have remained in cart for a "
|
| 88 |
"time higher than the \"Cart abandoned cut-off time\" setting."
|
| 89 |
msgstr ""
|
| 90 |
|
| 91 |
+
#: woocommerce-ac.php:858 woocommerce-ac.php:1501
|
| 92 |
msgid "Customer"
|
| 93 |
msgstr ""
|
| 94 |
|
| 95 |
+
#: woocommerce-ac.php:859 woocommerce-ac.php:1514
|
| 96 |
msgid "Order Total"
|
| 97 |
msgstr ""
|
| 98 |
|
| 99 |
+
#: woocommerce-ac.php:862
|
| 100 |
msgid "Date"
|
| 101 |
msgstr ""
|
| 102 |
|
| 103 |
+
#: woocommerce-ac.php:868
|
| 104 |
msgid "Status"
|
| 105 |
msgstr ""
|
| 106 |
|
| 107 |
+
#: woocommerce-ac.php:872 woocommerce-ac.php:1159
|
| 108 |
msgid "Actions"
|
| 109 |
msgstr ""
|
| 110 |
|
| 111 |
+
#: woocommerce-ac.php:953
|
| 112 |
msgid ""
|
| 113 |
"Add email templates at different intervals to maximize the possibility of "
|
| 114 |
"recovering your abandoned carts."
|
| 115 |
msgstr ""
|
| 116 |
|
| 117 |
+
#: woocommerce-ac.php:1054
|
| 118 |
msgid "The Email Template has been successfully added."
|
| 119 |
msgstr ""
|
| 120 |
|
| 121 |
+
#: woocommerce-ac.php:1057
|
| 122 |
msgid "The Email Template has been successfully updated."
|
| 123 |
msgstr ""
|
| 124 |
|
| 125 |
+
#: woocommerce-ac.php:1145
|
| 126 |
msgid "Sr"
|
| 127 |
msgstr ""
|
| 128 |
|
| 129 |
+
#: woocommerce-ac.php:1148
|
| 130 |
msgid "Template Name"
|
| 131 |
msgstr ""
|
| 132 |
|
| 133 |
+
#: woocommerce-ac.php:1154
|
| 134 |
msgid "Sent"
|
| 135 |
msgstr ""
|
| 136 |
|
| 137 |
+
#: woocommerce-ac.php:1158
|
| 138 |
msgid "Active ?"
|
| 139 |
msgstr ""
|
| 140 |
|
| 141 |
+
#: woocommerce-ac.php:1276
|
| 142 |
msgid ""
|
| 143 |
"The Report below shows how many Abandoned Carts we were able to recover for "
|
| 144 |
"you by sending automatic emails to encourage shoppers."
|
| 145 |
msgstr ""
|
| 146 |
|
| 147 |
+
#: woocommerce-ac.php:1331
|
| 148 |
msgid "Start Date:"
|
| 149 |
msgstr ""
|
| 150 |
|
| 151 |
+
#: woocommerce-ac.php:1334
|
| 152 |
msgid "End Date:"
|
| 153 |
msgstr ""
|
| 154 |
|
| 155 |
+
#: woocommerce-ac.php:1337
|
| 156 |
msgid "Go"
|
| 157 |
msgstr ""
|
| 158 |
|
| 159 |
+
#: woocommerce-ac.php:1495
|
| 160 |
msgid "During the selected range"
|
| 161 |
msgstr ""
|
| 162 |
|
| 163 |
+
#: woocommerce-ac.php:1495
|
| 164 |
msgid "carts totaling"
|
| 165 |
msgstr ""
|
| 166 |
|
| 167 |
+
#: woocommerce-ac.php:1495
|
| 168 |
msgid "were abandoned. We were able to recover"
|
| 169 |
msgstr ""
|
| 170 |
|
| 171 |
+
#: woocommerce-ac.php:1495
|
| 172 |
msgid "of them, which led to an extra"
|
| 173 |
msgstr ""
|
| 174 |
|
| 175 |
+
#: woocommerce-ac.php:1495
|
| 176 |
msgid "in sales"
|
| 177 |
msgstr ""
|
| 178 |
|
| 179 |
+
#: woocommerce-ac.php:1504
|
| 180 |
msgid "Created On"
|
| 181 |
msgstr ""
|
| 182 |
|
| 183 |
+
#: woocommerce-ac.php:1510
|
| 184 |
msgid "Recovered Date"
|
| 185 |
msgstr ""
|
| 186 |
|
| 187 |
+
#: woocommerce-ac.php:1561
|
| 188 |
msgid "Template Name:"
|
| 189 |
msgstr ""
|
| 190 |
|
| 191 |
+
#: woocommerce-ac.php:1572
|
| 192 |
msgid "Enter a template name for reference"
|
| 193 |
msgstr ""
|
| 194 |
|
| 195 |
+
#: woocommerce-ac.php:1577
|
| 196 |
msgid "Send From This Name:"
|
| 197 |
msgstr ""
|
| 198 |
|
| 199 |
+
#: woocommerce-ac.php:1588
|
| 200 |
msgid "Enter the name that should appear in the email sent"
|
| 201 |
msgstr ""
|
| 202 |
|
| 203 |
+
#: woocommerce-ac.php:1594
|
| 204 |
msgid "Subject:"
|
| 205 |
msgstr ""
|
| 206 |
|
| 207 |
+
#: woocommerce-ac.php:1605
|
| 208 |
msgid "Enter the subject that should appear in the email sent"
|
| 209 |
msgstr ""
|
| 210 |
|
| 211 |
+
#: woocommerce-ac.php:1611
|
| 212 |
msgid "Email Body:"
|
| 213 |
msgstr ""
|
| 214 |
|
| 215 |
+
#: woocommerce-ac.php:1627
|
| 216 |
msgid "Message to be sent in the reminder email."
|
| 217 |
msgstr ""
|
| 218 |
|
| 219 |
+
#: woocommerce-ac.php:1634
|
| 220 |
msgid "Send this email:"
|
| 221 |
msgstr ""
|
| 222 |
|
| 223 |
+
#: woocommerce-ac.php:1686
|
| 224 |
msgid "after cart is abandoned."
|
| 225 |
msgstr ""
|
| 226 |
|
| 227 |
+
#: woocommerce-ac.php:1693
|
| 228 |
msgid "Send a test email to:"
|
| 229 |
msgstr ""
|
| 230 |
|
| 231 |
+
#: woocommerce-ac.php:1699
|
| 232 |
msgid "Enter the email id to which the test email needs to be sent."
|
| 233 |
msgstr ""
|
| 234 |
+
|
| 235 |
+
#: woocommerce-ac.php:1835 send_email.php:109
|
| 236 |
+
msgid "Your Shopping Cart"
|
| 237 |
+
msgstr ""
|
| 238 |
+
|
| 239 |
+
#: woocommerce-ac.php:1838 send_email.php:112
|
| 240 |
+
msgid "Item"
|
| 241 |
+
msgstr ""
|
| 242 |
+
|
| 243 |
+
#: woocommerce-ac.php:1839 send_email.php:113
|
| 244 |
+
msgid "Name"
|
| 245 |
+
msgstr ""
|
| 246 |
+
|
| 247 |
+
#: woocommerce-ac.php:1840 send_email.php:114
|
| 248 |
+
msgid "Quantity"
|
| 249 |
+
msgstr ""
|
| 250 |
+
|
| 251 |
+
#: woocommerce-ac.php:1841 send_email.php:115
|
| 252 |
+
msgid "Price"
|
| 253 |
+
msgstr ""
|
| 254 |
+
|
| 255 |
+
#: woocommerce-ac.php:1842 send_email.php:116
|
| 256 |
+
msgid "Line Subtotal"
|
| 257 |
+
msgstr ""
|
| 258 |
+
|
| 259 |
+
#: woocommerce-ac.php:1846
|
| 260 |
+
msgid "Men\\'\\s Formal Shoes"
|
| 261 |
+
msgstr ""
|
| 262 |
+
|
| 263 |
+
#: woocommerce-ac.php:1853
|
| 264 |
+
msgid "Woman\\'\\s Hand Bags"
|
| 265 |
+
msgstr ""
|
| 266 |
+
|
| 267 |
+
#: woocommerce-ac.php:1862 send_email.php:160
|
| 268 |
+
msgid "Cart Total:"
|
| 269 |
+
msgstr ""
|
readme.txt
CHANGED
|
@@ -1,8 +1,8 @@
|
|
| 1 |
=== Woocommerce Abandoned Cart Lite ===
|
| 2 |
-
Contributors: ashokrane
|
| 3 |
Tags: abandon cart, shopping cart abandonment
|
| 4 |
Requires at least: 1.3
|
| 5 |
-
Tested up to: 4.
|
| 6 |
Stable tag: trunk
|
| 7 |
License: GPLv2 or later
|
| 8 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
|
@@ -41,7 +41,7 @@ Note: Some features are available in the PRO version only.
|
|
| 41 |
|
| 42 |
**Pro Version:**
|
| 43 |
|
| 44 |
-
**[WooCommerce Abandoned Cart Pro
|
| 45 |
|
| 46 |
|
| 47 |
**Email Sending Setup:**
|
|
@@ -80,17 +80,6 @@ Please ensure you have followed the instructions in "Email Sending Setup" right
|
|
| 80 |
|
| 81 |
== Changelog ==
|
| 82 |
|
| 83 |
-
= 1.6 =
|
| 84 |
-
* We have included .po, .pot and .mo files in the plugin. The plugin strings can now be translated to any language using these files.
|
| 85 |
-
|
| 86 |
-
= 1.5 =
|
| 87 |
-
* A shortcode {{products.cart}} can now be added in the abandoned cart notification emails. It will add the product information in the email like Product image, Product name, Quantity, Price & Total. The shortcode needs to be added from the AC menu from the template editor.
|
| 88 |
-
* The default value of the field "Cart abandoned cut-off time" in Settings tab was blank when the plugin is installed. This is now set to 60 minutes upon plugin activation.
|
| 89 |
-
|
| 90 |
-
= 1.4 =
|
| 91 |
-
* The abandoned cart emails were being sent multiple times for a single email template due to a bug. This is fixed.
|
| 92 |
-
* The plugin will now work on WordPress Multisite too.
|
| 93 |
-
|
| 94 |
= 1.3 =
|
| 95 |
* The abandoned cart email notifications are now sent out automatically without the necessity of having to set up a cron job manually.
|
| 96 |
|
| 1 |
=== Woocommerce Abandoned Cart Lite ===
|
| 2 |
+
Contributors: ashokrane
|
| 3 |
Tags: abandon cart, shopping cart abandonment
|
| 4 |
Requires at least: 1.3
|
| 5 |
+
Tested up to: 4.1.1
|
| 6 |
Stable tag: trunk
|
| 7 |
License: GPLv2 or later
|
| 8 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 41 |
|
| 42 |
**Pro Version:**
|
| 43 |
|
| 44 |
+
**[WooCommerce Abandoned Cart Pro 1.0](http://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro "WooCommerce Abandoned Cart Pro")** - The PRO version allows you to track products in abandoned carts, create unlimited email templates, track coupons, keep a track of sent emails & much more.
|
| 45 |
|
| 46 |
|
| 47 |
**Email Sending Setup:**
|
| 80 |
|
| 81 |
== Changelog ==
|
| 82 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 83 |
= 1.3 =
|
| 84 |
* The abandoned cart email notifications are now sent out automatically without the necessity of having to set up a cron job manually.
|
| 85 |
|
woo-includes/class-wc-dependencies.php
CHANGED
|
@@ -1,29 +1,29 @@
|
|
| 1 |
-
<?php
|
| 2 |
-
/**
|
| 3 |
-
* WC Dependency Checker
|
| 4 |
-
*
|
| 5 |
-
* Checks if WooCommerce is enabled
|
| 6 |
-
*/
|
| 7 |
-
class WC_Dependencies {
|
| 8 |
-
|
| 9 |
-
private static $active_plugins;
|
| 10 |
-
|
| 11 |
-
function init() {
|
| 12 |
-
|
| 13 |
-
self::$active_plugins = (array) get_option( 'active_plugins', array() );
|
| 14 |
-
|
| 15 |
-
if ( is_multisite() )
|
| 16 |
-
self::$active_plugins = array_merge( self::$active_plugins, get_site_option( 'active_sitewide_plugins', array() ) );
|
| 17 |
-
}
|
| 18 |
-
|
| 19 |
-
function woocommerce_active_check() {
|
| 20 |
-
|
| 21 |
-
if ( ! self::$active_plugins ) self::init();
|
| 22 |
-
|
| 23 |
-
return in_array( 'woocommerce/woocommerce.php', self::$active_plugins ) || array_key_exists( 'woocommerce/woocommerce.php', self::$active_plugins );
|
| 24 |
-
|
| 25 |
-
}
|
| 26 |
-
|
| 27 |
-
}
|
| 28 |
-
|
| 29 |
-
|
| 1 |
+
<?php
|
| 2 |
+
/**
|
| 3 |
+
* WC Dependency Checker
|
| 4 |
+
*
|
| 5 |
+
* Checks if WooCommerce is enabled
|
| 6 |
+
*/
|
| 7 |
+
class WC_Dependencies {
|
| 8 |
+
|
| 9 |
+
private static $active_plugins;
|
| 10 |
+
|
| 11 |
+
function init() {
|
| 12 |
+
|
| 13 |
+
self::$active_plugins = (array) get_option( 'active_plugins', array() );
|
| 14 |
+
|
| 15 |
+
if ( is_multisite() )
|
| 16 |
+
self::$active_plugins = array_merge( self::$active_plugins, get_site_option( 'active_sitewide_plugins', array() ) );
|
| 17 |
+
}
|
| 18 |
+
|
| 19 |
+
function woocommerce_active_check() {
|
| 20 |
+
|
| 21 |
+
if ( ! self::$active_plugins ) self::init();
|
| 22 |
+
|
| 23 |
+
return in_array( 'woocommerce/woocommerce.php', self::$active_plugins ) || array_key_exists( 'woocommerce/woocommerce.php', self::$active_plugins );
|
| 24 |
+
|
| 25 |
+
}
|
| 26 |
+
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
|
woo-includes/woo-functions.php
CHANGED
|
@@ -1,97 +1,97 @@
|
|
| 1 |
-
<?php
|
| 2 |
-
/**
|
| 3 |
-
* Functions used by plugins
|
| 4 |
-
*/
|
| 5 |
-
if ( ! class_exists( 'WC_Dependencies' ) )
|
| 6 |
-
require_once 'class-wc-dependencies.php';
|
| 7 |
-
|
| 8 |
-
/**
|
| 9 |
-
* WC Detection
|
| 10 |
-
*/
|
| 11 |
-
if ( ! function_exists( 'is_woocommerce_active' ) ) {
|
| 12 |
-
function is_woocommerce_active() {
|
| 13 |
-
return WC_Dependencies::woocommerce_active_check();
|
| 14 |
-
}
|
| 15 |
-
}
|
| 16 |
-
|
| 17 |
-
/**
|
| 18 |
-
* Queue updates for the WooUpdater
|
| 19 |
-
*/
|
| 20 |
-
if ( ! function_exists( 'woothemes_queue_update' ) ) {
|
| 21 |
-
function woothemes_queue_update( $file, $file_id, $product_id ) {
|
| 22 |
-
global $woothemes_queued_updates;
|
| 23 |
-
|
| 24 |
-
if ( ! isset( $woothemes_queued_updates ) )
|
| 25 |
-
$woothemes_queued_updates = array();
|
| 26 |
-
|
| 27 |
-
$plugin = new stdClass();
|
| 28 |
-
$plugin->file = $file;
|
| 29 |
-
$plugin->file_id = $file_id;
|
| 30 |
-
$plugin->product_id = $product_id;
|
| 31 |
-
|
| 32 |
-
$woothemes_queued_updates[] = $plugin;
|
| 33 |
-
}
|
| 34 |
-
}
|
| 35 |
-
|
| 36 |
-
/**
|
| 37 |
-
* Load installer for the WooThemes Updater.
|
| 38 |
-
* @return $api Object
|
| 39 |
-
*/
|
| 40 |
-
if ( ! class_exists( 'WooThemes_Updater' ) && ! function_exists( 'woothemes_updater_install' ) ) {
|
| 41 |
-
function woothemes_updater_install( $api, $action, $args ) {
|
| 42 |
-
$download_url = 'http://woodojo.s3.amazonaws.com/downloads/woothemes-updater/woothemes-updater.zip';
|
| 43 |
-
|
| 44 |
-
if ( 'plugin_information' != $action ||
|
| 45 |
-
false !== $api ||
|
| 46 |
-
! isset( $args->slug ) ||
|
| 47 |
-
'woothemes-updater' != $args->slug
|
| 48 |
-
) return $api;
|
| 49 |
-
|
| 50 |
-
$api = new stdClass();
|
| 51 |
-
$api->name = 'WooThemes Updater';
|
| 52 |
-
$api->version = '1.0.0';
|
| 53 |
-
$api->download_link = esc_url( $download_url );
|
| 54 |
-
return $api;
|
| 55 |
-
}
|
| 56 |
-
|
| 57 |
-
add_filter( 'plugins_api', 'woothemes_updater_install', 10, 3 );
|
| 58 |
-
}
|
| 59 |
-
|
| 60 |
-
/**
|
| 61 |
-
* WooUpdater Installation Prompts
|
| 62 |
-
*/
|
| 63 |
-
if ( ! class_exists( 'WooThemes_Updater' ) && ! function_exists( 'woothemes_updater_notice' ) ) {
|
| 64 |
-
|
| 65 |
-
/**
|
| 66 |
-
* Display a notice if the "WooThemes Updater" plugin hasn't been installed.
|
| 67 |
-
* @return void
|
| 68 |
-
*/
|
| 69 |
-
function woothemes_updater_notice() {
|
| 70 |
-
$active_plugins = apply_filters( 'active_plugins', get_option('active_plugins' ) );
|
| 71 |
-
if ( in_array( 'woothemes-updater/woothemes-updater.php', $active_plugins ) ) return;
|
| 72 |
-
|
| 73 |
-
$slug = 'woothemes-updater';
|
| 74 |
-
$install_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $slug ), 'install-plugin_' . $slug );
|
| 75 |
-
$activate_url = 'plugins.php?action=activate&plugin=' . urlencode( 'woothemes-updater/woothemes-updater.php' ) . '&plugin_status=all&paged=1&s&_wpnonce=' . urlencode( wp_create_nonce( 'activate-plugin_woothemes-updater/woothemes-updater.php' ) );
|
| 76 |
-
|
| 77 |
-
$message = '<a href="' . esc_url( $install_url ) . '">Install the WooThemes Updater plugin</a> to get updates for your WooThemes plugins.';
|
| 78 |
-
$is_downloaded = false;
|
| 79 |
-
$plugins = array_keys( get_plugins() );
|
| 80 |
-
foreach ( $plugins as $plugin ) {
|
| 81 |
-
if ( strpos( $plugin, 'woothemes-updater.php' ) !== false ) {
|
| 82 |
-
$is_downloaded = true;
|
| 83 |
-
$message = '<a href="' . esc_url( admin_url( $activate_url ) ) . '">Activate the WooThemes Updater plugin</a> to get updates for your WooThemes plugins.';
|
| 84 |
-
}
|
| 85 |
-
}
|
| 86 |
-
echo '<div class="updated fade"><p>' . $message . '</p></div>' . "\n";
|
| 87 |
-
}
|
| 88 |
-
|
| 89 |
-
add_action( 'admin_notices', 'woothemes_updater_notice' );
|
| 90 |
-
}
|
| 91 |
-
|
| 92 |
-
/**
|
| 93 |
-
* Prevent conflicts with older versions
|
| 94 |
-
*/
|
| 95 |
-
if ( ! class_exists( 'WooThemes_Plugin_Updater' ) ) {
|
| 96 |
-
class WooThemes_Plugin_Updater { function init() {} }
|
| 97 |
}
|
| 1 |
+
<?php
|
| 2 |
+
/**
|
| 3 |
+
* Functions used by plugins
|
| 4 |
+
*/
|
| 5 |
+
if ( ! class_exists( 'WC_Dependencies' ) )
|
| 6 |
+
require_once 'class-wc-dependencies.php';
|
| 7 |
+
|
| 8 |
+
/**
|
| 9 |
+
* WC Detection
|
| 10 |
+
*/
|
| 11 |
+
if ( ! function_exists( 'is_woocommerce_active' ) ) {
|
| 12 |
+
function is_woocommerce_active() {
|
| 13 |
+
return WC_Dependencies::woocommerce_active_check();
|
| 14 |
+
}
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
/**
|
| 18 |
+
* Queue updates for the WooUpdater
|
| 19 |
+
*/
|
| 20 |
+
if ( ! function_exists( 'woothemes_queue_update' ) ) {
|
| 21 |
+
function woothemes_queue_update( $file, $file_id, $product_id ) {
|
| 22 |
+
global $woothemes_queued_updates;
|
| 23 |
+
|
| 24 |
+
if ( ! isset( $woothemes_queued_updates ) )
|
| 25 |
+
$woothemes_queued_updates = array();
|
| 26 |
+
|
| 27 |
+
$plugin = new stdClass();
|
| 28 |
+
$plugin->file = $file;
|
| 29 |
+
$plugin->file_id = $file_id;
|
| 30 |
+
$plugin->product_id = $product_id;
|
| 31 |
+
|
| 32 |
+
$woothemes_queued_updates[] = $plugin;
|
| 33 |
+
}
|
| 34 |
+
}
|
| 35 |
+
|
| 36 |
+
/**
|
| 37 |
+
* Load installer for the WooThemes Updater.
|
| 38 |
+
* @return $api Object
|
| 39 |
+
*/
|
| 40 |
+
if ( ! class_exists( 'WooThemes_Updater' ) && ! function_exists( 'woothemes_updater_install' ) ) {
|
| 41 |
+
function woothemes_updater_install( $api, $action, $args ) {
|
| 42 |
+
$download_url = 'http://woodojo.s3.amazonaws.com/downloads/woothemes-updater/woothemes-updater.zip';
|
| 43 |
+
|
| 44 |
+
if ( 'plugin_information' != $action ||
|
| 45 |
+
false !== $api ||
|
| 46 |
+
! isset( $args->slug ) ||
|
| 47 |
+
'woothemes-updater' != $args->slug
|
| 48 |
+
) return $api;
|
| 49 |
+
|
| 50 |
+
$api = new stdClass();
|
| 51 |
+
$api->name = 'WooThemes Updater';
|
| 52 |
+
$api->version = '1.0.0';
|
| 53 |
+
$api->download_link = esc_url( $download_url );
|
| 54 |
+
return $api;
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
add_filter( 'plugins_api', 'woothemes_updater_install', 10, 3 );
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
/**
|
| 61 |
+
* WooUpdater Installation Prompts
|
| 62 |
+
*/
|
| 63 |
+
if ( ! class_exists( 'WooThemes_Updater' ) && ! function_exists( 'woothemes_updater_notice' ) ) {
|
| 64 |
+
|
| 65 |
+
/**
|
| 66 |
+
* Display a notice if the "WooThemes Updater" plugin hasn't been installed.
|
| 67 |
+
* @return void
|
| 68 |
+
*/
|
| 69 |
+
function woothemes_updater_notice() {
|
| 70 |
+
$active_plugins = apply_filters( 'active_plugins', get_option('active_plugins' ) );
|
| 71 |
+
if ( in_array( 'woothemes-updater/woothemes-updater.php', $active_plugins ) ) return;
|
| 72 |
+
|
| 73 |
+
$slug = 'woothemes-updater';
|
| 74 |
+
$install_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=' . $slug ), 'install-plugin_' . $slug );
|
| 75 |
+
$activate_url = 'plugins.php?action=activate&plugin=' . urlencode( 'woothemes-updater/woothemes-updater.php' ) . '&plugin_status=all&paged=1&s&_wpnonce=' . urlencode( wp_create_nonce( 'activate-plugin_woothemes-updater/woothemes-updater.php' ) );
|
| 76 |
+
|
| 77 |
+
$message = '<a href="' . esc_url( $install_url ) . '">Install the WooThemes Updater plugin</a> to get updates for your WooThemes plugins.';
|
| 78 |
+
$is_downloaded = false;
|
| 79 |
+
$plugins = array_keys( get_plugins() );
|
| 80 |
+
foreach ( $plugins as $plugin ) {
|
| 81 |
+
if ( strpos( $plugin, 'woothemes-updater.php' ) !== false ) {
|
| 82 |
+
$is_downloaded = true;
|
| 83 |
+
$message = '<a href="' . esc_url( admin_url( $activate_url ) ) . '">Activate the WooThemes Updater plugin</a> to get updates for your WooThemes plugins.';
|
| 84 |
+
}
|
| 85 |
+
}
|
| 86 |
+
echo '<div class="updated fade"><p>' . $message . '</p></div>' . "\n";
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
add_action( 'admin_notices', 'woothemes_updater_notice' );
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
/**
|
| 93 |
+
* Prevent conflicts with older versions
|
| 94 |
+
*/
|
| 95 |
+
if ( ! class_exists( 'WooThemes_Plugin_Updater' ) ) {
|
| 96 |
+
class WooThemes_Plugin_Updater { function init() {} }
|
| 97 |
}
|
woocommerce-ac.php
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
Plugin Name: WooCommerce Abandon Cart Lite Plugin
|
| 4 |
Plugin URI: http://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro
|
| 5 |
Description: This plugin captures abandoned carts by logged-in users & emails them about it. <strong><a href="http://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro">Click here to get the PRO Version.</a></strong>
|
| 6 |
-
Version: 1.
|
| 7 |
Author: Tyche Softwares
|
| 8 |
Author URI: http://www.tychesoftwares.com/
|
| 9 |
*/
|
|
@@ -38,23 +38,44 @@ function woocommerce_ac_send_email_cron() {
|
|
| 38 |
function woocommerce_ac_delete(){
|
| 39 |
|
| 40 |
global $wpdb;
|
| 41 |
-
$table_name_ac_abandoned_cart_history = $wpdb->
|
| 42 |
$sql_ac_abandoned_cart_history = "DROP TABLE " . $table_name_ac_abandoned_cart_history ;
|
| 43 |
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 44 |
$wpdb->get_results($sql_ac_abandoned_cart_history);
|
| 45 |
|
| 46 |
-
$table_name_ac_email_templates = $wpdb->
|
| 47 |
$sql_ac_email_templates = "DROP TABLE " . $table_name_ac_email_templates ;
|
| 48 |
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 49 |
$wpdb->get_results($sql_ac_email_templates);
|
| 50 |
|
| 51 |
-
$table_name_ac_sent_history = $wpdb->
|
| 52 |
$sql_ac_sent_history = "DROP TABLE " . $table_name_ac_sent_history ;
|
| 53 |
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 54 |
$wpdb->get_results($sql_ac_sent_history);
|
| 55 |
|
| 56 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
|
|
|
|
| 58 |
delete_option ( 'woocommerce_ac_settings' );
|
| 59 |
|
| 60 |
}
|
|
@@ -165,33 +186,38 @@ function woocommerce_ac_delete(){
|
|
| 165 |
|
| 166 |
// Language Translation
|
| 167 |
function update_po_file(){
|
| 168 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
}
|
| 177 |
-
|
| 178 |
-
function ac_lite_coupon_notice() {
|
| 179 |
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 189 |
|
| 190 |
function woocommerce_ac_activate() {
|
| 191 |
|
| 192 |
global $wpdb;
|
| 193 |
|
| 194 |
-
$table_name = $wpdb->
|
| 195 |
|
| 196 |
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
|
| 197 |
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
@@ -208,7 +234,7 @@ function woocommerce_ac_delete(){
|
|
| 208 |
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 209 |
dbDelta($sql);
|
| 210 |
|
| 211 |
-
$sent_table_name = $wpdb->
|
| 212 |
|
| 213 |
$sql_query = "CREATE TABLE IF NOT EXISTS $sent_table_name (
|
| 214 |
`id` int(11) NOT NULL auto_increment,
|
|
@@ -222,7 +248,7 @@ function woocommerce_ac_delete(){
|
|
| 222 |
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 223 |
dbDelta($sql_query);
|
| 224 |
|
| 225 |
-
$ac_history_table_name = $wpdb->
|
| 226 |
|
| 227 |
$history_query = "CREATE TABLE IF NOT EXISTS $ac_history_table_name (
|
| 228 |
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
@@ -246,10 +272,15 @@ function woocommerce_ac_delete(){
|
|
| 246 |
|
| 247 |
function ac_lite_update_db_check() {
|
| 248 |
global $wpdb;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 249 |
if( get_option('ac_lite_alter_table_queries') != 'yes') {
|
| 250 |
if( $wpdb->get_var("SHOW TABLES LIKE '" . $wpdb->prefix . "ac_email_templates'") === $wpdb->prefix . 'ac_email_templates') {
|
| 251 |
-
$old_table_name = $wpdb->
|
| 252 |
-
$table_name = $wpdb->
|
| 253 |
|
| 254 |
$alter_ac_email_table_query = "ALTER TABLE $old_table_name
|
| 255 |
RENAME TO $table_name";
|
|
@@ -258,16 +289,16 @@ function woocommerce_ac_delete(){
|
|
| 258 |
}
|
| 259 |
|
| 260 |
if($wpdb->get_var("SHOW TABLES LIKE '" . $wpdb->prefix . "ac_sent_history'") === $wpdb->prefix . 'ac_sent_history') {
|
| 261 |
-
$old_sent_table_name = $wpdb->
|
| 262 |
-
$sent_table_name = $wpdb->
|
| 263 |
$alter_ac_sent_history_table_query = "ALTER TABLE $old_sent_table_name
|
| 264 |
RENAME TO $sent_table_name";
|
| 265 |
$wpdb->get_results ( $alter_ac_sent_history_table_query );
|
| 266 |
}
|
| 267 |
|
| 268 |
if( $wpdb->get_var("SHOW TABLES LIKE '" . $wpdb->prefix . "ac_abandoned_cart_history'") === $wpdb->prefix . 'ac_abandoned_cart_history') {
|
| 269 |
-
$old_ac_history_table_name = $wpdb->
|
| 270 |
-
$ac_history_table_name = $wpdb->
|
| 271 |
|
| 272 |
$alter_ac_abandoned_cart_history_table_query = "ALTER TABLE $old_ac_history_table_name
|
| 273 |
RENAME TO $ac_history_table_name";
|
|
@@ -299,7 +330,7 @@ function woocommerce_ac_delete(){
|
|
| 299 |
}
|
| 300 |
|
| 301 |
$compare_time = $current_time - $cart_cut_off_time;
|
| 302 |
-
$query = "SELECT * FROM `".$wpdb->
|
| 303 |
WHERE user_id = '".$user_id."'
|
| 304 |
AND cart_ignored = '0'
|
| 305 |
AND recovered_cart = '0'";
|
|
@@ -307,27 +338,24 @@ function woocommerce_ac_delete(){
|
|
| 307 |
if ( count($results) == 0 )
|
| 308 |
{
|
| 309 |
$cart_info = json_encode(get_user_meta($user_id, '_woocommerce_persistent_cart', true));
|
| 310 |
-
$insert_query = "INSERT INTO `".$wpdb->
|
| 311 |
(user_id, abandoned_cart_info, abandoned_cart_time, cart_ignored)
|
| 312 |
VALUES ('".$user_id."', '".$cart_info."', '".$current_time."', '0')";
|
| 313 |
-
|
| 314 |
-
$wpdb->query($insert_query);
|
| 315 |
}
|
| 316 |
-
elseif ( $compare_time > $results[0]->abandoned_cart_time )
|
| 317 |
{
|
| 318 |
$updated_cart_info = json_encode(get_user_meta($user_id, '_woocommerce_persistent_cart', true));
|
| 319 |
if (! $this->compare_carts( $user_id, $results[0]->abandoned_cart_info) )
|
| 320 |
{
|
| 321 |
-
$query_ignored = "UPDATE `".$wpdb->
|
| 322 |
SET cart_ignored = '1'
|
| 323 |
WHERE user_id='".$user_id."'";
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
$query_update = "INSERT INTO `".$wpdb->base_prefix."ac_abandoned_cart_history_lite`
|
| 327 |
(user_id, abandoned_cart_info, abandoned_cart_time, cart_ignored)
|
| 328 |
VALUES ('".$user_id."', '".$updated_cart_info."', '".$current_time."', '0')";
|
| 329 |
-
|
| 330 |
-
$wpdb->query($query_update);
|
| 331 |
update_user_meta($user_id, '_woocommerce_ac_modified_cart', md5("yes"));
|
| 332 |
}
|
| 333 |
else
|
|
@@ -338,12 +366,11 @@ function woocommerce_ac_delete(){
|
|
| 338 |
else
|
| 339 |
{
|
| 340 |
$updated_cart_info = json_encode(get_user_meta($user_id, '_woocommerce_persistent_cart', true));
|
| 341 |
-
$query_update = "UPDATE `".$wpdb->
|
| 342 |
SET abandoned_cart_info = '".$updated_cart_info."',
|
| 343 |
abandoned_cart_time = '".$current_time."'
|
| 344 |
WHERE user_id='".$user_id."' AND cart_ignored='0' ";
|
| 345 |
-
|
| 346 |
-
$wpdb->query($query_update);
|
| 347 |
}
|
| 348 |
}
|
| 349 |
}
|
|
@@ -398,38 +425,35 @@ function woocommerce_ac_delete(){
|
|
| 398 |
delete_user_meta($user_id, '_woocommerce_ac_persistent_cart_temp_time');
|
| 399 |
|
| 400 |
// get all latest abandoned carts that were modified
|
| 401 |
-
$query = "SELECT * FROM `".$wpdb->
|
| 402 |
WHERE user_id = '".$user_id."'
|
| 403 |
AND cart_ignored = '0'
|
| 404 |
AND recovered_cart = '0'
|
| 405 |
ORDER BY id DESC
|
| 406 |
LIMIT 1";
|
| 407 |
$results = $wpdb->get_results( $query );
|
| 408 |
-
|
| 409 |
-
|
| 410 |
get_user_meta($user_id, '_woocommerce_ac_modified_cart', true) == md5("no") )
|
| 411 |
-
|
| 412 |
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
-
|
| 418 |
-
|
| 419 |
-
|
| 420 |
-
|
| 421 |
-
|
| 422 |
-
|
| 423 |
-
|
| 424 |
-
|
| 425 |
-
|
| 426 |
-
|
| 427 |
-
|
| 428 |
-
|
| 429 |
-
|
| 430 |
-
|
| 431 |
-
|
| 432 |
-
}
|
| 433 |
|
| 434 |
function action_admin_init() {
|
| 435 |
// only hook up these filters if we're in the admin panel, and the current user has permission
|
|
@@ -700,7 +724,7 @@ function woocommerce_ac_delete(){
|
|
| 700 |
|
| 701 |
if ( count($enable_email_sett_arr) > 0 ) {
|
| 702 |
|
| 703 |
-
if ( $enable_email_sett_arr[0]->cart_time != '' || $enable_email_sett_arr[0]->cart_time != 'null'){
|
| 704 |
|
| 705 |
$cart_time = $enable_email_sett_arr[0]->cart_time;
|
| 706 |
} else {
|
|
@@ -713,11 +737,10 @@ function woocommerce_ac_delete(){
|
|
| 713 |
$cart_time = 60;
|
| 714 |
}
|
| 715 |
|
| 716 |
-
|
| 717 |
<input type="text" name="cart_abandonment_time" id="cart_abandonment_time" size="5" value="<?php echo $cart_time; ?> "> <?php _e( 'minutes', 'woocommerce-ac' );?>
|
| 718 |
<img class="help_tip" width="16" height="16" data-tip='<?php _e( 'Consider cart abandoned after X minutes of item being added to cart & order not placed', 'woocommerce-ac') ?>' src="<?php echo plugins_url(); ?>/woocommerce/assets/images/help.png" /></p>
|
| 719 |
<!-- <span class="description"><?php _e( 'Consider cart abandoned after X minutes of item being added to cart & order not placed', 'woocommerce-ac' );
|
| 720 |
-
|
| 721 |
?></span> -->
|
| 722 |
</td>
|
| 723 |
</tr>
|
|
@@ -745,7 +768,7 @@ function woocommerce_ac_delete(){
|
|
| 745 |
|
| 746 |
/* Find the number of rows returned from a query; Note: Do NOT use a LIMIT clause in this query */
|
| 747 |
$wpdb->get_results("SELECT wpac . * , wpu.user_login, wpu.user_email
|
| 748 |
-
FROM `".$wpdb->
|
| 749 |
LEFT JOIN ".$wpdb->base_prefix."users AS wpu ON wpac.user_id = wpu.id
|
| 750 |
WHERE recovered_cart='0' ");
|
| 751 |
|
|
@@ -756,11 +779,10 @@ function woocommerce_ac_delete(){
|
|
| 756 |
$p->items($count);
|
| 757 |
$p->limit(10); // Limit entries per page
|
| 758 |
$p->target("admin.php?page=woocommerce_ac_page&action=listcart");
|
| 759 |
-
|
| 760 |
-
|
| 761 |
-
|
| 762 |
-
|
| 763 |
-
}
|
| 764 |
$p->calculate(); // Calculates what to show
|
| 765 |
$p->parameterName('paging');
|
| 766 |
$p->adjacents(1); //No. of page away from the current page
|
|
@@ -776,7 +798,7 @@ function woocommerce_ac_delete(){
|
|
| 776 |
$limit = "LIMIT " . ($p->page - 1) * $p->limit . ", " . $p->limit;
|
| 777 |
|
| 778 |
}
|
| 779 |
-
|
| 780 |
|
| 781 |
?>
|
| 782 |
|
|
@@ -816,18 +838,13 @@ function woocommerce_ac_delete(){
|
|
| 816 |
}
|
| 817 |
/* Now we use the LIMIT clause to grab a range of rows */
|
| 818 |
$query = "SELECT wpac . * , wpu.user_login, wpu.user_email
|
| 819 |
-
FROM `".$wpdb->
|
| 820 |
LEFT JOIN ".$wpdb->base_prefix."users AS wpu ON wpac.user_id = wpu.id
|
| 821 |
WHERE recovered_cart='0'
|
| 822 |
ORDER BY `$order_by` $order
|
| 823 |
$limit";
|
| 824 |
//echo $query;
|
| 825 |
-
$results = $wpdb->get_results( $query );
|
| 826 |
-
|
| 827 |
-
/* echo "<pre>";
|
| 828 |
-
print_r($results);
|
| 829 |
-
echo "</pre>"; */
|
| 830 |
-
//exit;
|
| 831 |
|
| 832 |
/* From here you can do whatever you want with the data from the $result link. */
|
| 833 |
|
|
@@ -944,12 +961,12 @@ function woocommerce_ac_delete(){
|
|
| 944 |
$active_post = 1;
|
| 945 |
if ( $active_post == 1 )
|
| 946 |
{
|
| 947 |
-
$check_query = "SELECT * FROM `".$wpdb->
|
| 948 |
WHERE is_active='1' AND frequency='".$_POST['email_frequency']."' AND day_or_hour='".$_POST['day_or_hour']."' ";
|
| 949 |
$check_results = $wpdb->get_results($check_query);
|
| 950 |
if (count($check_results) == 0 )
|
| 951 |
{
|
| 952 |
-
$query = "INSERT INTO `".$wpdb->
|
| 953 |
(subject, body, is_active, frequency, day_or_hour, template_name, from_name)
|
| 954 |
VALUES ('".$_POST['woocommerce_ac_email_subject']."',
|
| 955 |
'".$_POST['woocommerce_ac_email_body']."',
|
|
@@ -958,21 +975,17 @@ function woocommerce_ac_delete(){
|
|
| 958 |
'".$_POST['day_or_hour']."',
|
| 959 |
'".$_POST['woocommerce_ac_template_name']."',
|
| 960 |
'".$_POST['woocommerce_ac_from_name']."' )";
|
| 961 |
-
|
| 962 |
-
//mysql_query($query);
|
| 963 |
-
$wpdb->query($query);
|
| 964 |
}
|
| 965 |
else
|
| 966 |
{
|
| 967 |
-
$query_update = "UPDATE `".$wpdb->
|
| 968 |
SET
|
| 969 |
is_active='0'
|
| 970 |
WHERE frequency='".$_POST['email_frequency']."' AND day_or_hour='".$_POST['day_or_hour']."' ";
|
| 971 |
-
|
| 972 |
-
//mysql_query($query_update);
|
| 973 |
-
$wpdb->query($query_update);
|
| 974 |
|
| 975 |
-
$query_insert_new = "INSERT INTO `".$wpdb->
|
| 976 |
( subject, body, is_active, frequency, day_or_hour, template_name, from_name)
|
| 977 |
VALUES ('".$_POST['woocommerce_ac_email_subject']."',
|
| 978 |
'".$_POST['woocommerce_ac_email_body']."',
|
|
@@ -981,9 +994,7 @@ function woocommerce_ac_delete(){
|
|
| 981 |
'".$_POST['day_or_hour']."',
|
| 982 |
'".$_POST['woocommerce_ac_template_name']."',
|
| 983 |
'".$_POST['woocommerce_ac_from_name']."' )";
|
| 984 |
-
|
| 985 |
-
//mysql_query($query_insert_new);
|
| 986 |
-
$wpdb->query($query_insert_new);
|
| 987 |
}
|
| 988 |
}
|
| 989 |
}
|
|
@@ -994,12 +1005,12 @@ function woocommerce_ac_delete(){
|
|
| 994 |
$active = 1;
|
| 995 |
if ( $active == 1 )
|
| 996 |
{
|
| 997 |
-
$check_query = "SELECT * FROM `".$wpdb->
|
| 998 |
WHERE is_active='1' AND frequency='".$_POST['email_frequency']."' AND day_or_hour='".$_POST['day_or_hour']."' ";
|
| 999 |
$check_results = $wpdb->get_results($check_query);
|
| 1000 |
if (count($check_results) == 0 )
|
| 1001 |
{
|
| 1002 |
-
$query_update = "UPDATE `".$wpdb->
|
| 1003 |
SET
|
| 1004 |
subject='".$_POST['woocommerce_ac_email_subject']."',
|
| 1005 |
body='".$_POST['woocommerce_ac_email_body']."',
|
|
@@ -1008,19 +1019,17 @@ function woocommerce_ac_delete(){
|
|
| 1008 |
template_name='".$_POST['woocommerce_ac_template_name']."',
|
| 1009 |
from_name='".$_POST['woocommerce_ac_from_name']."'
|
| 1010 |
WHERE id='".$_POST['id']."' ";
|
| 1011 |
-
|
| 1012 |
-
$wpdb->query($query_update);
|
| 1013 |
}
|
| 1014 |
else
|
| 1015 |
{
|
| 1016 |
-
$query_update_new = "UPDATE `".$wpdb->
|
| 1017 |
SET
|
| 1018 |
is_active='0'
|
| 1019 |
WHERE frequency='".$_POST['email_frequency']."' AND day_or_hour='".$_POST['day_or_hour']."' ";
|
| 1020 |
-
|
| 1021 |
-
$wpdb->query($query_update_new);
|
| 1022 |
|
| 1023 |
-
$query_update_latest = "UPDATE `".$wpdb->
|
| 1024 |
SET
|
| 1025 |
subject='".$_POST['woocommerce_ac_email_subject']."',
|
| 1026 |
body='".$_POST['woocommerce_ac_email_body']."',
|
|
@@ -1029,8 +1038,7 @@ function woocommerce_ac_delete(){
|
|
| 1029 |
template_name='".$_POST['woocommerce_ac_template_name']."',
|
| 1030 |
from_name='".$_POST['woocommerce_ac_from_name']."'
|
| 1031 |
WHERE id='".$_POST['id']."' ";
|
| 1032 |
-
|
| 1033 |
-
$wpdb->query($query_update_latest);
|
| 1034 |
}
|
| 1035 |
}
|
| 1036 |
}
|
|
@@ -1038,9 +1046,8 @@ function woocommerce_ac_delete(){
|
|
| 1038 |
if ( $action == 'emailtemplates' && $mode == 'removetemplate' )
|
| 1039 |
{
|
| 1040 |
$id_remove = $_GET['id'];
|
| 1041 |
-
$query_remove = "DELETE FROM `".$wpdb->
|
| 1042 |
-
|
| 1043 |
-
$wpdb->query($query_remove);
|
| 1044 |
}
|
| 1045 |
|
| 1046 |
if ( isset( $_POST['ac_settings_frm'] ) && $_POST['ac_settings_frm'] == 'save' ) { ?>
|
|
@@ -1061,7 +1068,7 @@ function woocommerce_ac_delete(){
|
|
| 1061 |
|
| 1062 |
/* Find the number of rows returned from a query; Note: Do NOT use a LIMIT clause in this query */
|
| 1063 |
$wpdb->get_results("SELECT wpet . *
|
| 1064 |
-
FROM `".$wpdb->
|
| 1065 |
");
|
| 1066 |
|
| 1067 |
$count = $wpdb->num_rows;
|
|
@@ -1125,7 +1132,7 @@ function woocommerce_ac_delete(){
|
|
| 1125 |
}
|
| 1126 |
|
| 1127 |
$query = "SELECT wpet . *
|
| 1128 |
-
FROM `".$wpdb->
|
| 1129 |
ORDER BY $order_by $order
|
| 1130 |
$limit";
|
| 1131 |
$results = $wpdb->get_results( $query );
|
|
@@ -1266,6 +1273,8 @@ function woocommerce_ac_delete(){
|
|
| 1266 |
}
|
| 1267 |
if ($duration_range == "") $duration_range = "last_seven";
|
| 1268 |
//global $this->duration_range_select,$this->start_end_dates;
|
|
|
|
|
|
|
| 1269 |
_e( 'The Report below shows how many Abandoned Carts we were able to recover for you by sending automatic emails to encourage shoppers.', 'woocommerce-ac');
|
| 1270 |
?>
|
| 1271 |
<div id="recovered_stats" class="postbox" style="display:block">
|
|
@@ -1340,12 +1349,8 @@ function woocommerce_ac_delete(){
|
|
| 1340 |
include_once( "pagination.class.php");
|
| 1341 |
|
| 1342 |
/* Find the number of rows returned from a query; Note: Do NOT use a LIMIT clause in this query */
|
| 1343 |
-
//
|
| 1344 |
-
|
| 1345 |
-
// AND abandoned_cart_time <= " . $end_date . "
|
| 1346 |
-
// AND recovered_cart > '0'
|
| 1347 |
-
// "));
|
| 1348 |
-
$wpdb->get_results($wpdb->prepare("SELECT * FROM " . $wpdb->base_prefix . "ac_abandoned_cart_history_lite
|
| 1349 |
WHERE abandoned_cart_time >= %d
|
| 1350 |
AND abandoned_cart_time <= %d
|
| 1351 |
AND recovered_cart > '0'
|
|
@@ -1357,7 +1362,7 @@ function woocommerce_ac_delete(){
|
|
| 1357 |
$p->items($count);
|
| 1358 |
$p->limit(10); // Limit entries per page
|
| 1359 |
$p->target("admin.php?page=woocommerce_ac_page&action=stats&duration_select=$duration_range");
|
| 1360 |
-
|
| 1361 |
if (isset($p->paging))
|
| 1362 |
{
|
| 1363 |
if (isset($_GET[$p->paging])) $p->currentPage($_GET[$p->paging]); // Gets and validates the current page
|
|
@@ -1412,14 +1417,14 @@ function woocommerce_ac_delete(){
|
|
| 1412 |
$order_by = "recovered_cart";
|
| 1413 |
}
|
| 1414 |
|
| 1415 |
-
$query_ac = "SELECT * FROM " . $wpdb->
|
| 1416 |
WHERE abandoned_cart_time >= " . $start_date . "
|
| 1417 |
AND abandoned_cart_time <= " . $end_date . "
|
| 1418 |
AND recovered_cart > 0
|
| 1419 |
ORDER BY $order_by $order $limit";
|
| 1420 |
$ac_results = $wpdb->get_results( $query_ac );
|
| 1421 |
|
| 1422 |
-
$query_ac_carts = "SELECT * FROM " . $wpdb->
|
| 1423 |
WHERE abandoned_cart_time >= " . $start_date . "
|
| 1424 |
AND abandoned_cart_time <= " . $end_date;
|
| 1425 |
$ac_carts_results = $wpdb->get_results( $query_ac_carts );
|
|
@@ -1427,7 +1432,7 @@ function woocommerce_ac_delete(){
|
|
| 1427 |
$recovered_item = $recovered_total = $count_carts = $total_value = $order_total = 0;
|
| 1428 |
foreach ( $ac_carts_results as $key => $value)
|
| 1429 |
{
|
| 1430 |
-
|
| 1431 |
//if( $value->recovered_cart == 0 )
|
| 1432 |
{
|
| 1433 |
$count_carts += 1;
|
|
@@ -1455,18 +1460,14 @@ function woocommerce_ac_delete(){
|
|
| 1455 |
$recovered_date = strtotime($woo_order->order_date);
|
| 1456 |
$recovered_date_new = date('d M, Y h:i A', $recovered_date);
|
| 1457 |
$recovered_item += 1;
|
| 1458 |
-
|
| 1459 |
-
/* $order_items = unserialize($rec_order['_order_items'][0]);
|
| 1460 |
-
foreach ( $order_items as $order_key => $order_value)
|
| 1461 |
-
{
|
| 1462 |
-
$order_total += $order_items[$order_key]['line_total'];
|
| 1463 |
-
}*/
|
| 1464 |
$recovered_total += $rec_order['_order_total'][0];
|
|
|
|
| 1465 |
$abandoned_date = date('d M, Y h:i A', $value->abandoned_cart_time);
|
| 1466 |
|
| 1467 |
$abandoned_order_id = $value->id;
|
| 1468 |
|
| 1469 |
-
|
| 1470 |
$recovered_order_total = 0;
|
| 1471 |
if (isset($rec_order['_billing_first_name'][0])) {
|
| 1472 |
$billing_first_name = $rec_order['_billing_first_name'][0];
|
|
@@ -1528,7 +1529,7 @@ function woocommerce_ac_delete(){
|
|
| 1528 |
if($mode=='edittemplate')
|
| 1529 |
{
|
| 1530 |
$edit_id=$_GET['id'];
|
| 1531 |
-
$query="SELECT wpet . * FROM `".$wpdb->
|
| 1532 |
$results = $wpdb->get_results( $query );
|
| 1533 |
}
|
| 1534 |
|
|
@@ -1559,7 +1560,7 @@ function woocommerce_ac_delete(){
|
|
| 1559 |
|
| 1560 |
<tr>
|
| 1561 |
<th>
|
| 1562 |
-
<label for="woocommerce_ac_template_name"><b><?php _e( 'Template Name:', 'woocommerce-ac
|
| 1563 |
</th>
|
| 1564 |
<td>
|
| 1565 |
<?php
|
|
@@ -1619,18 +1620,7 @@ function woocommerce_ac_delete(){
|
|
| 1619 |
{
|
| 1620 |
$initial_data = $results[0]->body;
|
| 1621 |
}
|
| 1622 |
-
|
| 1623 |
-
/* $settings = array(
|
| 1624 |
-
'quicktags' => array('buttons' => 'em,strong,link',),
|
| 1625 |
-
'text_area_name'=>'woocommerce_ac_email_body',//name you want for the textarea
|
| 1626 |
-
'quicktags' => true,
|
| 1627 |
-
'class' => 'tinymce',
|
| 1628 |
-
'tinymce' => true
|
| 1629 |
-
);
|
| 1630 |
-
//echo "<textarea id='editortest'> </textarea>";
|
| 1631 |
-
$id = 'woocommerce_ac_email_body';//has to be lower case
|
| 1632 |
-
wp_editor($initial_data,$id,$settings); */
|
| 1633 |
-
|
| 1634 |
echo "<textarea id='woocommerce_ac_email_body' name='woocommerce_ac_email_body' rows='15'' cols='80'>".$initial_data."</textarea>";
|
| 1635 |
?>
|
| 1636 |
|
|
@@ -1787,7 +1777,7 @@ function woocommerce_ac_delete(){
|
|
| 1787 |
$user_id = $_POST['user_id'];
|
| 1788 |
$action = $_POST['action'];
|
| 1789 |
|
| 1790 |
-
$query = "DELETE FROM `".$wpdb->
|
| 1791 |
WHERE
|
| 1792 |
id = '$abandoned_order_id' ";
|
| 1793 |
//echo $query;
|
|
@@ -1811,9 +1801,7 @@ function woocommerce_ac_delete(){
|
|
| 1811 |
var from_name_preview = $('#woocommerce_ac_from_name').val();
|
| 1812 |
var subject_email_preview = $('#woocommerce_ac_email_subject').val();
|
| 1813 |
var body_email_preview = tinyMCE.activeEditor.getContent();
|
| 1814 |
-
var send_email_id = $('#send_test_email').val();
|
| 1815 |
-
|
| 1816 |
-
//alert(tinyMCE.activeEditor.getContent());
|
| 1817 |
var data = {
|
| 1818 |
from_name_preview: from_name_preview,
|
| 1819 |
subject_email_preview: subject_email_preview,
|
|
@@ -1821,7 +1809,7 @@ function woocommerce_ac_delete(){
|
|
| 1821 |
send_email_id: send_email_id,
|
| 1822 |
action: 'preview_email_sent'
|
| 1823 |
};
|
| 1824 |
-
|
| 1825 |
|
| 1826 |
// since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
|
| 1827 |
$.post(ajaxurl, data, function(response)
|
|
@@ -1840,19 +1828,56 @@ function woocommerce_ac_delete(){
|
|
| 1840 |
function preview_email_sent() {
|
| 1841 |
|
| 1842 |
$from_email_name = $_POST['from_name_preview'];
|
| 1843 |
-
$subject_email_preview = $_POST['subject_email_preview'];
|
| 1844 |
$body_email_preview = $_POST['body_email_preview'];
|
| 1845 |
-
$
|
|
|
|
|
|
|
| 1846 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1847 |
$user_email_from = get_option('admin_email');
|
| 1848 |
$headers[] = "From: ".$from_email_name." <".$user_email_from.">"."\r\n";
|
| 1849 |
-
$headers[] = "Content-Type: text/html"."\r\n";
|
| 1850 |
-
|
| 1851 |
-
|
| 1852 |
-
|
| 1853 |
-
// $headers .= "Reply-To: <".$reply_name_preview.">"."\r\n";
|
| 1854 |
-
|
| 1855 |
-
wp_mail( $to_email_preview, $subject_email_preview, stripslashes($body_email_preview), $headers );
|
| 1856 |
|
| 1857 |
echo "email sent";
|
| 1858 |
|
| 3 |
Plugin Name: WooCommerce Abandon Cart Lite Plugin
|
| 4 |
Plugin URI: http://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro
|
| 5 |
Description: This plugin captures abandoned carts by logged-in users & emails them about it. <strong><a href="http://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro">Click here to get the PRO Version.</a></strong>
|
| 6 |
+
Version: 1.8
|
| 7 |
Author: Tyche Softwares
|
| 8 |
Author URI: http://www.tychesoftwares.com/
|
| 9 |
*/
|
| 38 |
function woocommerce_ac_delete(){
|
| 39 |
|
| 40 |
global $wpdb;
|
| 41 |
+
$table_name_ac_abandoned_cart_history = $wpdb->prefix . "ac_abandoned_cart_history_lite";
|
| 42 |
$sql_ac_abandoned_cart_history = "DROP TABLE " . $table_name_ac_abandoned_cart_history ;
|
| 43 |
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 44 |
$wpdb->get_results($sql_ac_abandoned_cart_history);
|
| 45 |
|
| 46 |
+
$table_name_ac_email_templates = $wpdb->prefix . "ac_email_templates_lite";
|
| 47 |
$sql_ac_email_templates = "DROP TABLE " . $table_name_ac_email_templates ;
|
| 48 |
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 49 |
$wpdb->get_results($sql_ac_email_templates);
|
| 50 |
|
| 51 |
+
$table_name_ac_sent_history = $wpdb->prefix . "ac_sent_history_lite";
|
| 52 |
$sql_ac_sent_history = "DROP TABLE " . $table_name_ac_sent_history ;
|
| 53 |
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 54 |
$wpdb->get_results($sql_ac_sent_history);
|
| 55 |
|
| 56 |
+
$query = "SELECT blog_id FROM `".$wpdb->prefix."blogs`";
|
| 57 |
+
$results = $wpdb->get_results( $query );
|
| 58 |
+
|
| 59 |
+
foreach( $results as $key => $value ) {
|
| 60 |
+
|
| 61 |
+
$table_name_ac_abandoned_cart_history = $wpdb->prefix .$value->blog_id."_"."ac_abandoned_cart_history_lite";
|
| 62 |
+
$sql_ac_abandoned_cart_history = "DROP TABLE " . $table_name_ac_abandoned_cart_history ;
|
| 63 |
+
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 64 |
+
$wpdb->get_results($sql_ac_abandoned_cart_history);
|
| 65 |
+
|
| 66 |
+
$table_name_ac_email_templates = $wpdb->prefix .$value->blog_id."_"."ac_email_templates_lite";
|
| 67 |
+
$sql_ac_email_templates = "DROP TABLE " . $table_name_ac_email_templates ;
|
| 68 |
+
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 69 |
+
$wpdb->get_results($sql_ac_email_templates);
|
| 70 |
+
|
| 71 |
+
$table_name_ac_sent_history = $wpdb->prefix .$value->blog_id."_"."ac_sent_history_lite";
|
| 72 |
+
$sql_ac_sent_history = "DROP TABLE " . $table_name_ac_sent_history ;
|
| 73 |
+
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 74 |
+
$wpdb->get_results($sql_ac_sent_history);
|
| 75 |
+
|
| 76 |
+
}
|
| 77 |
|
| 78 |
+
delete_option ( 'woocommerce_ac_email_body' );
|
| 79 |
delete_option ( 'woocommerce_ac_settings' );
|
| 80 |
|
| 81 |
}
|
| 186 |
|
| 187 |
// Language Translation
|
| 188 |
function update_po_file(){
|
| 189 |
+
$domain = 'woocommerce-ac';
|
| 190 |
+
$locale = apply_filters( 'plugin_locale', get_locale(), $domain );
|
| 191 |
+
if ( $loaded = load_textdomain( $domain, trailingslashit( WP_LANG_DIR ) . $domain . '-' . $locale . '.mo' ) ) {
|
| 192 |
+
return $loaded;
|
| 193 |
+
} else {
|
| 194 |
+
|
| 195 |
+
load_plugin_textdomain( $domain, FALSE, basename( dirname( __FILE__ ) ) . '/languages/' );
|
| 196 |
+
}
|
| 197 |
}
|
|
|
|
|
|
|
| 198 |
|
| 199 |
+
function ac_lite_coupon_notice() {
|
| 200 |
+
|
| 201 |
+
if (isset($_GET['page']) && $_GET['page'] == "woocommerce_ac_page") {
|
| 202 |
+
?>
|
| 203 |
+
<div class="updated">
|
| 204 |
+
<p><?php _e( 'You can upgrade to the <a href="https://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro/">PRO version of WooCommerce Abandoned Cart plugin</a> at a <b>20% discount</b>. Use the coupon code: <b>ACPRO20</b>.<a href="https://www.tychesoftwares.com/store/premium-plugins/woocommerce-abandoned-cart-pro/"> Purchase now </a> & save $24!', 'woocommerce-ac' ); ?></p>
|
| 205 |
+
</div>
|
| 206 |
+
<?php
|
| 207 |
+
}
|
| 208 |
+
}
|
| 209 |
+
/*-----------------------------------------------------------------------------------*/
|
| 210 |
+
/* Class Functions */
|
| 211 |
+
/*-----------------------------------------------------------------------------------*/
|
| 212 |
+
|
| 213 |
+
|
| 214 |
+
|
| 215 |
|
| 216 |
function woocommerce_ac_activate() {
|
| 217 |
|
| 218 |
global $wpdb;
|
| 219 |
|
| 220 |
+
$table_name = $wpdb->prefix . "ac_email_templates_lite";
|
| 221 |
|
| 222 |
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
|
| 223 |
`id` int(11) NOT NULL AUTO_INCREMENT,
|
| 234 |
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 235 |
dbDelta($sql);
|
| 236 |
|
| 237 |
+
$sent_table_name = $wpdb->prefix . "ac_sent_history_lite";
|
| 238 |
|
| 239 |
$sql_query = "CREATE TABLE IF NOT EXISTS $sent_table_name (
|
| 240 |
`id` int(11) NOT NULL auto_increment,
|
| 248 |
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
|
| 249 |
dbDelta($sql_query);
|
| 250 |
|
| 251 |
+
$ac_history_table_name = $wpdb->prefix . "ac_abandoned_cart_history_lite";
|
| 252 |
|
| 253 |
$history_query = "CREATE TABLE IF NOT EXISTS $ac_history_table_name (
|
| 254 |
`id` int(11) NOT NULL AUTO_INCREMENT,
|
| 272 |
|
| 273 |
function ac_lite_update_db_check() {
|
| 274 |
global $wpdb;
|
| 275 |
+
|
| 276 |
+
if(get_option('ac_lite_delete_alter_table_queries') != 'yes') {
|
| 277 |
+
update_option( 'ac_lite_alter_table_queries', '');
|
| 278 |
+
update_option( 'ac_lite_delete_alter_table_queries', 'yes' );
|
| 279 |
+
}
|
| 280 |
if( get_option('ac_lite_alter_table_queries') != 'yes') {
|
| 281 |
if( $wpdb->get_var("SHOW TABLES LIKE '" . $wpdb->prefix . "ac_email_templates'") === $wpdb->prefix . 'ac_email_templates') {
|
| 282 |
+
$old_table_name = $wpdb->prefix . "ac_email_templates";
|
| 283 |
+
$table_name = $wpdb->prefix . "ac_email_templates_lite";
|
| 284 |
|
| 285 |
$alter_ac_email_table_query = "ALTER TABLE $old_table_name
|
| 286 |
RENAME TO $table_name";
|
| 289 |
}
|
| 290 |
|
| 291 |
if($wpdb->get_var("SHOW TABLES LIKE '" . $wpdb->prefix . "ac_sent_history'") === $wpdb->prefix . 'ac_sent_history') {
|
| 292 |
+
$old_sent_table_name = $wpdb->prefix . "ac_sent_history";
|
| 293 |
+
$sent_table_name = $wpdb->prefix . "ac_sent_history_lite";
|
| 294 |
$alter_ac_sent_history_table_query = "ALTER TABLE $old_sent_table_name
|
| 295 |
RENAME TO $sent_table_name";
|
| 296 |
$wpdb->get_results ( $alter_ac_sent_history_table_query );
|
| 297 |
}
|
| 298 |
|
| 299 |
if( $wpdb->get_var("SHOW TABLES LIKE '" . $wpdb->prefix . "ac_abandoned_cart_history'") === $wpdb->prefix . 'ac_abandoned_cart_history') {
|
| 300 |
+
$old_ac_history_table_name = $wpdb->prefix . "ac_abandoned_cart_history";
|
| 301 |
+
$ac_history_table_name = $wpdb->prefix . "ac_abandoned_cart_history_lite";
|
| 302 |
|
| 303 |
$alter_ac_abandoned_cart_history_table_query = "ALTER TABLE $old_ac_history_table_name
|
| 304 |
RENAME TO $ac_history_table_name";
|
| 330 |
}
|
| 331 |
|
| 332 |
$compare_time = $current_time - $cart_cut_off_time;
|
| 333 |
+
$query = "SELECT * FROM `".$wpdb->prefix."ac_abandoned_cart_history_lite`
|
| 334 |
WHERE user_id = '".$user_id."'
|
| 335 |
AND cart_ignored = '0'
|
| 336 |
AND recovered_cart = '0'";
|
| 338 |
if ( count($results) == 0 )
|
| 339 |
{
|
| 340 |
$cart_info = json_encode(get_user_meta($user_id, '_woocommerce_persistent_cart', true));
|
| 341 |
+
$insert_query = "INSERT INTO `".$wpdb->prefix."ac_abandoned_cart_history_lite`
|
| 342 |
(user_id, abandoned_cart_info, abandoned_cart_time, cart_ignored)
|
| 343 |
VALUES ('".$user_id."', '".$cart_info."', '".$current_time."', '0')";
|
| 344 |
+
$wpdb->query($insert_query);
|
|
|
|
| 345 |
}
|
| 346 |
+
elseif ( isset($results[0]->abandoned_cart_time) && $compare_time > $results[0]->abandoned_cart_time )
|
| 347 |
{
|
| 348 |
$updated_cart_info = json_encode(get_user_meta($user_id, '_woocommerce_persistent_cart', true));
|
| 349 |
if (! $this->compare_carts( $user_id, $results[0]->abandoned_cart_info) )
|
| 350 |
{
|
| 351 |
+
$query_ignored = "UPDATE `".$wpdb->prefix."ac_abandoned_cart_history_lite`
|
| 352 |
SET cart_ignored = '1'
|
| 353 |
WHERE user_id='".$user_id."'";
|
| 354 |
+
$wpdb->query($query_ignored);
|
| 355 |
+
$query_update = "INSERT INTO `".$wpdb->prefix."ac_abandoned_cart_history_lite`
|
|
|
|
| 356 |
(user_id, abandoned_cart_info, abandoned_cart_time, cart_ignored)
|
| 357 |
VALUES ('".$user_id."', '".$updated_cart_info."', '".$current_time."', '0')";
|
| 358 |
+
$wpdb->query($query_update);
|
|
|
|
| 359 |
update_user_meta($user_id, '_woocommerce_ac_modified_cart', md5("yes"));
|
| 360 |
}
|
| 361 |
else
|
| 366 |
else
|
| 367 |
{
|
| 368 |
$updated_cart_info = json_encode(get_user_meta($user_id, '_woocommerce_persistent_cart', true));
|
| 369 |
+
$query_update = "UPDATE `".$wpdb->prefix."ac_abandoned_cart_history_lite`
|
| 370 |
SET abandoned_cart_info = '".$updated_cart_info."',
|
| 371 |
abandoned_cart_time = '".$current_time."'
|
| 372 |
WHERE user_id='".$user_id."' AND cart_ignored='0' ";
|
| 373 |
+
$wpdb->query($query_update);
|
|
|
|
| 374 |
}
|
| 375 |
}
|
| 376 |
}
|
| 425 |
delete_user_meta($user_id, '_woocommerce_ac_persistent_cart_temp_time');
|
| 426 |
|
| 427 |
// get all latest abandoned carts that were modified
|
| 428 |
+
$query = "SELECT * FROM `".$wpdb->prefix."ac_abandoned_cart_history_lite`
|
| 429 |
WHERE user_id = '".$user_id."'
|
| 430 |
AND cart_ignored = '0'
|
| 431 |
AND recovered_cart = '0'
|
| 432 |
ORDER BY id DESC
|
| 433 |
LIMIT 1";
|
| 434 |
$results = $wpdb->get_results( $query );
|
| 435 |
+
if (count($results) > 0){
|
| 436 |
+
if ( get_user_meta($user_id, '_woocommerce_ac_modified_cart', true) == md5("yes") ||
|
| 437 |
get_user_meta($user_id, '_woocommerce_ac_modified_cart', true) == md5("no") )
|
| 438 |
+
{
|
| 439 |
|
| 440 |
+
$order_id = $order->id;
|
| 441 |
+
$query_order = "UPDATE `".$wpdb->prefix."ac_abandoned_cart_history_lite`
|
| 442 |
+
SET recovered_cart= '".$order_id."',
|
| 443 |
+
cart_ignored = '1'
|
| 444 |
+
WHERE id='".$results[0]->id."' ";
|
| 445 |
+
$wpdb->query($query_order);
|
| 446 |
+
delete_user_meta($user_id, '_woocommerce_ac_modified_cart');
|
| 447 |
+
}
|
| 448 |
+
else
|
| 449 |
+
{
|
| 450 |
+
$delete_query = "DELETE FROM `".$wpdb->prefix."ac_abandoned_cart_history_lite`
|
| 451 |
+
WHERE
|
| 452 |
+
id='".$results[0]->id."' ";
|
| 453 |
+
$wpdb->query( $delete_query );
|
| 454 |
+
}
|
| 455 |
+
}
|
| 456 |
+
}
|
|
|
|
|
|
|
|
|
|
| 457 |
|
| 458 |
function action_admin_init() {
|
| 459 |
// only hook up these filters if we're in the admin panel, and the current user has permission
|
| 724 |
|
| 725 |
if ( count($enable_email_sett_arr) > 0 ) {
|
| 726 |
|
| 727 |
+
if ( ( isset($enable_email_sett_arr[0]->cart_time) ) && ($enable_email_sett_arr[0]->cart_time != '' || $enable_email_sett_arr[0]->cart_time != 'null' )) {
|
| 728 |
|
| 729 |
$cart_time = $enable_email_sett_arr[0]->cart_time;
|
| 730 |
} else {
|
| 737 |
$cart_time = 60;
|
| 738 |
}
|
| 739 |
|
| 740 |
+
?>
|
| 741 |
<input type="text" name="cart_abandonment_time" id="cart_abandonment_time" size="5" value="<?php echo $cart_time; ?> "> <?php _e( 'minutes', 'woocommerce-ac' );?>
|
| 742 |
<img class="help_tip" width="16" height="16" data-tip='<?php _e( 'Consider cart abandoned after X minutes of item being added to cart & order not placed', 'woocommerce-ac') ?>' src="<?php echo plugins_url(); ?>/woocommerce/assets/images/help.png" /></p>
|
| 743 |
<!-- <span class="description"><?php _e( 'Consider cart abandoned after X minutes of item being added to cart & order not placed', 'woocommerce-ac' );
|
|
|
|
| 744 |
?></span> -->
|
| 745 |
</td>
|
| 746 |
</tr>
|
| 768 |
|
| 769 |
/* Find the number of rows returned from a query; Note: Do NOT use a LIMIT clause in this query */
|
| 770 |
$wpdb->get_results("SELECT wpac . * , wpu.user_login, wpu.user_email
|
| 771 |
+
FROM `".$wpdb->prefix."ac_abandoned_cart_history_lite` AS wpac
|
| 772 |
LEFT JOIN ".$wpdb->base_prefix."users AS wpu ON wpac.user_id = wpu.id
|
| 773 |
WHERE recovered_cart='0' ");
|
| 774 |
|
| 779 |
$p->items($count);
|
| 780 |
$p->limit(10); // Limit entries per page
|
| 781 |
$p->target("admin.php?page=woocommerce_ac_page&action=listcart");
|
| 782 |
+
|
| 783 |
+
if (isset($p->paging)) {
|
| 784 |
+
if (isset($_GET[$p->paging])) $p->currentPage($_GET[$p->paging]); // Gets and validates the current page
|
| 785 |
+
}
|
|
|
|
| 786 |
$p->calculate(); // Calculates what to show
|
| 787 |
$p->parameterName('paging');
|
| 788 |
$p->adjacents(1); //No. of page away from the current page
|
| 798 |
$limit = "LIMIT " . ($p->page - 1) * $p->limit . ", " . $p->limit;
|
| 799 |
|
| 800 |
}
|
| 801 |
+
else $limit = "";
|
| 802 |
|
| 803 |
?>
|
| 804 |
|
| 838 |
}
|
| 839 |
/* Now we use the LIMIT clause to grab a range of rows */
|
| 840 |
$query = "SELECT wpac . * , wpu.user_login, wpu.user_email
|
| 841 |
+
FROM `".$wpdb->prefix."ac_abandoned_cart_history_lite` AS wpac
|
| 842 |
LEFT JOIN ".$wpdb->base_prefix."users AS wpu ON wpac.user_id = wpu.id
|
| 843 |
WHERE recovered_cart='0'
|
| 844 |
ORDER BY `$order_by` $order
|
| 845 |
$limit";
|
| 846 |
//echo $query;
|
| 847 |
+
$results = $wpdb->get_results( $query );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 848 |
|
| 849 |
/* From here you can do whatever you want with the data from the $result link. */
|
| 850 |
|
| 961 |
$active_post = 1;
|
| 962 |
if ( $active_post == 1 )
|
| 963 |
{
|
| 964 |
+
$check_query = "SELECT * FROM `".$wpdb->prefix."ac_email_templates_lite`
|
| 965 |
WHERE is_active='1' AND frequency='".$_POST['email_frequency']."' AND day_or_hour='".$_POST['day_or_hour']."' ";
|
| 966 |
$check_results = $wpdb->get_results($check_query);
|
| 967 |
if (count($check_results) == 0 )
|
| 968 |
{
|
| 969 |
+
$query = "INSERT INTO `".$wpdb->prefix."ac_email_templates_lite`
|
| 970 |
(subject, body, is_active, frequency, day_or_hour, template_name, from_name)
|
| 971 |
VALUES ('".$_POST['woocommerce_ac_email_subject']."',
|
| 972 |
'".$_POST['woocommerce_ac_email_body']."',
|
| 975 |
'".$_POST['day_or_hour']."',
|
| 976 |
'".$_POST['woocommerce_ac_template_name']."',
|
| 977 |
'".$_POST['woocommerce_ac_from_name']."' )";
|
| 978 |
+
$wpdb->query($query);
|
|
|
|
|
|
|
| 979 |
}
|
| 980 |
else
|
| 981 |
{
|
| 982 |
+
$query_update = "UPDATE `".$wpdb->prefix."ac_email_templates_lite`
|
| 983 |
SET
|
| 984 |
is_active='0'
|
| 985 |
WHERE frequency='".$_POST['email_frequency']."' AND day_or_hour='".$_POST['day_or_hour']."' ";
|
| 986 |
+
$wpdb->query($query_update);
|
|
|
|
|
|
|
| 987 |
|
| 988 |
+
$query_insert_new = "INSERT INTO `".$wpdb->prefix."ac_email_templates_lite`
|
| 989 |
( subject, body, is_active, frequency, day_or_hour, template_name, from_name)
|
| 990 |
VALUES ('".$_POST['woocommerce_ac_email_subject']."',
|
| 991 |
'".$_POST['woocommerce_ac_email_body']."',
|
| 994 |
'".$_POST['day_or_hour']."',
|
| 995 |
'".$_POST['woocommerce_ac_template_name']."',
|
| 996 |
'".$_POST['woocommerce_ac_from_name']."' )";
|
| 997 |
+
$wpdb->query($query_insert_new);
|
|
|
|
|
|
|
| 998 |
}
|
| 999 |
}
|
| 1000 |
}
|
| 1005 |
$active = 1;
|
| 1006 |
if ( $active == 1 )
|
| 1007 |
{
|
| 1008 |
+
$check_query = "SELECT * FROM `".$wpdb->prefix."ac_email_templates_lite`
|
| 1009 |
WHERE is_active='1' AND frequency='".$_POST['email_frequency']."' AND day_or_hour='".$_POST['day_or_hour']."' ";
|
| 1010 |
$check_results = $wpdb->get_results($check_query);
|
| 1011 |
if (count($check_results) == 0 )
|
| 1012 |
{
|
| 1013 |
+
$query_update = "UPDATE `".$wpdb->prefix."ac_email_templates_lite`
|
| 1014 |
SET
|
| 1015 |
subject='".$_POST['woocommerce_ac_email_subject']."',
|
| 1016 |
body='".$_POST['woocommerce_ac_email_body']."',
|
| 1019 |
template_name='".$_POST['woocommerce_ac_template_name']."',
|
| 1020 |
from_name='".$_POST['woocommerce_ac_from_name']."'
|
| 1021 |
WHERE id='".$_POST['id']."' ";
|
| 1022 |
+
$wpdb->query($query_update);
|
|
|
|
| 1023 |
}
|
| 1024 |
else
|
| 1025 |
{
|
| 1026 |
+
$query_update_new = "UPDATE `".$wpdb->prefix."ac_email_templates_lite`
|
| 1027 |
SET
|
| 1028 |
is_active='0'
|
| 1029 |
WHERE frequency='".$_POST['email_frequency']."' AND day_or_hour='".$_POST['day_or_hour']."' ";
|
| 1030 |
+
$wpdb->query($query_update_new);
|
|
|
|
| 1031 |
|
| 1032 |
+
$query_update_latest = "UPDATE `".$wpdb->prefix."ac_email_templates_lite`
|
| 1033 |
SET
|
| 1034 |
subject='".$_POST['woocommerce_ac_email_subject']."',
|
| 1035 |
body='".$_POST['woocommerce_ac_email_body']."',
|
| 1038 |
template_name='".$_POST['woocommerce_ac_template_name']."',
|
| 1039 |
from_name='".$_POST['woocommerce_ac_from_name']."'
|
| 1040 |
WHERE id='".$_POST['id']."' ";
|
| 1041 |
+
$wpdb->query($query_update_latest);
|
|
|
|
| 1042 |
}
|
| 1043 |
}
|
| 1044 |
}
|
| 1046 |
if ( $action == 'emailtemplates' && $mode == 'removetemplate' )
|
| 1047 |
{
|
| 1048 |
$id_remove = $_GET['id'];
|
| 1049 |
+
$query_remove = "DELETE FROM `".$wpdb->prefix."ac_email_templates_lite` WHERE id='".$id_remove."' ";
|
| 1050 |
+
$wpdb->query($query_remove);
|
|
|
|
| 1051 |
}
|
| 1052 |
|
| 1053 |
if ( isset( $_POST['ac_settings_frm'] ) && $_POST['ac_settings_frm'] == 'save' ) { ?>
|
| 1068 |
|
| 1069 |
/* Find the number of rows returned from a query; Note: Do NOT use a LIMIT clause in this query */
|
| 1070 |
$wpdb->get_results("SELECT wpet . *
|
| 1071 |
+
FROM `".$wpdb->prefix."ac_email_templates_lite` AS wpet
|
| 1072 |
");
|
| 1073 |
|
| 1074 |
$count = $wpdb->num_rows;
|
| 1132 |
}
|
| 1133 |
|
| 1134 |
$query = "SELECT wpet . *
|
| 1135 |
+
FROM `".$wpdb->prefix."ac_email_templates_lite` AS wpet
|
| 1136 |
ORDER BY $order_by $order
|
| 1137 |
$limit";
|
| 1138 |
$results = $wpdb->get_results( $query );
|
| 1273 |
}
|
| 1274 |
if ($duration_range == "") $duration_range = "last_seven";
|
| 1275 |
//global $this->duration_range_select,$this->start_end_dates;
|
| 1276 |
+
|
| 1277 |
+
|
| 1278 |
_e( 'The Report below shows how many Abandoned Carts we were able to recover for you by sending automatic emails to encourage shoppers.', 'woocommerce-ac');
|
| 1279 |
?>
|
| 1280 |
<div id="recovered_stats" class="postbox" style="display:block">
|
| 1349 |
include_once( "pagination.class.php");
|
| 1350 |
|
| 1351 |
/* Find the number of rows returned from a query; Note: Do NOT use a LIMIT clause in this query */
|
| 1352 |
+
//
|
| 1353 |
+
$wpdb->get_results($wpdb->prepare("SELECT * FROM " . $wpdb->prefix . "ac_abandoned_cart_history_lite
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1354 |
WHERE abandoned_cart_time >= %d
|
| 1355 |
AND abandoned_cart_time <= %d
|
| 1356 |
AND recovered_cart > '0'
|
| 1362 |
$p->items($count);
|
| 1363 |
$p->limit(10); // Limit entries per page
|
| 1364 |
$p->target("admin.php?page=woocommerce_ac_page&action=stats&duration_select=$duration_range");
|
| 1365 |
+
|
| 1366 |
if (isset($p->paging))
|
| 1367 |
{
|
| 1368 |
if (isset($_GET[$p->paging])) $p->currentPage($_GET[$p->paging]); // Gets and validates the current page
|
| 1417 |
$order_by = "recovered_cart";
|
| 1418 |
}
|
| 1419 |
|
| 1420 |
+
$query_ac = "SELECT * FROM " . $wpdb->prefix . "ac_abandoned_cart_history_lite
|
| 1421 |
WHERE abandoned_cart_time >= " . $start_date . "
|
| 1422 |
AND abandoned_cart_time <= " . $end_date . "
|
| 1423 |
AND recovered_cart > 0
|
| 1424 |
ORDER BY $order_by $order $limit";
|
| 1425 |
$ac_results = $wpdb->get_results( $query_ac );
|
| 1426 |
|
| 1427 |
+
$query_ac_carts = "SELECT * FROM " . $wpdb->prefix . "ac_abandoned_cart_history_lite
|
| 1428 |
WHERE abandoned_cart_time >= " . $start_date . "
|
| 1429 |
AND abandoned_cart_time <= " . $end_date;
|
| 1430 |
$ac_carts_results = $wpdb->get_results( $query_ac_carts );
|
| 1432 |
$recovered_item = $recovered_total = $count_carts = $total_value = $order_total = 0;
|
| 1433 |
foreach ( $ac_carts_results as $key => $value)
|
| 1434 |
{
|
| 1435 |
+
|
| 1436 |
//if( $value->recovered_cart == 0 )
|
| 1437 |
{
|
| 1438 |
$count_carts += 1;
|
| 1460 |
$recovered_date = strtotime($woo_order->order_date);
|
| 1461 |
$recovered_date_new = date('d M, Y h:i A', $recovered_date);
|
| 1462 |
$recovered_item += 1;
|
| 1463 |
+
if (isset($rec_order['_order_total'][0])) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1464 |
$recovered_total += $rec_order['_order_total'][0];
|
| 1465 |
+
}
|
| 1466 |
$abandoned_date = date('d M, Y h:i A', $value->abandoned_cart_time);
|
| 1467 |
|
| 1468 |
$abandoned_order_id = $value->id;
|
| 1469 |
|
| 1470 |
+
$billing_first_name = $billing_last_name = $billing_email = '';
|
| 1471 |
$recovered_order_total = 0;
|
| 1472 |
if (isset($rec_order['_billing_first_name'][0])) {
|
| 1473 |
$billing_first_name = $rec_order['_billing_first_name'][0];
|
| 1529 |
if($mode=='edittemplate')
|
| 1530 |
{
|
| 1531 |
$edit_id=$_GET['id'];
|
| 1532 |
+
$query="SELECT wpet . * FROM `".$wpdb->prefix."ac_email_templates_lite` AS wpet WHERE id='".$edit_id."'";
|
| 1533 |
$results = $wpdb->get_results( $query );
|
| 1534 |
}
|
| 1535 |
|
| 1560 |
|
| 1561 |
<tr>
|
| 1562 |
<th>
|
| 1563 |
+
<label for="woocommerce_ac_template_name"><b><?php _e( 'Template Name:', 'woocommerce-ac');?></b></label>
|
| 1564 |
</th>
|
| 1565 |
<td>
|
| 1566 |
<?php
|
| 1620 |
{
|
| 1621 |
$initial_data = $results[0]->body;
|
| 1622 |
}
|
| 1623 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1624 |
echo "<textarea id='woocommerce_ac_email_body' name='woocommerce_ac_email_body' rows='15'' cols='80'>".$initial_data."</textarea>";
|
| 1625 |
?>
|
| 1626 |
|
| 1777 |
$user_id = $_POST['user_id'];
|
| 1778 |
$action = $_POST['action'];
|
| 1779 |
|
| 1780 |
+
$query = "DELETE FROM `".$wpdb->prefix."ac_abandoned_cart_history_lite`
|
| 1781 |
WHERE
|
| 1782 |
id = '$abandoned_order_id' ";
|
| 1783 |
//echo $query;
|
| 1801 |
var from_name_preview = $('#woocommerce_ac_from_name').val();
|
| 1802 |
var subject_email_preview = $('#woocommerce_ac_email_subject').val();
|
| 1803 |
var body_email_preview = tinyMCE.activeEditor.getContent();
|
| 1804 |
+
var send_email_id = $('#send_test_email').val();
|
|
|
|
|
|
|
| 1805 |
var data = {
|
| 1806 |
from_name_preview: from_name_preview,
|
| 1807 |
subject_email_preview: subject_email_preview,
|
| 1809 |
send_email_id: send_email_id,
|
| 1810 |
action: 'preview_email_sent'
|
| 1811 |
};
|
| 1812 |
+
|
| 1813 |
|
| 1814 |
// since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
|
| 1815 |
$.post(ajaxurl, data, function(response)
|
| 1828 |
function preview_email_sent() {
|
| 1829 |
|
| 1830 |
$from_email_name = $_POST['from_name_preview'];
|
| 1831 |
+
$subject_email_preview = $_POST['subject_email_preview'];
|
| 1832 |
$body_email_preview = $_POST['body_email_preview'];
|
| 1833 |
+
$body_email_preview = str_replace('{{customer.firstname}}', 'John', $body_email_preview);
|
| 1834 |
+
$body_email_preview = str_replace('{{customer.lastname}}', 'Doe', $body_email_preview);
|
| 1835 |
+
$body_email_preview = str_replace('{{customer.fullname}}', 'John'." ".'Doe', $body_email_preview);
|
| 1836 |
|
| 1837 |
+
$var = '<h3>'.__( "Your Shopping Cart", "woocommerce-ac" ).'</h3>
|
| 1838 |
+
<table border="0" cellpadding="10" cellspacing="0" class="templateDataTable">
|
| 1839 |
+
<tr align="center">
|
| 1840 |
+
<th>'.__( "Item", "woocommerce-ac" ).'</th>
|
| 1841 |
+
<th>'.__( "Name", "woocommerce-ac" ).'</th>
|
| 1842 |
+
<th>'.__( "Quantity", "woocommerce-ac" ).'</th>
|
| 1843 |
+
<th>'.__( "Price", "woocommerce-ac" ).'</th>
|
| 1844 |
+
<th>'.__( "Line Subtotal", "woocommerce-ac" ).'</th>
|
| 1845 |
+
</tr>
|
| 1846 |
+
<tr align="center">
|
| 1847 |
+
<td><img class="demo_img" width="42" height="42" src="'.plugins_url().'/woocommerce-abandoned-cart/images/shoes.jpg"/></td>
|
| 1848 |
+
<td>'.__( "Men\'\s Formal Shoes", "woocommerce-ac" ).'</td>
|
| 1849 |
+
<td>1</td>
|
| 1850 |
+
<td>$100</td>
|
| 1851 |
+
<td>$100</td>
|
| 1852 |
+
</tr>
|
| 1853 |
+
<tr align="center">
|
| 1854 |
+
<td><img class="demo_img" width="42" height="42" src="'.plugins_url().'/woocommerce-abandoned-cart/images/handbag.jpg"/></td>
|
| 1855 |
+
<td>'.__( "Woman\'\s Hand Bags", "woocommerce-ac" ).'</td>
|
| 1856 |
+
<td>1</td>
|
| 1857 |
+
<td>$100</td>
|
| 1858 |
+
<td>$100</td>
|
| 1859 |
+
</tr>
|
| 1860 |
+
<tr align="center">
|
| 1861 |
+
<td></td>
|
| 1862 |
+
<td></td>
|
| 1863 |
+
<td></td>
|
| 1864 |
+
<td>'.__( "Cart Total:", "woocommerce-ac" ).'</td>
|
| 1865 |
+
<td>$200</td>
|
| 1866 |
+
</tr>
|
| 1867 |
+
</table>';
|
| 1868 |
+
|
| 1869 |
+
$body_email_preview = str_replace('{{products.cart}}', $var, $body_email_preview);
|
| 1870 |
+
if (isset($_POST['send_email_id'])) {
|
| 1871 |
+
$to_email_preview = $_POST['send_email_id'];
|
| 1872 |
+
} else {
|
| 1873 |
+
$to_email_preview = "";
|
| 1874 |
+
}
|
| 1875 |
$user_email_from = get_option('admin_email');
|
| 1876 |
$headers[] = "From: ".$from_email_name." <".$user_email_from.">"."\r\n";
|
| 1877 |
+
$headers[] = "Content-Type: text/html"."\r\n";
|
| 1878 |
+
|
| 1879 |
+
$body_email_final_preview = stripslashes($body_email_preview);
|
| 1880 |
+
wp_mail( $to_email_preview, $subject_email_preview, __( $body_email_final_preview, 'woocommerce-ac' ), $headers );
|
|
|
|
|
|
|
|
|
|
| 1881 |
|
| 1882 |
echo "email sent";
|
| 1883 |
|
