PluginProbe ʕ •ᴥ•ʔ
Shortcoder — Create Shortcodes for Anything / 4.1.6
Shortcoder — Create Shortcodes for Anything v4.1.6
trunk 3.0 3.0.1 3.1 3.2 3.3 3.4 3.4.1 4.0 4.0.1 4.0.2 4.0.3 4.1 4.1.1 4.1.2 4.1.3 4.1.4 4.1.5 4.1.6 4.1.7 4.1.8 4.1.9 4.2 4.3 4.4 4.5 4.6 5.0 5.0.1 5.0.2 5.0.3 5.0.4 5.1 5.2 5.2.1 5.3 5.3.1 5.3.2 5.3.3 5.3.4 5.4 5.5 5.6 5.7 5.8 6.0 6.1 6.2 6.3 6.3.1 6.3.2 6.4 6.5 6.5.1 6.5.2 6.5.3
shortcoder / admin / sc-admin.php
shortcoder / admin Last commit date
css 8 years ago images 8 years ago js 8 years ago sc-admin.php 8 years ago sc-insert.php 8 years ago
sc-admin.php
561 lines
1 <?php
2
3 class Shortcoder_Admin{
4
5 private static $pagehook = 'settings_page_shortcoder';
6
7 public static function init(){
8
9 // Add menu
10 add_action( 'admin_menu', array( __class__, 'add_menu' ) );
11
12 // Enqueue the scripts and styles
13 add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) );
14
15 // Register the action for admin ajax features
16 add_action( 'wp_ajax_sc_admin_ajax', array( __CLASS__, 'admin_ajax' ) );
17
18 // Register action links
19 add_filter( 'plugin_action_links_' . SC_BASE_NAME, array( __CLASS__, 'action_links' ) );
20
21 // Add Quick Tag button to the editor
22 add_action( 'admin_footer', array( __class__, 'add_qt_button' ) );
23
24 // Add TinyMCE button
25 add_action( 'admin_init', array( __class__, 'register_mce' ) );
26
27 }
28
29 public static function add_menu(){
30
31 add_options_page( 'Shortcoder', 'Shortcoder', 'manage_options', 'shortcoder', array( __class__, 'admin_page' ) );
32
33 }
34
35 public static function enqueue_scripts( $hook ){
36
37 if( $hook == self::$pagehook ){
38
39 wp_enqueue_style( 'sc-admin-css', SC_ADMIN_URL . '/css/style.css', array(), SC_VERSION );
40
41 wp_enqueue_script( 'jquery' );
42 wp_enqueue_script( 'sc-admin-js', SC_ADMIN_URL . '/js/script.js', array( 'jquery' ), SC_VERSION );
43
44 }
45 }
46
47 public static function admin_page(){
48
49 echo '<div class="wrap">';
50 echo '<div class="head_wrap">';
51 echo '<h1 class="sc_title">Shortcoder <span class="title-count">' . SC_VERSION . '</span></h1>';
52 self::top_sharebar();
53 self::print_notice();
54 echo '</div>';
55
56 echo '<div id="content">';
57
58 $g = self::clean_get();
59
60 if( !isset( $g[ 'action' ] ) ){
61 $g[ 'action' ] = 'list';
62 }
63
64 if( $g[ 'action' ] == 'list' ){
65 self::list_shortcodes();
66 }
67
68 if( $g[ 'action' ] == 'edit' ){
69 self::edit_shortcode();
70 }
71
72 if( $g[ 'action' ] == 'new' ){
73 self::new_shortcode();
74 }
75
76 echo '</div>';
77
78 self::page_bottom();
79
80 echo '</div>';
81
82 }
83
84 public static function list_shortcodes(){
85
86 Shortcoder_Import::check_import();
87
88 $shortcodes = Shortcoder::list_all();
89 $g = self::clean_get();
90
91 echo '<h3 class="page_title">' . __( 'List of shortcodes created', 'shortcoder' ) . ' (' . count( $shortcodes ) . ')';
92 echo '<span class="sc_menu">';
93
94 echo '<span class="button search_btn" title="' . __( 'Search shortcodes', 'shortcoder' ) . '"><span class="dashicons dashicons-search"></span><input type="search" class="search_box" placeholder="Search ..."/></span>';
95
96 echo '<label for="import" class="button"><span class="dashicons dashicons-download"></span><em>' . __( 'Import shortcodes', 'shortcoder' ) . '</em></label>';
97
98 echo '<a href="' . self::get_link(array(
99 'action' => 'sc_export',
100 '_wpnonce' => wp_create_nonce( 'sc_export_data' )
101 ), 'admin-ajax.php' ) . '" class="button"><span class="dashicons dashicons-upload"></span><em>' . __( 'Export shortcodes', 'shortcoder' ) . '</em></a>';
102
103
104 echo '<button class="button sort_btn" title="' . __( 'Sort list', 'shortcoder' ) . '"><span class="dashicons dashicons-menu"></span> <span class="dashicons dashicons-arrow-down-alt sort_icon"></span></button>';
105
106 echo '<a href="' . self::get_link(array( 'action' => 'new' )) . '" class="button button-primary sc_new_btn"><span class="dashicons dashicons-plus"></span> ' . __( 'Create a new shortcode', 'shortcoder' ) . '</a>';
107
108 echo '</span>';
109 echo '</h3>';
110
111 if( isset( $g[ 'sort' ] ) ){
112 $sort = $g[ 'sort' ];
113 if( $sort == 'asc' ){
114 uksort($shortcodes, 'strcasecmp' );
115 }else if( $sort == 'desc' ){
116 uksort($shortcodes, 'strcasecmp' );
117 $shortcodes = array_reverse( $shortcodes, True );
118 }
119 }
120
121 echo '<ul class="sc_list" data-empty="' . __( 'No shortcodes are created. Go ahead create one !', 'shortcoder' ) . '">';
122 foreach( $shortcodes as $name => $data ){
123
124 $data = wp_parse_args( $data, Shortcoder::defaults() );
125
126 $link = self::get_link(array(
127 'action' => 'edit',
128 'id' => base64_encode( $name )
129 ));
130
131 $delete_link = self::get_link(array(
132 'action' => 'sc_admin_ajax',
133 'do' => 'delete',
134 'id' => base64_encode( $name ),
135 '_wpnonce' => wp_create_nonce( 'sc_delete_nonce' )
136 ), 'admin-ajax.php' );
137
138 $disabled_text = ( $data[ 'disabled' ] == '1' ) ? '<small class="disabled_text">' . __( 'Temporarily disabled', 'shortcoder' ) . '</small>' : '';
139
140 echo '<li data-name="' . esc_attr( $name ) . '">';
141 echo '<a href="' . $link . '" class="sc_link" title="' . __( 'Edit shortcode', 'shortcoder' ) . '">' . esc_attr( $name ) . $disabled_text . '</a>';
142 echo '<span class="sc_controls">';
143 echo '<a href="#" class="sc_copy" title="' . __( 'Copy shortcode', 'shortcoder' ) . '"><span class="dashicons dashicons-editor-code"></span></a>';
144 echo '<a href="' . $delete_link . '" class="sc_delete" title="' . __( 'Delete', 'shortcoder' ) . '"><span class="dashicons dashicons-trash"></span></a>';
145 echo '</span>';
146
147 echo '<input type="text" value="' . self::get_shortcode( $name ) . '" class="sc_copy_box" readonly="readonly" title="' . __( 'Copy shortcode', 'shortcoder' ) . '" />';
148
149 echo '</li>';
150
151 }
152 echo '</ul>';
153
154 Shortcoder_Import::import_form();
155
156 }
157
158 public static function new_shortcode(){
159 self::edit_shortcode( 'new' );
160 }
161
162 public static function edit_shortcode( $action = 'edit' ){
163
164 self::save_shortcode();
165
166 $shortcodes = Shortcoder::list_all();
167 $g = self::clean_get();
168
169 $page_title = __( 'New shortcode', 'shortcoder' );
170 $action_btn = __( 'Create shortcode', 'shortcoder' );
171 $sc_name = '';
172 $values = array();
173
174 if( $action == 'edit' ){
175
176 $page_title = __( 'Edit shortcode', 'shortcoder' );
177 $action_btn = __( 'Save settings', 'shortcoder' );
178
179 if( !isset( $g[ 'id' ] ) ){
180 echo '<p align="center">' . __( 'No shortcode ID provided !' ) . '</p>';
181 return false;
182 }
183
184 $sc_name = base64_decode( $g[ 'id' ] );
185
186 if( !array_key_exists( $sc_name, $shortcodes ) ){
187 echo '<p align="center">' . __( 'Invalid shortcode ID or no such shortcode with name [' . esc_attr( $sc_name ) . '] exists !' ) . '</p>';
188 return false;
189 }
190
191 $values = $shortcodes[ $sc_name ];
192
193 }
194
195 $values = wp_parse_args( $values, Shortcoder::defaults() );
196
197 echo '<h3 class="page_title">' . $page_title;
198 echo '<div class="sc_menu">';
199 echo '<a href="' . self::get_link() . '" class="button sc_back_btn"><span class="dashicons dashicons-arrow-left-alt2"></span> ' . __( 'Back', 'shortcoder' ) . '</a>';
200 echo '</div>';
201 echo '</h3>';
202
203 echo '<form method="post">';
204
205 echo '<div class="sc_section">';
206 echo '<label for="sc_name">' . __( 'Name', 'shortcoder' ) . '</label>';
207 echo '<div class="sc_name_wrap"><input type="text" id="sc_name" name="sc_name" value="' . esc_attr( $sc_name ) . '" class="widefat" required="required" ' . ( ( $action == 'edit' ) ? 'readonly="readonly"' : 'placeholder="' . __( 'Enter a name for the shortcode, case sensitive', 'shortcoder' ) . '"' ) . ' pattern="[a-zA-z0-9 \-]+" />';
208 echo ( $action == 'edit' ) ? '<div class="copy_shortcode">Your shortcode is - <strong contenteditable>' . self::get_shortcode( $sc_name ) . '</strong></div>' : '';
209 echo ( $action != 'edit' ) ? '<div class="copy_shortcode">' . __( 'Allowed characters A to Z, a to z, 0 to 9, hyphens, underscores and space', 'shortcoder' ) . '</div>' : '';
210 echo '</div></div>';
211
212 echo '<div class="sc_section">';
213 echo '<label for="sc_content">' . __( 'Shortcode content', 'shortcoder' ) . '</label>';
214
215 $editor_type = isset( $g[ 'editor' ] ) ? intval( $g[ 'editor' ] ) : 0;
216
217 if( $editor_type == 2 ){
218 self::load_codemirror_editor( $values[ 'content' ] );
219 }else{
220 wp_editor( $values[ 'content' ], 'sc_content', array( 'wpautop'=> false, 'textarea_rows'=> 15, 'tinymce' => ( $editor_type == 1 ) ) );
221 }
222
223 echo '</div>';
224
225 echo '<p class="sc_note">' . __( 'Note: You can use any HTML, JavaScript, CSS as shortcode content. Shortcoder does not manipulate the shortcode content. What you provide above is what you get as output. Please verify the shortcode content for any syntax or JavaScript errors.', 'shortcoder' ) . '</p>';
226
227 echo '<h4>' . __( 'Settings', 'shortcoder' ) . '</h4>';
228 echo '<div class="sc_section">';
229 echo '<label><input type="checkbox" name="sc_disable" value="1" ' . checked( $values[ 'disabled' ], '1', false ) . '/> ' . __( 'Temporarily disable this shortcode', 'shortcoder' ) . '</label>';
230 echo '<label><input type="checkbox" name="sc_hide_admin" value="1" ' . checked( $values[ 'hide_admin' ], '1', false ) . '/> ' . __( 'Disable this Shortcode for administrators' ) . '</label>';
231 echo '</div>';
232
233 $device_options = array(
234 'all' => __( 'On both desktop and mobile devices', 'shortcoder' ),
235 'mobile_only' => __( 'On mobile devices alone', 'shortcoder' ),
236 'desktop_only' => __( 'On desktops alone', 'shortcoder' )
237 );
238
239 echo '<h4>' . __( 'Visibility', 'shortcoder' ) . '</h4>';
240 echo '<div class="sc_section">';
241 echo '<label>' . __( 'Show this shortcode', 'shortcoder' );
242 echo '<select name="sc_devices">';
243 foreach( $device_options as $id => $name ){
244 echo '<option value="' . $id . '" ' . selected( $values[ 'devices' ], $id ) . '>' . $name . '</option>';
245 }
246 echo '</select></label>';
247 echo '</div>';
248
249 wp_nonce_field( 'sc_edit_nonce' );
250
251 echo '<footer class="page_footer">';
252 echo '<button class="button button-primary">' . $action_btn . '</button>';
253
254 if( $action == 'edit' ){
255 $delete_link = self::get_link(array(
256 'action' => 'sc_admin_ajax',
257 'do' => 'delete',
258 'id' => base64_encode( $sc_name ),
259 '_wpnonce' => wp_create_nonce( 'sc_delete_nonce' )
260 ), 'admin-ajax.php' );
261 echo '<a href="' . $delete_link . '" class="button sc_delete_ep" title="' . __( 'Delete', 'shortcoder' ) . '"><span class="dashicons dashicons-trash"></span></a>';
262 }
263
264 echo '</footer>';
265
266 echo '</form>';
267
268 $sc_wp_params = Shortcoder::wp_params_list();
269
270 echo '<ul class="params_wrap">';
271
272 foreach( $sc_wp_params as $group => $group_info ){
273 echo '<li>' . $group_info[ 'name' ];
274 echo '<ul class="wp_params">';
275 foreach( $group_info[ 'params' ] as $param_id => $param_name ){
276 echo '<li data-id="' . $param_id . '">' . $param_name . '</li>';
277 }
278 echo '</ul></li>';
279 }
280
281 echo '<li>' . __( 'Custom parameter', 'shortcoder' ) . '<ul>';
282 echo '<li class="cp_form"><h4>' . __( 'Enter custom parameter name', 'shortcoder' ) . '</h4>';
283 echo '<input type="text" class="cp_box" pattern="[a-zA-Z0-9]+"/> <button class="button cp_btn">' . __( 'Insert parameter', 'shortcoder' ) . '</button><p class="cp_info"><small>' . __( 'Only alphabets and numbers allowed. Custom parameters are case insensitive', 'shortcoder' ) . '</small></p></li>';
284 echo '</ul></li>';
285 echo '</ul>';
286 }
287
288 public static function save_shortcode(){
289
290 if( $_POST && check_admin_referer( 'sc_edit_nonce' ) ){
291
292 $p = wp_parse_args( self::clean_post(), array(
293 'sc_name' => '',
294 'sc_content' => '',
295 'sc_disable' => 0,
296 'sc_hide_admin' => 0,
297 'sc_devices' => 'all',
298 ));
299
300 if( !trim( $p[ 'sc_name' ] ) ){
301 self::print_notice( 0 );
302 return false;
303 }
304
305 $shortcodes = Shortcoder::list_all();
306 $name = self::clean_name( $p[ 'sc_name' ] );
307 $values = array(
308 'content' => $p[ 'sc_content' ],
309 'disabled' => $p[ 'sc_disable' ],
310 'hide_admin' => $p[ 'sc_hide_admin' ],
311 'devices' => $p[ 'sc_devices' ]
312 );
313
314 if( array_key_exists( $name, $shortcodes ) ){
315 self::print_notice( 2 );
316 }else{
317 self::print_notice( 1 );
318 }
319
320 $shortcodes[ $name ] = $values;
321
322 update_option( 'shortcoder_data', $shortcodes );
323
324 /*
325 wp_safe_redirect( self::get_link( array(
326 'action' => 'edit',
327 'name' => urlencode( $name ),
328 'msg' => ( $todo == 'new' ) ? 1 : 2
329 )));*/
330 }
331
332 }
333
334 public static function delete_shortcode( $name ){
335
336 $shortcodes = Shortcoder::list_all();
337
338 if( array_key_exists( $name, $shortcodes ) ){
339 unset( $shortcodes[ $name ] );
340 update_option( 'shortcoder_data', $shortcodes );
341 return true;
342 }else{
343 return false;
344 }
345
346 }
347
348 public static function get_link( $params = array(), $page = 'options-general.php' ){
349
350 $params[ 'page' ] = 'shortcoder';
351 return add_query_arg( $params, admin_url( $page ) );
352
353 }
354
355 public static function get_shortcode( $name = '' ){
356 return esc_attr( '[sc name="' . $name . '"]' );
357 }
358
359 public static function admin_ajax(){
360
361 $g = self::clean_get();
362
363 if( $g[ 'do' ] == 'delete' && isset( $g[ 'id' ] ) && check_admin_referer( 'sc_delete_nonce' ) ){
364 $sc_name = base64_decode( $g[ 'id' ] );
365 if( self::delete_shortcode( $sc_name ) ){
366 echo 'DELETED';
367 }else{
368 echo 'FAILED';
369 }
370 }
371
372 if( $g[ 'do' ] == 'insert_shortcode' ){
373 include_once( 'sc-insert.php' );
374 }
375
376 die(0);
377 }
378
379 public static function add_qt_button(){
380
381 $screen = get_current_screen();
382 if( self::$pagehook == $screen->id )
383 return;
384
385 echo '
386 <script>
387 window.onload = function(){
388 if( typeof QTags === "function" ){
389 QTags.addButton( "QT_sc_insert", "Shortcoder", sc_show_insert );
390 }
391 }
392 function sc_show_insert(){
393 tb_show( "Insert a Shortcode", "' . admin_url( 'admin-ajax.php?action=sc_admin_ajax&do=insert_shortcode&TB_iframe=true' ) . '" );
394 }
395 </script>';
396 }
397
398 public static function register_mce(){
399 add_filter( 'mce_buttons', array( __class__, 'register_mce_button' ) );
400 add_filter( 'mce_external_plugins', array( __class__, 'register_mce_js' ) );
401 }
402
403 public static function register_mce_button( $buttons ){
404
405 if( self::is_sc_admin() )
406 return $buttons;
407
408 array_push( $buttons, 'separator', 'shortcoder' );
409 return $buttons;
410
411 }
412
413 public static function register_mce_js( $plugins ){
414
415 if( self::is_sc_admin() )
416 return $plugins;
417
418 $plugins[ 'shortcoder' ] = SC_ADMIN_URL . '/js/tinymce/editor_plugin.js';
419 return $plugins;
420
421 }
422
423 public static function load_codemirror_editor( $value ){
424 echo '<link href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.32.0/codemirror.min.css" rel="stylesheet">';
425 echo '<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.32.0/codemirror.min.js"></script>';
426 echo '<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.32.0/mode/htmlmixed/htmlmixed.min.js"></script>';
427 echo '<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.32.0/mode/css/css.min.js"></script>';
428 echo '<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.32.0/mode/xml/xml.min.js"></script>';
429 echo '<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.32.0/mode/javascript/javascript.min.js"></script>';
430
431 echo '<textarea name="sc_content" id="sc_content">' . esc_textarea( $value ) . '</textarea>';
432
433 echo '<script>var sc_cm_editor = true;</script>';
434 }
435
436 public static function page_bottom(){
437
438 echo '<div class="coffee_box">
439 <div class="coffee_amt_wrap">
440 <p><select class="coffee_amt">
441 <option value="2">$2</option>
442 <option value="3">$3</option>
443 <option value="4">$4</option>
444 <option value="5" selected="selected">$5</option>
445 <option value="6">$6</option>
446 <option value="7">$7</option>
447 <option value="8">$8</option>
448 <option value="9">$9</option>
449 <option value="10">$10</option>
450 <option value="11">$11</option>
451 <option value="12">$12</option>
452 <option value="">Custom</option>
453 </select></p>
454 <a class="button button-primary buy_coffee_btn" href="https://www.paypal.me/vaakash/5" data-link="https://www.paypal.me/vaakash/" target="_blank">Buy me a coffee !</a>
455 </div>
456 <h2>Buy me a coffee !</h2>
457 <p>Thank you for using Shortcoder. If you found the plugin useful buy me a coffee ! Your donation will motivate and make me happy for all the efforts. You can donate via PayPal.</p>';
458 echo '</div>';
459
460 echo '<p class="credits_box"><img src="' . SC_ADMIN_URL . '/images/aw.png" /> Created by <a href="https://goo.gl/aHKnsM" target="_blank">Aakash Chakravarthy</a> - Follow me on <a href="https://twitter.com/vaakash" target="_blank">Twitter</a>, <a href="https://fb.com/aakashweb" target="_blank">Facebook</a>, <a href="https://www.linkedin.com/in/vaakash/" target="_blank">LinkedIn</a>. Check out <a href="https://goo.gl/OAxx4l" target="_blank">my other works</a>.
461
462 <a href="https://goo.gl/ltvnIE" class="rate_link" target="_blank">Rate <span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span><span class="dashicons dashicons-star-filled"></span> if you like Shortcoder</a>
463
464 </p>';
465
466 }
467
468 public static function top_sharebar(){
469 echo '
470 <div class="top_sharebar">
471
472 <a href="https://goo.gl/r8Qr7Y" class="help_link" target="_blank" title="Help"><span class="dashicons dashicons-editor-help"></span></a>
473 <a href="https://goo.gl/URfxp2" class="help_link" target="_blank" title="Report issue"><span class="dashicons dashicons-flag"></span></a>
474
475 <a class="share_btn rate_btn" href="https://goo.gl/ltvnIE" target="_blank" title="Please rate 5 stars if you like Shortcoder"><span class="dashicons dashicons-star-filled"></span> Rate 5 stars</a>
476 <a class="share_btn twitter" href="https://twitter.com/intent/tweet?ref_src=twsrc%5Etfw&related=vaakash&text=Check%20out%20Shortcoder,%20a%20%23wordpress%20plugin%20to%20create%20shortcodes%20for%20HTML,%20JavaScript%20snippets%20easily&tw_p=tweetbutton&url=https%3A%2F%2Fwww.aakashweb.com%2Fwordpress-plugins%2Fshortcoder%2F&via=vaakash" target="_blank"><span class="dashicons dashicons-twitter"></span> Tweet about Shortcoder</a>
477
478 </div>';
479 }
480
481 public static function action_links( $links ){
482 array_unshift( $links, '<a href="https://goo.gl/qMF3iE" target="_blank">Donate</a>' );
483 array_unshift( $links, '<a href="'. esc_url( admin_url( 'options-general.php?page=shortcoder' ) ) .'">⚙️ Settings</a>' );
484 return $links;
485 }
486
487 public static function print_notice( $id = '' ){
488
489 $g = self::clean_get();
490 $type = 'success';
491 $msg = '';
492
493 if( $id == '' ){
494 if( !isset( $g[ 'msg' ] ) ){
495 return false;
496 }
497 $id = $g[ 'msg' ];
498 }
499
500 if( $id == 0 ){
501 $msg = __( 'Shortcode name is empty. Cannot save settings !', 'shortcoder' );
502 $type = 'error';
503 }
504
505 if( $id == 1 ){
506 $msg = __( 'Shortcode created successfully', 'shortcoder' );
507 }
508
509 if( $id == 2 ){
510 $msg = __( 'Shortcode updated successfully', 'shortcoder' );
511 }
512
513 if( $id == 3 ){
514 $msg = __( 'Shortcode deleted successfully', 'shortcoder' );
515 }
516
517 if( $msg != '' ){
518 echo '<div class="notice notice-' . $type . ' is-dismissible"><p>' . $msg . '</p></div>';
519 }
520 }
521
522 public static function clean_name( $name = '' ){
523
524 return trim( preg_replace('/[^0-9a-zA-Z\- _]/', '', $name ) );
525
526 }
527
528 public static function clean_get(){
529
530 foreach( $_GET as $k=>$v ){
531 $_GET[$k] = sanitize_text_field( $v );
532 }
533
534 return $_GET;
535 }
536
537 public static function clean_post(){
538
539 return stripslashes_deep( $_POST );
540
541 }
542
543 public static function is_sc_admin(){
544
545 if( !function_exists( 'get_current_screen' ) )
546 return false;
547
548 $screen = get_current_screen();
549 if( self::$pagehook == $screen->id ){
550 return true;
551 }else{
552 return false;
553 }
554
555 }
556
557 }
558
559 Shortcoder_Admin::init();
560
561 ?>