From 0243dabe20e024ea29f669eccdc61952ed6ae5aa Mon Sep 17 00:00:00 2001 From: chicpro Date: Mon, 9 Jun 2014 14:00:04 +0900 Subject: [PATCH 001/269] first commit --- README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 000000000..e69de29bb From 7983affa68bdcc6c05bf8953ec90aa201ebec5ee Mon Sep 17 00:00:00 2001 From: chicpro Date: Mon, 9 Jun 2014 14:48:44 +0900 Subject: [PATCH 002/269] =?UTF-8?q?=EA=B7=B8=EB=88=84=EB=B3=B4=EB=93=9C5?= =?UTF-8?q?=20=EC=A0=95=EC=8B=9D=EB=B2=84=EC=A0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 12 + LICENSE.txt | 208 + _common.php | 3 + _head.php | 5 + _tail.php | 5 + adm/_common.php | 5 + adm/admin.head.php | 140 + adm/admin.js | 74 + adm/admin.lib.php | 252 + adm/admin.menu100.php | 16 + adm/admin.menu200.php | 12 + adm/admin.menu300.php | 12 + adm/admin.menu900.php | 16 + adm/admin.tail.php | 130 + adm/auth_list.php | 254 + adm/auth_list_delete.php | 27 + adm/auth_update.php | 30 + adm/board_copy.php | 70 + adm/board_copy_update.php | 201 + adm/board_delete.inc.php | 37 + adm/board_form.php | 1288 ++ adm/board_form_update.php | 393 + adm/board_list.php | 240 + adm/board_list_update.php | 72 + adm/board_thumbnail_delete.php | 52 + adm/boardgroup_form.php | 151 + adm/boardgroup_form_update.php | 73 + adm/boardgroup_list.php | 217 + adm/boardgroup_list_update.php | 46 + adm/boardgroupmember_form.php | 130 + adm/boardgroupmember_list.php | 158 + adm/boardgroupmember_update.php | 70 + adm/cache_file_delete.php | 48 + adm/captcha_file_delete.php | 53 + adm/config_form.php | 1281 ++ adm/config_form_update.php | 157 + adm/contentform.php | 179 + adm/contentformupdate.php | 78 + adm/contentlist.php | 98 + adm/css/admin.css | 689 + adm/faqform.php | 99 + adm/faqformupdate.php | 43 + adm/faqlist.php | 95 + adm/faqmasterform.php | 161 + adm/faqmasterformupdate.php | 72 + adm/faqmasterlist.php | 128 + adm/img/hd_bg.jpg | Bin 0 -> 8188 bytes adm/img/logo.jpg | Bin 0 -> 6018 bytes adm/img/sub_menu_ico.gif | Bin 0 -> 87 bytes adm/img/ts01.gif | Bin 0 -> 177 bytes adm/img/ts02.gif | Bin 0 -> 188 bytes adm/img/ts03.gif | Bin 0 -> 196 bytes adm/index.php | 312 + adm/mail_delete.php | 24 + adm/mail_form.php | 86 + adm/mail_list.php | 109 + adm/mail_preview.php | 34 + adm/mail_select_form.php | 122 + adm/mail_select_list.php | 123 + adm/mail_select_update.php | 87 + adm/mail_test.php | 39 + adm/mail_update.php | 39 + adm/member_delete.php | 29 + adm/member_form.php | 366 + adm/member_form_update.php | 162 + adm/member_list.php | 307 + adm/member_list_delete.php | 37 + adm/member_list_update.php | 76 + adm/menu_form.php | 151 + adm/menu_form_search.php | 111 + adm/menu_list.php | 204 + adm/menu_list_update.php | 70 + adm/newwinform.php | 147 + adm/newwinformupdate.php | 51 + adm/newwinlist.php | 118 + adm/phpinfo.php | 10 + adm/point_clear.php | 64 + adm/point_list.php | 265 + adm/point_list_delete.php | 59 + adm/point_update.php | 25 + adm/poll_delete.php | 27 + adm/poll_form.php | 115 + adm/poll_form_update.php | 70 + adm/poll_list.php | 163 + adm/popular_list.php | 171 + adm/popular_rank.php | 112 + adm/qa_config.php | 335 + adm/qa_config_update.php | 51 + adm/sendmail_test.php | 65 + adm/session_file_delete.php | 61 + adm/sms_admin/_common.php | 15 + adm/sms_admin/ajax.hp_chk.php | 51 + adm/sms_admin/ajax.sms_write_form.php | 83 + adm/sms_admin/ajax.sms_write_group.php | 43 + adm/sms_admin/ajax.sms_write_level.php | 57 + adm/sms_admin/ajax.sms_write_person.php | 166 + adm/sms_admin/config.php | 172 + adm/sms_admin/config_update.php | 49 + adm/sms_admin/css/sms5.css | 140 + adm/sms_admin/emoticon_move.php | 114 + adm/sms_admin/emoticon_move_update.php | 60 + adm/sms_admin/form_group.php | 177 + adm/sms_admin/form_group_move.php | 30 + adm/sms_admin/form_group_update.php | 92 + adm/sms_admin/form_list.php | 238 + adm/sms_admin/form_multi_update.php | 27 + adm/sms_admin/form_update.php | 78 + adm/sms_admin/form_write.php | 233 + adm/sms_admin/history_list.php | 98 + adm/sms_admin/history_member.php | 90 + adm/sms_admin/history_num.php | 107 + adm/sms_admin/history_send.php | 138 + adm/sms_admin/history_view.php | 246 + adm/sms_admin/img/ajax-loader.gif | Bin 0 -> 1924 bytes adm/sms_admin/img/ajax-loader2.gif | Bin 0 -> 7825 bytes adm/sms_admin/img/box_ico.gif | Bin 0 -> 60 bytes adm/sms_admin/img/scemo_ico.gif | Bin 0 -> 67 bytes adm/sms_admin/install.php | 86 + adm/sms_admin/member_update.php | 63 + adm/sms_admin/member_update_run.php | 122 + adm/sms_admin/num_book.php | 263 + adm/sms_admin/num_book_file.php | 158 + adm/sms_admin/num_book_file_download.php | 67 + adm/sms_admin/num_book_file_upload.php | 166 + adm/sms_admin/num_book_move.php | 128 + adm/sms_admin/num_book_multi_update.php | 63 + adm/sms_admin/num_book_update.php | 137 + adm/sms_admin/num_book_write.php | 216 + adm/sms_admin/num_group.php | 186 + adm/sms_admin/num_group_move.php | 14 + adm/sms_admin/num_group_update.php | 77 + adm/sms_admin/number_move_update.php | 84 + adm/sms_admin/sms5.sql | 188 + adm/sms_admin/sms_ing.php | 22 + adm/sms_admin/sms_write.php | 791 + adm/sms_admin/sms_write_form.php | 132 + adm/sms_admin/sms_write_overlap_check.php | 69 + adm/sms_admin/sms_write_send.php | 233 + adm/sql_write.sql | 44 + adm/thumbnail_file_delete.php | 68 + adm/visit.sub.php | 50 + adm/visit_browser.php | 95 + adm/visit_date.php | 85 + adm/visit_delete.php | 95 + adm/visit_delete_update.php | 60 + adm/visit_domain.php | 104 + adm/visit_hour.php | 82 + adm/visit_list.php | 109 + adm/visit_month.php | 89 + adm/visit_os.php | 99 + adm/visit_search.php | 143 + adm/visit_week.php | 81 + adm/visit_year.php | 86 + bbs/_common.php | 3 + bbs/_head.php | 4 + bbs/_head.sub.php | 4 + bbs/_tail.php | 4 + bbs/_tail.sub.php | 4 + bbs/ajax.autosave.php | 20 + bbs/ajax.autosavedel.php | 15 + bbs/ajax.autosavelist.php | 21 + bbs/ajax.autosaveload.php | 18 + bbs/ajax.filter.php | 31 + bbs/ajax.mb_email.php | 12 + bbs/ajax.mb_hp.php | 10 + bbs/ajax.mb_id.php | 12 + bbs/ajax.mb_nick.php | 12 + bbs/ajax.mb_recommend.php | 13 + bbs/alert.php | 107 + bbs/alert_close.php | 61 + bbs/board.php | 242 + bbs/board_head.php | 13 + bbs/board_list_update.php | 21 + bbs/board_tail.php | 13 + bbs/confirm.php | 35 + bbs/content.php | 99 + bbs/current_connect.php | 32 + bbs/db_table.optimize.php | 57 + bbs/delete.php | 142 + bbs/delete_all.php | 158 + bbs/delete_comment.php | 88 + bbs/download.php | 121 + bbs/email_certify.php | 21 + bbs/email_stop.php | 19 + bbs/faq.php | 104 + bbs/formmail.php | 43 + bbs/formmail_send.php | 51 + bbs/good.php | 155 + bbs/group.php | 49 + bbs/link.php | 27 + bbs/list.php | 232 + bbs/login.php | 35 + bbs/login_check.php | 87 + bbs/logout.php | 27 + bbs/member_confirm.php | 29 + bbs/member_leave.php | 25 + bbs/memo.php | 74 + bbs/memo_delete.php | 27 + bbs/memo_form.php | 42 + bbs/memo_form_update.php | 81 + bbs/memo_view.php | 71 + bbs/move.php | 159 + bbs/move_update.php | 219 + bbs/new.php | 112 + bbs/new_delete.php | 147 + bbs/newwin.inc.php | 56 + bbs/password.php | 53 + bbs/password_check.php | 22 + bbs/password_lost.php | 16 + bbs/password_lost2.php | 72 + bbs/password_lost_certify.php | 27 + bbs/point.php | 27 + bbs/poll_etc_update.php | 55 + bbs/poll_etc_update_mail.php | 30 + bbs/poll_result.php | 102 + bbs/poll_update.php | 60 + bbs/profile.php | 33 + bbs/qadelete.php | 68 + bbs/qadownload.php | 70 + bbs/qahead.php | 18 + bbs/qalist.php | 122 + bbs/qatail.php | 15 + bbs/qaview.php | 175 + bbs/qawrite.php | 139 + bbs/qawrite_update.php | 352 + bbs/register.php | 19 + bbs/register_email.php | 51 + bbs/register_email_update.php | 44 + bbs/register_form.php | 121 + bbs/register_form_update.php | 401 + bbs/register_form_update_mail1.php | 39 + bbs/register_form_update_mail2.php | 35 + bbs/register_form_update_mail3.php | 39 + bbs/register_result.php | 15 + bbs/rss.php | 90 + bbs/scrap.php | 60 + bbs/scrap_delete.php | 11 + bbs/scrap_popin.php | 59 + bbs/scrap_popin_update.php | 104 + bbs/search.php | 237 + bbs/sns_send.php | 21 + bbs/view.php | 146 + bbs/view_comment.php | 120 + bbs/view_image.php | 110 + bbs/visit_insert.inc.php | 63 + bbs/write.php | 417 + bbs/write_comment_update.php | 332 + bbs/write_comment_update.sns.php | 72 + bbs/write_update.php | 638 + bbs/write_update_mail.php | 30 + bbs/zip.php | 73 + common.php | 509 + config.php | 182 + css/default.css | 289 + css/images/ajax-loader.gif | Bin 0 -> 7825 bytes css/images/icons-18-black.png | Bin 0 -> 58254 bytes css/images/icons-18-white.png | Bin 0 -> 58717 bytes css/images/icons-36-black.png | Bin 0 -> 66332 bytes css/images/icons-36-white.png | Bin 0 -> 66763 bytes css/mobile.css | 257 + extend/.htaccess | 1 + extend/sms5.extend.php | 57 + g4_import.php | 176 + g4_import_run.php | 528 + head.php | 167 + head.sub.php | 104 + img/btn_search.jpg | Bin 0 -> 782 bytes img/ft.png | Bin 0 -> 3204 bytes img/gnb_bg00.gif | Bin 0 -> 54 bytes img/gnb_bg01.gif | Bin 0 -> 54 bytes img/logo.jpg | Bin 0 -> 3441 bytes img/ts01.gif | Bin 0 -> 138 bytes img/ts02.gif | Bin 0 -> 148 bytes img/ts03.gif | Bin 0 -> 154 bytes img/wrest.gif | Bin 0 -> 51 bytes index.php | 50 + install/gnuboard5.sql | 879 + install/img/mooning.png | Bin 0 -> 63654 bytes install/img/pat01.png | Bin 0 -> 32481 bytes install/img/ricepaper_v3.png | Bin 0 -> 33222 bytes install/index.php | 52 + install/install.css | 39 + install/install.inc.php | 96 + install/install.inc2.php | 7 + install/install_config.php | 154 + install/install_db.php | 304 + install/library.check.php | 9 + js/autosave.js | 103 + js/certify.js | 55 + js/common.js | 555 + js/html5.js | 3 + js/jquery-1.8.3.min.js | 2 + js/jquery.fancylist.js | 65 + js/jquery.menu.js | 109 + js/jquery.register_form.js | 92 + js/jquery.sms_paging.js | 93 + js/md5.js | 165 + js/modernizr.custom.70111.js | 4 + js/viewimageresize.js | 93 + js/wrest.js | 370 + js/zip.js | 101 + lib/Excel/itemexcel.xls | Bin 0 -> 33792 bytes lib/Excel/oleread.inc | 271 + .../class.writeexcel_biffwriter.inc.php | 209 + .../class.writeexcel_format.inc.php | 695 + .../class.writeexcel_formula.inc.php | 1610 ++ .../class.writeexcel_olewriter.inc.php | 353 + .../class.writeexcel_workbook.inc.php | 1149 + .../class.writeexcel_workbookbig.inc.php | 55 + .../class.writeexcel_worksheet.inc.php | 2968 +++ lib/Excel/reader.php | 1084 + lib/common.lib.php | 2713 +++ lib/connect.lib.php | 28 + lib/editor.lib.php | 27 + lib/icode.sms.lib.php | 146 + lib/latest.lib.php | 78 + lib/mailer.lib.php | 409 + lib/mobile.lib.php | 145 + lib/outlogin.lib.php | 50 + lib/poll.lib.php | 34 + lib/popular.lib.php | 37 + lib/register.lib.php | 181 + lib/thumbnail.lib.php | 562 + lib/visit.lib.php | 86 + mobile/_head.php | 5 + mobile/_tail.php | 5 + mobile/content.php | 64 + mobile/group.php | 35 + mobile/head.php | 177 + mobile/index.php | 30 + mobile/newwin.inc.php | 55 + mobile/skin/board/basic/img/icon_file.gif | Bin 0 -> 107 bytes mobile/skin/board/basic/img/icon_hot.gif | Bin 0 -> 97 bytes mobile/skin/board/basic/img/icon_img.gif | Bin 0 -> 145 bytes mobile/skin/board/basic/img/icon_link.gif | Bin 0 -> 104 bytes mobile/skin/board/basic/img/icon_mobile.gif | Bin 0 -> 62 bytes mobile/skin/board/basic/img/icon_movie.gif | Bin 0 -> 110 bytes mobile/skin/board/basic/img/icon_new.gif | Bin 0 -> 71 bytes mobile/skin/board/basic/img/icon_reply.gif | Bin 0 -> 77 bytes mobile/skin/board/basic/img/icon_secret.gif | Bin 0 -> 97 bytes mobile/skin/board/basic/img/icon_sound.gif | Bin 0 -> 113 bytes mobile/skin/board/basic/list.skin.php | 224 + mobile/skin/board/basic/style.css | 237 + mobile/skin/board/basic/view.skin.php | 270 + mobile/skin/board/basic/view_comment.skin.php | 302 + mobile/skin/board/basic/write.skin.php | 252 + mobile/skin/board/gallery/img/icon_file.gif | Bin 0 -> 107 bytes mobile/skin/board/gallery/img/icon_hot.gif | Bin 0 -> 97 bytes mobile/skin/board/gallery/img/icon_img.gif | Bin 0 -> 145 bytes mobile/skin/board/gallery/img/icon_link.gif | Bin 0 -> 104 bytes mobile/skin/board/gallery/img/icon_mobile.gif | Bin 0 -> 62 bytes mobile/skin/board/gallery/img/icon_movie.gif | Bin 0 -> 110 bytes mobile/skin/board/gallery/img/icon_new.gif | Bin 0 -> 71 bytes mobile/skin/board/gallery/img/icon_reply.gif | Bin 0 -> 77 bytes mobile/skin/board/gallery/img/icon_secret.gif | Bin 0 -> 97 bytes mobile/skin/board/gallery/img/icon_sound.gif | Bin 0 -> 113 bytes mobile/skin/board/gallery/list.skin.php | 249 + mobile/skin/board/gallery/style.css | 224 + mobile/skin/board/gallery/view.skin.php | 270 + .../skin/board/gallery/view_comment.skin.php | 302 + mobile/skin/board/gallery/write.skin.php | 251 + mobile/skin/connect/basic/connect.skin.php | 9 + .../connect/basic/current_connect.skin.php | 38 + mobile/skin/connect/basic/style.css | 9 + mobile/skin/faq/basic/list.skin.php | 120 + mobile/skin/faq/basic/style.css | 25 + mobile/skin/latest/basic/img/icon_file.gif | Bin 0 -> 107 bytes mobile/skin/latest/basic/img/icon_hot.gif | Bin 0 -> 97 bytes mobile/skin/latest/basic/img/icon_img.gif | Bin 0 -> 145 bytes mobile/skin/latest/basic/img/icon_link.gif | Bin 0 -> 104 bytes mobile/skin/latest/basic/img/icon_mobile.gif | Bin 0 -> 62 bytes mobile/skin/latest/basic/img/icon_more.gif | Bin 0 -> 169 bytes mobile/skin/latest/basic/img/icon_movie.gif | Bin 0 -> 110 bytes mobile/skin/latest/basic/img/icon_new.gif | Bin 0 -> 71 bytes mobile/skin/latest/basic/img/icon_reply.gif | Bin 0 -> 77 bytes mobile/skin/latest/basic/img/icon_secret.gif | Bin 0 -> 97 bytes mobile/skin/latest/basic/img/icon_sound.gif | Bin 0 -> 113 bytes mobile/skin/latest/basic/latest.skin.php | 43 + mobile/skin/latest/basic/style.css | 10 + mobile/skin/member/basic/formmail.skin.php | 96 + mobile/skin/member/basic/img/zip_ico_up.gif | Bin 0 -> 54 bytes mobile/skin/member/basic/login.skin.php | 59 + mobile/skin/member/basic/login_check.skin.php | 5 + .../skin/member/basic/member_confirm.skin.php | 42 + mobile/skin/member/basic/memo.skin.php | 40 + mobile/skin/member/basic/memo_form.skin.php | 57 + mobile/skin/member/basic/memo_view.skin.php | 56 + mobile/skin/member/basic/password.skin.php | 47 + .../skin/member/basic/password_lost.skin.php | 46 + mobile/skin/member/basic/point.skin.php | 81 + mobile/skin/member/basic/profile.skin.php | 48 + mobile/skin/member/basic/register.skin.php | 57 + .../skin/member/basic/register_form.skin.php | 445 + .../member/basic/register_result.skin.php | 44 + mobile/skin/member/basic/scrap.skin.php | 27 + mobile/skin/member/basic/scrap_popin.skin.php | 39 + mobile/skin/member/basic/style.css | 211 + mobile/skin/member/basic/zip.skin.php | 162 + mobile/skin/new/basic/new.skin.php | 66 + mobile/skin/new/basic/style.css | 9 + .../skin/outlogin/basic/outlogin.skin.1.php | 63 + .../skin/outlogin/basic/outlogin.skin.2.php | 46 + mobile/skin/outlogin/basic/style.css | 29 + mobile/skin/poll/basic/poll.skin.php | 65 + mobile/skin/poll/basic/poll_result.skin.php | 120 + mobile/skin/poll/basic/style.css | 86 + mobile/skin/popular/basic/popular.skin.php | 17 + mobile/skin/popular/basic/style.css | 11 + mobile/skin/qa/basic/img/btn_close.gif | Bin 0 -> 211 bytes mobile/skin/qa/basic/img/icon_answer.gif | Bin 0 -> 77 bytes mobile/skin/qa/basic/img/icon_file.gif | Bin 0 -> 107 bytes mobile/skin/qa/basic/img/icon_hot.gif | Bin 0 -> 97 bytes mobile/skin/qa/basic/img/icon_img.gif | Bin 0 -> 145 bytes mobile/skin/qa/basic/img/icon_link.gif | Bin 0 -> 104 bytes mobile/skin/qa/basic/img/icon_mobile.gif | Bin 0 -> 62 bytes mobile/skin/qa/basic/img/icon_movie.gif | Bin 0 -> 110 bytes mobile/skin/qa/basic/img/icon_new.gif | Bin 0 -> 71 bytes mobile/skin/qa/basic/img/icon_secret.gif | Bin 0 -> 97 bytes mobile/skin/qa/basic/img/icon_sound.gif | Bin 0 -> 113 bytes mobile/skin/qa/basic/list.skin.php | 152 + mobile/skin/qa/basic/style.css | 247 + mobile/skin/qa/basic/view.answer.skin.php | 24 + mobile/skin/qa/basic/view.answerform.skin.php | 125 + mobile/skin/qa/basic/view.skin.php | 187 + mobile/skin/qa/basic/write.skin.php | 184 + mobile/skin/search/basic/search.skin.php | 139 + mobile/skin/search/basic/style.css | 33 + mobile/skin/visit/basic/style.css | 11 + mobile/skin/visit/basic/visit.skin.php | 25 + mobile/tail.php | 56 + plugin/PHPMailer_v2.0.4/ChangeLog.txt | 302 + plugin/PHPMailer_v2.0.4/LICENSE | 504 + plugin/PHPMailer_v2.0.4/README | 174 + plugin/PHPMailer_v2.0.4/class.phpmailer.php | 1911 ++ plugin/PHPMailer_v2.0.4/class.pop3.php | 436 + plugin/PHPMailer_v2.0.4/class.smtp.php | 1062 + plugin/PHPMailer_v2.0.4/codeworxtech.html | 121 + plugin/PHPMailer_v2.0.4/docs/extending.html | 148 + plugin/PHPMailer_v2.0.4/docs/faq.html | 67 + plugin/PHPMailer_v2.0.4/docs/phpmailer_sm.gif | Bin 0 -> 204 bytes plugin/PHPMailer_v2.0.4/docs/pop3_article.txt | 39 + plugin/PHPMailer_v2.0.4/docs/use_gmail.txt | 45 + .../PHPMailer_v2.0.4/examples/contents.html | 12 + .../examples/images/bkgrnd.gif | Bin 0 -> 49 bytes .../examples/images/phpmailer.gif | Bin 0 -> 4756 bytes .../examples/images/phpmailer.png | Bin 0 -> 3506 bytes .../examples/images/phpmailer_mini.gif | Bin 0 -> 1042 bytes plugin/PHPMailer_v2.0.4/examples/index.html | 73 + .../examples/pop3_before_smtp_test.php | 39 + .../PHPMailer_v2.0.4/examples/test_gmail.php | 45 + .../PHPMailer_v2.0.4/examples/test_mail.php | 29 + .../examples/test_sendmail.php | 30 + .../PHPMailer_v2.0.4/examples/test_smtp.php | 33 + .../language/phpmailer.lang-ar.php | 26 + .../language/phpmailer.lang-br.php | 23 + .../language/phpmailer.lang-ca.php | 24 + .../language/phpmailer.lang-ch.php | 24 + .../language/phpmailer.lang-cz.php | 23 + .../language/phpmailer.lang-de.php | 24 + .../language/phpmailer.lang-dk.php | 23 + .../language/phpmailer.lang-en.php | 23 + .../language/phpmailer.lang-es.php | 23 + .../language/phpmailer.lang-et.php | 24 + .../language/phpmailer.lang-fi.php | 24 + .../language/phpmailer.lang-fo.php | 25 + .../language/phpmailer.lang-fr.php | 23 + .../language/phpmailer.lang-hu.php | 23 + .../language/phpmailer.lang-it.php | 26 + .../language/phpmailer.lang-ja.php | 24 + .../language/phpmailer.lang-nl.php | 23 + .../language/phpmailer.lang-no.php | 23 + .../language/phpmailer.lang-pl.php | 23 + .../language/phpmailer.lang-ro.php | 24 + .../language/phpmailer.lang-ru.php | 23 + .../language/phpmailer.lang-se.php | 23 + .../language/phpmailer.lang-tr.php | 24 + .../language/phpmailer.lang-zh.php | 23 + .../language/phpmailer.lang-zh_cn.php | 24 + .../phpdocs/PHPMailer/PHPMailer.html | 2042 ++ .../phpdocs/PHPMailer/POP3.html | 649 + .../phpdocs/PHPMailer/SMTP.html | 755 + ..._PHPMailer_v2.0.4_class_phpmailer_php.html | 63 + ...2.0.4_PHPMailer_v2.0.4_class_pop3_php.html | 63 + ...2.0.4_PHPMailer_v2.0.4_class_smtp_php.html | 63 + ...source_PHPMailer__class.phpmailer.php.html | 1951 ++ .../fsource_PHPMailer__class.pop3.php.html | 460 + .../fsource_PHPMailer__class.smtp.php.html | 1092 + plugin/PHPMailer_v2.0.4/phpdocs/blank.html | 13 + .../phpdocs/classtrees_PHPMailer.html | 32 + .../phpdocs/elementindex.html | 1049 + .../phpdocs/elementindex_PHPMailer.html | 1046 + plugin/PHPMailer_v2.0.4/phpdocs/index.html | 24 + .../phpdocs/li_PHPMailer.html | 38 + .../PHPMailer_v2.0.4/phpdocs/media/banner.css | 32 + .../phpdocs/media/stylesheet.css | 144 + plugin/PHPMailer_v2.0.4/phpdocs/packages.html | 27 + plugin/editor/ckeditor4/CHANGES.md | 12 + plugin/editor/ckeditor4/LICENSE.md | 1264 ++ plugin/editor/ckeditor4/README.md | 39 + plugin/editor/ckeditor4/build-config.js | 158 + plugin/editor/ckeditor4/ckeditor.js | 890 + plugin/editor/ckeditor4/config.js | 173 + plugin/editor/ckeditor4/contents.css | 93 + plugin/editor/ckeditor4/editor.lib.php | 67 + plugin/editor/ckeditor4/lang/af.js | 5 + plugin/editor/ckeditor4/lang/ar.js | 5 + plugin/editor/ckeditor4/lang/bg.js | 5 + plugin/editor/ckeditor4/lang/bn.js | 5 + plugin/editor/ckeditor4/lang/bs.js | 5 + plugin/editor/ckeditor4/lang/ca.js | 5 + plugin/editor/ckeditor4/lang/cs.js | 5 + plugin/editor/ckeditor4/lang/cy.js | 5 + plugin/editor/ckeditor4/lang/da.js | 5 + plugin/editor/ckeditor4/lang/de.js | 5 + plugin/editor/ckeditor4/lang/el.js | 5 + plugin/editor/ckeditor4/lang/en-au.js | 5 + plugin/editor/ckeditor4/lang/en-ca.js | 5 + plugin/editor/ckeditor4/lang/en-gb.js | 5 + plugin/editor/ckeditor4/lang/en.js | 5 + plugin/editor/ckeditor4/lang/eo.js | 5 + plugin/editor/ckeditor4/lang/es.js | 5 + plugin/editor/ckeditor4/lang/et.js | 5 + plugin/editor/ckeditor4/lang/eu.js | 5 + plugin/editor/ckeditor4/lang/fa.js | 5 + plugin/editor/ckeditor4/lang/fi.js | 5 + plugin/editor/ckeditor4/lang/fo.js | 5 + plugin/editor/ckeditor4/lang/fr-ca.js | 5 + plugin/editor/ckeditor4/lang/fr.js | 5 + plugin/editor/ckeditor4/lang/gl.js | 5 + plugin/editor/ckeditor4/lang/gu.js | 5 + plugin/editor/ckeditor4/lang/he.js | 5 + plugin/editor/ckeditor4/lang/hi.js | 5 + plugin/editor/ckeditor4/lang/hr.js | 5 + plugin/editor/ckeditor4/lang/hu.js | 5 + plugin/editor/ckeditor4/lang/is.js | 5 + plugin/editor/ckeditor4/lang/it.js | 5 + plugin/editor/ckeditor4/lang/ja.js | 5 + plugin/editor/ckeditor4/lang/ka.js | 5 + plugin/editor/ckeditor4/lang/km.js | 5 + plugin/editor/ckeditor4/lang/ko.js | 5 + plugin/editor/ckeditor4/lang/ku.js | 5 + plugin/editor/ckeditor4/lang/lt.js | 5 + plugin/editor/ckeditor4/lang/lv.js | 5 + plugin/editor/ckeditor4/lang/mk.js | 5 + plugin/editor/ckeditor4/lang/mn.js | 5 + plugin/editor/ckeditor4/lang/ms.js | 5 + plugin/editor/ckeditor4/lang/nb.js | 5 + plugin/editor/ckeditor4/lang/nl.js | 5 + plugin/editor/ckeditor4/lang/no.js | 5 + plugin/editor/ckeditor4/lang/pl.js | 5 + plugin/editor/ckeditor4/lang/pt-br.js | 5 + plugin/editor/ckeditor4/lang/pt.js | 5 + plugin/editor/ckeditor4/lang/ro.js | 5 + plugin/editor/ckeditor4/lang/ru.js | 5 + plugin/editor/ckeditor4/lang/sk.js | 5 + plugin/editor/ckeditor4/lang/sl.js | 5 + plugin/editor/ckeditor4/lang/sr-latn.js | 5 + plugin/editor/ckeditor4/lang/sr.js | 5 + plugin/editor/ckeditor4/lang/sv.js | 5 + plugin/editor/ckeditor4/lang/th.js | 5 + plugin/editor/ckeditor4/lang/tr.js | 5 + plugin/editor/ckeditor4/lang/ug.js | 5 + plugin/editor/ckeditor4/lang/uk.js | 5 + plugin/editor/ckeditor4/lang/vi.js | 5 + plugin/editor/ckeditor4/lang/zh-cn.js | 5 + plugin/editor/ckeditor4/lang/zh.js | 5 + .../plugins/a11yhelp/dialogs/a11yhelp.js | 10 + .../dialogs/lang/_translationstatus.txt | 25 + .../plugins/a11yhelp/dialogs/lang/ar.js | 8 + .../plugins/a11yhelp/dialogs/lang/bg.js | 8 + .../plugins/a11yhelp/dialogs/lang/ca.js | 8 + .../plugins/a11yhelp/dialogs/lang/cs.js | 9 + .../plugins/a11yhelp/dialogs/lang/cy.js | 8 + .../plugins/a11yhelp/dialogs/lang/da.js | 8 + .../plugins/a11yhelp/dialogs/lang/de.js | 9 + .../plugins/a11yhelp/dialogs/lang/el.js | 9 + .../plugins/a11yhelp/dialogs/lang/en.js | 8 + .../plugins/a11yhelp/dialogs/lang/eo.js | 9 + .../plugins/a11yhelp/dialogs/lang/et.js | 8 + .../plugins/a11yhelp/dialogs/lang/fa.js | 8 + .../plugins/a11yhelp/dialogs/lang/fi.js | 9 + .../plugins/a11yhelp/dialogs/lang/fr.js | 9 + .../plugins/a11yhelp/dialogs/lang/gu.js | 8 + .../plugins/a11yhelp/dialogs/lang/he.js | 8 + .../plugins/a11yhelp/dialogs/lang/hi.js | 8 + .../plugins/a11yhelp/dialogs/lang/hr.js | 8 + .../plugins/a11yhelp/dialogs/lang/hu.js | 8 + .../plugins/a11yhelp/dialogs/lang/it.js | 9 + .../plugins/a11yhelp/dialogs/lang/ku.js | 9 + .../plugins/a11yhelp/dialogs/lang/lt.js | 8 + .../plugins/a11yhelp/dialogs/lang/lv.js | 9 + .../plugins/a11yhelp/dialogs/lang/mk.js | 8 + .../plugins/a11yhelp/dialogs/lang/mn.js | 8 + .../plugins/a11yhelp/dialogs/lang/nb.js | 8 + .../plugins/a11yhelp/dialogs/lang/nl.js | 9 + .../plugins/a11yhelp/dialogs/lang/no.js | 8 + .../plugins/a11yhelp/dialogs/lang/pl.js | 8 + .../plugins/a11yhelp/dialogs/lang/pt-br.js | 8 + .../plugins/a11yhelp/dialogs/lang/pt.js | 8 + .../plugins/a11yhelp/dialogs/lang/ro.js | 8 + .../plugins/a11yhelp/dialogs/lang/ru.js | 8 + .../plugins/a11yhelp/dialogs/lang/sk.js | 9 + .../plugins/a11yhelp/dialogs/lang/sl.js | 8 + .../plugins/a11yhelp/dialogs/lang/tr.js | 9 + .../plugins/a11yhelp/dialogs/lang/ug.js | 8 + .../plugins/a11yhelp/dialogs/lang/uk.js | 8 + .../plugins/a11yhelp/dialogs/lang/vi.js | 8 + .../plugins/a11yhelp/dialogs/lang/zh-cn.js | 7 + .../ckeditor4/plugins/about/dialogs/about.js | 6 + .../plugins/about/dialogs/logo_ckeditor.png | Bin 0 -> 2759 bytes .../plugins/clipboard/dialogs/paste.js | 11 + .../colordialog/dialogs/colordialog.js | 13 + .../plugins/dialog/dialogDefinition.js | 4 + .../ckeditor4/plugins/div/dialogs/div.js | 9 + .../plugins/fakeobjects/images/spacer.gif | Bin 0 -> 43 bytes .../ckeditor4/plugins/find/dialogs/find.js | 24 + .../ckeditor4/plugins/flash/dialogs/flash.js | 23 + .../plugins/flash/images/placeholder.png | Bin 0 -> 256 bytes .../ckeditor4/plugins/forms/dialogs/button.js | 8 + .../plugins/forms/dialogs/checkbox.js | 8 + .../ckeditor4/plugins/forms/dialogs/form.js | 8 + .../plugins/forms/dialogs/hiddenfield.js | 8 + .../ckeditor4/plugins/forms/dialogs/radio.js | 8 + .../ckeditor4/plugins/forms/dialogs/select.js | 20 + .../plugins/forms/dialogs/textarea.js | 8 + .../plugins/forms/dialogs/textfield.js | 10 + .../plugins/forms/images/hiddenfield.gif | Bin 0 -> 105 bytes plugin/editor/ckeditor4/plugins/icons.png | Bin 0 -> 20831 bytes .../plugins/iframe/dialogs/iframe.js | 10 + .../plugins/iframe/images/placeholder.png | Bin 0 -> 449 bytes .../ckeditor4/plugins/image/dialogs/image.js | 41 + .../plugins/image/images/noimage.png | Bin 0 -> 2115 bytes .../ckeditor4/plugins/link/dialogs/anchor.js | 8 + .../ckeditor4/plugins/link/dialogs/link.js | 36 + .../ckeditor4/plugins/link/images/anchor.png | Bin 0 -> 566 bytes .../plugins/liststyle/dialogs/liststyle.js | 10 + .../plugins/magicline/images/icon.png | Bin 0 -> 172 bytes .../plugins/pagebreak/images/pagebreak.gif | Bin 0 -> 54 bytes .../plugins/pastefromword/filter/default.js | 30 + .../ckeditor4/plugins/preview/preview.html | 10 + .../showblocks/images/block_address.png | Bin 0 -> 171 bytes .../showblocks/images/block_blockquote.png | Bin 0 -> 181 bytes .../plugins/showblocks/images/block_div.png | Bin 0 -> 136 bytes .../plugins/showblocks/images/block_h1.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h2.png | Bin 0 -> 134 bytes .../plugins/showblocks/images/block_h3.png | Bin 0 -> 131 bytes .../plugins/showblocks/images/block_h4.png | Bin 0 -> 133 bytes .../plugins/showblocks/images/block_h5.png | Bin 0 -> 133 bytes .../plugins/showblocks/images/block_h6.png | Bin 0 -> 129 bytes .../plugins/showblocks/images/block_p.png | Bin 0 -> 119 bytes .../plugins/showblocks/images/block_pre.png | Bin 0 -> 136 bytes .../plugins/smiley/dialogs/smiley.js | 10 + .../plugins/smiley/images/angel_smile.gif | Bin 0 -> 465 bytes .../plugins/smiley/images/angry_smile.gif | Bin 0 -> 443 bytes .../plugins/smiley/images/broken_heart.gif | Bin 0 -> 192 bytes .../plugins/smiley/images/confused_smile.gif | Bin 0 -> 464 bytes .../plugins/smiley/images/cry_smile.gif | Bin 0 -> 468 bytes .../plugins/smiley/images/devil_smile.gif | Bin 0 -> 436 bytes .../smiley/images/embaressed_smile.gif | Bin 0 -> 442 bytes .../smiley/images/embarrassed_smile.gif | Bin 0 -> 442 bytes .../plugins/smiley/images/envelope.gif | Bin 0 -> 426 bytes .../ckeditor4/plugins/smiley/images/heart.gif | Bin 0 -> 183 bytes .../ckeditor4/plugins/smiley/images/kiss.gif | Bin 0 -> 241 bytes .../plugins/smiley/images/lightbulb.gif | Bin 0 -> 368 bytes .../plugins/smiley/images/omg_smile.gif | Bin 0 -> 451 bytes .../plugins/smiley/images/regular_smile.gif | Bin 0 -> 450 bytes .../plugins/smiley/images/sad_smile.gif | Bin 0 -> 460 bytes .../plugins/smiley/images/shades_smile.gif | Bin 0 -> 449 bytes .../plugins/smiley/images/teeth_smile.gif | Bin 0 -> 442 bytes .../plugins/smiley/images/thumbs_down.gif | Bin 0 -> 408 bytes .../plugins/smiley/images/thumbs_up.gif | Bin 0 -> 396 bytes .../plugins/smiley/images/tongue_smile.gif | Bin 0 -> 446 bytes .../plugins/smiley/images/tounge_smile.gif | Bin 0 -> 446 bytes .../images/whatchutalkingabout_smile.gif | Bin 0 -> 452 bytes .../plugins/smiley/images/wink_smile.gif | Bin 0 -> 458 bytes .../dialogs/lang/_translationstatus.txt | 20 + .../plugins/specialchar/dialogs/lang/ca.js | 13 + .../plugins/specialchar/dialogs/lang/cs.js | 13 + .../plugins/specialchar/dialogs/lang/cy.js | 14 + .../plugins/specialchar/dialogs/lang/de.js | 13 + .../plugins/specialchar/dialogs/lang/el.js | 13 + .../plugins/specialchar/dialogs/lang/en.js | 13 + .../plugins/specialchar/dialogs/lang/eo.js | 12 + .../plugins/specialchar/dialogs/lang/et.js | 13 + .../plugins/specialchar/dialogs/lang/fa.js | 13 + .../plugins/specialchar/dialogs/lang/fi.js | 13 + .../plugins/specialchar/dialogs/lang/fr.js | 11 + .../plugins/specialchar/dialogs/lang/he.js | 13 + .../plugins/specialchar/dialogs/lang/hr.js | 13 + .../plugins/specialchar/dialogs/lang/it.js | 14 + .../plugins/specialchar/dialogs/lang/ku.js | 14 + .../plugins/specialchar/dialogs/lang/lv.js | 13 + .../plugins/specialchar/dialogs/lang/nb.js | 11 + .../plugins/specialchar/dialogs/lang/nl.js | 13 + .../plugins/specialchar/dialogs/lang/no.js | 11 + .../plugins/specialchar/dialogs/lang/pt-br.js | 11 + .../plugins/specialchar/dialogs/lang/sk.js | 13 + .../plugins/specialchar/dialogs/lang/tr.js | 12 + .../plugins/specialchar/dialogs/lang/ug.js | 13 + .../plugins/specialchar/dialogs/lang/zh-cn.js | 9 + .../specialchar/dialogs/specialchar.js | 14 + .../ckeditor4/plugins/table/dialogs/table.js | 20 + .../plugins/tabletools/dialogs/tableCell.js | 16 + .../plugins/templates/dialogs/templates.css | 84 + .../plugins/templates/dialogs/templates.js | 10 + .../plugins/templates/templates/default.js | 6 + .../templates/templates/images/template1.gif | Bin 0 -> 375 bytes .../templates/templates/images/template2.gif | Bin 0 -> 333 bytes .../templates/templates/images/template3.gif | Bin 0 -> 422 bytes plugin/editor/ckeditor4/samples/ajax.html | 82 + plugin/editor/ckeditor4/samples/api.html | 207 + plugin/editor/ckeditor4/samples/appendto.html | 57 + .../samples/assets/inlineall/logo.png | Bin 0 -> 4411 bytes .../assets/outputxhtml/outputxhtml.css | 204 + .../ckeditor4/samples/assets/posteddata.php | 59 + .../ckeditor4/samples/assets/sample.css | 3 + .../ckeditor4/samples/assets/sample.jpg | Bin 0 -> 17932 bytes .../samples/assets/uilanguages/languages.js | 7 + .../editor/ckeditor4/samples/divreplace.html | 141 + plugin/editor/ckeditor4/samples/index.html | 119 + .../editor/ckeditor4/samples/inlineall.html | 311 + .../ckeditor4/samples/inlinebycode.html | 122 + .../plugins/dialog/assets/my_dialog.js | 5 + .../samples/plugins/dialog/dialog.html | 187 + .../samples/plugins/enterkey/enterkey.html | 103 + .../assets/outputforflash/outputforflash.fla | Bin 0 -> 85504 bytes .../assets/outputforflash/outputforflash.swf | Bin 0 -> 15571 bytes .../assets/outputforflash/swfobject.js | 18 + .../plugins/htmlwriter/outputforflash.html | 280 + .../plugins/htmlwriter/outputhtml.html | 237 + .../samples/plugins/magicline/magicline.html | 203 + .../samples/plugins/toolbar/toolbar.html | 200 + .../samples/plugins/wysiwygarea/fullpage.html | 71 + plugin/editor/ckeditor4/samples/readonly.html | 73 + .../ckeditor4/samples/replacebyclass.html | 57 + .../ckeditor4/samples/replacebycode.html | 56 + plugin/editor/ckeditor4/samples/sample.css | 333 + plugin/editor/ckeditor4/samples/sample.js | 5 + .../ckeditor4/samples/sample_posteddata.php | 16 + plugin/editor/ckeditor4/samples/tabindex.html | 75 + plugin/editor/ckeditor4/samples/uicolor.html | 70 + .../editor/ckeditor4/samples/uilanguages.html | 119 + .../editor/ckeditor4/samples/xhtmlstyle.html | 219 + plugin/editor/ckeditor4/shortcut.html | 91 + .../editor/ckeditor4/skins/moono/dialog.css | 5 + .../ckeditor4/skins/moono/dialog_ie.css | 5 + .../ckeditor4/skins/moono/dialog_ie7.css | 5 + .../ckeditor4/skins/moono/dialog_ie8.css | 5 + .../ckeditor4/skins/moono/dialog_opera.css | 5 + .../editor/ckeditor4/skins/moono/editor.css | 5 + .../ckeditor4/skins/moono/editor_gecko.css | 5 + .../ckeditor4/skins/moono/editor_ie.css | 5 + .../ckeditor4/skins/moono/editor_ie7.css | 5 + .../ckeditor4/skins/moono/editor_ie8.css | 5 + plugin/editor/ckeditor4/skins/moono/icons.png | Bin 0 -> 20831 bytes .../ckeditor4/skins/moono/images/arrow.png | Bin 0 -> 261 bytes .../ckeditor4/skins/moono/images/close.png | Bin 0 -> 389 bytes .../ckeditor4/skins/moono/images/mini.png | Bin 0 -> 818 bytes plugin/editor/ckeditor4/skins/moono/readme.md | 51 + plugin/editor/ckeditor4/styles.js | 112 + plugin/editor/ckeditor4/upload.php | 36 + .../htmlpurifier/HTMLPurifier.standalone.php | 17627 ++++++++++++++++ plugin/htmlpurifier/safeiframe.txt | 6 + .../ConfigSchema/Builder/ConfigSchema.php | 44 + .../HTMLPurifier/ConfigSchema/Builder/Xml.php | 106 + .../HTMLPurifier/ConfigSchema/Exception.php | 11 + .../HTMLPurifier/ConfigSchema/Interchange.php | 42 + .../ConfigSchema/Interchange/Directive.php | 77 + .../ConfigSchema/Interchange/Id.php | 37 + .../ConfigSchema/InterchangeBuilder.php | 180 + .../HTMLPurifier/ConfigSchema/Validator.php | 206 + .../ConfigSchema/ValidatorAtom.php | 66 + .../HTMLPurifier/ConfigSchema/schema.ser | Bin 0 -> 14880 bytes .../schema/Attr.AllowedClasses.txt | 8 + .../schema/Attr.AllowedFrameTargets.txt | 12 + .../ConfigSchema/schema/Attr.AllowedRel.txt | 9 + .../ConfigSchema/schema/Attr.AllowedRev.txt | 9 + .../schema/Attr.ClassUseCDATA.txt | 19 + .../schema/Attr.DefaultImageAlt.txt | 11 + .../schema/Attr.DefaultInvalidImage.txt | 9 + .../schema/Attr.DefaultInvalidImageAlt.txt | 8 + .../schema/Attr.DefaultTextDir.txt | 10 + .../ConfigSchema/schema/Attr.EnableID.txt | 16 + .../schema/Attr.ForbiddenClasses.txt | 8 + .../ConfigSchema/schema/Attr.IDBlacklist.txt | 5 + .../schema/Attr.IDBlacklistRegexp.txt | 9 + .../ConfigSchema/schema/Attr.IDPrefix.txt | 12 + .../schema/Attr.IDPrefixLocal.txt | 14 + .../schema/AutoFormat.AutoParagraph.txt | 31 + .../ConfigSchema/schema/AutoFormat.Custom.txt | 12 + .../schema/AutoFormat.DisplayLinkURI.txt | 11 + .../schema/AutoFormat.Linkify.txt | 12 + .../AutoFormat.PurifierLinkify.DocURL.txt | 12 + .../schema/AutoFormat.PurifierLinkify.txt | 12 + ...rmat.RemoveEmpty.RemoveNbsp.Exceptions.txt | 11 + .../AutoFormat.RemoveEmpty.RemoveNbsp.txt | 15 + .../schema/AutoFormat.RemoveEmpty.txt | 46 + ...utoFormat.RemoveSpansWithoutAttributes.txt | 11 + .../schema/CSS.AllowImportant.txt | 8 + .../ConfigSchema/schema/CSS.AllowTricky.txt | 11 + .../ConfigSchema/schema/CSS.AllowedFonts.txt | 12 + .../schema/CSS.AllowedProperties.txt | 18 + .../ConfigSchema/schema/CSS.DefinitionRev.txt | 11 + .../schema/CSS.ForbiddenProperties.txt | 13 + .../ConfigSchema/schema/CSS.MaxImgLength.txt | 16 + .../ConfigSchema/schema/CSS.Proprietary.txt | 10 + .../ConfigSchema/schema/CSS.Trusted.txt | 9 + .../schema/Cache.DefinitionImpl.txt | 14 + .../schema/Cache.SerializerPath.txt | 13 + .../schema/Cache.SerializerPermissions.txt | 11 + .../schema/Core.AggressivelyFixLt.txt | 18 + .../schema/Core.CollectErrors.txt | 12 + .../schema/Core.ColorKeywords.txt | 29 + .../schema/Core.ConvertDocumentToFragment.txt | 14 + .../Core.DirectLexLineNumberSyncInterval.txt | 17 + .../schema/Core.DisableExcludes.txt | 14 + .../ConfigSchema/schema/Core.EnableIDNA.txt | 9 + .../ConfigSchema/schema/Core.Encoding.txt | 15 + .../schema/Core.EscapeInvalidChildren.txt | 10 + .../schema/Core.EscapeInvalidTags.txt | 7 + .../schema/Core.EscapeNonASCIICharacters.txt | 13 + .../schema/Core.HiddenElements.txt | 19 + .../ConfigSchema/schema/Core.Language.txt | 10 + .../ConfigSchema/schema/Core.LexerImpl.txt | 34 + .../schema/Core.MaintainLineNumbers.txt | 16 + .../schema/Core.NormalizeNewlines.txt | 11 + .../schema/Core.RemoveInvalidImg.txt | 12 + .../Core.RemoveProcessingInstructions.txt | 11 + .../schema/Core.RemoveScriptContents.txt | 12 + .../ConfigSchema/schema/Filter.Custom.txt | 11 + .../Filter.ExtractStyleBlocks.Escaping.txt | 14 + .../Filter.ExtractStyleBlocks.Scope.txt | 29 + .../Filter.ExtractStyleBlocks.TidyImpl.txt | 16 + .../schema/Filter.ExtractStyleBlocks.txt | 74 + .../ConfigSchema/schema/Filter.YouTube.txt | 16 + .../ConfigSchema/schema/HTML.Allowed.txt | 25 + .../schema/HTML.AllowedAttributes.txt | 19 + .../schema/HTML.AllowedComments.txt | 10 + .../schema/HTML.AllowedCommentsRegexp.txt | 15 + .../schema/HTML.AllowedElements.txt | 23 + .../schema/HTML.AllowedModules.txt | 20 + .../schema/HTML.Attr.Name.UseCDATA.txt | 11 + .../ConfigSchema/schema/HTML.BlockWrapper.txt | 18 + .../ConfigSchema/schema/HTML.CoreModules.txt | 23 + .../schema/HTML.CustomDoctype.txt | 9 + .../ConfigSchema/schema/HTML.DefinitionID.txt | 33 + .../schema/HTML.DefinitionRev.txt | 16 + .../ConfigSchema/schema/HTML.Doctype.txt | 11 + .../schema/HTML.FlashAllowFullScreen.txt | 11 + .../schema/HTML.ForbiddenAttributes.txt | 21 + .../schema/HTML.ForbiddenElements.txt | 20 + .../ConfigSchema/schema/HTML.MaxImgLength.txt | 14 + .../ConfigSchema/schema/HTML.Nofollow.txt | 7 + .../ConfigSchema/schema/HTML.Parent.txt | 12 + .../ConfigSchema/schema/HTML.Proprietary.txt | 12 + .../ConfigSchema/schema/HTML.SafeEmbed.txt | 13 + .../ConfigSchema/schema/HTML.SafeIframe.txt | 13 + .../ConfigSchema/schema/HTML.SafeObject.txt | 13 + .../schema/HTML.SafeScripting.txt | 10 + .../ConfigSchema/schema/HTML.Strict.txt | 9 + .../ConfigSchema/schema/HTML.TargetBlank.txt | 8 + .../ConfigSchema/schema/HTML.TidyAdd.txt | 8 + .../ConfigSchema/schema/HTML.TidyLevel.txt | 24 + .../ConfigSchema/schema/HTML.TidyRemove.txt | 8 + .../ConfigSchema/schema/HTML.Trusted.txt | 9 + .../ConfigSchema/schema/HTML.XHTML.txt | 11 + .../schema/Output.CommentScriptContents.txt | 10 + .../schema/Output.FixInnerHTML.txt | 15 + .../schema/Output.FlashCompat.txt | 11 + .../ConfigSchema/schema/Output.Newline.txt | 13 + .../ConfigSchema/schema/Output.SortAttr.txt | 14 + .../ConfigSchema/schema/Output.TidyFormat.txt | 25 + .../ConfigSchema/schema/Test.ForceNoIconv.txt | 7 + .../schema/URI.AllowedSchemes.txt | 17 + .../ConfigSchema/schema/URI.Base.txt | 17 + .../ConfigSchema/schema/URI.DefaultScheme.txt | 10 + .../ConfigSchema/schema/URI.DefinitionID.txt | 11 + .../ConfigSchema/schema/URI.DefinitionRev.txt | 11 + .../ConfigSchema/schema/URI.Disable.txt | 14 + .../schema/URI.DisableExternal.txt | 11 + .../schema/URI.DisableExternalResources.txt | 13 + .../schema/URI.DisableResources.txt | 15 + .../ConfigSchema/schema/URI.Host.txt | 19 + .../ConfigSchema/schema/URI.HostBlacklist.txt | 9 + .../ConfigSchema/schema/URI.MakeAbsolute.txt | 13 + .../ConfigSchema/schema/URI.Munge.txt | 83 + .../schema/URI.MungeResources.txt | 17 + .../schema/URI.MungeSecretKey.txt | 30 + .../schema/URI.OverrideAllowedSchemes.txt | 9 + .../schema/URI.SafeIframeRegexp.txt | 22 + .../HTMLPurifier/ConfigSchema/schema/info.ini | 3 + .../HTMLPurifier/EntityLookup/entities.ser | 1 + .../Filter/ExtractStyleBlocks.php | 289 + .../HTMLPurifier/Filter/YouTube.php | 39 + .../Language/classes/en-x-test.php | 12 + .../Language/messages/en-x-test.php | 11 + .../Language/messages/en-x-testmini.php | 12 + .../HTMLPurifier/Language/messages/en.php | 63 + .../standalone/HTMLPurifier/Lexer/PH5P.php | 3904 ++++ .../standalone/HTMLPurifier/Printer.php | 176 + .../HTMLPurifier/Printer/CSSDefinition.php | 38 + .../HTMLPurifier/Printer/ConfigForm.css | 10 + .../HTMLPurifier/Printer/ConfigForm.js | 5 + .../HTMLPurifier/Printer/ConfigForm.php | 368 + .../HTMLPurifier/Printer/HTMLDefinition.php | 272 + plugin/jquery-ui/datepicker.php | 34 + plugin/kcaptcha/_common.php | 3 + plugin/kcaptcha/captcha.lib.php | 3 + plugin/kcaptcha/fonts/antiqua.png | Bin 0 -> 6469 bytes plugin/kcaptcha/fonts/baskerville.png | Bin 0 -> 6439 bytes plugin/kcaptcha/fonts/batang.png | Bin 0 -> 7235 bytes plugin/kcaptcha/fonts/bookman.png | Bin 0 -> 6815 bytes plugin/kcaptcha/fonts/calisto.png | Bin 0 -> 8140 bytes plugin/kcaptcha/fonts/cambria.png | Bin 0 -> 6492 bytes plugin/kcaptcha/fonts/centaur.png | Bin 0 -> 7441 bytes plugin/kcaptcha/fonts/century.png | Bin 0 -> 6964 bytes plugin/kcaptcha/fonts/chaparral.png | Bin 0 -> 7598 bytes plugin/kcaptcha/fonts/constantia.png | Bin 0 -> 6265 bytes plugin/kcaptcha/fonts/footlight.png | Bin 0 -> 6862 bytes plugin/kcaptcha/fonts/garamond.png | Bin 0 -> 7085 bytes plugin/kcaptcha/fonts/georgia.png | Bin 0 -> 7187 bytes plugin/kcaptcha/fonts/goudy_old.png | Bin 0 -> 7077 bytes plugin/kcaptcha/fonts/kozuka.png | Bin 0 -> 7253 bytes plugin/kcaptcha/fonts/lucida.png | Bin 0 -> 6406 bytes plugin/kcaptcha/fonts/minion.png | Bin 0 -> 6996 bytes plugin/kcaptcha/fonts/palatino.png | Bin 0 -> 7136 bytes plugin/kcaptcha/fonts/perpetua.png | Bin 0 -> 6836 bytes plugin/kcaptcha/fonts/rockwell.png | Bin 0 -> 5822 bytes plugin/kcaptcha/fonts/times.png | Bin 0 -> 6848 bytes plugin/kcaptcha/fonts/warnock.png | Bin 0 -> 7655 bytes plugin/kcaptcha/img/dot.gif | Bin 0 -> 43 bytes plugin/kcaptcha/img/reload.gif | Bin 0 -> 616 bytes plugin/kcaptcha/img/sound.gif | Bin 0 -> 144 bytes plugin/kcaptcha/kcaptcha.js | 105 + plugin/kcaptcha/kcaptcha.lib.php | 278 + plugin/kcaptcha/kcaptcha_config.php | 42 + plugin/kcaptcha/kcaptcha_image.php | 9 + plugin/kcaptcha/kcaptcha_mp3.php | 44 + plugin/kcaptcha/kcaptcha_result.php | 13 + plugin/kcaptcha/kcaptcha_session.php | 18 + plugin/kcaptcha/mp3/basic/0.mp3 | Bin 0 -> 13259 bytes plugin/kcaptcha/mp3/basic/1.mp3 | Bin 0 -> 13259 bytes plugin/kcaptcha/mp3/basic/2.mp3 | Bin 0 -> 13259 bytes plugin/kcaptcha/mp3/basic/3.mp3 | Bin 0 -> 13259 bytes plugin/kcaptcha/mp3/basic/4.mp3 | Bin 0 -> 13259 bytes plugin/kcaptcha/mp3/basic/5.mp3 | Bin 0 -> 13259 bytes plugin/kcaptcha/mp3/basic/6.mp3 | Bin 0 -> 13259 bytes plugin/kcaptcha/mp3/basic/7.mp3 | Bin 0 -> 13259 bytes plugin/kcaptcha/mp3/basic/8.mp3 | Bin 0 -> 13259 bytes plugin/kcaptcha/mp3/basic/9.mp3 | Bin 0 -> 13259 bytes plugin/kcaptcha/mp3/jmoon/0.mp3 | Bin 0 -> 10008 bytes plugin/kcaptcha/mp3/jmoon/1.mp3 | Bin 0 -> 8340 bytes plugin/kcaptcha/mp3/jmoon/2.mp3 | Bin 0 -> 8340 bytes plugin/kcaptcha/mp3/jmoon/3.mp3 | Bin 0 -> 9174 bytes plugin/kcaptcha/mp3/jmoon/4.mp3 | Bin 0 -> 10425 bytes plugin/kcaptcha/mp3/jmoon/5.mp3 | Bin 0 -> 10008 bytes plugin/kcaptcha/mp3/jmoon/6.mp3 | Bin 0 -> 10842 bytes plugin/kcaptcha/mp3/jmoon/7.mp3 | Bin 0 -> 10008 bytes plugin/kcaptcha/mp3/jmoon/8.mp3 | Bin 0 -> 10842 bytes plugin/kcaptcha/mp3/jmoon/9.mp3 | Bin 0 -> 10425 bytes plugin/kcpcert/_common.php | 3 + plugin/kcpcert/bin/ct_cli | Bin 0 -> 528992 bytes plugin/kcpcert/kcpcert_config.php | 54 + plugin/kcpcert/kcpcert_form.php | 55 + plugin/kcpcert/kcpcert_result.php | 196 + plugin/kcpcert/lib/ct_cli_lib.php | 89 + plugin/lgxpay/AuthOnlyReq.php | 129 + plugin/lgxpay/AuthOnlyRes.php | 195 + plugin/lgxpay/_common.php | 3 + plugin/lgxpay/img/btn_gouplus.jpg | Bin 0 -> 2962 bytes plugin/lgxpay/img/upluslogo.jpg | Bin 0 -> 2289 bytes plugin/lgxpay/lgdacom/JSON.php | 806 + plugin/lgxpay/lgdacom/XPayClient.php | 1116 + plugin/lgxpay/lgdacom/XPayClient4DB.php | 1114 + plugin/lgxpay/lgdacom/conf/ca-bundle.crt | 10695 ++++++++++ plugin/lgxpay/lgdacom/conf/lgdacom.conf | 3 + plugin/lgxpay/lgdacom/conf/mall.conf | 40 + plugin/lgxpay/lgdacom/patch.php | 28 + plugin/lgxpay/lgdacom/ping.php | 48 + plugin/okname/_common.php | 3 + plugin/okname/bin/libiconv2.dll | Bin 0 -> 978432 bytes plugin/okname/bin/okname | Bin 0 -> 547599 bytes plugin/okname/bin/okname.exe | Bin 0 -> 405504 bytes plugin/okname/bin/okname_x64 | Bin 0 -> 639400 bytes plugin/okname/bin/oknamex64.exe | Bin 0 -> 539648 bytes plugin/okname/hpcert.config.php | 75 + plugin/okname/hpcert1.php | 84 + plugin/okname/hpcert2.php | 145 + plugin/okname/ipin.config.php | 44 + plugin/okname/ipin1.php | 57 + plugin/okname/ipin2.php | 113 + plugin/okname/key/.htaccess | 1 + plugin/okname/key_dir_check.php | 25 + plugin/sms5/JSON.php | 933 + plugin/sms5/_common.php | 3 + plugin/sms5/ajax.sms_emoticon.php | 70 + plugin/sms5/index.php | 11 + plugin/sms5/skin/basic/img/ajax-loader.gif | Bin 0 -> 1924 bytes plugin/sms5/skin/basic/img/box_ico.gif | Bin 0 -> 60 bytes plugin/sms5/skin/basic/img/scemo_ico.gif | Bin 0 -> 67 bytes plugin/sms5/skin/basic/mobile.css | 48 + plugin/sms5/skin/basic/style.css | 50 + plugin/sms5/skin/basic/write.skin.php | 378 + plugin/sms5/skin/basic/write_mobile.skin.php | 394 + plugin/sms5/sms5.lib.php | 333 + plugin/sms5/write.php | 72 + plugin/sms5/write_update.php | 159 + plugin/sns/facebook/.gitignore | 1 + plugin/sns/facebook/.travis.yml | 5 + plugin/sns/facebook/_common.php | 3 + plugin/sns/facebook/callback.php | 62 + plugin/sns/facebook/changelog.md | 28 + plugin/sns/facebook/composer.json | 22 + plugin/sns/facebook/examples/example.php | 105 + plugin/sns/facebook/examples/with_js_sdk.php | 62 + plugin/sns/facebook/readme.md | 85 + plugin/sns/facebook/src/base_facebook.php | 1441 ++ plugin/sns/facebook/src/facebook.php | 160 + .../sns/facebook/src/fb_ca_chain_bundle.crt | 3920 ++++ plugin/sns/facebook/tests/bootstrap.php | 5 + plugin/sns/facebook/tests/tests.php | 2034 ++ plugin/sns/icon/facebook.png | Bin 0 -> 1052 bytes plugin/sns/icon/facebook_cmt.png | Bin 0 -> 1031 bytes plugin/sns/icon/facebook_off.png | Bin 0 -> 920 bytes plugin/sns/icon/gplus.png | Bin 0 -> 1669 bytes plugin/sns/icon/gplus_off.png | Bin 0 -> 1113 bytes plugin/sns/icon/kakaotalk.png | Bin 0 -> 1532 bytes plugin/sns/icon/kakaotalk_off.png | Bin 0 -> 1173 bytes plugin/sns/icon/twitter.png | Bin 0 -> 1030 bytes plugin/sns/icon/twitter_cmt.png | Bin 0 -> 1022 bytes plugin/sns/icon/twitter_off.png | Bin 0 -> 969 bytes plugin/sns/twitter/.gitignore | 1 + plugin/sns/twitter/LICENSE | 22 + plugin/sns/twitter/README.md | 114 + plugin/sns/twitter/_common.php | 3 + plugin/sns/twitter/callback-sample.php | 40 + plugin/sns/twitter/callback.php | 88 + plugin/sns/twitter/clearsessions.php | 14 + plugin/sns/twitter/config-sample.php | 10 + plugin/sns/twitter/connect.php | 22 + plugin/sns/twitter/html.inc | 39 + plugin/sns/twitter/images/darker.png | Bin 0 -> 2370 bytes plugin/sns/twitter/images/lighter.png | Bin 0 -> 2490 bytes plugin/sns/twitter/index.php | 35 + plugin/sns/twitter/redirect.php | 31 + plugin/sns/twitter/twitterconfig.php | 10 + plugin/sns/twitter/twitteroauth/OAuth.php | 872 + .../sns/twitter/twitteroauth/twitteroauth.php | 241 + plugin/sns/view.sns.skin.php | 37 + plugin/sns/view_comment_list.sns.skin.php | 15 + plugin/sns/view_comment_write.sns.skin.php | 112 + plugin/syndi/_common.php | 3 + plugin/syndi/config/site.config.php | 19 + plugin/syndi/func/site.func.php | 438 + .../include/include.adm.board_delete.inc.php | 29 + .../include/include.adm.board_form_update.php | 23 + .../include.adm.boardgroup_form_update.php | 27 + plugin/syndi/include/include.bbs.delete.php | 37 + .../syndi/include/include.bbs.delete_all.php | 36 + .../syndi/include/include.bbs.move_update.php | 39 + .../include/include.bbs.write_update.php | 42 + plugin/syndi/install.php | 12 + .../syndi/libs/SyndicationArticle.class.php | 137 + .../syndi/libs/SyndicationChannel.class.php | 98 + .../syndi/libs/SyndicationDeleted.class.php | 65 + .../syndi/libs/SyndicationHandler.class.php | 346 + plugin/syndi/libs/SyndicationObject.class.php | 104 + plugin/syndi/libs/SyndicationPing.class.php | 105 + plugin/syndi/libs/SyndicationSite.class.php | 74 + plugin/syndi/libs/SyndicationStatus.class.php | 77 + plugin/syndi/ping.php | 62 + plugin/syndi/syndi_echo.php | 39 + skin/board/basic/img/btn_close.gif | Bin 0 -> 211 bytes skin/board/basic/img/icon_file.gif | Bin 0 -> 107 bytes skin/board/basic/img/icon_hot.gif | Bin 0 -> 97 bytes skin/board/basic/img/icon_img.gif | Bin 0 -> 145 bytes skin/board/basic/img/icon_link.gif | Bin 0 -> 104 bytes skin/board/basic/img/icon_mobile.gif | Bin 0 -> 62 bytes skin/board/basic/img/icon_movie.gif | Bin 0 -> 110 bytes skin/board/basic/img/icon_new.gif | Bin 0 -> 71 bytes skin/board/basic/img/icon_reply.gif | Bin 0 -> 77 bytes skin/board/basic/img/icon_secret.gif | Bin 0 -> 97 bytes skin/board/basic/img/icon_sound.gif | Bin 0 -> 113 bytes skin/board/basic/list.skin.php | 253 + skin/board/basic/style.css | 255 + skin/board/basic/view.skin.php | 283 + skin/board/basic/view_comment.skin.php | 311 + skin/board/basic/write.skin.php | 268 + skin/board/gallery/img/btn_close.gif | Bin 0 -> 211 bytes skin/board/gallery/img/icon_file.gif | Bin 0 -> 107 bytes skin/board/gallery/img/icon_hot.gif | Bin 0 -> 97 bytes skin/board/gallery/img/icon_img.gif | Bin 0 -> 145 bytes skin/board/gallery/img/icon_link.gif | Bin 0 -> 104 bytes skin/board/gallery/img/icon_mobile.gif | Bin 0 -> 62 bytes skin/board/gallery/img/icon_movie.gif | Bin 0 -> 110 bytes skin/board/gallery/img/icon_new.gif | Bin 0 -> 71 bytes skin/board/gallery/img/icon_reply.gif | Bin 0 -> 77 bytes skin/board/gallery/img/icon_secret.gif | Bin 0 -> 97 bytes skin/board/gallery/img/icon_sound.gif | Bin 0 -> 113 bytes skin/board/gallery/list.skin.php | 247 + skin/board/gallery/style.css | 248 + skin/board/gallery/view.skin.php | 283 + skin/board/gallery/view_comment.skin.php | 311 + skin/board/gallery/write.skin.php | 268 + skin/connect/basic/connect.skin.php | 9 + skin/connect/basic/current_connect.skin.php | 41 + skin/connect/basic/style.css | 1 + skin/faq/basic/list.skin.php | 136 + skin/faq/basic/style.css | 23 + skin/latest/basic/img/icon_file.gif | Bin 0 -> 107 bytes skin/latest/basic/img/icon_hot.gif | Bin 0 -> 97 bytes skin/latest/basic/img/icon_img.gif | Bin 0 -> 145 bytes skin/latest/basic/img/icon_link.gif | Bin 0 -> 104 bytes skin/latest/basic/img/icon_mobile.gif | Bin 0 -> 62 bytes skin/latest/basic/img/icon_more.gif | Bin 0 -> 169 bytes skin/latest/basic/img/icon_movie.gif | Bin 0 -> 110 bytes skin/latest/basic/img/icon_new.gif | Bin 0 -> 71 bytes skin/latest/basic/img/icon_reply.gif | Bin 0 -> 77 bytes skin/latest/basic/img/icon_secret.gif | Bin 0 -> 97 bytes skin/latest/basic/img/icon_sound.gif | Bin 0 -> 113 bytes skin/latest/basic/latest.skin.php | 44 + skin/latest/basic/style.css | 11 + skin/member/basic/formmail.skin.php | 101 + skin/member/basic/img/zip_ico_up.gif | Bin 0 -> 54 bytes skin/member/basic/login.skin.php | 60 + skin/member/basic/login_check.skin.php | 5 + skin/member/basic/member_confirm.skin.php | 50 + skin/member/basic/memo.skin.php | 53 + skin/member/basic/memo_form.skin.php | 59 + skin/member/basic/memo_view.skin.php | 60 + skin/member/basic/password.skin.php | 50 + skin/member/basic/password_lost.skin.php | 47 + skin/member/basic/point.skin.php | 88 + skin/member/basic/profile.skin.php | 50 + skin/member/basic/register.skin.php | 57 + skin/member/basic/register_form.skin.php | 445 + skin/member/basic/register_result.skin.php | 46 + skin/member/basic/scrap.skin.php | 46 + skin/member/basic/scrap_popin.skin.php | 41 + skin/member/basic/style.css | 192 + skin/member/basic/zip.skin.php | 159 + skin/new/basic/new.skin.php | 145 + skin/new/basic/style.css | 7 + skin/outlogin/basic/outlogin.skin.1.php | 69 + skin/outlogin/basic/outlogin.skin.2.php | 46 + skin/outlogin/basic/style.css | 45 + skin/poll/basic/poll.skin.php | 67 + skin/poll/basic/poll_result.skin.php | 131 + skin/poll/basic/style.css | 90 + skin/popular/basic/popular.skin.php | 19 + skin/popular/basic/style.css | 12 + skin/qa/basic/img/btn_close.gif | Bin 0 -> 211 bytes skin/qa/basic/img/icon_answer.gif | Bin 0 -> 77 bytes skin/qa/basic/img/icon_file.gif | Bin 0 -> 107 bytes skin/qa/basic/img/icon_hot.gif | Bin 0 -> 97 bytes skin/qa/basic/img/icon_img.gif | Bin 0 -> 145 bytes skin/qa/basic/img/icon_link.gif | Bin 0 -> 104 bytes skin/qa/basic/img/icon_mobile.gif | Bin 0 -> 62 bytes skin/qa/basic/img/icon_movie.gif | Bin 0 -> 110 bytes skin/qa/basic/img/icon_new.gif | Bin 0 -> 71 bytes skin/qa/basic/img/icon_secret.gif | Bin 0 -> 97 bytes skin/qa/basic/img/icon_sound.gif | Bin 0 -> 113 bytes skin/qa/basic/list.skin.php | 167 + skin/qa/basic/style.css | 281 + skin/qa/basic/view.answer.skin.php | 25 + skin/qa/basic/view.answerform.skin.php | 125 + skin/qa/basic/view.skin.php | 187 + skin/qa/basic/write.skin.php | 184 + skin/search/basic/search.skin.php | 137 + skin/search/basic/style.css | 29 + skin/visit/basic/style.css | 13 + skin/visit/basic/visit.skin.php | 27 + tail.php | 82 + tail.sub.php | 25 + 1174 files changed, 136960 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE.txt create mode 100644 _common.php create mode 100644 _head.php create mode 100644 _tail.php create mode 100644 adm/_common.php create mode 100644 adm/admin.head.php create mode 100644 adm/admin.js create mode 100644 adm/admin.lib.php create mode 100644 adm/admin.menu100.php create mode 100644 adm/admin.menu200.php create mode 100644 adm/admin.menu300.php create mode 100644 adm/admin.menu900.php create mode 100644 adm/admin.tail.php create mode 100644 adm/auth_list.php create mode 100644 adm/auth_list_delete.php create mode 100644 adm/auth_update.php create mode 100644 adm/board_copy.php create mode 100644 adm/board_copy_update.php create mode 100644 adm/board_delete.inc.php create mode 100644 adm/board_form.php create mode 100644 adm/board_form_update.php create mode 100644 adm/board_list.php create mode 100644 adm/board_list_update.php create mode 100644 adm/board_thumbnail_delete.php create mode 100644 adm/boardgroup_form.php create mode 100644 adm/boardgroup_form_update.php create mode 100644 adm/boardgroup_list.php create mode 100644 adm/boardgroup_list_update.php create mode 100644 adm/boardgroupmember_form.php create mode 100644 adm/boardgroupmember_list.php create mode 100644 adm/boardgroupmember_update.php create mode 100644 adm/cache_file_delete.php create mode 100644 adm/captcha_file_delete.php create mode 100644 adm/config_form.php create mode 100644 adm/config_form_update.php create mode 100644 adm/contentform.php create mode 100644 adm/contentformupdate.php create mode 100644 adm/contentlist.php create mode 100644 adm/css/admin.css create mode 100644 adm/faqform.php create mode 100644 adm/faqformupdate.php create mode 100644 adm/faqlist.php create mode 100644 adm/faqmasterform.php create mode 100644 adm/faqmasterformupdate.php create mode 100644 adm/faqmasterlist.php create mode 100644 adm/img/hd_bg.jpg create mode 100644 adm/img/logo.jpg create mode 100644 adm/img/sub_menu_ico.gif create mode 100644 adm/img/ts01.gif create mode 100644 adm/img/ts02.gif create mode 100644 adm/img/ts03.gif create mode 100644 adm/index.php create mode 100644 adm/mail_delete.php create mode 100644 adm/mail_form.php create mode 100644 adm/mail_list.php create mode 100644 adm/mail_preview.php create mode 100644 adm/mail_select_form.php create mode 100644 adm/mail_select_list.php create mode 100644 adm/mail_select_update.php create mode 100644 adm/mail_test.php create mode 100644 adm/mail_update.php create mode 100644 adm/member_delete.php create mode 100644 adm/member_form.php create mode 100644 adm/member_form_update.php create mode 100644 adm/member_list.php create mode 100644 adm/member_list_delete.php create mode 100644 adm/member_list_update.php create mode 100644 adm/menu_form.php create mode 100644 adm/menu_form_search.php create mode 100644 adm/menu_list.php create mode 100644 adm/menu_list_update.php create mode 100644 adm/newwinform.php create mode 100644 adm/newwinformupdate.php create mode 100644 adm/newwinlist.php create mode 100644 adm/phpinfo.php create mode 100644 adm/point_clear.php create mode 100644 adm/point_list.php create mode 100644 adm/point_list_delete.php create mode 100644 adm/point_update.php create mode 100644 adm/poll_delete.php create mode 100644 adm/poll_form.php create mode 100644 adm/poll_form_update.php create mode 100644 adm/poll_list.php create mode 100644 adm/popular_list.php create mode 100644 adm/popular_rank.php create mode 100644 adm/qa_config.php create mode 100644 adm/qa_config_update.php create mode 100644 adm/sendmail_test.php create mode 100644 adm/session_file_delete.php create mode 100644 adm/sms_admin/_common.php create mode 100644 adm/sms_admin/ajax.hp_chk.php create mode 100644 adm/sms_admin/ajax.sms_write_form.php create mode 100644 adm/sms_admin/ajax.sms_write_group.php create mode 100644 adm/sms_admin/ajax.sms_write_level.php create mode 100644 adm/sms_admin/ajax.sms_write_person.php create mode 100644 adm/sms_admin/config.php create mode 100644 adm/sms_admin/config_update.php create mode 100644 adm/sms_admin/css/sms5.css create mode 100644 adm/sms_admin/emoticon_move.php create mode 100644 adm/sms_admin/emoticon_move_update.php create mode 100644 adm/sms_admin/form_group.php create mode 100644 adm/sms_admin/form_group_move.php create mode 100644 adm/sms_admin/form_group_update.php create mode 100644 adm/sms_admin/form_list.php create mode 100644 adm/sms_admin/form_multi_update.php create mode 100644 adm/sms_admin/form_update.php create mode 100644 adm/sms_admin/form_write.php create mode 100644 adm/sms_admin/history_list.php create mode 100644 adm/sms_admin/history_member.php create mode 100644 adm/sms_admin/history_num.php create mode 100644 adm/sms_admin/history_send.php create mode 100644 adm/sms_admin/history_view.php create mode 100644 adm/sms_admin/img/ajax-loader.gif create mode 100644 adm/sms_admin/img/ajax-loader2.gif create mode 100644 adm/sms_admin/img/box_ico.gif create mode 100644 adm/sms_admin/img/scemo_ico.gif create mode 100644 adm/sms_admin/install.php create mode 100644 adm/sms_admin/member_update.php create mode 100644 adm/sms_admin/member_update_run.php create mode 100644 adm/sms_admin/num_book.php create mode 100644 adm/sms_admin/num_book_file.php create mode 100644 adm/sms_admin/num_book_file_download.php create mode 100644 adm/sms_admin/num_book_file_upload.php create mode 100644 adm/sms_admin/num_book_move.php create mode 100644 adm/sms_admin/num_book_multi_update.php create mode 100644 adm/sms_admin/num_book_update.php create mode 100644 adm/sms_admin/num_book_write.php create mode 100644 adm/sms_admin/num_group.php create mode 100644 adm/sms_admin/num_group_move.php create mode 100644 adm/sms_admin/num_group_update.php create mode 100644 adm/sms_admin/number_move_update.php create mode 100644 adm/sms_admin/sms5.sql create mode 100644 adm/sms_admin/sms_ing.php create mode 100644 adm/sms_admin/sms_write.php create mode 100644 adm/sms_admin/sms_write_form.php create mode 100644 adm/sms_admin/sms_write_overlap_check.php create mode 100644 adm/sms_admin/sms_write_send.php create mode 100644 adm/sql_write.sql create mode 100644 adm/thumbnail_file_delete.php create mode 100644 adm/visit.sub.php create mode 100644 adm/visit_browser.php create mode 100644 adm/visit_date.php create mode 100644 adm/visit_delete.php create mode 100644 adm/visit_delete_update.php create mode 100644 adm/visit_domain.php create mode 100644 adm/visit_hour.php create mode 100644 adm/visit_list.php create mode 100644 adm/visit_month.php create mode 100644 adm/visit_os.php create mode 100644 adm/visit_search.php create mode 100644 adm/visit_week.php create mode 100644 adm/visit_year.php create mode 100644 bbs/_common.php create mode 100644 bbs/_head.php create mode 100644 bbs/_head.sub.php create mode 100644 bbs/_tail.php create mode 100644 bbs/_tail.sub.php create mode 100644 bbs/ajax.autosave.php create mode 100644 bbs/ajax.autosavedel.php create mode 100644 bbs/ajax.autosavelist.php create mode 100644 bbs/ajax.autosaveload.php create mode 100644 bbs/ajax.filter.php create mode 100644 bbs/ajax.mb_email.php create mode 100644 bbs/ajax.mb_hp.php create mode 100644 bbs/ajax.mb_id.php create mode 100644 bbs/ajax.mb_nick.php create mode 100644 bbs/ajax.mb_recommend.php create mode 100644 bbs/alert.php create mode 100644 bbs/alert_close.php create mode 100644 bbs/board.php create mode 100644 bbs/board_head.php create mode 100644 bbs/board_list_update.php create mode 100644 bbs/board_tail.php create mode 100644 bbs/confirm.php create mode 100644 bbs/content.php create mode 100644 bbs/current_connect.php create mode 100644 bbs/db_table.optimize.php create mode 100644 bbs/delete.php create mode 100644 bbs/delete_all.php create mode 100644 bbs/delete_comment.php create mode 100644 bbs/download.php create mode 100644 bbs/email_certify.php create mode 100644 bbs/email_stop.php create mode 100644 bbs/faq.php create mode 100644 bbs/formmail.php create mode 100644 bbs/formmail_send.php create mode 100644 bbs/good.php create mode 100644 bbs/group.php create mode 100644 bbs/link.php create mode 100644 bbs/list.php create mode 100644 bbs/login.php create mode 100644 bbs/login_check.php create mode 100644 bbs/logout.php create mode 100644 bbs/member_confirm.php create mode 100644 bbs/member_leave.php create mode 100644 bbs/memo.php create mode 100644 bbs/memo_delete.php create mode 100644 bbs/memo_form.php create mode 100644 bbs/memo_form_update.php create mode 100644 bbs/memo_view.php create mode 100644 bbs/move.php create mode 100644 bbs/move_update.php create mode 100644 bbs/new.php create mode 100644 bbs/new_delete.php create mode 100644 bbs/newwin.inc.php create mode 100644 bbs/password.php create mode 100644 bbs/password_check.php create mode 100644 bbs/password_lost.php create mode 100644 bbs/password_lost2.php create mode 100644 bbs/password_lost_certify.php create mode 100644 bbs/point.php create mode 100644 bbs/poll_etc_update.php create mode 100644 bbs/poll_etc_update_mail.php create mode 100644 bbs/poll_result.php create mode 100644 bbs/poll_update.php create mode 100644 bbs/profile.php create mode 100644 bbs/qadelete.php create mode 100644 bbs/qadownload.php create mode 100644 bbs/qahead.php create mode 100644 bbs/qalist.php create mode 100644 bbs/qatail.php create mode 100644 bbs/qaview.php create mode 100644 bbs/qawrite.php create mode 100644 bbs/qawrite_update.php create mode 100644 bbs/register.php create mode 100644 bbs/register_email.php create mode 100644 bbs/register_email_update.php create mode 100644 bbs/register_form.php create mode 100644 bbs/register_form_update.php create mode 100644 bbs/register_form_update_mail1.php create mode 100644 bbs/register_form_update_mail2.php create mode 100644 bbs/register_form_update_mail3.php create mode 100644 bbs/register_result.php create mode 100644 bbs/rss.php create mode 100644 bbs/scrap.php create mode 100644 bbs/scrap_delete.php create mode 100644 bbs/scrap_popin.php create mode 100644 bbs/scrap_popin_update.php create mode 100644 bbs/search.php create mode 100644 bbs/sns_send.php create mode 100644 bbs/view.php create mode 100644 bbs/view_comment.php create mode 100644 bbs/view_image.php create mode 100644 bbs/visit_insert.inc.php create mode 100644 bbs/write.php create mode 100644 bbs/write_comment_update.php create mode 100644 bbs/write_comment_update.sns.php create mode 100644 bbs/write_update.php create mode 100644 bbs/write_update_mail.php create mode 100644 bbs/zip.php create mode 100644 common.php create mode 100644 config.php create mode 100644 css/default.css create mode 100644 css/images/ajax-loader.gif create mode 100644 css/images/icons-18-black.png create mode 100644 css/images/icons-18-white.png create mode 100644 css/images/icons-36-black.png create mode 100644 css/images/icons-36-white.png create mode 100644 css/mobile.css create mode 100644 extend/.htaccess create mode 100644 extend/sms5.extend.php create mode 100644 g4_import.php create mode 100644 g4_import_run.php create mode 100644 head.php create mode 100644 head.sub.php create mode 100644 img/btn_search.jpg create mode 100644 img/ft.png create mode 100644 img/gnb_bg00.gif create mode 100644 img/gnb_bg01.gif create mode 100644 img/logo.jpg create mode 100644 img/ts01.gif create mode 100644 img/ts02.gif create mode 100644 img/ts03.gif create mode 100644 img/wrest.gif create mode 100644 index.php create mode 100644 install/gnuboard5.sql create mode 100644 install/img/mooning.png create mode 100644 install/img/pat01.png create mode 100644 install/img/ricepaper_v3.png create mode 100644 install/index.php create mode 100644 install/install.css create mode 100644 install/install.inc.php create mode 100644 install/install.inc2.php create mode 100644 install/install_config.php create mode 100644 install/install_db.php create mode 100644 install/library.check.php create mode 100644 js/autosave.js create mode 100644 js/certify.js create mode 100644 js/common.js create mode 100644 js/html5.js create mode 100644 js/jquery-1.8.3.min.js create mode 100644 js/jquery.fancylist.js create mode 100644 js/jquery.menu.js create mode 100644 js/jquery.register_form.js create mode 100644 js/jquery.sms_paging.js create mode 100644 js/md5.js create mode 100644 js/modernizr.custom.70111.js create mode 100644 js/viewimageresize.js create mode 100644 js/wrest.js create mode 100644 js/zip.js create mode 100644 lib/Excel/itemexcel.xls create mode 100644 lib/Excel/oleread.inc create mode 100644 lib/Excel/php_writeexcel/class.writeexcel_biffwriter.inc.php create mode 100644 lib/Excel/php_writeexcel/class.writeexcel_format.inc.php create mode 100644 lib/Excel/php_writeexcel/class.writeexcel_formula.inc.php create mode 100644 lib/Excel/php_writeexcel/class.writeexcel_olewriter.inc.php create mode 100644 lib/Excel/php_writeexcel/class.writeexcel_workbook.inc.php create mode 100644 lib/Excel/php_writeexcel/class.writeexcel_workbookbig.inc.php create mode 100644 lib/Excel/php_writeexcel/class.writeexcel_worksheet.inc.php create mode 100644 lib/Excel/reader.php create mode 100644 lib/common.lib.php create mode 100644 lib/connect.lib.php create mode 100644 lib/editor.lib.php create mode 100644 lib/icode.sms.lib.php create mode 100644 lib/latest.lib.php create mode 100644 lib/mailer.lib.php create mode 100644 lib/mobile.lib.php create mode 100644 lib/outlogin.lib.php create mode 100644 lib/poll.lib.php create mode 100644 lib/popular.lib.php create mode 100644 lib/register.lib.php create mode 100644 lib/thumbnail.lib.php create mode 100644 lib/visit.lib.php create mode 100644 mobile/_head.php create mode 100644 mobile/_tail.php create mode 100644 mobile/content.php create mode 100644 mobile/group.php create mode 100644 mobile/head.php create mode 100644 mobile/index.php create mode 100644 mobile/newwin.inc.php create mode 100644 mobile/skin/board/basic/img/icon_file.gif create mode 100644 mobile/skin/board/basic/img/icon_hot.gif create mode 100644 mobile/skin/board/basic/img/icon_img.gif create mode 100644 mobile/skin/board/basic/img/icon_link.gif create mode 100644 mobile/skin/board/basic/img/icon_mobile.gif create mode 100644 mobile/skin/board/basic/img/icon_movie.gif create mode 100644 mobile/skin/board/basic/img/icon_new.gif create mode 100644 mobile/skin/board/basic/img/icon_reply.gif create mode 100644 mobile/skin/board/basic/img/icon_secret.gif create mode 100644 mobile/skin/board/basic/img/icon_sound.gif create mode 100644 mobile/skin/board/basic/list.skin.php create mode 100644 mobile/skin/board/basic/style.css create mode 100644 mobile/skin/board/basic/view.skin.php create mode 100644 mobile/skin/board/basic/view_comment.skin.php create mode 100644 mobile/skin/board/basic/write.skin.php create mode 100644 mobile/skin/board/gallery/img/icon_file.gif create mode 100644 mobile/skin/board/gallery/img/icon_hot.gif create mode 100644 mobile/skin/board/gallery/img/icon_img.gif create mode 100644 mobile/skin/board/gallery/img/icon_link.gif create mode 100644 mobile/skin/board/gallery/img/icon_mobile.gif create mode 100644 mobile/skin/board/gallery/img/icon_movie.gif create mode 100644 mobile/skin/board/gallery/img/icon_new.gif create mode 100644 mobile/skin/board/gallery/img/icon_reply.gif create mode 100644 mobile/skin/board/gallery/img/icon_secret.gif create mode 100644 mobile/skin/board/gallery/img/icon_sound.gif create mode 100644 mobile/skin/board/gallery/list.skin.php create mode 100644 mobile/skin/board/gallery/style.css create mode 100644 mobile/skin/board/gallery/view.skin.php create mode 100644 mobile/skin/board/gallery/view_comment.skin.php create mode 100644 mobile/skin/board/gallery/write.skin.php create mode 100644 mobile/skin/connect/basic/connect.skin.php create mode 100644 mobile/skin/connect/basic/current_connect.skin.php create mode 100644 mobile/skin/connect/basic/style.css create mode 100644 mobile/skin/faq/basic/list.skin.php create mode 100644 mobile/skin/faq/basic/style.css create mode 100644 mobile/skin/latest/basic/img/icon_file.gif create mode 100644 mobile/skin/latest/basic/img/icon_hot.gif create mode 100644 mobile/skin/latest/basic/img/icon_img.gif create mode 100644 mobile/skin/latest/basic/img/icon_link.gif create mode 100644 mobile/skin/latest/basic/img/icon_mobile.gif create mode 100644 mobile/skin/latest/basic/img/icon_more.gif create mode 100644 mobile/skin/latest/basic/img/icon_movie.gif create mode 100644 mobile/skin/latest/basic/img/icon_new.gif create mode 100644 mobile/skin/latest/basic/img/icon_reply.gif create mode 100644 mobile/skin/latest/basic/img/icon_secret.gif create mode 100644 mobile/skin/latest/basic/img/icon_sound.gif create mode 100644 mobile/skin/latest/basic/latest.skin.php create mode 100644 mobile/skin/latest/basic/style.css create mode 100644 mobile/skin/member/basic/formmail.skin.php create mode 100644 mobile/skin/member/basic/img/zip_ico_up.gif create mode 100644 mobile/skin/member/basic/login.skin.php create mode 100644 mobile/skin/member/basic/login_check.skin.php create mode 100644 mobile/skin/member/basic/member_confirm.skin.php create mode 100644 mobile/skin/member/basic/memo.skin.php create mode 100644 mobile/skin/member/basic/memo_form.skin.php create mode 100644 mobile/skin/member/basic/memo_view.skin.php create mode 100644 mobile/skin/member/basic/password.skin.php create mode 100644 mobile/skin/member/basic/password_lost.skin.php create mode 100644 mobile/skin/member/basic/point.skin.php create mode 100644 mobile/skin/member/basic/profile.skin.php create mode 100644 mobile/skin/member/basic/register.skin.php create mode 100644 mobile/skin/member/basic/register_form.skin.php create mode 100644 mobile/skin/member/basic/register_result.skin.php create mode 100644 mobile/skin/member/basic/scrap.skin.php create mode 100644 mobile/skin/member/basic/scrap_popin.skin.php create mode 100644 mobile/skin/member/basic/style.css create mode 100644 mobile/skin/member/basic/zip.skin.php create mode 100644 mobile/skin/new/basic/new.skin.php create mode 100644 mobile/skin/new/basic/style.css create mode 100644 mobile/skin/outlogin/basic/outlogin.skin.1.php create mode 100644 mobile/skin/outlogin/basic/outlogin.skin.2.php create mode 100644 mobile/skin/outlogin/basic/style.css create mode 100644 mobile/skin/poll/basic/poll.skin.php create mode 100644 mobile/skin/poll/basic/poll_result.skin.php create mode 100644 mobile/skin/poll/basic/style.css create mode 100644 mobile/skin/popular/basic/popular.skin.php create mode 100644 mobile/skin/popular/basic/style.css create mode 100644 mobile/skin/qa/basic/img/btn_close.gif create mode 100644 mobile/skin/qa/basic/img/icon_answer.gif create mode 100644 mobile/skin/qa/basic/img/icon_file.gif create mode 100644 mobile/skin/qa/basic/img/icon_hot.gif create mode 100644 mobile/skin/qa/basic/img/icon_img.gif create mode 100644 mobile/skin/qa/basic/img/icon_link.gif create mode 100644 mobile/skin/qa/basic/img/icon_mobile.gif create mode 100644 mobile/skin/qa/basic/img/icon_movie.gif create mode 100644 mobile/skin/qa/basic/img/icon_new.gif create mode 100644 mobile/skin/qa/basic/img/icon_secret.gif create mode 100644 mobile/skin/qa/basic/img/icon_sound.gif create mode 100644 mobile/skin/qa/basic/list.skin.php create mode 100644 mobile/skin/qa/basic/style.css create mode 100644 mobile/skin/qa/basic/view.answer.skin.php create mode 100644 mobile/skin/qa/basic/view.answerform.skin.php create mode 100644 mobile/skin/qa/basic/view.skin.php create mode 100644 mobile/skin/qa/basic/write.skin.php create mode 100644 mobile/skin/search/basic/search.skin.php create mode 100644 mobile/skin/search/basic/style.css create mode 100644 mobile/skin/visit/basic/style.css create mode 100644 mobile/skin/visit/basic/visit.skin.php create mode 100644 mobile/tail.php create mode 100644 plugin/PHPMailer_v2.0.4/ChangeLog.txt create mode 100644 plugin/PHPMailer_v2.0.4/LICENSE create mode 100644 plugin/PHPMailer_v2.0.4/README create mode 100644 plugin/PHPMailer_v2.0.4/class.phpmailer.php create mode 100644 plugin/PHPMailer_v2.0.4/class.pop3.php create mode 100644 plugin/PHPMailer_v2.0.4/class.smtp.php create mode 100644 plugin/PHPMailer_v2.0.4/codeworxtech.html create mode 100644 plugin/PHPMailer_v2.0.4/docs/extending.html create mode 100644 plugin/PHPMailer_v2.0.4/docs/faq.html create mode 100644 plugin/PHPMailer_v2.0.4/docs/phpmailer_sm.gif create mode 100644 plugin/PHPMailer_v2.0.4/docs/pop3_article.txt create mode 100644 plugin/PHPMailer_v2.0.4/docs/use_gmail.txt create mode 100644 plugin/PHPMailer_v2.0.4/examples/contents.html create mode 100644 plugin/PHPMailer_v2.0.4/examples/images/bkgrnd.gif create mode 100644 plugin/PHPMailer_v2.0.4/examples/images/phpmailer.gif create mode 100644 plugin/PHPMailer_v2.0.4/examples/images/phpmailer.png create mode 100644 plugin/PHPMailer_v2.0.4/examples/images/phpmailer_mini.gif create mode 100644 plugin/PHPMailer_v2.0.4/examples/index.html create mode 100644 plugin/PHPMailer_v2.0.4/examples/pop3_before_smtp_test.php create mode 100644 plugin/PHPMailer_v2.0.4/examples/test_gmail.php create mode 100644 plugin/PHPMailer_v2.0.4/examples/test_mail.php create mode 100644 plugin/PHPMailer_v2.0.4/examples/test_sendmail.php create mode 100644 plugin/PHPMailer_v2.0.4/examples/test_smtp.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ar.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-br.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ca.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ch.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-cz.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-de.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-dk.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-en.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-es.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-et.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-fi.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-fo.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-fr.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-hu.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-it.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ja.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-nl.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-no.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-pl.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ro.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ru.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-se.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-tr.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-zh.php create mode 100644 plugin/PHPMailer_v2.0.4/language/phpmailer.lang-zh_cn.php create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/PHPMailer.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/POP3.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/SMTP.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/_v2.0.4_PHPMailer_v2.0.4_class_phpmailer_php.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/_v2.0.4_PHPMailer_v2.0.4_class_pop3_php.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/_v2.0.4_PHPMailer_v2.0.4_class_smtp_php.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/__filesource/fsource_PHPMailer__class.phpmailer.php.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/__filesource/fsource_PHPMailer__class.pop3.php.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/__filesource/fsource_PHPMailer__class.smtp.php.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/blank.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/classtrees_PHPMailer.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/elementindex.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/elementindex_PHPMailer.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/index.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/li_PHPMailer.html create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/media/banner.css create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/media/stylesheet.css create mode 100644 plugin/PHPMailer_v2.0.4/phpdocs/packages.html create mode 100644 plugin/editor/ckeditor4/CHANGES.md create mode 100644 plugin/editor/ckeditor4/LICENSE.md create mode 100644 plugin/editor/ckeditor4/README.md create mode 100644 plugin/editor/ckeditor4/build-config.js create mode 100644 plugin/editor/ckeditor4/ckeditor.js create mode 100644 plugin/editor/ckeditor4/config.js create mode 100644 plugin/editor/ckeditor4/contents.css create mode 100644 plugin/editor/ckeditor4/editor.lib.php create mode 100644 plugin/editor/ckeditor4/lang/af.js create mode 100644 plugin/editor/ckeditor4/lang/ar.js create mode 100644 plugin/editor/ckeditor4/lang/bg.js create mode 100644 plugin/editor/ckeditor4/lang/bn.js create mode 100644 plugin/editor/ckeditor4/lang/bs.js create mode 100644 plugin/editor/ckeditor4/lang/ca.js create mode 100644 plugin/editor/ckeditor4/lang/cs.js create mode 100644 plugin/editor/ckeditor4/lang/cy.js create mode 100644 plugin/editor/ckeditor4/lang/da.js create mode 100644 plugin/editor/ckeditor4/lang/de.js create mode 100644 plugin/editor/ckeditor4/lang/el.js create mode 100644 plugin/editor/ckeditor4/lang/en-au.js create mode 100644 plugin/editor/ckeditor4/lang/en-ca.js create mode 100644 plugin/editor/ckeditor4/lang/en-gb.js create mode 100644 plugin/editor/ckeditor4/lang/en.js create mode 100644 plugin/editor/ckeditor4/lang/eo.js create mode 100644 plugin/editor/ckeditor4/lang/es.js create mode 100644 plugin/editor/ckeditor4/lang/et.js create mode 100644 plugin/editor/ckeditor4/lang/eu.js create mode 100644 plugin/editor/ckeditor4/lang/fa.js create mode 100644 plugin/editor/ckeditor4/lang/fi.js create mode 100644 plugin/editor/ckeditor4/lang/fo.js create mode 100644 plugin/editor/ckeditor4/lang/fr-ca.js create mode 100644 plugin/editor/ckeditor4/lang/fr.js create mode 100644 plugin/editor/ckeditor4/lang/gl.js create mode 100644 plugin/editor/ckeditor4/lang/gu.js create mode 100644 plugin/editor/ckeditor4/lang/he.js create mode 100644 plugin/editor/ckeditor4/lang/hi.js create mode 100644 plugin/editor/ckeditor4/lang/hr.js create mode 100644 plugin/editor/ckeditor4/lang/hu.js create mode 100644 plugin/editor/ckeditor4/lang/is.js create mode 100644 plugin/editor/ckeditor4/lang/it.js create mode 100644 plugin/editor/ckeditor4/lang/ja.js create mode 100644 plugin/editor/ckeditor4/lang/ka.js create mode 100644 plugin/editor/ckeditor4/lang/km.js create mode 100644 plugin/editor/ckeditor4/lang/ko.js create mode 100644 plugin/editor/ckeditor4/lang/ku.js create mode 100644 plugin/editor/ckeditor4/lang/lt.js create mode 100644 plugin/editor/ckeditor4/lang/lv.js create mode 100644 plugin/editor/ckeditor4/lang/mk.js create mode 100644 plugin/editor/ckeditor4/lang/mn.js create mode 100644 plugin/editor/ckeditor4/lang/ms.js create mode 100644 plugin/editor/ckeditor4/lang/nb.js create mode 100644 plugin/editor/ckeditor4/lang/nl.js create mode 100644 plugin/editor/ckeditor4/lang/no.js create mode 100644 plugin/editor/ckeditor4/lang/pl.js create mode 100644 plugin/editor/ckeditor4/lang/pt-br.js create mode 100644 plugin/editor/ckeditor4/lang/pt.js create mode 100644 plugin/editor/ckeditor4/lang/ro.js create mode 100644 plugin/editor/ckeditor4/lang/ru.js create mode 100644 plugin/editor/ckeditor4/lang/sk.js create mode 100644 plugin/editor/ckeditor4/lang/sl.js create mode 100644 plugin/editor/ckeditor4/lang/sr-latn.js create mode 100644 plugin/editor/ckeditor4/lang/sr.js create mode 100644 plugin/editor/ckeditor4/lang/sv.js create mode 100644 plugin/editor/ckeditor4/lang/th.js create mode 100644 plugin/editor/ckeditor4/lang/tr.js create mode 100644 plugin/editor/ckeditor4/lang/ug.js create mode 100644 plugin/editor/ckeditor4/lang/uk.js create mode 100644 plugin/editor/ckeditor4/lang/vi.js create mode 100644 plugin/editor/ckeditor4/lang/zh-cn.js create mode 100644 plugin/editor/ckeditor4/lang/zh.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/a11yhelp.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/_translationstatus.txt create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/ar.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/bg.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/ca.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/cs.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/cy.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/da.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/de.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/el.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/en.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/eo.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/et.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/fa.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/fi.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/fr.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/gu.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/he.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/hi.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/hr.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/hu.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/it.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/ku.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/lt.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/lv.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/mk.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/mn.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/nb.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/nl.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/no.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/pl.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/pt-br.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/pt.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/ro.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/ru.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/sk.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/sl.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/tr.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/ug.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/uk.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/vi.js create mode 100644 plugin/editor/ckeditor4/plugins/a11yhelp/dialogs/lang/zh-cn.js create mode 100644 plugin/editor/ckeditor4/plugins/about/dialogs/about.js create mode 100644 plugin/editor/ckeditor4/plugins/about/dialogs/logo_ckeditor.png create mode 100644 plugin/editor/ckeditor4/plugins/clipboard/dialogs/paste.js create mode 100644 plugin/editor/ckeditor4/plugins/colordialog/dialogs/colordialog.js create mode 100644 plugin/editor/ckeditor4/plugins/dialog/dialogDefinition.js create mode 100644 plugin/editor/ckeditor4/plugins/div/dialogs/div.js create mode 100644 plugin/editor/ckeditor4/plugins/fakeobjects/images/spacer.gif create mode 100644 plugin/editor/ckeditor4/plugins/find/dialogs/find.js create mode 100644 plugin/editor/ckeditor4/plugins/flash/dialogs/flash.js create mode 100644 plugin/editor/ckeditor4/plugins/flash/images/placeholder.png create mode 100644 plugin/editor/ckeditor4/plugins/forms/dialogs/button.js create mode 100644 plugin/editor/ckeditor4/plugins/forms/dialogs/checkbox.js create mode 100644 plugin/editor/ckeditor4/plugins/forms/dialogs/form.js create mode 100644 plugin/editor/ckeditor4/plugins/forms/dialogs/hiddenfield.js create mode 100644 plugin/editor/ckeditor4/plugins/forms/dialogs/radio.js create mode 100644 plugin/editor/ckeditor4/plugins/forms/dialogs/select.js create mode 100644 plugin/editor/ckeditor4/plugins/forms/dialogs/textarea.js create mode 100644 plugin/editor/ckeditor4/plugins/forms/dialogs/textfield.js create mode 100644 plugin/editor/ckeditor4/plugins/forms/images/hiddenfield.gif create mode 100644 plugin/editor/ckeditor4/plugins/icons.png create mode 100644 plugin/editor/ckeditor4/plugins/iframe/dialogs/iframe.js create mode 100644 plugin/editor/ckeditor4/plugins/iframe/images/placeholder.png create mode 100644 plugin/editor/ckeditor4/plugins/image/dialogs/image.js create mode 100644 plugin/editor/ckeditor4/plugins/image/images/noimage.png create mode 100644 plugin/editor/ckeditor4/plugins/link/dialogs/anchor.js create mode 100644 plugin/editor/ckeditor4/plugins/link/dialogs/link.js create mode 100644 plugin/editor/ckeditor4/plugins/link/images/anchor.png create mode 100644 plugin/editor/ckeditor4/plugins/liststyle/dialogs/liststyle.js create mode 100644 plugin/editor/ckeditor4/plugins/magicline/images/icon.png create mode 100644 plugin/editor/ckeditor4/plugins/pagebreak/images/pagebreak.gif create mode 100644 plugin/editor/ckeditor4/plugins/pastefromword/filter/default.js create mode 100644 plugin/editor/ckeditor4/plugins/preview/preview.html create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_address.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_blockquote.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_div.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_h1.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_h2.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_h3.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_h4.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_h5.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_h6.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_p.png create mode 100644 plugin/editor/ckeditor4/plugins/showblocks/images/block_pre.png create mode 100644 plugin/editor/ckeditor4/plugins/smiley/dialogs/smiley.js create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/angel_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/angry_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/broken_heart.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/confused_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/cry_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/devil_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/embaressed_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/embarrassed_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/envelope.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/heart.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/kiss.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/lightbulb.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/omg_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/regular_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/sad_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/shades_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/teeth_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/thumbs_down.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/thumbs_up.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/tongue_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/tounge_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/whatchutalkingabout_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/smiley/images/wink_smile.gif create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/_translationstatus.txt create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/ca.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/cs.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/cy.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/de.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/el.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/en.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/eo.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/et.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/fa.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/fi.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/fr.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/he.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/hr.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/it.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/ku.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/lv.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/nb.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/nl.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/no.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/pt-br.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/sk.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/tr.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/ug.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/lang/zh-cn.js create mode 100644 plugin/editor/ckeditor4/plugins/specialchar/dialogs/specialchar.js create mode 100644 plugin/editor/ckeditor4/plugins/table/dialogs/table.js create mode 100644 plugin/editor/ckeditor4/plugins/tabletools/dialogs/tableCell.js create mode 100644 plugin/editor/ckeditor4/plugins/templates/dialogs/templates.css create mode 100644 plugin/editor/ckeditor4/plugins/templates/dialogs/templates.js create mode 100644 plugin/editor/ckeditor4/plugins/templates/templates/default.js create mode 100644 plugin/editor/ckeditor4/plugins/templates/templates/images/template1.gif create mode 100644 plugin/editor/ckeditor4/plugins/templates/templates/images/template2.gif create mode 100644 plugin/editor/ckeditor4/plugins/templates/templates/images/template3.gif create mode 100644 plugin/editor/ckeditor4/samples/ajax.html create mode 100644 plugin/editor/ckeditor4/samples/api.html create mode 100644 plugin/editor/ckeditor4/samples/appendto.html create mode 100644 plugin/editor/ckeditor4/samples/assets/inlineall/logo.png create mode 100644 plugin/editor/ckeditor4/samples/assets/outputxhtml/outputxhtml.css create mode 100644 plugin/editor/ckeditor4/samples/assets/posteddata.php create mode 100644 plugin/editor/ckeditor4/samples/assets/sample.css create mode 100644 plugin/editor/ckeditor4/samples/assets/sample.jpg create mode 100644 plugin/editor/ckeditor4/samples/assets/uilanguages/languages.js create mode 100644 plugin/editor/ckeditor4/samples/divreplace.html create mode 100644 plugin/editor/ckeditor4/samples/index.html create mode 100644 plugin/editor/ckeditor4/samples/inlineall.html create mode 100644 plugin/editor/ckeditor4/samples/inlinebycode.html create mode 100644 plugin/editor/ckeditor4/samples/plugins/dialog/assets/my_dialog.js create mode 100644 plugin/editor/ckeditor4/samples/plugins/dialog/dialog.html create mode 100644 plugin/editor/ckeditor4/samples/plugins/enterkey/enterkey.html create mode 100644 plugin/editor/ckeditor4/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.fla create mode 100644 plugin/editor/ckeditor4/samples/plugins/htmlwriter/assets/outputforflash/outputforflash.swf create mode 100644 plugin/editor/ckeditor4/samples/plugins/htmlwriter/assets/outputforflash/swfobject.js create mode 100644 plugin/editor/ckeditor4/samples/plugins/htmlwriter/outputforflash.html create mode 100644 plugin/editor/ckeditor4/samples/plugins/htmlwriter/outputhtml.html create mode 100644 plugin/editor/ckeditor4/samples/plugins/magicline/magicline.html create mode 100644 plugin/editor/ckeditor4/samples/plugins/toolbar/toolbar.html create mode 100644 plugin/editor/ckeditor4/samples/plugins/wysiwygarea/fullpage.html create mode 100644 plugin/editor/ckeditor4/samples/readonly.html create mode 100644 plugin/editor/ckeditor4/samples/replacebyclass.html create mode 100644 plugin/editor/ckeditor4/samples/replacebycode.html create mode 100644 plugin/editor/ckeditor4/samples/sample.css create mode 100644 plugin/editor/ckeditor4/samples/sample.js create mode 100644 plugin/editor/ckeditor4/samples/sample_posteddata.php create mode 100644 plugin/editor/ckeditor4/samples/tabindex.html create mode 100644 plugin/editor/ckeditor4/samples/uicolor.html create mode 100644 plugin/editor/ckeditor4/samples/uilanguages.html create mode 100644 plugin/editor/ckeditor4/samples/xhtmlstyle.html create mode 100644 plugin/editor/ckeditor4/shortcut.html create mode 100644 plugin/editor/ckeditor4/skins/moono/dialog.css create mode 100644 plugin/editor/ckeditor4/skins/moono/dialog_ie.css create mode 100644 plugin/editor/ckeditor4/skins/moono/dialog_ie7.css create mode 100644 plugin/editor/ckeditor4/skins/moono/dialog_ie8.css create mode 100644 plugin/editor/ckeditor4/skins/moono/dialog_opera.css create mode 100644 plugin/editor/ckeditor4/skins/moono/editor.css create mode 100644 plugin/editor/ckeditor4/skins/moono/editor_gecko.css create mode 100644 plugin/editor/ckeditor4/skins/moono/editor_ie.css create mode 100644 plugin/editor/ckeditor4/skins/moono/editor_ie7.css create mode 100644 plugin/editor/ckeditor4/skins/moono/editor_ie8.css create mode 100644 plugin/editor/ckeditor4/skins/moono/icons.png create mode 100644 plugin/editor/ckeditor4/skins/moono/images/arrow.png create mode 100644 plugin/editor/ckeditor4/skins/moono/images/close.png create mode 100644 plugin/editor/ckeditor4/skins/moono/images/mini.png create mode 100644 plugin/editor/ckeditor4/skins/moono/readme.md create mode 100644 plugin/editor/ckeditor4/styles.js create mode 100644 plugin/editor/ckeditor4/upload.php create mode 100644 plugin/htmlpurifier/HTMLPurifier.standalone.php create mode 100644 plugin/htmlpurifier/safeiframe.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Builder/Xml.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Exception.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Interchange.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Interchange/Directive.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Interchange/Id.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/InterchangeBuilder.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/Validator.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/ValidatorAtom.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema.ser create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveSpansWithoutAttributes.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowedFonts.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.ForbiddenProperties.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/CSS.Trusted.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPermissions.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.DisableExcludes.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.EnableIDNA.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.Language.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.NormalizeNewlines.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.RemoveProcessingInstructions.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedComments.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedCommentsRegexp.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.FlashAllowFullScreen.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Nofollow.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.SafeIframe.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.SafeScripting.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TargetBlank.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Output.FixInnerHTML.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Output.FlashCompat.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.Base.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.Host.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/URI.SafeIframeRegexp.txt create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/ConfigSchema/schema/info.ini create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/EntityLookup/entities.ser create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Filter/ExtractStyleBlocks.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Filter/YouTube.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Language/classes/en-x-test.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Language/messages/en-x-test.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Language/messages/en-x-testmini.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Language/messages/en.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Lexer/PH5P.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Printer.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Printer/CSSDefinition.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.css create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.js create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Printer/ConfigForm.php create mode 100644 plugin/htmlpurifier/standalone/HTMLPurifier/Printer/HTMLDefinition.php create mode 100644 plugin/jquery-ui/datepicker.php create mode 100644 plugin/kcaptcha/_common.php create mode 100644 plugin/kcaptcha/captcha.lib.php create mode 100644 plugin/kcaptcha/fonts/antiqua.png create mode 100644 plugin/kcaptcha/fonts/baskerville.png create mode 100644 plugin/kcaptcha/fonts/batang.png create mode 100644 plugin/kcaptcha/fonts/bookman.png create mode 100644 plugin/kcaptcha/fonts/calisto.png create mode 100644 plugin/kcaptcha/fonts/cambria.png create mode 100644 plugin/kcaptcha/fonts/centaur.png create mode 100644 plugin/kcaptcha/fonts/century.png create mode 100644 plugin/kcaptcha/fonts/chaparral.png create mode 100644 plugin/kcaptcha/fonts/constantia.png create mode 100644 plugin/kcaptcha/fonts/footlight.png create mode 100644 plugin/kcaptcha/fonts/garamond.png create mode 100644 plugin/kcaptcha/fonts/georgia.png create mode 100644 plugin/kcaptcha/fonts/goudy_old.png create mode 100644 plugin/kcaptcha/fonts/kozuka.png create mode 100644 plugin/kcaptcha/fonts/lucida.png create mode 100644 plugin/kcaptcha/fonts/minion.png create mode 100644 plugin/kcaptcha/fonts/palatino.png create mode 100644 plugin/kcaptcha/fonts/perpetua.png create mode 100644 plugin/kcaptcha/fonts/rockwell.png create mode 100644 plugin/kcaptcha/fonts/times.png create mode 100644 plugin/kcaptcha/fonts/warnock.png create mode 100644 plugin/kcaptcha/img/dot.gif create mode 100644 plugin/kcaptcha/img/reload.gif create mode 100644 plugin/kcaptcha/img/sound.gif create mode 100644 plugin/kcaptcha/kcaptcha.js create mode 100644 plugin/kcaptcha/kcaptcha.lib.php create mode 100644 plugin/kcaptcha/kcaptcha_config.php create mode 100644 plugin/kcaptcha/kcaptcha_image.php create mode 100644 plugin/kcaptcha/kcaptcha_mp3.php create mode 100644 plugin/kcaptcha/kcaptcha_result.php create mode 100644 plugin/kcaptcha/kcaptcha_session.php create mode 100644 plugin/kcaptcha/mp3/basic/0.mp3 create mode 100644 plugin/kcaptcha/mp3/basic/1.mp3 create mode 100644 plugin/kcaptcha/mp3/basic/2.mp3 create mode 100644 plugin/kcaptcha/mp3/basic/3.mp3 create mode 100644 plugin/kcaptcha/mp3/basic/4.mp3 create mode 100644 plugin/kcaptcha/mp3/basic/5.mp3 create mode 100644 plugin/kcaptcha/mp3/basic/6.mp3 create mode 100644 plugin/kcaptcha/mp3/basic/7.mp3 create mode 100644 plugin/kcaptcha/mp3/basic/8.mp3 create mode 100644 plugin/kcaptcha/mp3/basic/9.mp3 create mode 100644 plugin/kcaptcha/mp3/jmoon/0.mp3 create mode 100644 plugin/kcaptcha/mp3/jmoon/1.mp3 create mode 100644 plugin/kcaptcha/mp3/jmoon/2.mp3 create mode 100644 plugin/kcaptcha/mp3/jmoon/3.mp3 create mode 100644 plugin/kcaptcha/mp3/jmoon/4.mp3 create mode 100644 plugin/kcaptcha/mp3/jmoon/5.mp3 create mode 100644 plugin/kcaptcha/mp3/jmoon/6.mp3 create mode 100644 plugin/kcaptcha/mp3/jmoon/7.mp3 create mode 100644 plugin/kcaptcha/mp3/jmoon/8.mp3 create mode 100644 plugin/kcaptcha/mp3/jmoon/9.mp3 create mode 100644 plugin/kcpcert/_common.php create mode 100644 plugin/kcpcert/bin/ct_cli create mode 100644 plugin/kcpcert/kcpcert_config.php create mode 100644 plugin/kcpcert/kcpcert_form.php create mode 100644 plugin/kcpcert/kcpcert_result.php create mode 100644 plugin/kcpcert/lib/ct_cli_lib.php create mode 100644 plugin/lgxpay/AuthOnlyReq.php create mode 100644 plugin/lgxpay/AuthOnlyRes.php create mode 100644 plugin/lgxpay/_common.php create mode 100644 plugin/lgxpay/img/btn_gouplus.jpg create mode 100644 plugin/lgxpay/img/upluslogo.jpg create mode 100644 plugin/lgxpay/lgdacom/JSON.php create mode 100644 plugin/lgxpay/lgdacom/XPayClient.php create mode 100644 plugin/lgxpay/lgdacom/XPayClient4DB.php create mode 100644 plugin/lgxpay/lgdacom/conf/ca-bundle.crt create mode 100644 plugin/lgxpay/lgdacom/conf/lgdacom.conf create mode 100644 plugin/lgxpay/lgdacom/conf/mall.conf create mode 100644 plugin/lgxpay/lgdacom/patch.php create mode 100644 plugin/lgxpay/lgdacom/ping.php create mode 100644 plugin/okname/_common.php create mode 100644 plugin/okname/bin/libiconv2.dll create mode 100644 plugin/okname/bin/okname create mode 100644 plugin/okname/bin/okname.exe create mode 100644 plugin/okname/bin/okname_x64 create mode 100644 plugin/okname/bin/oknamex64.exe create mode 100644 plugin/okname/hpcert.config.php create mode 100644 plugin/okname/hpcert1.php create mode 100644 plugin/okname/hpcert2.php create mode 100644 plugin/okname/ipin.config.php create mode 100644 plugin/okname/ipin1.php create mode 100644 plugin/okname/ipin2.php create mode 100644 plugin/okname/key/.htaccess create mode 100644 plugin/okname/key_dir_check.php create mode 100644 plugin/sms5/JSON.php create mode 100644 plugin/sms5/_common.php create mode 100644 plugin/sms5/ajax.sms_emoticon.php create mode 100644 plugin/sms5/index.php create mode 100644 plugin/sms5/skin/basic/img/ajax-loader.gif create mode 100644 plugin/sms5/skin/basic/img/box_ico.gif create mode 100644 plugin/sms5/skin/basic/img/scemo_ico.gif create mode 100644 plugin/sms5/skin/basic/mobile.css create mode 100644 plugin/sms5/skin/basic/style.css create mode 100644 plugin/sms5/skin/basic/write.skin.php create mode 100644 plugin/sms5/skin/basic/write_mobile.skin.php create mode 100644 plugin/sms5/sms5.lib.php create mode 100644 plugin/sms5/write.php create mode 100644 plugin/sms5/write_update.php create mode 100644 plugin/sns/facebook/.gitignore create mode 100644 plugin/sns/facebook/.travis.yml create mode 100644 plugin/sns/facebook/_common.php create mode 100644 plugin/sns/facebook/callback.php create mode 100644 plugin/sns/facebook/changelog.md create mode 100644 plugin/sns/facebook/composer.json create mode 100644 plugin/sns/facebook/examples/example.php create mode 100644 plugin/sns/facebook/examples/with_js_sdk.php create mode 100644 plugin/sns/facebook/readme.md create mode 100644 plugin/sns/facebook/src/base_facebook.php create mode 100644 plugin/sns/facebook/src/facebook.php create mode 100644 plugin/sns/facebook/src/fb_ca_chain_bundle.crt create mode 100644 plugin/sns/facebook/tests/bootstrap.php create mode 100644 plugin/sns/facebook/tests/tests.php create mode 100644 plugin/sns/icon/facebook.png create mode 100644 plugin/sns/icon/facebook_cmt.png create mode 100644 plugin/sns/icon/facebook_off.png create mode 100644 plugin/sns/icon/gplus.png create mode 100644 plugin/sns/icon/gplus_off.png create mode 100644 plugin/sns/icon/kakaotalk.png create mode 100644 plugin/sns/icon/kakaotalk_off.png create mode 100644 plugin/sns/icon/twitter.png create mode 100644 plugin/sns/icon/twitter_cmt.png create mode 100644 plugin/sns/icon/twitter_off.png create mode 100644 plugin/sns/twitter/.gitignore create mode 100644 plugin/sns/twitter/LICENSE create mode 100644 plugin/sns/twitter/README.md create mode 100644 plugin/sns/twitter/_common.php create mode 100644 plugin/sns/twitter/callback-sample.php create mode 100644 plugin/sns/twitter/callback.php create mode 100644 plugin/sns/twitter/clearsessions.php create mode 100644 plugin/sns/twitter/config-sample.php create mode 100644 plugin/sns/twitter/connect.php create mode 100644 plugin/sns/twitter/html.inc create mode 100644 plugin/sns/twitter/images/darker.png create mode 100644 plugin/sns/twitter/images/lighter.png create mode 100644 plugin/sns/twitter/index.php create mode 100644 plugin/sns/twitter/redirect.php create mode 100644 plugin/sns/twitter/twitterconfig.php create mode 100644 plugin/sns/twitter/twitteroauth/OAuth.php create mode 100644 plugin/sns/twitter/twitteroauth/twitteroauth.php create mode 100644 plugin/sns/view.sns.skin.php create mode 100644 plugin/sns/view_comment_list.sns.skin.php create mode 100644 plugin/sns/view_comment_write.sns.skin.php create mode 100644 plugin/syndi/_common.php create mode 100644 plugin/syndi/config/site.config.php create mode 100644 plugin/syndi/func/site.func.php create mode 100644 plugin/syndi/include/include.adm.board_delete.inc.php create mode 100644 plugin/syndi/include/include.adm.board_form_update.php create mode 100644 plugin/syndi/include/include.adm.boardgroup_form_update.php create mode 100644 plugin/syndi/include/include.bbs.delete.php create mode 100644 plugin/syndi/include/include.bbs.delete_all.php create mode 100644 plugin/syndi/include/include.bbs.move_update.php create mode 100644 plugin/syndi/include/include.bbs.write_update.php create mode 100644 plugin/syndi/install.php create mode 100644 plugin/syndi/libs/SyndicationArticle.class.php create mode 100644 plugin/syndi/libs/SyndicationChannel.class.php create mode 100644 plugin/syndi/libs/SyndicationDeleted.class.php create mode 100644 plugin/syndi/libs/SyndicationHandler.class.php create mode 100644 plugin/syndi/libs/SyndicationObject.class.php create mode 100644 plugin/syndi/libs/SyndicationPing.class.php create mode 100644 plugin/syndi/libs/SyndicationSite.class.php create mode 100644 plugin/syndi/libs/SyndicationStatus.class.php create mode 100644 plugin/syndi/ping.php create mode 100644 plugin/syndi/syndi_echo.php create mode 100644 skin/board/basic/img/btn_close.gif create mode 100644 skin/board/basic/img/icon_file.gif create mode 100644 skin/board/basic/img/icon_hot.gif create mode 100644 skin/board/basic/img/icon_img.gif create mode 100644 skin/board/basic/img/icon_link.gif create mode 100644 skin/board/basic/img/icon_mobile.gif create mode 100644 skin/board/basic/img/icon_movie.gif create mode 100644 skin/board/basic/img/icon_new.gif create mode 100644 skin/board/basic/img/icon_reply.gif create mode 100644 skin/board/basic/img/icon_secret.gif create mode 100644 skin/board/basic/img/icon_sound.gif create mode 100644 skin/board/basic/list.skin.php create mode 100644 skin/board/basic/style.css create mode 100644 skin/board/basic/view.skin.php create mode 100644 skin/board/basic/view_comment.skin.php create mode 100644 skin/board/basic/write.skin.php create mode 100644 skin/board/gallery/img/btn_close.gif create mode 100644 skin/board/gallery/img/icon_file.gif create mode 100644 skin/board/gallery/img/icon_hot.gif create mode 100644 skin/board/gallery/img/icon_img.gif create mode 100644 skin/board/gallery/img/icon_link.gif create mode 100644 skin/board/gallery/img/icon_mobile.gif create mode 100644 skin/board/gallery/img/icon_movie.gif create mode 100644 skin/board/gallery/img/icon_new.gif create mode 100644 skin/board/gallery/img/icon_reply.gif create mode 100644 skin/board/gallery/img/icon_secret.gif create mode 100644 skin/board/gallery/img/icon_sound.gif create mode 100644 skin/board/gallery/list.skin.php create mode 100644 skin/board/gallery/style.css create mode 100644 skin/board/gallery/view.skin.php create mode 100644 skin/board/gallery/view_comment.skin.php create mode 100644 skin/board/gallery/write.skin.php create mode 100644 skin/connect/basic/connect.skin.php create mode 100644 skin/connect/basic/current_connect.skin.php create mode 100644 skin/connect/basic/style.css create mode 100644 skin/faq/basic/list.skin.php create mode 100644 skin/faq/basic/style.css create mode 100644 skin/latest/basic/img/icon_file.gif create mode 100644 skin/latest/basic/img/icon_hot.gif create mode 100644 skin/latest/basic/img/icon_img.gif create mode 100644 skin/latest/basic/img/icon_link.gif create mode 100644 skin/latest/basic/img/icon_mobile.gif create mode 100644 skin/latest/basic/img/icon_more.gif create mode 100644 skin/latest/basic/img/icon_movie.gif create mode 100644 skin/latest/basic/img/icon_new.gif create mode 100644 skin/latest/basic/img/icon_reply.gif create mode 100644 skin/latest/basic/img/icon_secret.gif create mode 100644 skin/latest/basic/img/icon_sound.gif create mode 100644 skin/latest/basic/latest.skin.php create mode 100644 skin/latest/basic/style.css create mode 100644 skin/member/basic/formmail.skin.php create mode 100644 skin/member/basic/img/zip_ico_up.gif create mode 100644 skin/member/basic/login.skin.php create mode 100644 skin/member/basic/login_check.skin.php create mode 100644 skin/member/basic/member_confirm.skin.php create mode 100644 skin/member/basic/memo.skin.php create mode 100644 skin/member/basic/memo_form.skin.php create mode 100644 skin/member/basic/memo_view.skin.php create mode 100644 skin/member/basic/password.skin.php create mode 100644 skin/member/basic/password_lost.skin.php create mode 100644 skin/member/basic/point.skin.php create mode 100644 skin/member/basic/profile.skin.php create mode 100644 skin/member/basic/register.skin.php create mode 100644 skin/member/basic/register_form.skin.php create mode 100644 skin/member/basic/register_result.skin.php create mode 100644 skin/member/basic/scrap.skin.php create mode 100644 skin/member/basic/scrap_popin.skin.php create mode 100644 skin/member/basic/style.css create mode 100644 skin/member/basic/zip.skin.php create mode 100644 skin/new/basic/new.skin.php create mode 100644 skin/new/basic/style.css create mode 100644 skin/outlogin/basic/outlogin.skin.1.php create mode 100644 skin/outlogin/basic/outlogin.skin.2.php create mode 100644 skin/outlogin/basic/style.css create mode 100644 skin/poll/basic/poll.skin.php create mode 100644 skin/poll/basic/poll_result.skin.php create mode 100644 skin/poll/basic/style.css create mode 100644 skin/popular/basic/popular.skin.php create mode 100644 skin/popular/basic/style.css create mode 100644 skin/qa/basic/img/btn_close.gif create mode 100644 skin/qa/basic/img/icon_answer.gif create mode 100644 skin/qa/basic/img/icon_file.gif create mode 100644 skin/qa/basic/img/icon_hot.gif create mode 100644 skin/qa/basic/img/icon_img.gif create mode 100644 skin/qa/basic/img/icon_link.gif create mode 100644 skin/qa/basic/img/icon_mobile.gif create mode 100644 skin/qa/basic/img/icon_movie.gif create mode 100644 skin/qa/basic/img/icon_new.gif create mode 100644 skin/qa/basic/img/icon_secret.gif create mode 100644 skin/qa/basic/img/icon_sound.gif create mode 100644 skin/qa/basic/list.skin.php create mode 100644 skin/qa/basic/style.css create mode 100644 skin/qa/basic/view.answer.skin.php create mode 100644 skin/qa/basic/view.answerform.skin.php create mode 100644 skin/qa/basic/view.skin.php create mode 100644 skin/qa/basic/write.skin.php create mode 100644 skin/search/basic/search.skin.php create mode 100644 skin/search/basic/style.css create mode 100644 skin/visit/basic/style.css create mode 100644 skin/visit/basic/visit.skin.php create mode 100644 tail.php create mode 100644 tail.sub.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..6a7de4a7b --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +!.gitignore +/.htaccess +data/ +test/ +sirgle/ +test.php +*.key +*.sh +cheditor*/ +ckeditor43/ +log/ +g5_tree/ diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 000000000..e337cb205 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,208 @@ +소프트웨어 제품은 저작권법 및 국제저작권 협약을 비롯하여, 기타 지적재산권법 및 협약의 보호를 받습니다. + +프로그램 명칭 : 그누보드5 ( GNU Board 5 ) + +저작자 : (주)에스아이알소프트 http://sir.co.kr + +라이센스 (License) + +번역문 아래에 원문이 있습니다. + +주의 ) +1. 번역문과 원문의 내용상 차이가 있는 경우 원문의 내용을 우선으로 따릅니다. +2. 법적인 분쟁이 발생한 경우 저작자의 회사 소재지를 관할하는 관할법원에서 분쟁을 해결합니다. +3. 이 라이센스 파일 및 내용은 저작자를 제외한 어느 누구도 추가, 수정, 삭제할 수 없습니다. + +----- GPL 번역문 -------------------------------------------------------- + +GNU 일반 공중 사용 허가서 +2판, 1991년 6월 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +누구든지 본 사용 허가서를 있는 그대로 복제하고 배포할 수 +있습니다. 그러나 본문에 대한 수정은 허용되지 않습니다. + + + + +전 문 +소프트웨어에 적용되는 대부분의 사용 허가서(license)들은 소프트웨어에 대한 수정과 공유의 자유를 제한하려는 것을 그 목적으로 합니다. 그러나 GNU 일반 공중 사용 허가서(이하, ``GPL''이라고 칭합니다.)는 자유 소프트웨어에 대한 수정과 공유의 자유를 모든 사용자들에게 보장하기 위해서 성립된 것입니다. 자유 소프트웨어 재단이 제공하는 대부분의 소프트웨어들은 GPL에 의해서 관리되고 있으며, 몇몇 소프트웨어에는 별도의 사용 허가서인 GNU 라이브러리 일반 공중 사용 허가서(GNU Library General Public License)를 대신 적용하기도 합니다. 자유 소프트웨어란, 이를 사용하려고 하는 모든 사람에 대해서 동일한 자유와 권리가 함께 양도되는 소프트웨어를 말하며 프로그램 저작자의 의지에 따라 어떠한 종류의 프로그램에도 GPL을 적용할 수 있습니다. 따라서 여러분이 만든 프로그램에도 GPL을 적용할 수 있습니다. + +자유 소프트웨어를 언급할 때 사용되는 ``자유''라는 단어는 무료(無料)를 의미하는 금전적인 측면의 자유가 아니라 구속되지 않는다는 관점에서의 자유를 의미하며, GPL은 자유 소프트웨어를 이용한 복제와 개작, 배포와 수익 사업 등의 가능한 모든 형태의 자유를 실질적으로 보장하고 있습니다. 여기에는 원시 코드(source code)의 전부 또는 일부를 원용해서 개선된 프로그램을 만들거나 새로운 프로그램을 창작할 수 있는 자유가 포함되며, 자신에게 양도된 이러한 자유와 권리를 보다 명확하게 인식할 수 있도록 하기 위한 규정도 포함되어 있습니다. + +GPL은 GPL 안에 소프트웨어를 양도받을 사용자의 권리를 제한하는 조항과 단서를 별항으로 추가시키지 못하게 함으로써 사용자들의 자유와 권리를 실제적으로 보장하고 있습니다. 자유 소프트웨어의 개작과 배포에 관계하고 있는 사람들은 이러한 무조건적인 권리 양도 규정을 준수해야만 합니다. + +예를 들어 GPL 프로그램을 배포할 경우에는 프로그램의 유료 판매나 무료 배포에 관계없이 자신이 해당 프로그램에 대해서 가질 수 있었던 모든 권리를, 프로그램을 받게될 사람에게 그대로 양도해 주어야 합니다. 이 경우, 프로그램의 원시 코드를 함께 제공하거나 원시 코드를 구할 수 있는 방법을 확실히 알려주어야 하고 이러한 모든 사항들을 사용자들이 분명히 알 수 있도록 명시해야 합니다. + +자유 소프트웨어 재단은 다음과 같은 두 가지 단계를 통해서 사용자들을 권리를 보호합니다. (1) 소프트웨어에 저작권을 설정합니다. (2) 저작권의 양도에 관한 실정법에 의해서 유효한 법률적 효력을 갖는 GPL을 통해 소프트웨어를 복제하거나 개작 및 배포할 수 있는 권리를 사용자들에게 부여합니다. + +자유 소프트웨어를 사용하는 사람들은 반복적인 재배포 과정을 통해 소프트웨어 자체에 수정과 변형이 일어날 수도 있으며, 이는 최초의 저작자가 만든 소프트웨어가 갖고 있는 문제가 아닐 수 있다는 개연성을 인식하고 있어야 합니다. 우리는 개작과 재배포 과정에서 다른 사람에 의해 발생된 문제로 인해 프로그램 원저작자들의 신망이 훼손되는 것을 원하지 않습니다. GPL에 자유 소프트웨어에 대한 어떠한 형태의 보증도 규정하지 않는 이유는 이러한 점들이 고려되었기 때문이며, 이는 프로그램 원저작자와 자유 소프트웨어 재단의 자유로운 활동을 보장하는 현실적인 수단이기도 합니다. + +특허 제도는 자유 소프트웨어의 발전을 위협하는 요소일 수밖에 없습니다. 자유 프로그램을 재배포하는 사람들이 개별적으로 특허를 취득하게 되면, 결과적으로 그 프로그램이 독점 소프트웨어가 될 가능성이 있습니다. 자유 소프트웨어 재단은 이러한 문제에 대처하기 위해서 어떠한 특허에 대해서도 그 사용 권리를 모든 사람들(이하, ``공중(公衆)''이라고 칭합니다.)에게 자유롭게 허용하는 경우에 한해서만 자유 소프트웨어와 함께 사용할 수 있다는 것을 명확히 밝히고 있습니다. + +복제(copying)와 개작(modification) 및 배포(distribution)에 관련된 구체적인 조건과 규정은 다음과 같습니다. + + +복제와 개작 및 배포에 관한 조건과 규정 + +제 0 조. 본 허가서는 GNU 일반 공중 사용 허가서의 규정에 따라 배포될 수 있다는 사항이 저작권자에 의해서 명시된 모든 컴퓨터 프로그램 저작물에 대해서 동일하게 적용됩니다. 컴퓨터 프로그램 저작물(이하, ``프로그램''이라고 칭합니다.)이란 특정한 결과를 얻기 위해서 컴퓨터 등의 정보 처리 능력을 가진 장치(이하, ``컴퓨터''라고 칭합니다.) 내에서 직접 또는 간접으로 사용되는 일련의 지시 및 명령으로 표현된 창작물을 의미하고, ``2차적 프로그램''이란 전술한 프로그램 자신 또는 저작권법의 규정에 따라 프로그램의 전부 또는 상당 부분을 원용하거나 다른 언어로의 번역을 포함할 수 있는 개작 과정을 통해서 창작된 새로운 프로그램과 이와 관련된 저작물을 의미합니다. (이후로 다른 언어로의 번역은 별다른 제한없이 개작의 범위에 포함되는 것으로 간주합니다.) ``피양도자''란 GPL의 규정에 따라 프로그램을 양도받은 사람을 의미하고, ``원(原)프로그램''이란 프로그램을 개작하거나 2차적 프로그램을 만들기 위해서 사용된 최초의 프로그램을 의미합니다. + +본 허가서는 프로그램에 대한 복제와 개작 그리고 배포 행위에 대해서만 적용됩니다. 따라서 프로그램을 실행시키는 행위에 대한 제한은 없습니다. 프로그램의 결과물(output)에는, 그것이 프로그램을 실행시켜서 생성된 것인지 아닌지의 여부에 상관없이 결과물의 내용이 원프로그램으로부터 파생된 2차적 프로그램을 구성했을 때에 한해서 본 허가서의 규정들이 적용됩니다. 2차적 프로그램의 구성 여부는 2차적 프로그램 안에서의 원프로그램의 역할을 토대로 판단합니다. + +제 1 조. 적절한 저작권 표시와 프로그램에 대한 보증이 제공되지 않는다는 사실을 각각의 복제물에 명시하는 한, 피양도자는 프로그램의 원시 코드를 자신이 양도받은 상태 그대로 어떠한 매체를 통해서도 복제하고 배포할 수 있습니다. 복제와 배포가 이루어 질 때는 본 허가서와 프로그램에 대한 보증이 제공되지 않는다는 사실에 대해서 언급되었던 모든 내용을 그대로 유지시켜야 하며, 영문판 GPL을 함께 제공해야 합니다. + +배포자는 복제물을 물리적으로 인도하는데 소요된 비용을 청구할 수 있으며, 선택 사항으로 독자적인 유료 보증을 설정할 수 있습니다. + +제 2 조. 피양도자는 자신이 양도받은 프로그램의 전부나 일부를 개작할 수 있으며, 이를 통해서 2차적 프로그램을 창작할 수 있습니다. 개작된 프로그램이나 창작된 2차적 프로그램은 다음의 사항들을 모두 만족시키는 조건에 한해서, 제1조의 규정에 따라 또다시 복제되고 배포될 수 있습니다. + +제 1 항. 파일을 개작할 때는 파일을 개작한 사실과 그 날짜를 파일 안에 명시해야 합니다. + +제 2 항. 배포하거나 공표하려는 저작물의 전부 또는 일부가 양도받은 프로그램으로부터 파생된 것이라면, 저작물 전체에 대한 사용 권리를 본 허가서의 규정에 따라 공중에게 무상으로 허용해야 합니다. + +제 3 항. 개작된 프로그램의 일반적인 실행 형태가 대화형 구조로 명령어를 읽어 들이는 방식을 취하고 있을 경우에는, 적절한 저작권 표시와 프로그램에 대한 보증이 제공되지 않는다는 사실, (별도의 보증을 설정한 경우라면 해당 내용) 그리고 양도받은 프로그램을 본 규정에 따라 재배포할 수 있다는 사실과 GPL 사본을 참고할 수 있는 방법이 함께 포함된 문구가 프로그램이 대화형 구조로 평이하게 실행된 직후에 화면 또는 지면으로 출력되도록 작성되어야 합니다. (예외 규정: 양도받은 프로그램이 대화형 구조를 갖추고 있다 하더라도 통상적인 실행 환경에서 전술한 사항들이 출력되지 않는 형태였을 경우에는 이를 개작한 프로그램 또한 관련 사항들을 출력시키지 않아도 무방합니다.) + +위의 조항들은 개작된 프로그램 전체에 적용됩니다. 만약, 개작된 프로그램에 포함된 특정 부분이 원프로그램으로부터 파생된 것이 아닌 별도의 독립 저작물로 인정될 만한 상당한 이유가 있을 경우에는 해당 저작물의 개별적인 배포에는 본 허가서의 규정들이 적용되지 않습니다. 그러나 이러한 저작물이 2차적 프로그램의 일부로서 함께 배포된다면 개별적인 저작권과 배포 기준에 상관없이 저작물 모두에 본 허가서가 적용되어야 하며, 전체 저작물에 대한 사용 권리는 공중에게 무상으로 양도됩니다. + +이러한 규정은 개별적인 저작물에 대한 저작자의 권리를 침해하거나 인정하지 않으려는 것이 아니라, 원프로그램으로부터 파생된 2차적 프로그램이나 수집 저작물의 배포를 일관적으로 규제할 수 있는 권리를 행사하기 위한 것입니다. + +원프로그램이나 원프로그램으로부터 파생된 2차적 프로그램을 이들로부터 파생되지 않은 다른 저작물과 함께 단순히 저장하거나 배포할 목적으로 동일한 매체에 모아 놓은 집합물의 경우에는, 원프로그램으로부터 파생되지 않은 다른 저작물에는 본 허가서의 규정들이 적용되지 않습니다. + +제 3 조. 피양도자는 다음 중 하나의 항목을 만족시키는 조건에 한해서 제1조와 제2조의 규정에 따라 프로그램(또는 제2조에서 언급된 2차적 프로그램)을 목적 코드(object code)나 실행물(executable form)의 형태로 복제하고 배포할 수 있습니다. + +제 1 항. 목적 코드나 실행물에 상응하는 컴퓨터가 인식할 수 있는 완전한 원시 코드를 함께 제공해야 합니다. 원시 코드는 제1조와 제2조의 규정에 따라 배포될 수 있어야 하며, 소프트웨어의 교환을 위해서 일반적으로 사용되는 매체를 통해 제공되어야 합니다. + +제 2 항. 배포에 필요한 최소한의 비용만을 받고 목적 코드나 실행물에 상응하는 완전한 원시 코드를 배포하겠다는, 최소한 3년간 유효한 약정서를 함께 제공해야 합니다. 이 약정서는 약정서를 갖고 있는 어떠한 사람에 대해서도 유효해야 합니다. 원시 코드는 컴퓨터가 인식할 수 있는 형태여야 하고 제1조와 제2조의 규정에 따라 배포될 수 있어야 하며, 소프트웨어의 교환을 위해서 일반적으로 사용되는 매체를 통해 제공되어야 합니다. + +제 3 항. 목적 코드나 실행물에 상응하는 원시 코드를 배포하겠다는 약정에 대해서 자신이 양도받은 정보를 함께 제공해야 합니다. (제3항은 위의 제2항에 따라 원시 코드를 배포하겠다는 약정을 프로그램의 목적 코드나 실행물과 함께 제공 받았고, 동시에 비상업적인 배포를 하고자 할 경우에 한해서만 허용됩니다.) + +저작물에 대한 원시 코드란 해당 저작물을 개작하기에 적절한 형식을 의미합니다. 실행물에 대한 완전한 원시 코드란 실행물에 포함된 모든 모듈들의 원시 코드와 이와 관련된 인터페이스 정의 파일 모두, 그리고 실행물의 컴파일과 설치를 제어하는데 사용된 스크립트 전부를 의미합니다. 그러나 특별한 예외의 하나로서, 실행물이 실행될 운영체제의 주요 부분(컴파일러나 커널 등)과 함께 (원시 코드나 바이너리의 형태로) 일반적으로 배포되는 구성 요소들은 이러한 구성 요소 자체가 실행물에 수반되지 않는 한 원시 코드의 배포 대상에서 제외되어도 무방합니다. + +목적 코드나 실행물을 지정한 장소로부터 복제해 갈 수 있게 하는 방식으로 배포할 경우, 동일한 장소로부터 원시 코드를 복제할 수 있는 동등한 접근 방법을 제공한다면 이는 원시 코드를 목적 코드와 함께 복제되도록 설정하지 않았다고 하더라도 원시 코드를 배포하는 것으로 간주됩니다. + +제 4 조. 본 허가서에 의해 명시적으로 이루어 지지 않는 한 프로그램에 대한 복제와 개작 및 하위 허가권 설정과 배포가 성립될 수 없습니다. 이와 관련된 어떠한 행위도 무효이며 본 허가서가 보장한 권리는 자동으로 소멸됩니다. 그러나 본 허가서의 규정에 따라 프로그램의 복제물이나 권리를 양도받았던 제3자는 본 허가서의 규정들을 준수하는 한, 배포자의 권리 소멸에 관계없이 사용상의 권리를 계속해서 유지할 수 있습니다. + +제 5 조. 본 허가서는 서명이나 날인이 수반되는 형식을 갖고 있지 않기 때문에 피양도자가 본 허가서의 내용을 반드시 받아들여야 할 필요는 없습니다. 그러나 프로그램이나 프로그램에 기반한 2차적 프로그램에 대한 개작 및 배포를 허용하는 것은 본 허가서에 의해서만 가능합니다. 만약 본 허가서에 동의하지 않을 경우에는 이러한 행위들이 법률적으로 금지됩니다. 따라서 프로그램(또는 프로그램에 기반한 2차적 프로그램)을 개작하거나 배포하는 행위는 이에 따른 본 허가서의 내용에 동의한다는 것을 의미하며, 복제와 개작 및 배포에 관한 본 허가서의 조건과 규정들을 모두 받아들이겠다는 의미로 간주됩니다. + +제 6 조. 피양도자에 의해서 프로그램(또는 프로그램에 기반한 2차적 프로그램)이 반복적으로 재배포될 경우, 각 단계에서의 피양도자는 본 허가서의 규정에 따른 프로그램의 복제와 개작 및 배포에 대한 권리를 최초의 양도자로부터 양도받은 것으로 자동적으로 간주됩니다. 프로그램(또는 프로그램에 기반한 2차적 프로그램)을 배포할 때는 피양도자의 권리의 행사를 제한할 수 있는 어떠한 사항도 추가할 수 없습니다. 그러나 피양도자에게, 재배포가 일어날 시점에서의 제3의 피양도자에게 본 허가서를 준수하도록 강제할 책임은 부과되지 않습니다. + +제 7 조. 법원의 판결이나 특허권 침해에 대한 주장 또는 특허 문제에 국한되지 않은 그밖의 이유들로 인해서 본 허가서의 규정에 배치되는 사항이 발생한다 하더라도 그러한 사항이 선행하거나 본 허가서의 조건과 규정들이 면제되는 것은 아닙니다. 따라서 법원의 명령이나 합의 등에 의해서 본 허가서에 위배되는 사항들이 발생한 상황이라도 양측 모두를 만족시킬 수 없다면 프로그램은 배포될 수 없습니다. 예를 들면, 특정한 특허 관련 허가가 프로그램의 복제물을 직접 또는 간접적인 방법으로 양도받은 임의의 제3자에게 해당 프로그램을 무상으로 재배포할 수 있게 허용하지 않는다면, 그러한 허가와 본 사용 허가를 동시에 만족시키면서 프로그램을 배포할 수 있는 방법은 없습니다. + +본 조항은 특정한 상황에서 본 조항의 일부가 유효하지 않거나 적용될 수 없을 경우에도 본 조항의 나머지 부분들을 적용하기 위한 의도로 만들어 졌습니다. 따라서 그 이외의 상황에서는 본 조항을 전체적으로 적용하면 됩니다. + +본 조항의 목적은 특허나 저작권 침해 등의 행위를 조장하거나 해당 권리를 인정하지 않으려는 것이 아니라, GPL을 통해서 구현되어 있는 자유 소프트웨어의 배포 체계를 통합적으로 보호하기 위한 것입니다. 많은 사람들이 배포 체계에 대한 신뢰있는 지원을 계속해 줌으로써 소프트웨어의 다양한 분야에 많은 공헌을 해 주었습니다. 소프트웨어를 어떠한 배포 체계로 배포할 것인가를 결정하는 것은 전적으로 저작자와 기증자들의 의지에 달려있는 것이지, 일반 사용자들이 강요할 수 있는 문제는 아닙니다. + +본 조항은 본 허가서의 다른 조항들에서 무엇이 중요하게 고려되어야 하는 지를 명확하게 설명하기 위한 목적으로 만들어진 것입니다. + +제 8 조. 특허나 저작권이 설정된 인터페이스로 인해서 특정 국가에서 프로그램의 배포와 사용이 함께 또는 개별적으로 제한되어 있는 경우, 본 사용 허가서를 프로그램에 적용한 최초의 저작권자는 문제가 발생하지 않는 국가에 한해서 프로그램을 배포한다는 배포상의 지역적 제한 조건을 명시적으로 설정할 수 있으며, 이러한 사항은 본 허가서의 일부로 간주됩니다. + +제 9 조. 자유 소프트웨어 재단은 때때로 본 사용 허가서의 개정판이나 신판을 공표할 수 있습니다. 새롭게 공표될 판은 당면한 문제나 현안을 처리하기 위해서 세부적인 내용에 차이가 발생할 수 있지만, 그 근본 정신에는 변함이 없을 것입니다. + +각각의 판들은 판번호를 사용해서 구별됩니다. 특정한 판번호와 그 이후 판을 따른다는 사항이 명시된 프로그램에는 해당 판이나 그 이후에 발행된 어떠한 판을 선택해서 적용해도 무방하고, 판번호를 명시하고 있지 않은 경우에는 자유 소프트웨어 재단이 공표한 어떠한 판번호의 판을 적용해도 무방합니다. + +제 10 조. 프로그램의 일부를 본 허가서와 배포 기준이 다른 자유 프로그램과 함께 결합하고자 할 경우에는 해당 프로그램의 저작자로부터 서면 승인을 받아야 합니다. 자유 소프트웨어 재단이 저작권을 갖고 있는 소프트웨어의 경우에는 자유 소프트웨어 재단의 승인을 얻어야 합니다. 우리는 이러한 요청을 수락하기 위해서 때때로 예외 기준을 만들기도 합니다. 자유 소프트웨어 재단은 일반적으로 자유 소프트웨어의 2차적 저작물들을 모두 자유로운 상태로 유지시키려는 목적과 소프트웨어의 공유와 재활용을 증진시키려는 두가지 목적을 기준으로 승인 여부를 결정할 것입니다. + +보증의 결여 (제11조, 제12조) + +제 11 조. 본 허가서를 따르는 프로그램은 무상으로 양도되기 때문에 관련 법률이 허용하는 한도 내에서 어떠한 형태의 보증도 제공되지 않습니다. 프로그램의 저작권자와 배포자가 공동 또는 개별적으로 별도의 보증을 서면으로 제공할 때를 제외하면, 특정한 목적에 대한 프로그램의 적합성이나 상업성 여부에 대한 보증을 포함한 어떠한 형태의 보증도 명시적이나 묵시적으로 설정되지 않은 ``있는 그대로의'' 상태로 이 프로그램을 배포합니다. 프로그램과 프로그램의 실행에 따라 발생할 수 있는 모든 위험은 피양도자에게 인수되며 이에 따른 보수 및 복구를 위한 제반 경비 또한 피양도자가 모두 부담해야 합니다. + +제 12 조. 저작권자나 배포자가 프로그램의 손상 가능성을 사전에 알고 있었다 하더라도 발생된 손실이 관련 법규에 의해 보호되고 있거나 이에 대한 별도의 서면 보증이 설정된 경우가 아니라면, 저작권자나 프로그램을 원래의 상태 또는 개작한 상태로 제공한 배포자는 프로그램의 사용이나 비작동으로 인해 발생된 손실이나 프로그램 자체의 손실에 대해 책임지지 않습니다. 이러한 면책 조건은 사용자나 제3자가 프로그램을 조작함으로써 발생된 손실이나 다른 소프트웨어와 프로그램을 함께 동작시키는 것으로 인해서 발생된 데이터의 상실 및 부정확한 산출 결과에만 국한되는 것이 아닙니다. 발생된 손실의 일반성이나 특수성 뿐 아니라 원인의 우발성 및 필연성도 전혀 고려되지 않습니다. + +복제와 개작 및 배포에 관한 조건과 규정의 끝. + + + +----- GPL 원문 -------------------------------------------------------- + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + +a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + +c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + +END OF TERMS AND CONDITIONS + +----- 끝 -------------------------------------------------------- diff --git a/_common.php b/_common.php new file mode 100644 index 000000000..2ed94c3fb --- /dev/null +++ b/_common.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/_head.php b/_head.php new file mode 100644 index 000000000..79e267fb7 --- /dev/null +++ b/_head.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/_tail.php b/_tail.php new file mode 100644 index 000000000..ae47c3b51 --- /dev/null +++ b/_tail.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/adm/_common.php b/adm/_common.php new file mode 100644 index 000000000..cd443b18e --- /dev/null +++ b/adm/_common.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/adm/admin.head.php b/adm/admin.head.php new file mode 100644 index 000000000..c175f62f3 --- /dev/null +++ b/adm/admin.head.php @@ -0,0 +1,140 @@ +"; + for($i=1; $i'.$menu[$key][$i][1].''; + + $auth_menu[$menu[$key][$i][0]] = $menu[$key][$i][1]; + } + $str .= ""; + + return $str; +} +?> + + + + + +
+
+

+ + + + + + + +
+
+ + +
    +$value) { + if($key > 0) { + if ($is_admin != 'super' && (!array_key_exists($value[0],$auth) || !strstr($auth[$value[0]], 'r'))) + continue; + + echo $nl.'
  • '.$value[1].'
  • '; + $nl = PHP_EOL; + } +} +?> +
+ + +
+ +
+
+ + + + +
+

diff --git a/adm/admin.js b/adm/admin.js new file mode 100644 index 000000000..a3f4c7d64 --- /dev/null +++ b/adm/admin.js @@ -0,0 +1,74 @@ +function check_all(f) +{ + var chk = document.getElementsByName("chk[]"); + + for (i=0; i\n"; + for ($i=0; $i선택"; + $str .= option_selected($skins[$i], $selected); + } + $str .= ""; + return $str; +} + +// 모바일 스킨디렉토리를 SELECT 형식으로 얻음 +function get_mobile_skin_select($skin_gubun, $id, $name, $selected='', $event='') +{ + $skins = get_skin_dir($skin_gubun, G5_MOBILE_PATH.'/'.G5_SKIN_DIR); + $str = ""; + return $str; +} + + +// 스킨경로를 얻는다 +function get_skin_dir($skin, $skin_path=G5_SKIN_PATH) +{ + global $g5; + + $result_array = array(); + + $dirname = $skin_path.'/'.$skin.'/'; + $handle = opendir($dirname); + while ($file = readdir($handle)) { + if($file == '.'||$file == '..') continue; + + if (is_dir($dirname.$file)) $result_array[] = $file; + } + closedir($handle); + sort($result_array); + + return $result_array; +} + + +// 회원권한을 SELECT 형식으로 얻음 +function get_member_level_select($name, $start_id=0, $end_id=10, $selected="", $event="") +{ + global $g5; + + $str = "\n'; + return $str; +} + +// 권한 검사 +function auth_check($auth, $attr) +{ + global $is_admin; + + if ($is_admin == 'super') return; + + if (!trim($auth)) + alert('이 메뉴에는 접근 권한이 없습니다.\\n\\n접근 권한은 최고관리자만 부여할 수 있습니다.'); + + $attr = strtolower($attr); + + if (!strstr($auth, $attr)) { + if ($attr == 'r') + alert('읽을 권한이 없습니다.'); + else if ($attr == 'w') + alert('입력, 추가, 생성, 수정 권한이 없습니다.'); + else if ($attr == 'd') + alert('삭제 권한이 없습니다.'); + else + alert('속성이 잘못 되었습니다.'); + } +} + + +// 작업아이콘 출력 +function icon($act, $link='', $target='_parent') +{ + global $g5; + + $img = array('입력'=>'insert', '추가'=>'insert', '생성'=>'insert', '수정'=>'modify', '삭제'=>'delete', '이동'=>'move', '그룹'=>'move', '보기'=>'view', '미리보기'=>'view', '복사'=>'copy'); + $icon = ''; + if ($link) + $s = ''.$icon.''; + else + $s = $icon; + return $s; +} + + +// rm -rf 옵션 : exec(), system() 함수를 사용할 수 없는 서버 또는 win32용 대체 +// www.php.net 참고 : pal at degerstrom dot com +function rm_rf($file) +{ + if (file_exists($file)) { + if (is_dir($file)) { + $handle = opendir($file); + while($filename = readdir($handle)) { + if ($filename != '.' && $filename != '..') + rm_rf($file.'/'.$filename); + } + closedir($handle); + + @chmod($file, G5_DIR_PERMISSION); + @rmdir($file); + } else { + @chmod($file, G5_FILE_PERMISSION); + @unlink($file); + } + } +} + +// 입력 폼 안내문 +function help($help="") +{ + global $g5; + + $str = ''.str_replace("\n", "
", $help).'
'; + + return $str; +} + +// 출력순서 +function order_select($fld, $sel='') +{ + $s = ''; + + return $s; +} + +// 접근 권한 검사 +if (!$member['mb_id']) +{ + //alert('로그인 하십시오.', '$g5['bbs_path']/login.php?url=' . urlencode('$_SERVER['PHP_SELF']?w=$w&mb_id=$mb_id')); + alert('로그인 하십시오.', G5_BBS_URL.'/login.php?url=' . urlencode($_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'])); +} +else if ($is_admin != 'super') +{ + $auth = array(); + $sql = " select au_menu, au_auth from {$g5['auth_table']} where mb_id = '{$member['mb_id']}' "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) + { + $auth[$row['au_menu']] = $row['au_auth']; + } + + if (!$i) + { + alert('최고관리자 또는 관리권한이 있는 회원만 접근 가능합니다.', G5_URL); + } +} + +// 관리자의 아이피, 브라우저와 다르다면 세션을 끊고 관리자에게 메일을 보낸다. +$admin_key = md5($member['mb_datetime'] . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT']); +if (get_session('ss_mb_key') !== $admin_key) { + + session_destroy(); + + include_once(G5_LIB_PATH.'/mailer.lib.php'); + // 메일 알림 + mailer($member['mb_nick'], $member['mb_email'], $member['mb_email'], 'XSS 공격 알림', $_SERVER['REMOTE_ADDR'].' 아이피로 XSS 공격이 있었습니다.\n\n관리자 권한을 탈취하려는 접근이므로 주의하시기 바랍니다.\n\n해당 아이피는 차단하시고 의심되는 게시물이 있는지 확인하시기 바랍니다.\n\n'.G5_URL, 0); + + alert_close('정상적으로 로그인하여 접근하시기 바랍니다.'); +} + +@ksort($auth); + +// 가변 메뉴 +unset($auth_menu); +unset($menu); +unset($amenu); +$tmp = dir(G5_ADMIN_PATH); +while ($entry = $tmp->read()) { + if (!preg_match('/^admin.menu([0-9]{3}).*\.php$/', $entry, $m)) + continue; // 파일명이 menu 으로 시작하지 않으면 무시한다. + + $amenu[$m[1]] = $entry; + include_once(G5_ADMIN_PATH.'/'.$entry); +} +@ksort($amenu); + +$arr_query = array(); +if (isset($sst)) $arr_query[] = 'sst='.$sst; +if (isset($sod)) $arr_query[] = 'sod='.$sod; +if (isset($sfl)) $arr_query[] = 'sfl='.$sfl; +if (isset($stx)) $arr_query[] = 'stx='.$stx; +if (isset($page)) $arr_query[] = 'page='.$page; +$qstr = implode("&", $arr_query); + +// 관리자에서는 추가 스크립트는 사용하지 않는다. +//$config['cf_add_script'] = ''; +?> \ No newline at end of file diff --git a/adm/admin.menu100.php b/adm/admin.menu100.php new file mode 100644 index 000000000..b241d2d3a --- /dev/null +++ b/adm/admin.menu100.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/adm/admin.menu200.php b/adm/admin.menu200.php new file mode 100644 index 000000000..1e41855db --- /dev/null +++ b/adm/admin.menu200.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/adm/admin.menu300.php b/adm/admin.menu300.php new file mode 100644 index 000000000..1268109e0 --- /dev/null +++ b/adm/admin.menu300.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/adm/admin.menu900.php b/adm/admin.menu900.php new file mode 100644 index 000000000..c9a8d6b54 --- /dev/null +++ b/adm/admin.menu900.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/adm/admin.tail.php b/adm/admin.tail.php new file mode 100644 index 000000000..55ba62359 --- /dev/null +++ b/adm/admin.tail.php @@ -0,0 +1,130 @@ + + + + +
+
+ + + + + + + + + \ No newline at end of file diff --git a/adm/auth_list.php b/adm/auth_list.php new file mode 100644 index 000000000..fc11f400e --- /dev/null +++ b/adm/auth_list.php @@ -0,0 +1,254 @@ +전체목록'; + +$g5['title'] = "관리권한설정"; +include_once('./admin.head.php'); + +$colspan = 5; +?> + +
+ + 설정된 관리권한 건 +
+ +
+ + + + + + +
+ +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + '; + ?> + +
목록
+ + + 회원아이디닉네임메뉴권한
+ + + + + + + +
자료가 없습니다.
+
+ +
+ +
+ +document.fsearch.sfl.value = "'.$sfl.'";'."\n"; + +if (strstr($sfl, 'mb_id')) + $mb_id = $stx; +else + $mb_id = ''; +?> +
+ + + +
+ + + + + + + +
+

관리권한 추가

+ +
+

+ 다음 양식에서 회원에게 관리권한을 부여하실 수 있습니다.
+ 권한 r은 읽기권한, w는 쓰기권한, d는 삭제권한입니다. +

+
+ +
+ + + + + + + + + + + + + + + + + + + +
+ + +
+ +
권한지정 + + + + + + +
+
+ +
+ +
+
+ +
+ + + + diff --git a/adm/auth_list_delete.php b/adm/auth_list_delete.php new file mode 100644 index 000000000..ccb69c575 --- /dev/null +++ b/adm/auth_list_delete.php @@ -0,0 +1,27 @@ + diff --git a/adm/auth_update.php b/adm/auth_update.php new file mode 100644 index 000000000..59833028d --- /dev/null +++ b/adm/auth_update.php @@ -0,0 +1,30 @@ + diff --git a/adm/board_copy.php b/adm/board_copy.php new file mode 100644 index 000000000..1d78d2c30 --- /dev/null +++ b/adm/board_copy.php @@ -0,0 +1,70 @@ + + +
+

+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + +
원본 테이블명
영문자, 숫자, _ 만 가능 (공백없이)
복사 유형 + + + + +
+
+ +
+ + +
+ +
+ +
+ + + + + diff --git a/adm/board_copy_update.php b/adm/board_copy_update.php new file mode 100644 index 000000000..45d856d51 --- /dev/null +++ b/adm/board_copy_update.php @@ -0,0 +1,201 @@ +read()) { + if ($entry == '.' || $entry == '..') continue; + + // 김선용 201007 : + if(is_dir(G5_DATA_PATH.'/file/'.$bo_table.'/'.$entry)){ + $dd = dir(G5_DATA_PATH.'/file/'.$bo_table.'/'.$entry); + @mkdir(G5_DATA_PATH.'/file/'.$target_table.'/'.$entry, G5_DIR_PERMISSION); + @chmod(G5_DATA_PATH.'/file/'.$target_table.'/'.$entry, G5_DIR_PERMISSION); + while ($entry2 = $dd->read()) { + if ($entry2 == '.' || $entry2 == '..') continue; + @copy(G5_DATA_PATH.'/file/'.$bo_table.'/'.$entry.'/'.$entry2, G5_DATA_PATH.'/file/'.$target_table.'/'.$entry.'/'.$entry2); + @chmod(G5_DATA_PATH.'/file/'.$target_table.'/'.$entry.'/'.$entry2, G5_DIR_PERMISSION); + $copy_file++; + } + $dd->close(); + } + else { + @copy(G5_DATA_PATH.'/file/'.$bo_table.'/'.$entry, G5_DATA_PATH.'/file/'.$target_table.'/'.$entry); + @chmod(G5_DATA_PATH.'/file/'.$target_table.'/'.$entry, G5_DIR_PERMISSION); + $copy_file++; + } + } + $d->close(); + + // 글복사 + $sql = " insert into {$g5['write_prefix']}$target_table select * from {$g5['write_prefix']}$bo_table "; + sql_query($sql, false); + + // 게시글수 저장 + $sql = " select bo_count_write, bo_count_comment from {$g5['board_table']} where bo_table = '$bo_table' "; + $row = sql_fetch($sql); + $sql = " update {$g5['board_table']} set bo_count_write = '{$row['bo_count_write']}', bo_count_comment = '{$row['bo_count_comment']}' where bo_table = '$target_table' "; + sql_query($sql, false); + + // 4.00.01 + // 위의 코드는 같은 테이블명을 사용하였다는 오류가 발생함. (희한하네 ㅡㅡ;) + $sql = " select * from {$g5['board_file_table']} where bo_table = '$bo_table' "; + $result = sql_query($sql, false); + for ($i=0; $row=sql_fetch_array($result); $i++) + $file_copy[$i] = $row; +} + +if (count($file_copy)) { + for ($i=0; $iopener.document.location.reload();"; + +alert("복사에 성공 했습니다.", './board_copy.php?bo_table='.$bo_table.'&'.$qstr); +?> \ No newline at end of file diff --git a/adm/board_delete.inc.php b/adm/board_delete.inc.php new file mode 100644 index 000000000..b3e4e3965 --- /dev/null +++ b/adm/board_delete.inc.php @@ -0,0 +1,37 @@ + \ No newline at end of file diff --git a/adm/board_form.php b/adm/board_form.php new file mode 100644 index 000000000..ae69b945c --- /dev/null +++ b/adm/board_form.php @@ -0,0 +1,1288 @@ +필수'; + + $board['bo_count_delete'] = 1; + $board['bo_count_modify'] = 1; + $board['bo_read_point'] = $config['cf_read_point']; + $board['bo_write_point'] = $config['cf_write_point']; + $board['bo_comment_point'] = $config['cf_comment_point']; + $board['bo_download_point'] = $config['cf_download_point']; + + $board['bo_gallery_cols'] = 4; + $board['bo_gallery_width'] = 174; + $board['bo_gallery_height'] = 124; + $board['bo_mobile_gallery_width'] = 125; + $board['bo_mobile_gallery_height'] = 100; + $board['bo_table_width'] = 100; + $board['bo_page_rows'] = $config['cf_page_rows']; + $board['bo_mobile_page_rows'] = $config['cf_page_rows']; + $board['bo_subject_len'] = 60; + $board['bo_mobile_subject_len'] = 30; + $board['bo_new'] = 24; + $board['bo_hot'] = 100; + $board['bo_image_width'] = 600; + $board['bo_upload_count'] = 2; + $board['bo_upload_size'] = 1048576; + $board['bo_reply_order'] = 1; + $board['bo_use_search'] = 1; + $board['bo_skin'] = 'basic'; + $board['bo_mobile_skin'] = 'basic'; + $board['gr_id'] = $gr_id; + $board['bo_use_secret'] = 0; + $board['bo_include_head'] = '_head.php'; + $board['bo_include_tail'] = '_tail.php'; + +} else if ($w == 'u') { + + $html_title .= ' 수정'; + + if (!$board['bo_table']) + alert('존재하지 않은 게시판 입니다.'); + + if ($is_admin == 'group') { + if ($member['mb_id'] != $group['gr_admin']) + alert('그룹이 틀립니다.'); + } + + $readonly = 'readonly'; + +} + +if ($is_admin != 'super') { + $group = get_group($board['gr_id']); + $is_admin = is_admin($member['mb_id']); +} + +$g5['title'] = $html_title; +include_once ('./admin.head.php'); + +$pg_anchor = ''; + +$frm_submit = '
+ + 목록'.PHP_EOL; +if ($w == 'u') $frm_submit .= ' 게시판복사 + 게시판 바로가기 + 게시판 썸네일 삭제 + '.PHP_EOL; +$frm_submit .= '
'; +?> + +
+ + + + + + + +
+

게시판 기본 설정

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
게시판 기본 설정
+ class="frm_input " maxlength="20"> + + 영문자, 숫자, _ 만 가능 (공백없이 20자 이내) + + 게시판 바로가기 + 목록으로 + +
+ + 동일그룹 게시판목록
+ +
+ + +
+ + + + + + + +
+ + + > + + + + + + +
+ + +
+
+
+ + + +
+

게시판 권한 설정

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
게시판 권한 설정
+ + + + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ + + +
+

게시판 기능 설정

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
게시판 기능 설정
+ + 댓글 개 이상 달리면 수정불가 + + + + + +
+ 댓글 개 이상 달리면 삭제불가 + + + + + +
+ > + 사용 (글쓴이 클릭시 나오는 레이어 메뉴) + + + + + +
+ + + + + + + +
+ + id="bo_use_dhtml_editor"> + 사용 + + + + + +
+ + id="bo_use_rss_view"> + 사용 + + + + + +
+ id="bo_use_good"> + 사용 + + + + + +
+ > + 사용 + + + + + +
+ > + 사용 + + + + + + +
+ > + 사용 + + + + + +
+ > + 사용 + + + + + +
+ + > + 사용 (사용시 속도가 느려질 수 있습니다.) + + + + + +
+ + > + 사용 (사용시 속도가 느려질 수 있습니다.) + + + + + +
+ > + 사용 + + + + + +
+ > + 사용 + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + 업로드 파일 한개당 bytes 이하 + + + + + +
+ >사용 + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ 기본환경설정의 SNS 설정을 하셔야 사용이 가능합니다.") ?> + > + 사용 + + + + + +
+ > + 사용 + + + + + +
+ + + + + + + +
+
+
+ + + +
+

게시판 디자인/양식

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
게시판 디자인/양식
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + 픽셀 + + + + + +
+ + + + + + + +
+ + + + + + + +
+ + + + + + +
+ + + + + + + +
+
+
+ + + +
+

게시판 포인트 설정

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
게시판 포인트 설정
+ + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+ + + + + + +
+
+
+ + + +
+

게시판 여분필드 설정

+ + +
+ + + + + + + + + + + + + + + + +
게시판 여분필드 설정
여분필드 + + + + + + + + + +
+
+
+ + + +
+ + + + diff --git a/adm/board_form_update.php b/adm/board_form_update.php new file mode 100644 index 000000000..b56234342 --- /dev/null +++ b/adm/board_form_update.php @@ -0,0 +1,393 @@ + diff --git a/adm/board_list.php b/adm/board_list.php new file mode 100644 index 000000000..47be2d2a3 --- /dev/null +++ b/adm/board_list.php @@ -0,0 +1,240 @@ +전체목록'; + +$g5['title'] = '게시판관리'; +include_once('./admin.head.php'); + +$colspan = 15; +?> + +
+ + 생성된 게시판수 개 +
+ +
+ + + + + + + +
+ + + + + +
+ + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + 수정'; + $one_copy = '복사'; + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + + + + + + + + + + + '; + ?> + +
목록
+ + + 그룹TABLE스킨모바일
스킨
제목읽기P포인트쓰기P포인트댓글P포인트다운P포인트SNS
사용
검색
사용
출력
순서
접속기기관리
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + > + + + > + + + + + + + + + +
자료가 없습니다.
+
+ +
+ + + + +
+ +
+ + + + + + diff --git a/adm/board_list_update.php b/adm/board_list_update.php new file mode 100644 index 000000000..9d8850660 --- /dev/null +++ b/adm/board_list_update.php @@ -0,0 +1,72 @@ + diff --git a/adm/board_thumbnail_delete.php b/adm/board_thumbnail_delete.php new file mode 100644 index 000000000..720cad4f9 --- /dev/null +++ b/adm/board_thumbnail_delete.php @@ -0,0 +1,52 @@ + + +
+

+ 완료 메세지가 나오기 전에 프로그램의 실행을 중지하지 마십시오. +

+
+ +'; + $files = glob($dir.'/thumb-*'); + if (is_array($files)) { + foreach($files as $thumbnail) { + $cnt++; + @unlink($thumbnail); + + echo '
  • '.$thumbnail.'
  • '.PHP_EOL; + + flush(); + + if ($cnt%10==0) + echo PHP_EOL; + } + } + + echo '
  • 완료됨
  • '.PHP_EOL; + echo '

    썸네일 '.$cnt.'건의 삭제 완료됐습니다.

    '.PHP_EOL; +} else { + echo '

    첨부파일 디렉토리가 존재하지 않습니다.

    '; +} +?> + + + + \ No newline at end of file diff --git a/adm/boardgroup_form.php b/adm/boardgroup_form.php new file mode 100644 index 000000000..c27e27178 --- /dev/null +++ b/adm/boardgroup_form.php @@ -0,0 +1,151 @@ + 필수'; + $gr['gr_use_access'] = 0; + $html_title .= ' 생성'; +} else if ($w == 'u') { + $gr_id_attr = 'readonly'; + $gr = sql_fetch(" select * from {$g5['group_table']} where gr_id = '$gr_id' "); + $html_title .= ' 수정'; +} +else + alert('제대로 된 값이 넘어오지 않았습니다.'); + +if (!isset($group['gr_device'])) { + sql_query(" ALTER TABLE `{$g5['group_table']}` ADD `gr_device` ENUM('both','pc','mobile') NOT NULL DEFAULT 'both' AFTER `gr_subject` ", false); +} + + +$g5['title'] = $html_title; +include_once('./admin.head.php'); +?> + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    class=" alnum_ frm_input" maxlength="10"> + 게시판그룹 바로가기'; + ?> +
    + + 게시판생성'; + ?> +
    + + +
    + '; + else + echo ''.$gr['gr_admin']; + ?> +
    + + > + 사용 +
    접근회원수 + '.$row1['cnt'].''; + ?> +
    여분필드 + + + + +
    +
    + +
    + + 목록 +
    + +
    + +
    +

    + 게시판을 생성하시려면 1개 이상의 게시판그룹이 필요합니다.
    + 게시판그룹을 이용하시면 더 효과적으로 게시판을 관리할 수 있습니다. +

    +
    + + + + diff --git a/adm/boardgroup_form_update.php b/adm/boardgroup_form_update.php new file mode 100644 index 000000000..3cad4e1c9 --- /dev/null +++ b/adm/boardgroup_form_update.php @@ -0,0 +1,73 @@ + diff --git a/adm/boardgroup_list.php b/adm/boardgroup_list.php new file mode 100644 index 000000000..8d5e109d9 --- /dev/null +++ b/adm/boardgroup_list.php @@ -0,0 +1,217 @@ +처음'; + +$g5['title'] = '게시판그룹설정'; +include_once('./admin.head.php'); + +$colspan = 10; +?> + +
    + + 전체그룹 개 +
    + +
    + + + + + + +
    + + + + + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + 수정'; + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + + + + + + + '; + ?> +
    목록
    + + + 그룹아이디제목그룹관리자게시판접근
    사용
    접근
    회원수
    출력
    순서
    접속기기관리
    + + + + + + + + + + + + + + + + value="1" id="gr_use_access_"> + + + + + + +
    자료가 없습니다.
    +
    + + +
    + +
    +

    + 접근사용 옵션을 설정하시면 관리자가 지정한 회원만 해당 그룹에 접근할 수 있습니다.
    + 접근사용 옵션은 해당 그룹에 속한 모든 게시판에 적용됩니다. +

    +
    + + + + + + diff --git a/adm/boardgroup_list_update.php b/adm/boardgroup_list_update.php new file mode 100644 index 000000000..e7f9816eb --- /dev/null +++ b/adm/boardgroup_list_update.php @@ -0,0 +1,46 @@ + diff --git a/adm/boardgroupmember_form.php b/adm/boardgroupmember_form.php new file mode 100644 index 000000000..01df7dcfa --- /dev/null +++ b/adm/boardgroupmember_form.php @@ -0,0 +1,130 @@ + + +
    + + +
    +

    아이디 , 이름 , 닉네임

    + + + +
    +
    + +
    + + + + + + + + + +
    + + + + + + + + + + + + 삭제'; + ?> + + + + + + + '; + } + ?> + +
    목록
    + + + 그룹아이디그룹처리일시
    + + +
    접근가능한 그룹이 없습니다.
    +
    + +
    + +
    +
    + + + + diff --git a/adm/boardgroupmember_list.php b/adm/boardgroupmember_list.php new file mode 100644 index 000000000..9c3852ccf --- /dev/null +++ b/adm/boardgroupmember_list.php @@ -0,0 +1,158 @@ + + +
    + + + + + + +
    + +
    + + + + + + + + + +
    + + + + + + + + + + + + + + + '.$row2['cnt'].''; + + //$s_del = '삭제'; + + $mb_nick = get_sideview($row['mb_id'], $row['mb_nick'], $row['mb_email'], $row['mb_homepage']); + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + + '; + } + ?> + +
    목록
    + + + 그룹회원아이디이름별명최종접속처리일시
    + + +
    자료가 없습니다.
    +
    + +
    + +
    +
    + + + + + + diff --git a/adm/boardgroupmember_update.php b/adm/boardgroupmember_update.php new file mode 100644 index 000000000..e36badf1a --- /dev/null +++ b/adm/boardgroupmember_update.php @@ -0,0 +1,70 @@ + diff --git a/adm/cache_file_delete.php b/adm/cache_file_delete.php new file mode 100644 index 000000000..1374acdaf --- /dev/null +++ b/adm/cache_file_delete.php @@ -0,0 +1,48 @@ + + +
    +

    + 완료 메세지가 나오기 전에 프로그램의 실행을 중지하지 마십시오. +

    +
    + +캐시디렉토리를 열지못했습니다.

    '; +} + +$cnt=0; +echo '
      '.PHP_EOL; + +$files = glob(G5_DATA_PATH.'/cache/latest-*'); +if (is_array($files)) { + foreach ($files as $cache_file) { + $cnt++; + unlink($cache_file); + echo '
    • '.$cache_file.'
    • '.PHP_EOL; + + flush(); + + if ($cnt%10==0) + echo PHP_EOL; + } +} + +echo '
    • 완료됨
    '.PHP_EOL; +echo '

    최신글 캐시파일 '.$cnt.'건 삭제 완료됐습니다.
    프로그램의 실행을 끝마치셔도 좋습니다.

    '.PHP_EOL; +?> + + \ No newline at end of file diff --git a/adm/captcha_file_delete.php b/adm/captcha_file_delete.php new file mode 100644 index 000000000..b90fe3a03 --- /dev/null +++ b/adm/captcha_file_delete.php @@ -0,0 +1,53 @@ + + +
    +

    + 완료 메세지가 나오기 전에 프로그램의 실행을 중지하지 마십시오. +

    +
    + +캐시디렉토리를 열지못했습니다.

    '; +} + +$cnt=0; +echo '
      '.PHP_EOL; + +$files = glob(G5_DATA_PATH.'/cache/?captcha-*'); +if (is_array($files)) { + $before_time = G5_SERVER_TIME - 3600; // 한시간전 + foreach ($files as $gcaptcha_file) { + $modification_time = filemtime($gcaptcha_file); // 파일접근시간 + + if ($modification_time > $before_time) continue; + + $cnt++; + unlink($gcaptcha_file); + echo '
    • '.$gcaptcha_file.'
    • '.PHP_EOL; + + flush(); + + if ($cnt%10==0) + echo PHP_EOL; + } +} + +echo '
    • 완료됨
    '.PHP_EOL; +echo '

    캡챠파일 '.$cnt.'건의 삭제 완료됐습니다.
    프로그램의 실행을 끝마치셔도 좋습니다.

    '.PHP_EOL; +?> + + \ No newline at end of file diff --git a/adm/config_form.php b/adm/config_form.php new file mode 100644 index 000000000..48a7179f1 --- /dev/null +++ b/adm/config_form.php @@ -0,0 +1,1281 @@ + +
  • 기본환경
  • +
  • 게시판기본
  • +
  • 회원가입
  • +
  • 본인확인
  • +
  • 기본메일환경
  • +
  • 글작성메일
  • +
  • 가입메일
  • +
  • 투표메일
  • +
  • SNS
  • +
  • 레이아웃 추가설정
  • +
  • SMS
  • +
  • 여분필드
  • +'; + +$frm_submit = ''; + +if (!$config['cf_icode_server_ip']) $config['cf_icode_server_ip'] = '211.172.232.124'; +if (!$config['cf_icode_server_port']) $config['cf_icode_server_port'] = '7295'; + +if ($config['cf_icode_id'] && $config['cf_icode_pw']) { + $res = get_sock('http://www.icodekorea.com/res/userinfo.php?userid='.$config['cf_icode_id'].'&userpw='.$config['cf_icode_pw']); + $res = explode(';', $res); + $userinfo = array( + 'code' => $res[0], // 결과코드 + 'coin' => $res[1], // 고객 잔액 (충전제만 해당) + 'gpay' => $res[2], // 고객의 건수 별 차감액 표시 (충전제만 해당) + 'payment' => $res[3] // 요금제 표시, A:충전제, C:정액제 + ); +} +?> + +
    + + +
    +

    홈페이지 기본환경 설정

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    홈페이지 기본환경 설정
    + + +
    + + +
    > 사용
    + + 점 + + + 점 +
    + 자리만 표시 +
    수정하면 일 동안 바꿀 수 없음수정하면 일 동안 바꿀 수 없음
    + + 일 + + + 일 +
    + + 일 + + + 일 +
    + + 분 + + + 라인 +
    + + 라인 + + + 라인 +
    페이지씩 표시 페이지씩 표시
    + + + +
    + + + +
    + + + +
    + + + +
    + + +
    + + +
    + + > 남김 +
    + + 일 +
    + 123.123.+ 도 입력 가능. (엔터로 구분)') ?> + + + 123.123.+ 도 입력 가능. (엔터로 구분)') ?> + +
    + + +
    + + +
    +
    +
    + + + +
    +

    게시판 기본 설정

    + +
    +

    각 게시판 관리에서 개별적으로 설정 가능합니다.

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    게시판 기본 설정
    초 지난후 가능 + + +
    건 단위로 검색
    + + +
    + + +
    + + +
    + + +
    +
    +
    + + + +
    +

    회원가입 설정

    + +
    +

    회원가입 시 사용할 스킨과 입력 받을 정보 등을 설정할 수 있습니다.

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    회원가입 설정
    + + + +
    홈페이지 입력 + > + > + 주소 입력 + > + > +
    전화번호 입력 + > + > + 휴대폰번호 입력 + > + > +
    서명 입력 + > + > + 자기소개 입력 + > + > +
    일 후 자동 삭제
    + + + 이상
    바이트 이하회원아이콘 사이즈 + + + + + 픽셀 이하 +
    > 사용
    + + + + + +
    +
    +
    + + + +
    +

    본인확인 설정

    + +
    +

    + 회원가입 시 본인확인 수단을 설정합니다.
    + 실명과 휴대폰 번호 그리고 본인확인 당시에 성인인지의 여부를 저장합니다.
    + 게시판의 경우 본인확인 또는 성인여부를 따져 게시물 조회 및 쓰기 권한을 줄 수 있습니다. +

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    본인확인 설정
    + +
    + +
    + +
    + 서비스에 가입되어 있지 않다면, KCB와 계약체결 후 회원사ID를 발급 받으실 수 있습니다.
    이용하시려는 서비스에 대한 계약을 아이핀, 휴대폰 본인확인 각각 체결해주셔야 합니다.
    아이핀 본인확인 테스트의 경우에는 KCB 회원사ID가 필요 없으나,
    휴대폰 본인확인 테스트의 경우 KCB 에서 따로 발급 받으셔야 합니다.') ?> + KCB 아이핀 서비스 신청페이지 + KCB 휴대폰 본인확인 서비스 신청페이지 +
    + 서비스에 가입되어 있지 않다면, 본인확인 서비스 신청페이지에서 서비스 신청 후 사이트코드를 발급 받으실 수 있습니다.') ?> + SM + KCP 휴대폰 본인확인 서비스 신청페이지 +
    + 서비스에 가입되어 있지 않다면, 본인확인 서비스 신청페이지에서 서비스 신청 후 상점아이디를 발급 받으실 수 있습니다.
    LG유플러스 휴대폰본인확인은 ActiveX 설치가 필요하므로 Internet Explorer 에서만 사용할 수 있습니다.') ?> + si_ + LG유플러스 본인확인 서비스 신청페이지 +
    + 계약정보 -> 상점정보관리에서 확인하실 수 있습니다.') ?> + +
    + 회수제한은 실서비스에서 아이핀과 휴대폰 본인확인 인증에 개별 적용됩니다.
    0 으로 설정하시면 회수제한이 적용되지 않습니다.'); ?> + 회 +
    + + > 예 +
    +
    +
    + + + +
    +

    기본 메일 환경 설정

    + + +
    + + + + + + + + + + + + + + + + + + + +
    기본 메일 환경 설정
    + + > 사용 +
    + + > 사용 +
    + + > 회원만 사용 +
    +
    +
    + + + +
    +

    게시판 글 작성 시 메일 설정

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    게시판 글 작성 시 메일 설정
    + + > 사용 +
    + + > 사용 +
    + + > 사용 +
    + + > 사용 +
    + + > 사용 +
    +
    +
    + + + +
    +

    회원가입 시 메일 설정

    + + +
    + + + + + + + + + + + + + + + + +
    회원가입 시 메일 설정
    + + > 사용 +
    + + > 사용 +
    +
    +
    + + + +
    +

    투표 기타의견 작성 시 메일 설정

    + + +
    + + + + + + + + + + + + +
    투표 기타의견 작성 시 메일 설정
    + + > 사용 +
    +
    +
    + + + +
    +

    소셜네트워크서비스(SNS : Social Network Service)

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    소셜네트워크서비스 설정
    + 앱 등록하기 + + +
    + 앱 등록하기 + + +
    + API Key 등록하기 +
    +
    +
    + + + +
    +

    레이아웃 추가설정

    + +
    +

    기본 설정된 파일 경로 및 script, css 를 추가하거나 변경할 수 있습니다.

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    레이아웃 추가설정
    + + +
    + + +
    + + +
    + 관리자 페이지에서는 이 코드를 사용하지 않습니다.') ?> + +
    +
    +
    + + + +
    +

    SMS

    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    SMS 설정
    + +
    + + +
    + + +
    요금제 + + '; + } else if ($userinfo['payment'] == 'C') { + echo '정액제'; + echo ''; + } else { + echo '가입해주세요.'; + echo ''; + } + ?> +
    아이코드 SMS 신청
    회원가입
    + + 아이코드 회원가입 +
    충전 잔액 + 원. + 충전하기 +
    건수별 금액 + 원. +
    +
    +
    + + + +
    +

    여분필드 기본 설정

    + +
    +

    각 게시판 관리에서 개별적으로 설정 가능합니다.

    +
    + +
    + + + + + + + + + + + + + + +
    여분필드 기본 설정
    여분필드 + + + + +
    +
    +
    + + + +
    + + + +'.PHP_EOL; + echo 'alert("'.str_replace(G5_PATH.'/', '', G5_LGXPAY_PATH).'/lgdacom 폴더 안에 log 폴더를 생성하신 후 쓰기권한을 부여해 주십시오.\n> mkdir log\n> chmod 707 log");'.PHP_EOL; + echo ''.PHP_EOL; + } else { + if(!is_writable($log_path)) { + echo ''.PHP_EOL; + } + } + } +} + +include_once ('./admin.tail.php'); +?> diff --git a/adm/config_form_update.php b/adm/config_form_update.php new file mode 100644 index 000000000..99a5b1f15 --- /dev/null +++ b/adm/config_form_update.php @@ -0,0 +1,157 @@ + \ No newline at end of file diff --git a/adm/contentform.php b/adm/contentform.php new file mode 100644 index 000000000..730d3072b --- /dev/null +++ b/adm/contentform.php @@ -0,0 +1,179 @@ + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    목록
    + + class="required frm_input" size="20" maxlength="20"> + 내용확인 +
    내용
    + + +
    + + +
    + + +
    + + 750) + $width = 750; + else + $width = $size[0]; + + echo ' '; + $himg_str = ''; + } + if ($himg_str) { + echo ''; + } + ?> +
    + + 750) + $width = 750; + else + $width = $size[0]; + + echo ' '; + $timg_str = ''; + } + if ($timg_str) { + echo ''; + } + ?> +
    +
    + +
    + + 목록 +
    + +
    + + + + diff --git a/adm/contentformupdate.php b/adm/contentformupdate.php new file mode 100644 index 000000000..4f9786ffd --- /dev/null +++ b/adm/contentformupdate.php @@ -0,0 +1,78 @@ + diff --git a/adm/contentlist.php b/adm/contentlist.php new file mode 100644 index 000000000..9f668507c --- /dev/null +++ b/adm/contentlist.php @@ -0,0 +1,98 @@ +/data/dbconfig.php 파일에 $g5[\'content_table\'] = G5_TABLE_PREFIX.\'content\'; 를 추가해 주세요.'); +} +//내용(컨텐츠)정보 테이블이 있는지 검사한다. +if(!sql_query(" DESCRIBE {$g5['content_table']} ", false)) { + if(sql_query(" DESCRIBE {$g5['g5_shop_content_table']} ", false)) { + sql_query(" ALTER TABLE {$g5['g5_shop_content_table']} RENAME TO `{$g5['content_table']}` ;", false); + } else { + $query_cp = sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['content_table']}` ( + `co_id` varchar(20) NOT NULL DEFAULT '', + `co_html` tinyint(4) NOT NULL DEFAULT '0', + `co_subject` varchar(255) NOT NULL DEFAULT '', + `co_content` longtext NOT NULL, + `co_hit` int(11) NOT NULL DEFAULT '0', + `co_include_head` varchar(255) NOT NULL, + `co_include_tail` varchar(255) NOT NULL, + PRIMARY KEY (`co_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ", true); + + // 내용관리 생성 + sql_query(" insert into `{$g5['content_table']}` set co_id = 'company', co_html = '1', co_subject = '회사소개', co_content= '

    회사소개에 대한 내용을 입력하십시오.

    ' ", false ); + sql_query(" insert into `{$g5['content_table']}` set co_id = 'privacy', co_html = '1', co_subject = '개인정보 처리방침', co_content= '

    개인정보 처리방침에 대한 내용을 입력하십시오.

    ' ", false ); + sql_query(" insert into `{$g5['content_table']}` set co_id = 'provision', co_html = '1', co_subject = '서비스 이용약관', co_content= '

    서비스 이용약관에 대한 내용을 입력하십시오.

    ' ", false ); + } +} + +$g5['title'] = '내용관리'; +include_once (G5_ADMIN_PATH.'/admin.head.php'); + +$sql_common = " from {$g5['content_table']} "; + +// 테이블의 전체 레코드수만 얻음 +$sql = " select count(*) as cnt " . $sql_common; +$row = sql_fetch($sql); +$total_count = $row['cnt']; + +$rows = $config['cf_page_rows']; +$total_page = ceil($total_count / $rows); // 전체 페이지 계산 +if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지) +$from_record = ($page - 1) * $rows; // 시작 열을 구함 + +$sql = "select * $sql_common order by co_id limit $from_record, {$config['cf_page_rows']} "; +$result = sql_query($sql); +?> + +
    + 1) {?>처음으로 + 전체 내용 +
    + + + +
    + + + + + + + + + + + + + + + + + '; + } + ?> + +
    목록
    ID제목관리
    + 수정 + 보기 + 삭제 +
    자료가 한건도 없습니다.
    +
    + + + + diff --git a/adm/css/admin.css b/adm/css/admin.css new file mode 100644 index 000000000..2b6ac82de --- /dev/null +++ b/adm/css/admin.css @@ -0,0 +1,689 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* 초기화 */ +html {overflow-y:scroll} +body {margin:0;padding:0;background:#fff;color:#000;font-size:0.75em;font-family:dotum} +html, h1, h2, h3, h4, h5, h6, form, fieldset, img {margin:0;padding:0;border:0} +h1, h2, h3, h4, h5, h6 {font-size:1em;font-family:dotum} +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {display:block} +header ul, nav ul, aside ul, footer ul {margin:0;padding:0;list-style:none} +label, input, button, select, img {vertical-align:middle} +textarea, select {font-family:dotum;font-size:1em} +input {margin:0;padding:0;border-radius:0;font-family:dotum} +input[type=text], input[type=password], input[type=submit], input[type=image] {-webkit-appearance:none} +button {border-radius:0;font-size:1em;font-family:dotum;-webkit-appearance:none;cursor:pointer} +p {margin:0;padding:0 0 10px;line-height:1.7em;word-break:break-all} +hr {display:none} +pre {overflow-x:scroll;font-size:1.1em} +a {color:#000;text-decoration:none} +a:focus, a:hover, a:active {text-decoration:underline} + +/* 헤딩 */ +h1 {margin:0 0 10px;padding:0 20px 10px;min-width:960px;border-bottom:1px solid #e9e9e9;color:#333;font-size:1.5em;font-family:dotum;letter-spacing:-0.1em} +h2 {margin:0 0 10px;padding:0 20px;font-size:1.2em} +h2.h2_frm {padding-top:15px} + +/* 레이아웃 */ +#hd {z-index:10;min-width:1000px;background:url('../img/hd_bg.jpg') #383b3f repeat-x} +#hd h1, #hd h2 {position:absolute;border:0;font-size:0;line-height:0;overflow:hidden} +#hd_wrap {z-index:11;position:relative;margin:0 auto} +#logo {position:relative;height:70px} +#logo img {position:absolute;top:19px;left:20px} + +#tnb {z-index:2;position:absolute;top:27px;right:20px;zoom:1} +#tnb:after {display:block;visibility:hidden;clear:both;content:""} +#tnb {float:right;margin:0;padding:0;zoom:1} +#tnb:after {display:block;visibility:hidden;clear:both;content:""} +#tnb li {float:left;margin:0 0 0 10px;padding:0 10px 0 0;border-right:1px solid #444} +#tnb #tnb_logout {border-right:0;padding:0} +#tnb a {display:inline-block;color:#bbb;text-decoration:none;letter-spacing:-0.1em} +#tnb a:focus, #tnb a:hover {color:#fff} +#tnb #tnb_logout a {color:#ff3061} +#tnb span {position:absolute;bottom:10px;left:0;width:100%;text-align:center} + +/* gnb */ +#gnb {position:relative;z-index:12;min-width:999px;background:#383a3f} +#gnb h2 {margin:0;padding:0;font-size:0;line-height:0;overflow:hidden} +#gnb_1dul {position:relative;margin:0 20px;padding:0;zoom:1} +#gnb_1dul:after {display:block;visibility:hidden;clear:both;content:""} +.gnb_1dli {z-index:13;position:relative;float:left;margin:0 0 0 -1px;border:1px solid #333;border-top:0;border-bottom:0} +.gnb_1da {display:block;width:120px;height:34px;color:#fff;font-weight:bold;text-align:center;text-decoration:none;line-height:2.8em} +.gnb_1da:focus, .gnb_1da:hover {text-decoration:none} +.gnb_1dli_air .gnb_1da {background:#fff;color:#000} +.gnb_1dli_on .gnb_1da {background:#282828;color:#fff} +.gnb_2dul {display:none;position:absolute;top:34px;width:180px;border:1px solid #999;border-top:0;background:#fff} +.gnb_2da {display:block;padding:8px 10px;background:#fff;color:#000;text-decoration:none} +.gnb_grp_style {background:#f7f7f7 !important} +.gnb_2da:focus, .gnb_2da:hover {background:#484848 !important;color:#fff !important;text-decoration:none} +.gnb_1dli_air .gnb_2da {background:#fff;color:#000} +.gnb_1dli_on .gnb_2da {background:#fff;color:#000} +.gnb_1dli_over .gnb_2dul {display:block;left:-1px} +.gnb_1dli_over2 .gnb_2dul {display:block;right:-1px} + +.gnb_grp_div {border-top:1px solid #eee} + +#lnb {margin:0;padding:15px;min-width:970px;border-bottom:1px solid #e9e9e9;list-style:none;zoom:1} +#lnb:after {display:block;visibility:hidden;clear:both;content:""} +#lnb li {float:left} +#lnb a {display:inline-block;padding:0 10px;border-right:1px solid #ccc;font-size:0.95em;letter-spacing:-0.1em} + +/* 중간 레이아웃 */ +#wrapper {z-index:5;margin:20px 0;min-width:1000px;zoom:1} +#wrapper:after {display:block;visibility:hidden;clear:both;content:""} + +#container {z-index:4;position:relative} + +/* 텍스트 크기 조절 */ +#text_size {position:absolute;top:-6px;right:20px} +#text_size button {margin:0;padding:0;border:0;background:transparent;cursor:pointer} +.ts_up {font-size:1.167em !important} +.ts_up2 {font-size:1.3em !important} + +/* 화면낭독기 사용자용 */ +#hd_login_msg {position:absolute;top:0;left:0;width:1px;height:1px;overflow:hidden} +.msg_sound_only, .sound_only {display:inline-block !important;position:absolute;top:0;left:0;margin:0 !important;padding:0 !important;width:1px !important;height:1px !important;font-size:0;line-height:0;border:0 !important;overflow:hidden !important} +/* 본문 바로가기 */ +#to_content a {z-index:100000;position:absolute;top:0;left:0;font-size:0;line-height:0;overflow:hidden} +#to_content a:focus, #to_content a:active {width:100%;height:70px;background:#fff;font-size:2em;font-weight:bold;text-align:center;text-decoration:none;line-height:3.1em} + +/* 캡챠 자동등록(입력)방지 기본 */ +#captcha img {border:1px solid #ddd;border-right:0} +#captcha_mp3 img {border:1px solid #ddd;border-left:0;background:#494949} + +/* ckeditor 단축키 */ +.cke_sc {margin:0 0 5px;text-align:right} +.btn_cke_sc{display:inline-block;padding:0 10px;height:23px;border:1px solid #ccc !important;background:#fafafa !important;color:#000 !important;text-decoration:none !important;line-height:1.9em;vertical-align:middle} +.cke_sc_def {margin:0 0 5px;padding:10px;border:1px solid #ccc;background:#f7f7f7;text-align:center} +.cke_sc_def dl{margin:0 0 5px;text-align:left;zoom:1} +.cke_sc_def dl:after {display:block;visibility:hidden;clear:both;content:""} +.cke_sc_def dt, .cke_sc_def dd {float:left;margin:0;padding:5px 0;border-bottom:1px solid #e9e9e9} +.cke_sc_def dt {width:20%;font-weight:bold} +.cke_sc_def dd {width:30%} + +/* 공통박스 */ +.compare_wrap {margin:0 20px 10px;zoom:1} +.compare_wrap:after {display:block;visibility:hidden;clear:both;content:""} +.compare_wrap section {margin:10px 0;padding-top:10px} +.compare_wrap h3 {margin:10px 0 20px;text-align:center} +.compare_wrap .tbl_frm {margin:0} +.compare_wrap .frm_input {background:#fff} +.compare_wrap .btn_confirm {padding:10px 0 0} +.compare_left {float:left;width:49%} +.compare_right {float:right;width:49%} + +/* 버튼 */ +.btn_confirm {margin:0 20px 10px} + +.btn_confirm01 {clear:both;text-align:center} +.btn_confirm01 button {padding:0 15px;height:30px;border:0;background:#617d46;color:#fff} +.btn_confirm01 a {display:inline-block;padding:0 15px;height:30px;background:#617d46;color:#fff;text-decoration:none;line-height:2.5em;vertical-align:middle} +.btn_confirm01 a:focus {background:#555} + +.btn_confirm02 {clear:both;margin-top:10px;text-align:center} +.btn_confirm02 button {padding:0 15px;height:30px;border:0;background:#617d46;color:#fff} +.btn_confirm02 a {display:inline-block;padding:0 15px;height:30px;background:#617d46;color:#fff;text-decoration:none;line-height:2.5em;vertical-align:middle} +.btn_confirm02 a:focus {background:#555} + +.btn_submit {margin:0;padding:0;border:0;background:#ff3061;color:#fff;cursor:pointer} +.btn_confirm .btn_submit {padding:0 15px;border:0;height:30px;color:#fff} +.btn_cancel {display:inline-block;padding:0 15px;height:30px;border:0;background:#617d46;color:#fff;text-decoration:none} +a.btn_cancel {line-height:2.5em;vertical-align:middle} +.btn_frmline {display:inline-block;padding:0 7px;height:24px;border:0;background:#444;color:#fff !important;letter-spacing:-0.1em;text-decoration:none;vertical-align:middle;line-height:2em} /* 우편번호검색버튼 등 */ +.btn_frmline:focus, .btn_frmline:hover, .btn_frmline:active {text-decoration:none} + +.btn_win {margin:0 20px 10px} /* 새창용 */ + +.btn_win01 {clear:both;text-align:center} +.btn_win01 a, .btn_win01 button {padding:0 10px;height:22px;border:1px solid #ccc;background:#fafafa} +.btn_win01 a {display:inline-block;line-height:2em;cursor:pointer} +.btn_win01 a:focus, .btn_win01 a:hover {text-decoration:none} + +.btn_win02 {clear:both;text-align:center} +.btn_win02 a, .btn_win02 button {padding:0 15px;height:30px;border:0;background:#617d46;color:#fff} +.btn_win02 a {display:inline-block;vertical-align:middle;cursor:pointer} +.btn_win02 a:focus, .btn_win02 a:hover {text-decoration:none} +.btn_win02 button.btn_submit {background:#ff3061;color:#fff} + +.btn_list {margin:0 20px 10px} /* 목록용 */ + +.btn_list01 {} +.btn_list01 input, .btn_list01 button, .btn_list01 a {display:inline-block;margin:0;padding:10px;border:1px solid #ccc;background:#fafafa;text-decoration:none;cursor:pointer} +.btn_list01 a:focus {background:#555} + +.btn_list02 {} +.btn_list02 input, .btn_list02 button, .btn_list02 a {display:inline-block;padding:5px 10px;border:1px solid #ccc;background:#fafafa;text-decoration:none;cursor:pointer} +.btn_list02 a:focus {background:#555} + +.btn_list03 {text-align:right} +.btn_list03 a {display:inline-block;padding:0 15px;height:28px;background:#617d46;color:#fff;text-decoration:none;line-height:2.4em;vertical-align:middle} +.btn_list03 a:focus {background:#555} + +.btn_add {margin:0 20px 10px} /* 목록용 추가 */ + +.btn_add01 {text-align:right} +.btn_add01 a, .btn_add01 button {padding:10px;border:1px solid #ccc;background:#f0f0f0;text-decoration:none;cursor:pointer} +.btn_add01 a {display:inline-block;vertical-align:middle} +.btn_add01 button {margin:0} + +/* 필수입력 */ +.required {background:url('../../img/wrest.gif') #f6f9fa top right no-repeat !important} + +/* 외부서비스 사이트코드 */ +.sitecode {display:inline-block;font:bold 15px 'Verdana';vertical-align:middle} + +/* 폼 */ +textarea, .frm_input {border:1px solid #ced9de;background:#f6f9fa;vertical-align:middle} +textarea {padding:2px;width:90%} +.frm_input {height:22px;line-height:1.8em} +.full_input {width:98%} +select {border:1px solid #ced9de} +legend {position:absolute;width:0;height:0;font-size:0;line-height:0;text-indent:-9999em;border:0;overflow:hidden} + +.readonly {} + +/* 폼 안내글 */ +.frm_info {display:block;padding:0 0 5px;color:#5b747e} + +/* 목록 바로가기 */ +.anchor {margin:0 20px 10px 21px;padding:0;zoom:1} +.anchor:after {display:block;visibility:hidden;clear:both;content:""} +.anchor li {float:left;margin-left:-1px;list-style:none} +.anchor a {display:inline-block;padding:5px 10px;border:1px solid #c8ced1;background:#d6dde1;text-decoration:none} +.anchor a:focus, .anchor a:hover {background:#c8d2d8} + +#sort_mb {width:800px} + +#sort_sodr {width:600px} + +/* 하단 레이아웃 */ +#ft {clear:both;margin:20px 0;padding:10px 20px;min-width:960px;border-top:1px solid #d0d6d8} + +/* 페이지 내 검색 */ +.local_sch {min-width:960px} +.local_sch .btn_submit {padding:0 5px;height:24px;border:0;color:#fff;font-size:0.95em;vertical-align:middle;cursor:pointer} + +.local_sch01 {margin:0 0 10px;padding:0 20px 10px;border-bottom:1px solid #e9e9e9} +.local_sch01 span {display:block;margin:0 0 5px} + +.local_sch02 {margin:0 0 10px;padding:0 20px 5px;border-bottom:1px solid #e9e9e9} +.local_sch02 div {padding:0 0 5px;margin:0 0 5px;border-bottom:1px solid #f4f4f4} +.local_sch02 div.sch_last {margin:0;border:0} +.local_sch02 strong {display:inline-block;width:80px} +.local_sch02 strong.sch_long {width:160px} +.local_sch02 label {display:inline-block;margin:0 5px 0 0} +.local_sch02 button {margin:0;padding:5px;border:1px solid #ced9de;background:#f6f9fa;font-size:0.95em;vertical-align:middle;cursor:pointer} + +/* 페이지 내 실행 */ +.local_cmd {min-width:960px} + +.local_cmd01 {margin:0 0 10px;padding:0 20px} +.local_cmd01 .cmd_tit {font-weight:bold} +.local_cmd01 .btn_submit {padding:3px 5px;border:1px solid #ff3061;color:#fff;font-size:0.95em;vertical-align:middle;cursor:pointer} + +/* 페이지 내 안내문 */ +.local_desc {} +.local_desc ol, .local_desc ul {margin:0;padding:0 0 10px 21px} +.local_desc li {margin:0 0 5px} + +.local_desc01 {margin:0 20px 10px;padding:10px 20px 0;min-width:920px;border:1px solid #f2f2f2;background:#f9f9f9} +.local_desc01 strong {color:#ff3061} +.local_desc01 a {text-decoration:underline} + +.local_desc02 {margin:0 20px 10px;min-width:960px} /* 주로 온라인 서식 관련 안내 내용에 사용 */ +.local_desc02 p {padding:0;line-height:1.8em} + +/* 페이지 내 카운트 */ +.local_ov {min-width:960px} + +.local_ov01 {position:relative;margin:-10px 0 10px;padding:10px 20px;border-bottom:1px solid #e9e9e9;background:#f2f5f9} +.local_ov01 .ov_listall {display:inline-block;margin:0 5px 0 0;padding:0 10px 0 0;border-right:1px solid #ccc} + +/* 테이블 */ +table {clear:both;width:100%;border-collapse:collapse;border-spacing:0} +table caption {height:0;font-size:0;line-height:0;overflow:hidden} +tbody td {border:1px solid #ececec} +tfoot th, tfoot td {padding:10px 0;border:1px solid #c1d1d5;background:#d7e0e2} +tfoot th {} +tfoot td {font-weight:bold;text-align:center} + +.tbl_wrap {margin:0 0 10px;padding:0 20px} + +/* thead 한 줄 테이블 */ +.tbl_head01 {} +.tbl_head01 table {clear:both;width:100%;border-collapse:collapse;border-spacing:0} +.tbl_head01 thead th {padding:10px 0;border:1px solid #d1dee2;background:#e5ecef;color:#383838;font-size:0.95em;letter-spacing:-0.1em} +.tbl_head01 thead input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head01 thead a {color:#383838;text-decoration:underline} +.tbl_head01 tbody th {} +.tbl_head01 tbody td {padding:10px 5px;line-height:1.4em;word-break:break-all} + +/* thead 두 줄 테이블 */ +.tbl_head02 {} +.tbl_head02 table {clear:both;width:100%;border-collapse:collapse;border-spacing:0} +.tbl_head02 thead th {padding:5px 0;border:1px solid #d1dee2;background:#e5ecef;color:#383838;font-size:0.95em;letter-spacing:-0.1em} +.tbl_head02 thead input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head02 thead a {color:#383838;text-decoration:underline} +.tbl_head02 tbody th {} +.tbl_head02 tbody td {padding:5px 3px;line-height:1.4em;word-break:break-all} + +/* 폼 테이블 */ +.tbl_frm01 th {padding:0;border-top:1px solid #ececec;border-bottom:1px solid #ececec;text-align:left} +.tbl_frm01 td {padding:10px 5px;border-right:0;border-left:0} +.tbl_frm01 textarea {height:150px} +.tbl_frm01 #captcha {margin:0;padding:0;border:0;background:transparent} +.tbl_frm01 #captcha input {margin-left:5px;text-align:center} + +/* 자료 없는 목록 */ +.empty_table {padding:100px 0 !important;text-align:center} +.empty_list {padding:20px 0 !important;text-align:center} + +/* 테이블 그리드 */ +.grid_1 {width:50px} +.grid_2 {width:100px} +.grid_3 {width:150px} +.grid_4 {width:200px} +.grid_5 {width:250px} +.grid_6 {width:300px} +.grid_7 {width:350px} +.grid_8 {width:400px} +.grid_9 {width:450px} +.grid_10 {width:500px} +.grid_11 {width:550px} +.grid_12 {width:600px} +.grid_13 {width:650px} +.grid_14 {width:700px} +.grid_15 {width:750px} +.grid_16 {width:800px} +.grid_17 {width:850px} +.grid_18 {width:900px} + +/* 목록 홀짝 배경색 */ +.bg0 {background:#fff} +.bg1 {background:#f2f5f9} +.bg1 td {border-color:#e9e9e9} +.bg0cancel {background:#fdebf3} +.bg0cancel td {border-color:#f9d8e6} +.bg1cancel {background:#fdebf3} +.bg1cancel td {border-color:#f9d8e6} + +/* 메뉴설정 */ +#menu_frm #menu_result {margin:20px 0} + +#menulist .sub_menu_class {padding-left:25px;background:url('../img/sub_menu_ico.gif') 5px 15px no-repeat} + +/* 회원관리 목록 */ +.mb_leave_msg {color:#b6b6b6} +.mb_intercept_msg {color:#f59fe4} +#point_mng {margin-top:50px} + +/* 게시판추가/수정 */ +#anc_bo_extra .td_grpset label {width:auto} +#anc_bo_extra .td_grpset input {margin:0} +#anc_bo_extra label {display:inline-block;width:100px} +#anc_bo_extra input {margin-right:10px} + +/* 접속자집계 목록 */ +.tbl_visit_list td {text-align:center} +.visit_bar {position:relative} +.visit_bar span {position:absolute;top:-8px;left:0;height:15px;background:#ddd} + +/* 추가배송비 관리 */ +#sendcost_postal {margin-top:50px} +#sendcost_postal_win {} +#sendcost_postal_win fieldset {text-align:center} +#sendcost_postal_win ul {margin:10px auto;padding:5px 10px;width:87%;border-right:1px solid #eee;border-bottom:1px solid #eee;background:#fff;list-style:none} +#sendcost_postal_win li {position:relative;padding:8px 0 6px;border-bottom:1px solid #eee} +#sendcost_postal_win button {position:absolute;top:4px;right:0} + +/* 공통 */ +.td_addr {text-align:left !important} +.td_addr_line {line-height:2em} +.td_amount {width:70px;text-align:center} +.td_auth {width:100px;text-align:center} +.td_auth_mbnick {width:200px} +.td_boolean {width:50px;text-align:center} +.td_category {width:120px;text-align:center} +.td_chk {width:30px;text-align:center} +.td_cnt {width:100px;font-size:0.95em;text-align:center} +.td_cntsmall {width:50px;font-size:0.95em;text-align:center} +.td_code {width:60px} +.td_confirm {width:90px;text-align:center} +.td_date {width:70px;text-align:center} +.td_datetime {width:130px;text-align:center} +.td_delicom {width:100px} +.td_etc {width:80px;text-align:center} +.td_extra label {display:inline-block;width:100px} +.td_extra input {margin-right:5px;width:130px} +.td_grid {width:60px;text-align:center} +td.td_grpset {width:160px;border-left:1px solid #e9ecee;text-align:center} +.td_id {width:150px} +.td_idsmall {width:75px} +.td_itopt {width:200px} +.td_img {text-align:center} +.td_imgline {width:70px;text-align:center} +.td_input input {width:94%} +.td_mbcert {text-align:center} +.td_mbid, .td_name, .td_mbname {width:100px;text-align:left !important} +.td_mbstat {text-align:center} +.td_mng {width:100px;font-size:0.95em;text-align:center;letter-spacing:-0.1em} +.td_mngsmall {width:60px;font-size:0.95em;text-align:center;letter-spacing:-0.1em} +.td_mng button, .td_mngsmall button {margin:0;padding:0;border:0;background:transparent} +.td_num {width:60px;text-align:center} +.td_numbig {width:100px;text-align:center} +.td_numcancel {color:#999;text-decoration:line-through} +.td_numcoupon {color:#86b325;text-align:center} +.td_numincome {color:#357dbb;text-align:center} +.td_numsmall {width:30px;text-align:center} +.td_numsum {font-weight:bold;text-align:center} +.td_numrdy {color:#ff3061;text-align:center} +.td_odrnum {width:250px;text-align:center} +.td_odrnum2 {width:140px;text-align:center} +.td_odrnum3 {width:110px;text-align:center} +.td_odrstatus {width:70px;letter-spacing:-0.1em;text-align:center} +.td_output {width:90px;text-align:center} +.td_payby {width:70px;text-align:center;letter-spacing:-0.1em} +.td_paybybig {width:140px;text-align:center;letter-spacing:-0.1em} +.td_possible {width:70px;text-align:center} +.td_postal {width:60px;text-align:center} +.td_bigpostal {width:140px;text-align:center} +.td_pt {text-align:right !important} +.td_scate {padding-right:15px;text-align:right;vertical-align:top} +.td_send {width:50px;text-align:center} +.td_sendcost_by {width:50px;text-align:center} +.td_sendcost_add {width:100px;text-align:center} +.td_tdiv {border-bottom:1px solid #c9c9c9 !important} +.td_tel {width:80px;text-align:center} +.td_test {width:50px;text-align:center} + +.txt_true {color:#e8180c} +.txt_false {color:#ccc} +.txt_succeed {color:#40b300} +.txt_fail {color:#ce4242} + +.banner_or_img {margin:10px 0 0} +.banner_or_img button {display:block;margin:5px 0 0} +.txt_active {color:#5d910b} +.txt_expired {color:#ccc} + +/* 환경설정 */ +.cf_cert_hide {display:none} + +/* 관리권한설정 */ +#add_admin fieldset {margin-top:20px} + +/* 메일 테스트 */ +#fsendmailtest {margin:50px 0;text-align:center} +#fsendmailtest .btn_submit {padding:3px 5px;border:1px solid #ff3061;color:#fff;font-size:0.95em;vertical-align:middle;cursor:pointer} + +/* ########## 쇼핑몰 사용시 적용 ########## */ + +/* 쇼핑몰 설정 */ +#anc_scf_payment textarea {height:50px} + +#scf_cardtest_btn {margin-left:5px;vertical-align:middle} +#scf_cardtest_tip {margin:10px 0 0;padding:10px;border:3px solid #ddd} +#scf_cardtest_tip strong {display:inline-block;margin:0 0 5px} +#scf_cardtest_tip dl {margin:0 0 15px;padding:0;zoom:1} +#scf_cardtest_tip dl:after {display:block;visibility:hidden;clear:both;content:""} +#scf_cardtest_tip dt {float:left;width:100px} +#scf_cardtest_tip dd {padding:0;overflow:hidden} +.scf_cardtest_tip {display:none} + +.scf_img {display:none} + +#scf_sms_pre h3 {padding:10px 0 0} +#scf_sms_pre dl {margin:10px 0 0;zoom:1} +#scf_sms_pre dl:after {display:block;visibility:hidden;clear:both;content:""} +#scf_sms_pre dt {clear:both;float:left;padding:5px 0;width:100px} +#scf_sms_pre dd {padding:5px 0;overflow:hidden} +#scf_sms_pre p {margin:0 0 20px} +#scf_sms {margin:0 0 30px;zoom:1} +#scf_sms:after {display:block;visibility:hidden;clear:both;content:""} +.scf_sms_box {float:left;margin:0 8px 0 9px;width:163px;text-align:center} +.scf_sms_box h4 {margin:0 0 5px} +.scf_sms_img {margin:10px 0;width:163px;height:191px;background:url('../shop_admin/img/sms_back.gif') no-repeat 0 0;text-align:center} +.scf_sms_img textarea {margin:54px 0 0;width:115px;height:85px;border:0;background:transparent;font-size:0.95em;overflow:hidden} +.scf_sms_img span {display:block} +.scf_sms_cnt {display:block} + +/* 주문내역 */ +#sodr_list {text-align:center} + +/* 주문내역 수정 */ +.sodr_nonpay {color:#ff6600} +strong.sodr_nonpay {display:block;padding:5px 0;text-align:right} +.sodr_sppay {color:#1f9bff} +#anc_sodr_memo textarea {width:98%} +#anc_sodr_memo .btn_confirm {margin:10px 0 0} +#anc_sodr_payer #od_addr1, +#anc_sodr_payer #od_addr2 {margin:5px 0 0} +#anc_sodr_addressee #od_b_addr1, +#anc_sodr_addressee #od_b_addr2 {margin:5px 0 0} + +#sodr_qty_log h3 {margin:20px 0 10px} +#sodr_qty_log div {padding:10px;height:auto !important;height:200px;max-height:200px;border:1px solid #e9e9e9;background:#f5f6fa;line-height:1.8em;overflow-y:scroll} + +#sodr_request_frm h3 {margin:20px 0 0} +#sodr_request_item h3 {margin-bottom:10px} +#sodr_request_frm #forderrequest {border-top:1px solid #e9e9e9} +#sodr_request_log_wrap {padding:10px;height:auto !important;height:200px;max-height:200px;border:1px solid #e9e9e9;background:#f5f6fa;overflow-y:scroll} +#sodr_request_log_wrap p {position:relative;padding:5px 0;border-bottom:1px solid #e9e9e9} +#sodr_request_log_wrap span {display:inline-block;margin:0 0 0 80px} +#sodr_request_log_wrap b {display:inline-block;margin:0 15px 0 0;font-weight:normal} +#sodr_request_log_wrap button {position:absolute;top:7px;left:0;margin:0;padding:0;border:0;background:transparent;font-weight:bold} +#sodr_request_handle h3 {margin-bottom:10px} + +#anc_sodr_request h3 {margin:20px 0 10px} +#sodr_request_list {padding:10px;height:auto !important;height:200px;max-height:200px;border:1px solid #e9e9e9;background:#f5f6fa;overflow-y:scroll} +#sodr_request_list p {position:relative;padding:5px 0;border-bottom:1px solid #e9e9e9} + +/* 주문통합내역 */ +#sodr_sort {margin:0 20px 20px;padding:0;list-style:none;zoom:1} +#sodr_sort:after {display:block;visibility:hidden;clear:both;content:""} +#sodr_sort li {float:left;margin:0 10px 0 0} +#sodr_sort a {font-size:0.95em;text-decoration:underline;letter-spacing:-0.1em} +#sodr_sort a.sort_on {color:#ff3061} + +#sodr_all {margin:0 20px} +#sodr_all h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#sodr_all .btn_list {margin:10px 0} + +.sodr_all_list {clear:both;margin:0 0 50px;padding:0;list-style:none} + +.sodr_all_list .sodr_basic {float:left;zoom:1} +.sodr_all_list .sodr_basic:after {display:block;visibility:hidden;clear:both;content:""} +.sodr_all_list .sodr_basic dt {float:left;margin:0 10px 0 0} +.sodr_all_list .sodr_basic dd {float:left;margin:0 30px 0 0} +.sodr_all_list .sodr_basic strong a {color:#ff3061;text-decoration:underline} + +.sodr_all_list .sodr_person {float:right;zoom:1} +.sodr_all_list .sodr_person:after {display:block;visibility:hidden;clear:both;content:""} +.sodr_all_list .sodr_person dt {float:left;margin:0 0 0 30px} +.sodr_all_list .sodr_person dd {float:left;margin:0 0 0 10px} + +.sodr_all_list .sodr_pay {clear:both;margin:0;border-top:1px solid #d1dee2;zoom:1} +.sodr_all_list .sodr_pay:after {display:block;visibility:hidden;clear:both;content:""} +.sodr_all_list .sodr_pay dt {float:left;padding:8px 0;width:15%} +.sodr_all_list .sodr_pay dd {float:left;margin:0;padding:8px 0;width:35%} + +#sodr_total table {text-align:center} +#sodr_total th {width:125px} + +/* 분류관리 목록 */ +.cate_list_lbl {display:inline-block;width:13px;height:13px;background:url('../shop_admin/img/icon_reply.gif') 0 0 no-repeat} + +/* 분류 추가/수정 */ +.frm_ca_id {display:inline-block;margin:0 10px 0 0;font-weight:bold} + +/* 상품관리 */ +.sit_odrby {text-align:center} +.sit_amt {text-align:right;background-color:#e8fbff !important} +.sit_amt2 {text-align:right;border-color:#c3e189 !important;background-color:#f6ffe6 !important} +.sit_amt3 {text-align:right;border-color:#f6c8c4 !important;background-color:#ffedeb !important} +.sit_camt, .sit_pt, .sit_qty {text-align:right} +.frm_sit_title {margin:5px 0 0} + +/* 상품입력/수정 */ +#sit_compact {margin:0 20px;padding:15px 0;border:1px solid #e9e9e9;background:#f7f7f7;text-align:center} + +.sit_w_opt {height:70px !important} +.sit_wimg {display:none} +.sit_relation_list {width:100%;background:#f6f6f6} +.sit_relation_selected {width:100%;background:#fcfff2} +#add_span img, #sel_span img {margin:5px 0} + +.sit_option {margin:0 0 10px;padding:10px 10px 0;border:1px solid #e9e9e9;background:#f7f7f7} +.sit_option .frm_input {background:#fff !important;color:#000} +.sit_option_frm_wrapper {margin:0 0 10px;height:auto !important;height:500px;max-height:500px;border:1px solid #484848;overflow-y:scroll} +.sit_option_frm_wrapper th {padding:5px 0 !important;text-align:center !important} + +#sit_option_frm .btn_list {margin:0 0 10px} +#sit_option_frm fieldset {padding:10px;border:1px solid #e9e9e9;background:#f7f7f7;text-align:center} +#sit_option_frm fieldset .frm_input {margin:0 10px 0 5px;background:#fff !important;color:#000} + +#sit_option_addfrm_btn {position:relative} +#sit_option_addfrm_btn button {position:absolute;top:-32px;right:0} + +#sit_option_addfrm .btn_list {margin:0 0 10px} +#sit_option_addfrm fieldset {padding:10px;border:1px solid #e9e9e9;background:#f7f7f7;text-align:center} +#sit_option_addfrm fieldset .frm_input {margin:0 10px 0 5px;background:#fff !important;color:#000} + +/* 상품 복사 */ +#sit_copy {margin:10px 20px 20px;background:#fff} +#sit_copy label {display:inline-block;margin:0 10px 0 0;font-weight:bold} + +/* 상품 일괄 등록 */ +#excelfile_upload {margin:10px auto 20px;padding:20px;width:86%;border:1px solid #e9e9e9;background:#fff} +#excelfile_upload label {font-weight:bold} +#excelfile_result {margin:0 auto 20px;padding:20px;width:86%;border:1px solid #e9e9e9;background:#fff;zoom:1} +#excelfile_result:after {display:block;visibility:hidden;clear:both;content:""} +#excelfile_result dt {clear:both;float:left;padding:10px 0;width:40%} +#excelfile_result dd {float:left;margin:0;padding:10px 0;width:60%} + +/* 상품옵션재고관리 */ +.sit_stock_qty_alert {color:#ff1133;font-weight:bold} + +/* 배송일괄처리 */ +#sdeli_proc_fs {padding:20px 0;border-bottom:1px solid #f7f7f7;text-align:center} + +/* 이벤트 입력/수정 */ +.frm_ev_id {display:inline-block;margin:0 10px 0 0;font-weight:bold} + +/* 관련 상품, 관련 이벤트 입력/수정 */ +.srel section ul {margin:0;padding:10px;list-style:none} +.srel section li {position:relative;border-bottom:1px solid #e9e9e9} +.srel .srel_list {height:auto !important;height:200px;max-height:200px;border:1px solid #ced9de;background:#f6f6f6;overflow-y:scroll} +.srel .srel_sel {border:1px solid #ced9de;background:#fcfff2} +.srel .srel_list p, .srel .srel_sel p {padding:10px 0;text-align:center} +.srel .compare_left ul {margin:0;list-style:none} +.srel button {position:absolute;top:12px;right:0} +.srel .srel_noneimg li {padding:7px 0} +.srel .srel_noneimg button {top:0;right:0} +.srel .srel_pad {display:block;height:30px} + +/* 쿠폰관리 */ +.scp_new_win .empty_table {padding:30px 0} + +#scp_list_find {margin:10px 20px;padding:20px;border:1px solid #e9e9e9;background:#fff} +#scp_list_find .btn_frmline {line-height:1.5em !important} +#scp_list_find label {font-weight:bold} + +.scp_find_code {width:110px;text-align:center} +.scp_find_select {width:50px;text-align:center} + +.scp_target_select {width:50px;text-align:center} + +/* 매출현황 */ +#ssale_stats {zoom:1} +#ssale_stats:after {display:block;clear:both;visibility:hidden;content:''} +#ssale_stats div {float:left;padding:2%;width:46%;border-bottom:1px solid #eee;text-align:center} +#ssale_stats h3 {margin:30px 0 0;font-size:1.3em;text-align:center} +#ssale_stats form {margin:20px 0 10px;padding:10px 0} +#ssale_stats .frm_input {padding:0 10px !important;height:24px !important} + +/* 주문내역출력 (새창) */ +.new_win .sodr_print_pop_list table {width:100%} + +#sodr_print_pop h2 {padding:15px 0;color:#ff3600;text-align:right} +#sodr_print_pop h3 {margin:0 0 10px} + +.sodr_print_pop_list {margin:0 20px 10px;padding:0 0 10px;border-bottom:1px dotted #ddd} +.sodr_print_pop_list .sodr_print_pop_same {margin:0 0 10px;border:1px solid #e9e9e9;background:#f7f7f7;text-align:center} +.sodr_print_pop_list dl {margin:0 0 15px;padding:0;zoom:1} +.sodr_print_pop_list dl:after {display:block;visibility:hidden;clear:both;content:""} +.sodr_print_pop_list dt {float:left;padding:7px 0 6px;width:100px;border-bottom:1px solid #ddd} +.sodr_print_pop_list dd {padding:7px 0 6px;border-bottom:1px solid #ddd;overflow:hidden} + +#sodr_print_pop_total {padding:20px 0;text-align:center} +#sodr_print_pop_total span {display:block;margin:0 0 10px;font-size:1.5em} +#sodr_print_pop_total strong {color:#ff3600} + +/* SMS문자전송 */ +#sms_send {padding-bottom:100px;zoom:1} +#sms_send:after {display:block;visibility:hidden;clear:both;content:""} + +#sms_frm {float:left;width:650px} +#sms_frm table {margin:0 0 30px} +#sms_frm textarea {height:70px} + +#sms_sm {position:relative;float:left;width:229px;height:418px;background:url('../shop_admin/img/mobilebg.jpg') no-repeat} +#sms_sm_text {position:absolute;top:75px;left:27px;width:180px;color:#fff;font-size:2em;word-break:break-all} +#sms_sm p {position:absolute;bottom:-70px;left:0;font-size:0.95em;letter-spacing:-0.1em} + +/* 가격비교사이트 */ +#anc_pricecompare_info li {margin:5px 0} + +#anc_pricecompare_engine dt a {font-weight:bold} +#anc_pricecompare_engine dd {margin:0 0 30px} +#anc_pricecompare_engine li {margin:5px 0} + +/* 새창 기본 스타일 */ +.new_win {} +.new_win h1 {margin-bottom:20px;padding:0 20px;min-width:320px/* 적정값으로 변경하여 사용하세요. */;height:60px;border-top:2px solid #484848;border-bottom:1px solid #e9e9e9;background:#fff;font-size:1.2em;line-height:5em} +.new_win h2 {margin:0 20px 10px} +.new_win_ul {margin:-20px 0 20px 0;padding:0 0 0 20px;border-bottom:1px solid #515151;background:#484848;list-style:none;zoom:1} +.new_win_ul:after {display:block;visibility:hidden;clear:both;content:""} +.new_win_ul li {float:left;margin-left:-1px} +.new_win_ul a {display:block;padding:10px 10px 8px;border-right:1px solid #595959;border-left:1px solid #595959;color:#fff;font-family:dotum;font-weight:bold;text-decoration:none} +.new_win_desc {margin:0 20px} +.new_win .anchor {margin:0 20px 5px} +.new_win .tbl_wrap {margin:0 20px 20px;padding:0} + +.new_win .win_btn {clear:both;padding:20px;text-align:center} /* 새창용 */ +.new_win .win_btn button {display:inline-block;padding:0 10px;height:30px;border:0;background:#4b545e;color:#fff;line-height:2em;cursor:pointer} +.new_win .win_btn input {padding:0 10px;height:30px;line-height:2em} +.new_win .win_btn a {display:inline-block;padding:0 10px;height:30px;background:#4b545e;color:#fff;vertical-align:middle;line-height:2.4em} +.new_win .win_btn a:focus, .new_win .win_btn a:hover {text-decoration:none} + +.new_win .local_sch, .new_win .local_cmd, .new_win .local_desc01, .new_win .local_desc02, .new_win .local_ov {min-width:320px} + +/* 자바스크립트 alert 대안 */ +#validation_check {margin:100px auto;width:500px} +#validation_check h1 {margin-bottom:20px;font-size:1.3em} +#validation_check p {margin-bottom:20px;padding:30px 20px;border:1px solid #e9e9e9;background:#fff} + +/* 관리자 비밀번호 확인 */ +#admin_confirm {padding:0 0 10px;background:#222;text-align:center} +#admin_confirm p {margin:0 0 10px;color:#9ab9c5;background:#383a3f} +#admin_confirm label {color:#fff} +#admin_confirm .frm_input {border-color:#000} + +/* 사이드뷰 */ +.sv_wrap {display:inline-block;position:relative;font-weight:normal;font-size:1em} +.sv_wrap .sv {z-index:1000;display:none;margin:5px 0 0;border:1px solid #383838} +.sv_wrap .sv a {display:inline-block;margin:0;padding:3px;width:94px;border-bottom:1px solid #383838;background:#111;color:#fff;text-decoration:none} +.sv_wrap .sv a:focus, .sv_wrap .sv a:hover {background:#393939} +.sv_on {display:block !important;position:absolute;top:10px;left:20px;width:auto;height:auto} +.sv_nojs .sv {display:block} + +/* 페이징 */ +.pg_wrap {clear:both;margin:0 0 20px;padding:20px 0 0;text-align:center} +.pg {} +.pg_page, .pg_current {display:inline-block;padding:0 8px;height:25px;color:#000;letter-spacing:0;line-height:2.2em;vertical-align:middle} +.pg a:focus, .pg a:hover {text-decoration:none} +.pg_page {background:#e4eaec;text-decoration:none} +.pg_start, .pg_prev {/* 이전 */} +.pg_end, .pg_next {/* 다음 */} +.pg_current {display:inline-block;margin:0 4px 0 0;background:#333;color:#fff;font-weight:normal} diff --git a/adm/faqform.php b/adm/faqform.php new file mode 100644 index 000000000..b3852c07e --- /dev/null +++ b/adm/faqform.php @@ -0,0 +1,99 @@ + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + +
    + + + 내용보기 +
    질문
    답변
    +
    + +
    + + 목록 +
    + +
    + + + + diff --git a/adm/faqformupdate.php b/adm/faqformupdate.php new file mode 100644 index 000000000..722a6c3a4 --- /dev/null +++ b/adm/faqformupdate.php @@ -0,0 +1,43 @@ + diff --git a/adm/faqlist.php b/adm/faqlist.php new file mode 100644 index 000000000..94b4a547e --- /dev/null +++ b/adm/faqlist.php @@ -0,0 +1,95 @@ + + +
    + 등록된 FAQ 상세내용 건 +
    + +
    +
      +
    1. FAQ는 무제한으로 등록할 수 있습니다
    2. +
    3. FAQ 상세내용 추가를 눌러 자주하는 질문과 답변을 입력합니다.
    4. +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + '; + } + ?> + +
    목록
    번호제목순서관리
    + 수정 + 삭제 +
    자료가 없습니다.
    + +
    + + + + + diff --git a/adm/faqmasterform.php b/adm/faqmasterform.php new file mode 100644 index 000000000..54a5f67ad --- /dev/null +++ b/adm/faqmasterform.php @@ -0,0 +1,161 @@ + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + 보기 + 상세보기 + +
    + + 750) + $width = 750; + else + $width = $size[0]; + + echo ' '; + $himg_str = ''; + } + if ($himg_str) { + echo ''; + } + ?> +
    + + 750) + $width = 750; + else + $width = $size[0]; + + echo ''; + $timg_str = ''; + } + if ($timg_str) { + echo ''; + } + ?> +
    상단 내용 + +
    하단 내용 + +
    모바일상단 내용 + +
    모바일하단 내용 + +
    +
    + +
    + + 목록 +
    + +
    + + + + diff --git a/adm/faqmasterformupdate.php b/adm/faqmasterformupdate.php new file mode 100644 index 000000000..f6987d795 --- /dev/null +++ b/adm/faqmasterformupdate.php @@ -0,0 +1,72 @@ + diff --git a/adm/faqmasterlist.php b/adm/faqmasterlist.php new file mode 100644 index 000000000..bf6f24039 --- /dev/null +++ b/adm/faqmasterlist.php @@ -0,0 +1,128 @@ +/data/dbconfig.php 파일에
    $g5[\'faq_table\'] = G5_TABLE_PREFIX.\'faq\';
    $g5[\'faq_master_table\'] = G5_TABLE_PREFIX.\'faq_master\';
    를 추가해 주세요.'); +} + +//자주하시는 질문 마스터 테이블이 있는지 검사한다. +if(!sql_query(" DESCRIBE {$g5['faq_master_table']} ", false)) { + if(sql_query(" DESCRIBE {$g5['g5_shop_faq_master_table']} ", false)) { + sql_query(" ALTER TABLE {$g5['g5_shop_faq_master_table']} RENAME TO `{$g5['faq_master_table']}` ;", false); + } else { + $query_cp = sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['faq_master_table']}` ( + `fm_id` int(11) NOT NULL AUTO_INCREMENT, + `fm_subject` varchar(255) NOT NULL DEFAULT '', + `fm_head_html` text NOT NULL, + `fm_tail_html` text NOT NULL, + `fm_order` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`fm_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ", true); + } + // FAQ Master + sql_query(" insert into `{$g5['faq_master_table']}` set fm_id = '1', fm_subject = '자주하시는 질문' ", false); +} + +//자주하시는 질문 테이블이 있는지 검사한다. +if(!sql_query(" DESCRIBE {$g5['faq_table']} ", false)) { + if(sql_query(" DESCRIBE {$g5['g5_shop_faq_table']} ", false)) { + sql_query(" ALTER TABLE {$g5['g5_shop_faq_table']} RENAME TO `{$g5['faq_table']}` ;", false); + } else { + $query_cp = sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['faq_table']}` ( + `fa_id` int(11) NOT NULL AUTO_INCREMENT, + `fm_id` int(11) NOT NULL DEFAULT '0', + `fa_subject` text NOT NULL, + `fa_content` text NOT NULL, + `fa_order` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`fa_id`), + KEY `fm_id` (`fm_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ", true); + } +} + +$g5['title'] = 'FAQ관리'; +include_once (G5_ADMIN_PATH.'/admin.head.php'); + +$sql_common = " from {$g5['faq_master_table']} "; + +// 테이블의 전체 레코드수만 얻음 +$sql = " select count(*) as cnt " . $sql_common; +$row = sql_fetch($sql); +$total_count = $row['cnt']; + +$rows = $config['cf_page_rows']; +$total_page = ceil($total_count / $rows); // 전체 페이지 계산 +if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지) +$from_record = ($page - 1) * $rows; // 시작 열을 구함 + +$sql = "select * $sql_common order by fm_order, fm_id limit $from_record, {$config['cf_page_rows']} "; +$result = sql_query($sql); +?> + +
    + 1) {?>처음으로 + 전체 FAQ +
    + +
    +
      +
    1. FAQ는 무제한으로 등록할 수 있습니다
    2. +
    3. FAQ추가를 눌러 FAQ Master를 생성합니다. (하나의 FAQ 타이틀 생성 : 자주하시는 질문, 이용안내..등 )
    4. +
    5. 생성한 FAQ Master 의 제목을 눌러 세부 내용을 관리할 수 있습니다.
    6. +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + '; + } + ?> + +
    목록
    ID제목FAQ수순서관리
    + 수정 + 보기 + 삭제 +
    자료가 한건도 없습니다.
    +
    + + + + diff --git a/adm/img/hd_bg.jpg b/adm/img/hd_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..345d89cc5aa2857fcfc59172867bf868922f3f1c GIT binary patch literal 8188 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 literal 0 HcmV?d00001 diff --git a/adm/img/logo.jpg b/adm/img/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3d9b91a468794f531112f5fa675c162170d66c9 GIT binary patch literal 6018 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 B6leed literal 0 HcmV?d00001 diff --git a/adm/img/sub_menu_ico.gif b/adm/img/sub_menu_ico.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1e10993ba2138b30ad0d0f01e6604976e154ce3 GIT binary patch literal 87 zcmZ?wbhEHb6GfnG=_FEK5GHD$h$~ ztviPWGl%nC(dL7W8()`($+9eb@tKFkWKLo86^SX5j0X#P3Z>ec+pgcy5xVnc$}8Q8 byVpeiJi6@s+xcd8``3T>7jJA5WUvMR)k{(I literal 0 HcmV?d00001 diff --git a/adm/img/ts02.gif b/adm/img/ts02.gif new file mode 100644 index 0000000000000000000000000000000000000000..0a48974a39cdb2d2fc2093bd200065e8b36bc87d GIT binary patch literal 188 zcmV;t07L&rNk%w1VHf}y0J8u9|NsBo+}xX+n|F72+uPfKfPlcj!0qkrcifAb=pWoiXggZR4Urqju}8IER6O2=wRZJ;=&stB2d(oIQbK + +
    +

    신규가입회원 건 목록

    +
    + 총회원수 명 중 차단 명, 탈퇴 : 명 +
    + +
    + + + + + + + + + + + + + + + + + + '.$row2['cnt'].''; + + if ($is_admin == 'group') + { + $s_mod = ''; + $s_del = ''; + } + else + { + $s_mod = '수정'; + $s_del = '삭제'; + } + $s_grp = '그룹'; + + $leave_date = $row['mb_leave_date'] ? $row['mb_leave_date'] : date("Ymd", G5_SERVER_TIME); + $intercept_date = $row['mb_intercept_date'] ? $row['mb_intercept_date'] : date("Ymd", G5_SERVER_TIME); + + $mb_nick = get_sideview($row['mb_id'], $row['mb_nick'], $row['mb_email'], $row['mb_homepage']); + + $mb_id = $row['mb_id']; + if ($row['mb_leave_date']) + $mb_id = $mb_id; + else if ($row['mb_intercept_date']) + $mb_id = $mb_id; + + ?> + + + + + + + + + + + + + '; + ?> + +
    신규가입회원
    회원아이디이름닉네임권한포인트수신공개인증차단그룹
    자료가 없습니다.
    +
    + + + +
    + + a.wr_parent "; +} +$sql_order = " order by a.bn_id desc "; + +$sql = " select count(*) as cnt {$sql_common} "; +$row = sql_fetch($sql); +$total_count = $row['cnt']; + +$colspan = 5; +?> + +
    +

    최근게시물

    + +
    + + + + + + + + + + + + + + + + + + + + + + + '; + ?> + +
    최근게시물
    그룹게시판제목이름일시
    자료가 없습니다.
    +
    + + +
    + + + +
    +

    최근 포인트 발생내역

    +
    + 전체 건 중 건 목록 +
    + +
    + + + + + + + + + + + + + + + '; + $link2 = ''; + } + ?> + + + + + + + + + + + + '; + ?> + +
    최근 포인트 발생내역
    회원아이디이름닉네임일시포인트 내용포인트포인트합
    자료가 없습니다.
    +
    + + +
    + + diff --git a/adm/mail_delete.php b/adm/mail_delete.php new file mode 100644 index 000000000..73396ca1f --- /dev/null +++ b/adm/mail_delete.php @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/adm/mail_form.php b/adm/mail_form.php new file mode 100644 index 000000000..f743b7fb4 --- /dev/null +++ b/adm/mail_form.php @@ -0,0 +1,86 @@ + + +

    메일 내용에 {이름} , {닉네임} , {회원아이디} , {이메일} 처럼 내용에 삽입하면 해당 내용에 맞게 변환하여 메일을 발송합니다.

    + +
    + + + + +
    + + + + + + + + + + + + + + + + +
    +
    + +
    + +
    +
    + + + + diff --git a/adm/mail_list.php b/adm/mail_list.php new file mode 100644 index 000000000..727f4cf9c --- /dev/null +++ b/adm/mail_list.php @@ -0,0 +1,109 @@ + + +
    +

    + 테스트는 등록된 최고관리자의 이메일로 테스트 메일을 발송합니다.
    + 현재 등록된 메일은 총 건입니다.
    + 주의) 수신자가 동의하지 않은 대량 메일 발송에는 적합하지 않습니다. 수십건 단위로 발송해 주십시오. +

    +
    + + + +
    +
    + + + + + + + + + + + + + + + 삭제'; + $s_vie = '미리보기'; + + $num = number_format($total_count - ($page - 1) * $config['cf_page_rows'] - $i); + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + + + + "; + ?> + +
    목록
    번호제목작성일시테스트보내기미리보기
    + + + 테스트보내기
    자료가 없습니다.
    +
    + +
    + +
    +
    + + + + \ No newline at end of file diff --git a/adm/mail_preview.php b/adm/mail_preview.php new file mode 100644 index 000000000..110d3bae2 --- /dev/null +++ b/adm/mail_preview.php @@ -0,0 +1,34 @@ +

    ▶ 더 이상 정보 수신을 원치 않으시면 [수신거부] 해 주십시오.

    "; +?> + + + + + +<?php echo G5_VERSION ?> 메일발송 테스트 + + + + +

    + +

    + +

    + +

    + 주의! 이 화면에 보여지는 디자인은 실제 내용이 발송되었을 때 디자인과 다를 수 있습니다. +

    + + + \ No newline at end of file diff --git a/adm/mail_select_form.php b/adm/mail_select_form.php new file mode 100644 index 000000000..8aebfd80e --- /dev/null +++ b/adm/mail_select_form.php @@ -0,0 +1,122 @@ + '' "; +$row = sql_fetch($sql); +$finish_cnt = $row['cnt']; + +$last_option = explode('||', $ma['ma_last_option']); +for ($i=0; $i + +
    + 전체회원 명 , 탈퇴대기회원 명, 정상회원 명 중 메일 발송 대상 선택 +
    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    대상선택
    회원 ID + > + > + 에서 + 까지 +
    + + +
    + +
    권한 + + 에서 + + 까지 +
    + +
    +
    + +
    + + 목록 +
    +
    + + diff --git a/adm/mail_select_list.php b/adm/mail_select_list.php new file mode 100644 index 000000000..db05cca50 --- /dev/null +++ b/adm/mail_select_list.php @@ -0,0 +1,123 @@ + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    목록
    번호회원아이디이름닉네임E-mail
    + +
    + +
    + + 뒤로 +
    + +
    + + diff --git a/adm/mail_select_update.php b/adm/mail_select_update.php new file mode 100644 index 000000000..6bf996421 --- /dev/null +++ b/adm/mail_select_update.php @@ -0,0 +1,87 @@ +"; +echo "

    메일 발송중 ...

    [끝] 이라는 단어가 나오기 전에는 중간에 중지하지 마세요.

    "; +echo ""; +?> + + + + + +

    ▶ 더 이상 정보 수신을 원치 않으시면 [수신거부] 해 주십시오.

    "; + + mailer($config['cf_admin_email_name'], $config['cf_admin_email'], $to_email, $subject, $content, 1); + + echo "\n"; + //echo "+"; + flush(); + ob_flush(); + ob_end_flush(); + usleep($sleepsec); + if ($cnt % $countgap == 0) + { + echo "\n"; + } + + // 화면을 지운다... 부하를 줄임 + if ($cnt % $maxscreen == 0) + echo "\n"; + } +} +?> + diff --git a/adm/mail_test.php b/adm/mail_test.php new file mode 100644 index 000000000..61b3aee56 --- /dev/null +++ b/adm/mail_test.php @@ -0,0 +1,39 @@ +더 이상 정보 수신을 원치 않으시면 [수신거부] 해 주십시오.

    '; + +mailer($config['cf_title'], $member['mb_email'], $member['mb_email'], $subject, $content, 1); + +alert($member['mb_nick'].'('.$member['mb_email'].')님께 테스트 메일을 발송하였습니다. 확인하여 주십시오.'); +?> diff --git a/adm/mail_update.php b/adm/mail_update.php new file mode 100644 index 000000000..db96987f3 --- /dev/null +++ b/adm/mail_update.php @@ -0,0 +1,39 @@ + diff --git a/adm/member_delete.php b/adm/member_delete.php new file mode 100644 index 000000000..69240378f --- /dev/null +++ b/adm/member_delete.php @@ -0,0 +1,29 @@ += $member['mb_level']) + alert("자신보다 권한이 높거나 같은 회원은 삭제할 수 없습니다."); + +check_token(); + +// 회원자료 삭제 +member_delete($mb['mb_id']); + +if ($url) + goto_url("{$url}?$qstr&w=u&mb_id=$mb_id"); +else + goto_url("./member_list.php?$qstr"); +?> diff --git a/adm/member_form.php b/adm/member_form.php new file mode 100644 index 000000000..3410c242b --- /dev/null +++ b/adm/member_form.php @@ -0,0 +1,366 @@ +필수'; + + $mb['mb_mailling'] = 1; + $mb['mb_open'] = 1; + $mb['mb_level'] = $config['cf_register_level']; + $html_title = '추가'; +} +else if ($w == 'u') +{ + $mb = get_member($mb_id); + if (!$mb['mb_id']) + alert('존재하지 않는 회원자료입니다.'); + + if ($is_admin != 'super' && $mb['mb_level'] >= $member['mb_level']) + alert('자신보다 권한이 높거나 같은 회원은 수정할 수 없습니다.'); + + $required_mb_id = 'readonly'; + $required_mb_password = ''; + $html_title = '수정'; + + $mb['mb_email'] = get_text($mb['mb_email']); + $mb['mb_homepage'] = get_text($mb['mb_homepage']); + $mb['mb_birth'] = get_text($mb['mb_birth']); + $mb['mb_tel'] = get_text($mb['mb_tel']); + $mb['mb_hp'] = get_text($mb['mb_hp']); + $mb['mb_addr1'] = get_text($mb['mb_addr1']); + $mb['mb_addr2'] = get_text($mb['mb_addr2']); + $mb['mb_signature'] = get_text($mb['mb_signature']); + $mb['mb_recommend'] = get_text($mb['mb_recommend']); + $mb['mb_profile'] = get_text($mb['mb_profile']); + $mb['mb_1'] = get_text($mb['mb_1']); + $mb['mb_2'] = get_text($mb['mb_2']); + $mb['mb_3'] = get_text($mb['mb_3']); + $mb['mb_4'] = get_text($mb['mb_4']); + $mb['mb_5'] = get_text($mb['mb_5']); + $mb['mb_6'] = get_text($mb['mb_6']); + $mb['mb_7'] = get_text($mb['mb_7']); + $mb['mb_8'] = get_text($mb['mb_8']); + $mb['mb_9'] = get_text($mb['mb_9']); + $mb['mb_10'] = get_text($mb['mb_10']); +} +else + alert('제대로 된 값이 넘어오지 않았습니다.'); + +// 본인확인방법 +switch($mb['mb_certify']) { + case 'hp': + $mb_certify_case = '휴대폰'; + $mb_certify_val = 'hp'; + break; + case 'ipin': + $mb_certify_case = '아이핀'; + $mb_certify_val = 'ipin'; + break; + case 'admin': + $mb_certify_case = '관리자 수정'; + $mb_certify_val = 'admin'; + break; + default: + $mb_certify_case = ''; + $mb_certify_val = 'admin'; + break; +} + +// 본인확인 +$mb_certify_yes = $mb['mb_certify'] ? 'checked="checked"' : ''; +$mb_certify_no = !$mb['mb_certify'] ? 'checked="checked"' : ''; + +// 성인인증 +$mb_adult_yes = $mb['mb_adult'] ? 'checked="checked"' : ''; +$mb_adult_no = !$mb['mb_adult'] ? 'checked="checked"' : ''; + +//메일수신 +$mb_mailling_yes = $mb['mb_mailling'] ? 'checked="checked"' : ''; +$mb_mailling_no = !$mb['mb_mailling'] ? 'checked="checked"' : ''; + +// SMS 수신 +$mb_sms_yes = $mb['mb_sms'] ? 'checked="checked"' : ''; +$mb_sms_no = !$mb['mb_sms'] ? 'checked="checked"' : ''; + +// 정보 공개 +$mb_open_yes = $mb['mb_open'] ? 'checked="checked"' : ''; +$mb_open_no = !$mb['mb_open'] ? 'checked="checked"' : ''; + +if (isset($mb['mb_certify'])) { + // 날짜시간형이라면 drop 시킴 + if (preg_match("/-/", $mb['mb_certify'])) { + sql_query(" ALTER TABLE `{$g5['member_table']}` DROP `mb_certify` ", false); + } +} else { + sql_query(" ALTER TABLE `{$g5['member_table']}` ADD `mb_certify` TINYINT(4) NOT NULL DEFAULT '0' AFTER `mb_hp` ", false); +} + +if(isset($mb['mb_adult'])) { + sql_query(" ALTER TABLE `{$g5['member_table']}` CHANGE `mb_adult` `mb_adult` TINYINT(4) NOT NULL DEFAULT '0' ", false); +} else { + sql_query(" ALTER TABLE `{$g5['member_table']}` ADD `mb_adult` TINYINT NOT NULL DEFAULT '0' AFTER `mb_certify` ", false); +} + +// 지번주소 필드추가 +if(!isset($mb['mb_addr_jibeon'])) { + sql_query(" ALTER TABLE {$g5['member_table']} ADD `mb_addr_jibeon` varchar(255) NOT NULL DEFAULT '' AFTER `mb_addr2` ", false); +} + +// 건물명필드추가 +if(!isset($mb['mb_addr3'])) { + sql_query(" ALTER TABLE {$g5['member_table']} ADD `mb_addr3` varchar(255) NOT NULL DEFAULT '' AFTER `mb_addr2` ", false); +} + +// 중복가입 확인필드 추가 +if(!isset($mb['mb_dupinfo'])) { + sql_query(" ALTER TABLE {$g5['member_table']} ADD `mb_dupinfo` varchar(255) NOT NULL DEFAULT '' AFTER `mb_adult` ", false); +} + +if ($mb['mb_intercept_date']) $g5['title'] = "차단된 "; +else $g5['title'] .= ""; +$g5['title'] .= '회원 '.$html_title; +include_once('./admin.head.php'); +?> + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + class="frm_input " size="15" maxlength="20" > + 접근가능그룹보기 + class="frm_input " size="15" maxlength="20">
    포인트
    본인확인방법 + > + + > + +
    본인확인 + > + + > + + + > + + > + +
    + + - + + + 주소 검색
    + +
    + +
    + + +
    + 지번주소 : +
    + 넓이 '.$config['cf_member_icon_width'].'픽셀 높이 '.$config['cf_member_icon_height'].'픽셀로 해주세요.') ?> + + '; + echo '삭제'; + } + ?> +
    메일 수신 + > + + > + + + > + + > + +
    + > + + > + +
    회원가입일최근접속일
    IP
    인증일시 + + + + + + + +
    추천인
    + + " id="mb_leave_date_set_today" onclick="if (this.form.mb_leave_date.value==this.form.mb_leave_date.defaultValue) { +this.form.mb_leave_date.value=this.value; } else { this.form.mb_leave_date.value=this.form.mb_leave_date.defaultValue; }"> + + 접근차단일자 + + " id="mb_intercept_date_set_today" onclick="if +(this.form.mb_intercept_date.value==this.form.mb_intercept_date.defaultValue) { this.form.mb_intercept_date.value=this.value; } else { +this.form.mb_intercept_date.value=this.form.mb_intercept_date.defaultValue; }"> + +
    +
    + +
    + + 목록 +
    +
    + + + + diff --git a/adm/member_form_update.php b/adm/member_form_update.php new file mode 100644 index 000000000..53174cd3b --- /dev/null +++ b/adm/member_form_update.php @@ -0,0 +1,162 @@ += $member['mb_level']) + alert('자신보다 권한이 높거나 같은 회원은 수정할 수 없습니다.'); + + if ($_POST['mb_id'] == $member['mb_id'] && $_POST['mb_level'] != $mb['mb_level']) + alert($mb['mb_id'].' : 로그인 중인 관리자 레벨은 수정 할 수 없습니다.'); + + // 닉네임중복체크 + $sql = " select mb_id, mb_name, mb_nick, mb_email from {$g5['member_table']} where mb_nick = '{$_POST['mb_nick']}' and mb_id <> '$mb_id' "; + $row = sql_fetch($sql); + if ($row['mb_id']) + alert('이미 존재하는 닉네임입니다.\\nID : '.$row['mb_id'].'\\n이름 : '.$row['mb_name'].'\\n닉네임 : '.$row['mb_nick'].'\\n메일 : '.$row['mb_email']); + + // 이메일중복체크 + $sql = " select mb_id, mb_name, mb_nick, mb_email from {$g5['member_table']} where mb_email = '{$_POST['mb_email']}' and mb_id <> '$mb_id' "; + $row = sql_fetch($sql); + if ($row['mb_id']) + alert('이미 존재하는 이메일입니다.\\nID : '.$row['mb_id'].'\\n이름 : '.$row['mb_name'].'\\n닉네임 : '.$row['mb_nick'].'\\n메일 : '.$row['mb_email']); + + $mb_dir = substr($mb_id,0,2); + + // 회원 아이콘 삭제 + if ($del_mb_icon) + @unlink(G5_DATA_PATH.'/member/'.$mb_dir.'/'.$mb_id.'.gif'); + + // 아이콘 업로드 + if (is_uploaded_file($_FILES['mb_icon']['tmp_name'])) { + if (!preg_match("/(\.gif)$/i", $_FILES['mb_icon']['name'])) { + alert($_FILES['mb_icon']['name'] . '은(는) gif 파일이 아닙니다.'); + } + + if (preg_match("/(\.gif)$/i", $_FILES['mb_icon']['name'])) { + @mkdir(G5_DATA_PATH.'/member/'.$mb_dir, G5_DIR_PERMISSION); + @chmod(G5_DATA_PATH.'/member/'.$mb_dir, G5_DIR_PERMISSION); + + $dest_path = G5_DATA_PATH.'/member/'.$mb_dir.'/'.$mb_id.'.gif'; + + move_uploaded_file($_FILES['mb_icon']['tmp_name'], $dest_path); + chmod($dest_path, G5_FILE_PERMISSION); + + if (file_exists($dest_path)) { + $size = getimagesize($dest_path); + // 아이콘의 폭 또는 높이가 설정값 보다 크다면 이미 업로드 된 아이콘 삭제 + if ($size[0] > $config['cf_member_icon_width'] || $size[1] > $config['cf_member_icon_height']) { + @unlink($dest_path); + } + } + } + } + + if ($mb_password) + $sql_password = " , mb_password = '".sql_password($mb_password)."' "; + else + $sql_password = ""; + + if ($passive_certify) + $sql_certify = " , mb_email_certify = '".G5_TIME_YMDHIS."' "; + else + $sql_certify = ""; + + $sql = " update {$g5['member_table']} + set {$sql_common} + {$sql_password} + {$sql_certify} + where mb_id = '{$mb_id}' "; + sql_query($sql); +} +else + alert('제대로 된 값이 넘어오지 않았습니다.'); + +goto_url('./member_form.php?'.$qstr.'&w=u&mb_id='.$mb_id, false); +?> \ No newline at end of file diff --git a/adm/member_list.php b/adm/member_list.php new file mode 100644 index 000000000..cbcd77d92 --- /dev/null +++ b/adm/member_list.php @@ -0,0 +1,307 @@ += '{$stx}') "; + break; + case 'mb_level' : + $sql_search .= " ({$sfl} = '{$stx}') "; + break; + case 'mb_tel' : + case 'mb_hp' : + $sql_search .= " ({$sfl} like '%{$stx}') "; + break; + default : + $sql_search .= " ({$sfl} like '{$stx}%') "; + break; + } + $sql_search .= " ) "; +} + +if ($is_admin != 'super') + $sql_search .= " and mb_level <= '{$member['mb_level']}' "; + +if (!$sst) { + $sst = "mb_datetime"; + $sod = "desc"; +} + +$sql_order = " order by {$sst} {$sod} "; + +$sql = " select count(*) as cnt {$sql_common} {$sql_search} {$sql_order} "; +$row = sql_fetch($sql); +$total_count = $row['cnt']; + +$rows = $config['cf_page_rows']; +$total_page = ceil($total_count / $rows); // 전체 페이지 계산 +if ($page < 1) $page = 1; // 페이지가 없으면 첫 페이지 (1 페이지) +$from_record = ($page - 1) * $rows; // 시작 열을 구함 + +// 탈퇴회원수 +$sql = " select count(*) as cnt {$sql_common} {$sql_search} and mb_leave_date <> '' {$sql_order} "; +$row = sql_fetch($sql); +$leave_count = $row['cnt']; + +// 차단회원수 +$sql = " select count(*) as cnt {$sql_common} {$sql_search} and mb_intercept_date <> '' {$sql_order} "; +$row = sql_fetch($sql); +$intercept_count = $row['cnt']; + +$listall = '전체목록'; + +$g5['title'] = '회원관리'; +include_once('./admin.head.php'); + +$sql = " select * {$sql_common} {$sql_search} {$sql_order} limit {$from_record}, {$rows} "; +$result = sql_query($sql); + +$colspan = 16; +?> + +
    + + 총회원수 명 중, + 차단 명, + 탈퇴 명 +
    + +
    + + + + + + + +
    + +
    +

    + 회원자료 삭제 시 다른 회원이 기존 회원아이디를 사용하지 못하도록 회원아이디, 이름, 닉네임은 삭제하지 않고 영구 보관합니다. +

    +
    + + + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '.$row2['cnt'].''; + + if ($is_admin == 'group') { + $s_mod = ''; + $s_del = ''; + } else { + $s_mod = '수정'; + //$s_del = '삭제'; + } + $s_grp = '그룹'; + + $leave_date = $row['mb_leave_date'] ? $row['mb_leave_date'] : date('Ymd', G5_SERVER_TIME); + $intercept_date = $row['mb_intercept_date'] ? $row['mb_intercept_date'] : date('Ymd', G5_SERVER_TIME); + + $mb_nick = get_sideview($row['mb_id'], $row['mb_nick'], $row['mb_email'], $row['mb_homepage']); + + $mb_id = $row['mb_id']; + $leave_msg = ''; + $intercept_msg = ''; + $intercept_title = ''; + if ($row['mb_leave_date']) { + $mb_id = $mb_id; + $leave_msg = '탈퇴함'; + } + else if ($row['mb_intercept_date']) { + $mb_id = $mb_id; + $intercept_msg = '차단됨'; + $intercept_title = '차단해제'; + } + if ($intercept_title == '') + $intercept_title = '차단하기'; + + $address = $row['mb_zip1'] ? print_address($row['mb_addr1'], $row['mb_addr2'], $row['mb_addr3']) : ''; + + $bg = 'bg'.($i%2); + + switch($row['mb_certify']) { + case 'hp': + $mb_certify_case = '휴대폰'; + $mb_certify_val = 'hp'; + break; + case 'ipin': + $mb_certify_case = '아이핀'; + $mb_certify_val = ''; + break; + case 'admin': + $mb_certify_case = '관리자'; + $mb_certify_val = 'admin'; + break; + default: + $mb_certify_case = ' '; + $mb_certify_val = 'admin'; + break; + } + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + "; + ?> + +
    목록
    + + + 아이디이름본인확인휴대폰상태/권한최종접속접근
    그룹
    관리
    닉네임메일
    인증
    정보
    공개
    메일
    수신
    SMS
    수신
    성인
    인증
    접근
    차단
    전화번호 포인트가입일
    + + + + + > + + > + + + + +
    Yes':'No'; ?> + + value="1" id="mb_open_"> + + + value="1" id="mb_mailling_"> + + + value="1" id="mb_sms_"> + + + value="1" id="mb_adult_"> + + + value="" id="mb_intercept_date_" title=""> + + +
    자료가 없습니다.
    +
    + +
    + + +
    + +
    + + + + + + diff --git a/adm/member_list_delete.php b/adm/member_list_delete.php new file mode 100644 index 000000000..0deced561 --- /dev/null +++ b/adm/member_list_delete.php @@ -0,0 +1,37 @@ += $member['mb_level']) { + $msg .= "{$mb['mb_id']} : 자신보다 권한이 높거나 같은 회원은 삭제할 수 없습니다.\\n"; + } else { + // 회원자료 삭제 + member_delete($mb['mb_id']); + } +} + +if ($msg) + echo ""; + +goto_url("./member_list.php?$qstr"); +?> diff --git a/adm/member_list_update.php b/adm/member_list_update.php new file mode 100644 index 000000000..6c5049a86 --- /dev/null +++ b/adm/member_list_update.php @@ -0,0 +1,76 @@ += $member['mb_level']) { + $msg .= $mb['mb_id'].' : 자신보다 권한이 높거나 같은 회원은 수정할 수 없습니다.\\n'; + } else if ($member['mb_id'] == $mb['mb_id']) { + $msg .= $mb['mb_id'].' : 로그인 중인 관리자는 수정 할 수 없습니다.\\n'; + } else { + if($_POST['mb_certify'][$k]) + $mb_adult = $_POST['mb_adult'][$k]; + else + $mb_adult = 0; + + $sql = " update {$g5['member_table']} + set mb_level = '{$_POST['mb_level'][$k]}', + mb_intercept_date = '{$_POST['mb_intercept_date'][$k]}', + mb_mailling = '{$_POST['mb_mailling'][$k]}', + mb_sms = '{$_POST['mb_sms'][$k]}', + mb_open = '{$_POST['mb_open'][$k]}', + mb_certify = '{$_POST['mb_certify'][$k]}', + mb_adult = '{$mb_adult}' + where mb_id = '{$_POST['mb_id'][$k]}' "; + sql_query($sql); + } + } + +} else if ($_POST['act_button'] == "선택삭제") { + + for ($i=0; $i= $member['mb_level']) { + $msg .= $mb['mb_id'].' : 자신보다 권한이 높거나 같은 회원은 삭제할 수 없습니다.\\n'; + } else { + // 회원자료 삭제 + member_delete($mb['mb_id']); + } + } +} + +if ($msg) + //echo ''; + alert($msg); + +goto_url('./member_list.php?'.$qstr); +?> diff --git a/adm/menu_form.php b/adm/menu_form.php new file mode 100644 index 000000000..10ecabec9 --- /dev/null +++ b/adm/menu_form.php @@ -0,0 +1,151 @@ + + + + + + + \ No newline at end of file diff --git a/adm/menu_form_search.php b/adm/menu_form_search.php new file mode 100644 index 000000000..1d5ff3ee7 --- /dev/null +++ b/adm/menu_form_search.php @@ -0,0 +1,111 @@ + + + + +
    + + + + + + + + + + + + + + + + + + + +
    제목선택
    + "> + + +
    +
    + +
    + +
    + + + +
    + + + + + + + + + + + + + + + +
    + + +
    +
    + +
    + + +
    + \ No newline at end of file diff --git a/adm/menu_list.php b/adm/menu_list.php new file mode 100644 index 000000000..bf6f75752 --- /dev/null +++ b/adm/menu_list.php @@ -0,0 +1,204 @@ +dbconfig.php 파일에 $g5[\'menu_table\'] = G5_TABLE_PREFIX.\'menu\'; 를 추가해 주세요.'); +} + +if(!sql_query(" DESCRIBE {$g5['menu_table']} ", false)) { + sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['menu_table']}` ( + `me_id` int(11) NOT NULL AUTO_INCREMENT, + `me_code` varchar(255) NOT NULL DEFAULT '', + `me_name` varchar(255) NOT NULL DEFAULT '', + `me_link` varchar(255) NOT NULL DEFAULT '', + `me_target` varchar(255) NOT NULL DEFAULT '0', + `me_order` int(11) NOT NULL DEFAULT '0', + `me_use` tinyint(4) NOT NULL DEFAULT '0', + `me_mobile_use` tinyint(4) NOT NULL DEFAULT '0', + PRIMARY KEY (`me_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ", true); +} + +$sql = " select * from {$g5['menu_table']} order by me_id "; +$result = sql_query($sql); + +$g5['title'] = "메뉴설정"; +include_once('./admin.head.php'); + +$colspan = 7; +?> + +
    +

    주의! 메뉴설정 작업 후 반드시 확인을 누르셔야 저장됩니다.

    +
    + +
    + + +
    + +
    + + + +
    + +
    + +
    + + + + diff --git a/adm/menu_list_update.php b/adm/menu_list_update.php new file mode 100644 index 000000000..2d55a7226 --- /dev/null +++ b/adm/menu_list_update.php @@ -0,0 +1,70 @@ + diff --git a/adm/newwinform.php b/adm/newwinform.php new file mode 100644 index 000000000..9a288b51c --- /dev/null +++ b/adm/newwinform.php @@ -0,0 +1,147 @@ + + +
    + + + +
    +

    쇼핑몰 초기화면 접속 시 자동으로 뜰 팝업레이어를 설정합니다.

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + 시간 +
    + + " id="nw_begin_chk" onclick="if (this.checked == true) this.form.nw_begin_time.value=this.form.nw_begin_chk.value; else this.form.nw_begin_time.value = this.form.nw_begin_time.defaultValue;"> + +
    + + " id="nw_end_chk" onclick="if (this.checked == true) this.form.nw_end_time.value=this.form.nw_end_chk.value; else this.form.nw_end_time.value = this.form.nw_end_time.defaultValue;"> + +
    + px +
    + px +
    + px +
    + px +
    + +
    +
    + +
    + + 목록 +
    +
    + + + + diff --git a/adm/newwinformupdate.php b/adm/newwinformupdate.php new file mode 100644 index 000000000..a7286ad2f --- /dev/null +++ b/adm/newwinformupdate.php @@ -0,0 +1,51 @@ + diff --git a/adm/newwinlist.php b/adm/newwinlist.php new file mode 100644 index 000000000..4f51abe70 --- /dev/null +++ b/adm/newwinlist.php @@ -0,0 +1,118 @@ +/data/dbconfig.php 파일에 $g5[\'new_win_table\'] = G5_TABLE_PREFIX.\'new_win\'; 를 추가해 주세요.'); +} +//내용(컨텐츠)정보 테이블이 있는지 검사한다. +if(!sql_query(" DESCRIBE {$g5['new_win_table']} ", false)) { + if(sql_query(" DESCRIBE {$g5['g5_shop_new_win_table']} ", false)) { + sql_query(" ALTER TABLE {$g5['g5_shop_new_win_table']} RENAME TO `{$g5['new_win_table']}` ;", false); + } else { + $query_cp = sql_query(" CREATE TABLE IF NOT EXISTS `{$g5['new_win_table']}` ( + `nw_id` int(11) NOT NULL AUTO_INCREMENT, + `nw_device` varchar(10) NOT NULL DEFAULT 'both', + `nw_begin_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `nw_end_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `nw_disable_hours` int(11) NOT NULL DEFAULT '0', + `nw_left` int(11) NOT NULL DEFAULT '0', + `nw_top` int(11) NOT NULL DEFAULT '0', + `nw_height` int(11) NOT NULL DEFAULT '0', + `nw_width` int(11) NOT NULL DEFAULT '0', + `nw_subject` text NOT NULL, + `nw_content` text NOT NULL, + `nw_content_html` tinyint(4) NOT NULL DEFAULT '0', + PRIMARY KEY (`nw_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ", true); + } +} + +$g5['title'] = '팝업레이어 관리'; +include_once (G5_ADMIN_PATH.'/admin.head.php'); + +$sql_common = " from {$g5['new_win_table']} "; + +// 테이블의 전체 레코드수만 얻음 +$sql = " select count(*) as cnt " . $sql_common; +$row = sql_fetch($sql); +$total_count = $row['cnt']; + +$sql = "select * $sql_common order by nw_id desc "; +$result = sql_query($sql); +?> + +
    전체
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + '; + } + ?> + +
    목록
    번호제목접속기기시작일시종료일시시간LeftTopWidthHeight관리
    시간pxpxpxpx + 수정 + 삭제 +
    자료가 한건도 없습니다.
    +
    + + + diff --git a/adm/phpinfo.php b/adm/phpinfo.php new file mode 100644 index 000000000..a7f01a149 --- /dev/null +++ b/adm/phpinfo.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/adm/point_clear.php b/adm/point_clear.php new file mode 100644 index 000000000..22b5d25d7 --- /dev/null +++ b/adm/point_clear.php @@ -0,0 +1,64 @@ +'; +include_once('./admin.tail.php'); +flush(); + +echo ''."\n"; +flush(); + +$max_count = 50; + +// 테이블 락을 걸고 +$sql = " LOCK TABLES {$g5['member_table']} WRITE, {$g5['point_table']} WRITE "; +sql_query($sql); + +$sql = " select mb_id, count(po_point) as cnt + from {$g5['point_table']} + group by mb_id + having cnt > {$max_count}+1 + order by cnt "; +$result = sql_query($sql); +for ($i=0; $row=sql_fetch_array($result); $i++) +{ + $count = 0; + $total = 0; + $sql2 = " select po_id, po_point + from {$g5['point_table']} + where mb_id = '{$row['mb_id']}' + order by po_id desc + limit {$max_count}, {$row['cnt']} "; + $result2 = sql_query($sql2); + for ($k=0; $row2=sql_fetch_array($result2); $k++) + { + $count++; + $total += $row2['po_point']; + + sql_query(" delete from {$g5['point_table']} where po_id = '{$row2['po_id']}' "); + } + + insert_point($row['mb_id'], $total, '포인트 {$count}건 정리', '@clear', $row['mb_id'], G5_TIME_YMD."-".uniqid("")); + + $str = $row['mb_id']."님 포인트 내역 ".number_format($count)."건 ".number_format($total)."점 정리
    "; + echo ''."\n"; + flush(); +} + +// 테이블 락을 풀고 +$sql = " UNLOCK TABLES "; +sql_query($sql); + +echo ''."\n"; +?> diff --git a/adm/point_list.php b/adm/point_list.php new file mode 100644 index 000000000..8d127e1aa --- /dev/null +++ b/adm/point_list.php @@ -0,0 +1,265 @@ +전체목록'; + +$mb = array(); +if ($sfl == 'mb_id' && $stx) + $mb = get_member($stx); + +$g5['title'] = '포인트관리'; +include_once ('./admin.head.php'); + +$colspan = 9; + +$po_expire_term = ''; +if($config['cf_point_term'] > 0) { + $po_expire_term = $config['cf_point_term']; +} + +if (strstr($sfl, "mb_id")) + $mb_id = $stx; +else + $mb_id = ""; +?> + + + +
    + + 전체 건 + + +
    + +
    + + + + + +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + '; + $link2 = ''; + } + + $expr = ''; + if($row['po_expired'] == 1) + $expr = ' txt_expired'; + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + + + + + + '; + ?> + +
    목록
    + + + 회원아이디이름닉네임포인트 내용포인트일시만료일포인트합
    + + + + +
    + + 만료 + +
    자료가 없습니다.
    +
    + +
    + +
    + +
    + + + +
    +

    개별회원 포인트 증감 설정

    + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + 0) { ?> + + + + + + +
    +
    + +
    + +
    + +
    + +
    + + + + diff --git a/adm/point_list_delete.php b/adm/point_list_delete.php new file mode 100644 index 000000000..9d106ac8e --- /dev/null +++ b/adm/point_list_delete.php @@ -0,0 +1,59 @@ + 0) { + insert_use_point($row['mb_id'], $row['po_use_point'], $row['po_id']); + } + } + + // 포인트 내역삭제 + $sql = " delete from {$g5['point_table']} where po_id = '{$_POST['po_id'][$k]}' "; + sql_query($sql); + + // po_mb_point에 반영 + $sql = " update {$g5['point_table']} + set po_mb_point = po_mb_point - '{$row['po_point']}' + where mb_id = '{$_POST['mb_id'][$k]}' + and po_id > '{$_POST['po_id'][$k]}' "; + sql_query($sql); + + // 포인트 UPDATE + $sum_point = get_point_sum($_POST['mb_id'][$k]); + $sql= " update {$g5['member_table']} set mb_point = '$sum_point' where mb_id = '{$_POST['mb_id'][$k]}' "; + sql_query($sql); +} + +goto_url('./point_list.php?'.$qstr); +?> \ No newline at end of file diff --git a/adm/point_update.php b/adm/point_update.php new file mode 100644 index 000000000..24a318c9a --- /dev/null +++ b/adm/point_update.php @@ -0,0 +1,25 @@ + $mb['mb_point'])) + alert('포인트를 깎는 경우 현재 포인트보다 작으면 안됩니다.', './point_list.php?'.$qstr); + +insert_point($mb_id, $po_point, $po_content, '@passive', $mb_id, $member['mb_id'].'-'.uniqid(''), $expire); + +goto_url('./point_list.php?'.$qstr); +?> diff --git a/adm/poll_delete.php b/adm/poll_delete.php new file mode 100644 index 000000000..0a20f2d5f --- /dev/null +++ b/adm/poll_delete.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/adm/poll_form.php b/adm/poll_form.php new file mode 100644 index 000000000..533596dcd --- /dev/null +++ b/adm/poll_form.php @@ -0,0 +1,115 @@ + + +
    + + + + + + + + + +
    + + + + + + + + + + 필수'; + } + + $po_poll = get_text($po['po_poll'.$i]); + ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + class="frm_input " maxlength="125"> + + +
    + + +
    + + 이상 투표할 수 있음 +
    + + 점 +
    + +
    + +
    + + 목록 +
    + +
    + + diff --git a/adm/poll_form_update.php b/adm/poll_form_update.php new file mode 100644 index 000000000..ef955f793 --- /dev/null +++ b/adm/poll_form_update.php @@ -0,0 +1,70 @@ + diff --git a/adm/poll_list.php b/adm/poll_list.php new file mode 100644 index 000000000..b07e39166 --- /dev/null +++ b/adm/poll_list.php @@ -0,0 +1,163 @@ +전체목록'; + +$g5['title'] = '투표관리'; +include_once('./admin.head.php'); + +$colspan = 7; +?> + +
    + + 투표수 개 +
    + +
    +
    + + + + + +
    +
    + + + +
    + + + + + + + +
    + + + + + + + + + + + + + + + 수정'; + //$s_del = '삭제'; + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + + + + '; + ?> + +
    목록
    + + + 번호제목투표권한투표수기타의견관리
    + + +
    자료가 없습니다.
    +
    + +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/adm/popular_list.php b/adm/popular_list.php new file mode 100644 index 000000000..cc16fae58 --- /dev/null +++ b/adm/popular_list.php @@ -0,0 +1,171 @@ +전체목록'; + +$g5['title'] = '인기검색어관리'; +include_once('./admin.head.php'); + +$colspan = 4; +?> + + + +
    + + 건수 : 개 +
    + +
    +
    + + + + + +
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + '; + ?> + +
    목록
    + + + 검색어등록일등록IP
    + + +
    자료가 없습니다.
    + +
    + + +
    + +
    + + +
    + + + + + + diff --git a/adm/popular_rank.php b/adm/popular_rank.php new file mode 100644 index 000000000..4c47720c2 --- /dev/null +++ b/adm/popular_rank.php @@ -0,0 +1,112 @@ + '' and pp_date between '{$fr_date}' and '{$to_date}' "; +$sql_group = " group by pp_word "; +$sql_order = " order by cnt desc "; + +$sql = " select pp_word {$sql_common} {$sql_search} {$sql_group} "; +$result = sql_query($sql); +$total_count = mysql_num_rows($result); + +$rows = $config['cf_page_rows']; +$total_page = ceil($total_count / $rows); // 전체 페이지 계산 +if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지) +$from_record = ($page - 1) * $rows; // 시작 열을 구함 + +$sql = " select pp_word, count(*) as cnt {$sql_common} {$sql_search} {$sql_group} {$sql_order} limit {$from_record}, {$rows} "; +$result = sql_query($sql); + +$listall = '전체목록'; + +$g5['title'] = '인기검색어순위'; +include_once('./admin.head.php'); +include_once(G5_PLUGIN_PATH.'/jquery-ui/datepicker.php'); + +$colspan = 3; +?> + + + +
    + + 건수 개 +
    + +
    +
    + 기간별검색 + + + ~ + + + +
    +
    + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + '; + ?> + +
    목록
    순위검색어검색회수
    자료가 없습니다.
    +
    + +
    + + + + diff --git a/adm/qa_config.php b/adm/qa_config.php new file mode 100644 index 000000000..c7921d1e1 --- /dev/null +++ b/adm/qa_config.php @@ -0,0 +1,335 @@ + + +
    + + +
    +

    1:1문의 설정

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    1:1문의 설정
    + + 1:1문의 바로가기 +
    + + +
    + +
    + +
    이메일 입력 + > + > +
    휴대폰 입력 + > + > +
    + SMS 알림을 사용하기 위해서는 기본환경설정 > SMS 설정을 하셔야 합니다.') ?> + +
    + + +
    + SMS 알림을 사용하지 않으시면 알림이 전송되지 않습니다.'); ?> + +
    + + +
    + + +
    + + +
    + + +
    + +
    + +
    + + 픽셀 +
    + + 업로드 파일 한개당 bytes 이하 +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    여분필드 + + + + +
    +
    +
    + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/adm/qa_config_update.php b/adm/qa_config_update.php new file mode 100644 index 000000000..783b35677 --- /dev/null +++ b/adm/qa_config_update.php @@ -0,0 +1,51 @@ + \ No newline at end of file diff --git a/adm/sendmail_test.php b/adm/sendmail_test.php new file mode 100644 index 000000000..a0facf1c9 --- /dev/null +++ b/adm/sendmail_test.php @@ -0,0 +1,65 @@ +[메일검사] 내용

    이 내용이 제대로 보인다면 보내는 메일 서버에는 이상이 없는것입니다.

    '.G5_TIME_YMDHIS.'

    이 메일 주소로는 회신되지 않습니다.', 1); + + echo '

    '; + echo '

    결과메세지

    '; + echo '

    '; + echo '다음 '.count($email).'개의 메일 주소로 테스트 메일 발송이 완료되었습니다.'; + echo '

    '; + echo '
      '; + for ($i=0;$i'.$email[$i].''; + } + echo '
    '; + echo '

    '; + echo '해당 주소로 테스트 메일이 도착했는지 확인해 주십시오.
    '; + echo '만약, 테스트 메일이 오지 않는다면 더 다양한 계정의 메일 주소로 메일을 보내 보십시오.
    '; + echo '그래도 메일이 하나도 도착하지 않는다면 메일 서버(sendmail server)의 오류일 가능성이 높으니, 웹 서버관리자에게 문의하여 주십시오.
    '; + echo '

    '; + echo '
    '; +} +?> + +
    +

    테스트 메일 발송

    +
    +

    + 메일서버가 정상적으로 동작 중인지 확인할 수 있습니다.
    + 아래 입력칸에 테스트 메일을 발송하실 메일 주소를 입력하시면, [메일검사] 라는 제목으로 테스트 메일을 발송합니다.
    +

    +
    +
    +
    + 테스트메일 발송 + + + +
    +
    +
    +

    + 만약 [메일검사] 라는 내용으로 테스트 메일이 도착하지 않는다면 보내는 메일서버 혹은 받는 메일서버 중 문제가 발생했을 가능성이 있습니다.
    + 따라서 보다 정확한 테스트를 원하신다면 여러 곳으로 테스트 메일을 발송하시기 바랍니다.
    +

    +
    +
    + + diff --git a/adm/session_file_delete.php b/adm/session_file_delete.php new file mode 100644 index 000000000..bd5bad1e7 --- /dev/null +++ b/adm/session_file_delete.php @@ -0,0 +1,61 @@ + + +
    +

    + 완료 메세지가 나오기 전에 프로그램의 실행을 중지하지 마십시오. +

    +
    + + 세션 디렉토리를 열지못했습니다.

    "; + } else { + $list_tag_st = "
      \n
    • 완료됨
    • \n"; + $list_tag_end = "
    \n"; + } + + $cnt=0; + echo $list_tag_st; + while($file=readdir($dir)) { + + if (!strstr($file,'sess_')) continue; + if (strpos($file,'sess_')!=0) continue; + + $session_file = G5_DATA_PATH.'/session/'.$file; + + if (!$atime=@fileatime($session_file)) { + continue; + } + if (time() > $atime + (3600 * 6)) { // 지난시간을 초로 계산해서 적어주시면 됩니다. default : 6시간전 + $cnt++; + $return = unlink($session_file); + //echo "\n"; + echo "
  • {$session_file}
  • \n"; + + flush(); + + if ($cnt%10==0) + //echo "\n"; + echo "\n"; + } + } + echo $list_tag_end; + echo '

    세션데이터 '.$cnt.'건 삭제 완료됐습니다.
    프로그램의 실행을 끝마치셔도 좋습니다.

    '.PHP_EOL; +?> + + diff --git a/adm/sms_admin/_common.php b/adm/sms_admin/_common.php new file mode 100644 index 000000000..c2c148c40 --- /dev/null +++ b/adm/sms_admin/_common.php @@ -0,0 +1,15 @@ +', 0); +?> \ No newline at end of file diff --git a/adm/sms_admin/ajax.hp_chk.php b/adm/sms_admin/ajax.hp_chk.php new file mode 100644 index 000000000..b1c303565 --- /dev/null +++ b/adm/sms_admin/ajax.hp_chk.php @@ -0,0 +1,51 @@ +encode($data) ); + } +} + +ajax_auth_check($auth[$sub_menu], "r"); + +$err = ''; +$arr_ajax_msg = array(); +$exist_hplist = array(); + +if( !$bk_hp ) + $err = '휴대폰번호를 입력해 주십시오.'; + +$bk_hp = get_hp($bk_hp); + +$sql = " select count(*) as cnt from {$g5['sms5_book_table']} where bk_hp = '$bk_hp' "; +if($w == 'u' && $bk_no) + $sql .= " and bk_no <> '$bk_no' "; +$row = sql_fetch($sql); + +if($row['cnt']) + $err = '같은 번호가 존재합니다.'; + +// 수정일 때 회원정보에서 중복체크 +if(!$row['cnt'] && $w == 'u') { + $sql = " select mb_id from {$g5['member_table']} where mb_hp = '{$bk_hp}' and mb_hp <> '' "; + + if( $mb_id ) + $sql .= " and mb_id <> '{$mb_id}' "; + + $result = sql_query($sql); + + while($row = sql_fetch_array($result)){ + $exist_hplist[] = $row['mb_id']; + } +} + +$arr_ajax_msg['error'] = $err; +$arr_ajax_msg['exist'] = $exist_hplist; + +die( json_encode($arr_ajax_msg) ); + +?> \ No newline at end of file diff --git a/adm/sms_admin/ajax.sms_write_form.php b/adm/sms_admin/ajax.sms_write_form.php new file mode 100644 index 000000000..e82a01cef --- /dev/null +++ b/adm/sms_admin/ajax.sms_write_form.php @@ -0,0 +1,83 @@ +encode($data) ); + } +} + +ajax_auth_check($auth[$sub_menu], "r"); + +$page_size = 6; + +if (!$page) $page = 1; + +if (is_numeric($fg_no)) + $sql_group = " and fg_no='$fg_no' "; +else + $sql_group = ""; + +if ($st == 'all') { + $sql_search = "and (fo_name like '%{$sv}%' or fo_content like '%{$sv}%')"; +} else if ($st == 'name') { + $sql_search = "and fo_name like '%{$sv}%'"; +} else if ($st == 'content') { + $sql_search = "and fo_content like '%{$sv}%'"; +} else { + $sql_search = ''; +} + +$total_res = sql_fetch("select count(*) as cnt from {$g5['sms5_form_table']} where 1 $sql_group $sql_search"); +$total_count = $total_res['cnt']; + +$total_page = (int)($total_count/$page_size) + ($total_count%$page_size==0 ? 0 : 1); +$page_start = $page_size * ( $page - 1 ); + +$vnum = $total_count - (($page-1) * $page_size); + +$group = array(); +$qry = sql_query("select * from {$g5['sms5_form_group_table']} order by fg_name"); +while ($res = sql_fetch_array($qry)) array_push($group, $res); + +$res = sql_fetch("select count(*) as cnt from {$g5['sms5_form_table']} where fg_no=0"); +$no_count = $res['cnt']; + +$count = 1; +$qry = sql_query("select * from {$g5['sms5_form_table']} where 1 $sql_group $sql_search order by fo_no desc limit $page_start, $page_size"); +$list_text = ""; + +if( !$total_count ){ + $list_text .=" +
  • + 데이터가 없습니다. +
  • + "; +} +while($res = sql_fetch_array($qry)) +{ + $tmp = sql_fetch("select fg_name from {$g5['sms5_form_group_table']} where fg_no='{$res['fg_no']}'"); + if (!$tmp) + $group_name = '미분류'; + else + $group_name = $tmp['fg_name']; + $list_text .=" +
  • + + + + ".cut_str($res['fo_name'],20)." +
  • + "; +} + +$arr_ajax_msg['error'] = ""; +$arr_ajax_msg['list_text'] = $list_text; +$arr_ajax_msg['page'] = $page; +$arr_ajax_msg['total_count'] = $total_count; +$arr_ajax_msg['total_page'] = $total_page; +die( json_encode($arr_ajax_msg) ); +?> \ No newline at end of file diff --git a/adm/sms_admin/ajax.sms_write_group.php b/adm/sms_admin/ajax.sms_write_group.php new file mode 100644 index 000000000..702357183 --- /dev/null +++ b/adm/sms_admin/ajax.sms_write_group.php @@ -0,0 +1,43 @@ +1 order by bg_name"); +while ($res = sql_fetch_array($qry)) array_push($group, $res); +?> +
    + + + + + + + + + + + + + + + + + + + + + + +
    그룹명수신가능추가
    +
    \ No newline at end of file diff --git a/adm/sms_admin/ajax.sms_write_level.php b/adm/sms_admin/ajax.sms_write_level.php new file mode 100644 index 000000000..90684c5b2 --- /dev/null +++ b/adm/sms_admin/ajax.sms_write_level.php @@ -0,0 +1,57 @@ +encode($data) ); + } +} + +ajax_auth_check($auth[$sub_menu], "r"); + +$lev = array(); + +for ($i=1; $i<=10; $i++) +{ + $lev[$i] = 0; +} + +$qry = sql_query("select mb_level, count(*) as cnt from {$g5['member_table']} where mb_sms=1 and not (mb_hp='') group by mb_level"); + +while ($row = sql_fetch_array($qry)) +{ + $lev[$row['mb_level']] = $row['cnt']; +} +$str_json = array(); +$tmp_str = ''; +$tmp_str .= ' +
    + + + + + + + + + '; + for ($i=1; $i<=10; $i++) { + $bg = 'bg'.($line++%2); + $tmp_str .= ' + + + + + '; + } +$tmp_str .= ' + +
    권한수신가능추가
    '.$i.' 레벨'.number_format($lev[$i]).'
    +
    '; + +$str_json['html'] = $tmp_str; +echo json_encode($str_json); +?> \ No newline at end of file diff --git a/adm/sms_admin/ajax.sms_write_person.php b/adm/sms_admin/ajax.sms_write_person.php new file mode 100644 index 000000000..686f4a8fa --- /dev/null +++ b/adm/sms_admin/ajax.sms_write_person.php @@ -0,0 +1,166 @@ + 0) + $sql_korean = korean_index('bk_name', $ap-1); +else { + $sql_korean = ''; + $ap = 0; +} + +if ($no_hp == 'yes') { + set_cookie('cookie_no_hp', 'yes', 60*60*24*365); + $no_hp_checked = 'checked'; +} else if ($no_hp == 'no') { + set_cookie('cookie_no_hp', '', 0); + $no_hp_checked = ''; +} else { + if (get_cookie('cookie_no_hp') == 'yes') + $no_hp_checked = 'checked'; + else + $no_hp_checked = ''; +} + +//if ($no_hp_checked == 'checked') + $sql_no_hp = "and bk_hp <> '' and bk_receipt=1"; + +$total_res = sql_fetch("select count(*) as cnt from {$g5['sms5_book_table']} where 1 $sql_group $sql_search $sql_korean $sql_no_hp"); +$total_count = $total_res['cnt']; + +$total_page = (int)($total_count/$page_size) + ($total_count%$page_size==0 ? 0 : 1); +$page_start = $page_size * ( $page - 1 ); + +$vnum = $total_count - (($page-1) * $page_size); + +$res = sql_fetch("select count(*) as cnt from {$g5['sms5_book_table']} where bk_receipt=1 $sql_group $sql_search $sql_korean $sql_no_hp"); +$receipt_count = $res['cnt']; +$reject_count = $total_count - $receipt_count; + +$res = sql_fetch("select count(*) as cnt from {$g5['sms5_book_table']} where mb_id='' $sql_group $sql_search $sql_korean $sql_no_hp"); +$no_member_count = $res['cnt']; +$member_count = $total_count - $no_member_count; + +$no_group = sql_fetch("select * from {$g5['sms5_book_group_table']} where bg_no=1"); + +$group = array(); +$qry = sql_query("select * from {$g5['sms5_book_group_table']} where bg_no>1 order by bg_name"); +while ($res = sql_fetch_array($qry)) array_push($group, $res); +?> +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + 이름휴대폰번호등급추가
    데이터가 없습니다.
    + + +
    +
    + +
    + + +
    + + + +
    + + + + + + + + + + + + + +
    + + \ No newline at end of file diff --git a/adm/sms_admin/config.php b/adm/sms_admin/config.php new file mode 100644 index 000000000..f1fd649d4 --- /dev/null +++ b/adm/sms_admin/config.php @@ -0,0 +1,172 @@ + $res[0], // 결과코드 + 'coin' => $res[1], // 고객 잔액 (충전제만 해당) + 'gpay' => $res[2], // 고객의 건수 별 차감액 표시 (충전제만 해당) + 'payment' => $res[3] // 요금제 표시, A:충전제, C:정액제 + ); +} + +if (!$config['cf_icode_id']) + $config['cf_icode_id'] = 'sir_'; + +if (!$sms5['cf_skin']) + $sms5['cf_skin'] = 'basic'; + +include_once(G5_ADMIN_PATH.'/admin.head.php'); + +?> + +
    +

    + SMS 기능을 사용하시려면 먼저 아이코드에 서비스 신청을 하셔야 합니다.
    + 아이코드 서비스 신청하기 +

    +
    + + + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + +
    + + + 현재 비밀번호가 입력되어 있지 않습니다. +
    요금제 + '; + } else if ($userinfo['payment'] == 'C') { + echo '정액제'; + echo ''; + } else { + echo '가입해주세요.'; + echo ''; + } + ?> +
    충전 잔액 + 원 + +
    건별 금액
    + 예) 010-123-4567"); ?> + +
    + + > +
    + + + 레벨 이상 +
    + + +
    + + +
    + +
    +
    + +
    + +
    +
    + + + +
    +

    SMS 문자전송 서비스를 사용할 수 없습니다.

    +
    +

    + SMS 를 사용하지 않고 있기 때문에, 문자 전송을 할 수 없습니다.
    + SMS 사용 설정은 환경설정 > 기본환경설정 > SMS설정 에서 SMS 사용을 아이코드로 변경해 주셔야 사용하실수 있습니다. +

    +
    +
    + + + + \ No newline at end of file diff --git a/adm/sms_admin/config_update.php b/adm/sms_admin/config_update.php new file mode 100644 index 000000000..e89787730 --- /dev/null +++ b/adm/sms_admin/config_update.php @@ -0,0 +1,49 @@ + $res[0], // 결과코드 + 'coin' => $res[1], // 고객 잔액 (충전제만 해당) + 'gpay' => $res[2], // 고객의 건수 별 차감액 표시 (충전제만 해당) + 'payment' => $res[3] // 요금제 표시, A:충전제, C:정액제 +); + +if ($userinfo['code'] == '202') + alert('아이코드 아이디와 패스워드가 맞지 않습니다.'); + +if ($cf_member == '1') + $cf_member = 1; +else + $cf_member = 0; + +$res = sql_fetch("select * from ".$g5['sms5_config_table']." limit 1"); + +if (!$res) + $sql = "insert into "; +else + $sql = "update "; + +$sql .= $g5['sms5_config_table']." set cf_phone='$cf_phone', cf_member='$cf_member', cf_level='$cf_level', cf_point='$cf_point', cf_day_count='$cf_day_count', cf_skin = '$cf_skin' "; + +sql_query($sql); + +// 아이코드 설정 +$sql = " update {$g5['config_table']} + set cf_sms_use = '$cf_sms_use', + cf_icode_id = '$cf_icode_id', + cf_icode_pw = '$cf_icode_pw', + cf_icode_server_ip = '$cf_icode_server_ip', + cf_icode_server_port = '$cf_icode_server_port' "; +sql_query($sql); + +goto_url("./config.php"); +?> \ No newline at end of file diff --git a/adm/sms_admin/css/sms5.css b/adm/sms_admin/css/sms5.css new file mode 100644 index 000000000..3da1e3652 --- /dev/null +++ b/adm/sms_admin/css/sms5.css @@ -0,0 +1,140 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* 설치 */ +#sms5_install {padding:20px 20px 0} +#sms5_install h2 {margin:0;padding:0 0 20px} +#sms5_install ol {margin:0 0 20px;padding:0 0 0 20px} +#sms5_install li {margin:0 0 10px} + +/* 공통 */ +.sms5_txt_success {color:blue} +.sms5_txt_fail {color:red} + +/* 회원정보업데이트 */ +#sms5_mbup dl {zoom:1} +#sms5_mbup dl:after {display:block;visibility:hidden;clear:both;content:''} +#sms5_mbup dt {clear:both;float:left;margin:0 0 5px;width:100px} +#sms5_mbup dd {float:left;margin:0 0 5px} +#sms5_mbup p {clear:both} + +/* SMS BOX */ +.sms5_box {position:relative;padding:10px;border-radius:5px;background:#fbec99} +.sms5_box .box_ico {position:absolute;top:20px;left:-7px;width:7px;height:13px;background:url('../img/box_ico.gif') no-repeat} +.sms5_box .box_txt {border:0;background:transparent;word-break:break-all;resize:none;overflow:hidden} +.sms5_box .box_square {width:100px;height:90px} + +#write_wrap {z-index:9} +#wr_message_lbl {position:absolute;top:50px;left:50px;color:#999;font-size:0.95em;letter-spacing:-0.1em} +.write_scemo_btn {position:absolute;right:10px !important;right:50px;margin:0;padding:0;width:28px;height:28px;border:0;background:transparent;color:#999;font-size:0.95em} +#write_sc_btn {top:15px} +#write_emo_btn {top:50px} +.write_scemo {display:none;z-index:10;position:absolute;left:150px;border:1px solid #e9e9e9;background:#f7f7f7} +.scemo_ico {position:absolute;top:10px;left:-7px;width:7px;height:13px;background:url('../img/scemo_ico.gif') no-repeat} +.write_scemo .scemo_list {z-index:11;margin:0;padding:0;width:190px;height:150px;background:#fff;overflow-y:scroll} +.write_scemo .scemo_add {margin:0;padding:0;height:25px;border:0;background:transparent} +#write_sc {top:10px} +#write_sc .scemo_add {width:25px} +#write_emo {top:45px} +#write_emo .scemo_add {width:50px} +#write_emo .emo_long {width:80px} +.write_scemo .scemo_cls {text-align:right} +.write_scemo .scemo_cls button {margin:5px;padding:0;border:0;background:transparent;color:#666;font-size:0.95em} + +/* 문자보내기 */ +#sms5_send {position:relative;margin:-10px 0 0 20px;padding:0 0 0 490px;height:600px} +#sms5_send h2 {font-size:1em} +#sms5_send ul {margin:0;padding:0;list-style:none;zoom:1} +#sms5_send ul:after {display:block;visibility:hidden;clear:both;content:''} +#sms5_send #send_emo {position:absolute;top:0;left:0;padding:20px 0 0;width:280px} +#sms5_send #send_emo h2 {padding:0 0 10px} +#sms5_send #send_write {position:absolute;top:0;left:290px;padding:20px 20px 0 !important;padding:20px 0 0 20px;width:160px;height:600px;border-left:1px solid #efefef} +#sms5_send #send_write h2 {padding:0 0 10px} +#sms5_send #send_book {position:relative;margin:0 0 0 -1px;padding:20px 0 0;width:100%;height:600px;border-left:1px solid #efefef} +#sms5_send #send_book h2 {padding-bottom:10px} + +#sms5_send .tmp_loading {display:block;padding:180px 0 0;text-align:center} +#sms5_send #send_emo #emo_sel {position:absolute;top:20px;right:10px;margin:0} +#sms5_send #send_emo li {float:left;margin:0 10px 10px 0 !important;margin:0 5px 10px 0;width:110px} +#sms5_send #send_emo .sms5_box {background:#f7f7f7} +#sms5_send #send_emo .box_ico {display:none} +#sms5_send #send_emo .box_txt {cursor:pointer} +#sms5_send #send_emo .emo_tit {display:block;height:20px;line-height:2em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +#sms5_send #send_emo .btn_submit {padding:0 5px;height:24px;border:1px solid #ccc;background:#fafafa;color:#000;font-size:0.95em;vertical-align:middle;cursor:pointer} + +#sms5_send #send_write {z-index:3} +#sms5_send .write_inner {position:relative;left:-20px;padding:15px 20px;width:160px;border-top:1px solid #efefef} +#sms5_send .write_inner h2 {margin:0;padding:0 0 10px !important} +#sms5_send .write_floater {position:absolute;top:15px;right:20px;text-align:right} +#sms5_send .write_floater_btn {margin:0;padding:0;border:0;background:transparent;color:#999;font-size:0.95em;letter-spacing:-0.1em} +#sms5_send .write_inner label, #sms5_send .write_inner input {margin:0 0 3px} +#sms5_send .write_inner label {display:inline-block} +#sms5_send #send_write .sms5_box {margin:0 0 5px} +#sms5_send #sms_byte {position:absolute;top:-37px;right:0;color:#999} +#sms5_send #write_preset {margin:10px 0;color:#999;font-size:0.95em;letter-spacing:-0.1em} +#sms5_send #write_reply {margin:0 0 15px} +#sms5_send #hp_list {width:100%;margin:0 0 5px} +#sms5_send #recv_add {position:relative} +#sms5_send #recv_add button {position:absolute;top:0;right:0 !important;right:20px;margin:0;padding:0;width:45px;height:51px;border:1px solid #ccc;background:#fafafa} +#sms5_send #write_rsv {line-height:1.8em} + +#sms5_send #send_book {z-index:2} +#sms5_send #num_book {margin:0 0 10px;width:auto !important;width:95%;height:500px;overflow-y:auto !important;overflow-y:scroll} +#sms5_send #book_tab {margin:0 35px 10px;text-align:right} +#sms5_send #book_tab a {display:inline-block;width:30px;text-align:center} +#sms5_send #sms_person_form {margin:0 20px} +#sms5_send #send_book .btn_submit {padding:0 5px;height:24px} +#sms5_send #book_desc {margin:0 20px;color:#999;font-size:0.95em;letter-spacing:-0.1em} +#sms5_send .td_mngsmall button.btn_frmline,#sms5_send .td_mng button.btn_frmline {padding: 0 7px;background: #444;} + +/* 문자전송상세내역 */ +#sms5_sent {} +#sms5_sent #sent_overlap {margin:0 20px 20px;padding:0;border-top:1px solid #e9e9e9;list-style:none} +#sms5_sent #sent_overlap li {padding:10px 0;border-bottom:1px solid #e9e9e9} +#sms5_sent #con_sms {margin:0 20px 20px} + +/* 이모티콘 관리 */ +.sms_preset_sch form {display:inline-block} +#sms5_preset_sel {float:left;padding:8px 20px 0} +.btn_add {float:right} +#sms5_preset {clear:both;margin:0 0 10px;padding:30px 20px 20px 40px;background:#363a3d;list-style:none;zoom:1} +#sms5_preset:after {display:block;visibility:hidden;clear:both;content:''} +#sms5_preset li {float:left;margin:0 20px 20px 0;width:270px;height:125px;background:#fbec99;zoom:1} +#sms5_preset li:after {display:block;visibility:hidden;clear:both;content:''} +#sms5_preset .li_chk {position:absolute;bottom:10px;left:10px;} +#sms5_preset .li_preview {float:left;width:110px} +#sms5_preset .box_square {padding-right:7px;border-right:1px solid #e2d693} +#sms5_preset .li_info {float:left;margin:0 0 0 10px;width:150px;line-height:1.5em} +#sms5_preset .li_date {position:absolute;bottom:10px;left:30px;color:#86857d} +#sms5_preset .li_cmd {position:absolute;bottom:10px;right:10px} +#sms5_preset .li_cmd a {color:#86857d;font-size:0.95em;letter-spacing:-0.1em} + +#sms5_emo_add {position:relative} +#sms5_emo_add .sms5_box {padding:10px !important;padding:10px 5px;width:160px} +#sms5_emo_add .box_txt {margin:0 0 5px} +#sms5_emo_add .write_scemo_btn {right:10px} +#sms5_emo_add .write_scemo {left:170px} + +/* 휴대폰번호 관리 */ +#hp_check_el {width:148px} +#hp_check_el ul {margin:5px 0 0;padding:0;border:1px solid #f7c3cf;background:#f8e8eb;list-style:none} +#hp_check_el li {position:relative;padding:5px;border-bottom:1px solid #f6dae1} +#hp_check_el strong {position:absolute;top:6px;right:5px;color:#ff3061;font-size:0.95em;font-weight:normal;letter-spacing:-0.1em} + +/* 휴대폰번호 파일 */ +#sms5_fileup_frm {margin:0 0 10px;padding:0 20px 5px;border-bottom:1px solid #e9e9e9} +#sms5_fileup_frm div {padding:0 0 5px;margin:0 0 5px;border-bottom:1px solid #f4f4f4} +#sms5_fileup_frm div.sch_last {margin:0;border:0} +#sms5_fileup_frm strong {display:inline-block;width:80px} +#sms5_fileup_frm strong.sch_long {width:160px} +#sms5_fileup_frm label {display:inline-block;margin:0 5px 0 0} +#sms5_fileup_frm .btn_submit {padding:0 5px;height:24px} + +#sms5_fileup_frm #sms5_fileup {border:0} +#sms5_fileup_frm #upload_info {margin:20px 0} +#sms5_fileup_frm #upload_result {margin:0;padding:10px 0;border-top:3px solid #383838;border-bottom:3px solid #383838;list-style:none} +#sms5_fileup_frm #upload_result li {margin:0 0 5px} +#sms5_fileup_frm #upload_result .local_desc01 {margin:5px 0;padding:10px} +#sms5_fileup_frm #btn_fileup {margin:5px 0 0} + +#sms5_fileup_frm .sms_fileup_hide {display:none;border:0} diff --git a/adm/sms_admin/emoticon_move.php b/adm/sms_admin/emoticon_move.php new file mode 100644 index 000000000..592e273ce --- /dev/null +++ b/adm/sms_admin/emoticon_move.php @@ -0,0 +1,114 @@ + + +
    +

    + +
    + + + + +
    + + + + + + + + + + + + + + + + +
    이동할 그룹을 한개 이상 선택하여 주십시오.
    선택그룹
    + + + +
    +
    + +
    + + +
    +
    + +
    + + + + diff --git a/adm/sms_admin/emoticon_move_update.php b/adm/sms_admin/emoticon_move_update.php new file mode 100644 index 000000000..aa1227f6a --- /dev/null +++ b/adm/sms_admin/emoticon_move_update.php @@ -0,0 +1,60 @@ + + + +HEREDOC; +?> \ No newline at end of file diff --git a/adm/sms_admin/form_group.php b/adm/sms_admin/form_group.php new file mode 100644 index 000000000..421508568 --- /dev/null +++ b/adm/sms_admin/form_group.php @@ -0,0 +1,177 @@ + + + + +
    + +
    + + + +
    +
    + 건수 : +
    +
    + +
    +

    그룹명순으로 정렬됩니다.

    +
    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    목록
    + + + 그룹명이모티콘수이동보기
    미분류 + + + + 보기 + +
    + + + + + + + > + + + + + + + + 보기 +
    + +
    + +
    + + + +
    + +
    + + \ No newline at end of file diff --git a/adm/sms_admin/form_group_move.php b/adm/sms_admin/form_group_move.php new file mode 100644 index 000000000..27faa14d1 --- /dev/null +++ b/adm/sms_admin/form_group_move.php @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/adm/sms_admin/form_group_update.php b/adm/sms_admin/form_group_update.php new file mode 100644 index 000000000..058980a11 --- /dev/null +++ b/adm/sms_admin/form_group_update.php @@ -0,0 +1,92 @@ +'$fg_no' and fg_name='$fg_name'"); + if ($res) + alert('같은 그룹명이 존재합니다.'); + + sql_query("update {$g5['sms5_form_group_table']} set fg_name='$fg_name', fg_member='$fg_member' where fg_no='$fg_no'"); + sql_query("update {$g5['sms5_form_table']} set fg_member = '$fg_member' where fg_no = '$fg_no'"); + } +} +else if ($w == 'de') // 그룹삭제 +{ + for ($i=0; $i \ No newline at end of file diff --git a/adm/sms_admin/form_list.php b/adm/sms_admin/form_list.php new file mode 100644 index 000000000..008405441 --- /dev/null +++ b/adm/sms_admin/form_list.php @@ -0,0 +1,238 @@ + + + + +
    + 건수 : +
    + +
    +
    + + +
    + +
    + + + + + + +
    +
    + +
    + + +
    + + + +
    + + + + +
      + +
    • + +
      + + +
      +
      + +
      +
      + 그룹
      + 제목
      +
      +
      + 등록 +
      + +
    • + +
    + +
    + + +
    + +
    + + + + + \ No newline at end of file diff --git a/adm/sms_admin/form_multi_update.php b/adm/sms_admin/form_multi_update.php new file mode 100644 index 000000000..5c1bd5930 --- /dev/null +++ b/adm/sms_admin/form_multi_update.php @@ -0,0 +1,27 @@ +'$fo_no' and fo_content='$fo_content'"); + if ($res) + alert('같은 이모티콘이 존재합니다.'); +*/ + $res = sql_fetch("select * from {$g5['sms5_form_table']} where fo_no='$fo_no'"); + if (!$res) + alert('존재하지 않는 데이터 입니다.'); + + if ($fg_no != $res['fg_no']) { + if ($res['fg_no']) + sql_query("update {$g5['sms5_form_group_table']} set fg_count = fg_count - 1 where fg_no='{$res['fg_no']}'"); + + sql_query("update {$g5['sms5_form_group_table']} set fg_count = fg_count + 1 where fg_no='$fg_no'"); + } + + $group = sql_fetch("select * from {$g5['sms5_form_group_table']} where fg_no = '$fg_no'"); + + sql_query("update {$g5['sms5_form_table']} set fg_no='$fg_no', fg_member='{$group['fg_member']}', fo_name='$fo_name', fo_content='$fo_content', fo_datetime='".G5_TIME_YMDHIS."' where fo_no='$fo_no'"); +} +else if ($w == 'd') // 삭제 +{ + if (!is_numeric($fo_no)) + alert('고유번호가 없습니다.'); + + $res = sql_fetch("select * from {$g5['sms5_form_table']} where fo_no='$fo_no'"); + if (!$res) + alert('존재하지 않는 데이터 입니다.'); + + sql_query("delete from {$g5['sms5_form_table']} where fo_no='$fo_no'"); + sql_query("update {$g5['sms5_form_group_table']} set fg_count = fg_count - 1 where fg_no = '{$res['fg_no']}'"); + + $get_fg_no = $fg_no; +} +else // 등록 +{ + if (!$fg_no) $fg_no = 0; + + if (!strlen(trim($fo_name))) + alert('이름을 입력해주세요'); + + if (!strlen(trim($fo_content))) + alert('이모티콘을 입력해주세요'); + + $res = sql_fetch("select * from {$g5['sms5_form_table']} where fo_content='$fo_content'"); + if ($res) + alert('같은 이모티콘이 존재합니다.'); + + $group = sql_fetch("select * from {$g5['sms5_form_group_table']} where fg_no = '$fg_no'"); + + sql_query("insert into {$g5['sms5_form_table']} set fg_no='$fg_no', fg_member='{$group['fg_member']}', fo_name='$fo_name', fo_content='$fo_content', fo_datetime='".G5_TIME_YMDHIS."'"); + sql_query("update {$g5['sms5_form_group_table']} set fg_count = fg_count + 1 where fg_no = '$fg_no'"); + + $get_fg_no = $fg_no; +} + +$go_url = './form_list.php?page='.$page.'&fg_no='.$get_fg_no; +goto_url($go_url); +?> \ No newline at end of file diff --git a/adm/sms_admin/form_write.php b/adm/sms_admin/form_write.php new file mode 100644 index 000000000..603bd2c03 --- /dev/null +++ b/adm/sms_admin/form_write.php @@ -0,0 +1,233 @@ + + +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    목록
    + +
    메세지 +
    + + + + +
    0 / 80 byte
    + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    업데이트
    +
    +
    + + 목록 +
    +
    + + + + + + \ No newline at end of file diff --git a/adm/sms_admin/history_list.php b/adm/sms_admin/history_list.php new file mode 100644 index 000000000..193937878 --- /dev/null +++ b/adm/sms_admin/history_list.php @@ -0,0 +1,98 @@ + + +
    class="local_sch01 local_sch" method="get"> + + + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    목록
    번호메세지회신번호전송일시예약총건수성공실패중복재전송관리
    + 데이터가 없습니다. +
    예약":'';?> + 수정 + +
    +
    + + + + \ No newline at end of file diff --git a/adm/sms_admin/history_member.php b/adm/sms_admin/history_member.php new file mode 100644 index 000000000..21fe0c84e --- /dev/null +++ b/adm/sms_admin/history_member.php @@ -0,0 +1,90 @@ + + +
    + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    목록
    번호회원보내는번호받는번호전송일시예약Log
    + 데이터가 없습니다. +
    예약":'';?>
    +
    + + + + \ No newline at end of file diff --git a/adm/sms_admin/history_num.php b/adm/sms_admin/history_num.php new file mode 100644 index 000000000..04f6c7ed2 --- /dev/null +++ b/adm/sms_admin/history_num.php @@ -0,0 +1,107 @@ + + +
    + + + + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + '.$res['mb_id'].''; + else + $mb_id = '비회원'; + ?> + + + + + + + + + + + + + + +
    목록
    번호그룹이름회원ID전화번호전송일시예약전송메세지관리
    + 데이터가 없습니다. +
    예약":'';?> + 수정 +
    +
    + + + + \ No newline at end of file diff --git a/adm/sms_admin/history_send.php b/adm/sms_admin/history_send.php new file mode 100644 index 000000000..488e25db5 --- /dev/null +++ b/adm/sms_admin/history_send.php @@ -0,0 +1,138 @@ + + + SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + +$reply = str_replace('-', '', trim($write['wr_reply'])); + +$result = $SMS->Add($list, $reply, '', '', $write['wr_message'], '', $wr_total); + +if ($result) +{ + $result = $SMS->Send(); + + if ($result) //SMS 서버에 접속했습니다. + { + sql_query("insert into {$g5['sms5_write_table']} set wr_no='$wr_no', wr_renum='$new_wr_renum', wr_reply='{$write['wr_reply']}', wr_message='{$write['wr_message']}', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'"); + + $wr_success = 0; + $wr_failure = 0; + $count = 0; + + foreach ($SMS->Result as $result) + { + list($phone, $code) = explode(":", $result); + + if (substr($code,0,5) == "Error") + { + $hs_code = substr($code,6,2); + + switch ($hs_code) { + case '02': // "02:형식오류" + $hs_memo = "형식이 잘못되어 전송이 실패하였습니다."; + break; + case '23': // "23:인증실패,데이터오류,전송날짜오류" + $hs_memo = "데이터를 다시 확인해 주시기바랍니다."; + break; + case '97': // "97:잔여코인부족" + $hs_memo = "잔여코인이 부족합니다."; + break; + case '98': // "98:사용기간만료" + $hs_memo = "사용기간이 만료되었습니다."; + break; + case '99': // "99:인증실패" + $hs_memo = "인증 받지 못하였습니다. 계정을 다시 확인해 주세요."; + break; + default: // "미 확인 오류" + $hs_memo = "알 수 없는 오류로 전송이 실패하었습니다."; + break; + } + $wr_failure++; + $hs_flag = 0; + } + else + { + $hs_code = $code; + $hs_memo = get_hp($phone, 1)."로 전송했습니다."; + $wr_success++; + $hs_flag = 1; + } + + $row = array_shift($list); + $row['bk_hp'] = get_hp($row['bk_hp'], 1); + + $log = array_shift($SMS->Log); + sql_query("insert into {$g5['sms5_history_table']} set wr_no='$wr_no', wr_renum='$new_wr_renum', bg_no='{$row['bg_no']}', mb_id='{$row['mb_id']}', bk_no='{$row['bk_no']}', hs_name='{$row['hs_name']}', hs_hp='{$row['hs_hp']}', hs_datetime='".G5_TIME_YMDHIS."', hs_flag='$hs_flag', hs_code='$hs_code', hs_memo='".addslashes($hs_memo)."', hs_log='".addslashes($log)."'"); + } + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + + sql_query("update {$g5['sms5_write_table']} set wr_success='$wr_success', wr_failure='$wr_failure' where wr_no='$wr_no' and wr_renum='$new_wr_renum'"); + sql_query("update {$g5['sms5_write_table']} set wr_re_total=wr_re_total+1 where wr_no='$wr_no' and wr_renum=0"); + } + else alert("에러: SMS 서버와 통신이 불안정합니다."); +} +else alert("에러: SMS 데이터 입력도중 에러가 발생하였습니다."); + +?> + + \ No newline at end of file diff --git a/adm/sms_admin/history_view.php b/adm/sms_admin/history_view.php new file mode 100644 index 000000000..d65672290 --- /dev/null +++ b/adm/sms_admin/history_view.php @@ -0,0 +1,246 @@ +(재전송)"; +} else + $sql_renum = " and wr_renum='0'"; + +$total_res = sql_fetch("select count(*) as cnt from {$g5['sms5_history_table']} where wr_no='$wr_no' $sql_search $sql_renum"); +$total_count = $total_res['cnt']; + +$total_spage = (int)($total_count/$spage_size) + ($total_count%$spage_size==0 ? 0 : 1); +$spage_start = $spage_size * ( $spage - 1 ); + +$vnum = $total_count - (($spage-1) * $spage_size); + +$write = sql_fetch("select * from {$g5['sms5_write_table']} where wr_no='$wr_no' $sql_renum"); +if ($write['wr_booking'] == '0000-00-00 00:00:00') + $write['wr_booking'] = '즉시전송'; + +include_once(G5_ADMIN_PATH.'/admin.head.php'); +?> + + + +
    + + + + + + + + + + +
    + +
    +
    + 전송건수 + 성공건수 + 실패건수 + 전송일시 + 예약일시 + 회신번호 +
    + +

    전송내용

    + +
    + + +
    + + +

    전송실패 문자 재전송 내역

    + + + + + + + + + + + + + + + + 0"); + $re_vnum = $res['cnt']; + + $qry = sql_query("select * from {$g5['sms5_write_table']} where wr_no='$wr_no' and wr_renum>0 order by wr_renum desc"); + while($res = sql_fetch_array($qry)) { + ?> + + + + + + + + + + + + + +
    번호전송일시총건수성공실패관리
    + 수정 + +
    + + + +

    중복번호

    +
      + $v){ + if( empty($v) ) continue; + ?> +
    • 중복
    • + +
    + + +

    문자전송 목록

    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    번호그룹이름회원ID휴대폰번호전송일시결과비고내역
    + 데이터가 없습니다. +
    + 결과코드 :
    + 로그 :
    + 메모 : +
    + + 내역 + + 내역 + +
    +
    +
    + + + + \ No newline at end of file diff --git a/adm/sms_admin/img/ajax-loader.gif b/adm/sms_admin/img/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..96fefbc5130a6514a03709b2b8f40a88cf82fae2 GIT binary patch literal 1924 zcmciDX;70#00!U)Urwn9NDf8|Nk{?(l!}Qm1QSd^sNw-w96TTt3HoXQ;KEY5&xQ_@`6p)R|7Ze|KlUecpGz-Ms;R zyF6JG&`!`>5GcFv1qcN4J{Gsm76V0CaaFx8^nHnS`e;crfkNLKn`)Z<^T57ad%!m& znBjBCcl%a%%QdDs?C*Arv(c=i=qQKtu}LuwEDq~JJeL)!)orci6g~AYxE|RX;ebAo47rl|h=>fFdqNlMi+s5|5((!#k{zHt zS4${~6YmJ+LP`!vWo6}8<<}Gyn@jVh*X?p$m3wP|x=n>Zs#J3mrIod#8ydYktK+_5 zs4DyV^@f4FgYsU%9mnpoN%&iYhYk}DGH~~D#_=O(M~5nA4bz6n{>8q9mvhgTy*I7~ z9Q!LUrU41@LFa}cvtO@kanB`aV)-0EL8CXuXuN&&E3N+SN8Uvl=TJUl1vbeJ7$&sU<&M?!@% z6R@)CdP1=*nr)Y}wS-;|s5hl$1h!z>TD`TXrsnNkbt+L!x6%w88YcBQk4Bv_j^lKM ziHjYiN&7p*r?`8@o{@^VyR!q+`X%M!z{30+(#H}tjqX+!#}Ldwy>{1Q{pHux+4aoU zxjcK6Rk;hAlV=gYbF}?hcWFmR;}PG3pZ0=`SM|EHf&P0YnNQ`;MtpyG`1qQx-R@pc z79>3*H!q)GP-qQ36T*Nc077IU&smTFM_u%$$+^gyc-MLWRY_CEs9G+R z%M~JVq*P>6QrgwC(&3OznUnDhwTgKk-$h$<)#@`tjaDK^j|h^kuM*rXwuV`xN(5cn)S zOa`=v_z|=+IQFvR9r9ht&@lF@qh2&{zlv~M*2BA1-09zC+tNBs8&?l5j;de%FxmX0 z%c{bW|3XOJEtn5~9QIizhV7q=&ZiY1vl%7mbeb?lELr&x_k$s12sj~#1ZG!ZOYsU* z0Q3_?HATa^*#d-e2o2PxP$kAJMwwz@AX*Ru4Ui!kOa~ZveL8r`cjW1rl*cVoyob6+ zyb<-Nq__VSZdKn07fnpVzi;p#d?545r3fk+A%-a_l^#L3YqbE}gX5r~g!^FI$hs5Q zrrMhcTKgJJeS#WyU8zEu6Y-ZT25iCX2jY85h@@>+BblK-6Pp5%LT4aLEFAo05Ys$S(J2IA~KZ^z>7G@QVNZYl8|LSC;?yS86TEkTBr=dT*}JH%@d?)w5@IJ z@5^lkv%3%P!*yms4qS1N5X-Q`;R>vtI^Z#AZvw^D>4W{#%ZkO(NL@+Y5LW7x}u!bhj)Gf3x+_0a&Nb`z37R$Ctf6$)nzUh%Dz%Yf8 zFFe1E4-WY<^eAh8Zb4yDaY?AT0|62oPqq{@4yM`&Lm<~qp<@|k-qn${=TKEtC5^We z4Xv|;9#+^vt00|{-uF+%mM*7ZTx$hWML$itg`Xf!V#i3+cq4Ikuwbt5ss2g-;>&S^ O2}sxo@>+QV&EpTcIvUad literal 0 HcmV?d00001 diff --git a/adm/sms_admin/img/ajax-loader2.gif b/adm/sms_admin/img/ajax-loader2.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd1a189c21fed1c7ba00c4bb4fad407bd6d1e5f9 GIT binary patch literal 7825 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 LHfkt@K(PD|Q{O_Y literal 0 HcmV?d00001 diff --git a/adm/sms_admin/img/box_ico.gif b/adm/sms_admin/img/box_ico.gif new file mode 100644 index 0000000000000000000000000000000000000000..9d57d3668813c2a07fd22931284e2baf5136b3c3 GIT binary patch literal 60 zcmZ?wbhEHbWM|-IXkcXc{buI>|Nj+#vM@3*Ff!;c00Bsbfl0WBKYhZ9e@wHBZbiSn NWL*~87{th64FDS>5}*J8 literal 0 HcmV?d00001 diff --git a/adm/sms_admin/img/scemo_ico.gif b/adm/sms_admin/img/scemo_ico.gif new file mode 100644 index 0000000000000000000000000000000000000000..625048e490f176a8b00d8f11260f3cf2f89a6614 GIT binary patch literal 67 zcmZ?wbhEHbWM|-In8?InVPT=6q4EF!e+C8y#h)yU3=B*RIzTo9NS=X7WQu$`OV literal 0 HcmV?d00001 diff --git a/adm/sms_admin/install.php b/adm/sms_admin/install.php new file mode 100644 index 000000000..1d63070be --- /dev/null +++ b/adm/sms_admin/install.php @@ -0,0 +1,86 @@ + +
    + +
    + + var answer = confirm("이미 SMS5가 설치되어 있습니다.새로 설치 할 경우 DB 자료가 망실됩니다. 새로 설치하시겠습니까?"); + if (answer){ + document.hidden_form.setup.value = "1"; + document.hidden_form.submit(); + } else { + history.back(); + } + + '; + exit; + } +} +?> + +
    +
      +
    1. SMS5 설치가 시작되었습니다.
    2. +
    3. 전체 테이블 생성중
    4. +
    5. DB설정 중
    6. +
    7. +
    + +

    + +
    +document.getElementById('sms5_job_01').innerHTML='전체 테이블 생성 완료';"; +flush(); usleep(50000); + +$read_point = -1; +$write_point = 5; +$comment_point = 1; +$download_point = -20; + +//------------------------------------------------------------------------------------------------- +// config 테이블 설정 +$sql = " insert into {$g5['sms5_book_group_table']} set bg_name='미분류'"; +mysql_query($sql) or die(mysql_error() . "

    " . $sql); + +echo ""; +flush(); usleep(50000); +//------------------------------------------------------------------------------------------------- + +echo ""; +flush(); usleep(50000); +?> + + + + + \ No newline at end of file diff --git a/adm/sms_admin/member_update.php b/adm/sms_admin/member_update.php new file mode 100644 index 000000000..b0b20bd3f --- /dev/null +++ b/adm/sms_admin/member_update.php @@ -0,0 +1,63 @@ + + +

    +
    +
    +

    + 새로운 회원정보로 업데이트 합니다.
    + 실행 후 '완료' 메세지가 나오기 전에 프로그램의 실행을 중지하지 마십시오. +

    +
    +
    +

    + 마지막 업데이트 일시 :
    +

    +
    + +
    +
    + +
    + +
    +
    +
    + + + + \ No newline at end of file diff --git a/adm/sms_admin/member_update_run.php b/adm/sms_admin/member_update_run.php new file mode 100644 index 000000000..323cbc9e0 --- /dev/null +++ b/adm/sms_admin/member_update_run.php @@ -0,0 +1,122 @@ +encode($data) ); + } +} + +if( $mtype == "json" ){ + ajax_auth_check($auth[$sub_menu], "w"); +} else { + auth_check($auth[$sub_menu], "w"); +} + +$count = 0; +$hp_yes = 0; +$hp_no = 0; +$hp_empty = 0; +$leave = 0; +$receipt = 0; + +// 회원 데이터 마이그레이션 +$qry = sql_query("select mb_id, mb_name, mb_hp, mb_sms, mb_leave_date from ".$g5['member_table']." order by mb_datetime"); +while ($res = sql_fetch_array($qry)) +{ + if ($res['mb_leave_date'] != '') + $leave++; + else if ($res['mb_hp'] == '') + $hp_empty++; + else if (is_hp($res['mb_hp'])) + $hp_yes++ ; + else + $hp_no++; + + $hp = get_hp($res['mb_hp']); + + if ($hp == '') $bk_receipt = 0; else $bk_receipt = $res['mb_sms']; + + $field = "mb_id='{$res['mb_id']}', bk_name='{$res['mb_name']}', bk_hp='{$hp}', bk_receipt='{$bk_receipt}', bk_datetime='".G5_TIME_YMDHIS."'"; + + $res2 = sql_fetch("select * from {$g5['sms5_book_table']} where mb_id='{$res['mb_id']}'"); + if ($res2) // 기존에 등록되어 있을 경우 업데이트 + { + $res3 = sql_fetch("select count(*) as cnt from {$g5['sms5_book_table']} where mb_id='{$res2['mb_id']}'"); + $mb_count = $res3['cnt']; + + // 회원이 삭제되었다면 휴대폰번호 DB 에서도 삭제한다. + if ($res['mb_leave_date']) + { + sql_query("delete from {$g5['sms5_book_table']} where mb_id='{$res2['mb_id']}'"); + + $sql = "update {$g5['sms5_book_group_table']} set bg_count = bg_count - $mb_count, bg_member = bg_member - $mb_count"; + if ($res2['bk_receipt'] == 1) + $sql .= ", bg_receipt = bg_receipt - $mb_count"; + else + $sql .= ", bg_reject = bg_reject - $mb_count"; + $sql .= " where bg_no='{$res2['bg_no']}'"; + + sql_query($sql); + } + else + { + if ($bk_receipt != $res2['bk_receipt']) { + if ($bk_receipt == 1) + $sql_sms = "bg_receipt = bg_receipt + $mb_count, bg_reject = bg_reject - $mb_count"; + else + $sql_sms = "bg_receipt = bg_receipt - $mb_count, bg_reject = bg_reject + $mb_count"; + + sql_query("update {$g5['sms5_book_group_table']} set $sql_sms where bg_no='{$res2['bg_no']}'"); + } + + if ($bk_receipt) $receipt++; + + sql_query("update {$g5['sms5_book_table']} set $field where mb_id='{$res['mb_id']}'"); + } + } + else if ($res['mb_leave_date'] == '') // 기존에 등록되어 있지 않을 경우 추가 (삭제된 회원이 아닐 경우) + { + if ($bk_receipt == 1) { + $sql_sms = "bg_receipt = bg_receipt + 1"; + $receipt++; + } else { + $sql_sms = "bg_reject = bg_reject + 1"; + } + + sql_query("insert into {$g5['sms5_book_table']} set $field, bg_no=1"); + sql_query("update {$g5['sms5_book_group_table']} set bg_count = bg_count + 1, bg_member = bg_member + 1, $sql_sms where bg_no=1"); + } + + $count++; +} + +sql_query("update {$g5['sms5_config_table']} set cf_datetime='".G5_TIME_YMDHIS."'"); + +$msg = ''; + +$msg .= '

    회원정보를 휴대폰번호 DB로 업데이트 하였습니다.

    '; +$msg .= '
    '; +$msg .= '
    총 회원 수
    '.number_format($count).'명
    '; +$msg .= '
    삭제된 회원
    '.number_format($leave).'명
    '; +$msg .= '
    휴대폰번호 없음
    '.number_format($hp_empty).' 명
    '; +$msg .= '
    휴대폰번호 정상
    '.number_format($hp_yes).' 명 '; +$msg .= '(수신'.number_format($receipt).' 명'; +$msg .= ' / '; +$msg .= '거부'.number_format($hp_yes-$receipt).' 명)
    '; +$msg .= '
    휴대폰번호 오류
    '.number_format($hp_no).' 명
    '; +$msg .= '
    '; +$msg .= '

    프로그램의 실행을 끝마치셔도 좋습니다.

    '; + +if( $mtype == "json" ){ + $json_msg = array(); + $json_msg['datetime'] = G5_TIME_YMDHIS; + $json_msg['res_msg'] = $msg; + die( json_encode($json_msg) ); +} else { + die( $msg ); +} +?> \ No newline at end of file diff --git a/adm/sms_admin/num_book.php b/adm/sms_admin/num_book.php new file mode 100644 index 000000000..0a7422410 --- /dev/null +++ b/adm/sms_admin/num_book.php @@ -0,0 +1,263 @@ + 0) + $sql_korean = korean_index('bk_name', $ap-1); +else { + $sql_korean = ''; + $ap = 0; +} + +if ($no_hp == 'yes') { + set_cookie('cookie_no_hp', 'yes', 60*60*24*365); + $no_hp_checked = 'checked'; +} else if ($no_hp == 'no') { + set_cookie('cookie_no_hp', '', 0); + $no_hp_checked = ''; +} else { + if (get_cookie('cookie_no_hp') == 'yes') + $no_hp_checked = 'checked'; + else + $no_hp_checked = ''; +} + +if ($no_hp_checked == 'checked') + $sql_no_hp = "and bk_hp <> ''"; + +$total_res = sql_fetch("select count(*) as cnt from {$g5['sms5_book_table']} where 1 $sql_group $sql_search $sql_korean $sql_no_hp"); +$total_count = $total_res['cnt']; + +$total_page = (int)($total_count/$page_size) + ($total_count%$page_size==0 ? 0 : 1); +$page_start = $page_size * ( $page - 1 ); + +$vnum = $total_count - (($page-1) * $page_size); + +$res = sql_fetch("select count(*) as cnt from {$g5['sms5_book_table']} where bk_receipt=1 $sql_group $sql_search $sql_korean $sql_no_hp"); +$receipt_count = $res['cnt']; +$reject_count = $total_count - $receipt_count; + +$res = sql_fetch("select count(*) as cnt from {$g5['sms5_book_table']} where mb_id='' $sql_group $sql_search $sql_korean $sql_no_hp"); +$no_member_count = $res['cnt']; +$member_count = $total_count - $no_member_count; + +$no_group = sql_fetch("select * from {$g5['sms5_book_group_table']} where bg_no = 1"); + +$group = array(); +$qry = sql_query("select * from {$g5['sms5_book_group_table']} where bg_no>1 order by bg_name"); +while ($res = sql_fetch_array($qry)) array_push($group, $res); + +include_once(G5_ADMIN_PATH.'/admin.head.php'); +?> + + + +
    + 회원정보 최근 업데이트 + 총 건수 + 회원 + 비회원 + 수신 + 거부 +
    + +
    + + + + + + +
    + +
    + + + onclick="no_hp_click(this.checked)"> + +
    + + + +
    + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    목록
    + + + 번호그룹이름휴대폰수신아이디업데이트관리
    데이터가 없습니다.
    + + + 수신' : '거부'?> + 수정 + 보내기 + 내역 +
    +
    + +
    + + + + + +
    +
    + + + + + \ No newline at end of file diff --git a/adm/sms_admin/num_book_file.php b/adm/sms_admin/num_book_file.php new file mode 100644 index 000000000..e2784dc4c --- /dev/null +++ b/adm/sms_admin/num_book_file.php @@ -0,0 +1,158 @@ + 1 order by bg_name"); +while ($res = sql_fetch_array($qry)) array_push($group, $res); + +include_once(G5_ADMIN_PATH.'/admin.head.php'); +?> + +

    파일 업로드

    +
    +

    + 엑셀에 저장된 휴대폰번호 목록을 데이터베이스에 저장할 수 있습니다. +

    + +

    + 엑셀에는 이름과 휴대폰번호 두개만 저장해주세요. 첫번째 라인부터 저장됩니다.
    + ※ 휴대폰번호에 하이픈(-)은 포함되어도 되고 포함되지 않아도 됩니다. +

    + +

    + 엑셀파일은 XLS( Excel 97 - 2003 통합 문서 ) 또는 CSV형식만 업로드 할수 있습니다. (xlsx 불가)
    + CSV 저장방법 : 파일 > 다른 이름으로 저장 > 파일형식 : CSV (쉼표로 분리) (*.CSV) +

    + +

    + 이 작업을 실행하기 전에 회원정보업데이트를 먼저 실행해주세요. +

    +
    + +
    +
    + + +
    + +
    + + + + + + + 파일을 업로드 중입니다. 잠시만 기다려주세요. + + +
    +
    + 휴대폰번호를 DB에 저장중 입니다. 잠시만 기다려주세요. +
    +
    +
    + +

    파일 다운로드

    +
    +

    + 저장된 휴대폰번호 목록을 엑셀(xls) 파일로 다운로드 할 수 있습니다.
    + 다운로드 할 휴대폰번호 그룹을 선택해주세요. +

    +
    + +
    +

    + +
    + + +

    + + + + +
    + + + \ No newline at end of file diff --git a/adm/sms_admin/num_book_file_download.php b/adm/sms_admin/num_book_file_download.php new file mode 100644 index 000000000..65c1bdaa1 --- /dev/null +++ b/adm/sms_admin/num_book_file_download.php @@ -0,0 +1,67 @@ +''"; + +$sql = "select count(*) as cnt from {$g5['sms5_book_table']} where 1 $sql_bg $sql_hp order by bk_name"; +$total = sql_fetch($sql); + +if (!$total['cnt']) alert_just('데이터가 없습니다.'); + +$qry = sql_query("select * from {$g5['sms5_book_table']} where 1 $sql_bg $sql_hp order by bk_name"); + +/*================================================================================ +php_writeexcel http://www.bettina-attack.de/jonny/view.php/projects/php_writeexcel/ +=================================================================================*/ + +include_once(G5_LIB_PATH.'/Excel/php_writeexcel/class.writeexcel_workbook.inc.php'); +include_once(G5_LIB_PATH.'/Excel/php_writeexcel/class.writeexcel_worksheet.inc.php'); + +$fname = tempnam(G5_DATA_PATH, "tmp.xls"); +$workbook = new writeexcel_workbook($fname); +$worksheet = $workbook->addworksheet(); + +$num2_format =& $workbook->addformat(array(num_format => '\0#')); + +// Put Excel data +$data = array('이름', '전화번호'); +$data = array_map('iconv_euckr', $data); + +$col = 0; +foreach($data as $cell) { + $worksheet->write(0, $col++, $cell); +} + +for($i=1; $res=sql_fetch_array($qry); $i++) +{ + $res = array_map('iconv_euckr', $res); + + $hp = get_hp($res['bk_hp'], $hyphen); + + if ($no_hp && $res['bk_hp'] != '' && !$hp) continue; + + $worksheet->write($i, 0, $res['bk_name']); + $worksheet->write($i, 1, $hp, $num2_format); +} + +$workbook->close(); + +$filename = "휴대폰번호목록-".date("ymd", time()).".xls"; +if( is_ie() ) $filename = utf2euc($filename); + +header("Content-Type: application/x-msexcel; name=".$filename); +header("Content-Disposition: inline; filename=".$filename); +$fh=fopen($fname, "rb"); +fpassthru($fh); +unlink($fname); + +exit; +?> \ No newline at end of file diff --git a/adm/sms_admin/num_book_file_upload.php b/adm/sms_admin/num_book_file_upload.php new file mode 100644 index 000000000..c1fa4cdda --- /dev/null +++ b/adm/sms_admin/num_book_file_upload.php @@ -0,0 +1,166 @@ +setOutputEncoding('UTF-8'); + $data->read($file); + $num_rows = $data->sheets[0]['numRows']; + break; + default : + alert_after('xls파일과 csv파일만 허용합니다.'); +} + +$counter = 0; +$success = 0; +$failure = 0; +$inner_overlap = 0; +$overlap = 0; +$arr_hp = array(); +$encode = array('ASCII','UTF-8','EUC-KR'); + +for ($i = 1; $i <= $num_rows; $i++) { + $counter++; + $j = 1; + + switch ($ext) { + case '.csv' : + $name = $csv[$i][0]; + $str_encode = @mb_detect_encoding($name, $encode); + if( $str_encode == "EUC-KR" ){ + $name = iconv_utf8( $name ); + } + $name = addslashes($name); + $hp = addslashes($csv[$i][1]); + break; + case '.xls' : + $name = addslashes($data->sheets[0]['cells'][$i][$j++]); + $str_encode = @mb_detect_encoding($name, $encode); + if( $str_encode == "EUC-KR" ){ + $name = iconv_utf8( $name ); + } + $hp = addslashes(get_hp($data->sheets[0]['cells'][$i][$j++])); + break; + } + if (!(strlen($name)&&$hp)) + { + $failure++; + + } else { + if (in_array($hp, $arr_hp)) + { + $inner_overlap++; + } else { + + array_push($arr_hp, $hp); + + $res = sql_fetch("select * from {$g5['sms5_book_table']} where bk_hp='$hp'"); + if ($res) + { + $overlap++; + } + else if (!$confirm && $hp) + { + sql_query("insert into {$g5['sms5_book_table']} set bg_no='$bg_no', bk_name='".addslashes($name)."', bk_hp='$hp', bk_receipt=1, bk_datetime='".G5_TIME_YMDHIS."'"); + sql_query("update {$g5['sms5_book_group_table']} set bg_count = bg_count + 1, bg_nomember = bg_nomember + 1, bg_receipt = bg_receipt + 1 where bg_no='$bg_no'"); + $success++; + } + } + } + if ($inner_overlap > 0) $overlap += $inner_overlap; +} + +unlink($_FILES['csv']['tmp_name']); + +if ($success){ + $sql = "select count(*) as cnt from {$g5['sms5_book_table']} where bg_no='$bg_no'"; + $total = sql_fetch($sql); + sql_query("update {$g5['sms5_book_group_table']} set bg_count = ".$total['cnt']." where bg_no='$bg_no'"); +} + +$result = $counter - $failure - $overlap; + +echo ""; + + +function alert_after($str) { + echo ""; + alert_just($str); +} +?> \ No newline at end of file diff --git a/adm/sms_admin/num_book_move.php b/adm/sms_admin/num_book_move.php new file mode 100644 index 000000000..1a68adece --- /dev/null +++ b/adm/sms_admin/num_book_move.php @@ -0,0 +1,128 @@ + + +
    +

    + +
    + + + + + +
    + + + + + + + + + + + + + + + + +
    할 그룹을 한개 이상 선택하여 주십시오.
    + + + + + 그룹
    + + + + +
    +
    + +
    + + +
    +
    + +
    + + + + diff --git a/adm/sms_admin/num_book_multi_update.php b/adm/sms_admin/num_book_multi_update.php new file mode 100644 index 000000000..5919a7f61 --- /dev/null +++ b/adm/sms_admin/num_book_multi_update.php @@ -0,0 +1,63 @@ + \ No newline at end of file diff --git a/adm/sms_admin/num_book_update.php b/adm/sms_admin/num_book_update.php new file mode 100644 index 000000000..578c482df --- /dev/null +++ b/adm/sms_admin/num_book_update.php @@ -0,0 +1,137 @@ +'$bk_no' and bk_hp='$bk_hp'"); + if ($res) + alert('같은 번호가 존재합니다.'); +*/ + $res = sql_fetch("select * from {$g5['sms5_book_table']} where bk_no='$bk_no'"); + if (!$res) + alert('존재하지 않는 데이터 입니다.'); + + if ($bg_no != $res['bg_no']) { + if ($res['mb_id']) $mem = "bg_member"; else $mem = "bg_nomember"; + if ($res['bk_receipt'] == 1) $sms = "bg_receipt"; else $sms = "bg_reject"; + sql_query("update {$g5['sms5_book_group_table']} set bg_count = bg_count - 1, $mem = $mem - 1, $sms = $sms - 1 where bg_no='{$res['bg_no']}'"); + sql_query("update {$g5['sms5_book_group_table']} set bg_count = bg_count + 1, $mem = $mem + 1, $sms = $sms + 1 where bg_no='$bg_no'"); + } + + if ($bk_receipt != $res['bk_receipt']) { + if ($bk_receipt == 1) + sql_query("update {$g5['sms5_book_group_table']} set bg_receipt = bg_receipt + 1, bg_reject = bg_reject - 1 where bg_no='$bg_no'"); + else + sql_query("update {$g5['sms5_book_group_table']} set bg_receipt = bg_receipt - 1, bg_reject = bg_reject + 1 where bg_no='$bg_no'"); + } + + sql_query("update {$g5['sms5_book_table']} set bg_no='$bg_no', bk_name='$bk_name', bk_hp='$bk_hp', bk_receipt='$bk_receipt', bk_datetime='".G5_TIME_YMDHIS."', bk_memo='".addslashes($bk_memo)."' where bk_no='$bk_no'"); + if ($res['mb_id']){ //만약에 mb_id가 있다면... + // 휴대폰번호 중복체크 + $sql = " select mb_id from {$g5['member_table']} where mb_id <> '{$res['mb_id']}' and mb_hp = '{$bk_hp}' "; + $mb_hp_exist = sql_fetch($sql); + if ($mb_hp_exist['mb_id']) { //중복된 회원 휴대폰번호가 있다면 + $is_hp_exist = true; + } else { + sql_query("update {$g5['member_table']} set mb_name='".addslashes($bk_name)."', mb_hp='$bk_hp', mb_sms='$bk_receipt' where mb_id='{$res['mb_id']}'", false); + } + } + $get_bg_no = $bg_no; + + $go_url = './num_book_write.php?bk_no='.$bk_no.'&w='.$w.'&page='.$page; + if( $is_hp_exist ){ //중복된 회원 휴대폰번호가 있다면 + //alert( "중복된 회원 휴대폰번호가 있어서 회원정보에는 반영되지 않았습니다.", $go_url ); + goto_url($go_url); + } else { + goto_url($go_url); + } + exit; +} +else if ($w=='d') // 삭제 +{ + if (!is_numeric($bk_no)) + alert('고유번호가 없습니다.'); + + $res = sql_fetch("select * from {$g5['sms5_book_table']} where bk_no='$bk_no'"); + if (!$res) + alert('존재하지 않는 데이터 입니다.'); + + if ($res['bk_receipt'] == 1) $bg_sms = 'bg_receipt'; else $bg_sms = 'bg_reject'; + if ($res['mb_id']) $bg_mb = 'bg_member'; else $bg_mb = 'bg_nomember'; + + sql_query("delete from {$g5['sms5_book_table']} where bk_no='$bk_no'"); + sql_query("update {$g5['sms5_book_group_table']} set bg_count = bg_count - 1, $bg_mb = $bg_mb - 1, $bg_sms = $bg_sms - 1 where bg_no = '{$res['bg_no']}'"); + +/* + if (!is_numeric($bk_no)) + alert('고유번호가 없습니다.'); + + $res = sql_fetch("select * from $g5[sms5_book_table] where bk_no='$bk_no'"); + if (!$res) + alert('존재하지 않는 데이터 입니다.'); + + if (!$res[mb_id]) + { + if ($res[receipt] == 1) + $sql_sms = "bg_receipt = bg_receipt - 1"; + else + $sql_sms = "bg_reject = bg_reject - 1"; + + sql_query("delete from $g5[sms5_book_table] where bk_no='$bk_no'"); + sql_query("update $g5[sms5_book_group_table] set bg_count = bg_count - 1, bg_nomember = bg_nomember - 1, $sql_sms where bg_no = '$res[bg_no]'"); + } + else + alert("회원은 삭제할 수 없습니다.\\n\\n회원관리 메뉴에서 삭제한 후\\n\\n회원정보업데이트 메뉴를 실행 해주세요."); +*/ +} +else // 등록 +{ + if (!$bg_no) $bg_no = 1; + + if (!$bk_receipt) $bk_receipt = 0; else $bk_receipt = 1; + + if (!strlen(trim($bk_name))) + alert('이름을 입력해주세요'); + + if ($bk_hp == '') + alert('휴대폰번호만 입력 가능합니다.'); + + $res = sql_fetch("select * from {$g5['sms5_book_table']} where bk_hp='$bk_hp'"); + if ($res) + alert('같은 번호가 존재합니다.'); + + if ($bk_receipt == 1) + $sql_sms = "bg_receipt = bg_receipt + 1"; + else + $sql_sms = "bg_reject = bg_reject + 1"; + + sql_query("insert into {$g5['sms5_book_table']} set bg_no='$bg_no', bk_name='".addslashes($bk_name)."', bk_hp='$bk_hp', bk_receipt='$bk_receipt', bk_datetime='".G5_TIME_YMDHIS."', bk_memo='".addslashes($bk_memo)."'"); + sql_query("update {$g5['sms5_book_group_table']} set bg_count = bg_count + 1, bg_nomember = bg_nomember + 1, $sql_sms where bg_no = '$bg_no'"); + + $get_bg_no = $bg_no; +} + +$go_url = './num_book.php?page='.$page.'&bg_no='.$get_bg_no.'&ap='.$ap; +goto_url($go_url); +?> \ No newline at end of file diff --git a/adm/sms_admin/num_book_write.php b/adm/sms_admin/num_book_write.php new file mode 100644 index 000000000..7bfe367c5 --- /dev/null +++ b/adm/sms_admin/num_book_write.php @@ -0,0 +1,216 @@ + '{$write['mb_id']}' and mb_hp <> '' "; + $result = sql_query($sql); + while($tmp = sql_fetch_array($result)){ + $exist_hplist[] = $tmp; + } + $exist_msg_1 = '(수정시 회원정보에 반영되지 않습니다.)'; + $exist_msg_2 = '(수정시 회원정보에 반영됩니다.)'; + $exist_msg = count($exist_hplist) ? $exist_msg_1 : $exist_msg_2; + } + $g5['title'] .= '수정'; +} +else { + $write['bg_no'] = $bg_no; + $g5['title'] .= '추가'; +} + +if (!is_numeric($write['bk_receipt'])) + $write['bk_receipt'] = 1; + +$no_group = sql_fetch("select * from {$g5['sms5_book_group_table']} where bg_no = 1"); + +include_once(G5_ADMIN_PATH."/admin.head.php"); +?> + +
    + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + +
    +
      + +
    • 중복됨
    • + +
    +
    + +
    수신여부 + > + + > + +
    회원아이디 '.$write['mb_id'].'' : '비회원'?>
    업데이트
    + +
    +
    + +
    + + 목록 +
    + +
    + + \ No newline at end of file diff --git a/adm/sms_admin/num_group.php b/adm/sms_admin/num_group.php new file mode 100644 index 000000000..66f0565a6 --- /dev/null +++ b/adm/sms_admin/num_group.php @@ -0,0 +1,186 @@ + 1 order by bg_name"); +while ($res = sql_fetch_array($qry)) array_push($group, $res); + +include_once(G5_ADMIN_PATH.'/admin.head.php'); +?> + + + + +
    + +
    + + + +
    +
    + 건수 : +
    +
    + +
    +

    그룹명순으로 정렬됩니다.

    +
    + +
    + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    목록
    + + + 그룹명회원비회원수신거부이동보기
    + + + + 보기 +
    + + + + + + + + + + + 보기 +
    +
    + +
    + + + +
    + +
    + \ No newline at end of file diff --git a/adm/sms_admin/num_group_move.php b/adm/sms_admin/num_group_move.php new file mode 100644 index 000000000..733585c16 --- /dev/null +++ b/adm/sms_admin/num_group_move.php @@ -0,0 +1,14 @@ + \ No newline at end of file diff --git a/adm/sms_admin/num_group_update.php b/adm/sms_admin/num_group_update.php new file mode 100644 index 000000000..ea9af2423 --- /dev/null +++ b/adm/sms_admin/num_group_update.php @@ -0,0 +1,77 @@ +'$bg_no' and bg_name='$bg_name'"); + if ($res) + alert('같은 그룹명이 존재합니다.'); + + sql_query("update {$g5['sms5_book_group_table']} set bg_name='".addslashes($bg_name)."' where bg_no='$bg_no'"); + } +} +else if ($w == 'de') // 그룹삭제 +{ + for ($i=0; $i \ No newline at end of file diff --git a/adm/sms_admin/number_move_update.php b/adm/sms_admin/number_move_update.php new file mode 100644 index 000000000..ad24a7010 --- /dev/null +++ b/adm/sms_admin/number_move_update.php @@ -0,0 +1,84 @@ += 1 "); + $bg_reject = (int)$bg_count['cnt'] - (int)$bg_receipt['cnt']; + $bg_member = sql_fetch("select count(*) as cnt from {$g5['sms5_book_table']} where bg_no='$v' and mb_id <> '' "); + $bg_nomember = (int)$bg_count['cnt'] - (int)$bg_member['cnt']; + $sql = "update {$g5['sms5_book_group_table']} set bg_count = {$bg_count['cnt']}, bg_receipt = {$bg_receipt['cnt']}, bg_reject = {$bg_reject}, bg_member = {$bg_member['cnt']}, bg_nomember = {$bg_nomember} where bg_no='$v' "; + sql_query($sql); + } +} + +$msg = '해당 번호를 선택한 그룹으로 '.$act.' 하였습니다.'; +$opener_href = './num_book.php?page='.$page; + +echo << + + +HEREDOC; +?> \ No newline at end of file diff --git a/adm/sms_admin/sms5.sql b/adm/sms_admin/sms5.sql new file mode 100644 index 000000000..a741c7832 --- /dev/null +++ b/adm/sms_admin/sms5.sql @@ -0,0 +1,188 @@ +## 마이에스큐엘 dump 10.11 +## +## +## ###################################################### +## Server version 5.0.92-log + + + + + + + +## +## Table structure for table `{$g5['sms5_book_table']}` +## + +DROP TABLE IF EXISTS `{$g5['sms5_book_table']}`; + + +CREATE TABLE `{$g5['sms5_book_table']}` ( + `bk_no` int(11) NOT NULL auto_increment, + `bg_no` int(11) NOT NULL default '0', + `mb_no` int(11) NOT NULL default '0', + `mb_id` varchar(20) NOT NULL default '', + `bk_name` varchar(255) NOT NULL default '', + `bk_hp` varchar(255) NOT NULL default '', + `bk_receipt` tinyint(4) NOT NULL default '0', + `bk_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + `bk_memo` text NOT NULL, + PRIMARY KEY (`bk_no`), + KEY `bk_name` (`bk_name`), + KEY `bk_hp` (`bk_hp`), + KEY `mb_no` (`mb_no`), + KEY `bg_no` (`bg_no`,`bk_no`), + KEY `mb_id` (`mb_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +## +## Table structure for table `{$g5['sms5_book_table']}_group` +## + +DROP TABLE IF EXISTS `{$g5['sms5_book_table']}_group`; + + +CREATE TABLE `{$g5['sms5_book_table']}_group` ( + `bg_no` int(11) NOT NULL auto_increment, + `bg_name` varchar(255) NOT NULL default '', + `bg_count` int(11) NOT NULL default '0', + `bg_member` int(11) NOT NULL default '0', + `bg_nomember` int(11) NOT NULL default '0', + `bg_receipt` int(11) NOT NULL default '0', + `bg_reject` int(11) NOT NULL default '0', + PRIMARY KEY (`bg_no`), + KEY `bg_name` (`bg_name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +## +## Table structure for table `{$g5['sms5_config_table']}` +## + +DROP TABLE IF EXISTS `{$g5['sms5_config_table']}`; + + +CREATE TABLE `{$g5['sms5_config_table']}` ( + `cf_phone` varchar(255) NOT NULL default '', + `cf_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + `cf_member` tinyint(4) NOT NULL default '1', + `cf_level` tinyint(4) NOT NULL default '2', + `cf_point` int(11) NOT NULL default '0', + `cf_day_count` int(11) NOT NULL default '0', + `cf_skin` varchar(100) NOT NULL DEFAULT '' +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +## +## Table structure for table `{$g5['sms5_form_table']}` +## + +DROP TABLE IF EXISTS `{$g5['sms5_form_table']}`; + + +CREATE TABLE `{$g5['sms5_form_table']}` ( + `fo_no` int(11) NOT NULL auto_increment, + `fg_no` tinyint(4) NOT NULL default '0', + `fg_member` char(1) NOT NULL default '0', + `fo_name` varchar(255) NOT NULL default '', + `fo_content` text NOT NULL, + `fo_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (`fo_no`), + KEY `fg_no` (`fg_no`,`fo_no`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +## +## Table structure for table `{$g5['sms5_form_table']}_group` +## + +DROP TABLE IF EXISTS `{$g5['sms5_form_table']}_group`; + + +CREATE TABLE `{$g5['sms5_form_table']}_group` ( + `fg_no` int(11) NOT NULL auto_increment, + `fg_name` varchar(255) NOT NULL default '', + `fg_count` int(11) NOT NULL default '0', + `fg_member` tinyint(4) NOT NULL, + PRIMARY KEY (`fg_no`), + KEY `fg_name` (`fg_name`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +## +## Table structure for table `{$g5['sms5_history_table']}` +## + +DROP TABLE IF EXISTS `{$g5['sms5_history_table']}`; + + +CREATE TABLE `{$g5['sms5_history_table']}` ( + `hs_no` int(11) NOT NULL auto_increment, + `wr_no` int(11) NOT NULL default '0', + `wr_renum` int(11) NOT NULL default '0', + `bg_no` int(11) NOT NULL default '0', + `mb_no` int(11) NOT NULL default '0', + `mb_id` varchar(20) NOT NULL default '', + `bk_no` int(11) NOT NULL default '0', + `hs_name` varchar(30) NOT NULL default '', + `hs_hp` varchar(255) NOT NULL default '', + `hs_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + `hs_flag` tinyint(4) NOT NULL default '0', + `hs_code` varchar(255) NOT NULL default '', + `hs_memo` varchar(255) NOT NULL default '', + `hs_log` varchar(255) NOT NULL default '', + PRIMARY KEY (`hs_no`), + KEY `wr_no` (`wr_no`), + KEY `mb_no` (`mb_no`), + KEY `bk_no` (`bk_no`), + KEY `hs_hp` (`hs_hp`), + KEY `hs_code` (`hs_code`), + KEY `bg_no` (`bg_no`), + KEY `mb_id` (`mb_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +## +## Table structure for table `{$g5['sms5_write_table']}` +## + +DROP TABLE IF EXISTS `{$g5['sms5_write_table']}`; + + +CREATE TABLE `{$g5['sms5_write_table']}` ( + `wr_no` int(11) NOT NULL default '1', + `wr_renum` int(11) NOT NULL default '0', + `wr_reply` varchar(255) NOT NULL default '', + `wr_message` varchar(255) NOT NULL default '', + `wr_booking` datetime NOT NULL default '0000-00-00 00:00:00', + `wr_total` int(11) NOT NULL default '0', + `wr_re_total` int(11) NOT NULL default '0', + `wr_success` int(11) NOT NULL default '0', + `wr_failure` int(11) NOT NULL default '0', + `wr_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + `wr_memo` text NOT NULL, + KEY `wr_no` (`wr_no`,`wr_renum`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +## +## Table structure for table `{$g5['sms5_member_history_table']}` +## + +DROP TABLE IF EXISTS `{$g5['sms5_member_history_table']}`; + + +CREATE TABLE `{$g5['sms5_member_history_table']}` ( + `mh_no` int(11) NOT NULL auto_increment, + `mb_id` varchar(30) NOT NULL, + `mh_reply` varchar(30) NOT NULL, + `mh_hp` varchar(30) NOT NULL, + `mh_datetime` datetime NOT NULL, + `mh_booking` datetime NOT NULL, + `mh_log` varchar(255) NOT NULL, + `mh_ip` varchar(15) NOT NULL, + PRIMARY KEY (`mh_no`), + KEY `mb_id` (`mb_id`,`mh_datetime`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + diff --git a/adm/sms_admin/sms_ing.php b/adm/sms_admin/sms_ing.php new file mode 100644 index 000000000..3c8fdbabb --- /dev/null +++ b/adm/sms_admin/sms_ing.php @@ -0,0 +1,22 @@ + + + + + + +SMS 전송 중 + + + + +

    SMS를 전송 중입니다.
    잠시만 기다려주십시오.
    + + + diff --git a/adm/sms_admin/sms_write.php b/adm/sms_admin/sms_write.php new file mode 100644 index 000000000..7e3440235 --- /dev/null +++ b/adm/sms_admin/sms_write.php @@ -0,0 +1,791 @@ + + +
    + 회원정보 최근 업데이트 : +
    + + +
    + +
    +

    이모티콘 목록

    + +
    + +
    +
    + + +

    보낼내용

    +
    + + + + +
    0 / 80 byte
    + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + +
    + {이름} : 받는사람 이름 +
    + +
    + + +
    + +
    +

    받는사람

    + + + + + +
    + +
    + + +
    +
    +
    + +
    +

    예약전송

    + +
    + + +
    + + +
    + + + +
    + + + + +
    + +
    + + +
    +
    +
    + +
    +

    휴대폰번호 목록

    +
    + 그룹 + 개인 + 권한 +
    + +
    + +
    SMS 수신을 허용한 회원님만 출력됩니다.
    +
    +
    + + + +\n"; + echo "var hp_list = document.getElementById('hp_list');\n"; + //echo "add(\"$row[wr_message]\");\n"; + $wr_message = str_replace('"', '\"', $row['wr_message']); + $wr_message = str_replace(array("\r\n","\n"), "\\n", $wr_message); + echo "add(\"$wr_message\");\n"; + echo "document.getElementById('wr_reply').value = '{$row['wr_reply']}';\n"; + + // 회원목록 + $sql = " select * from {$g5['sms5_history_table']} where wr_no = '$wr_no' and bk_no > 0 "; + $qry = sql_query($sql); + $tot = mysql_num_rows($qry); + + if ($tot > 0) { + + $str = '재전송그룹 ('.number_format($tot).'명)'; + $val = 'p,'; + + while ($row = sql_fetch_array($qry)) + { + $val .= $row['bk_no'].','; + } + + echo "hp_list.options[hp_list.length] = new Option('$str', '$val');\n"; + } + + // 비회원 목록 + $sql = " select * from {$g5['sms5_history_table']} where wr_no = '$wr_no' and bk_no = 0 "; + $qry = sql_query($sql); + $tot = mysql_num_rows($qry); + + if ($tot > 0) + { + while ($row = sql_fetch_array($qry)) + { + $str = "{$row['hs_name']} ({$row['hs_hp']})"; + $val = "h,{$row['hs_name']}:{$row['hs_hp']}"; + echo "hp_list.options[hp_list.length] = new Option('$str', '$val');\n"; + } + } + echo "\n"; +} +?> + + + + +
    +

    SMS 문자전송 서비스를 사용할 수 없습니다.

    +
    +

    + SMS 를 사용하지 않고 있기 때문에, 문자 전송을 할 수 없습니다.
    + SMS 사용 설정은 환경설정 > 기본환경설정 > SMS설정 에서 SMS 사용을 아이코드로 변경해 주셔야 사용하실수 있습니다. +

    +
    +
    + + + + \ No newline at end of file diff --git a/adm/sms_admin/sms_write_form.php b/adm/sms_admin/sms_write_form.php new file mode 100644 index 000000000..23435005a --- /dev/null +++ b/adm/sms_admin/sms_write_form.php @@ -0,0 +1,132 @@ + + +
    + + +
    + +
      +
    + +
    + + + + + + + + +
    + + + + + \ No newline at end of file diff --git a/adm/sms_admin/sms_write_overlap_check.php b/adm/sms_admin/sms_write_overlap_check.php new file mode 100644 index 000000000..100ed6ba3 --- /dev/null +++ b/adm/sms_admin/sms_write_overlap_check.php @@ -0,0 +1,69 @@ + $hp, 'bk_name' => $name)); + array_push($hps, $hp); + break; + + case 'p': // 개인 선택 + $res = sql_fetch("select * from {$g5['sms5_book_table']} where bk_no='$item[$i]'"); + $res['bk_hp'] = get_hp($res['bk_hp'], 0); + if (array_overlap($hps, $res['bk_hp'])) { + $overlap ++; + continue; + } + array_push($list, $res); + array_push($hps, $res['bk_hp']); + break; + } + } +} + +if ($overlap) + die("중복되는 휴대폰번호가 $overlap 건 있습니다. "); +else + die("중복되는 휴대폰번호가 없습니다. "); +?> \ No newline at end of file diff --git a/adm/sms_admin/sms_write_send.php b/adm/sms_admin/sms_write_send.php new file mode 100644 index 000000000..d11a5b0fd --- /dev/null +++ b/adm/sms_admin/sms_write_send.php @@ -0,0 +1,233 @@ + $hp, 'bk_name' => $name, 'mb_id' => $mb_id, 'bg_no' => $bg_no, 'bk_no' => $bk_no)); + array_push($hps, $hp); + } + break; + + case 'h': // 권한(mb_leve) 선택 + + $item[$i] = explode(':', $item[$i]); + $hp = get_hp($item[$i][1], 0); + $name = $item[$i][0]; + + if ($wr_overlap && array_overlap($hps, $hp)) { + $overlap++; + array_push( $duplicate_data['hp'], $row['bk_hp'] ); + continue; + } + + array_push($list, array('bk_hp' => $hp, 'bk_name' => $name)); + array_push($hps, $hp); + break; + + case 'p': // 개인 선택 + + $row = sql_fetch("select * from {$g5['sms5_book_table']} where bk_no='$item[$i]'"); + $row['bk_hp'] = get_hp($row['bk_hp'], 0); + + if ($wr_overlap && array_overlap($hps, $row['bk_hp'])) { + $overlap++; + array_push( $duplicate_data['hp'], $row['bk_hp'] ); + continue; + } + array_push($list, $row); + array_push($hps, $row['bk_hp']); + break; + } + } +} + +if( count($duplicate_data['hp']) ){ //중복된 번호가 있다면 + $duplicate_data['total'] = $overlap; + $str_serialize = serialize($duplicate_data); +} + +$wr_total = count($list); + +// 예약전송 +if ($wr_by && $wr_bm && $wr_bd && $wr_bh && $wr_bi) { + $wr_booking = "$wr_by-$wr_bm-$wr_bd $wr_bh:$wr_bi"; + $booking = $wr_by.$wr_bm.$wr_bd.$wr_bh.$wr_bi; +} else { + $wr_booking = ''; + $booking = ''; +} + +if ($config['cf_sms_use'] != 'icode') { + alert('기본환경설정에서 icode sms 사용이 비활성화 되어 있습니다.'); +} + +include_once(G5_ADMIN_PATH.'/admin.head.php'); + +$SMS = new SMS5; +$SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + +$reply = str_replace('-', '', trim($wr_reply)); +$wr_message = conv_unescape_nl($wr_message); + +$result = $SMS->Add($list, $reply, '', '', $wr_message, $booking, $wr_total); + +if ($result) +{ + $result = $SMS->Send(); + + if ($result) //SMS 서버에 접속했습니다. + { + $row = sql_fetch("select max(wr_no) as wr_no from {$g5['sms5_write_table']}"); + if ($row) + $wr_no = $row['wr_no'] + 1; + else + $wr_no = 1; + + sql_query("insert into {$g5['sms5_write_table']} set wr_no='$wr_no', wr_renum=0, wr_reply='$wr_reply', wr_message='$wr_message', wr_booking='$wr_booking', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'"); + + $wr_success = 0; + $wr_failure = 0; + $count = 0; + + foreach ($SMS->Result as $result) + { + list($phone, $code) = explode(":", $result); + + if (substr($code,0,5) == "Error") + { + $hs_code = substr($code,6,2); + + switch ($hs_code) { + case '02': // "02:형식오류" + $hs_memo = "형식이 잘못되어 전송이 실패하였습니다."; + break; + case '23': // "23:인증실패,데이터오류,전송날짜오류" + $hs_memo = "데이터를 다시 확인해 주시기바랍니다."; + break; + case '97': // "97:잔여코인부족" + $hs_memo = "잔여코인이 부족합니다."; + break; + case '98': // "98:사용기간만료" + $hs_memo = "사용기간이 만료되었습니다."; + break; + case '99': // "99:인증실패" + $hs_memo = "인증 받지 못하였습니다. 계정을 다시 확인해 주세요."; + break; + default: // "미 확인 오류" + $hs_memo = "알 수 없는 오류로 전송이 실패하었습니다."; + break; + } + $wr_failure++; + $hs_flag = 0; + } + else + { + $hs_code = $code; + $hs_memo = get_hp($phone, 1)."로 전송했습니다."; + $wr_success++; + $hs_flag = 1; + } + + $row = array_shift($list); + $row['bk_hp'] = get_hp($row['bk_hp'], 1); + + $log = array_shift($SMS->Log); + + sql_query("insert into {$g5['sms5_history_table']} set wr_no='$wr_no', wr_renum=0, bg_no='{$row['bg_no']}', mb_id='{$row['mb_id']}', bk_no='{$row['bk_no']}', hs_name='".addslashes($row['bk_name'])."', hs_hp='{$row['bk_hp']}', hs_datetime='".G5_TIME_YMDHIS."', hs_flag='$hs_flag', hs_code='$hs_code', hs_memo='".addslashes($hs_memo)."', hs_log='".addslashes($log)."'"); + } + $SMS->Init(); // 보관하고 있던 결과값을 지웁니다. + + sql_query("update {$g5['sms5_write_table']} set wr_success='$wr_success', wr_failure='$wr_failure', wr_memo='$str_serialize' where wr_no='$wr_no' and wr_renum=0"); + } + else win_close_alert("에러: SMS 서버와 통신이 불안정합니다."); +} +else win_close_alert("에러: SMS 데이터 입력도중 에러가 발생하였습니다."); + +function win_close_alert($msg) { + + $html = ""; + + echo $html; + exit; +} + +?> + + \ No newline at end of file diff --git a/adm/sql_write.sql b/adm/sql_write.sql new file mode 100644 index 000000000..21cad8d7f --- /dev/null +++ b/adm/sql_write.sql @@ -0,0 +1,44 @@ +CREATE TABLE `__TABLE_NAME__` ( + `wr_id` int(11) NOT NULL AUTO_INCREMENT, + `wr_num` int(11) NOT NULL DEFAULT '0', + `wr_reply` varchar(10) NOT NULL, + `wr_parent` int(11) NOT NULL DEFAULT '0', + `wr_is_comment` tinyint(4) NOT NULL DEFAULT '0', + `wr_comment` int(11) NOT NULL DEFAULT '0', + `wr_comment_reply` varchar(5) NOT NULL, + `ca_name` varchar(255) NOT NULL, + `wr_option` set('html1','html2','secret','mail') NOT NULL, + `wr_subject` varchar(255) NOT NULL, + `wr_content` text NOT NULL, + `wr_link1` text NOT NULL, + `wr_link2` text NOT NULL, + `wr_link1_hit` int(11) NOT NULL DEFAULT '0', + `wr_link2_hit` int(11) NOT NULL DEFAULT '0', + `wr_hit` int(11) NOT NULL DEFAULT '0', + `wr_good` int(11) NOT NULL DEFAULT '0', + `wr_nogood` int(11) NOT NULL DEFAULT '0', + `mb_id` varchar(20) NOT NULL, + `wr_password` varchar(255) NOT NULL, + `wr_name` varchar(255) NOT NULL, + `wr_email` varchar(255) NOT NULL, + `wr_homepage` varchar(255) NOT NULL, + `wr_datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `wr_file` tinyint(4) NOT NULL DEFAULT '0', + `wr_last` varchar(19) NOT NULL, + `wr_ip` varchar(255) NOT NULL, + `wr_facebook_user` varchar(255) NOT NULL, + `wr_twitter_user` varchar(255) NOT NULL, + `wr_1` varchar(255) NOT NULL, + `wr_2` varchar(255) NOT NULL, + `wr_3` varchar(255) NOT NULL, + `wr_4` varchar(255) NOT NULL, + `wr_5` varchar(255) NOT NULL, + `wr_6` varchar(255) NOT NULL, + `wr_7` varchar(255) NOT NULL, + `wr_8` varchar(255) NOT NULL, + `wr_9` varchar(255) NOT NULL, + `wr_10` varchar(255) NOT NULL, + PRIMARY KEY (`wr_id`), + KEY `wr_num_reply_parent` (`wr_num`,`wr_reply`,`wr_parent`), + KEY `wr_is_comment` (`wr_is_comment`,`wr_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; \ No newline at end of file diff --git a/adm/thumbnail_file_delete.php b/adm/thumbnail_file_delete.php new file mode 100644 index 000000000..3b5ea0bd5 --- /dev/null +++ b/adm/thumbnail_file_delete.php @@ -0,0 +1,68 @@ + + +
    +

    + 완료 메세지가 나오기 전에 프로그램의 실행을 중지하지 마십시오. +

    +
    + +썸네일디렉토리를 열지못했습니다.

    '; +} + +$cnt=0; +echo '
      '.PHP_EOL; + +foreach($directory as $dir) { + $files = glob($dir.'/thumb-*'); + if (is_array($files)) { + foreach($files as $thumbnail) { + $cnt++; + @unlink($thumbnail); + + echo '
    • '.$thumbnail.'
    • '.PHP_EOL; + + flush(); + + if ($cnt%10==0) + echo PHP_EOL; + } + } +} + +echo '
    • 완료됨
    '.PHP_EOL; +echo '

    썸네일 '.$cnt.'건의 삭제 완료됐습니다.
    프로그램의 실행을 끝마치셔도 좋습니다.

    '.PHP_EOL; +?> + + \ No newline at end of file diff --git a/adm/visit.sub.php b/adm/visit.sub.php new file mode 100644 index 000000000..b153152b1 --- /dev/null +++ b/adm/visit.sub.php @@ -0,0 +1,50 @@ + + +
    +
    + 기간별검색 + + + ~ + + + +
    +
    + + + + diff --git a/adm/visit_browser.php b/adm/visit_browser.php new file mode 100644 index 000000000..49b2e77d6 --- /dev/null +++ b/adm/visit_browser.php @@ -0,0 +1,95 @@ + $max) $max = $arr[$s]; + + $sum_count++; +} +?> + +
    + + + + + + + + + + + + + + + + + + + + $value) { + $count = $arr[$key]; + if ($save_count != $count) { + $i++; + $no = $i; + $save_count = $count; + } else { + $no = ""; + } + + $rate = ($count / $sum_count * 100); + $s_rate = number_format($rate, 1); + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + + '; + } + ?> + +
    목록
    순위브라우저그래프접속자수비율(%)
    합계100%
    +
    + +
    +
    자료가 없습니다.
    +
    + + diff --git a/adm/visit_date.php b/adm/visit_date.php new file mode 100644 index 000000000..1b3a5bf4a --- /dev/null +++ b/adm/visit_date.php @@ -0,0 +1,85 @@ + $max) $max = $row['cnt']; + + $sum_count += $row['cnt']; +} +?> + +
    + + + + + + + + + + + + + + + + + + + $value) { + $count = $value; + + $rate = ($count / $sum_count * 100); + $s_rate = number_format($rate, 1); + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + '; + } + ?> + +
    목록
    년-월-일그래프접속자수비율(%)
    합계100%
    +
    + +
    +
    자료가 없습니다.
    +
    + + diff --git a/adm/visit_delete.php b/adm/visit_delete.php new file mode 100644 index 000000000..20811f647 --- /dev/null +++ b/adm/visit_delete.php @@ -0,0 +1,95 @@ + + +
    + 접속자 로그를 삭제할 년도와 방법을 선택해주십시오. +
    + +
    +
    + + 년 + + 월 + + +
    +
    + + + +
    +
    + + + + diff --git a/adm/visit_delete_update.php b/adm/visit_delete_update.php new file mode 100644 index 000000000..1cbe920cf --- /dev/null +++ b/adm/visit_delete_update.php @@ -0,0 +1,60 @@ + \ No newline at end of file diff --git a/adm/visit_domain.php b/adm/visit_domain.php new file mode 100644 index 000000000..da7d2db55 --- /dev/null +++ b/adm/visit_domain.php @@ -0,0 +1,104 @@ + $max) $max = $arr[$s]; + + $sum_count++; +} +?> + +
    + + + + + + + + + + + + + + + + + + + + $value) { + $count = $arr[$key]; + if ($save_count != $count) { + $i++; + $no = $i; + $save_count = $count; + } else { + $no = ''; + } + + if (!$key) { + $link = ''; + $link2 = ''; + $key = '직접'; + } else { + $link = ''; + $link2 = ''; + } + + $rate = ($count / $sum_count * 100); + $s_rate = number_format($rate, 1); + + $bg = 'bg'.($i%2); + ?> + + + + + + + + '; + } + ?> + +
    목록
    순위접속 도메인그래프접속자수비율(%)
    합계100%
    +
    + +
    +
    자료가 없습니다.
    +
    + + diff --git a/adm/visit_hour.php b/adm/visit_hour.php new file mode 100644 index 000000000..2e0a692dc --- /dev/null +++ b/adm/visit_hour.php @@ -0,0 +1,82 @@ + $max) $max = $row['cnt']; + + $sum_count += $row['cnt']; +} +?> + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + '; + } + ?> + +
    목록
    시간그래프접속자수비율(%)
    합계100%
    +
    + +
    +
    자료가 없습니다.
    +
    + + diff --git a/adm/visit_list.php b/adm/visit_list.php new file mode 100644 index 000000000..3b9b9c070 --- /dev/null +++ b/adm/visit_list.php @@ -0,0 +1,109 @@ + + +
    + + + + + + + + + + + + + ', '&'), array("<", ">", "&"), $referer); + $link = ''; + $link = str_replace('&', "&", $link); + $link2 = ''; + } + + if ($is_admin == 'super') + $ip = $row['vi_ip']; + else + $ip = preg_replace("/([0-9]+).([0-9]+).([0-9]+).([0-9]+)/", G5_IP_DISPLAY, $row['vi_ip']); + + if ($brow == '기타') { $brow = ''.$brow.''; } + if ($os == '기타') { $os = ''.$os.''; } + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + '; + ?> + +
    목록
    IP접속 경로브라우저운영체제일시
    자료가 없거나 관리자에 의해 삭제되었습니다.
    +
    + + diff --git a/adm/visit_month.php b/adm/visit_month.php new file mode 100644 index 000000000..4e5b95d41 --- /dev/null +++ b/adm/visit_month.php @@ -0,0 +1,89 @@ + $max) $max = $row['cnt']; + + $sum_count += $row['cnt']; +} +?> + +
    + + + + + + + + + + + + + + + + + + + $value) { + $count = $value; + + $rate = ($count / $sum_count * 100); + $s_rate = number_format($rate, 1); + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + '; + } + ?> + + +
    목록
    년-월그래프접속자수비율(%)
    합계100%
    +
    + +
    +
    자료가 없습니다.
    +
    + + diff --git a/adm/visit_os.php b/adm/visit_os.php new file mode 100644 index 000000000..c0e043683 --- /dev/null +++ b/adm/visit_os.php @@ -0,0 +1,99 @@ + $max) $max = $arr[$s]; + + $sum_count++; +} +?> + +
    + + + + + + + + + + + + + + + + + + + + $value) { + $count = $arr[$key]; + if ($save_count != $count) { + $i++; + $no = $i; + $save_count = $count; + } else { + $no = ''; + } + + if (!$key) { + $key = '직접'; + } + + $rate = ($count / $sum_count * 100); + $s_rate = number_format($rate, 1); + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + + '; + } + ?> + +
    목록
    순위OS그래프접속자수비율(%)
    합계100%
    +
    + +
    +
    자료가 없습니다.
    +
    + + diff --git a/adm/visit_search.php b/adm/visit_search.php new file mode 100644 index 000000000..636304de2 --- /dev/null +++ b/adm/visit_search.php @@ -0,0 +1,143 @@ +처음'; //페이지 처음으로 (초기화용도) +?> + +
    +
    + + + + + + +
    +
    + + + + + + + + diff --git a/adm/visit_week.php b/adm/visit_week.php new file mode 100644 index 000000000..1842feed8 --- /dev/null +++ b/adm/visit_week.php @@ -0,0 +1,81 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + '; + } + ?> + +
    목록
    요일그래프접속자수비율(%)
    합계100%
    +
    + +
    +
    자료가 없습니다.
    +
    + + diff --git a/adm/visit_year.php b/adm/visit_year.php new file mode 100644 index 000000000..4bd0f0d9f --- /dev/null +++ b/adm/visit_year.php @@ -0,0 +1,86 @@ + $max) $max = $row['cnt']; + + $sum_count += $row['cnt']; +} +?> + +
    + + + + + + + + + + + + + + + + + + + $value) { + $count = $value; + + $rate = ($count / $sum_count * 100); + $s_rate = number_format($rate, 1); + + $bg = 'bg'.($i%2); + ?> + + + + + + + + + '; + } + ?> + +
    목록
    그래프접속자수비율(%)
    합계100%
    +
    + +
    +
    자료가 없습니다.
    +
    + + diff --git a/bbs/_common.php b/bbs/_common.php new file mode 100644 index 000000000..b556cc9d3 --- /dev/null +++ b/bbs/_common.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/bbs/_head.php b/bbs/_head.php new file mode 100644 index 000000000..c9bf5a4fb --- /dev/null +++ b/bbs/_head.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/bbs/_head.sub.php b/bbs/_head.sub.php new file mode 100644 index 000000000..dc569a49e --- /dev/null +++ b/bbs/_head.sub.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/bbs/_tail.php b/bbs/_tail.php new file mode 100644 index 000000000..ab638fe9c --- /dev/null +++ b/bbs/_tail.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/bbs/_tail.sub.php b/bbs/_tail.sub.php new file mode 100644 index 000000000..7d695a4aa --- /dev/null +++ b/bbs/_tail.sub.php @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/bbs/ajax.autosave.php b/bbs/ajax.autosave.php new file mode 100644 index 000000000..cb31f0451 --- /dev/null +++ b/bbs/ajax.autosave.php @@ -0,0 +1,20 @@ + \ No newline at end of file diff --git a/bbs/ajax.autosavedel.php b/bbs/ajax.autosavedel.php new file mode 100644 index 000000000..1742fd408 --- /dev/null +++ b/bbs/ajax.autosavedel.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/bbs/ajax.autosavelist.php b/bbs/ajax.autosavelist.php new file mode 100644 index 000000000..b0ef3d1f9 --- /dev/null +++ b/bbs/ajax.autosavelist.php @@ -0,0 +1,21 @@ +\n"; +echo "\n"; +for ($i=0; $row=sql_fetch_array($result); $i++) { + $subject = htmlspecialchars(utf8_strcut($row['as_subject'], 25), ENT_QUOTES); + $datetime = substr($row['as_datetime'],2,14); + echo "\n"; + echo "{$row['as_id']}\n"; + echo "{$row['as_uid']}\n"; + echo "\n"; + echo "{$datetime}\n"; + echo "\n"; +} +echo ""; +?> \ No newline at end of file diff --git a/bbs/ajax.autosaveload.php b/bbs/ajax.autosaveload.php new file mode 100644 index 000000000..2e291990b --- /dev/null +++ b/bbs/ajax.autosaveload.php @@ -0,0 +1,18 @@ +\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +?> \ No newline at end of file diff --git a/bbs/ajax.filter.php b/bbs/ajax.filter.php new file mode 100644 index 000000000..e1c1d72ce --- /dev/null +++ b/bbs/ajax.filter.php @@ -0,0 +1,31 @@ + \ No newline at end of file diff --git a/bbs/ajax.mb_email.php b/bbs/ajax.mb_email.php new file mode 100644 index 000000000..6c50300cc --- /dev/null +++ b/bbs/ajax.mb_email.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/bbs/ajax.mb_hp.php b/bbs/ajax.mb_hp.php new file mode 100644 index 000000000..eeeef8816 --- /dev/null +++ b/bbs/ajax.mb_hp.php @@ -0,0 +1,10 @@ + \ No newline at end of file diff --git a/bbs/ajax.mb_id.php b/bbs/ajax.mb_id.php new file mode 100644 index 000000000..6b0badd06 --- /dev/null +++ b/bbs/ajax.mb_id.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/bbs/ajax.mb_nick.php b/bbs/ajax.mb_nick.php new file mode 100644 index 000000000..50a90f037 --- /dev/null +++ b/bbs/ajax.mb_nick.php @@ -0,0 +1,12 @@ + \ No newline at end of file diff --git a/bbs/ajax.mb_recommend.php b/bbs/ajax.mb_recommend.php new file mode 100644 index 000000000..c19470fa0 --- /dev/null +++ b/bbs/ajax.mb_recommend.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/bbs/alert.php b/bbs/alert.php new file mode 100644 index 000000000..f0669a491 --- /dev/null +++ b/bbs/alert.php @@ -0,0 +1,107 @@ +", $msg); + +if (!$url) $url = $_SERVER['HTTP_REFERER']; + +if($error) { + $header2 = "다음 항목에 오류가 있습니다."; +} else { + $header2 = "다음 내용을 확인해 주세요."; +} +?> + + + +
    + + \ No newline at end of file diff --git a/bbs/alert_close.php b/bbs/alert_close.php new file mode 100644 index 000000000..830b3c61f --- /dev/null +++ b/bbs/alert_close.php @@ -0,0 +1,61 @@ +", $msg); + +if($error) { + $header2 = "다음 항목에 오류가 있습니다."; + $msg3 = "새창을 닫으시고 이전 작업을 다시 시도해 주세요."; +} else { + $header2 = "다음 내용을 확인해 주세요."; + $msg3 = "새창을 닫으신 후 서비스를 이용해 주세요."; +} +?> + + + + + + \ No newline at end of file diff --git a/bbs/board.php b/bbs/board.php new file mode 100644 index 000000000..31e69fa53 --- /dev/null +++ b/bbs/board.php @@ -0,0 +1,242 @@ + ".$board['bo_subject']; +} else { + if ($member['mb_level'] < $board['bo_list_level']) { + if ($member['mb_id']) + alert('목록을 볼 권한이 없습니다.', G5_URL); + else + alert('목록을 볼 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.', './login.php?'.$qstr.'&url='.urlencode(G5_BBS_URL.'/board.php?bo_table='.$bo_table.($qstr?'&':''))); + } + + // 본인확인을 사용한다면 + if ($config['cf_cert_use'] && !$is_admin) { + // 인증된 회원만 가능 + if ($board['bo_use_cert'] != '' && $is_guest) { + alert('이 게시판은 본인확인 하신 회원님만 글읽기가 가능합니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.', './login.php?wr_id='.$wr_id.$qstr.'&url='.urlencode(G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&wr_id='.$wr_id.$qstr)); + } + + if ($board['bo_use_cert'] == 'cert' && !$member['mb_certify']) { + alert('이 게시판은 본인확인 하신 회원님만 글읽기가 가능합니다.\\n\\n회원정보 수정에서 본인확인을 해주시기 바랍니다.', G5_URL); + } + + if ($board['bo_use_cert'] == 'adult' && !$member['mb_adult']) { + alert('이 게시판은 본인확인으로 성인인증 된 회원님만 글읽기가 가능합니다.\\n\\n현재 성인인데 글읽기가 안된다면 회원정보 수정에서 본인확인을 다시 해주시기 바랍니다.', G5_URL); + } + + if ($board['bo_use_cert'] == 'hp-cert' && $member['mb_certify'] != 'hp') { + alert('이 게시판은 휴대폰 본인확인 하신 회원님만 글읽기가 가능합니다.\\n\\n회원정보 수정에서 휴대폰 본인확인을 해주시기 바랍니다.', G5_URL); + } + + if ($board['bo_use_cert'] == 'hp-adult' && (!$member['mb_adult'] || $member['mb_certify'] != 'hp')) { + alert('이 게시판은 휴대폰 본인확인으로 성인인증 된 회원님만 글읽기가 가능합니다.\\n\\n현재 성인인데 글읽기가 안된다면 회원정보 수정에서 휴대폰 본인확인을 다시 해주시기 바랍니다.', G5_URL); + } + } + + if (!isset($page) || (isset($page) && $page == 0)) $page = 1; + + $g5['title'] = $board['bo_subject']." ".$page." 페이지"; +} + +include_once(G5_PATH.'/head.sub.php'); + +$width = $board['bo_table_width']; +if ($width <= 100) + $width .= '%'; +else + $width .='px'; + +// IP보이기 사용 여부 +$ip = ""; +$is_ip_view = $board['bo_use_ip_view']; +if ($is_admin) { + $is_ip_view = true; + if (array_key_exists('wr_ip', $write)) { + $ip = $write['wr_ip']; + } +} else { + // 관리자가 아니라면 IP 주소를 감춘후 보여줍니다. + if (isset($write['wr_ip'])) { + $ip = preg_replace("/([0-9]+).([0-9]+).([0-9]+).([0-9]+)/", G5_IP_DISPLAY, $write['wr_ip']); + } +} + +// 분류 사용 +$is_category = false; +$category_name = ''; +if ($board['bo_use_category']) { + $is_category = true; + if (array_key_exists('ca_name', $write)) { + $category_name = $write['ca_name']; // 분류명 + } +} + +// 추천 사용 +$is_good = false; +if ($board['bo_use_good']) + $is_good = true; + +// 비추천 사용 +$is_nogood = false; +if ($board['bo_use_nogood']) + $is_nogood = true; + +$admin_href = ""; +// 최고관리자 또는 그룹관리자라면 +if ($member['mb_id'] && ($is_admin == 'super' || $group['gr_admin'] == $member['mb_id'])) + $admin_href = G5_ADMIN_URL.'/board_form.php?w=u&bo_table='.$bo_table; + +include_once('./board_head.php'); + +// 게시물 아이디가 있다면 게시물 보기를 INCLUDE +if (isset($wr_id) && $wr_id) { + include_once('./view.php'); +} + +// 전체목록보이기 사용이 "예" 또는 wr_id 값이 없다면 목록을 보임 +//if ($board['bo_use_list_view'] || empty($wr_id)) +if ($member['mb_level'] >= $board['bo_list_level'] && $board['bo_use_list_view'] || empty($wr_id)) + include_once ('./list.php'); + +include_once('./board_tail.php'); + +echo "\n\n"; + +include_once(G5_PATH.'/tail.sub.php'); +?> diff --git a/bbs/board_head.php b/bbs/board_head.php new file mode 100644 index 000000000..047a592ad --- /dev/null +++ b/bbs/board_head.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/bbs/board_list_update.php b/bbs/board_list_update.php new file mode 100644 index 000000000..a43924024 --- /dev/null +++ b/bbs/board_list_update.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/bbs/board_tail.php b/bbs/board_tail.php new file mode 100644 index 000000000..408d56625 --- /dev/null +++ b/bbs/board_tail.php @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/bbs/confirm.php b/bbs/confirm.php new file mode 100644 index 000000000..cba013226 --- /dev/null +++ b/bbs/confirm.php @@ -0,0 +1,35 @@ + + + + + + + \ No newline at end of file diff --git a/bbs/content.php b/bbs/content.php new file mode 100644 index 000000000..a8ba46f2a --- /dev/null +++ b/bbs/content.php @@ -0,0 +1,99 @@ +관리자 모드에서 게시판관리->내용 관리를 먼저 확인해 주세요.'); +} + +if (G5_IS_MOBILE) { + include_once(G5_MOBILE_PATH.'/content.php'); + return; +} + +// 내용 +$sql = " select * from {$g5['content_table']} where co_id = '$co_id' "; +$co = sql_fetch($sql); +if (!$co['co_id']) + alert('등록된 내용이 없습니다.'); + +$g5['title'] = $co['co_subject']; + +if ($co['co_include_head']) + @include_once($co['co_include_head']); +else + include_once('./_head.php'); + +$str = conv_content($co['co_content'], $co['co_html'], $co['co_tag_filter_use']); + +// $src 를 $dst 로 변환 +unset($src); +unset($dst); +$src[] = "/{{쇼핑몰명}}|{{홈페이지제목}}/"; +//$dst[] = $default[de_subject]; +$dst[] = $config['cf_title']; +$src[] = "/{{회사명}}|{{상호}}/"; +$dst[] = $default['de_admin_company_name']; +$src[] = "/{{대표자명}}/"; +$dst[] = $default['de_admin_company_owner']; +$src[] = "/{{사업자등록번호}}/"; +$dst[] = $default['de_admin_company_saupja_no']; +$src[] = "/{{대표전화번호}}/"; +$dst[] = $default['de_admin_company_tel']; +$src[] = "/{{팩스번호}}/"; +$dst[] = $default['de_admin_company_fax']; +$src[] = "/{{통신판매업신고번호}}/"; +$dst[] = $default['de_admin_company_tongsin_no']; +$src[] = "/{{사업장우편번호}}/"; +$dst[] = $default['de_admin_company_zip']; +$src[] = "/{{사업장주소}}/"; +$dst[] = $default['de_admin_company_addr']; +$src[] = "/{{운영자명}}|{{관리자명}}/"; +$dst[] = $default['de_admin_name']; +$src[] = "/{{운영자e-mail}}|{{관리자e-mail}}/i"; +$dst[] = $default['de_admin_email']; +$src[] = "/{{정보관리책임자명}}/"; +$dst[] = $default['de_admin_info_name']; +$src[] = "/{{정보관리책임자e-mail}}|{{정보책임자e-mail}}/i"; +$dst[] = $default['de_admin_info_email']; + +$str = preg_replace($src, $dst, $str); + +if ($is_admin) + echo ''; +?> + + +'; +?> + +
    +
    +

    +
    + +
    + +
    + +
    + +'; + +if ($is_admin) + echo ''; +?> + + + diff --git a/bbs/current_connect.php b/bbs/current_connect.php new file mode 100644 index 000000000..686522564 --- /dev/null +++ b/bbs/current_connect.php @@ -0,0 +1,32 @@ + '{$config['cf_admin']}' + order by a.lo_datetime desc "; +$result = sql_query($sql); +for ($i=0; $row=sql_fetch_array($result); $i++) { + $list[$i] = $row; + + if ($row['mb_id']) { + $list[$i]['name'] = get_sideview($row['mb_id'], cut_str($row['mb_nick'], $config['cf_cut_name']), $row['mb_email'], $row['mb_homepage']); + } else { + if ($is_admin) + $list[$i]['name'] = $row['lo_ip']; + else + $list[$i]['name'] = preg_replace("/([0-9]+).([0-9]+).([0-9]+).([0-9]+)/", G5_IP_DISPLAY, $row['lo_ip']); + } + + $list[$i]['num'] = sprintf('%03d',$i+1); +} + +include_once($connect_skin_path.'/current_connect.skin.php'); + +include_once('./_tail.php'); +?> \ No newline at end of file diff --git a/bbs/db_table.optimize.php b/bbs/db_table.optimize.php new file mode 100644 index 000000000..f676ce4ef --- /dev/null +++ b/bbs/db_table.optimize.php @@ -0,0 +1,57 @@ += G5_TIME_YMD) + return; + +// 설정일이 지난 접속자로그 삭제 +if($config['cf_visit_del'] > 0) { + $tmp_before_date = date("Y-m-d", G5_SERVER_TIME - ($config['cf_visit_del'] * 86400)); + $sql = " delete from {$g5['visit_table']} where vi_date < '$tmp_before_date' "; + sql_query($sql); + sql_query(" OPTIMIZE TABLE `{$g5['visit_table']}`, `{$g5['visit_sum_table']}` "); +} + +// 설정일이 지난 인기검색어 삭제 +if($config['cf_popular_del'] > 0) { + $tmp_before_date = date("Y-m-d", G5_SERVER_TIME - ($config['cf_popular_del'] * 86400)); + $sql = " delete from {$g5['popular_table']} where pp_date < '$tmp_before_date' "; + sql_query($sql); + sql_query(" OPTIMIZE TABLE `{$g5['popular_table']}` "); +} + +// 설정일이 지난 최근게시물 삭제 +if($config['cf_new_del'] > 0) { + $sql = " delete from {$g5['board_new_table']} where (TO_DAYS('".G5_TIME_YMDHIS."') - TO_DAYS(bn_datetime)) > '{$config['cf_new_del']}' "; + sql_query($sql); + sql_query(" OPTIMIZE TABLE `{$g5['board_new_table']}` "); +} + +// 설정일이 지난 쪽지 삭제 +if($config['cf_memo_del'] > 0) { + $sql = " delete from {$g5['memo_table']} where (TO_DAYS('".G5_TIME_YMDHIS."') - TO_DAYS(me_send_datetime)) > '{$config['cf_memo_del']}' "; + sql_query($sql); + sql_query(" OPTIMIZE TABLE `{$g5['memo_table']}` "); +} + +// 탈퇴회원 자동 삭제 +if($config['cf_leave_day'] > 0) { + $sql = " select mb_id from {$g5['member_table']} where (TO_DAYS('".G5_TIME_YMDHIS."') - TO_DAYS(mb_leave_date)) > '{$config['cf_leave_day']}' "; + $result = sql_query($sql); + while ($row=sql_fetch_array($result)) + { + // 회원자료 삭제 + member_delete($row['mb_id']); + } +} + +// 실행일 기록 +if(isset($config['cf_optimize_date'])) { + sql_query(" update {$g5['config_table']} set cf_optimize_date = '".G5_TIME_YMD."' "); +} +?> \ No newline at end of file diff --git a/bbs/delete.php b/bbs/delete.php new file mode 100644 index 000000000..fcb617436 --- /dev/null +++ b/bbs/delete.php @@ -0,0 +1,142 @@ + '{$write['wr_id']}' + and wr_num = '{$write['wr_num']}' + and wr_is_comment = 0 "; +$row = sql_fetch($sql); +if ($row['cnt'] && !$is_admin) + alert('이 글과 관련된 답변글이 존재하므로 삭제 할 수 없습니다.\\n\\n우선 답변글부터 삭제하여 주십시오.'); + +// 코멘트 달린 원글의 삭제 여부 +$sql = " select count(*) as cnt from $write_table + where wr_parent = '$wr_id' + and mb_id <> '{$member['mb_id']}' + and wr_is_comment = 1 "; +$row = sql_fetch($sql); +if ($row['cnt'] >= $board['bo_count_delete'] && !$is_admin) + alert('이 글과 관련된 코멘트가 존재하므로 삭제 할 수 없습니다.\\n\\n코멘트가 '.$board['bo_count_delete'].'건 이상 달린 원글은 삭제할 수 없습니다.'); + + +// 사용자 코드 실행 +@include_once($board_skin_path.'/delete.skin.php'); + + +// 나라오름님 수정 : 원글과 코멘트수가 정상적으로 업데이트 되지 않는 오류를 잡아 주셨습니다. +//$sql = " select wr_id, mb_id, wr_comment from $write_table where wr_parent = '$write[wr_id]' order by wr_id "; +$sql = " select wr_id, mb_id, wr_is_comment, wr_content from $write_table where wr_parent = '{$write['wr_id']}' order by wr_id "; +$result = sql_query($sql); +while ($row = sql_fetch_array($result)) +{ + // 원글이라면 + if (!$row['wr_is_comment']) + { + // 원글 포인트 삭제 + if (!delete_point($row['mb_id'], $bo_table, $row['wr_id'], '쓰기')) + insert_point($row['mb_id'], $board['bo_write_point'] * (-1), "{$board['bo_subject']} {$row['wr_id']} 글삭제"); + + // 업로드된 파일이 있다면 파일삭제 + $sql2 = " select * from {$g5['board_file_table']} where bo_table = '$bo_table' and wr_id = '{$row['wr_id']}' "; + $result2 = sql_query($sql2); + while ($row2 = sql_fetch_array($result2)) { + @unlink(G5_DATA_PATH.'/file/'.$bo_table.'/'.$row2['bf_file']); + // 썸네일삭제 + if(preg_match("/\.({$config['cf_image_extension']})$/i", $row2['bf_file'])) { + delete_board_thumbnail($bo_table, $row2['bf_file']); + } + } + + // 에디터 썸네일 삭제 + delete_editor_thumbnail($row['wr_content']); + + // 파일테이블 행 삭제 + sql_query(" delete from {$g5['board_file_table']} where bo_table = '$bo_table' and wr_id = '{$row['wr_id']}' "); + + // syndication ping + if(G5_SYNDI_USE) + include G5_SYNDI_PATH.'/include/include.bbs.delete.php'; + + $count_write++; + } + else + { + // 코멘트 포인트 삭제 + if (!delete_point($row['mb_id'], $bo_table, $row['wr_id'], '댓글')) + insert_point($row['mb_id'], $board['bo_comment_point'] * (-1), "{$board['bo_subject']} {$write['wr_id']}-{$row['wr_id']} 댓글삭제"); + + $count_comment++; + } +} + +// 게시글 삭제 +sql_query(" delete from $write_table where wr_parent = '{$write['wr_id']}' "); + +// 최근게시물 삭제 +sql_query(" delete from {$g5['board_new_table']} where bo_table = '$bo_table' and wr_parent = '{$write['wr_id']}' "); + +// 스크랩 삭제 +sql_query(" delete from {$g5['scrap_table']} where bo_table = '$bo_table' and wr_id = '{$write['wr_id']}' "); + +/* +// 공지사항 삭제 +$notice_array = explode("\n", trim($board['bo_notice'])); +$bo_notice = ""; +for ($k=0; $k 0 || $count_comment > 0) + sql_query(" update {$g5['board_table']} set bo_count_write = bo_count_write - '$count_write', bo_count_comment = bo_count_comment - '$count_comment' where bo_table = '$bo_table' "); + +@include_once($board_skin_path.'/delete.tail.skin.php'); + +delete_cache_latest($bo_table); + +goto_url('./board.php?bo_table='.$bo_table.'&page='.$page.$qstr); +?> diff --git a/bbs/delete_all.php b/bbs/delete_all.php new file mode 100644 index 000000000..3bfd376cd --- /dev/null +++ b/bbs/delete_all.php @@ -0,0 +1,158 @@ +=0; $i--) +{ + $write = sql_fetch(" select * from $write_table where wr_id = '$tmp_array[$i]' "); + + if ($is_admin == 'super') // 최고관리자 통과 + ; + else if ($is_admin == 'group') // 그룹관리자 + { + $mb = get_member($write['mb_id']); + if ($member['mb_id'] == $group['gr_admin']) // 자신이 관리하는 그룹인가? + { + if ($member['mb_level'] >= $mb['mb_level']) // 자신의 레벨이 크거나 같다면 통과 + ; + else + continue; + } + else + continue; + } + else if ($is_admin == 'board') // 게시판관리자이면 + { + $mb = get_member($write['mb_id']); + if ($member['mb_id'] == $board['bo_admin']) // 자신이 관리하는 게시판인가? + if ($member['mb_level'] >= $mb['mb_level']) // 자신의 레벨이 크거나 같다면 통과 + ; + else + continue; + else + continue; + } + else if ($member['mb_id'] && $member['mb_id'] == $write['mb_id']) // 자신의 글이라면 + { + ; + } + else if ($wr_password && !$write['mb_id'] && sql_password($wr_password) == $write['wr_password']) // 비밀번호가 같다면 + { + ; + } + else + continue; // 나머지는 삭제 불가 + + $len = strlen($write['wr_reply']); + if ($len < 0) $len = 0; + $reply = substr($write['wr_reply'], 0, $len); + + // 원글만 구한다. + $sql = " select count(*) as cnt from $write_table + where wr_reply like '$reply%' + and wr_id <> '{$write['wr_id']}' + and wr_num = '{$write['wr_num']}' + and wr_is_comment = 0 "; + $row = sql_fetch($sql); + if ($row['cnt']) + continue; + + // 나라오름님 수정 : 원글과 코멘트수가 정상적으로 업데이트 되지 않는 오류를 잡아 주셨습니다. + //$sql = " select wr_id, mb_id, wr_comment from {$write_table} where wr_parent = '{$write[wr_id]}' order by wr_id "; + $sql = " select wr_id, mb_id, wr_is_comment, wr_content from $write_table where wr_parent = '{$write['wr_id']}' order by wr_id "; + $result = sql_query($sql); + while ($row = sql_fetch_array($result)) + { + // 원글이라면 + if (!$row['wr_is_comment']) + { + // 원글 포인트 삭제 + if (!delete_point($row['mb_id'], $bo_table, $row['wr_id'], '쓰기')) + insert_point($row['mb_id'], $board['bo_write_point'] * (-1), "{$board['bo_subject']} {$row['wr_id']} 글 삭제"); + + // 업로드된 파일이 있다면 + $sql2 = " select * from {$g5['board_file_table']} where bo_table = '$bo_table' and wr_id = '{$row['wr_id']}' "; + $result2 = sql_query($sql2); + while ($row2 = sql_fetch_array($result2)) { + // 파일삭제 + @unlink(G5_DATA_PATH.'/file/'.$bo_table.'/'.$row2['bf_file']); + + // 썸네일삭제 + if(preg_match("/\.({$config['cf_image_extension']})$/i", $row2['bf_file'])) { + delete_board_thumbnail($bo_table, $row2['bf_file']); + } + } + + // 에디터 썸네일 삭제 + delete_editor_thumbnail($row['wr_content']); + + // 파일테이블 행 삭제 + sql_query(" delete from {$g5['board_file_table']} where bo_table = '$bo_table' and wr_id = '{$row['wr_id']}' "); + + // syndication ping + if(G5_SYNDI_USE) + include G5_SYNDI_PATH.'/include/include.bbs.delete_all.php'; + + $count_write++; + } + else + { + // 코멘트 포인트 삭제 + if (!delete_point($row['mb_id'], $bo_table, $row['wr_id'], '댓글')) + insert_point($row['mb_id'], $board['bo_comment_point'] * (-1), "{$board['bo_subject']} {$write['wr_id']}-{$row['wr_id']} 댓글삭제"); + + $count_comment++; + } + } + + // 게시글 삭제 + sql_query(" delete from $write_table where wr_parent = '{$write['wr_id']}' "); + + // 최근게시물 삭제 + sql_query(" delete from {$g5['board_new_table']} where bo_table = '$bo_table' and wr_parent = '{$write['wr_id']}' "); + + // 스크랩 삭제 + sql_query(" delete from {$g5['scrap_table']} where bo_table = '$bo_table' and wr_id = '{$write['wr_id']}' "); + + /* + // 공지사항 삭제 + $notice_array = explode(',', trim($board['bo_notice'])); + $bo_notice = ""; + for ($k=0; $k 0 || $count_comment > 0) + sql_query(" update {$g5['board_table']} set bo_count_write = bo_count_write - '$count_write', bo_count_comment = bo_count_comment - '$count_comment' where bo_table = '$bo_table' "); + +// 4.11 +@include_once($board_skin_path.'/delete_all.tail.skin.php'); + +delete_cache_latest($bo_table); + +goto_url('./board.php?bo_table='.$bo_table.'&page='.$page.$qstr); +?> diff --git a/bbs/delete_comment.php b/bbs/delete_comment.php new file mode 100644 index 000000000..7055c0955 --- /dev/null +++ b/bbs/delete_comment.php @@ -0,0 +1,88 @@ += $mb['mb_level']) // 자신의 레벨이 크거나 같다면 통과 + ; + else + alert('그룹관리자의 권한보다 높은 회원의 코멘트이므로 삭제할 수 없습니다.'); + } else + alert('자신이 관리하는 그룹의 게시판이 아니므로 코멘트를 삭제할 수 없습니다.'); +} else if ($is_admin == 'board') { // 게시판관리자이면 + $mb = get_member($write['mb_id']); + if ($member['mb_id'] == $board['bo_admin']) { // 자신이 관리하는 게시판인가? + if ($member['mb_level'] >= $mb['mb_level']) // 자신의 레벨이 크거나 같다면 통과 + ; + else + alert('게시판관리자의 권한보다 높은 회원의 코멘트이므로 삭제할 수 없습니다.'); + } else + alert('자신이 관리하는 게시판이 아니므로 코멘트를 삭제할 수 없습니다.'); +} else if ($member['mb_id']) { + if ($member['mb_id'] != $write['mb_id']) + alert('자신의 글이 아니므로 삭제할 수 없습니다.'); +} else { + if (sql_password($wr_password) != $write['wr_password']) + alert('비밀번호가 틀립니다.'); +} + +$len = strlen($write['wr_comment_reply']); +if ($len < 0) $len = 0; +$comment_reply = substr($write['wr_comment_reply'], 0, $len); + +$sql = " select count(*) as cnt from {$write_table} + where wr_comment_reply like '{$comment_reply}%' + and wr_id <> '{$comment_id}' + and wr_parent = '{$write[wr_parent]}' + and wr_comment = '{$write[wr_comment]}' + and wr_is_comment = 1 "; +$row = sql_fetch($sql); +if ($row['cnt'] && !$is_admin) + alert('이 코멘트와 관련된 답변코멘트가 존재하므로 삭제 할 수 없습니다.'); + +// 코멘트 포인트 삭제 +if (!delete_point($write['mb_id'], $bo_table, $comment_id, '댓글')) + insert_point($write['mb_id'], $board['bo_comment_point'] * (-1), "{$board['bo_subject']} {$write['wr_parent']}-{$comment_id} 댓글삭제"); + +// 코멘트 삭제 +sql_query(" delete from {$write_table} where wr_id = '{$comment_id}' "); + +// 코멘트가 삭제되므로 해당 게시물에 대한 최근 시간을 다시 얻는다. +$sql = " select max(wr_datetime) as wr_last from {$write_table} where wr_parent = '{$write['wr_parent']}' "; +$row = sql_fetch($sql); + +// 원글의 코멘트 숫자를 감소 +sql_query(" update {$write_table} set wr_comment = wr_comment - 1, wr_last = '{$row['wr_last']}' where wr_id = '{$write['wr_parent']}' "); + +// 코멘트 숫자 감소 +sql_query(" update {$g5['board_table']} set bo_count_comment = bo_count_comment - 1 where bo_table = '{$bo_table}' "); + +// 새글 삭제 +sql_query(" delete from {$g5['board_new_table']} where bo_table = '{$bo_table}' and wr_id = '{$comment_id}' "); + +// 사용자 코드 실행 +@include_once($board_skin_path.'/delete_comment.skin.php'); +@include_once($board_skin_path.'/delete_comment.tail.skin.php'); + +delete_cache_latest($bo_table); + +goto_url('./board.php?bo_table='.$bo_table.'&wr_id='.$write['wr_parent'].'&page='.$page. $qstr); +?> diff --git a/bbs/download.php b/bbs/download.php new file mode 100644 index 000000000..e83a21e69 --- /dev/null +++ b/bbs/download.php @@ -0,0 +1,121 @@ += 1) // 회원이상 다운로드가 가능하다면 + { + // 다운로드 포인트가 음수이고 회원의 포인트가 0 이거나 작다면 + if ($member['mb_point'] + $board['bo_download_point'] < 0) + alert('보유하신 포인트('.number_format($member['mb_point']).')가 없거나 모자라서 다운로드('.number_format($board['bo_download_point']).')가 불가합니다.\\n\\n포인트를 적립하신 후 다시 다운로드 해 주십시오.'); + + // 게시물당 한번만 차감하도록 수정 + insert_point($member['mb_id'], $board['bo_download_point'], "{$board['bo_subject']} $wr_id 파일 다운로드", $bo_table, $wr_id, "다운로드"); + } + + // 다운로드 카운트 증가 + $sql = " update {$g5['board_file_table']} set bf_download = bf_download + 1 where bo_table = '$bo_table' and wr_id = '$wr_id' and bf_no = '$no' "; + sql_query($sql); + + set_session($ss_name, TRUE); +} + +$g5['title'] = '다운로드 > '.conv_subject($write['wr_subject'], 255); + +$original = urlencode($file['bf_source']); + +@include_once($board_skin_path.'/download.tail.skin.php'); + +if(preg_match("/msie/i", $_SERVER['HTTP_USER_AGENT']) && preg_match("/5\.5/", $_SERVER['HTTP_USER_AGENT'])) { + header("content-type: doesn/matter"); + header("content-length: ".filesize("$filepath")); + header("content-disposition: attachment; filename=\"$original\""); + header("content-transfer-encoding: binary"); +} else { + header("content-type: file/unknown"); + header("content-length: ".filesize("$filepath")); + header("content-disposition: attachment; filename=\"$original\""); + header("content-description: php generated data"); +} +header("pragma: no-cache"); +header("expires: 0"); +flush(); + +$fp = fopen($filepath, 'rb'); + +// 4.00 대체 +// 서버부하를 줄이려면 print 나 echo 또는 while 문을 이용한 방법보다는 이방법이... +//if (!fpassthru($fp)) { +// fclose($fp); +//} + +$download_rate = 10; + +while(!feof($fp)) { + //echo fread($fp, 100*1024); + /* + echo fread($fp, 100*1024); + flush(); + */ + + print fread($fp, round($download_rate * 1024)); + flush(); + usleep(1000); +} +fclose ($fp); +flush(); +?> diff --git a/bbs/email_certify.php b/bbs/email_certify.php new file mode 100644 index 000000000..ae50f7356 --- /dev/null +++ b/bbs/email_certify.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/bbs/email_stop.php b/bbs/email_stop.php new file mode 100644 index 000000000..3635bb361 --- /dev/null +++ b/bbs/email_stop.php @@ -0,0 +1,19 @@ + \ No newline at end of file diff --git a/bbs/faq.php b/bbs/faq.php new file mode 100644 index 000000000..d3fe9406e --- /dev/null +++ b/bbs/faq.php @@ -0,0 +1,104 @@ +관리자 모드에서 게시판관리->FAQ관리를 먼저 확인해 주세요.'); +} + +// FAQ MASTER +$faq_master_list = array(); +$sql = " select * from {$g5['faq_master_table']} order by fm_order,fm_id "; +$result = sql_query($sql); +while ($row=sql_fetch_array($result)) +{ + $key = $row['fm_id']; + if (!$fm_id) $fm_id = $key; + $faq_master_list[$key] = $row; +} + +if ($fm_id){ + $qstr .= '&fm_id=' . $fm_id; // 마스터faq key_id +} + +$fm = $faq_master_list[$fm_id]; +if (!$fm['fm_id']) + alert('등록된 내용이 없습니다.'); + +$g5['title'] = $fm['fm_subject']; + +if(G5_IS_MOBILE){ + $faq_skin = $config['cf_mobile_faq_skin']; +} else { + $faq_skin = $config['cf_faq_skin']; +} + +if(!$faq_skin) $faq_skin = 'basic'; +$faq_skin_path = (G5_IS_MOBILE ? G5_MOBILE_PATH : G5_PATH).'/'.G5_SKIN_DIR.'/faq/'.$faq_skin; +$faq_skin_url = (G5_IS_MOBILE ? G5_MOBILE_URL : G5_URL).'/'.G5_SKIN_DIR.'/faq/'.$faq_skin; +$skin_file = $faq_skin_path.'/list.skin.php'; + +include_once('./_head.php'); + +if(is_file($skin_file)) { + $admin_href = ''; + $himg_src = ''; + $timg_src = ''; + if($is_admin) + $admin_href = G5_ADMIN_URL.'/faqmasterform.php?w=u&fm_id='.$fm_id; + + if(!G5_IS_MOBILE) { + $himg = G5_DATA_PATH.'/faq/'.$fm_id.'_h'; + if (is_file($himg)){ + $himg_src = G5_DATA_URL.'/faq/'.$fm_id.'_h'; + } + + $timg = G5_DATA_PATH.'/faq/'.$fm_id.'_t'; + if (is_file($timg)){ + $timg_src = G5_DATA_URL.'/faq/'.$fm_id.'_t'; + } + } + + $category_href = G5_BBS_URL.'/faq.php'; + $category_stx = ''; + $faq_list = array(); + + $stx = trim($stx); + $sql_search = ''; + + if($stx) { + $sql_search = " and ( INSTR(fa_subject, '$stx') > 0 or INSTR(fa_content, '$stx') > 0 ) "; + $category_stx = '&stx='.$stx; + } + + if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지) + + $page_rows = G5_IS_MOBILE ? $config['cf_mobile_page_rows'] : $config['cf_page_rows']; + + $sql = " select count(*) as cnt + from {$g5['faq_table']} + where fm_id = '$fm_id' + $sql_search "; + $total = sql_fetch($sql); + $total_count = $total['cnt']; + + $total_page = ceil($total_count / $page_rows); // 전체 페이지 계산 + $from_record = ($page - 1) * $page_rows; // 시작 열을 구함 + + $sql = " select * + from {$g5['faq_table']} + where fm_id = '$fm_id' + $sql_search + order by fa_order , fa_id + limit $from_record, $page_rows "; + $result = sql_query($sql); + while ($row=sql_fetch_array($result)){ + $faq_list[] = $row; + } + include_once($skin_file); +} else { + echo '

    '.str_replace(G5_PATH.'/', '', $skin_file).'이 존재하지 않습니다.

    '; +} + +include_once('./_tail.php'); +?> diff --git a/bbs/formmail.php b/bbs/formmail.php new file mode 100644 index 000000000..4b2d24aff --- /dev/null +++ b/bbs/formmail.php @@ -0,0 +1,43 @@ + 3) + alert_close('한번 접속후 일정수의 메일만 발송할 수 있습니다.\\n\\n계속해서 메일을 보내시려면 다시 로그인 또는 접속하여 주십시오.'); + +$g5['title'] = '메일 쓰기'; +include_once(G5_PATH.'/head.sub.php'); + +if (!$name) + $name = base64_decode($email); + +if (!isset($type)) + $type = 0; + +$type_checked[0] = $type_checked[1] = $type_checked[2] = ""; +$type_checked[$type] = 'checked'; + +include_once($member_skin_path.'/formmail.skin.php'); + +include_once(G5_PATH.'/tail.sub.php'); +?> diff --git a/bbs/formmail_send.php b/bbs/formmail_send.php new file mode 100644 index 000000000..472b1e5d2 --- /dev/null +++ b/bbs/formmail_send.php @@ -0,0 +1,51 @@ + 1) + alert_close('한번에 한사람에게만 메일을 발송할 수 있습니다.'); + + +if (!chk_captcha()) { + alert('자동등록방지 숫자가 틀렸습니다.'); +} + + +for ($i=1; $i<=$attach; $i++) { + if ($_FILES['file'.$i]['name']) + $file[] = attach_file($_FILES['file'.$i]['name'], $_FILES['file'.$i]['tmp_name']); +} + +$content = stripslashes($content); +if ($type == 2) { + $type = 1; + $content = str_replace("\n", "
    ", $content); +} + +// html 이면 +if ($type) { + $current_url = G5_URL; + $mail_content = '메일보내기'.$content.''; +} +else + $mail_content = $content; + +mailer($fnick, $fmail, $to, $subject, $mail_content, $type, $file); + +//$html_title = $tmp_to . "님께 메일발송"; +$html_title = '메일 발송중'; +include_once(G5_PATH.'/head.sub.php'); + +alert_close('메일을 정상적으로 발송하였습니다.'); + +include_once(G5_PATH.'/tail.sub.php'); +?> \ No newline at end of file diff --git a/bbs/good.php b/bbs/good.php new file mode 100644 index 000000000..b18806c00 --- /dev/null +++ b/bbs/good.php @@ -0,0 +1,155 @@ + \ No newline at end of file diff --git a/bbs/group.php b/bbs/group.php new file mode 100644 index 000000000..6b0ed8441 --- /dev/null +++ b/bbs/group.php @@ -0,0 +1,49 @@ + + + + + 'mobile' "; +if(!$is_admin) + $sql .= " and bo_use_cert = '' "; +$sql .= " order by bo_order "; +$result = sql_query($sql); +for ($i=0; $row=sql_fetch_array($result); $i++) { + $lt_style = ""; + if ($i%2==1) $lt_style = "margin-left:20px"; + else $lt_style = ""; +?> +
    + +
    + + + + diff --git a/bbs/link.php b/bbs/link.php new file mode 100644 index 000000000..e74536ca9 --- /dev/null +++ b/bbs/link.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/bbs/list.php b/bbs/list.php new file mode 100644 index 000000000..b7d37a50c --- /dev/null +++ b/bbs/list.php @@ -0,0 +1,232 @@ +'; + } +} + +$sop = strtolower($sop); +if ($sop != 'and' && $sop != 'or') + $sop = 'and'; + +// 분류 선택 또는 검색어가 있다면 +$stx = trim($stx); +if ($sca || $stx) { + $sql_search = get_sql_search($sca, $sfl, $stx, $sop); + + // 가장 작은 번호를 얻어서 변수에 저장 (하단의 페이징에서 사용) + $sql = " select MIN(wr_num) as min_wr_num from {$write_table} "; + $row = sql_fetch($sql); + $min_spt = (int)$row['min_wr_num']; + + if (!$spt) $spt = $min_spt; + + $sql_search .= " and (wr_num between {$spt} and ({$spt} + {$config['cf_search_part']})) "; + + // 원글만 얻는다. (코멘트의 내용도 검색하기 위함) + $sql = " select distinct wr_parent from {$write_table} where {$sql_search} "; + $result = sql_query($sql); + $total_count = mysql_num_rows($result); +} else { + $sql_search = ""; + + $total_count = $board['bo_count_write']; +} + +if(G5_IS_MOBILE) { + $page_rows = $board['bo_mobile_page_rows']; + $list_page_rows = $board['bo_mobile_page_rows']; +} else { + $page_rows = $board['bo_page_rows']; + $list_page_rows = $board['bo_page_rows']; +} + +if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지) + +// 년도 2자리 +$today2 = G5_TIME_YMD; + +$list = array(); +$i = 0; +$notice_count = 0; +$notice_array = array(); + +// 공지 처리 +if (!$sca && !$stx) { + $arr_notice = explode(',', trim($board['bo_notice'])); + $from_notice_idx = ($page - 1) * $page_rows; + if($from_notice_idx < 0) + $from_notice_idx = 0; + $board_notice_count = count($arr_notice); + + for ($k=0; $k<$board_notice_count; $k++) { + if (trim($arr_notice[$k]) == '') continue; + + $row = sql_fetch(" select * from {$write_table} where wr_id = '{$arr_notice[$k]}' "); + + if (!$row['wr_id']) continue; + + $notice_array[] = $row['wr_id']; + + if($k < $from_notice_idx) continue; + + $list[$i] = get_list($row, $board, $board_skin_url, G5_IS_MOBILE ? $board['bo_mobile_subject_len'] : $board['bo_subject_len']); + $list[$i]['is_notice'] = true; + + $i++; + $notice_count++; + + if($notice_count >= $list_page_rows) + break; + } +} + +$total_page = ceil($total_count / $page_rows); // 전체 페이지 계산 +$from_record = ($page - 1) * $page_rows; // 시작 열을 구함 + +// 공지글이 있으면 변수에 반영 +if(!empty($notice_array)) { + $from_record -= count($notice_array); + + if($from_record < 0) + $from_record = 0; + + if($notice_count > 0) + $page_rows -= $notice_count; + + if($page_rows < 0) + $page_rows = $list_page_rows; +} + +// 관리자라면 CheckBox 보임 +$is_checkbox = false; +if ($is_member && ($is_admin == 'super' || $group['gr_admin'] == $member['mb_id'] || $board['bo_admin'] == $member['mb_id'])) + $is_checkbox = true; + +// 정렬에 사용하는 QUERY_STRING +$qstr2 = 'bo_table='.$bo_table.'&sop='.$sop; + +// 0 으로 나눌시 오류를 방지하기 위하여 값이 없으면 1 로 설정 +$bo_gallery_cols = $board['bo_gallery_cols'] ? $board['bo_gallery_cols'] : 1; +$td_width = (int)(100 / $bo_gallery_cols); + +// 정렬 +// 인덱스 필드가 아니면 정렬에 사용하지 않음 +//if (!$sst || ($sst && !(strstr($sst, 'wr_id') || strstr($sst, "wr_datetime")))) { +if (!$sst) { + if ($board['bo_sort_field']) { + $sst = $board['bo_sort_field']; + } else { + $sst = "wr_num, wr_reply"; + $sod = ""; + } +} else { + // 게시물 리스트의 정렬 대상 필드가 아니라면 공백으로 (nasca 님 09.06.16) + // 리스트에서 다른 필드로 정렬을 하려면 아래의 코드에 해당 필드를 추가하세요. + // $sst = preg_match("/^(wr_subject|wr_datetime|wr_hit|wr_good|wr_nogood)$/i", $sst) ? $sst : ""; + $sst = preg_match("/^(wr_datetime|wr_hit|wr_good|wr_nogood)$/i", $sst) ? $sst : ""; +} + +if ($sst) { + $sql_order = " order by {$sst} {$sod} "; +} + +if ($sca || $stx) { + $sql = " select distinct wr_parent from {$write_table} where {$sql_search} {$sql_order} limit {$from_record}, $page_rows "; +} else { + $sql = " select * from {$write_table} where wr_is_comment = 0 "; + if(!empty($notice_array)) + $sql .= " and wr_id not in (".implode(', ', $notice_array).") "; + $sql .= " {$sql_order} limit {$from_record}, $page_rows "; +} + +// 페이지의 공지개수가 목록수 보다 작을 때만 실행 +if($page_rows > 0) { + $result = sql_query($sql); + + $k = 0; + + while ($row = sql_fetch_array($result)) + { + // 검색일 경우 wr_id만 얻었으므로 다시 한행을 얻는다 + if ($sca || $stx) + $row = sql_fetch(" select * from {$write_table} where wr_id = '{$row['wr_parent']}' "); + + $list[$i] = get_list($row, $board, $board_skin_url, G5_IS_MOBILE ? $board['bo_mobile_subject_len'] : $board['bo_subject_len']); + if (strstr($sfl, 'subject')) { + $list[$i]['subject'] = search_font($stx, $list[$i]['subject']); + } + $list[$i]['is_notice'] = false; + $list_num = $total_count - ($page - 1) * $list_page_rows - $notice_count; + $list[$i]['num'] = $list_num - $k; + + $i++; + $k++; + } +} + +$write_pages = get_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $page, $total_page, './board.php?bo_table='.$bo_table.$qstr.'&page='); + +$list_href = ''; +$prev_part_href = ''; +$next_part_href = ''; +if ($sca || $stx) { + $list_href = './board.php?bo_table='.$bo_table; + + //if ($prev_spt >= $min_spt) + $prev_spt = $spt - $config['cf_search_part']; + if (isset($min_spt) && $prev_spt >= $min_spt) { + $prev_part_href = './board.php?bo_table='.$bo_table.$qstr.'&spt='.$prev_spt.'&page=1'; + $write_pages = page_insertbefore($write_pages, '이전검색'); + } + + $next_spt = $spt + $config['cf_search_part']; + if ($next_spt < 0) { + $next_part_href = './board.php?bo_table='.$bo_table.$qstr.'&spt='.$next_spt.'&page=1'; + $write_pages = page_insertafter($write_pages, '다음검색'); + } +} + + +$write_href = ''; +if ($member['mb_level'] >= $board['bo_write_level']) { + $write_href = './write.php?bo_table='.$bo_table; +} + +$nobr_begin = $nobr_end = ""; +if (preg_match("/gecko|firefox/i", $_SERVER['HTTP_USER_AGENT'])) { + $nobr_begin = ''; + $nobr_end = ''; +} + +// RSS 보기 사용에 체크가 되어 있어야 RSS 보기 가능 061106 +$rss_href = ''; +if ($board['bo_use_rss_view']) { + $rss_href = './rss.php?bo_table='.$bo_table; +} + +$stx = get_text(stripslashes($stx)); +include_once($board_skin_path.'/list.skin.php'); +?> diff --git a/bbs/login.php b/bbs/login.php new file mode 100644 index 000000000..738ee1156 --- /dev/null +++ b/bbs/login.php @@ -0,0 +1,35 @@ + diff --git a/bbs/login_check.php b/bbs/login_check.php new file mode 100644 index 000000000..d5c1b0086 --- /dev/null +++ b/bbs/login_check.php @@ -0,0 +1,87 @@ +$value) { + if ($key != 'mb_id' && $key != 'mb_password' && $key != 'x' && $key != 'y' && $key != 'url') { + $link .= "$split$key=$value"; + $split = "&"; + } + } +} else { + $link = G5_URL; +} + +goto_url($link); +?> diff --git a/bbs/logout.php b/bbs/logout.php new file mode 100644 index 000000000..7aa5f34b9 --- /dev/null +++ b/bbs/logout.php @@ -0,0 +1,27 @@ + diff --git a/bbs/member_confirm.php b/bbs/member_confirm.php new file mode 100644 index 000000000..d55c6d14a --- /dev/null +++ b/bbs/member_confirm.php @@ -0,0 +1,29 @@ + diff --git a/bbs/member_leave.php b/bbs/member_leave.php new file mode 100644 index 000000000..53348d78c --- /dev/null +++ b/bbs/member_leave.php @@ -0,0 +1,25 @@ + diff --git a/bbs/memo.php b/bbs/memo.php new file mode 100644 index 000000000..4d9c0129a --- /dev/null +++ b/bbs/memo.php @@ -0,0 +1,74 @@ + diff --git a/bbs/memo_delete.php b/bbs/memo_delete.php new file mode 100644 index 000000000..e80fc956d --- /dev/null +++ b/bbs/memo_delete.php @@ -0,0 +1,27 @@ + diff --git a/bbs/memo_form.php b/bbs/memo_form.php new file mode 100644 index 000000000..4ada2ccc3 --- /dev/null +++ b/bbs/memo_form.php @@ -0,0 +1,42 @@ +' + ."\n".' >' + ."\n".' >'.str_replace("\n", "\n> ", get_text($row['me_memo'], 0)) + ."\n".' >' + .' >'; + + } +} + +$g5['title'] = '쪽지 보내기'; +include_once(G5_PATH.'/head.sub.php'); + +$memo_action_url = G5_HTTPS_BBS_URL."/memo_form_update.php"; +include_once($member_skin_path.'/memo_form.skin.php'); + +include_once(G5_PATH.'/tail.sub.php'); +?> diff --git a/bbs/memo_form_update.php b/bbs/memo_form_update.php new file mode 100644 index 000000000..cc9f00abe --- /dev/null +++ b/bbs/memo_form_update.php @@ -0,0 +1,81 @@ + \ No newline at end of file diff --git a/bbs/memo_view.php b/bbs/memo_view.php new file mode 100644 index 000000000..19d021108 --- /dev/null +++ b/bbs/memo_view.php @@ -0,0 +1,71 @@ + '{$me_id}' + and me_{$kind}_mb_id = '{$member['mb_id']}' + order by me_id asc + limit 1 "; +$prev = sql_fetch($sql); +if ($prev['me_id']) + $prev_link = './memo_view.php?kind='.$kind.'&me_id='.$prev['me_id']; +else + //$prev_link = 'javascript:alert(\'쪽지의 처음입니다.\');'; + $prev_link = ''; + + +// 다음 쪽지 +$sql = " select * from {$g5[memo_table]} + where me_id < '{$me_id}' + and me_{$kind}_mb_id = '{$member[mb_id]}' + order by me_id desc + limit 1 "; +$next = sql_fetch($sql); +if ($next[me_id]) + $next_link = './memo_view.php?kind='.$kind.'&me_id='.$next[me_id]; +else + //$next_link = 'javascript:alert(\'쪽지의 마지막입니다.\');'; + $next_link = ''; + +$mb = get_member($memo['me_'.$unkind.'_mb_id']); + +include_once($member_skin_path.'/memo_view.skin.php'); + +include_once(G5_PATH.'/tail.sub.php'); +?> diff --git a/bbs/move.php b/bbs/move.php new file mode 100644 index 000000000..8756ced7b --- /dev/null +++ b/bbs/move.php @@ -0,0 +1,159 @@ + '$bo_table' "; +// 원본 게시판을 선택 할 수 있도록 함. +$sql = " select * from {$g5['board_table']} a, {$g5['group_table']} b where a.gr_id = b.gr_id "; +if ($is_admin == 'group') + $sql .= " and b.gr_admin = '{$member['mb_id']}' "; +else if ($is_admin == 'board') + $sql .= " and a.bo_admin = '{$member['mb_id']}' "; +$sql .= " order by a.gr_id, a.bo_order, a.bo_table "; +$result = sql_query($sql); +for ($i=0; $row=sql_fetch_array($result); $i++) +{ + $list[$i] = $row; +} +?> + +
    +

    + +
    + + + + + + + + + + +
    + + + + + + + + + + 현재게시판'; + $atc_bg = 'copymove_currentbg'; + } + ?> + + + + + + +
    할 게시판을 한개 이상 선택하여 주십시오.
    + + + 게시판
    + + + + +
    +
    + +
    + +
    +
    + +
    + + + + diff --git a/bbs/move_update.php b/bbs/move_update.php new file mode 100644 index 000000000..d3f93445f --- /dev/null +++ b/bbs/move_update.php @@ -0,0 +1,219 @@ +'; + $log_tag2 = ''; + } else { + $log_tag1 = "\n"; + $log_tag2 = ''; + } + + $row2['wr_content'] .= "\n".$log_tag1.'[이 게시물은 '.$nick.'님에 의해 '.G5_TIME_YMDHIS.' '.$board['bo_subject'].'에서 '.($sw == 'copy' ? '복사' : '이동').' 됨]'.$log_tag2; + } + + // 게시글 추천, 비추천수 + $wr_good = $wr_nogood = 0; + if ($sw == 'move' && $i == 0) { + $wr_good = $row2['wr_good']; + $wr_nogood = $row2['wr_nogood']; + } + + $sql = " insert into $move_write_table + set wr_num = '$next_wr_num', + wr_reply = '{$row2['wr_reply']}', + wr_is_comment = '{$row2['wr_is_comment']}', + wr_comment = '{$row2['wr_comment']}', + wr_comment_reply = '{$row2['wr_comment_reply']}', + ca_name = '".addslashes($row2['ca_name'])."', + wr_option = '{$row2['wr_option']}', + wr_subject = '".addslashes($row2['wr_subject'])."', + wr_content = '".addslashes($row2['wr_content'])."', + wr_link1 = '".addslashes($row2['wr_link1'])."', + wr_link2 = '".addslashes($row2['wr_link2'])."', + wr_link1_hit = '{$row2['wr_link1_hit']}', + wr_link2_hit = '{$row2['wr_link2_hit']}', + wr_hit = '{$row2['wr_hit']}', + wr_good = '{$wr_good}', + wr_nogood = '{$wr_nogood}', + mb_id = '{$row2['mb_id']}', + wr_password = '{$row2['wr_password']}', + wr_name = '".addslashes($row2['wr_name'])."', + wr_email = '".addslashes($row2['wr_email'])."', + wr_homepage = '".addslashes($row2['wr_homepage'])."', + wr_datetime = '{$row2['wr_datetime']}', + wr_file = '{$row2['wr_file']}', + wr_last = '{$row2['wr_last']}', + wr_ip = '{$row2['wr_ip']}', + wr_1 = '".addslashes($row2['wr_1'])."', + wr_2 = '".addslashes($row2['wr_2'])."', + wr_3 = '".addslashes($row2['wr_3'])."', + wr_4 = '".addslashes($row2['wr_4'])."', + wr_5 = '".addslashes($row2['wr_5'])."', + wr_6 = '".addslashes($row2['wr_6'])."', + wr_7 = '".addslashes($row2['wr_7'])."', + wr_8 = '".addslashes($row2['wr_8'])."', + wr_9 = '".addslashes($row2['wr_9'])."', + wr_10 = '".addslashes($row2['wr_10'])."' "; + sql_query($sql); + + $insert_id = mysql_insert_id(); + + // 코멘트가 아니라면 + if (!$row2['wr_is_comment']) + { + $save_parent = $insert_id; + + $sql3 = " select * from {$g5['board_file_table']} where bo_table = '$bo_table' and wr_id = '{$row2['wr_id']}' order by bf_no "; + $result3 = sql_query($sql3); + for ($k=0; $row3 = sql_fetch_array($result3); $k++) + { + if ($row3['bf_file']) + { + // 원본파일을 복사하고 퍼미션을 변경 + @copy($src_dir.'/'.$row3['bf_file'], $dst_dir.'/'.$row3['bf_file']); + @chmod($dst_dir/$row3['bf_file'], G5_FILE_PERMISSION); + } + + $sql = " insert into {$g5['board_file_table']} + set bo_table = '$move_bo_table', + wr_id = '$insert_id', + bf_no = '{$row3['bf_no']}', + bf_source = '{$row3['bf_source']}', + bf_file = '{$row3['bf_file']}', + bf_download = '{$row3['bf_download']}', + bf_content = '".addslashes($row3['bf_content'])."', + bf_filesize = '{$row3['bf_filesize']}', + bf_width = '{$row3['bf_width']}', + bf_height = '{$row3['bf_height']}', + bf_type = '{$row3['bf_type']}', + bf_datetime = '{$row3['bf_datetime']}' "; + sql_query($sql); + + if ($sw == 'move' && $row3['bf_file']) + $save[$cnt]['bf_file'][$k] = $src_dir.'/'.$row3['bf_file']; + } + + $count_write++; + + if ($sw == 'move' && $i == 0) + { + // 스크랩 이동 + sql_query(" update {$g5['scrap_table']} set bo_table = '$move_bo_table', wr_id = '$save_parent' where bo_table = '$bo_table' and wr_id = '{$row2['wr_id']}' "); + + // 최신글 이동 + sql_query(" update {$g5['board_new_table']} set bo_table = '$move_bo_table', wr_id = '$save_parent', wr_parent = '$save_parent' where bo_table = '$bo_table' and wr_id = '{$row2['wr_id']}' "); + + // 추천데이터 이동 + sql_query(" update {$g5['board_good_table']} set bo_table = '$move_bo_table', wr_id = '$save_parent' where bo_table = '$bo_table' and wr_id = '{$row2['wr_id']}' "); + } + } + else + { + $count_comment++; + + if ($sw == 'move') + { + // 최신글 이동 + sql_query(" update {$g5['board_new_table']} set bo_table = '$move_bo_table', wr_id = '$insert_id', wr_parent = '$save_parent' where bo_table = '$bo_table' and wr_id = '{$row2['wr_id']}' "); + } + } + + sql_query(" update $move_write_table set wr_parent = '$save_parent' where wr_id = '$insert_id' "); + + if ($sw == 'move') + $save[$cnt]['wr_id'] = $row2['wr_parent']; + + $cnt++; + } + + sql_query(" update {$g5['board_table']} set bo_count_write = bo_count_write + '$count_write' where bo_table = '$move_bo_table' "); + sql_query(" update {$g5['board_table']} set bo_count_comment = bo_count_comment + '$count_comment' where bo_table = '$move_bo_table' "); + + delete_cache_latest($move_bo_table); + } + + $save_count_write += $count_write; + $save_count_comment += $count_comment; +} + +delete_cache_latest($bo_table); + +if ($sw == 'move') +{ + for ($i=0; $i + + +HEREDOC; +?> diff --git a/bbs/new.php b/bbs/new.php new file mode 100644 index 000000000..5c9919e1e --- /dev/null +++ b/bbs/new.php @@ -0,0 +1,112 @@ + a.wr_parent "; + +$mb_id = isset($_GET['mb_id']) ? strip_tags($_GET['mb_id']) : ""; +if ($mb_id) { + $sql_common .= " and a.mb_id = '{$mb_id}' "; +} +$sql_order = " order by a.bn_id desc "; + +$sql = " select count(*) as cnt {$sql_common} "; +$row = sql_fetch($sql); +$total_count = $row['cnt']; + +$rows = $config['cf_new_rows']; +$total_page = ceil($total_count / $rows); // 전체 페이지 계산 +if (!$page) $page = 1; // 페이지가 없으면 첫 페이지 (1 페이지) +$from_record = ($page - 1) * $rows; // 시작 열을 구함 + +$group_select = ''; + +$list = array(); +$sql = " select a.*, b.bo_subject, c.gr_subject, c.gr_id {$sql_common} {$sql_order} limit {$from_record}, {$rows} "; +$result = sql_query($sql); +for ($i=0; $row=sql_fetch_array($result); $i++) { + $tmp_write_table = $g5['write_prefix'].$row['bo_table']; + + if ($row['wr_id'] == $row['wr_parent']) { + + // 원글 + $comment = ""; + $comment_link = ""; + $row2 = sql_fetch(" select * from {$tmp_write_table} where wr_id = '{$row['wr_id']}' "); + $list[$i] = $row2; + + $name = get_sideview($row2['mb_id'], cut_str($row2['wr_name'], $config['cf_cut_name']), $row2['wr_email'], $row2['wr_homepage']); + // 당일인 경우 시간으로 표시함 + $datetime = substr($row2['wr_datetime'],0,10); + $datetime2 = $row2['wr_datetime']; + if ($datetime == G5_TIME_YMD) { + $datetime2 = substr($datetime2,11,5); + } else { + $datetime2 = substr($datetime2,5,5); + } + + } else { + + // 코멘트 + $comment = '[코] '; + $comment_link = '#c_'.$row['wr_id']; + $row2 = sql_fetch(" select * from {$tmp_write_table} where wr_id = '{$row['wr_parent']}' "); + $row3 = sql_fetch(" select mb_id, wr_name, wr_email, wr_homepage, wr_datetime from {$tmp_write_table} where wr_id = '{$row['wr_id']}' "); + $list[$i] = $row2; + $list[$i]['wr_id'] = $row['wr_id']; + $list[$i]['mb_id'] = $row3['mb_id']; + $list[$i]['wr_name'] = $row3['wr_name']; + $list[$i]['wr_email'] = $row3['wr_email']; + $list[$i]['wr_homepage'] = $row3['wr_homepage']; + + $name = get_sideview($row3['mb_id'], cut_str($row3['wr_name'], $config['cf_cut_name']), $row3['wr_email'], $row3['wr_homepage']); + // 당일인 경우 시간으로 표시함 + $datetime = substr($row3['wr_datetime'],0,10); + $datetime2 = $row3['wr_datetime']; + if ($datetime == G5_TIME_YMD) { + $datetime2 = substr($datetime2,11,5); + } else { + $datetime2 = substr($datetime2,5,5); + } + + } + + $list[$i]['gr_id'] = $row['gr_id']; + $list[$i]['bo_table'] = $row['bo_table']; + $list[$i]['name'] = $name; + $list[$i]['comment'] = $comment; + $list[$i]['href'] = './board.php?bo_table='.$row['bo_table'].'&wr_id='.$row2['wr_id'].$comment_link; + $list[$i]['datetime'] = $datetime; + $list[$i]['datetime2'] = $datetime2; + + $list[$i]['gr_subject'] = $row['gr_subject']; + $list[$i]['bo_subject'] = $row['bo_subject']; + $list[$i]['wr_subject'] = $row2['wr_subject']; +} + +$write_pages = get_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $page, $total_page, "?gr_id=$gr_id&view=$view&mb_id=$mb_id&page="); + +include_once($new_skin_path.'/new.skin.php'); + +include_once('./_tail.php'); +?> diff --git a/bbs/new_delete.php b/bbs/new_delete.php new file mode 100644 index 000000000..e3df24ce8 --- /dev/null +++ b/bbs/new_delete.php @@ -0,0 +1,147 @@ + 0 || $count_comment > 0) { + sql_query(" update {$g5['board_table']} set bo_count_write = bo_count_write - '$count_write', bo_count_comment = bo_count_comment - '$count_comment' where bo_table = '$bo_table' "); + } + } + } + else // 코멘트 삭제 + { + //-------------------------------------------------------------------- + // 코멘트 삭제시 답변 코멘트 까지 삭제되지는 않음 + //-------------------------------------------------------------------- + //print_r2($write); + + $comment_id = $wr_id; + + $len = strlen($write['wr_comment_reply']); + if ($len < 0) $len = 0; + $comment_reply = substr($write['wr_comment_reply'], 0, $len); + + // 코멘트 삭제 + if (!delete_point($write['mb_id'], $bo_table, $comment_id, '코멘트')) { + insert_point($write['mb_id'], $board['bo_comment_point'] * (-1), "{$board['bo_subject']} {$write[wr_parent]}-{$comment_id} 코멘트삭제"); + } + + // 코멘트 삭제 + sql_query(" delete from $write_table where wr_id = '$comment_id' "); + + // 코멘트가 삭제되므로 해당 게시물에 대한 최근 시간을 다시 얻는다. + $sql = " select max(wr_datetime) as wr_last from $write_table where wr_parent = '{$write['wr_parent']}' "; + $row = sql_fetch($sql); + + // 원글의 코멘트 숫자를 감소 + sql_query(" update $write_table set wr_comment = wr_comment - 1, wr_last = '$row[wr_last]' where wr_id = '{$write['wr_parent']}' "); + + // 코멘트 숫자 감소 + sql_query(" update {$g5['board_table']} set bo_count_comment = bo_count_comment - 1 where bo_table = '$bo_table' "); + + // 새글 삭제 + sql_query(" delete from {$g5['board_new_table']} where bo_table = '$bo_table' and wr_id = '$comment_id' "); + } +} + +$save_bo_table = array_unique($save_bo_table); +foreach ($save_bo_table as $key=>$value) { + delete_cache_latest($value); +} + +goto_url("new.php?sfl=$sfl&stx=$stx&page=$page"); +?> \ No newline at end of file diff --git a/bbs/newwin.inc.php b/bbs/newwin.inc.php new file mode 100644 index 000000000..3c3c8c127 --- /dev/null +++ b/bbs/newwin.inc.php @@ -0,0 +1,56 @@ + + + +
    +

    팝업레이어 알림

    + + + +
    +
    + +
    + +
    +팝업레이어 알림이 없습니다.'; +?> +
    + + + \ No newline at end of file diff --git a/bbs/password.php b/bbs/password.php new file mode 100644 index 000000000..6c3d77aad --- /dev/null +++ b/bbs/password.php @@ -0,0 +1,53 @@ + diff --git a/bbs/password_check.php b/bbs/password_check.php new file mode 100644 index 000000000..c28f059ce --- /dev/null +++ b/bbs/password_check.php @@ -0,0 +1,22 @@ + diff --git a/bbs/password_lost.php b/bbs/password_lost.php new file mode 100644 index 000000000..1e70ecf8d --- /dev/null +++ b/bbs/password_lost.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/bbs/password_lost2.php b/bbs/password_lost2.php new file mode 100644 index 000000000..d1bc4dbf3 --- /dev/null +++ b/bbs/password_lost2.php @@ -0,0 +1,72 @@ + 1) + alert('동일한 메일주소가 2개 이상 존재합니다.\\n\\n관리자에게 문의하여 주십시오.'); + +$sql = " select mb_no, mb_id, mb_name, mb_nick, mb_email, mb_datetime from {$g5['member_table']} where mb_email = '$email' "; +$mb = sql_fetch($sql); +if (!$mb['mb_id']) + alert('존재하지 않는 회원입니다.'); +else if (is_admin($mb['mb_id'])) + alert('관리자 아이디는 접근 불가합니다.'); + +// 난수 발생 +srand(time()); +$change_password = rand(100000, 999999); +$mb_lost_certify = sql_password($change_password); +$mb_datetime = sql_password($mb['mb_datetime']); + +$sql = " update {$g5['member_table']} set mb_lost_certify = '$mb_lost_certify' where mb_id = '{$mb['mb_id']}' "; +sql_query($sql); + +$href = G5_BBS_URL.'/password_lost_certify.php?mb_no='.$mb['mb_no'].'&mb_datetime='.$mb_datetime.'&mb_lost_certify='.$mb_lost_certify; + +$subject = "[".$config['cf_title']."] 요청하신 회원정보 찾기 안내 메일입니다."; + +$content = ""; + +$content .= '
    '; +$content .= '
    '; +$content .= '

    '; +$content .= '회원정보 찾기 안내'; +$content .= '

    '; +$content .= ''; +$content .= ''.$config['cf_title'].''; +$content .= ''; +$content .= '

    '; +$content .= addslashes($mb['mb_name'])." (".addslashes($mb['mb_nick']).")"." 회원님은 ".G5_TIME_YMDHIS." 에 회원정보 찾기 요청을 하셨습니다.
    "; +$content .= '저희 사이트는 관리자라도 회원님의 비밀번호를 알 수 없기 때문에, 비밀번호를 알려드리는 대신 새로운 비밀번호를 생성하여 안내 해드리고 있습니다.
    '; +$content .= '아래에서 변경될 비밀번호를 확인하신 후, 비밀번호 변경 링크를 클릭 하십시오.
    '; +$content .= '비밀번호가 변경되었다는 인증 메세지가 출력되면, 홈페이지에서 회원아이디와 변경된 비밀번호를 입력하시고 로그인 하십시오.
    '; +$content .= '로그인 후에는 정보수정 메뉴에서 새로운 비밀번호로 변경해 주십시오.'; +$content .= '

    '; +$content .= '

    '; +$content .= '회원아이디 '.$mb['mb_id'].'
    '; +$content .= '변경될 비밀번호 '.$change_password.''; +$content .= '

    '; +$content .= '비밀번호 변경'; +$content .= '
    '; +$content .= '
    '; + +mailer($config['cf_admin_email_name'], $config['cf_admin_email'], $mb['mb_email'], $subject, $content, 1); + +alert_close($email.' 메일로 회원아이디와 비밀번호를 인증할 수 있는 메일이 발송 되었습니다.\\n\\n메일을 확인하여 주십시오.'); +?> \ No newline at end of file diff --git a/bbs/password_lost_certify.php b/bbs/password_lost_certify.php new file mode 100644 index 000000000..ea427f04d --- /dev/null +++ b/bbs/password_lost_certify.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/bbs/point.php b/bbs/point.php new file mode 100644 index 000000000..d9adee088 --- /dev/null +++ b/bbs/point.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/bbs/poll_etc_update.php b/bbs/poll_etc_update.php new file mode 100644 index 000000000..9828bdc35 --- /dev/null +++ b/bbs/poll_etc_update.php @@ -0,0 +1,55 @@ + diff --git a/bbs/poll_etc_update_mail.php b/bbs/poll_etc_update_mail.php new file mode 100644 index 000000000..141decc87 --- /dev/null +++ b/bbs/poll_etc_update_mail.php @@ -0,0 +1,30 @@ + + + + + + +설문조사 기타의견 메일 + + + + +
    +
    +

    + +

    + + 작성자 () + +

    + +

    +
    +
    + + + diff --git a/bbs/poll_result.php b/bbs/poll_result.php new file mode 100644 index 000000000..7e549abcc --- /dev/null +++ b/bbs/poll_result.php @@ -0,0 +1,102 @@ + $max) + $max = $count; +} +$nf_total_po_cnt = number_format($total_po_cnt); + +$list = array(); + +for ($i=1; $i<=9; $i++) { + $poll = $po['po_poll'.$i]; + if ($poll == '') { break; } + + $list[$i]['content'] = $poll; + $list[$i]['cnt'] = $po['po_cnt'.$i]; + if ($total_po_cnt > 0) + $list[$i]['rate'] = ($list[$i]['cnt'] / $total_po_cnt) * 100; + + $bar = (int)($list[$i]['cnt'] / $max * 100); + + $list[$i]['bar'] = $bar; + $list[$i]['num'] = $i; +} + +$list2 = array(); + +// 기타의견 리스트 +$sql = " select a.*, b.mb_open + from {$g5['poll_etc_table']} a + left join {$g5['member_table']} b on (a.mb_id = b.mb_id) + where po_id = '{$po_id}' order by pc_id desc "; +$result = sql_query($sql); +for ($i=0; $row=sql_fetch_array($result); $i++) { + $list2[$i]['pc_name'] = $row['pc_name']; + $list2[$i]['name'] = get_sideview($row['mb_id'], cut_str($row['pc_name'],10), '', '', $row['mb_open']); + $list2[$i]['idea'] = get_text(cut_str($row['pc_idea'], 255)); + $list2[$i]['datetime'] = $row['pc_datetime']; + + $list2[$i]['del'] = ''; + if ($is_admin == 'super' || ($row['mb_id'] == $member['mb_id'] && $row['mb_id'])) + $list2[$i]['del'] = ''; +} + +// 기타의견 입력 +$is_etc = false; +if ($po['po_etc']) { + $is_etc = true; + $po_etc = $po['po_etc']; + if ($member['mb_id']) + $name = ''.$member['mb_nick'].' '; + else + $name = ''; +} + +$list3 = array(); + +// 다른투표 +$sql = " select po_id, po_subject, po_date from {$g5['poll_table']} order by po_id desc "; +$result = sql_query($sql); +for ($i=0; $row2=sql_fetch_array($result); $i++) { + $list3[$i]['po_id'] = $row2['po_id']; + $list3[$i]['date'] = substr($row2['po_date'],2,8); + $list3[$i]['subject'] = cut_str($row2['po_subject'],60,"…"); +} + +if (G5_IS_MOBILE) { + $poll_skin_path = G5_MOBILE_PATH.'/'.G5_SKIN_DIR.'/poll/'.$skin_dir; + $poll_skin_url = G5_MOBILE_URL.'/'.G5_SKIN_DIR.'/poll/'.$skin_dir; +} else { + $poll_skin_path = G5_SKIN_PATH.'/poll/'.$skin_dir; + $poll_skin_url = G5_SKIN_URL.'/poll/'.$skin_dir; +} + +include_once(G5_PATH.'/head.sub.php'); + +if (!file_exists($poll_skin_path.'/poll_result.skin.php')) die('skin error'); +include_once ($poll_skin_path.'/poll_result.skin.php'); + +include_once(G5_PATH.'/tail.sub.php'); +?> diff --git a/bbs/poll_update.php b/bbs/poll_update.php new file mode 100644 index 000000000..154753af0 --- /dev/null +++ b/bbs/poll_update.php @@ -0,0 +1,60 @@ + diff --git a/bbs/profile.php b/bbs/profile.php new file mode 100644 index 000000000..8169ddae0 --- /dev/null +++ b/bbs/profile.php @@ -0,0 +1,33 @@ + diff --git a/bbs/qadelete.php b/bbs/qadelete.php new file mode 100644 index 000000000..efa1b050e --- /dev/null +++ b/bbs/qadelete.php @@ -0,0 +1,68 @@ + \ No newline at end of file diff --git a/bbs/qadownload.php b/bbs/qadownload.php new file mode 100644 index 000000000..3c1a838c0 --- /dev/null +++ b/bbs/qadownload.php @@ -0,0 +1,70 @@ + diff --git a/bbs/qahead.php b/bbs/qahead.php new file mode 100644 index 000000000..24cf0e564 --- /dev/null +++ b/bbs/qahead.php @@ -0,0 +1,18 @@ + \ No newline at end of file diff --git a/bbs/qalist.php b/bbs/qalist.php new file mode 100644 index 000000000..cff719f2a --- /dev/null +++ b/bbs/qalist.php @@ -0,0 +1,122 @@ +'; + } +} + +if(is_file($skin_file)) { + $sql_common = " from {$g5['qa_content_table']} "; + $sql_search = " where qa_type = '0' "; + + if(!$is_admin) + $sql_search .= " and mb_id = '{$member['mb_id']}' "; + + if($sca) { + if (preg_match("/[a-zA-Z]/", $sca)) + $sql_search .= " and INSTR(LOWER(qa_category), LOWER('$sca')) > 0 "; + else + $sql_search .= " and INSTR(qa_category, '$sca') > 0 "; + } + + $stx = trim($stx); + if($stx) { + if (preg_match("/[a-zA-Z]/", $stx)) + $sql_search .= " and ( INSTR(LOWER(qa_subject), LOWER('$stx')) > 0 or INSTR(LOWER(qa_content), LOWER('$stx')) > 0 )"; + else + $sql_search .= " and ( INSTR(qa_subject, '$stx') > 0 or INSTR(qa_content, '$stx') > 0 ) "; + } + + $sql_order = " order by qa_num "; + + $sql = " select count(*) as cnt + $sql_common + $sql_search "; + $row = sql_fetch($sql); + $total_count = $row['cnt']; + + $page_rows = G5_IS_MOBILE ? $qaconfig['qa_mobile_page_rows'] : $qaconfig['qa_page_rows']; + $total_page = ceil($total_count / $page_rows); // 전체 페이지 계산 + if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지) + $from_record = ($page - 1) * $page_rows; // 시작 열을 구함 + + $sql = " select * + $sql_common + $sql_search + $sql_order + limit $from_record, $page_rows "; + $result = sql_query($sql); + + $list = array(); + $num = $total_count - ($page - 1) * $page_rows; + $subject_len = G5_IS_MOBILE ? $qaconfig['qa_mobile_subject_len'] : $qaconfig['qa_subject_len']; + for($i=0; $row=sql_fetch_array($result); $i++) { + $list[$i] = $row; + + $list[$i]['category'] = get_text($row['qa_category']); + $list[$i]['subject'] = conv_subject($row['qa_subject'], $subject_len, '…'); + if ($stx) { + $list[$i]['subject'] = search_font($stx, $list[$i]['subject']); + } + + $list[$i]['view_href'] = G5_BBS_URL.'/qaview.php?qa_id='.$row['qa_id'].$qstr; + + $list[$i]['icon_file'] = ''; + if(trim($row['qa_file1']) || trim($row['qa_file2'])) + $list[$i]['icon_file'] = ''; + + $list[$i]['name'] = get_text($row['qa_name']); + $list[$i]['date'] = substr($row['qa_datetime'], 2, 8); + + $list[$i]['num'] = $num - $i; + } + + $is_checkbox = false; + $admin_href = ''; + if($is_admin) { + $is_checkbox = true; + $admin_href = G5_ADMIN_URL.'/qa_config.php'; + } + + $list_href = G5_BBS_URL.'/qalist.php'; + $write_href = G5_BBS_URL.'/qawrite.php'; + + $list_pages = preg_replace('/(\.php)(&|&)/i', '$1?', get_paging(G5_IS_MOBILE ? $qaconfig['qa_mobile_page_rows'] : $qaconfig['qa_page_rows'], $page, $total_page, './qalist.php'.$qstr.'&page=')); + + $stx = get_text(stripslashes($stx)); + include_once($skin_file); +} else { + echo '
    '.str_replace(G5_PATH.'/', '', $skin_file).'이 존재하지 않습니다.
    '; +} + +include_once('./qatail.php'); +?> \ No newline at end of file diff --git a/bbs/qatail.php b/bbs/qatail.php new file mode 100644 index 000000000..b2710d92c --- /dev/null +++ b/bbs/qatail.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/bbs/qaview.php b/bbs/qaview.php new file mode 100644 index 000000000..a3b0ad393 --- /dev/null +++ b/bbs/qaview.php @@ -0,0 +1,175 @@ + '{$view['qa_num']}' order by qa_num asc limit 1 "; + $next = sql_fetch($sql.$next_search); + + $next_href = ''; + if (isset($next['qa_id']) && $next['qa_id']) { + $next_qa_subject = get_text(cut_str($next['qa_subject'], 255)); + $next_href = G5_BBS_URL.'/qaview.php?qa_id='.$next['qa_id'].$qstr; + } + + + // 관련질문 + $rows = 10; + $sql = " select * + from {$g5['qa_content_table']} + where qa_id <> '$qa_id' + and qa_related = '{$view['qa_related']}' + and qa_type = '0' + order by qa_num, qa_type + limit 0, $rows "; + $result = sql_query($sql); + + $rel_list = array(); + $rel_count = 0; + for($i=0; $row=sql_fetch_array($result); $i++) { + $rel_list[$i] = $row; + $rel_list[$i]['category'] = get_text($row['qa_category']); + $rel_list[$i]['subject'] = conv_subject($row['qa_subject'], $subject_len, '…'); + $rel_list[$i]['name'] = get_text($row['qa_name']); + $rel_list[$i]['date'] = substr($row['qa_datetime'], 2, 8); + $rel_list[$i]['view_href'] = G5_BBS_URL.'/qaview.php?qa_id='.$row['qa_id'].$qstr; + $rel_count++; + } + $view['rel_count'] = $rel_count; + + $update_href = ''; + $delete_href = ''; + $write_href = G5_BBS_URL.'/qawrite.php'; + $rewrite_href = G5_BBS_URL.'/qawrite.php?w=r&qa_id='.$view['qa_id']; + $list_href = G5_BBS_URL.'/qalist.php'.preg_replace('/^&/', '?', $qstr); + + /* + if($view['qa_type']) { + if($is_admin) + $update_href = G5_BBS_URL.'/qawrite.php?w=u&qa_id='.$view['qa_id'].$qstr; + } else { + if($view['qa_status'] == 0) + $update_href = G5_BBS_URL.'/qawrite.php?w=u&qa_id='.$view['qa_id'].$qstr; + } + */ + if(($view['qa_type'] && $is_admin) || (!$view['qa_type'] && $view['qa_status'] == 0)) { + $update_href = G5_BBS_URL.'/qawrite.php?w=u&qa_id='.$view['qa_id'].$qstr; + $delete_href = G5_BBS_URL.'/qadelete.php?qa_id='.$view['qa_id'].$qstr; + } + + // 질문글이고 등록된 답변이 있다면 + $answer = array(); + $answer_update_href = ''; + $answer_delete_href = ''; + if(!$view['qa_type'] && $view['qa_status']) { + $sql = " select * + from {$g5['qa_content_table']} + where qa_type = '1' + and qa_parent = '{$view['qa_id']}' "; + $answer = sql_fetch($sql); + + if($is_admin) { + $answer_update_href = G5_BBS_URL.'/qawrite.php?w=u&qa_id='.$answer['qa_id'].$qstr; + $answer_delete_href = G5_BBS_URL.'/qadelete.php?qa_id='.$answer['qa_id'].$qstr; + } + } + + $stx = get_text(stripslashes($stx)); + + $is_dhtml_editor = false; + // 모바일에서는 DHTML 에디터 사용불가 + if ($config['cf_editor'] && $qaconfig['qa_use_editor'] && !G5_IS_MOBILE) { + $is_dhtml_editor = true; + } + $editor_html = editor_html('qa_content', $content, $is_dhtml_editor); + $editor_js = ''; + $editor_js .= get_editor_js('qa_content', $is_dhtml_editor); + $editor_js .= chk_editor_js('qa_content', $is_dhtml_editor); + + $ss_name = 'ss_qa_view_'.$qa_id; + if(!get_session($ss_name)) + set_session($ss_name, TRUE); + + // 첨부파일 + $view['img_file'] = array(); + $view['download_href'] = array(); + $view['download_source'] = array(); + $view['img_count'] = 0; + $view['download_count'] = 0; + + for ($i=1; $i<=2; $i++) { + if(preg_match("/\.({$config['cf_image_extension']})$/i", $view['qa_file'.$i])) { + $view['img_file'][] = '
    '; + $view['img_count']++; + continue; + } + + if ($view['qa_file'.$i]) { + $view['download_href'][] = G5_BBS_URL.'/qadownload.php?qa_id='.$view['qa_id'].'&no='.$i; + $view['download_source'][] = $view['qa_source'.$i]; + $view['download_count']++; + } + } + + include_once($skin_file); +} else { + echo '
    '.str_replace(G5_PATH.'/', '', $skin_file).'이 존재하지 않습니다.
    '; +} + +include_once('./qatail.php'); +?> \ No newline at end of file diff --git a/bbs/qawrite.php b/bbs/qawrite.php new file mode 100644 index 000000000..8be900081 --- /dev/null +++ b/bbs/qawrite.php @@ -0,0 +1,139 @@ +


    ====== 이전 답변내용 =======
    '; + else + $content = "\n\n\n\n====== 이전 답변내용 =======\n"; + + $content .= get_text($write['qa_content'], 0); + } else { + $content = get_text($write['qa_content'], 0); + } + + $editor_html = editor_html('qa_content', $content, $is_dhtml_editor); + $editor_js = ''; + $editor_js .= get_editor_js('qa_content', $is_dhtml_editor); + $editor_js .= chk_editor_js('qa_content', $is_dhtml_editor); + + $upload_max_filesize = number_format($qaconfig['qa_upload_size']) . ' 바이트'; + + $html_value = ''; + if ($write['qa_html']) { + $html_checked = 'checked'; + $html_value = $write['qa_html']; + + if($w == 'r' && $write['qa_html'] == 1 && !$is_dhtml_editor) + $html_value = 2; + } + + $is_email = false; + $req_email = ''; + if($qaconfig['qa_use_email']) { + $is_email = true; + + if($qaconfig['qa_req_email']) + $req_email = 'required'; + + if($w == '' || $w == 'r') + $write['qa_email'] = $member['mb_email']; + + if($w == 'u' && $is_admin && $write['qa_type']) + $is_email = false; + } + + $is_hp = false; + $req_hp = ''; + if($qaconfig['qa_use_hp']) { + $is_hp = true; + + if($qaconfig['qa_req_hp']) + $req_hp = 'required'; + + if($w == '' || $w == 'r') + $write['qa_hp'] = $member['mb_hp']; + + if($w == 'u' && $is_admin && $write['qa_type']) + $is_hp = false; + } + + $list_href = G5_BBS_URL.'/qalist.php'.preg_replace('/^&/', '?', $qstr); + + $action_url = https_url(G5_BBS_DIR).'/qawrite_update.php'; + + include_once($skin_file); +} else { + echo '
    '.str_replace(G5_PATH.'/', '', $skin_file).'이 존재하지 않습니다.
    '; +} + +include_once('./qatail.php'); +?> \ No newline at end of file diff --git a/bbs/qawrite_update.php b/bbs/qawrite_update.php new file mode 100644 index 000000000..d384659f6 --- /dev/null +++ b/bbs/qawrite_update.php @@ -0,0 +1,352 @@ +제목을 입력하세요.'; +} + +$qa_content = ''; +if (isset($_POST['qa_content'])) { + $qa_content = substr(trim($_POST['qa_content']),0,65536); +} +if ($qa_content == '') { + $msg[] = '내용을 입력하세요.'; +} + +if (!empty($msg)) { + $msg = implode('
    ', $msg); + alert($msg); +} + +if($qa_hp) + $qa_hp = preg_replace('/[^0-9\-]/', '', strip_tags($qa_hp)); + +// 090710 +if (substr_count($qa_content, '&#') > 50) { + alert('내용에 올바르지 않은 코드가 다수 포함되어 있습니다.'); + exit; +} + +$upload_max_filesize = ini_get('upload_max_filesize'); + +if (empty($_POST)) { + alert("파일 또는 글내용의 크기가 서버에서 설정한 값을 넘어 오류가 발생하였습니다.\\npost_max_size=".ini_get('post_max_size')." , upload_max_filesize=".$upload_max_filesize."\\n게시판관리자 또는 서버관리자에게 문의 바랍니다."); +} + +for ($i=1; $i<=5; $i++) { + $var = "qa_$i"; + $$var = ""; + if (isset($_POST['qa_'.$i]) && $_POST['qa_'.$i]) { + $$var = trim($_POST['qa_'.$i]); + } +} + +// 1:1문의 설정값 +$qaconfig = get_qa_config(); + +if($w == 'u' || $w == 'a' || $w == 'r') { + if($w == 'a' && !$is_admin) + alert('답변은 관리자만 등록할 수 있습니다.'); + + $sql = " select * from {$g5['qa_content_table']} where qa_id = '$qa_id' "; + if(!$is_admin) { + $sql .= " and mb_id = '{$member['mb_id']}' "; + } + + $write = sql_fetch($sql); + + if($w == 'u') { + if(!$write['qa_id']) + alert('게시글이 존재하지 않습니다.\\n삭제되었거나 자신의 글이 아닌 경우입니다.'); + + if(!$is_admin) { + if($write['qa_type'] == 0 && $write['qa_status'] == 1) + alert('답변이 등록된 문의글은 수정할 수 없습니다.'); + + if($write['mb_id'] != $member['mb_id']) + alert('게시글을 수정할 권한이 없습니다.\\n\\n올바른 방법으로 이용해 주십시오.', G5_URL); + } + } + + if($w == 'a') { + if(!$write['qa_id']) + alert('문의글이 존재하지 않아 답변글을 등록할 수 없습니다.'); + + if($write['qa_type'] == 1) + alert('답변글에는 다시 답변을 등록할 수 없습니다.'); + } +} + +// 디렉토리가 없다면 생성합니다. (퍼미션도 변경하구요.) +@mkdir(G5_DATA_PATH.'/qa', G5_DIR_PERMISSION); +@chmod(G5_DATA_PATH.'/qa', G5_DIR_PERMISSION); + +$chars_array = array_merge(range(0,9), range('a','z'), range('A','Z')); + +// 가변 파일 업로드 +$file_upload_msg = ''; +$upload = array(); +for ($i=1; $i<=count($_FILES['bf_file']['name']); $i++) { + $upload[$i]['file'] = ''; + $upload[$i]['source'] = ''; + $upload[$i]['del_check'] = false; + + // 삭제에 체크가 되어있다면 파일을 삭제합니다. + if (isset($_POST['bf_file_del'][$i]) && $_POST['bf_file_del'][$i]) { + $upload[$i]['del_check'] = true; + @unlink(G5_DATA_PATH.'/qa/'.$write['qa_file'.$i]); + // 썸네일삭제 + if(preg_match("/\.({$config['cf_image_extension']})$/i", $write['qa_file'.$i])) { + delete_qa_thumbnail($write['qa_file'.$i]); + } + } + + $tmp_file = $_FILES['bf_file']['tmp_name'][$i]; + $filesize = $_FILES['bf_file']['size'][$i]; + $filename = $_FILES['bf_file']['name'][$i]; + $filename = preg_replace('/(<|>|=)/', '', $filename); + + // 서버에 설정된 값보다 큰파일을 업로드 한다면 + if ($filename) { + if ($_FILES['bf_file']['error'][$i] == 1) { + $file_upload_msg .= '\"'.$filename.'\" 파일의 용량이 서버에 설정('.$upload_max_filesize.')된 값보다 크므로 업로드 할 수 없습니다.\\n'; + continue; + } + else if ($_FILES['bf_file']['error'][$i] != 0) { + $file_upload_msg .= '\"'.$filename.'\" 파일이 정상적으로 업로드 되지 않았습니다.\\n'; + continue; + } + } + + if (is_uploaded_file($tmp_file)) { + // 관리자가 아니면서 설정한 업로드 사이즈보다 크다면 건너뜀 + if (!$is_admin && $filesize > $qaconfig['qa_upload_size']) { + $file_upload_msg .= '\"'.$filename.'\" 파일의 용량('.number_format($filesize).' 바이트)이 게시판에 설정('.number_format($qaconfig['qa_upload_size']).' 바이트)된 값보다 크므로 업로드 하지 않습니다.\\n'; + continue; + } + + //=================================================================\ + // 090714 + // 이미지나 플래시 파일에 악성코드를 심어 업로드 하는 경우를 방지 + // 에러메세지는 출력하지 않는다. + //----------------------------------------------------------------- + $timg = @getimagesize($tmp_file); + // image type + if ( preg_match("/\.({$config['cf_image_extension']})$/i", $filename) || + preg_match("/\.({$config['cf_flash_extension']})$/i", $filename) ) { + if ($timg['2'] < 1 || $timg['2'] > 16) + continue; + } + //================================================================= + + if ($w == 'u') { + // 존재하는 파일이 있다면 삭제합니다. + @unlink(G5_DATA_PATH.'/qa/'.$write['qa_file'.$i]); + // 이미지파일이면 썸네일삭제 + if(preg_match("/\.({$config['cf_image_extension']})$/i", $write['qa_file'.$i])) { + delete_qa_thumbnail($row['qa_file'.$i]); + } + } + + // 프로그램 원래 파일명 + $upload[$i]['source'] = $filename; + $upload[$i]['filesize'] = $filesize; + + // 아래의 문자열이 들어간 파일은 -x 를 붙여서 웹경로를 알더라도 실행을 하지 못하도록 함 + $filename = preg_replace("/\.(php|phtm|htm|cgi|pl|exe|jsp|asp|inc)/i", "$0-x", $filename); + + shuffle($chars_array); + $shuffle = implode('', $chars_array); + + // 첨부파일 첨부시 첨부파일명에 공백이 포함되어 있으면 일부 PC에서 보이지 않거나 다운로드 되지 않는 현상이 있습니다. (길상여의 님 090925) + $upload[$i]['file'] = abs(ip2long($_SERVER['REMOTE_ADDR'])).'_'.substr($shuffle,0,8).'_'.str_replace('%', '', urlencode(str_replace(' ', '_', $filename))); + + $dest_file = G5_DATA_PATH.'/qa/'.$upload[$i]['file']; + + // 업로드가 안된다면 에러메세지 출력하고 죽어버립니다. + $error_code = move_uploaded_file($tmp_file, $dest_file) or die($_FILES['bf_file']['error'][$i]); + + // 올라간 파일의 퍼미션을 변경합니다. + chmod($dest_file, G5_FILE_PERMISSION); + } +} + +if($w == '' || $w == 'a' || $w == 'r') { + if($w == '' || $w == 'r') { + $row = sql_fetch(" select MIN(qa_num) as min_qa_num from {$g5['qa_content_table']} "); + $qa_num = $row['min_qa_num'] - 1; + } + + if($w == 'a') { + $qa_num = $write['qa_num']; + $qa_parent = $write['qa_id']; + $qa_related = $write['qa_related']; + $qa_category = $write['qa_category']; + $qa_type = 1; + $qa_status = 1; + } + + $sql = " insert into {$g5['qa_content_table']} + set qa_num = '$qa_num', + mb_id = '{$member['mb_id']}', + qa_name = '{$member['mb_nick']}', + qa_email = '$qa_email', + qa_hp = '$qa_hp', + qa_type = '$qa_type', + qa_parent = '$qa_parent', + qa_related = '$qa_related', + qa_category = '$qa_category', + qa_email_recv = '$qa_email_recv', + qa_sms_recv = '$qa_sms_recv', + qa_html = '$qa_html', + qa_subject = '$qa_subject', + qa_content = '$qa_content', + qa_status = '$qa_status', + qa_file1 = '{$upload[1]['file']}', + qa_source1 = '{$upload[1]['source']}', + qa_file2 = '{$upload[2]['file']}', + qa_source2 = '{$upload[2]['source']}', + qa_ip = '{$_SERVER['REMOTE_ADDR']}', + qa_datetime = '".G5_TIME_YMDHIS."', + qa_1 = '$qa_1', + qa_2 = '$qa_2', + qa_3 = '$qa_3', + qa_4 = '$qa_4', + qa_5 = '$qa_5' "; + sql_query($sql); + + if($w == '' || $w == 'r') { + $qa_id = mysql_insert_id(); + + if($w == 'r' && $write['qa_related']) { + $qa_related = $write['qa_related']; + } else { + $qa_related = $qa_id; + } + + $sql = " update {$g5['qa_content_table']} + set qa_parent = '$qa_id', + qa_related = '$qa_related' + where qa_id = '$qa_id' "; + sql_query($sql); + } + + if($w == 'a') { + $sql = " update {$g5['qa_content_table']} + set qa_status = '1' + where qa_id = '{$write['qa_parent']}' "; + sql_query($sql); + } +} else if($w == 'u') { + if(!$upload[1]['file'] && !$upload[1]['del_check']) { + $upload[1]['file'] = $write['qa_file1']; + $upload[1]['source'] = $write['qa_source1']; + } + + if(!$upload[2]['file'] && !$upload[2]['del_check']) { + $upload[2]['file'] = $write['qa_file2']; + $upload[2]['source'] = $write['qa_source2']; + } + + $sql = " update {$g5['qa_content_table']} + set qa_email = '$qa_email', + qa_hp = '$qa_hp', + qa_category = '$qa_category', + qa_html = '$qa_html', + qa_subject = '$qa_subject', + qa_content = '$qa_content', + qa_file1 = '{$upload[1]['file']}', + qa_source1 = '{$upload[1]['source']}', + qa_file2 = '{$upload[2]['file']}', + qa_source2 = '{$upload[2]['source']}', + qa_1 = '$qa_1', + qa_2 = '$qa_2', + qa_3 = '$qa_3', + qa_4 = '$qa_4', + qa_5 = '$qa_5' "; + if($qa_sms_recv) + $sql .= ", qa_sms_recv = '$qa_sms_recv' "; + $sql .= " where qa_id = '$qa_id' "; + sql_query($sql); +} + +// SMS 알림 +if($config['cf_sms_use'] == 'icode' && $qaconfig['qa_use_sms']) { + include_once(G5_LIB_PATH.'/icode.sms.lib.php'); + + // 답변글은 질문 등록자에게 전송 + if($w == 'a' && $write['qa_sms_recv'] && trim($write['qa_hp'])) { + $sms_content = $config['cf_title'].' '.$qaconfig['qa_title'].'에 답변이 등록되었습니다.'; + $send_number = preg_replace('/[^0-9]/', '', $qaconfig['qa_send_number']); + $recv_number = preg_replace('/[^0-9]/', '', $write['qa_hp']); + + if($recv_number) { + $SMS = new SMS; // SMS 연결 + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + $SMS->Add($recv_number, $send_number, $config['cf_icode_id'], iconv("utf-8", "euc-kr", stripslashes($sms_content)), ""); + $SMS->Send(); + } + } + + // 문의글 등록시 관리자에게 전송 + if(($w == '' || $w == 'r') && trim($qaconfig['qa_admin_hp'])) { + $sms_content = $config['cf_title'].' '.$qaconfig['qa_title'].'에 문의글이 등록되었습니다.'; + $send_number = preg_replace('/[^0-9]/', '', $qa_hp); + $recv_number = preg_replace('/[^0-9]/', '', $qaconfig['qa_admin_hp']); + + if($recv_number) { + $SMS = new SMS; // SMS 연결 + $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']); + $SMS->Add($recv_number, $send_number, $config['cf_icode_id'], iconv("utf-8", "euc-kr", stripslashes($sms_content)), ""); + $SMS->Send(); + } + } +} + +// 답변 이메일전송 +if($w == 'a' && $write['qa_email_recv'] && trim($write['qa_email'])) { + include_once(G5_LIB_PATH.'/mailer.lib.php'); + + $subject = $config['cf_title'].' '.$qaconfig['qa_title'].' 답변 알림 메일'; + $content = nl2br(conv_unescape_nl($qa_content)); + + mailer($config['cf_admin_email_name'], $config['cf_admin_email'], $write['qa_email'], $subject, $content, 1); +} + +// 문의글등록 이메일전송 +if(($w == '' || $w == 'r') && trim($qaconfig['qa_admin_email'])) { + include_once(G5_LIB_PATH.'/mailer.lib.php'); + + $subject = $config['cf_title'].' '.$qaconfig['qa_title'].' 질문 알림 메일'; + $content = nl2br(conv_unescape_nl($qa_content)); + + mailer($config['cf_admin_email_name'], $qa_email, $qaconfig['qa_admin_email'], $subject, $content, 1); +} + +if($w == 'a') + $result_url = G5_BBS_URL.'/qaview.php?qa_id='.$qa_id.$qstr; +else if($w == 'u' && $write['qa_type']) + $result_url = G5_BBS_URL.'/qaview.php?qa_id='.$write['qa_parent'].$qstr; +else + $result_url = G5_BBS_URL.'/qalist.php'.preg_replace('/^&/', '?', $qstr); + +if ($file_upload_msg) + alert($file_upload_msg, $result_url); +else + goto_url($result_url); +?> \ No newline at end of file diff --git a/bbs/register.php b/bbs/register.php new file mode 100644 index 000000000..e6fbb31a3 --- /dev/null +++ b/bbs/register.php @@ -0,0 +1,19 @@ + diff --git a/bbs/register_email.php b/bbs/register_email.php new file mode 100644 index 000000000..ff5e801fc --- /dev/null +++ b/bbs/register_email.php @@ -0,0 +1,51 @@ + + +

    메일인증을 받지 못한 경우 회원정보의 메일주소를 변경 할 수 있습니다.

    + +
    + + +
    + + + + + + + + + + +
    사이트 이용정보 입력
    자동등록방지
    +
    + +
    + + 취소 +
    + +
    + + + diff --git a/bbs/register_email_update.php b/bbs/register_email_update.php new file mode 100644 index 000000000..3ae7b006f --- /dev/null +++ b/bbs/register_email_update.php @@ -0,0 +1,44 @@ + '' "; +$mb = sql_fetch($sql); +if (!$mb) { + alert("이미 메일인증 하신 회원입니다.", G5_URL); +} + +if (!chk_captcha()) { + alert('자동등록방지 숫자가 틀렸습니다.'); +} + +$sql = " select count(*) as cnt from {$g5['member_table']} where mb_id <> '{$mb_id}' and mb_email = '$mb_email' "; +$row = sql_fetch($sql); +if ($row['cnt']) { + alert("{$mb_email} 메일은 이미 존재하는 메일주소 입니다.\\n\\n다른 메일주소를 입력해 주십시오."); +} + +// 인증메일 발송 +$subject = '['.$config['cf_title'].'] 인증확인 메일입니다.'; + +$mb_name = $mb['mb_name']; +$mb_datetime = $mb['mb_datetime'] ? $mb['mb_datetime'] : G5_TIME_YMDHIS; +$mb_md5 = md5($mb_id.$mb_email.$mb_datetime); +$certify_href = G5_BBS_URL.'/email_certify.php?mb_id='.$mb_id.'&mb_md5='.$mb_md5; + +ob_start(); +include_once ('./register_form_update_mail3.php'); +$content = ob_get_contents(); +ob_end_clean(); + +mailer($config['cf_admin_email_name'], $config['cf_admin_email'], $mb_email, $subject, $content, 1); + +$sql = " update {$g5['member_table']} set mb_email = '$mb_email' where mb_id = '$mb_id' "; +sql_query($sql); + +alert("인증메일을 {$mb_email} 메일로 다시 보내 드렸습니다.\\n\\n잠시후 {$mb_email} 메일을 확인하여 주십시오.", G5_URL); +?> \ No newline at end of file diff --git a/bbs/register_form.php b/bbs/register_form.php new file mode 100644 index 000000000..4b815617d --- /dev/null +++ b/bbs/register_form.php @@ -0,0 +1,121 @@ + \ No newline at end of file diff --git a/bbs/register_form_update.php b/bbs/register_form_update.php new file mode 100644 index 000000000..a1be54f76 --- /dev/null +++ b/bbs/register_form_update.php @@ -0,0 +1,401 @@ + date("Y-m-d", G5_SERVER_TIME - ($config['cf_nick_modify'] * 86400))) + $mb_nick = $member['mb_nick']; + // 회원정보의 메일을 이전 메일로 옮기고 아래에서 비교함 + $old_email = $member['mb_email']; + } + + if ($msg = exist_mb_nick($mb_nick, $mb_id)) alert($msg, "", true, true); + if ($msg = exist_mb_email($mb_email, $mb_id)) alert($msg, "", true, true); +} + +// 사용자 코드 실행 +@include_once($member_skin_path.'/register_form_update.head.skin.php'); + +$mb_dir = G5_DATA_PATH.'/member/'.substr($mb_id,0,2); + +// 아이콘 삭제 +if (isset($_POST['del_mb_icon'])) { + @unlink($mb_dir.'/'.$mb_id.'.gif'); +} + +$msg = ""; + +// 아이콘 업로드 +$mb_icon = ''; +if (isset($_FILES['mb_icon']) && is_uploaded_file($_FILES['mb_icon']['tmp_name'])) { + if (preg_match("/(\.gif)$/i", $_FILES['mb_icon']['name'])) { + // 아이콘 용량이 설정값보다 이하만 업로드 가능 + if ($_FILES['mb_icon']['size'] <= $config['cf_member_icon_size']) { + @mkdir($mb_dir, G5_DIR_PERMISSION); + @chmod($mb_dir, G5_DIR_PERMISSION); + $dest_path = $mb_dir.'/'.$mb_id.'.gif'; + move_uploaded_file($_FILES['mb_icon']['tmp_name'], $dest_path); + chmod($dest_path, G5_FILE_PERMISSION); + if (file_exists($dest_path)) { + //=================================================================\ + // 090714 + // gif 파일에 악성코드를 심어 업로드 하는 경우를 방지 + // 에러메세지는 출력하지 않는다. + //----------------------------------------------------------------- + $size = getimagesize($dest_path); + if ($size[2] != 1) // gif 파일이 아니면 올라간 이미지를 삭제한다. + @unlink($dest_path); + else + // 아이콘의 폭 또는 높이가 설정값 보다 크다면 이미 업로드 된 아이콘 삭제 + if ($size[0] > $config['cf_member_icon_width'] || $size[1] > $config['cf_member_icon_height']) + @unlink($dest_path); + //=================================================================\ + } + } else { + $msg .= '회원아이콘을 '.number_format($config['cf_member_icon_size']).'바이트 이하로 업로드 해주십시오.'; + } + + } else { + $msg .= $_FILES['mb_icon']['name'].'은(는) gif 파일이 아닙니다.'; + } +} + +//=============================================================== +// 본인확인 +//--------------------------------------------------------------- +$mb_hp = hyphen_hp_number($mb_hp); +if($config['cf_cert_use'] && $_SESSION['ss_cert_type'] && $_SESSION['ss_cert_dupinfo']) { + // 중복체크 + $sql = " select mb_id from {$g5['member_table']} where mb_id <> '{$member['mb_id']}' and mb_dupinfo = '{$_SESSION['ss_cert_dupinfo']}' "; + $row = sql_fetch($sql); + if ($row['mb_id']) { + alert("입력하신 본인확인 정보로 가입된 내역이 존재합니다.\\n회원아이디 : ".$row['mb_id']); + } +} + +$sql_certify = ''; +$md5_cert_no = $_SESSION['ss_cert_no']; +$cert_type = $_SESSION['ss_cert_type']; +if ($config['cf_cert_use'] && $cert_type && $md5_cert_no) { + // 해시값이 같은 경우에만 본인확인 값을 저장한다. + if ($_SESSION['ss_cert_hash'] == md5($mb_name.$cert_type.$_SESSION['ss_cert_birth'].$md5_cert_no)) { + $sql_certify .= " , mb_hp = '{$mb_hp}' "; + $sql_certify .= " , mb_certify = '{$cert_type}' "; + $sql_certify .= " , mb_adult = '{$_SESSION['ss_cert_adult']}' "; + $sql_certify .= " , mb_birth = '{$_SESSION['ss_cert_birth']}' "; + $sql_certify .= " , mb_sex = '{$_SESSION['ss_cert_sex']}' "; + $sql_certify .= " , mb_dupinfo = '{$_SESSION['ss_cert_dupinfo']}' "; + if($w == 'u') + $sql_certify .= " , mb_name = '{$mb_name}' "; + } else { + $sql_certify .= " , mb_hp = '{$mb_hp}' "; + $sql_certify .= " , mb_certify = '' "; + $sql_certify .= " , mb_adult = 0 "; + $sql_certify .= " , mb_birth = '' "; + $sql_certify .= " , mb_sex = '' "; + } +} else { + if (get_session("ss_reg_mb_name") != $mb_name || get_session("ss_reg_mb_hp") != $mb_hp) { + $sql_certify .= " , mb_hp = '{$mb_hp}' "; + $sql_certify .= " , mb_certify = '' "; + $sql_certify .= " , mb_adult = 0 "; + $sql_certify .= " , mb_birth = '' "; + $sql_certify .= " , mb_sex = '' "; + } +} +//=============================================================== + +if ($w == '') { + + $sql = " insert into {$g5['member_table']} + set mb_id = '{$mb_id}', + mb_password = '".sql_password($mb_password)."', + mb_name = '{$mb_name}', + mb_nick = '{$mb_nick}', + mb_nick_date = '".G5_TIME_YMD."', + mb_email = '{$mb_email}', + mb_homepage = '{$mb_homepage}', + mb_tel = '{$mb_tel}', + mb_zip1 = '{$mb_zip1}', + mb_zip2 = '{$mb_zip2}', + mb_addr1 = '{$mb_addr1}', + mb_addr2 = '{$mb_addr2}', + mb_addr3 = '{$mb_addr3}', + mb_addr_jibeon = '{$mb_addr_jibeon}', + mb_signature = '{$mb_signature}', + mb_profile = '{$mb_profile}', + mb_today_login = '".G5_TIME_YMDHIS."', + mb_datetime = '".G5_TIME_YMDHIS."', + mb_ip = '{$_SERVER['REMOTE_ADDR']}', + mb_level = '{$config['cf_register_level']}', + mb_recommend = '{$mb_recommend}', + mb_login_ip = '{$_SERVER['REMOTE_ADDR']}', + mb_mailling = '{$mb_mailling}', + mb_sms = '{$mb_sms}', + mb_open = '{$mb_open}', + mb_open_date = '".G5_TIME_YMD."', + mb_1 = '{$mb_1}', + mb_2 = '{$mb_2}', + mb_3 = '{$mb_3}', + mb_4 = '{$mb_4}', + mb_5 = '{$mb_5}', + mb_6 = '{$mb_6}', + mb_7 = '{$mb_7}', + mb_8 = '{$mb_8}', + mb_9 = '{$mb_9}', + mb_10 = '{$mb_10}' + {$sql_certify} "; + + // 이메일 인증을 사용하지 않는다면 이메일 인증시간을 바로 넣는다 + if (!$config['cf_use_email_certify']) + $sql .= " , mb_email_certify = '".G5_TIME_YMDHIS."' "; + sql_query($sql); + + // 회원가입 포인트 부여 + insert_point($mb_id, $config['cf_register_point'], '회원가입 축하', '@member', $mb_id, '회원가입'); + + // 추천인에게 포인트 부여 + if ($config['cf_use_recommend'] && $mb_recommend) + insert_point($mb_recommend, $config['cf_recommend_point'], $mb_id.'의 추천인', '@member', $mb_recommend, $mb_id.' 추천'); + + // 회원님께 메일 발송 + if ($config['cf_email_mb_member']) { + $subject = '['.$config['cf_title'].'] 회원가입을 축하드립니다.'; + + $mb_md5 = md5($mb_id.$mb_email.G5_TIME_YMDHIS); + $certify_href = G5_BBS_URL.'/email_certify.php?mb_id='.$mb_id.'&mb_md5='.$mb_md5; + + ob_start(); + include_once ('./register_form_update_mail1.php'); + $content = ob_get_contents(); + ob_end_clean(); + + mailer($config['cf_admin_email_name'], $config['cf_admin_email'], $mb_email, $subject, $content, 1); + + // 메일인증을 사용하는 경우 가입메일에 인증 url이 있으므로 인증메일을 다시 발송되지 않도록 함 + if($config['cf_use_email_certify']) + $old_email = $mb_email; + } + + // 최고관리자님께 메일 발송 + if ($config['cf_email_mb_super_admin']) { + $subject = '['.$config['cf_title'].'] '.$mb_nick .' 님께서 회원으로 가입하셨습니다.'; + + ob_start(); + include_once ('./register_form_update_mail2.php'); + $content = ob_get_contents(); + ob_end_clean(); + + mailer($mb_nick, $mb_email, $config['cf_admin_email'], $subject, $content, 1); + } + + // 메일인증 사용하지 않는 경우에만 로그인 + if (!$config['cf_use_email_certify']) + set_session('ss_mb_id', $mb_id); + + set_session('ss_mb_reg', $mb_id); + +} else if ($w == 'u') { + + if (!trim($_SESSION['ss_mb_id'])) + alert('로그인 되어 있지 않습니다.'); + + if ($_SESSION['ss_mb_id'] != $mb_id) + alert("로그인된 정보와 수정하려는 정보가 틀리므로 수정할 수 없습니다.\\n만약 올바르지 않은 방법을 사용하신다면 바로 중지하여 주십시오."); + + $sql_password = ""; + if ($mb_password) + $sql_password = " , mb_password = '".sql_password($mb_password)."' "; + + $sql_icon = ""; + if ($mb_icon) + $sql_icon = " , mb_icon = '{$mb_icon}' "; + + $sql_nick_date = ""; + if ($mb_nick_default != $mb_nick) + $sql_nick_date = " , mb_nick_date = '".G5_TIME_YMD."' "; + + $sql_open_date = ""; + if ($mb_open_default != $mb_open) + $sql_open_date = " , mb_open_date = '".G5_TIME_YMD."' "; + + // 이전 메일주소와 수정한 메일주소가 틀리다면 인증을 다시 해야하므로 값을 삭제 + $sql_email_certify = ''; + if ($old_email != $mb_email && $config['cf_use_email_certify']) + $sql_email_certify = " , mb_email_certify = '' "; + + $sql = " update {$g5['member_table']} + set mb_nick = '{$mb_nick}', + mb_mailling = '{$mb_mailling}', + mb_sms = '{$mb_sms}', + mb_open = '{$mb_open}', + mb_email = '{$mb_email}', + mb_homepage = '{$mb_homepage}', + mb_tel = '{$mb_tel}', + mb_zip1 = '{$mb_zip1}', + mb_zip2 = '{$mb_zip2}', + mb_addr1 = '{$mb_addr1}', + mb_addr2 = '{$mb_addr2}', + mb_addr3 = '{$mb_addr3}', + mb_addr_jibeon = '{$mb_addr_jibeon}', + mb_signature = '{$mb_signature}', + mb_profile = '{$mb_profile}', + mb_1 = '{$mb_1}', + mb_2 = '{$mb_2}', + mb_3 = '{$mb_3}', + mb_4 = '{$mb_4}', + mb_5 = '{$mb_5}', + mb_6 = '{$mb_6}', + mb_7 = '{$mb_7}', + mb_8 = '{$mb_8}', + mb_9 = '{$mb_9}', + mb_10 = '{$mb_10}' + {$sql_password} + {$sql_icon} + {$sql_nick_date} + {$sql_open_date} + {$sql_email_certify} + {$sql_certify} + where mb_id = '$mb_id' "; + sql_query($sql); +} + + +// 인증메일 발송 +if ($config['cf_use_email_certify'] && $old_email != $mb_email) { + $subject = '['.$config['cf_title'].'] 인증확인 메일입니다.'; + + $mb_datetime = $member['mb_datetime'] ? $member['mb_datetime'] : G5_TIME_YMDHIS; + $mb_md5 = md5($mb_id.$mb_email.$mb_datetime); + $certify_href = G5_BBS_URL.'/email_certify.php?mb_id='.$mb_id.'&mb_md5='.$mb_md5; + + ob_start(); + include_once ('./register_form_update_mail3.php'); + $content = ob_get_contents(); + ob_end_clean(); + + mailer($config['cf_title'], $config['cf_admin_email'], $mb_email, $subject, $content, 1); +} + + +// 사용자 코드 실행 +@include_once ($member_skin_path.'/register_form_update.tail.skin.php'); + +unset($_SESSION['ss_cert_type']); +unset($_SESSION['ss_cert_no']); +unset($_SESSION['ss_cert_hash']); +unset($_SESSION['ss_cert_birth']); +unset($_SESSION['ss_cert_adult']); + +if ($msg) + echo ''; + +if ($w == "") { + goto_url(G5_HTTP_BBS_URL.'/register_result.php'); +} else if ($w == 'u') { + $row = sql_fetch(" select mb_password from {$g5['member_table']} where mb_id = '{$member['mb_id']}' "); + $tmp_password = $row['mb_password']; + + if ($old_email != $mb_email && $config['cf_use_email_certify']) { + set_session("ss_mb_id", ""); + alert('회원 정보가 수정 되었습니다.\n\nE-mail 주소가 변경되었으므로 다시 인증하셔야 합니다.', G5_URL); + } else { + alert('회원 정보가 수정 되었습니다.', G5_URL); + } +} +?> diff --git a/bbs/register_form_update_mail1.php b/bbs/register_form_update_mail1.php new file mode 100644 index 000000000..e2ec67c28 --- /dev/null +++ b/bbs/register_form_update_mail1.php @@ -0,0 +1,39 @@ + + + + + + +회원가입 축하 메일 + + + + +
    +
    +

    + 회원가입을 축하합니다. +

    + + + +

    + 님의 회원가입을 진심으로 축하합니다.
    + 회원님의 성원에 보답하고자 더욱 더 열심히 하겠습니다.
    + 아래의 메일인증을 클릭하시면 회원가입이 완료됩니다.
    + 감사합니다. +

    + + + 메일인증 + + 사이트바로가기 + +
    +
    + + + diff --git a/bbs/register_form_update_mail2.php b/bbs/register_form_update_mail2.php new file mode 100644 index 000000000..f30b7b9e4 --- /dev/null +++ b/bbs/register_form_update_mail2.php @@ -0,0 +1,35 @@ + + + + + + +회원가입 알림 메일 + + + + +
    +
    +

    + 회원가입 알림 메일 +

    + + + +

    + 님께서 회원가입 하셨습니다.
    + 회원 아이디 :
    + 회원 이름 :
    + 회원 닉네임 :
    + 추천인아이디 : +

    + 관리자에서 회원정보 확인하기 +
    +
    + + + diff --git a/bbs/register_form_update_mail3.php b/bbs/register_form_update_mail3.php new file mode 100644 index 000000000..5ae4d46a9 --- /dev/null +++ b/bbs/register_form_update_mail3.php @@ -0,0 +1,39 @@ + + + + + + +회원 인증 메일 + + + + +
    +
    +

    + 회원 인증 메일입니다. +

    + + + +

    + + 님의 E-mail 주소가 변경되었습니다.

    + + + 아래의 주소를 클릭하시면 인증이 완료됩니다.
    +

    + + 회원님의 성원에 보답하고자 더욱 더 열심히 하겠습니다.
    + 감사합니다. +

    + 로그인 +
    +
    + + + diff --git a/bbs/register_result.php b/bbs/register_result.php new file mode 100644 index 000000000..831c98692 --- /dev/null +++ b/bbs/register_result.php @@ -0,0 +1,15 @@ + \ No newline at end of file diff --git a/bbs/rss.php b/bbs/rss.php new file mode 100644 index 000000000..6bf5b1b55 --- /dev/null +++ b/bbs/rss.php @@ -0,0 +1,90 @@ +"), array("&", "<", ">"), $str); + + /* + $str = preg_replace("/&/", "&", $str); + $str = preg_replace("//", ">", $str); + */ + + return $str; +} + +$sql = " select gr_id, bo_subject, bo_page_rows, bo_read_level, bo_use_rss_view from {$g5['board_table']} where bo_table = '$bo_table' "; +$row = sql_fetch($sql); +$subj2 = specialchars_replace($row['bo_subject'], 255); +$lines = $row['bo_page_rows']; + +// 비회원 읽기가 가능한 게시판만 RSS 지원 +if ($row['bo_read_level'] >= 2) { + echo '비회원 읽기가 가능한 게시판만 RSS 지원합니다.'; + exit; +} + +// RSS 사용 체크 +if (!$row['bo_use_rss_view']) { + echo 'RSS 보기가 금지되어 있습니다.'; + exit; +} + +header('Content-type: text/xml'); +header('Cache-Control: no-cache, must-revalidate'); +header('Pragma: no-cache'); + +$sql = " select gr_subject from {$g5['group_table']} where gr_id = '{$row['gr_id']}' "; +$row = sql_fetch($sql); +$subj1 = specialchars_replace($row['gr_subject'], 255); + +echo ''."\n"; +?> + + +<?php echo specialchars_replace($config['cf_title'].' > '.$subj1.' > '.$subj2) ?> + +테스트 버전 0.2 (2004-04-26) +ko + + + + +<?php echo specialchars_replace($row['wr_subject']) ?> + +]]> + + + + + +'."\n"; +echo ''."\n"; +?> \ No newline at end of file diff --git a/bbs/scrap.php b/bbs/scrap.php new file mode 100644 index 000000000..af0cf8fd0 --- /dev/null +++ b/bbs/scrap.php @@ -0,0 +1,60 @@ + diff --git a/bbs/scrap_delete.php b/bbs/scrap_delete.php new file mode 100644 index 000000000..6d61659f5 --- /dev/null +++ b/bbs/scrap_delete.php @@ -0,0 +1,11 @@ + diff --git a/bbs/scrap_popin.php b/bbs/scrap_popin.php new file mode 100644 index 000000000..a02ec4677 --- /dev/null +++ b/bbs/scrap_popin.php @@ -0,0 +1,59 @@ + + alert('회원만 접근 가능합니다.'); + opener.location.href = '$href'; + window.close(); + + +HEREDOC; + exit; +} + +echo << + if (window.name != 'win_scrap') { + alert('올바른 방법으로 사용해 주십시오.'); + window.close(); + } + +HEREDOC; + +if ($write['wr_is_comment']) + alert_close('코멘트는 스크랩 할 수 없습니다.'); + +$sql = " select count(*) as cnt from {$g5['scrap_table']} + where mb_id = '{$member['mb_id']}' + and bo_table = '$bo_table' + and wr_id = '$wr_id' "; +$row = sql_fetch($sql); +if ($row['cnt']) { + echo << + if (confirm('이미 스크랩하신 글 입니다.\\n\\n지금 스크랩을 확인하시겠습니까?')) + document.location.href = './scrap.php'; + else + window.close(); + + +HEREDOC; + exit; +} + +include_once($member_skin_path.'/scrap_popin.skin.php'); + +include_once(G5_PATH.'/tail.sub.php'); +?> diff --git a/bbs/scrap_popin_update.php b/bbs/scrap_popin_update.php new file mode 100644 index 000000000..49fe298ad --- /dev/null +++ b/bbs/scrap_popin_update.php @@ -0,0 +1,104 @@ + alert(\'회원만 접근 가능합니다.\'); top.location.href = \''.$href.'\'; '; + exit; +} + +$sql = " select count(*) as cnt from {$g5['scrap_table']} + where mb_id = '{$member['mb_id']}' + and bo_table = '$bo_table' + and wr_id = '$wr_id' "; +$row = sql_fetch($sql); +if ($row['cnt']) +{ + echo ' + + '; + exit; +} + +// 덧글이 넘어오고 코멘트를 쓸 권한이 있다면 +if ($wr_content && ($member['mb_level'] >= $board['bo_comment_level'])) +{ + $wr = get_write($write_table, $wr_id); + // 원글이 존재한다면 + if ($wr['wr_id']) + { + $mb_id = $member['mb_id']; + $wr_name = $member['mb_nick']; + $wr_password = $member['mb_password']; + $wr_email = $member['mb_email']; + $wr_homepage = $member['mb_homepage']; + + $sql = " select max(wr_comment) as max_comment from $write_table + where wr_parent = '$wr_id' and wr_is_comment = '1' "; + $row = sql_fetch($sql); + $row['max_comment'] += 1; + + $sql = " insert into $write_table + set ca_name = '{$wr['ca_name']}', + wr_option = '', + wr_num = '{$wr['wr_num']}', + wr_reply = '', + wr_parent = '$wr_id', + wr_is_comment = '1', + wr_comment = '{$row['max_comment']}', + wr_content = '$wr_content', + mb_id = '$mb_id', + wr_password = '$wr_password', + wr_name = '$wr_name', + wr_email = '$wr_email', + wr_homepage = '$wr_homepage', + wr_datetime = '".G5_TIME_YMDHIS."', + wr_ip = '{$_SERVER['REMOTE_ADDR']}' "; + sql_query($sql); + + $comment_id = mysql_insert_id(); + + // 원글에 코멘트수 증가 + sql_query(" update $write_table set wr_comment = wr_comment + 1 where wr_id = '$wr_id' "); + + // 새글 INSERT + sql_query(" insert into {$g5['board_new_table']} ( bo_table, wr_id, wr_parent, bn_datetime, mb_id ) values ( '$bo_table', '$comment_id', '$wr_id', '".G5_TIME_YMDHIS."', '{$member['mb_id']}' ) "); + + // 코멘트 1 증가 + sql_query(" update {$g5['board_table']} set bo_count_comment = bo_count_comment + 1 where bo_table = '$bo_table' "); + + // 포인트 부여 + insert_point($member['mb_id'], $board['bo_comment_point'], "{$board['bo_subject']} {$wr_id}-{$comment_id} 코멘트쓰기", $bo_table, $comment_id, '코멘트'); + } +} + +$sql = " insert into {$g5['scrap_table']} ( mb_id, bo_table, wr_id, ms_datetime ) values ( '{$member['mb_id']}', '$bo_table', '$wr_id', '".G5_TIME_YMDHIS."' ) "; +sql_query($sql); + +delete_cache_latest($bo_table); + +echo << + if (confirm('이 글을 스크랩 하였습니다.\\n\\n지금 스크랩을 확인하시겠습니까?')) + document.location.href = './scrap.php'; + else + window.close(); + + +HEREDOC; +?> diff --git a/bbs/search.php b/bbs/search.php new file mode 100644 index 000000000..ad392ec0f --- /dev/null +++ b/bbs/search.php @@ -0,0 +1,237 @@ + '' "; + $row3 = sql_fetch($sql3); + if (!$row3['cnt']) + continue; + } + } + } + $g5_search['tables'][] = $row['bo_table']; + $g5_search['read_level'][] = $row['bo_read_level']; + } + + $search_query = 'sfl='.urlencode($sfl).'&stx='.urlencode($stx).'&sop='.$sop; + + + $text_stx = get_text(stripslashes($stx)); + + $op1 = ''; + + // 검색어를 구분자로 나눈다. 여기서는 공백 + $s = explode(' ', strip_tags($stx)); + + // 검색필드를 구분자로 나눈다. 여기서는 + + $field = explode('||', trim($sfl)); + + $str = '('; + for ($i=0; $i'.$row2['bo_subject'].''.$row['cnt'].''; + } + } + + $rows = $srows; + $total_page = ceil($total_count / $rows); // 전체 페이지 계산 + if ($page < 1) { $page = 1; } // 페이지가 없으면 첫 페이지 (1 페이지) + $from_record = ($page - 1) * $rows; // 시작 열을 구함 + + for ($i=0; $i= $rows) + break; + } + sql_free_result($result); + + if ($k >= $rows) + break; + + $from_record = 0; + } + + $write_pages = get_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $page, $total_page, $_SERVER['PHP_SELF'].'?'.$search_query.'&gr_id='.$gr_id.'&srows='.$srows.'&onetable='.$onetable.'&page='); +} + +$group_select = ''; + +if (!$sfl) $sfl = 'wr_subject'; +if (!$sop) $sop = 'or'; + +include_once($search_skin_path.'/search.skin.php'); + +include_once('./_tail.php'); +?> diff --git a/bbs/sns_send.php b/bbs/sns_send.php new file mode 100644 index 000000000..1e9b225db --- /dev/null +++ b/bbs/sns_send.php @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/bbs/view.php b/bbs/view.php new file mode 100644 index 000000000..e570a7763 --- /dev/null +++ b/bbs/view.php @@ -0,0 +1,146 @@ + '{$write['wr_reply']}' {$sql_search} order by wr_num, wr_reply limit 1 "; + $next = sql_fetch($sql); + // 위의 쿼리문으로 값을 얻지 못했다면 + if (!$next['wr_id']) { + $sql = " select wr_id, wr_subject from {$write_table} where wr_is_comment = 0 and wr_num > '{$write['wr_num']}' {$sql_search} order by wr_num, wr_reply limit 1 "; + $next = sql_fetch($sql); + } +} + +// 이전글 링크 +$prev_href = ''; +if (isset($prev['wr_id']) && $prev['wr_id']) { + $prev_wr_subject = get_text(cut_str($prev['wr_subject'], 255)); + $prev_href = './board.php?bo_table='.$bo_table.'&wr_id='.$prev['wr_id'].$qstr; +} + +// 다음글 링크 +$next_href = ''; +if (isset($next['wr_id']) && $next['wr_id']) { + $next_wr_subject = get_text(cut_str($next['wr_subject'], 255)); + $next_href = './board.php?bo_table='.$bo_table.'&wr_id='.$next['wr_id'].$qstr; +} + +// 쓰기 링크 +$write_href = ''; +if ($member['mb_level'] >= $board['bo_write_level']) + $write_href = './write.php?bo_table='.$bo_table; + +// 답변 링크 +$reply_href = ''; +if ($member['mb_level'] >= $board['bo_reply_level']) + $reply_href = './write.php?w=r&bo_table='.$bo_table.'&wr_id='.$wr_id.$qstr; + +// 수정, 삭제 링크 +$update_href = $delete_href = ''; +// 로그인중이고 자신의 글이라면 또는 관리자라면 비밀번호를 묻지 않고 바로 수정, 삭제 가능 +if (($member['mb_id'] && ($member['mb_id'] == $write['mb_id'])) || $is_admin) { + $update_href = './write.php?w=u&bo_table='.$bo_table.'&wr_id='.$wr_id.'&page='.$page.$qstr; + $delete_href = './delete.php?bo_table='.$bo_table.'&wr_id='.$wr_id.'&page='.$page.urldecode($qstr); + if ($is_admin) + { + set_session("ss_delete_token", $token = uniqid(time())); + $delete_href ='./delete.php?bo_table='.$bo_table.'&wr_id='.$wr_id.'&token='.$token.'&page='.$page.urldecode($qstr); + } +} +else if (!$write['mb_id']) { // 회원이 쓴 글이 아니라면 + $update_href = './password.php?w=u&bo_table='.$bo_table.'&wr_id='.$wr_id.'&page='.$page.$qstr; + $delete_href = './password.php?w=d&bo_table='.$bo_table.'&wr_id='.$wr_id.'&page='.$page.$qstr; +} + +// 최고, 그룹관리자라면 글 복사, 이동 가능 +$copy_href = $move_href = ''; +if ($write['wr_reply'] == '' && ($is_admin == 'super' || $is_admin == 'group')) { + $copy_href = './move.php?sw=copy&bo_table='.$bo_table.'&wr_id='.$wr_id.'&page='.$page.$qstr; + $move_href = './move.php?sw=move&bo_table='.$bo_table.'&wr_id='.$wr_id.'&page='.$page.$qstr; +} + +$scrap_href = ''; +$good_href = ''; +$nogood_href = ''; +if ($is_member) { + // 스크랩 링크 + $scrap_href = './scrap_popin.php?bo_table='.$bo_table.'&wr_id='.$wr_id; + + // 추천 링크 + if ($board['bo_use_good']) + $good_href = './good.php?bo_table='.$bo_table.'&wr_id='.$wr_id.'&good=good'; + + // 비추천 링크 + if ($board['bo_use_nogood']) + $nogood_href = './good.php?bo_table='.$bo_table.'&wr_id='.$wr_id.'&good=nogood'; +} + +$view = get_view($write, $board, $board_skin_path); + +if (strstr($sfl, 'subject')) + $view['subject'] = search_font($stx, $view['subject']); + +$html = 0; +if (strstr($view['wr_option'], 'html1')) + $html = 1; +else if (strstr($view['wr_option'], 'html2')) + $html = 2; + +$view['content'] = conv_content($view['wr_content'], $html); +if (strstr($sfl, 'content')) + $view['content'] = search_font($stx, $view['content']); + +//$view['rich_content'] = preg_replace("/{이미지\:([0-9]+)[:]?([^}]*)}/ie", "view_image(\$view, '\\1', '\\2')", $view['content']); +function conv_rich_content($matches) +{ + global $view; + return view_image($view, $matches[1], $matches[2]); +} +$view['rich_content'] = preg_replace_callback("/{이미지\:([0-9]+)[:]?([^}]*)}/i", "conv_rich_content", $view['content']); + +$is_signature = false; +$signature = ''; +if ($board['bo_use_signature'] && $view['mb_id']) { + $is_signature = true; + $mb = get_member($view['mb_id']); + $signature = $mb['mb_signature']; + + $signature = conv_content($signature, 1); +} + +include_once($board_skin_path.'/view.skin.php'); + +@include_once($board_skin_path.'/view.tail.skin.php'); +?> diff --git a/bbs/view_comment.php b/bbs/view_comment.php new file mode 100644 index 000000000..48feadc5a --- /dev/null +++ b/bbs/view_comment.php @@ -0,0 +1,120 @@ += $board['bo_comment_level']) + $is_comment_write = true; + +// 코멘트 출력 +//$sql = " select * from {$write_table} where wr_parent = '{$wr_id}' and wr_is_comment = 1 order by wr_comment desc, wr_comment_reply "; +$sql = " select * from $write_table where wr_parent = '$wr_id' and wr_is_comment = 1 order by wr_comment, wr_comment_reply "; +$result = sql_query($sql); +for ($i=0; $row=sql_fetch_array($result); $i++) +{ + $list[$i] = $row; + + //$list[$i]['name'] = get_sideview($row['mb_id'], cut_str($row['wr_name'], 20, ''), $row['wr_email'], $row['wr_homepage']); + + $tmp_name = get_text(cut_str($row['wr_name'], $config['cf_cut_name'])); // 설정된 자리수 만큼만 이름 출력 + if ($board['bo_use_sideview']) + $list[$i]['name'] = get_sideview($row['mb_id'], $tmp_name, $row['wr_email'], $row['wr_homepage']); + else + $list[$i]['name'] = ''.$tmp_name.''; + + + + // 공백없이 연속 입력한 문자 자르기 (way 보드 참고. way.co.kr) + //$list[$i]['content'] = eregi_replace("[^ \n<>]{130}", "\\0\n", $row['wr_content']); + + $list[$i]['content'] = $list[$i]['content1']= '비밀글 입니다.'; + if (!strstr($row['wr_option'], 'secret') || + $is_admin || + ($write['mb_id']==$member['mb_id'] && $member['mb_id']) || + ($row['mb_id']==$member['mb_id'] && $member['mb_id'])) { + $list[$i]['content1'] = $row['wr_content']; + $list[$i]['content'] = conv_content($row['wr_content'], 0, 'wr_content'); + $list[$i]['content'] = search_font($stx, $list[$i]['content']); + } + + $list[$i]['datetime'] = substr($row['wr_datetime'],2,14); + + // 관리자가 아니라면 중간 IP 주소를 감춘후 보여줍니다. + $list[$i]['ip'] = $row['wr_ip']; + if (!$is_admin) + $list[$i]['ip'] = preg_replace("/([0-9]+).([0-9]+).([0-9]+).([0-9]+)/", G5_IP_DISPLAY, $row['wr_ip']); + + $list[$i]['is_reply'] = false; + $list[$i]['is_edit'] = false; + $list[$i]['is_del'] = false; + if ($is_comment_write || $is_admin) + { + if ($member['mb_id']) + { + if ($row['mb_id'] == $member['mb_id'] || $is_admin) + { + $list[$i]['del_link'] = './delete_comment.php?bo_table='.$bo_table.'&comment_id='.$row['wr_id'].'&token='.$token.'&page='.$page.$qstr; + $list[$i]['is_edit'] = true; + $list[$i]['is_del'] = true; + } + } + else + { + if (!$row['mb_id']) { + $list[$i]['del_link'] = './password.php?w=x&bo_table='.$bo_table.'&comment_id='.$row['wr_id'].'&page='.$page.$qstr; + $list[$i]['is_del'] = true; + } + } + + if (strlen($row['wr_comment_reply']) < 5) + $list[$i]['is_reply'] = true; + } + + // 05.05.22 + // 답변있는 코멘트는 수정, 삭제 불가 + if ($i > 0 && !$is_admin) + { + if ($row['wr_comment_reply']) + { + $tmp_comment_reply = substr($row['wr_comment_reply'], 0, strlen($row['wr_comment_reply']) - 1); + if ($tmp_comment_reply == $list[$i-1]['wr_comment_reply']) + { + $list[$i-1]['is_edit'] = false; + $list[$i-1]['is_del'] = false; + } + } + } +} + +// 코멘트수 제한 설정값 +if ($is_admin) +{ + $comment_min = $comment_max = 0; +} +else +{ + $comment_min = (int)$board['bo_comment_min']; + $comment_max = (int)$board['bo_comment_max']; +} + +include_once($board_skin_path.'/view_comment.skin.php'); + +if (!$member['mb_id']) // 비회원일 경우에만 + echo ''."\n"; + +@include_once($board_skin_path.'/view_comment.tail.skin.php'); +?> \ No newline at end of file diff --git a/bbs/view_image.php b/bbs/view_image.php new file mode 100644 index 000000000..779f83a30 --- /dev/null +++ b/bbs/view_image.php @@ -0,0 +1,110 @@ +'; +} else { + alert_close('파일이 존재하지 않습니다.'); +} +?> + +
    + + + + \ No newline at end of file diff --git a/bbs/visit_insert.inc.php b/bbs/visit_insert.inc.php new file mode 100644 index 000000000..dccd1326f --- /dev/null +++ b/bbs/visit_insert.inc.php @@ -0,0 +1,63 @@ + diff --git a/bbs/write.php b/bbs/write.php new file mode 100644 index 000000000..37faff604 --- /dev/null +++ b/bbs/write.php @@ -0,0 +1,417 @@ + 0) ? $member['mb_point'] : 0; + if ($tmp_point + $board['bo_write_point'] < 0 && !$is_admin) { + alert('보유하신 포인트('.number_format($member['mb_point']).')가 없거나 모자라서 글쓰기('.number_format($board['bo_write_point']).')가 불가합니다.\\n\\n포인트를 적립하신 후 다시 글쓰기 해 주십시오.'); + } + } + + $title_msg = '글쓰기'; +} else if ($w == 'u') { + // 김선용 1.00 : 글쓰기 권한과 수정은 별도로 처리되어야 함 + //if ($member['mb_level'] < $board['bo_write_level']) { + if($member['mb_id'] && $write['mb_id'] == $member['mb_id']) { + ; + } else if ($member['mb_level'] < $board['bo_write_level']) { + if ($member['mb_id']) { + alert('글을 수정할 권한이 없습니다.'); + } else { + alert('글을 수정할 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.', './login.php?'.$qstr.'&url='.urlencode($_SERVER['PHP_SELF'].'?bo_table='.$bo_table)); + } + } + + $len = strlen($write['wr_reply']); + if ($len < 0) $len = 0; + $reply = substr($write['wr_reply'], 0, $len); + + // 원글만 구한다. + $sql = " select count(*) as cnt from {$write_table} + where wr_reply like '{$reply}%' + and wr_id <> '{$write['wr_id']}' + and wr_num = '{$write['wr_num']}' + and wr_is_comment = 0 "; + $row = sql_fetch($sql); + if ($row['cnt'] && !$is_admin) + alert('이 글과 관련된 답변글이 존재하므로 수정 할 수 없습니다.\\n\\n답변글이 있는 원글은 수정할 수 없습니다.'); + + // 코멘트 달린 원글의 수정 여부 + $sql = " select count(*) as cnt from {$write_table} + where wr_parent = '{$wr_id}' + and mb_id <> '{$member['mb_id']}' + and wr_is_comment = 1 "; + $row = sql_fetch($sql); + if ($board['bo_count_modify'] && $row['cnt'] >= $board['bo_count_modify'] && !$is_admin) + alert('이 글과 관련된 댓글이 존재하므로 수정 할 수 없습니다.\\n\\n댓글이 '.$board['bo_count_modify'].'건 이상 달린 원글은 수정할 수 없습니다.'); + + $title_msg = '글수정'; +} else if ($w == 'r') { + if ($member['mb_level'] < $board['bo_reply_level']) { + if ($member['mb_id']) + alert('글을 답변할 권한이 없습니다.'); + else + alert('글을 답변할 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.', './login.php?$qstr&url='.urlencode($_SERVER['PHP_SELF'].'?bo_table='.$bo_table)); + } + + $tmp_point = isset($member['mb_point']) ? $member['mb_point'] : 0; + if ($tmp_point + $board['bo_write_point'] < 0 && !$is_admin) + alert('보유하신 포인트('.number_format($member['mb_point']).')가 없거나 모자라서 글답변('.number_format($board['bo_comment_point']).')가 불가합니다.\\n\\n포인트를 적립하신 후 다시 글답변 해 주십시오.'); + + //if (preg_match("/[^0-9]{0,1}{$wr_id}[\r]{0,1}/",$board['bo_notice'])) + if (in_array((int)$wr_id, $notice_array)) + alert('공지에는 답변 할 수 없습니다.'); + + //---------- + // 4.06.13 : 비밀글을 타인이 열람할 수 있는 오류 수정 (헐랭이, 플록님께서 알려주셨습니다.) + // 코멘트에는 원글의 답변이 불가하므로 + if ($write['wr_is_comment']) + alert('정상적인 접근이 아닙니다.'); + + // 비밀글인지를 검사 + if (strstr($write['wr_option'], 'secret')) { + if ($write['mb_id']) { + // 회원의 경우는 해당 글쓴 회원 및 관리자 + if (!($write['mb_id'] == $member['mb_id'] || $is_admin)) + alert('비밀글에는 자신 또는 관리자만 답변이 가능합니다.'); + } else { + // 비회원의 경우는 비밀글에 답변이 불가함 + if (!$is_admin) + alert('비회원의 비밀글에는 답변이 불가합니다.'); + } + } + //---------- + + // 게시글 배열 참조 + $reply_array = &$write; + + // 최대 답변은 테이블에 잡아놓은 wr_reply 사이즈만큼만 가능합니다. + if (strlen($reply_array['wr_reply']) == 10) + alert('더 이상 답변하실 수 없습니다.\\n\\n답변은 10단계 까지만 가능합니다.'); + + $reply_len = strlen($reply_array['wr_reply']) + 1; + if ($board['bo_reply_order']) { + $begin_reply_char = 'A'; + $end_reply_char = 'Z'; + $reply_number = +1; + $sql = " select MAX(SUBSTRING(wr_reply, {$reply_len}, 1)) as reply from {$write_table} where wr_num = '{$reply_array['wr_num']}' and SUBSTRING(wr_reply, {$reply_len}, 1) <> '' "; + } else { + $begin_reply_char = 'Z'; + $end_reply_char = 'A'; + $reply_number = -1; + $sql = " select MIN(SUBSTRING(wr_reply, {$reply_len}, 1)) as reply from {$write_table} where wr_num = '{$reply_array['wr_num']}' and SUBSTRING(wr_reply, {$reply_len}, 1) <> '' "; + } + if ($reply_array['wr_reply']) $sql .= " and wr_reply like '{$reply_array['wr_reply']}%' "; + $row = sql_fetch($sql); + + if (!$row['reply']) + $reply_char = $begin_reply_char; + else if ($row['reply'] == $end_reply_char) // A~Z은 26 입니다. + alert('더 이상 답변하실 수 없습니다.\\n\\n답변은 26개 까지만 가능합니다.'); + else + $reply_char = chr(ord($row['reply']) + $reply_number); + + $reply = $reply_array['wr_reply'] . $reply_char; + + $title_msg = '글답변'; + + $write['wr_subject'] = 'Re: '.$write['wr_subject']; +} + +// 그룹접근 가능 +if (!empty($group['gr_use_access'])) { + if ($is_guest) { + alert("접근 권한이 없습니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.", 'login.php?'.$qstr.'&url='.urlencode($_SERVER['PHP_SELF'].'?bo_table='.$bo_table)); + } + + if ($is_admin == 'super' || $group['gr_admin'] == $member['mb_id'] || $board['bo_admin'] == $member['mb_id']) { + ; // 통과 + } else { + // 그룹접근 + $sql = " select gr_id from {$g5['group_member_table']} where gr_id = '{$board['gr_id']}' and mb_id = '{$member['mb_id']}' "; + $row = sql_fetch($sql); + if (!$row['gr_id']) + alert('접근 권한이 없으므로 글쓰기가 불가합니다.\\n\\n궁금하신 사항은 관리자에게 문의 바랍니다.'); + } +} + +// 본인확인을 사용한다면 +if ($config['cf_cert_use'] && !$is_admin) { + // 인증된 회원만 가능 + if ($board['bo_use_cert'] != '' && $is_guest) { + alert('이 게시판은 본인확인 하신 회원님만 글쓰기가 가능합니다.\\n\\n회원이시라면 로그인 후 이용해 보십시오.', 'login.php?'.$qstr.'&url='.urlencode($_SERVER['PHP_SELF'].'?bo_table='.$bo_table)); + } + + if ($board['bo_use_cert'] == 'cert' && !$member['mb_certify']) { + alert('이 게시판은 본인확인 하신 회원님만 글쓰기가 가능합니다.\\n\\n회원정보 수정에서 본인확인을 해주시기 바랍니다.', G5_URL); + } + + if ($board['bo_use_cert'] == 'adult' && !$member['mb_adult']) { + alert('이 게시판은 본인확인으로 성인인증 된 회원님만 글쓰기가 가능합니다.\\n\\n성인인데 글쓰기가 안된다면 회원정보 수정에서 본인확인을 다시 해주시기 바랍니다.', G5_URL); + } + + if ($board['bo_use_cert'] == 'hp-cert' && $member['mb_certify'] != 'hp') { + alert('이 게시판은 휴대폰 본인확인 하신 회원님만 글읽기가 가능합니다.\\n\\n회원정보 수정에서 휴대폰 본인확인을 해주시기 바랍니다.', G5_URL); + } + + if ($board['bo_use_cert'] == 'hp-adult' && (!$member['mb_adult'] || $member['mb_certify'] != 'hp')) { + alert('이 게시판은 휴대폰 본인확인으로 성인인증 된 회원님만 글읽기가 가능합니다.\\n\\n현재 성인인데 글읽기가 안된다면 회원정보 수정에서 휴대폰 본인확인을 다시 해주시기 바랍니다.', G5_URL); + } +} + +// 글자수 제한 설정값 +if ($is_admin || $board['bo_use_dhtml_editor']) +{ + $write_min = $write_max = 0; +} +else +{ + $write_min = (int)$board['bo_write_min']; + $write_max = (int)$board['bo_write_max']; +} + +$g5['title'] = $board['bo_subject']." ".$title_msg; + +$is_notice = false; +$notice_checked = ''; +if ($is_admin && $w != 'r') { + $is_notice = true; + + if ($w == 'u') { + // 답변 수정시 공지 체크 없음 + if ($write['wr_reply']) { + $is_notice = false; + } else { + if (in_array((int)$wr_id, $notice_array)) { + $notice_checked = 'checked'; + } + } + } +} + +$is_html = false; +if ($member['mb_level'] >= $board['bo_html_level']) + $is_html = true; + +$is_secret = $board['bo_use_secret']; + +$is_mail = false; +if ($config['cf_email_use'] && $board['bo_use_email']) + $is_mail = true; + +$recv_email_checked = ''; +if ($w == '' || strstr($write['wr_option'], 'mail')) + $recv_email_checked = 'checked'; + +$is_name = false; +$is_password = false; +$is_email = false; +$is_homepage = false; +if ($is_guest || ($is_admin && $w == 'u' && $member['mb_id'] != $write['mb_id'])) { + $is_name = true; + $is_password = true; + $is_email = true; + $is_homepage = true; +} + +$is_category = false; +$category_option = ''; +if ($board['bo_use_category']) { + $ca_name = ""; + if (isset($write['ca_name'])) + $ca_name = $write['ca_name']; + $category_option = get_category_option($bo_table, $ca_name); + $is_category = true; +} + +$is_link = false; +if ($member['mb_level'] >= $board['bo_link_level']) { + $is_link = true; +} + +$is_file = false; +if ($member['mb_level'] >= $board['bo_upload_level']) { + $is_file = true; +} + +$is_file_content = false; +if ($board['bo_use_file_content']) { + $is_file_content = true; +} + +$file_count = (int)$board['bo_upload_count']; + +$name = ""; +$email = ""; +$homepage = ""; +if ($w == "" || $w == "r") { + if ($is_member) { + if (isset($write['wr_name'])) { + $name = get_text(cut_str($write['wr_name'],20)); + } + $email = $member['mb_email']; + $homepage = get_text($member['mb_homepage']); + } +} + +$html_checked = ""; +$html_value = ""; +$secret_checked = ""; + +if ($w == '') { + $password_required = 'required'; +} else if ($w == 'u') { + $password_required = ''; + + if (!$is_admin) { + if (!($is_member && $member['mb_id'] == $write['mb_id'])) { + if (sql_password($wr_password) != $write['wr_password']) { + alert('비밀번호가 틀립니다.'); + } + } + } + + $name = get_text(cut_str($write['wr_name'],20)); + $email = $write['wr_email']; + $homepage = get_text($write['wr_homepage']); + + for ($i=1; $i<=G5_LINK_COUNT; $i++) { + $write['wr_link'.$i] = get_text($write['wr_link'.$i]); + $link[$i] = $write['wr_link'.$i]; + } + + if (strstr($write['wr_option'], 'html1')) { + $html_checked = 'checked'; + $html_value = 'html1'; + } else if (strstr($write['wr_option'], 'html2')) { + $html_checked = 'checked'; + $html_value = 'html2'; + } + + if (strstr($write['wr_option'], 'secret')) { + $secret_checked = 'checked'; + } + + $file = get_file($bo_table, $wr_id); +} else if ($w == 'r') { + if (strstr($write['wr_option'], 'secret')) { + $is_secret = true; + $secret_checked = 'checked'; + } + + $password_required = "required"; + + for ($i=1; $i<=G5_LINK_COUNT; $i++) { + $write['wr_link'.$i] = get_text($write['wr_link'.$i]); + } +} + +$subject = ""; +if (isset($write['wr_subject'])) { + $subject = str_replace("\"", """, get_text(cut_str($write['wr_subject'], 255), 0)); +} + +$content = ''; +if ($w == '') { + $content = $board['bo_insert_content']; +} else if ($w == 'r') { + if (!strstr($write['wr_option'], 'html')) { + $content = "\n\n\n > " + ."\n > " + ."\n > ".str_replace("\n", "\n> ", get_text($write['wr_content'], 0)) + ."\n > " + ."\n > "; + + } +} else { + $content = get_text($write['wr_content'], 0); +} + +$upload_max_filesize = number_format($board['bo_upload_size']) . ' 바이트'; + +$width = $board['bo_table_width']; +if ($width <= 100) + $width .= '%'; +else + $width .= 'px'; + +$captcha_html = ''; +$captcha_js = ''; +if ($is_guest) { + $captcha_html = captcha_html(); + $captcha_js = chk_captcha_js(); +} + +$is_dhtml_editor = false; +// 모바일에서는 DHTML 에디터 사용불가 +if ($config['cf_editor'] && !G5_IS_MOBILE && $board['bo_use_dhtml_editor'] && $member['mb_level'] >= $board['bo_html_level']) { + $is_dhtml_editor = true; +} +$editor_html = editor_html('wr_content', $content, $is_dhtml_editor); +$editor_js = ''; +$editor_js .= get_editor_js('wr_content', $is_dhtml_editor); +$editor_js .= chk_editor_js('wr_content', $is_dhtml_editor); + +// 임시 저장된 글 수 +$autosave_count = autosave_count($member['mb_id']); + +include_once(G5_PATH.'/head.sub.php'); +@include_once ($board_skin_path.'/write.head.skin.php'); +include_once('./board_head.php'); + +$action_url = https_url(G5_BBS_DIR)."/write_update.php"; + +echo ''; +include_once ($board_skin_path.'/write.skin.php'); + +include_once('./board_tail.php'); +@include_once ($board_skin_path.'/write.tail.skin.php'); +include_once(G5_PATH.'/tail.sub.php'); +?> \ No newline at end of file diff --git a/bbs/write_comment_update.php b/bbs/write_comment_update.php new file mode 100644 index 000000000..667e5131e --- /dev/null +++ b/bbs/write_comment_update.php @@ -0,0 +1,332 @@ + 50) { + alert('내용에 올바르지 않은 코드가 다수 포함되어 있습니다.'); + exit; +} + +@include_once($board_skin_path.'/write_comment_update.head.skin.php'); + +$w = $_POST["w"]; +$wr_name = trim($_POST['wr_name']); +$wr_email = ''; +if (!empty($_POST['wr_email'])) + $wr_email = trim($_POST['wr_email']); + +// 비회원의 경우 이름이 누락되는 경우가 있음 +if ($is_guest) { + if ($wr_name == '') + alert('이름은 필히 입력하셔야 합니다.'); + if(!chk_captcha()) + alert('자동등록방지 숫자가 틀렸습니다.'); +} + +if ($w == "c" || $w == "cu") { + if ($member['mb_level'] < $board['bo_comment_level']) + alert('댓글을 쓸 권한이 없습니다.'); +} +else + alert('w 값이 제대로 넘어오지 않았습니다.'); + +// 세션의 시간 검사 +// 4.00.15 - 댓글 수정시 연속 게시물 등록 메시지로 인한 오류 수정 +if ($w == 'c' && $_SESSION['ss_datetime'] >= (G5_SERVER_TIME - $config['cf_delay_sec']) && !$is_admin) + alert('너무 빠른 시간내에 게시물을 연속해서 올릴 수 없습니다.'); + +set_session('ss_datetime', G5_SERVER_TIME); + +$wr = get_write($write_table, $wr_id); +if (empty($wr['wr_id'])) + alert("글이 존재하지 않습니다.\\n글이 삭제되었거나 이동하였을 수 있습니다."); + + +// "인터넷옵션 > 보안 > 사용자정의수준 > 스크립팅 > Action 스크립팅 > 사용 안 함" 일 경우의 오류 처리 +// 이 옵션을 사용 안 함으로 설정할 경우 어떤 스크립트도 실행 되지 않습니다. +//if (!trim($_POST["wr_content"])) die ("내용을 입력하여 주십시오."); + +if ($is_member) +{ + $mb_id = $member['mb_id']; + // 4.00.13 - 실명 사용일때 댓글에 닉네임으로 입력되던 오류를 수정 + $wr_name = $board['bo_use_name'] ? $member['mb_name'] : $member['mb_nick']; + $wr_password = $member['mb_password']; + $wr_email = $member['mb_email']; + $wr_homepage = $member['mb_homepage']; +} +else +{ + $mb_id = ''; + $wr_password = sql_password($wr_password); +} + +if ($w == 'c') // 댓글 입력 +{ + /* + if ($member[mb_point] + $board[bo_comment_point] < 0 && !$is_admin) + alert('보유하신 포인트('.number_format($member[mb_point]).')가 없거나 모자라서 댓글쓰기('.number_format($board[bo_comment_point]).')가 불가합니다.\\n\\n포인트를 적립하신 후 다시 댓글을 써 주십시오.'); + */ + // 댓글쓰기 포인트설정시 회원의 포인트가 음수인 경우 댓글을 쓰지 못하던 버그를 수정 (곱슬최씨님) + $tmp_point = ($member['mb_point'] > 0) ? $member['mb_point'] : 0; + if ($tmp_point + $board['bo_comment_point'] < 0 && !$is_admin) + alert('보유하신 포인트('.number_format($member['mb_point']).')가 없거나 모자라서 댓글쓰기('.number_format($board['bo_comment_point']).')가 불가합니다.\\n\\n포인트를 적립하신 후 다시 댓글을 써 주십시오.'); + + // 댓글 답변 + if ($comment_id) + { + $sql = " select wr_id, wr_comment, wr_comment_reply from $write_table + where wr_id = '$comment_id' "; + $reply_array = sql_fetch($sql); + if (!$reply_array['wr_id']) + alert('답변할 댓글이 없습니다.\\n\\n답변하는 동안 댓글이 삭제되었을 수 있습니다.'); + + $tmp_comment = $reply_array['wr_comment']; + + if (strlen($reply_array['wr_comment_reply']) == 5) + alert('더 이상 답변하실 수 없습니다.\\n\\n답변은 5단계 까지만 가능합니다.'); + + $reply_len = strlen($reply_array['wr_comment_reply']) + 1; + if ($board['bo_reply_order']) { + $begin_reply_char = 'A'; + $end_reply_char = 'Z'; + $reply_number = +1; + $sql = " select MAX(SUBSTRING(wr_comment_reply, $reply_len, 1)) as reply + from $write_table + where wr_parent = '$wr_id' + and wr_comment = '$tmp_comment' + and SUBSTRING(wr_comment_reply, $reply_len, 1) <> '' "; + } + else + { + $begin_reply_char = 'Z'; + $end_reply_char = 'A'; + $reply_number = -1; + $sql = " select MIN(SUBSTRING(wr_comment_reply, $reply_len, 1)) as reply + from $write_table + where wr_parent = '$wr_id' + and wr_comment = '$tmp_comment' + and SUBSTRING(wr_comment_reply, $reply_len, 1) <> '' "; + } + if ($reply_array['wr_comment_reply']) + $sql .= " and wr_comment_reply like '{$reply_array['wr_comment_reply']}%' "; + $row = sql_fetch($sql); + + if (!$row['reply']) + $reply_char = $begin_reply_char; + else if ($row['reply'] == $end_reply_char) // A~Z은 26 입니다. + alert('더 이상 답변하실 수 없습니다.\\n\\n답변은 26개 까지만 가능합니다.'); + else + $reply_char = chr(ord($row['reply']) + $reply_number); + + $tmp_comment_reply = $reply_array['wr_comment_reply'] . $reply_char; + } + else + { + $sql = " select max(wr_comment) as max_comment from $write_table + where wr_parent = '$wr_id' and wr_is_comment = 1 "; + $row = sql_fetch($sql); + //$row[max_comment] -= 1; + $row['max_comment'] += 1; + $tmp_comment = $row['max_comment']; + $tmp_comment_reply = ''; + } + + $wr_subject = get_text(stripslashes($wr['wr_subject'])); + + $sql = " insert into $write_table + set ca_name = '{$wr['ca_name']}', + wr_option = '$wr_secret', + wr_num = '{$wr['wr_num']}', + wr_reply = '', + wr_parent = '$wr_id', + wr_is_comment = 1, + wr_comment = '$tmp_comment', + wr_comment_reply = '$tmp_comment_reply', + wr_subject = '', + wr_content = '$wr_content', + mb_id = '$mb_id', + wr_password = '$wr_password', + wr_name = '$wr_name', + wr_email = '$wr_email', + wr_homepage = '$wr_homepage', + wr_datetime = '".G5_TIME_YMDHIS."', + wr_last = '', + wr_ip = '{$_SERVER['REMOTE_ADDR']}', + wr_1 = '$wr_1', + wr_2 = '$wr_2', + wr_3 = '$wr_3', + wr_4 = '$wr_4', + wr_5 = '$wr_5', + wr_6 = '$wr_6', + wr_7 = '$wr_7', + wr_8 = '$wr_8', + wr_9 = '$wr_9', + wr_10 = '$wr_10' "; + sql_query($sql); + + $comment_id = mysql_insert_id(); + + // 원글에 댓글수 증가 & 마지막 시간 반영 + sql_query(" update $write_table set wr_comment = wr_comment + 1, wr_last = '".G5_TIME_YMDHIS."' where wr_id = '$wr_id' "); + + // 새글 INSERT + sql_query(" insert into {$g5['board_new_table']} ( bo_table, wr_id, wr_parent, bn_datetime, mb_id ) values ( '$bo_table', '$comment_id', '$wr_id', '".G5_TIME_YMDHIS."', '{$member['mb_id']}' ) "); + + // 댓글 1 증가 + sql_query(" update {$g5['board_table']} set bo_count_comment = bo_count_comment + 1 where bo_table = '$bo_table' "); + + // 포인트 부여 + insert_point($member['mb_id'], $board['bo_comment_point'], "{$board['bo_subject']} {$wr_id}-{$comment_id} 댓글쓰기", $bo_table, $comment_id, '댓글'); + + // 메일발송 사용 + if ($config['cf_email_use'] && $board['bo_use_email']) + { + // 관리자의 정보를 얻고 + $super_admin = get_admin('super'); + $group_admin = get_admin('group'); + $board_admin = get_admin('board'); + + $wr_content = nl2br(get_text(stripslashes("원글\n{$wr['wr_subject']}\n\n\n댓글\n$wr_content"))); + + $warr = array( ''=>'입력', 'u'=>'수정', 'r'=>'답변', 'c'=>'댓글 ', 'cu'=>'댓글 수정' ); + $str = $warr[$w]; + + $subject = '['.$config['cf_title'].'] '.$board['bo_subject'].' 게시판에 '.$str.'글이 올라왔습니다.'; + // 4.00.15 - 메일로 보내는 댓글의 바로가기 링크 수정 + $link_url = G5_BBS_URL."/board.php?bo_table=".$bo_table."&wr_id=".$wr_id."&".$qstr."#c_".$comment_id; + + include_once(G5_LIB_PATH.'/mailer.lib.php'); + + ob_start(); + include_once ('./write_update_mail.php'); + $content = ob_get_contents(); + ob_end_clean(); + + $array_email = array(); + // 게시판관리자에게 보내는 메일 + if ($config['cf_email_wr_board_admin']) $array_email[] = $board_admin['mb_email']; + // 게시판그룹관리자에게 보내는 메일 + if ($config['cf_email_wr_group_admin']) $array_email[] = $group_admin['mb_email']; + // 최고관리자에게 보내는 메일 + if ($config['cf_email_wr_super_admin']) $array_email[] = $super_admin['mb_email']; + + // 원글게시자에게 보내는 메일 + if ($config['cf_email_wr_write']) $array_email[] = $wr['wr_email']; + + // 댓글 쓴 모든이에게 메일 발송이 되어 있다면 (자신에게는 발송하지 않는다) + if ($config['cf_email_wr_comment_all']) { + $sql = " select distinct wr_email from {$write_table} + where wr_email not in ( '{$wr['wr_email']}', '{$member['mb_email']}', '' ) + and wr_parent = '$wr_id' "; + $result = sql_query($sql); + while ($row=sql_fetch_array($result)) + $array_email[] = $row['wr_email']; + } + + // 중복된 메일 주소는 제거 + $unique_email = array_unique($array_email); + $unique_email = array_values($unique_email); + for ($i=0; $i= $mb['mb_level']) // 자신의 레벨이 크거나 같다면 통과 + ; + else + alert('그룹관리자의 권한보다 높은 회원의 댓글이므로 수정할 수 없습니다.'); + } else + alert('자신이 관리하는 그룹의 게시판이 아니므로 댓글을 수정할 수 없습니다.'); + } else if ($is_admin == 'board') { // 게시판관리자이면 + $mb = get_member($comment['mb_id']); + if ($member['mb_id'] == $board['bo_admin']) { // 자신이 관리하는 게시판인가? + if ($member['mb_level'] >= $mb['mb_level']) // 자신의 레벨이 크거나 같다면 통과 + ; + else + alert('게시판관리자의 권한보다 높은 회원의 댓글이므로 수정할 수 없습니다.'); + } else + alert('자신이 관리하는 게시판이 아니므로 댓글을 수정할 수 없습니다.'); + } else if ($member['mb_id']) { + if ($member['mb_id'] != $comment['mb_id']) + alert('자신의 글이 아니므로 수정할 수 없습니다.'); + } else { + if($comment['wr_password'] != $wr_password) + alert('댓글을 수정할 권한이 없습니다.'); + } + + $sql = " select count(*) as cnt from $write_table + where wr_comment_reply like '$comment_reply%' + and wr_id <> '$comment_id' + and wr_parent = '$wr_id' + and wr_comment = '$tmp_comment' + and wr_is_comment = 1 "; + $row = sql_fetch($sql); + if ($row['cnt'] && !$is_admin) + alert('이 댓글와 관련된 답변댓글이 존재하므로 수정 할 수 없습니다.'); + + $sql_ip = ""; + if (!$is_admin) + $sql_ip = " , wr_ip = '{$_SERVER['REMOTE_ADDR']}' "; + + $sql_secret = ""; + if ($wr_secret) + $sql_secret = " , wr_option = '$wr_secret' "; + + $sql = " update $write_table + set wr_subject = '$wr_subject', + wr_content = '$wr_content', + wr_1 = '$wr_1', + wr_2 = '$wr_2', + wr_3 = '$wr_3', + wr_4 = '$wr_4', + wr_5 = '$wr_5', + wr_6 = '$wr_6', + wr_7 = '$wr_7', + wr_8 = '$wr_8', + wr_9 = '$wr_9', + wr_10 = '$wr_10', + wr_option = '$wr_option' + $sql_ip + $sql_secret + where wr_id = '$comment_id' "; + sql_query($sql); +} + +// 사용자 코드 실행 +@include_once($board_skin_path.'/write_comment_update.skin.php'); +@include_once($board_skin_path.'/write_comment_update.tail.skin.php'); + +delete_cache_latest($bo_table); + +goto_url('./board.php?bo_table='.$bo_table.'&wr_id='.$wr['wr_parent'].'&'.$qstr.'&#c_'.$comment_id); +?> diff --git a/bbs/write_comment_update.sns.php b/bbs/write_comment_update.sns.php new file mode 100644 index 000000000..0425f2d4c --- /dev/null +++ b/bbs/write_comment_update.sns.php @@ -0,0 +1,72 @@ + $config['cf_facebook_appid'], + 'secret' => $config['cf_facebook_secret'] + )); + + $user = $facebook->getUser(); + + if ($user) { + try { + $link = G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&wr_id='.$wr['wr_parent'].'&#c_'.$comment_id; + $attachment = array( + 'message' => stripslashes($wr_content), + 'name' => $wr_subject, + 'link' => $link, + 'description' => stripslashes(strip_tags($wr['wr_content'])) + ); + // 등록 + $facebook->api('/me/feed/', 'post', $attachment); + //$errors = error_get_last(); print_r2($errros); exit; + + set_cookie('ck_facebook_checked', true, 86400*31); + } catch(FacebookApiException $e) { + ;;; + } + } + + $wr_facebook_user = get_session("ss_facebook_user"); +} +//============================================================================ + + +//============================================================================ +// 트위터 +//---------------------------------------------------------------------------- +$wr_twitter_user = ""; +if ($_POST['twitter_checked']) { + include_once(G5_SNS_PATH."/twitter/twitteroauth/twitteroauth.php"); + include_once(G5_SNS_PATH."/twitter/twitterconfig.php"); + + if ( !(empty($_SESSION['access_token']) || empty($_SESSION['access_token']['oauth_token']) || empty($_SESSION['access_token']['oauth_token_secret'])) ) { + $comment_url = G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&wr_id='.$wr['wr_parent'].'&#c_'.$comment_id; + + $post = googl_short_url($comment_url).' '.$wr_content; + $post = utf8_strcut($post, 140); + + $access_token = $_SESSION['access_token']; + $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $access_token['oauth_token'], $access_token['oauth_token_secret']); + // 등록 + $connection->post('statuses/update', array('status' => $post)); + + set_cookie('ck_twitter_checked', true, 86400*31); + } + + $wr_twitter_user = get_session("ss_twitter_user"); +} +//============================================================================ +?> \ No newline at end of file diff --git a/bbs/write_update.php b/bbs/write_update.php new file mode 100644 index 000000000..6fef84dc1 --- /dev/null +++ b/bbs/write_update.php @@ -0,0 +1,638 @@ +제목을 입력하세요.'; +} + +$wr_content = ''; +if (isset($_POST['wr_content'])) { + $wr_content = substr(trim($_POST['wr_content']),0,65536); +} +if ($wr_content == '') { + $msg[] = '내용을 입력하세요.'; +} + +$wr_link1 = ''; +if (isset($_POST['wr_link1'])) { + $wr_link1 = substr($_POST['wr_link1'],0,1000); +} + +$wr_link2 = ''; +if (isset($_POST['wr_link2'])) { + $wr_link2 = substr($_POST['wr_link2'],0,1000); +} + +$msg = implode('
    ', $msg); +if ($msg) { + alert($msg); +} + +// 090710 +if (substr_count($wr_content, '&#') > 50) { + alert('내용에 올바르지 않은 코드가 다수 포함되어 있습니다.'); + exit; +} + +$upload_max_filesize = ini_get('upload_max_filesize'); + +if (empty($_POST)) { + alert("파일 또는 글내용의 크기가 서버에서 설정한 값을 넘어 오류가 발생하였습니다.\\npost_max_size=".ini_get('post_max_size')." , upload_max_filesize=".$upload_max_filesize."\\n게시판관리자 또는 서버관리자에게 문의 바랍니다."); +} + +$w = $_POST['w']; +$wr_link1 = trim(strip_tags($_POST['wr_link1'])); +$wr_link2 = trim(strip_tags($_POST['wr_link2'])); + +$notice_array = explode(",", $board['bo_notice']); + +if ($w == 'u' || $w == 'r') { + $wr = get_write($write_table, $wr_id); + if (!$wr['wr_id']) { + alert("글이 존재하지 않습니다.\\n글이 삭제되었거나 이동하였을 수 있습니다."); + } +} + +// 외부에서 글을 등록할 수 있는 버그가 존재하므로 비밀글은 사용일 경우에만 가능해야 함 +if (!$is_admin && !$board['bo_use_secret'] && $secret) { + alert('비밀글 미사용 게시판 이므로 비밀글로 등록할 수 없습니다.'); +} + +// 외부에서 글을 등록할 수 있는 버그가 존재하므로 비밀글 무조건 사용일때는 관리자를 제외(공지)하고 무조건 비밀글로 등록 +if (!$is_admin && $board['bo_use_secret'] == 2) { + $secret = 'secret'; +} + +$html = ''; +if (isset($_POST['html']) && $_POST['html']) { + $html = $_POST['html']; +} + +$mail = ''; +if (isset($_POST['mail']) && $_POST['mail']) { + $mail = $_POST['mail']; +} + +$notice = ''; +if (isset($_POST['notice']) && $_POST['notice']) { + $notice = $_POST['notice']; +} + +for ($i=1; $i<=10; $i++) { + $var = "wr_$i"; + $$var = ""; + if (isset($_POST['wr_'.$i]) && $_POST['wr_'.$i]) { + $$var = trim($_POST['wr_'.$i]); + } +} + +@include_once($board_skin_path.'/write_update.head.skin.php'); + +if ($w == '' || $w == 'u') { + + // 김선용 1.00 : 글쓰기 권한과 수정은 별도로 처리되어야 함 + if($w =='u' && $member['mb_id'] && $wr['mb_id'] == $member['mb_id']) { + ; + } else if ($member['mb_level'] < $board['bo_write_level']) { + alert('글을 쓸 권한이 없습니다.'); + } + + // 외부에서 글을 등록할 수 있는 버그가 존재하므로 공지는 관리자만 등록이 가능해야 함 + if (!$is_admin && $notice) { + alert('관리자만 공지할 수 있습니다.'); + } + +} else if ($w == 'r') { + + if (in_array((int)$wr_id, $notice_array)) { + alert('공지에는 답변 할 수 없습니다.'); + } + + if ($member['mb_level'] < $board['bo_reply_level']) { + alert('글을 답변할 권한이 없습니다.'); + } + + // 게시글 배열 참조 + $reply_array = &$wr; + + // 최대 답변은 테이블에 잡아놓은 wr_reply 사이즈만큼만 가능합니다. + if (strlen($reply_array['wr_reply']) == 10) { + alert("더 이상 답변하실 수 없습니다.\\n답변은 10단계 까지만 가능합니다."); + } + + $reply_len = strlen($reply_array['wr_reply']) + 1; + if ($board['bo_reply_order']) { + $begin_reply_char = 'A'; + $end_reply_char = 'Z'; + $reply_number = +1; + $sql = " select MAX(SUBSTRING(wr_reply, $reply_len, 1)) as reply from {$write_table} where wr_num = '{$reply_array['wr_num']}' and SUBSTRING(wr_reply, {$reply_len}, 1) <> '' "; + } else { + $begin_reply_char = 'Z'; + $end_reply_char = 'A'; + $reply_number = -1; + $sql = " select MIN(SUBSTRING(wr_reply, {$reply_len}, 1)) as reply from {$write_table} where wr_num = '{$reply_array['wr_num']}' and SUBSTRING(wr_reply, {$reply_len}, 1) <> '' "; + } + if ($reply_array['wr_reply']) $sql .= " and wr_reply like '{$reply_array['wr_reply']}%' "; + $row = sql_fetch($sql); + + if (!$row['reply']) { + $reply_char = $begin_reply_char; + } else if ($row['reply'] == $end_reply_char) { // A~Z은 26 입니다. + alert("더 이상 답변하실 수 없습니다.\\n답변은 26개 까지만 가능합니다."); + } else { + $reply_char = chr(ord($row['reply']) + $reply_number); + } + + $reply = $reply_array['wr_reply'] . $reply_char; + +} else { + alert('w 값이 제대로 넘어오지 않았습니다.'); +} + +if ($is_guest && !chk_captcha()) { + alert('자동등록방지 숫자가 틀렸습니다.'); +} + +if ($w == '' || $w == 'r') { + if (isset($_SESSION['ss_datetime'])) { + if ($_SESSION['ss_datetime'] >= (G5_SERVER_TIME - $config['cf_delay_sec']) && !$is_admin) + alert('너무 빠른 시간내에 게시물을 연속해서 올릴 수 없습니다.'); + } + + set_session("ss_datetime", G5_SERVER_TIME); +} + +if (!isset($_POST['wr_subject']) || !trim($_POST['wr_subject'])) + alert('제목을 입력하여 주십시오.'); + +// 디렉토리가 없다면 생성합니다. (퍼미션도 변경하구요.) +@mkdir(G5_DATA_PATH.'/file/'.$bo_table, G5_DIR_PERMISSION); +@chmod(G5_DATA_PATH.'/file/'.$bo_table, G5_DIR_PERMISSION); + +$chars_array = array_merge(range(0,9), range('a','z'), range('A','Z')); + +// 가변 파일 업로드 +$file_upload_msg = ''; +$upload = array(); +for ($i=0; $i|=)/', '', $filename); + + // 서버에 설정된 값보다 큰파일을 업로드 한다면 + if ($filename) { + if ($_FILES['bf_file']['error'][$i] == 1) { + $file_upload_msg .= '\"'.$filename.'\" 파일의 용량이 서버에 설정('.$upload_max_filesize.')된 값보다 크므로 업로드 할 수 없습니다.\\n'; + continue; + } + else if ($_FILES['bf_file']['error'][$i] != 0) { + $file_upload_msg .= '\"'.$filename.'\" 파일이 정상적으로 업로드 되지 않았습니다.\\n'; + continue; + } + } + + if (is_uploaded_file($tmp_file)) { + // 관리자가 아니면서 설정한 업로드 사이즈보다 크다면 건너뜀 + if (!$is_admin && $filesize > $board['bo_upload_size']) { + $file_upload_msg .= '\"'.$filename.'\" 파일의 용량('.number_format($filesize).' 바이트)이 게시판에 설정('.number_format($board['bo_upload_size']).' 바이트)된 값보다 크므로 업로드 하지 않습니다.\\n'; + continue; + } + + //=================================================================\ + // 090714 + // 이미지나 플래시 파일에 악성코드를 심어 업로드 하는 경우를 방지 + // 에러메세지는 출력하지 않는다. + //----------------------------------------------------------------- + $timg = @getimagesize($tmp_file); + // image type + if ( preg_match("/\.({$config['cf_image_extension']})$/i", $filename) || + preg_match("/\.({$config['cf_flash_extension']})$/i", $filename) ) { + if ($timg['2'] < 1 || $timg['2'] > 16) + continue; + } + //================================================================= + + $upload[$i]['image'] = $timg; + + // 4.00.11 - 글답변에서 파일 업로드시 원글의 파일이 삭제되는 오류를 수정 + if ($w == 'u') { + // 존재하는 파일이 있다면 삭제합니다. + $row = sql_fetch(" select bf_file from {$g5['board_file_table']} where bo_table = '$bo_table' and wr_id = '$wr_id' and bf_no = '$i' "); + @unlink(G5_DATA_PATH.'/file/'.$bo_table.'/'.$row['bf_file']); + // 이미지파일이면 썸네일삭제 + if(preg_match("/\.({$config['cf_image_extension']})$/i", $row['bf_file'])) { + delete_board_thumbnail($bo_table, $row['bf_file']); + } + } + + // 프로그램 원래 파일명 + $upload[$i]['source'] = $filename; + $upload[$i]['filesize'] = $filesize; + + // 아래의 문자열이 들어간 파일은 -x 를 붙여서 웹경로를 알더라도 실행을 하지 못하도록 함 + $filename = preg_replace("/\.(php|phtm|htm|cgi|pl|exe|jsp|asp|inc)/i", "$0-x", $filename); + + shuffle($chars_array); + $shuffle = implode('', $chars_array); + + // 첨부파일 첨부시 첨부파일명에 공백이 포함되어 있으면 일부 PC에서 보이지 않거나 다운로드 되지 않는 현상이 있습니다. (길상여의 님 090925) + $upload[$i]['file'] = abs(ip2long($_SERVER['REMOTE_ADDR'])).'_'.substr($shuffle,0,8).'_'.str_replace('%', '', urlencode(str_replace(' ', '_', $filename))); + + $dest_file = G5_DATA_PATH.'/file/'.$bo_table.'/'.$upload[$i]['file']; + + // 업로드가 안된다면 에러메세지 출력하고 죽어버립니다. + $error_code = move_uploaded_file($tmp_file, $dest_file) or die($_FILES['bf_file']['error'][$i]); + + // 올라간 파일의 퍼미션을 변경합니다. + chmod($dest_file, G5_FILE_PERMISSION); + } +} + +if ($w == '' || $w == 'r') { + + if ($member['mb_id']) { + $mb_id = $member['mb_id']; + $wr_name = $board['bo_use_name'] ? $member['mb_name'] : $member['mb_nick']; + $wr_password = $member['mb_password']; + $wr_email = $member['mb_email']; + $wr_homepage = $member['mb_homepage']; + } else { + $mb_id = ''; + // 비회원의 경우 이름이 누락되는 경우가 있음 + $wr_name = trim($_POST['wr_name']); + if (!$wr_name) + alert('이름은 필히 입력하셔야 합니다.'); + $wr_password = sql_password($wr_password); + } + + if ($w == 'r') { + // 답변의 원글이 비밀글이라면 비밀번호는 원글과 동일하게 넣는다. + if ($secret) + $wr_password = $wr['wr_password']; + + $wr_id = $wr_id . $reply; + $wr_num = $write['wr_num']; + $wr_reply = $reply; + } else { + $wr_num = get_next_num($write_table); + $wr_reply = ''; + } + + $sql = " insert into $write_table + set wr_num = '$wr_num', + wr_reply = '$wr_reply', + wr_comment = 0, + ca_name = '$ca_name', + wr_option = '$html,$secret,$mail', + wr_subject = '$wr_subject', + wr_content = '$wr_content', + wr_link1 = '$wr_link1', + wr_link2 = '$wr_link2', + wr_link1_hit = 0, + wr_link2_hit = 0, + wr_hit = 0, + wr_good = 0, + wr_nogood = 0, + mb_id = '{$member['mb_id']}', + wr_password = '$wr_password', + wr_name = '$wr_name', + wr_email = '$wr_email', + wr_homepage = '$wr_homepage', + wr_datetime = '".G5_TIME_YMDHIS."', + wr_last = '".G5_TIME_YMDHIS."', + wr_ip = '{$_SERVER['REMOTE_ADDR']}', + wr_1 = '$wr_1', + wr_2 = '$wr_2', + wr_3 = '$wr_3', + wr_4 = '$wr_4', + wr_5 = '$wr_5', + wr_6 = '$wr_6', + wr_7 = '$wr_7', + wr_8 = '$wr_8', + wr_9 = '$wr_9', + wr_10 = '$wr_10' "; + sql_query($sql); + + $wr_id = mysql_insert_id(); + + // 부모 아이디에 UPDATE + sql_query(" update $write_table set wr_parent = '$wr_id' where wr_id = '$wr_id' "); + + // 새글 INSERT + sql_query(" insert into {$g5['board_new_table']} ( bo_table, wr_id, wr_parent, bn_datetime, mb_id ) values ( '{$bo_table}', '{$wr_id}', '{$wr_id}', '".G5_TIME_YMDHIS."', '{$member['mb_id']}' ) "); + + // 게시글 1 증가 + sql_query("update {$g5['board_table']} set bo_count_write = bo_count_write + 1 where bo_table = '{$bo_table}'"); + + // 쓰기 포인트 부여 + if ($w == '') { + if ($notice) { + $bo_notice = $wr_id.",".$board['bo_notice']; + sql_query(" update {$g5['board_table']} set bo_notice = '{$bo_notice}' where bo_table = '{$bo_table}' "); + } + + insert_point($member['mb_id'], $board['bo_write_point'], "{$board['bo_subject']} {$wr_id} 글쓰기", $bo_table, $wr_id, '쓰기'); + } else { + // 답변은 코멘트 포인트를 부여함 + // 답변 포인트가 많은 경우 코멘트 대신 답변을 하는 경우가 많음 + insert_point($member['mb_id'], $board['bo_comment_point'], "{$board['bo_subject']} {$wr_id} 글답변", $bo_table, $wr_id, '쓰기'); + } +} else if ($w == 'u') { + if (get_session('ss_bo_table') != $_POST['bo_table'] || get_session('ss_wr_id') != $_POST['wr_id']) { + alert('올바른 방법으로 수정하여 주십시오.'); + } + + $return_url = './board.php?bo_table='.$bo_table.'&wr_id='.$wr_id; + + if ($is_admin == 'super') // 최고관리자 통과 + ; + else if ($is_admin == 'group') { // 그룹관리자 + $mb = get_member($write['mb_id']); + if ($member['mb_id'] != $group['gr_admin']) // 자신이 관리하는 그룹인가? + alert('자신이 관리하는 그룹의 게시판이 아니므로 수정할 수 없습니다.', $return_url); + else if ($member['mb_level'] < $mb['mb_level']) // 자신의 레벨이 크거나 같다면 통과 + alert('자신의 권한보다 높은 권한의 회원이 작성한 글은 수정할 수 없습니다.', $return_url); + } else if ($is_admin == 'board') { // 게시판관리자이면 + $mb = get_member($write['mb_id']); + if ($member['mb_id'] != $board['bo_admin']) // 자신이 관리하는 게시판인가? + alert('자신이 관리하는 게시판이 아니므로 수정할 수 없습니다.', $return_url); + else if ($member['mb_level'] < $mb['mb_level']) // 자신의 레벨이 크거나 같다면 통과 + alert('자신의 권한보다 높은 권한의 회원이 작성한 글은 수정할 수 없습니다.', $return_url); + } else if ($member['mb_id']) { + if ($member['mb_id'] != $write['mb_id']) + alert('자신의 글이 아니므로 수정할 수 없습니다.', $return_url); + } else { + if ($write['mb_id']) + alert('로그인 후 수정하세요.', './login.php?url='.urlencode($return_url)); + } + + if ($member['mb_id']) { + // 자신의 글이라면 + if ($member['mb_id'] == $wr['mb_id']) { + $mb_id = $member['mb_id']; + $wr_name = $board['bo_use_name'] ? $member['mb_name'] : $member['mb_nick']; + $wr_email = $member['mb_email']; + $wr_homepage = $member['mb_homepage']; + } else { + $mb_id = $wr['mb_id']; + $wr_name = $wr['wr_name']; + $wr_email = $wr['wr_email']; + $wr_homepage = $wr['wr_homepage']; + } + } else { + $mb_id = ""; + // 비회원의 경우 이름이 누락되는 경우가 있음 + //if (!trim($wr_name)) alert("이름은 필히 입력하셔야 합니다."); + } + + $sql_password = $wr_password ? " , wr_password = '".sql_password($wr_password)."' " : ""; + + $sql_ip = ''; + if (!$is_admin) + $sql_ip = " , wr_ip = '{$_SERVER['REMOTE_ADDR']}' "; + + $sql = " update {$write_table} + set ca_name = '{$ca_name}', + wr_option = '{$html},{$secret},{$mail}', + wr_subject = '{$wr_subject}', + wr_content = '{$wr_content}', + wr_link1 = '{$wr_link1}', + wr_link2 = '{$wr_link2}', + mb_id = '{$mb_id}', + wr_name = '{$wr_name}', + wr_email = '{$wr_email}', + wr_homepage = '{$wr_homepage}', + wr_1 = '{$wr_1}', + wr_2 = '{$wr_2}', + wr_3 = '{$wr_3}', + wr_4 = '{$wr_4}', + wr_5 = '{$wr_5}', + wr_6 = '{$wr_6}', + wr_7 = '{$wr_7}', + wr_8 = '{$wr_8}', + wr_9 = '{$wr_9}', + wr_10= '{$wr_10}' + {$sql_ip} + {$sql_password} + where wr_id = '{$wr['wr_id']}' "; + sql_query($sql); + + // 분류가 수정되는 경우 해당되는 코멘트의 분류명도 모두 수정함 + // 코멘트의 분류를 수정하지 않으면 검색이 제대로 되지 않음 + $sql = " update {$write_table} set ca_name = '{$ca_name}' where wr_parent = '{$wr['wr_id']}' "; + sql_query($sql); + + /* + if ($notice) { + //if (!preg_match("/[^0-9]{0,1}{$wr_id}[\r]{0,1}/",$board['bo_notice'])) + if (!in_array((int)$wr_id, $notice_array)) { + $bo_notice = $wr_id . ',' . $board['bo_notice']; + sql_query(" update {$g5['board_table']} set bo_notice = '{$bo_notice}' where bo_table = '{$bo_table}' "); + } + } else { + $bo_notice = ''; + for ($i=0; $i=0; $i--) +{ + $row2 = sql_fetch(" select bf_file from {$g5['board_file_table']} where bo_table = '{$bo_table}' and wr_id = '{$wr_id}' and bf_no = '{$i}' "); + + // 정보가 있다면 빠집니다. + if ($row2['bf_file']) break; + + // 그렇지 않다면 정보를 삭제합니다. + sql_query(" delete from {$g5['board_file_table']} where bo_table = '{$bo_table}' and wr_id = '{$wr_id}' and bf_no = '{$i}' "); +} + +// 파일의 개수를 게시물에 업데이트 한다. +$row = sql_fetch(" select count(*) as cnt from {$g5['board_file_table']} where bo_table = '{$bo_table}' and wr_id = '{$wr_id}' "); +sql_query(" update {$write_table} set wr_file = '{$row['cnt']}' where wr_id = '{$wr_id}' "); + +// 자동저장된 레코드를 삭제한다. +sql_query(" delete from {$g5['autosave_table']} where as_uid = '{$uid}' "); +//------------------------------------------------------------------------------ + +// 비밀글이라면 세션에 비밀글의 아이디를 저장한다. 자신의 글은 다시 비밀번호를 묻지 않기 위함 +if ($secret) + set_session("ss_secret_{$bo_table}_{$wr_num}", TRUE); + +// 메일발송 사용 (수정글은 발송하지 않음) +if (!($w == 'u' || $w == 'cu') && $config['cf_email_use'] && $board['bo_use_email']) { + + // 관리자의 정보를 얻고 + $super_admin = get_admin('super'); + $group_admin = get_admin('group'); + $board_admin = get_admin('board'); + + $wr_subject = get_text(stripslashes($wr_subject)); + + $tmp_html = 0; + if (strstr($html, 'html1')) + $tmp_html = 1; + else if (strstr($html, 'html2')) + $tmp_html = 2; + + $wr_content = conv_content(conv_unescape_nl($wr_content), $tmp_html); + + $warr = array( ''=>'입력', 'u'=>'수정', 'r'=>'답변', 'c'=>'코멘트', 'cu'=>'코멘트 수정' ); + $str = $warr[$w]; + + $subject = '['.$config['cf_title'].'] '.$board['bo_subject'].' 게시판에 '.$str.'글이 올라왔습니다.'; + + $link_url = G5_BBS_URL.'/board.php?bo_table='.$bo_table.'&wr_id='.$wr_id.'&'.$qstr; + + include_once(G5_LIB_PATH.'/mailer.lib.php'); + + ob_start(); + include_once ('./write_update_mail.php'); + $content = ob_get_contents(); + ob_end_clean(); + + $array_email = array(); + // 게시판관리자에게 보내는 메일 + if ($config['cf_email_wr_board_admin']) $array_email[] = $board_admin['mb_email']; + // 게시판그룹관리자에게 보내는 메일 + if ($config['cf_email_wr_group_admin']) $array_email[] = $group_admin['mb_email']; + // 최고관리자에게 보내는 메일 + if ($config['cf_email_wr_super_admin']) $array_email[] = $super_admin['mb_email']; + + // 원글게시자에게 보내는 메일 + if ($config['cf_email_wr_write']) { + if($w == '') + $wr['wr_email'] = $wr_email; + + $array_email[] = $wr['wr_email']; + } + + // 옵션에 메일받기가 체크되어 있고, 게시자의 메일이 있다면 + if (strstr($wr['wr_option'], 'mail') && $wr['wr_email']) + $array_email[] = $wr['wr_email']; + + // 중복된 메일 주소는 제거 + $unique_email = array_unique($array_email); + $unique_email = array_values($unique_email); + for ($i=0; $i + + + + +<?php echo $wr_subject ?> 메일 + + + + +
    +
    +

    + +

    + + 작성자 + +
    + +
    + 사이트에서 게시물 확인하기 +
    +
    + + + diff --git a/bbs/zip.php b/bbs/zip.php new file mode 100644 index 000000000..55e4bc2b8 --- /dev/null +++ b/bbs/zip.php @@ -0,0 +1,73 @@ + diff --git a/common.php b/common.php new file mode 100644 index 000000000..3e12011eb --- /dev/null +++ b/common.php @@ -0,0 +1,509 @@ + + + + + + +오류! <?php echo G5_VERSION ?> 설치하기 + + + + +
    + GNUBOARD5 + Message +
    +

    그누보드5를 먼저 설치해주십시오.

    +
    +

    다음 파일을 찾을 수 없습니다.

    +
      +
    • +
    +

    그누보드 설치 후 다시 실행하시기 바랍니다.

    + +
    +
    + GNUBOARD5 +

    GPL! OPEN SOURCE GNUBOARD

    +
    + + + + +\'\"\%\=\(\)\s]/", "", $sfl); + if ($sfl) + $qstr .= '&sfl=' . urlencode($sfl); // search field (검색 필드) +} else { + $sfl = ''; +} + + +if (isset($_REQUEST['stx'])) { // search text (검색어) + $stx = get_search_string(trim($_REQUEST['stx'])); + if ($stx) + $qstr .= '&stx=' . urlencode(cut_str($stx, 20, '')); +} else { + $stx = ''; +} + +if (isset($_REQUEST['sst'])) { + $sst = trim($_REQUEST['sst']); + $sst = preg_replace("/[\<\>\'\"\%\=\(\)\s]/", "", $sst); + if ($sst) + $qstr .= '&sst=' . urlencode($sst); // search sort (검색 정렬 필드) +} else { + $sst = ''; +} + +if (isset($_REQUEST['sod'])) { // search order (검색 오름, 내림차순) + $sod = preg_match("/^(asc|desc)$/i", $sod) ? $sod : ''; + if ($sod) + $qstr .= '&sod=' . urlencode($sod); +} else { + $sod = ''; +} + +if (isset($_REQUEST['sop'])) { // search operator (검색 or, and 오퍼레이터) + $sop = preg_match("/^(or|and)$/i", $sop) ? $sop : ''; + if ($sop) + $qstr .= '&sop=' . urlencode($sop); +} else { + $sop = ''; +} + +if (isset($_REQUEST['spt'])) { // search part (검색 파트[구간]) + $spt = (int)$spt; + if ($spt) + $qstr .= '&spt=' . urlencode($spt); +} else { + $spt = ''; +} + +if (isset($_REQUEST['page'])) { // 리스트 페이지 + $page = (int)$_REQUEST['page']; + if ($page) + $qstr .= '&page=' . urlencode($page); +} else { + $page = ''; +} + +if (isset($_REQUEST['w'])) { + $w = substr($w, 0, 2); +} else { + $w = ''; +} + +if (isset($_REQUEST['wr_id'])) { + $wr_id = (int)$_REQUEST['wr_id']; +} else { + $wr_id = 0; +} + +if (isset($_REQUEST['bo_table'])) { + $bo_table = trim($_REQUEST['bo_table']); + $bo_table = substr($bo_table, 0, 20); +} else { + $bo_table = ''; +} + +// URL ENCODING +if (isset($_REQUEST['url'])) { + $url = trim($_REQUEST['url']); + $urlencode = urlencode($url); +} else { + $url = ''; + $urlencode = urlencode($_SERVER['REQUEST_URI']); + if (G5_DOMAIN) { + $p = parse_url(G5_DOMAIN); + $urlencode = G5_DOMAIN.urldecode(preg_replace("/^".urlencode($p['path'])."/", "", $urlencode)); + } +} + +if (isset($_REQUEST['gr_id'])) { + if (!is_array($_REQUEST['gr_id'])) { + $gr_id = trim($_REQUEST['gr_id']); + } +} else { + $gr_id = ''; +} +//=================================== + + +// 자동로그인 부분에서 첫로그인에 포인트 부여하던것을 로그인중일때로 변경하면서 코드도 대폭 수정하였습니다. +if ($_SESSION['ss_mb_id']) { // 로그인중이라면 + $member = get_member($_SESSION['ss_mb_id']); + + // 오늘 처음 로그인 이라면 + if (substr($member['mb_today_login'], 0, 10) != G5_TIME_YMD) { + // 첫 로그인 포인트 지급 + insert_point($member['mb_id'], $config['cf_login_point'], G5_TIME_YMD.' 첫로그인', '@login', $member['mb_id'], G5_TIME_YMD); + + // 오늘의 로그인이 될 수도 있으며 마지막 로그인일 수도 있음 + // 해당 회원의 접근일시와 IP 를 저장 + $sql = " update {$g5['member_table']} set mb_today_login = '".G5_TIME_YMDHIS."', mb_login_ip = '{$_SERVER['REMOTE_ADDR']}' where mb_id = '{$member['mb_id']}' "; + sql_query($sql); + } + +} else { + // 자동로그인 --------------------------------------- + // 회원아이디가 쿠키에 저장되어 있다면 (3.27) + if ($tmp_mb_id = get_cookie('ck_mb_id')) { + + $tmp_mb_id = substr(preg_replace("/[^a-zA-Z0-9_]*/", "", $tmp_mb_id), 0, 20); + // 최고관리자는 자동로그인 금지 + if ($tmp_mb_id != $config['cf_admin']) { + $sql = " select mb_password, mb_intercept_date, mb_leave_date, mb_email_certify from {$g5['member_table']} where mb_id = '{$tmp_mb_id}' "; + $row = sql_fetch($sql); + $key = md5($_SERVER['SERVER_ADDR'] . $_SERVER['REMOTE_ADDR'] . $_SERVER['HTTP_USER_AGENT'] . $row['mb_password']); + // 쿠키에 저장된 키와 같다면 + $tmp_key = get_cookie('ck_auto'); + if ($tmp_key == $key && $tmp_key) { + // 차단, 탈퇴가 아니고 메일인증이 사용이면서 인증을 받았다면 + if ($row['mb_intercept_date'] == '' && + $row['mb_leave_date'] == '' && + (!$config['cf_use_email_certify'] || preg_match('/[1-9]/', $row['mb_email_certify'])) ) { + // 세션에 회원아이디를 저장하여 로그인으로 간주 + set_session('ss_mb_id', $tmp_mb_id); + + // 페이지를 재실행 + echo ""; + exit; + } + } + // $row 배열변수 해제 + unset($row); + } + } + // 자동로그인 end --------------------------------------- +} + + +$write = array(); +$write_table = ""; +if ($bo_table) { + $board = sql_fetch(" select * from {$g5['board_table']} where bo_table = '$bo_table' "); + if ($board['bo_table']) { + set_cookie("ck_bo_table", $board['bo_table'], 86400 * 1); + $gr_id = $board['gr_id']; + $write_table = $g5['write_prefix'] . $bo_table; // 게시판 테이블 전체이름 + //$comment_table = $g5['write_prefix'] . $bo_table . $g5['comment_suffix']; // 코멘트 테이블 전체이름 + if (isset($wr_id) && $wr_id) + $write = sql_fetch(" select * from $write_table where wr_id = '$wr_id' "); + } +} + +if ($gr_id) { + $group = sql_fetch(" select * from {$g5['group_table']} where gr_id = '$gr_id' "); +} + + +// 회원, 비회원 구분 +$is_member = $is_guest = false; +$is_admin = ''; +if ($member['mb_id']) { + $is_member = true; + $is_admin = is_admin($member['mb_id']); + $member['mb_dir'] = substr($member['mb_id'],0,2); +} else { + $is_guest = true; + $member['mb_id'] = ''; + $member['mb_level'] = 1; // 비회원의 경우 회원레벨을 가장 낮게 설정 +} + + +if ($is_admin != 'super') { + // 접근가능 IP + $cf_possible_ip = trim($config['cf_possible_ip']); + if ($cf_possible_ip) { + $is_possible_ip = false; + $pattern = explode("\n", $cf_possible_ip); + for ($i=0; $iread()) { + // php 파일만 include 함 + if (preg_match("/(\.php)$/i", $entry)) + $extend_file[] = $entry; +} + +if(!empty($extend_file) && is_array($extend_file)) { + natsort($extend_file); + + foreach($extend_file as $file) { + include_once(G5_EXTEND_PATH.'/'.$file); + } +} +unset($extend_file); + +ob_start(); + +// 자바스크립트에서 go(-1) 함수를 쓰면 폼값이 사라질때 해당 폼의 상단에 사용하면 +// 캐쉬의 내용을 가져옴. 완전한지는 검증되지 않음 +header('Content-Type: text/html; charset=utf-8'); +$gmnow = gmdate('D, d M Y H:i:s') . ' GMT'; +header('Expires: 0'); // rfc2616 - Section 14.21 +header('Last-Modified: ' . $gmnow); +header('Cache-Control: no-store, no-cache, must-revalidate'); // HTTP/1.1 +header('Cache-Control: pre-check=0, post-check=0, max-age=0'); // HTTP/1.1 +header('Pragma: no-cache'); // HTTP/1.0 + +$html_process = new html_process(); +?> \ No newline at end of file diff --git a/config.php b/config.php new file mode 100644 index 000000000..8f7fa01be --- /dev/null +++ b/config.php @@ -0,0 +1,182 @@ += '5.1.0') { + //if (function_exists("date_default_timezone_set")) date_default_timezone_set("Asia/Seoul"); + date_default_timezone_set("Asia/Seoul"); +} + +/******************** + 경로 상수 +********************/ + +/* +보안서버 도메인 +회원가입, 글쓰기에 사용되는 https 로 시작되는 주소를 말합니다. +포트가 있다면 도메인 뒤에 :443 과 같이 입력하세요. +보안서버주소가 없다면 공란으로 두시면 되며 보안서버주소 뒤에 / 는 붙이지 않습니다. +입력예) https://www.domain.com:443/gnuboard5 +*/ +define('G5_DOMAIN', ''); +define('G5_HTTPS_DOMAIN', ''); + +/* +www.sir.co.kr 과 sir.co.kr 도메인은 서로 다른 도메인으로 인식합니다. 쿠키를 공유하려면 .sir.co.kr 과 같이 입력하세요. +이곳에 입력이 없다면 www 붙은 도메인과 그렇지 않은 도메인은 쿠키를 공유하지 않으므로 로그인이 풀릴 수 있습니다. +*/ +define('G5_COOKIE_DOMAIN', ''); + +define('G5_DBCONFIG_FILE', 'dbconfig.php'); + +define('G5_ADMIN_DIR', 'adm'); +define('G5_BBS_DIR', 'bbs'); +define('G5_CSS_DIR', 'css'); +define('G5_DATA_DIR', 'data'); +define('G5_EXTEND_DIR', 'extend'); +define('G5_IMG_DIR', 'img'); +define('G5_JS_DIR', 'js'); +define('G5_LIB_DIR', 'lib'); +define('G5_PLUGIN_DIR', 'plugin'); +define('G5_SKIN_DIR', 'skin'); +define('G5_CAPTCHA_DIR', 'kcaptcha'); +define('G5_EDITOR_DIR', 'editor'); +define('G5_MOBILE_DIR', 'mobile'); +define('G5_OKNAME_DIR', 'okname'); + +define('G5_KCPCERT_DIR', 'kcpcert'); +define('G5_LGXPAY_DIR', 'lgxpay'); + +define('G5_SNS_DIR', 'sns'); +define('G5_SYNDI_DIR', 'syndi'); +define('G5_PHPMAILER_DIR', 'PHPMailer_v2.0.4'); +define('G5_SESSION_DIR', 'session'); + +// URL 은 브라우저상에서의 경로 (도메인으로 부터의) +if (G5_DOMAIN) { + define('G5_URL', G5_DOMAIN); +} else { + if (isset($g5_path['url'])) + define('G5_URL', $g5_path['url']); + else + define('G5_URL', ''); +} + +if (isset($g5_path['path'])) { + define('G5_PATH', $g5_path['path']); +} else { + define('G5_PATH', ''); +} + +define('G5_ADMIN_URL', G5_URL.'/'.G5_ADMIN_DIR); +define('G5_BBS_URL', G5_URL.'/'.G5_BBS_DIR); +define('G5_CSS_URL', G5_URL.'/'.G5_CSS_DIR); +define('G5_DATA_URL', G5_URL.'/'.G5_DATA_DIR); +define('G5_IMG_URL', G5_URL.'/'.G5_IMG_DIR); +define('G5_JS_URL', G5_URL.'/'.G5_JS_DIR); +define('G5_SKIN_URL', G5_URL.'/'.G5_SKIN_DIR); +define('G5_PLUGIN_URL', G5_URL.'/'.G5_PLUGIN_DIR); +define('G5_CAPTCHA_URL', G5_PLUGIN_URL.'/'.G5_CAPTCHA_DIR); +define('G5_EDITOR_URL', G5_PLUGIN_URL.'/'.G5_EDITOR_DIR); +define('G5_OKNAME_URL', G5_PLUGIN_URL.'/'.G5_OKNAME_DIR); +define('G5_KCPCERT_URL', G5_PLUGIN_URL.'/'.G5_KCPCERT_DIR); +define('G5_LGXPAY_URL', G5_PLUGIN_URL.'/'.G5_LGXPAY_DIR); +define('G5_SNS_URL', G5_PLUGIN_URL.'/'.G5_SNS_DIR); +define('G5_SYNDI_URL', G5_PLUGIN_URL.'/'.G5_SYNDI_DIR); +define('G5_MOBILE_URL', G5_URL.'/'.G5_MOBILE_DIR); + +// PATH 는 서버상에서의 절대경로 +define('G5_ADMIN_PATH', G5_PATH.'/'.G5_ADMIN_DIR); +define('G5_BBS_PATH', G5_PATH.'/'.G5_BBS_DIR); +define('G5_DATA_PATH', G5_PATH.'/'.G5_DATA_DIR); +define('G5_EXTEND_PATH', G5_PATH.'/'.G5_EXTEND_DIR); +define('G5_LIB_PATH', G5_PATH.'/'.G5_LIB_DIR); +define('G5_PLUGIN_PATH', G5_PATH.'/'.G5_PLUGIN_DIR); +define('G5_SKIN_PATH', G5_PATH.'/'.G5_SKIN_DIR); +define('G5_MOBILE_PATH', G5_PATH.'/'.G5_MOBILE_DIR); +define('G5_SESSION_PATH', G5_DATA_PATH.'/'.G5_SESSION_DIR); +define('G5_CAPTCHA_PATH', G5_PLUGIN_PATH.'/'.G5_CAPTCHA_DIR); +define('G5_EDITOR_PATH', G5_PLUGIN_PATH.'/'.G5_EDITOR_DIR); +define('G5_OKNAME_PATH', G5_PLUGIN_PATH.'/'.G5_OKNAME_DIR); + +define('G5_KCPCERT_PATH', G5_PLUGIN_PATH.'/'.G5_KCPCERT_DIR); +define('G5_LGXPAY_PATH', G5_PLUGIN_PATH.'/'.G5_LGXPAY_DIR); + +define('G5_SNS_PATH', G5_PLUGIN_PATH.'/'.G5_SNS_DIR); +define('G5_SYNDI_PATH', G5_PLUGIN_PATH.'/'.G5_SYNDI_DIR); +define('G5_PHPMAILER_PATH', G5_PLUGIN_PATH.'/'.G5_PHPMAILER_DIR); +//============================================================================== + + +define('G5_USE_MOBILE', true); // 모바일 홈페이지를 사용하지 않을 경우 false 로 설정 +define('G5_USE_CACHE', true); // 최신글등에 cache 기능 사용 여부 +define('G5_SYNDI_USE', true); // Syndication 기능 사용 여부 + + +/******************** + 시간 상수 +********************/ +// 서버의 시간과 실제 사용하는 시간이 틀린 경우 수정하세요. +// 하루는 86400 초입니다. 1시간은 3600초 +// 6시간이 빠른 경우 time() + (3600 * 6); +// 6시간이 느린 경우 time() - (3600 * 6); +define('G5_SERVER_TIME', time()); +define('G5_TIME_YMDHIS', date('Y-m-d H:i:s', G5_SERVER_TIME)); +define('G5_TIME_YMD', substr(G5_TIME_YMDHIS, 0, 10)); +define('G5_TIME_HIS', substr(G5_TIME_YMDHIS, 11, 8)); + +// 입력값 검사 상수 (숫자를 변경하시면 안됩니다.) +define('G5_ALPHAUPPER', 1); // 영대문자 +define('G5_ALPHALOWER', 2); // 영소문자 +define('G5_ALPHABETIC', 4); // 영대,소문자 +define('G5_NUMERIC', 8); // 숫자 +define('G5_HANGUL', 16); // 한글 +define('G5_SPACE', 32); // 공백 +define('G5_SPECIAL', 64); // 특수문자 + +// 퍼미션 +define('G5_DIR_PERMISSION', 0755); // 디렉토리 생성시 퍼미션 +define('G5_FILE_PERMISSION', 0644); // 파일 생성시 퍼미션 + +// 모바일 인지 결정 $_SERVER['HTTP_USER_AGENT'] +define('G5_MOBILE_AGENT', 'phone|samsung|lgtel|mobile|[^A]skt|nokia|blackberry|android|sony'); + +// SMTP +// lib/mailer.lib.php 에서 사용 +define('G5_SMTP', '127.0.0.1'); + + +/******************** + 기타 상수 +********************/ + +// SQL 에러를 표시할 것인지 지정 +// 에러를 표시하지 않으려면 FALSE 로 변경 +define('G5_DISPLAY_SQL_ERROR', TRUE); + +// escape string 처리 함수 지정 +// POST 등에서 한글이 깨질 경우 addslashes 로 변경 +define('G5_ESCAPE_FUNCTION', 'sql_real_escape_string'); + +// 게시판에서 링크의 기본개수를 말합니다. +// 필드를 추가하면 이 숫자를 필드수에 맞게 늘려주십시오. +define('G5_LINK_COUNT', 2); + +// 썸네일 jpg Quality 설정 +define('G5_THUMB_JPG_QUALITY', 90); + +// ip 숨김방법 설정 +/* 123.456.789.012 ip의 숨김 방법을 변경하는 방법은 +\\1 은 123, \\2는 456, \\3은 789, \\4는 012에 각각 대응되므로 +표시되는 부분은 \\1 과 같이 사용하시면 되고 숨길 부분은 ♡등의 +다른 문자를 적어주시면 됩니다. +*/ +define('G5_IP_DISPLAY', '\\1.♡.\\3.\\4'); +?> \ No newline at end of file diff --git a/css/default.css b/css/default.css new file mode 100644 index 000000000..a90193c32 --- /dev/null +++ b/css/default.css @@ -0,0 +1,289 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* 초기화 */ +html {overflow-y:scroll} +body {margin:0;padding:0;font-size:0.75em;font-family:dotum} +html, h1, h2, h3, h4, h5, h6, form, fieldset, img {margin:0;padding:0;border:0} +h1, h2, h3, h4, h5, h6 {font-size:1em;font-family:dotum} +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {display:block} + +#hd ul, nav ul, #ft ul {margin:0;padding:0;list-style:none} +legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} +label, input, button, select, img {vertical-align:middle} +input, button {margin:0;padding:0;font-family:dotum;font-size:1em} +button {cursor:pointer} + +textarea, select {font-family:dotum;font-size:1em} +select {margin:0} +p {margin:0;padding:0;word-break:break-all} +hr {display:none} +pre {overflow-x:scroll;font-size:1.1em} +a:link, a:visited {color:#000;text-decoration:none} +a:hover, a:focus, a:active {color:#000;text-decoration:underline} + +/* 팝업레이어 */ +#hd_pop {z-index:1000;position:relative;margin:0 auto;width:970px;height:0} +#hd_pop h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +.hd_pops {position:absolute;border:1px solid #e9e9e9;background:#fff} +.hd_pops_con {} +.hd_pops_footer {padding:10px 0;background:#000;color:#fff;text-align:right} +.hd_pops_footer button {margin-right:5px;padding:5px 10px;border:0;background:#393939;color:#fff} + +/* 상단 레이아웃 */ +#hd {z-index:4;position:relative;min-width:970px;background:#fff} +.hd_zindex {z-index:10 !important} +#hd_h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#hd_wrapper {position:relative;margin:0 auto;padding:26px 0;width:970px;zoom:1} +#hd_wrapper:after {display:block;visibility:hidden;clear:both;content:""} + +#logo {float:left;padding:5px 0 0} + +/* 전체 검색 */ +#hd_sch {float:left;margin:0 0 0 20px;padding:0;border:1px solid #c3c6ca} +#hd_sch legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} +#hd_sch #sch_stx {padding-left:5px;width:110px;height:24px;border:0;background:#fff;line-height:1.9em !important;line-height:1.6em} +#hd_sch #sch_submit {padding:0 5px;height:26px;border:0;background:#e2e6eb;color:#333;cursor:pointer} + +/* 텍스트 크기 조절 */ +#text_size {float:left;margin:0 0 0 10px;letter-spacing:-3px} +#text_size button {margin:0;padding:1px 2px;border:1px solid #c3c6ca;background:transparent;vertical-align:middle;cursor:pointer} +.ts_up {font-size:1.167em !important} +.ts_up2 {font-size:1.3em !important} + +/* 상단 회원가입 등 링크 */ +#tnb {float:right;margin:0;padding:0;list-style:none;zoom:1} +#tnb:after {display:block;visibility:hidden;clear:both;content:""} +#tnb li {float:left;margin:0 0 0 10px} +#tnb a {display:inline-block;padding:0 10px;height:28px;color:#333;letter-spacing:-0.1em;line-height:2.4em} +#tnb a:focus, #tnb a:hover, #tnb a:active {text-decoration:none} +#tnb img {margin-right:3px} + +/* 메인메뉴 */ +#gnb {position:relative;margin:-1px 0 0;border-top:1px dotted #dde4e9;border-bottom:1px solid #dde4e9;background:#ecf0f7} +#gnb h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#gnb_1dul {margin:0 auto !important;padding:0;width:970px;zoom:1} +#gnb_1dul:after {display:block;visibility:hidden;clear:both;content:""} +.gnb_1dli {z-index:10;position:relative;float:left} +.gnb_1da {display:inline-block;padding:0 40px 0 10px;height:35px;background:url('../img/gnb_bg00.gif') center right no-repeat;font-weight:bold;line-height:2.95em;text-decoration:none} +.gnb_1da:focus, .gnb_1da:hover {background:url('../img/gnb_bg00.gif') #333 center right no-repeat;text-decoration:none} +.gnb_1dli_air .gnb_1da {background-color:#333;color:#fff} +.gnb_1dli_on .gnb_1da {background-color:#333;color:#fff} +.gnb_2dul {display:none;position:absolute;top:35px;width:180px} +.gnb_2da {display:block;padding:13px 10px;text-align:left;text-decoration:none} +.gnb_1dli_air .gnb_2da {background-color:#333;color:#fff} +.gnb_1dli_on .gnb_2da {background-color:#333;color:#fff} +.gnb_2da:focus, .gnb_2da:hover {background:#666;text-decoration:none} +.gnb_1dli_over .gnb_2dul {display:block;left:0;background:#fff} +.gnb_1dli_over2 .gnb_2dul {display:block;right:0;background:#fff} + +#gnb_empty {padding:10px 0;width:100%;text-align:center;line-height:2em} +#gnb_empty a {text-decoration:underline} + +/* 중간 레이아웃 */ +#wrapper {z-index:5;margin:0 auto;width:970px;border-right:1px solid #dde4e9;border-left:1px solid #dde4e9;zoom:1} +#wrapper:after {display:block;visibility:hidden;clear:both;content:""} + +#aside {float:right;margin:0 0 0 -1px;width:210px;border-left:1px solid #dde4e9;background:#fff} + +#container {z-index:4;position:relative;float:left;padding:15px 16px 15px 15px;width:728px;min-height:500px;height:auto !important;height:500px;border-right:1px solid #dde4e9;background:#fff;font-size:1em;zoom:1} +#container:after {display:block;visibility:hidden;clear:both;content:""} +#container_title {margin-bottom:20px;font-size:1.2em;font-weight:bold} + +/* 하단 레이아웃 */ +#ft {min-width:970px;border-top:1px solid #dde4e9;background:#f2f5f9} +#ft h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#ft p {margin:0;padding:10px 0;line-height:1.8em} + +#ft_catch {position:relative;margin:0 auto;padding:20px 0 0;width:970px;text-align:center} + +#ft_company {text-align:center} + +#ft_copy {background:#414141} +#ft_copy div {position:relative;margin:0 auto;padding:10px 0;width:970px;color:#fff} +#ft_copy a {display:inline-block;margin:0 10px 0 0;color:inherit} +#ft_copy #ft_totop {position:absolute;top:10px;right:0} + +/* 게시물 선택복사 선택이동 */ +#copymove {} +.copymove_current {float:right;color:#ff3061} +.copymove_currentbg {background:#f4f4f4} + +/* 화면낭독기 사용자용 */ +#hd_login_msg {position:absolute;top:0;left:0;font-size:0;line-height:0;overflow:hidden} +.msg_sound_only, .sound_only {display:inline-block !important;position:absolute;top:0;left:0;margin:0 !important;padding:0 !important;font-size:0;line-height:0;border:0 !important;overflow:hidden !important} +/* 본문 바로가기 */ +#skip_to_container a {z-index:100000;position:absolute;top:0;left:0;width:1px;height:1px;font-size:0;line-height:0;overflow:hidden} +#skip_to_container a:focus, #skip_to_container a:active {width:100%;height:75px;background:#21272e;color:#fff;font-size:2em;font-weight:bold;text-align:center;text-decoration:none;line-height:3.3em} + +/* ie6 이미지 너비 지정 */ +.img_fix {width:100%;height:auto} + +/* 캡챠 자동등록(입력)방지 기본 */ +#captcha {display:inline-block;position:relative} +#captcha legend {position:absolute;margin:0;padding:0;font-size:0;line-height:0;text-indent:-9999em;overflow:hidden} +#captcha #captcha_img {width:100px;height:41px;border:1px solid #e9e9e9} +#captcha #captcha_mp3 {position:absolute;top:0;left:101px;;margin:0;padding:0;width:23px;height:22px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer} +#captcha #captcha_mp3 span {position:absolute;top:0;left:0;width:23px;height:22px;background:url('../plugin/kcaptcha/img/sound.gif')} +#captcha #captcha_reload {position:absolute;top:21px;left:101px;margin:0;padding:0;width:23px;height:22px;border:0;background:transparent;vertical-align:middle;overflow:hidden;cursor:pointer} +#captcha #captcha_reload span {position:absolute;top:0;left:0;width:23px;height:22px;background:url('../plugin/kcaptcha/img/reload.gif')} +#captcha #captcha_key {margin:0 0 0 25px;padding:0 5px;width:70px;height:41px;border:1px solid #b8c9c2;background:#f7f7f7;font-size:1.333em;font-weight:bold;text-align:center;line-height:2.8em} +#captcha #captcha_info {display:block;margin:5px 0 0;font-size:0.95em;letter-spacing:-0.1em} + +/* ckeditor 단축키 */ +.cke_sc {margin:0 0 5px;text-align:right} +.btn_cke_sc{display:inline-block;padding:0 10px;height:23px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none;line-height:1.9em;vertical-align:middle;cursor:pointer} +.cke_sc_def {margin:0 0 5px;padding:10px;border:1px solid #ccc;background:#f7f7f7;text-align:center} +.cke_sc_def dl{margin:0 0 5px;text-align:left;zoom:1} +.cke_sc_def dl:after {display:block;visibility:hidden;clear:both;content:""} +.cke_sc_def dt, .cke_sc_def dd {float:left;margin:0;padding:5px 0;border-bottom:1px solid #e9e9e9} +.cke_sc_def dt {width:20%;font-weight:bold} +.cke_sc_def dd {width:30%} + +/* 버튼 */ +a.btn01 {display:inline-block;padding:7px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none;vertical-align:middle} +a.btn01:focus, a.btn01:hover {text-decoration:none} +button.btn01 {display:inline-block;margin:0;padding:7px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none} +a.btn02 {display:inline-block;padding:7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none;vertical-align:middle} +a.btn02:focus, .btn02:hover {text-decoration:none} +button.btn02 {display:inline-block;margin:0;padding:7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none} + +.btn_confirm {text-align:center} /* 서식단계 진행 */ + +.btn_submit {padding:8px;border:0;background:#ff3061;color:#fff;letter-spacing:-0.1em;cursor:pointer} +fieldset .btn_submit {padding:0 7px;height:24px;line-height:1em} + +a.btn_cancel {display:inline-block;padding:7px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none;vertical-align:middle} +button.btn_cancel {display:inline-block;padding:7px;border:1px solid #ccc;background:#fafafa;color:#000;vertical-align:top;text-decoration:none} + +a.btn_frmline, button.btn_frmline {display:inline-block;padding:0 5px;height:24px;border:0;background:#333;color:#fff;letter-spacing:-0.1em;text-decoration:none;vertical-align:top} /* 우편번호검색버튼 등 */ +a.btn_frmline {line-height:24px} +button.btn_frmline {font-size:1em} + +/* 게시판용 버튼 */ +a.btn_b01 {display:inline-block;padding:7px;border:1px solid #d9ded9;background:#f2f5f9;color:#000;text-decoration:none;vertical-align:middle} +a.btn_b01:focus, .btn_b01:hover {text-decoration:none} +a.btn_b02 {display:inline-block;padding:7px 7px;border:1px solid #3b3c3f;background:#4b545e;color:#fff;text-decoration:none;vertical-align:middle} +a.btn_b02:focus, .btn_b02:hover {text-decoration:none} +a.btn_admin {display:inline-block;padding:7px;border:1px solid #e8180c;background:#e8180c;color:#fff;text-decoration:none;vertical-align:middle} /* 관리자 전용 버튼 */ +a.btn_admin:focus, a.btn_admin:hover {text-decoration:none} + +/* 댓글 스타일 */ +.cnt_cmt {display:inline-block;margin:0 0 0 3px;font-weight:bold} + +/* 기본테이블 */ +.tbl_wrap table {width:100%;border-collapse:collapse;border-spacing:0} +.tbl_wrap caption {padding:10px 0;font-weight:bold;text-align:left} + +.tbl_head01 {margin:0 0 10px} +.tbl_head01 caption {padding:0;font-size:0;line-height:0;overflow:hidden} +.tbl_head01 thead th {padding:12px 0;border-top:1px solid #d1dee2;border-bottom:1px solid #d1dee2;background:#e5ecef;color:#383838;font-size:0.95em;text-align:center;letter-spacing:-0.1em} +.tbl_head01 thead a {color:#383838} +.tbl_head01 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head01 tfoot th, .tbl_head01 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center} +.tbl_head01 tbody th {padding:8px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head01 td {padding:8px 5px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;line-height:1.5em;word-break:break-all} +.tbl_head01 a {} + +.tbl_head02 {margin:0 0 10px} +.tbl_head02 caption {padding:0;font-size:0;line-height:0;overflow:hidden} +.tbl_head02 thead th {padding:5px 0;border-top:1px solid #d1dee2;border-bottom:1px solid #d1dee2;background:#e5ecef;color:#383838;font-size:0.95em;text-align:center;letter-spacing:-0.1em} +.tbl_head02 thead a {color:#383838} +.tbl_head02 thead th input {vertical-align:top} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.tbl_head02 tfoot th, .tbl_head02 tfoot td {padding:10px 0;border-top:1px solid #c1d1d5;border-bottom:1px solid #c1d1d5;background:#d7e0e2;text-align:center} +.tbl_head02 tbody th {padding:5px 0;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.tbl_head02 td {padding:5px 3px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;line-height:1.4em;word-break:break-all} +.tbl_head02 a {} + +/* 폼 테이블 */ +.tbl_frm01 {margin:0 0 20px} +.tbl_frm01 table {width:100%;border-collapse:collapse;border-spacing:0} +.tbl_frm01 th {width:70px;padding:7px 13px;border:1px solid #e9e9e9;border-left:0;background:#f5f8f9;text-align:left} +.tbl_frm01 td {padding:7px 10px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9;background:transparent} +.tbl_frm01 textarea, .frm_input {border:1px solid #e4eaec;background:#f7f7f7;color:#000;vertical-align:middle;line-height:2em} +.tbl_frm01 textarea {padding:2px 2px 3px} +.frm_input {height:22px} +.tbl_frm01 textarea {width:98%;height:100px} +.tbl_frm01 a {text-decoration:none} +.tbl_frm01 .frm_file {display:block;margin-bottom:5px} +.tbl_frm01 .frm_info {display:block;padding:0 0 5px;line-height:1.4em} + +/* 자료 없는 목록 */ +.empty_table {padding:50px 0 !important;text-align:center} +.empty_list {padding:20px 0 !important;text-align:center} + +/* 필수입력 */ +.required, textarea.required {background:url('../img/wrest.gif') #f7f7f7 top right no-repeat !important} + +/* 테이블 항목별 정의 */ +.td_board {width:120px;text-align:center} +.td_category {width:80px;text-align:center} +.td_chk {width:30px;text-align:center} +.td_date {width:60px;text-align:center} +.td_datetime {width:110px;text-align:center} +.td_group {width:100px;text-align:center} +.td_mb_id {width:100px;text-align:center} +.td_mng {width:80px;text-align:center} +.td_name {width:100px;text-align:left} +.td_nick {width:100px;text-align:center} +.td_num {width:50px;text-align:center} +.td_numbig {width:80px;text-align:center} +.td_stat {width:60px;text-align:center} + +.txt_active {color:#5d910b} +.txt_done {color:#e8180c} +.txt_expired {color:#ccc} +.txt_rdy {color:#8abc2a} + +/* 새창 기본 스타일 */ +.new_win {} +.new_win .tbl_wrap {margin:0 20px} +.new_win #win_title {margin:0 0 20px;padding:20px;border-top:3px solid #333;border-bottom:1px solid #dde4e9;background:#fff;font-size:1.2em} +.new_win #win_title .sv {font-size:0.75em;line-height:1.2em} +.new_win .win_ul {margin:-20px 0 20px 0;padding:0 20px;border-bottom:1px solid #455255;background:#484848;list-style:none;zoom:1} +.new_win .win_ul:after {display:block;visibility:hidden;clear:both;content:""} +.new_win .win_ul li {float:left;margin-left:-1px} +.new_win .win_ul a {display:block;padding:10px 10px 8px;border-right:1px solid #455255;border-left:1px solid #455255;color:#fff;font-family:dotum;font-weight:bold;text-decoration:none} +.new_win .win_desc {padding:20px} + +.new_win .win_btn {clear:both;padding:20px;text-align:center} /* 새창용 */ +.new_win .win_btn button {display:inline-block;padding:0 10px;height:30px;border:0;background:#4b545e;color:#fff;line-height:2em;cursor:pointer} +.new_win .win_btn input {padding:0 10px;height:30px;line-height:2em} +.new_win .win_btn a {display:inline-block;padding:0 10px;height:30px;background:#4b545e;color:#fff;vertical-align:middle;line-height:2.4em} +.new_win .win_btn a:focus, .new_win .win_btn a:hover {text-decoration:none} + +/* 내용관리 */ +#ctt {margin:10px 0;padding:10px;border:1px solid #e9e9e9} +.ctt_admin {text-align:right} +#ctt header h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#ctt_con {padding:10px 0} +.ctt_img {text-align:center} + +/* 검색결과 색상 */ +.sch_word {color:#ff3061} + +/* 자바스크립트 alert 대안 */ +#validation_check {margin:100px auto;width:500px} +#validation_check h1 {margin-bottom:20px;font-size:1.3em} +#validation_check p {margin-bottom:20px;padding:30px 20px;border:1px solid #e9e9e9;background:#fff} + +/* 사이드뷰 */ +.sv_wrap {display:inline-block;position:relative;font-weight:normal} +.sv_wrap .sv {z-index:1000;display:none;margin:5px 0 0;border:1px solid #283646} +.sv_wrap .sv a {display:inline-block;margin:0;padding:3px;width:94px;border-bottom:1px solid #283646;background:#111;color:#fff !important} +.sv_wrap a:focus, .sv_wrap a:hover, .sv_wrap a:active {text-decoration:none} +.sv_on {display:block !important;position:absolute;top:10px;left:20px;width:auto;height:auto} +.sv_nojs .sv {display:block} + +/* 페이징 */ +.pg_wrap {clear:both;margin:0 0 20px;padding:20px 0 0;text-align:center} +.pg {} +.pg_page, .pg_current {display:inline-block;padding:0 8px;height:25px;color:#000;letter-spacing:0;line-height:2.2em;vertical-align:middle} +.pg a:focus, .pg a:hover {text-decoration:none} +.pg_page {background:#e4eaec;text-decoration:none} +.pg_start, .pg_prev {/* 이전 */} +.pg_end, .pg_next {/* 다음 */} +.pg_current {display:inline-block;margin:0 4px 0 0;background:#333;color:#fff;font-weight:normal} + +/* Mobile화면으로 */ +#device_change {display:block;margin:0.3em;padding:0.5em 0;border:1px solid #eee;border-radius:2em;background:#fff;color:#000;font-size:2em;text-decoration:none;text-align:center} \ No newline at end of file diff --git a/css/images/ajax-loader.gif b/css/images/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd1a189c21fed1c7ba00c4bb4fad407bd6d1e5f9 GIT binary patch literal 7825 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 LHfkt@K(PD|Q{O_Y literal 0 HcmV?d00001 diff --git a/css/images/icons-18-black.png b/css/images/icons-18-black.png new file mode 100644 index 0000000000000000000000000000000000000000..647665cb60801300fc3b05d6f844fd1fac9ea94c GIT binary patch literal 58254 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 literal 0 HcmV?d00001 diff --git a/css/images/icons-18-white.png b/css/images/icons-18-white.png new file mode 100644 index 0000000000000000000000000000000000000000..ec9ba37902f93414bd411390c6195036884eef83 GIT binary patch literal 58717 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 DqMj;B literal 0 HcmV?d00001 diff --git a/css/images/icons-36-black.png b/css/images/icons-36-black.png new file mode 100644 index 0000000000000000000000000000000000000000..7524d5e6e4e9aab7086735ea8a4a78cf36a6623b GIT binary patch literal 66332 zcmcH9bx_@K_b_;z;_g<8dvS;2?xnc9yI-uhyIb*6+}+(T4i|UVi|e+}^V@f3_mAD3 zcV;t_nBu2)OvaG36(?zsuO)Ug>{VFfO7p z-#`7G0G~|5|865VN^7}5KpBzBe1bX9XOcl9uGHiHl`buc#jENSIz z=HcLMcv;2Q|O;^O84*?-1X=n3Y?e87>uDB3MCHhql*U9TOoyDw#`5Fye3`o9y zL4NRkjQRX2(S#HqBAKp}*0FK0meETll9UPhw&-2gwgddcx)q3R)^hxW;aTMob93g~K#Ti%x9JIlR-x^KJf6fW{(( z80`==#S5#r-45v7OHUa_4dd4w$ErvXy38ij%$X{S7<5%+;&a_DLV!;qVHB9asd=Ig zQZVqT_6=}Rvnx?ZlNfp2rJ!uEfM^K@-LZj8g5B-jSX0G^HLKqlfm*8mv-s*Wzxaoa z5QZ(`uUcU!L06aX-%e46Pvl}3p!&bK)@-nP>Sk?=Ey-P9pTh`wLy?Wkf8o%Z9g+`? zA4RVt5akjZ$wl+7PX7)M{rHujKSFIWx_2vC@q6zT>#*Y|&>ah~8O^a%ewtCO#B%T( zA!OJru@e0^-fMznS3f($%s|5QX`b}hnh_yLP`9l4I`=8U9dKMl@VG#pICW&FWGR?7L+MDsK85p61 zoL%;#MuHbK5W%cJ@%CLP;2FUZ`E%NAiQWl!!i_NfjNspAl}2?yHTY8DPkHh=+lVAF zyNxx&L(W|croJT~1stV2=R(36#*+bbrUL^x0SHmhg4SE{mIga8x+Ml$MricJN&FG6 zk4VJX#6IFNV1%t(9B`x&`e?+~@*9ffj-YrOrp(0*V6n#D8-}sfqsQ6f+p~~8iEn6Pg>PHpZXF#7prBs~eCtWri#&9mbU7FJx{`sPzUBHu zZH!!#?|0F?91g>eSy|3Yt*TVhiDi{IjVb^6-gp$G&o9@xp?8A&CoAM8eqyg_@*0Cx zv_zd8QI2S{>XMVL>O!&xaw;dv#tz8Lp0!$=8rc&l+Z-_bT>)2nagj-l&e=_0vNwXH zoI86595LcxvD(e!huUFsL<-q0UEyM;e$C+Idr_;C3lXa6`6lXCJNVrehes2K#`mK; zrxu(+N9sGs7A(E+_4TOyB+W8(#+OG8vKlZXWKEY;-RzFqrbcN-POzaIb49pVYI2_t zo@|iA(Wr<#HRNGW>4noH+|%IVZQboz*UA&wXFtq~;oPH;@(&ib%#G`Wa`)+(!Vf;J}%4B;8-ef}Bb7AXctTp*?5 z8QX?FpPBWM@q4aD}0<5=R=x9ybO56#O%O`})C_&pDj z@5sgaU=zcVB3ZRA+|e6ipZ_sgT|?{zwMrjiuh>Lp)aeGaa#*lj{Sz(z`}c19ozGDd z{v+{_oNIygOIL6FkHN8glA*;x#N~swjec{8tXS)>%&s>M+aGm-u>;e#4fbT2x&>&Q%c;EH&U2!oi8)nJ0B3LeNWBlz!F)$fXTx%ps7Mckr$?0 zQXEQEEG=nr5EaNZrXG&=HmBKKS-(M9Ty%n8jzXBxC9k9fWf}4*ij_hx`i1WVV%$Vl zj>}v;HOJy*!LR}|Ic&`bIcdX$M-@VaYE735l2SuOE%bBL*sh8)$8u^eIo)I3wBXqT zsG6>8fcYo~cc+N)tjY|ZFn02*YZ87e{kJ38JLQx4n*2>Z{TN^$rBS9X%CY54f>!nT zqy`B`zN2k?5sz-Isbp3rHQlA2tJ`JfBUjYIGBX)RoN>zhFJ4T>?Li^UGiY%28^J^M zwV0A24|=|Vfg`1y_irQm16X&~-~@8MCam5@U>E(2n~}c){unjI$gXf~8CAdQ&Ny^x zfW;D&P#J}zR!MjtCadIzelVT!gg^?(G`tgr!Usza&zG<|O~IVDE~OCCkU>E0nofw8 zCOVny0@k$0(-Sj4nTSkh<1oKXoYn7uWbE63kkEzbH>z!|wRTD$%VMt}b%0D&hRLy^ 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≶; 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 \ No newline at end of file diff --git a/g4_import.php b/g4_import.php new file mode 100644 index 000000000..24554f248 --- /dev/null +++ b/g4_import.php @@ -0,0 +1,176 @@ + + + + + + + + +
    + + +
    +
    + +
    +
    +
    + +
    +

    + 이 프로그램은 그누보드5 설치 후 바로 실행하셔야만 합니다.
    + 만약 그누보드5 사이트를 운영 중에 이 프로그램을 실행하시면 DB 데이터가 망실되거나 데이터의 오류가 발생할 수 있습니다.
    + 또한 중복해서 실행하실 경우에도 DB 데이터의 오류가 발생할 수 있으니 반드시 한번만 실행해 주십시오. +

    +

    프로그램을 실행하시려면 그누보드4의 config.php 파일 경로를 입력하신 후 확인을 클릭해 주십시오.

    + +
    +
    + + + +
    +
    + +

    + 경로는 그누보드5 설치 루트를 기준으로 그누보드4의 config.php 파일의 상대경로입니다.
    + 예를 들어 그누보드4를 웹루트에 설치하셨고 그누보드5를 g5라는 하위 폴더에 설치하셨다면 입력하실 경로는 ../config.php 입니다. +

    + +
    + + + +
    +
    + + + +
    + + +
    +
    <?php echo G5_VERSION ?>
    +
    +

    + Copyright © 소유하신 도메인. All rights reserved.
    + 상단으로 +

    +
    +
    + + + + \ No newline at end of file diff --git a/g4_import_run.php b/g4_import_run.php new file mode 100644 index 000000000..8392e0d6b --- /dev/null +++ b/g4_import_run.php @@ -0,0 +1,528 @@ +'; + +if(empty($_POST)) + alert('올바른 방법으로 이용해 주십시오.', G5_URL); + +if(get_session('tables_copied') == 'done') + alert('DB 데이터 변환을 이미 실행하였습니다. 중복 실행시 오류가 발생할 수 있습니다.', G5_URL); + +if($is_admin != 'super') + alert('최고관리자로 로그인 후 실행해 주십시오.', G5_URL); + +$g4_config_file = trim($_POST['file_path']); + +if(!$g4_config_file) + alert('config.php 파일의 경로를 입력해 주십시오.'); + +if(!is_file($g4_config_file)) + alert('입력하신 경로에 config.php 파일이 존재하지 않습니다.'); + +$is_euckr = false; +?> + + + + + +
    +

    + + + +
    + + + +
    + 사이트 내 전체검색 +
    + + + + + +
    + + +
    + + + +
    + + + + +
    +
    + +
    + + +
    + + +
    + + +
    +
    + +
    +
    +
    + +
    +
      + $val) { + if($key == 'mb_no') + continue; + + if(!in_array($key, $columns)) + continue; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['member_table']} SET $sql_common "); + } + + echo '
    1. member table 복사
    2. '.PHP_EOL; + unset($columns); + unset($fiels); + + // point table 복사 + $sql = " select * from {$g4['point_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if($key == 'po_id') + continue; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['point_table']} SET $sql_common "); + } + echo '
    3. point table 복사
    4. '.PHP_EOL; + + // login table 복사 + $sql = " select * from {$g4['login_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + // 중복체크 + $sql2 = " select count(*) as cnt from {$g5['login_table']} where lo_ip = '{$row['lo_ip']}' "; + $row2 = sql_fetch($sql2); + if($row2['cnt']) + continue; + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['login_table']} SET $sql_common "); + } + echo '
    5. login table 복사
    6. '.PHP_EOL; + + // visit table 복사 + $sql = " select * from {$g4['visit_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + // 중복체크 + $sql2 = " select count(*) as cnt from {$g5['visit_table']} where vi_ip = '{$row['vi_ip']}' and vi_date = '{$row['vi_date']}' "; + $row2 = sql_fetch($sql2); + if($row2['cnt']) + continue; + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['visit_table']} SET $sql_common "); + } + echo '
    7. visit table 복사
    8. '.PHP_EOL; + + // visit sum table 복사 + $sql = " select * from {$g4['visit_sum_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + // 중복체크 + $sql2 = " select count(*) as cnt from {$g5['visit_sum_table']} where vs_date = '{$row['vs_date']}' "; + $row2 = sql_fetch($sql2); + if($row2['cnt']) + continue; + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['visit_sum_table']} SET $sql_common "); + } + echo '
    9. visit sum table 복사
    10. '.PHP_EOL; + + // group table 복사 + $columns = array(); + $fields = mysql_list_fields(G5_MYSQL_DB, $g5['group_table']); + $count = mysql_num_fields($fields); + for ($i = 0; $i < $count; $i++) { + $fld = mysql_field_name($fields, $i); + $columns[] = $fld; + } + + $sql = " select * from {$g4['group_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + // 중복체크 + $sql2 = " select count(*) as cnt from {$g5['group_table']} where gr_id = '{$row['gr_id']}' "; + $row2 = sql_fetch($sql2); + if($row2['cnt']) + continue; + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if(!in_array($key, $columns)) + continue; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['group_table']} SET $sql_common "); + } + + echo '
    11. group table 복사
    12. '.PHP_EOL; + unset($columns); + unset($fiels); + + // board 복사 + $columns = array(); + $fields = mysql_list_fields(G5_MYSQL_DB, $g5['board_table']); + $count = mysql_num_fields($fields); + for ($i = 0; $i < $count; $i++) { + $fld = mysql_field_name($fields, $i); + $columns[] = $fld; + } + + $sql = " select * from {$g4['board_table']} "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + // 중복체크 + $sql2 = " select count(*) as cnt from {$g5['board_table']} where bo_table = '{$row['bo_table']}' "; + $row2 = sql_fetch($sql2); + if($row2['cnt']) + continue; + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if(!in_array($key, $columns)) + continue; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + sql_query(" INSERT INTO {$g5['board_table']} SET $sql_common "); + + // 게시판 테이블 생성 + $bo_table = $row['bo_table']; + $file = file(G5_ADMIN_PATH.'/sql_write.sql'); + $sql = implode($file, "\n"); + + $create_table = $g5['write_prefix'] . $bo_table; + + $source = array('/__TABLE_NAME__/', '/;/'); + $target = array($create_table, ''); + $sql = preg_replace($source, $target, $sql); + + // 게시글 복사 + if(sql_query($sql, FALSE)) { + $write_table = $g4['write_prefix'].$bo_table; + $columns2 = array(); + $fields2 = mysql_list_fields(G5_MYSQL_DB, $create_table); + $count2 = mysql_num_fields($fields2); + for ($j = 0; $j < $count2; $j++) { + $fld = mysql_field_name($fields2, $j); + $columns2[] = $fld; + } + + $sql3 = " select * from $write_table "; + $result3 = sql_query($sql3); + + for($k=0; $row3=sql_fetch_array($result3); $k++) { + if($is_euckr) + $row3 = array_map('iconv_utf8', $row3); + + $comma3 = ''; + $sql_common3 = ''; + + foreach($row3 as $key=>$val) { + if(!in_array($key, $columns2)) + continue; + + $sql_common3 .= $comma3 . " $key = '".addslashes($val)."' "; + + $comma3 = ','; + } + + // 첨부파일개수 + $wr_id = $row3['wr_id']; + $sql4 = " select count(*) as cnt from {$g4['board_file_table']} where bo_table = '$bo_table' and wr_id = '$wr_id' "; + $row4 = sql_fetch($sql4); + + $sql_common3 .= " , wr_file = '{$row4['cnt']}' "; + + sql_query(" INSERT INTO $create_table SET $sql_common3 "); + } + + echo '
    13. '.str_replace(G5_TABLE_PREFIX.'write_', '', $create_table).' 게시글 복사
    14. '; + } + } + + unset($columns); + unset($fiels); + + // 그외 테이블 복사 + $tables = array('board_file', 'board_new', 'board_good', 'mail', 'memo', 'group_member', 'auth', 'popular', 'poll', 'poll_etc', 'scrap'); + + foreach($tables as $table) { + $columns = array(); + $fields = mysql_list_fields(G5_MYSQL_DB, $g5[$table.'_table']); + $count = mysql_num_fields($fields); + for ($i = 0; $i < $count; $i++) { + $fld = mysql_field_name($fields, $i); + $columns[] = $fld; + } + + $src_table = $g4[$table.'_table']; + $dst_table = $g5[$table.'_table']; + $sql = " select * from $src_table "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + if($is_euckr) + $row = array_map('iconv_utf8', $row); + + $comma = ''; + $sql_common = ''; + + foreach($row as $key=>$val) { + if(!in_array($key, $columns)) + continue; + + $sql_common .= $comma . " $key = '".addslashes($val)."' "; + + $comma = ','; + } + + $result2 = sql_query(" INSERT INTO $dst_table SET $sql_common ", false); + + if(!$result2) + continue; + } + + echo '
    15. '.$table.' table 복사
    16. '.PHP_EOL; + } + + unset($columns); + unset($fiels); + + echo '
    '.PHP_EOL; + + echo '
    그누보드4 DB 데이터 이전 완료
    '.PHP_EOL; + + // 실행완료 세션에 기록 + set_session('tables_copied', 'done'); + ?> +
    + +
    +
    + + + +
    + + +
    +
    <?php echo G5_VERSION ?>
    +
    +

    + Copyright © 소유하신 도메인. All rights reserved.
    + 상단으로 +

    +
    +
    + + + + \ No newline at end of file diff --git a/head.php b/head.php new file mode 100644 index 000000000..a489d0dd8 --- /dev/null +++ b/head.php @@ -0,0 +1,167 @@ + + + +
    +

    + + + + + +
    + + + +
    + 사이트 내 전체검색 +
    + + + + + +
    + + +
    + +
    + + + + +
    + + +
    + +
    + + +
    + + +
    + + +
    +
    + + +
    +
    +
    diff --git a/head.sub.php b/head.sub.php new file mode 100644 index 000000000..246d863c2 --- /dev/null +++ b/head.sub.php @@ -0,0 +1,104 @@ + + + + + +'.PHP_EOL; + echo ''.PHP_EOL; + echo ''.PHP_EOL; +} else { + echo ''.PHP_EOL; + echo ''.PHP_EOL; +} + +if($config['cf_add_meta']) + echo $config['cf_add_meta'].PHP_EOL; +?> +<?php echo $g5_head_title; ?> +'.PHP_EOL; +} else { + echo ''.PHP_EOL; + // canonical 지정 + $canonical = ''; + if ($bo_table && $wr_id) $canonical = 'http://'.$_SERVER['HTTP_HOST'].'/bbs/board.php?bo_table='.$bo_table.'&wr_id='.$wr_id; + else $canonical = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; + echo ''.PHP_EOL; +} +?> + + + + + + +'.PHP_EOL; // overflow scroll 감지 +} +if(!defined('G5_IS_ADMIN')) + echo $config['cf_add_script']; +?> + + +'.$sr_admin_msg.$member['mb_nick'].'님 로그인 중 '; + echo '로그아웃
    '; +} +?> \ No newline at end of file diff --git a/img/btn_search.jpg b/img/btn_search.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c8e76334921f49ff9c0f060774ca8efac655f7af GIT binary patch literal 782 zcmex=C5UDGKfoZ!!63mP!OSSgz$D1XEXer(2typ$ zVL(^H0VfA57b7E_3uOo}FtRW)GPA;ESeTeu*%{e57z8;Lg@i>!mBa-xH2uHDz{AW4 zw2WDh!Jgrr_k`(xLyzt%uHKiocjjELZR;KtYTN5P_7m~$R#^CW(IO>>bV((@vZ{n* zOe|p^-zzM?&{OvQK7)nJ&l^G#xo#Kt?%+Rtin&vaXO4nZzec%iMy72}#NVk0qZ@91 zUz?zbxAFAoEO439HJPEUo5{`O z<82+`Lz=C+lU#JtgC6H8TY6nslP-DA_=51hT#NVFMdnSrSxik=?M`|(wRd`S?2J{> z!QKBELL1ks-d9h)cvbG!?U-kt9k!RF``zk_<5+q6rcPQG9U!*Pq2@)w@d@|r^Hyc8 zzp8V0-|ua!X1?{R>zTW{?8IkH_9AY*oZV&r88%E8I=8Z6waTWKi}#BJzWV)e!}1Bn zmeFUKH$M(8S^vF`xsapl)}fXy3Z`{7A)+^T=Sa6CE-K6VwEy~+zY9DW{0^xmE@PVA zQOVMlB&|_yE8|}u(|Y(q%0xz%^w%jnA|`FN5lc=ta>>a5ccv_&Af{3GlhOK%+{#wV z{;BVM@#E^0Z*S*3UNEy_>7hK!4~w);H$9#?dc;xK(zY g`yB5@*|(kq^dv4gB*~FG?LWi3pI(72?f-8A0O2J59smFU literal 0 HcmV?d00001 diff --git a/img/ft.png b/img/ft.png new file mode 100644 index 0000000000000000000000000000000000000000..0259a9f17ff7cddaa53aac3935fcb62395b396fb GIT binary patch literal 3204 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 F{~yj5B!B<_ literal 0 HcmV?d00001 diff --git a/img/gnb_bg00.gif b/img/gnb_bg00.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd24f34da9bdf9a056c6bd3c311849133bf97407 GIT binary patch literal 54 zcmZ?wbhEHb6k%XtXkcWhtgQV1|G(l-7DfgJMg|=QAOOiQF!8qVFFf6IbCK~Ty^Lr^ G25SI*`VKV! literal 0 HcmV?d00001 diff --git a/img/gnb_bg01.gif b/img/gnb_bg01.gif new file mode 100644 index 0000000000000000000000000000000000000000..1db7a58962b204c9c60023d16750e8acbbf017be GIT binary patch literal 54 zcmZ?wbhEHb6k%XtXkcWxe*OCY|Nj+#vM@3*Ff!;c00Bsbfr+<;f8pt#n~RJ$>19MS HGFSrus|pWK literal 0 HcmV?d00001 diff --git a/img/logo.jpg b/img/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..763228e42641cbfcb836dafb497ad27102707434 GIT binary patch literal 3441 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 o*EI8%9J8O2f`nb~;lxW!xrGUXZ~W0Ke)xh5!Hn literal 0 HcmV?d00001 diff --git a/img/ts02.gif b/img/ts02.gif new file mode 100644 index 0000000000000000000000000000000000000000..64d445705587286b0d0b9d3074b5dbecbb96a032 GIT binary patch literal 148 zcmV;F0Biq8Nk%w1VHf}y0J8u9|NsBo+}xX+n|F72+uPfKfPlcj!0qkr$6(kpd!U7z=TLA+1dp9Zu_!2xLJpx&I6*%Qf%Phz#JZA10!%KO&*=0g0suQP Cvqwn) literal 0 HcmV?d00001 diff --git a/img/ts03.gif b/img/ts03.gif new file mode 100644 index 0000000000000000000000000000000000000000..3c2ec4445b8ad78612d34e9bfc0ba9741c8bdb01 GIT binary patch literal 154 zcmZ?wbhEHblwgox*v!E2|Ns9xckYyzm*2j9`@n$%vuDr#_U&6kL&K6KOWwYHyLRo` zlP6C;dGe&Qvy%Y~bU-9XF9VCezzNUQdo5m{-Tgn#i6<^`-T?)Hc@OrzhjJDM FYXE$kMxX!y literal 0 HcmV?d00001 diff --git a/img/wrest.gif b/img/wrest.gif new file mode 100644 index 0000000000000000000000000000000000000000..a5ecfb334be107c3830c02709fb06c8ef837ebef GIT binary patch literal 51 zcmZ?wbhEHbWMg1sXkcWBjrIHg|G(l-7DfgJMg|=QAOOiQFmbiWr%ycbk74!#1_o;Y DKOqcu literal 0 HcmV?d00001 diff --git a/index.php b/index.php new file mode 100644 index 000000000..b5e308d96 --- /dev/null +++ b/index.php @@ -0,0 +1,50 @@ + + +

    최신글

    + + 'mobile' "; +if(!$is_admin) + $sql .= " and a.bo_use_cert = '' "; +$sql .= " order by b.gr_order, a.bo_order "; +$result = sql_query($sql); +for ($i=0; $row=sql_fetch_array($result); $i++) { + if ($i%2==1) $lt_style = "margin-left:20px"; + else $lt_style = ""; +?> +
    + +
    + + + + diff --git a/install/gnuboard5.sql b/install/gnuboard5.sql new file mode 100644 index 000000000..5e7eef002 --- /dev/null +++ b/install/gnuboard5.sql @@ -0,0 +1,879 @@ +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_auth` +-- + +DROP TABLE IF EXISTS `g5_auth`; +CREATE TABLE IF NOT EXISTS `g5_auth` ( + `mb_id` varchar(20) NOT NULL default '', + `au_menu` varchar(20) NOT NULL default '', + `au_auth` set('r','w','d') NOT NULL default '', + PRIMARY KEY (`mb_id`,`au_menu`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_board` +-- + +DROP TABLE IF EXISTS `g5_board`; +CREATE TABLE IF NOT EXISTS `g5_board` ( + `bo_table` varchar(20) NOT NULL DEFAULT '', + `gr_id` varchar(255) NOT NULL DEFAULT '', + `bo_subject` varchar(255) NOT NULL DEFAULT '', + `bo_mobile_subject` varchar(255) NOT NULL DEFAULT '', + `bo_device` enum('both','pc','mobile') NOT NULL DEFAULT 'both', + `bo_admin` varchar(255) NOT NULL DEFAULT '', + `bo_list_level` tinyint(4) NOT NULL DEFAULT '0', + `bo_read_level` tinyint(4) NOT NULL DEFAULT '0', + `bo_write_level` tinyint(4) NOT NULL DEFAULT '0', + `bo_reply_level` tinyint(4) NOT NULL DEFAULT '0', + `bo_comment_level` tinyint(4) NOT NULL DEFAULT '0', + `bo_upload_level` tinyint(4) NOT NULL DEFAULT '0', + `bo_download_level` tinyint(4) NOT NULL DEFAULT '0', + `bo_html_level` tinyint(4) NOT NULL DEFAULT '0', + `bo_link_level` tinyint(4) NOT NULL DEFAULT '0', + `bo_count_delete` tinyint(4) NOT NULL DEFAULT '0', + `bo_count_modify` tinyint(4) NOT NULL DEFAULT '0', + `bo_read_point` int(11) NOT NULL DEFAULT '0', + `bo_write_point` int(11) NOT NULL DEFAULT '0', + `bo_comment_point` int(11) NOT NULL DEFAULT '0', + `bo_download_point` int(11) NOT NULL DEFAULT '0', + `bo_use_category` tinyint(4) NOT NULL DEFAULT '0', + `bo_category_list` text NOT NULL, + `bo_use_sideview` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_file_content` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_secret` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_dhtml_editor` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_rss_view` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_good` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_nogood` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_name` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_signature` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_ip_view` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_list_view` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_list_file` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_list_content` tinyint(4) NOT NULL DEFAULT '0', + `bo_table_width` int(11) NOT NULL DEFAULT '0', + `bo_subject_len` int(11) NOT NULL DEFAULT '0', + `bo_mobile_subject_len` int(11) NOT NULL DEFAULT '0', + `bo_page_rows` int(11) NOT NULL DEFAULT '0', + `bo_mobile_page_rows` int(11) NOT NULL DEFAULT '0', + `bo_new` int(11) NOT NULL DEFAULT '0', + `bo_hot` int(11) NOT NULL DEFAULT '0', + `bo_image_width` int(11) NOT NULL DEFAULT '0', + `bo_skin` varchar(255) NOT NULL DEFAULT '', + `bo_mobile_skin` varchar(255) NOT NULL DEFAULT '', + `bo_include_head` varchar(255) NOT NULL DEFAULT '', + `bo_include_tail` varchar(255) NOT NULL DEFAULT '', + `bo_content_head` text NOT NULL, + `bo_mobile_content_head` text NOT NULL, + `bo_content_tail` text NOT NULL, + `bo_mobile_content_tail` text NOT NULL, + `bo_insert_content` text NOT NULL, + `bo_gallery_cols` int(11) NOT NULL DEFAULT '0', + `bo_gallery_width` int(11) NOT NULL DEFAULT '0', + `bo_gallery_height` int(11) NOT NULL DEFAULT '0', + `bo_mobile_gallery_width` int(11) NOT NULL DEFAULT '0', + `bo_mobile_gallery_height` int(11) NOT NULL DEFAULT '0', + `bo_upload_size` int(11) NOT NULL DEFAULT '0', + `bo_reply_order` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_search` tinyint(4) NOT NULL DEFAULT '0', + `bo_order` int(11) NOT NULL DEFAULT '0', + `bo_count_write` int(11) NOT NULL DEFAULT '0', + `bo_count_comment` int(11) NOT NULL DEFAULT '0', + `bo_write_min` int(11) NOT NULL DEFAULT '0', + `bo_write_max` int(11) NOT NULL DEFAULT '0', + `bo_comment_min` int(11) NOT NULL DEFAULT '0', + `bo_comment_max` int(11) NOT NULL DEFAULT '0', + `bo_notice` text NOT NULL, + `bo_upload_count` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_email` tinyint(4) NOT NULL DEFAULT '0', + `bo_use_cert` enum('','cert','adult','hp-cert','hp-adult') NOT NULL DEFAULT '', + `bo_use_sns` tinyint(4) NOT NULL DEFAULT '0', + `bo_sort_field` varchar(255) NOT NULL DEFAULT '', + `bo_1_subj` varchar(255) NOT NULL DEFAULT '', + `bo_2_subj` varchar(255) NOT NULL DEFAULT '', + `bo_3_subj` varchar(255) NOT NULL DEFAULT '', + `bo_4_subj` varchar(255) NOT NULL DEFAULT '', + `bo_5_subj` varchar(255) NOT NULL DEFAULT '', + `bo_6_subj` varchar(255) NOT NULL DEFAULT '', + `bo_7_subj` varchar(255) NOT NULL DEFAULT '', + `bo_8_subj` varchar(255) NOT NULL DEFAULT '', + `bo_9_subj` varchar(255) NOT NULL DEFAULT '', + `bo_10_subj` varchar(255) NOT NULL DEFAULT '', + `bo_1` varchar(255) NOT NULL DEFAULT '', + `bo_2` varchar(255) NOT NULL DEFAULT '', + `bo_3` varchar(255) NOT NULL DEFAULT '', + `bo_4` varchar(255) NOT NULL DEFAULT '', + `bo_5` varchar(255) NOT NULL DEFAULT '', + `bo_6` varchar(255) NOT NULL DEFAULT '', + `bo_7` varchar(255) NOT NULL DEFAULT '', + `bo_8` varchar(255) NOT NULL DEFAULT '', + `bo_9` varchar(255) NOT NULL DEFAULT '', + `bo_10` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`bo_table`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_board_file` +-- + +DROP TABLE IF EXISTS `g5_board_file`; +CREATE TABLE IF NOT EXISTS `g5_board_file` ( + `bo_table` varchar(20) NOT NULL default '', + `wr_id` int(11) NOT NULL default '0', + `bf_no` int(11) NOT NULL default '0', + `bf_source` varchar(255) NOT NULL default '', + `bf_file` varchar(255) NOT NULL default '', + `bf_download` int(11) NOT NULL, + `bf_content` text NOT NULL, + `bf_filesize` int(11) NOT NULL default '0', + `bf_width` int(11) NOT NULL default '0', + `bf_height` smallint(6) NOT NULL default '0', + `bf_type` tinyint(4) NOT NULL default '0', + `bf_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (`bo_table`,`wr_id`,`bf_no`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_board_good` +-- + +DROP TABLE IF EXISTS `g5_board_good`; +CREATE TABLE IF NOT EXISTS `g5_board_good` ( + `bg_id` int(11) NOT NULL auto_increment, + `bo_table` varchar(20) NOT NULL default '', + `wr_id` int(11) NOT NULL default '0', + `mb_id` varchar(20) NOT NULL default '', + `bg_flag` varchar(255) NOT NULL default '', + `bg_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (`bg_id`), + UNIQUE KEY `fkey1` (`bo_table`,`wr_id`,`mb_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_board_new` +-- + +DROP TABLE IF EXISTS `g5_board_new`; +CREATE TABLE IF NOT EXISTS `g5_board_new` ( + `bn_id` int(11) NOT NULL auto_increment, + `bo_table` varchar(20) NOT NULL default '', + `wr_id` int(11) NOT NULL default '0', + `wr_parent` int(11) NOT NULL default '0', + `bn_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + `mb_id` varchar(20) NOT NULL default '', + PRIMARY KEY (`bn_id`), + KEY `mb_id` (`mb_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_config` +-- + +DROP TABLE IF EXISTS `g5_config`; +CREATE TABLE IF NOT EXISTS `g5_config` ( + `cf_title` varchar(255) NOT NULL DEFAULT '', + `cf_admin` varchar(255) NOT NULL DEFAULT '', + `cf_admin_email` varchar(255) NOT NULL DEFAULT '', + `cf_admin_email_name` varchar(255) NOT NULL DEFAULT '', + `cf_include_index` varchar(255) NOT NULL DEFAULT '', + `cf_include_head` varchar(255) NOT NULL DEFAULT '', + `cf_include_tail` varchar(255) NOT NULL DEFAULT '', + `cf_add_script` text NOT NULL, + `cf_use_point` tinyint(4) NOT NULL DEFAULT '0', + `cf_point_term` int(11) NOT NULL DEFAULT '0', + `cf_use_copy_log` tinyint(4) NOT NULL DEFAULT '0', + `cf_use_email_certify` tinyint(4) NOT NULL DEFAULT '0', + `cf_login_point` int(11) NOT NULL DEFAULT '0', + `cf_cut_name` tinyint(4) NOT NULL DEFAULT '0', + `cf_nick_modify` int(11) NOT NULL DEFAULT '0', + `cf_new_skin` varchar(255) NOT NULL DEFAULT '', + `cf_new_rows` int(11) NOT NULL DEFAULT '0', + `cf_search_skin` varchar(255) NOT NULL DEFAULT '', + `cf_connect_skin` varchar(255) NOT NULL DEFAULT '', + `cf_read_point` int(11) NOT NULL DEFAULT '0', + `cf_write_point` int(11) NOT NULL DEFAULT '0', + `cf_comment_point` int(11) NOT NULL DEFAULT '0', + `cf_download_point` int(11) NOT NULL DEFAULT '0', + `cf_write_pages` int(11) NOT NULL DEFAULT '0', + `cf_mobile_pages` int(11) NOT NULL DEFAULT '0', + `cf_link_target` varchar(255) NOT NULL DEFAULT '', + `cf_delay_sec` int(11) NOT NULL DEFAULT '0', + `cf_filter` text NOT NULL, + `cf_possible_ip` text NOT NULL, + `cf_intercept_ip` text NOT NULL, + `cf_analytics` text NOT NULL, + `cf_add_meta` text NOT NULL, + `cf_member_skin` varchar(255) NOT NULL DEFAULT '', + `cf_use_homepage` tinyint(4) NOT NULL DEFAULT '0', + `cf_req_homepage` tinyint(4) NOT NULL DEFAULT '0', + `cf_use_tel` tinyint(4) NOT NULL DEFAULT '0', + `cf_req_tel` tinyint(4) NOT NULL DEFAULT '0', + `cf_use_hp` tinyint(4) NOT NULL DEFAULT '0', + `cf_req_hp` tinyint(4) NOT NULL DEFAULT '0', + `cf_use_addr` tinyint(4) NOT NULL DEFAULT '0', + `cf_req_addr` tinyint(4) NOT NULL DEFAULT '0', + `cf_use_signature` tinyint(4) NOT NULL DEFAULT '0', + `cf_req_signature` tinyint(4) NOT NULL DEFAULT '0', + `cf_use_profile` tinyint(4) NOT NULL DEFAULT '0', + `cf_req_profile` tinyint(4) NOT NULL DEFAULT '0', + `cf_register_level` tinyint(4) NOT NULL DEFAULT '0', + `cf_register_point` int(11) NOT NULL DEFAULT '0', + `cf_icon_level` tinyint(4) NOT NULL DEFAULT '0', + `cf_use_recommend` tinyint(4) NOT NULL DEFAULT '0', + `cf_recommend_point` int(11) NOT NULL DEFAULT '0', + `cf_leave_day` int(11) NOT NULL DEFAULT '0', + `cf_search_part` int(11) NOT NULL DEFAULT '0', + `cf_email_use` tinyint(4) NOT NULL DEFAULT '0', + `cf_email_wr_super_admin` tinyint(4) NOT NULL DEFAULT '0', + `cf_email_wr_group_admin` tinyint(4) NOT NULL DEFAULT '0', + `cf_email_wr_board_admin` tinyint(4) NOT NULL DEFAULT '0', + `cf_email_wr_write` tinyint(4) NOT NULL DEFAULT '0', + `cf_email_wr_comment_all` tinyint(4) NOT NULL DEFAULT '0', + `cf_email_mb_super_admin` tinyint(4) NOT NULL DEFAULT '0', + `cf_email_mb_member` tinyint(4) NOT NULL DEFAULT '0', + `cf_email_po_super_admin` tinyint(4) NOT NULL DEFAULT '0', + `cf_prohibit_id` text NOT NULL, + `cf_prohibit_email` text NOT NULL, + `cf_new_del` int(11) NOT NULL DEFAULT '0', + `cf_memo_del` int(11) NOT NULL DEFAULT '0', + `cf_visit_del` int(11) NOT NULL DEFAULT '0', + `cf_popular_del` int(11) NOT NULL DEFAULT '0', + `cf_optimize_date` date NOT NULL default '0000-00-00', + `cf_use_member_icon` tinyint(4) NOT NULL DEFAULT '0', + `cf_member_icon_size` int(11) NOT NULL DEFAULT '0', + `cf_member_icon_width` int(11) NOT NULL DEFAULT '0', + `cf_member_icon_height` int(11) NOT NULL DEFAULT '0', + `cf_login_minutes` int(11) NOT NULL DEFAULT '0', + `cf_image_extension` varchar(255) NOT NULL DEFAULT '', + `cf_flash_extension` varchar(255) NOT NULL DEFAULT '', + `cf_movie_extension` varchar(255) NOT NULL DEFAULT '', + `cf_formmail_is_member` tinyint(4) NOT NULL DEFAULT '0', + `cf_page_rows` int(11) NOT NULL DEFAULT '0', + `cf_mobile_page_rows` int(11) NOT NULL DEFAULT '0', + `cf_visit` varchar(255) NOT NULL DEFAULT '', + `cf_max_po_id` int(11) NOT NULL DEFAULT '0', + `cf_stipulation` text NOT NULL, + `cf_privacy` text NOT NULL, + `cf_open_modify` int(11) NOT NULL DEFAULT '0', + `cf_memo_send_point` int(11) NOT NULL DEFAULT '0', + `cf_mobile_new_skin` varchar(255) NOT NULL DEFAULT '', + `cf_mobile_search_skin` varchar(255) NOT NULL DEFAULT '', + `cf_mobile_connect_skin` varchar(255) NOT NULL DEFAULT '', + `cf_mobile_member_skin` varchar(255) NOT NULL DEFAULT '', + `cf_captcha_mp3` varchar(255) NOT NULL DEFAULT '', + `cf_editor` varchar(255) NOT NULL DEFAULT '', + `cf_cert_use` tinyint(4) NOT NULL DEFAULT '0', + `cf_cert_ipin` varchar(255) NOT NULL DEFAULT '', + `cf_cert_hp` varchar(255) NOT NULL DEFAULT '', + `cf_cert_kcb_cd` varchar(255) NOT NULL DEFAULT '', + `cf_cert_kcp_cd` varchar(255) NOT NULL DEFAULT '', + `cf_lg_mid` varchar(255) NOT NULL DEFAULT '', + `cf_lg_mert_key` varchar(255) NOT NULL DEFAULT '', + `cf_cert_limit` int(11) NOT NULL DEFAULT '0', + `cf_cert_req` tinyint(4) NOT NULL DEFAULT '0', + `cf_sms_use` varchar(255) NOT NULL DEFAULT '', + `cf_icode_id` varchar(255) NOT NULL DEFAULT '', + `cf_icode_pw` varchar(255) NOT NULL DEFAULT '', + `cf_icode_server_ip` varchar(255) NOT NULL DEFAULT '', + `cf_icode_server_port` varchar(255) NOT NULL DEFAULT '', + `cf_googl_shorturl_apikey` varchar(255) NOT NULL DEFAULT '', + `cf_facebook_appid` varchar(255) NOT NULL, + `cf_facebook_secret` varchar(255) NOT NULL, + `cf_twitter_key` varchar(255) NOT NULL, + `cf_twitter_secret` varchar(255) NOT NULL, + `cf_1_subj` varchar(255) NOT NULL DEFAULT '', + `cf_2_subj` varchar(255) NOT NULL DEFAULT '', + `cf_3_subj` varchar(255) NOT NULL DEFAULT '', + `cf_4_subj` varchar(255) NOT NULL DEFAULT '', + `cf_5_subj` varchar(255) NOT NULL DEFAULT '', + `cf_6_subj` varchar(255) NOT NULL DEFAULT '', + `cf_7_subj` varchar(255) NOT NULL DEFAULT '', + `cf_8_subj` varchar(255) NOT NULL DEFAULT '', + `cf_9_subj` varchar(255) NOT NULL DEFAULT '', + `cf_10_subj` varchar(255) NOT NULL DEFAULT '', + `cf_1` varchar(255) NOT NULL DEFAULT '', + `cf_2` varchar(255) NOT NULL DEFAULT '', + `cf_3` varchar(255) NOT NULL DEFAULT '', + `cf_4` varchar(255) NOT NULL DEFAULT '', + `cf_5` varchar(255) NOT NULL DEFAULT '', + `cf_6` varchar(255) NOT NULL DEFAULT '', + `cf_7` varchar(255) NOT NULL DEFAULT '', + `cf_8` varchar(255) NOT NULL DEFAULT '', + `cf_9` varchar(255) NOT NULL DEFAULT '', + `cf_10` varchar(255) NOT NULL DEFAULT '' +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_cert_history` +-- + +DROP TABLE IF EXISTS `g5_cert_history`; +CREATE TABLE IF NOT EXISTS `g5_cert_history` ( + `cr_id` int(11) NOT NULL auto_increment, + `mb_id` varchar(20) NOT NULL DEFAULT '', + `cr_company` varchar(255) NOT NULL DEFAULT '', + `cr_method` varchar(255) NOT NULL DEFAULT '', + `cr_ip` varchar(255) NOT NULL DEFAULT '', + `cr_date` date NOT NULL DEFAULT '0000-00-00', + `cr_time` time NOT NULL DEFAULT '00:00:00', + PRIMARY KEY (`cr_id`), + KEY `mb_id` (`mb_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_group` +-- + +DROP TABLE IF EXISTS `g5_group`; +CREATE TABLE IF NOT EXISTS `g5_group` ( + `gr_id` varchar(10) NOT NULL default '', + `gr_subject` varchar(255) NOT NULL default '', + `gr_device` ENUM('both','pc','mobile') NOT NULL DEFAULT 'both', + `gr_admin` varchar(255) NOT NULL default '', + `gr_use_access` tinyint(4) NOT NULL default '0', + `gr_order` int(11) NOT NULL default '0', + `gr_1_subj` varchar(255) NOT NULL default '', + `gr_2_subj` varchar(255) NOT NULL default '', + `gr_3_subj` varchar(255) NOT NULL default '', + `gr_4_subj` varchar(255) NOT NULL default '', + `gr_5_subj` varchar(255) NOT NULL default '', + `gr_6_subj` varchar(255) NOT NULL default '', + `gr_7_subj` varchar(255) NOT NULL default '', + `gr_8_subj` varchar(255) NOT NULL default '', + `gr_9_subj` varchar(255) NOT NULL default '', + `gr_10_subj` varchar(255) NOT NULL default '', + `gr_1` varchar(255) NOT NULL default '', + `gr_2` varchar(255) NOT NULL default '', + `gr_3` varchar(255) NOT NULL default '', + `gr_4` varchar(255) NOT NULL default '', + `gr_5` varchar(255) NOT NULL default '', + `gr_6` varchar(255) NOT NULL default '', + `gr_7` varchar(255) NOT NULL default '', + `gr_8` varchar(255) NOT NULL default '', + `gr_9` varchar(255) NOT NULL default '', + `gr_10` varchar(255) NOT NULL default '', + PRIMARY KEY (`gr_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_group_member` +-- + +DROP TABLE IF EXISTS `g5_group_member`; +CREATE TABLE IF NOT EXISTS `g5_group_member` ( + `gm_id` int(11) NOT NULL auto_increment, + `gr_id` varchar(255) NOT NULL default '', + `mb_id` varchar(20) NOT NULL default '', + `gm_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (`gm_id`), + KEY `gr_id` (`gr_id`), + KEY `mb_id` (`mb_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_login` +-- + +DROP TABLE IF EXISTS `g5_login`; +CREATE TABLE IF NOT EXISTS `g5_login` ( + `lo_ip` varchar(255) NOT NULL default '', + `mb_id` varchar(20) NOT NULL default '', + `lo_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + `lo_location` text NOT NULL, + `lo_url` text NOT NULL, + PRIMARY KEY (`lo_ip`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_mail` +-- + +DROP TABLE IF EXISTS `g5_mail`; +CREATE TABLE IF NOT EXISTS `g5_mail` ( + `ma_id` int(11) NOT NULL auto_increment, + `ma_subject` varchar(255) NOT NULL default '', + `ma_content` mediumtext NOT NULL, + `ma_time` datetime NOT NULL default '0000-00-00 00:00:00', + `ma_ip` varchar(255) NOT NULL default '', + `ma_last_option` text NOT NULL, + PRIMARY KEY (`ma_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_member` +-- + +DROP TABLE IF EXISTS `g5_member`; +CREATE TABLE IF NOT EXISTS `g5_member` ( + `mb_no` int(11) NOT NULL auto_increment, + `mb_id` varchar(20) NOT NULL default '', + `mb_password` varchar(255) NOT NULL default '', + `mb_name` varchar(255) NOT NULL default '', + `mb_nick` varchar(255) NOT NULL default '', + `mb_nick_date` date NOT NULL default '0000-00-00', + `mb_email` varchar(255) NOT NULL default '', + `mb_homepage` varchar(255) NOT NULL default '', + `mb_level` tinyint(4) NOT NULL default '0', + `mb_sex` char(1) NOT NULL default '', + `mb_birth` varchar(255) NOT NULL default '', + `mb_tel` varchar(255) NOT NULL default '', + `mb_hp` varchar(255) NOT NULL default '', + `mb_certify` varchar(20) NOT NULL default '', + `mb_adult` tinyint(4) NOT NULL default '0', + `mb_dupinfo` varchar(255) NOT NULL default '', + `mb_zip1` char(3) NOT NULL default '', + `mb_zip2` char(3) NOT NULL default '', + `mb_addr1` varchar(255) NOT NULL default '', + `mb_addr2` varchar(255) NOT NULL default '', + `mb_addr3` varchar(255) NOT NULL default '', + `mb_addr_jibeon` varchar(255) NOT NULL default '', + `mb_signature` text NOT NULL, + `mb_recommend` varchar(255) NOT NULL default '', + `mb_point` int(11) NOT NULL default '0', + `mb_today_login` datetime NOT NULL default '0000-00-00 00:00:00', + `mb_login_ip` varchar(255) NOT NULL default '', + `mb_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + `mb_ip` varchar(255) NOT NULL default '', + `mb_leave_date` varchar(8) NOT NULL default '', + `mb_intercept_date` varchar(8) NOT NULL default '', + `mb_email_certify` datetime NOT NULL default '0000-00-00 00:00:00', + `mb_memo` text NOT NULL, + `mb_lost_certify` varchar(255) NOT NULL, + `mb_mailling` tinyint(4) NOT NULL default '0', + `mb_sms` tinyint(4) NOT NULL default '0', + `mb_open` tinyint(4) NOT NULL default '0', + `mb_open_date` date NOT NULL default '0000-00-00', + `mb_profile` text NOT NULL, + `mb_memo_call` varchar(255) NOT NULL default '', + `mb_1` varchar(255) NOT NULL default '', + `mb_2` varchar(255) NOT NULL default '', + `mb_3` varchar(255) NOT NULL default '', + `mb_4` varchar(255) NOT NULL default '', + `mb_5` varchar(255) NOT NULL default '', + `mb_6` varchar(255) NOT NULL default '', + `mb_7` varchar(255) NOT NULL default '', + `mb_8` varchar(255) NOT NULL default '', + `mb_9` varchar(255) NOT NULL default '', + `mb_10` varchar(255) NOT NULL default '', + PRIMARY KEY (`mb_no`), + UNIQUE KEY `mb_id` (`mb_id`), + KEY `mb_today_login` (`mb_today_login`), + KEY `mb_datetime` (`mb_datetime`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_memo` +-- + +DROP TABLE IF EXISTS `g5_memo`; +CREATE TABLE IF NOT EXISTS `g5_memo` ( + `me_id` int(11) NOT NULL default '0', + `me_recv_mb_id` varchar(20) NOT NULL default '', + `me_send_mb_id` varchar(20) NOT NULL default '', + `me_send_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + `me_read_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + `me_memo` text NOT NULL, + PRIMARY KEY (`me_id`), + KEY `me_recv_mb_id` (`me_recv_mb_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_point` +-- + +DROP TABLE IF EXISTS `g5_point`; +CREATE TABLE IF NOT EXISTS `g5_point` ( + `po_id` int(11) NOT NULL auto_increment, + `mb_id` varchar(20) NOT NULL default '', + `po_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + `po_content` varchar(255) NOT NULL default '', + `po_point` int(11) NOT NULL default '0', + `po_use_point` int(11) NOT NULL default '0', + `po_expired` tinyint(4) NOT NULL default '0', + `po_expire_date` date NOT NULL default '0000-00-00', + `po_mb_point` int(11) NOT NULL default '0', + `po_rel_table` varchar(20) NOT NULL default '', + `po_rel_id` varchar(20) NOT NULL default '', + `po_rel_action` varchar(255) NOT NULL default '', + PRIMARY KEY (`po_id`), + KEY `index1` (`mb_id`,`po_rel_table`,`po_rel_id`,`po_rel_action`), + KEY `index2` (`po_expire_date`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_poll` +-- + +DROP TABLE IF EXISTS `g5_poll`; +CREATE TABLE IF NOT EXISTS `g5_poll` ( + `po_id` int(11) NOT NULL auto_increment, + `po_subject` varchar(255) NOT NULL default '', + `po_poll1` varchar(255) NOT NULL default '', + `po_poll2` varchar(255) NOT NULL default '', + `po_poll3` varchar(255) NOT NULL default '', + `po_poll4` varchar(255) NOT NULL default '', + `po_poll5` varchar(255) NOT NULL default '', + `po_poll6` varchar(255) NOT NULL default '', + `po_poll7` varchar(255) NOT NULL default '', + `po_poll8` varchar(255) NOT NULL default '', + `po_poll9` varchar(255) NOT NULL default '', + `po_cnt1` int(11) NOT NULL default '0', + `po_cnt2` int(11) NOT NULL default '0', + `po_cnt3` int(11) NOT NULL default '0', + `po_cnt4` int(11) NOT NULL default '0', + `po_cnt5` int(11) NOT NULL default '0', + `po_cnt6` int(11) NOT NULL default '0', + `po_cnt7` int(11) NOT NULL default '0', + `po_cnt8` int(11) NOT NULL default '0', + `po_cnt9` int(11) NOT NULL default '0', + `po_etc` varchar(255) NOT NULL default '', + `po_level` tinyint(4) NOT NULL default '0', + `po_point` int(11) NOT NULL default '0', + `po_date` date NOT NULL default '0000-00-00', + `po_ips` mediumtext NOT NULL, + `mb_ids` text NOT NULL, + PRIMARY KEY (`po_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_poll_etc` +-- + +DROP TABLE IF EXISTS `g5_poll_etc`; +CREATE TABLE IF NOT EXISTS `g5_poll_etc` ( + `pc_id` int(11) NOT NULL default '0', + `po_id` int(11) NOT NULL default '0', + `mb_id` varchar(20) NOT NULL default '', + `pc_name` varchar(255) NOT NULL default '', + `pc_idea` varchar(255) NOT NULL default '', + `pc_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (`pc_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_popular` +-- + +DROP TABLE IF EXISTS `g5_popular`; +CREATE TABLE IF NOT EXISTS `g5_popular` ( + `pp_id` int(11) NOT NULL auto_increment, + `pp_word` varchar(50) NOT NULL default '', + `pp_date` date NOT NULL default '0000-00-00', + `pp_ip` varchar(50) NOT NULL default '', + PRIMARY KEY (`pp_id`), + UNIQUE KEY `index1` (`pp_date`,`pp_word`,`pp_ip`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_scrap` +-- + +DROP TABLE IF EXISTS `g5_scrap`; +CREATE TABLE IF NOT EXISTS `g5_scrap` ( + `ms_id` int(11) NOT NULL auto_increment, + `mb_id` varchar(20) NOT NULL default '', + `bo_table` varchar(20) NOT NULL default '', + `wr_id` varchar(15) NOT NULL default '', + `ms_datetime` datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (`ms_id`), + KEY `mb_id` (`mb_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_visit` +-- + +DROP TABLE IF EXISTS `g5_visit`; +CREATE TABLE IF NOT EXISTS `g5_visit` ( + `vi_id` int(11) NOT NULL default '0', + `vi_ip` varchar(255) NOT NULL default '', + `vi_date` date NOT NULL default '0000-00-00', + `vi_time` time NOT NULL default '00:00:00', + `vi_referer` text NOT NULL, + `vi_agent` varchar(255) NOT NULL default '', + PRIMARY KEY (`vi_id`), + UNIQUE KEY `index1` (`vi_ip`,`vi_date`), + KEY `index2` (`vi_date`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_visit_sum` +-- + +DROP TABLE IF EXISTS `g5_visit_sum`; +CREATE TABLE IF NOT EXISTS `g5_visit_sum` ( + `vs_date` date NOT NULL default '0000-00-00', + `vs_count` int(11) NOT NULL default '0', + PRIMARY KEY (`vs_date`), + KEY `index1` (`vs_count`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_unique` +-- + +DROP TABLE IF EXISTS `g5_uniqid`; +CREATE TABLE IF NOT EXISTS `g5_uniqid` ( + `uq_id` bigint(20) unsigned NOT NULL, + `uq_ip` varchar(255) NOT NULL, + PRIMARY KEY (`uq_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_syndi_log` +-- + +DROP TABLE IF EXISTS `g5_syndi_log`; +CREATE TABLE IF NOT EXISTS `g5_syndi_log` ( + `content_id` int(11) NOT NULL, + `bbs_id` varchar(50) NOT NULL, + `title` text NOT NULL, + `link_alternative` varchar(250) NOT NULL, + `delete_date` varchar(14) NOT NULL, + PRIMARY KEY (`content_id`,`bbs_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_autosave` +-- + +DROP TABLE IF EXISTS `g5_autosave`; +CREATE TABLE IF NOT EXISTS `g5_autosave` ( + `as_id` int(11) NOT NULL AUTO_INCREMENT, + `mb_id` varchar(20) NOT NULL, + `as_uid` bigint(20) unsigned NOT NULL, + `as_subject` varchar(255) NOT NULL, + `as_content` text NOT NULL, + `as_datetime` datetime NOT NULL, + PRIMARY KEY (`as_id`), + UNIQUE KEY `as_uid` (`as_uid`), + KEY `mb_id` (`mb_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_qa_config` +-- + +DROP TABLE IF EXISTS `g5_qa_config`; +CREATE TABLE IF NOT EXISTS `g5_qa_config` ( + `qa_title` varchar(255) NOT NULL DEFAULT'', + `qa_category` varchar(255) NOT NULL DEFAULT'', + `qa_skin` varchar(255) NOT NULL DEFAULT '', + `qa_mobile_skin` varchar(255) NOT NULL DEFAULT '', + `qa_use_email` tinyint(4) NOT NULL DEFAULT '0', + `qa_req_email` tinyint(4) NOT NULL DEFAULT '0', + `qa_use_hp` tinyint(4) NOT NULL DEFAULT '0', + `qa_req_hp` tinyint(4) NOT NULL DEFAULT '0', + `qa_use_sms` tinyint(4) NOT NULL DEFAULT '0', + `qa_send_number` varchar(255) NOT NULL DEFAULT '0', + `qa_admin_hp` varchar(255) NOT NULL DEFAULT '', + `qa_admin_email` varchar(255) NOT NULL DEFAULT '', + `qa_use_editor` tinyint(4) NOT NULL DEFAULT '0', + `qa_subject_len` int(11) NOT NULL DEFAULT '0', + `qa_mobile_subject_len` int(11) NOT NULL DEFAULT '0', + `qa_page_rows` int(11) NOT NULL DEFAULT '0', + `qa_mobile_page_rows` int(11) NOT NULL DEFAULT '0', + `qa_image_width` int(11) NOT NULL DEFAULT '0', + `qa_upload_size` int(11) NOT NULL DEFAULT '0', + `qa_insert_content` text NOT NULL, + `qa_include_head` varchar(255) NOT NULL DEFAULT '', + `qa_include_tail` varchar(255) NOT NULL DEFAULT '', + `qa_content_head` text NOT NULL, + `qa_content_tail` text NOT NULL, + `qa_mobile_content_head` text NOT NULL, + `qa_mobile_content_tail` text NOT NULL, + `qa_1_subj` varchar(255) NOT NULL DEFAULT '', + `qa_2_subj` varchar(255) NOT NULL DEFAULT '', + `qa_3_subj` varchar(255) NOT NULL DEFAULT '', + `qa_4_subj` varchar(255) NOT NULL DEFAULT '', + `qa_5_subj` varchar(255) NOT NULL DEFAULT '', + `qa_1` varchar(255) NOT NULL DEFAULT '', + `qa_2` varchar(255) NOT NULL DEFAULT '', + `qa_3` varchar(255) NOT NULL DEFAULT '', + `qa_4` varchar(255) NOT NULL DEFAULT '', + `qa_5` varchar(255) NOT NULL DEFAULT '' +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_qa_content` +-- + +DROP TABLE IF EXISTS `g5_qa_content`; +CREATE TABLE IF NOT EXISTS `g5_qa_content` ( + `qa_id` int(11) NOT NULL AUTO_INCREMENT, + `qa_num` int(11) NOT NULL DEFAULT '0', + `qa_parent` int(11) NOT NULL DEFAULT '0', + `qa_related` int(11) NOT NULL DEFAULT '0', + `mb_id` varchar(20) NOT NULL DEFAULT '', + `qa_name` varchar(255) NOT NULL DEFAULT '', + `qa_email` varchar(255) NOT NULL DEFAULT '', + `qa_hp` varchar(255) NOT NULL DEFAULT '', + `qa_type` tinyint(4) NOT NULL DEFAULT '0', + `qa_category` varchar(255) NOT NULL DEFAULT '', + `qa_email_recv` tinyint(4) NOT NULL DEFAULT '0', + `qa_sms_recv` tinyint(4) NOT NULL DEFAULT '0', + `qa_html` tinyint(4) NOT NULL DEFAULT '0', + `qa_subject` varchar(255) NOT NULL DEFAULT '', + `qa_content` text NOT NULL, + `qa_status` tinyint(4) NOT NULL DEFAULT '0', + `qa_file1` varchar(255) NOT NULL DEFAULT '', + `qa_source1` varchar(255) NOT NULL DEFAULT '', + `qa_file2` varchar(255) NOT NULL DEFAULT '', + `qa_source2` varchar(255) NOT NULL DEFAULT '', + `qa_ip` varchar(255) NOT NULL DEFAULT '', + `qa_datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `qa_1` varchar(255) NOT NULL DEFAULT '', + `qa_2` varchar(255) NOT NULL DEFAULT '', + `qa_3` varchar(255) NOT NULL DEFAULT '', + `qa_4` varchar(255) NOT NULL DEFAULT '', + `qa_5` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`qa_id`), + KEY `qa_num_parent` (`qa_num`,`qa_parent`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_content` +-- + +DROP TABLE IF EXISTS `g5_content`; +CREATE TABLE IF NOT EXISTS `g5_content` ( + `co_id` varchar(20) NOT NULL DEFAULT '', + `co_html` tinyint(4) NOT NULL DEFAULT '0', + `co_subject` varchar(255) NOT NULL DEFAULT '', + `co_content` longtext NOT NULL, + `co_tag_filter_use` tinyint(4) NOT NULL DEFAULT '0', + `co_hit` int(11) NOT NULL DEFAULT '0', + `co_include_head` varchar(255) NOT NULL, + `co_include_tail` varchar(255) NOT NULL, + PRIMARY KEY (`co_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_faq` +-- + +DROP TABLE IF EXISTS `g5_faq`; +CREATE TABLE IF NOT EXISTS `g5_faq` ( + `fa_id` int(11) NOT NULL AUTO_INCREMENT, + `fm_id` int(11) NOT NULL DEFAULT '0', + `fa_subject` text NOT NULL, + `fa_content` text NOT NULL, + `fa_order` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`fa_id`), + KEY `fm_id` (`fm_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_faq_master` +-- + +DROP TABLE IF EXISTS `g5_faq_master`; +CREATE TABLE IF NOT EXISTS `g5_faq_master` ( + `fm_id` int(11) NOT NULL AUTO_INCREMENT, + `fm_subject` varchar(255) NOT NULL DEFAULT '', + `fm_head_html` text NOT NULL, + `fm_tail_html` text NOT NULL, + `fm_mobile_head_html` text NOT NULL, + `fm_mobile_tail_html` text NOT NULL, + `fm_order` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`fm_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_new_win` +-- + +DROP TABLE IF EXISTS `g5_new_win`; +CREATE TABLE IF NOT EXISTS `g5_new_win` ( + `nw_id` int(11) NOT NULL AUTO_INCREMENT, + `nw_device` varchar(10) NOT NULL DEFAULT 'both', + `nw_begin_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `nw_end_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `nw_disable_hours` int(11) NOT NULL DEFAULT '0', + `nw_left` int(11) NOT NULL DEFAULT '0', + `nw_top` int(11) NOT NULL DEFAULT '0', + `nw_height` int(11) NOT NULL DEFAULT '0', + `nw_width` int(11) NOT NULL DEFAULT '0', + `nw_subject` text NOT NULL, + `nw_content` text NOT NULL, + `nw_content_html` tinyint(4) NOT NULL DEFAULT '0', + PRIMARY KEY (`nw_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `g5_menu` +-- + +DROP TABLE IF EXISTS `g5_menu`; +CREATE TABLE IF NOT EXISTS `g5_menu` ( + `me_id` int(11) NOT NULL AUTO_INCREMENT, + `me_code` varchar(255) NOT NULL DEFAULT '', + `me_name` varchar(255) NOT NULL DEFAULT '', + `me_link` varchar(255) NOT NULL DEFAULT '', + `me_target` varchar(255) NOT NULL DEFAULT '', + `me_order` int(11) NOT NULL DEFAULT '0', + `me_use` tinyint(4) NOT NULL DEFAULT '0', + `me_mobile_use` tinyint(4) NOT NULL DEFAULT '0', + PRIMARY KEY (`me_id`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; diff --git a/install/img/mooning.png b/install/img/mooning.png new file mode 100644 index 0000000000000000000000000000000000000000..da898fc3cbb782f98bc8d56899ac1c7326c5c7f0 GIT binary patch literal 63654 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 z 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

    rl5%ZX>1f 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 literal 0 HcmV?d00001 diff --git a/install/img/pat01.png b/install/img/pat01.png new file mode 100644 index 0000000000000000000000000000000000000000..238c054d2adb3be29f9158d762eb5b58174fa986 GIT binary patch literal 32481 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�M{u|4~~Podqw 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 O0000 + + +

    + +
    +

    + 라이센스(License) 내용을 반드시 확인하십시오.
    + 라이센스에 동의하시는 경우에만 설치가 진행됩니다. +

    + +
    + +
    + +
    + + +
    + +
    + +
    +
    + + + + + + + diff --git a/install/install.css b/install/install.css new file mode 100644 index 000000000..8cc407a05 --- /dev/null +++ b/install/install.css @@ -0,0 +1,39 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* 공통 */ +body {margin:0;padding:0;background:url('img/pat01.png') #edf0f4;font-size:0.75em;font-family:dotum,helvetica} +input, img, select, button {font-size:1em;vertical-align:middle} +label {vertical-align:middle} + +#ins_bar {margin:0 0 50px;padding:20px 30px;background:#383838;color:#a1a4a7;font-family:tahoma,helvetica;font-size:1.500em;zoom:1} +#ins_bar:after {display:block;visibility:hidden;clear:both;content:""} +#ins_bar #bar_img {float:left} +#ins_bar #bar_txt {float:right} + +h1 {margin:0 0 30px;text-align:center} + +.ins_inner {margin:0 30px 50px;padding:20px 30px;border-right:1px solid #dde4e9;border-bottom:1px solid #dde4e9;background:#fff} +.ins_inner ul {margin:20px 0;padding:0 0 0 13px} +.ins_inner ol {margin:20px 0;padding:0 0 0 18px} +.ins_inner ol li {margin:0 0 5px} +.ins_inner p strong {color:red} +.ins_inner .inner_btn {margin:30px 0 0;text-align:right} +.ins_inner .inner_btn a, .ins_inner .inner_btn input {display:inline-block;padding:10px 20px;background:#ff347d;color:#fff;text-decoration:none} +.ins_inner .inner_btn input {border:0;cursor:pointer} + +.ins_frm {margin:0 0 30px;width:100%;border:0;border-collapse:collapse} +.ins_frm caption {padding:10px 0;font-weight:bold;text-align:left} +.ins_frm th, .ins_frm td {padding:5px 3px;border-top:1px solid #dde4e9;border-bottom:1px solid #dde4e9} +.ins_frm th {width:25%;background:#f2f5f9} +.ins_frm td span {display:block;margin:5px 0 0;font-size:0.917em;letter-spacing:-0.1em} + +.ins_ta {padding:5px 0;border:1px solid #dde4e9;text-align:center} +.ins_ta textarea {border:0;padding:0;width:99%;height:250px;background:transparent} +.ins_license {background:#f2f5f9} + +#ins_ft {color:#a1a4a7;font-family:tahoma,helvetica;text-align:center} +#ins_ft strong {font-size:1.500em;font-weight:normal} + +/* 라이센스 확인 1/3 */ +#ins_agree {padding:10px 0 0;text-align:right} \ No newline at end of file diff --git a/install/install.inc.php b/install/install.inc.php new file mode 100644 index 000000000..13977884d --- /dev/null +++ b/install/install.inc.php @@ -0,0 +1,96 @@ + + + + + +<?php echo $title; ?> + + + + +
    + GNUBOARD5 + INSTALLATION +
    + + +

    프로그램이 이미 설치되어 있습니다.

    + +
    +

    프로그램이 이미 설치되어 있습니다.
    새로 설치하시려면 다음 파일을 삭제 하신 후 새로고침 하십시오.

    +
      +
    • +
    +
    + + + +

    설치를 위해 아래 내용을 확인해 주십시오.

    + +
    +

    + 루트 디렉토리에 아래로 디렉토리를 생성하여 주십시오.
    + (common.php 파일이 있는곳이 루트 디렉토리 입니다.)

    + $> mkdir

    + 윈도우의 경우 data 폴더를 하나 생성해 주시기 바랍니다.

    + 위 명령 실행후 브라우저를 새로고침 하십시오. +

    +
    + + + +
    +

    + 디렉토리의 퍼미션을 705로 변경하여 주십시오.

    + $> chmod 705 또는 chmod uo+rx

    + 위 명령 실행후 브라우저를 새로고침 하십시오. +

    +
    + +
    +

    + 디렉토리의 퍼미션을 707로 변경하여 주십시오.

    + $> chmod 707 또는 chmod uo+rwx

    + 위 명령 실행후 브라우저를 새로고침 하십시오. +

    +
    + \ No newline at end of file diff --git a/install/install.inc2.php b/install/install.inc2.php new file mode 100644 index 000000000..1517c05b6 --- /dev/null +++ b/install/install.inc2.php @@ -0,0 +1,7 @@ +
    + GNUBOARD5 +

    GPL! OPEN SOURCE GNUBOARD

    +
    + + + \ No newline at end of file diff --git a/install/install_config.php b/install/install_config.php new file mode 100644 index 000000000..14d37fa5e --- /dev/null +++ b/install/install_config.php @@ -0,0 +1,154 @@ +

    라이센스(License) 내용에 동의하셔야 설치를 계속하실 수 있습니다.

    ".PHP_EOL; + echo "
    ".PHP_EOL; + exit; +} +?> + + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    MySQL 정보입력
    + +
    + +
    + +
    + +
    + + 가능한 변경하지 마십시오. +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    최고관리자 정보입력
    + +
    + +
    + +
    + +
    + +

    + 주의! 이미 가 존재한다면 DB 자료가 망실되므로 주의하십시오.
    + 주의사항을 이해했으며, 그누보드 설치를 계속 진행하시려면 다음을 누르십시오. +

    + +
    + +
    +
    + + + + \ No newline at end of file diff --git a/install/install_db.php b/install/install_db.php new file mode 100644 index 000000000..a62c10ab3 --- /dev/null +++ b/install/install_db.php @@ -0,0 +1,304 @@ + + +
    +

    MySQL Host, User, Password 를 확인해 주십시오.

    + +
    + + + +
    +

    MySQL DB 를 확인해 주십시오.

    + +
    + +=') == 1) { + @mysql_query("SET SESSION sql_mode = ''"); + $mysql_set_mode = 'true'; +} +?> + +
    +

    설치가 시작되었습니다.

    + +
      + + +
    1. 전체 테이블 생성 완료
    2. + +" . $sql); + +// 1:1문의 설정 +$sql = " insert into `{$table_prefix}qa_config` + ( qa_title, qa_category, qa_skin, qa_mobile_skin, qa_use_email, qa_req_email, qa_use_hp, qa_req_hp, qa_use_editor, qa_subject_len, qa_mobile_subject_len, qa_page_rows, qa_mobile_page_rows, qa_image_width, qa_upload_size, qa_insert_content ) + values + ( '1:1문의', '회원|포인트', 'basic', 'basic', '1', '0', '1', '0', '1', '60', '30', '15', '15', '600', '1048576', '' ) "; +mysql_query($sql); + +// 관리자 회원가입 +$sql = " insert into `{$table_prefix}member` + set mb_id = '$admin_id', + mb_password = PASSWORD('$admin_pass'), + mb_name = '$admin_name', + mb_nick = '$admin_name', + mb_email = '$admin_email', + mb_level = '10', + mb_mailling = '1', + mb_open = '1', + mb_email_certify = '".G5_TIME_YMDHIS."', + mb_datetime = '".G5_TIME_YMDHIS."', + mb_ip = '{$_SERVER['REMOTE_ADDR']}' + "; +@mysql_query($sql); + +// 내용관리 생성 +@mysql_query(" insert into `{$table_prefix}content` set co_id = 'company', co_html = '1', co_subject = '회사소개', co_content= '

      회사소개에 대한 내용을 입력하십시오.

      ' ") or die(mysql_error() . "

      " . $sql); +@mysql_query(" insert into `{$table_prefix}content` set co_id = 'privacy', co_html = '1', co_subject = '개인정보 처리방침', co_content= '

      개인정보 처리방침에 대한 내용을 입력하십시오.

      ' ") or die(mysql_error() . "

      " . $sql); +@mysql_query(" insert into `{$table_prefix}content` set co_id = 'provision', co_html = '1', co_subject = '서비스 이용약관', co_content= '

      서비스 이용약관에 대한 내용을 입력하십시오.

      ' ") or die(mysql_error() . "

      " . $sql); + +// FAQ Master +@mysql_query(" insert into `{$table_prefix}faq_master` set fm_id = '1', fm_subject = '자주하시는 질문' ") or die(mysql_error() . "

      " . $sql); +?> + +

    3. DB설정 완료
    4. + + + +
    5. 데이터 디렉토리 생성 완료
    6. + +"); + +fclose($f); +@chmod($file, G5_FILE_PERMISSION); +?> + +
    7. DB설정 파일 생성 완료 ()
    8. + + +Order allow,deny +Deny from all + +EOD; +fwrite($f, $str); +fclose($f); +//------------------------------------------------------------------------------------------------- +?> +
    + +

    축하합니다. 설치가 완료되었습니다.

    + +
    + +
    + +

    환경설정 변경은 다음의 과정을 따르십시오.

    + +
      +
    1. 메인화면으로 이동
    2. +
    3. 관리자 로그인
    4. +
    5. 관리자 모드 접속
    6. +
    7. 환경설정 메뉴의 기본환경설정 페이지로 이동
    8. +
    + + + +
    + + \ No newline at end of file diff --git a/install/library.check.php b/install/library.check.php new file mode 100644 index 000000000..c01d9643e --- /dev/null +++ b/install/library.check.php @@ -0,0 +1,9 @@ +'.PHP_EOL; + echo 'alert("'.G5_VERSION.'의 정상적인 사용을 위해서는 GD 라이브러리가 필요합니다.\nGD 라이브러리가 없을 경우 자동등록방지 문자와 썸네일 기능이 작동하지 않습니다.");'.PHP_EOL; + echo ''.PHP_EOL; +} +?> \ No newline at end of file diff --git a/js/autosave.js b/js/autosave.js new file mode 100644 index 000000000..7c867e1a1 --- /dev/null +++ b/js/autosave.js @@ -0,0 +1,103 @@ +// 임시 저장하는 시간을 초단위로 설정한다. +var AUTOSAVE_INTERVAL = 60; // 초 + +// 글의 제목과 내용을 바뀐 부분이 있는지 비교하기 위하여 저장해 놓는 변수 +var save_wr_subject = null; +var save_wr_content = null; + +function autosave() { + $("form#fwrite").each(function() { + if (g5_editor.indexOf("ckeditor4") != -1 && typeof(CKEDITOR.instances.wr_content)!="undefined") { + this.wr_content.value = CKEDITOR.instances.wr_content.getData(); + } else if (g5_editor.indexOf("cheditor5") != -1 && typeof(ed_wr_content)!="undefined") { + this.wr_content.value = ed_wr_content.outputBodyHTML(); + } + // 변수에 저장해 놓은 값과 다를 경우에만 임시 저장함 + if (save_wr_subject != this.wr_subject.value || save_wr_content != this.wr_content.value) { + $.ajax({ + url: g5_bbs_url+"/ajax.autosave.php", + data: { + "uid" : this.uid.value, + "subject": this.wr_subject.value, + "content": this.wr_content.value + }, + type: "POST", + success: function(data){ + if (data) { + $("#autosave_count").html(data); + } + } + }); + save_wr_subject = this.wr_subject.value; + save_wr_content = this.wr_content.value; + } + }); +} + +$(function(){ + + if (g5_is_member) { + setInterval(autosave, AUTOSAVE_INTERVAL * 1000); + } + + // 임시저장된 글목록을 가져옴 + $("#btn_autosave").click(function(){ + if ($("#autosave_pop").is(":hidden")) { + $.get(g5_bbs_url+"/ajax.autosavelist.php", function(data){ + //alert(data); + //console.log( "Data: " + data); + $("#autosave_pop ul").empty(); + if ($(data).find("list").find("item").length > 0) { + $(data).find("list").find("item").each(function(i) { + var id = $(this).find("id").text(); + var uid = $(this).find("uid").text(); + var subject = $(this).find("subject").text(); + var datetime = $(this).find("datetime").text(); + $("#autosave_pop ul").append('
  • '+subject+''+datetime+'
  • '); + $.data(document.body, "autosave_id"+i, id); + $.data(document.body, "autosave_uid"+i, uid); + }); + } + }, "xml"); + $("#autosave_pop").show(); + } else { + $("#autosave_pop").hide(); + } + }); + + // 임시저장된 글 제목과 내용을 가져와서 제목과 내용 입력박스에 노출해 줌 + $(".autosave_load").live("click", function(){ + var i = $(this).parents("li").index(); + var as_id = $.data(document.body, "autosave_id"+i); + var as_uid = $.data(document.body, "autosave_uid"+i); + $("#fwrite input[name='uid']").val(as_uid); + $.get(g5_bbs_url+"/ajax.autosaveload.php", {"as_id":as_id}, function(data){ + var subject = $(data).find("item").find("subject").text(); + var content = $(data).find("item").find("content").text(); + $("#wr_subject").val(subject); + if (g5_editor.indexOf("ckeditor4") != -1 && typeof(CKEDITOR.instances.wr_content)!="undefined") { + CKEDITOR.instances.wr_content.setData(content); + } else if (g5_editor.indexOf("cheditor5") != -1 && typeof(ed_wr_content)!="undefined") { + ed_wr_content.putContents(content); + } else { + $("#fwrite #wr_content").val(content); + } + }, "xml"); + $("#autosave_pop").hide(); + }); + + $(".autosave_del").live("click", function(){ + var i = $(this).parents("li").index(); + var as_id = $.data(document.body, "autosave_id"+i); + $.get(g5_bbs_url+"/ajax.autosavedel.php", {"as_id":as_id}, function(data){ + if (data == -1) { + alert("임시 저장된글을 삭제중에 오류가 발생하였습니다."); + } else { + $("#autosave_count").html(data); + $("#autosave_pop ul > li").eq(i).remove(); + } + }); + }); + + $(".autosave_close").click(function(){ $("#autosave_pop").hide(); }); +}); diff --git a/js/certify.js b/js/certify.js new file mode 100644 index 000000000..7cbee8f1d --- /dev/null +++ b/js/certify.js @@ -0,0 +1,55 @@ +// 본인확인 인증창 호출 +function certify_win_open(type, url) +{ + if(type == 'kcb-ipin') + { + var popupWindow = window.open( url, "kcbPop", "left=200, top=100, status=0, width=450, height=550" ); + popupWindow.focus(); + } + else if(type == 'kcb-hp') + { + var popupWindow = window.open( url, "auth_popup", "left=200, top=100, width=430, height=590, scrollbar=yes" ); + popupWindow.focus(); + } + else if(type == 'kcp-hp') + { + var return_gubun; + var width = 410; + var height = 500; + + var leftpos = screen.width / 2 - ( width / 2 ); + var toppos = screen.height / 2 - ( height / 2 ); + + var winopts = "width=" + width + ", height=" + height + ", toolbar=no,status=no,statusbar=no,menubar=no,scrollbars=no,resizable=no"; + var position = ",left=" + leftpos + ", top=" + toppos; + var AUTH_POP = window.open(url,'auth_popup', winopts + position); + } + else if(type == 'lg-hp') + { + var popupWindow = window.open( url, "auth_popup", "left=200, top=100, width=400, height=400, scrollbar=yes" ); + popupWindow.focus(); + } +} + +// 인증체크 +function cert_confirm() +{ + var type; + var val = document.fregisterform.cert_type.value + + switch(val) { + case "ipin": + type = "아이핀"; + break; + case "hp": + type = "휴대폰"; + break; + default: + return true; + } + + if(confirm("이미 "+type+"으로 본인확인을 완료하셨습니다.\n\n이전 인증을 취소하고 다시 인증하시겠습니까?")) + return true; + else + return false; +} \ No newline at end of file diff --git a/js/common.js b/js/common.js new file mode 100644 index 000000000..00cfccb59 --- /dev/null +++ b/js/common.js @@ -0,0 +1,555 @@ +// 전역 변수 +var errmsg = ""; +var errfld = null; + +// 필드 검사 +function check_field(fld, msg) +{ + if ((fld.value = trim(fld.value)) == "") + error_field(fld, msg); + else + clear_field(fld); + return; +} + +// 필드 오류 표시 +function error_field(fld, msg) +{ + if (msg != "") + errmsg += msg + "\n"; + if (!errfld) errfld = fld; + fld.style.background = "#BDDEF7"; +} + +// 필드를 깨끗하게 +function clear_field(fld) +{ + fld.style.background = "#FFFFFF"; +} + +function trim(s) +{ + var t = ""; + var from_pos = to_pos = 0; + + for (i=0; i=0; i--) + { + if (s.charAt(i-1) == ' ') + continue; + else + { + to_pos = i; + break; + } + } + + t = s.substring(from_pos, to_pos); + // alert(from_pos + ',' + to_pos + ',' + t+'.'); + return t; +} + +// 자바스크립트로 PHP의 number_format 흉내를 냄 +// 숫자에 , 를 출력 +function number_format(data) +{ + + var tmp = ''; + var number = ''; + var cutlen = 3; + var comma = ','; + var i; + + var sign = data.match(/^[\+\-]/); + if(sign) { + data = data.replace(/^[\+\-]/, ""); + } + + len = data.length; + mod = (len % cutlen); + k = cutlen - mod; + for (i=0; i 0) + document.getElementById(id).rows -= row; +} + +function textarea_original(id, row) +{ + document.getElementById(id).rows = row; +} + +function textarea_increase(id, row) +{ + document.getElementById(id).rows += row; +} + +// 글숫자 검사 +function check_byte(content, target) +{ + var i = 0; + var cnt = 0; + var ch = ''; + var cont = document.getElementById(content).value; + + for (i=0; i 4) { + cnt += 2; + } else { + cnt += 1; + } + } + // 숫자를 출력 + document.getElementById(target).innerHTML = cnt; + + return cnt; +} + +// 브라우저에서 오브젝트의 왼쪽 좌표 +function get_left_pos(obj) +{ + var parentObj = null; + var clientObj = obj; + //var left = obj.offsetLeft + document.body.clientLeft; + var left = obj.offsetLeft; + + while((parentObj=clientObj.offsetParent) != null) + { + left = left + parentObj.offsetLeft; + clientObj = parentObj; + } + + return left; +} + +// 브라우저에서 오브젝트의 상단 좌표 +function get_top_pos(obj) +{ + var parentObj = null; + var clientObj = obj; + //var top = obj.offsetTop + document.body.clientTop; + var top = obj.offsetTop; + + while((parentObj=clientObj.offsetParent) != null) + { + top = top + parentObj.offsetTop; + clientObj = parentObj; + } + + return top; +} + +function flash_movie(src, ids, width, height, wmode) +{ + var wh = ""; + if (parseInt(width) && parseInt(height)) + wh = " width='"+width+"' height='"+height+"' "; + return ""; +} + +function obj_movie(src, ids, width, height, autostart) +{ + var wh = ""; + if (parseInt(width) && parseInt(height)) + wh = " width='"+width+"' height='"+height+"' "; + if (!autostart) autostart = false; + return ""; +} + +function doc_write(cont) +{ + document.write(cont); +} + +var win_password_lost = function(href) { + window.open(href, "win_password_lost", "left=50, top=50, width=617, height=330, scrollbars=1"); +} + +$(document).ready(function(){ + $("#login_password_lost, #ol_password_lost").click(function(){ + win_password_lost(this.href); + return false; + }); +}); + +/** + * 포인트 창 + **/ +var win_point = function(href) { + var new_win = window.open(href, 'win_point', 'left=100,top=100,width=600, height=600, scrollbars=1'); + new_win.focus(); +} + +/** + * 쪽지 창 + **/ +var win_memo = function(href) { + var new_win = window.open(href, 'win_memo', 'left=100,top=100,width=620,height=500,scrollbars=1'); + new_win.focus(); +} + +/** + * 메일 창 + **/ +var win_email = function(href) { + var new_win = window.open(href, 'win_email', 'left=100,top=100,width=600,height=580,scrollbars=0'); + new_win.focus(); +} + +/** + * 자기소개 창 + **/ +var win_profile = function(href) { + var new_win = window.open(href, 'win_profile', 'left=100,top=100,width=620,height=510,scrollbars=1'); + new_win.focus(); +} + +/** + * 스크랩 창 + **/ +var win_scrap = function(href) { + var new_win = window.open(href, 'win_scrap', 'left=100,top=100,width=600,height=600,scrollbars=1'); + new_win.focus(); +} + +/** + * 홈페이지 창 + **/ +var win_homepage = function(href) { + var new_win = window.open(href, 'win_homepage', ''); + new_win.focus(); +} + +/** + * 우편번호 창 + **/ +var win_zip = function(href) { + var new_win = window.open(href, 'win_zip', 'width=616, height=760, scrollbars=1'); + new_win.focus(); +} + +/** + * sms5 창 + **/ +var win_sms5 = function(href) { + var new_win = window.open(href, 'win_zip', 'width=474, height=560, scrollbars=1'); + new_win.focus(); +} + +/** + * 새로운 비밀번호 분실 창 : 101123 + **/ +win_password_lost = function(href) +{ + var new_win = window.open(href, 'win_password_lost', 'width=617, height=330, scrollbars=1'); + new_win.focus(); +} + +/** + * 설문조사 결과 + **/ +var win_poll = function(href) { + var new_win = window.open(href, 'win_poll', 'width=616, height=500, scrollbars=1'); + new_win.focus(); +} + +/** + * 스크린리더 미사용자를 위한 스크립트 - 지운아빠 2013-04-22 + * alt 값만 갖는 그래픽 링크에 마우스오버 시 title 값 부여, 마우스아웃 시 title 값 제거 + **/ +$(function() { + $('a img').mouseover(function() { + $a_img_title = $(this).attr('alt'); + $(this).attr('title', $a_img_title); + }).mouseout(function() { + $(this).attr('title', ''); + }); +}); + +/** + * 텍스트 리사이즈 +**/ +function font_resize(id, rmv_class, add_class) +{ + var $el = $("#"+id); + + $el.removeClass(rmv_class).addClass(add_class); + + set_cookie("ck_font_resize_rmv_class", rmv_class, 1, g5_cookie_domain); + set_cookie("ck_font_resize_add_class", add_class, 1, g5_cookie_domain); +} + +$(function(){ + $(".win_point").click(function() { + win_point(this.href); + return false; + }); + + $(".win_memo").click(function() { + win_memo(this.href); + return false; + }); + + $(".win_email").click(function() { + win_email(this.ref); + return false; + }); + + $(".win_scrap").click(function() { + win_scrap(this.href); + return false; + }); + + $(".win_profile").click(function() { + win_profile(this.ref); + return false; + }); + + $(".win_homepage").click(function() { + win_homepage(this.ref); + return false; + }); + + $(".win_zip_find").click(function() { + win_zip(this.href); + return false; + }); + + $(".win_password_lost").click(function() { + win_password_lost(this.href); + return false; + }); + + $(".win_sms5").click(function() { + win_sms5(this.href); + return false; + }); + + /* + $(".win_poll").click(function() { + win_poll(this.href); + return false; + }); + */ + + // 사이드뷰 + var sv_hide = false; + $(".sv_member, .sv_guest").click(function() { + $(".sv").removeClass("sv_on"); + $(this).closest(".sv_wrap").find(".sv").addClass("sv_on"); + }); + + $(".sv, .sv_wrap").hover( + function() { + sv_hide = false; + }, + function() { + sv_hide = true; + } + ); + + $(".sv_member, .sv_guest").focusin(function() { + sv_hide = false; + $(".sv").removeClass("sv_on"); + $(this).closest(".sv_wrap").find(".sv").addClass("sv_on"); + }); + + $(".sv a").focusin(function() { + sv_hide = false; + }); + + $(".sv a").focusout(function() { + sv_hide = true; + }); + + // 셀렉트 ul + var sel_hide = false; + $('.sel_btn').click(function() { + $('.sel_ul').removeClass('sel_on'); + $(this).siblings('.sel_ul').addClass('sel_on'); + }); + + $(".sel_wrap").hover( + function() { + sel_hide = false; + }, + function() { + sel_hide = true; + } + ); + + $('.sel_a').focusin(function() { + sel_hide = false; + }); + + $('.sel_a').focusout(function() { + sel_hide = true; + }); + + $(document).click(function() { + if(sv_hide) { // 사이드뷰 해제 + $(".sv").removeClass("sv_on"); + } + if (sel_hide) { // 셀렉트 ul 해제 + $('.sel_ul').removeClass('sel_on'); + } + }); + + $(document).focusin(function() { + if(sv_hide) { // 사이드뷰 해제 + $(".sv").removeClass("sv_on"); + } + if (sel_hide) { // 셀렉트 ul 해제 + $('.sel_ul').removeClass('sel_on'); + } + }); + + $("textarea#wr_content[maxlength]").live("keyup change", function() { + var str = $(this).val() + var mx = parseInt($(this).attr("maxlength")) + if (str.length > mx) { + $(this).val(str.substr(0, mx)); + return false; + } + }); +}); \ No newline at end of file diff --git a/js/html5.js b/js/html5.js new file mode 100644 index 000000000..b8d4bc75a --- /dev/null +++ b/js/html5.js @@ -0,0 +1,3 @@ +/*! HTML5 Shiv vpre3.6 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed + Uncompressed source: https://github.com/aFarkas/html5shiv */ +(function(a,b){function h(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function i(){var a=l.elements;return typeof a=="string"?a.split(" "):a}function j(a){var b={},c=a.createElement,f=a.createDocumentFragment,g=f();a.createElement=function(a){if(!l.shivMethods)return c(a);var f;return b[a]?f=b[a].cloneNode():e.test(a)?f=(b[a]=c(a)).cloneNode():f=c(a),f.canHaveChildren&&!d.test(a)?g.appendChild(f):f},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+i().join().replace(/\w+/g,function(a){return c(a),g.createElement(a),'c("'+a+'")'})+");return n}")(l,g)}function k(a){var b;return a.documentShived?a:(l.shivCSS&&!f&&(b=!!h(a,"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}")),g||(b=!j(a)),b&&(a.documentShived=b),a)}var c=a.html5||{},d=/^<|^(?:button|form|map|select|textarea|object|iframe|option|optgroup)$/i,e=/^<|^(?:a|b|button|code|div|fieldset|form|h1|h2|h3|h4|h5|h6|i|iframe|img|input|label|li|link|ol|option|p|param|q|script|select|span|strong|style|table|tbody|td|textarea|tfoot|th|thead|tr|ul)$/i,f,g;(function(){var c=b.createElement("a");c.innerHTML="",f="hidden"in c,f&&typeof injectElementWithStyles=="function"&&injectElementWithStyles("#modernizr{}",function(b){b.hidden=!0,f=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle).display=="none"}),g=c.childNodes.length==1||function(){try{b.createElement("a")}catch(a){return!0}var c=b.createDocumentFragment();return typeof c.cloneNode=="undefined"||typeof c.createDocumentFragment=="undefined"||typeof c.createElement=="undefined"}()})();var l={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:k};a.html5=l,k(b)})(this,document) \ No newline at end of file diff --git a/js/jquery-1.8.3.min.js b/js/jquery-1.8.3.min.js new file mode 100644 index 000000000..83589daa7 --- /dev/null +++ b/js/jquery-1.8.3.min.js @@ -0,0 +1,2 @@ +/*! jQuery v1.8.3 jquery.com | jquery.org/license */ +(function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write(""),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t
    a",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="
    t
    ",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="
    ",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;ti.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="
    ",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="

    ",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t0)for(i=r;i=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*\s*$/g,Nt={option:[1,""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X
    ","
    "]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1>");try{for(;r1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]===""&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("
    ").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window); \ No newline at end of file diff --git a/js/jquery.fancylist.js b/js/jquery.fancylist.js new file mode 100644 index 000000000..242a39733 --- /dev/null +++ b/js/jquery.fancylist.js @@ -0,0 +1,65 @@ +(function($) { + $.fn.fancyList = function(element, clear) + { + var cfg = { + element: "li", + clear: "clear" + }; + + if(typeof element == "object") + cfg = $.extend( cfg, element ); + else { + if(element) + cfg = $.extend( cfg, { element: element } ); + if(clear) + cfg = $.extend( cfg, { clear: clear } ); + } + + var $element = this.find(cfg.element); + var $this = this; + + if($element.size() < 1) + return; + + function item_arrange() + { + var $el = $element.filter(":first"); + var padding = 0; + if($el.data("padding-right") == undefined) { + padding = parseInt($el.css("padding-right")); + $el.data("padding-right", padding); + } + else + padding = $el.data("padding-right"); + + $element.css("padding-left", 0).css("padding-right", padding); + $element.filter("."+cfg.clear).removeClass(cfg.clear); + + var wrap_width = parseInt($this.width()); + var item_width = parseInt($el.outerWidth()); + var line_count = parseInt((wrap_width + padding) / item_width); + + if(line_count == 0) + return; + + var space = parseInt(wrap_width % item_width); + + if((space + padding) < item_width) { + space = wrap_width - ((item_width - padding) * line_count); + var new_padding = parseInt(space / (line_count * 2)); + + if(new_padding > padding) + $element.css("padding-left", new_padding+"px").css("padding-right", new_padding); + } + + $element.filter(":nth-child("+line_count+"n)").css("padding-right", 0); + $element.filter(":nth-child("+line_count+"n+1)").addClass(cfg.clear); + } + + item_arrange(); + + $(window).resize(function() { + item_arrange(); + }); + } +}(jQuery)); \ No newline at end of file diff --git a/js/jquery.menu.js b/js/jquery.menu.js new file mode 100644 index 000000000..a05b03de6 --- /dev/null +++ b/js/jquery.menu.js @@ -0,0 +1,109 @@ +$(function(){ + var hide_menu = false; + var mouse_event = false; + var oldX = oldY = 0; + + $(document).mousemove(function(e) { + if(oldX == 0) { + oldX = e.pageX; + oldY = e.pageY; + } + + if(oldX != e.pageX || oldY != e.pageY) { + mouse_event = true; + } + }); + + // 주메뉴 + var $gnb = $(".gnb_1dli > a"); + $gnb.mouseover(function() { + if(mouse_event) { + $("#hd").addClass("hd_zindex"); + $(".gnb_1dli").removeClass("gnb_1dli_over gnb_1dli_over2 gnb_1dli_on"); + $(this).parent().addClass("gnb_1dli_over gnb_1dli_on"); + menu_rearrange($(this).parent()); + hide_menu = false; + } + }); + + $gnb.mouseout(function() { + hide_menu = true; + }); + + $(".gnb_2dli").mouseover(function() { + hide_menu = false; + }); + + $(".gnb_2dli").mouseout(function() { + hide_menu = true; + }); + + $gnb.focusin(function() { + $("#hd").addClass("hd_zindex"); + $(".gnb_1dli").removeClass("gnb_1dli_over gnb_1dli_over2 gnb_1dli_on"); + $(this).parent().addClass("gnb_1dli_over gnb_1dli_on"); + menu_rearrange($(this).parent()); + hide_menu = false; + }); + + $gnb.focusout(function() { + hide_menu = true; + }); + + $(".gnb_2da").focusin(function() { + $(".gnb_1dli").removeClass("gnb_1dli_over gnb_1dli_over2 gnb_1dli_on"); + var $gnb_li = $(this).closest(".gnb_1dli").addClass("gnb_1dli_over gnb_1dli_on"); + menu_rearrange($(this).closest(".gnb_1dli")); + hide_menu = false; + }); + + $(".gnb_2da").focusout(function() { + hide_menu = true; + }); + + $('#gnb_1dul>li').bind('mouseleave',function(){ + submenu_hide(); + }); + + $(document).bind('click focusin',function(){ + if(hide_menu) { + submenu_hide(); + } + }); +}); + +function submenu_hide() { + $("#hd").removeClass("hd_zindex"); + $(".gnb_1dli").removeClass("gnb_1dli_over gnb_1dli_over2 gnb_1dli_on"); +} + +function menu_rearrange(el) +{ + var width = $("#gnb_1dul").width(); + var left = w1 = w2 = 0; + var idx = $(".gnb_1dli").index(el); + var max_menu_count = 0; + var $gnb_1dli; + + for(i=0; i<=idx; i++) { + $gnb_1dli = $(".gnb_1dli:eq("+i+")"); + w1 = $gnb_1dli.outerWidth(); + + if($gnb_1dli.find(".gnb_2dul").size()) + w2 = $gnb_1dli.find(".gnb_2dli > a").outerWidth(true); + else + w2 = w1; + + if((left + w2) > width) { + if(max_menu_count == 0) + max_menu_count = i + 1; + } + + if(max_menu_count > 0 && (idx + 1) % max_menu_count == 0) { + el.removeClass("gnb_1dli_over").addClass("gnb_1dli_over2"); + left = 0; + } else { + left += w1; + } + } +} \ No newline at end of file diff --git a/js/jquery.register_form.js b/js/jquery.register_form.js new file mode 100644 index 000000000..4417eb3fb --- /dev/null +++ b/js/jquery.register_form.js @@ -0,0 +1,92 @@ +var reg_mb_id_check = function() { + var result = ""; + $.ajax({ + type: "POST", + url: g5_bbs_url+"/ajax.mb_id.php", + data: { + "reg_mb_id": encodeURIComponent($("#reg_mb_id").val()) + }, + cache: false, + async: false, + success: function(data) { + result = data; + } + }); + return result; +} + + +// 추천인 검사 +var reg_mb_recommend_check = function() { + var result = ""; + $.ajax({ + type: "POST", + url: g5_bbs_url+"/ajax.mb_recommend.php", + data: { + "reg_mb_recommend": encodeURIComponent($("#reg_mb_recommend").val()) + }, + cache: false, + async: false, + success: function(data) { + result = data; + } + }); + return result; +} + + +var reg_mb_nick_check = function() { + var result = ""; + $.ajax({ + type: "POST", + url: g5_bbs_url+"/ajax.mb_nick.php", + data: { + "reg_mb_nick": ($("#reg_mb_nick").val()), + "reg_mb_id": encodeURIComponent($("#reg_mb_id").val()) + }, + cache: false, + async: false, + success: function(data) { + result = data; + } + }); + return result; +} + + +var reg_mb_email_check = function() { + var result = ""; + $.ajax({ + type: "POST", + url: g5_bbs_url+"/ajax.mb_email.php", + data: { + "reg_mb_email": $("#reg_mb_email").val(), + "reg_mb_id": encodeURIComponent($("#reg_mb_id").val()) + }, + cache: false, + async: false, + success: function(data) { + result = data; + } + }); + return result; +} + + +var reg_mb_hp_check = function() { + var result = ""; + $.ajax({ + type: "POST", + url: g5_bbs_url+"/ajax.mb_hp.php", + data: { + "reg_mb_hp": $("#reg_mb_hp").val(), + "reg_mb_id": encodeURIComponent($("#reg_mb_id").val()) + }, + cache: false, + async: false, + success: function(data) { + result = data; + } + }); + return result; +} \ No newline at end of file diff --git a/js/jquery.sms_paging.js b/js/jquery.sms_paging.js new file mode 100644 index 000000000..a35f3b623 --- /dev/null +++ b/js/jquery.sms_paging.js @@ -0,0 +1,93 @@ +/************************************************************************************** + * jQuery Paging 0.1.7 + * by composite (ukjinplant@msn.com) + * http://composite.tistory.com + * This project licensed under a MIT License. + **************************************************************************************/; +(function($){ + //default properties. + var a=/a/i,defs={ + liitem:'li', item:'a',next:'[>{5}]',prev:'[{4}<]',format:'[{0}]', + itemClass:'',appendhtml:'',sideClass:'paging-side',prevClass:'paging-side', + itemCurrent:'active',length:10,max:1,current:1,append:false + ,href:'#{0}',event:true,first:'[1<<]',last:'[>>{6}]' + },InStr=function(strSearch, charSearchFor) { + return strSearch.indexOf(charSearchFor); + },format=function(str){ + var arg=arguments; + return str.replace(/\{(\d+)\}/g,function(m,d){ + if(+d<0) return m; + else return arg[+d+1]||""; + }); + },item,make=function(op,page,cls,str){ + var is_current = false; + if( InStr( cls , op.itemCurrent) > -1 ){ + item=document.createElement("strong"); + is_current = true; + } else { + item=document.createElement(op.item); + } + item.className=cls; + item.innerHTML=format(str,page,op.length,op.start,op.end,op.start-1,op.end+1,op.max); + if(a.test(op.item)) item.href=format(op.href,page); + if(op.event){ + $(item).bind('click',function(e){ + var fired=true; + if($.isFunction(op.onclick)) fired=op.onclick.call(item,e,page,op); + if(fired==undefined||fired) + op.origin.paging($.extend({},op,{current:page})); + return fired; + }); + /* + $liitem= $(document.createElement(op.liitem)); + $liitem.addClass(cls); + $liitem.append($(item)); + */ + if(op.appendhtml){ + $(item).append(op.appendhtml); + } + $(item).appendTo(op.origin); + if( is_current ){ + $(item).prepend('열린'); + } else { + (op.origin).append('\n'); + } + //bind event for each elements. + var ev='on'; + switch(str){ + case op.prev:ev+='prev';break; + case op.next:ev+='next';break; + case op.first:ev+='first';break; + case op.last:ev+='last';break; + default:ev+='item';break; + } + if($.isFunction(op[ev])) op[ev].call(item,page,op); + } + return item; + }; + + $.fn.paging=function(op){ + op=$.extend({origin:this},defs,op||{});this.html(''); + if(op.max<1) op.max=1; if(op.current<1) op.current=1; + op.start=Math.floor((op.current-1)/op.length)*op.length+1; + op.end=op.start-1+op.length; + if(op.end>op.max) op.end=op.max; + if(!op.append) this.empty(); + //prev button + if(op.current>op.length){ + //if(op.first!==false) make(op,1,op.sideClass,op.first); + make(op,op.start-1,op.prevClass,op.prev); + } + //pages button + for(var i=op.start;i<=op.end;i++){ + make(op,i,op.itemClass+(i==op.current?' '+op.itemCurrent:''),op.format); + } + //next button + if(op.current<=Math.floor(op.max/op.length)*op.length){ + if(op.max > op.length && op.max > op.end ){ make(op,op.end+1,op.sideClass,op.next); } + //if(op.last!==false) make(op,op.max,op.sideClass,op.last); + } + + //last button + }; +})(jQuery); \ No newline at end of file diff --git a/js/md5.js b/js/md5.js new file mode 100644 index 000000000..87477cdbc --- /dev/null +++ b/js/md5.js @@ -0,0 +1,165 @@ +if (typeof(MD5_JS) == 'undefined') // 한번만 실행 +{ + var MD5_JS = true; + + /* See http://pajhome.org.uk/crypt/md5 for more info */ + var hexcase = 0; + var b64pad = ""; + var chrsz = 8; + + function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} + function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));} + function str_md5(s){ return binl2str(core_md5(str2binl(s), s.length * chrsz));} + function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); } + function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); } + function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); } + + function core_md5(x, len) + { + x[len >> 5] |= 0x80 << ((len) % 32); x[(((len + 64) >>> 9) << 4) + 14] = len; + var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; + for(var i = 0; i < x.length; i += 16) + { + var olda = a; var oldb = b; var oldc = c; var oldd = d; + a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); + d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); + c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); + b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); + a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); + d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); + c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); + b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); + a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); + d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); + c = md5_ff(c, d, a, b, x[i+10], 17, -42063); + b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); + a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); + d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); + c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); + b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); + + a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); + d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); + c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); + b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); + a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); + d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); + c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); + b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); + a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); + d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); + c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); + b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); + a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); + d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); + c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); + b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); + + a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); + d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); + c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); + b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); + a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); + d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); + c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); + b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); + a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); + d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); + c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); + b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); + a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); + d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); + c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); + b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); + + a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); + d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); + c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); + b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); + a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); + d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); + c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); + b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); + a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); + d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); + c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); + b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); + a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); + d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); + c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); + b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); + + a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); + } + return Array(a, b, c, d); + } + + function md5_cmn(q, a, b, x, s, t) { return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); } + function md5_ff(a, b, c, d, x, s, t) { return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); } + function md5_gg(a, b, c, d, x, s, t) { return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); } + function md5_hh(a, b, c, d, x, s, t) { return md5_cmn(b ^ c ^ d, a, b, x, s, t); } + function md5_ii(a, b, c, d, x, s, t) { return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); } + + function core_hmac_md5(key, data) { + var bkey = str2binl(key); + if(bkey.length > 16) + bkey = core_md5(bkey, key.length * chrsz); + + var ipad = Array(16), opad = Array(16); + for(var i = 0; i < 16; i++) + { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); + return core_md5(opad.concat(hash), 512 + 128); + } + + function safe_add(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); } + function bit_rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); } + + function str2binl(str) + { + var bin = Array(); var mask = (1 << chrsz) - 1; + for(var i = 0; i < str.length * chrsz; i += chrsz) + bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32); + return bin; + } + + function binl2str(bin) + { + var str = ""; var mask = (1 << chrsz) - 1; + for(var i = 0; i < bin.length * 32; i += chrsz) + str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask); return str; + } + + + function binl2hex(binarray) + { + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var str = ""; + for(var i = 0; i < binarray.length * 4; i++) + str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF); + return str; + } + + function binl2b64(binarray) + { + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var str = ""; + for(var i = 0; i < binarray.length * 4; i += 3) + { + var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16) + | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 ) + | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF); + for(var j = 0; j < 4; j++) + { + if(i * 8 + j * 6 > binarray.length * 32) + str += b64pad; + else + str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); + } + } + return str; + } +} \ No newline at end of file diff --git a/js/modernizr.custom.70111.js b/js/modernizr.custom.70111.js new file mode 100644 index 000000000..1a81489fb --- /dev/null +++ b/js/modernizr.custom.70111.js @@ -0,0 +1,4 @@ +/* Modernizr 2.6.2 (Custom Build) | MIT & BSD + * Build: http://modernizr.com/download/#-cssclasses-testallprops-css_overflow_scrolling + */ +;window.Modernizr=function(a,b,c){function x(a){j.cssText=a}function y(a,b){return x(prefixes.join(a+";")+(b||""))}function z(a,b){return typeof a===b}function A(a,b){return!!~(""+a).indexOf(b)}function B(a,b){for(var d in a){var e=a[d];if(!A(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function C(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:z(f,"function")?f.bind(d||b):f}return!1}function D(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+n.join(d+" ")+d).split(" ");return z(b,"string")||z(b,"undefined")?B(e,b):(e=(a+" "+o.join(d+" ")+d).split(" "),C(e,b,c))}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m="Webkit Moz O ms",n=m.split(" "),o=m.toLowerCase().split(" "),p={},q={},r={},s=[],t=s.slice,u,v={}.hasOwnProperty,w;!z(v,"undefined")&&!z(v.call,"undefined")?w=function(a,b){return v.call(a,b)}:w=function(a,b){return b in a&&z(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=t.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(t.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(t.call(arguments)))};return e});for(var E in p)w(p,E)&&(u=E.toLowerCase(),e[u]=p[E](),s.push((e[u]?"":"no-")+u));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)w(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},x(""),i=k=null,e._version=d,e._domPrefixes=o,e._cssomPrefixes=n,e.testProp=function(a){return B([a])},e.testAllProps=D,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+s.join(" "):""),e}(this,this.document),Modernizr.addTest("overflowscrolling",function(){return Modernizr.testAllProps("overflowScrolling")}); \ No newline at end of file diff --git a/js/viewimageresize.js b/js/viewimageresize.js new file mode 100644 index 000000000..7b9a1eaf7 --- /dev/null +++ b/js/viewimageresize.js @@ -0,0 +1,93 @@ +(function($) { + $.fn.viewimageresize = function(selector) + { + var cfg = { + selector: "img" + }; + + if(typeof selector == "object") { + cfg = $.extend(cfg, selector); + } else { + if(selector) { + cfg = $.extend({ selector: selector }); + } + } + + var $img = this.find(cfg.selector); + var $this = this; + + function image_resize() + { + var width = $this.width(); + + $img.each(function() { + if($(this).data("width") == undefined) + $(this).data("width", $(this).width()); + + if($(this).data("width") > width) { + $(this).removeAttr("width") + .removeAttr("height") + .css("width","") + .css("height", ""); + + if($(this).data("width") > width) { + $(this).css("width", "100%"); + } + } else { + $(this).attr("width", $(this).data("width")); + } + }); + } + + $(window).on("load", function() { + image_resize(); + }); + + $(window).on("resize", function() { + image_resize(); + }); + } + + $.fn.viewimageresize2 = function(selector) + { + var cfg = { + selector: "img" + }; + + if(typeof selector == "object") { + cfg = $.extend(cfg, selector); + } else { + if(selector) { + cfg = $.extend({ selector: selector }); + } + } + + var $img = this.find(cfg.selector); + var $this = this; + + function image_resize() + { + var width = $this.width(); + + $img.each(function() { + $(this).removeAttr("width") + .removeAttr("height") + .css("width","") + .css("height", ""); + + if($(this).data("width") == undefined) + $(this).data("width", $(this).width()); + + if($(this).data("width") > width) { + $(this).css("width", "100%"); + } + }); + } + + $(window).on("resize", function() { + image_resize(); + }); + + image_resize(); + } +}(jQuery)); \ No newline at end of file diff --git a/js/wrest.js b/js/wrest.js new file mode 100644 index 000000000..5d164aab0 --- /dev/null +++ b/js/wrest.js @@ -0,0 +1,370 @@ +var wrestMsg = ""; +var wrestFld = null; +var wrestFldDefaultColor = ""; +//var wrestFldBackColor = "#ff3061"; + +// subject 속성값을 얻어 return, 없으면 tag의 name을 넘김 +function wrestItemname(fld) +{ + //return fld.getAttribute("title") ? fld.getAttribute("title") : ( fld.getAttribute("alt") ? fld.getAttribute("alt") : fld.name ); + var id = fld.getAttribute("id"); + var labels = document.getElementsByTagName("label"); + var el = null; + + for(i=0; i].*[<]\/+.*[>]/gi, ""); + + if(text == '') { + return fld.getAttribute("title") ? fld.getAttribute("title") : ( fld.getAttribute("placeholder") ? fld.getAttribute("placeholder") : fld.name ); + } else { + return text; + } + } else { + return fld.getAttribute("title") ? fld.getAttribute("title") : ( fld.getAttribute("placeholder") ? fld.getAttribute("placeholder") : fld.name ); + } +} + +// 양쪽 공백 없애기 +function wrestTrim(fld) +{ + var pattern = /(^\s+)|(\s+$)/g; // \s 공백 문자 + return fld.value.replace(pattern, ""); +} + +// 필수 입력 검사 +function wrestRequired(fld) +{ + if (wrestTrim(fld) == "") { + if (wrestFld == null) { + // 셀렉트박스일 경우에도 필수 선택 검사합니다. + wrestMsg = wrestItemname(fld) + " : 필수 "+(fld.type=="select-one"?"선택":"입력")+"입니다.\n"; + wrestFld = fld; + } + } +} + +// 김선용 2006.3 - 전화번호(휴대폰) 형식 검사 : 123-123(4)-5678 +function wrestTelNum(fld) +{ + if (!wrestTrim(fld)) return; + + var pattern = /^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}$/; + if(!pattern.test(fld.value)){ + if(wrestFld == null){ + wrestMsg = wrestItemname(fld)+" : 전화번호 형식이 올바르지 않습니다.\n\n하이픈(-)을 포함하여 입력하세요.\n"; + wrestFld = fld; + fld.select(); + } + } +} + +// 이메일주소 형식 검사 +function wrestEmail(fld) +{ + if (!wrestTrim(fld)) return; + + //var pattern = /(\S+)@(\S+)\.(\S+)/; 이메일주소에 한글 사용시 + var pattern = /([0-9a-zA-Z_-]+)@([0-9a-zA-Z_-]+)\.([0-9a-zA-Z_-]+)/; + if (!pattern.test(fld.value)) { + if (wrestFld == null) { + wrestMsg = wrestItemname(fld) + " : 이메일주소 형식이 아닙니다.\n"; + wrestFld = fld; + } + } +} + +// 한글인지 검사 (자음, 모음 조합된 한글만 가능) +function wrestHangul(fld) +{ + if (!wrestTrim(fld)) return; + + //var pattern = /([^가-힣\x20])/i; + var pattern = /([^가-힣\x20])/; + + if (pattern.test(fld.value)) { + if (wrestFld == null) { + wrestMsg = wrestItemname(fld) + ' : 한글이 아닙니다. (자음, 모음 조합된 한글만 가능)\n'; + wrestFld = fld; + } + } +} + +// 한글인지 검사2 (자음, 모음만 있는 한글도 가능) +function wrestHangul2(fld) +{ + if (!wrestTrim(fld)) return; + + var pattern = /([^가-힣ㄱ-ㅎㅏ-ㅣ\x20])/i; + //var pattern = /([^가-힣ㄱ-ㅎㅏ-ㅣ\x20])/; + + if (pattern.test(fld.value)) { + if (wrestFld == null) { + wrestMsg = wrestItemname(fld) + ' : 한글이 아닙니다.\n'; + wrestFld = fld; + } + } +} + +// 한글,영문,숫자인지 검사3 +function wrestHangulAlNum(fld) +{ + if (!wrestTrim(fld)) return; + + var pattern = /([^가-힣\x20^a-z^A-Z^0-9])/i; + + if (pattern.test(fld.value)) { + if (wrestFld == null) { + wrestMsg = wrestItemname(fld) + ' : 한글, 영문, 숫자가 아닙니다.\n'; + wrestFld = fld; + } + } +} + +// 한글,영문 인지 검사 +function wrestHangulAlpha(fld) +{ + if (!wrestTrim(fld)) return; + + var pattern = /([^가-힣\x20^a-z^A-Z])/i; + + if (pattern.test(fld.value)) { + if (wrestFld == null) { + wrestMsg = wrestItemname(fld) + ' : 한글, 영문이 아닙니다.\n'; + wrestFld = fld; + } + } +} + +// 숫자인지검사 +// 배부른꿀꿀이님 추가 (http://dasir.com) 2003-06-24 +function wrestNumeric(fld) +{ + if (fld.value.length > 0) { + for (i = 0; i < fld.value.length; i++) { + if (fld.value.charAt(i) < '0' || fld.value.charAt(i) > '9') { + wrestMsg = wrestItemname(fld) + " : 숫자가 아닙니다.\n"; + wrestFld = fld; + } + } + } +} + +// 영문자 검사 +// 배부른꿀꿀이님 추가 (http://dasir.com) 2003-06-24 +function wrestAlpha(fld) +{ + if (!wrestTrim(fld)) return; + + var pattern = /(^[a-zA-Z]+$)/; + + if (!pattern.test(fld.value)) { + if (wrestFld == null) { + wrestMsg = wrestItemname(fld) + " : 영문이 아닙니다.\n"; + wrestFld = fld; + } + } +} + +// 영문자와 숫자 검사 +// 배부른꿀꿀이님 추가 (http://dasir.com) 2003-07-07 +function wrestAlNum(fld) +{ + if (!wrestTrim(fld)) return; + + var pattern = /(^[a-zA-Z0-9]+$)/; + + if (!pattern.test(fld.value)) { + if (wrestFld == null) { + wrestMsg = wrestItemname(fld) + " : 영문 또는 숫자가 아닙니다.\n"; + wrestFld = fld; + } + } +} + +// 영문자와 숫자 그리고 _ 검사 +function wrestAlNum_(fld) +{ + if (!wrestTrim(fld)) return; + + var pattern = /(^[a-zA-Z0-9\_]+$)/; + + if (!pattern.test(fld.value)) { + if (wrestFld == null) { + wrestMsg = wrestItemname(fld) + " : 영문, 숫자, _ 가 아닙니다.\n"; + wrestFld = fld; + } + } +} + +// 최소 길이 검사 +function wrestMinLength(fld, css) +{ + if (!wrestTrim(fld)) return; + + var str = css.split('_'); // minlength_?? <-- str[1] + + if (wrestFld == null) { + if (fld.value.length < parseInt(str[1])) { + wrestMsg = wrestItemname(fld) + " : 최소 "+str[1]+"글자 이상 입력하세요.\n"; + wrestFld = fld; + } + } +} + +// 이미지 확장자 +function wrestImgExt(fld) +{ + if (!wrestTrim(fld)) return; + + var pattern = /\.(gif|jpg|png)$/i; // jpeg 는 제외 + if(!pattern.test(fld.value)){ + if(wrestFld == null){ + wrestMsg = wrestItemname(fld)+" : 이미지 파일이 아닙니다.\n.gif .jpg .png 파일만 가능합니다.\n"; + wrestFld = fld; + fld.select(); + } + } +} + +// 확장자 +function wrestExtension(fld, css) +{ + if (!wrestTrim(fld)) return; + + var str = css.split("="); // ext=?? <-- str[1] + var src = fld.value.split("."); + var ext = src[src.length - 1]; + + if (wrestFld == null) { + if (ext.toLowerCase() < str[1].toLowerCase()) { + wrestMsg = wrestItemname(fld) + " : ."+str[1]+" 파일만 가능합니다.\n"; + wrestFld = fld; + } + } +} + +// 공백 검사후 공백을 "" 로 변환 +function wrestNospace(fld) +{ + var pattern = /(\s)/g; // \s 공백 문자 + + if (pattern.test(fld.value)) { + if (wrestFld == null) { + wrestMsg = wrestItemname(fld) + " : 공백이 없어야 합니다.\n"; + wrestFld = fld; + } + } +} + +// submit 할 때 속성을 검사한다. +function wrestSubmit() +{ + wrestMsg = ""; + wrestFld = null; + + var attr = null; + + // 해당폼에 대한 요소의 개수만큼 돌려라 + for (var i=0; i').val(sido[i][0]).text(sido[i][1])); + } +}); + +function gugun_make(sido) +{ + var gugun = document.getElementById("gugun"); + + gugun.options.length = 1; + gugun.options[0].value = ""; + gugun.options[0].text = "- 시군구 선택 -"; + gugun.options[0].selected = true; + if (!sido) { + return; + } + + sojae = sigungu[sido].split(","); + gugun.options.length = sojae.length+1; + for (i=0; i}S) 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 RYJrxOC-M)}zZ*;b{{W355;Xt- literal 0 HcmV?d00001 diff --git a/lib/Excel/oleread.inc b/lib/Excel/oleread.inc new file mode 100644 index 000000000..c7241aa86 --- /dev/null +++ b/lib/Excel/oleread.inc @@ -0,0 +1,271 @@ +=4294967294) + { + $value=-2; + } + return $value; +} + + +class OLERead { + var $data = ''; + + + function OLERead(){ + + + } + + function read($sFileName){ + + // check if file exist and is readable (Darko Miljanovic) + if(!is_readable($sFileName)) { + $this->error = 1; + return false; + } + + $this->data = @file_get_contents($sFileName); + if (!$this->data) { + $this->error = 1; + return false; + } + //echo IDENTIFIER_OLE; + //echo 'start'; + if (substr($this->data, 0, 8) != IDENTIFIER_OLE) { + $this->error = 1; + return false; + } + $this->numBigBlockDepotBlocks = GetInt4d($this->data, NUM_BIG_BLOCK_DEPOT_BLOCKS_POS); + $this->sbdStartBlock = GetInt4d($this->data, SMALL_BLOCK_DEPOT_BLOCK_POS); + $this->rootStartBlock = GetInt4d($this->data, ROOT_START_BLOCK_POS); + $this->extensionBlock = GetInt4d($this->data, EXTENSION_BLOCK_POS); + $this->numExtensionBlocks = GetInt4d($this->data, NUM_EXTENSION_BLOCK_POS); + + /* + echo $this->numBigBlockDepotBlocks." "; + echo $this->sbdStartBlock." "; + echo $this->rootStartBlock." "; + echo $this->extensionBlock." "; + echo $this->numExtensionBlocks." "; + */ + //echo "sbdStartBlock = $this->sbdStartBlock\n"; + $bigBlockDepotBlocks = array(); + $pos = BIG_BLOCK_DEPOT_BLOCKS_POS; + // echo "pos = $pos"; + $bbdBlocks = $this->numBigBlockDepotBlocks; + + if ($this->numExtensionBlocks != 0) { + $bbdBlocks = (BIG_BLOCK_SIZE - BIG_BLOCK_DEPOT_BLOCKS_POS)/4; + } + + for ($i = 0; $i < $bbdBlocks; $i++) { + $bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos); + $pos += 4; + } + + + for ($j = 0; $j < $this->numExtensionBlocks; $j++) { + $pos = ($this->extensionBlock + 1) * BIG_BLOCK_SIZE; + $blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, BIG_BLOCK_SIZE / 4 - 1); + + for ($i = $bbdBlocks; $i < $bbdBlocks + $blocksToRead; $i++) { + $bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos); + $pos += 4; + } + + $bbdBlocks += $blocksToRead; + if ($bbdBlocks < $this->numBigBlockDepotBlocks) { + $this->extensionBlock = GetInt4d($this->data, $pos); + } + } + + // var_dump($bigBlockDepotBlocks); + + // readBigBlockDepot + $pos = 0; + $index = 0; + $this->bigBlockChain = array(); + + for ($i = 0; $i < $this->numBigBlockDepotBlocks; $i++) { + $pos = ($bigBlockDepotBlocks[$i] + 1) * BIG_BLOCK_SIZE; + //echo "pos = $pos"; + for ($j = 0 ; $j < BIG_BLOCK_SIZE / 4; $j++) { + $this->bigBlockChain[$index] = GetInt4d($this->data, $pos); + $pos += 4 ; + $index++; + } + } + + //var_dump($this->bigBlockChain); + //echo '=====2'; + // readSmallBlockDepot(); + $pos = 0; + $index = 0; + $sbdBlock = $this->sbdStartBlock; + $this->smallBlockChain = array(); + + while ($sbdBlock != -2) { + + $pos = ($sbdBlock + 1) * BIG_BLOCK_SIZE; + + for ($j = 0; $j < BIG_BLOCK_SIZE / 4; $j++) { + $this->smallBlockChain[$index] = GetInt4d($this->data, $pos); + $pos += 4; + $index++; + } + + $sbdBlock = $this->bigBlockChain[$sbdBlock]; + } + + + // readData(rootStartBlock) + $block = $this->rootStartBlock; + $pos = 0; + $this->entry = $this->__readData($block); + + /* + while ($block != -2) { + $pos = ($block + 1) * BIG_BLOCK_SIZE; + $this->entry = $this->entry.substr($this->data, $pos, BIG_BLOCK_SIZE); + $block = $this->bigBlockChain[$block]; + } + */ + //echo '==='.$this->entry."==="; + $this->__readPropertySets(); + + } + + function __readData($bl) { + $block = $bl; + $pos = 0; + $data = ''; + + while ($block != -2) { + $pos = ($block + 1) * BIG_BLOCK_SIZE; + $data = $data.substr($this->data, $pos, BIG_BLOCK_SIZE); + //echo "pos = $pos data=$data\n"; + $block = $this->bigBlockChain[$block]; + } + return $data; + } + + function __readPropertySets(){ + $offset = 0; + //var_dump($this->entry); + while ($offset < strlen($this->entry)) { + $d = substr($this->entry, $offset, PROPERTY_STORAGE_BLOCK_SIZE); + + $nameSize = ord($d[SIZE_OF_NAME_POS]) | (ord($d[SIZE_OF_NAME_POS+1]) << 8); + + $type = ord($d[TYPE_POS]); + //$maxBlock = strlen($d) / BIG_BLOCK_SIZE - 1; + + $startBlock = GetInt4d($d, START_BLOCK_POS); + $size = GetInt4d($d, SIZE_POS); + + $name = ''; + for ($i = 0; $i < $nameSize ; $i++) { + $name .= $d[$i]; + } + + $name = str_replace("\x00", "", $name); + + $this->props[] = array ( + 'name' => $name, + 'type' => $type, + 'startBlock' => $startBlock, + 'size' => $size); + + if (($name == "Workbook") || ($name == "Book")) { + $this->wrkbook = count($this->props) - 1; + } + + if ($name == "Root Entry") { + $this->rootentry = count($this->props) - 1; + } + + //echo "name ==$name=\n"; + + + $offset += PROPERTY_STORAGE_BLOCK_SIZE; + } + + } + + + function getWorkBook(){ + if ($this->props[$this->wrkbook]['size'] < SMALL_BLOCK_THRESHOLD){ +// getSmallBlockStream(PropertyStorage ps) + + $rootdata = $this->__readData($this->props[$this->rootentry]['startBlock']); + + $streamData = ''; + $block = $this->props[$this->wrkbook]['startBlock']; + //$count = 0; + $pos = 0; + while ($block != -2) { + $pos = $block * SMALL_BLOCK_SIZE; + $streamData .= substr($rootdata, $pos, SMALL_BLOCK_SIZE); + + $block = $this->smallBlockChain[$block]; + } + + return $streamData; + + + }else{ + + $numBlocks = $this->props[$this->wrkbook]['size'] / BIG_BLOCK_SIZE; + if ($this->props[$this->wrkbook]['size'] % BIG_BLOCK_SIZE != 0) { + $numBlocks++; + } + + if ($numBlocks == 0) return ''; + + //echo "numBlocks = $numBlocks\n"; + //byte[] streamData = new byte[numBlocks * BIG_BLOCK_SIZE]; + //print_r($this->wrkbook); + $streamData = ''; + $block = $this->props[$this->wrkbook]['startBlock']; + //$count = 0; + $pos = 0; + //echo "block = $block"; + while ($block != -2) { + $pos = ($block + 1) * BIG_BLOCK_SIZE; + $streamData .= substr($this->data, $pos, BIG_BLOCK_SIZE); + $block = $this->bigBlockChain[$block]; + } + //echo 'stream'.$streamData; + return $streamData; + } + } + +} +?> \ No newline at end of file diff --git a/lib/Excel/php_writeexcel/class.writeexcel_biffwriter.inc.php b/lib/Excel/php_writeexcel/class.writeexcel_biffwriter.inc.php new file mode 100644 index 000000000..04f90fbbc --- /dev/null +++ b/lib/Excel/php_writeexcel/class.writeexcel_biffwriter.inc.php @@ -0,0 +1,209 @@ +byte_order = ''; + $this->BIFF_version = 0x0500; + $this->_byte_order = ''; + $this->_data = false; + $this->_datasize = 0; + $this->_limit = 2080; + + $this->_set_byte_order(); + } + + /* + * Determine the byte order and store it as class data to avoid + * recalculating it for each call to new(). + */ + function _set_byte_order() { + $this->byteorder=0; + // Check if "pack" gives the required IEEE 64bit float + $teststr = pack("d", 1.2345); + $number = pack("C8", 0x8D, 0x97, 0x6E, 0x12, 0x83, 0xC0, 0xF3, 0x3F); + + if ($number == $teststr) { + $this->byte_order = 0; // Little Endian + } elseif ($number == strrev($teststr)) { + $this->byte_order = 1; // Big Endian + } else { + // Give up + trigger_error("Required floating point format not supported ". + "on this platform. See the portability section ". + "of the documentation.", E_USER_ERROR); + } + + $this->_byte_order = $this->byte_order; + } + + /* + * General storage function + */ + function _prepend($data) { + + if (func_num_args()>1) { + trigger_error("writeexcel_biffwriter::_prepend() ". + "called with more than one argument", E_USER_ERROR); + } + + if ($this->_debug) { + print "*** writeexcel_biffwriter::_prepend() called:"; + for ($c=0;$c $this->_limit) { + $data = $this->_add_continue($data); + } + + $this->_data = $data . $this->_data; + $this->_datasize += strlen($data); + } + + /* + * General storage function + */ + function _append($data) { + + if (func_num_args()>1) { + trigger_error("writeexcel_biffwriter::_append() ". + "called with more than one argument", E_USER_ERROR); + } + + if ($this->_debug) { + print "*** writeexcel_biffwriter::_append() called:"; + for ($c=0;$c $this->_limit) { + $data = $this->_add_continue($data); + } + + $this->_data = $this->_data . $data; + $this->_datasize += strlen($data); + } + + /* + * Writes Excel BOF record to indicate the beginning of a stream or + * sub-stream in the BIFF file. + * + * $type = 0x0005, Workbook + * $type = 0x0010, Worksheet + */ + function _store_bof($type) { + + $record = 0x0809; // Record identifier + $length = 0x0008; // Number of bytes to follow + + $version = $this->BIFF_version; + + // According to the SDK $build and $year should be set to zero. + // However, this throws a warning in Excel 5. So, use these + // magic numbers. + $build = 0x096C; + $year = 0x07C9; + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $version, $type, $build, $year); + + $this->_prepend($header . $data); + } + + /* + * Writes Excel EOF record to indicate the end of a BIFF stream. + */ + function _store_eof() { + + $record = 0x000A; // Record identifier + $length = 0x0000; // Number of bytes to follow + + $header = pack("vv", $record, $length); + + $this->_append($header); + } + + /* + * Excel limits the size of BIFF records. In Excel 5 the limit is 2084 + * bytes. In Excel 97 the limit is 8228 bytes. Records that are longer + * than these limits must be split up into CONTINUE blocks. + * + * This function take a long BIFF record and inserts CONTINUE records as + * necessary. + */ + function _add_continue($data) { + + $limit = $this->_limit; + $record = 0x003C; // Record identifier + + // The first 2080/8224 bytes remain intact. However, we have to change + // the length field of the record. + $tmp = substr($data, 0, $limit); + $data = substr($data, $limit); + $tmp = substr($tmp, 0, 2) . pack ("v", $limit-4) . substr($tmp, 4); + + // Strip out chunks of 2080/8224 bytes +4 for the header. + while (strlen($data) > $limit) { + $header = pack("vv", $record, $limit); + $tmp .= $header; + $tmp .= substr($data, 0, $limit); + $data = substr($data, $limit); + } + + // Mop up the last of the data + $header = pack("vv", $record, strlen($data)); + $tmp .= $header; + $tmp .= $data; + + return $tmp; + } + +} + +?> diff --git a/lib/Excel/php_writeexcel/class.writeexcel_format.inc.php b/lib/Excel/php_writeexcel/class.writeexcel_format.inc.php new file mode 100644 index 000000000..15435c049 --- /dev/null +++ b/lib/Excel/php_writeexcel/class.writeexcel_format.inc.php @@ -0,0 +1,695 @@ +_xf_index = (sizeof($_)>0) ? array_shift($_) : 0; + + $this->_font_index = 0; + $this->_font = 'Arial'; + $this->_size = 10; + $this->_bold = 0x0190; + $this->_italic = 0; + $this->_color = 0x7FFF; + $this->_underline = 0; + $this->_font_strikeout = 0; + $this->_font_outline = 0; + $this->_font_shadow = 0; + $this->_font_script = 0; + $this->_font_family = 0; + $this->_font_charset = 0; + + $this->_num_format = 0; + + $this->_hidden = 0; + $this->_locked = 1; + + $this->_text_h_align = 0; + $this->_text_wrap = 0; + $this->_text_v_align = 2; + $this->_text_justlast = 0; + $this->_rotation = 0; + + $this->_fg_color = 0x40; + $this->_bg_color = 0x41; + + $this->_pattern = 0; + + $this->_bottom = 0; + $this->_top = 0; + $this->_left = 0; + $this->_right = 0; + + $this->_bottom_color = 0x40; + $this->_top_color = 0x40; + $this->_left_color = 0x40; + $this->_right_color = 0x40; + + // Set properties passed to writeexcel_workbook::addformat() + if (sizeof($_)>0) { + call_user_func_array(array(&$this, 'set_properties'), $_); + } + } + + /* + * Copy the attributes of another writeexcel_format object. + */ + function copy($other) { + $xf = $this->_xf_index; // Backup XF index + foreach ($other as $key->$value) { + $this->{$key} = $value; + } + $this->_xf_index = $xf; // Restore XF index + } + + /* + * Generate an Excel BIFF XF record. + */ + function get_xf() { + + $_=func_get_args(); + + // $record Record identifier + // $length Number of bytes to follow + + // $ifnt Index to FONT record + // $ifmt Index to FORMAT record + // $style Style and other options + // $align Alignment + // $icv fg and bg pattern colors + // $fill Fill and border line style + // $border1 Border line style and color + // $border2 Border color + + // Set the type of the XF record and some of the attributes. + if ($_[0] == "style") { + $style = 0xFFF5; + } else { + $style = $this->_locked; + $style |= $this->_hidden << 1; + } + + // Flags to indicate if attributes have been set. + $atr_num = ($this->_num_format != 0) ? 1 : 0; + $atr_fnt = ($this->_font_index != 0) ? 1 : 0; + $atr_alc = $this->_text_wrap ? 1 : 0; + $atr_bdr = ($this->_bottom || + $this->_top || + $this->_left || + $this->_right) ? 1 : 0; + $atr_pat = ($this->_fg_color != 0x41 || + $this->_bg_color != 0x41 || + $this->_pattern != 0x00) ? 1 : 0; + $atr_prot = 0; + + // Reset the default colors for the non-font properties + if ($this->_fg_color == 0x7FFF) $this->_fg_color = 0x40; + if ($this->_bg_color == 0x7FFF) $this->_bg_color = 0x41; + if ($this->_bottom_color == 0x7FFF) $this->_bottom_color = 0x41; + if ($this->_top_color == 0x7FFF) $this->_top_color = 0x41; + if ($this->_left_color == 0x7FFF) $this->_left_color = 0x41; + if ($this->_right_color == 0x7FFF) $this->_right_color = 0x41; + + // Zero the default border colour if the border has not been set. + if ($this->_bottom == 0) { + $this->_bottom_color = 0; + } + if ($this->_top == 0) { + $this->_top_color = 0; + } + if ($this->_right == 0) { + $this->_right_color = 0; + } + if ($this->_left == 0) { + $this->_left_color = 0; + } + + // The following 2 logical statements take care of special cases in + // relation to cell colors and patterns: + // 1. For a solid fill (_pattern == 1) Excel reverses the role of + // foreground and background colors + // 2. If the user specifies a foreground or background color + // without a pattern they probably wanted a solid fill, so we + // fill in the defaults. + if ($this->_pattern <= 0x01 && + $this->_bg_color != 0x41 && + $this->_fg_color == 0x40 ) + { + $this->_fg_color = $this->_bg_color; + $this->_bg_color = 0x40; + $this->_pattern = 1; + } + + if ($this->_pattern <= 0x01 && + $this->_bg_color == 0x41 && + $this->_fg_color != 0x40 ) + { + $this->_bg_color = 0x40; + $this->_pattern = 1; + } + + $record = 0x00E0; + $length = 0x0010; + + $ifnt = $this->_font_index; + $ifmt = $this->_num_format; + + $align = $this->_text_h_align; + $align |= $this->_text_wrap << 3; + $align |= $this->_text_v_align << 4; + $align |= $this->_text_justlast << 7; + $align |= $this->_rotation << 8; + $align |= $atr_num << 10; + $align |= $atr_fnt << 11; + $align |= $atr_alc << 12; + $align |= $atr_bdr << 13; + $align |= $atr_pat << 14; + $align |= $atr_prot << 15; + + $icv = $this->_fg_color; + $icv |= $this->_bg_color << 7; + + $fill = $this->_pattern; + $fill |= $this->_bottom << 6; + $fill |= $this->_bottom_color << 9; + + $border1 = $this->_top; + $border1 |= $this->_left << 3; + $border1 |= $this->_right << 6; + $border1 |= $this->_top_color << 9; + + $border2 = $this->_left_color; + $border2 |= $this->_right_color << 7; + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvv", $ifnt, $ifmt, $style, $align, + $icv, $fill, + $border1, $border2); + + return($header . $data); + } + + /* + * Generate an Excel BIFF FONT record. + */ + function get_font() { + + // $record Record identifier + // $length Record length + + // $dyHeight Height of font (1/20 of a point) + // $grbit Font attributes + // $icv Index to color palette + // $bls Bold style + // $sss Superscript/subscript + // $uls Underline + // $bFamily Font family + // $bCharSet Character set + // $reserved Reserved + // $cch Length of font name + // $rgch Font name + + $dyHeight = $this->_size * 20; + $icv = $this->_color; + $bls = $this->_bold; + $sss = $this->_font_script; + $uls = $this->_underline; + $bFamily = $this->_font_family; + $bCharSet = $this->_font_charset; + $rgch = $this->_font; + + $cch = strlen($rgch); + $record = 0x31; + $length = 0x0F + $cch; + $reserved = 0x00; + + $grbit = 0x00; + + if ($this->_italic) { + $grbit |= 0x02; + } + + if ($this->_font_strikeout) { + $grbit |= 0x08; + } + + if ($this->_font_outline) { + $grbit |= 0x10; + } + + if ($this->_font_shadow) { + $grbit |= 0x20; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvvvCCCCC", $dyHeight, $grbit, $icv, $bls, + $sss, $uls, $bFamily, + $bCharSet, $reserved, $cch); + + return($header . $data . $this->_font); + } + + /* + * Returns a unique hash key for a font. + * Used by writeexcel_workbook::_store_all_fonts() + */ + function get_font_key() { + + # The following elements are arranged to increase the probability of + # generating a unique key. Elements that hold a large range of numbers + # eg. _color are placed between two binary elements such as _italic + # + $key = $this->_font.$this->_size. + $this->_font_script.$this->_underline. + $this->_font_strikeout.$this->_bold.$this->_font_outline. + $this->_font_family.$this->_font_charset. + $this->_font_shadow.$this->_color.$this->_italic; + + $key = preg_replace('/ /', '_', $key); # Convert the key to a single word + + return $key; + } + + /* + * Returns the used by Worksheet->_XF() + */ + function get_xf_index() { + return $this->_xf_index; + } + + /* + * Used in conjunction with the set_xxx_color methods to convert a color + * string into a number. Color range is 0..63 but we will restrict it + * to 8..63 to comply with Gnumeric. Colors 0..7 are repeated in 8..15. + */ + function _get_color($color=false) { + + $colors = array( + 'aqua' => 0x0F, + 'cyan' => 0x0F, + 'black' => 0x08, + 'blue' => 0x0C, + 'brown' => 0x10, + 'magenta' => 0x0E, + 'fuchsia' => 0x0E, + 'gray' => 0x17, + 'grey' => 0x17, + 'green' => 0x11, + 'lime' => 0x0B, + 'navy' => 0x12, + 'orange' => 0x35, + 'purple' => 0x14, + 'red' => 0x0A, + 'silver' => 0x16, + 'white' => 0x09, + 'yellow' => 0x0D + ); + + // Return the default color, 0x7FFF, if undef, + if ($color===false) { + return 0x7FFF; + } + + // or the color string converted to an integer, + if (isset($colors[strtolower($color)])) { + return $colors[strtolower($color)]; + } + + // or the default color if string is unrecognised, + if (preg_match('/\D/', $color)) { + return 0x7FFF; + } + + // or an index < 8 mapped into the correct range, + if ($color<8) { + return $color + 8; + } + + // or the default color if arg is outside range, + if ($color>63) { + return 0x7FFF; + } + + // or an integer in the valid range + return $color; + } + + /* + * Set cell alignment. + */ + function set_align($location) { + + // Ignore numbers + if (preg_match('/\d/', $location)) { + return; + } + + $location = strtolower($location); + + switch ($location) { + + case 'left': + $this->set_text_h_align(1); + break; + + case 'centre': + case 'center': + $this->set_text_h_align(2); + break; + + case 'right': + $this->set_text_h_align(3); + break; + + case 'fill': + $this->set_text_h_align(4); + break; + + case 'justify': + $this->set_text_h_align(5); + break; + + case 'merge': + $this->set_text_h_align(6); + break; + + case 'equal_space': + $this->set_text_h_align(7); + break; + + case 'top': + $this->set_text_v_align(0); + break; + + case 'vcentre': + case 'vcenter': + $this->set_text_v_align(1); + break; + break; + + case 'bottom': + $this->set_text_v_align(2); + break; + + case 'vjustify': + $this->set_text_v_align(3); + break; + + case 'vequal_space': + $this->set_text_v_align(4); + break; + } + } + + /* + * Set vertical cell alignment. This is required by the set_properties() + * method to differentiate between the vertical and horizontal properties. + */ + function set_valign($location) { + $this->set_align($location); + } + + /* + * This is an alias for the unintuitive set_align('merge') + */ + function set_merge() { + $this->set_text_h_align(6); + } + + /* + * Bold has a range 0x64..0x3E8. + * 0x190 is normal. 0x2BC is bold. + */ + function set_bold($weight=1) { + + if ($weight == 1) { + // Bold text + $weight = 0x2BC; + } + + if ($weight == 0) { + // Normal text + $weight = 0x190; + } + + if ($weight < 0x064) { + // Lower bound + $weight = 0x190; + } + + if ($weight > 0x3E8) { + // Upper bound + $weight = 0x190; + } + + $this->_bold = $weight; + } + + /* + * Set all cell borders (bottom, top, left, right) to the same style + */ + function set_border($style) { + $this->set_bottom($style); + $this->set_top($style); + $this->set_left($style); + $this->set_right($style); + } + + /* + * Set all cell borders (bottom, top, left, right) to the same color + */ + function set_border_color($color) { + $this->set_bottom_color($color); + $this->set_top_color($color); + $this->set_left_color($color); + $this->set_right_color($color); + } + + /* + * Convert hashes of properties to method calls. + */ + function set_properties() { + + $_=func_get_args(); + + $properties=array(); + foreach($_ as $props) { + if (is_array($props)) { + $properties=array_merge($properties, $props); + } else { + $properties[]=$props; + } + } + + foreach ($properties as $key=>$value) { + + // Strip leading "-" from Tk style properties eg. -color => 'red'. + $key = preg_replace('/^-/', '', $key); + + /* Make sure method names are alphanumeric characters only, in + case tainted data is passed to the eval(). */ + if (preg_match('/\W/', $key)) { + trigger_error("Unknown property: $key.", + E_USER_ERROR); + } + + /* Evaling all $values as a strings gets around the problem of + some numerical format strings being evaluated as numbers, for + example "00000" for a zip code. */ + if (is_int($key)) { + eval("\$this->set_$value();"); + } else { + eval("\$this->set_$key('$value');"); + } + + } + } + + function set_font($font) { + $this->_font=$font; + } + + function set_size($size) { + $this->_size=$size; + } + + function set_italic($italic=1) { + $this->_italic=$italic; + } + + function set_color($color) { + $this->_color=$this->_get_color($color); + } + + function set_underline($underline=1) { + $this->_underline=$underline; + } + + function set_font_strikeout($font_strikeout=1) { + $this->_font_strikeout=$font_strikeout; + } + + function set_font_outline($font_outline=1) { + $this->_font_outline=$font_outline; + } + + function set_font_shadow($font_shadow=1) { + $this->_font_shadow=$font_shadow; + } + + function set_font_script($font_script=1) { + $this->_font_script=$font_script; + } + + /* Undocumented */ + function set_font_family($font_family=1) { + $this->_font_family=$font_family; + } + + /* Undocumented */ + function set_font_charset($font_charset=1) { + $this->_font_charset=$font_charset; + } + + function set_num_format($num_format=1) { + $this->_num_format=$num_format; + } + + function set_hidden($hidden=1) { + $this->_hidden=$hidden; + } + + function set_locked($locked=1) { + $this->_locked=$locked; + } + + function set_text_h_align($align) { + $this->_text_h_align=$align; + } + + function set_text_wrap($wrap=1) { + $this->_text_wrap=$wrap; + } + + function set_text_v_align($align) { + $this->_text_v_align=$align; + } + + function set_text_justlast($text_justlast=1) { + $this->_text_justlast=$text_justlast; + } + + function set_rotation($rotation=1) { + $this->_rotation=$rotation; + } + + function set_fg_color($color) { + $this->_fg_color=$this->_get_color($color); + } + + function set_bg_color($color) { + $this->_bg_color=$this->_get_color($color); + } + + function set_pattern($pattern=1) { + $this->_pattern=$pattern; + } + + function set_bottom($bottom=1) { + $this->_bottom=$bottom; + } + + function set_top($top=1) { + $this->_top=$top; + } + + function set_left($left=1) { + $this->_left=$left; + } + + function set_right($right=1) { + $this->_right=$right; + } + + function set_bottom_color($color) { + $this->_bottom_color=$this->_get_color($color); + } + + function set_top_color($color) { + $this->_top_color=$this->_get_color($color); + } + + function set_left_color($color) { + $this->_left_color=$this->_get_color($color); + } + + function set_right_color($color) { + $this->_right_color=$this->_get_color($color); + } + +} + +?> diff --git a/lib/Excel/php_writeexcel/class.writeexcel_formula.inc.php b/lib/Excel/php_writeexcel/class.writeexcel_formula.inc.php new file mode 100644 index 000000000..7a04fd63a --- /dev/null +++ b/lib/Excel/php_writeexcel/class.writeexcel_formula.inc.php @@ -0,0 +1,1610 @@ +"); + // @const SPREADSHEET_EXCEL_WRITER_GT token identifier for character ">" +define('SPREADSHEET_EXCEL_WRITER_LT',"<"); + // @const SPREADSHEET_EXCEL_WRITER_LT token identifier for character "<" +define('SPREADSHEET_EXCEL_WRITER_LE',"<="); + // @const SPREADSHEET_EXCEL_WRITER_LE token identifier for character "<=" +define('SPREADSHEET_EXCEL_WRITER_GE',">="); + // @const SPREADSHEET_EXCEL_WRITER_GE token identifier for character ">=" +define('SPREADSHEET_EXCEL_WRITER_EQ',"="); + // @const SPREADSHEET_EXCEL_WRITER_EQ token identifier for character "=" +define('SPREADSHEET_EXCEL_WRITER_NE',"<>"); + // @const SPREADSHEET_EXCEL_WRITER_NE token identifier for character "<>" + + +class writeexcel_formula { + +############################################################################### +# +# Class data. +# +var $parser; +var $ptg; +var $_functions; +var $_current_char; +var $_current_token; +var $_lookahead; +var $_debug; +var $_byte_order; +var $_volatile; +var $_workbook; +var $_ext_sheets; +var $_formula; + +############################################################################### +# +# new() +# +# Constructor +# +function writeexcel_formula($byte_order) { + + $this->parser = false; + $this->ptg = array(); + $this->_functions = array(); + $this->_debug = 0; + $this->_byte_order = $byte_order; + $this->_volatile = 0; + $this->_workbook = ""; + $this->_ext_sheets = array(); + $this->_current_token = ''; + $this->_lookahead = ''; + $this->_current_char = 0; + $this->_formula = ''; +} + +############################################################################### +# +# _init_parser() +# +# There is a small overhead involved in generating the parser. Therefore, the +# initialisation is delayed until a formula is required. TODO: use a pre- +# compiled header. +# +function _init_parser() { + + $this->_initializeHashes(); + + + if ($this->_debug) { + print "Init_parser.\n\n"; + } +} + +############################################################################### +# +# parse_formula() +# +# This is the only public method. It takes a textual description of a formula +# and returns a RPN encoded byte string. +# +function parse_formula() { + + $_=func_get_args(); + + # Initialise the parser if this is the first call + if ($this->parser===false) { + $this->_init_parser(); + } + + $formula = array_shift($_); + //$str; + //$tokens; + + if ($this->_debug) { + print "$formula\n"; + } + + # Build the parse tree for the formula + + $this->_formula = $formula; + $this->_current_char = 0; + $this->_lookahead = $this->_formula{1}; + $this->_advance($formula); + $parsetree = $this->_condition(); + + $str = $this->toReversePolish($parsetree); + + return $str; +} + +function isError($data) { + return (bool)(is_object($data) && + (get_class($data) == 'pear_error' || + is_subclass_of($data, 'pear_error'))); +} + +/** +* Class for parsing Excel formulas +* +* @author Xavier Noguer +* @category FileFormats +* @package Spreadsheet_Excel_Writer +*/ + + +/** +* Initialize the ptg and function hashes. +* +* @access private +*/ +function _initializeHashes() + { + // The Excel ptg indices + $this->ptg = array( + 'ptgExp' => 0x01, + 'ptgTbl' => 0x02, + 'ptgAdd' => 0x03, + 'ptgSub' => 0x04, + 'ptgMul' => 0x05, + 'ptgDiv' => 0x06, + 'ptgPower' => 0x07, 'ptgConcat' => 0x08, + 'ptgLT' => 0x09, + 'ptgLE' => 0x0A, + 'ptgEQ' => 0x0B, + 'ptgGE' => 0x0C, + 'ptgGT' => 0x0D, + 'ptgNE' => 0x0E, + 'ptgIsect' => 0x0F, + 'ptgUnion' => 0x10, + 'ptgRange' => 0x11, + 'ptgUplus' => 0x12, + 'ptgUminus' => 0x13, + 'ptgPercent' => 0x14, + 'ptgParen' => 0x15, + 'ptgMissArg' => 0x16, + 'ptgStr' => 0x17, + 'ptgAttr' => 0x19, + 'ptgSheet' => 0x1A, + 'ptgEndSheet' => 0x1B, + 'ptgErr' => 0x1C, + 'ptgBool' => 0x1D, + 'ptgInt' => 0x1E, + 'ptgNum' => 0x1F, + 'ptgArray' => 0x20, + 'ptgFunc' => 0x21, + 'ptgFuncVar' => 0x22, + 'ptgName' => 0x23, + 'ptgRef' => 0x24, + 'ptgArea' => 0x25, + 'ptgMemArea' => 0x26, + 'ptgMemErr' => 0x27, + 'ptgMemNoMem' => 0x28, + 'ptgMemFunc' => 0x29, + 'ptgRefErr' => 0x2A, + 'ptgAreaErr' => 0x2B, + 'ptgRefN' => 0x2C, + 'ptgAreaN' => 0x2D, + 'ptgMemAreaN' => 0x2E, + 'ptgMemNoMemN' => 0x2F, + 'ptgNameX' => 0x39, + 'ptgRef3d' => 0x3A, + + 'ptgArea3d' => 0x3B, + 'ptgRefErr3d' => 0x3C, + 'ptgAreaErr3d' => 0x3D, + 'ptgArrayV' => 0x40, + 'ptgFuncV' => 0x41, + 'ptgFuncVarV' => 0x42, + 'ptgNameV' => 0x43, + 'ptgRefV' => 0x44, + 'ptgAreaV' => 0x45, + 'ptgMemAreaV' => 0x46, + 'ptgMemErrV' => 0x47, + 'ptgMemNoMemV' => 0x48, + 'ptgMemFuncV' => 0x49, + 'ptgRefErrV' => 0x4A, + 'ptgAreaErrV' => 0x4B, + 'ptgRefNV' => 0x4C, + 'ptgAreaNV' => 0x4D, + 'ptgMemAreaNV' => 0x4E, + 'ptgMemNoMemN' => 0x4F, + 'ptgFuncCEV' => 0x58, + 'ptgNameXV' => 0x59, + 'ptgRef3dV' => 0x5A, + 'ptgArea3dV' => 0x5B, 'ptgRefErr3dV' => 0x5C, + 'ptgAreaErr3d' => 0x5D, + 'ptgArrayA' => 0x60, + 'ptgFuncA' => 0x61, + 'ptgFuncVarA' => 0x62, + 'ptgNameA' => 0x63, 'ptgRefA' => 0x64, + 'ptgAreaA' => 0x65, + 'ptgMemAreaA' => 0x66, + 'ptgMemErrA' => 0x67, + 'ptgMemNoMemA' => 0x68, + 'ptgMemFuncA' => 0x69, + 'ptgRefErrA' => 0x6A, + 'ptgAreaErrA' => 0x6B, + 'ptgRefNA' => 0x6C, + 'ptgAreaNA' => 0x6D, + 'ptgMemAreaNA' => 0x6E, + 'ptgMemNoMemN' => 0x6F, + 'ptgFuncCEA' => 0x78, + 'ptgNameXA' => 0x79, + 'ptgRef3dA' => 0x7A, + 'ptgArea3dA' => 0x7B, + 'ptgRefErr3dA' => 0x7C, + 'ptgAreaErr3d' => 0x7D + ); + + // Thanks to Michael Meeks and Gnumeric for the initial arg values. + // + // The following hash was generated by "function_locale.pl" in the distro. + // Refer to function_locale.pl for non-English function names. + // + // The array elements are as follow: + // ptg: The Excel function ptg code. + // args: The number of arguments that the function takes: + // >=0 is a fixed number of arguments. + // -1 is a variable number of arguments. + // class: The reference, value or array class of the function args. + // vol: The function is volatile. + // + $this->_functions = array( + // function ptg args class vol + 'COUNT' => array( 0, -1, 0, 0 ), + 'IF' => array( 1, -1, 1, 0 ), + 'ISNA' => array( 2, 1, 1, 0 ), + 'ISERROR' => array( 3, 1, 1, 0 ), + 'SUM' => array( 4, -1, 0, 0 ), + 'AVERAGE' => array( 5, -1, 0, 0 ), + 'MIN' => array( 6, -1, 0, 0 ), + 'MAX' => array( 7, -1, 0, 0 ), + 'ROW' => array( 8, -1, 0, 0 ), + 'COLUMN' => array( 9, -1, 0, 0 ), + 'NA' => array( 10, 0, 0, 0 ), + 'NPV' => array( 11, -1, 1, 0 ), + 'STDEV' => array( 12, -1, 0, 0 ), + 'DOLLAR' => array( 13, -1, 1, 0 ), + 'FIXED' => array( 14, -1, 1, 0 ), + 'SIN' => array( 15, 1, 1, 0 ), + 'COS' => array( 16, 1, 1, 0 ), + 'TAN' => array( 17, 1, 1, 0 ), + 'ATAN' => array( 18, 1, 1, 0 ), + 'PI' => array( 19, 0, 1, 0 ), + 'SQRT' => array( 20, 1, 1, 0 ), + 'EXP' => array( 21, 1, 1, 0 ), + 'LN' => array( 22, 1, 1, 0 ), + 'LOG10' => array( 23, 1, 1, 0 ), + 'ABS' => array( 24, 1, 1, 0 ), + 'INT' => array( 25, 1, 1, 0 ), + 'SIGN' => array( 26, 1, 1, 0 ), + 'ROUND' => array( 27, 2, 1, 0 ), + 'LOOKUP' => array( 28, -1, 0, 0 ), + 'INDEX' => array( 29, -1, 0, 1 ), + 'REPT' => array( 30, 2, 1, 0 ), + 'MID' => array( 31, 3, 1, 0 ), + 'LEN' => array( 32, 1, 1, 0 ), + 'VALUE' => array( 33, 1, 1, 0 ), + 'TRUE' => array( 34, 0, 1, 0 ), + 'FALSE' => array( 35, 0, 1, 0 ), + 'AND' => array( 36, -1, 0, 0 ), + 'OR' => array( 37, -1, 0, 0 ), + 'NOT' => array( 38, 1, 1, 0 ), + 'MOD' => array( 39, 2, 1, 0 ), + 'DCOUNT' => array( 40, 3, 0, 0 ), + 'DSUM' => array( 41, 3, 0, 0 ), + 'DAVERAGE' => array( 42, 3, 0, 0 ), + 'DMIN' => array( 43, 3, 0, 0 ), + 'DMAX' => array( 44, 3, 0, 0 ), + 'DSTDEV' => array( 45, 3, 0, 0 ), + 'VAR' => array( 46, -1, 0, 0 ), + 'DVAR' => array( 47, 3, 0, 0 ), + 'TEXT' => array( 48, 2, 1, 0 ), + 'LINEST' => array( 49, -1, 0, 0 ), + 'TREND' => array( 50, -1, 0, 0 ), + 'LOGEST' => array( 51, -1, 0, 0 ), + 'GROWTH' => array( 52, -1, 0, 0 ), + 'PV' => array( 56, -1, 1, 0 ), + 'FV' => array( 57, -1, 1, 0 ), + 'NPER' => array( 58, -1, 1, 0 ), + 'PMT' => array( 59, -1, 1, 0 ), + 'RATE' => array( 60, -1, 1, 0 ), + 'MIRR' => array( 61, 3, 0, 0 ), + 'IRR' => array( 62, -1, 0, 0 ), + 'RAND' => array( 63, 0, 1, 1 ), + 'MATCH' => array( 64, -1, 0, 0 ), + 'DATE' => array( 65, 3, 1, 0 ), + 'TIME' => array( 66, 3, 1, 0 ), + 'DAY' => array( 67, 1, 1, 0 ), + 'MONTH' => array( 68, 1, 1, 0 ), + 'YEAR' => array( 69, 1, 1, 0 ), + 'WEEKDAY' => array( 70, -1, 1, 0 ), + 'HOUR' => array( 71, 1, 1, 0 ), + 'MINUTE' => array( 72, 1, 1, 0 ), + 'SECOND' => array( 73, 1, 1, 0 ), + 'NOW' => array( 74, 0, 1, 1 ), + 'AREAS' => array( 75, 1, 0, 1 ), + 'ROWS' => array( 76, 1, 0, 1 ), + 'COLUMNS' => array( 77, 1, 0, 1 ), + 'OFFSET' => array( 78, -1, 0, 1 ), + 'SEARCH' => array( 82, -1, 1, 0 ), + 'TRANSPOSE' => array( 83, 1, 1, 0 ), + 'TYPE' => array( 86, 1, 1, 0 ), + 'ATAN2' => array( 97, 2, 1, 0 ), + 'ASIN' => array( 98, 1, 1, 0 ), + 'ACOS' => array( 99, 1, 1, 0 ), + 'CHOOSE' => array( 100, -1, 1, 0 ), + 'HLOOKUP' => array( 101, -1, 0, 0 ), + 'VLOOKUP' => array( 102, -1, 0, 0 ), + 'ISREF' => array( 105, 1, 0, 0 ), + 'LOG' => array( 109, -1, 1, 0 ), + 'CHAR' => array( 111, 1, 1, 0 ), + 'LOWER' => array( 112, 1, 1, 0 ), + 'UPPER' => array( 113, 1, 1, 0 ), + 'PROPER' => array( 114, 1, 1, 0 ), + 'LEFT' => array( 115, -1, 1, 0 ), + 'RIGHT' => array( 116, -1, 1, 0 ), + 'EXACT' => array( 117, 2, 1, 0 ), + 'TRIM' => array( 118, 1, 1, 0 ), + 'REPLACE' => array( 119, 4, 1, 0 ), + 'SUBSTITUTE' => array( 120, -1, 1, 0 ), + 'CODE' => array( 121, 1, 1, 0 ), + 'FIND' => array( 124, -1, 1, 0 ), + 'CELL' => array( 125, -1, 0, 1 ), + 'ISERR' => array( 126, 1, 1, 0 ), + 'ISTEXT' => array( 127, 1, 1, 0 ), + 'ISNUMBER' => array( 128, 1, 1, 0 ), + 'ISBLANK' => array( 129, 1, 1, 0 ), + 'T' => array( 130, 1, 0, 0 ), + 'N' => array( 131, 1, 0, 0 ), + 'DATEVALUE' => array( 140, 1, 1, 0 ), + 'TIMEVALUE' => array( 141, 1, 1, 0 ), + 'SLN' => array( 142, 3, 1, 0 ), + 'SYD' => array( 143, 4, 1, 0 ), + 'DDB' => array( 144, -1, 1, 0 ), + 'INDIRECT' => array( 148, -1, 1, 1 ), + 'CALL' => array( 150, -1, 1, 0 ), + 'CLEAN' => array( 162, 1, 1, 0 ), + 'MDETERM' => array( 163, 1, 2, 0 ), + 'MINVERSE' => array( 164, 1, 2, 0 ), + 'MMULT' => array( 165, 2, 2, 0 ), + 'IPMT' => array( 167, -1, 1, 0 ), + 'PPMT' => array( 168, -1, 1, 0 ), + 'COUNTA' => array( 169, -1, 0, 0 ), + 'PRODUCT' => array( 183, -1, 0, 0 ), + 'FACT' => array( 184, 1, 1, 0 ), + 'DPRODUCT' => array( 189, 3, 0, 0 ), + 'ISNONTEXT' => array( 190, 1, 1, 0 ), + 'STDEVP' => array( 193, -1, 0, 0 ), + 'VARP' => array( 194, -1, 0, 0 ), + 'DSTDEVP' => array( 195, 3, 0, 0 ), + 'DVARP' => array( 196, 3, 0, 0 ), + 'TRUNC' => array( 197, -1, 1, 0 ), + 'ISLOGICAL' => array( 198, 1, 1, 0 ), + 'DCOUNTA' => array( 199, 3, 0, 0 ), + 'ROUNDUP' => array( 212, 2, 1, 0 ), + 'ROUNDDOWN' => array( 213, 2, 1, 0 ), + 'RANK' => array( 216, -1, 0, 0 ), + 'ADDRESS' => array( 219, -1, 1, 0 ), + 'DAYS360' => array( 220, -1, 1, 0 ), + 'TODAY' => array( 221, 0, 1, 1 ), + 'VDB' => array( 222, -1, 1, 0 ), + 'MEDIAN' => array( 227, -1, 0, 0 ), + 'SUMPRODUCT' => array( 228, -1, 2, 0 ), + 'SINH' => array( 229, 1, 1, 0 ), + 'COSH' => array( 230, 1, 1, 0 ), + 'TANH' => array( 231, 1, 1, 0 ), + 'ASINH' => array( 232, 1, 1, 0 ), + 'ACOSH' => array( 233, 1, 1, 0 ), + 'ATANH' => array( 234, 1, 1, 0 ), + 'DGET' => array( 235, 3, 0, 0 ), + 'INFO' => array( 244, 1, 1, 1 ), + 'DB' => array( 247, -1, 1, 0 ), + 'FREQUENCY' => array( 252, 2, 0, 0 ), + 'ERROR.TYPE' => array( 261, 1, 1, 0 ), + 'REGISTER.ID' => array( 267, -1, 1, 0 ), + 'AVEDEV' => array( 269, -1, 0, 0 ), + 'BETADIST' => array( 270, -1, 1, 0 ), + 'GAMMALN' => array( 271, 1, 1, 0 ), + 'BETAINV' => array( 272, -1, 1, 0 ), + 'BINOMDIST' => array( 273, 4, 1, 0 ), + 'CHIDIST' => array( 274, 2, 1, 0 ), + 'CHIINV' => array( 275, 2, 1, 0 ), + 'COMBIN' => array( 276, 2, 1, 0 ), + 'CONFIDENCE' => array( 277, 3, 1, 0 ), + 'CRITBINOM' => array( 278, 3, 1, 0 ), + 'EVEN' => array( 279, 1, 1, 0 ), + 'EXPONDIST' => array( 280, 3, 1, 0 ), + 'FDIST' => array( 281, 3, 1, 0 ), + 'FINV' => array( 282, 3, 1, 0 ), + 'FISHER' => array( 283, 1, 1, 0 ), + 'FISHERINV' => array( 284, 1, 1, 0 ), + 'FLOOR' => array( 285, 2, 1, 0 ), + 'GAMMADIST' => array( 286, 4, 1, 0 ), + 'GAMMAINV' => array( 287, 3, 1, 0 ), + 'CEILING' => array( 288, 2, 1, 0 ), + 'HYPGEOMDIST' => array( 289, 4, 1, 0 ), + 'LOGNORMDIST' => array( 290, 3, 1, 0 ), + 'LOGINV' => array( 291, 3, 1, 0 ), + 'NEGBINOMDIST' => array( 292, 3, 1, 0 ), + 'NORMDIST' => array( 293, 4, 1, 0 ), + 'NORMSDIST' => array( 294, 1, 1, 0 ), + 'NORMINV' => array( 295, 3, 1, 0 ), + 'NORMSINV' => array( 296, 1, 1, 0 ), + 'STANDARDIZE' => array( 297, 3, 1, 0 ), + 'ODD' => array( 298, 1, 1, 0 ), + 'PERMUT' => array( 299, 2, 1, 0 ), + 'POISSON' => array( 300, 3, 1, 0 ), + 'TDIST' => array( 301, 3, 1, 0 ), + 'WEIBULL' => array( 302, 4, 1, 0 ), + 'SUMXMY2' => array( 303, 2, 2, 0 ), + 'SUMX2MY2' => array( 304, 2, 2, 0 ), + 'SUMX2PY2' => array( 305, 2, 2, 0 ), + 'CHITEST' => array( 306, 2, 2, 0 ), + 'CORREL' => array( 307, 2, 2, 0 ), + 'COVAR' => array( 308, 2, 2, 0 ), + 'FORECAST' => array( 309, 3, 2, 0 ), + 'FTEST' => array( 310, 2, 2, 0 ), + 'INTERCEPT' => array( 311, 2, 2, 0 ), + 'PEARSON' => array( 312, 2, 2, 0 ), + 'RSQ' => array( 313, 2, 2, 0 ), + 'STEYX' => array( 314, 2, 2, 0 ), + 'SLOPE' => array( 315, 2, 2, 0 ), + 'TTEST' => array( 316, 4, 2, 0 ), + 'PROB' => array( 317, -1, 2, 0 ), + 'DEVSQ' => array( 318, -1, 0, 0 ), + 'GEOMEAN' => array( 319, -1, 0, 0 ), + 'HARMEAN' => array( 320, -1, 0, 0 ), + 'SUMSQ' => array( 321, -1, 0, 0 ), + 'KURT' => array( 322, -1, 0, 0 ), + 'SKEW' => array( 323, -1, 0, 0 ), + 'ZTEST' => array( 324, -1, 0, 0 ), + 'LARGE' => array( 325, 2, 0, 0 ), + 'SMALL' => array( 326, 2, 0, 0 ), + 'QUARTILE' => array( 327, 2, 0, 0 ), + 'PERCENTILE' => array( 328, 2, 0, 0 ), + 'PERCENTRANK' => array( 329, -1, 0, 0 ), + 'MODE' => array( 330, -1, 2, 0 ), + 'TRIMMEAN' => array( 331, 2, 0, 0 ), + 'TINV' => array( 332, 2, 1, 0 ), + 'CONCATENATE' => array( 336, -1, 1, 0 ), + 'POWER' => array( 337, 2, 1, 0 ), + 'RADIANS' => array( 342, 1, 1, 0 ), + 'DEGREES' => array( 343, 1, 1, 0 ), + 'SUBTOTAL' => array( 344, -1, 0, 0 ), + 'SUMIF' => array( 345, -1, 0, 0 ), + 'COUNTIF' => array( 346, 2, 0, 0 ), + 'COUNTBLANK' => array( 347, 1, 0, 0 ), + 'ROMAN' => array( 354, -1, 1, 0 ) + ); +} + +/** +* Convert a token to the proper ptg value. +* +* @access private +* @param mixed $token The token to convert. +* @return mixed the converted token on success. PEAR_Error if the token +* is not recognized +*/ +function _convert($token) + { + if (preg_match('/^"[^"]{0,255}"$/', $token)) + { + return $this->_convertString($token); + } + elseif (is_numeric($token)) + { + return $this->_convertNumber($token); + } + // match references like A1 or $A$1 + +elseif (preg_match('/^\$?([A-Ia-i]?[A-Za-z])\$?(\d+)$/',$token)) + { + return $this->_convertRef2d($token); + } + // match external references like Sheet1:Sheet2!A1 + elseif (preg_match("/^[A-Za-z0-9_]+(\:[A-Za-z0-9_]+)?\![A-Ia-i]?[A-Za-z](\d+)$/",$token)) + { + + return $this->_convertRef3d($token); + } + // match ranges like A1:B2 + elseif (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?\d+\:\$?[A-Ia-i]?[A-Za-z]\$?\d+$/',$token)) + { + return $this->_convertRange2d($token); + } + // match ranges like A1..B2 + elseif (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?\d+\.\.\$?[A-Ia-i]?[A-Za-z]\$?\d+$/',$token)) + { + return $this->_convertRange2d($token); + } + // match external ranges like Sheet1:Sheet2!A1:B2 + elseif (preg_match("/^[A-Za-z0-9_]+(\:[A-Za-z0-9_]+)?\!([A-Ia-i]?[A-Za-z])?(\d+)\:([A-Ia-i]?[A-Za-z])?(\d+)$/",$token)) + { + return $this->_convertRange3d($token); + } + // match external ranges like 'Sheet1:Sheet2'!A1:B2 + elseif (preg_match("/^'[A-Za-z0-9_ ]+(\:[A-Za-z0-9_ ]+)?'\!([A-Ia-i]?[A-Za-z])?(\d+)\:([A-Ia-i]?[A-Za-z])?(\d+)$/",$token)) + { + return $this->_convertRange3d($token); + } + elseif (isset($this->ptg[$token])) // operators (including parentheses) + { + return pack("C", $this->ptg[$token]); + } + // commented so argument number can be processed correctly. See toReversePolish(). + /*elseif (preg_match("/[A-Z0-9\xc0-\xdc\.]+/",$token)) + { + return($this->_convertFunction($token,$this->_func_args)); + }*/ + // if it's an argument, ignore the token (the argument remains) + elseif ($token == 'arg') + { + return ''; + } + // TODO: use real error codes + trigger_error("Unknown token $token", E_USER_ERROR); +} + +/** +* Convert a number token to ptgInt or ptgNum +* +* @access private +* @param mixed $num an integer or double for conversion to its ptg value +*/ +function _convertNumber($num) + { + + // Integer in the range 0..2**16-1 + + if ((preg_match("/^\d+$/",$num)) and ($num <= 65535)) { + return(pack("Cv", $this->ptg['ptgInt'], $num)); + } + else { // A float + if ($this->_byte_order) { // if it's Big Endian + $num = strrev($num); + } + return pack("Cd", $this->ptg['ptgNum'], $num); + } +} + +/** +* Convert a string token to ptgStr +* +* @access private +* @param string $string A string for conversion to its ptg value +*/ +function _convertString($string) + { + // chop away beggining and ending quotes + $string = substr($string, 1, strlen($string) - 2); + return pack("CC", $this->ptg['ptgStr'], strlen($string)).$string; +} + +/** +* Convert a function to a ptgFunc or ptgFuncVarV depending on the number of +* args that it takes. +* +* @access private +* @param string $token The name of the function for convertion to ptg value. +* @param integer $num_args The number of arguments the function receives. +* @return string The packed ptg for the function +*/ +function _convertFunction($token, $num_args) + { + $args = $this->_functions[$token][1]; + $volatile = $this->_functions[$token][3]; + + // Fixed number of args eg. TIME($i,$j,$k). + if ($args >= 0) { + return pack("Cv", $this->ptg['ptgFuncV'], $this->_functions[$token][0]); + } + // Variable number of args eg. SUM($i,$j,$k, ..). + if ($args == -1) { + return pack("CCv", $this->ptg['ptgFuncVarV'], $num_args, $this->_functions[$token][0]); + } +} + +/** +* Convert an Excel range such as A1:D4 to a ptgRefV. +* +* @access private +* @param string $range An Excel range in the A1:A2 or A1..A2 format. +*/ +function _convertRange2d($range) + { + $class = 2; // as far as I know, this is magick. + + // Split the range into 2 cell refs + if (preg_match('/^\$?([A-Ia-i]?[A-Za-z])\$?(\d+)\:\$?([A-Ia-i]?[A-Za-z])\$?(\d+)$/',$range)) { + list($cell1, $cell2) = split(':', $range); + } + elseif (preg_match('/^\$?([A-Ia-i]?[A-Za-z])\$?(\d+)\.\.\$?([A-Ia-i]?[A-Za-z])\$?(\d+)$/',$range)) { + list($cell1, $cell2) = split('\.\.', $range); + } + else { + // TODO: use real error codes + trigger_error("Unknown range separator", E_USER_ERROR); + } + + // Convert the cell references + $cell_array1 = $this->_cellToPackedRowcol($cell1); + if ($this->isError($cell_array1)) { + return $cell_array1; + } + list($row1, $col1) = $cell_array1; + $cell_array2 = $this->_cellToPackedRowcol($cell2); + if ($this->isError($cell_array2)) { + return $cell_array2; + } + list($row2, $col2) = $cell_array2; + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgArea = pack("C", $this->ptg['ptgArea']); + } + elseif ($class == 1) { + $ptgArea = pack("C", $this->ptg['ptgAreaV']); + } + elseif ($class == 2) { + $ptgArea = pack("C", $this->ptg['ptgAreaA']); + } + else { + // TODO: use real error codes + trigger_error("Unknown class $class", E_USER_ERROR); + } + return $ptgArea . $row1 . $row2 . $col1. $col2; +} + +/** +* Convert an Excel 3d range such as "Sheet1!A1:D4" or "Sheet1:Sheet2!A1:D4" to +* a ptgArea3dV. +* +* @access private +* @param string $token An Excel range in the Sheet1!A1:A2 format. +*/ +function _convertRange3d($token) + { + $class = 2; // as far as I know, this is magick. + + // Split the ref at the ! symbol + list($ext_ref, $range) = split('!', $token); + + // Convert the external reference part + $ext_ref = $this->_packExtRef($ext_ref); + if ($this->isError($ext_ref)) { + return $ext_ref; + } + + // Split the range into 2 cell refs + list($cell1, $cell2) = split(':', $range); + + // Convert the cell references + if (preg_match('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/', $cell1)) + { + $cell_array1 = $this->_cellToPackedRowcol($cell1); + if ($this->isError($cell_array1)) { + return $cell_array1; + } + list($row1, $col1) = $cell_array1; + $cell_array2 = $this->_cellToPackedRowcol($cell2); + if ($this->isError($cell_array2)) { + return $cell_array2; + } + list($row2, $col2) = $cell_array2; + } + else { // It's a columns range (like 26:27) + $cells_array = $this->_rangeToPackedRange($cell1.':'.$cell2); + if ($this->isError($cells_array)) { + return $cells_array; + } + list($row1, $col1, $row2, $col2) = $cells_array; + } + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgArea = pack("C", $this->ptg['ptgArea3d']); + } + elseif ($class == 1) { + $ptgArea = pack("C", $this->ptg['ptgArea3dV']); + } + elseif ($class == 2) { + $ptgArea = pack("C", $this->ptg['ptgArea3dA']); + } + else { + trigger_error("Unknown class $class", E_USER_ERROR); + } + + return $ptgArea . $ext_ref . $row1 . $row2 . $col1. $col2; +} + +/** +* Convert an Excel reference such as A1, $B2, C$3 or $D$4 to a ptgRefV. +* +* @access private +* @param string $cell An Excel cell reference +* @return string The cell in packed() format with the corresponding ptg +*/ +function _convertRef2d($cell) + { + $class = 2; // as far as I know, this is magick. + + // Convert the cell reference + $cell_array = $this->_cellToPackedRowcol($cell); + if ($this->isError($cell_array)) { + return $cell_array; + } + list($row, $col) = $cell_array; + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgRef = pack("C", $this->ptg['ptgRef']); + } + elseif ($class == 1) { + $ptgRef = pack("C", $this->ptg['ptgRefV']); + } + elseif ($class == 2) { + $ptgRef = pack("C", $this->ptg['ptgRefA']); + } + else { + // TODO: use real error codes + trigger_error("Unknown class $class",E_USER_ERROR); + } + return $ptgRef.$row.$col; +} + +/** +* Convert an Excel 3d reference such as "Sheet1!A1" or "Sheet1:Sheet2!A1" to a +* ptgRef3dV. +* +* @access private +* @param string $cell An Excel cell reference +* @return string The cell in packed() format with the corresponding ptg +*/ +function _convertRef3d($cell) + { + $class = 2; // as far as I know, this is magick. + + // Split the ref at the ! symbol + list($ext_ref, $cell) = split('!', $cell); + + // Convert the external reference part + $ext_ref = $this->_packExtRef($ext_ref); + if ($this->isError($ext_ref)) { + return $ext_ref; + } + + // Convert the cell reference part + list($row, $col) = $this->_cellToPackedRowcol($cell); + + // The ptg value depends on the class of the ptg. + if ($class == 0) { + $ptgRef = pack("C", $this->ptg['ptgRef3d']); + } elseif ($class == 1) { + $ptgRef = pack("C", $this->ptg['ptgRef3dV']); + } elseif ($class == 2) { + $ptgRef = pack("C", $this->ptg['ptgRef3dA']); + } + else { + trigger_error("Unknown class $class", E_USER_ERROR); + } + + return $ptgRef . $ext_ref. $row . $col; +} + +/** +* Convert the sheet name part of an external reference, for example "Sheet1" or +* "Sheet1:Sheet2", to a packed structure. +* +* @access private +* @param string $ext_ref The name of the external reference +* @return string The reference index in packed() format +*/ +function _packExtRef($ext_ref) { + $ext_ref = preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. + $ext_ref = preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. + + // Check if there is a sheet range eg., Sheet1:Sheet2. + if (preg_match("/:/", $ext_ref)) + { + list($sheet_name1, $sheet_name2) = split(':', $ext_ref); + + $sheet1 = $this->_getSheetIndex($sheet_name1); + if ($sheet1 == -1) { + trigger_error("Unknown sheet name $sheet_name1 in formula",E_USER_ERROR); + } + $sheet2 = $this->_getSheetIndex($sheet_name2); + if ($sheet2 == -1) { + trigger_error("Unknown sheet name $sheet_name2 in formula",E_USER_ERROR); + } + + // Reverse max and min sheet numbers if necessary + if ($sheet1 > $sheet2) { + list($sheet1, $sheet2) = array($sheet2, $sheet1); + } + } + else { // Single sheet name only. + $sheet1 = $this->_getSheetIndex($ext_ref); + if ($sheet1 == -1) { + trigger_error("Unknown sheet name $ext_ref in formula",E_USER_ERROR); + } + $sheet2 = $sheet1; + } + + // References are stored relative to 0xFFFF. + $offset = -1 - $sheet1; + + return pack('vdvv', $offset, 0x00, $sheet1, $sheet2); +} + +/** +* Look up the index that corresponds to an external sheet name. The hash of +* sheet names is updated by the addworksheet() method of the +* Spreadsheet_Excel_Writer_Workbook class. +* +* @access private +* @return integer +*/ +function _getSheetIndex($sheet_name) + { + if (!isset($this->_ext_sheets[$sheet_name])) { + return -1; + } + else { + return $this->_ext_sheets[$sheet_name]; + } +} + +/** +* This method is used to update the array of sheet names. It is +* called by the addWorksheet() method of the Spreadsheet_Excel_Writer_Workbook class. +* +* @access private +* @param string $name The name of the worksheet being added +* @param integer $index The index of the worksheet being added +*/ +function set_ext_sheet($name, $index) + { + $this->_ext_sheets[$name] = $index; +} + +/** +* pack() row and column into the required 3 byte format. +* +* @access private +* @param string $cell The Excel cell reference to be packed +* @return array Array containing the row and column in packed() format +*/ +function _cellToPackedRowcol($cell) + { + $cell = strtoupper($cell); + list($row, $col, $row_rel, $col_rel) = $this->_cellToRowcol($cell); + if ($col >= 256) { + trigger_error("Column in: $cell greater than 255", E_USER_ERROR); + } + if ($row >= 16384) { + trigger_error("Row in: $cell greater than 16384 ", E_USER_ERROR); + } + + // Set the high bits to indicate if row or col are relative. + $row |= $col_rel << 14; + $row |= $row_rel << 15; + + $row = pack('v', $row); + $col = pack('C', $col); + + return array($row, $col); +} + +/** +* pack() row range into the required 3 byte format. +* Just using maximun col/rows, which is probably not the correct solution +* +* @access private +* @param string $range The Excel range to be packed +* @return array Array containing (row1,col1,row2,col2) in packed() format +*/ +function _rangeToPackedRange($range) + { + preg_match('/(\$)?(\d+)\:(\$)?(\d+)/', $range, $match); + // return absolute rows if there is a $ in the ref + $row1_rel = empty($match[1]) ? 1 : 0; + $row1 = $match[2]; + $row2_rel = empty($match[3]) ? 1 : 0; + $row2 = $match[4]; + // Convert 1-index to zero-index + $row1--; + $row2--; + // Trick poor inocent Excel + $col1 = 0; + $col2 = 16383; // maximum possible value for Excel 5 (change this!!!) + + //list($row, $col, $row_rel, $col_rel) = $this->_cellToRowcol($cell); + if (($row1 >= 16384) or ($row2 >= 16384)) { + trigger_error("Row in: $range greater than 16384 ",E_USER_ERROR); + } + + // Set the high bits to indicate if rows are relative. + $row1 |= $row1_rel << 14; + $row2 |= $row2_rel << 15; + + $row1 = pack('v', $row1); + $row2 = pack('v', $row2); + $col1 = pack('C', $col1); + $col2 = pack('C', $col2); + + return array($row1, $col1, $row2, $col2); +} + +/** +* Convert an Excel cell reference such as A1 or $B2 or C$3 or $D$4 to a zero +* indexed row and column number. Also returns two (0,1) values to indicate +* whether the row or column are relative references. +* +* @access private +* @param string $cell The Excel cell reference in A1 format. +* @return array +*/ +function _cellToRowcol($cell) + { + preg_match('/(\$)?([A-I]?[A-Z])(\$)?(\d+)/',$cell,$match); + // return absolute column if there is a $ in the ref + $col_rel = empty($match[1]) ? 1 : 0; + $col_ref = $match[2]; + $row_rel = empty($match[3]) ? 1 : 0; + $row = $match[4]; + + // Convert base26 column string to a number. + $expn = strlen($col_ref) - 1; + $col = 0; + for ($i=0; $i < strlen($col_ref); $i++) + { + $col += (ord($col_ref{$i}) - ord('A') + 1) * pow(26, $expn); + $expn--; + } + + // Convert 1-index to zero-index + $row--; + $col--; + + return array($row, $col, $row_rel, $col_rel); +} + +/** +* Advance to the next valid token. +* +* @access private +*/ +function _advance() + { + $i = $this->_current_char; + // eat up white spaces + if ($i < strlen($this->_formula)) + { + while ($this->_formula{$i} == " ") { + $i++; + } + if ($i < strlen($this->_formula) - 1) { + $this->_lookahead = $this->_formula{$i+1}; + } + $token = ""; + } + while ($i < strlen($this->_formula)) + { + $token .= $this->_formula{$i}; + if ($i < strlen($this->_formula) - 1) { + $this->_lookahead = $this->_formula{$i+1}; + } + else { + $this->_lookahead = ''; + } + if ($this->_match($token) != '') + { + //if ($i < strlen($this->_formula) - 1) { + // $this->_lookahead = $this->_formula{$i+1}; + //} + $this->_current_char = $i + 1; + $this->_current_token = $token; + return 1; + } + if ($i < strlen($this->_formula) - 2) { + $this->_lookahead = $this->_formula{$i+2}; + } + else { + // if we run out of characters _lookahead becomes empty + $this->_lookahead = ''; + } + $i++; + } + //die("Lexical error ".$this->_current_char); +} + +/** +* Checks if it's a valid token. +* +* @access private +* @param mixed $token The token to check. +* @return mixed The checked token or false on failure +*/ +function _match($token) + { + switch($token) + { + case SPREADSHEET_EXCEL_WRITER_ADD: + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_SUB: + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_MUL: + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_DIV: + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_OPEN: + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_CLOSE: + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_SCOLON: + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_COMA: + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_GT: + if ($this->_lookahead == '=') { // it's a GE token + break; + } + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_LT: + // it's a LE or a NE token + if (($this->_lookahead == '=') or ($this->_lookahead == '>')) { + break; + } + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_GE: + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_LE: + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_EQ: + return($token); + break; + case SPREADSHEET_EXCEL_WRITER_NE: + return($token); + break; + default: + // if it's a reference + if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$token) and + !preg_match("/[0-9]/",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.') and + ($this->_lookahead != '!')) + { + return $token; + } + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) + elseif (preg_match("/^[A-Za-z0-9_]+(\:[A-Za-z0-9_]+)?\![A-Ia-i]?[A-Za-z][0-9]+$/",$token) and + !preg_match("/[0-9]/",$this->_lookahead) and + ($this->_lookahead != ':') and ($this->_lookahead != '.')) + { + return $token; + } + // if it's a range (A1:A2) + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$token) and + !preg_match("/[0-9]/",$this->_lookahead)) + { + return $token; + } + // if it's a range (A1..A2) + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$token) and + !preg_match("/[0-9]/",$this->_lookahead)) + { + return $token; + } + // If it's an external range like Sheet1:Sheet2!A1:B2 + elseif (preg_match("/^[A-Za-z0-9_]+(\:[A-Za-z0-9_]+)?\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/",$token) and + !preg_match("/[0-9]/",$this->_lookahead)) + { + return $token; + } + // If it's an external range like 'Sheet1:Sheet2'!A1:B2 + elseif (preg_match("/^'[A-Za-z0-9_ ]+(\:[A-Za-z0-9_ ]+)?'\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/",$token) and + !preg_match("/[0-9]/",$this->_lookahead)) + { + return $token; + } + // If it's a number (check that it's not a sheet name or range) + elseif (is_numeric($token) and + (!is_numeric($token.$this->_lookahead) or ($this->_lookahead == '')) and + ($this->_lookahead != '!') and ($this->_lookahead != ':')) + { + return $token; + } + // If it's a string (of maximum 255 characters) + elseif (preg_match("/^\"[^\"]{0,255}\"$/",$token)) + { + return $token; + } + // if it's a function call + elseif (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/i",$token) and ($this->_lookahead == "(")) { + return $token; + } + return ''; + } +} + +/** +* The parsing method. It parses a formula. +* +* @access public +* @param string $formula The formula to parse, without the initial equal sign (=). +*/ +function parse($formula) + { + $this->_current_char = 0; + $this->_formula = $formula; + $this->_lookahead = $formula{1}; + $this->_advance(); + $this->_parse_tree = $this->_condition(); + if ($this->isError($this->_parse_tree)) { + return $this->_parse_tree; + } +} + +/** +* It parses a condition. It assumes the following rule: +* Cond -> Expr [(">" | "<") Expr] +* +* @access private +* @return mixed The parsed ptg'd tree +*/ +function _condition() + { + $result = $this->_expression(); + if ($this->isError($result)) { + return $result; + } + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_LT) + { + $this->_advance(); + $result2 = $this->_expression(); + if ($this->isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgLT', $result, $result2); + } + elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_GT) +{ + $this->_advance(); + $result2 = $this->_expression(); + if ($this->isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgGT', $result, $result2); + } + elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_LE) +{ + $this->_advance(); + $result2 = $this->_expression(); + if ($this->isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgLE', $result, $result2); + } + elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_GE) +{ + $this->_advance(); + $result2 = $this->_expression(); + if ($this->isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgGE', $result, $result2); + } + elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_EQ) +{ + $this->_advance(); + $result2 = $this->_expression(); + if ($this->isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgEQ', $result, $result2); + } + elseif ($this->_current_token == SPREADSHEET_EXCEL_WRITER_NE) +{ + $this->_advance(); + $result2 = $this->_expression(); + if ($this->isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgNE', $result, $result2); + } + return $result; +} + +/** +* It parses a expression. It assumes the following rule: +* Expr -> Term [("+" | "-") Term] +* +* @access private +* @return mixed The parsed ptg'd tree +*/ +function _expression() + { + // If it's a string return a string node + if (preg_match("/^\"[^\"]{0,255}\"$/", $this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + $result = $this->_term(); + if ($this->isError($result)) { + return $result; + } + while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) or + ($this->_current_token == SPREADSHEET_EXCEL_WRITER_SUB)) + { + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_ADD) + +{ + $this->_advance(); + $result2 = $this->_term(); + if ($this->isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgAdd', $result, $result2); + } + else +{ + $this->_advance(); + $result2 = $this->_term(); + if ($this->isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgSub', $result, $result2); + } + } + return $result; +} + +/** +* This function just introduces a ptgParen element in the tree, so that Excel +* doesn't get confused when working with a parenthesized formula afterwards. +* +* @access private +* @see _fact() +* @return mixed The parsed ptg'd tree +*/ +function _parenthesizedExpression() + { + $result = $this->_createTree('ptgParen', $this->_expression(), ''); + return $result; +} + +/** +* It parses a term. It assumes the following rule: +* Term -> Fact [("*" | "/") Fact] +* +* @access private +* @return mixed The parsed ptg'd tree +*/ +function _term() + { + $result = $this->_fact(); + if ($this->isError($result)) { + return $result; + } + while (($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) or + ($this->_current_token == SPREADSHEET_EXCEL_WRITER_DIV)) { + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_MUL) + +{ + $this->_advance(); + $result2 = $this->_fact(); + if ($this->isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgMul', $result, $result2); + } + else +{ + $this->_advance(); + $result2 = $this->_fact(); + if ($this->isError($result2)) { + return $result2; + } + $result = $this->_createTree('ptgDiv', $result, $result2); + } + } + return $result; +} + +/** +* It parses a factor. It assumes the following rule: +* Fact -> ( Expr ) +* | CellRef +* | CellRange +* | Number +* | Function +* +* @access private +* @return mixed The parsed ptg'd tree +*/ +function _fact() + { + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_OPEN) + { + $this->_advance(); // eat the "(" + $result = $this->_parenthesizedExpression(); + if ($this->_current_token != SPREADSHEET_EXCEL_WRITER_CLOSE) { + trigger_error("')' token expected.",E_USER_ERROR); + } + $this->_advance(); // eat the ")" + return $result; + } + if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$this->_current_token)) + { + // if it's a reference + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + elseif (preg_match("/^[A-Za-z0-9_]+(\:[A-Za-z0-9_]+)?\![A-Ia-i]?[A-Za-z][0-9]+$/",$this->_current_token)) + { + // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1) + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + elseif (preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+:(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$this->_current_token) or + preg_match("/^(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+\.\.(\$)?[A-Ia-i]?[A-Za-z](\$)?[0-9]+$/",$this->_current_token)) + { + // if it's a range + $result = $this->_current_token; + $this->_advance(); + return $result; + } + elseif (preg_match("/^[A-Za-z0-9_]+(\:[A-Za-z0-9_]+)?\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/",$this->_current_token)) + { + // If it's an external range (Sheet1!A1:B2) + $result = $this->_current_token; + $this->_advance(); + return $result; + } + elseif (preg_match("/^'[A-Za-z0-9_ ]+(\:[A-Za-z0-9_ ]+)?'\!([A-Ia-i]?[A-Za-z])?[0-9]+:([A-Ia-i]?[A-Za-z])?[0-9]+$/",$this->_current_token)) + { + // If it's an external range ('Sheet1'!A1:B2) + $result = $this->_current_token; + $this->_advance(); + return $result; + } + elseif (is_numeric($this->_current_token)) + { + $result = $this->_createTree($this->_current_token, '', ''); + $this->_advance(); + return $result; + } + elseif (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/i",$this->_current_token)) + { + // if it's a function call + $result = $this->_func(); + return $result; + } + trigger_error("Sintactic error: ".$this->_current_token.", lookahead: ". + $this->_lookahead.", current char: ".$this->_current_char, E_USER_ERROR); +} + +/** +* It parses a function call. It assumes the following rule: +* Func -> ( Expr [,Expr]* ) +* +* @access private +*/ +function _func() + { + $num_args = 0; // number of arguments received + $function = $this->_current_token; + $this->_advance(); + $this->_advance(); // eat the "(" + while ($this->_current_token != ')') + { + if ($num_args > 0) + { + if ($this->_current_token == SPREADSHEET_EXCEL_WRITER_COMA || + $this->_current_token == SPREADSHEET_EXCEL_WRITER_SCOLON) { + $this->_advance(); // eat the "," + } + else { + trigger_error("Sintactic error: coma expected in ". + "function $function, {$num_args}?arg", E_USER_ERROR); + } + $result2 = $this->_condition(); + if ($this->isError($result2)) { + return $result2; + } + $result = $this->_createTree('arg', $result, $result2); + } + else { // first argument + $result2 = $this->_condition(); + if ($this->isError($result2)) { + return $result2; + } + $result = $this->_createTree('arg', '', $result2); + } + $num_args++; + } + $args = $this->_functions[$function][1]; + // If fixed number of args eg. TIME($i,$j,$k). Check that the number of args is valid. + if (($args >= 0) and ($args != $num_args)) { + trigger_error("Incorrect number of arguments in function $function() ",E_USER_ERROR); + } + + $result = $this->_createTree($function, $result, $num_args); + $this->_advance(); // eat the ")" + return $result; +} + +/** +* Creates a tree. In fact an array which may have one or two arrays (sub-trees) +* as elements. +* +* @access private +* @param mixed $value The value of this node. +* @param mixed $left The left array (sub-tree) or a final node. +* @param mixed $right The right array (sub-tree) or a final node. +*/ +function _createTree($value, $left, $right) + { + return(array('value' => $value, 'left' => $left, 'right' => $right)); +} + +/** +* Builds a string containing the tree in reverse polish notation (What you +* would use in a HP calculator stack). +* The following tree: +* +* + +* / \ +* 2 3 +* +* produces: "23+" +* +* The following tree: +* +* + +* / \ +* 3 * +* / \ +* 6 A1 +* +* produces: "36A1*+" +* +* In fact all operands, functions, references, etc... are written as ptg's +* +* @access public +* @param array $tree The optional tree to convert. +* @return string The tree in reverse polish notation +*/ +function toReversePolish($tree = array()) + { + $polish = ""; // the string we are going to return + if (empty($tree)) { // If it's the first call use _parse_tree + $tree = $this->_parse_tree; + } + if (is_array($tree['left'])) + { + $converted_tree = $this->toReversePolish($tree['left']); + if ($this->isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } + elseif ($tree['left'] != '') { // It's a final node + $converted_tree = $this->_convert($tree['left']); + if ($this->isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } + if (is_array($tree['right'])) + { + $converted_tree = $this->toReversePolish($tree['right']); + if ($this->isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } + elseif ($tree['right'] != '') { // It's a final node + $converted_tree = $this->_convert($tree['right']); + if ($this->isError($converted_tree)) { + return $converted_tree; + } + $polish .= $converted_tree; + } + // if it's a function convert it here (so we can set it's arguments) + if (preg_match("/^[A-Z0-9\xc0-\xdc\.]+$/",$tree['value']) and + !preg_match('/^([A-Ia-i]?[A-Za-z])(\d+)$/',$tree['value']) and + !preg_match("/^[A-Ia-i]?[A-Za-z](\d+)\.\.[A-Ia-i]?[A-Za-z](\d+)$/",$tree['value']) and + !is_numeric($tree['value']) and + !isset($this->ptg[$tree['value']])) + { + // left subtree for a function is always an array. + if ($tree['left'] != '') { + $left_tree = $this->toReversePolish($tree['left']); + } + else { + $left_tree = ''; + } + if ($this->isError($left_tree)) { + return $left_tree; + } + // add it's left subtree and return. + return $left_tree.$this->_convertFunction($tree['value'], $tree['right']); + } + else + { + $converted_tree = $this->_convert($tree['value']); + if ($this->isError($converted_tree)) { + return $converted_tree; + } + } + $polish .= $converted_tree; + return $polish; +} + +} + + +?> diff --git a/lib/Excel/php_writeexcel/class.writeexcel_olewriter.inc.php b/lib/Excel/php_writeexcel/class.writeexcel_olewriter.inc.php new file mode 100644 index 000000000..133a1b501 --- /dev/null +++ b/lib/Excel/php_writeexcel/class.writeexcel_olewriter.inc.php @@ -0,0 +1,353 @@ +_OLEfilename = $filename; + $this->_filehandle = false; + $this->_fileclosed = 0; + $this->_internal_fh = 0; + $this->_biff_only = 0; + $this->_size_allowed = 0; + $this->_biffsize = 0; + $this->_booksize = 0; + $this->_big_blocks = 0; + $this->_list_blocks = 0; + $this->_root_start = 0; + $this->_block_count = 4; + + $this->_initialize(); + } + + /* + * Check for a valid filename and store the filehandle. + */ + function _initialize() { + $OLEfile = $this->_OLEfilename; + + /* Check for a filename. Workbook.pm will catch this first. */ + if ($OLEfile == '') { + trigger_error("Filename required", E_USER_ERROR); + } + + /* + * If the filename is a resource it is assumed that it is a valid + * filehandle, if not we create a filehandle. + */ + if (is_resource($OLEfile)) { + $fh = $OLEfile; + } else { + // Create a new file, open for writing + $fh = fopen($OLEfile, "wb"); + // The workbook class also checks this but something may have + // happened since then. + if (!$fh) { + trigger_error("Can't open $OLEfile. It may be in use or ". + "protected", E_USER_ERROR); + } + + $this->_internal_fh = 1; + } + + // Store filehandle + $this->_filehandle = $fh; + } + + /* + * Set the size of the data to be written to the OLE stream + * + * $big_blocks = (109 depot block x (128 -1 marker word) + * - (1 x end words)) = 13842 + * $maxsize = $big_blocks * 512 bytes = 7087104 + */ + function set_size($size) { + $maxsize = 7087104; + + if ($size > $maxsize) { + trigger_error("Maximum file size, $maxsize, exceeded. To create ". + "files bigger than this limit please use the ". + "workbookbig class.", E_USER_ERROR); + return ($this->_size_allowed = 0); + } + + $this->_biffsize = $size; + + // Set the min file size to 4k to avoid having to use small blocks + if ($size > 4096) { + $this->_booksize = $size; + } else { + $this->_booksize = 4096; + } + + return ($this->_size_allowed = 1); + } + + /* + * Calculate various sizes needed for the OLE stream + */ + function _calculate_sizes() { + $datasize = $this->_booksize; + + if ($datasize % 512 == 0) { + $this->_big_blocks = $datasize/512; + } else { + $this->_big_blocks = floor($datasize/512)+1; + } + // There are 127 list blocks and 1 marker blocks for each big block + // depot + 1 end of chain block + $this->_list_blocks = floor(($this->_big_blocks)/127)+1; + $this->_root_start = $this->_big_blocks; + + //print $this->_biffsize. "\n"; + //print $this->_big_blocks. "\n"; + //print $this->_list_blocks. "\n"; + } + + /* + * Write root entry, big block list and close the filehandle. + * This method must be called so that the file contents are + * actually written. + */ + function close() { + + if (!$this->_size_allowed) { + return; + } + + if (!$this->_biff_only) { + $this->_write_padding(); + $this->_write_property_storage(); + $this->_write_big_block_depot(); + } + + // Close the filehandle if it was created internally. + if ($this->_internal_fh) { + fclose($this->_filehandle); + } +/* ABR */ + if ($this->_OLEtmpfilename != '') { + $fh = fopen($this->_OLEtmpfilename, "rb"); + if ($fh == false) { + trigger_error("Can't read temporary file.", E_USER_ERROR); + } + fpassthru($fh); + fclose($fh); + unlink($this->_OLEtmpfilename); + }; + + $this->_fileclosed = 1; + } + + /* + * Write BIFF data to OLE file. + */ + function write($data) { + fputs($this->_filehandle, $data); + } + + /* + * Write OLE header block. + */ + function write_header() { + if ($this->_biff_only) { + return; + } + + $this->_calculate_sizes(); + + $root_start = $this->_root_start; + $num_lists = $this->_list_blocks; + + $id = pack("C8", 0xD0, 0xCF, 0x11, 0xE0, + 0xA1, 0xB1, 0x1A, 0xE1); + $unknown1 = pack("VVVV", 0x00, 0x00, 0x00, 0x00); + $unknown2 = pack("vv", 0x3E, 0x03); + $unknown3 = pack("v", -2); + $unknown4 = pack("v", 0x09); + $unknown5 = pack("VVV", 0x06, 0x00, 0x00); + $num_bbd_blocks = pack("V", $num_lists); + $root_startblock = pack("V", $root_start); + $unknown6 = pack("VV", 0x00, 0x1000); + $sbd_startblock = pack("V", -2); + $unknown7 = pack("VVV", 0x00, -2 ,0x00); + $unused = pack("V", -1); + + fputs($this->_filehandle, $id); + fputs($this->_filehandle, $unknown1); + fputs($this->_filehandle, $unknown2); + fputs($this->_filehandle, $unknown3); + fputs($this->_filehandle, $unknown4); + fputs($this->_filehandle, $unknown5); + fputs($this->_filehandle, $num_bbd_blocks); + fputs($this->_filehandle, $root_startblock); + fputs($this->_filehandle, $unknown6); + fputs($this->_filehandle, $sbd_startblock); + fputs($this->_filehandle, $unknown7); + + for ($c=1;$c<=$num_lists;$c++) { + $root_start++; + fputs($this->_filehandle, pack("V", $root_start)); + } + + for ($c=$num_lists;$c<=108;$c++) { + fputs($this->_filehandle, $unused); + } + } + + /* + * Write big block depot. + */ + function _write_big_block_depot() { + $num_blocks = $this->_big_blocks; + $num_lists = $this->_list_blocks; + $total_blocks = $num_lists * 128; + $used_blocks = $num_blocks + $num_lists + 2; + + $marker = pack("V", -3); + $end_of_chain = pack("V", -2); + $unused = pack("V", -1); + + for ($i=1;$i<=($num_blocks-1);$i++) { + fputs($this->_filehandle, pack("V", $i)); + } + + fputs($this->_filehandle, $end_of_chain); + fputs($this->_filehandle, $end_of_chain); + + for ($c=1;$c<=$num_lists;$c++) { + fputs($this->_filehandle, $marker); + } + + for ($c=$used_blocks;$c<=$total_blocks;$c++) { + fputs($this->_filehandle, $unused); + } + } + + /* + * Write property storage. TODO: add summary sheets + */ + function _write_property_storage() { + $rootsize = -2; + $booksize = $this->_booksize; + + // name type dir start size + $this->_write_pps('Root Entry', 0x05, 1, -2, 0x00); + $this->_write_pps('Book', 0x02, -1, 0x00, $booksize); + $this->_write_pps('', 0x00, -1, 0x00, 0x0000); + $this->_write_pps('', 0x00, -1, 0x00, 0x0000); + } + + /* + * Write property sheet in property storage + */ + function _write_pps($name, $type, $dir, $start, $size) { + $names = array(); + $length = 0; + + if ($name != '') { + $name = $name . "\0"; + // Simulate a Unicode string + $chars=preg_split("''", $name, -1, PREG_SPLIT_NO_EMPTY); + foreach ($chars as $char) { + array_push($names, ord($char)); + } + $length = strlen($name) * 2; + } + + $rawname = call_user_func_array('pack', array_merge(array("v*"), $names)); + $zero = pack("C", 0); + + $pps_sizeofname = pack("v", $length); //0x40 + $pps_type = pack("v", $type); //0x42 + $pps_prev = pack("V", -1); //0x44 + $pps_next = pack("V", -1); //0x48 + $pps_dir = pack("V", $dir); //0x4c + + $unknown1 = pack("V", 0); + + $pps_ts1s = pack("V", 0); //0x64 + $pps_ts1d = pack("V", 0); //0x68 + $pps_ts2s = pack("V", 0); //0x6c + $pps_ts2d = pack("V", 0); //0x70 + $pps_sb = pack("V", $start); //0x74 + $pps_size = pack("V", $size); //0x78 + + fputs($this->_filehandle, $rawname); + fputs($this->_filehandle, str_repeat($zero, (64-$length))); + fputs($this->_filehandle, $pps_sizeofname); + fputs($this->_filehandle, $pps_type); + fputs($this->_filehandle, $pps_prev); + fputs($this->_filehandle, $pps_next); + fputs($this->_filehandle, $pps_dir); + fputs($this->_filehandle, str_repeat($unknown1, 5)); + fputs($this->_filehandle, $pps_ts1s); + fputs($this->_filehandle, $pps_ts1d); + fputs($this->_filehandle, $pps_ts2d); + fputs($this->_filehandle, $pps_ts2d); + fputs($this->_filehandle, $pps_sb); + fputs($this->_filehandle, $pps_size); + fputs($this->_filehandle, $unknown1); + } + + /* + * Pad the end of the file + */ + function _write_padding() { + $biffsize = $this->_biffsize; + + if ($biffsize < 4096) { + $min_size = 4096; + } else { + $min_size = 512; + } + + if ($biffsize % $min_size != 0) { + $padding = $min_size - ($biffsize % $min_size); + fputs($this->_filehandle, str_repeat("\0", $padding)); + } + } + +} + +?> diff --git a/lib/Excel/php_writeexcel/class.writeexcel_workbook.inc.php b/lib/Excel/php_writeexcel/class.writeexcel_workbook.inc.php new file mode 100644 index 000000000..11c7c0e2b --- /dev/null +++ b/lib/Excel/php_writeexcel/class.writeexcel_workbook.inc.php @@ -0,0 +1,1149 @@ +writeexcel_biffwriter(); + + $tmp_format = new writeexcel_format(); + $byte_order = $this->_byte_order; + $parser = new writeexcel_formula($byte_order); + + $this->_filename = $filename; + $this->_parser = $parser; +//? $this->_tempdir = undef; + $this->_1904 = 0; + $this->_activesheet = 0; + $this->_firstsheet = 0; + $this->_selected = 0; + $this->_xf_index = 16; # 15 style XF's and 1 cell XF. + $this->_fileclosed = 0; + $this->_biffsize = 0; + $this->_sheetname = "Sheet"; + $this->_tmp_format = $tmp_format; + $this->_url_format = false; + $this->_codepage = 0x04E4; + $this->_worksheets = array(); + $this->_sheetnames = array(); + $this->_formats = array(); + $this->_palette = array(); + + # Add the default format for hyperlinks + $this->_url_format =& $this->addformat(array('color' => 'blue', 'underline' => 1)); + + # Check for a filename + if ($this->_filename == '') { +//todo: print error + return; + } + + # Try to open the named file and see if it throws any errors. + # If the filename is a reference it is assumed that it is a valid + # filehandle and ignore + # +//todo + + # Set colour palette. + $this->set_palette_xl97(); +} + +############################################################################### +# +# close() +# +# Calls finalization methods and explicitly close the OLEwriter file +# handle. +# +function close() { + # Prevent close() from being called twice. + if ($this->_fileclosed) { + return; + } + + $this->_store_workbook(); + $this->_fileclosed = 1; +} + +//PHPport: method DESTROY deleted + +############################################################################### +# +# sheets() +# +# An accessor for the _worksheets[] array +# +# Returns: a list of the worksheet objects in a workbook +# +function &sheets() { + return $this->_worksheets; +} + +//PHPport: method worksheets deleted: +# This method is now deprecated. Use the sheets() method instead. + +############################################################################### +# +# addworksheet($name) +# +# Add a new worksheet to the Excel workbook. +# TODO: Add accessor for $self->{_sheetname} for international Excel versions. +# +# Returns: reference to a worksheet object +# +function &addworksheet($name="") { + + # Check that sheetname is <= 31 chars (Excel limit). + if (strlen($name) > 31) { + trigger_error("Sheetname $name must be <= 31 chars", E_USER_ERROR); + } + + $index = sizeof($this->_worksheets); + $sheetname = $this->_sheetname; + + if ($name == "") { + $name = $sheetname . ($index+1); + } + + # Check that the worksheet name doesn't already exist: a fatal Excel error. + foreach ($this->_worksheets as $tmp) { + if ($name == $tmp->get_name()) { + trigger_error("Worksheet '$name' already exists", E_USER_ERROR); + } + } + + $worksheet = new writeexcel_worksheet($name, $index, $this->_activesheet, + $this->_firstsheet, + $this->_url_format, $this->_parser, + $this->_tempdir); + + $this->_worksheets[$index] = &$worksheet; # Store ref for iterator + $this->_sheetnames[$index] = $name; # Store EXTERNSHEET names + $this->_parser->set_ext_sheet($name, $index); # Store names in Formula.pm + return $worksheet; +} + +############################################################################### +# +# addformat(%properties) +# +# Add a new format to the Excel workbook. This adds an XF record and +# a FONT record. Also, pass any properties to the Format::new(). +# +function &addformat($para=false) { + if($para===false) { + $format = new writeexcel_format($this->_xf_index); + } else { + $format = new writeexcel_format($this->_xf_index, $para); + } + + $this->_xf_index += 1; + # Store format reference + $this->_formats[]=&$format; + + return $format; +} + +############################################################################### +# +# set_1904() +# +# Set the date system: 0 = 1900 (the default), 1 = 1904 +# +function set_1904($_1904) { + $this->_1904 = $_1904; +} + +############################################################################### +# +# get_1904() +# +# Return the date system: 0 = 1900, 1 = 1904 +# +function get_1904() { + return $this->_1904; +} + +############################################################################### +# +# set_custom_color() +# +# Change the RGB components of the elements in the colour palette. +# +function set_custom_color($index, $red, $green, $blue) { +// todo +/* + # Match a HTML #xxyyzz style parameter + if (defined $_[1] and $_[1] =~ /^#(\w\w)(\w\w)(\w\w)/ ) { + @_ = ($_[0], hex $1, hex $2, hex $3); + } +*/ + + $aref = &$this->_palette; + + # Check that the colour index is the right range + if ($index < 8 or $index > 64) { +//todo carp "Color index $index outside range: 8 <= index <= 64"; + return; + } + + # Check that the colour components are in the right range + if ( ($red < 0 || $red > 255) || + ($green < 0 || $green > 255) || + ($blue < 0 || $blue > 255) ) + { +//todo carp "Color component outside range: 0 <= color <= 255"; + return; + } + + $index -=8; # Adjust colour index (wingless dragonfly) + + # Set the RGB value + $aref[$index] = array($red, $green, $blue, 0); + + return $index +8; +} + +############################################################################### +# +# set_palette_xl97() +# +# Sets the colour palette to the Excel 97+ default. +# +function set_palette_xl97() { + $this->_palette = array( + array(0x00, 0x00, 0x00, 0x00), # 8 + array(0xff, 0xff, 0xff, 0x00), # 9 + array(0xff, 0x00, 0x00, 0x00), # 10 + array(0x00, 0xff, 0x00, 0x00), # 11 + array(0x00, 0x00, 0xff, 0x00), # 12 + array(0xff, 0xff, 0x00, 0x00), # 13 + array(0xff, 0x00, 0xff, 0x00), # 14 + array(0x00, 0xff, 0xff, 0x00), # 15 + array(0x80, 0x00, 0x00, 0x00), # 16 + array(0x00, 0x80, 0x00, 0x00), # 17 + array(0x00, 0x00, 0x80, 0x00), # 18 + array(0x80, 0x80, 0x00, 0x00), # 19 + array(0x80, 0x00, 0x80, 0x00), # 20 + array(0x00, 0x80, 0x80, 0x00), # 21 + array(0xc0, 0xc0, 0xc0, 0x00), # 22 + array(0x80, 0x80, 0x80, 0x00), # 23 + array(0x99, 0x99, 0xff, 0x00), # 24 + array(0x99, 0x33, 0x66, 0x00), # 25 + array(0xff, 0xff, 0xcc, 0x00), # 26 + array(0xcc, 0xff, 0xff, 0x00), # 27 + array(0x66, 0x00, 0x66, 0x00), # 28 + array(0xff, 0x80, 0x80, 0x00), # 29 + array(0x00, 0x66, 0xcc, 0x00), # 30 + array(0xcc, 0xcc, 0xff, 0x00), # 31 + array(0x00, 0x00, 0x80, 0x00), # 32 + array(0xff, 0x00, 0xff, 0x00), # 33 + array(0xff, 0xff, 0x00, 0x00), # 34 + array(0x00, 0xff, 0xff, 0x00), # 35 + array(0x80, 0x00, 0x80, 0x00), # 36 + array(0x80, 0x00, 0x00, 0x00), # 37 + array(0x00, 0x80, 0x80, 0x00), # 38 + array(0x00, 0x00, 0xff, 0x00), # 39 + array(0x00, 0xcc, 0xff, 0x00), # 40 + array(0xcc, 0xff, 0xff, 0x00), # 41 + array(0xcc, 0xff, 0xcc, 0x00), # 42 + array(0xff, 0xff, 0x99, 0x00), # 43 + array(0x99, 0xcc, 0xff, 0x00), # 44 + array(0xff, 0x99, 0xcc, 0x00), # 45 + array(0xcc, 0x99, 0xff, 0x00), # 46 + array(0xff, 0xcc, 0x99, 0x00), # 47 + array(0x33, 0x66, 0xff, 0x00), # 48 + array(0x33, 0xcc, 0xcc, 0x00), # 49 + array(0x99, 0xcc, 0x00, 0x00), # 50 + array(0xff, 0xcc, 0x00, 0x00), # 51 + array(0xff, 0x99, 0x00, 0x00), # 52 + array(0xff, 0x66, 0x00, 0x00), # 53 + array(0x66, 0x66, 0x99, 0x00), # 54 + array(0x96, 0x96, 0x96, 0x00), # 55 + array(0x00, 0x33, 0x66, 0x00), # 56 + array(0x33, 0x99, 0x66, 0x00), # 57 + array(0x00, 0x33, 0x00, 0x00), # 58 + array(0x33, 0x33, 0x00, 0x00), # 59 + array(0x99, 0x33, 0x00, 0x00), # 60 + array(0x99, 0x33, 0x66, 0x00), # 61 + array(0x33, 0x33, 0x99, 0x00), # 62 + array(0x33, 0x33, 0x33, 0x00), # 63 + ); + + return 0; +} + +############################################################################### +# +# set_palette_xl5() +# +# Sets the colour palette to the Excel 5 default. +# +function set_palette_xl5() { + $this->_palette = array( + array(0x00, 0x00, 0x00, 0x00), # 8 + array(0xff, 0xff, 0xff, 0x00), # 9 + array(0xff, 0x00, 0x00, 0x00), # 10 + array(0x00, 0xff, 0x00, 0x00), # 11 + array(0x00, 0x00, 0xff, 0x00), # 12 + array(0xff, 0xff, 0x00, 0x00), # 13 + array(0xff, 0x00, 0xff, 0x00), # 14 + array(0x00, 0xff, 0xff, 0x00), # 15 + array(0x80, 0x00, 0x00, 0x00), # 16 + array(0x00, 0x80, 0x00, 0x00), # 17 + array(0x00, 0x00, 0x80, 0x00), # 18 + array(0x80, 0x80, 0x00, 0x00), # 19 + array(0x80, 0x00, 0x80, 0x00), # 20 + array(0x00, 0x80, 0x80, 0x00), # 21 + array(0xc0, 0xc0, 0xc0, 0x00), # 22 + array(0x80, 0x80, 0x80, 0x00), # 23 + array(0x80, 0x80, 0xff, 0x00), # 24 + array(0x80, 0x20, 0x60, 0x00), # 25 + array(0xff, 0xff, 0xc0, 0x00), # 26 + array(0xa0, 0xe0, 0xe0, 0x00), # 27 + array(0x60, 0x00, 0x80, 0x00), # 28 + array(0xff, 0x80, 0x80, 0x00), # 29 + array(0x00, 0x80, 0xc0, 0x00), # 30 + array(0xc0, 0xc0, 0xff, 0x00), # 31 + array(0x00, 0x00, 0x80, 0x00), # 32 + array(0xff, 0x00, 0xff, 0x00), # 33 + array(0xff, 0xff, 0x00, 0x00), # 34 + array(0x00, 0xff, 0xff, 0x00), # 35 + array(0x80, 0x00, 0x80, 0x00), # 36 + array(0x80, 0x00, 0x00, 0x00), # 37 + array(0x00, 0x80, 0x80, 0x00), # 38 + array(0x00, 0x00, 0xff, 0x00), # 39 + array(0x00, 0xcf, 0xff, 0x00), # 40 + array(0x69, 0xff, 0xff, 0x00), # 41 + array(0xe0, 0xff, 0xe0, 0x00), # 42 + array(0xff, 0xff, 0x80, 0x00), # 43 + array(0xa6, 0xca, 0xf0, 0x00), # 44 + array(0xdd, 0x9c, 0xb3, 0x00), # 45 + array(0xb3, 0x8f, 0xee, 0x00), # 46 + array(0xe3, 0xe3, 0xe3, 0x00), # 47 + array(0x2a, 0x6f, 0xf9, 0x00), # 48 + array(0x3f, 0xb8, 0xcd, 0x00), # 49 + array(0x48, 0x84, 0x36, 0x00), # 50 + array(0x95, 0x8c, 0x41, 0x00), # 51 + array(0x8e, 0x5e, 0x42, 0x00), # 52 + array(0xa0, 0x62, 0x7a, 0x00), # 53 + array(0x62, 0x4f, 0xac, 0x00), # 54 + array(0x96, 0x96, 0x96, 0x00), # 55 + array(0x1d, 0x2f, 0xbe, 0x00), # 56 + array(0x28, 0x66, 0x76, 0x00), # 57 + array(0x00, 0x45, 0x00, 0x00), # 58 + array(0x45, 0x3e, 0x01, 0x00), # 59 + array(0x6a, 0x28, 0x13, 0x00), # 60 + array(0x85, 0x39, 0x6a, 0x00), # 61 + array(0x4a, 0x32, 0x85, 0x00), # 62 + array(0x42, 0x42, 0x42, 0x00), # 63 + ); + + return 0; +} + +############################################################################### +# +# set_tempdir() +# +# Change the default temp directory used by _initialize() in Worksheet.pm. +# +function set_tempdir($tempdir) { +//todo +/* + croak "$_[0] is not a valid directory" unless -d $_[0]; + croak "set_tempdir must be called before addworksheet" if $self->sheets(); +*/ + + $this->_tempdir = $tempdir; +} + +############################################################################### +# +# set_codepage() +# +# See also the _store_codepage method. This is used to store the code page, i.e. +# the character set used in the workbook. +# +function set_codepage($cp) { + + if($cp==1) + $codepage = 0x04E4; + else if($cp==2) + $codepage = 0x8000; + if($codepage) + $this->_codepage = $codepage; +} + + +############################################################################### +# +# _store_workbook() +# +# Assemble worksheets into a workbook and send the BIFF data to an OLE +# storage. +# +function _store_workbook() { + + # Ensure that at least one worksheet has been selected. + if ($this->_activesheet == 0) { + $this->_worksheets[0]->_selected = 1; + } + + # Calculate the number of selected worksheet tabs and call the finalization + # methods for each worksheet + for ($c=0;$c_worksheets);$c++) { + $sheet=&$this->_worksheets[$c]; + if ($sheet->_selected) { + $this->_selected++; + } + $sheet->_close($this->_sheetnames); + } + + # Add Workbook globals + $this->_store_bof(0x0005); + + $this->_store_externs(); # For print area and repeat rows + + $this->_store_names(); # For print area and repeat rows + + $this->_store_codepage(); + + $this->_store_window1(); + + $this->_store_1904(); + + $this->_store_all_fonts(); + + $this->_store_all_num_formats(); + + $this->_store_all_xfs(); + + $this->_store_all_styles(); + + $this->_store_palette(); + + $this->_calc_sheet_offsets(); + + # Add BOUNDSHEET records + for ($c=0;$c_worksheets);$c++) { + $sheet=&$this->_worksheets[$c]; + $this->_store_boundsheet($sheet->_name, $sheet->_offset); + } + + # End Workbook globals + $this->_store_eof(); + + # Store the workbook in an OLE container + $this->_store_OLE_file(); +} + +############################################################################### +# +# _store_OLE_file() +# +# Store the workbook in an OLE container if the total size of the workbook data +# is less than ~ 7MB. +# +function _store_OLE_file() { +## ABR + if ($this->_tmpfilename != '') { + $OLE = new writeexcel_olewriter('/tmp/'.$this->_tmpfilename); + $OLE->_OLEtmpfilename = '/tmp/'.$this->_tmpfilename; + } else { + $OLE = new writeexcel_olewriter($this->_filename); + $OLE->_OLEtmpfilename = ''; + }; +## END ABR + + # Write Worksheet data if data <~ 7MB + if ($OLE->set_size($this->_biffsize)) { + $OLE->write_header(); + $OLE->write($this->_data); + + for ($c=0;$c_worksheets);$c++) { + $sheet=&$this->_worksheets[$c]; + while ($tmp = $sheet->get_data()) { + $OLE->write($tmp); + } + $sheet->cleanup(); + } + } + + $OLE->close(); +} + +############################################################################### +# +# _calc_sheet_offsets() +# +# Calculate offsets for Worksheet BOF records. +# +function _calc_sheet_offsets() { + + $BOF = 11; + $EOF = 4; + $offset = $this->_datasize; + + foreach ($this->_worksheets as $sheet) { + $offset += $BOF + strlen($sheet->_name); + } + + $offset += $EOF; + + for ($c=0;$c_worksheets);$c++) { + $sheet=&$this->_worksheets[$c]; + $sheet->_offset = $offset; + $offset += $sheet->_datasize; + } + + $this->_biffsize = $offset; +} + +############################################################################### +# +# _store_all_fonts() +# +# Store the Excel FONT records. +# +function _store_all_fonts() { + # _tmp_format is added by new(). We use this to write the default XF's + $format = $this->_tmp_format; + $font = $format->get_font(); + + # Note: Fonts are 0-indexed. According to the SDK there is no index 4, + # so the following fonts are 0, 1, 2, 3, 5 + # + for ($c=0;$c<5;$c++) { + $this->_append($font); + } + + # Iterate through the XF objects and write a FONT record if it isn't the + # same as the default FONT and if it hasn't already been used. + # + $index = 6; # The first user defined FONT + + $key = $format->get_font_key(); # The default font from _tmp_format + $fonts[$key] = 0; # Index of the default font + + for ($c=0;$c_formats);$c++) { + $format=&$this->_formats[$c]; + + $key = $format->get_font_key(); + + if (isset($fonts[$key])) { + # FONT has already been used + $format->_font_index = $fonts[$key]; + } else { + # Add a new FONT record + $fonts[$key] = $index; + $format->_font_index = $index; + $index++; + $font = $format->get_font(); + $this->_append($font); + } + } +} + +############################################################################### +# +# _store_all_num_formats() +# +# Store user defined numerical formats i.e. FORMAT records +# +function _store_all_num_formats() { + + # Leaning num_format syndrome + $num_formats_list=array(); + $index = 164; + + # Iterate through the XF objects and write a FORMAT record if it isn't a + # built-in format type and if the FORMAT string hasn't already been used. + # + + for ($c=0;$c_formats);$c++) { + $format=&$this->_formats[$c]; + + $num_format = $format->_num_format; + + # Check if $num_format is an index to a built-in format. + # Also check for a string of zeros, which is a valid format string + # but would evaluate to zero. + # + if (!preg_match('/^0+\d/', $num_format)) { + if (preg_match('/^\d+$/', $num_format)) { + # built-in + continue; + } + } + + if (isset($num_formats[$num_format])) { + # FORMAT has already been used + $format->_num_format = $num_formats[$num_format]; + } else { + # Add a new FORMAT + $num_formats[$num_format] = $index; + $format->_num_format = $index; + array_push($num_formats_list, $num_format); + $index++; + } + } + + # Write the new FORMAT records starting from 0xA4 + $index = 164; + foreach ($num_formats_list as $num_format) { + $this->_store_num_format($num_format, $index); + $index++; + } +} + +############################################################################### +# +# _store_all_xfs() +# +# Write all XF records. +# +function _store_all_xfs() { + # _tmp_format is added by new(). We use this to write the default XF's + # The default font index is 0 + # + $format = $this->_tmp_format; + $xf; + + for ($c=0;$c<15;$c++) { + $xf = $format->get_xf('style'); # Style XF + $this->_append($xf); + } + + $xf = $format->get_xf('cell'); # Cell XF + $this->_append($xf); + + # User defined XFs + foreach ($this->_formats as $format) { + $xf = $format->get_xf('cell'); + $this->_append($xf); + } +} + +############################################################################### +# +# _store_all_styles() +# +# Write all STYLE records. +# +function _store_all_styles() { + $this->_store_style(); +} + +############################################################################### +# +# _store_externs() +# +# Write the EXTERNCOUNT and EXTERNSHEET records. These are used as indexes for +# the NAME records. +# +function _store_externs() { + + # Create EXTERNCOUNT with number of worksheets + $this->_store_externcount(sizeof($this->_worksheets)); + + # Create EXTERNSHEET for each worksheet + foreach ($this->_sheetnames as $sheetname) { + $this->_store_externsheet($sheetname); + } +} + +############################################################################### +# +# _store_names() +# +# Write the NAME record to define the print area and the repeat rows and cols. +# +function _store_names() { + + # Create the print area NAME records + foreach ($this->_worksheets as $worksheet) { + # Write a Name record if the print area has been defined + if ($worksheet->_print_rowmin!==false) { + $this->_store_name_short( + $worksheet->_index, + 0x06, # NAME type + $worksheet->_print_rowmin, + $worksheet->_print_rowmax, + $worksheet->_print_colmin, + $worksheet->_print_colmax + ); + } + } + + # Create the print title NAME records + foreach ($this->_worksheets as $worksheet) { + + $rowmin = $worksheet->_title_rowmin; + $rowmax = $worksheet->_title_rowmax; + $colmin = $worksheet->_title_colmin; + $colmax = $worksheet->_title_colmax; + + # Determine if row + col, row, col or nothing has been defined + # and write the appropriate record + # + if ($rowmin!==false && $colmin!==false) { + # Row and column titles have been defined. + # Row title has been defined. + $this->_store_name_long( + $worksheet->_index, + 0x07, # NAME type + $rowmin, + $rowmax, + $colmin, + $colmax + ); + } elseif ($rowmin!==false) { + # Row title has been defined. + $this->_store_name_short( + $worksheet->_index, + 0x07, # NAME type + $rowmin, + $rowmax, + 0x00, + 0xff + ); + } elseif ($colmin!==false) { + # Column title has been defined. + $this->_store_name_short( + $worksheet->_index, + 0x07, # NAME type + 0x0000, + 0x3fff, + $colmin, + $colmax + ); + } else { + # Print title hasn't been defined. + } + } +} + +############################################################################### +############################################################################### +# +# BIFF RECORDS +# + +############################################################################### +# +# _store_window1() +# +# Write Excel BIFF WINDOW1 record. +# +function _store_window1() { + + $record = 0x003D; # Record identifier + $length = 0x0012; # Number of bytes to follow + + $xWn = 0x0000; # Horizontal position of window + $yWn = 0x0000; # Vertical position of window + $dxWn = 0x25BC; # Width of window + $dyWn = 0x1572; # Height of window + + $grbit = 0x0038; # Option flags + $ctabsel = $this->_selected; # Number of workbook tabs selected + $wTabRatio = 0x0258; # Tab to scrollbar ratio + + $itabFirst = $this->_firstsheet; # 1st displayed worksheet + $itabCur = $this->_activesheet; # Active worksheet + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvvv", $xWn, $yWn, $dxWn, $dyWn, + $grbit, + $itabCur, $itabFirst, + $ctabsel, $wTabRatio); + + $this->_append($header . $data); +} + +############################################################################### +# +# _store_boundsheet() +# +# Writes Excel BIFF BOUNDSHEET record. +# +function _store_boundsheet($sheetname, $offset) { + $record = 0x0085; # Record identifier + $length = 0x07 + strlen($sheetname); # Number of bytes to follow + + //$sheetname = $_[0]; # Worksheet name + //$offset = $_[1]; # Location of worksheet BOF + $grbit = 0x0000; # Sheet identifier + $cch = strlen($sheetname); # Length of sheet name + + $header = pack("vv", $record, $length); + $data = pack("VvC", $offset, $grbit, $cch); + + $this->_append($header . $data . $sheetname); +} + +############################################################################### +# +# _store_style() +# +# Write Excel BIFF STYLE records. +# +function _store_style() { + $record = 0x0293; # Record identifier + $length = 0x0004; # Bytes to follow + + $ixfe = 0x8000; # Index to style XF + $BuiltIn = 0x00; # Built-in style + $iLevel = 0xff; # Outline style level + + $header = pack("vv", $record, $length); + $data = pack("vCC", $ixfe, $BuiltIn, $iLevel); + + $this->_append($header . $data); +} + +############################################################################### +# +# _store_num_format() +# +# Writes Excel FORMAT record for non "built-in" numerical formats. +# +function _store_num_format($num_format, $index) { + $record = 0x041E; # Record identifier + $length = 0x03 + strlen($num_format); # Number of bytes to follow + + $format = $num_format; # Custom format string + $ifmt = $index; # Format index code + $cch = strlen($format); # Length of format string + + $header = pack("vv", $record, $length); + $data = pack("vC", $ifmt, $cch); + + $this->_append($header . $data . $format); +} + +############################################################################### +# +# _store_1904() +# +# Write Excel 1904 record to indicate the date system in use. +# +function _store_1904() { + $record = 0x0022; # Record identifier + $length = 0x0002; # Bytes to follow + + $f1904 = $this->_1904; # Flag for 1904 date system + + $header = pack("vv", $record, $length); + $data = pack("v", $f1904); + + $this->_append($header . $data); +} + +############################################################################### +# +# _store_externcount($count) +# +# Write BIFF record EXTERNCOUNT to indicate the number of external sheet +# references in the workbook. +# +# Excel only stores references to external sheets that are used in NAME. +# The workbook NAME record is required to define the print area and the repeat +# rows and columns. +# +# A similar method is used in Worksheet.pm for a slightly different purpose. +# +function _store_externcount($par0) { + $record = 0x0016; # Record identifier + $length = 0x0002; # Number of bytes to follow + + $cxals = $par0; # Number of external references + + $header = pack("vv", $record, $length); + $data = pack("v", $cxals); + + $this->_append($header . $data); +} + +############################################################################### +# +# _store_externsheet($sheetname) +# +# +# Writes the Excel BIFF EXTERNSHEET record. These references are used by +# formulas. NAME record is required to define the print area and the repeat +# rows and columns. +# +# A similar method is used in Worksheet.pm for a slightly different purpose. +# +function _store_externsheet($par0) { + $record = 0x0017; # Record identifier + $length = 0x02 + strlen($par0); # Number of bytes to follow + + $sheetname = $par0; # Worksheet name + $cch = strlen($sheetname); # Length of sheet name + $rgch = 0x03; # Filename encoding + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + + $this->_append($header . $data . $sheetname); +} + +############################################################################### +# +# _store_name_short() +# +# +# Store the NAME record in the short format that is used for storing the print +# area, repeat rows only and repeat columns only. +# +function _store_name_short($par0, $par1, $par2, $par3, $par4, $par5) { + $record = 0x0018; # Record identifier + $length = 0x0024; # Number of bytes to follow + + $index = $par0; # Sheet index + $type = $par1; + + $grbit = 0x0020; # Option flags + $chKey = 0x00; # Keyboard shortcut + $cch = 0x01; # Length of text name + $cce = 0x0015; # Length of text definition + $ixals = $index +1; # Sheet index + $itab = $ixals; # Equal to ixals + $cchCustMenu = 0x00; # Length of cust menu text + $cchDescription = 0x00; # Length of description text + $cchHelptopic = 0x00; # Length of help topic text + $cchStatustext = 0x00; # Length of status bar text + $rgch = $type; # Built-in name type + + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8005; + + $rowmin = $par2; # Start row + $rowmax = $par3; # End row + $colmin = $par4; # Start column + $colmax = $par5; # end column + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + + $this->_append($header . $data); +} + +############################################################################### +# +# _store_name_long() +# +# +# Store the NAME record in the long format that is used for storing the repeat +# rows and columns when both are specified. This share a lot of code with +# _store_name_short() but we use a separate method to keep the code clean. +# Code abstraction for reuse can be carried too far, and I should know. ;-) +# +function _store_name_long($par0, $par1, $par2, $par3, $par4, $par5) { + $record = 0x0018; # Record identifier + $length = 0x003d; # Number of bytes to follow + + $index = $par0; # Sheet index + $type = $par1; + + $grbit = 0x0020; # Option flags + $chKey = 0x00; # Keyboard shortcut + $cch = 0x01; # Length of text name + $cce = 0x002e; # Length of text definition + $ixals = $index +1; # Sheet index + $itab = $ixals; # Equal to ixals + $cchCustMenu = 0x00; # Length of cust menu text + $cchDescription = 0x00; # Length of description text + $cchHelptopic = 0x00; # Length of help topic text + $cchStatustext = 0x00; # Length of status bar text + $rgch = $type; # Built-in name type + + $unknown01 = 0x29; + $unknown02 = 0x002b; + $unknown03 = 0x3b; + $unknown04 = 0xffff-$index; + $unknown05 = 0x0000; + $unknown06 = 0x0000; + $unknown07 = 0x1087; + $unknown08 = 0x8008; + + $rowmin = $par2; # Start row + $rowmax = $par3; # End row + $colmin = $par4; # Start column + $colmax = $par5; # end column + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + $data .= pack("C", $chKey); + $data .= pack("C", $cch); + $data .= pack("v", $cce); + $data .= pack("v", $ixals); + $data .= pack("v", $itab); + $data .= pack("C", $cchCustMenu); + $data .= pack("C", $cchDescription); + $data .= pack("C", $cchHelptopic); + $data .= pack("C", $cchStatustext); + $data .= pack("C", $rgch); + $data .= pack("C", $unknown01); + $data .= pack("v", $unknown02); + # Column definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", 0x0000); + $data .= pack("v", 0x3fff); + $data .= pack("C", $colmin); + $data .= pack("C", $colmax); + # Row definition + $data .= pack("C", $unknown03); + $data .= pack("v", $unknown04); + $data .= pack("v", $unknown05); + $data .= pack("v", $unknown06); + $data .= pack("v", $unknown07); + $data .= pack("v", $unknown08); + $data .= pack("v", $index); + $data .= pack("v", $index); + $data .= pack("v", $rowmin); + $data .= pack("v", $rowmax); + $data .= pack("C", 0x00); + $data .= pack("C", 0xff); + # End of data + $data .= pack("C", 0x10); + + $this->_append($header . $data); +} + +############################################################################### +# +# _store_palette() +# +# Stores the PALETTE biff record. +# +function _store_palette() { + $aref = &$this->_palette; + + $record = 0x0092; # Record identifier + $length = 2 + 4 * sizeof($aref); # Number of bytes to follow + $ccv = sizeof($aref); # Number of RGB values to follow + //$data; # The RGB data + + # Pack the RGB data + foreach($aref as $dat) { + $data .= call_user_func_array('pack', array_merge(array("CCCC"), $dat)); + } + + $header = pack("vvv", $record, $length, $ccv); + + $this->_append($header . $data); +} + +############################################################################### +# +# _store_codepage() +# +# Stores the CODEPAGE biff record. +# +function _store_codepage() { + + $record = 0x0042; # Record identifier + $length = 0x0002; # Number of bytes to follow + $cv = $this->_codepage; # The code page + + $header = pack("vv", $record, $length); + $data = pack("v", $cv); + + $this->_append($header.$data); +} + +} + +?> diff --git a/lib/Excel/php_writeexcel/class.writeexcel_workbookbig.inc.php b/lib/Excel/php_writeexcel/class.writeexcel_workbookbig.inc.php new file mode 100644 index 000000000..3fb2f61d1 --- /dev/null +++ b/lib/Excel/php_writeexcel/class.writeexcel_workbookbig.inc.php @@ -0,0 +1,55 @@ +writeexcel_workbook($filename); + } + + function _store_OLE_file() { + $file=new ole_pps_file(asc2ucs("Book")); + $file->append($this->_data); + + for ($c=0;$c_worksheets);$c++) { + $worksheet=&$this->_worksheets[$c]; + while ($data=$worksheet->get_data()) { + $file->append($data); + } + $worksheet->cleanup(); + } + + $ole=new ole_pps_root(false, false, array($file)); + $ole->save($this->_filename); + } + +} + +?> diff --git a/lib/Excel/php_writeexcel/class.writeexcel_worksheet.inc.php b/lib/Excel/php_writeexcel/class.writeexcel_worksheet.inc.php new file mode 100644 index 000000000..9860cbf7e --- /dev/null +++ b/lib/Excel/php_writeexcel/class.writeexcel_worksheet.inc.php @@ -0,0 +1,2968 @@ +writeexcel_biffwriter(); + + $rowmax = 65536; // 16384 in Excel 5 + $colmax = 256; + $strmax = 255; + + $this->_name = $name; + $this->_index = $index; + $this->_activesheet = &$activesheet; + $this->_firstsheet = &$firstsheet; + $this->_url_format = &$url_format; + $this->_parser = &$parser; + $this->_tempdir = $tempdir; + + $this->_ext_sheets = array(); + $this->_using_tmpfile = 1; + $this->_tmpfilename = false; + $this->_filehandle = false; + $this->_fileclosed = 0; + $this->_offset = 0; + $this->_xls_rowmax = $rowmax; + $this->_xls_colmax = $colmax; + $this->_xls_strmax = $strmax; + $this->_dim_rowmin = $rowmax +1; + $this->_dim_rowmax = 0; + $this->_dim_colmin = $colmax +1; + $this->_dim_colmax = 0; + $this->_colinfo = array(); + $this->_selection = array(0, 0); + $this->_panes = array(); + $this->_active_pane = 3; + $this->_frozen = 0; + $this->_selected = 0; + + $this->_paper_size = 0x0; + $this->_orientation = 0x1; + $this->_header = ''; + $this->_footer = ''; + $this->_hcenter = 0; + $this->_vcenter = 0; + $this->_margin_head = 0.50; + $this->_margin_foot = 0.50; + $this->_margin_left = 0.75; + $this->_margin_right = 0.75; + $this->_margin_top = 1.00; + $this->_margin_bottom = 1.00; + + $this->_title_rowmin = false; + $this->_title_rowmax = false; + $this->_title_colmin = false; + $this->_title_colmax = false; + $this->_print_rowmin = false; + $this->_print_rowmax = false; + $this->_print_colmin = false; + $this->_print_colmax = false; + + $this->_print_gridlines = 1; + $this->_screen_gridlines = 1; + $this->_print_headers = 0; + + $this->_fit_page = 0; + $this->_fit_width = 0; + $this->_fit_height = 0; + + $this->_hbreaks = array(); + $this->_vbreaks = array(); + + $this->_protect = 0; + $this->_password = false; + + $this->_col_sizes = array(); + $this->_row_sizes = array(); + + $this->_col_formats = array(); + $this->_row_formats = array(); + + $this->_zoom = 100; + $this->_print_scale = 100; + + $this->_initialize(); + } + +############################################################################### +# +# _initialize() +# +# Open a tmp file to store the majority of the Worksheet data. If this fails, +# for example due to write permissions, store the data in memory. This can be +# slow for large files. +# +function _initialize() { + + # Open tmp file for storing Worksheet data. + $this->_tmpfilename=tempnam($this->_tempdir, "php_writeexcel"); + $fh=fopen($this->_tmpfilename, "w+b"); + + if ($fh) { + # Store filehandle + $this->_filehandle = $fh; + } else { + # If tempfile() failed store data in memory + $this->_using_tmpfile = 0; + $this->_tmpfilename=false; + + if ($this->_index == 0) { + $dir = $this->_tempdir; + +//todo warn "Unable to create temp files in $dir. Refer to set_tempdir()". +// " in the Spreadsheet::WriteExcel documentation.\n" ; + } + } +} + + /* + * Add data to the beginning of the workbook (note the reverse order) + * and to the end of the workbook. + */ + function _close($sheetnames) { + + /////////////////////////////// + // Prepend in reverse order!! + // + + $this->_store_dimensions(); // Prepend the sheet dimensions + $this->_store_password(); // Prepend the sheet password + $this->_store_protect(); // Prepend the sheet protection + $this->_store_setup(); // Prepend the page setup + $this->_store_margin_bottom(); // Prepend the bottom margin + $this->_store_margin_top(); // Prepend the top margin + $this->_store_margin_right(); // Prepend the right margin + $this->_store_margin_left(); // Prepend the left margin + $this->_store_vcenter(); // Prepend the page vertical + // centering + $this->_store_hcenter(); // Prepend the page horizontal + // centering + $this->_store_footer(); // Prepend the page footer + $this->_store_header(); // Prepend the page header + $this->_store_vbreak(); // Prepend the vertical page breaks + $this->_store_hbreak(); // Prepend the horizontal + // page breaks + $this->_store_wsbool(); // Prepend WSBOOL + $this->_store_gridset(); // Prepend GRIDSET + $this->_store_print_gridlines(); // Prepend PRINTGRIDLINES + $this->_store_print_headers(); // Prepend PRINTHEADERS + + // Prepend EXTERNSHEET references + $num_sheets = sizeof($sheetnames); + for ($i = $num_sheets; $i > 0; $i--) { + $sheetname = $sheetnames[$i-1]; + $this->_store_externsheet($sheetname); + } + + $this->_store_externcount($num_sheets); // Prepend the EXTERNCOUNT + // of external references. + + // Prepend the COLINFO records if they exist + if (sizeof($this->_colinfo)>0){ + while (sizeof($this->_colinfo)>0) { + $arrayref = array_pop ($this->_colinfo); + $this->_store_colinfo($arrayref); + } + $this->_store_defcol(); + } + + $this->_store_bof(0x0010); // Prepend the BOF record + + // + // End of prepend. Read upwards from here. + //////////////////////////////////////////// + + // Append + $this->_store_window2(); + $this->_store_zoom(); + + if (sizeof($this->_panes)>0) { + $this->_store_panes($this->_panes); + } + + $this->_store_selection($this->_selection); + $this->_store_eof(); + } + + /* + * Retrieve the worksheet name. + */ + function get_name() { + return $this->_name; + } + +############################################################################### +# +# get_data(). +# +# Retrieves data from memory in one chunk, or from disk in $buffer +# sized chunks. +# +function get_data() { + + $buffer = 4096; + + # Return data stored in memory + if ($this->_data!==false) { + $tmp=$this->_data; + $this->_data=false; + + // The next data comes from the temporary file, so prepare + // it by putting the file pointer to the beginning + if ($this->_using_tmpfile) { + fseek($this->_filehandle, 0, SEEK_SET); + } + + if ($this->_debug) { + print "*** worksheet::get_data() called (1):"; + for ($c=0;$c_using_tmpfile) { + if ($tmp=fread($this->_filehandle, $buffer)) { + + if ($this->_debug) { + print "*** worksheet::get_data() called (2):"; + for ($c=0;$c_using_tmpfile) { + fclose($this->_filehandle); + unlink($this->_tmpfilename); + $this->_tmpfilename=false; + $this->_using_tmpfile=false; + } + } + + /* + * Set this worksheet as a selected worksheet, i.e. the worksheet has + * its tab highlighted. + */ + function select() { + $this->_selected = 1; + } + + /* + * Set this worksheet as the active worksheet, i.e. the worksheet + * that is displayed when the workbook is opened. Also set it as + * selected. + */ + function activate() { + $this->_selected = 1; + $this->_activesheet = $this->_index; + } + + /* + * Set this worksheet as the first visible sheet. This is necessary + * when there are a large number of worksheets and the activated + * worksheet is not visible on the screen. + */ + function set_first_sheet() { + $this->_firstsheet = $this->_index; + } + + /* + * Set the worksheet protection flag to prevent accidental modification + * and to hide formulas if the locked and hidden format properties have + * been set. + */ + function protect($password) { + $this->_protect = 1; + $this->_password = $this->_encode_password($password); + } + +############################################################################### +# +# set_column($firstcol, $lastcol, $width, $format, $hidden) +# +# Set the width of a single column or a range of column. +# See also: _store_colinfo +# +function set_column() { + + $_=func_get_args(); + + $cell = $_[0]; + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $cell)) { + $_ = $this->_substitute_cellref($_); + } + + array_push($this->_colinfo, $_); + + # Store the col sizes for use when calculating image vertices taking + # hidden columns into account. Also store the column formats. + # + if (sizeof($_)<3) { + # Ensure at least $firstcol, $lastcol and $width + return; + } + + $width = $_[4] ? 0 : $_[2]; # Set width to zero if column is hidden + $format = $_[3]; + + list($firstcol, $lastcol) = $_; + + for ($col=$firstcol;$col<=$lastcol;$col++) { + $this->_col_sizes[$col] = $width; + if ($format) { + $this->_col_formats[$col] = $format; + } + } +} + +############################################################################### +# +# set_selection() +# +# Set which cell or cells are selected in a worksheet: see also the +# function _store_selection +# +function set_selection() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + $this->_selection = $_; +} + +############################################################################### +# +# freeze_panes() +# +# Set panes and mark them as frozen. See also _store_panes(). +# +function freeze_panes() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + $this->_frozen = 1; + $this->_panes = $_; +} + +############################################################################### +# +# thaw_panes() +# +# Set panes and mark them as unfrozen. See also _store_panes(). +# +function thaw_panes() { + + $_=func_get_args(); + + $this->_frozen = 0; + $this->_panes = $_; +} + + /* + * Set the page orientation as portrait. + */ + function set_portrait() { + $this->_orientation = 1; + } + + /* + * Set the page orientation as landscape. + */ + function set_landscape() { + $this->_orientation = 0; + } + + /* + * Set the paper type. Ex. 1 = US Letter, 9 = A4 + */ + function set_paper($type) { + $this->_paper_size = $type; + } + + /* + * Set the page header caption and optional margin. + */ + function set_header($string, $margin) { + + if (strlen($string) >= 255) { + trigger_error("Header string must be less than 255 characters", + E_USER_WARNING); + return; + } + + $this->_header = $string; + $this->_margin_head = $margin; + } + + /* + * Set the page footer caption and optional margin. + */ + function set_footer($string, $margin) { + if (strlen($string) >= 255) { + trigger_error("Footer string must be less than 255 characters", + E_USER_WARNING); + return; + } + + $this->_footer = $string; + $this->_margin_foot = $margin; + } + + /* + * Center the page horizontally. + */ + function center_horizontally($hcenter=1) { + $this->_hcenter = $hcenter; + } + + /* + * Center the page horizontally. + */ + function center_vertically($vcenter=1) { + $this->_vcenter = $vcenter; + } + + /* + * Set all the page margins to the same value in inches. + */ + function set_margins($margin) { + $this->set_margin_left($margin); + $this->set_margin_right($margin); + $this->set_margin_top($margin); + $this->set_margin_bottom($margin); + } + + /* + * Set the left and right margins to the same value in inches. + */ + function set_margins_LR($margin) { + $this->set_margin_left($margin); + $this->set_margin_right($margin); + } + + /* + * Set the top and bottom margins to the same value in inches. + */ + function set_margins_TB($margin) { + $this->set_margin_top($margin); + $this->set_margin_bottom($margin); + } + + /* + * Set the left margin in inches. + */ + function set_margin_left($margin=0.75) { + $this->_margin_left = $margin; + } + + /* + * Set the right margin in inches. + */ + function set_margin_right($margin=0.75) { + $this->_margin_right = $margin; + } + + /* + * Set the top margin in inches. + */ + function set_margin_top($margin=1.00) { + $this->_margin_top = $margin; + } + + /* + * Set the bottom margin in inches. + */ + function set_margin_bottom($margin=1.00) { + $this->_margin_bottom = $margin; + } + +############################################################################### +# +# repeat_rows($first_row, $last_row) +# +# Set the rows to repeat at the top of each printed page. See also the +# _store_name_xxxx() methods in Workbook.pm. +# +function repeat_rows() { + + $_=func_get_args(); + + $this->_title_rowmin = $_[0]; + $this->_title_rowmax = isset($_[1]) ? $_[1] : $_[0]; # Second row is optional +} + +############################################################################### +# +# repeat_columns($first_col, $last_col) +# +# Set the columns to repeat at the left hand side of each printed page. +# See also the _store_names() methods in Workbook.pm. +# +function repeat_columns() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + $this->_title_colmin = $_[0]; + $this->_title_colmax = isset($_[1]) ? $_[1] : $_[0]; # Second col is optional +} + +############################################################################### +# +# print_area($first_row, $first_col, $last_row, $last_col) +# +# Set the area of each worksheet that will be printed. See also the +# _store_names() methods in Workbook.pm. +# +function print_area() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + if (sizeof($_) != 4) { + # Require 4 parameters + return; + } + + $this->_print_rowmin = $_[0]; + $this->_print_colmin = $_[1]; + $this->_print_rowmax = $_[2]; + $this->_print_colmax = $_[3]; +} + + /* + * Set the option to hide gridlines on the screen and the printed page. + * There are two ways of doing this in the Excel BIFF format: The first + * is by setting the DspGrid field of the WINDOW2 record, this turns off + * the screen and subsequently the print gridline. The second method is + * to via the PRINTGRIDLINES and GRIDSET records, this turns off the + * printed gridlines only. The first method is probably sufficient for + * most cases. The second method is supported for backwards compatibility. + */ + function hide_gridlines($option=1) { + if ($option == 0) { + $this->_print_gridlines = 1; # 1 = display, 0 = hide + $this->_screen_gridlines = 1; + } elseif ($option == 1) { + $this->_print_gridlines = 0; + $this->_screen_gridlines = 1; + } else { + $this->_print_gridlines = 0; + $this->_screen_gridlines = 0; + } + } + + /* + * Set the option to print the row and column headers on the printed page. + * See also the _store_print_headers() method below. + */ + function print_row_col_headers($headers=1) { + $this->_print_headers = $headers; + } + + /* + * Store the vertical and horizontal number of pages that will define + * the maximum area printed. See also _store_setup() and _store_wsbool() + * below. + */ + function fit_to_pages($width, $height) { + $this->_fit_page = 1; + $this->_fit_width = $width; + $this->_fit_height = $height; + } + + /* + * Store the horizontal page breaks on a worksheet. + */ + function set_h_pagebreaks($breaks) { + $this->_hbreaks=array_merge($this->_hbreaks, $breaks); + } + + /* + * Store the vertical page breaks on a worksheet. + */ + function set_v_pagebreaks($breaks) { + $this->_vbreaks=array_merge($this->_vbreaks, $breaks); + } + + /* + * Set the worksheet zoom factor. + */ + function set_zoom($scale=100) { + // Confine the scale to Excel's range + if ($scale < 10 || $scale > 400) { + trigger_error("Zoom factor $scale outside range: ". + "10 <= zoom <= 400", E_USER_WARNING); + $scale = 100; + } + + $this->_zoom = $scale; + } + + /* + * Set the scale factor for the printed page. + */ + function set_print_scale($scale=100) { + // Confine the scale to Excel's range + if ($scale < 10 || $scale > 400) { + trigger_error("Print scale $scale outside range: ". + "10 <= zoom <= 400", E_USER_WARNING); + $scale = 100; + } + + // Turn off "fit to page" option + $this->_fit_page = 0; + + $this->_print_scale = $scale; + } + +############################################################################### +# +# write($row, $col, $token, $format) +# +# Parse $token call appropriate write method. $row and $column are zero +# indexed. $format is optional. +# +# Returns: return value of called subroutine +# +function write() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + $token = $_[2]; + + # Match an array ref. + if (is_array($token)) { + return call_user_func_array(array(&$this, 'write_row'), $_); + } + + # Match number + if (preg_match('/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/', $token)) { + return call_user_func_array(array(&$this, 'write_number'), $_); + } + # Match http, https or ftp URL + elseif (preg_match('|^[fh]tt?ps?://|', $token)) { + return call_user_func_array(array(&$this, 'write_url'), $_); + } + # Match mailto: + elseif (preg_match('/^mailto:/', $token)) { + return call_user_func_array(array(&$this, 'write_url'), $_); + } + # Match internal or external sheet link + elseif (preg_match('[^(?:in|ex)ternal:]', $token)) { + return call_user_func_array(array(&$this, 'write_url'), $_); + } + # Match formula + elseif (preg_match('/^=/', $token)) { + return call_user_func_array(array(&$this, 'write_formula'), $_); + } + # Match blank + elseif ($token == '') { + array_splice($_, 2, 1); # remove the empty string from the parameter list + return call_user_func_array(array(&$this, 'write_blank'), $_); + } + # Default: match string + else { + return call_user_func_array(array(&$this, 'write_string'), $_); + } +} + +############################################################################### +# +# write_row($row, $col, $array_ref, $format) +# +# Write a row of data starting from ($row, $col). Call write_col() if any of +# the elements of the array ref are in turn array refs. This allows the writing +# of 1D or 2D arrays of data in one go. +# +# Returns: the first encountered error value or zero for no errors +# +function write_row() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + # Catch non array refs passed by user. + if (!is_array($_[2])) { + trigger_error("Not an array ref in call to write_row()!", E_USER_ERROR); + } + + list($row, $col, $tokens)=array_splice($_, 0, 3); + $options = $_[0]; + $error = 0; + + foreach ($tokens as $token) { + + # Check for nested arrays + if (is_array($token)) { + $ret = $this->write_col($row, $col, $token, $options); + } else { + $ret = $this->write ($row, $col, $token, $options); + } + + # Return only the first error encountered, if any. + $error = $error || $ret; + $col++; + } + + return $error; +} + +############################################################################### +# +# _XF() +# +# Returns an index to the XF record in the workbook. +# TODO +# +# Note: this is a function, not a method. +# +function _XF($row=false, $col=false, $format=false) { + + if ($format) { + return $format->get_xf_index(); + } elseif (isset($this->_row_formats[$row])) { + return $this->_row_formats[$row]->get_xf_index(); + } elseif (isset($this->_col_formats[$col])) { + return $this->_col_formats[$col]->get_xf_index(); + } else { + return 0x0F; + } +} + +############################################################################### +# +# write_col($row, $col, $array_ref, $format) +# +# Write a column of data starting from ($row, $col). Call write_row() if any of +# the elements of the array ref are in turn array refs. This allows the writing +# of 1D or 2D arrays of data in one go. +# +# Returns: the first encountered error value or zero for no errors +# +function write_col() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + # Catch non array refs passed by user. + if (!is_array($_[2])) { + trigger_error("Not an array ref in call to write_row()!", E_USER_ERROR); + } + + $row = array_shift($_); + $col = array_shift($_); + $tokens = array_shift($_); + $options = $_; + + $error = 0; + + foreach ($tokens as $token) { + + # write() will deal with any nested arrays + $ret = $this->write($row, $col, $token, $options); + + # Return only the first error encountered, if any. + $error = $error || $ret; + $row++; + } + + return $error; +} + +############################################################################### +############################################################################### +# +# Internal methods +# + +############################################################################### +# +# _append(), overloaded. +# +# Store Worksheet data in memory using the base class _append() or to a +# temporary file, the default. +# +function _append($data) { + + if (func_num_args()>1) { + trigger_error("writeexcel_worksheet::_append() ". + "called with more than one argument", E_USER_ERROR); + } + + if ($this->_using_tmpfile) { + + if ($this->_debug) { + print "worksheet::_append() called:"; + for ($c=0;$c $this->_limit) { + $data = $this->_add_continue($data); + } + + fputs($this->_filehandle, $data); + $this->_datasize += strlen($data); + } else { + parent::_append($data); + } +} + +############################################################################### +# +# _substitute_cellref() +# +# Substitute an Excel cell reference in A1 notation for zero based row and +# column values in an argument list. +# +# Ex: ("A4", "Hello") is converted to (3, 0, "Hello"). +# +// Exactly one array must be passed! +function _substitute_cellref($_) { + $cell = strtoupper(array_shift($_)); + + # Convert a column range: 'A:A' or 'B:G' + if (preg_match('/([A-I]?[A-Z]):([A-I]?[A-Z])/', $cell, $reg)) { + list($dummy, $col1) = $this->_cell_to_rowcol($reg[1] .'1'); # Add a dummy row + list($dummy, $col2) = $this->_cell_to_rowcol($reg[2] .'1'); # Add a dummy row + return array_merge(array($col1, $col2), $_); + } + + # Convert a cell range: 'A1:B7' + if (preg_match('/\$?([A-I]?[A-Z]\$?\d+):\$?([A-I]?[A-Z]\$?\d+)/', $cell, $reg)) { + list($row1, $col1) = $this->_cell_to_rowcol($reg[1]); + list($row2, $col2) = $this->_cell_to_rowcol($reg[2]); + return array_merge(array($row1, $col1, $row2, $col2), $_); + } + + # Convert a cell reference: 'A1' or 'AD2000' + if (preg_match('/\$?([A-I]?[A-Z]\$?\d+)/', $cell, $reg)) { + list($row1, $col1) = $this->_cell_to_rowcol($reg[1]); + return array_merge(array($row1, $col1), $_); + + } + + trigger_error("Unknown cell reference $cell", E_USER_ERROR); +} + +############################################################################### +# +# _cell_to_rowcol($cell_ref) +# +# Convert an Excel cell reference in A1 notation to a zero based row and column +# reference; converts C1 to (0, 2). +# +# Returns: row, column +# +# TODO use functions in Utility.pm +# +function _cell_to_rowcol($cell) { + + preg_match('/\$?([A-I]?[A-Z])\$?(\d+)/', $cell, $reg); + + $col = $reg[1]; + $row = $reg[2]; + + # Convert base26 column string to number + # All your Base are belong to us. + $chars = preg_split('//', $col, -1, PREG_SPLIT_NO_EMPTY); + $expn = 0; + $col = 0; + + while (sizeof($chars)) { + $char = array_pop($chars); # LS char first + $col += (ord($char) -ord('A') +1) * pow(26, $expn); + $expn++; + } + + # Convert 1-index to zero-index + $row--; + $col--; + + return array($row, $col); +} + + /* + * This is an internal method that is used to filter elements of the + * array of pagebreaks used in the _store_hbreak() and _store_vbreak() + * methods. It: + * 1. Removes duplicate entries from the list. + * 2. Sorts the list. + * 3. Removes 0 from the list if present. + */ + function _sort_pagebreaks($breaks) { + // Hash slice to remove duplicates + foreach ($breaks as $break) { + $hash["$break"]=1; + } + + // Numerical sort + $breaks=array_keys($hash); + sort($breaks, SORT_NUMERIC); + + // Remove zero + if ($breaks[0] == 0) { + array_shift($breaks); + } + + // 1000 vertical pagebreaks appears to be an internal Excel 5 limit. + // It is slightly higher in Excel 97/200, approx. 1026 + if (sizeof($breaks) > 1000) { + array_splice($breaks, 1000); + } + + return $breaks; + } + + /* + * Based on the algorithm provided by Daniel Rentz of OpenOffice. + */ + function _encode_password($plaintext) { + $chars=preg_split('//', $plaintext, -1, PREG_SPLIT_NO_EMPTY); + $count=sizeof($chars); + $i=0; + + for ($c=0;$c> 15; + $char = $low_15 | $high_15; + } + + $password = 0x0000; + + foreach ($chars as $char) { + $password ^= $char; + } + + $password ^= $count; + $password ^= 0xCE4B; + + return $password; + } + +############################################################################### +############################################################################### +# +# BIFF RECORDS +# + +############################################################################### +# +# write_number($row, $col, $num, $format) +# +# Write a double to the specified row and column (zero indexed). +# An integer can be written as a double. Excel will display an +# integer. $format is optional. +# +# Returns 0 : normal termination +# -1 : insufficient number of arguments +# -2 : row or column out of range +# +function write_number() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + # Check the number of args + if (sizeof($_) < 3) { + return -1; + } + + $record = 0x0203; # Record identifier + $length = 0x000E; # Number of bytes to follow + + $row = $_[0]; # Zero indexed row + $col = $_[1]; # Zero indexed column + $num = $_[2]; +//!!! + $xf = $this->_XF($row, $col, $_[3]); # The cell format + + # Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) { return -2; } + if ($col >= $this->_xls_colmax) { return -2; } + if ($row < $this->_dim_rowmin) { $this->_dim_rowmin = $row; } + if ($row > $this->_dim_rowmax) { $this->_dim_rowmax = $row; } + if ($col < $this->_dim_colmin) { $this->_dim_colmin = $col; } + if ($col > $this->_dim_colmax) { $this->_dim_colmax = $col; } + + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $xf); + $xl_double = pack("d", $num); + + if ($this->_byte_order) { +//TODO + $xl_double = strrev($xl_double); + } + + $this->_append($header . $data . $xl_double); + + return 0; +} + +############################################################################### +# +# write_string ($row, $col, $string, $format) +# +# Write a string to the specified row and column (zero indexed). +# NOTE: there is an Excel 5 defined limit of 255 characters. +# $format is optional. +# Returns 0 : normal termination +# -1 : insufficient number of arguments +# -2 : row or column out of range +# -3 : long string truncated to 255 chars +# +function write_string() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + # Check the number of args + if (sizeof($_) < 3) { + return -1; + } + + $record = 0x0204; # Record identifier + $length = 0x0008 + strlen($_[2]); # Bytes to follow + + $row = $_[0]; # Zero indexed row + $col = $_[1]; # Zero indexed column + $strlen = strlen($_[2]); + $str = $_[2]; + $xf = $this->_XF($row, $col, $_[3]); # The cell format + + $str_error = 0; + + # Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) { return -2; } + if ($col >= $this->_xls_colmax) { return -2; } + if ($row < $this->_dim_rowmin) { $this->_dim_rowmin = $row; } + if ($row > $this->_dim_rowmax) { $this->_dim_rowmax = $row; } + if ($col < $this->_dim_colmin) { $this->_dim_colmin = $col; } + if ($col > $this->_dim_colmax) { $this->_dim_colmax = $col; } + + if ($strlen > $this->_xls_strmax) { # LABEL must be < 255 chars + $str = substr($str, 0, $this->_xls_strmax); + $length = 0x0008 + $this->_xls_strmax; + $strlen = $this->_xls_strmax; + $str_error = -3; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row, $col, $xf, $strlen); + + $this->_append($header . $data . $str); + + return $str_error; +} + +############################################################################### +# +# write_blank($row, $col, $format) +# +# Write a blank cell to the specified row and column (zero indexed). +# A blank cell is used to specify formatting without adding a string +# or a number. +# +# A blank cell without a format serves no purpose. Therefore, we don't write +# a BLANK record unless a format is specified. This is mainly an optimisation +# for the write_row() and write_col() methods. +# +# Returns 0 : normal termination (including no format) +# -1 : insufficient number of arguments +# -2 : row or column out of range +# +function write_blank() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + # Check the number of args + if (sizeof($_) < 2) { + return -1; + } + + # Don't write a blank cell unless it has a format + if (!isset($_[2])) { + return 0; + } + + $record = 0x0201; # Record identifier + $length = 0x0006; # Number of bytes to follow + + $row = $_[0]; # Zero indexed row + $col = $_[1]; # Zero indexed column + $xf = $this->_XF($row, $col, $_[2]); # The cell format + + # Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) { return -2; } + if ($col >= $this->_xls_colmax) { return -2; } + if ($row < $this->_dim_rowmin) { $this->_dim_rowmin = $row; } + if ($row > $this->_dim_rowmax) { $this->_dim_rowmax = $row; } + if ($col < $this->_dim_colmin) { $this->_dim_colmin = $col; } + if ($col > $this->_dim_colmax) { $this->_dim_colmax = $col; } + + $header = pack("vv", $record, $length); + $data = pack("vvv", $row, $col, $xf); + + $this->_append($header . $data); + + return 0; +} + +############################################################################### +# +# write_formula($row, $col, $formula, $format) +# +# Write a formula to the specified row and column (zero indexed). +# The textual representation of the formula is passed to the parser in +# Formula.pm which returns a packed binary string. +# +# $format is optional. +# +# Returns 0 : normal termination +# -1 : insufficient number of arguments +# -2 : row or column out of range +# +function write_formula() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + # Check the number of args + if (sizeof($_) < 3) { + return -1; + } + + $record = 0x0006; # Record identifier + $length=0; # Bytes to follow + + $row = $_[0]; # Zero indexed row + $col = $_[1]; # Zero indexed column + $formula = $_[2]; # The formula text string + + # Excel normally stores the last calculated value of the formula in $num. + # Clearly we are not in a position to calculate this a priori. Instead + # we set $num to zero and set the option flags in $grbit to ensure + # automatic calculation of the formula when the file is opened. + # + $xf = $this->_XF($row, $col, $_[3]); # The cell format + $num = 0x00; # Current value of formula + $grbit = 0x03; # Option flags + $chn = 0x0000; # Must be zero + + # Check that row and col are valid and store max and min values + if ($row >= $this->_xls_rowmax) { return -2; } + if ($col >= $this->_xls_colmax) { return -2; } + if ($row < $this->_dim_rowmin) { $this->_dim_rowmin = $row; } + if ($row > $this->_dim_rowmax) { $this->_dim_rowmax = $row; } + if ($col < $this->_dim_colmin) { $this->_dim_colmin = $col; } + if ($col > $this->_dim_colmax) { $this->_dim_colmax = $col; } + + # Strip the = sign at the beginning of the formula string + $formula = preg_replace('/^=/', "", $formula); + + # Parse the formula using the parser in Formula.pm + $parser =& $this->_parser; + $formula = $parser->parse_formula($formula); + + $formlen = strlen($formula); # Length of the binary string + $length = 0x16 + $formlen; # Length of the record data + + $header = pack("vv", $record, $length); + $data = pack("vvvdvVv", $row, $col, $xf, $num, + $grbit, $chn, $formlen); + + $this->_append($header . $data . $formula); + + return 0; +} + +############################################################################### +# +# write_url($row, $col, $url, $string, $format) +# +# Write a hyperlink. This is comprised of two elements: the visible label and +# the invisible link. The visible label is the same as the link unless an +# alternative string is specified. The label is written using the +# write_string() method. Therefore the 255 characters string limit applies. +# $string and $format are optional and their order is interchangeable. +# +# The hyperlink can be to a http, ftp, mail, internal sheet, or external +# directory url. +# +# Returns 0 : normal termination +# -1 : insufficient number of arguments +# -2 : row or column out of range +# -3 : long string truncated to 255 chars +# +function write_url() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + # Check the number of args + if (sizeof($_) < 3) { + return -1; + } + + # Add start row and col to arg list + return call_user_func_array(array(&$this, 'write_url_range'), + array_merge(array($_[0], $_[1]), $_)); +} + +############################################################################### +# +# write_url_range($row1, $col1, $row2, $col2, $url, $string, $format) +# +# This is the more general form of write_url(). It allows a hyperlink to be +# written to a range of cells. This function also decides the type of hyperlink +# to be written. These are either, Web (http, ftp, mailto), Internal +# (Sheet1!A1) or external ('c:\temp\foo.xls#Sheet1!A1'). +# +# See also write_url() above for a general description and return values. +# +function write_url_range() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + # Check the number of args + if (sizeof($_) < 5) { + return -1; + } + + # Reverse the order of $string and $format if necessary. +//TODO ($_[5], $_[6]) = ($_[6], $_[5]) if (ref $_[5]); + + $url = $_[4]; + + # Check for internal/external sheet links or default to web link + if (preg_match('[^internal:]', $url)) { + return call_user_func_array(array(&$this, '_write_url_internal'), $_); + } + + if (preg_match('[^external:]', $url)) { + return call_user_func_array(array(&$this, '_write_url_external'), $_); + } + + return call_user_func_array(array(&$this, '_write_url_web'), $_); +} + +############################################################################### +# +# _write_url_web($row1, $col1, $row2, $col2, $url, $string, $format) +# +# Used to write http, ftp and mailto hyperlinks. +# The link type ($options) is 0x03 is the same as absolute dir ref without +# sheet. However it is differentiated by the $unknown2 data stream. +# +# See also write_url() above for a general description and return values. +# +function _write_url_web() { + + $_=func_get_args(); + + $record = 0x01B8; # Record identifier + $length = 0x00000; # Bytes to follow + + $row1 = $_[0]; # Start row + $col1 = $_[1]; # Start column + $row2 = $_[2]; # End row + $col2 = $_[3]; # End column + $url = $_[4]; # URL string + if (isset($_[5])) { + $str = $_[5]; # Alternative label + } + $xf = $_[6] ? $_[6] : $this->_url_format; # The cell format + + # Write the visible label using the write_string() method. + if(!isset($str)) { + $str = $url; + } + + $str_error = $this->write_string($row1, $col1, $str, $xf); + + if ($str_error == -2) { + return $str_error; + } + + # Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); + $unknown2 = pack("H*", "E0C9EA79F9BACE118C8200AA004BA90B"); + + # Pack the option flags + $options = pack("V", 0x03); + + # Convert URL to a null terminated wchar string + $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); + $url = $url . "\0\0\0"; + + # Pack the length of the URL + $url_len = pack("V", strlen($url)); + + # Calculate the data length + $length = 0x34 + strlen($url); + + # Pack the header data + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row1, $row2, $col1, $col2); + + # Write the packed data + $this->_append($header. + $data. + $unknown1. + $options. + $unknown2. + $url_len. + $url); + + return $str_error; +} + +############################################################################### +# +# _write_url_internal($row1, $col1, $row2, $col2, $url, $string, $format) +# +# Used to write internal reference hyperlinks such as "Sheet1!A1". +# +# See also write_url() above for a general description and return values. +# +function _write_url_internal() { + + $_=func_get_args(); + + $record = 0x01B8; # Record identifier + $length = 0x00000; # Bytes to follow + + $row1 = $_[0]; # Start row + $col1 = $_[1]; # Start column + $row2 = $_[2]; # End row + $col2 = $_[3]; # End column + $url = $_[4]; # URL string + if (isset($_[5])) { + $str = $_[5]; # Alternative label + } + $xf = $_[6] ? $_[6] : $this->_url_format; # The cell format + + # Strip URL type + $url = preg_replace('s[^internal:]', '', $url); + + # Write the visible label + if (!isset($str)) { + $str = $url; + } + $str_error = $this->write_string($row1, $col1, $str, $xf); + + if ($str_error == -2) { + return $str_error; + } + + # Pack the undocumented parts of the hyperlink stream + $unknown1 = pack("H*", "D0C9EA79F9BACE118C8200AA004BA90B02000000"); + + # Pack the option flags + $options = pack("V", 0x08); + + # Convert the URL type and to a null terminated wchar string + $url = join("\0", preg_split("''", $url, -1, PREG_SPLIT_NO_EMPTY)); + $url = $url . "\0\0\0"; + + # Pack the length of the URL as chars (not wchars) + $url_len = pack("V", int(strlen($url)/2)); + + # Calculate the data length + $length = 0x24 + strlen($url); + + # Pack the header data + $header = pack("vv", $record, $length); + $data = pack("vvvv", $row1, $row2, $col1, $col2); + + # Write the packed data + $this->_append($header. + $data. + $unknown1. + $options. + $url_len. + $url); + + return $str_error; +} + +############################################################################### +# +# _write_url_external($row1, $col1, $row2, $col2, $url, $string, $format) +# +# Write links to external directory names such as 'c:\foo.xls', +# c:\foo.xls#Sheet1!A1', '../../foo.xls'. and '../../foo.xls#Sheet1!A1'. +# +# Note: Excel writes some relative links with the $dir_long string. We ignore +# these cases for the sake of simpler code. +# +# See also write_url() above for a general description and return values. +# +function _write_url_external() { + + $_=func_get_args(); + + # Network drives are different. We will handle them separately + # MS/Novell network drives and shares start with \\ + if (preg_match('[^external:\\\\]', $_[4])) { + return call_user_func_array(array(&$this, '_write_url_external_net'), $_); + } + + $record = 0x01B8; # Record identifier + $length = 0x00000; # Bytes to follow + + $row1 = $_[0]; # Start row + $col1 = $_[1]; # Start column + $row2 = $_[2]; # End row + $col2 = $_[3]; # End column + $url = $_[4]; # URL string + if (isset($_[5])) { + $str = $_[5]; # Alternative label + } + $xf = $_[6] ? $_[6] : $this->_url_format; # The cell format + + # Strip URL type and change Unix dir separator to Dos style (if needed) + # + $url = preg_replace('[^external:]', '', $url); + $url = preg_replace('[/]', "\\", $url); + + # Write the visible label + if (!isset($str)) { + $str = preg_replace('[\#]', ' - ', $url); + } + $str_error = $this->write_string($row1, $col1, $str, $xf); + if ($str_error == -2) { + return $str_error; + } + + # Determine if the link is relative or absolute: + # relative if link contains no dir separator, "somefile.xls" + # relative if link starts with up-dir, "..\..\somefile.xls" + # otherwise, absolute + # + $absolute = 0x02; # Bit mask + + if (!preg_match('[\\]', $url)) { + $absolute = 0x00; + } + + if (preg_match('[^\.\.\\]', $url)) { + $absolute = 0x00; + } + + # Determine if the link contains a sheet reference and change some of the + # parameters accordingly. + # Split the dir name and sheet name (if it exists) + # + list($dir_long, $sheet) = preg_split('/\#/', $url); + $link_type = 0x01 | $absolute; + +//!!! + if (isset($sheet)) { + $link_type |= 0x08; + $sheet_len = pack("V", length($sheet) + 0x01); + $sheet = join("\0", split('', $sheet)); + $sheet .= "\0\0\0"; + } else { + $sheet_len = ''; + $sheet = ''; + } + + # Pack the link type + $link_type = pack("V", $link_type); + + + # Calculate the up-level dir count e.g.. (..\..\..\ == 3) +/* TODO + $up_count = 0; + $up_count++ while $dir_long =~ s[^\.\.\\][]; + $up_count = pack("v", $up_count); +*/ + + # Store the short dos dir name (null terminated) + $dir_short = $dir_long . "\0"; + + # Store the long dir name as a wchar string (non-null terminated) + $dir_long = join("\0", preg_split('', $dir_long, -1, PREG_SPLIT_NO_EMPTY)); + $dir_long = $dir_long . "\0"; + + # Pack the lengths of the dir strings + $dir_short_len = pack("V", strlen($dir_short) ); + $dir_long_len = pack("V", strlen($dir_long) ); + $stream_len = pack("V", strlen($dir_long) + 0x06); + + # Pack the undocumented parts of the hyperlink stream + $unknown1 =pack("H*",'D0C9EA79F9BACE118C8200AA004BA90B02000000' ); + $unknown2 =pack("H*",'0303000000000000C000000000000046' ); + $unknown3 =pack("H*",'FFFFADDE000000000000000000000000000000000000000'); + $unknown4 =pack("v", 0x03 ); + + # Pack the main data stream + $data = pack("vvvv", $row1, $row2, $col1, $col2) . + $unknown1 . + $link_type . + $unknown2 . + $up_count . + $dir_short_len. + $dir_short . + $unknown3 . + $stream_len . + $dir_long_len . + $unknown4 . + $dir_long . + $sheet_len . + $sheet ; + + # Pack the header data + $length = strlen($data); + $header = pack("vv", $record, $length); + + # Write the packed data + $this->_append($header . $data); + + return $str_error; +} + +############################################################################### +# +# write_url_xxx($row1, $col1, $row2, $col2, $url, $string, $format) +# +# Write links to external MS/Novell network drives and shares such as +# '//NETWORK/share/foo.xls' and '//NETWORK/share/foo.xls#Sheet1!A1'. +# +# See also write_url() above for a general description and return values. +# +function _write_url_external_net() { + + $_=func_get_args(); + + $record = 0x01B8; # Record identifier + $length = 0x00000; # Bytes to follow + + $row1 = $_[0]; # Start row + $col1 = $_[1]; # Start column + $row2 = $_[2]; # End row + $col2 = $_[3]; # End column + $url = $_[4]; # URL string + if(isset($_[5])) { + $str = $_[5]; # Alternative label + } + $xf = $_[6] ? $_[6] : $this->_url_format; # The cell format + + # Strip URL type and change Unix dir separator to Dos style (if needed) + # + $url = preg_replace('[^external:]', "", $url); + $url = preg_replace('[/]', "\\"); + + # Write the visible label + if (!isset($str)) { + $str = preg_replace('[\#]', " - ", $url); + } + + $str_error = $this->write_string($row1, $col1, $str, $xf); + if ($str_error == -2) { + return $str_error; + } + + # Determine if the link contains a sheet reference and change some of the + # parameters accordingly. + # Split the dir name and sheet name (if it exists) + # + list($dir_long , $sheet) = preg_split('\#', $url); + $link_type = 0x0103; # Always absolute + +//!!! + if (isset($sheet)) { + $link_type |= 0x08; + $sheet_len = pack("V", strlen($sheet) + 0x01); + $sheet = join("\0", preg_split("''", $sheet, -1, PREG_SPLIT_NO_EMPTY)); + $sheet .= "\0\0\0"; + } else { + $sheet_len = ''; + $sheet = ''; + } + + # Pack the link type + $link_type = pack("V", $link_type); + + # Make the string null terminated + $dir_long = $dir_long . "\0"; + + # Pack the lengths of the dir string + $dir_long_len = pack("V", strlen($dir_long)); + + # Store the long dir name as a wchar string (non-null terminated) + $dir_long = join("\0", preg_split("''", $dir_long, -1, PREG_SPLIT_NO_EMPTY)); + $dir_long = $dir_long . "\0"; + + # Pack the undocumented part of the hyperlink stream + $unknown1 = pack("H*",'D0C9EA79F9BACE118C8200AA004BA90B02000000'); + + # Pack the main data stream + $data = pack("vvvv", $row1, $row2, $col1, $col2) . + $unknown1 . + $link_type . + $dir_long_len . + $dir_long . + $sheet_len . + $sheet ; + + # Pack the header data + $length = strlen($data); + $header = pack("vv", $record, $length); + + # Write the packed data + $this->_append($header . $data); + + return $str_error; +} + +############################################################################### +# +# set_row($row, $height, $XF) +# +# This method is used to set the height and XF format for a row. +# Writes the BIFF record ROW. +# +function set_row() { + + $_=func_get_args(); + + $record = 0x0208; # Record identifier + $length = 0x0010; # Number of bytes to follow + + $rw = $_[0]; # Row Number + $colMic = 0x0000; # First defined column + $colMac = 0x0000; # Last defined column + //$miyRw; # Row height + $irwMac = 0x0000; # Used by Excel to optimise loading + $reserved = 0x0000; # Reserved + $grbit = 0x01C0; # Option flags. (monkey) see $1 do + //$ixfe; # XF index + if (isset($_[2])) { + $format = $_[2]; # Format object + } + + # Check for a format object + if (isset($_[2])) { + $ixfe = $format->get_xf_index(); + } else { + $ixfe = 0x0F; + } + + # Use set_row($row, undef, $XF) to set XF without setting height + if (isset($_[1])) { + $miyRw = $_[1] *20; + } else { + $miyRw = 0xff; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvvvvvv", $rw, $colMic, $colMac, $miyRw, + $irwMac,$reserved, $grbit, $ixfe); + + $this->_append($header . $data); + + # Store the row sizes for use when calculating image vertices. + # Also store the column formats. + # + # Ensure at least $row and $height + if (sizeof($_) < 2) { + return; + } + + $this->_row_sizes[$_[0]] = $_[1]; + if (isset($_[2])) { + $this->_row_formats[$_[0]] = $_[2]; + } +} + + /* + * Writes Excel DIMENSIONS to define the area in which there is data. + */ + function _store_dimensions() { + $record = 0x0000; // Record identifier + $length = 0x000A; // Number of bytes to follow + $row_min = $this->_dim_rowmin; // First row + $row_max = $this->_dim_rowmax; // Last row plus 1 + $col_min = $this->_dim_colmin; // First column + $col_max = $this->_dim_colmax; // Last column plus 1 + $reserved = 0x0000; // Reserved by Excel + + $header = pack("vv", $record, $length); + $data = pack("vvvvv", $row_min, $row_max, + $col_min, $col_max, $reserved); + $this->_prepend($header . $data); + } + + /* + * Write BIFF record Window2. + */ + function _store_window2() { + $record = 0x023E; // Record identifier + $length = 0x000A; // Number of bytes to follow + + $grbit = 0x00B6; // Option flags + $rwTop = 0x0000; // Top row visible in window + $colLeft = 0x0000; // Leftmost column visible in window + $rgbHdr = 0x00000000; // Row/column heading and gridline + // color + + // The options flags that comprise $grbit + $fDspFmla = 0; // 0 - bit + $fDspGrid = $this->_screen_gridlines; // 1 + $fDspRwCol = 1; // 2 + $fFrozen = $this->_frozen; // 3 + $fDspZeros = 1; // 4 + $fDefaultHdr = 1; // 5 + $fArabic = 0; // 6 + $fDspGuts = 1; // 7 + $fFrozenNoSplit = 0; // 0 - bit + $fSelected = $this->_selected; // 1 + $fPaged = 1; // 2 + + $grbit = $fDspFmla; + $grbit |= $fDspGrid << 1; + $grbit |= $fDspRwCol << 2; + $grbit |= $fFrozen << 3; + $grbit |= $fDspZeros << 4; + $grbit |= $fDefaultHdr << 5; + $grbit |= $fArabic << 6; + $grbit |= $fDspGuts << 7; + $grbit |= $fFrozenNoSplit << 8; + $grbit |= $fSelected << 9; + $grbit |= $fPaged << 10; + + $header = pack("vv", $record, $length); + $data = pack("vvvV", $grbit, $rwTop, $colLeft, $rgbHdr); + + $this->_append($header . $data); + } + + /* + * Write BIFF record DEFCOLWIDTH if COLINFO records are in use. + */ + function _store_defcol() { + $record = 0x0055; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $colwidth = 0x0008; // Default column width + + $header = pack("vv", $record, $length); + $data = pack("v", $colwidth); + + $this->_prepend($header . $data); + } + +############################################################################### +# +# _store_colinfo($firstcol, $lastcol, $width, $format, $hidden) +# +# Write BIFF record COLINFO to define column widths +# +# Note: The SDK says the record length is 0x0B but Excel writes a 0x0C +# length record. +# +function _store_colinfo($_) { + + $record = 0x007D; # Record identifier + $length = 0x000B; # Number of bytes to follow + + $colFirst = $_[0] ? $_[0] : 0; # First formatted column + $colLast = $_[1] ? $_[1] : 0; # Last formatted column + $coldx = $_[2] ? $_[2] : 8.43; # Col width, 8.43 is Excel default + + $coldx += 0.72; # Fudge. Excel subtracts 0.72 !? + $coldx *= 256; # Convert to units of 1/256 of a char + + //$ixfe; # XF index + $grbit = $_[4] || 0; # Option flags + $reserved = 0x00; # Reserved + $format = $_[3]; # Format object + + # Check for a format object + if (isset($_[3])) { + $ixfe = $format->get_xf_index(); + } else { + $ixfe = 0x0F; + } + + $header = pack("vv", $record, $length); + $data = pack("vvvvvC", $colFirst, $colLast, $coldx, + $ixfe, $grbit, $reserved); + $this->_prepend($header . $data); +} + +############################################################################### +# +# _store_selection($first_row, $first_col, $last_row, $last_col) +# +# Write BIFF record SELECTION. +# +function _store_selection($_) { + + $record = 0x001D; # Record identifier + $length = 0x000F; # Number of bytes to follow + + $pnn = $this->_active_pane; # Pane position + $rwAct = $_[0]; # Active row + $colAct = $_[1]; # Active column + $irefAct = 0; # Active cell ref + $cref = 1; # Number of refs + + $rwFirst = $_[0]; # First row in reference + $colFirst = $_[1]; # First col in reference + $rwLast = $_[2] ? $_[2] : $rwFirst; # Last row in reference + $colLast = $_[3] ? $_[3] : $colFirst; # Last col in reference + + # Swap last row/col for first row/col as necessary + if ($rwFirst > $rwLast) { + list($rwFirst, $rwLast) = array($rwLast, $rwFirst); + } + + if ($colFirst > $colLast) { + list($colFirst, $colLast) = array($colLast, $colFirst); + } + + $header = pack("vv", $record, $length); + $data = pack("CvvvvvvCC", $pnn, $rwAct, $colAct, + $irefAct, $cref, + $rwFirst, $rwLast, + $colFirst, $colLast); + + $this->_append($header . $data); +} + + /* + * Write BIFF record EXTERNCOUNT to indicate the number of external + * sheet references in a worksheet. + * + * Excel only stores references to external sheets that are used in + * formulas. For simplicity we store references to all the sheets in + * the workbook regardless of whether they are used or not. This reduces + * the overall complexity and eliminates the need for a two way dialogue + * between the formula parser the worksheet objects. + */ + function _store_externcount($cxals) { + // $cxals Number of external references + + $record = 0x0016; // Record identifier + $length = 0x0002; // Number of bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cxals); + + $this->_prepend($header . $data); + } + + /* + * Writes the Excel BIFF EXTERNSHEET record. These references are used + * by formulas. A formula references a sheet name via an index. Since we + * store a reference to all of the external worksheets the EXTERNSHEET + * index is the same as the worksheet index. + */ + function _store_externsheet($sheetname) { + $record = 0x0017; # Record identifier + // $length Number of bytes to follow + + // $cch Length of sheet name + // $rgch Filename encoding + + // References to the current sheet are encoded differently to + // references to external sheets. + if ($this->_name == $sheetname) { + $sheetname = ''; + $length = 0x02; // The following 2 bytes + $cch = 1; // The following byte + $rgch = 0x02; // Self reference + } else { + $length = 0x02 + strlen($sheetname); + $cch = strlen($sheetname); + $rgch = 0x03; // Reference to a sheet in the current + // workbook + } + + $header = pack("vv", $record, $length); + $data = pack("CC", $cch, $rgch); + + $this->_prepend($header . $data . $sheetname); + } + +############################################################################### +# +# _store_panes() +# +# +# Writes the Excel BIFF PANE record. +# The panes can either be frozen or thawed (unfrozen). +# Frozen panes are specified in terms of a integer number of rows and columns. +# Thawed panes are specified in terms of Excel's units for rows and columns. +# +function _store_panes($_) { + + $record = 0x0041; # Record identifier + $length = 0x000A; # Number of bytes to follow + + $y = $_[0] ? $_[0] : 0; # Vertical split position + $x = $_[1] ? $_[1] : 0; # Horizontal split position + if (isset($_[2])) { + $rwTop = $_[2]; # Top row visible + } + if (isset($_[3])) { + $colLeft = $_[3]; # Leftmost column visible + } + if (isset($_[4])) { + $pnnAct = $_[4]; # Active pane + } + + # Code specific to frozen or thawed panes. + if ($this->_frozen) { + # Set default values for $rwTop and $colLeft + if (!isset($rwTop)) { + $rwTop = $y; + } + if (!isset($colLeft)) { + $colLeft = $x; + } + } else { + # Set default values for $rwTop and $colLeft + if (!isset($rwTop)) { + $rwTop = 0; + } + if (!isset($colLeft)) { + $colLeft = 0; + } + + # Convert Excel's row and column units to the internal units. + # The default row height is 12.75 + # The default column width is 8.43 + # The following slope and intersection values were interpolated. + # + $y = 20*$y + 255; + $x = 113.879*$x + 390; + } + + # Determine which pane should be active. There is also the undocumented + # option to override this should it be necessary: may be removed later. + # + if (!isset($pnnAct)) { + # Bottom right + if ($x != 0 && $y != 0) { + $pnnAct = 0; + } + # Top right + if ($x != 0 && $y == 0) { + $pnnAct = 1; + } + # Bottom left + if ($x == 0 && $y != 0) { + $pnnAct = 2; + } + # Top left + if ($x == 0 && $y == 0) { + $pnnAct = 3; + } + } + + $this->_active_pane = $pnnAct; # Used in _store_selection + + $header = pack("vv", $record, $length); + $data = pack("vvvvv", $x, $y, $rwTop, $colLeft, $pnnAct); + + $this->_append($header . $data); +} + + /* + * Store the page setup SETUP BIFF record. + */ + function _store_setup() { + $record = 0x00A1; // Record identifier + $length = 0x0022; // Number of bytes to follow + + $iPaperSize = $this->_paper_size; // Paper size + $iScale = $this->_print_scale; // Print scaling factor + $iPageStart = 0x01; // Starting page number + $iFitWidth = $this->_fit_width; // Fit to number of pages wide + $iFitHeight = $this->_fit_height; // Fit to number of pages high + $grbit = 0x00; // Option flags + $iRes = 0x0258; // Print resolution + $iVRes = 0x0258; // Vertical print resolution + $numHdr = $this->_margin_head; // Header Margin + $numFtr = $this->_margin_foot; // Footer Margin + $iCopies = 0x01; // Number of copies + + $fLeftToRight = 0x0; // Print over then down + $fLandscape = $this->_orientation; // Page orientation + $fNoPls = 0x0; // Setup not read from printer + $fNoColor = 0x0; // Print black and white + $fDraft = 0x0; // Print draft quality + $fNotes = 0x0; // Print notes + $fNoOrient = 0x0; // Orientation not set + $fUsePage = 0x0; // Use custom starting page + + $grbit = $fLeftToRight; + $grbit |= $fLandscape << 1; + $grbit |= $fNoPls << 2; + $grbit |= $fNoColor << 3; + $grbit |= $fDraft << 4; + $grbit |= $fNotes << 5; + $grbit |= $fNoOrient << 6; + $grbit |= $fUsePage << 7; + + $numHdr = pack("d", $numHdr); + $numFtr = pack("d", $numFtr); + + if ($this->_byte_order) { + $numHdr = strrev($numHdr); + $numFtr = strrev($numFtr); + } + + $header = pack("vv", $record, $length); + $data1 = pack("vvvvvvvv", $iPaperSize, + $iScale, + $iPageStart, + $iFitWidth, + $iFitHeight, + $grbit, + $iRes, + $iVRes); + $data2 = $numHdr . $numFtr; + $data3 = pack("v", $iCopies); + + $this->_prepend($header . $data1 . $data2 . $data3); + } + + /* + * Store the header caption BIFF record. + */ + function _store_header() { + $record = 0x0014; // Record identifier + + $str = $this->_header; // header string + $cch = strlen($str); // Length of header string + $length = 1 + $cch; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("C", $cch); + + $this->_append($header . $data . $str); + } + + /* + * Store the footer caption BIFF record. + */ + function _store_footer() { + $record = 0x0015; // Record identifier + + $str = $this->_footer; // Footer string + $cch = strlen($str); // Length of footer string + $length = 1 + $cch; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("C", $cch); + + $this->_append($header . $data . $str); + } + + /* + * Store the horizontal centering HCENTER BIFF record. + */ + function _store_hcenter() { + $record = 0x0083; // Record identifier + $length = 0x0002; // Bytes to follow + + $fHCenter = $this->_hcenter; // Horizontal centering + + $header = pack("vv", $record, $length); + $data = pack("v", $fHCenter); + + $this->_append($header . $data); + } + + /* + * Store the vertical centering VCENTER BIFF record. + */ + function _store_vcenter() { + $record = 0x0084; // Record identifier + $length = 0x0002; // Bytes to follow + + $fVCenter = $this->_vcenter; // Horizontal centering + + $header = pack("vv", $record, $length); + $data = pack("v", $fVCenter); + + $this->_append($header . $data); + } + + /* + * Store the LEFTMARGIN BIFF record. + */ + function _store_margin_left() { + $record = 0x0026; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_left; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + + if ($this->_byte_order) { + $data = strrev($data); + } + + $this->_append($header . $data); + } + + /* + * Store the RIGHTMARGIN BIFF record. + */ + function _store_margin_right() { + $record = 0x0027; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_right; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + + if ($this->_byte_order) { + $data = strrev($data); + } + + $this->_append($header . $data); + } + + /* + * Store the TOPMARGIN BIFF record. + */ + function _store_margin_top() { + $record = 0x0028; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_top; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + + if ($this->_byte_order) { + $data = strrev($data); + } + + $this->_append($header . $data); + } + + /* + * Store the BOTTOMMARGIN BIFF record. + */ + function _store_margin_bottom() { + $record = 0x0029; // Record identifier + $length = 0x0008; // Bytes to follow + + $margin = $this->_margin_bottom; // Margin in inches + + $header = pack("vv", $record, $length); + $data = pack("d", $margin); + + if ($this->_byte_order) { + $data = strrev($data); + } + + $this->_append($header . $data); + } + +############################################################################### +# +# merge_cells($first_row, $first_col, $last_row, $last_col) +# +# This is an Excel97/2000 method. It is required to perform more complicated +# merging than the normal align merge in Format.pm +# +function merge_cells() { + + $_=func_get_args(); + + // Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + $record = 0x00E5; # Record identifier + $length = 0x000A; # Bytes to follow + + $cref = 1; # Number of refs + $rwFirst = $_[0]; # First row in reference + $colFirst = $_[1]; # First col in reference + $rwLast = $_[2] ? $_[2] : $rwFirst; # Last row in reference + $colLast = $_[3] ? $_[3] : $colFirst; # Last col in reference + + // Swap last row/col for first row/col as necessary + if ($rwFirst > $rwLast) { + list($rwFirst, $rwLast) = array($rwLast, $rwFirst); + } + + if ($colFirst > $colLast) { + list($colFirst, $colLast) = array($colLast, $colFirst); + } + + $header = pack("vv", $record, $length); + $data = pack("vvvvv", $cref, + $rwFirst, $rwLast, + $colFirst, $colLast); + + $this->_append($header . $data); +} + + /* + * Write the PRINTHEADERS BIFF record. + */ + function _store_print_headers() { + $record = 0x002a; // Record identifier + $length = 0x0002; // Bytes to follow + + $fPrintRwCol = $this->_print_headers; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fPrintRwCol); + + $this->_prepend($header . $data); + } + + /* + * Write the PRINTGRIDLINES BIFF record. Must be used in conjunction + * with the GRIDSET record. + */ + function _store_print_gridlines() { + $record = 0x002b; // Record identifier + $length = 0x0002; // Bytes to follow + + $fPrintGrid = $this->_print_gridlines; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fPrintGrid); + + $this->_prepend($header . $data); + } + + /* + * Write the GRIDSET BIFF record. Must be used in conjunction with the + * PRINTGRIDLINES record. + */ + function _store_gridset() { + $record = 0x0082; // Record identifier + $length = 0x0002; // Bytes to follow + + $fGridSet = !$this->_print_gridlines; // Boolean flag + + $header = pack("vv", $record, $length); + $data = pack("v", $fGridSet); + + $this->_prepend($header . $data); + } + + /* + * Write the WSBOOL BIFF record, mainly for fit-to-page. Used in + * conjunction with the SETUP record. + */ + function _store_wsbool() { + $record = 0x0081; # Record identifier + $length = 0x0002; # Bytes to follow + + // $grbit Option flags + + // The only option that is of interest is the flag for fit to page. + // So we set all the options in one go. + if ($this->_fit_page) { + $grbit = 0x05c1; + } else { + $grbit = 0x04c1; + } + + $header = pack("vv", $record, $length); + $data = pack("v", $grbit); + + $this->_prepend($header . $data); + } + + /* + * Write the HORIZONTALPAGEBREAKS BIFF record. + */ + function _store_hbreak() { + // Return if the user hasn't specified pagebreaks + if(sizeof($this->_hbreaks)==0) { + return; + } + + # Sort and filter array of page breaks + $breaks = $this->_sort_pagebreaks($this->_hbreaks); + + $record = 0x001b; // Record identifier + $cbrk = sizeof($breaks); // Number of page breaks + $length = ($cbrk + 1) * 2; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cbrk); + + // Append each page break + foreach ($breaks as $break) { + $data .= pack("v", $break); + } + + $this->_prepend($header . $data); + } + + /* + * Write the VERTICALPAGEBREAKS BIFF record. + */ + function _store_vbreak() { + // Return if the user hasn't specified pagebreaks + if(sizeof($this->_vbreaks)==0) { + return; + } + + // Sort and filter array of page breaks + $breaks = $this->_sort_pagebreaks($this->_vbreaks); + + $record = 0x001a; // Record identifier + $cbrk = sizeof($breaks); // Number of page breaks + $length = ($cbrk + 1) * 2; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("v", $cbrk); + + // Append each page break + foreach ($breaks as $break) { + $data .= pack("v", $break); + } + + $this->_prepend($header . $data); + } + + /* + * Set the Biff PROTECT record to indicate that the worksheet is + * protected. + */ + function _store_protect() { + // Exit unless sheet protection has been specified + if (!$this->_protect) { + return; + } + + $record = 0x0012; // Record identifier + $length = 0x0002; // Bytes to follow + + $fLock = $this->_protect; // Worksheet is protected + + $header = pack("vv", $record, $length); + $data = pack("v", $fLock); + + $this->_prepend($header . $data); + } + + /* + * Write the worksheet PASSWORD record. + */ + function _store_password() { + // Exit unless sheet protection and password have been specified + if (!$this->_protect || !$this->_password) { + return; + } + + $record = 0x0013; // Record identifier + $length = 0x0002; // Bytes to follow + + $wPassword = $this->_password; // Encoded password + + $header = pack("vv", $record, $length); + $data = pack("v", $wPassword); + + $this->_prepend($header . $data); + } + +############################################################################### +# +# insert_bitmap($row, $col, $filename, $x, $y, $scale_x, $scale_y) +# +# Insert a 24bit bitmap image in a worksheet. The main record required is +# IMDATA but it must be proceeded by a OBJ record to define its position. +# +function insert_bitmap() { + + $_=func_get_args(); + + # Check for a cell reference in A1 notation and substitute row and column + if (preg_match('/^\D/', $_[0])) { + $_ = $this->_substitute_cellref($_); + } + + $row = $_[0]; + $col = $_[1]; + $bitmap = $_[2]; + $x = $_[3] ? $_[3] : 0; + $y = $_[4] ? $_[4] : 0; + $scale_x = $_[5] ? $_[5] : 1; + $scale_y = $_[6] ? $_[6] : 1; + + list($width, $height, $size, $data) = $this->_process_bitmap($bitmap); + + # Scale the frame of the image. + $width *= $scale_x; + $height *= $scale_y; + + # Calculate the vertices of the image and write the OBJ record + $this->_position_image($col, $row, $x, $y, $width, $height); + + # Write the IMDATA record to store the bitmap data + $record = 0x007f; + $length = 8 + $size; + $cf = 0x09; + $env = 0x01; + $lcb = $size; + + $header = pack("vvvvV", $record, $length, $cf, $env, $lcb); + + $this->_append($header . $data); +} + + /* + * Calculate the vertices that define the position of the image as + * required by the OBJ record. + * + * +------------+------------+ + * | A | B | + * +-----+------------+------------+ + * | |(x1,y1) | | + * | 1 |(A1)._______|______ | + * | | | | | + * | | | | | + * +-----+----| BITMAP |-----+ + * | | | | | + * | 2 | |______________. | + * | | | (B2)| + * | | | (x2,y2)| + * +---- +------------+------------+ + * + * Example of a bitmap that covers some of the area from cell A1 to + * cell B2. + * + * Based on the width and height of the bitmap we need to calculate 8 + *vars: + * $col_start, $row_start, $col_end, $row_end, $x1, $y1, $x2, $y2. + * The width and height of the cells are also variable and have to be + * taken into account. + * The values of $col_start and $row_start are passed in from the calling + * function. The values of $col_end and $row_end are calculated by + * subtracting the width and height of the bitmap from the width and + * height of the underlying cells. + * The vertices are expressed as a percentage of the underlying cell + * width as follows (rhs values are in pixels): + * + * x1 = X / W *1024 + * y1 = Y / H *256 + * x2 = (X-1) / W *1024 + * y2 = (Y-1) / H *256 + * + * Where: X is distance from the left side of the underlying cell + * Y is distance from the top of the underlying cell + * W is the width of the cell + * H is the height of the cell + * + * Note: the SDK incorrectly states that the height should be expressed + * as a percentage of 1024. + */ + function _position_image($col_start, $row_start, $x1, $y1, + $width, $height) { + // $col_start Col containing upper left corner of object + // $x1 Distance to left side of object + + // $row_start Row containing top left corner of object + // $y1 Distance to top of object + + // $col_end Col containing lower right corner of object + // $x2 Distance to right side of object + + // $row_end Row containing bottom right corner of object + // $y2 Distance to bottom of object + + // $width Width of image frame + // $height Height of image frame + + // Initialise end cell to the same as the start cell + $col_end = $col_start; + $row_end = $row_start; + + // Zero the specified offset if greater than the cell dimensions + if ($x1 >= $this->_size_col($col_start)) { + $x1 = 0; + } + if ($y1 >= $this->_size_row($row_start)) { + $y1 = 0; + } + + $width = $width + $x1 -1; + $height = $height + $y1 -1; + + // Subtract the underlying cell widths to find the end cell of the + // image + while ($width >= $this->_size_col($col_end)) { + $width -= $this->_size_col($col_end); + $col_end++; + } + + // Subtract the underlying cell heights to find the end cell of the + // image + while ($height >= $this->_size_row($row_end)) { + $height -= $this->_size_row($row_end); + $row_end++; + } + + // Bitmap isn't allowed to start or finish in a hidden cell, i.e. a + // cell with zero height or width. + if ($this->_size_col($col_start) == 0) { return; } + if ($this->_size_col($col_end) == 0) { return; } + if ($this->_size_row($row_start) == 0) { return; } + if ($this->_size_row($row_end) == 0) { return; } + + // Convert the pixel values to the percentage value expected by Excel + $x1 = $x1 / $this->_size_col($col_start) * 1024; + $y1 = $y1 / $this->_size_row($row_start) * 256; + $x2 = $width / $this->_size_col($col_end) * 1024; + $y2 = $height / $this->_size_row($row_end) * 256; + + $this->_store_obj_picture($col_start, $x1, $row_start, $y1, + $col_end, $x2, $row_end, $y2); + } + + /* + * Convert the width of a cell from user's units to pixels. By + * interpolation the relationship is: y = 7x +5. If the width + * hasn't been set by the user we use the default value. If the + * col is hidden we use a value of zero. + */ + function _size_col($col) { + // Look up the cell value to see if it has been changed + if (isset($this->_col_sizes[$col])) { + if ($this->_col_sizes[$col] == 0) { + return 0; + } else { + return floor(7 * $this->_col_sizes[$col] + 5); + } + } else { + return 64; + } + } + + /* + * Convert the height of a cell from user's units to pixels. By + * interpolation # the relationship is: y = 4/3x. If the height + * hasn't been set by the user we use the default value. If the + * row is hidden we use a value of zero. (Not possible to hide row + * yet). + */ + function _size_row($row) { + // Look up the cell value to see if it has been changed + if (isset($this->_row_sizes[$row])) { + if ($this->_row_sizes[$row] == 0) { + return 0; + } else { + return floor(4/3 * $this->_row_sizes[$row]); + } + } else { + return 17; + } + } + + /* + * Store the OBJ record that precedes an IMDATA record. This could + * be generalized to support other Excel objects. + */ + function _store_obj_picture($col_start, $x1, $row_start, $y1, + $col_end, $x2, $row_end, $y2) { + $record = 0x005d; // Record identifier + $length = 0x003c; // Bytes to follow + + $cObj = 0x0001; // Count of objects in file (set to 1) + $OT = 0x0008; // Object type. 8 = Picture + $id = 0x0001; // Object ID + $grbit = 0x0614; // Option flags + + $colL = $col_start; // Col containing upper left corner of + // object + $dxL = $x1; // Distance from left side of cell + + $rwT = $row_start; // Row containing top left corner of + // object + $dyT = $y1; // Distance from top of cell + + $colR = $col_end; // Col containing lower right corner of + // object + $dxR = $x2; // Distance from right of cell + + $rwB = $row_end; // Row containing bottom right corner of + // object + $dyB = $y2; // Distance from bottom of cell + + $cbMacro = 0x0000; // Length of FMLA structure + $Reserved1 = 0x0000; // Reserved + $Reserved2 = 0x0000; // Reserved + + $icvBack = 0x09; // Background colour + $icvFore = 0x09; // Foreground colour + $fls = 0x00; // Fill pattern + $fAuto = 0x00; // Automatic fill + $icv = 0x08; // Line colour + $lns = 0xff; // Line style + $lnw = 0x01; // Line weight + $fAutoB = 0x00; // Automatic border + $frs = 0x0000; // Frame style + $cf = 0x0009; // Image format, 9 = bitmap + $Reserved3 = 0x0000; // Reserved + $cbPictFmla = 0x0000; // Length of FMLA structure + $Reserved4 = 0x0000; // Reserved + $grbit2 = 0x0001; // Option flags + $Reserved5 = 0x0000; // Reserved + + $header = pack("vv", $record, $length); + $data = pack("V", $cObj); + $data .= pack("v", $OT); + $data .= pack("v", $id); + $data .= pack("v", $grbit); + $data .= pack("v", $colL); + $data .= pack("v", $dxL); + $data .= pack("v", $rwT); + $data .= pack("v", $dyT); + $data .= pack("v", $colR); + $data .= pack("v", $dxR); + $data .= pack("v", $rwB); + $data .= pack("v", $dyB); + $data .= pack("v", $cbMacro); + $data .= pack("V", $Reserved1); + $data .= pack("v", $Reserved2); + $data .= pack("C", $icvBack); + $data .= pack("C", $icvFore); + $data .= pack("C", $fls); + $data .= pack("C", $fAuto); + $data .= pack("C", $icv); + $data .= pack("C", $lns); + $data .= pack("C", $lnw); + $data .= pack("C", $fAutoB); + $data .= pack("v", $frs); + $data .= pack("V", $cf); + $data .= pack("v", $Reserved3); + $data .= pack("v", $cbPictFmla); + $data .= pack("v", $Reserved4); + $data .= pack("v", $grbit2); + $data .= pack("V", $Reserved5); + + $this->_append($header . $data); + } + + /* + * Convert a 24 bit bitmap into the modified internal format used by + * Windows. This is described in BITMAPCOREHEADER and BITMAPCOREINFO + * structures in the MSDN library. + */ + function _process_bitmap($bitmap) { + // Open file and binmode the data in case the platform needs it. + $bmp=fopen($bitmap, "rb"); + if (!$bmp) { + trigger_error("Could not open file '$bitmap'.", E_USER_ERROR); + } + + $data=fread($bmp, filesize($bitmap)); + + // Check that the file is big enough to be a bitmap. + if (strlen($data) <= 0x36) { + trigger_error("$bitmap doesn't contain enough data.", + E_USER_ERROR); + } + + // The first 2 bytes are used to identify the bitmap. + if (substr($data, 0, 2) != "BM") { + trigger_error("$bitmap doesn't appear to to be a ". + "valid bitmap image.", E_USER_ERROR); + } + + // Remove bitmap data: ID. + $data = substr($data, 2); + + // Read and remove the bitmap size. This is more reliable than reading + // the data size at offset 0x22. + $array = unpack("Vsize", $data); + $data = substr($data, 4); + $size = $array["size"]; + $size -= 0x36; # Subtract size of bitmap header. + $size += 0x0C; # Add size of BIFF header. + + // Remove bitmap data: reserved, offset, header length. + $data = substr($data, 12); + + // Read and remove the bitmap width and height. Verify the sizes. + $array = unpack("Vwidth/Vheight", $data); + $data = substr($data, 8); + $width = $array["width"]; + $height = $array["height"]; + + if ($width > 0xFFFF) { + trigger_error("$bitmap: largest image width supported is 64k.", + E_USER_ERROR); + } + + if ($height > 0xFFFF) { + trigger_error("$bitmap: largest image height supported is 64k.", + E_USER_ERROR); + } + + // Read and remove the bitmap planes and bpp data. Verify them. + $array = unpack("vplanes/vbitcount", $data); + $data = substr($data, 4); + $planes = $array["planes"]; + $bitcount = $array["bitcount"]; + + if ($bitcount != 24) { + trigger_error("$bitmap isn't a 24bit true color bitmap.", + E_USER_ERROR); + } + + if ($planes != 1) { + trigger_error("$bitmap: only 1 plane supported in bitmap image.", + E_USER_ERROR); + } + + // Read and remove the bitmap compression. Verify compression. + $array = unpack("Vcompression", $data); + $data = substr($data, 4); + $compression = $array["compression"]; + + if ($compression != 0) { + trigger_error("$bitmap: compression not supported in bitmap image.", + E_USER_ERROR); + } + + // Remove bitmap data: data size, hres, vres, colours, imp. colours. + $data = substr($data, 20); + + // Add the BITMAPCOREHEADER data + $header = pack("Vvvvv", 0x000c, $width, $height, 0x01, 0x18); + $data = $header . $data; + + return array($width, $height, $size, $data); + } + + /* + * Store the window zoom factor. This should be a reduced fraction but for + * simplicity we will store all fractions with a numerator of 100. + */ + function _store_zoom() { + // If scale is 100% we don't need to write a record + if ($this->_zoom == 100) { + return; + } + + $record = 0x00A0; // Record identifier + $length = 0x0004; // Bytes to follow + + $header = pack("vv", $record, $length); + $data = pack("vv", $this->_zoom, 100); + + $this->_append($header . $data); + } + +} + +?> diff --git a/lib/Excel/reader.php b/lib/Excel/reader.php new file mode 100644 index 000000000..97c5becc8 --- /dev/null +++ b/lib/Excel/reader.php @@ -0,0 +1,1084 @@ + +* @license http://www.php.net/license/3_0.txt PHP License 3.0 +* @version CVS: $Id: reader.php 19 2007-03-13 12:42:41Z shangxiao $ +* @link http://pear.php.net/package/Spreadsheet_Excel_Reader +* @see OLE, Spreadsheet_Excel_Writer +*/ + + +//require_once 'PEAR.php'; +require_once 'oleread.inc'; +//require_once 'OLE.php'; + +define('SPREADSHEET_EXCEL_READER_BIFF8', 0x600); +define('SPREADSHEET_EXCEL_READER_BIFF7', 0x500); +define('SPREADSHEET_EXCEL_READER_WORKBOOKGLOBALS', 0x5); +define('SPREADSHEET_EXCEL_READER_WORKSHEET', 0x10); + +define('SPREADSHEET_EXCEL_READER_TYPE_BOF', 0x809); +define('SPREADSHEET_EXCEL_READER_TYPE_EOF', 0x0a); +define('SPREADSHEET_EXCEL_READER_TYPE_BOUNDSHEET', 0x85); +define('SPREADSHEET_EXCEL_READER_TYPE_DIMENSION', 0x200); +define('SPREADSHEET_EXCEL_READER_TYPE_ROW', 0x208); +define('SPREADSHEET_EXCEL_READER_TYPE_DBCELL', 0xd7); +define('SPREADSHEET_EXCEL_READER_TYPE_FILEPASS', 0x2f); +define('SPREADSHEET_EXCEL_READER_TYPE_NOTE', 0x1c); +define('SPREADSHEET_EXCEL_READER_TYPE_TXO', 0x1b6); +define('SPREADSHEET_EXCEL_READER_TYPE_RK', 0x7e); +define('SPREADSHEET_EXCEL_READER_TYPE_RK2', 0x27e); +define('SPREADSHEET_EXCEL_READER_TYPE_MULRK', 0xbd); +define('SPREADSHEET_EXCEL_READER_TYPE_MULBLANK', 0xbe); +define('SPREADSHEET_EXCEL_READER_TYPE_INDEX', 0x20b); +define('SPREADSHEET_EXCEL_READER_TYPE_SST', 0xfc); +define('SPREADSHEET_EXCEL_READER_TYPE_EXTSST', 0xff); +define('SPREADSHEET_EXCEL_READER_TYPE_CONTINUE', 0x3c); +define('SPREADSHEET_EXCEL_READER_TYPE_LABEL', 0x204); +define('SPREADSHEET_EXCEL_READER_TYPE_LABELSST', 0xfd); +define('SPREADSHEET_EXCEL_READER_TYPE_NUMBER', 0x203); +define('SPREADSHEET_EXCEL_READER_TYPE_NAME', 0x18); +define('SPREADSHEET_EXCEL_READER_TYPE_ARRAY', 0x221); +define('SPREADSHEET_EXCEL_READER_TYPE_STRING', 0x207); +define('SPREADSHEET_EXCEL_READER_TYPE_FORMULA', 0x406); +define('SPREADSHEET_EXCEL_READER_TYPE_FORMULA2', 0x6); +define('SPREADSHEET_EXCEL_READER_TYPE_FORMAT', 0x41e); +define('SPREADSHEET_EXCEL_READER_TYPE_XF', 0xe0); +define('SPREADSHEET_EXCEL_READER_TYPE_BOOLERR', 0x205); +define('SPREADSHEET_EXCEL_READER_TYPE_UNKNOWN', 0xffff); +define('SPREADSHEET_EXCEL_READER_TYPE_NINETEENFOUR', 0x22); +define('SPREADSHEET_EXCEL_READER_TYPE_MERGEDCELLS', 0xE5); + +define('SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS' , 25569); +define('SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904', 24107); +define('SPREADSHEET_EXCEL_READER_MSINADAY', 86400); +//define('SPREADSHEET_EXCEL_READER_MSINADAY', 24 * 60 * 60); + +//define('SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT', "%.2f"); +define('SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT', "%s"); + + +/* +* Place includes, constant defines and $_GLOBAL settings here. +* Make sure they have appropriate docblocks to avoid phpDocumentor +* construing they are documented by the page-level docblock. +*/ + +/** +* A class for reading Microsoft Excel Spreadsheets. +* +* Originally developed by Vadim Tkachenko under the name PHPExcelReader. +* (http://sourceforge.net/projects/phpexcelreader) +* Based on the Java version by Andy Khan (http://www.andykhan.com). Now +* maintained by David Sanders. Reads only Biff 7 and Biff 8 formats. +* +* @category Spreadsheet +* @package Spreadsheet_Excel_Reader +* @author Vadim Tkachenko +* @copyright 1997-2005 The PHP Group +* @license http://www.php.net/license/3_0.txt PHP License 3.0 +* @version Release: @package_version@ +* @link http://pear.php.net/package/PackageName +* @see OLE, Spreadsheet_Excel_Writer +*/ +class Spreadsheet_Excel_Reader +{ + /** + * Array of worksheets found + * + * @var array + * @access public + */ + var $boundsheets = array(); + + /** + * Array of format records found + * + * @var array + * @access public + */ + var $formatRecords = array(); + + /** + * todo + * + * @var array + * @access public + */ + var $sst = array(); + + /** + * Array of worksheets + * + * The data is stored in 'cells' and the meta-data is stored in an array + * called 'cellsInfo' + * + * Example: + * + * $sheets --> 'cells' --> row --> column --> Interpreted value + * --> 'cellsInfo' --> row --> column --> 'type' - Can be 'date', 'number', or 'unknown' + * --> 'raw' - The raw data that Excel stores for that data cell + * + * @var array + * @access public + */ + var $sheets = array(); + + /** + * The data returned by OLE + * + * @var string + * @access public + */ + var $data; + + /** + * OLE object for reading the file + * + * @var OLE object + * @access private + */ + var $_ole; + + /** + * Default encoding + * + * @var string + * @access private + */ + var $_defaultEncoding; + + /** + * Default number format + * + * @var integer + * @access private + */ + var $_defaultFormat = SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT; + + /** + * todo + * List of formats to use for each column + * + * @var array + * @access private + */ + var $_columnsFormat = array(); + + /** + * todo + * + * @var integer + * @access private + */ + var $_rowoffset = 1; + + /** + * todo + * + * @var integer + * @access private + */ + var $_coloffset = 1; + + /** + * List of default date formats used by Excel + * + * @var array + * @access public + */ + var $dateFormats = array ( + 0xe => "d/m/Y", + 0xf => "d-M-Y", + 0x10 => "d-M", + 0x11 => "M-Y", + 0x12 => "h:i a", + 0x13 => "h:i:s a", + 0x14 => "H:i", + 0x15 => "H:i:s", + 0x16 => "d/m/Y H:i", + 0x2d => "i:s", + 0x2e => "H:i:s", + 0x2f => "i:s.S"); + + /** + * Default number formats used by Excel + * + * @var array + * @access public + */ + var $numberFormats = array( + 0x1 => "%1.0f", // "0" + 0x2 => "%1.2f", // "0.00", + 0x3 => "%1.0f", //"#,##0", + 0x4 => "%1.2f", //"#,##0.00", + 0x5 => "%1.0f", /*"$#,##0;($#,##0)",*/ + 0x6 => '$%1.0f', /*"$#,##0;($#,##0)",*/ + 0x7 => '$%1.2f', //"$#,##0.00;($#,##0.00)", + 0x8 => '$%1.2f', //"$#,##0.00;($#,##0.00)", + 0x9 => '%1.0f%%', // "0%" + 0xa => '%1.2f%%', // "0.00%" + 0xb => '%1.2f', // 0.00E00", + 0x25 => '%1.0f', // "#,##0;(#,##0)", + 0x26 => '%1.0f', //"#,##0;(#,##0)", + 0x27 => '%1.2f', //"#,##0.00;(#,##0.00)", + 0x28 => '%1.2f', //"#,##0.00;(#,##0.00)", + 0x29 => '%1.0f', //"#,##0;(#,##0)", + 0x2a => '$%1.0f', //"$#,##0;($#,##0)", + 0x2b => '%1.2f', //"#,##0.00;(#,##0.00)", + 0x2c => '$%1.2f', //"$#,##0.00;($#,##0.00)", + 0x30 => '%1.0f'); //"##0.0E0"; + + // }}} + // {{{ Spreadsheet_Excel_Reader() + + /** + * Constructor + * + * Some basic initialisation + */ + function Spreadsheet_Excel_Reader() + { + $this->_ole =& new OLERead(); + $this->setUTFEncoder('iconv'); + } + + // }}} + // {{{ setOutputEncoding() + + /** + * Set the encoding method + * + * @param string Encoding to use + * @access public + */ + function setOutputEncoding($encoding) + { + $this->_defaultEncoding = $encoding; + } + + // }}} + // {{{ setUTFEncoder() + + /** + * $encoder = 'iconv' or 'mb' + * set iconv if you would like use 'iconv' for encode UTF-16LE to your encoding + * set mb if you would like use 'mb_convert_encoding' for encode UTF-16LE to your encoding + * + * @access public + * @param string Encoding type to use. Either 'iconv' or 'mb' + */ + function setUTFEncoder($encoder = 'iconv') + { + $this->_encoderFunction = ''; + + if ($encoder == 'iconv') { + $this->_encoderFunction = function_exists('iconv') ? 'iconv' : ''; + } elseif ($encoder == 'mb') { + $this->_encoderFunction = function_exists('mb_convert_encoding') ? + 'mb_convert_encoding' : + ''; + } + } + + // }}} + // {{{ setRowColOffset() + + /** + * todo + * + * @access public + * @param offset + */ + function setRowColOffset($iOffset) + { + $this->_rowoffset = $iOffset; + $this->_coloffset = $iOffset; + } + + // }}} + // {{{ setDefaultFormat() + + /** + * Set the default number format + * + * @access public + * @param Default format + */ + function setDefaultFormat($sFormat) + { + $this->_defaultFormat = $sFormat; + } + + // }}} + // {{{ setColumnFormat() + + /** + * Force a column to use a certain format + * + * @access public + * @param integer Column number + * @param string Format + */ + function setColumnFormat($column, $sFormat) + { + $this->_columnsFormat[$column] = $sFormat; + } + + + // }}} + // {{{ read() + + /** + * Read the spreadsheet file using OLE, then parse + * + * @access public + * @param filename + * @todo return a valid value + */ + function read($sFileName) + { + /* + require_once 'OLE.php'; + $ole = new OLE(); + $ole->read($sFileName); + + foreach ($ole->_list as $i => $pps) { + if (($pps->Name == 'Workbook' || $pps->Name == 'Book') && + $pps->Size >= SMALL_BLOCK_THRESHOLD) { + + $this->data = $ole->getData($i, 0, $ole->getDataLength($i)); + } elseif ($pps->Name == 'Root Entry') { + $this->data = $ole->getData($i, 0, $ole->getDataLength($i)); + } + //var_dump(strlen($ole->getData($i, 0, $ole->getDataLength($i))), $pps->Name, md5($this->data), $ole->getDataLength($i)); + } +//exit; + $this->_parse(); + + return sizeof($this->sheets) > 0; + */ + + $res = $this->_ole->read($sFileName); + + // oops, something goes wrong (Darko Miljanovic) + if($res === false) { + // check error code + if($this->_ole->error == 1) { + // bad file + die('The filename ' . $sFileName . ' is not readable'); + } + // check other error codes here (eg bad fileformat, etc...) + } + + $this->data = $this->_ole->getWorkBook(); + + + /* + $res = $this->_ole->read($sFileName); + + if ($this->isError($res)) { +// var_dump($res); + return $this->raiseError($res); + } + + $total = $this->_ole->ppsTotal(); + for ($i = 0; $i < $total; $i++) { + if ($this->_ole->isFile($i)) { + $type = unpack("v", $this->_ole->getData($i, 0, 2)); + if ($type[''] == 0x0809) { // check if it's a BIFF stream + $this->_index = $i; + $this->data = $this->_ole->getData($i, 0, $this->_ole->getDataLength($i)); + break; + } + } + } + + if ($this->_index === null) { + return $this->raiseError("$file doesn't seem to be an Excel file"); + } + + */ + + //echo "data =".$this->data; + //$this->readRecords(); + $this->_parse(); + } + + + // }}} + // {{{ _parse() + + /** + * Parse a workbook + * + * @access private + * @return bool + */ + function _parse() + { + $pos = 0; + + $code = ord($this->data[$pos]) | ord($this->data[$pos+1])<<8; + $length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])<<8; + + $version = ord($this->data[$pos + 4]) | ord($this->data[$pos + 5])<<8; + $substreamType = ord($this->data[$pos + 6]) | ord($this->data[$pos + 7])<<8; + //echo "Start parse code=".base_convert($code,10,16)." version=".base_convert($version,10,16)." substreamType=".base_convert($substreamType,10,16).""."\n"; + + if (($version != SPREADSHEET_EXCEL_READER_BIFF8) && + ($version != SPREADSHEET_EXCEL_READER_BIFF7)) { + return false; + } + + if ($substreamType != SPREADSHEET_EXCEL_READER_WORKBOOKGLOBALS){ + return false; + } + + //print_r($rec); + $pos += $length + 4; + + $code = ord($this->data[$pos]) | ord($this->data[$pos+1])<<8; + $length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])<<8; + + while ($code != SPREADSHEET_EXCEL_READER_TYPE_EOF) { + switch ($code) { + case SPREADSHEET_EXCEL_READER_TYPE_SST: + //echo "Type_SST\n"; + $spos = $pos + 4; + $limitpos = $spos + $length; + $uniqueStrings = $this->_GetInt4d($this->data, $spos+4); + $spos += 8; + for ($i = 0; $i < $uniqueStrings; $i++) { + // Read in the number of characters + if ($spos == $limitpos) { + $opcode = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $conlength = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + if ($opcode != 0x3c) { + return -1; + } + $spos += 4; + $limitpos = $spos + $conlength; + } + $numChars = ord($this->data[$spos]) | (ord($this->data[$spos+1]) << 8); + //echo "i = $i pos = $pos numChars = $numChars "; + $spos += 2; + $optionFlags = ord($this->data[$spos]); + $spos++; + $asciiEncoding = (($optionFlags & 0x01) == 0) ; + $extendedString = ( ($optionFlags & 0x04) != 0); + + // See if string contains formatting information + $richString = ( ($optionFlags & 0x08) != 0); + + if ($richString) { + // Read in the crun + $formattingRuns = ord($this->data[$spos]) | (ord($this->data[$spos+1]) << 8); + $spos += 2; + } + + if ($extendedString) { + // Read in cchExtRst + $extendedRunLength = $this->_GetInt4d($this->data, $spos); + $spos += 4; + } + + $len = ($asciiEncoding)? $numChars : $numChars*2; + if ($spos + $len < $limitpos) { + $retstr = substr($this->data, $spos, $len); + $spos += $len; + }else{ + // found countinue + $retstr = substr($this->data, $spos, $limitpos - $spos); + $bytesRead = $limitpos - $spos; + $charsLeft = $numChars - (($asciiEncoding) ? $bytesRead : ($bytesRead / 2)); + $spos = $limitpos; + + while ($charsLeft > 0){ + $opcode = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $conlength = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + if ($opcode != 0x3c) { + return -1; + } + $spos += 4; + $limitpos = $spos + $conlength; + $option = ord($this->data[$spos]); + $spos += 1; + if ($asciiEncoding && ($option == 0)) { + $len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength); + $retstr .= substr($this->data, $spos, $len); + $charsLeft -= $len; + $asciiEncoding = true; + }elseif (!$asciiEncoding && ($option != 0)){ + $len = min($charsLeft * 2, $limitpos - $spos); // min($charsLeft, $conlength); + $retstr .= substr($this->data, $spos, $len); + $charsLeft -= $len/2; + $asciiEncoding = false; + }elseif (!$asciiEncoding && ($option == 0)) { + // Bummer - the string starts off as Unicode, but after the + // continuation it is in straightforward ASCII encoding + $len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength); + for ($j = 0; $j < $len; $j++) { + $retstr .= $this->data[$spos + $j].chr(0); + } + $charsLeft -= $len; + $asciiEncoding = false; + }else{ + $newstr = ''; + for ($j = 0; $j < strlen($retstr); $j++) { + $newstr = $retstr[$j].chr(0); + } + $retstr = $newstr; + $len = min($charsLeft * 2, $limitpos - $spos); // min($charsLeft, $conlength); + $retstr .= substr($this->data, $spos, $len); + $charsLeft -= $len/2; + $asciiEncoding = false; + //echo "Izavrat\n"; + } + $spos += $len; + + } + } + $retstr = ($asciiEncoding) ? $retstr : $this->_encodeUTF16($retstr); +// echo "Str $i = $retstr\n"; + if ($richString){ + $spos += 4 * $formattingRuns; + } + + // For extended strings, skip over the extended string data + if ($extendedString) { + $spos += $extendedRunLength; + } + //if ($retstr == 'Derby'){ + // echo "bb\n"; + //} + $this->sst[]=$retstr; + } + /*$continueRecords = array(); + while ($this->getNextCode() == Type_CONTINUE) { + $continueRecords[] = &$this->nextRecord(); + } + //echo " 1 Type_SST\n"; + $this->shareStrings = new SSTRecord($r, $continueRecords); + //print_r($this->shareStrings->strings); + */ + // echo 'SST read: '.($time_end-$time_start)."\n"; + break; + + case SPREADSHEET_EXCEL_READER_TYPE_FILEPASS: + return false; + break; + case SPREADSHEET_EXCEL_READER_TYPE_NAME: + //echo "Type_NAME\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_FORMAT: + $indexCode = ord($this->data[$pos+4]) | ord($this->data[$pos+5]) << 8; + + if ($version == SPREADSHEET_EXCEL_READER_BIFF8) { + $numchars = ord($this->data[$pos+6]) | ord($this->data[$pos+7]) << 8; + if (ord($this->data[$pos+8]) == 0){ + $formatString = substr($this->data, $pos+9, $numchars); + } else { + $formatString = substr($this->data, $pos+9, $numchars*2); + } + } else { + $numchars = ord($this->data[$pos+6]); + $formatString = substr($this->data, $pos+7, $numchars*2); + } + + $this->formatRecords[$indexCode] = $formatString; + // echo "Type.FORMAT\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_XF: + //global $dateFormats, $numberFormats; + $indexCode = ord($this->data[$pos+6]) | ord($this->data[$pos+7]) << 8; + //echo "\nType.XF ".count($this->formatRecords['xfrecords'])." $indexCode "; + if (array_key_exists($indexCode, $this->dateFormats)) { + //echo "isdate ".$dateFormats[$indexCode]; + $this->formatRecords['xfrecords'][] = array( + 'type' => 'date', + 'format' => $this->dateFormats[$indexCode] + ); + }elseif (array_key_exists($indexCode, $this->numberFormats)) { + //echo "isnumber ".$this->numberFormats[$indexCode]; + $this->formatRecords['xfrecords'][] = array( + 'type' => 'number', + 'format' => $this->numberFormats[$indexCode] + ); + }else{ + $isdate = FALSE; + if ($indexCode > 0){ + if (isset($this->formatRecords[$indexCode])) + $formatstr = $this->formatRecords[$indexCode]; + //echo '.other.'; + //echo "\ndate-time=$formatstr=\n"; + if ($formatstr) + if (preg_match("/[^hmsday\/\-:\s]/i", $formatstr) == 0) { // found day and time format + $isdate = TRUE; + $formatstr = str_replace('mm', 'i', $formatstr); + $formatstr = str_replace('h', 'H', $formatstr); + //echo "\ndate-time $formatstr \n"; + } + } + + if ($isdate){ + $this->formatRecords['xfrecords'][] = array( + 'type' => 'date', + 'format' => $formatstr, + ); + }else{ + $this->formatRecords['xfrecords'][] = array( + 'type' => 'other', + 'format' => '', + 'code' => $indexCode + ); + } + } + //echo "\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_NINETEENFOUR: + //echo "Type.NINETEENFOUR\n"; + $this->nineteenFour = (ord($this->data[$pos+4]) == 1); + break; + case SPREADSHEET_EXCEL_READER_TYPE_BOUNDSHEET: + //echo "Type.BOUNDSHEET\n"; + $rec_offset = $this->_GetInt4d($this->data, $pos+4); + $rec_typeFlag = ord($this->data[$pos+8]); + $rec_visibilityFlag = ord($this->data[$pos+9]); + $rec_length = ord($this->data[$pos+10]); + + if ($version == SPREADSHEET_EXCEL_READER_BIFF8){ + $chartype = ord($this->data[$pos+11]); + if ($chartype == 0){ + $rec_name = substr($this->data, $pos+12, $rec_length); + } else { + $rec_name = $this->_encodeUTF16(substr($this->data, $pos+12, $rec_length*2)); + } + }elseif ($version == SPREADSHEET_EXCEL_READER_BIFF7){ + $rec_name = substr($this->data, $pos+11, $rec_length); + } + $this->boundsheets[] = array('name'=>$rec_name, + 'offset'=>$rec_offset); + + break; + + } + + //echo "Code = ".base_convert($r['code'],10,16)."\n"; + $pos += $length + 4; + $code = ord($this->data[$pos]) | ord($this->data[$pos+1])<<8; + $length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])<<8; + + //$r = &$this->nextRecord(); + //echo "1 Code = ".base_convert($r['code'],10,16)."\n"; + } + + foreach ($this->boundsheets as $key=>$val){ + $this->sn = $key; + $this->_parsesheet($val['offset']); + } + return true; + + } + + /** + * Parse a worksheet + * + * @access private + * @param todo + * @todo fix return codes + */ + function _parsesheet($spos) + { + $cont = true; + // read BOF + $code = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $length = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + + $version = ord($this->data[$spos + 4]) | ord($this->data[$spos + 5])<<8; + $substreamType = ord($this->data[$spos + 6]) | ord($this->data[$spos + 7])<<8; + + if (($version != SPREADSHEET_EXCEL_READER_BIFF8) && ($version != SPREADSHEET_EXCEL_READER_BIFF7)) { + return -1; + } + + if ($substreamType != SPREADSHEET_EXCEL_READER_WORKSHEET){ + return -2; + } + //echo "Start parse code=".base_convert($code,10,16)." version=".base_convert($version,10,16)." substreamType=".base_convert($substreamType,10,16).""."\n"; + $spos += $length + 4; + //var_dump($this->formatRecords); + //echo "code $code $length"; + while($cont) { + //echo "mem= ".memory_get_usage()."\n"; +// $r = &$this->file->nextRecord(); + $lowcode = ord($this->data[$spos]); + if ($lowcode == SPREADSHEET_EXCEL_READER_TYPE_EOF) break; + $code = $lowcode | ord($this->data[$spos+1])<<8; + $length = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $spos += 4; + $this->sheets[$this->sn]['maxrow'] = $this->_rowoffset - 1; + $this->sheets[$this->sn]['maxcol'] = $this->_coloffset - 1; + //echo "Code=".base_convert($code,10,16)." $code\n"; + unset($this->rectype); + $this->multiplier = 1; // need for format with % + switch ($code) { + case SPREADSHEET_EXCEL_READER_TYPE_DIMENSION: + //echo 'Type_DIMENSION '; + if (!isset($this->numRows)) { + if (($length == 10) || ($version == SPREADSHEET_EXCEL_READER_BIFF7)){ + $this->sheets[$this->sn]['numRows'] = ord($this->data[$spos+2]) | ord($this->data[$spos+3]) << 8; + $this->sheets[$this->sn]['numCols'] = ord($this->data[$spos+6]) | ord($this->data[$spos+7]) << 8; + } else { + $this->sheets[$this->sn]['numRows'] = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8; + $this->sheets[$this->sn]['numCols'] = ord($this->data[$spos+10]) | ord($this->data[$spos+11]) << 8; + } + } + //echo 'numRows '.$this->numRows.' '.$this->numCols."\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_MERGEDCELLS: + $cellRanges = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + for ($i = 0; $i < $cellRanges; $i++) { + $fr = ord($this->data[$spos + 8*$i + 2]) | ord($this->data[$spos + 8*$i + 3])<<8; + $lr = ord($this->data[$spos + 8*$i + 4]) | ord($this->data[$spos + 8*$i + 5])<<8; + $fc = ord($this->data[$spos + 8*$i + 6]) | ord($this->data[$spos + 8*$i + 7])<<8; + $lc = ord($this->data[$spos + 8*$i + 8]) | ord($this->data[$spos + 8*$i + 9])<<8; + //$this->sheets[$this->sn]['mergedCells'][] = array($fr + 1, $fc + 1, $lr + 1, $lc + 1); + if ($lr - $fr > 0) { + $this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1]['rowspan'] = $lr - $fr + 1; + } + if ($lc - $fc > 0) { + $this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1]['colspan'] = $lc - $fc + 1; + } + } + //echo "Merged Cells $cellRanges $lr $fr $lc $fc\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_RK: + case SPREADSHEET_EXCEL_READER_TYPE_RK2: + //echo 'SPREADSHEET_EXCEL_READER_TYPE_RK'."\n"; + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $rknum = $this->_GetInt4d($this->data, $spos + 6); + $numValue = $this->_GetIEEE754($rknum); + //echo $numValue." "; + if ($this->isDate($spos)) { + list($string, $raw) = $this->createDate($numValue); + }else{ + $raw = $numValue; + if (isset($this->_columnsFormat[$column + 1])){ + $this->curformat = $this->_columnsFormat[$column + 1]; + } + $string = sprintf($this->curformat, $numValue * $this->multiplier); + //$this->addcell(RKRecord($r)); + } + $this->addcell($row, $column, $string, $raw); + //echo "Type_RK $row $column $string $raw {$this->curformat}\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_LABELSST: + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5])<<8; + $index = $this->_GetInt4d($this->data, $spos + 6); + //var_dump($this->sst); + $this->addcell($row, $column, $this->sst[$index]); + //echo "LabelSST $row $column $string\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_MULRK: + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $colFirst = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $colLast = ord($this->data[$spos + $length - 2]) | ord($this->data[$spos + $length - 1])<<8; + $columns = $colLast - $colFirst + 1; + $tmppos = $spos+4; + for ($i = 0; $i < $columns; $i++) { + $numValue = $this->_GetIEEE754($this->_GetInt4d($this->data, $tmppos + 2)); + if ($this->isDate($tmppos-4)) { + list($string, $raw) = $this->createDate($numValue); + }else{ + $raw = $numValue; + if (isset($this->_columnsFormat[$colFirst + $i + 1])){ + $this->curformat = $this->_columnsFormat[$colFirst + $i + 1]; + } + $string = sprintf($this->curformat, $numValue * $this->multiplier); + } + //$rec['rknumbers'][$i]['xfindex'] = ord($rec['data'][$pos]) | ord($rec['data'][$pos+1]) << 8; + $tmppos += 6; + $this->addcell($row, $colFirst + $i, $string, $raw); + //echo "MULRK $row ".($colFirst + $i)." $string\n"; + } + //MulRKRecord($r); + // Get the individual cell records from the multiple record + //$num = ; + + break; + case SPREADSHEET_EXCEL_READER_TYPE_NUMBER: + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $tmp = unpack("ddouble", substr($this->data, $spos + 6, 8)); // It machine machine dependent + if ($this->isDate($spos)) { + list($string, $raw) = $this->createDate($tmp['double']); + // $this->addcell(DateRecord($r, 1)); + }else{ + //$raw = $tmp['']; + if (isset($this->_columnsFormat[$column + 1])){ + $this->curformat = $this->_columnsFormat[$column + 1]; + } + $raw = $this->createNumber($spos); + $string = sprintf($this->curformat, $raw * $this->multiplier); + + // $this->addcell(NumberRecord($r)); + } + $this->addcell($row, $column, $string, $raw); + //echo "Number $row $column $string\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_FORMULA: + case SPREADSHEET_EXCEL_READER_TYPE_FORMULA2: + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + if ((ord($this->data[$spos+6])==0) && (ord($this->data[$spos+12])==255) && (ord($this->data[$spos+13])==255)) { + //String formula. Result follows in a STRING record + //echo "FORMULA $row $column Formula with a string
    \n"; + } elseif ((ord($this->data[$spos+6])==1) && (ord($this->data[$spos+12])==255) && (ord($this->data[$spos+13])==255)) { + //Boolean formula. Result is in +2; 0=false,1=true + } elseif ((ord($this->data[$spos+6])==2) && (ord($this->data[$spos+12])==255) && (ord($this->data[$spos+13])==255)) { + //Error formula. Error code is in +2; + } elseif ((ord($this->data[$spos+6])==3) && (ord($this->data[$spos+12])==255) && (ord($this->data[$spos+13])==255)) { + //Formula result is a null string. + } else { + // result is a number, so first 14 bytes are just like a _NUMBER record + $tmp = unpack("ddouble", substr($this->data, $spos + 6, 8)); // It machine machine dependent + if ($this->isDate($spos)) { + list($string, $raw) = $this->createDate($tmp['double']); + // $this->addcell(DateRecord($r, 1)); + }else{ + //$raw = $tmp['']; + if (isset($this->_columnsFormat[$column + 1])){ + $this->curformat = $this->_columnsFormat[$column + 1]; + } + $raw = $this->createNumber($spos); + $string = sprintf($this->curformat, $raw * $this->multiplier); + + // $this->addcell(NumberRecord($r)); + } + $this->addcell($row, $column, $string, $raw); + //echo "Number $row $column $string\n"; + } + break; + case SPREADSHEET_EXCEL_READER_TYPE_BOOLERR: + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $string = ord($this->data[$spos+6]); + $this->addcell($row, $column, $string); + //echo 'Type_BOOLERR '."\n"; + break; + case SPREADSHEET_EXCEL_READER_TYPE_ROW: + case SPREADSHEET_EXCEL_READER_TYPE_DBCELL: + case SPREADSHEET_EXCEL_READER_TYPE_MULBLANK: + break; + case SPREADSHEET_EXCEL_READER_TYPE_LABEL: + $row = ord($this->data[$spos]) | ord($this->data[$spos+1])<<8; + $column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])<<8; + $this->addcell($row, $column, substr($this->data, $spos + 8, ord($this->data[$spos + 6]) | ord($this->data[$spos + 7])<<8)); + + // $this->addcell(LabelRecord($r)); + break; + + case SPREADSHEET_EXCEL_READER_TYPE_EOF: + $cont = false; + break; + default: + //echo ' unknown :'.base_convert($r['code'],10,16)."\n"; + break; + + } + $spos += $length; + } + + if (!isset($this->sheets[$this->sn]['numRows'])) + $this->sheets[$this->sn]['numRows'] = $this->sheets[$this->sn]['maxrow']; + if (!isset($this->sheets[$this->sn]['numCols'])) + $this->sheets[$this->sn]['numCols'] = $this->sheets[$this->sn]['maxcol']; + + } + + /** + * Check whether the current record read is a date + * + * @param todo + * @return boolean True if date, false otherwise + */ + function isDate($spos) + { + //$xfindex = GetInt2d(, 4); + $xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5]) << 8; + //echo 'check is date '.$xfindex.' '.$this->formatRecords['xfrecords'][$xfindex]['type']."\n"; + //var_dump($this->formatRecords['xfrecords'][$xfindex]); + if ($this->formatRecords['xfrecords'][$xfindex]['type'] == 'date') { + $this->curformat = $this->formatRecords['xfrecords'][$xfindex]['format']; + $this->rectype = 'date'; + return true; + } else { + if ($this->formatRecords['xfrecords'][$xfindex]['type'] == 'number') { + $this->curformat = $this->formatRecords['xfrecords'][$xfindex]['format']; + $this->rectype = 'number'; + if (($xfindex == 0x9) || ($xfindex == 0xa)){ + $this->multiplier = 100; + } + }else{ + $this->curformat = $this->_defaultFormat; + $this->rectype = 'unknown'; + } + return false; + } + } + + //}}} + //{{{ createDate() + + /** + * Convert the raw Excel date into a human readable format + * + * Dates in Excel are stored as number of seconds from an epoch. On + * Windows, the epoch is 30/12/1899 and on Mac it's 01/01/1904 + * + * @access private + * @param integer The raw Excel value to convert + * @return array First element is the converted date, the second element is number a unix timestamp + */ + function createDate($numValue) + { + if ($numValue > 1) { + $utcDays = $numValue - ($this->nineteenFour ? SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904 : SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS); + $utcValue = round(($utcDays+1) * SPREADSHEET_EXCEL_READER_MSINADAY); + $string = date ($this->curformat, $utcValue); + $raw = $utcValue; + } else { + $raw = $numValue; + $hours = floor($numValue * 24); + $mins = floor($numValue * 24 * 60) - $hours * 60; + $secs = floor($numValue * SPREADSHEET_EXCEL_READER_MSINADAY) - $hours * 60 * 60 - $mins * 60; + $string = date ($this->curformat, mktime($hours, $mins, $secs)); + } + + return array($string, $raw); + } + + function createNumber($spos) + { + $rknumhigh = $this->_GetInt4d($this->data, $spos + 10); + $rknumlow = $this->_GetInt4d($this->data, $spos + 6); + //for ($i=0; $i<8; $i++) { echo ord($this->data[$i+$spos+6]) . " "; } echo "
    "; + $sign = ($rknumhigh & 0x80000000) >> 31; + $exp = ($rknumhigh & 0x7ff00000) >> 20; + $mantissa = (0x100000 | ($rknumhigh & 0x000fffff)); + $mantissalow1 = ($rknumlow & 0x80000000) >> 31; + $mantissalow2 = ($rknumlow & 0x7fffffff); + $value = $mantissa / pow( 2 , (20- ($exp - 1023))); + if ($mantissalow1 != 0) $value += 1 / pow (2 , (21 - ($exp - 1023))); + $value += $mantissalow2 / pow (2 , (52 - ($exp - 1023))); + //echo "Sign = $sign, Exp = $exp, mantissahighx = $mantissa, mantissalow1 = $mantissalow1, mantissalow2 = $mantissalow2
    \n"; + if ($sign) {$value = -1 * $value;} + return $value; + } + + function addcell($row, $col, $string, $raw = '') + { + //echo "ADD cel $row-$col $string\n"; + $this->sheets[$this->sn]['maxrow'] = max($this->sheets[$this->sn]['maxrow'], $row + $this->_rowoffset); + $this->sheets[$this->sn]['maxcol'] = max($this->sheets[$this->sn]['maxcol'], $col + $this->_coloffset); + $this->sheets[$this->sn]['cells'][$row + $this->_rowoffset][$col + $this->_coloffset] = $string; + if ($raw) + $this->sheets[$this->sn]['cellsInfo'][$row + $this->_rowoffset][$col + $this->_coloffset]['raw'] = $raw; + if (isset($this->rectype)) + $this->sheets[$this->sn]['cellsInfo'][$row + $this->_rowoffset][$col + $this->_coloffset]['type'] = $this->rectype; + + } + + + function _GetIEEE754($rknum) + { + if (($rknum & 0x02) != 0) { + $value = $rknum >> 2; + } else { +//mmp +// first comment out the previously existing 7 lines of code here +// $tmp = unpack("d", pack("VV", 0, ($rknum & 0xfffffffc))); +// //$value = $tmp['']; +// if (array_key_exists(1, $tmp)) { +// $value = $tmp[1]; +// } else { +// $value = $tmp['']; +// } +// I got my info on IEEE754 encoding from +// http://research.microsoft.com/~hollasch/cgindex/coding/ieeefloat.html +// The RK format calls for using only the most significant 30 bits of the +// 64 bit floating point value. The other 34 bits are assumed to be 0 +// So, we use the upper 30 bits of $rknum as follows... + $sign = ($rknum & 0x80000000) >> 31; + $exp = ($rknum & 0x7ff00000) >> 20; + $mantissa = (0x100000 | ($rknum & 0x000ffffc)); + $value = $mantissa / pow( 2 , (20- ($exp - 1023))); + if ($sign) {$value = -1 * $value;} +//end of changes by mmp + + } + + if (($rknum & 0x01) != 0) { + $value /= 100; + } + return $value; + } + + function _encodeUTF16($string) + { + $result = $string; + if ($this->_defaultEncoding){ + switch ($this->_encoderFunction){ + case 'iconv' : $result = iconv('UTF-16LE', $this->_defaultEncoding, $string); + break; + case 'mb_convert_encoding' : $result = mb_convert_encoding($string, $this->_defaultEncoding, 'UTF-16LE' ); + break; + } + } + return $result; + } + + function _GetInt4d($data, $pos) + { + $value = ord($data[$pos]) | (ord($data[$pos+1]) << 8) | (ord($data[$pos+2]) << 16) | (ord($data[$pos+3]) << 24); + if ($value>=4294967294) + { + $value=-2; + } + return $value; + } + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * c-hanging-comment-ender-p: nil + * End: + */ + +?> diff --git a/lib/common.lib.php b/lib/common.lib.php new file mode 100644 index 000000000..d0077577f --- /dev/null +++ b/lib/common.lib.php @@ -0,0 +1,2713 @@ + $value) { + if(is_array($value)) { + $array[$key] = array_map_deep($fn, $value); + } else { + $array[$key] = call_user_func($fn, $value); + } + } + } else { + $array = call_user_func($fn, $array); + } + + return $array; +} + +// SQL Injection 대응 문자열 필터링 +function sql_escape_string($str) +{ + $pattern = '/(and|or).*(union|select|insert|update|delete|from|where|limit|create|drop).*/i'; + $replace = ''; + + $str = preg_replace($pattern, $replace, $str); + $str = call_user_func(G5_ESCAPE_FUNCTION, $str); + + return $str; +} + +// 마이크로 타임을 얻어 계산 형식으로 만듦 +function get_microtime() +{ + list($usec, $sec) = explode(" ",microtime()); + return ((float)$usec + (float)$sec); +} + + +// 한페이지에 보여줄 행, 현재페이지, 총페이지수, URL +function get_paging($write_pages, $cur_page, $total_page, $url, $add="") +{ + //$url = preg_replace('#&page=[0-9]*(&page=)$#', '$1', $url); + $url = preg_replace('#&page=[0-9]*#', '', $url) . '&page='; + + $str = ''; + if ($cur_page > 1) { + $str .= '
    처음'.PHP_EOL; + } + + $start_page = ( ( (int)( ($cur_page - 1 ) / $write_pages ) ) * $write_pages ) + 1; + $end_page = $start_page + $write_pages - 1; + + if ($end_page >= $total_page) $end_page = $total_page; + + if ($start_page > 1) $str .= '이전'.PHP_EOL; + + if ($total_page > 1) { + for ($k=$start_page;$k<=$end_page;$k++) { + if ($cur_page != $k) + $str .= ''.$k.'페이지'.PHP_EOL; + else + $str .= '열린'.$k.'페이지'.PHP_EOL; + } + } + + if ($total_page > $end_page) $str .= '다음'.PHP_EOL; + + if ($cur_page < $total_page) { + $str .= '맨끝'.PHP_EOL; + } + + if ($str) + return ""; + else + return ""; +} + +// 페이징 코드의
    태그 다음에 코드를 삽입 +function page_insertbefore($paging_html, $insert_html) +{ + if ($paging_html) { + return preg_replace("/^(]+>]+>)/", '$1'.$insert_html, $paging_html); + } +} + +// 페이징 코드의
    태그 이전에 코드를 삽입 +function page_insertafter($paging_html, $insert_html) +{ + if ($paging_html) { + //return preg_replace("/(<\/span><\/div>)$/", $insert_html.'$1', $paging_html); + return preg_replace("#(
    )$#", $insert_html.'$1', $paging_html); + } +} + +// 변수 또는 배열의 이름과 값을 얻어냄. print_r() 함수의 변형 +function print_r2($var) +{ + ob_start(); + print_r($var); + $str = ob_get_contents(); + ob_end_clean(); + $str = str_replace(" ", " ", $str); + echo nl2br("$str"); +} + + +// 메타태그를 이용한 URL 이동 +// header("location:URL") 을 대체 +function goto_url($url) +{ + $url = str_replace("&", "&", $url); + //echo ""; + + if (!headers_sent()) + header('Location: '.$url); + else { + echo ''; + echo ''; + } + exit; +} + + +// 세션변수 생성 +function set_session($session_name, $value) +{ + if (PHP_VERSION < '5.3.0') + session_register($session_name); + // PHP 버전별 차이를 없애기 위한 방법 + $$session_name = $_SESSION[$session_name] = $value; +} + + +// 세션변수값 얻음 +function get_session($session_name) +{ + return isset($_SESSION[$session_name]) ? $_SESSION[$session_name] : ''; +} + + +// 쿠키변수 생성 +function set_cookie($cookie_name, $value, $expire) +{ + global $g5; + + setcookie(md5($cookie_name), base64_encode($value), G5_SERVER_TIME + $expire, '/', G5_COOKIE_DOMAIN); +} + + +// 쿠키변수값 얻음 +function get_cookie($cookie_name) +{ + $cookie = md5($cookie_name); + if (array_key_exists($cookie, $_COOKIE)) + return base64_decode($_COOKIE[md5($cookie_name)]); + else + return ""; +} + + +// 경고메세지를 경고창으로 +function alert($msg='', $url='', $error=true, $post=false) +{ + global $g5, $config, $member; + global $is_admin; + + if (!$msg) $msg = '올바른 방법으로 이용해 주십시오.'; + + $header = ''; + if (isset($g5['title'])) { + $header = $g5['title']; + } + include_once(G5_BBS_PATH.'/alert.php'); + exit; +} + + +// 경고메세지 출력후 창을 닫음 +function alert_close($msg, $error=true) +{ + global $g5; + + $header = ''; + if (isset($g5['title'])) { + $header = $g5['title']; + } + include_once(G5_BBS_PATH.'/alert_close.php'); + exit; +} + +// confirm 창 +function confirm($msg, $url1='', $url2='', $url3='') +{ + global $g5; + + if (!$msg) { + $msg = '올바른 방법으로 이용해 주십시오.'; + alert($msg); + } + + if(!trim($url1) || !trim($url2)) { + $msg = '$url1 과 $url2 를 지정해 주세요.'; + alert($msg); + } + + if (!$url3) $url3 = $_SERVER['HTTP_REFERER']; + + $msg = str_replace("\\n", "
    ", $msg); + + $header = ''; + if (isset($g5['title'])) { + $header = $g5['title']; + } + include_once(G5_BBS_PATH.'/confirm.php'); + exit; +} + + +// way.co.kr 의 wayboard 참고 +function url_auto_link($str) +{ + global $g5; + global $config; + + // 140326 유창화님 제안코드로 수정 + // http://sir.co.kr/bbs/board.php?bo_table=pg_lecture&wr_id=461 + // http://sir.co.kr/bbs/board.php?bo_table=pg_lecture&wr_id=463 + $str = str_replace(array("<", ">", "&", """, " "), array("\t_lt_\t", "\t_gt_\t", "&", "\"", "\t_nbsp_\t"), $str); + $str = preg_replace("`(?:(?:(?:href|src)\s*=\s*(?:\"|'|)){0})((http|https|ftp|telnet|news|mms)://[^\"'\s()]+)`", "\\1", $str); + $str = preg_replace("/(^|[\"'\s(])(www\.[^\"'\s()]+)/i", "\\1\\2", $str); + $str = preg_replace("/[0-9a-z_-]+@[a-z0-9._-]{4,}/i", "\\0", $str); + $str = str_replace(array("\t_nbsp_\t", "\t_lt_\t", "\t_gt_\t"), array(" ", "<", ">"), $str); + + /* + // 속도 향상 031011 + $str = preg_replace("/</", "\t_lt_\t", $str); + $str = preg_replace("/>/", "\t_gt_\t", $str); + $str = preg_replace("/&/", "&", $str); + $str = preg_replace("/"/", "\"", $str); + $str = preg_replace("/ /", "\t_nbsp_\t", $str); + $str = preg_replace("/([^(http:\/\/)]|\(|^)(www\.[^[:space:]]+)/i", "\\1\\2", $str); + //$str = preg_replace("/([^(HREF=\"?'?)|(SRC=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[\xA1-\xFEa-zA-Z0-9\.:&#=_\?\/~\+%@;\-\|\,]+)/i", "\\1\\2", $str); + // 100825 : () 추가 + // 120315 : CHARSET 에 따라 링크시 글자 잘림 현상이 있어 수정 + $str = preg_replace("/([^(HREF=\"?'?)|(SRC=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[가-힣\xA1-\xFEa-zA-Z0-9\.:&#=_\?\/~\+%@;\-\|\,\(\)]+)/i", "\\1\\2", $str); + + // 이메일 정규표현식 수정 061004 + //$str = preg_replace("/(([a-z0-9_]|\-|\.)+@([^[:space:]]*)([[:alnum:]-]))/i", "\\1", $str); + $str = preg_replace("/([0-9a-z]([-_\.]?[0-9a-z])*@[0-9a-z]([-_\.]?[0-9a-z])*\.[a-z]{2,4})/i", "\\1", $str); + $str = preg_replace("/\t_nbsp_\t/", " " , $str); + $str = preg_replace("/\t_lt_\t/", "<", $str); + $str = preg_replace("/\t_gt_\t/", ">", $str); + */ + + return $str; +} + + +// url에 http:// 를 붙인다 +function set_http($url) +{ + if (!trim($url)) return; + + if (!preg_match("/^(http|https|ftp|telnet|news|mms)\:\/\//i", $url)) + $url = "http://" . $url; + + return $url; +} + + +// 파일의 용량을 구한다. +//function get_filesize($file) +function get_filesize($size) +{ + //$size = @filesize(addslashes($file)); + if ($size >= 1048576) { + $size = number_format($size/1048576, 1) . "M"; + } else if ($size >= 1024) { + $size = number_format($size/1024, 1) . "K"; + } else { + $size = number_format($size, 0) . "byte"; + } + return $size; +} + + +// 게시글에 첨부된 파일을 얻는다. (배열로 반환) +function get_file($bo_table, $wr_id) +{ + global $g5, $qstr; + + $file['count'] = 0; + $sql = " select * from {$g5['board_file_table']} where bo_table = '$bo_table' and wr_id = '$wr_id' order by bf_no "; + $result = sql_query($sql); + while ($row = sql_fetch_array($result)) + { + $no = $row['bf_no']; + $file[$no]['href'] = G5_BBS_URL."/download.php?bo_table=$bo_table&wr_id=$wr_id&no=$no" . $qstr; + $file[$no]['download'] = $row['bf_download']; + // 4.00.11 - 파일 path 추가 + $file[$no]['path'] = G5_DATA_URL.'/file/'.$bo_table; + $file[$no]['size'] = get_filesize($row['bf_filesize']); + $file[$no]['datetime'] = $row['bf_datetime']; + $file[$no]['source'] = addslashes($row['bf_source']); + $file[$no]['bf_content'] = $row['bf_content']; + $file[$no]['content'] = get_text($row['bf_content']); + //$file[$no]['view'] = view_file_link($row['bf_file'], $file[$no]['content']); + $file[$no]['view'] = view_file_link($row['bf_file'], $row['bf_width'], $row['bf_height'], $file[$no]['content']); + $file[$no]['file'] = $row['bf_file']; + $file[$no]['image_width'] = $row['bf_width'] ? $row['bf_width'] : 640; + $file[$no]['image_height'] = $row['bf_height'] ? $row['bf_height'] : 480; + $file[$no]['image_type'] = $row['bf_type']; + $file['count']++; + } + + return $file; +} + + +// 폴더의 용량 ($dir는 / 없이 넘기세요) +function get_dirsize($dir) +{ + $size = 0; + $d = dir($dir); + while ($entry = $d->read()) { + if ($entry != '.' && $entry != '..') { + $size += filesize($dir.'/'.$entry); + } + } + $d->close(); + return $size; +} + + +/************************************************************************* +** +** 그누보드 관련 함수 모음 +** +*************************************************************************/ + + +// 게시물 정보($write_row)를 출력하기 위하여 $list로 가공된 정보를 복사 및 가공 +function get_list($write_row, $board, $skin_url, $subject_len=40) +{ + global $g5, $config; + global $qstr, $page; + + //$t = get_microtime(); + + // 배열전체를 복사 + $list = $write_row; + unset($write_row); + + $board_notice = array_map('trim', explode(',', $board['bo_notice'])); + $list['is_notice'] = in_array($list['wr_id'], $board_notice); + + if ($subject_len) + $list['subject'] = conv_subject($list['wr_subject'], $subject_len, '…'); + else + $list['subject'] = conv_subject($list['wr_subject'], $board['bo_subject_len'], '…'); + + // 목록에서 내용 미리보기 사용한 게시판만 내용을 변환함 (속도 향상) : kkal3(커피)님께서 알려주셨습니다. + if ($board['bo_use_list_content']) + { + $html = 0; + if (strstr($list['wr_option'], 'html1')) + $html = 1; + else if (strstr($list['wr_option'], 'html2')) + $html = 2; + + $list['content'] = conv_content($list['wr_content'], $html); + } + + $list['comment_cnt'] = ''; + if ($list['wr_comment']) + $list['comment_cnt'] = "".$list['wr_comment'].""; + + // 당일인 경우 시간으로 표시함 + $list['datetime'] = substr($list['wr_datetime'],0,10); + $list['datetime2'] = $list['wr_datetime']; + if ($list['datetime'] == G5_TIME_YMD) + $list['datetime2'] = substr($list['datetime2'],11,5); + else + $list['datetime2'] = substr($list['datetime2'],5,5); + // 4.1 + $list['last'] = substr($list['wr_last'],0,10); + $list['last2'] = $list['wr_last']; + if ($list['last'] == G5_TIME_YMD) + $list['last2'] = substr($list['last2'],11,5); + else + $list['last2'] = substr($list['last2'],5,5); + + $list['wr_homepage'] = get_text(addslashes($list['wr_homepage'])); + + $tmp_name = get_text(cut_str($list['wr_name'], $config['cf_cut_name'])); // 설정된 자리수 만큼만 이름 출력 + if ($board['bo_use_sideview']) + $list['name'] = get_sideview($list['mb_id'], $tmp_name, $list['wr_email'], $list['wr_homepage']); + else + $list['name'] = ''.$tmp_name.''; + + $reply = $list['wr_reply']; + + $list['reply'] = strlen($reply)*10; + + $list['icon_reply'] = ''; + if ($list['reply']) + $list['icon_reply'] = '답변글'; + + $list['icon_link'] = ''; + if ($list['wr_link1'] || $list['wr_link2']) + $list['icon_link'] = '관련링크'; + + // 분류명 링크 + $list['ca_name_href'] = G5_BBS_URL.'/board.php?bo_table='.$board['bo_table'].'&sca='.urlencode($list['ca_name']); + + $list['href'] = G5_BBS_URL.'/board.php?bo_table='.$board['bo_table'].'&wr_id='.$list['wr_id'].$qstr; + $list['comment_href'] = $list['href']; + + $list['icon_new'] = ''; + if ($board['bo_new'] && $list['wr_datetime'] >= date("Y-m-d H:i:s", G5_SERVER_TIME - ($board['bo_new'] * 3600))) + $list['icon_new'] = '새글'; + + $list['icon_hot'] = ''; + if ($board['bo_hot'] && $list['wr_hit'] >= $board['bo_hot']) + $list['icon_hot'] = '인기글'; + + $list['icon_secret'] = ''; + if (strstr($list['wr_option'], 'secret')) + $list['icon_secret'] = '비밀글'; + + // 링크 + for ($i=1; $i<=G5_LINK_COUNT; $i++) { + $list['link'][$i] = set_http(get_text($list["wr_link{$i}"])); + $list['link_href'][$i] = G5_BBS_URL.'/link.php?bo_table='.$board['bo_table'].'&wr_id='.$list['wr_id'].'&no='.$i.$qstr; + $list['link_hit'][$i] = (int)$list["wr_link{$i}_hit"]; + } + + // 가변 파일 + if ($board['bo_use_list_file'] || ($list['wr_file'] && $subject_len == 255) /* view 인 경우 */) { + $list['file'] = get_file($board['bo_table'], $list['wr_id']); + } else { + $list['file']['count'] = $list['wr_file']; + } + + if ($list['file']['count']) + $list['icon_file'] = '첨부파일'; + + return $list; +} + +// get_list 의 alias +function get_view($write_row, $board, $skin_url) +{ + return get_list($write_row, $board, $skin_url, 255); +} + + +// set_search_font(), get_search_font() 함수를 search_font() 함수로 대체 +function search_font($stx, $str) +{ + global $config; + + // 문자앞에 \ 를 붙입니다. + $src = array('/', '|'); + $dst = array('\/', '\|'); + + if (!trim($stx)) return $str; + + // 검색어 전체를 공란으로 나눈다 + $s = explode(' ', $stx); + + // "/(검색1|검색2)/i" 와 같은 패턴을 만듬 + $pattern = ''; + $bar = ''; + for ($m=0; $m)"; + $bar = "|"; + } + + // 지정된 검색 폰트의 색상, 배경색상으로 대체 + $replace = "\\1"; + + return preg_replace("/($pattern)/i", $replace, $str); +} + + +// 제목을 변환 +function conv_subject($subject, $len, $suffix='') +{ + return cut_str(get_text($subject), $len, $suffix); +} + +// 내용을 변환 +function conv_content($content, $html, $filter=true) +{ + global $config, $board; + + if ($html) + { + $source = array(); + $target = array(); + + $source[] = "//"; + $target[] = ""; + + if ($html == 2) { // 자동 줄바꿈 + $source[] = "/\n/"; + $target[] = "
    "; + } + + // 테이블 태그의 개수를 세어 테이블이 깨지지 않도록 한다. + $table_begin_count = substr_count(strtolower($content), "set('Cache.SerializerPath', G5_DATA_PATH.'/cache'); + $config->set('HTML.SafeEmbed', true); + $config->set('HTML.SafeObject', true); + $config->set('HTML.SafeIframe', true); + $config->set('URI.SafeIframeRegexp','%^(https?:)?//('.$safeiframe.')%'); + $config->set('Attr.AllowedFrameTargets', array('_blank')); + $purifier = new HTMLPurifier($config); + return $purifier->purify($html); +} + + +// 검색 구문을 얻는다. +function get_sql_search($search_ca_name, $search_field, $search_text, $search_operator='and') +{ + global $g5; + + $str = ""; + if ($search_ca_name) + $str = " ca_name = '$search_ca_name' "; + + $search_text = strip_tags(($search_text)); + $search_text = trim(stripslashes($search_text)); + + if (!$search_text) { + if ($search_ca_name) { + return $str; + } else { + return '0'; + } + } + + if ($str) + $str .= " and "; + + // 쿼리의 속도를 높이기 위하여 ( ) 는 최소화 한다. + $op1 = ""; + + // 검색어를 구분자로 나눈다. 여기서는 공백 + $s = array(); + $s = explode(" ", $search_text); + + // 검색필드를 구분자로 나눈다. 여기서는 + + $tmp = array(); + $tmp = explode(",", trim($search_field)); + $field = explode("||", $tmp[0]); + $not_comment = ""; + if (!empty($tmp[1])) + $not_comment = $tmp[1]; + + $str .= "("; + for ($i=0; $i"; +} + + +// 관리자 정보를 얻음 +function get_admin($admin='super', $fields='*') +{ + global $config, $group, $board; + global $g5; + + $is = false; + if ($admin == 'board') { + $mb = sql_fetch("select {$fields} from {$g5['member_table']} where mb_id in ('{$board['bo_admin']}') limit 1 "); + $is = true; + } + + if (($is && !$mb['mb_id']) || $admin == 'group') { + $mb = sql_fetch("select {$fields} from {$g5['member_table']} where mb_id in ('{$group['gr_admin']}') limit 1 "); + $is = true; + } + + if (($is && !$mb['mb_id']) || $admin == 'super') { + $mb = sql_fetch("select {$fields} from {$g5['member_table']} where mb_id in ('{$config['cf_admin']}') limit 1 "); + } + + return $mb; +} + + +// 관리자인가? +function is_admin($mb_id) +{ + global $config, $group, $board; + + if (!$mb_id) return; + + if ($config['cf_admin'] == $mb_id) return 'super'; + if (isset($group['gr_admin']) && ($group['gr_admin'] == $mb_id)) return 'group'; + if (isset($board['bo_admin']) && ($board['bo_admin'] == $mb_id)) return 'board'; + return ''; +} + + +// 분류 옵션을 얻음 +// 4.00 에서는 카테고리 테이블을 없애고 보드테이블에 있는 내용으로 대체 +function get_category_option($bo_table='', $ca_name='') +{ + global $g5, $board, $is_admin; + + $categories = explode("|", $board['bo_category_list'].($is_admin?"|공지":"")); // 구분자가 , 로 되어 있음 + $str = ""; + for ($i=0; $i\n"; + for ($i=0; $row=sql_fetch_array($result); $i++) { + if ($i == 0) $str .= ""; + $str .= option_selected($row['gr_id'], $selected, $row['gr_subject']); + } + $str .= ""; + return $str; +} + + +function option_selected($value, $selected, $text='') +{ + if (!$text) $text = $value; + if ($value == $selected) + return "\n"; + else + return "\n"; +} + + +// '예', '아니오'를 SELECT 형식으로 얻음 +function get_yn_select($name, $selected='1', $event='') +{ + $str = ""; + return $str; +} + + +// 포인트 부여 +function insert_point($mb_id, $point, $content='', $rel_table='', $rel_id='', $rel_action='', $expire=0) +{ + global $config; + global $g5; + global $is_admin; + + // 포인트 사용을 하지 않는다면 return + if (!$config['cf_use_point']) { return 0; } + + // 포인트가 없다면 업데이트 할 필요 없음 + if ($point == 0) { return 0; } + + // 회원아이디가 없다면 업데이트 할 필요 없음 + if ($mb_id == '') { return 0; } + $mb = sql_fetch(" select mb_id from {$g5['member_table']} where mb_id = '$mb_id' "); + if (!$mb['mb_id']) { return 0; } + + // 회원포인트 + $mb_point = get_point_sum($mb_id); + + // 이미 등록된 내역이라면 건너뜀 + if ($rel_table || $rel_id || $rel_action) + { + $sql = " select count(*) as cnt from {$g5['point_table']} + where mb_id = '$mb_id' + and po_rel_table = '$rel_table' + and po_rel_id = '$rel_id' + and po_rel_action = '$rel_action' "; + $row = sql_fetch($sql); + if ($row['cnt']) + return -1; + } + + // 포인트 건별 생성 + $po_expire_date = '9999-12-31'; + if($config['cf_point_term'] > 0) { + if($expire > 0) + $po_expire_date = date('Y-m-d', strtotime('+'.($expire - 1).' days', G5_SERVER_TIME)); + else + $po_expire_date = date('Y-m-d', strtotime('+'.($config['cf_point_term'] - 1).' days', G5_SERVER_TIME)); + } + + $po_expired = 0; + if($point < 0) { + $po_expired = 1; + $po_expire_date = G5_TIME_YMD; + } + $po_mb_point = $mb_point + $point; + + $sql = " insert into {$g5['point_table']} + set mb_id = '$mb_id', + po_datetime = '".G5_TIME_YMDHIS."', + po_content = '".addslashes($content)."', + po_point = '$point', + po_use_point = '0', + po_mb_point = '$po_mb_point', + po_expired = '$po_expired', + po_expire_date = '$po_expire_date', + po_rel_table = '$rel_table', + po_rel_id = '$rel_id', + po_rel_action = '$rel_action' "; + sql_query($sql); + + // 포인트를 사용한 경우 포인트 내역에 사용금액 기록 + if($point < 0) { + insert_use_point($mb_id, $point); + } + + // 포인트 UPDATE + $sql = " update {$g5['member_table']} set mb_point = '$po_mb_point' where mb_id = '$mb_id' "; + sql_query($sql); + + return 1; +} + +// 사용포인트 입력 +function insert_use_point($mb_id, $point, $po_id='') +{ + global $g5, $config; + + if($config['cf_point_term']) + $sql_order = " order by po_expire_date asc, po_id asc "; + else + $sql_order = " order by po_id asc "; + + $point1 = abs($point); + $sql = " select po_id, po_point, po_use_point + from {$g5['point_table']} + where mb_id = '$mb_id' + and po_id <> '$po_id' + and po_expired = '0' + and po_point > po_use_point + $sql_order "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + $point2 = $row['po_point']; + $point3 = $row['po_use_point']; + + if(($point2 - $point3) > $point1) { + $sql = " update {$g5['point_table']} + set po_use_point = po_use_point + '$point1' + where po_id = '{$row['po_id']}' "; + sql_query($sql); + break; + } else { + $point4 = $point2 - $point3; + $sql = " update {$g5['point_table']} + set po_use_point = po_use_point + '$point4', + po_expired = '100' + where po_id = '{$row['po_id']}' "; + sql_query($sql); + $point1 -= $point4; + } + } +} + +// 사용포인트 삭제 +function delete_use_point($mb_id, $point) +{ + global $g5, $config; + + if($config['cf_point_term']) + $sql_order = " order by po_expire_date desc, po_id desc "; + else + $sql_order = " order by po_id desc "; + + $point1 = abs($point); + $sql = " select po_id, po_use_point, po_expired, po_expire_date + from {$g5['point_table']} + where mb_id = '$mb_id' + and po_expired <> '1' + and po_use_point > 0 + $sql_order "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + $point2 = $row['po_use_point']; + + $po_expired = $row['po_expired']; + if($row['po_expired'] == 100 && ($row['po_expire_date'] == '9999-12-31' || $row['po_expire_date'] >= G5_TIME_YMD)) + $po_expired = 0; + + if($point2 > $point1) { + $sql = " update {$g5['point_table']} + set po_use_point = po_use_point - '$point1', + po_expired = '$po_expired' + where po_id = '{$row['po_id']}' "; + sql_query($sql); + break; + } else { + $sql = " update {$g5['point_table']} + set po_use_point = '0', + po_expired = '$po_expired' + where po_id = '{$row['po_id']}' "; + sql_query($sql); + + $point1 -= $point2; + } + } +} + +// 소멸포인트 삭제 +function delete_expire_point($mb_id, $point) +{ + global $g5, $config; + + $point1 = abs($point); + $sql = " select po_id, po_use_point, po_expired, po_expire_date + from {$g5['point_table']} + where mb_id = '$mb_id' + and po_expired = '1' + and po_point >= 0 + and po_use_point > 0 + order by po_expire_date desc, po_id desc "; + $result = sql_query($sql); + for($i=0; $row=sql_fetch_array($result); $i++) { + $point2 = $row['po_use_point']; + $po_expired = '0'; + $po_expire_date = '9999-12-31'; + if($config['cf_point_term'] > 0) + $po_expire_date = date('Y-m-d', strtotime('+'.($config['cf_point_term'] - 1).' days', G5_SERVER_TIME)); + + if($point2 > $point1) { + $sql = " update {$g5['point_table']} + set po_use_point = po_use_point - '$point1', + po_expired = '$po_expired', + po_expire_date = '$po_expire_date' + where po_id = '{$row['po_id']}' "; + sql_query($sql); + break; + } else { + $sql = " update {$g5['point_table']} + set po_use_point = '0', + po_expired = '$po_expired', + po_expire_date = '$po_expire_date' + where po_id = '{$row['po_id']}' "; + sql_query($sql); + + $point1 -= $point2; + } + } +} + +// 포인트 내역 합계 +function get_point_sum($mb_id) +{ + global $g5, $config; + + if($config['cf_point_term'] > 0) { + // 소멸포인트가 있으면 내역 추가 + $expire_point = get_expire_point($mb_id); + if($expire_point > 0) { + $mb = get_member($mb_id, 'mb_point'); + $content = '포인트 소멸'; + $rel_table = '@expire'; + $rel_id = $mb_id; + $rel_action = 'expire'.'-'.uniqid(''); + $point = $expire_point * (-1); + $po_mb_point = $mb['mb_point'] + $point; + $po_expire_date = G5_TIME_YMD; + $po_expired = 1; + + $sql = " insert into {$g5['point_table']} + set mb_id = '$mb_id', + po_datetime = '".G5_TIME_YMDHIS."', + po_content = '".addslashes($content)."', + po_point = '$point', + po_use_point = '0', + po_mb_point = '$po_mb_point', + po_expired = '$po_expired', + po_expire_date = '$po_expire_date', + po_rel_table = '$rel_table', + po_rel_id = '$rel_id', + po_rel_action = '$rel_action' "; + sql_query($sql); + + // 포인트를 사용한 경우 포인트 내역에 사용금액 기록 + if($point < 0) { + insert_use_point($mb_id, $point); + } + } + + // 유효기간이 있을 때 기간이 지난 포인트 expired 체크 + $sql = " update {$g5['point_table']} + set po_expired = '1' + where mb_id = '$mb_id' + and po_expired <> '1' + and po_expire_date <> '9999-12-31' + and po_expire_date < '".G5_TIME_YMD."' "; + sql_query($sql); + } + + // 포인트합 + $sql = " select sum(po_point) as sum_po_point + from {$g5['point_table']} + where mb_id = '$mb_id' "; + $row = sql_fetch($sql); + + return $row['sum_po_point']; +} + +// 소멸 포인트 +function get_expire_point($mb_id) +{ + global $g5, $config; + + if($config['cf_point_term'] == 0) + return 0; + + $sql = " select sum(po_point - po_use_point) as sum_point + from {$g5['point_table']} + where mb_id = '$mb_id' + and po_expired = '0' + and po_expire_date <> '9999-12-31' + and po_expire_date < '".G5_TIME_YMD."' "; + $row = sql_fetch($sql); + + return $row['sum_point']; +} + +// 포인트 삭제 +function delete_point($mb_id, $rel_table, $rel_id, $rel_action) +{ + global $g5; + + $result = false; + if ($rel_table || $rel_id || $rel_action) + { + // 포인트 내역정보 + $sql = " select * from {$g5['point_table']} + where mb_id = '$mb_id' + and po_rel_table = '$rel_table' + and po_rel_id = '$rel_id' + and po_rel_action = '$rel_action' "; + $row = sql_fetch($sql); + + if($row['po_point'] < 0) { + $mb_id = $row['mb_id']; + $po_point = abs($row['po_point']); + + delete_use_point($mb_id, $po_point); + } else { + if($row['po_use_point'] > 0) { + insert_use_point($row['mb_id'], $row['po_use_point'], $row['po_id']); + } + } + + $result = sql_query(" delete from {$g5['point_table']} + where mb_id = '$mb_id' + and po_rel_table = '$rel_table' + and po_rel_id = '$rel_id' + and po_rel_action = '$rel_action' ", false); + + // po_mb_point에 반영 + $sql = " update {$g5['point_table']} + set po_mb_point = po_mb_point - '{$row['po_point']}' + where mb_id = '$mb_id' + and po_id > '{$row['po_id']}' "; + sql_query($sql); + + // 포인트 내역의 합을 구하고 + $sum_point = get_point_sum($mb_id); + + // 포인트 UPDATE + $sql = " update {$g5['member_table']} set mb_point = '$sum_point' where mb_id = '$mb_id' "; + $result = sql_query($sql); + } + + return $result; +} + +// 회원 레이어 +function get_sideview($mb_id, $name='', $email='', $homepage='') +{ + global $config; + global $g5; + global $bo_table, $sca, $is_admin, $member; + + $email = base64_encode($email); + $homepage = set_http($homepage); + + $name = preg_replace("/\'/", "", $name); + $name = preg_replace("/\'/", "", $name); + $name = preg_replace("/\"/", """, $name); + $title_name = $name; + + $tmp_name = ""; + if ($mb_id) { + //$tmp_name = "$name"; + $tmp_name = ''; + + if ($config['cf_use_member_icon']) { + $mb_dir = substr($mb_id,0,2); + $icon_file = G5_DATA_PATH.'/member/'.$mb_dir.'/'.$mb_id.'.gif'; + + if (file_exists($icon_file)) { + $width = $config['cf_member_icon_width']; + $height = $config['cf_member_icon_height']; + $icon_file_url = G5_DATA_URL.'/member/'.$mb_dir.'/'.$mb_id.'.gif'; + $tmp_name .= ''; + + if ($config['cf_use_member_icon'] == 2) // 회원아이콘+이름 + $tmp_name = $tmp_name.' '.$name; + } else { + $tmp_name = $tmp_name." ".$name; + } + } else { + $tmp_name = $tmp_name.' '.$name; + } + $tmp_name .= ''; + + $title_mb_id = '['.$mb_id.']'; + } else { + if(!$bo_table) + return $name; + + $tmp_name = ''.$name.''; + $title_mb_id = '[비회원]'; + } + + $name = get_text($name); + $email = get_text($email); + $homepage = get_text($homepage); + + $str = "\n"; + $str .= $tmp_name."\n"; + + $str2 = "\n"; + if($mb_id) + $str2 .= "쪽지보내기\n"; + if($email) + $str2 .= "메일보내기\n"; + if($homepage) + $str2 .= "홈페이지\n"; + if($mb_id) + $str2 .= "자기소개\n"; + if($bo_table) { + if($mb_id) + $str2 .= "아이디로 검색\n"; + else + $str2 .= "이름으로 검색\n"; + } + if($mb_id) + $str2 .= "전체게시물\n"; + if($g5['sms5_use_sideview']){ + $mb = get_member($mb_id, " mb_open, mb_sms , mb_hp "); + if( $mb['mb_open'] && $mb['mb_sms'] && $mb['mb_hp'] ) $str2 .= "문자보내기\n"; + } + if($is_admin == "super" && $mb_id) { + $str2 .= "회원정보변경\n"; + $str2 .= "포인트내역\n"; + } + $str2 .= "\n"; + $str .= $str2; + $str .= "\n"; + + $str .= ""; + + return $str; +} + + +// 파일을 보이게 하는 링크 (이미지, 플래쉬, 동영상) +function view_file_link($file, $width, $height, $content='') +{ + global $config, $board; + global $g5; + static $ids; + + if (!$file) return; + + $ids++; + + // 파일의 폭이 게시판설정의 이미지폭 보다 크다면 게시판설정 폭으로 맞추고 비율에 따라 높이를 계산 + if ($width > $board['bo_image_width'] && $board['bo_image_width']) + { + $rate = $board['bo_image_width'] / $width; + $width = $board['bo_image_width']; + $height = (int)($height * $rate); + } + + // 폭이 있는 경우 폭과 높이의 속성을 주고, 없으면 자동 계산되도록 코드를 만들지 않는다. + if ($width) + $attr = ' width="'.$width.'" height="'.$height.'" '; + else + $attr = ''; + + if (preg_match("/\.({$config['cf_image_extension']})$/i", $file)) { + $img = ''; + $img .= ''.$content.''; + $img .= ''; + + return $img; + } +} + + +// view_file_link() 함수에서 넘겨진 이미지를 보이게 합니다. +// {img:0} ... {img:n} 과 같은 형식 +function view_image($view, $number, $attribute) +{ + if ($view['file'][$number]['view']) + return preg_replace("/>$/", " $attribute>", $view['file'][$number]['view']); + else + //return "{".$number."번 이미지 없음}"; + return ""; +} + + +/* +// {link:0} ... {link:n} 과 같은 형식 +function view_link($view, $number, $attribute) +{ + global $config; + + if ($view['link'][$number]['link']) + { + if (!preg_match("/target/i", $attribute)) + $attribute .= " target='$config['cf_link_target']'"; + return "{$view['link'][$number]['link']}"; + } + else + return "{".$number."번 링크 없음}"; +} +*/ + + +function cut_str($str, $len, $suffix="…") +{ + $arr_str = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY); + $str_len = count($arr_str); + + if ($str_len >= $len) { + $slice_str = array_slice($arr_str, 0, $len); + $str = join("", $slice_str); + + return $str . ($str_len > $len ? $suffix : ''); + } else { + $str = join("", $arr_str); + return $str; + } +} + + +// TEXT 형식으로 변환 +function get_text($str, $html=0) +{ + /* 3.22 막음 (HTML 체크 줄바꿈시 출력 오류때문) + $source[] = "/ /"; + $target[] = "  "; + */ + + // 3.31 + // TEXT 출력일 경우 &   등의 코드를 정상으로 출력해 주기 위함 + if ($html == 0) { + $str = html_symbol($str); + } + + $source[] = "//"; + $target[] = ">"; + //$source[] = "/\"/"; + //$target[] = """; + $source[] = "/\'/"; + $target[] = "'"; + //$source[] = "/}/"; $target[] = "}"; + if ($html) { + $source[] = "/\n/"; + $target[] = "
    "; + } + + return preg_replace($source, $target, $str); +} + + +/* +// HTML 특수문자 변환 htmlspecialchars +function hsc($str) +{ + $trans = array("\"" => """, "'" => "'", "<"=>"<", ">"=>">"); + $str = strtr($str, $trans); + return $str; +} +*/ + +// 3.31 +// HTML SYMBOL 변환 +//   & · 등을 정상으로 출력 +function html_symbol($str) +{ + return preg_replace("/\&([a-z0-9]{1,20}|\#[0-9]{0,3});/i", "&\\1;", $str); +} + + +/************************************************************************* +** +** SQL 관련 함수 모음 +** +*************************************************************************/ + +// DB 연결 +function sql_connect($host, $user, $pass) +{ + global $g5; + + return @mysql_connect($host, $user, $pass); +} + + +// DB 선택 +function sql_select_db($db, $connect) +{ + global $g5; + + return @mysql_select_db($db, $connect); +} + + +// mysql_query 와 mysql_error 를 한꺼번에 처리 +// mysql connect resource 지정 - 명랑폐인님 제안 +function sql_query($sql, $error=G5_DISPLAY_SQL_ERROR) +{ + global $g5; + + // Blind SQL Injection 취약점 해결 + $sql = trim($sql); + // union의 사용을 허락하지 않습니다. + $sql = preg_replace("#^select.*from.*union.*#i", "select 1", $sql); + // `information_schema` DB로의 접근을 허락하지 않습니다. + $sql = preg_replace("#^select.*from.*where.*`?information_schema`?.*#i", "select 1", $sql); + + if ($error) + $result = @mysql_query($sql, $g5['connect_db']) or die("

    $sql

    " . mysql_errno() . " : " . mysql_error() . "

    error file : {$_SERVER['PHP_SELF']}"); + else + $result = @mysql_query($sql, $g5['connect_db']); + + return $result; +} + + +// 쿼리를 실행한 후 결과값에서 한행을 얻는다. +function sql_fetch($sql, $error=G5_DISPLAY_SQL_ERROR) +{ + $result = sql_query($sql, $error); + //$row = @sql_fetch_array($result) or die("

    $sql

    " . mysql_errno() . " : " . mysql_error() . "

    error file : $_SERVER['PHP_SELF']"); + $row = sql_fetch_array($result); + return $row; +} + + +// 결과값에서 한행 연관배열(이름으로)로 얻는다. +function sql_fetch_array($result) +{ + $row = @mysql_fetch_assoc($result); + return $row; +} + + +// $result에 대한 메모리(memory)에 있는 내용을 모두 제거한다. +// sql_free_result()는 결과로부터 얻은 질의 값이 커서 많은 메모리를 사용할 염려가 있을 때 사용된다. +// 단, 결과 값은 스크립트(script) 실행부가 종료되면서 메모리에서 자동적으로 지워진다. +function sql_free_result($result) +{ + return mysql_free_result($result); +} + + +function sql_password($value) +{ + // mysql 4.0x 이하 버전에서는 password() 함수의 결과가 16bytes + // mysql 4.1x 이상 버전에서는 password() 함수의 결과가 41bytes + $row = sql_fetch(" select password('$value') as pass "); + + return $row['pass']; +} + + +// PHPMyAdmin 참고 +function get_table_define($table, $crlf="\n") +{ + global $g5; + + // For MySQL < 3.23.20 + $schema_create .= 'CREATE TABLE ' . $table . ' (' . $crlf; + + $sql = 'SHOW FIELDS FROM ' . $table; + $result = sql_query($sql); + while ($row = sql_fetch_array($result)) + { + $schema_create .= ' ' . $row['Field'] . ' ' . $row['Type']; + if (isset($row['Default']) && $row['Default'] != '') + { + $schema_create .= ' DEFAULT \'' . $row['Default'] . '\''; + } + if ($row['Null'] != 'YES') + { + $schema_create .= ' NOT NULL'; + } + if ($row['Extra'] != '') + { + $schema_create .= ' ' . $row['Extra']; + } + $schema_create .= ',' . $crlf; + } // end while + sql_free_result($result); + + $schema_create = preg_replace('/,' . $crlf . '$/', '', $schema_create); + + $sql = 'SHOW KEYS FROM ' . $table; + $result = sql_query($sql); + while ($row = sql_fetch_array($result)) + { + $kname = $row['Key_name']; + $comment = (isset($row['Comment'])) ? $row['Comment'] : ''; + $sub_part = (isset($row['Sub_part'])) ? $row['Sub_part'] : ''; + + if ($kname != 'PRIMARY' && $row['Non_unique'] == 0) { + $kname = "UNIQUE|$kname"; + } + if ($comment == 'FULLTEXT') { + $kname = 'FULLTEXT|$kname'; + } + if (!isset($index[$kname])) { + $index[$kname] = array(); + } + if ($sub_part > 1) { + $index[$kname][] = $row['Column_name'] . '(' . $sub_part . ')'; + } else { + $index[$kname][] = $row['Column_name']; + } + } // end while + sql_free_result($result); + + while (list($x, $columns) = @each($index)) { + $schema_create .= ',' . $crlf; + if ($x == 'PRIMARY') { + $schema_create .= ' PRIMARY KEY ('; + } else if (substr($x, 0, 6) == 'UNIQUE') { + $schema_create .= ' UNIQUE ' . substr($x, 7) . ' ('; + } else if (substr($x, 0, 8) == 'FULLTEXT') { + $schema_create .= ' FULLTEXT ' . substr($x, 9) . ' ('; + } else { + $schema_create .= ' KEY ' . $x . ' ('; + } + $schema_create .= implode($columns, ', ') . ')'; + } // end while + + $schema_create .= $crlf . ') ENGINE=MyISAM DEFAULT CHARSET=utf8'; + + return $schema_create; +} // end of the 'PMA_getTableDef()' function + + +// 리퍼러 체크 +function referer_check($url='') +{ + /* + // 제대로 체크를 하지 못하여 주석 처리함 + global $g5; + + if (!$url) + $url = G5_URL; + + if (!preg_match("/^http['s']?:\/\/".$_SERVER['HTTP_HOST']."/", $_SERVER['HTTP_REFERER'])) + alert("제대로 된 접근이 아닌것 같습니다.", $url); + */ +} + + +// 한글 요일 +function get_yoil($date, $full=0) +{ + $arr_yoil = array ('일', '월', '화', '수', '목', '금', '토'); + + $yoil = date("w", strtotime($date)); + $str = $arr_yoil[$yoil]; + if ($full) { + $str .= '요일'; + } + return $str; +} + + +// 날짜를 select 박스 형식으로 얻는다 +function date_select($date, $name='') +{ + global $g5; + + $s = ''; + if (substr($date, 0, 4) == "0000") { + $date = G5_TIME_YMDHIS; + } + preg_match("/([0-9]{4})-([0-9]{2})-([0-9]{2})/", $date, $m); + + // 년 + $s .= " + + + + + + + + + + + +

    + + + + +
    + +
    +
    + +
    +
    +
    +
    + + + + +
    \ No newline at end of file diff --git a/mobile/index.php b/mobile/index.php new file mode 100644 index 000000000..541213c26 --- /dev/null +++ b/mobile/index.php @@ -0,0 +1,30 @@ + + + + 'pc' "; +if(!$is_admin) + $sql .= " and a.bo_use_cert = '' "; +$sql .= " order by b.gr_order, a.bo_order "; +$result = sql_query($sql); +for ($i=0; $row=sql_fetch_array($result); $i++) { + // 이 함수가 바로 최신글을 추출하는 역할을 합니다. + // 스킨은 입력하지 않을 경우 관리자 > 환경설정의 최신글 스킨경로를 기본 스킨으로 합니다. + + // 사용방법 + // latest(스킨, 게시판아이디, 출력라인, 글자수); + echo latest("basic", $row['bo_table'], 5, 25); +} +?> + + + \ No newline at end of file diff --git a/mobile/newwin.inc.php b/mobile/newwin.inc.php new file mode 100644 index 000000000..14ad49127 --- /dev/null +++ b/mobile/newwin.inc.php @@ -0,0 +1,55 @@ + + + +
    +

    팝업레이어 알림

    + + + +
    +
    + +
    + +
    +팝업레이어 알림이 없습니다.'; +?> +
    + + + \ No newline at end of file diff --git a/mobile/skin/board/basic/img/icon_file.gif b/mobile/skin/board/basic/img/icon_file.gif new file mode 100644 index 0000000000000000000000000000000000000000..cca47f566ac0db655fb2ab0f56628b64958e48b2 GIT binary patch literal 107 zcmZ?wbhEHb-Wqsc#^P~2x#@rVooH@5wHB9i@BozKb;P9uI^*c|UyXO5@>VyLmgEat< Cr6(f* literal 0 HcmV?d00001 diff --git a/mobile/skin/board/basic/img/icon_hot.gif b/mobile/skin/board/basic/img/icon_hot.gif new file mode 100644 index 0000000000000000000000000000000000000000..c95b839aeef0c1e26a4bab4ea50cd6d3f1969d7f GIT binary patch literal 97 zcmZ?wbhEHbzHen|7VvwFnzUPlarEA ZqW~YXyUO~T+#YkUoJ%V_>ib05Q5F AasU7T literal 0 HcmV?d00001 diff --git a/mobile/skin/board/basic/img/icon_mobile.gif b/mobile/skin/board/basic/img/icon_mobile.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad934d23c440c83db0c4589596465cb087353e01 GIT binary patch literal 62 zcmZ?wbhEHbZ% literal 0 HcmV?d00001 diff --git a/mobile/skin/board/basic/img/icon_reply.gif b/mobile/skin/board/basic/img/icon_reply.gif new file mode 100644 index 0000000000000000000000000000000000000000..91c135977b4f445a90c849310dc80efde1983830 GIT binary patch literal 77 zcmZ?wbhEHb&!1E4^4&ClEzh)PmWxV3{9A~!gB2-%RL5bHcgg3Zp^!+W)H2^A_AxQuL literal 0 HcmV?d00001 diff --git a/mobile/skin/board/basic/img/icon_sound.gif b/mobile/skin/board/basic/img/icon_sound.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5188318a5cdc394b984125c0ddd376c5f57bbe4 GIT binary patch literal 113 zcmZ?wbhEHbE1CJY$zMikVi`-#gIi|DbmsXBWf6U5szE@->A`0*`&<;b@XASRrB8=E6~=S>Pbm I%fes{0AXt-SpWb4 literal 0 HcmV?d00001 diff --git a/mobile/skin/board/basic/list.skin.php b/mobile/skin/board/basic/list.skin.php new file mode 100644 index 000000000..5b72909c1 --- /dev/null +++ b/mobile/skin/board/basic/list.skin.php @@ -0,0 +1,224 @@ +', 0); +?> + +

    목록

    + + +
    "> + + + + + +
    +
    + Total + 페이지 +
    + + + + +
    + +
    + + + + + + + +
    +
    + + + + + + + + + + + + "> + + + + + + + '; } ?> + +
    + + + 제목날짜
    + + + + + + + + + + 댓글 + '; } + + if (isset($list[$i]['icon_new'])) echo $list[$i]['icon_new']; + if (isset($list[$i]['icon_hot'])) echo $list[$i]['icon_hot']; + if (isset($list[$i]['icon_file'])) echo $list[$i]['icon_file']; + if (isset($list[$i]['icon_link'])) echo $list[$i]['icon_link']; + if (isset($list[$i]['icon_secret'])) echo $list[$i]['icon_secret']; + + ?> + + +
    게시물이 없습니다.
    + + + +
    + + + +
    + + + + + + + + + + + +
    + 게시물 검색 + +
    + + + + + + + +
    +
    + + + + + diff --git a/mobile/skin/board/basic/style.css b/mobile/skin/board/basic/style.css new file mode 100644 index 000000000..389ba3b5c --- /dev/null +++ b/mobile/skin/board/basic/style.css @@ -0,0 +1,237 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* ### 기본 스타일 커스터마이징 시작 ### */ + +/* 게시판 버튼 */ +/* 목록 버튼 */ +#bo_list a.btn_b01 {} +#bo_list a.btn_b01:focus, #bo_list .btn_b01:hover {} +#bo_list a.btn_b02 {} +#bo_list a.btn_b02:focus, #bo_list .btn_b02:hover {} +#bo_list a.btn_admin {} /* 관리자 전용 버튼 */ +#bo_list a.btn_admin:focus, #bo_list a.btn_admin:hover {} + +/* 읽기 버튼 */ +#bo_v a.btn_b01 {} +#bo_v a.btn_b01:focus, #bo_v .btn_b01:hover {} +#bo_v a.btn_b02 {} +#bo_v a.btn_b02:focus, #bo_v .btn_b02:hover {} +#bo_v a.btn_admin {} /* 관리자 전용 버튼 */ +#bo_v a.btn_admin:focus, #bo_v a.btn_admin:hover {} + +/* 쓰기 버튼 */ +#bo_w .btn_confirm {} /* 서식단계 진행 */ +#bo_w .btn_submit {} +#bo_w .btn_cancel {} +#bo_w .btn_frmline {} /* 우편번호검색버튼 등 */ + +/* 기본테이블 */ +/* 목록 테이블 */ +#bo_list .tbl_head01 {} +#bo_list .tbl_head01 caption {} +#bo_list .tbl_head01 thead th {} +#bo_list .tbl_head01 thead a {} +#bo_list .tbl_head01 thead th input {} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +#bo_list .tbl_head01 tfoot th {} +#bo_list .tbl_head01 tfoot td {} +#bo_list .tbl_head01 tbody th {} +#bo_list .tbl_head01 td {} +#bo_list .tbl_head01 a {} +#bo_list td.empty_table {} + +/* 읽기 내 테이블 */ +#bo_v .tbl_head01 {} +#bo_v .tbl_head01 caption {} +#bo_v .tbl_head01 thead th {} +#bo_v .tbl_head01 thead a {} +#bo_v .tbl_head01 thead th input {} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +#bo_v .tbl_head01 tfoot th {} +#bo_v .tbl_head01 tfoot td {} +#bo_v .tbl_head01 tbody th {} +#bo_v .tbl_head01 td {} +#bo_v .tbl_head01 a {} +#bo_v td.empty_table {} + +/* 쓰기 테이블 */ +#bo_w table {} +#bo_w caption {} +#bo_w .frm_address {} +#bo_w .frm_file {} +#bo_w .frm_info {} + +#bo_w .tbl_frm01 {} +#bo_w .tbl_frm01 caption {} +#bo_w .tbl_frm01 th {} +#bo_w .tbl_frm01 td {} +#bo_w .tbl_frm01 textarea, #bo_w .frm_input {} +#bo_w .tbl_frm01 textarea {} +/* +#bo_w .tbl_frm01 #captcha {} +#bo_w .tbl_frm01 #captcha input {} +*/ +#bo_w .tbl_frm01 a {} + +#bo_w .required, #bo_w textarea.required {} + +/* ### 기본 스타일 커스터마이징 끝 ### */ + +/* 게시판 목록 */ +#bo_list .td_chk {width:30px;text-align:center} +#bo_list .td_group {width:100px;text-align:center} +#bo_list .td_board {width:120px;text-align:center} +#bo_list .td_num {width:50px;text-align:center} +#bo_list .td_numbig {width:80px;text-align:center} +#bo_list .td_mb_id {width:100px;text-align:center} +#bo_list .td_nick {width:100px;text-align:center} +#bo_list .td_name {width:100px;text-align:left} +#bo_list .td_date {width:60px;text-align:center} +#bo_list .td_datetime {width:150px;text-align:center} +#bo_list .td_mng {width:80px;text-align:center} + +#bo_cate h2 {width:0;height:0;font-size:0;line-height:0;overflow:hidden} +#bo_cate ul {margin:5px 10px;padding-left:1px;zoom:1} +#bo_cate ul:after {display:block;visibility:hidden;clear:both;content:""} +#bo_cate li {float:left;margin-bottom:-1px;width:25%} +#bo_cate a {display:block;position:relative;margin-left:-1px;padding:5px 0;border:1px solid #ddd;background:#f7f7f7;color:#888;text-align:center;text-decoration:none;letter-spacing:-0.1em} +#bo_cate a:focus, #bo_cate a:hover, #bo_cate a:active {text-decoration:none} +#bo_cate #bo_cate_on {z-index:2;border:1px solid #565e60;background:#fff;color:#565e60;font-weight:bold} + +/* 관리자일 때 */ +#bo_list_admin th label {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#bo_list_admin th:nth-of-type(1) {width:40px} +#bo_list_admin th:nth-of-type(3) {width:100px} + +#bo_list_admin td:nth-of-type(1) {text-align:center} +#bo_list_admin td:nth-of-type(3) {text-align:center} + +/* 관리자가 아닐 때 */ +#bo_list th:nth-of-type(2) {width:100px} + +#bo_list td:nth-of-type(2) {text-align:center} + +/* 게시판 목록 공통 */ +.bo_fx {margin-bottom:5px;padding:5px 10px} +.bo_fx:after {display:block;visibility:hidden;clear:both;content:""} +.bo_fx ul {margin:0;padding:0;list-style:none} +#bo_list_total {float:left;padding:0;height:2.5em;line-height:2.5em} +.btn_bo_user {float:right;margin:0;padding:0;list-style:none} +.btn_bo_user li {float:left;margin-left:5px} +.btn_bo_adm {float:left} +.btn_bo_adm li {float:left;margin-right:5px} +.btn_bo_adm input {padding:8px;border:0;background:#e8180c;color:#fff;text-decoration:none;vertical-align:middle} +.bo_notice td {background:#f7f7f7} +.bo_notice td a {font-weight:bold} +.td_num strong {color:#000} +.bo_cate_link {display:inline-block;margin:0 3px 0 0;padding:0 6px 0 0;border-right:1px solid #e7f1ed;color:#999 !important;font-weight:bold;text-decoration:none} /* 글제목줄 분류스타일 */ +.bo_current {color:#e8180c} +.td_subject a {display:block} +.td_subject img {margin-left:3px} +#bo_list .cnt_cmt {display:inline-block;margin:0 0 0 3px;font-weight:bold} + +#bo_sch {margin-bottom:10px;padding-top:5px;text-align:center} + +/* 게시판 쓰기 */ +#bo_w #wr_email, #bo_w #wr_homepage, #bo_w #wr_subject {width:100%} + +#char_count_desc {display:block;margin:0 0 5px;padding:0} +#char_count_wrap {margin:5px 0 0;text-align:right} +#char_count {font-weight:bold} + +#wr_email, #wr_homepage, #wr_subject, .wr_link {width:100%} + +/* 게시판 읽기 */ +#bo_v {margin-bottom:15px;padding-bottom:15px} + +#bo_v_table {padding:0 10px;color:#999;font-size:0.9em;font-weight:bold} + +#bo_v_title {padding:0 10px 5px;font-size:1.2em} + +#bo_v_info {padding:0 10px 10px;border-bottom:1px solid #ddd} +#bo_v_info h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_info {} +#bo_v_info strong {display:inline-block;margin:0 0 0 5px;font-weight:normal} + +#bo_v_file {} +#bo_v_file h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_file ul {margin:0;padding:0;list-style:none} +#bo_v_file li {padding:0 10px;border-bottom:1px solid #eee;background:#f7f7f7} +#bo_v_file a {display:inline-block;padding:5px 0;color:#000;text-decoration:none} +#bo_v_file a:focus, #bo_v_file a:hover, #bo_v_file a:active {text-decoration:none} +.bo_v_file_cnt {display:inline-block;margin:0 10px} + +#bo_v_link {} +#bo_v_link h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_link ul {margin:0;padding:0;list-style:none} +#bo_v_link li {padding:0 10px;border-bottom:1px solid #eee;background:#f7f7f7} +#bo_v_link a {display:inline-block;padding:5px 0;color:#000;text-decoration:none} +#bo_v_link a:focus, #bo_v_link a:hover, #bo_v_link a:active {text-decoration:none} +.bo_v_link_cnt {display:inline-block;margin:0 10px} + +#bo_v_top {margin:0 0 10px;padding:10px} +#bo_v_top:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_top h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_top ul {margin:0;padding:0;list-style:none} + +#bo_v_bot {padding:0 10px} +#bo_v_bot:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_bot h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_bot ul {margin:0;padding:0;list-style:none} + +.bo_v_nb {float:left} +.bo_v_nb li {float:left;margin-right:5px} +.bo_v_com {float:right} +.bo_v_com li {float:left;margin-left:5px} + +#bo_v_atc {padding:0 10px;min-height:200px} +#bo_v_atc_title {margin:0;padding:0;height:0;overflow:hidden} + +#bo_v_img {margin:0 0 10px;width:100%;overflow:hidden;zoom:1} +#bo_v_img:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_img img {margin-bottom:15px;max-width:100%;height:auto} + +#bo_v_con {margin-bottom:20px;width:100%;font-size:1.250em;line-height:1.7em;word-break:break-all;overflow:hidden} +#bo_v_con a {color:#000;text-decoration:underline} +#bo_v_con img {max-width:100%;height:auto} + +#bo_v_act {position:relative;margin-bottom:20px;text-align:center} +#bo_v_act a {margin-right:5px;vertical-align:middle} +#bo_v_act strong {color:#ff3061} +#bo_v_act_good, #bo_v_act_nogood {display:none;position:absolute;top:30px;right:10%;padding:10px 0;width:165px;background:#ff3061;color:#fff;text-align:center} + +#bo_v_sns {margin:0 0 20px;padding:0;list-style:none;zoom:1} +#bo_v_sns:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_sns li {float:left;margin:0 5px 0 0} + +/* 게시판 댓글 */ +#bo_vc {margin:0 0 20px;padding:20px 10px 10px;border:1px solid #e5e8ec;background:#f5f8f9} +#bo_vc h2 {margin-bottom:5px} +#bo_vc article {padding:0 0 5px;border-top:1px dotted #ccc} +#bo_vc header {position:relative;padding:13px 0 5px} +#bo_vc header .icon_reply {position:absolute;top:13px;left:-20px} +#bo_vc .sv_member, #bo_vc .sv_guest {font-weight:bold} +.bo_vc_hdinfo {display:inline-block;margin:0 10px 0 5px} +#bo_vc h1 {width:0;height:0;font-size:0;line-height:0;overflow:hidden} +#bo_vc a {color:#000;text-decoration:none} +#bo_vc p {padding:0 0 5px;line-height:1.8em} +#bo_vc p a {text-decoration:underline} +#bo_vc_empty {margin:0;padding:15px !important;text-align:center} +#bo_vc #bo_vc_winfo {float:left} +#bo_vc footer {zoom:1} +#bo_vc footer:after {display:block;visibility:hidden;clear:both;content:""} + +.bo_vc_act {float:right;margin:0;list-style:none} +.bo_vc_act:after {display:block;visibility:hidden;clear:both;content:""} +.bo_vc_act li {float:left;margin-left:5px} + +#bo_vc_w {position:relative;margin-bottom:10px;padding:0 10px 15px;border-bottom:1px solid #dde4e9} +#bo_vc_w h2 {padding:10px 0 5px} +#bo_vc_w .tbl_wrap {margin:0 0 15px} +#bo_vc_w #char_cnt {display:block;margin-bottom:5px} +#bo_vc_w textarea {width:99%} + +#bo_vc_sns {margin:0;padding:0;list-style:none;zoom:1} +#bo_vc_sns:after {display:block;visibility:hidden;clear:both;content:""} +#bo_vc_sns li {float:left;margin:0 10px 0 0} +#bo_vc_sns input {margin:0 0 0 5px} \ No newline at end of file diff --git a/mobile/skin/board/basic/view.skin.php b/mobile/skin/board/basic/view.skin.php new file mode 100644 index 000000000..3de738ab1 --- /dev/null +++ b/mobile/skin/board/basic/view.skin.php @@ -0,0 +1,270 @@ +', 0); +?> + + + +
    + +
    +
    +

    + +

    +
    + +
    +

    페이지 정보

    + 작성자 + 작성일 + 조회 + 댓글 +
    + + + + +
    +

    첨부파일

    + +
    + + + + + + +
    + + + + + + + +
    + +
    +

    본문

    + + \n"; + + for ($i=0; $i<=count($view['file']); $i++) { + if ($view['file'][$i]['view']) { + //echo $view['file'][$i]['view']; + echo get_view_thumbnail($view['file'][$i]['view']); + } + } + + echo "\n"; + } + ?> + +
    + + +

    + + +
    + 스크랩 + + + 추천 + 이 글을 추천하셨습니다 + + + + + 비추천 + + + +
    + +
    + 추천 + 비추천 +
    + + +
    + + + +
    + + +
    + +
    + + + + + + \ No newline at end of file diff --git a/mobile/skin/board/basic/view_comment.skin.php b/mobile/skin/board/basic/view_comment.skin.php new file mode 100644 index 000000000..a901968a2 --- /dev/null +++ b/mobile/skin/board/basic/view_comment.skin.php @@ -0,0 +1,302 @@ + + + + + +
    +

    댓글목록

    + \]/i", "", $str); + ?> +
    style="margin-left:px;border-top-color:#e0e0e0"> +
    +

    님의 댓글

    + + 댓글의 댓글 + + 아이피 + + + 작성일 + + +
    + + +

    + "; ?> + +

    + + + + + "> + + + + + +
    + +

    등록된 댓글이 없습니다.

    + +
    + + + + + + diff --git a/mobile/skin/board/basic/write.skin.php b/mobile/skin/board/basic/write.skin.php new file mode 100644 index 000000000..b28d9abb7 --- /dev/null +++ b/mobile/skin/board/basic/write.skin.php @@ -0,0 +1,252 @@ +', 0); +?> + +
    +

    + +
    + + + + + + + + + + + '.PHP_EOL.''; + } + + if ($is_html) { + if ($is_dhtml_editor) { + $option_hidden .= ''; + } else { + $option .= PHP_EOL.''.PHP_EOL.''; + } + } + + if ($is_secret) { + if ($is_admin || $is_secret==1) { + $option .= PHP_EOL.''.PHP_EOL.''; + } else { + $option_hidden .= ''; + } + } + + if ($is_mail) { + $option .= PHP_EOL.''.PHP_EOL.''; + } + } + + echo $option_hidden; + ?> +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    class="frm_input " maxlength="20">
    옵션
    + +
    + + +

    이 게시판은 최소 글자 이상, 최대 글자 이하까지 글을 쓰실 수 있습니다.

    + + + + +
    글자
    + +
    " id="wr_link" class="frm_input wr_link">
    파일 # + + + + + + + +
    자동등록방지 + +
    +
    + +
    + + 취소 +
    +
    +
    + + diff --git a/mobile/skin/board/gallery/img/icon_file.gif b/mobile/skin/board/gallery/img/icon_file.gif new file mode 100644 index 0000000000000000000000000000000000000000..cca47f566ac0db655fb2ab0f56628b64958e48b2 GIT binary patch literal 107 zcmZ?wbhEHb-Wqsc#^P~2x#@rVooH@5wHB9i@BozKb;P9uI^*c|UyXO5@>VyLmgEat< Cr6(f* literal 0 HcmV?d00001 diff --git a/mobile/skin/board/gallery/img/icon_hot.gif b/mobile/skin/board/gallery/img/icon_hot.gif new file mode 100644 index 0000000000000000000000000000000000000000..c95b839aeef0c1e26a4bab4ea50cd6d3f1969d7f GIT binary patch literal 97 zcmZ?wbhEHbzHen|7VvwFnzUPlarEA ZqW~YXyUO~T+#YkUoJ%V_>ib05Q5F AasU7T literal 0 HcmV?d00001 diff --git a/mobile/skin/board/gallery/img/icon_mobile.gif b/mobile/skin/board/gallery/img/icon_mobile.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad934d23c440c83db0c4589596465cb087353e01 GIT binary patch literal 62 zcmZ?wbhEHbZ% literal 0 HcmV?d00001 diff --git a/mobile/skin/board/gallery/img/icon_reply.gif b/mobile/skin/board/gallery/img/icon_reply.gif new file mode 100644 index 0000000000000000000000000000000000000000..91c135977b4f445a90c849310dc80efde1983830 GIT binary patch literal 77 zcmZ?wbhEHb&!1E4^4&ClEzh)PmWxV3{9A~!gB2-%RL5bHcgg3Zp^!+W)H2^A_AxQuL literal 0 HcmV?d00001 diff --git a/mobile/skin/board/gallery/img/icon_sound.gif b/mobile/skin/board/gallery/img/icon_sound.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5188318a5cdc394b984125c0ddd376c5f57bbe4 GIT binary patch literal 113 zcmZ?wbhEHbE1CJY$zMikVi`-#gIi|DbmsXBWf6U5szE@->A`0*`&<;b@XASRrB8=E6~=S>Pbm I%fes{0AXt-SpWb4 literal 0 HcmV?d00001 diff --git a/mobile/skin/board/gallery/list.skin.php b/mobile/skin/board/gallery/list.skin.php new file mode 100644 index 000000000..c429e7614 --- /dev/null +++ b/mobile/skin/board/gallery/list.skin.php @@ -0,0 +1,249 @@ +', 0); +?> + + + +

    목록

    + + +
    + + + + + +
    +
    + Total + 페이지 +
    + + + + +
    + +
    + + + + + + + +

    이미지 목록

    + + +
    + + +
    + + +
      + +
    • + + + + + + 열람중"; + else + echo $list[$i]['num']; + ?> + + +
    • + + 게시물이 없습니다."; } ?> +
    + + +
    + + + +
    + + +
    +
    + + + + + + + + + + +
    + 게시물 검색 + +
    + + + + + + + +
    +
    + + + + + diff --git a/mobile/skin/board/gallery/style.css b/mobile/skin/board/gallery/style.css new file mode 100644 index 000000000..9fcf341af --- /dev/null +++ b/mobile/skin/board/gallery/style.css @@ -0,0 +1,224 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* ### 기본 스타일 커스터마이징 시작 ### */ + +/* 게시판 버튼 */ +/* 목록 버튼 */ +#bo_gall a.btn_b01 {} +#bo_gall a.btn_b01:focus, #bo_gall .btn_b01:hover {} +#bo_gall a.btn_b02 {} +#bo_gall a.btn_b02:focus, #bo_gall .btn_b02:hover {} +#bo_gall a.btn_admin {} /* 관리자 전용 버튼 */ +#bo_gall a.btn_admin:focus, #bo_gall a.btn_admin:hover {} + +/* 읽기 버튼 */ +#bo_v a.btn_b01 {} +#bo_v a.btn_b01:focus, #bo_v .btn_b01:hover {} +#bo_v a.btn_b02 {} +#bo_v a.btn_b02:focus, #bo_v .btn_b02:hover {} +#bo_v a.btn_admin {} /* 관리자 전용 버튼 */ +#bo_v a.btn_admin:focus, #bo_v a.btn_admin:hover {} + +/* 쓰기 버튼 */ +#bo_w .btn_confirm {} /* 서식단계 진행 */ +#bo_w .btn_submit {} +#bo_w .btn_cancel {} +#bo_w .btn_frmline {} /* 우편번호검색버튼 등 */ + +/* 기본테이블 */ +/* 읽기 내 테이블 */ +#bo_v .tbl_head01 {} +#bo_v .tbl_head01 caption {} +#bo_v .tbl_head01 thead th {} +#bo_v .tbl_head01 thead a {} +#bo_v .tbl_head01 thead th input {} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +#bo_v .tbl_head01 tfoot th {} +#bo_v .tbl_head01 tfoot td {} +#bo_v .tbl_head01 tbody th {} +#bo_v .tbl_head01 td {} +#bo_v .tbl_head01 a {} +#bo_v td.empty_table {} + +/* 쓰기 테이블 */ +#bo_w table {} +#bo_w caption {} +#bo_w .frm_address {} +#bo_w .frm_file {} +#bo_w .frm_info {} + +#bo_w .tbl_frm01 {} +#bo_w .tbl_frm01 caption {} +#bo_w .tbl_frm01 th {} +#bo_w .tbl_frm01 td {} +#bo_w .tbl_frm01 textarea, #bo_w .frm_input {} +#bo_w .tbl_frm01 textarea {} +/* +#bo_w .tbl_frm01 #captcha {} +#bo_w .tbl_frm01 #captcha input {} +*/ +#bo_w .tbl_frm01 a {} + +#bo_w .required, #bo_w textarea.required {} + +/* ### 기본 스타일 커스터마이징 끝 ### */ + +/* 갤러리 목록 */ +#bo_gall h2 {margin:0;padding:0;width:0;height:0;font-size:0;line-height:0;overflow:hidden} + +#bo_gall #gall_allchk {margin:0 10px} + +#bo_gall #gall_ul {margin:10px 0 0;padding:0 10px;list-style:none} +#bo_gall #gall_ul:after {display:block;visibility:hidden;clear:both;content:""} + +#bo_cate h2 {width:0;height:0;font-size:0;line-height:0;overflow:hidden} +#bo_cate ul {margin:10px;padding-left:1px;zoom:1} +#bo_cate ul:after {display:block;visibility:hidden;clear:both;content:""} +#bo_cate li {float:left;margin-bottom:-1px;width:25%} +#bo_cate a {display:block;position:relative;margin-left:-1px;padding:5px 0;border:1px solid #ddd;background:#f7f7f7;color:#888;text-align:center;text-decoration:none;letter-spacing:-0.1em} +#bo_cate a:focus, #bo_cate a:hover, #bo_cate a:active {text-decoration:none} +#bo_cate #bo_cate_on {z-index:2;border:1px solid #565e60;background:#fff;color:#565e60;font-weight:bold} + +#bo_gall .gall_li {float:left;padding:0 10px 20px 0} +#bo_gall .gall_clear {clear:both} + +#bo_gall .gall_con {margin:0;padding:0;list-style:none} +#bo_gall .gall_con li {margin:0 0 5px} +#bo_gall .gall_con .gall_subject {display:inline-block;width:50px} + +#bo_gall .gall_now .gall_text_href a {color:#ff3061} + +#bo_gall .gall_href a:link, #bo_gall .gall_href a:focus, #bo_gall .gall_href a:hover {text-decoration:none} +#bo_gall .gall_href strong, #bo_gall .gall_href span {display:block;width:174px;height:124px;background:#f7f7f7;text-align:center;line-height:8em} + +#bo_gall .gall_text_href {margin:10px 0 !important} +#bo_gall .gall_text_href a {color:#000;font-weight:bold;text-decoration:none} +#bo_gall .gall_text_href img {margin:0 0 0 5px} + +/* 게시판 목록 공통 */ +.bo_fx {margin-bottom:5px;padding:5px 10px} +.bo_fx:after {display:block;visibility:hidden;clear:both;content:""} +.bo_fx ul {margin:0;padding:0;list-style:none} +#bo_list_total {float:left;padding:0;height:2.5em;line-height:2.5em} +.btn_bo_user {float:right;margin:0;padding:0;list-style:none} +.btn_bo_user li {float:left;margin-left:5px} +.btn_bo_adm {float:left} +.btn_bo_adm li {float:left;margin-right:5px} +.btn_bo_adm input {padding:8px;border:0;background:#e8180c;color:#fff;text-decoration:none;vertical-align:middle} +.bo_notice td {background:#f7f7f7} +.bo_notice td a {font-weight:bold} +.td_num strong {color:#000} +.bo_cate_link {display:inline-block;margin:0 3px 0 0;padding:0 6px 0 0;border-right:1px solid #e7f1ed;color:#999 !important;font-weight:bold;text-decoration:none} /* 글제목줄 분류스타일 */ +.bo_current {color:#e8180c} +.td_subject img {margin-left:3px} +.cnt_cmt {font-weight:bold} + +#bo_sch {margin-bottom:10px;padding-top:5px;text-align:center} + +#bo_gall li.empty_list {padding:30px 0;text-align:center} + +/* 게시판 쓰기 */ +#char_count_desc {display:block;margin:0 0 5px;padding:0} +#char_count_wrap {margin:5px 0 0;text-align:right} +#char_count {font-weight:bold} + +#wr_email, #wr_homepage, #wr_subject, .wr_link {width:100%} + +/* 게시판 읽기 */ +#bo_v {margin-bottom:15px;padding-bottom:15px} + +#bo_v_table {padding:0 10px;color:#999;font-size:0.9em;font-weight:bold} + +#bo_v_title {padding:0 10px 5px;font-size:1.2em} + +#bo_v_info {padding:0 10px 10px;border-bottom:1px solid #ddd} +#bo_v_info h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_info {} +#bo_v_info strong {display:inline-block;margin:0 0 0 5px;font-weight:normal} + +#bo_v_file {} +#bo_v_file h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_file ul {margin:0;padding:0;list-style:none} +#bo_v_file li {padding:0 10px;border-bottom:1px solid #eee;background:#f7f7f7} +#bo_v_file a {display:inline-block;padding:5px 0;color:#000} +#bo_v_file a:focus, +#bo_v_file a:hover, +#bo_v_file a:active {text-decoration:none} +.bo_v_file_cnt {display:inline-block;margin:0 10px} + +#bo_v_link {} +#bo_v_link h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_link ul {margin:0;padding:0;list-style:none} +#bo_v_link li {padding:0 10px;border-bottom:1px solid #eee;background:#f7f7f7} +#bo_v_link a {display:inline-block;padding:5px 0;color:#000} +#bo_v_link a:focus, +#bo_v_link a:hover, +#bo_v_link a:active {text-decoration:none} +.bo_v_link_cnt {display:inline-block;margin:0 10px} + +#bo_v_top {margin:0 0 10px;padding:10px} +#bo_v_top:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_top h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_top ul {margin:0;padding:0;list-style:none} + +#bo_v_bot {padding:0 10px} +#bo_v_bot:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_bot h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_bot ul {margin:0;padding:0;list-style:none} + +.bo_v_nb {float:left} +.bo_v_nb li {float:left;margin-right:5px} +.bo_v_com {float:right} +.bo_v_com li {float:left;margin-left:5px} + +#bo_v_atc {padding:0 10px;min-height:200px} +#bo_v_atc_title {margin:0;padding:0;height:0;overflow:hidden} + +#bo_v_img {margin:0 0 10px;width:100%;overflow:hidden;zoom:1} +#bo_v_img:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_img img {margin-bottom:15px;max-width:100%;height:auto} + +#bo_v_con {margin-bottom:20px;width:100%;line-height:1.7em;word-break:break-all;overflow:hidden} +#bo_v_con a {color:#000;text-decoration:underline} +#bo_v_con img {max-width:100%;height:auto} + +#bo_v_act {position:relative;margin-bottom:20px;text-align:center} +#bo_v_act a {margin-right:5px;vertical-align:middle} +#bo_v_act strong {color:#ff3061} +#bo_v_act_good, #bo_v_act_nogood {display:none;position:absolute;top:30px;right:10%;padding:10px 0;width:165px;background:#ff3061;color:#fff;text-align:center} + +#bo_v_sns {margin:0 0 20px;padding:0;list-style:none;zoom:1} +#bo_v_sns:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_sns li {float:left;margin:0 5px 0 0} + +/* 게시판 댓글 */ +#bo_vc {margin:0 0 20px;padding:20px 10px 10px;border:1px solid #e5e8ec;background:#f5f8f9} +#bo_vc h2 {margin-bottom:5px} +#bo_vc article {padding:0 0 5px;border-top:1px dotted #ccc} +#bo_vc header {position:relative;padding:13px 0 5px} +#bo_vc header .icon_reply {position:absolute;top:13px;left:-20px} +#bo_vc .sv_member, #bo_vc .sv_guest {font-weight:bold} +.bo_vc_hdinfo {display:inline-block;margin:0 10px 0 5px} +#bo_vc h1 {width:0;height:0;font-size:0;line-height:0;overflow:hidden} +#bo_vc a {color:#000;text-decoration:none} +#bo_vc p {padding:0 0 5px;line-height:1.8em} +#bo_vc p a {text-decoration:underline} +#bo_vc_empty {margin:0;padding:15px !important;text-align:center} +#bo_vc #bo_vc_winfo {float:left} +#bo_vc footer {zoom:1} +#bo_vc footer:after {display:block;visibility:hidden;clear:both;content:""} + +.bo_vc_act {float:right;margin:0;list-style:none} +.bo_vc_act:after {display:block;visibility:hidden;clear:both;content:""} +.bo_vc_act li {float:left;margin-left:5px} + +#bo_vc_w {position:relative;margin-bottom:10px;padding:0 10px 15px;border-bottom:1px solid #dde4e9} +#bo_vc_w h2 {padding:10px 0 5px} +#bo_vc_w .tbl_wrap {margin:0 0 15px} +#bo_vc_w #char_cnt {display:block;margin-bottom:5px} +#bo_vc_w textarea {width:99%} + +#bo_vc_sns {margin:0;padding:0;list-style:none;zoom:1} +#bo_vc_sns:after {display:block;visibility:hidden;clear:both;content:""} +#bo_vc_sns li {float:left;margin:0 10px 0 0} +#bo_vc_sns input {margin:0 0 0 5px} \ No newline at end of file diff --git a/mobile/skin/board/gallery/view.skin.php b/mobile/skin/board/gallery/view.skin.php new file mode 100644 index 000000000..c5635d5aa --- /dev/null +++ b/mobile/skin/board/gallery/view.skin.php @@ -0,0 +1,270 @@ +', 0); +?> + + + +
    + +
    +
    +

    + +

    +
    + +
    +

    페이지 정보

    + 작성자 + 작성일 + 조회 + 댓글 +
    + + + + +
    +

    첨부파일

    + +
    + + + + + + +
    + + + + + + + +
    + +
    +

    본문

    + + \n"; + + for ($i=0; $i<=count($view['file']); $i++) { + if ($view['file'][$i]['view']) { + //echo $view['file'][$i]['view']; + echo get_view_thumbnail($view['file'][$i]['view']); + } + } + + echo "\n"; + } + ?> + +
    + + +

    + + +
    + 스크랩 + + + 추천 + + + + + + 비추천 + + + +
    + +
    + 추천 + 비추천 +
    + + +
    + + + +
    + + +
    + +
    + + + + + + \ No newline at end of file diff --git a/mobile/skin/board/gallery/view_comment.skin.php b/mobile/skin/board/gallery/view_comment.skin.php new file mode 100644 index 000000000..a901968a2 --- /dev/null +++ b/mobile/skin/board/gallery/view_comment.skin.php @@ -0,0 +1,302 @@ + + + + + +
    +

    댓글목록

    + \]/i", "", $str); + ?> +
    style="margin-left:px;border-top-color:#e0e0e0"> +
    +

    님의 댓글

    + + 댓글의 댓글 + + 아이피 + + + 작성일 + + +
    + + +

    + "; ?> + +

    + + + + + "> + + + + + +
    + +

    등록된 댓글이 없습니다.

    + +
    + + + + + + diff --git a/mobile/skin/board/gallery/write.skin.php b/mobile/skin/board/gallery/write.skin.php new file mode 100644 index 000000000..f40d8db61 --- /dev/null +++ b/mobile/skin/board/gallery/write.skin.php @@ -0,0 +1,251 @@ +', 0); +?> + +
    +

    + +
    + + + + + + + + + + + '.PHP_EOL.''; + } + + if ($is_html) { + if ($is_dhtml_editor) { + $option_hidden .= ''; + } else { + $option .= PHP_EOL.''.PHP_EOL.''; + } + } + + if ($is_secret) { + if ($is_admin || $is_secret==1) { + $option .= PHP_EOL.''.PHP_EOL.''; + } else { + $option_hidden .= ''; + } + } + + if ($is_mail) { + $option .= PHP_EOL.''.PHP_EOL.''; + } + } + + echo $option_hidden; + ?> +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    class="frm_input " size="15" maxlength="20">
    옵션
    + +
    + + +

    이 게시판은 최소 글자 이상, 최대 글자 이하까지 글을 쓰실 수 있습니다.

    + + + + +
    글자
    + +
    " id="wr_link" class="frm_input wr_link">
    파일 # + + + + + + + +
    자동등록방지 + +
    +
    + +
    + + 취소 +
    +
    +
    + + diff --git a/mobile/skin/connect/basic/connect.skin.php b/mobile/skin/connect/basic/connect.skin.php new file mode 100644 index 000000000..55849443c --- /dev/null +++ b/mobile/skin/connect/basic/connect.skin.php @@ -0,0 +1,9 @@ +', 0); +?> + + diff --git a/mobile/skin/connect/basic/current_connect.skin.php b/mobile/skin/connect/basic/current_connect.skin.php new file mode 100644 index 000000000..5d47774b7 --- /dev/null +++ b/mobile/skin/connect/basic/current_connect.skin.php @@ -0,0 +1,38 @@ +', 0); +?> + +
    + + + + + + + + + + ".$location.""; + else $display_location = $location; + ?> + + + + + + "; + ?> + +
    번호이름위치
    현재 접속자가 없습니다.
    +
    \ No newline at end of file diff --git a/mobile/skin/connect/basic/style.css b/mobile/skin/connect/basic/style.css new file mode 100644 index 000000000..09c88df61 --- /dev/null +++ b/mobile/skin/connect/basic/style.css @@ -0,0 +1,9 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* 현재접속자 */ +#current_connect_tbl {} +#current_connect_tbl th:nth-of-type(1) {width:50px} +#current_connect_tbl th:nth-of-type(2) {width:120px} + +#current_connect_tbl td:nth-of-type(1) {padding:10px 0;text-align:center} \ No newline at end of file diff --git a/mobile/skin/faq/basic/list.skin.php b/mobile/skin/faq/basic/list.skin.php new file mode 100644 index 000000000..931fb8832 --- /dev/null +++ b/mobile/skin/faq/basic/list.skin.php @@ -0,0 +1,120 @@ +', 0); +?> + + +'.stripslashes($fm['fm_mobile_head_html']).''; +?> + + + + + +
    + +
    +

    목록

    +
      + $v){ + if(empty($v)) + continue; + ?> +
    1. +

      +
      + +
      +
      +
    2. + +
    +
    + 검색된 게시물이 없습니다.

    '; + } else { + echo '
    등록된 FAQ가 없습니다.'; + if($is_admin) + echo '
    FAQ를 새로 등록하시려면 FAQ관리 메뉴를 이용하십시오.'; + echo '
    '; + } + } + ?> +
    + + + +'.stripslashes($fm['fm_tail_html']).''; +?> + +
    +
    + + + + +
    +
    + + + + \ No newline at end of file diff --git a/mobile/skin/faq/basic/style.css b/mobile/skin/faq/basic/style.css new file mode 100644 index 000000000..d573cdfb7 --- /dev/null +++ b/mobile/skin/faq/basic/style.css @@ -0,0 +1,25 @@ +@charset "utf-8"; + +#bo_cate {margin:0 10px} +#bo_cate h2 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#bo_cate ul {margin-bottom:10px;padding-left:1px;zoom:1} +#bo_cate ul:after {display:block;visibility:hidden;clear:both;content:""} +#bo_cate li {float:left;margin-bottom:-1px} +#bo_cate a {display:block;position:relative;margin-left:-1px;padding:6px 0 5px;width:90px;border:1px solid #ddd;background:#f7f7f7;color:#888;text-align:center;letter-spacing:-0.1em;line-height:1.2em;cursor:pointer} +#bo_cate a:focus, #bo_cate a:hover, #bo_cate a:active {text-decoration:none} +#bo_cate #bo_cate_on {z-index:2;border:1px solid #565e60;background:#fff;color:#565e60;font-weight:bold} + +#faq_wrap {margin:10px} +#faq_wrap h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +.faq_admin {margin:0 5px;text-align:right} +#faq_wrap p {line-height:1.8em} +#faq_wrap ol {margin:0;padding:0;list-style:none} +#faq_con {border:1px solid #e9e9e9;border-top:0} +#faq_con h3 a {display:block;padding:10px;background:#f2f5f9;border-top:1px solid #e9e9e9} +#faq_con .con_inner {display:none;padding:10px;line-height:1.8em} +#faq_con .con_closer {margin:10px 0 0;text-align:right} +#faq_con .closer_btn {margin:0;padding:10px;border:0;background:#666;color:#fff} +.faq_tolist {padding:0 10px;text-align:right} +.faq_img {text-align:center} + +#faq_sch {text-align:center} \ No newline at end of file diff --git a/mobile/skin/latest/basic/img/icon_file.gif b/mobile/skin/latest/basic/img/icon_file.gif new file mode 100644 index 0000000000000000000000000000000000000000..cca47f566ac0db655fb2ab0f56628b64958e48b2 GIT binary patch literal 107 zcmZ?wbhEHb-Wqsc#^P~2x#@rVooH@5wHB9i@BozKb;P9uI^*c|UyXO5@>VyLmgEat< Cr6(f* literal 0 HcmV?d00001 diff --git a/mobile/skin/latest/basic/img/icon_hot.gif b/mobile/skin/latest/basic/img/icon_hot.gif new file mode 100644 index 0000000000000000000000000000000000000000..c95b839aeef0c1e26a4bab4ea50cd6d3f1969d7f GIT binary patch literal 97 zcmZ?wbhEHbzHen|7VvwFnzUPlarEA ZqW~YXyUO~T+#YkUoJ%V_>ib05Q5F AasU7T literal 0 HcmV?d00001 diff --git a/mobile/skin/latest/basic/img/icon_mobile.gif b/mobile/skin/latest/basic/img/icon_mobile.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad934d23c440c83db0c4589596465cb087353e01 GIT binary patch literal 62 zcmZ?wbhEHbI6zOJt}3$`6RT1g06226*Z@+ongb7@ XU=fBkjtXNz0xpR_!)cQgkRbp&KI&WI literal 0 HcmV?d00001 diff --git a/mobile/skin/latest/basic/img/icon_movie.gif b/mobile/skin/latest/basic/img/icon_movie.gif new file mode 100644 index 0000000000000000000000000000000000000000..cb958f83f9c606f290a260714cd9a3cff043f3a2 GIT binary patch literal 110 zcmZ?wbhEHbZ% literal 0 HcmV?d00001 diff --git a/mobile/skin/latest/basic/img/icon_reply.gif b/mobile/skin/latest/basic/img/icon_reply.gif new file mode 100644 index 0000000000000000000000000000000000000000..91c135977b4f445a90c849310dc80efde1983830 GIT binary patch literal 77 zcmZ?wbhEHb&!1E4^4&ClEzh)PmWxV3{9A~!gB2-%RL5bHcgg3Zp^!+W)H2^A_AxQuL literal 0 HcmV?d00001 diff --git a/mobile/skin/latest/basic/img/icon_sound.gif b/mobile/skin/latest/basic/img/icon_sound.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5188318a5cdc394b984125c0ddd376c5f57bbe4 GIT binary patch literal 113 zcmZ?wbhEHbE1CJY$zMikVi`-#gIi|DbmsXBWf6U5szE@->A`0*`&<;b@XASRrB8=E6~=S>Pbm I%fes{0AXt-SpWb4 literal 0 HcmV?d00001 diff --git a/mobile/skin/latest/basic/latest.skin.php b/mobile/skin/latest/basic/latest.skin.php new file mode 100644 index 000000000..89ac1b4b8 --- /dev/null +++ b/mobile/skin/latest/basic/latest.skin.php @@ -0,0 +1,43 @@ +', 0); +?> + +
    + +
      + +
    • + "; + if ($list[$i]['is_notice']) + echo "".$list[$i]['subject'].""; + else + echo $list[$i]['subject']; + + if ($list[$i]['comment_cnt']) + echo " ".$list[$i]['comment_cnt'].""; + + // if ($list[$i]['link']['count']) { echo "[{$list[$i]['link']['count']}]"; } + // if ($list[$i]['file']['count']) { echo "<{$list[$i]['file']['count']}>"; } + + if (isset($list[$i]['icon_new'])) echo " " . $list[$i]['icon_new']; + if (isset($list[$i]['icon_hot'])) echo " " . $list[$i]['icon_hot']; + if (isset($list[$i]['icon_file'])) echo " " . $list[$i]['icon_file']; + if (isset($list[$i]['icon_link'])) echo " " . $list[$i]['icon_link']; + if (isset($list[$i]['icon_secret'])) echo " " . $list[$i]['icon_secret']; + + echo ""; + + ?> +
    • + + +
    • 게시물이 없습니다.
    • + +
    + +
    diff --git a/mobile/skin/latest/basic/style.css b/mobile/skin/latest/basic/style.css new file mode 100644 index 000000000..8434bf210 --- /dev/null +++ b/mobile/skin/latest/basic/style.css @@ -0,0 +1,10 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* 최근게시물 스킨 (latest) */ +.lt {position:relative;margin:0 0 10px;padding:0 10px 15px;border-bottom:1px solid #ddd} +.lt ul {margin:0 0 10px;padding:0;list-style:none} +.lt a {display:block;padding:5px 0;color:#000;text-decoration:none} +.lt .lt_title {display:inline-block;padding:10px 0} +.lt .lt_more {position:absolute;top:5px;right:10px} +.lt .cnt_cmt {display:inline-block;margin:0 0 0 3px;font-weight:bold} \ No newline at end of file diff --git a/mobile/skin/member/basic/formmail.skin.php b/mobile/skin/member/basic/formmail.skin.php new file mode 100644 index 000000000..3add8546b --- /dev/null +++ b/mobile/skin/member/basic/formmail.skin.php @@ -0,0 +1,96 @@ +', 0); +?> + +
    +

    님께 메일보내기

    + +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    메일쓰기
    형식 + + + +
    자동등록방지
    +
    + +
    + + +
    + +
    +
    + + diff --git a/mobile/skin/member/basic/img/zip_ico_up.gif b/mobile/skin/member/basic/img/zip_ico_up.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1eff70fa850bea122f6924d8c3cd63f1d573c53 GIT binary patch literal 54 zcmZ?wbhEHb', 0); +?> + +
    +

    + +
    + + +
    + + + + + +
    + + +
    +
    + +
    +

    회원로그인 안내

    +

    + 회원아이디 및 비밀번호가 기억 안나실 때는 아이디/비밀번호 찾기를 이용하십시오.
    + 아직 회원이 아니시라면 회원으로 가입 후 이용해 주십시오. +

    + +
    + + + +
    + +
    + + diff --git a/mobile/skin/member/basic/login_check.skin.php b/mobile/skin/member/basic/login_check.skin.php new file mode 100644 index 000000000..1b182915e --- /dev/null +++ b/mobile/skin/member/basic/login_check.skin.php @@ -0,0 +1,5 @@ + diff --git a/mobile/skin/member/basic/member_confirm.skin.php b/mobile/skin/member/basic/member_confirm.skin.php new file mode 100644 index 000000000..467b801e0 --- /dev/null +++ b/mobile/skin/member/basic/member_confirm.skin.php @@ -0,0 +1,42 @@ +', 0); +?> + +
    +

    + +

    + 비밀번호를 한번 더 입력해주세요. + 회원님의 정보를 안전하게 보호하기 위해 비밀번호를 한번 더 확인합니다. +

    + +
    + + + +
    + 회원아이디 + + + +
    + +
    + + + +
    + + diff --git a/mobile/skin/member/basic/memo.skin.php b/mobile/skin/member/basic/memo.skin.php new file mode 100644 index 000000000..2d2174b1c --- /dev/null +++ b/mobile/skin/member/basic/memo.skin.php @@ -0,0 +1,40 @@ +', 0); +?> + +
    +

    + + + +
    + 전체 쪽지
    +
    + + + +

    + 쪽지 보관일수는 최장 일 입니다. +

    + +
    + +
    +
    \ No newline at end of file diff --git a/mobile/skin/member/basic/memo_form.skin.php b/mobile/skin/member/basic/memo_form.skin.php new file mode 100644 index 000000000..47d0355f0 --- /dev/null +++ b/mobile/skin/member/basic/memo_form.skin.php @@ -0,0 +1,57 @@ +', 0); +?> + +
    +

    쪽지보내기

    + + + +
    +
    + + + + + + + + + + + + + + + + +
    쪽지쓰기
    + + 여러 회원에게 보낼때는 컴마(,)로 구분하세요. +
    자동등록방지 + +
    +
    + +
    + + +
    +
    +
    + + diff --git a/mobile/skin/member/basic/memo_view.skin.php b/mobile/skin/member/basic/memo_view.skin.php new file mode 100644 index 000000000..ae87bfacf --- /dev/null +++ b/mobile/skin/member/basic/memo_view.skin.php @@ -0,0 +1,56 @@ +', 0); +?> + +
    +

    + + + +
    +
    +

    쪽지 내용

    +
    +
      +
    • + 사람 + +
    • +
    • + 시간 + +
    • +
    +

    + +

    +
    + +
    + + 이전쪽지 + + + 다음쪽지 + + 답장 + 목록보기 + +
    +
    \ No newline at end of file diff --git a/mobile/skin/member/basic/password.skin.php b/mobile/skin/member/basic/password.skin.php new file mode 100644 index 000000000..7a73f21e9 --- /dev/null +++ b/mobile/skin/member/basic/password.skin.php @@ -0,0 +1,47 @@ +', 0); +?> + +
    +

    +

    + + 작성자만 글을 수정할 수 있습니다. + 작성자 본인이라면, 글 작성시 입력한 비밀번호를 입력하여 글을 수정할 수 있습니다. + + 작성자만 글을 삭제할 수 있습니다. + 작성자 본인이라면, 글 작성시 입력한 비밀번호를 입력하여 글을 삭제할 수 있습니다. + + 비밀글 기능으로 보호된 글입니다. + 작성자와 관리자만 열람하실 수 있습니다. 본인이라면 비밀번호를 입력하세요. + +

    + +
    + + + + + + + + +
    + + +
    +
    + + + +
    diff --git a/mobile/skin/member/basic/password_lost.skin.php b/mobile/skin/member/basic/password_lost.skin.php new file mode 100644 index 000000000..a4e1d11ef --- /dev/null +++ b/mobile/skin/member/basic/password_lost.skin.php @@ -0,0 +1,46 @@ +', 0); +?> + +
    +

    아이디/비밀번호 찾기

    + +
    +
    +

    + 회원가입 시 등록하신 이메일 주소를 입력해 주세요.
    + 해당 이메일로 아이디와 비밀번호 정보를 보내드립니다. +

    + +
    + + + +
    + + +
    +
    +
    + + diff --git a/mobile/skin/member/basic/point.skin.php b/mobile/skin/member/basic/point.skin.php new file mode 100644 index 000000000..93ce40a91 --- /dev/null +++ b/mobile/skin/member/basic/point.skin.php @@ -0,0 +1,81 @@ +', 0); +?> + +
    +

    + +
      + 0) { + $point1 = '+' .number_format($row['po_point']); + $sum_point1 += $row['po_point']; + } else { + $point2 = number_format($row['po_point']); + $sum_point2 += $row['po_point']; + } + + $po_content = $row['po_content']; + + $expr = ''; +// if($row['po_expired'] == 1) + $expr = ' txt_expired'; + ?> +
    • +
      + + +
      +
      + + + 만료 + + + +
      +
    • + 자료가 없습니다.'; + else { + if ($sum_point1 > 0) + $sum_point1 = "+" . number_format($sum_point1); + $sum_point2 = number_format($sum_point2); + } + ?> +
    + +
    +
    + 지급 + +
    +
    + 사용 + +
    +
    + 보유 + +
    +
    + + + +
    +
    \ No newline at end of file diff --git a/mobile/skin/member/basic/profile.skin.php b/mobile/skin/member/basic/profile.skin.php new file mode 100644 index 000000000..0cc8d8d02 --- /dev/null +++ b/mobile/skin/member/basic/profile.skin.php @@ -0,0 +1,48 @@ +', 0); +?> + +
    +

    님의 프로필

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    회원권한
    포인트
    홈페이지
    회원가입일= $mb['mb_level']) ? substr($mb['mb_datetime'],0,10) ." (".number_format($mb_reg_after)." 일)" : "알 수 없음"; ?>
    최종접속일= $mb['mb_level']) ? $mb['mb_today_login'] : "알 수 없음"; ?>
    +
    + +
    +

    인사말

    +

    +
    + +
    + +
    +
    diff --git a/mobile/skin/member/basic/register.skin.php b/mobile/skin/member/basic/register.skin.php new file mode 100644 index 000000000..76069e2df --- /dev/null +++ b/mobile/skin/member/basic/register.skin.php @@ -0,0 +1,57 @@ +', 0); +?> + +
    + +
    + +

    회원가입약관 및 개인정보처리방침안내의 내용에 동의하셔야 회원가입 하실 수 있습니다.

    + +
    +

    회원가입약관

    + +
    + + +
    +
    + +
    +

    개인정보처리방침안내

    + +
    + + +
    +
    + +
    + +
    + +
    + + + +
    \ No newline at end of file diff --git a/mobile/skin/member/basic/register_form.skin.php b/mobile/skin/member/basic/register_form.skin.php new file mode 100644 index 000000000..59950fa49 --- /dev/null +++ b/mobile/skin/member/basic/register_form.skin.php @@ -0,0 +1,445 @@ +', 0); +?> + +
    + + + + + +
    + + + + + + + + date("Y-m-d", G5_SERVER_TIME - ($config['cf_nick_modify'] * 86400))) { // 닉네임수정일이 지나지 않았다면 ?> + + + + +
    + + + + + + + + + + + + + + +
    사이트 이용정보 입력
    + 영문자, 숫자, _ 만 입력 가능. 최소 3자이상 입력하세요. + > + +
    >
    >
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    개인정보 입력
    + + 아이핀 본인확인 후에는 이름이 자동 입력되고 휴대폰 본인확인 후에는 이름과 휴대폰번호가 자동 입력되어 수동으로 입력할수 없게 됩니다. + + class="frm_input nospace "> + 아이핀 본인확인'.PHP_EOL; + if($config['cf_cert_hp'] && $config['cf_cert_hp'] != 'lg') + echo ''.PHP_EOL; + + echo ''.PHP_EOL; + } + ?> + +
    + 본인확인성인인증 완료 +
    + +
    + + 공백없이 한글,영문,숫자만 입력 가능 (한글2자, 영문4자 이상)
    + 닉네임을 바꾸시면 앞으로 일 이내에는 변경 할 수 없습니다. +
    + + + +
    + + + + + + + + +
    " maxlength="255" >
    " maxlength="20" >
    + class="frm_input " maxlength="20"> + + + +
    + 주소 + 필수 + + + class="frm_input " size="3" maxlength="3"> + - + + class="frm_input " size="3" maxlength="3"> + 주소 검색
    + + class="frm_input frm_address " size="50">
    + +
    + + +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + + = $config['cf_icon_level']) { ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    기타 개인설정
    + + 이미지 크기는 가로 픽셀, 세로 픽셀 이하로 해주세요.
    + gif만 가능하며 용량 바이트 이하만 등록됩니다. +
    + + + 회원아이콘 + + + +
    + > + 정보 메일을 받겠습니다. +
    + > + 휴대폰 문자메세지를 받겠습니다. +
    + + 정보공개를 바꾸시면 앞으로 일 이내에는 변경이 안됩니다. + + + > + 다른분들이 나의 정보를 볼 수 있도록 합니다. +
    정보공개 + + 정보공개는 수정후 일 이내, 까지는 변경이 안됩니다.
    + 이렇게 하는 이유는 잦은 정보공개 수정으로 인하여 쪽지를 보낸 후 받지 않는 경우를 막기 위해서 입니다. +
    + +
    자동등록방지
    +
    + +
    + + 취소 +
    +
    + + +
    \ No newline at end of file diff --git a/mobile/skin/member/basic/register_result.skin.php b/mobile/skin/member/basic/register_result.skin.php new file mode 100644 index 000000000..e74d6945a --- /dev/null +++ b/mobile/skin/member/basic/register_result.skin.php @@ -0,0 +1,44 @@ +', 0); +?> + +
    + +

    + 님의 회원가입을 진심으로 축하합니다.
    +

    + + +

    + 회원 가입 시 입력하신 이메일 주소로 인증메일이 발송되었습니다.
    + 발송된 인증메일을 확인하신 후 인증처리를 하시면 사이트를 원활하게 이용하실 수 있습니다. +

    +
    + 아이디 +
    + 이메일 주소 + +
    +

    + 이메일 주소를 잘못 입력하셨다면, 사이트 관리자에게 문의해주시기 바랍니다. +

    + + +

    + 회원님의 비밀번호는 아무도 알 수 없는 암호화 코드로 저장되므로 안심하셔도 좋습니다.
    + 아이디, 비밀번호 분실시에는 회원가입시 입력하신 비밀번호 분실시 질문, 답변을 이용하여 찾을 수 있습니다. +

    + +

    + 회원 탈퇴는 언제든지 가능하며 일정기간이 지난 후, 회원님의 정보는 삭제하고 있습니다.
    + 감사합니다. +

    + + + +
    diff --git a/mobile/skin/member/basic/scrap.skin.php b/mobile/skin/member/basic/scrap.skin.php new file mode 100644 index 000000000..ccb43bac5 --- /dev/null +++ b/mobile/skin/member/basic/scrap.skin.php @@ -0,0 +1,27 @@ +', 0); +?> + +
    +

    + +
      + +
    • + + + 삭제 +
    • + + 자료가 없습니다."; ?> +
    + + + +
    + +
    +
    diff --git a/mobile/skin/member/basic/scrap_popin.skin.php b/mobile/skin/member/basic/scrap_popin.skin.php new file mode 100644 index 000000000..04dfd5fd3 --- /dev/null +++ b/mobile/skin/member/basic/scrap_popin.skin.php @@ -0,0 +1,39 @@ +', 0); +?> + +
    +

    스크랩하기

    + +
    + + + +
    + + + + + + + + + + + + +
    제목 확인 및 댓글 쓰기
    제목
    +
    + +

    + 스크랩을 하시면서 감사 혹은 격려의 댓글을 남기실 수 있습니다. +

    + +
    + +
    +
    +
    \ No newline at end of file diff --git a/mobile/skin/member/basic/style.css b/mobile/skin/member/basic/style.css new file mode 100644 index 000000000..beb5cfdfd --- /dev/null +++ b/mobile/skin/member/basic/style.css @@ -0,0 +1,211 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* ### 기본 스타일 커스터마이징 시작 ### */ + +/* 버튼 */ +.mbskin a.btn01 {} +.mbskin a.btn01:focus, .mbskin a.btn01:hover {} +.mbskin a.btn02 {} +.mbskin a.btn02:focus, .mbskin .btn02:hover {} +.mbskin .btn_confirm {} /* 서식단계 진행 */ +.mbskin .btn_submit {} +.mbskin .btn_cancel {} +.mbskin .btn_frmline {} /* 우편번호검색버튼 등 */ +.mbskin .win_btn {} /* 새창용 */ +.mbskin .win_btn a {} +.mbskin .win_btn button {} +.mbskin .win_btn input {} +/* 게시판용 버튼 */ +.mbskin a.btn_b01 {} +.mbskin a.btn_b01:focus, .mbskin .btn_b01:hover {} +.mbskin a.btn_b02 {} +.mbskin a.btn_b02:focus, .mbskin .btn_b02:hover {} +.mbskin a.btn_admin {} /* 관리자 전용 버튼 */ +.mbskin a.btn_admin:focus, .mbskin a.btn_admin:hover {} + +/* 기본테이블 */ +.mbskin .tbl_head01 {} +.mbskin .tbl_head01 caption {} +.mbskin .tbl_head01 thead th {} +.mbskin .tbl_head01 thead a {} +.mbskin .tbl_head01 thead th input {} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +.mbskin .tbl_head01 tfoot th {} +.mbskin .tbl_head01 tfoot td {} +.mbskin .tbl_head01 tbody th {} +.mbskin .tbl_head01 td {} +.mbskin .tbl_head01 a {} +.mbskin td.empty_table {} + +/* 폼 테이블 */ +.mb_skin table {} +.mb_skin caption {} +.mb_skin .frm_info {} +.mb_skin .frm_file {} + +.mbskin .tbl_frm01 {} +.mbskin .tbl_frm01 caption {} +.mbskin .tbl_frm01 th {} +.mbskin .tbl_frm01 td {} +.mbskin .tbl_frm01 textarea, .mbskin .frm_input {} +.mbskin .tbl_frm01 textarea {} +/* +.mbskin .tbl_frm01 #captcha {} +.mbskin .tbl_frm01 #captcha input {} +*/ +.mbskin .tbl_frm01 a {} + +.mbskin .required, .mbskin textarea.required {} /* 필수입력 */ + +/* 테이블 항목별 정의 */ +.mbskin .td_board {} +.mbskin .td_chk {} +.mbskin .td_date {} +.mbskin .td_datetime {} +.mbskin .td_group {} +.mbskin .td_mb_id {} +.mbskin .td_mng {} +.mbskin .td_name {} +.mbskin .td_nick {} +.mbskin .td_num {} +.mbskin .td_numbig {} + +/* ### 기본 스타일 커스터마이징 끝 ### */ + +/* 회원가입 약관 */ +#fregister section {padding:15px;border-bottom:1px solid #eee;background:#fafafa} +#fregister h2 {margin:0 0 15px;text-align:center} +#fregister textarea {display:block;margin-bottom:10px;padding:5px;width:99%;height:150px;border:1px solid #cfded8;background:#f7f7f7} +.fregister_agree {padding:10px 0 0;text-align:right} +.fregister_agree label {display:inline-block;margin-right:5px} +#fregister p {color:#e8180c;text-align:center} +#fregister .btn_confirm {margin:15px 0} + +/* 회원가입 입력 */ +#fregisterform #reg_mb_email, #fregisterform .frm_address {width:100%} + +#fregisterform textarea {width:100%;height:50px} + +#fregisterform #msg_certify {margin:5px 0 0;padding:5px;border:1px solid #dbecff;background:#eaf4ff;text-align:center} + +#fregisterform .frm_address {margin:5px 0 0} +#fregisterform #mb_addr3 {display:block;margin:5px 0 0} +#fregisterform #mb_addr_jibeon {display:block;margin:5px 0 0} + +/* 회원가입 완료 */ +#reg_result {padding:40px 10px 0} +#reg_result #result_email {margin:20px 0;padding:10px 50px;border-top:1px solid #eee;border-bottom:1px solid #eee;background:#fff;line-height:2em} +#reg_result #result_email span {display:inline-block;width:150px} +#reg_result #result_email strong {color:#e8180c;font-size:1.2em} +#reg_result p {line-height:1.8em} +#reg_result .btn_confirm {margin:50px 0} + +/* 아이디/비밀번호 찾기 */ +#find_info #info_fs {margin:0 20px 10px} +#find_info #info_fs p {margin:0 0 10px;line-height:1.8em} +#find_info #info_fs #mb_email {width:100%} +#find_info #captcha {margin:0 20px;padding:0 0 10px} +#find_info #captcha input {margin-left:5px} + +/* 로그인 */ +#mb_login {margin:20px 0} +#mb_login h1 {margin:0 0 15px;padding:0 10px;font-size:1.3em} +#mb_login h2 {margin:0} +#mb_login p {padding:10px 0;line-height:1.5em} +#mb_login #login_frm {position:relative;padding:0 5px;font-size:1em} +#mb_login #login_frm div {padding:10px 0 0;text-align:right} +#mb_login .frm_input {display:block;margin-bottom:5px;padding:0;width:81%;height:1.8em;line-height:1.8em} +#mb_login .btn_submit {position:absolute;top:0;right:5px;padding:0 !important;width:18%;height:4.3em !important;text-align:center} +#mb_login section {margin:30px 0;padding:15px 10px;border:1px solid #cfded8;background:#f7f7f7} +#mb_login section div {text-align:right} + +/* 쪽지 */ +#memo_view_contents {margin:0 auto 20px;width:90%} +#memo_view_contents h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#memo_view_ul {margin:0;padding:0 0 10px;border-bottom:1px solid #eee;list-style:none} +.memo_view_li {position:relative;padding:5px 0} +.memo_view_subj {display:inline-block;width:65px} +#memo_view_ul a {} +#memo_view p {padding:10px 0;min-height:150px;height:auto !important;height:150px;line-height:1.8em} + +#memo_list_ul {margin:0 20px;padding:0;border-top:1px solid #e9e9e9;list-style:none} +#memo_list_ul li {position:relative;padding:10px 0;border-bottom:1px solid #e9e9e9} +#memo_list_ul .memo_link {} +#memo_list_ul .memo_send {position:absolute;top:10px;right:30px} +#memo_list_ul .memo_read {font-size:0.95em;color:#666} +#memo_list_ul .memo_del {position:absolute;top:10px;right:0} + +#memo_write #me_recv_mb_id {width:98%} +#memo_write textarea {width:99%;height:100px} + +/* 스크랩 */ +#scrap_ul {margin:0 20px;padding:0;border-top:1px solid #e9e9e9;list-style:none} +#scrap_ul li {position:relative;padding:10px 35px 10px 0;border-bottom:1px solid #e9e9e9} +#scrap_ul .scrap_board {display:inline-block;margin:0 10px 0 0;font-weight:bold} +#scrap_ul .scrap_del {position:absolute;top:10px;right:0} + +#scrap_do table {margin:0 0 10px;width:100%} +#scrap_do textarea {width:99%;height:100px} + +/* 포인트 */ +#point_ul {margin:0 20px;padding:0;border-top:1px solid #e9e9e9;list-style:none} +#point_ul li {position:relative;padding:10px 0;border-bottom:1px solid #e9e9e9} +#point_ul .point_wrap01 {position:relative;padding:0 0 0 90px} +#point_ul .point_wrap02 {margin:7px 0 0;text-align:right} +#point_ul .point_date {position:absolute;top:0;left:0} + +#point_sum {margin:0 20px} +#point_sum .sum_row {margin:0 0 1px;background:#f2f5f9} +#point_sum .sum_row:after {display:block;visibility:hidden;clear:both;content:''} +#point_sum .sum_tit, #point_sum .sum_val {display:block;margin:0 0 1px;padding:10px} +#point_sum .sum_tit {clear:both;float:left;width:100px} +#point_sum .sum_val {float:right} + +/* 회원 비밀번호 확인 */ +#mb_confirm {margin:30px 0} +#mb_confirm h1 {margin:0 0 15px;padding:0 10px;font-size:1.3em} +#mb_confirm p {padding:15px 10px;border-bottom:1px solid #cfded8;border-bottom:0;background:#fff} +#mb_confirm p strong {display:block} +#mb_confirm fieldset {position:relative;margin:0 0 5px;padding:20px 10px;border-bottom:1px solid #cfded8;background:#f7f7f7} +#mb_confirm_pw {display:block;margin-top:10px;padding:0;width:88%;line-height:1.8em !important} +#mb_confirm .btn_submit {position:absolute;bottom:20px;right:10px;width:10%;height:1.9em !important;line-height:1.9em} + +/* 비밀글 비밀번호 확인 */ +#pw_confirm {margin:30px 0} +#pw_confirm h1 {margin:0 0 15px;padding:0 10px;font-size:1.3em} +#pw_confirm p {padding:15px 10px;border-bottom:1px solid #cfded8;border-bottom:0;background:#fff} +#pw_confirm p strong {display:block} +#pw_confirm fieldset {position:relative;margin:0 0 5px;padding:5px 5px 10px;border-bottom:1px solid #cfded8;background:#f7f7f7} +#pw_wr_password {display:block;margin-top:10px;padding:0;width:88%;line-height:1.8em !important} +#pw_confirm .btn_submit {position:absolute;bottom:10px;right:5px;width:10%;height:1.9em !important;line-height:1.9em} + +/* 폼메일 */ +#formmail #subject {width:98%} +#formmail textarea {width:99%;height:100px} + +/* 자기소개 */ +#profile table {margin-bottom:0} +#profile section {padding:10px 20px} +#profile h2 {margin:0} +#profile .sv_wrap a {margin:0 0 5px;padding:0;font-weight:bold;line-height:10px} + +/* 우편번호 검색 */ +#post_code #code_sel {margin:0 20px 20px} +#post_code #code_sel label {display:inline-block;margin:0 15px 0 0} +#post_code p {margin:0 0 10px} +#post_code #zip_search_frm {margin:0 20px} +#post_code #code_sch #sch_q {position:relative;margin:5px 0 0} +#post_code #code_sch .frm_input {height:22px} +#post_code #code_sch .btn_submit {padding:0 8px;height:24px} +#post_code #result_b4 {display:block;padding:30px 0;border-bottom:1px solid #dde4e9;text-align:center} +#post_code #result .result_msg {padding:15px 0} +#post_code #result .result_fail {border:1px solid #dde4e9;background:#f0f5fc;color:#ff3061;text-align:center} +#post_code #result ul {margin:0;padding:0;border-bottom:1px solid #dde4e9;background:#f0f5fc;list-style:none} +#post_code #result li {padding:10px;border:1px solid #dde4e9;border-bottom:0} +#post_code #result li div {margin:4px 0 0;color:#738D94} +#post_code #result li div {color:#738D94} +#post_code #result li div:before {content:"▶ "} +#post_code #zip_direct_frm {display:none;margin:0 20px} +#post_code #zip_direct_frm .frm_input {margin:0 0 5px} +#post_code #zip_direct_frm .frm_addr {width:99%} +#post_code #zip_direct_frm #sch_dq {padding:10px 0 20px;text-align:center} \ No newline at end of file diff --git a/mobile/skin/member/basic/zip.skin.php b/mobile/skin/member/basic/zip.skin.php new file mode 100644 index 000000000..4a1413b95 --- /dev/null +++ b/mobile/skin/member/basic/zip.skin.php @@ -0,0 +1,162 @@ +', 0); +?> + + + + +
    +

    + +
    + + + + +
    + +
    +

    + 시도 및 시군구 선택없이 도로명, 읍/면/동, 건물명 등으로 검색하실 수 있습니다.
    + 만약 검색결과에 찾으시는 주소가 없을 때는 시도와 시군구를 선택하신 후 다시 검색해 주십시오.
    + (검색결과는 최대 1,000건만 표시됩니다.) +

    + +
    + +
    + + + + +
    + + + +
    +
    + +
    + +
    검색어를 입력해주세요.
    +
    +
    +

    직접 주소를 입력하실 경우 우편번호와 기본주소는 반드시 입력하셔야 합니다.

    +
    + 우편번호 + + - + +
    + +
    + +
    + +
    + + + +
    + +
    +
    +
    + +
    + +
    + +
    + + + \ No newline at end of file diff --git a/mobile/skin/new/basic/new.skin.php b/mobile/skin/new/basic/new.skin.php new file mode 100644 index 000000000..9055d2b52 --- /dev/null +++ b/mobile/skin/new/basic/new.skin.php @@ -0,0 +1,66 @@ +', 0); +?> + + +
    + 상세검색 +
    + + + + + +
    + +
    + + + +
    + + + + + + + + + + + + + + + + + + '; + ?> + +
    게시판제목일시
    게시물이 없습니다.
    +
    + + + \ No newline at end of file diff --git a/mobile/skin/new/basic/style.css b/mobile/skin/new/basic/style.css new file mode 100644 index 000000000..6fe648fcf --- /dev/null +++ b/mobile/skin/new/basic/style.css @@ -0,0 +1,9 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* 새글 */ +#new_sch {margin:0 0 5px;padding:5px 10px} +#new_tbl {} +#new_tbl th:nth-of-type(3) {width:50px} + +#new_tbl td:nth-of-type(3) {text-align:center} \ No newline at end of file diff --git a/mobile/skin/outlogin/basic/outlogin.skin.1.php b/mobile/skin/outlogin/basic/outlogin.skin.1.php new file mode 100644 index 000000000..a9dcf1b8f --- /dev/null +++ b/mobile/skin/outlogin/basic/outlogin.skin.1.php @@ -0,0 +1,63 @@ +', 0); +?> + + + + + diff --git a/mobile/skin/outlogin/basic/outlogin.skin.2.php b/mobile/skin/outlogin/basic/outlogin.skin.2.php new file mode 100644 index 000000000..a7c703339 --- /dev/null +++ b/mobile/skin/outlogin/basic/outlogin.skin.2.php @@ -0,0 +1,46 @@ +', 0); +?> + + + + + + diff --git a/mobile/skin/outlogin/basic/style.css b/mobile/skin/outlogin/basic/style.css new file mode 100644 index 000000000..e98b3ab56 --- /dev/null +++ b/mobile/skin/outlogin/basic/style.css @@ -0,0 +1,29 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* 아웃로그인 */ +.ol {position:relative;margin:0 0 10px;padding:0 5px 5px;border-bottom:1px solid #e7f1ed} +.ol h2 {width:0;height:0;overflow:hidden} + +.ol a.btn_admin {display:inline-block;margin:0 0 5px;padding:0 10px;border:1px solid #e8180c;background:#e8180c;color:#fff;text-decoration:none;line-height:2em;vertical-align:middle} /* 관리자 전용 버튼 */ +.ol a.btn_admin:focus, .ol a.btn_admin:hover {text-decoration:none} + +#ol_before input[type=text], #ol_before input[type=password] {display:block;margin-bottom:5px;padding:0;width:80%;height:1.8em;border:1px solid #e4eaec;background:#f7f7f7;vertical-align:middle;line-height:1.8em} +#ol_before input[type=submit] {position:absolute;top:0;right:5px;padding:0 !important;width:18%;height:4.3em;border:0;background:#333;color:#fff;letter-spacing:-0.1em;vertical-align:top;cursor:pointer} +#ol_svc {margin:15px 0 5px;text-align:right} +#ol_svc a {display:inline-block;margin:0 0 0 5px;color:#000;text-decoration:none;vertical-align:middle} + +#ol_after_hd strong {display:inline-block;padding:0 0 5px} +#ol_after_hd .btn_admin {display:block;padding:0 !important;text-align:center} +#ol_after_private {margin:0;padding:0;list-style:none} +#ol_after_private:after {display:block;visibility:hidden;clear:both;content:""} +#ol_after_private li {float:left} +#ol_after_memo {width:30%} +#ol_after_pt {width:40%} +#ol_after_scrap {width:30%} +#ol_after_private a {display:block;height:3em;background:#f7f7f7;color:#000;text-decoration:none;text-align:center;line-height:3em} +#ol_after_private a strong {color:#000;font-weight:normal} +#ol_after_private a:nth-of-type(1) {border-right:1px solid #fff} +#ol_after_private a:nth-of-type(2) {border-right:1px solid #fff} +#ol_after_ft {margin-top:5px;text-align:right} +#ol_after_ft a {display:inline-block;padding:0 20px;height:2em;background:#333;color:#fff;text-decoration:none;text-align:center;line-height:2em} \ No newline at end of file diff --git a/mobile/skin/poll/basic/poll.skin.php b/mobile/skin/poll/basic/poll.skin.php new file mode 100644 index 000000000..3585bbf6a --- /dev/null +++ b/mobile/skin/poll/basic/poll.skin.php @@ -0,0 +1,65 @@ +', 0); +?> + +
    + + + +
    + + \ No newline at end of file diff --git a/mobile/skin/poll/basic/poll_result.skin.php b/mobile/skin/poll/basic/poll_result.skin.php new file mode 100644 index 000000000..451d92217 --- /dev/null +++ b/mobile/skin/poll/basic/poll_result.skin.php @@ -0,0 +1,120 @@ +', 0); +?> + +
    +

    + +
    +

    결과

    + +
    +
    전체
    +
    +
      + +
    1. +

      + + + % +

      +
      + +
      +
    2. + +
    +
    +
    +
    + + +
    +

    이 설문에 대한 기타의견

    + + +
    +
    +

    님의 의견

    + + +
    +

    + +

    +
    + "; } ?> +
    +
    + + + = $po['po_level']) { ?> +
    + + + + +

    + +
    + + + + + + + + + + + + + + + + +
    +
    + +
    + +
    +
    + + +
    + + + + +
    + +
    +
    + + \ No newline at end of file diff --git a/mobile/skin/poll/basic/style.css b/mobile/skin/poll/basic/style.css new file mode 100644 index 000000000..f0d852baa --- /dev/null +++ b/mobile/skin/poll/basic/style.css @@ -0,0 +1,86 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* ### 기본 스타일 커스터마이징 시작 ### */ + +#poll a.btn_admin {} /* 관리자 전용 버튼 */ +#poll a.btn_admin:focus, #poll a.btn_admin:hover {} + +/* 폼 테이블 */ +#poll .tbl_frm table {} +#poll .tbl_frm .frm_address {} +#poll .tbl_frm .frm_file {} +#poll .tbl_frm .frm_info {} + +#poll .tbl_frm01 {} +#poll .tbl_frm01 caption {} +#poll .tbl_frm01 th {} +#poll .tbl_frm01 td {} +#poll .tbl_frm01 textarea, #poll .frm_input {} +#poll .tbl_frm01 textarea {} +/* +#poll .tbl_frm01 #captcha {} +#poll .tbl_frm01 #captcha input {} +*/ +#poll .tbl_frm01 a {} + +#poll .required, #poll textarea.required {} + +#poll .btn_confirm {} /* 서식단계 진행 */ +#poll .btn_submit {} +#poll .btn_cancel {} +#poll .btn_frmline {} /* 우편번호검색버튼 등 */ +#poll .win_btn {} /* 새창용 */ +#poll .win_btn a {} +#poll .win_btn button {} +#poll .win_btn input {} + +/* ### 기본 스타일 커스터마이징 끝 ### */ + +/* 설문조사 스킨 */ +#poll {margin:10px 0 0;padding:0 0 10px} +#poll header {position:relative;padding:0 5px} +#poll h2 {padding:0 0 5px} +#poll header .btn_admin {display:block;margin:0 0 5px;padding:0 10px;border:1px solid #e8180c;background:#e8180c;color:#fff;text-align:center;text-decoration:none;line-height:2em;vertical-align:middle} +#poll header p {padding:0} +#poll ul {margin:0 0 10px;padding:5px 10px;list-style:none} +#poll li {padding:3px 0} +#poll footer {padding:0 5px} +#poll footer:after {display:block;visibility:hidden;clear:both;content:""} +#poll footer input {float:left;width:49%;height:2.5em;border:0;background:#333;color:#fff;letter-spacing:-0.1em;vertical-align:top;cursor:pointer;-webkit-appearance:none} +#poll footer a {display:inline-block;float:right;width:49%;height:2.4em;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none;text-align:center;line-height:2.4em} +#poll footer a:focus, #poll footer a:hover {text-decoration:none !important} + +/* 설문조사 결과 (새창) */ +#poll_result section {padding:10px;border-bottom:1px solid #eee} +#poll_result h2 {margin:0;padding:0} +#poll_result .member, #poll_result .guest, #poll_result .sv_member, #poll_result .sv_guest {font-weight:bold;margin-right:5px} +#poll_result_list {margin:0 auto} +#poll_result_list h2 {text-align:center} +#poll_result_list dl, #poll_result_list dt, #poll_result_list dd {margin:0;padding:0} +#poll_result_list dl {padding-bottom:20px} +#poll_result_list dt {margin-right:5%;color:#e8180d;text-align:right} +#poll_result_list ol {margin:0;padding-left:25px} +#poll_result_list li {margin-top:10px} +#poll_result_list p {position:relative;margin:0;padding:5px 0} +#poll_result_list p strong {position:absolute;top:5px;right:5%;margin-right:60px;width:100px;text-align:right} +#poll_result_list p span {position:absolute;top:5px;right:5%;width:60px;color:#68999c;text-align:right} +.poll_result_graph {position:relative;margin-right:5%;height:5px;background:#eee} +.poll_result_graph span {position:absolute;top:0;left:0;height:5px;background:#565e60;font-size:0.1em} +#poll_result_cmt {margin:0 auto;padding:15px !important;background:#f7f7f7} +#poll_result_cmt h2 {margin:0 0 20px;text-align:center} +#poll_result_cmt h3 {margin:0 auto 10px} +#poll_result_cmt article {margin:0 0 10px;border-bottom:1px solid #eee} +#poll_result_cmt h1 {margin:0;padding:0;width:0;height:0;font-size:0;line-height:0;overflow:hidden} +#poll_result_cmt p {padding:5px 0} +#poll_result_cmt footer {text-align:right} +#poll_result_cmt .tbl_wrap {margin:0} +#poll_result_wcmt {margin:0 0 10px !important} +#poll_result_wcmt td {padding:0 0 5px;border:0} +#poll_result_wcmt input[type=text] {background:#fff !important} +#pc_idea {width:98%} +.poll_cmt_del a {display:inline-block;padding-bottom:10px} +#poll_result_oth {margin:0 auto 15px} +#poll_result_oth h2 {padding:10px} +#poll_result_oth ul {margin:0;padding:0 10px;list-style:none} +#poll_result_oth a {display:block;padding:10px 0;border-bottom:1px solid #eee;color:#000;text-decoration:none} \ No newline at end of file diff --git a/mobile/skin/popular/basic/popular.skin.php b/mobile/skin/popular/basic/popular.skin.php new file mode 100644 index 000000000..463b3b01c --- /dev/null +++ b/mobile/skin/popular/basic/popular.skin.php @@ -0,0 +1,17 @@ +', 0); +?> + + \ No newline at end of file diff --git a/mobile/skin/popular/basic/style.css b/mobile/skin/popular/basic/style.css new file mode 100644 index 000000000..545cd3086 --- /dev/null +++ b/mobile/skin/popular/basic/style.css @@ -0,0 +1,11 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* 인기검색어 */ +#popular {border-bottom:1px dotted #dde4e9} +#popular div {zoom:1} +#popular div:after {display:block;visibility:hidden;clear:both;content:""} +#popular h2 {float:left;padding:10px 5px 10px 10px} +#popular ul {float:left;margin:0 0 0 10px;padding:0;list-style:none} +#popular li {float:left} +#popular a {display:inline-block;padding:10px 5px;text-decoration:none} \ No newline at end of file diff --git a/mobile/skin/qa/basic/img/btn_close.gif b/mobile/skin/qa/basic/img/btn_close.gif new file mode 100644 index 0000000000000000000000000000000000000000..040b180ac6584ae612ef2886487110f0ad079963 GIT binary patch literal 211 zcmZ?wbhEHbC>lw|Nj2|^XJd+Ki|K7yLIc<@85r}UAy+@_wT|Ns9P2m!^PEMO%%AQEIJ18abSL2rs@7wgh> zI-xzeYYr882T$7a>~-(!J@=MOy}Z$ltNl`73Cq0Bi3wIGB-b=ECVhGFY*&ANIg94( d^Unm859R4|2rw-)wA%9i`(c-qSMQw}tN}eeW+eas literal 0 HcmV?d00001 diff --git a/mobile/skin/qa/basic/img/icon_answer.gif b/mobile/skin/qa/basic/img/icon_answer.gif new file mode 100644 index 0000000000000000000000000000000000000000..91c135977b4f445a90c849310dc80efde1983830 GIT binary patch literal 77 zcmZ?wbhEHb-Wqsc#^P~2x#@rVooH@5wHB9i@BozKb;P9uI^*c|UyXO5@>VyLmgEat< Cr6(f* literal 0 HcmV?d00001 diff --git a/mobile/skin/qa/basic/img/icon_hot.gif b/mobile/skin/qa/basic/img/icon_hot.gif new file mode 100644 index 0000000000000000000000000000000000000000..c95b839aeef0c1e26a4bab4ea50cd6d3f1969d7f GIT binary patch literal 97 zcmZ?wbhEHbzHen|7VvwFnzUPlarEA ZqW~YXyUO~T+#YkUoJ%V_>ib05Q5F AasU7T literal 0 HcmV?d00001 diff --git a/mobile/skin/qa/basic/img/icon_mobile.gif b/mobile/skin/qa/basic/img/icon_mobile.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad934d23c440c83db0c4589596465cb087353e01 GIT binary patch literal 62 zcmZ?wbhEHbZ% literal 0 HcmV?d00001 diff --git a/mobile/skin/qa/basic/img/icon_secret.gif b/mobile/skin/qa/basic/img/icon_secret.gif new file mode 100644 index 0000000000000000000000000000000000000000..c04899f14fa727b64223f6c5457877c6c939639d GIT binary patch literal 97 zcmZ?wbhEHb&!1E4^4&ClEzh)PmWxV3{9A~!gB2-%RL5bHcgg3Zp^!+W)H2^A_AxQuL literal 0 HcmV?d00001 diff --git a/mobile/skin/qa/basic/img/icon_sound.gif b/mobile/skin/qa/basic/img/icon_sound.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5188318a5cdc394b984125c0ddd376c5f57bbe4 GIT binary patch literal 113 zcmZ?wbhEHbE1CJY$zMikVi`-#gIi|DbmsXBWf6U5szE@->A`0*`&<;b@XASRrB8=E6~=S>Pbm I%fes{0AXt-SpWb4 literal 0 HcmV?d00001 diff --git a/mobile/skin/qa/basic/list.skin.php b/mobile/skin/qa/basic/list.skin.php new file mode 100644 index 000000000..2efc6fb57 --- /dev/null +++ b/mobile/skin/qa/basic/list.skin.php @@ -0,0 +1,152 @@ +', 0); +?> + +
    + + + + + + + +
    +
    + Total + 페이지 +
    + + + + +
    + + +
    + + + + + +
    + + +
    + + +
    +
      + +
    • + +
      + + +
      + + +
      + + + + +
      +
      +
    • + + + 게시물이 없습니다.'; } ?> +
    +
    + +
    + +
      +
    • +
    + + + +
    +
    +
    + + + + + + + + + +
    + 게시물 검색 + +
    + + + + +
    +
    + + + + + + \ No newline at end of file diff --git a/mobile/skin/qa/basic/style.css b/mobile/skin/qa/basic/style.css new file mode 100644 index 000000000..28bdeaac5 --- /dev/null +++ b/mobile/skin/qa/basic/style.css @@ -0,0 +1,247 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* ### 기본 스타일 커스터마이징 시작 ### */ + +/* 게시판 버튼 */ +/* 목록 버튼 */ +#bo_list a.btn_b01 {} +#bo_list a.btn_b01:focus, #bo_list .btn_b01:hover {} +#bo_list a.btn_b02 {} +#bo_list a.btn_b02:focus, #bo_list .btn_b02:hover {} +#bo_list a.btn_admin {} /* 관리자 전용 버튼 */ +#bo_list a.btn_admin:focus, #bo_list a.btn_admin:hover {} + +/* 읽기 버튼 */ +#bo_v a.btn_b01 {} +#bo_v a.btn_b01:focus, #bo_v .btn_b01:hover {} +#bo_v a.btn_b02 {} +#bo_v a.btn_b02:focus, #bo_v .btn_b02:hover {} +#bo_v a.btn_admin {} /* 관리자 전용 버튼 */ +#bo_v a.btn_admin:focus, #bo_v a.btn_admin:hover {} + +/* 쓰기 버튼 */ +#bo_w .btn_confirm {} /* 서식단계 진행 */ +#bo_w .btn_submit {} +#bo_w .btn_cancel {} +#bo_w .btn_frmline {} /* 우편번호검색버튼 등 */ + +/* 읽기 내 테이블 */ +#bo_v .tbl_head01 {} +#bo_v .tbl_head01 caption {} +#bo_v .tbl_head01 thead th {} +#bo_v .tbl_head01 thead a {} +#bo_v .tbl_head01 thead th input {} /* middle 로 하면 게시판 읽기에서 목록 사용시 체크박스 라인 깨짐 */ +#bo_v .tbl_head01 tfoot th {} +#bo_v .tbl_head01 tfoot td {} +#bo_v .tbl_head01 tbody th {} +#bo_v .tbl_head01 td {} +#bo_v .tbl_head01 a {} +#bo_v td.empty_table {} + +/* 쓰기 테이블 */ +#bo_w table {} +#bo_w caption {} +#bo_w .frm_address {} +#bo_w .frm_file {} +#bo_w .frm_info {} + +#bo_w .tbl_frm01 {} +#bo_w .tbl_frm01 caption {} +#bo_w .tbl_frm01 th {} +#bo_w .tbl_frm01 td {} +#bo_w .tbl_frm01 textarea, #bo_w .frm_input {} +#bo_w .tbl_frm01 textarea {} +/* +#bo_w .tbl_frm01 #captcha {} +#bo_w .tbl_frm01 #captcha input {} +*/ +#bo_w .tbl_frm01 a {} + +#bo_w .required, #bo_w textarea.required {} + +/* ### 기본 스타일 커스터마이징 끝 ### */ + +/* 게시판 목록 */ +#bo_list #list_chk {padding:0 10px 10px} +#bo_list .ul_wrap ul {margin:0;padding:0;border-top:1px solid #e9e9e9;list-style:none} +#bo_list .ul_wrap li {position:relative;padding:8px 10px;border-bottom:1px solid #e9e9e9} +#bo_list .ul_wrap li.bo_adm {padding:8px 10px 8px 30px} +#bo_list .ul_wrap a {display:block;padding:0 0 10px} +#bo_list .ul_wrap .li_chk {position:absolute;top:8px;left:10px} +#bo_list .ul_wrap .li_info span {display:inline-block;margin:0 5px 0 0;vertical-align:middle} +#bo_list .ul_wrap .li_stat {position:absolute;bottom:8px;right:10px} + +#bo_cate h2 {width:0;height:0;font-size:0;line-height:0;overflow:hidden} +#bo_cate ul {margin:5px 10px;padding-left:1px;zoom:1} +#bo_cate ul:after {display:block;visibility:hidden;clear:both;content:""} +#bo_cate li {float:left;margin-bottom:-1px;width:25%} +#bo_cate a {display:block;position:relative;margin-left:-1px;padding:5px 0;border:1px solid #ddd;background:#f7f7f7;color:#888;text-align:center;text-decoration:none;letter-spacing:-0.1em} +#bo_cate a:focus, +#bo_cate a:hover, +#bo_cate a:active {text-decoration:none} +#bo_cate #bo_cate_on {z-index:2;border:1px solid #565e60;background:#fff;color:#565e60;font-weight:bold} + +/* 관리자일 때 */ +#bo_list_admin th label {position:absolute;font-size:0;line-height:0;overflow:hidden} + +#bo_list_admin th:nth-of-type(1) {width:40px} +#bo_list_admin th:nth-of-type(3) {width:100px} + +#bo_list_admin td:nth-of-type(1) {text-align:center} +#bo_list_admin td:nth-of-type(3) {text-align:center} + +/* 관리자가 아닐 때 */ +#bo_list th:nth-of-type(2) {width:100px} + +#bo_list td:nth-of-type(2) {text-align:center} + +/* 게시판 목록 공통 */ +.bo_fx {margin-bottom:5px;padding:5px 10px} +.bo_fx:after {display:block;visibility:hidden;clear:both;content:""} +.bo_fx ul {margin:0;padding:0;list-style:none} +#bo_list_total {float:left;padding:0;height:2.5em;line-height:2.5em} +.btn_bo_user {float:right;margin:0;padding:0;list-style:none} +.btn_bo_user li {float:left;margin-left:5px} +.btn_bo_adm {float:left} +.btn_bo_adm li {float:left;margin-right:5px} +.btn_bo_adm input {padding:0 10px;height:2em;border:1px solid #e8180c !important;background:#e8180c;color:#fff;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-appearance:none} +.bo_notice td {background:#f7f7f7} +.bo_notice td a {font-weight:bold} +.td_num strong {color:#000} +.bo_cate_link {display:inline-block;margin:0 3px 0 0;padding:0 6px 0 0;border-right:1px solid #e7f1ed;color:#999 !important;font-weight:bold;text-decoration:none} /* 글제목줄 분류스타일 */ +.bo_current {color:#e8180c} +.td_subject img {margin-left:3px} +#bo_list .cnt_cmt {display:inline-block;margin:0 0 0 3px;font-weight:bold} + +#bo_sch {margin-bottom:10px;padding-top:5px;text-align:center} + +/* 게시판 쓰기 */ +#bo_w #wr_email, #bo_w #wr_homepage, #bo_w #wr_subject {width:100%} + +#char_count_desc {display:block;margin:0 0 5px;padding:0} +#char_count_wrp {margin:5px 0 0;text-align:right} +#char_count {font-weight:bold} + +#qa_email {width:50%} +#qa_subject {width:100%} + +/* 게시판 읽기 */ +#bo_v {margin-bottom:15px;padding-bottom:15px} + +#bo_v_table {margin:0 0 5px;padding:0 10px;color:#999;font-size:0.9em;font-weight:bold} + +#bo_v_title {padding:0 10px 10px;font-size:1.2em} + +#bo_v_info {padding:0 10px 10px;border-bottom:1px solid #ddd} +#bo_v_info h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_info {} +#bo_v_info strong {display:inline-block;margin:0 0 0 5px;font-weight:normal} + +#bo_v_file {} +#bo_v_file h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_file ul {margin:0;padding:0;list-style:none} +#bo_v_file li {padding:0 10px;border-bottom:1px solid #eee;background:#f7f7f7} +#bo_v_file a {display:inline-block;padding:5px 0;color:#000;text-decoration:none} +#bo_v_file a:focus, #bo_v_file a:hover, #bo_v_file a:active {text-decoration:none} +.bo_v_file_cnt {display:inline-block;margin:0 10px} + +#bo_v_link {} +#bo_v_link h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_link ul {margin:0;padding:0;list-style:none} +#bo_v_link li {padding:0 10px;border-bottom:1px solid #eee;background:#f7f7f7} +#bo_v_link a {display:inline-block;padding:5px 0;color:#000;text-decoration:none} +#bo_v_link a:focus, #bo_v_link a:hover, #bo_v_link a:active {text-decoration:none} +.bo_v_link_cnt {display:inline-block;margin:0 10px} + +#bo_v_contact {border-bottom:1px solid #ddd} +#bo_v_contact h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_contact dl {margin:0;padding:0;list-style:none} +#bo_v_contact dl:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_contact dt, #bo_v_contact dd {float:left;margin:0;border-bottom:1px solid #eee;background:#f5f6fa} +#bo_v_contact dt {clear:both;padding:8px 0 8px 10%;width:20%;font-weight:bold} +#bo_v_contact dd {padding:8px 0;width:70%} + +#bo_v_top {margin:0 0 10px;padding:10px} +#bo_v_top:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_top h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_top ul {margin:0;padding:0;list-style:none} + +#bo_v_bot {padding:0 10px} +#bo_v_bot:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_bot h2 {position:absolute;font-size:0;text-indent:-9999em;line-height:0;overflow:hidden} +#bo_v_bot ul {margin:0;padding:0;list-style:none} + +.bo_v_nb {float:left} +.bo_v_nb li {float:left;margin-right:5px} +.bo_v_com {float:right} +.bo_v_com li {float:left;margin-left:5px} + +#bo_v_atc {padding:0 10px;min-height:100px} +#bo_v_atc_title {margin:0;padding:0;height:0;overflow:hidden} + +#bo_v_img {margin:0 0 10px;width:100%;overflow:hidden;zoom:1} +#bo_v_img:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_img img {margin-bottom:15px;max-width:100%;height:auto} + +#bo_v_con {margin-bottom:20px;width:100%;line-height:1.7em;word-break:break-all;overflow:hidden} +#bo_v_con a {color:#000;text-decoration:underline} +#bo_v_con img {max-width:100%;height:auto} + +#bo_v_act {margin-bottom:20px;text-align:center} +#bo_v_act a {margin-right:5px;vertical-align:top} +#bo_v_act span {display:inline-block;margin-right:5px;padding:0 10px;border:1px solid #eee !important;background:#fafafa !important;color:#000 !important;text-decoration:none !important;line-height:2em;vertical-align:top} +#bo_v_act strong {color:#ff3061} +#bo_v_act_good, #bo_v_act_nogood {display:inline-block;width:1px;height:1px;font-size:0;line-height:0;overflow:hidden} + +#bo_v_sns {margin:0 0 20px;padding:0;list-style:none;zoom:1} +#bo_v_sns:after {display:block;visibility:hidden;clear:both;content:""} +#bo_v_sns li {float:left;margin:0 5px 0 0} + +#bo_v_addq {margin:0 0 30px;text-align:right} + +#bo_v_ans {margin:0 10px 30px;padding:30px 0 0;border-top:1px solid #e9e9e9} +#bo_v_ans h2 {display:inline-block;vertical-align:middle;font-size:1.2em} +#bo_v_ans #ans_datetime {margin:10px 0;color:#999} +#bo_v_ans #ans_con {margin:0 0 10px;line-height:1.8em} +#bo_v_ans #ans_add {text-align:right} +#bo_v_ans #ans_msg {padding:40px 0;background:#f2f5f9;text-align:center} + +#bo_v_rel {margin:0 0 30px;padding:30px 0 0;border-top:1px solid #e9e9e9} +#bo_v_rel h2 {margin:0 10px 10px;font-size:1.2em} + +#bo_v form {padding-top:15px} + +/* 게시판 댓글 */ +#bo_vc {margin:0 0 5px;padding:15px 15px 5px;border-top:1px solid #cfded8;border-bottom:1px solid #cfded8;background:#f7f7f7} +#bo_vc h2 {margin-bottom:5px} +#bo_vc article {padding:0 0 5px;border-top:1px dotted #ccc} +#bo_vc header {position:relative;padding:13px 0 5px} +#bo_vc header .icon_reply {position:absolute;top:13px;left:-20px} +#bo_vc .sv_member, #bo_vc .sv_guest {font-weight:bold} +.bo_vc_hdinfo {display:inline-block;margin:0 10px 0 5px} +#bo_vc h1 {width:0;height:0;font-size:0;line-height:0;overflow:hidden} +#bo_vc a {color:#000;text-decoration:none} +#bo_vc p {padding:0 0 5px;line-height:1.8em} +#bo_vc p a {text-decoration:underline} +#bo_vc_empty {margin:0;padding:15px !important;border-bottom:1px dotted #ccc;text-align:center} +#bo_vc fieldset {margin:0 0 10px;padding:0} +#bo_vc #bo_vc_winfo {float:left} +#bo_vc footer {zoom:1} +#bo_vc footer:after {display:block;visibility:hidden;clear:both;content:""} + +.bo_vc_act {float:right;margin:0;list-style:none} +.bo_vc_act:after {display:block;visibility:hidden;clear:both;content:""} +.bo_vc_act li {float:left;margin-left:5px} + +#bo_vc_w {position:relative;margin-bottom:10px;padding:0 15px 15px;border-bottom:1px solid #cfded8} +#bo_vc_w h2 {padding:10px 0 5px} +#bo_vc_w #char_cnt {display:block;margin-bottom:5px} +#bo_vc_w textarea {width:99%} + +#bo_vc_sns {margin:0;padding:0;list-style:none;zoom:1} +#bo_vc_sns:after {display:block;visibility:hidden;clear:both;content:""} +#bo_vc_sns li {float:left;margin:0 10px 0 0} +#bo_vc_sns input {margin:0 0 0 5px} + +#bo_vc form {padding:0} \ No newline at end of file diff --git a/mobile/skin/qa/basic/view.answer.skin.php b/mobile/skin/qa/basic/view.answer.skin.php new file mode 100644 index 000000000..d8d8beb1f --- /dev/null +++ b/mobile/skin/qa/basic/view.answer.skin.php @@ -0,0 +1,24 @@ + + +
    +

    답변:

    + 추가질문 + +
    + +
    +
    + +
    + +
    + + 답변수정 + + + 답변삭제 + +
    +
    \ No newline at end of file diff --git a/mobile/skin/qa/basic/view.answerform.skin.php b/mobile/skin/qa/basic/view.answerform.skin.php new file mode 100644 index 000000000..7fbf8d81f --- /dev/null +++ b/mobile/skin/qa/basic/view.answerform.skin.php @@ -0,0 +1,125 @@ + + +
    + +

    답변등록

    + +
    + + + + + + '; + } else { + $option .= "\n".''."\n".''; + } + + echo $option_hidden; + ?> + +
    + + + + + + + + + + + + + + + + + +
    옵션
    + +
    +
    + +
    + +
    +
    + + + +

    고객님의 문의에 대한 답변을 준비 중입니다.

    + +
    \ No newline at end of file diff --git a/mobile/skin/qa/basic/view.skin.php b/mobile/skin/qa/basic/view.skin.php new file mode 100644 index 000000000..cf9be9ccd --- /dev/null +++ b/mobile/skin/qa/basic/view.skin.php @@ -0,0 +1,187 @@ +', 0); +?> + + + + +
    + +
    +
    +

    + +

    +
    + +
    +

    페이지 정보

    + 작성자 + 작성일 +
    + + + +
    +

    첨부파일

    + +
    + + + + +
    +

    연락처정보

    +
    + +
    이메일
    +
    + + +
    휴대폰
    +
    + +
    +
    + + + +
    + + + + + + + +
    + + +
    +

    본문

    + + \n"; + + for ($i=0; $i<$view['img_count']; $i++) { + //echo $view['img_file'][$i]; + echo get_view_thumbnail($view['img_file'][$i], $qaconfig['qa_image_width']); + } + + echo "\n"; + } + ?> + + +
    + + + + + + +
    + + + + +
    +

    연관질문

    + +
    + + + + + + + + + + + + + + + + + + + +
    분류제목상태등록일
    + + + +
    +
    +
    + + + +
    + +
    + + +
    + + + \ No newline at end of file diff --git a/mobile/skin/qa/basic/write.skin.php b/mobile/skin/qa/basic/write.skin.php new file mode 100644 index 000000000..39118b80b --- /dev/null +++ b/mobile/skin/qa/basic/write.skin.php @@ -0,0 +1,184 @@ +', 0); +?> + +
    + +
    + + + + + + '; + } else { + $option .= "\n".''."\n".''; + } + + echo $option_hidden; + ?> + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    옵션
    + class="frm_input email" maxlength="100"> + > + +
    + class="frm_input" size="30"> + + > 답변등록 SMS알림 수신 + +
    + +
    + +
    파일 #1 + + + + +
    파일 #2 + + + + +
    +
    + +
    + + 목록 +
    +
    + + +
    + \ No newline at end of file diff --git a/mobile/skin/search/basic/search.skin.php b/mobile/skin/search/basic/search.skin.php new file mode 100644 index 000000000..67214dc90 --- /dev/null +++ b/mobile/skin/search/basic/search.skin.php @@ -0,0 +1,139 @@ +', 0); +?> + +
    + +
    + 상세검색 +
    + + + + + +
    +
    + + + + + +
    +
    + id="sop_or" name="sop"> + + id="sop_and" name="sop"> + +
    +
    +
    + +
    + + +
    +

    전체검색 결과

    +
    +
    게시판
    +
    +
    게시물
    +
    +
    +

    / 페이지 열람 중

    +
    + + + + + +
    검색된 자료가 하나도 없습니다.
    + + +
    + +
    + +

    게시판 내 결과

    +
      + 댓글"; + $comment_href = "#c_".$list[$idx][$i]['wr_id']; + } + ?> +
    • + + 새창 +

      + + +
    • + +
    + + +
    + +
    + + + +
    diff --git a/mobile/skin/search/basic/style.css b/mobile/skin/search/basic/style.css new file mode 100644 index 000000000..56295b0f4 --- /dev/null +++ b/mobile/skin/search/basic/style.css @@ -0,0 +1,33 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +/* 전체검색결과 스킨 */ +#sch_res_detail {padding:0 0 10px;border-bottom:1px solid #e9e9e9;text-align:center} +#sch_res_detail legend {position:absolute;font-size:0;line-height:0;overflow:hidden} +#sch_res_detail div {margin:0 0 5px} +#sch_res_detail .frm_input {height:2.5em;line-height:2.5em} + +#sch_res_ov {padding:10px;border-bottom:1px solid #e9e9e9;background:#f5f6fa;zoom:1} +#sch_res_ov:after {display:block;visibility:hidden;clear:both;content:""} +#sch_res_ov h2 {margin:0 0 5px} +#sch_res_ov dl {margin:0 0 5px;zoom:1} +#sch_res_ov dl:after {display:block;visibility:hidden;clear:both;content:""} +#sch_res_ov dt {float:left} +#sch_res_ov dd {float:left;margin:0 10px 0 5px} +#sch_res_ov p {margin:0;padding:0} + +#sch_res_board {margin:0 0 10px;padding:0;list-style:none;zoom:1} +#sch_res_board:after {display:block;visibility:hidden;clear:both;content:""} +#sch_res_board a {display:block;position:relative;margin-left:-1px;padding:5px 10px;border-bottom:1px solid #e9e9e9;text-decoration:none;letter-spacing:-0.1em;line-height:1.2em;cursor:pointer} +#sch_res_board a:focus, #sch_res_board a:hover, #sch_res_board a:active {text-decoration:none} +#sch_res_board .cnt_cmt {font-weight:normal !important} + +.sch_res_list {margin:0 0 10px;padding:10px 0} +.sch_res_list h2 {margin:0 0 10px;padding:0 10px;font-size:1.2em} +.sch_res_list ul {margin:0;padding:0;list-style:none} +.sch_res_list li {margin:0 0 10px;padding:0 10px 10px;border-bottom:1px solid #e9e9e9} +.sch_res_list a {text-decoration:none} +.sch_res_title {display:inline-block;margin:0 0 5px} +.sch_res_list p {margin:0 0 10px;line-height:1.8em} +.sch_more {padding:0 10px;text-align:right} +.sch_on {color:#ff3061} \ No newline at end of file diff --git a/mobile/skin/visit/basic/style.css b/mobile/skin/visit/basic/style.css new file mode 100644 index 000000000..5a9c00719 --- /dev/null +++ b/mobile/skin/visit/basic/style.css @@ -0,0 +1,11 @@ +@charset "utf-8"; +/* SIR 지운아빠 */ + +#visit {border-bottom:1px dotted #dde4e9} +#visit div {zoom:1} +#visit div:after {display:block;visibility:hidden;clear:both;content:""} +#visit h2 {float:left;padding:10px} +#visit dl {float:left;margin:0 0 0 5px;padding:0} +#visit dt {float:left;margin:0;padding:10px 5px;letter-spacing:-0.1em} +#visit dd {float:left;margin:0 3px 0 0;padding:10px 5px} +#visit a {display:inline-block;padding:10px 3px;text-decoration:none} \ No newline at end of file diff --git a/mobile/skin/visit/basic/visit.skin.php b/mobile/skin/visit/basic/visit.skin.php new file mode 100644 index 000000000..04027bdec --- /dev/null +++ b/mobile/skin/visit/basic/visit.skin.php @@ -0,0 +1,25 @@ +', 0); +?> + + diff --git a/mobile/tail.php b/mobile/tail.php new file mode 100644 index 000000000..f5069605e --- /dev/null +++ b/mobile/tail.php @@ -0,0 +1,56 @@ + + + + +
    + + + +
    + +
    + + +
    + + Copyright © 소유하신 도메인. All rights reserved.
    + 상단으로 +
    +
    + +$val) { + if($key == 'device') + continue; + + $href .= $sep.$key.'='.$val; + $sep = '&'; + $seq++; + } + } + if($seq) + $href .= '&device=pc'; + else + $href .= '?device=pc'; +?> +PC 버전으로 보기 + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/ChangeLog.txt b/plugin/PHPMailer_v2.0.4/ChangeLog.txt new file mode 100644 index 000000000..172a85eac --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/ChangeLog.txt @@ -0,0 +1,302 @@ +ChangeLog + +Version 2.0.4 (April 02 2009) +* fixed == in class.smtp.php +- NOTE: this is it folks, our last PHPMailer to support PHP4 + +Version 2.0.3 (November 08 2008) +* fixed line 1041 in class.smtp.php (endless loop from missing = sign) +* fixed duplicate images in email body +* removed English language from language files and made it a default within + class.phpmailer.php - if no language is found, it will default to use + the english language translation +* corrected $basedir to $directory +* changed default of $LE to "\r\n" to comply with RFC 2822. Can be set by the user + if default is not acceptable +* removed trim() from return results in EncodeQP +* changed $this->AltBody = $textMsg; to $this->AltBody = html_entity_decode($textMsg); +* We have removed the /phpdoc from the downloads. All documentation is now on + the http://phpmailer.codeworxtech.com website. + +Version 2.0.2 (June 04 2008) + +** NOTE: WE HAVE A NEW LANGUAGE VARIABLE FOR DIGITALLY SIGNED S/MIME EMAILS. + IF YOU CAN HELP WITH LANGUAGES OTHER THAN ENGLISH AND SPANISH, IT WOULD BE + APPRECIATED. + +* added S/MIME functionality (ability to digitally sign emails) + BIG THANKS TO "sergiocambra" for posting this patch back in November 2007. + The "Signed Emails" functionality adds the Sign method to pass the private key + filename and the password to read it, and then email will be sent with + content-type multipart/signed and with the digital signature attached. +* added ability to define path (mainly for embedded images) + function MsgHTML($message,$basedir='') ... where: + $basedir is the fully qualified path +* fixed MsgHTML() function: + - Embedded Images where images are specified by :// will not be altered or embedded +* fixed the return value of SMTP exit code ( pclose ) +* addressed issue of multibyte characters in subject line and truncating +* added ability to have user specified Message ID + (default is still that PHPMailer create a unique Message ID) +* corrected unidentified message type to 'application/octet-stream' +* fixed chunk_split() multibyte issue (thanks to Colin Brown, et al). +* added check for added attachments +* enhanced conversion of HTML to text in MsgHTML (thanks to "brunny") + +Version 2.0.1 (Sun, Dec 02 2007) +* corrected incorrect version numbers in all three classes + +Version 2.0.0 (Sun, Dec 02 2007) +* implemented updated EncodeQP (thanks to coolbru, aka Marcus Bointon) +* finished all testing, all known bugs corrected, enhancements tested +- note: designed for PHP4, but will work with PHP5 (not compatible with + E_STRICT) ... full PHP5 version of PHPMailer released separately. + PHP5 version will NOT work with PHP4. + +Version 2.0.0 rc2 (Fri, Nov 16 2007), interim release +* implements new property to control VERP in class.smtp.php + example (requires instantiating class.smtp.php): + $mail->do_verp = true; +* POP-before-SMTP functionality included, thanks to Richard Davey + (see class.pop3.php & pop3_before_smtp_test.php for examples) +* included example showing how to use PHPMailer with GMAIL +* fixed the missing Cc in SendMail() and Mail() + +****************** +A note on sending bulk emails: + +If the email you are sending is not personalized, consider using the +"undisclosed-recipient:;" strategy. That is, put all of your recipients +in the Bcc field and set the To field to "undisclosed-recipients:;". +It's a lot faster (only one send) and saves quite a bit on resources. +Contrary to some opinions, this will not get you listed in spam engines - +it's a legitimate way for you to send emails. + +A partial example for use with PHPMailer: + +$mail->AddAddress("undisclosed-recipients:;"); +$mail->AddBCC("email1@anydomain.com,email2@anyotherdomain.com,email3@anyalternatedomain.com"); + +Many email service providers restrict the number of emails that can be sent +in any given time period. Often that is between 50 - 60 emails maximum +per hour or per send session. + +If that's the case, then break up your Bcc lists into chunks that are one +less than your limit, and put a pause in your script. +******************* + +Version 2.0.0 rc1 (Thu, Nov 08 2007), interim release +* dramatically simplified using inline graphics ... it's fully automated and + requires no user input +* added automatic document type detection for attachments and pictures +* added MsgHTML() function to replace Body tag for HTML emails +* fixed the SendMail security issues (input validation vulnerability) +* enhanced the AddAddresses functionality so that the "Name" portion is used + in the email address +* removed the need to use the AltBody method (set from the HTML, or default + text used) +* set the PHP Mail() function as the default (still support SendMail, SMTP Mail) +* removed the need to set the IsHTML property (set automatically) +* added Estonian language file by Indrek Päri +* added header injection patch +* added "set" method to permit users to create their own pseudo-properties + like 'X-Headers', etc. + example of use: + $mail->set('X-Priority', '3'); + $mail->set('X-MSMail-Priority', 'Normal'); +* fixed warning message in SMTP get_lines method +* added TLS/SSL SMTP support + example of use: + $mail = new PHPMailer(); + $mail->Mailer = "smtp"; + $mail->Host = "smtp.example.com"; + $mail->SMTPSecure = "tls"; // option + //$mail->SMTPSecure = "ssl"; // option + ... + $mail->Send(); +* PHPMailer has been tested with PHP4 (4.4.7) and PHP5 (5.2.7) +* Works with PHP installed as a module or as CGI-PHP +- NOTE: will NOT work with PHP5 in E_STRICT error mode + +Version 1.73 (Sun, Jun 10 2005) +* Fixed denial of service bug: http://www.cybsec.com/vuln/PHPMailer-DOS.pdf +* Now has a total of 20 translations +* Fixed alt attachments bug: http://tinyurl.com/98u9k + +Version 1.72 (Wed, May 25 2004) +* Added Dutch, Swedish, Czech, Norwegian, and Turkish translations. +* Received: Removed this method because spam filter programs like +SpamAssassin reject this header. +* Fixed error count bug. +* SetLanguage default is now "language/". +* Fixed magic_quotes_runtime bug. + +Version 1.71 (Tue, Jul 28 2003) +* Made several speed enhancements +* Added German and Italian translation files +* Fixed HELO/AUTH bugs on keep-alive connects +* Now provides an error message if language file does not load +* Fixed attachment EOL bug +* Updated some unclear documentation +* Added additional tests and improved others + +Version 1.70 (Mon, Jun 20 2003) +* Added SMTP keep-alive support +* Added IsError method for error detection +* Added error message translation support (SetLanguage) +* Refactored many methods to increase library performance +* Hello now sends the newer EHLO message before HELO as per RFC 2821 +* Removed the boundary class and replaced it with GetBoundary +* Removed queue support methods +* New $Hostname variable +* New Message-ID header +* Received header reformat +* Helo variable default changed to $Hostname +* Removed extra spaces in Content-Type definition (#667182) +* Return-Path should be set to Sender when set +* Adds Q or B encoding to headers when necessary +* quoted-encoding should now encode NULs \000 +* Fixed encoding of body/AltBody (#553370) +* Adds "To: undisclosed-recipients:;" when all recipients are hidden (BCC) +* Multiple bug fixes + +Version 1.65 (Fri, Aug 09 2002) +* Fixed non-visible attachment bug (#585097) for Outlook +* SMTP connections are now closed after each transaction +* Fixed SMTP::Expand return value +* Converted SMTP class documentation to phpDocumentor format + +Version 1.62 (Wed, Jun 26 2002) +* Fixed multi-attach bug +* Set proper word wrapping +* Reduced memory use with attachments +* Added more debugging +* Changed documentation to phpDocumentor format + +Version 1.60 (Sat, Mar 30 2002) +* Sendmail pipe and address patch (Christian Holtje) +* Added embedded image and read confirmation support (A. Ognio) +* Added unit tests +* Added SMTP timeout support (*nix only) +* Added possibly temporary PluginDir variable for SMTP class +* Added LE message line ending variable +* Refactored boundary and attachment code +* Eliminated SMTP class warnings +* Added SendToQueue method for future queuing support + +Version 1.54 (Wed, Dec 19 2001) +* Add some queuing support code +* Fixed a pesky multi/alt bug +* Messages are no longer forced to have "To" addresses + +Version 1.50 (Thu, Nov 08 2001) +* Fix extra lines when not using SMTP mailer +* Set WordWrap variable to int with a zero default + +Version 1.47 (Tue, Oct 16 2001) +* Fixed Received header code format +* Fixed AltBody order error +* Fixed alternate port warning + +Version 1.45 (Tue, Sep 25 2001) +* Added enhanced SMTP debug support +* Added support for multiple ports on SMTP +* Added Received header for tracing +* Fixed AddStringAttachment encoding +* Fixed possible header name quote bug +* Fixed wordwrap() trim bug +* Couple other small bug fixes + +Version 1.41 (Wed, Aug 22 2001) +* Fixed AltBody bug w/o attachments +* Fixed rfc_date() for certain mail servers + +Version 1.40 (Sun, Aug 12 2001) +* Added multipart/alternative support (AltBody) +* Documentation update +* Fixed bug in Mercury MTA + +Version 1.29 (Fri, Aug 03 2001) +* Added AddStringAttachment() method +* Added SMTP authentication support + +Version 1.28 (Mon, Jul 30 2001) +* Fixed a typo in SMTP class +* Fixed header issue with Imail (win32) SMTP server +* Made fopen() calls for attachments use "rb" to fix win32 error + +Version 1.25 (Mon, Jul 02 2001) +* Added RFC 822 date fix (Patrice) +* Added improved error handling by adding a $ErrorInfo variable +* Removed MailerDebug variable (obsolete with new error handler) + +Version 1.20 (Mon, Jun 25 2001) +* Added quoted-printable encoding (Patrice) +* Set Version as public and removed PrintVersion() +* Changed phpdoc to only display public variables and methods + +Version 1.19 (Thu, Jun 21 2001) +* Fixed MS Mail header bug +* Added fix for Bcc problem with mail(). *Does not work on Win32* + (See PHP bug report: http://www.php.net/bugs.php?id=11616) +* mail() no longer passes a fifth parameter when not needed + +Version 1.15 (Fri, Jun 15 2001) +[Note: these changes contributed by Patrice Fournier] +* Changed all remaining \n to \r\n +* Bcc: header no longer writen to message except +when sent directly to sendmail +* Added a small message to non-MIME compliant mail reader +* Added Sender variable to change the Sender email +used in -f for sendmail/mail and in 'MAIL FROM' for smtp mode +* Changed boundary setting to a place it will be set only once +* Removed transfer encoding for whole message when using multipart +* Message body now uses Encoding in multipart messages +* Can set encoding and type to attachments 7bit, 8bit +and binary attachment are sent as is, base64 are encoded +* Can set Encoding to base64 to send 8 bits body +through 7 bits servers + +Version 1.10 (Tue, Jun 12 2001) +* Fixed win32 mail header bug (printed out headers in message body) + +Version 1.09 (Fri, Jun 08 2001) +* Changed date header to work with Netscape mail programs +* Altered phpdoc documentation + +Version 1.08 (Tue, Jun 05 2001) +* Added enhanced error-checking +* Added phpdoc documentation to source + +Version 1.06 (Fri, Jun 01 2001) +* Added optional name for file attachments + +Version 1.05 (Tue, May 29 2001) +* Code cleanup +* Eliminated sendmail header warning message +* Fixed possible SMTP error + +Version 1.03 (Thu, May 24 2001) +* Fixed problem where qmail sends out duplicate messages + +Version 1.02 (Wed, May 23 2001) +* Added multiple recipient and attachment Clear* methods +* Added Sendmail public variable +* Fixed problem with loading SMTP library multiple times + +Version 0.98 (Tue, May 22 2001) +* Fixed problem with redundant mail hosts sending out multiple messages +* Added additional error handler code +* Added AddCustomHeader() function +* Added support for Microsoft mail client headers (affects priority) +* Fixed small bug with Mailer variable +* Added PrintVersion() function + +Version 0.92 (Tue, May 15 2001) +* Changed file names to class.phpmailer.php and class.smtp.php to match + current PHP class trend. +* Fixed problem where body not being printed when a message is attached +* Several small bug fixes + +Version 0.90 (Tue, April 17 2001) +* Intial public release diff --git a/plugin/PHPMailer_v2.0.4/LICENSE b/plugin/PHPMailer_v2.0.4/LICENSE new file mode 100644 index 000000000..03851a338 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/plugin/PHPMailer_v2.0.4/README b/plugin/PHPMailer_v2.0.4/README new file mode 100644 index 000000000..ad988dc9b --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/README @@ -0,0 +1,174 @@ +/******************************************************************* +* The http://phpmailer.codeworxtech.com/ website now carries a few * +* advertisements through the Google Adsense network. Please visit * +* the advertiser sites and help us offset some of our costs. * +* Thanks .... * +********************************************************************/ + +PHPMailer +Full Featured Email Transfer Class for PHP +========================================== + +Version 2.0.4 (April 02, 2009) + +This is the last version to support PHP4. We've made the move to PHP5 and +all of our efforts now are into PHPMailer for PHP5/6. + +Version 2.0.3 (November 08, 2008) + +PHP4 continues to be a major platform for developers. We are responding +to the emails received to continue development for PHP4 with this +release. + +We have removed the /phpdoc from the downloads. All documentation is now on +the http://phpmailer.codeworxtech.com website. + +For all other changes and notes, please see the changelog. + +Donations are accepted at PayPal with our id "paypal@worxteam.com". + +Version 2.2 (July 15 2008) + +- see the changelog. + +Version 2.0.2 (June 04 2008) + +With this release, we are announcing that the development of PHPMailer for PHP5 +will be our focus from this date on. We have implemented all the enhancements +and fixes from the sourceforge.net Tracker. + +** NOTE: WE HAVE A NEW LANGUAGE VARIABLE FOR DIGITALLY SIGNED S/MIME EMAILS. + IF YOU CAN HELP WITH LANGUAGES OTHER THAN ENGLISH AND SPANISH, IT WOULD BE + APPRECIATED. + +We have now added S/MIME functionality (ability to digitally sign emails). +BIG THANKS TO "sergiocambra" for posting this patch back in November 2007. +The "Signed Emails" functionality adds the Sign method to pass the private key +filename and the password to read it, and then email will be sent with +content-type multipart/signed and with the digital signature attached. + +We have also included more example files to show the use of "sendmail", "mail()", +"smtp", and "gmail". + +We are also looking for more programmers to join the volunteer development team. +If you have an interest in this, please let us know. + +Enjoy! + +** NOTE: + +As of November 2007, PHPMailer has a new project team headed by industry +veteran Andy Prevost (codeworxtech). The first release in more than two +years will focus on fixes, adding ease-of-use enhancements, provide +basic compatibility with PHP4 and PHP5 using PHP5 backwards compatibility +features. A new release is planned before year-end 2007 that will provide +full compatiblity with PHP4 and PHP5, as well as more bug fixes. + +We are looking for project developers to assist in restoring PHPMailer to +its leadership position. Our goals are to simplify use of PHPMailer, provide +good documentation and examples, and retain backward compatibility to level +1.7.3 standards. + +If you are interested in helping out, visit http://sourceforge.net/projects/phpmailer +and indicate your interest. + +** + +http://phpmailer.sourceforge.net/ + +This software is licenced under the LGPL. Please read LICENSE for information on the +software availability and distribution. + +Class Features: +- Send emails with multiple TOs, CCs, BCCs and REPLY-TOs +- Redundant SMTP servers +- Multipart/alternative emails for mail clients that do not read HTML email +- Support for 8bit, base64, binary, and quoted-printable encoding +- Uses the same methods as the very popular AspEmail active server (COM) component +- SMTP authentication +- Native language support +- Word wrap, and more! + +Why you might need it: + +Many PHP developers utilize email in their code. The only PHP function +that supports this is the mail() function. However, it does not expose +any of the popular features that many email clients use nowadays like +HTML-based emails and attachments. There are two proprietary +development tools out there that have all the functionality built into +easy to use classes: AspEmail(tm) and AspMail. Both of these +programs are COM components only available on Windows. They are also a +little pricey for smaller projects. + +Since I do Linux development Ive missed these tools for my PHP coding. +So I built a version myself that implements the same methods (object +calls) that the Windows-based components do. It is open source and the +LGPL license allows you to place the class in your proprietary PHP +projects. + + +Installation: + +Copy class.phpmailer.php into your php.ini include_path. If you are +using the SMTP mailer then place class.smtp.php in your path as well. +In the language directory you will find several files like +phpmailer.lang-en.php. If you look right before the .php extension +that there are two letters. These represent the language type of the +translation file. For instance "en" is the English file and "br" is +the Portuguese file. Chose the file that best fits with your language +and place it in the PHP include path. If your language is English +then you have nothing more to do. If it is a different language then +you must point PHPMailer to the correct translation. To do this, call +the PHPMailer SetLanguage method like so: + +// To load the Portuguese version +$mail->SetLanguage("br", "/optional/path/to/language/directory/"); + +That's it. You should now be ready to use PHPMailer! + + +A Simple Example: + +IsSMTP(); // set mailer to use SMTP +$mail->Host = "smtp1.example.com;smtp2.example.com"; // specify main and backup server +$mail->SMTPAuth = true; // turn on SMTP authentication +$mail->Username = "jswan"; // SMTP username +$mail->Password = "secret"; // SMTP password + +$mail->From = "from@example.com"; +$mail->FromName = "Mailer"; +$mail->AddAddress("josh@example.net", "Josh Adams"); +$mail->AddAddress("ellen@example.com"); // name is optional +$mail->AddReplyTo("info@example.com", "Information"); + +$mail->WordWrap = 50; // set word wrap to 50 characters +$mail->AddAttachment("/var/tmp/file.tar.gz"); // add attachments +$mail->AddAttachment("/tmp/image.jpg", "new.jpg"); // optional name +$mail->IsHTML(true); // set email format to HTML + +$mail->Subject = "Here is the subject"; +$mail->Body = "This is the HTML message body in bold!"; +$mail->AltBody = "This is the body in plain text for non-HTML mail clients"; + +if(!$mail->Send()) +{ + echo "Message could not be sent.

    "; + echo "Mailer Error: " . $mail->ErrorInfo; + exit; +} + +echo "Message has been sent"; +?> + +CHANGELOG + +See ChangeLog.txt + +Download: http://sourceforge.net/project/showfiles.php?group_id=26031 + +Andy Prevost diff --git a/plugin/PHPMailer_v2.0.4/class.phpmailer.php b/plugin/PHPMailer_v2.0.4/class.phpmailer.php new file mode 100644 index 000000000..9214dbc9b --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/class.phpmailer.php @@ -0,0 +1,1911 @@ +ContentType = 'text/html'; + } else { + $this->ContentType = 'text/plain'; + } + } + + /** + * Sets Mailer to send message using SMTP. + * @return void + */ + function IsSMTP() { + $this->Mailer = 'smtp'; + } + + /** + * Sets Mailer to send message using PHP mail() function. + * @return void + */ + function IsMail() { + $this->Mailer = 'mail'; + } + + /** + * Sets Mailer to send message using the $Sendmail program. + * @return void + */ + function IsSendmail() { + $this->Mailer = 'sendmail'; + } + + /** + * Sets Mailer to send message using the qmail MTA. + * @return void + */ + function IsQmail() { + $this->Sendmail = '/var/qmail/bin/sendmail'; + $this->Mailer = 'sendmail'; + } + + ///////////////////////////////////////////////// + // METHODS, RECIPIENTS + ///////////////////////////////////////////////// + + /** + * Adds a "To" address. + * @param string $address + * @param string $name + * @return void + */ + function AddAddress($address, $name = '') { + $cur = count($this->to); + $this->to[$cur][0] = trim($address); + $this->to[$cur][1] = $name; + } + + /** + * Adds a "Cc" address. Note: this function works + * with the SMTP mailer on win32, not with the "mail" + * mailer. + * @param string $address + * @param string $name + * @return void + */ + function AddCC($address, $name = '') { + $cur = count($this->cc); + $this->cc[$cur][0] = trim($address); + $this->cc[$cur][1] = $name; + } + + /** + * Adds a "Bcc" address. Note: this function works + * with the SMTP mailer on win32, not with the "mail" + * mailer. + * @param string $address + * @param string $name + * @return void + */ + function AddBCC($address, $name = '') { + $cur = count($this->bcc); + $this->bcc[$cur][0] = trim($address); + $this->bcc[$cur][1] = $name; + } + + /** + * Adds a "Reply-To" address. + * @param string $address + * @param string $name + * @return void + */ + function AddReplyTo($address, $name = '') { + $cur = count($this->ReplyTo); + $this->ReplyTo[$cur][0] = trim($address); + $this->ReplyTo[$cur][1] = $name; + } + + ///////////////////////////////////////////////// + // METHODS, MAIL SENDING + ///////////////////////////////////////////////// + + /** + * Creates message and assigns Mailer. If the message is + * not sent successfully then it returns false. Use the ErrorInfo + * variable to view description of the error. + * @return bool + */ + function Send() { + $header = ''; + $body = ''; + $result = true; + + if((count($this->to) + count($this->cc) + count($this->bcc)) < 1) { + $this->SetError($this->Lang('provide_address')); + return false; + } + + /* Set whether the message is multipart/alternative */ + if(!empty($this->AltBody)) { + $this->ContentType = 'multipart/alternative'; + } + + $this->error_count = 0; // reset errors + $this->SetMessageType(); + $header .= $this->CreateHeader(); + $body = $this->CreateBody(); + + if($body == '') { + return false; + } + + /* Choose the mailer */ + switch($this->Mailer) { + case 'sendmail': + $result = $this->SendmailSend($header, $body); + break; + case 'smtp': + $result = $this->SmtpSend($header, $body); + break; + case 'mail': + $result = $this->MailSend($header, $body); + break; + default: + $result = $this->MailSend($header, $body); + break; + //$this->SetError($this->Mailer . $this->Lang('mailer_not_supported')); + //$result = false; + //break; + } + + return $result; + } + + /** + * Sends mail using the $Sendmail program. + * @access private + * @return bool + */ + function SendmailSend($header, $body) { + if ($this->Sender != '') { + $sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender)); + } else { + $sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail)); + } + + if(!@$mail = popen($sendmail, 'w')) { + $this->SetError($this->Lang('execute') . $this->Sendmail); + return false; + } + + fputs($mail, $header); + fputs($mail, $body); + + $result = pclose($mail); + if (version_compare(phpversion(), '4.2.3') == -1) { + $result = $result >> 8 & 0xFF; + } + if($result != 0) { + $this->SetError($this->Lang('execute') . $this->Sendmail); + return false; + } + return true; + } + + /** + * Sends mail using the PHP mail() function. + * @access private + * @return bool + */ + function MailSend($header, $body) { + + $to = ''; + for($i = 0; $i < count($this->to); $i++) { + if($i != 0) { $to .= ', '; } + $to .= $this->AddrFormat($this->to[$i]); + } + + //$toArr = split(',', $to); + $toArr = explode(',', $to); + + $params = sprintf("-oi -f %s", $this->Sender); + if ($this->Sender != '' && strlen(ini_get('safe_mode')) < 1) { + $old_from = ini_get('sendmail_from'); + ini_set('sendmail_from', $this->Sender); + if ($this->SingleTo === true && count($toArr) > 1) { + foreach ($toArr as $key => $val) { + $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); + } + } else { + $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); + } + } else { + if ($this->SingleTo === true && count($toArr) > 1) { + foreach ($toArr as $key => $val) { + $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params); + } + } else { + $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header); + } + } + + if (isset($old_from)) { + ini_set('sendmail_from', $old_from); + } + + if(!$rt) { + $this->SetError($this->Lang('instantiate')); + return false; + } + + return true; + } + + /** + * Sends mail via SMTP using PhpSMTP (Author: + * Chris Ryan). Returns bool. Returns false if there is a + * bad MAIL FROM, RCPT, or DATA input. + * @access private + * @return bool + */ + function SmtpSend($header, $body) { + include_once($this->PluginDir . 'class.smtp.php'); + $error = ''; + $bad_rcpt = array(); + + if(!$this->SmtpConnect()) { + return false; + } + + $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender; + if(!$this->smtp->Mail($smtp_from)) { + $error = $this->Lang('from_failed') . $smtp_from; + $this->SetError($error); + $this->smtp->Reset(); + return false; + } + + /* Attempt to send attach all recipients */ + for($i = 0; $i < count($this->to); $i++) { + if(!$this->smtp->Recipient($this->to[$i][0])) { + $bad_rcpt[] = $this->to[$i][0]; + } + } + for($i = 0; $i < count($this->cc); $i++) { + if(!$this->smtp->Recipient($this->cc[$i][0])) { + $bad_rcpt[] = $this->cc[$i][0]; + } + } + for($i = 0; $i < count($this->bcc); $i++) { + if(!$this->smtp->Recipient($this->bcc[$i][0])) { + $bad_rcpt[] = $this->bcc[$i][0]; + } + } + + if(count($bad_rcpt) > 0) { // Create error message + for($i = 0; $i < count($bad_rcpt); $i++) { + if($i != 0) { + $error .= ', '; + } + $error .= $bad_rcpt[$i]; + } + $error = $this->Lang('recipients_failed') . $error; + $this->SetError($error); + $this->smtp->Reset(); + return false; + } + + if(!$this->smtp->Data($header . $body)) { + $this->SetError($this->Lang('data_not_accepted')); + $this->smtp->Reset(); + return false; + } + if($this->SMTPKeepAlive == true) { + $this->smtp->Reset(); + } else { + $this->SmtpClose(); + } + + return true; + } + + /** + * Initiates a connection to an SMTP server. Returns false if the + * operation failed. + * @access private + * @return bool + */ + function SmtpConnect() { + if($this->smtp == NULL) { + $this->smtp = new SMTP(); + } + + $this->smtp->do_debug = $this->SMTPDebug; + $hosts = explode(';', $this->Host); + $index = 0; + $connection = ($this->smtp->Connected()); + + /* Retry while there is no connection */ + while($index < count($hosts) && $connection == false) { + $hostinfo = array(); + if(preg_match('/^(.+):([0-9]+)$/i', $hosts[$index], $hostinfo)) { + $host = $hostinfo[1]; + $port = $hostinfo[2]; + } else { + $host = $hosts[$index]; + $port = $this->Port; + } + + if($this->smtp->Connect(((!empty($this->SMTPSecure))?$this->SMTPSecure.'://':'').$host, $port, $this->Timeout)) { + if ($this->Helo != '') { + $this->smtp->Hello($this->Helo); + } else { + $this->smtp->Hello($this->ServerHostname()); + } + + $connection = true; + if($this->SMTPAuth) { + if(!$this->smtp->Authenticate($this->Username, $this->Password)) { + $this->SetError($this->Lang('authenticate')); + $this->smtp->Reset(); + $connection = false; + } + } + } + $index++; + } + if(!$connection) { + $this->SetError($this->Lang('connect_host')); + } + + return $connection; + } + + /** + * Closes the active SMTP session if one exists. + * @return void + */ + function SmtpClose() { + if($this->smtp != NULL) { + if($this->smtp->Connected()) { + $this->smtp->Quit(); + $this->smtp->Close(); + } + } + } + + /** + * Sets the language for all class error messages. Returns false + * if it cannot load the language file. The default language type + * is English. + * @param string $lang_type Type of language (e.g. Portuguese: "br") + * @param string $lang_path Path to the language file directory + * @access public + * @return bool + */ + function SetLanguage($lang_type, $lang_path = 'language/') { + if(file_exists($lang_path.'phpmailer.lang-'.$lang_type.'.php')) { + include($lang_path.'phpmailer.lang-'.$lang_type.'.php'); + } elseif (file_exists($lang_path.'phpmailer.lang-en.php')) { + include($lang_path.'phpmailer.lang-en.php'); + } else { + $PHPMAILER_LANG = array(); + $PHPMAILER_LANG["provide_address"] = 'You must provide at least one ' . + $PHPMAILER_LANG["mailer_not_supported"] = ' mailer is not supported.'; + $PHPMAILER_LANG["execute"] = 'Could not execute: '; + $PHPMAILER_LANG["instantiate"] = 'Could not instantiate mail function.'; + $PHPMAILER_LANG["authenticate"] = 'SMTP Error: Could not authenticate.'; + $PHPMAILER_LANG["from_failed"] = 'The following From address failed: '; + $PHPMAILER_LANG["recipients_failed"] = 'SMTP Error: The following ' . + $PHPMAILER_LANG["data_not_accepted"] = 'SMTP Error: Data not accepted.'; + $PHPMAILER_LANG["connect_host"] = 'SMTP Error: Could not connect to SMTP host.'; + $PHPMAILER_LANG["file_access"] = 'Could not access file: '; + $PHPMAILER_LANG["file_open"] = 'File Error: Could not open file: '; + $PHPMAILER_LANG["encoding"] = 'Unknown encoding: '; + $PHPMAILER_LANG["signing"] = 'Signing Error: '; + } + $this->language = $PHPMAILER_LANG; + + return true; + } + + ///////////////////////////////////////////////// + // METHODS, MESSAGE CREATION + ///////////////////////////////////////////////// + + /** + * Creates recipient headers. + * @access private + * @return string + */ + function AddrAppend($type, $addr) { + $addr_str = $type . ': '; + $addr_str .= $this->AddrFormat($addr[0]); + if(count($addr) > 1) { + for($i = 1; $i < count($addr); $i++) { + $addr_str .= ', ' . $this->AddrFormat($addr[$i]); + } + } + $addr_str .= $this->LE; + + return $addr_str; + } + + /** + * Formats an address correctly. + * @access private + * @return string + */ + function AddrFormat($addr) { + if(empty($addr[1])) { + $formatted = $this->SecureHeader($addr[0]); + } else { + $formatted = $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">"; + } + + return $formatted; + } + + /** + * Wraps message for use with mailers that do not + * automatically perform wrapping and for quoted-printable. + * Original written by philippe. + * @access private + * @return string + */ + function WrapText($message, $length, $qp_mode = false) { + $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE; + // If utf-8 encoding is used, we will need to make sure we don't + // split multibyte characters when we wrap + $is_utf8 = (strtolower($this->CharSet) == "utf-8"); + + $message = $this->FixEOL($message); + if (substr($message, -1) == $this->LE) { + $message = substr($message, 0, -1); + } + + $line = explode($this->LE, $message); + $message = ''; + for ($i=0 ;$i < count($line); $i++) { + $line_part = explode(' ', $line[$i]); + $buf = ''; + for ($e = 0; $e $length)) { + $space_left = $length - strlen($buf) - 1; + if ($e != 0) { + if ($space_left > 20) { + $len = $space_left; + if ($is_utf8) { + $len = $this->UTF8CharBoundary($word, $len); + } elseif (substr($word, $len - 1, 1) == "=") { + $len--; + } elseif (substr($word, $len - 2, 1) == "=") { + $len -= 2; + } + $part = substr($word, 0, $len); + $word = substr($word, $len); + $buf .= ' ' . $part; + $message .= $buf . sprintf("=%s", $this->LE); + } else { + $message .= $buf . $soft_break; + } + $buf = ''; + } + while (strlen($word) > 0) { + $len = $length; + if ($is_utf8) { + $len = $this->UTF8CharBoundary($word, $len); + } elseif (substr($word, $len - 1, 1) == "=") { + $len--; + } elseif (substr($word, $len - 2, 1) == "=") { + $len -= 2; + } + $part = substr($word, 0, $len); + $word = substr($word, $len); + + if (strlen($word) > 0) { + $message .= $part . sprintf("=%s", $this->LE); + } else { + $buf = $part; + } + } + } else { + $buf_o = $buf; + $buf .= ($e == 0) ? $word : (' ' . $word); + + if (strlen($buf) > $length and $buf_o != '') { + $message .= $buf_o . $soft_break; + $buf = $word; + } + } + } + $message .= $buf . $this->LE; + } + + return $message; + } + + /** + * Finds last character boundary prior to maxLength in a utf-8 + * quoted (printable) encoded string. + * Original written by Colin Brown. + * @access private + * @param string $encodedText utf-8 QP text + * @param int $maxLength find last character boundary prior to this length + * @return int + */ + function UTF8CharBoundary($encodedText, $maxLength) { + $foundSplitPos = false; + $lookBack = 3; + while (!$foundSplitPos) { + $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack); + $encodedCharPos = strpos($lastChunk, "="); + if ($encodedCharPos !== false) { + // Found start of encoded character byte within $lookBack block. + // Check the encoded byte value (the 2 chars after the '=') + $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2); + $dec = hexdec($hex); + if ($dec < 128) { // Single byte character. + // If the encoded char was found at pos 0, it will fit + // otherwise reduce maxLength to start of the encoded char + $maxLength = ($encodedCharPos == 0) ? $maxLength : + $maxLength - ($lookBack - $encodedCharPos); + $foundSplitPos = true; + } elseif ($dec >= 192) { // First byte of a multi byte character + // Reduce maxLength to split at start of character + $maxLength = $maxLength - ($lookBack - $encodedCharPos); + $foundSplitPos = true; + } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back + $lookBack += 3; + } + } else { + // No encoded character found + $foundSplitPos = true; + } + } + return $maxLength; + } + + /** + * Set the body wrapping. + * @access private + * @return void + */ + function SetWordWrap() { + if($this->WordWrap < 1) { + return; + } + + switch($this->message_type) { + case 'alt': + /* fall through */ + case 'alt_attachments': + $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap); + break; + default: + $this->Body = $this->WrapText($this->Body, $this->WordWrap); + break; + } + } + + /** + * Assembles message header. + * @access private + * @return string + */ + function CreateHeader() { + $result = ''; + + /* Set the boundaries */ + $uniq_id = md5(uniqid(time())); + $this->boundary[1] = 'b1_' . $uniq_id; + $this->boundary[2] = 'b2_' . $uniq_id; + + $result .= $this->HeaderLine('Date', $this->RFCDate()); + if($this->Sender == '') { + $result .= $this->HeaderLine('Return-Path', trim($this->From)); + } else { + $result .= $this->HeaderLine('Return-Path', trim($this->Sender)); + } + + /* To be created automatically by mail() */ + if($this->Mailer != 'mail') { + if(count($this->to) > 0) { + $result .= $this->AddrAppend('To', $this->to); + } elseif (count($this->cc) == 0) { + $result .= $this->HeaderLine('To', 'undisclosed-recipients:;'); + } + } + + $from = array(); + $from[0][0] = trim($this->From); + $from[0][1] = $this->FromName; + $result .= $this->AddrAppend('From', $from); + + /* sendmail and mail() extract Cc from the header before sending */ + if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->cc) > 0)) { + $result .= $this->AddrAppend('Cc', $this->cc); + } + + /* sendmail and mail() extract Bcc from the header before sending */ + if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) { + $result .= $this->AddrAppend('Bcc', $this->bcc); + } + + if(count($this->ReplyTo) > 0) { + $result .= $this->AddrAppend('Reply-To', $this->ReplyTo); + } + + /* mail() sets the subject itself */ + if($this->Mailer != 'mail') { + $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject))); + } + + if($this->MessageID != '') { + $result .= $this->HeaderLine('Message-ID',$this->MessageID); + } else { + $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE); + } + $result .= $this->HeaderLine('X-Priority', $this->Priority); + $result .= $this->HeaderLine('X-Mailer', 'PHPMailer (phpmailer.sourceforge.net) [version ' . $this->Version . ']'); + + if($this->ConfirmReadingTo != '') { + $result .= $this->HeaderLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>'); + } + + // Add custom headers + for($index = 0; $index < count($this->CustomHeader); $index++) { + $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1]))); + } + if (!$this->sign_key_file) { + $result .= $this->HeaderLine('MIME-Version', '1.0'); + $result .= $this->GetMailMIME(); + } + + return $result; + } + + /** + * Returns the message MIME. + * @access private + * @return string + */ + function GetMailMIME() { + $result = ''; + switch($this->message_type) { + case 'plain': + $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding); + $result .= sprintf("Content-Type: %s; charset=\"%s\"", $this->ContentType, $this->CharSet); + break; + case 'attachments': + /* fall through */ + case 'alt_attachments': + if($this->InlineImageExists()){ + $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 'multipart/related', $this->LE, $this->LE, $this->boundary[1], $this->LE); + } else { + $result .= $this->HeaderLine('Content-Type', 'multipart/mixed;'); + $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); + } + break; + case 'alt': + $result .= $this->HeaderLine('Content-Type', 'multipart/alternative;'); + $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"'); + break; + } + + if($this->Mailer != 'mail') { + $result .= $this->LE.$this->LE; + } + + return $result; + } + + /** + * Assembles the message body. Returns an empty string on failure. + * @access private + * @return string + */ + function CreateBody() { + $result = ''; + if ($this->sign_key_file) { + $result .= $this->GetMailMIME(); + } + + $this->SetWordWrap(); + + switch($this->message_type) { + case 'alt': + $result .= $this->GetBoundary($this->boundary[1], '', 'text/plain', ''); + $result .= $this->EncodeString($this->AltBody, $this->Encoding); + $result .= $this->LE.$this->LE; + $result .= $this->GetBoundary($this->boundary[1], '', 'text/html', ''); + $result .= $this->EncodeString($this->Body, $this->Encoding); + $result .= $this->LE.$this->LE; + $result .= $this->EndBoundary($this->boundary[1]); + break; + case 'plain': + $result .= $this->EncodeString($this->Body, $this->Encoding); + break; + case 'attachments': + $result .= $this->GetBoundary($this->boundary[1], '', '', ''); + $result .= $this->EncodeString($this->Body, $this->Encoding); + $result .= $this->LE; + $result .= $this->AttachAll(); + break; + case 'alt_attachments': + $result .= sprintf("--%s%s", $this->boundary[1], $this->LE); + $result .= sprintf("Content-Type: %s;%s" . "\tboundary=\"%s\"%s", 'multipart/alternative', $this->LE, $this->boundary[2], $this->LE.$this->LE); + $result .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '') . $this->LE; // Create text body + $result .= $this->EncodeString($this->AltBody, $this->Encoding); + $result .= $this->LE.$this->LE; + $result .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body + $result .= $this->EncodeString($this->Body, $this->Encoding); + $result .= $this->LE.$this->LE; + $result .= $this->EndBoundary($this->boundary[2]); + $result .= $this->AttachAll(); + break; + } + + if($this->IsError()) { + $result = ''; + } else if ($this->sign_key_file) { + $file = tempnam("", "mail"); + $fp = fopen($file, "w"); + fwrite($fp, $result); + fclose($fp); + $signed = tempnam("", "signed"); + + if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_cert_file, array("file://".$this->sign_key_file, $this->sign_key_pass), null)) { + $fp = fopen($signed, "r"); + $result = fread($fp, filesize($this->sign_key_file)); + $result = ''; + while(!feof($fp)){ + $result = $result . fread($fp, 1024); + } + fclose($fp); + } else { + $this->SetError($this->Lang("signing").openssl_error_string()); + $result = ''; + } + + unlink($file); + unlink($signed); + } + + return $result; + } + + /** + * Returns the start of a message boundary. + * @access private + */ + function GetBoundary($boundary, $charSet, $contentType, $encoding) { + $result = ''; + if($charSet == '') { + $charSet = $this->CharSet; + } + if($contentType == '') { + $contentType = $this->ContentType; + } + if($encoding == '') { + $encoding = $this->Encoding; + } + $result .= $this->TextLine('--' . $boundary); + $result .= sprintf("Content-Type: %s; charset = \"%s\"", $contentType, $charSet); + $result .= $this->LE; + $result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding); + $result .= $this->LE; + + return $result; + } + + /** + * Returns the end of a message boundary. + * @access private + */ + function EndBoundary($boundary) { + return $this->LE . '--' . $boundary . '--' . $this->LE; + } + + /** + * Sets the message type. + * @access private + * @return void + */ + function SetMessageType() { + if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) { + $this->message_type = 'plain'; + } else { + if(count($this->attachment) > 0) { + $this->message_type = 'attachments'; + } + if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) { + $this->message_type = 'alt'; + } + if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) { + $this->message_type = 'alt_attachments'; + } + } + } + + /* Returns a formatted header line. + * @access private + * @return string + */ + function HeaderLine($name, $value) { + return $name . ': ' . $value . $this->LE; + } + + /** + * Returns a formatted mail line. + * @access private + * @return string + */ + function TextLine($value) { + return $value . $this->LE; + } + + ///////////////////////////////////////////////// + // CLASS METHODS, ATTACHMENTS + ///////////////////////////////////////////////// + + /** + * Adds an attachment from a path on the filesystem. + * Returns false if the file could not be found + * or accessed. + * @param string $path Path to the attachment. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return bool + */ + function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { + if(!@is_file($path)) { + $this->SetError($this->Lang('file_access') . $path); + return false; + } + + $filename = basename($path); + if($name == '') { + $name = $filename; + } + + $cur = count($this->attachment); + $this->attachment[$cur][0] = $path; + $this->attachment[$cur][1] = $filename; + $this->attachment[$cur][2] = $name; + $this->attachment[$cur][3] = $encoding; + $this->attachment[$cur][4] = $type; + $this->attachment[$cur][5] = false; // isStringAttachment + $this->attachment[$cur][6] = 'attachment'; + $this->attachment[$cur][7] = 0; + + return true; + } + + /** + * Attaches all fs, string, and binary attachments to the message. + * Returns an empty string on failure. + * @access private + * @return string + */ + function AttachAll() { + /* Return text of body */ + $mime = array(); + + /* Add all attachments */ + for($i = 0; $i < count($this->attachment); $i++) { + /* Check for string attachment */ + $bString = $this->attachment[$i][5]; + if ($bString) { + $string = $this->attachment[$i][0]; + } else { + $path = $this->attachment[$i][0]; + } + + $filename = $this->attachment[$i][1]; + $name = $this->attachment[$i][2]; + $encoding = $this->attachment[$i][3]; + $type = $this->attachment[$i][4]; + $disposition = $this->attachment[$i][6]; + $cid = $this->attachment[$i][7]; + + $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE); + $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $this->EncodeHeader($this->SecureHeader($name)), $this->LE); + $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE); + + if($disposition == 'inline') { + $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE); + } + + $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $this->EncodeHeader($this->SecureHeader($name)), $this->LE.$this->LE); + + /* Encode as string attachment */ + if($bString) { + $mime[] = $this->EncodeString($string, $encoding); + if($this->IsError()) { + return ''; + } + $mime[] = $this->LE.$this->LE; + } else { + $mime[] = $this->EncodeFile($path, $encoding); + if($this->IsError()) { + return ''; + } + $mime[] = $this->LE.$this->LE; + } + } + + $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE); + + return join('', $mime); + } + + /** + * Encodes attachment in requested format. Returns an + * empty string on failure. + * @access private + * @return string + */ + function EncodeFile ($path, $encoding = 'base64') { + if(!@$fd = fopen($path, 'rb')) { + $this->SetError($this->Lang('file_open') . $path); + return ''; + } + $magic_quotes = get_magic_quotes_runtime(); + @set_magic_quotes_runtime(0); + $file_buffer = fread($fd, filesize($path)); + $file_buffer = $this->EncodeString($file_buffer, $encoding); + fclose($fd); + @set_magic_quotes_runtime($magic_quotes); + + return $file_buffer; + } + + /** + * Encodes string to requested format. Returns an + * empty string on failure. + * @access private + * @return string + */ + function EncodeString ($str, $encoding = 'base64') { + $encoded = ''; + switch(strtolower($encoding)) { + case 'base64': + /* chunk_split is found in PHP >= 3.0.6 */ + $encoded = chunk_split(base64_encode($str), 76, $this->LE); + break; + case '7bit': + case '8bit': + $encoded = $this->FixEOL($str); + if (substr($encoded, -(strlen($this->LE))) != $this->LE) + $encoded .= $this->LE; + break; + case 'binary': + $encoded = $str; + break; + case 'quoted-printable': + $encoded = $this->EncodeQP($str); + break; + default: + $this->SetError($this->Lang('encoding') . $encoding); + break; + } + return $encoded; + } + + /** + * Encode a header string to best of Q, B, quoted or none. + * @access private + * @return string + */ + function EncodeHeader ($str, $position = 'text') { + $x = 0; + + switch (strtolower($position)) { + case 'phrase': + if (!preg_match('/[\200-\377]/', $str)) { + /* Can't use addslashes as we don't know what value has magic_quotes_sybase. */ + $encoded = addcslashes($str, "\0..\37\177\\\""); + if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) { + return ($encoded); + } else { + return ("\"$encoded\""); + } + } + $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches); + break; + case 'comment': + $x = preg_match_all('/[()"]/', $str, $matches); + /* Fall-through */ + case 'text': + default: + $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches); + break; + } + + if ($x == 0) { + return ($str); + } + + $maxlen = 75 - 7 - strlen($this->CharSet); + /* Try to select the encoding which should produce the shortest output */ + if (strlen($str)/3 < $x) { + $encoding = 'B'; + if (function_exists('mb_strlen') && $this->HasMultiBytes($str)) { + // Use a custom function which correctly encodes and wraps long + // multibyte strings without breaking lines within a character + $encoded = $this->Base64EncodeWrapMB($str); + } else { + $encoded = base64_encode($str); + $maxlen -= $maxlen % 4; + $encoded = trim(chunk_split($encoded, $maxlen, "\n")); + } + } else { + $encoding = 'Q'; + $encoded = $this->EncodeQ($str, $position); + $encoded = $this->WrapText($encoded, $maxlen, true); + $encoded = str_replace('='.$this->LE, "\n", trim($encoded)); + } + + $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded); + $encoded = trim(str_replace("\n", $this->LE, $encoded)); + + return $encoded; + } + + /** + * Checks if a string contains multibyte characters. + * @access private + * @param string $str multi-byte text to wrap encode + * @return bool + */ + function HasMultiBytes($str) { + if (function_exists('mb_strlen')) { + return (strlen($str) > mb_strlen($str, $this->CharSet)); + } else { // Assume no multibytes (we can't handle without mbstring functions anyway) + return False; + } + } + + /** + * Correctly encodes and wraps long multibyte strings for mail headers + * without breaking lines within a character. + * Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php + * @access private + * @param string $str multi-byte text to wrap encode + * @return string + */ + function Base64EncodeWrapMB($str) { + $start = "=?".$this->CharSet."?B?"; + $end = "?="; + $encoded = ""; + + $mb_length = mb_strlen($str, $this->CharSet); + // Each line must have length <= 75, including $start and $end + $length = 75 - strlen($start) - strlen($end); + // Average multi-byte ratio + $ratio = $mb_length / strlen($str); + // Base64 has a 4:3 ratio + $offset = $avgLength = floor($length * $ratio * .75); + + for ($i = 0; $i < $mb_length; $i += $offset) { + $lookBack = 0; + + do { + $offset = $avgLength - $lookBack; + $chunk = mb_substr($str, $i, $offset, $this->CharSet); + $chunk = base64_encode($chunk); + $lookBack++; + } + while (strlen($chunk) > $length); + + $encoded .= $chunk . $this->LE; + } + + // Chomp the last linefeed + $encoded = substr($encoded, 0, -strlen($this->LE)); + return $encoded; + } + + /** + * Encode string to quoted-printable. + * @access private + * @return string + */ + function EncodeQP( $input = '', $line_max = 76, $space_conv = false ) { + $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'); + $lines = preg_split('/(?:\r\n|\r|\n)/', $input); + $eol = "\r\n"; + $escape = '='; + $output = ''; + while( list(, $line) = each($lines) ) { + $linlen = strlen($line); + $newline = ''; + for($i = 0; $i < $linlen; $i++) { + $c = substr( $line, $i, 1 ); + $dec = ord( $c ); + if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E + $c = '=2E'; + } + if ( $dec == 32 ) { + if ( $i == ( $linlen - 1 ) ) { // convert space at eol only + $c = '=20'; + } else if ( $space_conv ) { + $c = '=20'; + } + } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required + $h2 = floor($dec/16); + $h1 = floor($dec%16); + $c = $escape.$hex[$h2].$hex[$h1]; + } + if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted + $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay + $newline = ''; + // check if newline first character will be point or not + if ( $dec == 46 ) { + $c = '=2E'; + } + } + $newline .= $c; + } // end of for + $output .= $newline.$eol; + } // end of while + return $output; + } + + /** + * Encode string to q encoding. + * @access private + * @return string + */ + function EncodeQ ($str, $position = 'text') { + /* There should not be any EOL in the string */ + $encoded = preg_replace("[\r\n]", '', $str); + + switch (strtolower($position)) { + case 'phrase': + $encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded); + break; + case 'comment': + $encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded); + case 'text': + default: + /* Replace every high ascii, control =, ? and _ characters */ + $encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e', + "'='.sprintf('%02X', ord('\\1'))", $encoded); + break; + } + + /* Replace every spaces to _ (more readable than =20) */ + $encoded = str_replace(' ', '_', $encoded); + + return $encoded; + } + + /** + * Adds a string or binary attachment (non-filesystem) to the list. + * This method can be used to attach ascii or binary data, + * such as a BLOB record from a database. + * @param string $string String attachment data. + * @param string $filename Name of the attachment. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return void + */ + function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') { + /* Append to $attachment array */ + $cur = count($this->attachment); + $this->attachment[$cur][0] = $string; + $this->attachment[$cur][1] = $filename; + $this->attachment[$cur][2] = $filename; + $this->attachment[$cur][3] = $encoding; + $this->attachment[$cur][4] = $type; + $this->attachment[$cur][5] = true; // isString + $this->attachment[$cur][6] = 'attachment'; + $this->attachment[$cur][7] = 0; + } + + /** + * Adds an embedded attachment. This can include images, sounds, and + * just about any other document. Make sure to set the $type to an + * image type. For JPEG images use "image/jpeg" and for GIF images + * use "image/gif". + * @param string $path Path to the attachment. + * @param string $cid Content ID of the attachment. Use this to identify + * the Id for accessing the image in an HTML form. + * @param string $name Overrides the attachment name. + * @param string $encoding File encoding (see $Encoding). + * @param string $type File extension (MIME) type. + * @return bool + */ + function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') { + + if(!@is_file($path)) { + $this->SetError($this->Lang('file_access') . $path); + return false; + } + + $filename = basename($path); + if($name == '') { + $name = $filename; + } + + /* Append to $attachment array */ + $cur = count($this->attachment); + $this->attachment[$cur][0] = $path; + $this->attachment[$cur][1] = $filename; + $this->attachment[$cur][2] = $name; + $this->attachment[$cur][3] = $encoding; + $this->attachment[$cur][4] = $type; + $this->attachment[$cur][5] = false; + $this->attachment[$cur][6] = 'inline'; + $this->attachment[$cur][7] = $cid; + + return true; + } + + /** + * Returns true if an inline attachment is present. + * @access private + * @return bool + */ + function InlineImageExists() { + $result = false; + for($i = 0; $i < count($this->attachment); $i++) { + if($this->attachment[$i][6] == 'inline') { + $result = true; + break; + } + } + + return $result; + } + + ///////////////////////////////////////////////// + // CLASS METHODS, MESSAGE RESET + ///////////////////////////////////////////////// + + /** + * Clears all recipients assigned in the TO array. Returns void. + * @return void + */ + function ClearAddresses() { + $this->to = array(); + } + + /** + * Clears all recipients assigned in the CC array. Returns void. + * @return void + */ + function ClearCCs() { + $this->cc = array(); + } + + /** + * Clears all recipients assigned in the BCC array. Returns void. + * @return void + */ + function ClearBCCs() { + $this->bcc = array(); + } + + /** + * Clears all recipients assigned in the ReplyTo array. Returns void. + * @return void + */ + function ClearReplyTos() { + $this->ReplyTo = array(); + } + + /** + * Clears all recipients assigned in the TO, CC and BCC + * array. Returns void. + * @return void + */ + function ClearAllRecipients() { + $this->to = array(); + $this->cc = array(); + $this->bcc = array(); + } + + /** + * Clears all previously set filesystem, string, and binary + * attachments. Returns void. + * @return void + */ + function ClearAttachments() { + $this->attachment = array(); + } + + /** + * Clears all custom headers. Returns void. + * @return void + */ + function ClearCustomHeaders() { + $this->CustomHeader = array(); + } + + ///////////////////////////////////////////////// + // CLASS METHODS, MISCELLANEOUS + ///////////////////////////////////////////////// + + /** + * Adds the error message to the error container. + * Returns void. + * @access private + * @return void + */ + function SetError($msg) { + $this->error_count++; + $this->ErrorInfo = $msg; + } + + /** + * Returns the proper RFC 822 formatted date. + * @access private + * @return string + */ + function RFCDate() { + $tz = date('Z'); + $tzs = ($tz < 0) ? '-' : '+'; + $tz = abs($tz); + $tz = (int)($tz/3600)*100 + ($tz%3600)/60; + $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz); + + return $result; + } + + /** + * Returns the appropriate server variable. Should work with both + * PHP 4.1.0+ as well as older versions. Returns an empty string + * if nothing is found. + * @access private + * @return mixed + */ + function ServerVar($varName) { + global $HTTP_SERVER_VARS; + global $HTTP_ENV_VARS; + + if(!isset($_SERVER)) { + $_SERVER = $HTTP_SERVER_VARS; + if(!isset($_SERVER['REMOTE_ADDR'])) { + $_SERVER = $HTTP_ENV_VARS; // must be Apache + } + } + + if(isset($_SERVER[$varName])) { + return $_SERVER[$varName]; + } else { + return ''; + } + } + + /** + * Returns the server hostname or 'localhost.localdomain' if unknown. + * @access private + * @return string + */ + function ServerHostname() { + if ($this->Hostname != '') { + $result = $this->Hostname; + } elseif ($this->ServerVar('SERVER_NAME') != '') { + $result = $this->ServerVar('SERVER_NAME'); + } else { + $result = 'localhost.localdomain'; + } + + return $result; + } + + /** + * Returns a message in the appropriate language. + * @access private + * @return string + */ + function Lang($key) { + if(count($this->language) < 1) { + $this->SetLanguage('en'); // set the default language + } + + if(isset($this->language[$key])) { + return $this->language[$key]; + } else { + return 'Language string failed to load: ' . $key; + } + } + + /** + * Returns true if an error occurred. + * @return bool + */ + function IsError() { + return ($this->error_count > 0); + } + + /** + * Changes every end of line from CR or LF to CRLF. + * @access private + * @return string + */ + function FixEOL($str) { + $str = str_replace("\r\n", "\n", $str); + $str = str_replace("\r", "\n", $str); + $str = str_replace("\n", $this->LE, $str); + return $str; + } + + /** + * Adds a custom header. + * @return void + */ + function AddCustomHeader($custom_header) { + $this->CustomHeader[] = explode(':', $custom_header, 2); + } + + /** + * Evaluates the message and returns modifications for inline images and backgrounds + * @access public + * @return $message + */ + function MsgHTML($message,$basedir='') { + preg_match_all("/(src|background)=\"(.*)\"/Ui", $message, $images); + if(isset($images[2])) { + foreach($images[2] as $i => $url) { + // do not change urls for absolute images (thanks to corvuscorax) + if (!preg_match('/^[A-z][A-z]*:\/\//',$url)) { + $filename = basename($url); + $directory = dirname($url); + ($directory == '.')?$directory='':''; + $cid = 'cid:' . md5($filename); + $fileParts = split("\.", $filename); + $ext = $fileParts[1]; + $mimeType = $this->_mime_types($ext); + if ( strlen($basedir) > 1 && substr($basedir,-1) != '/') { $basedir .= '/'; } + if ( strlen($directory) > 1 && substr($directory,-1) != '/') { $directory .= '/'; } + if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64',$mimeType) ) { + $message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message); + } + } + } + } + $this->IsHTML(true); + $this->Body = $message; + $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message))); + if ( !empty($textMsg) && empty($this->AltBody) ) { + $this->AltBody = html_entity_decode($textMsg); + } + if ( empty($this->AltBody) ) { + $this->AltBody = 'To view this email message, open the email in with HTML compatibility!' . "\n\n"; + } + } + + /** + * Gets the mime type of the embedded or inline image + * @access private + * @return mime type of ext + */ + function _mime_types($ext = '') { + $mimes = array( + 'ai' => 'application/postscript', + 'aif' => 'audio/x-aiff', + 'aifc' => 'audio/x-aiff', + 'aiff' => 'audio/x-aiff', + 'avi' => 'video/x-msvideo', + 'bin' => 'application/macbinary', + 'bmp' => 'image/bmp', + 'class' => 'application/octet-stream', + 'cpt' => 'application/mac-compactpro', + 'css' => 'text/css', + 'dcr' => 'application/x-director', + 'dir' => 'application/x-director', + 'dll' => 'application/octet-stream', + 'dms' => 'application/octet-stream', + 'doc' => 'application/msword', + 'dvi' => 'application/x-dvi', + 'dxr' => 'application/x-director', + 'eml' => 'message/rfc822', + 'eps' => 'application/postscript', + 'exe' => 'application/octet-stream', + 'gif' => 'image/gif', + 'gtar' => 'application/x-gtar', + 'htm' => 'text/html', + 'html' => 'text/html', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'hqx' => 'application/mac-binhex40', + 'js' => 'application/x-javascript', + 'lha' => 'application/octet-stream', + 'log' => 'text/plain', + 'lzh' => 'application/octet-stream', + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mif' => 'application/vnd.mif', + 'mov' => 'video/quicktime', + 'movie' => 'video/x-sgi-movie', + 'mp2' => 'audio/mpeg', + 'mp3' => 'audio/mpeg', + 'mpe' => 'video/mpeg', + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpga' => 'audio/mpeg', + 'oda' => 'application/oda', + 'pdf' => 'application/pdf', + 'php' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'php4' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'phtml' => 'application/x-httpd-php', + 'png' => 'image/png', + 'ppt' => 'application/vnd.ms-powerpoint', + 'ps' => 'application/postscript', + 'psd' => 'application/octet-stream', + 'qt' => 'video/quicktime', + 'ra' => 'audio/x-realaudio', + 'ram' => 'audio/x-pn-realaudio', + 'rm' => 'audio/x-pn-realaudio', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'rtf' => 'text/rtf', + 'rtx' => 'text/richtext', + 'rv' => 'video/vnd.rn-realvideo', + 'sea' => 'application/octet-stream', + 'shtml' => 'text/html', + 'sit' => 'application/x-stuffit', + 'so' => 'application/octet-stream', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'swf' => 'application/x-shockwave-flash', + 'tar' => 'application/x-tar', + 'text' => 'text/plain', + 'txt' => 'text/plain', + 'tgz' => 'application/x-tar', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'wav' => 'audio/x-wav', + 'wbxml' => 'application/vnd.wap.wbxml', + 'wmlc' => 'application/vnd.wap.wmlc', + 'word' => 'application/msword', + 'xht' => 'application/xhtml+xml', + 'xhtml' => 'application/xhtml+xml', + 'xl' => 'application/excel', + 'xls' => 'application/vnd.ms-excel', + 'xml' => 'text/xml', + 'xsl' => 'text/xml', + 'zip' => 'application/zip' + ); + return ( ! isset($mimes[strtolower($ext)])) ? 'application/octet-stream' : $mimes[strtolower($ext)]; + } + + /** + * Set (or reset) Class Objects (variables) + * + * Usage Example: + * $page->set('X-Priority', '3'); + * + * @access public + * @param string $name Parameter Name + * @param mixed $value Parameter Value + * NOTE: will not work with arrays, there are no arrays to set/reset + */ + function set ( $name, $value = '' ) { + if ( isset($this->$name) ) { + $this->$name = $value; + } else { + $this->SetError('Cannot set or reset variable ' . $name); + return false; + } + } + + /** + * Read a file from a supplied filename and return it. + * + * @access public + * @param string $filename Parameter File Name + */ + function getFile($filename) { + $return = ''; + if ($fp = fopen($filename, 'rb')) { + while (!feof($fp)) { + $return .= fread($fp, 1024); + } + fclose($fp); + return $return; + } else { + return false; + } + } + + /** + * Strips newlines to prevent header injection. + * @access private + * @param string $str String + * @return string + */ + function SecureHeader($str) { + $str = trim($str); + $str = str_replace("\r", "", $str); + $str = str_replace("\n", "", $str); + return $str; + } + + /** + * Set the private key file and password to sign the message. + * + * @access public + * @param string $key_filename Parameter File Name + * @param string $key_pass Password for private key + */ + function Sign($cert_filename, $key_filename, $key_pass) { + $this->sign_cert_file = $cert_filename; + $this->sign_key_file = $key_filename; + $this->sign_key_pass = $key_pass; + } + +} + +?> \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/class.pop3.php b/plugin/PHPMailer_v2.0.4/class.pop3.php new file mode 100644 index 000000000..0a6d8d45a --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/class.pop3.php @@ -0,0 +1,436 @@ +pop_conn = 0; + $this->connected = false; + $this->error = null; + } + + /** + * Combination of public events - connect, login, disconnect + * + * @param string $host + * @param integer $port + * @param integer $tval + * @param string $username + * @param string $password + */ + function Authorise ($host, $port = false, $tval = false, $username, $password, $debug_level = 0) + { + $this->host = $host; + + // If no port value is passed, retrieve it + if ($port == false) + { + $this->port = $this->POP3_PORT; + } + else + { + $this->port = $port; + } + + // If no port value is passed, retrieve it + if ($tval == false) + { + $this->tval = $this->POP3_TIMEOUT; + } + else + { + $this->tval = $tval; + } + + $this->do_debug = $debug_level; + $this->username = $username; + $this->password = $password; + + // Refresh the error log + $this->error = null; + + // Connect + $result = $this->Connect($this->host, $this->port, $this->tval); + + if ($result) + { + $login_result = $this->Login($this->username, $this->password); + + if ($login_result) + { + $this->Disconnect(); + + return true; + } + + } + + // We need to disconnect regardless if the login succeeded + $this->Disconnect(); + + return false; + } + + /** + * Connect to the POP3 server + * + * @param string $host + * @param integer $port + * @param integer $tval + * @return boolean + */ + function Connect ($host, $port = false, $tval = 30) + { + // Are we already connected? + if ($this->connected) + { + return true; + } + + /* + On Windows this will raise a PHP Warning error if the hostname doesn't exist. + Rather than supress it with @fsockopen, let's capture it cleanly instead + */ + + set_error_handler(array(&$this, 'catchWarning')); + + // Connect to the POP3 server + $this->pop_conn = fsockopen($host, // POP3 Host + $port, // Port # + $errno, // Error Number + $errstr, // Error Message + $tval); // Timeout (seconds) + + // Restore the error handler + restore_error_handler(); + + // Does the Error Log now contain anything? + if ($this->error && $this->do_debug >= 1) + { + $this->displayErrors(); + } + + // Did we connect? + if ($this->pop_conn == false) + { + // It would appear not... + $this->error = array( + 'error' => "Failed to connect to server $host on port $port", + 'errno' => $errno, + 'errstr' => $errstr + ); + + if ($this->do_debug >= 1) + { + $this->displayErrors(); + } + + return false; + } + + // Increase the stream time-out + + // Check for PHP 4.3.0 or later + if (version_compare(phpversion(), '4.3.0', 'ge')) + { + stream_set_timeout($this->pop_conn, $tval, 0); + } + else + { + // Does not work on Windows + if (substr(PHP_OS, 0, 3) !== 'WIN') + { + socket_set_timeout($this->pop_conn, $tval, 0); + } + } + + // Get the POP3 server response + $pop3_response = $this->getResponse(); + + // Check for the +OK + if ($this->checkResponse($pop3_response)) + { + // The connection is established and the POP3 server is talking + $this->connected = true; + return true; + } + + } + + /** + * Login to the POP3 server (does not support APOP yet) + * + * @param string $username + * @param string $password + * @return boolean + */ + function Login ($username = '', $password = '') + { + if ($this->connected == false) + { + $this->error = 'Not connected to POP3 server'; + + if ($this->do_debug >= 1) + { + $this->displayErrors(); + } + } + + if (empty($username)) + { + $username = $this->username; + } + + if (empty($password)) + { + $password = $this->password; + } + + $pop_username = "USER $username" . $this->CRLF; + $pop_password = "PASS $password" . $this->CRLF; + + // Send the Username + $this->sendString($pop_username); + $pop3_response = $this->getResponse(); + + if ($this->checkResponse($pop3_response)) + { + // Send the Password + $this->sendString($pop_password); + $pop3_response = $this->getResponse(); + + if ($this->checkResponse($pop3_response)) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + + /** + * Disconnect from the POP3 server + */ + function Disconnect () + { + $this->sendString('QUIT'); + + fclose($this->pop_conn); + } + + /* + --------------- + Private Methods + --------------- + */ + + /** + * Get the socket response back. + * $size is the maximum number of bytes to retrieve + * + * @param integer $size + * @return string + */ + function getResponse ($size = 128) + { + $pop3_response = fgets($this->pop_conn, $size); + + return $pop3_response; + } + + /** + * Send a string down the open socket connection to the POP3 server + * + * @param string $string + * @return integer + */ + function sendString ($string) + { + $bytes_sent = fwrite($this->pop_conn, $string, strlen($string)); + + return $bytes_sent; + + } + + /** + * Checks the POP3 server response for +OK or -ERR + * + * @param string $string + * @return boolean + */ + function checkResponse ($string) + { + if (substr($string, 0, 3) !== '+OK') + { + $this->error = array( + 'error' => "Server reported an error: $string", + 'errno' => 0, + 'errstr' => '' + ); + + if ($this->do_debug >= 1) + { + $this->displayErrors(); + } + + return false; + } + else + { + return true; + } + + } + + /** + * If debug is enabled, display the error message array + * + */ + function displayErrors () + { + echo '

    ';
    +
    +      foreach ($this->error as $single_error)
    +    {
    +        print_r($single_error);
    +    }
    +
    +      echo '
    '; + } + + /** + * Takes over from PHP for the socket warning handler + * + * @param integer $errno + * @param string $errstr + * @param string $errfile + * @param integer $errline + */ + function catchWarning ($errno, $errstr, $errfile, $errline) + { + $this->error[] = array( + 'error' => "Connecting to the POP3 server raised a PHP warning: ", + 'errno' => $errno, + 'errstr' => $errstr + ); + } + + // End of class +} +?> diff --git a/plugin/PHPMailer_v2.0.4/class.smtp.php b/plugin/PHPMailer_v2.0.4/class.smtp.php new file mode 100644 index 000000000..be084a116 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/class.smtp.php @@ -0,0 +1,1062 @@ +smtp_conn = 0; + $this->error = null; + $this->helo_rply = null; + + $this->do_debug = 0; + } + + /************************************************************* + * CONNECTION FUNCTIONS * + ***********************************************************/ + + /** + * Connect to the server specified on the port specified. + * If the port is not specified use the default SMTP_PORT. + * If tval is specified then a connection will try and be + * established with the server for that number of seconds. + * If tval is not specified the default is 30 seconds to + * try on the connection. + * + * SMTP CODE SUCCESS: 220 + * SMTP CODE FAILURE: 421 + * @access public + * @return bool + */ + function Connect($host,$port=0,$tval=30) { + # set the error val to null so there is no confusion + $this->error = null; + + # make sure we are __not__ connected + if($this->connected()) { + # ok we are connected! what should we do? + # for now we will just give an error saying we + # are already connected + $this->error = array("error" => "Already connected to a server"); + return false; + } + + if(empty($port)) { + $port = $this->SMTP_PORT; + } + + #connect to the smtp server + $this->smtp_conn = fsockopen($host, # the host of the server + $port, # the port to use + $errno, # error number if any + $errstr, # error message if any + $tval); # give up after ? secs + # verify we connected properly + if(empty($this->smtp_conn)) { + $this->error = array("error" => "Failed to connect to server", + "errno" => $errno, + "errstr" => $errstr); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": $errstr ($errno)" . $this->CRLF; + } + return false; + } + + # sometimes the SMTP server takes a little longer to respond + # so we will give it a longer timeout for the first read + // Windows still does not have support for this timeout function + if(substr(PHP_OS, 0, 3) != "WIN") + socket_set_timeout($this->smtp_conn, $tval, 0); + + # get any announcement stuff + $announce = $this->get_lines(); + + # set the timeout of any socket functions at 1/10 of a second + //if(function_exists("socket_set_timeout")) + // socket_set_timeout($this->smtp_conn, 0, 100000); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $announce; + } + + return true; + } + + /** + * Performs SMTP authentication. Must be run after running the + * Hello() method. Returns true if successfully authenticated. + * @access public + * @return bool + */ + function Authenticate($username, $password) { + // Start authentication + fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 334) { + $this->error = + array("error" => "AUTH not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + // Send encoded username + fputs($this->smtp_conn, base64_encode($username) . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 334) { + $this->error = + array("error" => "Username not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + // Send encoded password + fputs($this->smtp_conn, base64_encode($password) . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($code != 235) { + $this->error = + array("error" => "Password not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + return true; + } + + /** + * Returns true if connected to a server otherwise false + * @access private + * @return bool + */ + function Connected() { + if(!empty($this->smtp_conn)) { + $sock_status = socket_get_status($this->smtp_conn); + if($sock_status["eof"]) { + # hmm this is an odd situation... the socket is + # valid but we are not connected anymore + if($this->do_debug >= 1) { + echo "SMTP -> NOTICE:" . $this->CRLF . + "EOF caught while checking if connected"; + } + $this->Close(); + return false; + } + return true; # everything looks good + } + return false; + } + + /** + * Closes the socket and cleans up the state of the class. + * It is not considered good to use this function without + * first trying to use QUIT. + * @access public + * @return void + */ + function Close() { + $this->error = null; # so there is no confusion + $this->helo_rply = null; + if(!empty($this->smtp_conn)) { + # close the connection and cleanup + fclose($this->smtp_conn); + $this->smtp_conn = 0; + } + } + + /*************************************************************** + * SMTP COMMANDS * + *************************************************************/ + + /** + * Issues a data command and sends the msg_data to the server + * finializing the mail transaction. $msg_data is the message + * that is to be send with the headers. Each header needs to be + * on a single line followed by a with the message headers + * and the message body being seperated by and additional . + * + * Implements rfc 821: DATA + * + * SMTP CODE INTERMEDIATE: 354 + * [data] + * . + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 552,554,451,452 + * SMTP CODE FAILURE: 451,554 + * SMTP CODE ERROR : 500,501,503,421 + * @access public + * @return bool + */ + function Data($msg_data) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Data() without being connected"); + return false; + } + + fputs($this->smtp_conn,"DATA" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 354) { + $this->error = + array("error" => "DATA command not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + # the server is ready to accept data! + # according to rfc 821 we should not send more than 1000 + # including the CRLF + # characters on a single line so we will break the data up + # into lines by \r and/or \n then if needed we will break + # each of those into smaller lines to fit within the limit. + # in addition we will be looking for lines that start with + # a period '.' and append and additional period '.' to that + # line. NOTE: this does not count towards are limit. + + # normalize the line breaks so we know the explode works + $msg_data = str_replace("\r\n","\n",$msg_data); + $msg_data = str_replace("\r","\n",$msg_data); + $lines = explode("\n",$msg_data); + + # we need to find a good way to determine is headers are + # in the msg_data or if it is a straight msg body + # currently I am assuming rfc 822 definitions of msg headers + # and if the first field of the first line (':' sperated) + # does not contain a space then it _should_ be a header + # and we can process all lines before a blank "" line as + # headers. + $field = substr($lines[0],0,strpos($lines[0],":")); + $in_headers = false; + if(!empty($field) && !strstr($field," ")) { + $in_headers = true; + } + + $max_line_length = 998; # used below; set here for ease in change + + while(list(,$line) = @each($lines)) { + $lines_out = null; + if($line == "" && $in_headers) { + $in_headers = false; + } + # ok we need to break this line up into several + # smaller lines + while(strlen($line) > $max_line_length) { + $pos = strrpos(substr($line,0,$max_line_length)," "); + + # Patch to fix DOS attack + if(!$pos) { + $pos = $max_line_length - 1; + } + + $lines_out[] = substr($line,0,$pos); + $line = substr($line,$pos + 1); + # if we are processing headers we need to + # add a LWSP-char to the front of the new line + # rfc 822 on long msg headers + if($in_headers) { + $line = "\t" . $line; + } + } + $lines_out[] = $line; + + # now send the lines to the server + while(list(,$line_out) = @each($lines_out)) { + if(strlen($line_out) > 0) + { + if(substr($line_out, 0, 1) == ".") { + $line_out = "." . $line_out; + } + } + fputs($this->smtp_conn,$line_out . $this->CRLF); + } + } + + # ok all the message data has been sent so lets get this + # over with aleady + fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "DATA not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Expand takes the name and asks the server to list all the + * people who are members of the _list_. Expand will return + * back and array of the result or false if an error occurs. + * Each value in the array returned has the format of: + * [ ] + * The definition of is defined in rfc 821 + * + * Implements rfc 821: EXPN + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 550 + * SMTP CODE ERROR : 500,501,502,504,421 + * @access public + * @return string array + */ + function Expand($name) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Expand() without being connected"); + return false; + } + + fputs($this->smtp_conn,"EXPN " . $name . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "EXPN not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + # parse the reply and place in our array to return to user + $entries = explode($this->CRLF,$rply); + while(list(,$l) = @each($entries)) { + $list[] = substr($l,4); + } + + return $list; + } + + /** + * Sends the HELO command to the smtp server. + * This makes sure that we and the server are in + * the same known state. + * + * Implements from rfc 821: HELO + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500, 501, 504, 421 + * @access public + * @return bool + */ + function Hello($host="") { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Hello() without being connected"); + return false; + } + + # if a hostname for the HELO was not specified determine + # a suitable one to send + if(empty($host)) { + # we need to determine some sort of appopiate default + # to send to the server + $host = "localhost"; + } + + // Send extended hello first (RFC 2821) + if(!$this->SendHello("EHLO", $host)) + { + if(!$this->SendHello("HELO", $host)) + return false; + } + + return true; + } + + /** + * Sends a HELO/EHLO command. + * @access private + * @return bool + */ + function SendHello($hello, $host) { + fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER: " . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => $hello . " not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + $this->helo_rply = $rply; + + return true; + } + + /** + * Gets help information on the keyword specified. If the keyword + * is not specified then returns generic help, ussually contianing + * A list of keywords that help is available on. This function + * returns the results back to the user. It is up to the user to + * handle the returned data. If an error occurs then false is + * returned with $this->error set appropiately. + * + * Implements rfc 821: HELP [ ] + * + * SMTP CODE SUCCESS: 211,214 + * SMTP CODE ERROR : 500,501,502,504,421 + * @access public + * @return string + */ + function Help($keyword="") { + $this->error = null; # to avoid confusion + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Help() without being connected"); + return false; + } + + $extra = ""; + if(!empty($keyword)) { + $extra = " " . $keyword; + } + + fputs($this->smtp_conn,"HELP" . $extra . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 211 && $code != 214) { + $this->error = + array("error" => "HELP not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + return $rply; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. + * + * Implements rfc 821: MAIL FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,421 + * @access public + * @return bool + */ + function Mail($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Mail() without being connected"); + return false; + } + + $useVerp = ($this->do_verp ? "XVERP" : ""); + fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "MAIL not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Sends the command NOOP to the SMTP server. + * + * Implements from rfc 821: NOOP + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500, 421 + * @access public + * @return bool + */ + function Noop() { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Noop() without being connected"); + return false; + } + + fputs($this->smtp_conn,"NOOP" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "NOOP not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Sends the quit command to the server and then closes the socket + * if there is no error or the $close_on_error argument is true. + * + * Implements from rfc 821: QUIT + * + * SMTP CODE SUCCESS: 221 + * SMTP CODE ERROR : 500 + * @access public + * @return bool + */ + function Quit($close_on_error=true) { + $this->error = null; # so there is no confusion + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Quit() without being connected"); + return false; + } + + # send the quit command to the server + fputs($this->smtp_conn,"quit" . $this->CRLF); + + # get any good-bye messages + $byemsg = $this->get_lines(); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $byemsg; + } + + $rval = true; + $e = null; + + $code = substr($byemsg,0,3); + if($code != 221) { + # use e as a tmp var cause Close will overwrite $this->error + $e = array("error" => "SMTP server rejected quit command", + "smtp_code" => $code, + "smtp_rply" => substr($byemsg,4)); + $rval = false; + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $e["error"] . ": " . + $byemsg . $this->CRLF; + } + } + + if(empty($e) || $close_on_error) { + $this->Close(); + } + + return $rval; + } + + /** + * Sends the command RCPT to the SMTP server with the TO: argument of $to. + * Returns true if the recipient was accepted false if it was rejected. + * + * Implements from rfc 821: RCPT TO: + * + * SMTP CODE SUCCESS: 250,251 + * SMTP CODE FAILURE: 550,551,552,553,450,451,452 + * SMTP CODE ERROR : 500,501,503,421 + * @access public + * @return bool + */ + function Recipient($to) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Recipient() without being connected"); + return false; + } + + fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250 && $code != 251) { + $this->error = + array("error" => "RCPT not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Sends the RSET command to abort and transaction that is + * currently in progress. Returns true if successful false + * otherwise. + * + * Implements rfc 821: RSET + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE ERROR : 500,501,504,421 + * @access public + * @return bool + */ + function Reset() { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Reset() without being connected"); + return false; + } + + fputs($this->smtp_conn,"RSET" . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "RSET failed", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + + return true; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. This command + * will send the message to the users terminal if they are logged + * in. + * + * Implements rfc 821: SEND FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + function Send($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Send() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SEND FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "SEND not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. This command + * will send the message to the users terminal if they are logged + * in and send them an email. + * + * Implements rfc 821: SAML FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + function SendAndMail($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called SendAndMail() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "SAML not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * Starts a mail transaction from the email address specified in + * $from. Returns true if successful or false otherwise. If True + * the mail transaction is started and then one or more Recipient + * commands may be called followed by a Data command. This command + * will send the message to the users terminal if they are logged + * in or mail it to them if they are not. + * + * Implements rfc 821: SOML FROM: + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE SUCCESS: 552,451,452 + * SMTP CODE SUCCESS: 500,501,502,421 + * @access public + * @return bool + */ + function SendOrMail($from) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called SendOrMail() without being connected"); + return false; + } + + fputs($this->smtp_conn,"SOML FROM:" . $from . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250) { + $this->error = + array("error" => "SOML not accepted from server", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return true; + } + + /** + * This is an optional command for SMTP that this class does not + * support. This method is here to make the RFC821 Definition + * complete for this class and __may__ be implimented in the future + * + * Implements from rfc 821: TURN + * + * SMTP CODE SUCCESS: 250 + * SMTP CODE FAILURE: 502 + * SMTP CODE ERROR : 500, 503 + * @access public + * @return bool + */ + function Turn() { + $this->error = array("error" => "This method, TURN, of the SMTP ". + "is not implemented"); + if($this->do_debug >= 1) { + echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF; + } + return false; + } + + /** + * Verifies that the name is recognized by the server. + * Returns false if the name could not be verified otherwise + * the response from the server is returned. + * + * Implements rfc 821: VRFY + * + * SMTP CODE SUCCESS: 250,251 + * SMTP CODE FAILURE: 550,551,553 + * SMTP CODE ERROR : 500,501,502,421 + * @access public + * @return int + */ + function Verify($name) { + $this->error = null; # so no confusion is caused + + if(!$this->connected()) { + $this->error = array( + "error" => "Called Verify() without being connected"); + return false; + } + + fputs($this->smtp_conn,"VRFY " . $name . $this->CRLF); + + $rply = $this->get_lines(); + $code = substr($rply,0,3); + + if($this->do_debug >= 2) { + echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply; + } + + if($code != 250 && $code != 251) { + $this->error = + array("error" => "VRFY failed on name '$name'", + "smtp_code" => $code, + "smtp_msg" => substr($rply,4)); + if($this->do_debug >= 1) { + echo "SMTP -> ERROR: " . $this->error["error"] . + ": " . $rply . $this->CRLF; + } + return false; + } + return $rply; + } + + /******************************************************************* + * INTERNAL FUNCTIONS * + ******************************************************************/ + + /** + * Read in as many lines as possible + * either before eof or socket timeout occurs on the operation. + * With SMTP we can tell if we have more lines to read if the + * 4th character is '-' symbol. If it is a space then we don't + * need to read anything else. + * @access private + * @return string + */ + function get_lines() { + $data = ""; + while($str = @fgets($this->smtp_conn,515)) { + if($this->do_debug >= 4) { + echo "SMTP -> get_lines(): \$data was \"$data\"" . + $this->CRLF; + echo "SMTP -> get_lines(): \$str is \"$str\"" . + $this->CRLF; + } + $data .= $str; + if($this->do_debug >= 4) { + echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF; + } + # if the 4th character is a space then we are done reading + # so just break the loop + if(substr($str,3,1) == " ") { break; } + } + return $data; + } + +} + + + ?> diff --git a/plugin/PHPMailer_v2.0.4/codeworxtech.html b/plugin/PHPMailer_v2.0.4/codeworxtech.html new file mode 100644 index 000000000..68ccaa931 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/codeworxtech.html @@ -0,0 +1,121 @@ + + + + + + +
    +
    +
    +The http://phpmailer.codeworxtech.com/ website now carries a few +advertisements through the Google Adsense network to help offset +some of our costs.
    +Thanks ....
    +
    +

    My name is Andy Prevost, AKA "codeworxtech".
    +www.codeworxtech.com for more information.
    +

    +

    WHY USE OUR TOOLS & WHAT'S IN IT FOR YOU?

    +

    A valid question. We're developers too. We've been writing software, primarily for the internet, for more than 15 years. Along the way, there are two major things that had tremendous impact of our company: PHP and Open Source. PHP is without doubt the most popular platform for the internet. There has been more progress in this area of technology because of Open Source software than in any other IT segment. We have used many open source tools, some as learning tools, some as components in projects we were working on. To us, it's not about popularity ... we're committed to robust, stable, and efficient tools you can use to get your projects in your user's hands quickly. So the shorter answer: what's in it for you? rapid development and rapid deployment without fuss and with straight forward open source licensing.

    +

    Now, the introductions:

    +

    Our company, Worx International Inc., is the publisher of several Open Source applications and developer tools as well as several commercial PHP applications. The Open Source applications are ttCMS and DCP Portal. The Open Source developer tools include QuickComponents (QuickSkin and QuickCache) and now PHPMailer. +We have staff and offices in the United States, Caribbean, the Middle +East, and our primary development center in Canada. Our company is represented by +agents and resellers globally.

    +

    Worx International Inc. is at the forefront of developing PHP applications. Our staff are all Zend Certified university educated and experts at object oriented programming. While Worx International Inc. can handle any project from trouble shooting programs written by others all the way to finished mission-critical applications, we specialize in taking projects from inception all the way through to implementation - on budget, and on time. If you need help with your projects, we're the team to get it done right at a reasonable price.

    +

    Over the years, there have been a number of tools that have been constant favorites in all of our projects. We have become the project administrators for most of these tools.

    +

    Our developer tools are all Open Source. Here's a brief description:

    +
      +
    • PHPMailer. Originally authored by Brent Matzelle, PHPMailer is the leading "email transfer class" for PHP. PHPMailer is downloaded more than 18000 times each and every month by developers looking for a stable, simple email solution. We used it ourselves for years as our favorite tool. It's always been small (the entire footprint is around 100 Kb), stable, and as complete a solution as you can find. Other tools are nowhere near as simple. And more importantly, most of our applications (including PHPMailer) is implemented in a smaller footprint than one competing email class. Our thanks to Brent Matzelle for this superb tool - our commitment is to keep it lean, keep it focused, and compliant with standards. Visit the PHPMailer website at + http://phpmailer.codeworxtech.com/.
      + Please note: all of our focus is now on the PHPMailer for PHP5.
      + PS. While you are at it, please visit our sponsor's sites, click on their ads. + It helps offset some of our costs.
      + Want to help? We're looking for progressive developers to join our team of volunteer professionals working on PHPMailer. Our entire focus is on PHPMailer for PHP5, and our next major task is to enhance our + exception/error handling with PHP 5's object oriented try/throw/catch mechanisms. If you are interested, let us know.
      +
      +
    • +
    • QuickCache. Originally authored by Jean Pierre Deckers as jpCache, QuickCache is an HTTP OpCode caching strategy that works on your entire site with only one line of code at the top of your script. The cached pages can be stored as files or as database objects. The benefits are absolutely astounding: bandwidth savings of up to 80% and screen display times increased by 8 - 10x. Visit the QuickCache website at + http://quickcache.codeworxtech.com/.
      +
      +
    • +
    • QuickSkin. Originally authored by Philipp v. Criegern and named "SmartTemplate". The project was taken over by Manuel 'EndelWar' Dalla Lana and now by "codeworxtech". QuickSkin is one of the truly outstanding templating engines available, but has always been confused with Smarty Templating Engine. QuickSkin is even more relevant today than when it was launched. It's a small footprint with big impact on your projects. It features a built in caching technology, token based substitution, and works on the concept of one single HTML file as the template. The HTML template file can contain variable information making it one small powerful tool for your developer tool kit. Visit the QuickSkin website at + http://quickskin.codeworxtech.com/.
      +
      +
    • +
    +

    We're committed to PHP and to the Open Source community.

    +

    Opportunities with Worx International Inc.:

    +
      +
    • Resellers/Agents: We're always interested in talking with companies that +want to represent +Worx International Inc. in their markets. We also have private label programs for our commercial products (in certain circumstances).
    • +
    • Programmers/Developers: We are usually fully staffed, however, if you would like to be considered for a career with +Worx International Inc., we would be pleased to hear from you.
      +A few things to note:
      +
        +
      • experience level does not matter: from fresh out of college to multi-year experience - it's your + creative mind and a positive attitude we want
      • +
      • if you contact us looking for employment, include a cover letter, indicate what type of work/career you are looking for and expected compensation
      • +
      • if you are representing someone else looking for work, do not contact us. We have an exclusive relationship with a recruiting partner already and not interested in altering the arrangement. We will not hire your candidate under any circumstances unless they wish to approach us individually.
      • +
      • any contact that ignores any of these points will be discarded
      • +
    • +
    • Affiliates/Partnerships: We are interested in partnering with other firms who are leaders in their field. We clearly understand that successful companies are built on successful relationships in all industries world-wide. We currently have innovative relationships throughout the world that are mutually beneficial. Drop us a line and let's talk.
    • +
    +Regards,
    +Andy Prevost (aka, codeworxtech)
    +codeworxtech@users.sourceforge.net
    +
    +We now also offer website design. hosting, and remote forms processing. Visit WorxStudio.com for more information.
    +
    +
    + + diff --git a/plugin/PHPMailer_v2.0.4/docs/extending.html b/plugin/PHPMailer_v2.0.4/docs/extending.html new file mode 100644 index 000000000..f7c3200af --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/docs/extending.html @@ -0,0 +1,148 @@ + + +Examples using phpmailer + + + + +

    Examples using phpmailer

    + +

    1. Advanced Example

    +

    + +This demonstrates sending out multiple email messages with binary attachments +from a MySQL database with multipart/alternative support.

    + + + + +
    +
    +require("class.phpmailer.php");
    +
    +$mail = new phpmailer();
    +
    +$mail->From     = "list@example.com";
    +$mail->FromName = "List manager";
    +$mail->Host     = "smtp1.example.com;smtp2.example.com";
    +$mail->Mailer   = "smtp";
    +
    +@MYSQL_CONNECT("localhost","root","password");
    +@mysql_select_db("my_company");
    +$query ="SELECT full_name, email,photoFROM employeeWHEREid=$id";
    +$result=@MYSQL_QUERY($query);
    +
    +while ($row = mysql_fetch_array ($result))
    +{
    +    // HTML body
    +    $body  = "Hello <font size=\"4\">" . $row["full_name"] . "</font>, <p>";
    +    $body .= "<i>Your</i> personal photograph to this message.<p>";
    +    $body .= "Sincerely, <br>";
    +    $body .= "phpmailer List manager";
    +
    +    // Plain text body (for mail clients that cannot read HTML)
    +    $text_body  = "Hello " . $row["full_name"] . ", \n\n";
    +    $text_body .= "Your personal photograph to this message.\n\n";
    +    $text_body .= "Sincerely, \n";
    +    $text_body .= "phpmailer List manager";
    +
    +    $mail->Body    = $body;
    +    $mail->AltBody = $text_body;
    +    $mail->AddAddress($row["email"], $row["full_name"]);
    +    $mail->AddStringAttachment($row["photo"], "YourPhoto.jpg");
    +
    +    if(!$mail->Send())
    +        echo "There has been a mail error sending to " . $row["email"] . "<br>";
    +
    +    // Clear all addresses and attachments for next loop
    +    $mail->ClearAddresses();
    +    $mail->ClearAttachments();
    +}
    +
    +
    +

    + +

    2. Extending phpmailer

    +

    + +Extending classes with inheritance is one of the most +powerful features of object-oriented +programming. It allows you to make changes to the +original class for your +own personal use without hacking the original +classes. Plus, it is very +easy to do. I've provided an example: + +

    +Here's a class that extends the phpmailer class and sets the defaults +for the particular site:
    +PHP include file: mail.inc.php +

    + + + + + +
    +
    +require("class.phpmailer.php");
    +
    +class my_phpmailer extends phpmailer {
    +    // Set default variables for all new objects
    +    var $From     = "from@example.com";
    +    var $FromName = "Mailer";
    +    var $Host     = "smtp1.example.com;smtp2.example.com";
    +    var $Mailer   = "smtp";                         // Alternative to IsSMTP()
    +    var $WordWrap = 75;
    +
    +    // Replace the default error_handler
    +    function error_handler($msg) {
    +        print("My Site Error");
    +        print("Description:");
    +        printf("%s", $msg);
    +        exit;
    +    }
    +
    +    // Create an additional function
    +    function do_something($something) {
    +        // Place your new code here
    +    }
    +}
    +
    +
    + +Now here's a normal PHP page in the site, which will have all the defaults set +above:
    +Normal PHP file: mail_test.php +

    + + + + + +
    +
    +require("mail.inc.php");
    +
    +// Instantiate your new class
    +$mail = new my_phpmailer;
    +
    +// Now you only need to add the necessary stuff
    +$mail->AddAddress("josh@example.com", "Josh Adams");
    +$mail->Subject = "Here is the subject";
    +$mail->Body    = "This is the message body";
    +$mail->AddAttachment("c:/temp/11-10-00.zip", "new_name.zip");  // optional name
    +
    +if(!$mail->Send())
    +{
    +   echo "There was an error sending the message";
    +   exit;
    +}
    +
    +echo "Message was sent successfully";
    +
    +
    +

    + + + diff --git a/plugin/PHPMailer_v2.0.4/docs/faq.html b/plugin/PHPMailer_v2.0.4/docs/faq.html new file mode 100644 index 000000000..54ac18370 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/docs/faq.html @@ -0,0 +1,67 @@ + + +PHPMailer FAQ + + + +
    +
    +

    PHPMailer FAQ

    +
      + +
    • Q: I'm using the SMTP mailer and I keep on getting a timeout message + well before the X seconds I set it for. What gives?
      + A: PHP versions 4.0.4pl1 and earlier have a bug in which sockets timeout + early. You can fix this by re-compiling PHP 4.0.4pl1 with this fix: + timeoutfix.diff. Otherwise you can wait for the new PHP release.

    • + +
    • Q: I am concerned that using include files will take up too much + processing time on my computer. How can I make it run faster?
      + A: PHP by itself is very fast. Much faster than ASP or JSP running on + the same type of server. This is because it has very little overhead compared + to its competitors and it pre-compiles all of + its code before it runs each script (in PHP4). However, all of + this compiling and re-compiling can take up a lot of valuable + computer resources. However, there are programs out there that compile + PHP code and store it in memory (or on mmaped files) to reduce the + processing immensely. Two of these: APC + (Alternative PHP Cache) and Afterburner + (Win32 download) + are excellent free tools that do just this. If you have the money + you might also try Zend Cache, it is + even faster than the open source varieties. All of these tools make your + scripts run faster while also reducing the load on your server. I have tried + them myself and they are quite stable too.

    • + +
    • Q: What mailer gives me the best performance?
      + A: On a single machine the sendmail (or Qmail) is fastest overall. + Next fastest is mail() to give you the best performance. Both do not have the overhead of SMTP. + If you have you have your mail server on a another machine then + SMTP is your only option, but you do get the benefit of redundant mail servers.
      + If you are running a mailing list with thousands of names, the fastest mailers in order are: SMTP, sendmail (or Qmail), mail().

    • + +
    • Q: When I try to attach a file with on my server I get a + "Could not find {file} on filesystem error". Why is this?
      + A: If you are using a Unix machine this is probably because the user + running your web server does not have read access to the directory in question. If you are using Windows, + then the problem probably is that you have used single backslashes to denote directories (\). + A single backslash has a special meaning to PHP so these are not + valid. Instead use double backslashes ("\\") or a single forward + slash ("/").

    • + +
    + +
    +
    + + + diff --git a/plugin/PHPMailer_v2.0.4/docs/phpmailer_sm.gif b/plugin/PHPMailer_v2.0.4/docs/phpmailer_sm.gif new file mode 100644 index 0000000000000000000000000000000000000000..0244d29900afd75bd37fa3d6d9a48cf693ef4e68 GIT binary patch literal 204 zcmV;-05ktbNk%w1VORhU0FeLyW@cv5-0uJX|7K>HA^8LZ6afDKEC2ui09XJI0007= zgpaAq?GK-rwAzca-n?fc4B|+ZCK;sa%C_zc$EyII_C3h@&ciei!U;#cqEYq>5>rG` zVEKgRm?~$LTD3-}M^>^F4Lh4TX?cpiK3809yBqkTnA&YtTV8Lu>AN33Q-cCFRye1p z*O$n~k_V_FM@D96qPB>LW+jF77&(OV7|P@MX(M_XLt0vi+Uf=35i2`OyAg4Vo2z?U G0028yM_N_@ literal 0 HcmV?d00001 diff --git a/plugin/PHPMailer_v2.0.4/docs/pop3_article.txt b/plugin/PHPMailer_v2.0.4/docs/pop3_article.txt new file mode 100644 index 000000000..379c44e89 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/docs/pop3_article.txt @@ -0,0 +1,39 @@ +This is built for PHP Mailer 1.72 and was not tested with any previous version. It was developed under PHP 4.3.11 (E_ALL). It works under PHP 5 and 5.1 with E_ALL, but not in Strict mode due to var deprecation (but then neither does PHP Mailer either!). It follows the RFC 1939 standard explicitly and is fully commented. + +With that noted, here is how to implement it: +Install the class file + +I didn't want to modify the PHP Mailer classes at all, so you will have to include/require this class along with the base one. It can sit quite happily in the phpmailer-1.72 directory: +[geshi lang=php] require 'phpmailer-1.72/class.phpmailer.php'; require 'phpmailer-1.72/class.pop3.php'; [/geshi] +When you need it, create your POP3 object + +Right before I invoke PHP Mailer I activate the POP3 authorisation. POP3 before SMTP is a process whereby you login to your web hosts POP3 mail server BEFORE sending out any emails via SMTP. The POP3 logon 'verifies' your ability to send email by SMTP, which typically otherwise blocks you. On my web host (Pair Networks) a single POP3 logon is enough to 'verify' you for 90 minutes. Here is some sample PHP code that activates the POP3 logon and then sends an email via PHP Mailer: +[geshi lang=php] Authorise('pop3.example.com', 110, 30, 'mailer', 'password', 1); $mail = new PHPMailer(); $mail->SMTPDebug = 2; $mail->IsSMTP(); $mail->IsHTML(false); $mail->Host = 'relay.example.com'; $mail->From = 'mailer@example.com'; $mail->FromName = 'Example Mailer'; $mail->Subject = 'My subject'; $mail->Body = 'Hello world'; $mail->AddAddress('rich@corephp.co.uk', 'Richard Davey'); if (!$mail->Send()) { echo $mail->ErrorInfo; } ?> [/geshi] + +The PHP Mailer parts of this code should be obvious to anyone who has used PHP Mailer before. One thing to note - you almost certainly will not need to use SMTP Authentication *and* POP3 before SMTP together. The Authorisation method is a proxy method to all of the others within that class. There are Connect, Logon and Disconnect methods available, but I wrapped them in the single Authorisation one to make things easier. +The Parameters + +The Authorise parameters are as follows: +[geshi lang=php]$pop->Authorise('pop3.example.com', 110, 30, 'mailer', 'password', 1);[/geshi] + + 1. pop3.example.com - The POP3 Mail Server Name (hostname or IP address) + 2. 110 - The POP3 Port on which to connect (default is usually 110, but check with your host) + 3. 30 - A connection time-out value (in seconds) + 4. mailer - The POP3 Username required to logon + 5. password - The POP3 Password required to logon + 6. 1 - The class debug level (0 = off, 1+ = debug output is echoed to the browser) + +Final Comments + the Download + +1) This class does not support APOP connections. This is only because I did not have an APOP server to test with, but if you'd like to see that added just contact me. + +2) Opening and closing lots of POP3 connections can be quite a resource/network drain. If you need to send a whole batch of emails then just perform the authentication once at the start, and then loop through your mail sending script. Providing this process doesn't take longer than the verification period lasts on your POP3 server, you should be fine. With my host that period is 90 minutes, i.e. plenty of time. + +3) If you have heavy requirements for this script (i.e. send a LOT of email on a frequent basis) then I would advise seeking out an alternative sending method (direct SMTP ideally). If this isn't possible then you could modify this class so the 'last authorised' date is recorded somewhere (MySQL, Flat file, etc) meaning you only open a new connection if the old one has expired, saving you precious overhead. + +4) There are lots of other POP3 classes for PHP available. However most of them implement the full POP3 command set, where-as this one is purely for authentication, and much lighter as a result. However using any of the other POP3 classes to just logon to your server would have the same net result. At the end of the day, use whatever method you feel most comfortable with. +Download + +Here is the full class file plus my test script: POP_before_SMTP_PHPMailer.zip (4 KB) - Please note that it does not include PHPMailer itself. + +My thanks to Chris Ryan for the inspiration (even if indirectly, via his SMTP class) diff --git a/plugin/PHPMailer_v2.0.4/docs/use_gmail.txt b/plugin/PHPMailer_v2.0.4/docs/use_gmail.txt new file mode 100644 index 000000000..3669f5d23 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/docs/use_gmail.txt @@ -0,0 +1,45 @@ +getFile('contents.html'); +$body = eregi_replace("[\]",'',$body); + +$mail->IsSMTP(); +$mail->SMTPAuth = true; // enable SMTP authentication +$mail->SMTPSecure = "ssl"; // sets the prefix to the servier +$mail->Host = "smtp.gmail.com"; // sets GMAIL as the SMTP server +$mail->Port = 465; // set the SMTP port + +$mail->Username = "yourname@gmail.com"; // GMAIL username +$mail->Password = "password"; // GMAIL password + +$mail->From = "replyto@yourdomain.com"; +$mail->FromName = "Webmaster"; +$mail->Subject = "This is the subject"; +$mail->AltBody = "This is the body when user views in plain text format"; //Text Body +$mail->WordWrap = 50; // set word wrap + +$mail->MsgHTML($body); + +$mail->AddReplyTo("replyto@yourdomain.com","Webmaster"); + +$mail->AddAttachment("/path/to/file.zip"); // attachment +$mail->AddAttachment("/path/to/image.jpg", "new.jpg"); // attachment + +$mail->AddAddress("username@domain.com","First Last"); + +$mail->IsHTML(true); // send as HTML + +if(!$mail->Send()) { + echo "Mailer Error: " . $mail->ErrorInfo; +} else { + echo "Message has been sent"; +} + +?> diff --git a/plugin/PHPMailer_v2.0.4/examples/contents.html b/plugin/PHPMailer_v2.0.4/examples/contents.html new file mode 100644 index 000000000..70c7e3070 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/examples/contents.html @@ -0,0 +1,12 @@ + +
    +

    +
    + This is a test of PHPMailer v2.0.0 rc1.
    +
    +This particular example uses HTML, with a <div> tag and inline
    +styles.
    +
    +Also note the use of the PHPMailer at the top with no specific code to handle +including it in the body of the email.
    + diff --git a/plugin/PHPMailer_v2.0.4/examples/images/bkgrnd.gif b/plugin/PHPMailer_v2.0.4/examples/images/bkgrnd.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc89624c05de80022126c3b27698290141cdc2d6 GIT binary patch literal 49 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 gd)d15PQ7s?<@S(b!Mg+*99Zt_S)X2sM8 zY6#>rQ}5oCd1yLWBS>vengia{43J__iUKvA9G(fcYGIi^1Ize3x2@YndQV!Rd1uI@ z0|rn+Iv8oM7=+lg|rL5G907GeCPGaUMVu8 zajG&HZ@0r16-O&zrEyobPs}o`B2}^(1XmI}=G&KwX3u5nRyX3RPp<^URVQrYuFf%E6kqemwY0Kss(X+{f%9HjyERn}LRuIc(2 z_b1+|g{P9(T;cXp(u+e7*!=kS+#669m$E*5NG7S|l1wi7-GbfVC}m+%PI+9FI97B7TbBXwLdKYe z>9wVoVnSKwnqh+3CYx`@=_Z?L!U<-YT7ISHo^@`)!@X(sBXqGbX~ zD4=%+S_hwb(uqc-jkfuypp2qv=9g-QX~v>$jq0bSnD#m6o^@6#DV&7932CBds>-LN zbuQD4ov^Oj>948sYO609JQAy%b;b&;t%I6+>8)bcaKZ(TU@7GeF_1t39oD*dLkk}e z5rGFOyf6a}I;5*F?z-%@>+ZYo#`|s#Hpt+D2u4W2K?o+Kpu!3O2Q2Ww1Q%@Z!3YThe example file "test_mail.php" contents include:

    +
    + +<?php
    +
    +include_once('../class.phpmailer.php');
    +
    +$mail = new PHPMailer();
    +
    +$body = $mail->getFile('contents.html');
    +
    +$body = eregi_replace("[\]",'',$body);
    +$subject = eregi_replace("[\]",'',$subject);
    +
    +$mail->From = "name@yourdomain.com";
    +$mail->FromName = "First Last";
    +
    +$mail->Subject = "PHPMailer Test Subject";
    +
    +$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
    +
    +$mail->MsgHTML($body);
    +
    +$mail->AddAddress("whoto@otherdomain.com", "John Doe");
    +
    +if(!$mail->Send()) {
    + echo 'Failed to send mail';
    +} else {
    + echo 'Mail sent';
    +}
    +
    +?> +
    +
    +
    +Although you could use full compabitility with PHPMailer 1.7.3, this example +shows how to use the new features. If you view 'contents.html', you will note +that there is a background image used in the <body tag as well as an image used +with a regular <img tag. Here's what the HTML file looks like:
    +
    +
    + +<body background="images/bkgrnd.gif" style="margin: 0px;">
    +<div style="width: 640px; font-family: Arial, Helvetica, sans-serif; font-size: 11px;">
    +<div align="center"><img src="images/phpmailer.gif" style="height: 90px; width: 340px"></div><br>
    +<br>
    + This is a test of PHPMailer v2.0.0 rc1.<br>
    +<br>
    +This particular example uses <strong>HTML</strong>, with a <div> tag and inline<br>
    +styles.<br>
    +<br>
    +Also note the use of the PHPMailer at the top with no specific code to handle
    +including it in the body of the email.</div>
    +</body>
    +
    +
    +
    +A few things to notice in the PHP script that generates the email: +
      +
    • the use of $mail->AltBody is completely optional. If not used, PHPMailer + will use the HTML text with htmlentities().
    • +
    • the background= and <img src= images were processed without any directives + or methods from the PHP script
    • +
    • there is no specific code to define the image type ... that is handled + automatically by PHPMailer when it parses the images
    • +
    • we are using a new class method '$mail->MsgHTML($body)' ... that is what will handle the parsing of the images and creating the AltBody text
    • +
    +

    Of course, you can still use PHPMailer the same way you have in the past. +That provides full compatibility with all existing scripts, while new scripts +can take advantage of the new features.

    +

    Modify test_mail.php now with your own email address and try it out.

    +To see what the email SHOULD look like in your HTML compatible email viewer: click here
    + diff --git a/plugin/PHPMailer_v2.0.4/examples/pop3_before_smtp_test.php b/plugin/PHPMailer_v2.0.4/examples/pop3_before_smtp_test.php new file mode 100644 index 000000000..794b2a267 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/examples/pop3_before_smtp_test.php @@ -0,0 +1,39 @@ + + +POP before SMTP Test + + + + +
    +Authorise('pop3.example.com', 110, 30, 'mailer', 'password', 1);
    +
    +  $mail = new PHPMailer();
    +
    +  $mail->IsSMTP();
    +  $mail->SMTPDebug = 2;
    +  $mail->IsHTML(false);
    +
    +  $mail->Host     = 'relay.example.com';
    +
    +  $mail->From     = 'mailer@example.com';
    +  $mail->FromName = 'Example Mailer';
    +
    +  $mail->Subject  =  'My subject';
    +  $mail->Body     =  'Hello world';
    +  $mail->AddAddress('name@anydomain.com', 'First Last');
    +
    +  if (!$mail->Send())
    +  {
    +    echo $mail->ErrorInfo;
    +  }
    +?>
    +
    + + + diff --git a/plugin/PHPMailer_v2.0.4/examples/test_gmail.php b/plugin/PHPMailer_v2.0.4/examples/test_gmail.php new file mode 100644 index 000000000..9b951f869 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/examples/test_gmail.php @@ -0,0 +1,45 @@ +getFile('contents.html'); +$body = eregi_replace("[\]",'',$body); + +$mail->IsSMTP(); +$mail->SMTPAuth = true; // enable SMTP authentication +$mail->SMTPSecure = "ssl"; // sets the prefix to the servier +$mail->Host = "smtp.gmail.com"; // sets GMAIL as the SMTP server +$mail->Port = 465; // set the SMTP port for the GMAIL server + +$mail->Username = "yourusername@gmail.com"; // GMAIL username +$mail->Password = "yourpassword"; // GMAIL password + +$mail->AddReplyTo("yourusername@gmail.com","First Last"); + +$mail->From = "name@yourdomain.com"; +$mail->FromName = "First Last"; + +$mail->Subject = "PHPMailer Test Subject via gmail"; + +//$mail->Body = "Hi,
    This is the HTML BODY
    "; //HTML Body +$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test +$mail->WordWrap = 50; // set word wrap + +$mail->MsgHTML($body); + +$mail->AddAddress("whoto@otherdomain.com", "John Doe"); + +$mail->AddAttachment("images/phpmailer.gif"); // attachment + +$mail->IsHTML(true); // send as HTML + +if(!$mail->Send()) { + echo "Mailer Error: " . $mail->ErrorInfo; +} else { + echo "Message sent!"; +} + +?> diff --git a/plugin/PHPMailer_v2.0.4/examples/test_mail.php b/plugin/PHPMailer_v2.0.4/examples/test_mail.php new file mode 100644 index 000000000..e87056e91 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/examples/test_mail.php @@ -0,0 +1,29 @@ +getFile('contents.html'); +$body = eregi_replace("[\]",'',$body); + +$mail->From = "name@yourdomain.com"; +$mail->FromName = "First Last"; + +$mail->Subject = "PHPMailer Test Subject via mail()"; + +$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test + +$mail->MsgHTML($body); + +$mail->AddAddress("whoto@otherdomain.com", "John Doe"); + +$mail->AddAttachment("images/phpmailer.gif"); // attachment + +if(!$mail->Send()) { + echo "Mailer Error: " . $mail->ErrorInfo; +} else { + echo "Message sent!"; +} + +?> diff --git a/plugin/PHPMailer_v2.0.4/examples/test_sendmail.php b/plugin/PHPMailer_v2.0.4/examples/test_sendmail.php new file mode 100644 index 000000000..f0311665e --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/examples/test_sendmail.php @@ -0,0 +1,30 @@ +getFile('contents.html'); +$body = eregi_replace("[\]",'',$body); + +$mail->IsSendmail(); // telling the class to use SendMail transport + +$mail->From = "name@yourdomain.com"; +$mail->FromName = "First Last"; + +$mail->Subject = "PHPMailer Test Subject via smtp"; + +$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test + +$mail->MsgHTML($body); + +$mail->AddAddress("whoto@otherdomain.com", "John Doe"); + +$mail->AddAttachment("images/phpmailer.gif"); // attachment + +if(!$mail->Send()) { + echo "Mailer Error: " . $mail->ErrorInfo; +} else { + echo "Message sent!"; +} + +?> diff --git a/plugin/PHPMailer_v2.0.4/examples/test_smtp.php b/plugin/PHPMailer_v2.0.4/examples/test_smtp.php new file mode 100644 index 000000000..189f8daa1 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/examples/test_smtp.php @@ -0,0 +1,33 @@ +getFile('contents.html'); +$body = eregi_replace("[\]",'',$body); + +$mail->IsSMTP(); // telling the class to use SMTP +$mail->Host = "mail.yourdomain.com"; // SMTP server + +$mail->From = "name@yourdomain.com"; +$mail->FromName = "First Last"; + +$mail->Subject = "PHPMailer Test Subject via smtp"; + +$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test + +$mail->MsgHTML($body); + +$mail->AddAddress("whoto@otherdomain.com", "John Doe"); + +$mail->AddAttachment("images/phpmailer.gif"); // attachment + +if(!$mail->Send()) { + echo "Mailer Error: " . $mail->ErrorInfo; +} else { + echo "Message sent!"; +} + +?> diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ar.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ar.php new file mode 100644 index 000000000..c7f343ae2 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ar.php @@ -0,0 +1,26 @@ + + */ + +$PHPMAILER_LANG = array(); + +$PHPMAILER_LANG['provide_address'] = 'You must provide at least one ' . + 'recipient email address.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer غير مدعوم.'; +$PHPMAILER_LANG['execute'] = 'لم أستطع تنفيذ : '; +$PHPMAILER_LANG['instantiate'] = 'لم نستطع توفير خدمة البريد.'; +$PHPMAILER_LANG['authenticate'] = 'SMTP Error: لم نستطع تأكيد الهوية.'; +$PHPMAILER_LANG['from_failed'] = 'البريد التالي لم نستطع ارسال البريد له : '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: الأخطاء التالية ' . + 'فشل في الارسال لكل من : '; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: لم يتم قبول المعلومات .'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: لم نستطع الاتصال بمخدم SMTP.'; +$PHPMAILER_LANG['file_access'] = 'لم نستطع الوصول للملف: '; +$PHPMAILER_LANG['file_open'] = 'File Error: لم نستطع فتح الملف: '; +$PHPMAILER_LANG['encoding'] = 'ترميز غير معروف: '; +$PHPMAILER_LANG['signing'] = 'خطأ في التوقيع: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +?> \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-br.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-br.php new file mode 100644 index 000000000..dece2256a --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-br.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ca.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ca.php new file mode 100644 index 000000000..dfc8370ef --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ca.php @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ch.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ch.php new file mode 100644 index 000000000..5251402b0 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ch.php @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-cz.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-cz.php new file mode 100644 index 000000000..80b4eea1d --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-cz.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-de.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-de.php new file mode 100644 index 000000000..7e23f4be0 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-de.php @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-dk.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-dk.php new file mode 100644 index 000000000..120fd3bb4 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-dk.php @@ -0,0 +1,23 @@ + */ + +$PHPMAILER_LANG = array(); + +$PHPMAILER_LANG['provide_address'] = 'Du skal indtaste mindst en modtagers emailadresse.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer understøttes ikke.'; +$PHPMAILER_LANG['execute'] = 'Kunne ikke køre: '; +$PHPMAILER_LANG['instantiate'] = 'Kunne ikke initialisere email funktionen.'; +$PHPMAILER_LANG['authenticate'] = 'SMTP fejl: Kunne ikke logge på.'; +$PHPMAILER_LANG['from_failed'] = 'Følgende afsenderadresse er forkert: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP fejl: Følgende modtagere er forkerte: '; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fejl: Data kunne ikke accepteres.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP fejl: Kunne ikke tilslutte SMTP serveren.'; +$PHPMAILER_LANG['file_access'] = 'Ingen adgang til fil: '; +$PHPMAILER_LANG['file_open'] = 'Fil fejl: Kunne ikke åbne filen: '; +$PHPMAILER_LANG['encoding'] = 'Ukendt encode-format: '; +$PHPMAILER_LANG['signing'] = 'Signing Error: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +?> \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-en.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-en.php new file mode 100644 index 000000000..41906b1e7 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-en.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-es.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-es.php new file mode 100644 index 000000000..b0d7d22e4 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-es.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-et.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-et.php new file mode 100644 index 000000000..943680cd1 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-et.php @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-fi.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-fi.php new file mode 100644 index 000000000..970ebc030 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-fi.php @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-fo.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-fo.php new file mode 100644 index 000000000..b09414b19 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-fo.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-fr.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-fr.php new file mode 100644 index 000000000..b40ec215d --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-fr.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-hu.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-hu.php new file mode 100644 index 000000000..5fac38a09 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-hu.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-it.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-it.php new file mode 100644 index 000000000..76a9f3a59 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-it.php @@ -0,0 +1,26 @@ +*/ + +$PHPMAILER_LANG = array(); + +$PHPMAILER_LANG['provide_address'] = 'Deve essere fornito almeno un indirizzo ricevente'; +$PHPMAILER_LANG['mailer_not_supported'] = 'Mailer non supportato'; +$PHPMAILER_LANG['execute'] = 'Impossibile eseguire l\'operazione: '; +$PHPMAILER_LANG['instantiate'] = 'Impossibile istanziare la funzione mail'; +$PHPMAILER_LANG['authenticate'] = 'SMTP Error: Impossibile autenticarsi.'; +$PHPMAILER_LANG['from_failed'] = 'I seguenti indirizzi mittenti hanno generato errore: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP Error: I seguenti indirizzi'. + 'destinatari hanno generato errore: '; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP Error: Data non accettati dal'. + 'server.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP Error: Impossibile connettersi all\'host SMTP.'; +$PHPMAILER_LANG['file_access'] = 'Impossibile accedere al file: '; +$PHPMAILER_LANG['file_open'] = 'File Error: Impossibile aprire il file: '; +$PHPMAILER_LANG['encoding'] = 'Encoding set dei caratteri sconosciuto: '; +$PHPMAILER_LANG['signing'] = 'Signing Error: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +?> \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ja.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ja.php new file mode 100644 index 000000000..6848ca380 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ja.php @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-nl.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-nl.php new file mode 100644 index 000000000..269b1522a --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-nl.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-no.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-no.php new file mode 100644 index 000000000..184d8857f --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-no.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-pl.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-pl.php new file mode 100644 index 000000000..bbc9cc9a8 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-pl.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ro.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ro.php new file mode 100644 index 000000000..4c6a4683d --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ro.php @@ -0,0 +1,24 @@ + */ + +$PHPMAILER_LANG = array(); + +$PHPMAILER_LANG['provide_address'] = 'Trebuie sa adaugati cel putin un recipient (adresa de mail).'; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nu este suportat.'; +$PHPMAILER_LANG['execute'] = 'Nu pot executa: '; +$PHPMAILER_LANG['instantiate'] = 'Nu am putut instantia functia mail.'; +$PHPMAILER_LANG['authenticate'] = 'Eroare SMTP: Nu a functionat autentificarea.'; +$PHPMAILER_LANG['from_failed'] = 'Urmatoarele adrese From au dat eroare: '; +$PHPMAILER_LANG['recipients_failed'] = 'Eroare SMTP: Urmatoarele adrese de mail au dat eroare: '; +$PHPMAILER_LANG['data_not_accepted'] = 'Eroare SMTP: Continutul mailului nu a fost acceptat.'; +$PHPMAILER_LANG['connect_host'] = 'Eroare SMTP: Nu m-am putut conecta la adresa SMTP.'; +$PHPMAILER_LANG['file_access'] = 'Nu pot accesa fisierul: '; +$PHPMAILER_LANG['file_open'] = 'Eroare de fisier: Nu pot deschide fisierul: '; +$PHPMAILER_LANG['encoding'] = 'Encodare necunoscuta: '; +$PHPMAILER_LANG['signing'] = 'Signing Error: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +?> \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ru.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ru.php new file mode 100644 index 000000000..bc2dc2d5e --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-ru.php @@ -0,0 +1,23 @@ + */ + +$PHPMAILER_LANG = array(); + +$PHPMAILER_LANG['provide_address'] = 'Пожалуйста, введите хотя бы один адрес e-mail получателя.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' - почтовый сервер не поддерживается.'; +$PHPMAILER_LANG['execute'] = 'Невозможно выполнить команду: '; +$PHPMAILER_LANG['instantiate'] = 'Невозможно запустить функцию mail.'; +$PHPMAILER_LANG['authenticate'] = 'Ошибка SMTP: ошибка авторизации.'; +$PHPMAILER_LANG['from_failed'] = 'Неверный адрес отправителя: '; +$PHPMAILER_LANG['recipients_failed'] = 'Ошибка SMTP: отправка по следующим ' . + 'адресам получателей не удалась: '; +$PHPMAILER_LANG['data_not_accepted'] = 'Ошибка SMTP: данные не приняты.'; +$PHPMAILER_LANG['connect_host'] = 'Ошибка SMTP: не удается подключиться к серверу SMTP.'; +$PHPMAILER_LANG['file_access'] = 'Нет доступа к файлу: '; +$PHPMAILER_LANG['file_open'] = 'Файловая ошибка: не удается открыть файл: '; +$PHPMAILER_LANG['encoding'] = 'Неизвестный вид кодировки: '; +$PHPMAILER_LANG['signing'] = 'Signing Error: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +?> \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-se.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-se.php new file mode 100644 index 000000000..f9100a67f --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-se.php @@ -0,0 +1,23 @@ + */ + +$PHPMAILER_LANG = array(); + +$PHPMAILER_LANG['provide_address'] = 'Du måste ange minst en mottagares e-postadress.'; +$PHPMAILER_LANG['mailer_not_supported'] = ' mailer stöds inte.'; +$PHPMAILER_LANG['execute'] = 'Kunde inte köra: '; +$PHPMAILER_LANG['instantiate'] = 'Kunde inte initiera e-postfunktion.'; +$PHPMAILER_LANG['authenticate'] = 'SMTP fel: Kunde inte autentisera.'; +$PHPMAILER_LANG['from_failed'] = 'Följande avsändaradress är felaktig: '; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP fel: Följande mottagare är felaktig: '; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP fel: Data accepterades inte.'; +$PHPMAILER_LANG['connect_host'] = 'SMTP fel: Kunde inte ansluta till SMTP-server.'; +$PHPMAILER_LANG['file_access'] = 'Ingen åtkomst till fil: '; +$PHPMAILER_LANG['file_open'] = 'Fil fel: Kunde inte öppna fil: '; +$PHPMAILER_LANG['encoding'] = 'Okänt encode-format: '; +$PHPMAILER_LANG['signing'] = 'Signing Error: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +?> \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-tr.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-tr.php new file mode 100644 index 000000000..99c5ac421 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-tr.php @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-zh.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-zh.php new file mode 100644 index 000000000..31c10faae --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-zh.php @@ -0,0 +1,23 @@ + + */ + +$PHPMAILER_LANG = array(); +$PHPMAILER_LANG['provide_address'] = '必須提供至少一個收件人地址。'; +$PHPMAILER_LANG['mailer_not_supported'] = '發信客戶端不被支持。'; +$PHPMAILER_LANG['execute'] = '無法執行:'; +$PHPMAILER_LANG['instantiate'] = '未知函數調用。'; +$PHPMAILER_LANG['authenticate'] = 'SMTP 錯誤:登錄失敗。'; +$PHPMAILER_LANG['from_failed'] = '發送地址錯誤:'; +$PHPMAILER_LANG['recipients_failed'] = 'SMTP 錯誤:收件人地址錯誤:'; +$PHPMAILER_LANG['data_not_accepted'] = 'SMTP 錯誤:數據不被接受。'; +$PHPMAILER_LANG['connect_host'] = 'SMTP 錯誤:無法連接到 SMTP 主機。'; +$PHPMAILER_LANG['file_access'] = '無法訪問文件:'; +$PHPMAILER_LANG['file_open'] = '文件錯誤:無法打開文件:'; +$PHPMAILER_LANG['encoding'] = '未知編碼: '; +$PHPMAILER_LANG['signing'] = 'Signing Error: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +?> \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-zh_cn.php b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-zh_cn.php new file mode 100644 index 000000000..b01d806f0 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/language/phpmailer.lang-zh_cn.php @@ -0,0 +1,24 @@ + + */ + +$PHPMAILER_LANG = array(); + +$PHPMAILER_LANG["provide_address"] = '必须提供至少一个收件人地址。'; +$PHPMAILER_LANG["mailer_not_supported"] = '发信客户端不被支持。'; +$PHPMAILER_LANG["execute"] = '无法执行:'; +$PHPMAILER_LANG["instantiate"] = '未知函数调用。'; +$PHPMAILER_LANG["authenticate"] = 'SMTP 错误:登录失败。'; +$PHPMAILER_LANG["from_failed"] = '发送地址错误:'; +$PHPMAILER_LANG["recipients_failed"] = 'SMTP 错误:收件人地址错误:'; +$PHPMAILER_LANG["data_not_accepted"] = 'SMTP 错误:数据不被接受。'; +$PHPMAILER_LANG["connect_host"] = 'SMTP 错误:无法连接到 SMTP 主机。'; +$PHPMAILER_LANG["file_access"] = '无法访问文件:'; +$PHPMAILER_LANG["file_open"] = '文件错误:无法打开文件:'; +$PHPMAILER_LANG["encoding"] = '未知编码: '; +$PHPMAILER_LANG["signing"] = 'Signing Error: '; +$PHPMAILER_LANG['smtp_error'] = 'SMTP server error: '; +?> \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/PHPMailer.html b/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/PHPMailer.html new file mode 100644 index 000000000..f892db222 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/PHPMailer.html @@ -0,0 +1,2042 @@ + + + + + + Docs For Class PHPMailer + + + + +
    +

    Class PHPMailer

    + + +
    +
    Description
    + +
    + +

    + Located in /class.phpmailer.php (line 34) +

    + + +
    
    +	
    +			
    +
    + + + + +
    +
    Variable Summary
    + +
    +
    +
    + string + $AltBody +
    +
    + mixed + $attachment +
    +
    + mixed + $bcc +
    +
    + string + $Body +
    +
    + mixed + $boundary +
    +
    + mixed + $cc +
    +
    + string + $CharSet +
    +
    + string + $ConfirmReadingTo +
    +
    + string + $ContentType +
    +
    + mixed + $CustomHeader +
    +
    + string + $Encoding +
    +
    + string + $ErrorInfo +
    +
    + mixed + $error_count +
    +
    + string + $From +
    +
    + string + $FromName +
    +
    + string + $Helo +
    +
    + string + $Host +
    +
    + string + $Hostname +
    +
    + mixed + $language +
    +
    + mixed + $LE +
    +
    + string + $Mailer +
    +
    + string + $MessageID +
    +
    + mixed + $message_type +
    +
    + string + $Password +
    +
    + string + $PluginDir +
    +
    + int + $Port +
    +
    + int + $Priority +
    +
    + mixed + $ReplyTo +
    +
    + string + $Sender +
    +
    + string + $Sendmail +
    +
    + mixed + $sign_cert_file +
    +
    + mixed + $sign_key_file +
    +
    + mixed + $sign_key_pass +
    +
    + bool + $SingleTo +
    +
    + mixed + $smtp +
    +
    + bool + $SMTPAuth +
    +
    + bool + $SMTPDebug +
    +
    + bool + $SMTPKeepAlive +
    +
    + string + $SMTPSecure +
    +
    + string + $Subject +
    +
    + int + $Timeout +
    +
    + mixed + $to +
    +
    + string + $Username +
    +
    + string + $Version +
    +
    + int + $WordWrap +
    +
    +
    +
    + + +
    +
    Method Summary
    + +
    +
    + +
    + void + AddAddress + (string $address, [string $name = '']) +
    + +
    + bool + AddAttachment + (string $path, [string $name = ''], [string $encoding = 'base64'], [string $type = 'application/octet-stream']) +
    + +
    + void + AddBCC + (string $address, [string $name = '']) +
    + +
    + void + AddCC + (string $address, [string $name = '']) +
    + +
    + void + AddCustomHeader + (mixed $custom_header) +
    + +
    + bool + AddEmbeddedImage + (string $path, string $cid, [string $name = ''], [string $encoding = 'base64'], [string $type = 'application/octet-stream']) +
    + +
    + void + AddReplyTo + (string $address, [string $name = '']) +
    + +
    + void + AddStringAttachment + (string $string, string $filename, [string $encoding = 'base64'], [string $type = 'application/octet-stream']) +
    + +
    + void + ClearAddresses + () +
    + +
    + void + ClearAllRecipients + () +
    + +
    + void + ClearAttachments + () +
    + +
    + void + ClearBCCs + () +
    + +
    + void + ClearCCs + () +
    + +
    + void + ClearCustomHeaders + () +
    + +
    + void + ClearReplyTos + () +
    + +
    + void + getFile + (string $filename) +
    + +
    + void + HeaderLine + (mixed $name, mixed $value) +
    + +
    + bool + IsError + () +
    + +
    + void + IsHTML + (bool $bool) +
    + +
    + void + IsMail + () +
    + +
    + void + IsQmail + () +
    + +
    + void + IsSendmail + () +
    + +
    + void + IsSMTP + () +
    + +
    + $message + MsgHTML + (mixed $message, [mixed $basedir = '']) +
    + +
    + bool + Send + () +
    + +
    + void + set + (string $name, [mixed $value = '']) +
    + +
    + bool + SetLanguage + (string $lang_type, [string $lang_path = 'language/']) +
    + +
    + void + Sign + (mixed $cert_filename, string $key_filename, string $key_pass) +
    + +
    + void + SmtpClose + () +
    +
    +
    +
    + + +
    +
    Variables
    + +
    + +
    + +
    + + string + $AltBody + = '' (line 110) + +
    + + +

    Sets the text-only body of the message. This automatically sets the email to multipart/alternative. This body can be read by mail clients that do not have HTML email capability such as mutt. Clients that can read HTML will view the normal Body.

    + + + + + +
    + +
    + +
    + + mixed + $attachment + = array() (line 253) + +
    + + + + + + + +
    + +
    + +
    + + mixed + $bcc + = array() (line 251) + +
    + + + + + + + +
    + +
    + +
    + + string + $Body + = '' (line 101) + +
    + + +

    Sets the Body of the message. This can be either an HTML or text body.

    +

    If HTML then run IsHTML(true).

    + + + + + +
    + +
    + +
    + + mixed + $boundary + = array() (line 256) + +
    + + + + + + + +
    + +
    + +
    + + mixed + $cc + = array() (line 250) + +
    + + + + + + + +
    + +
    + +
    + + string + $CharSet + = 'iso-8859-1' (line 50) + +
    + + +

    Sets the CharSet of the message.

    + + + + + +
    + +
    + +
    + + string + $ConfirmReadingTo + = '' (line 148) + +
    + + +

    Sets the email address that a reading confirmation will be sent.

    + + + + + +
    + +
    + +
    + + string + $ContentType + = 'text/plain' (line 56) + +
    + + +

    Sets the Content-type of the message.

    + + + + + +
    + +
    + +
    + + mixed + $CustomHeader + = array() (line 254) + +
    + + + + + + + +
    + +
    + +
    + + string + $Encoding + = '8bit' (line 63) + +
    + + +

    Sets the Encoding of the message. Options for this are "8bit", "7bit", "binary", "base64", and "quoted-printable".

    + + + + + +
    + +
    + +
    + + string + $ErrorInfo + = '' (line 69) + +
    + + +

    Holds the most recent mailer error message.

    + + + + + +
    + +
    + +
    + + mixed + $error_count + = 0 (line 258) + +
    + + + + + + + +
    + +
    + +
    + + string + $From + = 'root@localhost' (line 75) + +
    + + +

    Sets the From email address for the message.

    + + + + + +
    + +
    + +
    + + string + $FromName + = 'Root User' (line 81) + +
    + + +

    Sets the From name of the message.

    + + + + + +
    + +
    + +
    + + string + $Helo + = '' (line 189) + +
    + + +

    Sets the SMTP HELO of the message (Default is $Hostname).

    + + + + + +
    + +
    + +
    + + string + $Host + = 'localhost' (line 177) + +
    + + +

    Sets the SMTP hosts. All hosts must be separated by a semicolon. You can also specify a different port for each host by using this format: [hostname:port] (e.g. "smtp1.example.com:25;smtp2.example.com").

    +

    Hosts will be tried in order.

    + + + + + +
    + +
    + +
    + + string + $Hostname + = '' (line 156) + +
    + + +

    Sets the hostname to use in Message-Id and Received headers and as default HELO string. If empty, the value returned by SERVER_NAME is used or 'localhost.localdomain'.

    + + + + + +
    + +
    + +
    + + mixed + $language + = array() (line 257) + +
    + + + + + + + +
    + +
    + +
    + + mixed + $LE + = "\n" (line 259) + +
    + + + + + + + +
    + +
    + +
    + + string + $Mailer + = 'mail' (line 123) + +
    + + +

    Method to send mail: ("mail", "sendmail", or "smtp").

    + + + + + +
    + +
    + +
    + + string + $MessageID + = '' (line 163) + +
    + + +

    Sets the message ID to be used in the Message-Id header.

    +

    If empty, a unique id will be generated.

    + + + + + +
    + +
    + +
    + + mixed + $message_type + = '' (line 255) + +
    + + + + + + + +
    + +
    + +
    + + string + $Password + = '' (line 214) + +
    + + +

    Sets SMTP password.

    + + + + + +
    + +
    + +
    + + string + $PluginDir + = '' (line 136) + +
    + + +

    Path to PHPMailer plugins. This is now only useful if the SMTP class is in a different directory than the PHP include path.

    + + + + + +
    + +
    + +
    + + int + $Port + = 25 (line 183) + +
    + + +

    Sets the default SMTP server port.

    + + + + + +
    + +
    + +
    + + int + $Priority + = 3 (line 44) + +
    + + +

    Email priority (1 = High, 3 = Normal, 5 = low).

    + + + + + +
    + +
    + +
    + + mixed + $ReplyTo + = array() (line 252) + +
    + + + + + + + +
    + +
    + +
    + + string + $Sender + = '' (line 88) + +
    + + +

    Sets the Sender email (Return-Path) of the message. If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.

    + + + + + +
    + +
    + +
    + + string + $Sendmail + = '/usr/sbin/sendmail' (line 129) + +
    + + +

    Sets the path of the sendmail program.

    + + + + + +
    + +
    + +
    + + mixed + $sign_cert_file + = "" (line 260) + +
    + + + + + + + +
    + +
    + +
    + + mixed + $sign_key_file + = "" (line 261) + +
    + + + + + + + +
    + +
    + +
    + + mixed + $sign_key_pass + = "" (line 262) + +
    + + + + + + + +
    + +
    + +
    + + bool + $SingleTo + = false (line 242) + +
    + + +

    Provides the ability to have the TO field process individual

    +

    emails, instead of sending to entire TO addresses

    + + + + + +
    + +
    + +
    + + mixed + $smtp + = NULL (line 248) + +
    + + + + + + + +
    + +
    + +
    + + bool + $SMTPAuth + = false (line 202) + +
    + + +

    Sets SMTP authentication. Utilizes the Username and Password variables.

    + + + + + +
    + +
    + +
    + + bool + $SMTPDebug + = false (line 227) + +
    + + +

    Sets SMTP class debugging on or off.

    + + + + + +
    + +
    + +
    + + bool + $SMTPKeepAlive + = false (line 235) + +
    + + +

    Prevents the SMTP connection from being closed after each mail sending. If this is set to true then to close the connection requires an explicit call to SmtpClose().

    + + + + + +
    + +
    + +
    + + string + $SMTPSecure + = "" (line 196) + +
    + + +

    Sets connection prefix.

    +

    Options are "", "ssl" or "tls"

    + + + + + +
    + +
    + +
    + + string + $Subject + = '' (line 94) + +
    + + +

    Sets the Subject of the message.

    + + + + + +
    + +
    + +
    + + int + $Timeout + = 10 (line 221) + +
    + + +

    Sets the SMTP server timeout in seconds. This function will not work with the win32 version.

    + + + + + +
    + +
    + +
    + + mixed + $to + = array() (line 249) + +
    + + + + + + + +
    + +
    + +
    + + string + $Username + = '' (line 208) + +
    + + +

    Sets SMTP username.

    + + + + + +
    + +
    + +
    + + string + $Version + = "2.0.4" (line 142) + +
    + + +

    Holds PHPMailer version.

    + + + + + +
    + +
    + +
    + + int + $WordWrap + = 0 (line 117) + +
    + + +

    Sets word wrapping on the body of the message to a given number of characters.

    + + + + + +
    + +
    +
    + + +
    +
    Methods
    + +
    + + +
    + +
    + AddAddress (line 324) +
    + + +

    Adds a "To" address.

    + +
    + void + + AddAddress + + (string $address, [string $name = '']) +
    + +
      +
    • + string + $address
    • +
    • + string + $name
    • +
    + + +
    + +
    + +
    + AddAttachment (line 1124) +
    + + +

    Adds an attachment from a path on the filesystem.

    +

    Returns false if the file could not be found or accessed.

    + +
    + bool + + AddAttachment + + (string $path, [string $name = ''], [string $encoding = 'base64'], [string $type = 'application/octet-stream']) +
    + +
      +
    • + string + $path: Path to the attachment.
    • +
    • + string + $name: Overrides the attachment name.
    • +
    • + string + $encoding: File encoding (see $Encoding).
    • +
    • + string + $type: File extension (MIME) type.
    • +
    + + +
    + +
    + +
    + AddBCC (line 352) +
    + + +

    Adds a "Bcc" address. Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.

    + +
    + void + + AddBCC + + (string $address, [string $name = '']) +
    + +
      +
    • + string + $address
    • +
    • + string + $name
    • +
    + + +
    + +
    + +
    + AddCC (line 338) +
    + + +

    Adds a "Cc" address. Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.

    + +
    + void + + AddCC + + (string $address, [string $name = '']) +
    + +
      +
    • + string + $address
    • +
    • + string + $name
    • +
    + + +
    + +
    + +
    + AddCustomHeader (line 1704) +
    + + +

    Adds a custom header.

    + +
    + void + + AddCustomHeader + + (mixed $custom_header) +
    + + + +
    + +
    + +
    + AddEmbeddedImage (line 1484) +
    + + +

    Adds an embedded attachment. This can include images, sounds, and just about any other document. Make sure to set the $type to an image type. For JPEG images use "image/jpeg" and for GIF images use "image/gif".

    + +
    + bool + + AddEmbeddedImage + + (string $path, string $cid, [string $name = ''], [string $encoding = 'base64'], [string $type = 'application/octet-stream']) +
    + +
      +
    • + string + $path: Path to the attachment.
    • +
    • + string + $cid: Content ID of the attachment. Use this to identify the Id for accessing the image in an HTML form.
    • +
    • + string + $name: Overrides the attachment name.
    • +
    • + string + $encoding: File encoding (see $Encoding).
    • +
    • + string + $type: File extension (MIME) type.
    • +
    + + +
    + +
    + +
    + AddReplyTo (line 364) +
    + + +

    Adds a "Reply-To" address.

    + +
    + void + + AddReplyTo + + (string $address, [string $name = '']) +
    + +
      +
    • + string + $address
    • +
    • + string + $name
    • +
    + + +
    + +
    + +
    + AddStringAttachment (line 1458) +
    + + +

    Adds a string or binary attachment (non-filesystem) to the list.

    +

    This method can be used to attach ascii or binary data, such as a BLOB record from a database.

    + +
    + void + + AddStringAttachment + + (string $string, string $filename, [string $encoding = 'base64'], [string $type = 'application/octet-stream']) +
    + +
      +
    • + string + $string: String attachment data.
    • +
    • + string + $filename: Name of the attachment.
    • +
    • + string + $encoding: File encoding (see $Encoding).
    • +
    • + string + $type: File extension (MIME) type.
    • +
    + + +
    + +
    + +
    + ClearAddresses (line 1535) +
    + + +

    Clears all recipients assigned in the TO array. Returns void.

    + +
    + void + + ClearAddresses + + () +
    + + + +
    + +
    + +
    + ClearAllRecipients (line 1568) +
    + + +

    Clears all recipients assigned in the TO, CC and BCC array. Returns void.

    + +
    + void + + ClearAllRecipients + + () +
    + + + +
    + +
    + +
    + ClearAttachments (line 1579) +
    + + +

    Clears all previously set filesystem, string, and binary attachments. Returns void.

    + +
    + void + + ClearAttachments + + () +
    + + + +
    + +
    + +
    + ClearBCCs (line 1551) +
    + + +

    Clears all recipients assigned in the BCC array. Returns void.

    + +
    + void + + ClearBCCs + + () +
    + + + +
    + +
    + +
    + ClearCCs (line 1543) +
    + + +

    Clears all recipients assigned in the CC array. Returns void.

    + +
    + void + + ClearCCs + + () +
    + + + +
    + +
    + +
    + ClearCustomHeaders (line 1587) +
    + + +

    Clears all custom headers. Returns void.

    + +
    + void + + ClearCustomHeaders + + () +
    + + + +
    + +
    + +
    + ClearReplyTos (line 1559) +
    + + +

    Clears all recipients assigned in the ReplyTo array. Returns void.

    + +
    + void + + ClearReplyTos + + () +
    + + + +
    + +
    + +
    + getFile (line 1868) +
    + + +

    Read a file from a supplied filename and return it.

    +
      +
    • access: public
    • +
    + +
    + void + + getFile + + (string $filename) +
    + +
      +
    • + string + $filename: Parameter File Name
    • +
    + + +
    + +
    + +
    + HeaderLine (line 1097) +
    + + + +
    + void + + HeaderLine + + (mixed $name, mixed $value) +
    + + + +
    + +
    + +
    + IsError (line 1684) +
    + + +

    Returns true if an error occurred.

    + +
    + bool + + IsError + + () +
    + + + +
    + +
    + +
    + IsHTML (line 273) +
    + + +

    Sets message type to HTML.

    + +
    + void + + IsHTML + + (bool $bool) +
    + +
      +
    • + bool + $bool
    • +
    + + +
    + +
    + +
    + IsMail (line 293) +
    + + +

    Sets Mailer to send message using PHP mail() function.

    + +
    + void + + IsMail + + () +
    + + + +
    + +
    + +
    + IsQmail (line 309) +
    + + +

    Sets Mailer to send message using the qmail MTA.

    + +
    + void + + IsQmail + + () +
    + + + +
    + +
    + +
    + IsSendmail (line 301) +
    + + +

    Sets Mailer to send message using the $Sendmail program.

    + +
    + void + + IsSendmail + + () +
    + + + +
    + +
    + +
    + IsSMTP (line 285) +
    + + +

    Sets Mailer to send message using SMTP.

    + +
    + void + + IsSMTP + + () +
    + + + +
    + +
    + +
    + MsgHTML (line 1713) +
    + + +

    Evaluates the message and returns modifications for inline images and backgrounds

    +
      +
    • access: public
    • +
    + +
    + $message + + MsgHTML + + (mixed $message, [mixed $basedir = '']) +
    + + + +
    + +
    + +
    + Send (line 380) +
    + + +

    Creates message and assigns Mailer. If the message is not sent successfully then it returns false. Use the ErrorInfo variable to view description of the error.

    + +
    + bool + + Send + + () +
    + + + +
    + +
    + +
    + set (line 1853) +
    + + +

    Set (or reset) Class Objects (variables)

    +

    Usage Example: $page->set('X-Priority', '3');

    +
      +
    • access: public
    • +
    + +
    + void + + set + + (string $name, [mixed $value = '']) +
    + +
      +
    • + string + $name: Parameter Name
    • +
    • + mixed + $value: Parameter Value NOTE: will not work with arrays, there are no arrays to set/reset
    • +
    + + +
    + +
    + +
    + SetLanguage (line 647) +
    + + +

    Sets the language for all class error messages. Returns false if it cannot load the language file. The default language type is English.

    +
      +
    • access: public
    • +
    + +
    + bool + + SetLanguage + + (string $lang_type, [string $lang_path = 'language/']) +
    + +
      +
    • + string + $lang_type: Type of language (e.g. Portuguese: "br")
    • +
    • + string + $lang_path: Path to the language file directory
    • +
    + + +
    + +
    + +
    + Sign (line 1901) +
    + + +

    Set the private key file and password to sign the message.

    +
      +
    • access: public
    • +
    + +
    + void + + Sign + + (mixed $cert_filename, string $key_filename, string $key_pass) +
    + +
      +
    • + string + $key_filename: Parameter File Name
    • +
    • + string + $key_pass: Password for private key
    • +
    + + +
    + +
    + +
    + SmtpClose (line 629) +
    + + +

    Closes the active SMTP session if one exists.

    + +
    + void + + SmtpClose + + () +
    + + + +
    + +
    +
    + + +

    + Documentation generated on Thu, 02 Apr 2009 21:19:48 -0400 by phpDocumentor 1.3.0RC3 +

    +
    + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/POP3.html b/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/POP3.html new file mode 100644 index 000000000..66d3d8afd --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/POP3.html @@ -0,0 +1,649 @@ + + + + + + Docs For Class POP3 + + + + +
    +

    Class POP3

    + + +
    +
    Description
    + +
    + +

    + Located in /class.pop3.php (line 46) +

    + + +
    
    +	
    +			
    +
    + + + + +
    +
    Variable Summary
    + +
    +
    +
    + string + $CRLF +
    +
    + int + $do_debug +
    +
    + string + $host +
    +
    + string + $password +
    +
    + int + $POP3_PORT +
    +
    + int + $POP3_TIMEOUT +
    +
    + int + $port +
    +
    + int + $tval +
    +
    + string + $username +
    +
    +
    +
    + + +
    +
    Method Summary
    + +
    +
    + +
    + POP3 + POP3 + () +
    + +
    + void + Authorise + (string $host, [integer $port = false], [integer $tval = false], string $username, string $password, mixed $debug_level) +
    + +
    + void + catchWarning + (integer $errno, string $errstr, string $errfile, integer $errline) +
    + +
    + boolean + checkResponse + (string $string) +
    + +
    + boolean + Connect + (string $host, [integer $port = false], [integer $tval = 30]) +
    + +
    + void + Disconnect + () +
    + +
    + void + displayErrors + () +
    + +
    + string + getResponse + ([integer $size = 128]) +
    + +
    + boolean + Login + ([string $username = ''], [string $password = '']) +
    + +
    + integer + sendString + (string $string) +
    +
    +
    +
    + + +
    +
    Variables
    + +
    + +
    + +
    + + string + $CRLF + = "\r\n" (line 64) + +
    + + +

    POP3 Carriage Return + Line Feed

    + + + + + +
    + +
    + +
    + + int + $do_debug + = 2 (line 70) + +
    + + +

    Displaying Debug warnings? (0 = now, 1+ = yes)

    + + + + + +
    + +
    + +
    + + string + $host + (line 76) + +
    + + +

    POP3 Mail Server

    + + + + + +
    + +
    + +
    + + string + $password + (line 100) + +
    + + +

    POP3 Password

    + + + + + +
    + +
    + +
    + + int + $POP3_PORT + = 110 (line 52) + +
    + + +

    Default POP3 port

    + + + + + +
    + +
    + +
    + + int + $POP3_TIMEOUT + = 30 (line 58) + +
    + + +

    Default Timeout

    + + + + + +
    + +
    + +
    + + int + $port + (line 82) + +
    + + +

    POP3 Port

    + + + + + +
    + +
    + +
    + + int + $tval + (line 88) + +
    + + +

    POP3 Timeout Value

    + + + + + +
    + +
    + +
    + + string + $username + (line 94) + +
    + + +

    POP3 Username

    + + + + + +
    + +
    +
    + + +
    +
    Methods
    + +
    + + +
    + +
    + Constructor POP3 (line 115) +
    + + +

    Constructor, sets the initial values

    + +
    + POP3 + + POP3 + + () +
    + + + +
    + +
    + +
    + Authorise (line 131) +
    + + +

    Combination of public events - connect, login, disconnect

    + +
    + void + + Authorise + + (string $host, [integer $port = false], [integer $tval = false], string $username, string $password, mixed $debug_level) +
    + +
      +
    • + string + $host
    • +
    • + integer + $port
    • +
    • + integer + $tval
    • +
    • + string + $username
    • +
    • + string + $password
    • +
    + + +
    + +
    + +
    + catchWarning (line 425) +
    + + +

    Takes over from PHP for the socket warning handler

    + +
    + void + + catchWarning + + (integer $errno, string $errstr, string $errfile, integer $errline) +
    + +
      +
    • + integer + $errno
    • +
    • + string + $errstr
    • +
    • + string + $errfile
    • +
    • + integer + $errline
    • +
    + + +
    + +
    + +
    + checkResponse (line 377) +
    + + +

    Checks the POP3 server response for +OK or -ERR

    + +
    + boolean + + checkResponse + + (string $string) +
    + +
      +
    • + string + $string
    • +
    + + +
    + +
    + +
    + Connect (line 192) +
    + + +

    Connect to the POP3 server

    + +
    + boolean + + Connect + + (string $host, [integer $port = false], [integer $tval = 30]) +
    + +
      +
    • + string + $host
    • +
    • + integer + $port
    • +
    • + integer + $tval
    • +
    + + +
    + +
    + +
    + Disconnect (line 330) +
    + + +

    Disconnect from the POP3 server

    + +
    + void + + Disconnect + + () +
    + + + +
    + +
    + +
    + displayErrors (line 405) +
    + + +

    If debug is enabled, display the error message array

    + +
    + void + + displayErrors + + () +
    + + + +
    + +
    + +
    + getResponse (line 350) +
    + + +

    Get the socket response back.

    +

    $size is the maximum number of bytes to retrieve

    + +
    + string + + getResponse + + ([integer $size = 128]) +
    + +
      +
    • + integer + $size
    • +
    + + +
    + +
    + +
    + Login (line 277) +
    + + +

    Login to the POP3 server (does not support APOP yet)

    + +
    + boolean + + Login + + ([string $username = ''], [string $password = '']) +
    + +
      +
    • + string + $username
    • +
    • + string + $password
    • +
    + + +
    + +
    + +
    + sendString (line 363) +
    + + +

    Send a string down the open socket connection to the POP3 server

    + +
    + integer + + sendString + + (string $string) +
    + +
      +
    • + string + $string
    • +
    + + +
    + +
    +
    + + +

    + Documentation generated on Thu, 02 Apr 2009 21:19:49 -0400 by phpDocumentor 1.3.0RC3 +

    +
    + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/SMTP.html b/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/SMTP.html new file mode 100644 index 000000000..7c6c6697b --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/SMTP.html @@ -0,0 +1,755 @@ + + + + + + Docs For Class SMTP + + + + +
    +

    Class SMTP

    + + +
    +
    Description
    + +
    + +

    + Located in /class.smtp.php (line 36) +

    + + +
    
    +	
    +			
    +
    + + + + +
    +
    Variable Summary
    + +
    +
    +
    + string + $CRLF +
    +
    + bool + $do_debug +
    +
    + bool + $do_verp +
    +
    + int + $SMTP_PORT +
    +
    +
    +
    + + +
    +
    Method Summary
    + +
    +
    + +
    + void + SMTP + () +
    + +
    + bool + Authenticate + (mixed $username, mixed $password) +
    + +
    + void + Close + () +
    + +
    + bool + Connect + (mixed $host, mixed $port, [mixed $tval = 30]) +
    + +
    + bool + Data + (mixed $msg_data) +
    + +
    + string + Expand + (mixed $name) +
    + +
    + bool + Hello + ([mixed $host = ""]) +
    + +
    + string + Help + ([mixed $keyword = ""]) +
    + +
    + bool + Mail + (mixed $from) +
    + +
    + bool + Noop + () +
    + +
    + bool + Quit + ([mixed $close_on_error = true]) +
    + +
    + bool + Recipient + (mixed $to) +
    + +
    + bool + Reset + () +
    + +
    + bool + Send + (mixed $from) +
    + +
    + bool + SendAndMail + (mixed $from) +
    + +
    + bool + SendOrMail + (mixed $from) +
    + +
    + bool + Turn + () +
    + +
    + int + Verify + (mixed $name) +
    +
    +
    +
    + + +
    +
    Variables
    + +
    + +
    + +
    + + string + $CRLF + = "\r\n" (line 48) + +
    + + +

    SMTP reply line ending

    + + + + + +
    + +
    + +
    + + bool + $do_debug + (line 54) + +
    + + +

    Sets whether debugging is turned on

    + + + + + +
    + +
    + +
    + + bool + $do_verp + = false (line 60) + +
    + + +

    Sets VERP use on/off (default is off)

    + + + + + +
    + +
    + +
    + + int + $SMTP_PORT + = 25 (line 42) + +
    + + +

    SMTP server port

    + + + + + +
    + +
    +
    + + +
    +
    Methods
    + +
    + + +
    + +
    + Constructor SMTP (line 75) +
    + + +

    Initialize the class so that the data is in a known state.

    +
      +
    • access: public
    • +
    + +
    + void + + SMTP + + () +
    + + + +
    + +
    + +
    + Authenticate (line 161) +
    + + +

    Performs SMTP authentication. Must be run after running the Hello() method. Returns true if successfully authenticated.

    +
      +
    • access: public
    • +
    + +
    + bool + + Authenticate + + (mixed $username, mixed $password) +
    + + + +
    + +
    + +
    + Close (line 249) +
    + + +

    Closes the socket and cleans up the state of the class.

    +

    It is not considered good to use this function without first trying to use QUIT.

    +
      +
    • access: public
    • +
    + +
    + void + + Close + + () +
    + + + +
    + +
    + +
    + Connect (line 100) +
    + + +

    Connect to the server specified on the port specified.

    +

    If the port is not specified use the default SMTP_PORT. If tval is specified then a connection will try and be established with the server for that number of seconds. If tval is not specified the default is 30 seconds to try on the connection.

    SMTP CODE SUCCESS: 220 SMTP CODE FAILURE: 421

    +
      +
    • access: public
    • +
    + +
    + bool + + Connect + + (mixed $host, mixed $port, [mixed $tval = 30]) +
    + + + +
    + +
    + +
    + Data (line 282) +
    + + +

    Issues a data command and sends the msg_data to the server

    +

    finializing the mail transaction. $msg_data is the message that is to be send with the headers. Each header needs to be on a single line followed by a <CRLF> with the message headers and the message body being seperated by and additional <CRLF>.

    Implements rfc 821: DATA <CRLF>

    SMTP CODE INTERMEDIATE: 354 [data] <CRLF>.<CRLF> SMTP CODE SUCCESS: 250 SMTP CODE FAILURE: 552,554,451,452 SMTP CODE FAILURE: 451,554 SMTP CODE ERROR : 500,501,503,421

    +
      +
    • access: public
    • +
    + +
    + bool + + Data + + (mixed $msg_data) +
    + + + +
    + +
    + +
    + Expand (line 421) +
    + + +

    Expand takes the name and asks the server to list all the people who are members of the _list_. Expand will return back and array of the result or false if an error occurs.

    +

    Each value in the array returned has the format of: [ <full-name> <sp> ] <path> The definition of <path> is defined in rfc 821

    Implements rfc 821: EXPN <SP> <string> <CRLF>

    SMTP CODE SUCCESS: 250 SMTP CODE FAILURE: 550 SMTP CODE ERROR : 500,501,502,504,421

    +
      +
    • return: array
    • +
    • access: public
    • +
    + +
    + string + + Expand + + (mixed $name) +
    + + + +
    + +
    + +
    + Hello (line 472) +
    + + +

    Sends the HELO command to the smtp server.

    +

    This makes sure that we and the server are in the same known state.

    Implements from rfc 821: HELO <SP> <domain> <CRLF>

    SMTP CODE SUCCESS: 250 SMTP CODE ERROR : 500, 501, 504, 421

    +
      +
    • access: public
    • +
    + +
    + bool + + Hello + + ([mixed $host = ""]) +
    + + + +
    + +
    + +
    + Help (line 546) +
    + + +

    Gets help information on the keyword specified. If the keyword

    +

    is not specified then returns generic help, ussually contianing A list of keywords that help is available on. This function returns the results back to the user. It is up to the user to handle the returned data. If an error occurs then false is returned with $this->error set appropiately.

    Implements rfc 821: HELP [ <SP> <string> ] <CRLF>

    SMTP CODE SUCCESS: 211,214 SMTP CODE ERROR : 500,501,502,504,421

    +
      +
    • access: public
    • +
    + +
    + string + + Help + + ([mixed $keyword = ""]) +
    + + + +
    + +
    + +
    + Mail (line 598) +
    + + +

    Starts a mail transaction from the email address specified in $from. Returns true if successful or false otherwise. If True the mail transaction is started and then one or more Recipient commands may be called followed by a Data command.

    +

    Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>

    SMTP CODE SUCCESS: 250 SMTP CODE SUCCESS: 552,451,452 SMTP CODE SUCCESS: 500,501,421

    +
      +
    • access: public
    • +
    + +
    + bool + + Mail + + (mixed $from) +
    + + + +
    + +
    + +
    + Noop (line 641) +
    + + +

    Sends the command NOOP to the SMTP server.

    +

    Implements from rfc 821: NOOP <CRLF>

    SMTP CODE SUCCESS: 250 SMTP CODE ERROR : 500, 421

    +
      +
    • access: public
    • +
    + +
    + bool + + Noop + + () +
    + + + +
    + +
    + +
    + Quit (line 684) +
    + + +

    Sends the quit command to the server and then closes the socket if there is no error or the $close_on_error argument is true.

    +

    Implements from rfc 821: QUIT <CRLF>

    SMTP CODE SUCCESS: 221 SMTP CODE ERROR : 500

    +
      +
    • access: public
    • +
    + +
    + bool + + Quit + + ([mixed $close_on_error = true]) +
    + + + +
    + +
    + +
    + Recipient (line 738) +
    + + +

    Sends the command RCPT to the SMTP server with the TO: argument of $to.

    +

    Returns true if the recipient was accepted false if it was rejected.

    Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>

    SMTP CODE SUCCESS: 250,251 SMTP CODE FAILURE: 550,551,552,553,450,451,452 SMTP CODE ERROR : 500,501,503,421

    +
      +
    • access: public
    • +
    + +
    + bool + + Recipient + + (mixed $to) +
    + + + +
    + +
    + +
    + Reset (line 782) +
    + + +

    Sends the RSET command to abort and transaction that is currently in progress. Returns true if successful false otherwise.

    +

    Implements rfc 821: RSET <CRLF>

    SMTP CODE SUCCESS: 250 SMTP CODE ERROR : 500,501,504,421

    +
      +
    • access: public
    • +
    + +
    + bool + + Reset + + () +
    + + + +
    + +
    + +
    + Send (line 831) +
    + + +

    Starts a mail transaction from the email address specified in

    +

    $from. Returns true if successful or false otherwise. If True the mail transaction is started and then one or more Recipient commands may be called followed by a Data command. This command will send the message to the users terminal if they are logged in.

    Implements rfc 821: SEND <SP> FROM:<reverse-path> <CRLF>

    SMTP CODE SUCCESS: 250 SMTP CODE SUCCESS: 552,451,452 SMTP CODE SUCCESS: 500,501,502,421

    +
      +
    • access: public
    • +
    + +
    + bool + + Send + + (mixed $from) +
    + + + +
    + +
    + +
    + SendAndMail (line 879) +
    + + +

    Starts a mail transaction from the email address specified in

    +

    $from. Returns true if successful or false otherwise. If True the mail transaction is started and then one or more Recipient commands may be called followed by a Data command. This command will send the message to the users terminal if they are logged in and send them an email.

    Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>

    SMTP CODE SUCCESS: 250 SMTP CODE SUCCESS: 552,451,452 SMTP CODE SUCCESS: 500,501,502,421

    +
      +
    • access: public
    • +
    + +
    + bool + + SendAndMail + + (mixed $from) +
    + + + +
    + +
    + +
    + SendOrMail (line 927) +
    + + +

    Starts a mail transaction from the email address specified in

    +

    $from. Returns true if successful or false otherwise. If True the mail transaction is started and then one or more Recipient commands may be called followed by a Data command. This command will send the message to the users terminal if they are logged in or mail it to them if they are not.

    Implements rfc 821: SOML <SP> FROM:<reverse-path> <CRLF>

    SMTP CODE SUCCESS: 250 SMTP CODE SUCCESS: 552,451,452 SMTP CODE SUCCESS: 500,501,502,421

    +
      +
    • access: public
    • +
    + +
    + bool + + SendOrMail + + (mixed $from) +
    + + + +
    + +
    + +
    + Turn (line 972) +
    + + +

    This is an optional command for SMTP that this class does not support. This method is here to make the RFC821 Definition complete for this class and __may__ be implimented in the future

    +

    Implements from rfc 821: TURN <CRLF>

    SMTP CODE SUCCESS: 250 SMTP CODE FAILURE: 502 SMTP CODE ERROR : 500, 503

    +
      +
    • access: public
    • +
    + +
    + bool + + Turn + + () +
    + + + +
    + +
    + +
    + Verify (line 994) +
    + + +

    Verifies that the name is recognized by the server.

    +

    Returns false if the name could not be verified otherwise the response from the server is returned.

    Implements rfc 821: VRFY <SP> <string> <CRLF>

    SMTP CODE SUCCESS: 250,251 SMTP CODE FAILURE: 550,551,553 SMTP CODE ERROR : 500,501,502,421

    +
      +
    • access: public
    • +
    + +
    + int + + Verify + + (mixed $name) +
    + + + +
    + +
    +
    + + +

    + Documentation generated on Thu, 02 Apr 2009 21:19:51 -0400 by phpDocumentor 1.3.0RC3 +

    +
    + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/_v2.0.4_PHPMailer_v2.0.4_class_phpmailer_php.html b/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/_v2.0.4_PHPMailer_v2.0.4_class_phpmailer_php.html new file mode 100644 index 000000000..bfcd69009 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/_v2.0.4_PHPMailer_v2.0.4_class_phpmailer_php.html @@ -0,0 +1,63 @@ + + + + + + Docs for page class.phpmailer.php + + + + +
    +

    /class.phpmailer.php

    + + +
    +
    Description
    + +
    + + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + PHPMailer + + +
    +
    +
    + + + + + +

    + Documentation generated on Thu, 02 Apr 2009 21:19:46 -0400 by phpDocumentor 1.3.0RC3 +

    +
    + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/_v2.0.4_PHPMailer_v2.0.4_class_pop3_php.html b/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/_v2.0.4_PHPMailer_v2.0.4_class_pop3_php.html new file mode 100644 index 000000000..b30da7980 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/_v2.0.4_PHPMailer_v2.0.4_class_pop3_php.html @@ -0,0 +1,63 @@ + + + + + + Docs for page class.pop3.php + + + + +
    +

    /class.pop3.php

    + + +
    +
    Description
    + +
    + + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + POP3 + + +
    +
    +
    + + + + + +

    + Documentation generated on Thu, 02 Apr 2009 21:19:49 -0400 by phpDocumentor 1.3.0RC3 +

    +
    + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/_v2.0.4_PHPMailer_v2.0.4_class_smtp_php.html b/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/_v2.0.4_PHPMailer_v2.0.4_class_smtp_php.html new file mode 100644 index 000000000..d43e6f8ea --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/PHPMailer/_v2.0.4_PHPMailer_v2.0.4_class_smtp_php.html @@ -0,0 +1,63 @@ + + + + + + Docs for page class.smtp.php + + + + +
    +

    /class.smtp.php

    + + +
    +
    Description
    + +
    + + + +
    +
    + + +
    +
    Classes
    + +
    + + + + + + + + + +
    ClassDescription
    + SMTP + + +
    +
    +
    + + + + + +

    + Documentation generated on Thu, 02 Apr 2009 21:19:49 -0400 by phpDocumentor 1.3.0RC3 +

    +
    + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/__filesource/fsource_PHPMailer__class.phpmailer.php.html b/plugin/PHPMailer_v2.0.4/phpdocs/__filesource/fsource_PHPMailer__class.phpmailer.php.html new file mode 100644 index 000000000..bb7cddb15 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/__filesource/fsource_PHPMailer__class.phpmailer.php.html @@ -0,0 +1,1951 @@ + + + + + + File Source for class.phpmailer.php + + + + +

    Source for file class.phpmailer.php

    +

    Documentation is available at class.phpmailer.php

    +
    +
    1. <?php
    2. +
    3. /*~ class.phpmailer.php
    4. +
    5. .---------------------------------------------------------------------------.
    6. +
    7. | Software: PHPMailer - PHP email class |
    8. +
    9. | Version: 2.0.4 |
    10. +
    11. | Contact: via sourceforge.net support pages (also www.codeworxtech.com) |
    12. +
    13. | Info: http://phpmailer.sourceforge.net |
    14. +
    15. | Support: http://sourceforge.net/projects/phpmailer/ |
    16. +
    17. | ------------------------------------------------------------------------- |
    18. +
    19. | Author: Andy Prevost (project admininistrator) |
    20. +
    21. | Author: Brent R. Matzelle (original founder) |
    22. +
    23. | Copyright (c) 2004-2007, Andy Prevost. All Rights Reserved. |
    24. +
    25. | Copyright (c) 2001-2003, Brent R. Matzelle |
    26. +
    27. | ------------------------------------------------------------------------- |
    28. +
    29. | License: Distributed under the Lesser General Public License (LGPL) |
    30. +
    31. | http://www.gnu.org/copyleft/lesser.html |
    32. +
    33. | This program is distributed in the hope that it will be useful - WITHOUT |
    34. +
    35. | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
    36. +
    37. | FITNESS FOR A PARTICULAR PURPOSE. |
    38. +
    39. | ------------------------------------------------------------------------- |
    40. +
    41. | We offer a number of paid services (www.codeworxtech.com): |
    42. +
    43. | - Web Hosting on highly optimized fast and secure servers |
    44. +
    45. | - Technology Consulting |
    46. +
    47. | - Oursourcing (highly qualified programmers and graphic designers) |
    48. +
    49. '---------------------------------------------------------------------------'
    50. +
    51.  
    52. +
    53.  
    54. +
    55.  
    56. +
    57. /**
    58. +
    59. * PHPMailer - PHP email transport class
    60. +
    61. * @package PHPMailer
    62. +
    63. * @author Andy Prevost
    64. +
    65. * @copyright 2004 - 2009 Andy Prevost
    66. +
    67. */
    68. +
    69.  
    70. +
    71. class PHPMailer {
    72. +
    73.  
    74. +
    75. /////////////////////////////////////////////////
    76. +
    77. // PROPERTIES, PUBLIC
    78. +
    79. /////////////////////////////////////////////////
    80. +
    81.  
    82. +
    83. +
    84.  
    85. +
    86. /**
    87. +
    88. * Email priority (1 = High, 3 = Normal, 5 = low).
    89. +
    90. * @var int
    91. +
    92. */
    93. +
    94. var $Priority = 3;
    95. +
    96.  
    97. +
    98. /**
    99. +
    100. * Sets the CharSet of the message.
    101. +
    102. * @var string
    103. +
    104. */
    105. +
    106. var $CharSet = 'iso-8859-1';
    107. +
    108.  
    109. +
    110. /**
    111. +
    112. * Sets the Content-type of the message.
    113. +
    114. * @var string
    115. +
    116. */
    117. +
    118. var $ContentType = 'text/plain';
    119. +
    120.  
    121. +
    122. /**
    123. +
    124. * Sets the Encoding of the message. Options for this are "8bit",
    125. +
    126. * "7bit", "binary", "base64", and "quoted-printable".
    127. +
    128. * @var string
    129. +
    130. */
    131. +
    132. var $Encoding = '8bit';
    133. +
    134.  
    135. +
    136. /**
    137. +
    138. * Holds the most recent mailer error message.
    139. +
    140. * @var string
    141. +
    142. */
    143. +
    144. var $ErrorInfo = '';
    145. +
    146.  
    147. +
    148. /**
    149. +
    150. * Sets the From email address for the message.
    151. +
    152. * @var string
    153. +
    154. */
    155. +
    156. var $From = 'root@localhost';
    157. +
    158.  
    159. +
    160. /**
    161. +
    162. * Sets the From name of the message.
    163. +
    164. * @var string
    165. +
    166. */
    167. +
    168. var $FromName = 'Root User';
    169. +
    170.  
    171. +
    172. /**
    173. +
    174. * Sets the Sender email (Return-Path) of the message. If not empty,
    175. +
    176. * will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
    177. +
    178. * @var string
    179. +
    180. */
    181. +
    182. var $Sender = '';
    183. +
    184.  
    185. +
    186. /**
    187. +
    188. * Sets the Subject of the message.
    189. +
    190. * @var string
    191. +
    192. */
    193. +
    194. var $Subject = '';
    195. +
    196.  
    197. +
    198. /**
    199. +
    200. * Sets the Body of the message. This can be either an HTML or text body.
    201. +
    202. * If HTML then run IsHTML(true).
    203. +
    204. * @var string
    205. +
    206. */
    207. +
    208. var $Body = '';
    209. +
    210.  
    211. +
    212. /**
    213. +
    214. * Sets the text-only body of the message. This automatically sets the
    215. +
    216. * email to multipart/alternative. This body can be read by mail
    217. +
    218. * clients that do not have HTML email capability such as mutt. Clients
    219. +
    220. * that can read HTML will view the normal Body.
    221. +
    222. * @var string
    223. +
    224. */
    225. +
    226. var $AltBody = '';
    227. +
    228.  
    229. +
    230. /**
    231. +
    232. * Sets word wrapping on the body of the message to a given number of
    233. +
    234. * characters.
    235. +
    236. * @var int
    237. +
    238. */
    239. +
    240. var $WordWrap = 0;
    241. +
    242.  
    243. +
    244. /**
    245. +
    246. * Method to send mail: ("mail", "sendmail", or "smtp").
    247. +
    248. * @var string
    249. +
    250. */
    251. +
    252. var $Mailer = 'mail';
    253. +
    254.  
    255. +
    256. /**
    257. +
    258. * Sets the path of the sendmail program.
    259. +
    260. * @var string
    261. +
    262. */
    263. +
    264. var $Sendmail = '/usr/sbin/sendmail';
    265. +
    266.  
    267. +
    268. /**
    269. +
    270. * Path to PHPMailer plugins. This is now only useful if the SMTP class
    271. +
    272. * is in a different directory than the PHP include path.
    273. +
    274. * @var string
    275. +
    276. */
    277. +
    278. var $PluginDir = '';
    279. +
    280.  
    281. +
    282. /**
    283. +
    284. * Holds PHPMailer version.
    285. +
    286. * @var string
    287. +
    288. */
    289. +
    290. var $Version = "2.0.4";
    291. +
    292.  
    293. +
    294. /**
    295. +
    296. * Sets the email address that a reading confirmation will be sent.
    297. +
    298. * @var string
    299. +
    300. */
    301. +
    302. var $ConfirmReadingTo = '';
    303. +
    304.  
    305. +
    306. /**
    307. +
    308. * Sets the hostname to use in Message-Id and Received headers
    309. +
    310. * and as default HELO string. If empty, the value returned
    311. +
    312. * by SERVER_NAME is used or 'localhost.localdomain'.
    313. +
    314. * @var string
    315. +
    316. */
    317. +
    318. var $Hostname = '';
    319. +
    320.  
    321. +
    322. /**
    323. +
    324. * Sets the message ID to be used in the Message-Id header.
    325. +
    326. * If empty, a unique id will be generated.
    327. +
    328. * @var string
    329. +
    330. */
    331. +
    332. var $MessageID = '';
    333. +
    334.  
    335. +
    336. /////////////////////////////////////////////////
    337. +
    338. // PROPERTIES FOR SMTP
    339. +
    340. /////////////////////////////////////////////////
    341. +
    342.  
    343. +
    344. +
    345.  
    346. +
    347. /**
    348. +
    349. * Sets the SMTP hosts. All hosts must be separated by a
    350. +
    351. * semicolon. You can also specify a different port
    352. +
    353. * for each host by using this format: [hostname:port]
    354. +
    355. * (e.g. "smtp1.example.com:25;smtp2.example.com").
    356. +
    357. * Hosts will be tried in order.
    358. +
    359. * @var string
    360. +
    361. */
    362. +
    363. var $Host = 'localhost';
    364. +
    365.  
    366. +
    367. /**
    368. +
    369. * Sets the default SMTP server port.
    370. +
    371. * @var int
    372. +
    373. */
    374. +
    375. var $Port = 25;
    376. +
    377.  
    378. +
    379. /**
    380. +
    381. * Sets the SMTP HELO of the message (Default is $Hostname).
    382. +
    383. * @var string
    384. +
    385. */
    386. +
    387. var $Helo = '';
    388. +
    389.  
    390. +
    391. /**
    392. +
    393. * Sets connection prefix.
    394. +
    395. * Options are "", "ssl" or "tls"
    396. +
    397. * @var string
    398. +
    399. */
    400. +
    401. var $SMTPSecure = "";
    402. +
    403.  
    404. +
    405. /**
    406. +
    407. * Sets SMTP authentication. Utilizes the Username and Password variables.
    408. +
    409. * @var bool
    410. +
    411. */
    412. +
    413. var $SMTPAuth = false;
    414. +
    415.  
    416. +
    417. /**
    418. +
    419. * Sets SMTP username.
    420. +
    421. * @var string
    422. +
    423. */
    424. +
    425. var $Username = '';
    426. +
    427.  
    428. +
    429. /**
    430. +
    431. * Sets SMTP password.
    432. +
    433. * @var string
    434. +
    435. */
    436. +
    437. var $Password = '';
    438. +
    439.  
    440. +
    441. /**
    442. +
    443. * Sets the SMTP server timeout in seconds. This function will not
    444. +
    445. * work with the win32 version.
    446. +
    447. * @var int
    448. +
    449. */
    450. +
    451. var $Timeout = 10;
    452. +
    453.  
    454. +
    455. /**
    456. +
    457. * Sets SMTP class debugging on or off.
    458. +
    459. * @var bool
    460. +
    461. */
    462. +
    463. var $SMTPDebug = false;
    464. +
    465.  
    466. +
    467. /**
    468. +
    469. * Prevents the SMTP connection from being closed after each mail
    470. +
    471. * sending. If this is set to true then to close the connection
    472. +
    473. * requires an explicit call to SmtpClose().
    474. +
    475. * @var bool
    476. +
    477. */
    478. +
    479. var $SMTPKeepAlive = false;
    480. +
    481.  
    482. +
    483. /**
    484. +
    485. * Provides the ability to have the TO field process individual
    486. +
    487. * emails, instead of sending to entire TO addresses
    488. +
    489. * @var bool
    490. +
    491. */
    492. +
    493. var $SingleTo = false;
    494. +
    495.  
    496. +
    497. /////////////////////////////////////////////////
    498. +
    499. // PROPERTIES, PRIVATE
    500. +
    501. /////////////////////////////////////////////////
    502. +
    503.  
    504. +
    505. +
    506.  
    507. +
    508. var $smtp = NULL;
    509. +
    510. var $to = array();
    511. +
    512. var $cc = array();
    513. +
    514. var $bcc = array();
    515. +
    516. var $ReplyTo = array();
    517. +
    518. var $attachment = array();
    519. +
    520. var $CustomHeader = array();
    521. +
    522. var $message_type = '';
    523. +
    524. var $boundary = array();
    525. +
    526. var $language = array();
    527. +
    528. var $error_count = 0;
    529. +
    530. var $LE = "\n";
    531. +
    532. var $sign_cert_file = "";
    533. +
    534. var $sign_key_file = "";
    535. +
    536. var $sign_key_pass = "";
    537. +
    538.  
    539. +
    540. /////////////////////////////////////////////////
    541. +
    542. // METHODS, VARIABLES
    543. +
    544. /////////////////////////////////////////////////
    545. +
    546.  
    547. +
    548. +
    549.  
    550. +
    551. /**
    552. +
    553. * Sets message type to HTML.
    554. +
    555. * @param bool $bool
    556. +
    557. * @return void
    558. +
    559. */
    560. +
    561. function IsHTML($bool) {
    562. +
    563. if($bool == true) {
    564. +
    565. $this->ContentType = 'text/html';
    566. +
    567. } else {
    568. +
    569. $this->ContentType = 'text/plain';
    570. +
    571. }
    572. +
    573. }
    574. +
    575.  
    576. +
    577. /**
    578. +
    579. * Sets Mailer to send message using SMTP.
    580. +
    581. * @return void
    582. +
    583. */
    584. +
    585. function IsSMTP() {
    586. +
    587. $this->Mailer = 'smtp';
    588. +
    589. }
    590. +
    591.  
    592. +
    593. /**
    594. +
    595. * Sets Mailer to send message using PHP mail() function.
    596. +
    597. * @return void
    598. +
    599. */
    600. +
    601. function IsMail() {
    602. +
    603. $this->Mailer = 'mail';
    604. +
    605. }
    606. +
    607.  
    608. +
    609. /**
    610. +
    611. * Sets Mailer to send message using the $Sendmail program.
    612. +
    613. * @return void
    614. +
    615. */
    616. +
    617. function IsSendmail() {
    618. +
    619. $this->Mailer = 'sendmail';
    620. +
    621. }
    622. +
    623.  
    624. +
    625. /**
    626. +
    627. * Sets Mailer to send message using the qmail MTA.
    628. +
    629. * @return void
    630. +
    631. */
    632. +
    633. function IsQmail() {
    634. +
    635. $this->Sendmail = '/var/qmail/bin/sendmail';
    636. +
    637. $this->Mailer = 'sendmail';
    638. +
    639. }
    640. +
    641.  
    642. +
    643. /////////////////////////////////////////////////
    644. +
    645. // METHODS, RECIPIENTS
    646. +
    647. /////////////////////////////////////////////////
    648. +
    649.  
    650. +
    651. +
    652.  
    653. +
    654. /**
    655. +
    656. * Adds a "To" address.
    657. +
    658. * @param string $address
    659. +
    660. * @param string $name
    661. +
    662. * @return void
    663. +
    664. */
    665. +
    666. function AddAddress($address, $name = '') {
    667. +
    668. $cur = count($this->to);
    669. +
    670. $this->to[$cur][0] = trim($address);
    671. +
    672. $this->to[$cur][1] = $name;
    673. +
    674. }
    675. +
    676.  
    677. +
    678. /**
    679. +
    680. * Adds a "Cc" address. Note: this function works
    681. +
    682. * with the SMTP mailer on win32, not with the "mail"
    683. +
    684. * mailer.
    685. +
    686. * @param string $address
    687. +
    688. * @param string $name
    689. +
    690. * @return void
    691. +
    692. */
    693. +
    694. function AddCC($address, $name = '') {
    695. +
    696. $cur = count($this->cc);
    697. +
    698. $this->cc[$cur][0] = trim($address);
    699. +
    700. $this->cc[$cur][1] = $name;
    701. +
    702. }
    703. +
    704.  
    705. +
    706. /**
    707. +
    708. * Adds a "Bcc" address. Note: this function works
    709. +
    710. * with the SMTP mailer on win32, not with the "mail"
    711. +
    712. * mailer.
    713. +
    714. * @param string $address
    715. +
    716. * @param string $name
    717. +
    718. * @return void
    719. +
    720. */
    721. +
    722. function AddBCC($address, $name = '') {
    723. +
    724. $cur = count($this->bcc);
    725. +
    726. $this->bcc[$cur][0] = trim($address);
    727. +
    728. $this->bcc[$cur][1] = $name;
    729. +
    730. }
    731. +
    732.  
    733. +
    734. /**
    735. +
    736. * Adds a "Reply-To" address.
    737. +
    738. * @param string $address
    739. +
    740. * @param string $name
    741. +
    742. * @return void
    743. +
    744. */
    745. +
    746. function AddReplyTo($address, $name = '') {
    747. +
    748. $cur = count($this->ReplyTo);
    749. +
    750. $this->ReplyTo[$cur][0] = trim($address);
    751. +
    752. $this->ReplyTo[$cur][1] = $name;
    753. +
    754. }
    755. +
    756.  
    757. +
    758. /////////////////////////////////////////////////
    759. +
    760. // METHODS, MAIL SENDING
    761. +
    762. /////////////////////////////////////////////////
    763. +
    764.  
    765. +
    766. +
    767.  
    768. +
    769. /**
    770. +
    771. * Creates message and assigns Mailer. If the message is
    772. +
    773. * not sent successfully then it returns false. Use the ErrorInfo
    774. +
    775. * variable to view description of the error.
    776. +
    777. * @return bool
    778. +
    779. */
    780. +
    781. function Send() {
    782. +
    783. $header = '';
    784. +
    785. $body = '';
    786. +
    787. $result = true;
    788. +
    789.  
    790. +
    791. if((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
    792. +
    793. $this->SetError($this->Lang('provide_address'));
    794. +
    795. return false;
    796. +
    797. }
    798. +
    799.  
    800. +
    801. /* Set whether the message is multipart/alternative */
    802. +
    803. if(!empty($this->AltBody)) {
    804. +
    805. $this->ContentType = 'multipart/alternative';
    806. +
    807. }
    808. +
    809.  
    810. +
    811. $this->error_count = 0; // reset errors
    812. +
    813. $this->SetMessageType();
    814. +
    815. $header .= $this->CreateHeader();
    816. +
    817. $body = $this->CreateBody();
    818. +
    819.  
    820. +
    821. if($body == '') {
    822. +
    823. return false;
    824. +
    825. }
    826. +
    827.  
    828. +
    829. /* Choose the mailer */
    830. +
    831. switch($this->Mailer) {
    832. +
    833. case 'sendmail':
    834. +
    835. $result = $this->SendmailSend($header, $body);
    836. +
    837. break;
    838. +
    839. case 'smtp':
    840. +
    841. $result = $this->SmtpSend($header, $body);
    842. +
    843. break;
    844. +
    845. case 'mail':
    846. +
    847. $result = $this->MailSend($header, $body);
    848. +
    849. break;
    850. +
    851. default:
    852. +
    853. $result = $this->MailSend($header, $body);
    854. +
    855. break;
    856. +
    857. //$this->SetError($this->Mailer . $this->Lang('mailer_not_supported'));
    858. +
    859. //$result = false;
    860. +
    861. //break;
    862. +
    863. }
    864. +
    865.  
    866. +
    867. return $result;
    868. +
    869. }
    870. +
    871.  
    872. +
    873. /**
    874. +
    875. * Sends mail using the $Sendmail program.
    876. +
    877. * @access private
    878. +
    879. * @return bool
    880. +
    881. */
    882. +
    883. function SendmailSend($header, $body) {
    884. +
    885. if ($this->Sender != '') {
    886. +
    887. $sendmail = sprintf("%s -oi -f %s -t", escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
    888. +
    889. } else {
    890. +
    891. $sendmail = sprintf("%s -oi -t", escapeshellcmd($this->Sendmail));
    892. +
    893. }
    894. +
    895.  
    896. +
    897. if(!@$mail = popen($sendmail, 'w')) {
    898. +
    899. $this->SetError($this->Lang('execute') . $this->Sendmail);
    900. +
    901. return false;
    902. +
    903. }
    904. +
    905.  
    906. +
    907. fputs($mail, $header);
    908. +
    909. fputs($mail, $body);
    910. +
    911.  
    912. +
    913. $result = pclose($mail);
    914. +
    915. if (version_compare(phpversion(), '4.2.3') == -1) {
    916. +
    917. $result = $result >> 8 & 0xFF;
    918. +
    919. }
    920. +
    921. if($result != 0) {
    922. +
    923. $this->SetError($this->Lang('execute') . $this->Sendmail);
    924. +
    925. return false;
    926. +
    927. }
    928. +
    929. return true;
    930. +
    931. }
    932. +
    933.  
    934. +
    935. /**
    936. +
    937. * Sends mail using the PHP mail() function.
    938. +
    939. * @access private
    940. +
    941. * @return bool
    942. +
    943. */
    944. +
    945. function MailSend($header, $body) {
    946. +
    947.  
    948. +
    949. $to = '';
    950. +
    951. for($i = 0; $i < count($this->to); $i++) {
    952. +
    953. if($i != 0) { $to .= ', '; }
    954. +
    955. $to .= $this->AddrFormat($this->to[$i]);
    956. +
    957. }
    958. +
    959.  
    960. +
    961. $toArr = split(',', $to);
    962. +
    963.  
    964. +
    965. $params = sprintf("-oi -f %s", $this->Sender);
    966. +
    967. if ($this->Sender != '' && strlen(ini_get('safe_mode')) < 1) {
    968. +
    969. $old_from = ini_get('sendmail_from');
    970. +
    971. ini_set('sendmail_from', $this->Sender);
    972. +
    973. if ($this->SingleTo === true && count($toArr) > 1) {
    974. +
    975. foreach ($toArr as $key => $val) {
    976. +
    977. $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
    978. +
    979. }
    980. +
    981. } else {
    982. +
    983. $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
    984. +
    985. }
    986. +
    987. } else {
    988. +
    989. if ($this->SingleTo === true && count($toArr) > 1) {
    990. +
    991. foreach ($toArr as $key => $val) {
    992. +
    993. $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
    994. +
    995. }
    996. +
    997. } else {
    998. +
    999. $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header);
    1000. +
    1001. }
    1002. +
    1003. }
    1004. +
    1005.  
    1006. +
    1007. if (isset($old_from)) {
    1008. +
    1009. ini_set('sendmail_from', $old_from);
    1010. +
    1011. }
    1012. +
    1013.  
    1014. +
    1015. if(!$rt) {
    1016. +
    1017. $this->SetError($this->Lang('instantiate'));
    1018. +
    1019. return false;
    1020. +
    1021. }
    1022. +
    1023.  
    1024. +
    1025. return true;
    1026. +
    1027. }
    1028. +
    1029.  
    1030. +
    1031. /**
    1032. +
    1033. * Sends mail via SMTP using PhpSMTP (Author:
    1034. +
    1035. * Chris Ryan). Returns bool. Returns false if there is a
    1036. +
    1037. * bad MAIL FROM, RCPT, or DATA input.
    1038. +
    1039. * @access private
    1040. +
    1041. * @return bool
    1042. +
    1043. */
    1044. +
    1045. function SmtpSend($header, $body) {
    1046. +
    1047. include_once($this->PluginDir . 'class.smtp.php');
    1048. +
    1049. $error = '';
    1050. +
    1051. $bad_rcpt = array();
    1052. +
    1053.  
    1054. +
    1055. if(!$this->SmtpConnect()) {
    1056. +
    1057. return false;
    1058. +
    1059. }
    1060. +
    1061.  
    1062. +
    1063. $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;
    1064. +
    1065. if(!$this->smtp->Mail($smtp_from)) {
    1066. +
    1067. $error = $this->Lang('from_failed') . $smtp_from;
    1068. +
    1069. $this->SetError($error);
    1070. +
    1071. $this->smtp->Reset();
    1072. +
    1073. return false;
    1074. +
    1075. }
    1076. +
    1077.  
    1078. +
    1079. /* Attempt to send attach all recipients */
    1080. +
    1081. for($i = 0; $i < count($this->to); $i++) {
    1082. +
    1083. if(!$this->smtp->Recipient($this->to[$i][0])) {
    1084. +
    1085. $bad_rcpt[] = $this->to[$i][0];
    1086. +
    1087. }
    1088. +
    1089. }
    1090. +
    1091. for($i = 0; $i < count($this->cc); $i++) {
    1092. +
    1093. if(!$this->smtp->Recipient($this->cc[$i][0])) {
    1094. +
    1095. $bad_rcpt[] = $this->cc[$i][0];
    1096. +
    1097. }
    1098. +
    1099. }
    1100. +
    1101. for($i = 0; $i < count($this->bcc); $i++) {
    1102. +
    1103. if(!$this->smtp->Recipient($this->bcc[$i][0])) {
    1104. +
    1105. $bad_rcpt[] = $this->bcc[$i][0];
    1106. +
    1107. }
    1108. +
    1109. }
    1110. +
    1111.  
    1112. +
    1113. if(count($bad_rcpt) > 0) { // Create error message
    1114. +
    1115. for($i = 0; $i < count($bad_rcpt); $i++) {
    1116. +
    1117. if($i != 0) {
    1118. +
    1119. $error .= ', ';
    1120. +
    1121. }
    1122. +
    1123. $error .= $bad_rcpt[$i];
    1124. +
    1125. }
    1126. +
    1127. $error = $this->Lang('recipients_failed') . $error;
    1128. +
    1129. $this->SetError($error);
    1130. +
    1131. $this->smtp->Reset();
    1132. +
    1133. return false;
    1134. +
    1135. }
    1136. +
    1137.  
    1138. +
    1139. if(!$this->smtp->Data($header . $body)) {
    1140. +
    1141. $this->SetError($this->Lang('data_not_accepted'));
    1142. +
    1143. $this->smtp->Reset();
    1144. +
    1145. return false;
    1146. +
    1147. }
    1148. +
    1149. if($this->SMTPKeepAlive == true) {
    1150. +
    1151. $this->smtp->Reset();
    1152. +
    1153. } else {
    1154. +
    1155. $this->SmtpClose();
    1156. +
    1157. }
    1158. +
    1159.  
    1160. +
    1161. return true;
    1162. +
    1163. }
    1164. +
    1165.  
    1166. +
    1167. /**
    1168. +
    1169. * Initiates a connection to an SMTP server. Returns false if the
    1170. +
    1171. * operation failed.
    1172. +
    1173. * @access private
    1174. +
    1175. * @return bool
    1176. +
    1177. */
    1178. +
    1179. function SmtpConnect() {
    1180. +
    1181. if($this->smtp == NULL) {
    1182. +
    1183. $this->smtp = new SMTP();
    1184. +
    1185. }
    1186. +
    1187.  
    1188. +
    1189. $this->smtp->do_debug = $this->SMTPDebug;
    1190. +
    1191. $hosts = explode(';', $this->Host);
    1192. +
    1193. $index = 0;
    1194. +
    1195. $connection = ($this->smtp->Connected());
    1196. +
    1197.  
    1198. +
    1199. /* Retry while there is no connection */
    1200. +
    1201. while($index < count($hosts) && $connection == false) {
    1202. +
    1203. $hostinfo = array();
    1204. +
    1205. if(eregi('^(.+):([0-9]+)$', $hosts[$index], $hostinfo)) {
    1206. +
    1207. $host = $hostinfo[1];
    1208. +
    1209. $port = $hostinfo[2];
    1210. +
    1211. } else {
    1212. +
    1213. $host = $hosts[$index];
    1214. +
    1215. $port = $this->Port;
    1216. +
    1217. }
    1218. +
    1219.  
    1220. +
    1221. if($this->smtp->Connect(((!empty($this->SMTPSecure))?$this->SMTPSecure.'://':'').$host, $port, $this->Timeout)) {
    1222. +
    1223. if ($this->Helo != '') {
    1224. +
    1225. $this->smtp->Hello($this->Helo);
    1226. +
    1227. } else {
    1228. +
    1229. $this->smtp->Hello($this->ServerHostname());
    1230. +
    1231. }
    1232. +
    1233.  
    1234. +
    1235. $connection = true;
    1236. +
    1237. if($this->SMTPAuth) {
    1238. +
    1239. if(!$this->smtp->Authenticate($this->Username, $this->Password)) {
    1240. +
    1241. $this->SetError($this->Lang('authenticate'));
    1242. +
    1243. $this->smtp->Reset();
    1244. +
    1245. $connection = false;
    1246. +
    1247. }
    1248. +
    1249. }
    1250. +
    1251. }
    1252. +
    1253. $index++;
    1254. +
    1255. }
    1256. +
    1257. if(!$connection) {
    1258. +
    1259. $this->SetError($this->Lang('connect_host'));
    1260. +
    1261. }
    1262. +
    1263.  
    1264. +
    1265. return $connection;
    1266. +
    1267. }
    1268. +
    1269.  
    1270. +
    1271. /**
    1272. +
    1273. * Closes the active SMTP session if one exists.
    1274. +
    1275. * @return void
    1276. +
    1277. */
    1278. +
    1279. function SmtpClose() {
    1280. +
    1281. if($this->smtp != NULL) {
    1282. +
    1283. if($this->smtp->Connected()) {
    1284. +
    1285. $this->smtp->Quit();
    1286. +
    1287. $this->smtp->Close();
    1288. +
    1289. }
    1290. +
    1291. }
    1292. +
    1293. }
    1294. +
    1295.  
    1296. +
    1297. /**
    1298. +
    1299. * Sets the language for all class error messages. Returns false
    1300. +
    1301. * if it cannot load the language file. The default language type
    1302. +
    1303. * is English.
    1304. +
    1305. * @param string $lang_type Type of language (e.g. Portuguese: "br")
    1306. +
    1307. * @param string $lang_path Path to the language file directory
    1308. +
    1309. * @access public
    1310. +
    1311. * @return bool
    1312. +
    1313. */
    1314. +
    1315. function SetLanguage($lang_type, $lang_path = 'language/') {
    1316. +
    1317. if(file_exists($lang_path.'phpmailer.lang-'.$lang_type.'.php')) {
    1318. +
    1319. include($lang_path.'phpmailer.lang-'.$lang_type.'.php');
    1320. +
    1321. } elseif (file_exists($lang_path.'phpmailer.lang-en.php')) {
    1322. +
    1323. include($lang_path.'phpmailer.lang-en.php');
    1324. +
    1325. } else {
    1326. +
    1327. $PHPMAILER_LANG = array();
    1328. +
    1329. $PHPMAILER_LANG["provide_address"] = 'You must provide at least one ' .
    1330. +
    1331. $PHPMAILER_LANG["mailer_not_supported"] = ' mailer is not supported.';
    1332. +
    1333. $PHPMAILER_LANG["execute"] = 'Could not execute: ';
    1334. +
    1335. $PHPMAILER_LANG["instantiate"] = 'Could not instantiate mail function.';
    1336. +
    1337. $PHPMAILER_LANG["authenticate"] = 'SMTP Error: Could not authenticate.';
    1338. +
    1339. $PHPMAILER_LANG["from_failed"] = 'The following From address failed: ';
    1340. +
    1341. $PHPMAILER_LANG["recipients_failed"] = 'SMTP Error: The following ' .
    1342. +
    1343. $PHPMAILER_LANG["data_not_accepted"] = 'SMTP Error: Data not accepted.';
    1344. +
    1345. $PHPMAILER_LANG["connect_host"] = 'SMTP Error: Could not connect to SMTP host.';
    1346. +
    1347. $PHPMAILER_LANG["file_access"] = 'Could not access file: ';
    1348. +
    1349. $PHPMAILER_LANG["file_open"] = 'File Error: Could not open file: ';
    1350. +
    1351. $PHPMAILER_LANG["encoding"] = 'Unknown encoding: ';
    1352. +
    1353. $PHPMAILER_LANG["signing"] = 'Signing Error: ';
    1354. +
    1355. }
    1356. +
    1357. $this->language = $PHPMAILER_LANG;
    1358. +
    1359.  
    1360. +
    1361. return true;
    1362. +
    1363. }
    1364. +
    1365.  
    1366. +
    1367. /////////////////////////////////////////////////
    1368. +
    1369. // METHODS, MESSAGE CREATION
    1370. +
    1371. /////////////////////////////////////////////////
    1372. +
    1373.  
    1374. +
    1375. +
    1376.  
    1377. +
    1378. /**
    1379. +
    1380. * Creates recipient headers.
    1381. +
    1382. * @access private
    1383. +
    1384. * @return string
    1385. +
    1386. */
    1387. +
    1388. function AddrAppend($type, $addr) {
    1389. +
    1390. $addr_str = $type . ': ';
    1391. +
    1392. $addr_str .= $this->AddrFormat($addr[0]);
    1393. +
    1394. if(count($addr) > 1) {
    1395. +
    1396. for($i = 1; $i < count($addr); $i++) {
    1397. +
    1398. $addr_str .= ', ' . $this->AddrFormat($addr[$i]);
    1399. +
    1400. }
    1401. +
    1402. }
    1403. +
    1404. $addr_str .= $this->LE;
    1405. +
    1406.  
    1407. +
    1408. return $addr_str;
    1409. +
    1410. }
    1411. +
    1412.  
    1413. +
    1414. /**
    1415. +
    1416. * Formats an address correctly.
    1417. +
    1418. * @access private
    1419. +
    1420. * @return string
    1421. +
    1422. */
    1423. +
    1424. function AddrFormat($addr) {
    1425. +
    1426. if(empty($addr[1])) {
    1427. +
    1428. $formatted = $this->SecureHeader($addr[0]);
    1429. +
    1430. } else {
    1431. +
    1432. $formatted = $this->EncodeHeader($this->SecureHeader($addr[1]), 'phrase') . " <" . $this->SecureHeader($addr[0]) . ">";
    1433. +
    1434. }
    1435. +
    1436.  
    1437. +
    1438. return $formatted;
    1439. +
    1440. }
    1441. +
    1442.  
    1443. +
    1444. /**
    1445. +
    1446. * Wraps message for use with mailers that do not
    1447. +
    1448. * automatically perform wrapping and for quoted-printable.
    1449. +
    1450. * Original written by philippe.
    1451. +
    1452. * @access private
    1453. +
    1454. * @return string
    1455. +
    1456. */
    1457. +
    1458. function WrapText($message, $length, $qp_mode = false) {
    1459. +
    1460. $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;
    1461. +
    1462. // If utf-8 encoding is used, we will need to make sure we don't
    1463. +
    1464. // split multibyte characters when we wrap
    1465. +
    1466. $is_utf8 = (strtolower($this->CharSet) == "utf-8");
    1467. +
    1468.  
    1469. +
    1470. $message = $this->FixEOL($message);
    1471. +
    1472. if (substr($message, -1) == $this->LE) {
    1473. +
    1474. $message = substr($message, 0, -1);
    1475. +
    1476. }
    1477. +
    1478.  
    1479. +
    1480. $line = explode($this->LE, $message);
    1481. +
    1482. $message = '';
    1483. +
    1484. for ($i=0 ;$i < count($line); $i++) {
    1485. +
    1486. $line_part = explode(' ', $line[$i]);
    1487. +
    1488. $buf = '';
    1489. +
    1490. for ($e = 0; $e<count($line_part); $e++) {
    1491. +
    1492. $word = $line_part[$e];
    1493. +
    1494. if ($qp_mode and (strlen($word) > $length)) {
    1495. +
    1496. $space_left = $length - strlen($buf) - 1;
    1497. +
    1498. if ($e != 0) {
    1499. +
    1500. if ($space_left > 20) {
    1501. +
    1502. $len = $space_left;
    1503. +
    1504. if ($is_utf8) {
    1505. +
    1506. $len = $this->UTF8CharBoundary($word, $len);
    1507. +
    1508. } elseif (substr($word, $len - 1, 1) == "=") {
    1509. +
    1510. $len--;
    1511. +
    1512. } elseif (substr($word, $len - 2, 1) == "=") {
    1513. +
    1514. $len -= 2;
    1515. +
    1516. }
    1517. +
    1518. $part = substr($word, 0, $len);
    1519. +
    1520. $word = substr($word, $len);
    1521. +
    1522. $buf .= ' ' . $part;
    1523. +
    1524. $message .= $buf . sprintf("=%s", $this->LE);
    1525. +
    1526. } else {
    1527. +
    1528. $message .= $buf . $soft_break;
    1529. +
    1530. }
    1531. +
    1532. $buf = '';
    1533. +
    1534. }
    1535. +
    1536. while (strlen($word) > 0) {
    1537. +
    1538. $len = $length;
    1539. +
    1540. if ($is_utf8) {
    1541. +
    1542. $len = $this->UTF8CharBoundary($word, $len);
    1543. +
    1544. } elseif (substr($word, $len - 1, 1) == "=") {
    1545. +
    1546. $len--;
    1547. +
    1548. } elseif (substr($word, $len - 2, 1) == "=") {
    1549. +
    1550. $len -= 2;
    1551. +
    1552. }
    1553. +
    1554. $part = substr($word, 0, $len);
    1555. +
    1556. $word = substr($word, $len);
    1557. +
    1558.  
    1559. +
    1560. if (strlen($word) > 0) {
    1561. +
    1562. $message .= $part . sprintf("=%s", $this->LE);
    1563. +
    1564. } else {
    1565. +
    1566. $buf = $part;
    1567. +
    1568. }
    1569. +
    1570. }
    1571. +
    1572. } else {
    1573. +
    1574. $buf_o = $buf;
    1575. +
    1576. $buf .= ($e == 0) ? $word : (' ' . $word);
    1577. +
    1578.  
    1579. +
    1580. if (strlen($buf) > $length and $buf_o != '') {
    1581. +
    1582. $message .= $buf_o . $soft_break;
    1583. +
    1584. $buf = $word;
    1585. +
    1586. }
    1587. +
    1588. }
    1589. +
    1590. }
    1591. +
    1592. $message .= $buf . $this->LE;
    1593. +
    1594. }
    1595. +
    1596.  
    1597. +
    1598. return $message;
    1599. +
    1600. }
    1601. +
    1602.  
    1603. +
    1604. /**
    1605. +
    1606. * Finds last character boundary prior to maxLength in a utf-8
    1607. +
    1608. * quoted (printable) encoded string.
    1609. +
    1610. * Original written by Colin Brown.
    1611. +
    1612. * @access private
    1613. +
    1614. * @param string $encodedText utf-8 QP text
    1615. +
    1616. * @param int $maxLength find last character boundary prior to this length
    1617. +
    1618. * @return int
    1619. +
    1620. */
    1621. +
    1622. function UTF8CharBoundary($encodedText, $maxLength) {
    1623. +
    1624. $foundSplitPos = false;
    1625. +
    1626. $lookBack = 3;
    1627. +
    1628. while (!$foundSplitPos) {
    1629. +
    1630. $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
    1631. +
    1632. $encodedCharPos = strpos($lastChunk, "=");
    1633. +
    1634. if ($encodedCharPos !== false) {
    1635. +
    1636. // Found start of encoded character byte within $lookBack block.
    1637. +
    1638. // Check the encoded byte value (the 2 chars after the '=')
    1639. +
    1640. $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
    1641. +
    1642. $dec = hexdec($hex);
    1643. +
    1644. if ($dec < 128) { // Single byte character.
    1645. +
    1646. // If the encoded char was found at pos 0, it will fit
    1647. +
    1648. // otherwise reduce maxLength to start of the encoded char
    1649. +
    1650. $maxLength = ($encodedCharPos == 0) ? $maxLength :
    1651. +
    1652. $maxLength - ($lookBack - $encodedCharPos);
    1653. +
    1654. $foundSplitPos = true;
    1655. +
    1656. } elseif ($dec >= 192) { // First byte of a multi byte character
    1657. +
    1658. // Reduce maxLength to split at start of character
    1659. +
    1660. $maxLength = $maxLength - ($lookBack - $encodedCharPos);
    1661. +
    1662. $foundSplitPos = true;
    1663. +
    1664. } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back
    1665. +
    1666. $lookBack += 3;
    1667. +
    1668. }
    1669. +
    1670. } else {
    1671. +
    1672. // No encoded character found
    1673. +
    1674. $foundSplitPos = true;
    1675. +
    1676. }
    1677. +
    1678. }
    1679. +
    1680. return $maxLength;
    1681. +
    1682. }
    1683. +
    1684.  
    1685. +
    1686. /**
    1687. +
    1688. * Set the body wrapping.
    1689. +
    1690. * @access private
    1691. +
    1692. * @return void
    1693. +
    1694. */
    1695. +
    1696. function SetWordWrap() {
    1697. +
    1698. if($this->WordWrap < 1) {
    1699. +
    1700. return;
    1701. +
    1702. }
    1703. +
    1704.  
    1705. +
    1706. switch($this->message_type) {
    1707. +
    1708. case 'alt':
    1709. +
    1710. /* fall through */
    1711. +
    1712. case 'alt_attachments':
    1713. +
    1714. $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);
    1715. +
    1716. break;
    1717. +
    1718. default:
    1719. +
    1720. $this->Body = $this->WrapText($this->Body, $this->WordWrap);
    1721. +
    1722. break;
    1723. +
    1724. }
    1725. +
    1726. }
    1727. +
    1728.  
    1729. +
    1730. /**
    1731. +
    1732. * Assembles message header.
    1733. +
    1734. * @access private
    1735. +
    1736. * @return string
    1737. +
    1738. */
    1739. +
    1740. function CreateHeader() {
    1741. +
    1742. $result = '';
    1743. +
    1744.  
    1745. +
    1746. /* Set the boundaries */
    1747. +
    1748. $uniq_id = md5(uniqid(time()));
    1749. +
    1750. $this->boundary[1] = 'b1_' . $uniq_id;
    1751. +
    1752. $this->boundary[2] = 'b2_' . $uniq_id;
    1753. +
    1754.  
    1755. +
    1756. $result .= $this->HeaderLine('Date', $this->RFCDate());
    1757. +
    1758. if($this->Sender == '') {
    1759. +
    1760. $result .= $this->HeaderLine('Return-Path', trim($this->From));
    1761. +
    1762. } else {
    1763. +
    1764. $result .= $this->HeaderLine('Return-Path', trim($this->Sender));
    1765. +
    1766. }
    1767. +
    1768.  
    1769. +
    1770. /* To be created automatically by mail() */
    1771. +
    1772. if($this->Mailer != 'mail') {
    1773. +
    1774. if(count($this->to) > 0) {
    1775. +
    1776. $result .= $this->AddrAppend('To', $this->to);
    1777. +
    1778. } elseif (count($this->cc) == 0) {
    1779. +
    1780. $result .= $this->HeaderLine('To', 'undisclosed-recipients:;');
    1781. +
    1782. }
    1783. +
    1784. }
    1785. +
    1786.  
    1787. +
    1788. $from = array();
    1789. +
    1790. $from[0][0] = trim($this->From);
    1791. +
    1792. $from[0][1] = $this->FromName;
    1793. +
    1794. $result .= $this->AddrAppend('From', $from);
    1795. +
    1796.  
    1797. +
    1798. /* sendmail and mail() extract Cc from the header before sending */
    1799. +
    1800. if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->cc) > 0)) {
    1801. +
    1802. $result .= $this->AddrAppend('Cc', $this->cc);
    1803. +
    1804. }
    1805. +
    1806.  
    1807. +
    1808. /* sendmail and mail() extract Bcc from the header before sending */
    1809. +
    1810. if((($this->Mailer == 'sendmail') || ($this->Mailer == 'mail')) && (count($this->bcc) > 0)) {
    1811. +
    1812. $result .= $this->AddrAppend('Bcc', $this->bcc);
    1813. +
    1814. }
    1815. +
    1816.  
    1817. +
    1818. if(count($this->ReplyTo) > 0) {
    1819. +
    1820. $result .= $this->AddrAppend('Reply-To', $this->ReplyTo);
    1821. +
    1822. }
    1823. +
    1824.  
    1825. +
    1826. /* mail() sets the subject itself */
    1827. +
    1828. if($this->Mailer != 'mail') {
    1829. +
    1830. $result .= $this->HeaderLine('Subject', $this->EncodeHeader($this->SecureHeader($this->Subject)));
    1831. +
    1832. }
    1833. +
    1834.  
    1835. +
    1836. if($this->MessageID != '') {
    1837. +
    1838. $result .= $this->HeaderLine('Message-ID',$this->MessageID);
    1839. +
    1840. } else {
    1841. +
    1842. $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE);
    1843. +
    1844. }
    1845. +
    1846. $result .= $this->HeaderLine('X-Priority', $this->Priority);
    1847. +
    1848. $result .= $this->HeaderLine('X-Mailer', 'PHPMailer (phpmailer.sourceforge.net) [version ' . $this->Version . ']');
    1849. +
    1850.  
    1851. +
    1852. if($this->ConfirmReadingTo != '') {
    1853. +
    1854. $result .= $this->HeaderLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');
    1855. +
    1856. }
    1857. +
    1858.  
    1859. +
    1860. // Add custom headers
    1861. +
    1862. for($index = 0; $index < count($this->CustomHeader); $index++) {
    1863. +
    1864. $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), $this->EncodeHeader(trim($this->CustomHeader[$index][1])));
    1865. +
    1866. }
    1867. +
    1868. if (!$this->sign_key_file) {
    1869. +
    1870. $result .= $this->HeaderLine('MIME-Version', '1.0');
    1871. +
    1872. $result .= $this->GetMailMIME();
    1873. +
    1874. }
    1875. +
    1876.  
    1877. +
    1878. return $result;
    1879. +
    1880. }
    1881. +
    1882.  
    1883. +
    1884. /**
    1885. +
    1886. * Returns the message MIME.
    1887. +
    1888. * @access private
    1889. +
    1890. * @return string
    1891. +
    1892. */
    1893. +
    1894. function GetMailMIME() {
    1895. +
    1896. $result = '';
    1897. +
    1898. switch($this->message_type) {
    1899. +
    1900. case 'plain':
    1901. +
    1902. $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);
    1903. +
    1904. $result .= sprintf("Content-Type: %s; charset=\"%s\"", $this->ContentType, $this->CharSet);
    1905. +
    1906. break;
    1907. +
    1908. case 'attachments':
    1909. +
    1910. /* fall through */
    1911. +
    1912. case 'alt_attachments':
    1913. +
    1914. if($this->InlineImageExists()){
    1915. +
    1916. $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 'multipart/related', $this->LE, $this->LE, $this->boundary[1], $this->LE);
    1917. +
    1918. } else {
    1919. +
    1920. $result .= $this->HeaderLine('Content-Type', 'multipart/mixed;');
    1921. +
    1922. $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
    1923. +
    1924. }
    1925. +
    1926. break;
    1927. +
    1928. case 'alt':
    1929. +
    1930. $result .= $this->HeaderLine('Content-Type', 'multipart/alternative;');
    1931. +
    1932. $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');
    1933. +
    1934. break;
    1935. +
    1936. }
    1937. +
    1938.  
    1939. +
    1940. if($this->Mailer != 'mail') {
    1941. +
    1942. $result .= $this->LE.$this->LE;
    1943. +
    1944. }
    1945. +
    1946.  
    1947. +
    1948. return $result;
    1949. +
    1950. }
    1951. +
    1952.  
    1953. +
    1954. /**
    1955. +
    1956. * Assembles the message body. Returns an empty string on failure.
    1957. +
    1958. * @access private
    1959. +
    1960. * @return string
    1961. +
    1962. */
    1963. +
    1964. function CreateBody() {
    1965. +
    1966. $result = '';
    1967. +
    1968. if ($this->sign_key_file) {
    1969. +
    1970. $result .= $this->GetMailMIME();
    1971. +
    1972. }
    1973. +
    1974.  
    1975. +
    1976. $this->SetWordWrap();
    1977. +
    1978.  
    1979. +
    1980. switch($this->message_type) {
    1981. +
    1982. case 'alt':
    1983. +
    1984. $result .= $this->GetBoundary($this->boundary[1], '', 'text/plain', '');
    1985. +
    1986. $result .= $this->EncodeString($this->AltBody, $this->Encoding);
    1987. +
    1988. $result .= $this->LE.$this->LE;
    1989. +
    1990. $result .= $this->GetBoundary($this->boundary[1], '', 'text/html', '');
    1991. +
    1992. $result .= $this->EncodeString($this->Body, $this->Encoding);
    1993. +
    1994. $result .= $this->LE.$this->LE;
    1995. +
    1996. $result .= $this->EndBoundary($this->boundary[1]);
    1997. +
    1998. break;
    1999. +
    2000. case 'plain':
    2001. +
    2002. $result .= $this->EncodeString($this->Body, $this->Encoding);
    2003. +
    2004. break;
    2005. +
    2006. case 'attachments':
    2007. +
    2008. $result .= $this->GetBoundary($this->boundary[1], '', '', '');
    2009. +
    2010. $result .= $this->EncodeString($this->Body, $this->Encoding);
    2011. +
    2012. $result .= $this->LE;
    2013. +
    2014. $result .= $this->AttachAll();
    2015. +
    2016. break;
    2017. +
    2018. case 'alt_attachments':
    2019. +
    2020. $result .= sprintf("--%s%s", $this->boundary[1], $this->LE);
    2021. +
    2022. $result .= sprintf("Content-Type: %s;%s" . "\tboundary=\"%s\"%s", 'multipart/alternative', $this->LE, $this->boundary[2], $this->LE.$this->LE);
    2023. +
    2024. $result .= $this->GetBoundary($this->boundary[2], '', 'text/plain', '') . $this->LE; // Create text body
    2025. +
    2026. $result .= $this->EncodeString($this->AltBody, $this->Encoding);
    2027. +
    2028. $result .= $this->LE.$this->LE;
    2029. +
    2030. $result .= $this->GetBoundary($this->boundary[2], '', 'text/html', '') . $this->LE; // Create the HTML body
    2031. +
    2032. $result .= $this->EncodeString($this->Body, $this->Encoding);
    2033. +
    2034. $result .= $this->LE.$this->LE;
    2035. +
    2036. $result .= $this->EndBoundary($this->boundary[2]);
    2037. +
    2038. $result .= $this->AttachAll();
    2039. +
    2040. break;
    2041. +
    2042. }
    2043. +
    2044.  
    2045. +
    2046. if($this->IsError()) {
    2047. +
    2048. $result = '';
    2049. +
    2050. } else if ($this->sign_key_file) {
    2051. +
    2052. $file = tempnam("", "mail");
    2053. +
    2054. $fp = fopen($file, "w");
    2055. +
    2056. fwrite($fp, $result);
    2057. +
    2058. fclose($fp);
    2059. +
    2060. $signed = tempnam("", "signed");
    2061. +
    2062.  
    2063. +
    2064. if (@openssl_pkcs7_sign($file, $signed, "file://".$this->sign_cert_file, array("file://".$this->sign_key_file, $this->sign_key_pass), null)) {
    2065. +
    2066. $fp = fopen($signed, "r");
    2067. +
    2068. $result = fread($fp, filesize($this->sign_key_file));
    2069. +
    2070. $result = '';
    2071. +
    2072. while(!feof($fp)){
    2073. +
    2074. $result = $result . fread($fp, 1024);
    2075. +
    2076. }
    2077. +
    2078. fclose($fp);
    2079. +
    2080. } else {
    2081. +
    2082. $this->SetError($this->Lang("signing").openssl_error_string());
    2083. +
    2084. $result = '';
    2085. +
    2086. }
    2087. +
    2088.  
    2089. +
    2090. unlink($file);
    2091. +
    2092. unlink($signed);
    2093. +
    2094. }
    2095. +
    2096.  
    2097. +
    2098. return $result;
    2099. +
    2100. }
    2101. +
    2102.  
    2103. +
    2104. /**
    2105. +
    2106. * Returns the start of a message boundary.
    2107. +
    2108. * @access private
    2109. +
    2110. */
    2111. +
    2112. function GetBoundary($boundary, $charSet, $contentType, $encoding) {
    2113. +
    2114. $result = '';
    2115. +
    2116. if($charSet == '') {
    2117. +
    2118. $charSet = $this->CharSet;
    2119. +
    2120. }
    2121. +
    2122. if($contentType == '') {
    2123. +
    2124. $contentType = $this->ContentType;
    2125. +
    2126. }
    2127. +
    2128. if($encoding == '') {
    2129. +
    2130. $encoding = $this->Encoding;
    2131. +
    2132. }
    2133. +
    2134. $result .= $this->TextLine('--' . $boundary);
    2135. +
    2136. $result .= sprintf("Content-Type: %s; charset = \"%s\"", $contentType, $charSet);
    2137. +
    2138. $result .= $this->LE;
    2139. +
    2140. $result .= $this->HeaderLine('Content-Transfer-Encoding', $encoding);
    2141. +
    2142. $result .= $this->LE;
    2143. +
    2144.  
    2145. +
    2146. return $result;
    2147. +
    2148. }
    2149. +
    2150.  
    2151. +
    2152. /**
    2153. +
    2154. * Returns the end of a message boundary.
    2155. +
    2156. * @access private
    2157. +
    2158. */
    2159. +
    2160. function EndBoundary($boundary) {
    2161. +
    2162. return $this->LE . '--' . $boundary . '--' . $this->LE;
    2163. +
    2164. }
    2165. +
    2166.  
    2167. +
    2168. /**
    2169. +
    2170. * Sets the message type.
    2171. +
    2172. * @access private
    2173. +
    2174. * @return void
    2175. +
    2176. */
    2177. +
    2178. function SetMessageType() {
    2179. +
    2180. if(count($this->attachment) < 1 && strlen($this->AltBody) < 1) {
    2181. +
    2182. $this->message_type = 'plain';
    2183. +
    2184. } else {
    2185. +
    2186. if(count($this->attachment) > 0) {
    2187. +
    2188. $this->message_type = 'attachments';
    2189. +
    2190. }
    2191. +
    2192. if(strlen($this->AltBody) > 0 && count($this->attachment) < 1) {
    2193. +
    2194. $this->message_type = 'alt';
    2195. +
    2196. }
    2197. +
    2198. if(strlen($this->AltBody) > 0 && count($this->attachment) > 0) {
    2199. +
    2200. $this->message_type = 'alt_attachments';
    2201. +
    2202. }
    2203. +
    2204. }
    2205. +
    2206. }
    2207. +
    2208.  
    2209. +
    2210. /* Returns a formatted header line.
    2211. +
    2212. * @access private
    2213. +
    2214. * @return string
    2215. +
    2216. */
    2217. +
    2218. function HeaderLine($name, $value) {
    2219. +
    2220. return $name . ': ' . $value . $this->LE;
    2221. +
    2222. }
    2223. +
    2224.  
    2225. +
    2226. /**
    2227. +
    2228. * Returns a formatted mail line.
    2229. +
    2230. * @access private
    2231. +
    2232. * @return string
    2233. +
    2234. */
    2235. +
    2236. function TextLine($value) {
    2237. +
    2238. return $value . $this->LE;
    2239. +
    2240. }
    2241. +
    2242.  
    2243. +
    2244. /////////////////////////////////////////////////
    2245. +
    2246. // CLASS METHODS, ATTACHMENTS
    2247. +
    2248. /////////////////////////////////////////////////
    2249. +
    2250.  
    2251. +
    2252. +
    2253.  
    2254. +
    2255. /**
    2256. +
    2257. * Adds an attachment from a path on the filesystem.
    2258. +
    2259. * Returns false if the file could not be found
    2260. +
    2261. * or accessed.
    2262. +
    2263. * @param string $path Path to the attachment.
    2264. +
    2265. * @param string $name Overrides the attachment name.
    2266. +
    2267. * @param string $encoding File encoding (see $Encoding).
    2268. +
    2269. * @param string $type File extension (MIME) type.
    2270. +
    2271. * @return bool
    2272. +
    2273. */
    2274. +
    2275. function AddAttachment($path, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
    2276. +
    2277. if(!@is_file($path)) {
    2278. +
    2279. $this->SetError($this->Lang('file_access') . $path);
    2280. +
    2281. return false;
    2282. +
    2283. }
    2284. +
    2285.  
    2286. +
    2287. $filename = basename($path);
    2288. +
    2289. if($name == '') {
    2290. +
    2291. $name = $filename;
    2292. +
    2293. }
    2294. +
    2295.  
    2296. +
    2297. $cur = count($this->attachment);
    2298. +
    2299. $this->attachment[$cur][0] = $path;
    2300. +
    2301. $this->attachment[$cur][1] = $filename;
    2302. +
    2303. $this->attachment[$cur][2] = $name;
    2304. +
    2305. $this->attachment[$cur][3] = $encoding;
    2306. +
    2307. $this->attachment[$cur][4] = $type;
    2308. +
    2309. $this->attachment[$cur][5] = false; // isStringAttachment
    2310. +
    2311. $this->attachment[$cur][6] = 'attachment';
    2312. +
    2313. $this->attachment[$cur][7] = 0;
    2314. +
    2315.  
    2316. +
    2317. return true;
    2318. +
    2319. }
    2320. +
    2321.  
    2322. +
    2323. /**
    2324. +
    2325. * Attaches all fs, string, and binary attachments to the message.
    2326. +
    2327. * Returns an empty string on failure.
    2328. +
    2329. * @access private
    2330. +
    2331. * @return string
    2332. +
    2333. */
    2334. +
    2335. function AttachAll() {
    2336. +
    2337. /* Return text of body */
    2338. +
    2339. $mime = array();
    2340. +
    2341.  
    2342. +
    2343. /* Add all attachments */
    2344. +
    2345. for($i = 0; $i < count($this->attachment); $i++) {
    2346. +
    2347. /* Check for string attachment */
    2348. +
    2349. $bString = $this->attachment[$i][5];
    2350. +
    2351. if ($bString) {
    2352. +
    2353. $string = $this->attachment[$i][0];
    2354. +
    2355. } else {
    2356. +
    2357. $path = $this->attachment[$i][0];
    2358. +
    2359. }
    2360. +
    2361.  
    2362. +
    2363. $filename = $this->attachment[$i][1];
    2364. +
    2365. $name = $this->attachment[$i][2];
    2366. +
    2367. $encoding = $this->attachment[$i][3];
    2368. +
    2369. $type = $this->attachment[$i][4];
    2370. +
    2371. $disposition = $this->attachment[$i][6];
    2372. +
    2373. $cid = $this->attachment[$i][7];
    2374. +
    2375.  
    2376. +
    2377. $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE);
    2378. +
    2379. $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $this->EncodeHeader($this->SecureHeader($name)), $this->LE);
    2380. +
    2381. $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);
    2382. +
    2383.  
    2384. +
    2385. if($disposition == 'inline') {
    2386. +
    2387. $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);
    2388. +
    2389. }
    2390. +
    2391.  
    2392. +
    2393. $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", $disposition, $this->EncodeHeader($this->SecureHeader($name)), $this->LE.$this->LE);
    2394. +
    2395.  
    2396. +
    2397. /* Encode as string attachment */
    2398. +
    2399. if($bString) {
    2400. +
    2401. $mime[] = $this->EncodeString($string, $encoding);
    2402. +
    2403. if($this->IsError()) {
    2404. +
    2405. return '';
    2406. +
    2407. }
    2408. +
    2409. $mime[] = $this->LE.$this->LE;
    2410. +
    2411. } else {
    2412. +
    2413. $mime[] = $this->EncodeFile($path, $encoding);
    2414. +
    2415. if($this->IsError()) {
    2416. +
    2417. return '';
    2418. +
    2419. }
    2420. +
    2421. $mime[] = $this->LE.$this->LE;
    2422. +
    2423. }
    2424. +
    2425. }
    2426. +
    2427.  
    2428. +
    2429. $mime[] = sprintf("--%s--%s", $this->boundary[1], $this->LE);
    2430. +
    2431.  
    2432. +
    2433. return join('', $mime);
    2434. +
    2435. }
    2436. +
    2437.  
    2438. +
    2439. /**
    2440. +
    2441. * Encodes attachment in requested format. Returns an
    2442. +
    2443. * empty string on failure.
    2444. +
    2445. * @access private
    2446. +
    2447. * @return string
    2448. +
    2449. */
    2450. +
    2451. function EncodeFile ($path, $encoding = 'base64') {
    2452. +
    2453. if(!@$fd = fopen($path, 'rb')) {
    2454. +
    2455. $this->SetError($this->Lang('file_open') . $path);
    2456. +
    2457. return '';
    2458. +
    2459. }
    2460. +
    2461. $magic_quotes = get_magic_quotes_runtime();
    2462. +
    2463. set_magic_quotes_runtime(0);
    2464. +
    2465. $file_buffer = fread($fd, filesize($path));
    2466. +
    2467. $file_buffer = $this->EncodeString($file_buffer, $encoding);
    2468. +
    2469. fclose($fd);
    2470. +
    2471. set_magic_quotes_runtime($magic_quotes);
    2472. +
    2473.  
    2474. +
    2475. return $file_buffer;
    2476. +
    2477. }
    2478. +
    2479.  
    2480. +
    2481. /**
    2482. +
    2483. * Encodes string to requested format. Returns an
    2484. +
    2485. * empty string on failure.
    2486. +
    2487. * @access private
    2488. +
    2489. * @return string
    2490. +
    2491. */
    2492. +
    2493. function EncodeString ($str, $encoding = 'base64') {
    2494. +
    2495. $encoded = '';
    2496. +
    2497. switch(strtolower($encoding)) {
    2498. +
    2499. case 'base64':
    2500. +
    2501. /* chunk_split is found in PHP >= 3.0.6 */
    2502. +
    2503. $encoded = chunk_split(base64_encode($str), 76, $this->LE);
    2504. +
    2505. break;
    2506. +
    2507. case '7bit':
    2508. +
    2509. case '8bit':
    2510. +
    2511. $encoded = $this->FixEOL($str);
    2512. +
    2513. if (substr($encoded, -(strlen($this->LE))) != $this->LE)
    2514. +
    2515. $encoded .= $this->LE;
    2516. +
    2517. break;
    2518. +
    2519. case 'binary':
    2520. +
    2521. $encoded = $str;
    2522. +
    2523. break;
    2524. +
    2525. case 'quoted-printable':
    2526. +
    2527. $encoded = $this->EncodeQP($str);
    2528. +
    2529. break;
    2530. +
    2531. default:
    2532. +
    2533. $this->SetError($this->Lang('encoding') . $encoding);
    2534. +
    2535. break;
    2536. +
    2537. }
    2538. +
    2539. return $encoded;
    2540. +
    2541. }
    2542. +
    2543.  
    2544. +
    2545. /**
    2546. +
    2547. * Encode a header string to best of Q, B, quoted or none.
    2548. +
    2549. * @access private
    2550. +
    2551. * @return string
    2552. +
    2553. */
    2554. +
    2555. function EncodeHeader ($str, $position = 'text') {
    2556. +
    2557. $x = 0;
    2558. +
    2559.  
    2560. +
    2561. switch (strtolower($position)) {
    2562. +
    2563. case 'phrase':
    2564. +
    2565. if (!preg_match('/[\200-\377]/', $str)) {
    2566. +
    2567. /* Can't use addslashes as we don't know what value has magic_quotes_sybase. */
    2568. +
    2569. $encoded = addcslashes($str, "\0..\37\177\\\"");
    2570. +
    2571. if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
    2572. +
    2573. return ($encoded);
    2574. +
    2575. } else {
    2576. +
    2577. return ("\"$encoded\"");
    2578. +
    2579. }
    2580. +
    2581. }
    2582. +
    2583. $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
    2584. +
    2585. break;
    2586. +
    2587. case 'comment':
    2588. +
    2589. $x = preg_match_all('/[()"]/', $str, $matches);
    2590. +
    2591. /* Fall-through */
    2592. +
    2593. case 'text':
    2594. +
    2595. default:
    2596. +
    2597. $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
    2598. +
    2599. break;
    2600. +
    2601. }
    2602. +
    2603.  
    2604. +
    2605. if ($x == 0) {
    2606. +
    2607. return ($str);
    2608. +
    2609. }
    2610. +
    2611.  
    2612. +
    2613. $maxlen = 75 - 7 - strlen($this->CharSet);
    2614. +
    2615. /* Try to select the encoding which should produce the shortest output */
    2616. +
    2617. if (strlen($str)/3 < $x) {
    2618. +
    2619. $encoding = 'B';
    2620. +
    2621. if (function_exists('mb_strlen') && $this->HasMultiBytes($str)) {
    2622. +
    2623. // Use a custom function which correctly encodes and wraps long
    2624. +
    2625. // multibyte strings without breaking lines within a character
    2626. +
    2627. $encoded = $this->Base64EncodeWrapMB($str);
    2628. +
    2629. } else {
    2630. +
    2631. $encoded = base64_encode($str);
    2632. +
    2633. $maxlen -= $maxlen % 4;
    2634. +
    2635. $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
    2636. +
    2637. }
    2638. +
    2639. } else {
    2640. +
    2641. $encoding = 'Q';
    2642. +
    2643. $encoded = $this->EncodeQ($str, $position);
    2644. +
    2645. $encoded = $this->WrapText($encoded, $maxlen, true);
    2646. +
    2647. $encoded = str_replace('='.$this->LE, "\n", trim($encoded));
    2648. +
    2649. }
    2650. +
    2651.  
    2652. +
    2653. $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded);
    2654. +
    2655. $encoded = trim(str_replace("\n", $this->LE, $encoded));
    2656. +
    2657.  
    2658. +
    2659. return $encoded;
    2660. +
    2661. }
    2662. +
    2663.  
    2664. +
    2665. /**
    2666. +
    2667. * Checks if a string contains multibyte characters.
    2668. +
    2669. * @access private
    2670. +
    2671. * @param string $str multi-byte text to wrap encode
    2672. +
    2673. * @return bool
    2674. +
    2675. */
    2676. +
    2677. function HasMultiBytes($str) {
    2678. +
    2679. if (function_exists('mb_strlen')) {
    2680. +
    2681. return (strlen($str) > mb_strlen($str, $this->CharSet));
    2682. +
    2683. } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
    2684. +
    2685. return False;
    2686. +
    2687. }
    2688. +
    2689. }
    2690. +
    2691.  
    2692. +
    2693. /**
    2694. +
    2695. * Correctly encodes and wraps long multibyte strings for mail headers
    2696. +
    2697. * without breaking lines within a character.
    2698. +
    2699. * Adapted from a function by paravoid at http://uk.php.net/manual/en/function.mb-encode-mimeheader.php
    2700. +
    2701. * @access private
    2702. +
    2703. * @param string $str multi-byte text to wrap encode
    2704. +
    2705. * @return string
    2706. +
    2707. */
    2708. +
    2709. function Base64EncodeWrapMB($str) {
    2710. +
    2711. $start = "=?".$this->CharSet."?B?";
    2712. +
    2713. $end = "?=";
    2714. +
    2715. $encoded = "";
    2716. +
    2717.  
    2718. +
    2719. $mb_length = mb_strlen($str, $this->CharSet);
    2720. +
    2721. // Each line must have length <= 75, including $start and $end
    2722. +
    2723. $length = 75 - strlen($start) - strlen($end);
    2724. +
    2725. // Average multi-byte ratio
    2726. +
    2727. $ratio = $mb_length / strlen($str);
    2728. +
    2729. // Base64 has a 4:3 ratio
    2730. +
    2731. $offset = $avgLength = floor($length * $ratio * .75);
    2732. +
    2733.  
    2734. +
    2735. for ($i = 0; $i < $mb_length; $i += $offset) {
    2736. +
    2737. $lookBack = 0;
    2738. +
    2739.  
    2740. +
    2741. do {
    2742. +
    2743. $offset = $avgLength - $lookBack;
    2744. +
    2745. $chunk = mb_substr($str, $i, $offset, $this->CharSet);
    2746. +
    2747. $chunk = base64_encode($chunk);
    2748. +
    2749. $lookBack++;
    2750. +
    2751. }
    2752. +
    2753. while (strlen($chunk) > $length);
    2754. +
    2755.  
    2756. +
    2757. $encoded .= $chunk . $this->LE;
    2758. +
    2759. }
    2760. +
    2761.  
    2762. +
    2763. // Chomp the last linefeed
    2764. +
    2765. $encoded = substr($encoded, 0, -strlen($this->LE));
    2766. +
    2767. return $encoded;
    2768. +
    2769. }
    2770. +
    2771.  
    2772. +
    2773. /**
    2774. +
    2775. * Encode string to quoted-printable.
    2776. +
    2777. * @access private
    2778. +
    2779. * @return string
    2780. +
    2781. */
    2782. +
    2783. function EncodeQP( $input = '', $line_max = 76, $space_conv = false ) {
    2784. +
    2785. $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
    2786. +
    2787. $lines = preg_split('/(?:\r\n|\r|\n)/', $input);
    2788. +
    2789. $eol = "\r\n";
    2790. +
    2791. $escape = '=';
    2792. +
    2793. $output = '';
    2794. +
    2795. while( list(, $line) = each($lines) ) {
    2796. +
    2797. $linlen = strlen($line);
    2798. +
    2799. $newline = '';
    2800. +
    2801. for($i = 0; $i < $linlen; $i++) {
    2802. +
    2803. $c = substr( $line, $i, 1 );
    2804. +
    2805. $dec = ord( $c );
    2806. +
    2807. if ( ( $i == 0 ) && ( $dec == 46 ) ) { // convert first point in the line into =2E
    2808. +
    2809. $c = '=2E';
    2810. +
    2811. }
    2812. +
    2813. if ( $dec == 32 ) {
    2814. +
    2815. if ( $i == ( $linlen - 1 ) ) { // convert space at eol only
    2816. +
    2817. $c = '=20';
    2818. +
    2819. } else if ( $space_conv ) {
    2820. +
    2821. $c = '=20';
    2822. +
    2823. }
    2824. +
    2825. } elseif ( ($dec == 61) || ($dec < 32 ) || ($dec > 126) ) { // always encode "\t", which is *not* required
    2826. +
    2827. $h2 = floor($dec/16);
    2828. +
    2829. $h1 = floor($dec%16);
    2830. +
    2831. $c = $escape.$hex[$h2].$hex[$h1];
    2832. +
    2833. }
    2834. +
    2835. if ( (strlen($newline) + strlen($c)) >= $line_max ) { // CRLF is not counted
    2836. +
    2837. $output .= $newline.$escape.$eol; // soft line break; " =\r\n" is okay
    2838. +
    2839. $newline = '';
    2840. +
    2841. // check if newline first character will be point or not
    2842. +
    2843. if ( $dec == 46 ) {
    2844. +
    2845. $c = '=2E';
    2846. +
    2847. }
    2848. +
    2849. }
    2850. +
    2851. $newline .= $c;
    2852. +
    2853. } // end of for
    2854. +
    2855. $output .= $newline.$eol;
    2856. +
    2857. } // end of while
    2858. +
    2859. return $output;
    2860. +
    2861. }
    2862. +
    2863.  
    2864. +
    2865. /**
    2866. +
    2867. * Encode string to q encoding.
    2868. +
    2869. * @access private
    2870. +
    2871. * @return string
    2872. +
    2873. */
    2874. +
    2875. function EncodeQ ($str, $position = 'text') {
    2876. +
    2877. /* There should not be any EOL in the string */
    2878. +
    2879. $encoded = preg_replace("[\r\n]", '', $str);
    2880. +
    2881.  
    2882. +
    2883. switch (strtolower($position)) {
    2884. +
    2885. case 'phrase':
    2886. +
    2887. $encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);
    2888. +
    2889. break;
    2890. +
    2891. case 'comment':
    2892. +
    2893. $encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);
    2894. +
    2895. case 'text':
    2896. +
    2897. default:
    2898. +
    2899. /* Replace every high ascii, control =, ? and _ characters */
    2900. +
    2901. $encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',
    2902. +
    2903. "'='.sprintf('%02X', ord('\\1'))", $encoded);
    2904. +
    2905. break;
    2906. +
    2907. }
    2908. +
    2909.  
    2910. +
    2911. /* Replace every spaces to _ (more readable than =20) */
    2912. +
    2913. $encoded = str_replace(' ', '_', $encoded);
    2914. +
    2915.  
    2916. +
    2917. return $encoded;
    2918. +
    2919. }
    2920. +
    2921.  
    2922. +
    2923. /**
    2924. +
    2925. * Adds a string or binary attachment (non-filesystem) to the list.
    2926. +
    2927. * This method can be used to attach ascii or binary data,
    2928. +
    2929. * such as a BLOB record from a database.
    2930. +
    2931. * @param string $string String attachment data.
    2932. +
    2933. * @param string $filename Name of the attachment.
    2934. +
    2935. * @param string $encoding File encoding (see $Encoding).
    2936. +
    2937. * @param string $type File extension (MIME) type.
    2938. +
    2939. * @return void
    2940. +
    2941. */
    2942. +
    2943. function AddStringAttachment($string, $filename, $encoding = 'base64', $type = 'application/octet-stream') {
    2944. +
    2945. /* Append to $attachment array */
    2946. +
    2947. $cur = count($this->attachment);
    2948. +
    2949. $this->attachment[$cur][0] = $string;
    2950. +
    2951. $this->attachment[$cur][1] = $filename;
    2952. +
    2953. $this->attachment[$cur][2] = $filename;
    2954. +
    2955. $this->attachment[$cur][3] = $encoding;
    2956. +
    2957. $this->attachment[$cur][4] = $type;
    2958. +
    2959. $this->attachment[$cur][5] = true; // isString
    2960. +
    2961. $this->attachment[$cur][6] = 'attachment';
    2962. +
    2963. $this->attachment[$cur][7] = 0;
    2964. +
    2965. }
    2966. +
    2967.  
    2968. +
    2969. /**
    2970. +
    2971. * Adds an embedded attachment. This can include images, sounds, and
    2972. +
    2973. * just about any other document. Make sure to set the $type to an
    2974. +
    2975. * image type. For JPEG images use "image/jpeg" and for GIF images
    2976. +
    2977. * use "image/gif".
    2978. +
    2979. * @param string $path Path to the attachment.
    2980. +
    2981. * @param string $cid Content ID of the attachment. Use this to identify
    2982. +
    2983. * the Id for accessing the image in an HTML form.
    2984. +
    2985. * @param string $name Overrides the attachment name.
    2986. +
    2987. * @param string $encoding File encoding (see $Encoding).
    2988. +
    2989. * @param string $type File extension (MIME) type.
    2990. +
    2991. * @return bool
    2992. +
    2993. */
    2994. +
    2995. function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
    2996. +
    2997.  
    2998. +
    2999. if(!@is_file($path)) {
    3000. +
    3001. $this->SetError($this->Lang('file_access') . $path);
    3002. +
    3003. return false;
    3004. +
    3005. }
    3006. +
    3007.  
    3008. +
    3009. $filename = basename($path);
    3010. +
    3011. if($name == '') {
    3012. +
    3013. $name = $filename;
    3014. +
    3015. }
    3016. +
    3017.  
    3018. +
    3019. /* Append to $attachment array */
    3020. +
    3021. $cur = count($this->attachment);
    3022. +
    3023. $this->attachment[$cur][0] = $path;
    3024. +
    3025. $this->attachment[$cur][1] = $filename;
    3026. +
    3027. $this->attachment[$cur][2] = $name;
    3028. +
    3029. $this->attachment[$cur][3] = $encoding;
    3030. +
    3031. $this->attachment[$cur][4] = $type;
    3032. +
    3033. $this->attachment[$cur][5] = false;
    3034. +
    3035. $this->attachment[$cur][6] = 'inline';
    3036. +
    3037. $this->attachment[$cur][7] = $cid;
    3038. +
    3039.  
    3040. +
    3041. return true;
    3042. +
    3043. }
    3044. +
    3045.  
    3046. +
    3047. /**
    3048. +
    3049. * Returns true if an inline attachment is present.
    3050. +
    3051. * @access private
    3052. +
    3053. * @return bool
    3054. +
    3055. */
    3056. +
    3057. function InlineImageExists() {
    3058. +
    3059. $result = false;
    3060. +
    3061. for($i = 0; $i < count($this->attachment); $i++) {
    3062. +
    3063. if($this->attachment[$i][6] == 'inline') {
    3064. +
    3065. $result = true;
    3066. +
    3067. break;
    3068. +
    3069. }
    3070. +
    3071. }
    3072. +
    3073.  
    3074. +
    3075. return $result;
    3076. +
    3077. }
    3078. +
    3079.  
    3080. +
    3081. /////////////////////////////////////////////////
    3082. +
    3083. // CLASS METHODS, MESSAGE RESET
    3084. +
    3085. /////////////////////////////////////////////////
    3086. +
    3087.  
    3088. +
    3089. +
    3090.  
    3091. +
    3092. /**
    3093. +
    3094. * Clears all recipients assigned in the TO array. Returns void.
    3095. +
    3096. * @return void
    3097. +
    3098. */
    3099. +
    3100. function ClearAddresses() {
    3101. +
    3102. $this->to = array();
    3103. +
    3104. }
    3105. +
    3106.  
    3107. +
    3108. /**
    3109. +
    3110. * Clears all recipients assigned in the CC array. Returns void.
    3111. +
    3112. * @return void
    3113. +
    3114. */
    3115. +
    3116. function ClearCCs() {
    3117. +
    3118. $this->cc = array();
    3119. +
    3120. }
    3121. +
    3122.  
    3123. +
    3124. /**
    3125. +
    3126. * Clears all recipients assigned in the BCC array. Returns void.
    3127. +
    3128. * @return void
    3129. +
    3130. */
    3131. +
    3132. function ClearBCCs() {
    3133. +
    3134. $this->bcc = array();
    3135. +
    3136. }
    3137. +
    3138.  
    3139. +
    3140. /**
    3141. +
    3142. * Clears all recipients assigned in the ReplyTo array. Returns void.
    3143. +
    3144. * @return void
    3145. +
    3146. */
    3147. +
    3148. function ClearReplyTos() {
    3149. +
    3150. $this->ReplyTo = array();
    3151. +
    3152. }
    3153. +
    3154.  
    3155. +
    3156. /**
    3157. +
    3158. * Clears all recipients assigned in the TO, CC and BCC
    3159. +
    3160. * array. Returns void.
    3161. +
    3162. * @return void
    3163. +
    3164. */
    3165. +
    3166. function ClearAllRecipients() {
    3167. +
    3168. $this->to = array();
    3169. +
    3170. $this->cc = array();
    3171. +
    3172. $this->bcc = array();
    3173. +
    3174. }
    3175. +
    3176.  
    3177. +
    3178. /**
    3179. +
    3180. * Clears all previously set filesystem, string, and binary
    3181. +
    3182. * attachments. Returns void.
    3183. +
    3184. * @return void
    3185. +
    3186. */
    3187. +
    3188. function ClearAttachments() {
    3189. +
    3190. $this->attachment = array();
    3191. +
    3192. }
    3193. +
    3194.  
    3195. +
    3196. /**
    3197. +
    3198. * Clears all custom headers. Returns void.
    3199. +
    3200. * @return void
    3201. +
    3202. */
    3203. +
    3204. function ClearCustomHeaders() {
    3205. +
    3206. $this->CustomHeader = array();
    3207. +
    3208. }
    3209. +
    3210.  
    3211. +
    3212. /////////////////////////////////////////////////
    3213. +
    3214. // CLASS METHODS, MISCELLANEOUS
    3215. +
    3216. /////////////////////////////////////////////////
    3217. +
    3218.  
    3219. +
    3220. +
    3221.  
    3222. +
    3223. /**
    3224. +
    3225. * Adds the error message to the error container.
    3226. +
    3227. * Returns void.
    3228. +
    3229. * @access private
    3230. +
    3231. * @return void
    3232. +
    3233. */
    3234. +
    3235. function SetError($msg) {
    3236. +
    3237. $this->error_count++;
    3238. +
    3239. $this->ErrorInfo = $msg;
    3240. +
    3241. }
    3242. +
    3243.  
    3244. +
    3245. /**
    3246. +
    3247. * Returns the proper RFC 822 formatted date.
    3248. +
    3249. * @access private
    3250. +
    3251. * @return string
    3252. +
    3253. */
    3254. +
    3255. function RFCDate() {
    3256. +
    3257. $tz = date('Z');
    3258. +
    3259. $tzs = ($tz < 0) ? '-' : '+';
    3260. +
    3261. $tz = abs($tz);
    3262. +
    3263. $tz = (int)($tz/3600)*100 + ($tz%3600)/60;
    3264. +
    3265. $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz);
    3266. +
    3267.  
    3268. +
    3269. return $result;
    3270. +
    3271. }
    3272. +
    3273.  
    3274. +
    3275. /**
    3276. +
    3277. * Returns the appropriate server variable. Should work with both
    3278. +
    3279. * PHP 4.1.0+ as well as older versions. Returns an empty string
    3280. +
    3281. * if nothing is found.
    3282. +
    3283. * @access private
    3284. +
    3285. * @return mixed
    3286. +
    3287. */
    3288. +
    3289. function ServerVar($varName) {
    3290. +
    3291. global $HTTP_SERVER_VARS;
    3292. +
    3293. global $HTTP_ENV_VARS;
    3294. +
    3295.  
    3296. +
    3297. if(!isset($_SERVER)) {
    3298. +
    3299. $_SERVER = $HTTP_SERVER_VARS;
    3300. +
    3301. if(!isset($_SERVER['REMOTE_ADDR'])) {
    3302. +
    3303. $_SERVER = $HTTP_ENV_VARS; // must be Apache
    3304. +
    3305. }
    3306. +
    3307. }
    3308. +
    3309.  
    3310. +
    3311. if(isset($_SERVER[$varName])) {
    3312. +
    3313. return $_SERVER[$varName];
    3314. +
    3315. } else {
    3316. +
    3317. return '';
    3318. +
    3319. }
    3320. +
    3321. }
    3322. +
    3323.  
    3324. +
    3325. /**
    3326. +
    3327. * Returns the server hostname or 'localhost.localdomain' if unknown.
    3328. +
    3329. * @access private
    3330. +
    3331. * @return string
    3332. +
    3333. */
    3334. +
    3335. function ServerHostname() {
    3336. +
    3337. if ($this->Hostname != '') {
    3338. +
    3339. $result = $this->Hostname;
    3340. +
    3341. } elseif ($this->ServerVar('SERVER_NAME') != '') {
    3342. +
    3343. $result = $this->ServerVar('SERVER_NAME');
    3344. +
    3345. } else {
    3346. +
    3347. $result = 'localhost.localdomain';
    3348. +
    3349. }
    3350. +
    3351.  
    3352. +
    3353. return $result;
    3354. +
    3355. }
    3356. +
    3357.  
    3358. +
    3359. /**
    3360. +
    3361. * Returns a message in the appropriate language.
    3362. +
    3363. * @access private
    3364. +
    3365. * @return string
    3366. +
    3367. */
    3368. +
    3369. function Lang($key) {
    3370. +
    3371. if(count($this->language) < 1) {
    3372. +
    3373. $this->SetLanguage('en'); // set the default language
    3374. +
    3375. }
    3376. +
    3377.  
    3378. +
    3379. if(isset($this->language[$key])) {
    3380. +
    3381. return $this->language[$key];
    3382. +
    3383. } else {
    3384. +
    3385. return 'Language string failed to load: ' . $key;
    3386. +
    3387. }
    3388. +
    3389. }
    3390. +
    3391.  
    3392. +
    3393. /**
    3394. +
    3395. * Returns true if an error occurred.
    3396. +
    3397. * @return bool
    3398. +
    3399. */
    3400. +
    3401. function IsError() {
    3402. +
    3403. return ($this->error_count > 0);
    3404. +
    3405. }
    3406. +
    3407.  
    3408. +
    3409. /**
    3410. +
    3411. * Changes every end of line from CR or LF to CRLF.
    3412. +
    3413. * @access private
    3414. +
    3415. * @return string
    3416. +
    3417. */
    3418. +
    3419. function FixEOL($str) {
    3420. +
    3421. $str = str_replace("\r\n", "\n", $str);
    3422. +
    3423. $str = str_replace("\r", "\n", $str);
    3424. +
    3425. $str = str_replace("\n", $this->LE, $str);
    3426. +
    3427. return $str;
    3428. +
    3429. }
    3430. +
    3431.  
    3432. +
    3433. /**
    3434. +
    3435. * Adds a custom header.
    3436. +
    3437. * @return void
    3438. +
    3439. */
    3440. +
    3441. function AddCustomHeader($custom_header) {
    3442. +
    3443. $this->CustomHeader[] = explode(':', $custom_header, 2);
    3444. +
    3445. }
    3446. +
    3447.  
    3448. +
    3449. /**
    3450. +
    3451. * Evaluates the message and returns modifications for inline images and backgrounds
    3452. +
    3453. * @access public
    3454. +
    3455. * @return $message
    3456. +
    3457. */
    3458. +
    3459. function MsgHTML($message,$basedir='') {
    3460. +
    3461. preg_match_all("/(src|background)=\"(.*)\"/Ui", $message, $images);
    3462. +
    3463. if(isset($images[2])) {
    3464. +
    3465. foreach($images[2] as $i => $url) {
    3466. +
    3467. // do not change urls for absolute images (thanks to corvuscorax)
    3468. +
    3469. if (!preg_match('/^[A-z][A-z]*:\/\//',$url)) {
    3470. +
    3471. $filename = basename($url);
    3472. +
    3473. $directory = dirname($url);
    3474. +
    3475. ($directory == '.')?$directory='':'';
    3476. +
    3477. $cid = 'cid:' . md5($filename);
    3478. +
    3479. $fileParts = split("\.", $filename);
    3480. +
    3481. $ext = $fileParts[1];
    3482. +
    3483. $mimeType = $this->_mime_types($ext);
    3484. +
    3485. if ( strlen($basedir) > 1 && substr($basedir,-1) != '/') { $basedir .= '/'; }
    3486. +
    3487. if ( strlen($directory) > 1 && substr($directory,-1) != '/') { $directory .= '/'; }
    3488. +
    3489. if ( $this->AddEmbeddedImage($basedir.$directory.$filename, md5($filename), $filename, 'base64',$mimeType) ) {
    3490. +
    3491. $message = preg_replace("/".$images[1][$i]."=\"".preg_quote($url, '/')."\"/Ui", $images[1][$i]."=\"".$cid."\"", $message);
    3492. +
    3493. }
    3494. +
    3495. }
    3496. +
    3497. }
    3498. +
    3499. }
    3500. +
    3501. $this->IsHTML(true);
    3502. +
    3503. $this->Body = $message;
    3504. +
    3505. $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message)));
    3506. +
    3507. if ( !empty($textMsg) && empty($this->AltBody) ) {
    3508. +
    3509. $this->AltBody = html_entity_decode($textMsg);
    3510. +
    3511. }
    3512. +
    3513. if ( empty($this->AltBody) ) {
    3514. +
    3515. $this->AltBody = 'To view this email message, open the email in with HTML compatibility!' . "\n\n";
    3516. +
    3517. }
    3518. +
    3519. }
    3520. +
    3521.  
    3522. +
    3523. /**
    3524. +
    3525. * Gets the mime type of the embedded or inline image
    3526. +
    3527. * @access private
    3528. +
    3529. * @return mime type of ext
    3530. +
    3531. */
    3532. +
    3533. function _mime_types($ext = '') {
    3534. +
    3535. $mimes = array(
    3536. +
    3537. 'ai' => 'application/postscript',
    3538. +
    3539. 'aif' => 'audio/x-aiff',
    3540. +
    3541. 'aifc' => 'audio/x-aiff',
    3542. +
    3543. 'aiff' => 'audio/x-aiff',
    3544. +
    3545. 'avi' => 'video/x-msvideo',
    3546. +
    3547. 'bin' => 'application/macbinary',
    3548. +
    3549. 'bmp' => 'image/bmp',
    3550. +
    3551. 'class' => 'application/octet-stream',
    3552. +
    3553. 'cpt' => 'application/mac-compactpro',
    3554. +
    3555. 'css' => 'text/css',
    3556. +
    3557. 'dcr' => 'application/x-director',
    3558. +
    3559. 'dir' => 'application/x-director',
    3560. +
    3561. 'dll' => 'application/octet-stream',
    3562. +
    3563. 'dms' => 'application/octet-stream',
    3564. +
    3565. 'doc' => 'application/msword',
    3566. +
    3567. 'dvi' => 'application/x-dvi',
    3568. +
    3569. 'dxr' => 'application/x-director',
    3570. +
    3571. 'eml' => 'message/rfc822',
    3572. +
    3573. 'eps' => 'application/postscript',
    3574. +
    3575. 'exe' => 'application/octet-stream',
    3576. +
    3577. 'gif' => 'image/gif',
    3578. +
    3579. 'gtar' => 'application/x-gtar',
    3580. +
    3581. 'htm' => 'text/html',
    3582. +
    3583. 'html' => 'text/html',
    3584. +
    3585. 'jpe' => 'image/jpeg',
    3586. +
    3587. 'jpeg' => 'image/jpeg',
    3588. +
    3589. 'jpg' => 'image/jpeg',
    3590. +
    3591. 'hqx' => 'application/mac-binhex40',
    3592. +
    3593. 'js' => 'application/x-javascript',
    3594. +
    3595. 'lha' => 'application/octet-stream',
    3596. +
    3597. 'log' => 'text/plain',
    3598. +
    3599. 'lzh' => 'application/octet-stream',
    3600. +
    3601. 'mid' => 'audio/midi',
    3602. +
    3603. 'midi' => 'audio/midi',
    3604. +
    3605. 'mif' => 'application/vnd.mif',
    3606. +
    3607. 'mov' => 'video/quicktime',
    3608. +
    3609. 'movie' => 'video/x-sgi-movie',
    3610. +
    3611. 'mp2' => 'audio/mpeg',
    3612. +
    3613. 'mp3' => 'audio/mpeg',
    3614. +
    3615. 'mpe' => 'video/mpeg',
    3616. +
    3617. 'mpeg' => 'video/mpeg',
    3618. +
    3619. 'mpg' => 'video/mpeg',
    3620. +
    3621. 'mpga' => 'audio/mpeg',
    3622. +
    3623. 'oda' => 'application/oda',
    3624. +
    3625. 'pdf' => 'application/pdf',
    3626. +
    3627. 'php' => 'application/x-httpd-php',
    3628. +
    3629. 'php3' => 'application/x-httpd-php',
    3630. +
    3631. 'php4' => 'application/x-httpd-php',
    3632. +
    3633. 'phps' => 'application/x-httpd-php-source',
    3634. +
    3635. 'phtml' => 'application/x-httpd-php',
    3636. +
    3637. 'png' => 'image/png',
    3638. +
    3639. 'ppt' => 'application/vnd.ms-powerpoint',
    3640. +
    3641. 'ps' => 'application/postscript',
    3642. +
    3643. 'psd' => 'application/octet-stream',
    3644. +
    3645. 'qt' => 'video/quicktime',
    3646. +
    3647. 'ra' => 'audio/x-realaudio',
    3648. +
    3649. 'ram' => 'audio/x-pn-realaudio',
    3650. +
    3651. 'rm' => 'audio/x-pn-realaudio',
    3652. +
    3653. 'rpm' => 'audio/x-pn-realaudio-plugin',
    3654. +
    3655. 'rtf' => 'text/rtf',
    3656. +
    3657. 'rtx' => 'text/richtext',
    3658. +
    3659. 'rv' => 'video/vnd.rn-realvideo',
    3660. +
    3661. 'sea' => 'application/octet-stream',
    3662. +
    3663. 'shtml' => 'text/html',
    3664. +
    3665. 'sit' => 'application/x-stuffit',
    3666. +
    3667. 'so' => 'application/octet-stream',
    3668. +
    3669. 'smi' => 'application/smil',
    3670. +
    3671. 'smil' => 'application/smil',
    3672. +
    3673. 'swf' => 'application/x-shockwave-flash',
    3674. +
    3675. 'tar' => 'application/x-tar',
    3676. +
    3677. 'text' => 'text/plain',
    3678. +
    3679. 'txt' => 'text/plain',
    3680. +
    3681. 'tgz' => 'application/x-tar',
    3682. +
    3683. 'tif' => 'image/tiff',
    3684. +
    3685. 'tiff' => 'image/tiff',
    3686. +
    3687. 'wav' => 'audio/x-wav',
    3688. +
    3689. 'wbxml' => 'application/vnd.wap.wbxml',
    3690. +
    3691. 'wmlc' => 'application/vnd.wap.wmlc',
    3692. +
    3693. 'word' => 'application/msword',
    3694. +
    3695. 'xht' => 'application/xhtml+xml',
    3696. +
    3697. 'xhtml' => 'application/xhtml+xml',
    3698. +
    3699. 'xl' => 'application/excel',
    3700. +
    3701. 'xls' => 'application/vnd.ms-excel',
    3702. +
    3703. 'xml' => 'text/xml',
    3704. +
    3705. 'xsl' => 'text/xml',
    3706. +
    3707. 'zip' => 'application/zip'
    3708. +
    3709. );
    3710. +
    3711. return ( ! isset($mimes[strtolower($ext)])) ? 'application/octet-stream' : $mimes[strtolower($ext)];
    3712. +
    3713. }
    3714. +
    3715.  
    3716. +
    3717. /**
    3718. +
    3719. * Set (or reset) Class Objects (variables)
    3720. +
    3721. *
    3722. +
    3723. * Usage Example:
    3724. +
    3725. * $page->set('X-Priority', '3');
    3726. +
    3727. *
    3728. +
    3729. * @access public
    3730. +
    3731. * @param string $name Parameter Name
    3732. +
    3733. * @param mixed $value Parameter Value
    3734. +
    3735. * NOTE: will not work with arrays, there are no arrays to set/reset
    3736. +
    3737. */
    3738. +
    3739. function set ( $name, $value = '' ) {
    3740. +
    3741. if ( isset($this->$name) ) {
    3742. +
    3743. $this->$name = $value;
    3744. +
    3745. } else {
    3746. +
    3747. $this->SetError('Cannot set or reset variable ' . $name);
    3748. +
    3749. return false;
    3750. +
    3751. }
    3752. +
    3753. }
    3754. +
    3755.  
    3756. +
    3757. /**
    3758. +
    3759. * Read a file from a supplied filename and return it.
    3760. +
    3761. *
    3762. +
    3763. * @access public
    3764. +
    3765. * @param string $filename Parameter File Name
    3766. +
    3767. */
    3768. +
    3769. function getFile($filename) {
    3770. +
    3771. $return = '';
    3772. +
    3773. if ($fp = fopen($filename, 'rb')) {
    3774. +
    3775. while (!feof($fp)) {
    3776. +
    3777. $return .= fread($fp, 1024);
    3778. +
    3779. }
    3780. +
    3781. fclose($fp);
    3782. +
    3783. return $return;
    3784. +
    3785. } else {
    3786. +
    3787. return false;
    3788. +
    3789. }
    3790. +
    3791. }
    3792. +
    3793.  
    3794. +
    3795. /**
    3796. +
    3797. * Strips newlines to prevent header injection.
    3798. +
    3799. * @access private
    3800. +
    3801. * @param string $str String
    3802. +
    3803. * @return string
    3804. +
    3805. */
    3806. +
    3807. function SecureHeader($str) {
    3808. +
    3809. $str = trim($str);
    3810. +
    3811. $str = str_replace("\r", "", $str);
    3812. +
    3813. $str = str_replace("\n", "", $str);
    3814. +
    3815. return $str;
    3816. +
    3817. }
    3818. +
    3819.  
    3820. +
    3821. /**
    3822. +
    3823. * Set the private key file and password to sign the message.
    3824. +
    3825. *
    3826. +
    3827. * @access public
    3828. +
    3829. * @param string $key_filename Parameter File Name
    3830. +
    3831. * @param string $key_pass Password for private key
    3832. +
    3833. */
    3834. +
    3835. function Sign($cert_filename, $key_filename, $key_pass) {
    3836. +
    3837. $this->sign_cert_file = $cert_filename;
    3838. +
    3839. $this->sign_key_file = $key_filename;
    3840. +
    3841. $this->sign_key_pass = $key_pass;
    3842. +
    3843. }
    3844. +
    3845.  
    3846. +
    3847. }
    3848. +
    3849.  
    3850. +
    3851. ?>
    3852. +
    +
    +

    + Documentation generated on Thu, 02 Apr 2009 21:19:47 -0400 by phpDocumentor 1.3.0RC3 +

    + + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/__filesource/fsource_PHPMailer__class.pop3.php.html b/plugin/PHPMailer_v2.0.4/phpdocs/__filesource/fsource_PHPMailer__class.pop3.php.html new file mode 100644 index 000000000..3fbc19de2 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/__filesource/fsource_PHPMailer__class.pop3.php.html @@ -0,0 +1,460 @@ + + + + + + File Source for class.pop3.php + + + + +

    Source for file class.pop3.php

    +

    Documentation is available at class.pop3.php

    +
    +
    1. <?php
    2. +
    3. /*~ class.pop3.php
    4. +
    5. .---------------------------------------------------------------------------.
    6. +
    7. | Software: PHPMailer - PHP email class |
    8. +
    9. | Version: 2.0.4 |
    10. +
    11. | Contact: via sourceforge.net support pages (also www.codeworxtech.com) |
    12. +
    13. | Info: http://phpmailer.sourceforge.net |
    14. +
    15. | Support: http://sourceforge.net/projects/phpmailer/ |
    16. +
    17. | ------------------------------------------------------------------------- |
    18. +
    19. | Author: Andy Prevost (project admininistrator) |
    20. +
    21. | Author: Brent R. Matzelle (original founder) |
    22. +
    23. | Copyright (c) 2004-2007, Andy Prevost. All Rights Reserved. |
    24. +
    25. | Copyright (c) 2001-2003, Brent R. Matzelle |
    26. +
    27. | ------------------------------------------------------------------------- |
    28. +
    29. | License: Distributed under the Lesser General Public License (LGPL) |
    30. +
    31. | http://www.gnu.org/copyleft/lesser.html |
    32. +
    33. | This program is distributed in the hope that it will be useful - WITHOUT |
    34. +
    35. | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
    36. +
    37. | FITNESS FOR A PARTICULAR PURPOSE. |
    38. +
    39. | ------------------------------------------------------------------------- |
    40. +
    41. | We offer a number of paid services (www.codeworxtech.com): |
    42. +
    43. | - Web Hosting on highly optimized fast and secure servers |
    44. +
    45. | - Technology Consulting |
    46. +
    47. | - Oursourcing (highly qualified programmers and graphic designers) |
    48. +
    49. '---------------------------------------------------------------------------'
    50. +
    51.  
    52. +
    53.  
    54. +
    55.  
    56. +
    57. /**
    58. +
    59. * POP Before SMTP Authentication Class
    60. +
    61. *
    62. +
    63. * Author: Richard Davey (rich@corephp.co.uk)
    64. +
    65. * License: LGPL, see PHPMailer License
    66. +
    67. *
    68. +
    69. * Specifically for PHPMailer to allow POP before SMTP authentication.
    70. +
    71. * Does not yet work with APOP - if you have an APOP account, contact me
    72. +
    73. * and we can test changes to this script.
    74. +
    75. *
    76. +
    77. * This class is based on the structure of the SMTP class by Chris Ryan
    78. +
    79. *
    80. +
    81. * This class is rfc 1939 compliant and implements all the commands
    82. +
    83. * required for POP3 connection, authentication and disconnection.
    84. +
    85. *
    86. +
    87. * @package PHPMailer
    88. +
    89. * @author Richard Davey
    90. +
    91. */
    92. +
    93.  
    94. +
    95. class POP3
    96. +
    97. {
    98. +
    99. /**
    100. +
    101. * Default POP3 port
    102. +
    103. * @var int
    104. +
    105. */
    106. +
    107. var $POP3_PORT = 110;
    108. +
    109.  
    110. +
    111. /**
    112. +
    113. * Default Timeout
    114. +
    115. * @var int
    116. +
    117. */
    118. +
    119. var $POP3_TIMEOUT = 30;
    120. +
    121.  
    122. +
    123. /**
    124. +
    125. * POP3 Carriage Return + Line Feed
    126. +
    127. * @var string
    128. +
    129. */
    130. +
    131. var $CRLF = "\r\n";
    132. +
    133.  
    134. +
    135. /**
    136. +
    137. * Displaying Debug warnings? (0 = now, 1+ = yes)
    138. +
    139. * @var int
    140. +
    141. */
    142. +
    143. var $do_debug = 2;
    144. +
    145.  
    146. +
    147. /**
    148. +
    149. * POP3 Mail Server
    150. +
    151. * @var string
    152. +
    153. */
    154. +
    155. var $host;
    156. +
    157.  
    158. +
    159. /**
    160. +
    161. * POP3 Port
    162. +
    163. * @var int
    164. +
    165. */
    166. +
    167. var $port;
    168. +
    169.  
    170. +
    171. /**
    172. +
    173. * POP3 Timeout Value
    174. +
    175. * @var int
    176. +
    177. */
    178. +
    179. var $tval;
    180. +
    181.  
    182. +
    183. /**
    184. +
    185. * POP3 Username
    186. +
    187. * @var string
    188. +
    189. */
    190. +
    191. var $username;
    192. +
    193.  
    194. +
    195. /**
    196. +
    197. * POP3 Password
    198. +
    199. * @var string
    200. +
    201. */
    202. +
    203. var $password;
    204. +
    205.  
    206. +
    207. /**#@+
    208. +
    209. * @access private
    210. +
    211. */
    212. +
    213. var $pop_conn;
    214. +
    215. var $connected;
    216. +
    217. var $error; // Error log array
    218. +
    219. +
    220. /**#@-*/
    221. +
    222.  
    223. +
    224. /**
    225. +
    226. * Constructor, sets the initial values
    227. +
    228. *
    229. +
    230. * @return POP3
    231. +
    232. */
    233. +
    234. function POP3 ()
    235. +
    236. {
    237. +
    238. $this->pop_conn = 0;
    239. +
    240. $this->connected = false;
    241. +
    242. $this->error = null;
    243. +
    244. }
    245. +
    246.  
    247. +
    248. /**
    249. +
    250. * Combination of public events - connect, login, disconnect
    251. +
    252. *
    253. +
    254. * @param string $host
    255. +
    256. * @param integer $port
    257. +
    258. * @param integer $tval
    259. +
    260. * @param string $username
    261. +
    262. * @param string $password
    263. +
    264. */
    265. +
    266. function Authorise ($host, $port = false, $tval = false, $username, $password, $debug_level = 0)
    267. +
    268. {
    269. +
    270. $this->host = $host;
    271. +
    272.  
    273. +
    274. // If no port value is passed, retrieve it
    275. +
    276. if ($port == false)
    277. +
    278. {
    279. +
    280. $this->port = $this->POP3_PORT;
    281. +
    282. }
    283. +
    284. else
    285. +
    286. {
    287. +
    288. $this->port = $port;
    289. +
    290. }
    291. +
    292.  
    293. +
    294. // If no port value is passed, retrieve it
    295. +
    296. if ($tval == false)
    297. +
    298. {
    299. +
    300. $this->tval = $this->POP3_TIMEOUT;
    301. +
    302. }
    303. +
    304. else
    305. +
    306. {
    307. +
    308. $this->tval = $tval;
    309. +
    310. }
    311. +
    312.  
    313. +
    314. $this->do_debug = $debug_level;
    315. +
    316. $this->username = $username;
    317. +
    318. $this->password = $password;
    319. +
    320.  
    321. +
    322. // Refresh the error log
    323. +
    324. $this->error = null;
    325. +
    326.  
    327. +
    328. // Connect
    329. +
    330. $result = $this->Connect($this->host, $this->port, $this->tval);
    331. +
    332.  
    333. +
    334. if ($result)
    335. +
    336. {
    337. +
    338. $login_result = $this->Login($this->username, $this->password);
    339. +
    340.  
    341. +
    342. if ($login_result)
    343. +
    344. {
    345. +
    346. $this->Disconnect();
    347. +
    348.  
    349. +
    350. return true;
    351. +
    352. }
    353. +
    354.  
    355. +
    356. }
    357. +
    358.  
    359. +
    360. // We need to disconnect regardless if the login succeeded
    361. +
    362. $this->Disconnect();
    363. +
    364.  
    365. +
    366. return false;
    367. +
    368. }
    369. +
    370.  
    371. +
    372. /**
    373. +
    374. * Connect to the POP3 server
    375. +
    376. *
    377. +
    378. * @param string $host
    379. +
    380. * @param integer $port
    381. +
    382. * @param integer $tval
    383. +
    384. * @return boolean
    385. +
    386. */
    387. +
    388. function Connect ($host, $port = false, $tval = 30)
    389. +
    390. {
    391. +
    392. // Are we already connected?
    393. +
    394. if ($this->connected)
    395. +
    396. {
    397. +
    398. return true;
    399. +
    400. }
    401. +
    402.  
    403. +
    404. /*
    405. +
    406. On Windows this will raise a PHP Warning error if the hostname doesn't exist.
    407. +
    408. Rather than supress it with @fsockopen, let's capture it cleanly instead
    409. +
    410. */
    411. +
    412.  
    413. +
    414. set_error_handler(array(&$this, 'catchWarning'));
    415. +
    416.  
    417. +
    418. // Connect to the POP3 server
    419. +
    420. $this->pop_conn = fsockopen($host, // POP3 Host
    421. +
    422. $port, // Port #
    423. +
    424. $errno, // Error Number
    425. +
    426. $errstr, // Error Message
    427. +
    428. $tval); // Timeout (seconds)
    429. +
    430.  
    431. +
    432. // Restore the error handler
    433. +
    434. restore_error_handler();
    435. +
    436.  
    437. +
    438. // Does the Error Log now contain anything?
    439. +
    440. if ($this->error && $this->do_debug >= 1)
    441. +
    442. {
    443. +
    444. $this->displayErrors();
    445. +
    446. }
    447. +
    448.  
    449. +
    450. // Did we connect?
    451. +
    452. if ($this->pop_conn == false)
    453. +
    454. {
    455. +
    456. // It would appear not...
    457. +
    458. $this->error = array(
    459. +
    460. 'error' => "Failed to connect to server $host on port $port",
    461. +
    462. 'errno' => $errno,
    463. +
    464. 'errstr' => $errstr
    465. +
    466. );
    467. +
    468.  
    469. +
    470. if ($this->do_debug >= 1)
    471. +
    472. {
    473. +
    474. $this->displayErrors();
    475. +
    476. }
    477. +
    478.  
    479. +
    480. return false;
    481. +
    482. }
    483. +
    484.  
    485. +
    486. // Increase the stream time-out
    487. +
    488.  
    489. +
    490. // Check for PHP 4.3.0 or later
    491. +
    492. if (version_compare(phpversion(), '4.3.0', 'ge'))
    493. +
    494. {
    495. +
    496. stream_set_timeout($this->pop_conn, $tval, 0);
    497. +
    498. }
    499. +
    500. else
    501. +
    502. {
    503. +
    504. // Does not work on Windows
    505. +
    506. if (substr(PHP_OS, 0, 3) !== 'WIN')
    507. +
    508. {
    509. +
    510. socket_set_timeout($this->pop_conn, $tval, 0);
    511. +
    512. }
    513. +
    514. }
    515. +
    516.  
    517. +
    518. // Get the POP3 server response
    519. +
    520. $pop3_response = $this->getResponse();
    521. +
    522.  
    523. +
    524. // Check for the +OK
    525. +
    526. if ($this->checkResponse($pop3_response))
    527. +
    528. {
    529. +
    530. // The connection is established and the POP3 server is talking
    531. +
    532. $this->connected = true;
    533. +
    534. return true;
    535. +
    536. }
    537. +
    538.  
    539. +
    540. }
    541. +
    542.  
    543. +
    544. /**
    545. +
    546. * Login to the POP3 server (does not support APOP yet)
    547. +
    548. *
    549. +
    550. * @param string $username
    551. +
    552. * @param string $password
    553. +
    554. * @return boolean
    555. +
    556. */
    557. +
    558. function Login ($username = '', $password = '')
    559. +
    560. {
    561. +
    562. if ($this->connected == false)
    563. +
    564. {
    565. +
    566. $this->error = 'Not connected to POP3 server';
    567. +
    568.  
    569. +
    570. if ($this->do_debug >= 1)
    571. +
    572. {
    573. +
    574. $this->displayErrors();
    575. +
    576. }
    577. +
    578. }
    579. +
    580.  
    581. +
    582. if (empty($username))
    583. +
    584. {
    585. +
    586. $username = $this->username;
    587. +
    588. }
    589. +
    590.  
    591. +
    592. if (empty($password))
    593. +
    594. {
    595. +
    596. $password = $this->password;
    597. +
    598. }
    599. +
    600.  
    601. +
    602. $pop_username = "USER $username" . $this->CRLF;
    603. +
    604. $pop_password = "PASS $password" . $this->CRLF;
    605. +
    606.  
    607. +
    608. // Send the Username
    609. +
    610. $this->sendString($pop_username);
    611. +
    612. $pop3_response = $this->getResponse();
    613. +
    614.  
    615. +
    616. if ($this->checkResponse($pop3_response))
    617. +
    618. {
    619. +
    620. // Send the Password
    621. +
    622. $this->sendString($pop_password);
    623. +
    624. $pop3_response = $this->getResponse();
    625. +
    626.  
    627. +
    628. if ($this->checkResponse($pop3_response))
    629. +
    630. {
    631. +
    632. return true;
    633. +
    634. }
    635. +
    636. else
    637. +
    638. {
    639. +
    640. return false;
    641. +
    642. }
    643. +
    644. }
    645. +
    646. else
    647. +
    648. {
    649. +
    650. return false;
    651. +
    652. }
    653. +
    654. }
    655. +
    656.  
    657. +
    658. /**
    659. +
    660. * Disconnect from the POP3 server
    661. +
    662. */
    663. +
    664. function Disconnect ()
    665. +
    666. {
    667. +
    668. $this->sendString('QUIT');
    669. +
    670.  
    671. +
    672. fclose($this->pop_conn);
    673. +
    674. }
    675. +
    676.  
    677. +
    678. /*
    679. +
    680. ---------------
    681. +
    682. Private Methods
    683. +
    684. ---------------
    685. +
    686. */
    687. +
    688.  
    689. +
    690. /**
    691. +
    692. * Get the socket response back.
    693. +
    694. * $size is the maximum number of bytes to retrieve
    695. +
    696. *
    697. +
    698. * @param integer $size
    699. +
    700. * @return string
    701. +
    702. */
    703. +
    704. function getResponse ($size = 128)
    705. +
    706. {
    707. +
    708. $pop3_response = fgets($this->pop_conn, $size);
    709. +
    710.  
    711. +
    712. return $pop3_response;
    713. +
    714. }
    715. +
    716.  
    717. +
    718. /**
    719. +
    720. * Send a string down the open socket connection to the POP3 server
    721. +
    722. *
    723. +
    724. * @param string $string
    725. +
    726. * @return integer
    727. +
    728. */
    729. +
    730. function sendString ($string)
    731. +
    732. {
    733. +
    734. $bytes_sent = fwrite($this->pop_conn, $string, strlen($string));
    735. +
    736.  
    737. +
    738. return $bytes_sent;
    739. +
    740.  
    741. +
    742. }
    743. +
    744.  
    745. +
    746. /**
    747. +
    748. * Checks the POP3 server response for +OK or -ERR
    749. +
    750. *
    751. +
    752. * @param string $string
    753. +
    754. * @return boolean
    755. +
    756. */
    757. +
    758. function checkResponse ($string)
    759. +
    760. {
    761. +
    762. if (substr($string, 0, 3) !== '+OK')
    763. +
    764. {
    765. +
    766. $this->error = array(
    767. +
    768. 'error' => "Server reported an error: $string",
    769. +
    770. 'errno' => 0,
    771. +
    772. 'errstr' => ''
    773. +
    774. );
    775. +
    776.  
    777. +
    778. if ($this->do_debug >= 1)
    779. +
    780. {
    781. +
    782. $this->displayErrors();
    783. +
    784. }
    785. +
    786.  
    787. +
    788. return false;
    789. +
    790. }
    791. +
    792. else
    793. +
    794. {
    795. +
    796. return true;
    797. +
    798. }
    799. +
    800.  
    801. +
    802. }
    803. +
    804.  
    805. +
    806. /**
    807. +
    808. * If debug is enabled, display the error message array
    809. +
    810. *
    811. +
    812. */
    813. +
    814. function displayErrors ()
    815. +
    816. {
    817. +
    818. echo '<pre>';
    819. +
    820.  
    821. +
    822. foreach ($this->error as $single_error)
    823. +
    824. {
    825. +
    826. print_r($single_error);
    827. +
    828. }
    829. +
    830.  
    831. +
    832. echo '</pre>';
    833. +
    834. }
    835. +
    836.  
    837. +
    838. /**
    839. +
    840. * Takes over from PHP for the socket warning handler
    841. +
    842. *
    843. +
    844. * @param integer $errno
    845. +
    846. * @param string $errstr
    847. +
    848. * @param string $errfile
    849. +
    850. * @param integer $errline
    851. +
    852. */
    853. +
    854. function catchWarning ($errno, $errstr, $errfile, $errline)
    855. +
    856. {
    857. +
    858. $this->error[] = array(
    859. +
    860. 'error' => "Connecting to the POP3 server raised a PHP warning: ",
    861. +
    862. 'errno' => $errno,
    863. +
    864. 'errstr' => $errstr
    865. +
    866. );
    867. +
    868. }
    869. +
    870.  
    871. +
    872. // End of class
    873. +
    874.  
    875. +
    876. }
    877. +
    878. ?>
    879. +
    +
    +

    + Documentation generated on Thu, 02 Apr 2009 21:19:49 -0400 by phpDocumentor 1.3.0RC3 +

    + + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/__filesource/fsource_PHPMailer__class.smtp.php.html b/plugin/PHPMailer_v2.0.4/phpdocs/__filesource/fsource_PHPMailer__class.smtp.php.html new file mode 100644 index 000000000..5dd8e6f8d --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/__filesource/fsource_PHPMailer__class.smtp.php.html @@ -0,0 +1,1092 @@ + + + + + + File Source for class.smtp.php + + + + +

    Source for file class.smtp.php

    +

    Documentation is available at class.smtp.php

    +
    +
    1. <?php
    2. +
    3. /*~ class.smtp.php
    4. +
    5. .---------------------------------------------------------------------------.
    6. +
    7. | Software: PHPMailer - PHP email class |
    8. +
    9. | Version: 2.0.4 |
    10. +
    11. | Contact: via sourceforge.net support pages (also www.codeworxtech.com) |
    12. +
    13. | Info: http://phpmailer.sourceforge.net |
    14. +
    15. | Support: http://sourceforge.net/projects/phpmailer/ |
    16. +
    17. | ------------------------------------------------------------------------- |
    18. +
    19. | Author: Andy Prevost (project admininistrator) |
    20. +
    21. | Author: Brent R. Matzelle (original founder) |
    22. +
    23. | Copyright (c) 2004-2007, Andy Prevost. All Rights Reserved. |
    24. +
    25. | Copyright (c) 2001-2003, Brent R. Matzelle |
    26. +
    27. | ------------------------------------------------------------------------- |
    28. +
    29. | License: Distributed under the Lesser General Public License (LGPL) |
    30. +
    31. | http://www.gnu.org/copyleft/lesser.html |
    32. +
    33. | This program is distributed in the hope that it will be useful - WITHOUT |
    34. +
    35. | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
    36. +
    37. | FITNESS FOR A PARTICULAR PURPOSE. |
    38. +
    39. | ------------------------------------------------------------------------- |
    40. +
    41. | We offer a number of paid services (www.codeworxtech.com): |
    42. +
    43. | - Web Hosting on highly optimized fast and secure servers |
    44. +
    45. | - Technology Consulting |
    46. +
    47. | - Oursourcing (highly qualified programmers and graphic designers) |
    48. +
    49. '---------------------------------------------------------------------------'
    50. +
    51.  
    52. +
    53.  
    54. +
    55.  
    56. +
    57. /**
    58. +
    59. * SMTP is rfc 821 compliant and implements all the rfc 821 SMTP
    60. +
    61. * commands except TURN which will always return a not implemented
    62. +
    63. * error. SMTP also provides some utility methods for sending mail
    64. +
    65. * to an SMTP server.
    66. +
    67. * @package PHPMailer
    68. +
    69. * @author Chris Ryan
    70. +
    71. */
    72. +
    73.  
    74. +
    75. class SMTP
    76. +
    77. {
    78. +
    79. /**
    80. +
    81. * SMTP server port
    82. +
    83. * @var int
    84. +
    85. */
    86. +
    87. var $SMTP_PORT = 25;
    88. +
    89.  
    90. +
    91. /**
    92. +
    93. * SMTP reply line ending
    94. +
    95. * @var string
    96. +
    97. */
    98. +
    99. var $CRLF = "\r\n";
    100. +
    101.  
    102. +
    103. /**
    104. +
    105. * Sets whether debugging is turned on
    106. +
    107. * @var bool
    108. +
    109. */
    110. +
    111. var $do_debug; # the level of debug to perform
    112. +
    113.  
    114. +
    115. +
    116.  
    117. +
    118. /**
    119. +
    120. * Sets VERP use on/off (default is off)
    121. +
    122. * @var bool
    123. +
    124. */
    125. +
    126. var $do_verp = false;
    127. +
    128.  
    129. +
    130. /**#@+
    131. +
    132. * @access private
    133. +
    134. */
    135. +
    136. var $smtp_conn; # the socket to the server
    137. +
    138. +
    139. var $error; # error if any on the last call
    140. +
    141. +
    142. var $helo_rply; # the reply the server sent to us for HELO
    143. +
    144. +
    145. /**#@-*/
    146. +
    147.  
    148. +
    149. /**
    150. +
    151. * Initialize the class so that the data is in a known state.
    152. +
    153. * @access public
    154. +
    155. * @return void
    156. +
    157. */
    158. +
    159. function SMTP() {
    160. +
    161. $this->smtp_conn = 0;
    162. +
    163. $this->error = null;
    164. +
    165. $this->helo_rply = null;
    166. +
    167.  
    168. +
    169. $this->do_debug = 0;
    170. +
    171. }
    172. +
    173.  
    174. +
    175. /***********************************************************
    176. +
    177. * CONNECTION FUNCTIONS *
    178. +
    179. ***********************************************************/
    180. +
    181.  
    182. +
    183.  
    184. +
    185. /**
    186. +
    187. * Connect to the server specified on the port specified.
    188. +
    189. * If the port is not specified use the default SMTP_PORT.
    190. +
    191. * If tval is specified then a connection will try and be
    192. +
    193. * established with the server for that number of seconds.
    194. +
    195. * If tval is not specified the default is 30 seconds to
    196. +
    197. * try on the connection.
    198. +
    199. *
    200. +
    201. * SMTP CODE SUCCESS: 220
    202. +
    203. * SMTP CODE FAILURE: 421
    204. +
    205. * @access public
    206. +
    207. * @return bool
    208. +
    209. */
    210. +
    211. function Connect($host,$port=0,$tval=30) {
    212. +
    213. # set the error val to null so there is no confusion
    214. +
    215. $this->error = null;
    216. +
    217.  
    218. +
    219. # make sure we are __not__ connected
    220. +
    221. if($this->connected()) {
    222. +
    223. # ok we are connected! what should we do?
    224. +
    225. # for now we will just give an error saying we
    226. +
    227. # are already connected
    228. +
    229. $this->error = array("error" => "Already connected to a server");
    230. +
    231. return false;
    232. +
    233. }
    234. +
    235.  
    236. +
    237. if(empty($port)) {
    238. +
    239. $port = $this->SMTP_PORT;
    240. +
    241. }
    242. +
    243.  
    244. +
    245. #connect to the smtp server
    246. +
    247. $this->smtp_conn = fsockopen($host, # the host of the server
    248. +
    249. $port, # the port to use
    250. +
    251. $errno, # error number if any
    252. +
    253. $errstr, # error message if any
    254. +
    255. $tval); # give up after ? secs
    256. +
    257. # verify we connected properly
    258. +
    259. if(empty($this->smtp_conn)) {
    260. +
    261. $this->error = array("error" => "Failed to connect to server",
    262. +
    263. "errno" => $errno,
    264. +
    265. "errstr" => $errstr);
    266. +
    267. if($this->do_debug >= 1) {
    268. +
    269. echo "SMTP -> ERROR: " . $this->error["error"] .
    270. +
    271. ": $errstr ($errno)" . $this->CRLF;
    272. +
    273. }
    274. +
    275. return false;
    276. +
    277. }
    278. +
    279.  
    280. +
    281. # sometimes the SMTP server takes a little longer to respond
    282. +
    283. # so we will give it a longer timeout for the first read
    284. +
    285. // Windows still does not have support for this timeout function
    286. +
    287. if(substr(PHP_OS, 0, 3) != "WIN")
    288. +
    289. socket_set_timeout($this->smtp_conn, $tval, 0);
    290. +
    291.  
    292. +
    293. # get any announcement stuff
    294. +
    295. $announce = $this->get_lines();
    296. +
    297.  
    298. +
    299. # set the timeout of any socket functions at 1/10 of a second
    300. +
    301. //if(function_exists("socket_set_timeout"))
    302. +
    303. // socket_set_timeout($this->smtp_conn, 0, 100000);
    304. +
    305.  
    306. +
    307. if($this->do_debug >= 2) {
    308. +
    309. echo "SMTP -> FROM SERVER:" . $this->CRLF . $announce;
    310. +
    311. }
    312. +
    313.  
    314. +
    315. return true;
    316. +
    317. }
    318. +
    319.  
    320. +
    321. /**
    322. +
    323. * Performs SMTP authentication. Must be run after running the
    324. +
    325. * Hello() method. Returns true if successfully authenticated.
    326. +
    327. * @access public
    328. +
    329. * @return bool
    330. +
    331. */
    332. +
    333. function Authenticate($username, $password) {
    334. +
    335. // Start authentication
    336. +
    337. fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF);
    338. +
    339.  
    340. +
    341. $rply = $this->get_lines();
    342. +
    343. $code = substr($rply,0,3);
    344. +
    345.  
    346. +
    347. if($code != 334) {
    348. +
    349. $this->error =
    350. +
    351. array("error" => "AUTH not accepted from server",
    352. +
    353. "smtp_code" => $code,
    354. +
    355. "smtp_msg" => substr($rply,4));
    356. +
    357. if($this->do_debug >= 1) {
    358. +
    359. echo "SMTP -> ERROR: " . $this->error["error"] .
    360. +
    361. ": " . $rply . $this->CRLF;
    362. +
    363. }
    364. +
    365. return false;
    366. +
    367. }
    368. +
    369.  
    370. +
    371. // Send encoded username
    372. +
    373. fputs($this->smtp_conn, base64_encode($username) . $this->CRLF);
    374. +
    375.  
    376. +
    377. $rply = $this->get_lines();
    378. +
    379. $code = substr($rply,0,3);
    380. +
    381.  
    382. +
    383. if($code != 334) {
    384. +
    385. $this->error =
    386. +
    387. array("error" => "Username not accepted from server",
    388. +
    389. "smtp_code" => $code,
    390. +
    391. "smtp_msg" => substr($rply,4));
    392. +
    393. if($this->do_debug >= 1) {
    394. +
    395. echo "SMTP -> ERROR: " . $this->error["error"] .
    396. +
    397. ": " . $rply . $this->CRLF;
    398. +
    399. }
    400. +
    401. return false;
    402. +
    403. }
    404. +
    405.  
    406. +
    407. // Send encoded password
    408. +
    409. fputs($this->smtp_conn, base64_encode($password) . $this->CRLF);
    410. +
    411.  
    412. +
    413. $rply = $this->get_lines();
    414. +
    415. $code = substr($rply,0,3);
    416. +
    417.  
    418. +
    419. if($code != 235) {
    420. +
    421. $this->error =
    422. +
    423. array("error" => "Password not accepted from server",
    424. +
    425. "smtp_code" => $code,
    426. +
    427. "smtp_msg" => substr($rply,4));
    428. +
    429. if($this->do_debug >= 1) {
    430. +
    431. echo "SMTP -> ERROR: " . $this->error["error"] .
    432. +
    433. ": " . $rply . $this->CRLF;
    434. +
    435. }
    436. +
    437. return false;
    438. +
    439. }
    440. +
    441.  
    442. +
    443. return true;
    444. +
    445. }
    446. +
    447.  
    448. +
    449. /**
    450. +
    451. * Returns true if connected to a server otherwise false
    452. +
    453. * @access private
    454. +
    455. * @return bool
    456. +
    457. */
    458. +
    459. function Connected() {
    460. +
    461. if(!empty($this->smtp_conn)) {
    462. +
    463. $sock_status = socket_get_status($this->smtp_conn);
    464. +
    465. if($sock_status["eof"]) {
    466. +
    467. # hmm this is an odd situation... the socket is
    468. +
    469. # valid but we are not connected anymore
    470. +
    471. if($this->do_debug >= 1) {
    472. +
    473. echo "SMTP -> NOTICE:" . $this->CRLF .
    474. +
    475. "EOF caught while checking if connected";
    476. +
    477. }
    478. +
    479. $this->Close();
    480. +
    481. return false;
    482. +
    483. }
    484. +
    485. return true; # everything looks good
    486. +
    487. }
    488. +
    489. return false;
    490. +
    491. }
    492. +
    493.  
    494. +
    495. /**
    496. +
    497. * Closes the socket and cleans up the state of the class.
    498. +
    499. * It is not considered good to use this function without
    500. +
    501. * first trying to use QUIT.
    502. +
    503. * @access public
    504. +
    505. * @return void
    506. +
    507. */
    508. +
    509. function Close() {
    510. +
    511. $this->error = null; # so there is no confusion
    512. +
    513. $this->helo_rply = null;
    514. +
    515. if(!empty($this->smtp_conn)) {
    516. +
    517. # close the connection and cleanup
    518. +
    519. fclose($this->smtp_conn);
    520. +
    521. $this->smtp_conn = 0;
    522. +
    523. }
    524. +
    525. }
    526. +
    527.  
    528. +
    529. /*************************************************************
    530. +
    531. * SMTP COMMANDS *
    532. +
    533. *************************************************************/
    534. +
    535.  
    536. +
    537.  
    538. +
    539. /**
    540. +
    541. * Issues a data command and sends the msg_data to the server
    542. +
    543. * finializing the mail transaction. $msg_data is the message
    544. +
    545. * that is to be send with the headers. Each header needs to be
    546. +
    547. * on a single line followed by a <CRLF> with the message headers
    548. +
    549. * and the message body being seperated by and additional <CRLF>.
    550. +
    551. *
    552. +
    553. * Implements rfc 821: DATA <CRLF>
    554. +
    555. *
    556. +
    557. * SMTP CODE INTERMEDIATE: 354
    558. +
    559. * [data]
    560. +
    561. * <CRLF>.<CRLF>
    562. +
    563. * SMTP CODE SUCCESS: 250
    564. +
    565. * SMTP CODE FAILURE: 552,554,451,452
    566. +
    567. * SMTP CODE FAILURE: 451,554
    568. +
    569. * SMTP CODE ERROR : 500,501,503,421
    570. +
    571. * @access public
    572. +
    573. * @return bool
    574. +
    575. */
    576. +
    577. function Data($msg_data) {
    578. +
    579. $this->error = null; # so no confusion is caused
    580. +
    581.  
    582. +
    583. if(!$this->connected()) {
    584. +
    585. $this->error = array(
    586. +
    587. "error" => "Called Data() without being connected");
    588. +
    589. return false;
    590. +
    591. }
    592. +
    593.  
    594. +
    595. fputs($this->smtp_conn,"DATA" . $this->CRLF);
    596. +
    597.  
    598. +
    599. $rply = $this->get_lines();
    600. +
    601. $code = substr($rply,0,3);
    602. +
    603.  
    604. +
    605. if($this->do_debug >= 2) {
    606. +
    607. echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
    608. +
    609. }
    610. +
    611.  
    612. +
    613. if($code != 354) {
    614. +
    615. $this->error =
    616. +
    617. array("error" => "DATA command not accepted from server",
    618. +
    619. "smtp_code" => $code,
    620. +
    621. "smtp_msg" => substr($rply,4));
    622. +
    623. if($this->do_debug >= 1) {
    624. +
    625. echo "SMTP -> ERROR: " . $this->error["error"] .
    626. +
    627. ": " . $rply . $this->CRLF;
    628. +
    629. }
    630. +
    631. return false;
    632. +
    633. }
    634. +
    635.  
    636. +
    637. # the server is ready to accept data!
    638. +
    639. # according to rfc 821 we should not send more than 1000
    640. +
    641. # including the CRLF
    642. +
    643. # characters on a single line so we will break the data up
    644. +
    645. # into lines by \r and/or \n then if needed we will break
    646. +
    647. # each of those into smaller lines to fit within the limit.
    648. +
    649. # in addition we will be looking for lines that start with
    650. +
    651. # a period '.' and append and additional period '.' to that
    652. +
    653. # line. NOTE: this does not count towards are limit.
    654. +
    655.  
    656. +
    657. # normalize the line breaks so we know the explode works
    658. +
    659. $msg_data = str_replace("\r\n","\n",$msg_data);
    660. +
    661. $msg_data = str_replace("\r","\n",$msg_data);
    662. +
    663. $lines = explode("\n",$msg_data);
    664. +
    665.  
    666. +
    667. # we need to find a good way to determine is headers are
    668. +
    669. # in the msg_data or if it is a straight msg body
    670. +
    671. # currently I am assuming rfc 822 definitions of msg headers
    672. +
    673. # and if the first field of the first line (':' sperated)
    674. +
    675. # does not contain a space then it _should_ be a header
    676. +
    677. # and we can process all lines before a blank "" line as
    678. +
    679. # headers.
    680. +
    681. $field = substr($lines[0],0,strpos($lines[0],":"));
    682. +
    683. $in_headers = false;
    684. +
    685. if(!empty($field) && !strstr($field," ")) {
    686. +
    687. $in_headers = true;
    688. +
    689. }
    690. +
    691.  
    692. +
    693. $max_line_length = 998; # used below; set here for ease in change
    694. +
    695.  
    696. +
    697. while(list(,$line) = @each($lines)) {
    698. +
    699. $lines_out = null;
    700. +
    701. if($line == "" && $in_headers) {
    702. +
    703. $in_headers = false;
    704. +
    705. }
    706. +
    707. # ok we need to break this line up into several
    708. +
    709. # smaller lines
    710. +
    711. while(strlen($line) > $max_line_length) {
    712. +
    713. $pos = strrpos(substr($line,0,$max_line_length)," ");
    714. +
    715.  
    716. +
    717. # Patch to fix DOS attack
    718. +
    719. if(!$pos) {
    720. +
    721. $pos = $max_line_length - 1;
    722. +
    723. }
    724. +
    725.  
    726. +
    727. $lines_out[] = substr($line,0,$pos);
    728. +
    729. $line = substr($line,$pos + 1);
    730. +
    731. # if we are processing headers we need to
    732. +
    733. # add a LWSP-char to the front of the new line
    734. +
    735. # rfc 822 on long msg headers
    736. +
    737. if($in_headers) {
    738. +
    739. $line = "\t" . $line;
    740. +
    741. }
    742. +
    743. }
    744. +
    745. $lines_out[] = $line;
    746. +
    747.  
    748. +
    749. # now send the lines to the server
    750. +
    751. while(list(,$line_out) = @each($lines_out)) {
    752. +
    753. if(strlen($line_out) > 0)
    754. +
    755. {
    756. +
    757. if(substr($line_out, 0, 1) == ".") {
    758. +
    759. $line_out = "." . $line_out;
    760. +
    761. }
    762. +
    763. }
    764. +
    765. fputs($this->smtp_conn,$line_out . $this->CRLF);
    766. +
    767. }
    768. +
    769. }
    770. +
    771.  
    772. +
    773. # ok all the message data has been sent so lets get this
    774. +
    775. # over with aleady
    776. +
    777. fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF);
    778. +
    779.  
    780. +
    781. $rply = $this->get_lines();
    782. +
    783. $code = substr($rply,0,3);
    784. +
    785.  
    786. +
    787. if($this->do_debug >= 2) {
    788. +
    789. echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
    790. +
    791. }
    792. +
    793.  
    794. +
    795. if($code != 250) {
    796. +
    797. $this->error =
    798. +
    799. array("error" => "DATA not accepted from server",
    800. +
    801. "smtp_code" => $code,
    802. +
    803. "smtp_msg" => substr($rply,4));
    804. +
    805. if($this->do_debug >= 1) {
    806. +
    807. echo "SMTP -> ERROR: " . $this->error["error"] .
    808. +
    809. ": " . $rply . $this->CRLF;
    810. +
    811. }
    812. +
    813. return false;
    814. +
    815. }
    816. +
    817. return true;
    818. +
    819. }
    820. +
    821.  
    822. +
    823. /**
    824. +
    825. * Expand takes the name and asks the server to list all the
    826. +
    827. * people who are members of the _list_. Expand will return
    828. +
    829. * back and array of the result or false if an error occurs.
    830. +
    831. * Each value in the array returned has the format of:
    832. +
    833. * [ <full-name> <sp> ] <path>
    834. +
    835. * The definition of <path> is defined in rfc 821
    836. +
    837. *
    838. +
    839. * Implements rfc 821: EXPN <SP> <string> <CRLF>
    840. +
    841. *
    842. +
    843. * SMTP CODE SUCCESS: 250
    844. +
    845. * SMTP CODE FAILURE: 550
    846. +
    847. * SMTP CODE ERROR : 500,501,502,504,421
    848. +
    849. * @access public
    850. +
    851. * @return string array
    852. +
    853. */
    854. +
    855. function Expand($name) {
    856. +
    857. $this->error = null; # so no confusion is caused
    858. +
    859.  
    860. +
    861. if(!$this->connected()) {
    862. +
    863. $this->error = array(
    864. +
    865. "error" => "Called Expand() without being connected");
    866. +
    867. return false;
    868. +
    869. }
    870. +
    871.  
    872. +
    873. fputs($this->smtp_conn,"EXPN " . $name . $this->CRLF);
    874. +
    875.  
    876. +
    877. $rply = $this->get_lines();
    878. +
    879. $code = substr($rply,0,3);
    880. +
    881.  
    882. +
    883. if($this->do_debug >= 2) {
    884. +
    885. echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
    886. +
    887. }
    888. +
    889.  
    890. +
    891. if($code != 250) {
    892. +
    893. $this->error =
    894. +
    895. array("error" => "EXPN not accepted from server",
    896. +
    897. "smtp_code" => $code,
    898. +
    899. "smtp_msg" => substr($rply,4));
    900. +
    901. if($this->do_debug >= 1) {
    902. +
    903. echo "SMTP -> ERROR: " . $this->error["error"] .
    904. +
    905. ": " . $rply . $this->CRLF;
    906. +
    907. }
    908. +
    909. return false;
    910. +
    911. }
    912. +
    913.  
    914. +
    915. # parse the reply and place in our array to return to user
    916. +
    917. $entries = explode($this->CRLF,$rply);
    918. +
    919. while(list(,$l) = @each($entries)) {
    920. +
    921. $list[] = substr($l,4);
    922. +
    923. }
    924. +
    925.  
    926. +
    927. return $list;
    928. +
    929. }
    930. +
    931.  
    932. +
    933. /**
    934. +
    935. * Sends the HELO command to the smtp server.
    936. +
    937. * This makes sure that we and the server are in
    938. +
    939. * the same known state.
    940. +
    941. *
    942. +
    943. * Implements from rfc 821: HELO <SP> <domain> <CRLF>
    944. +
    945. *
    946. +
    947. * SMTP CODE SUCCESS: 250
    948. +
    949. * SMTP CODE ERROR : 500, 501, 504, 421
    950. +
    951. * @access public
    952. +
    953. * @return bool
    954. +
    955. */
    956. +
    957. function Hello($host="") {
    958. +
    959. $this->error = null; # so no confusion is caused
    960. +
    961.  
    962. +
    963. if(!$this->connected()) {
    964. +
    965. $this->error = array(
    966. +
    967. "error" => "Called Hello() without being connected");
    968. +
    969. return false;
    970. +
    971. }
    972. +
    973.  
    974. +
    975. # if a hostname for the HELO was not specified determine
    976. +
    977. # a suitable one to send
    978. +
    979. if(empty($host)) {
    980. +
    981. # we need to determine some sort of appopiate default
    982. +
    983. # to send to the server
    984. +
    985. $host = "localhost";
    986. +
    987. }
    988. +
    989.  
    990. +
    991. // Send extended hello first (RFC 2821)
    992. +
    993. if(!$this->SendHello("EHLO", $host))
    994. +
    995. {
    996. +
    997. if(!$this->SendHello("HELO", $host))
    998. +
    999. return false;
    1000. +
    1001. }
    1002. +
    1003.  
    1004. +
    1005. return true;
    1006. +
    1007. }
    1008. +
    1009.  
    1010. +
    1011. /**
    1012. +
    1013. * Sends a HELO/EHLO command.
    1014. +
    1015. * @access private
    1016. +
    1017. * @return bool
    1018. +
    1019. */
    1020. +
    1021. function SendHello($hello, $host) {
    1022. +
    1023. fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF);
    1024. +
    1025.  
    1026. +
    1027. $rply = $this->get_lines();
    1028. +
    1029. $code = substr($rply,0,3);
    1030. +
    1031.  
    1032. +
    1033. if($this->do_debug >= 2) {
    1034. +
    1035. echo "SMTP -> FROM SERVER: " . $this->CRLF . $rply;
    1036. +
    1037. }
    1038. +
    1039.  
    1040. +
    1041. if($code != 250) {
    1042. +
    1043. $this->error =
    1044. +
    1045. array("error" => $hello . " not accepted from server",
    1046. +
    1047. "smtp_code" => $code,
    1048. +
    1049. "smtp_msg" => substr($rply,4));
    1050. +
    1051. if($this->do_debug >= 1) {
    1052. +
    1053. echo "SMTP -> ERROR: " . $this->error["error"] .
    1054. +
    1055. ": " . $rply . $this->CRLF;
    1056. +
    1057. }
    1058. +
    1059. return false;
    1060. +
    1061. }
    1062. +
    1063.  
    1064. +
    1065. $this->helo_rply = $rply;
    1066. +
    1067.  
    1068. +
    1069. return true;
    1070. +
    1071. }
    1072. +
    1073.  
    1074. +
    1075. /**
    1076. +
    1077. * Gets help information on the keyword specified. If the keyword
    1078. +
    1079. * is not specified then returns generic help, ussually contianing
    1080. +
    1081. * A list of keywords that help is available on. This function
    1082. +
    1083. * returns the results back to the user. It is up to the user to
    1084. +
    1085. * handle the returned data. If an error occurs then false is
    1086. +
    1087. * returned with $this->error set appropiately.
    1088. +
    1089. *
    1090. +
    1091. * Implements rfc 821: HELP [ <SP> <string> ] <CRLF>
    1092. +
    1093. *
    1094. +
    1095. * SMTP CODE SUCCESS: 211,214
    1096. +
    1097. * SMTP CODE ERROR : 500,501,502,504,421
    1098. +
    1099. * @access public
    1100. +
    1101. * @return string
    1102. +
    1103. */
    1104. +
    1105. function Help($keyword="") {
    1106. +
    1107. $this->error = null; # to avoid confusion
    1108. +
    1109.  
    1110. +
    1111. if(!$this->connected()) {
    1112. +
    1113. $this->error = array(
    1114. +
    1115. "error" => "Called Help() without being connected");
    1116. +
    1117. return false;
    1118. +
    1119. }
    1120. +
    1121.  
    1122. +
    1123. $extra = "";
    1124. +
    1125. if(!empty($keyword)) {
    1126. +
    1127. $extra = " " . $keyword;
    1128. +
    1129. }
    1130. +
    1131.  
    1132. +
    1133. fputs($this->smtp_conn,"HELP" . $extra . $this->CRLF);
    1134. +
    1135.  
    1136. +
    1137. $rply = $this->get_lines();
    1138. +
    1139. $code = substr($rply,0,3);
    1140. +
    1141.  
    1142. +
    1143. if($this->do_debug >= 2) {
    1144. +
    1145. echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
    1146. +
    1147. }
    1148. +
    1149.  
    1150. +
    1151. if($code != 211 && $code != 214) {
    1152. +
    1153. $this->error =
    1154. +
    1155. array("error" => "HELP not accepted from server",
    1156. +
    1157. "smtp_code" => $code,
    1158. +
    1159. "smtp_msg" => substr($rply,4));
    1160. +
    1161. if($this->do_debug >= 1) {
    1162. +
    1163. echo "SMTP -> ERROR: " . $this->error["error"] .
    1164. +
    1165. ": " . $rply . $this->CRLF;
    1166. +
    1167. }
    1168. +
    1169. return false;
    1170. +
    1171. }
    1172. +
    1173.  
    1174. +
    1175. return $rply;
    1176. +
    1177. }
    1178. +
    1179.  
    1180. +
    1181. /**
    1182. +
    1183. * Starts a mail transaction from the email address specified in
    1184. +
    1185. * $from. Returns true if successful or false otherwise. If True
    1186. +
    1187. * the mail transaction is started and then one or more Recipient
    1188. +
    1189. * commands may be called followed by a Data command.
    1190. +
    1191. *
    1192. +
    1193. * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
    1194. +
    1195. *
    1196. +
    1197. * SMTP CODE SUCCESS: 250
    1198. +
    1199. * SMTP CODE SUCCESS: 552,451,452
    1200. +
    1201. * SMTP CODE SUCCESS: 500,501,421
    1202. +
    1203. * @access public
    1204. +
    1205. * @return bool
    1206. +
    1207. */
    1208. +
    1209. function Mail($from) {
    1210. +
    1211. $this->error = null; # so no confusion is caused
    1212. +
    1213.  
    1214. +
    1215. if(!$this->connected()) {
    1216. +
    1217. $this->error = array(
    1218. +
    1219. "error" => "Called Mail() without being connected");
    1220. +
    1221. return false;
    1222. +
    1223. }
    1224. +
    1225.  
    1226. +
    1227. $useVerp = ($this->do_verp ? "XVERP" : "");
    1228. +
    1229. fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $useVerp . $this->CRLF);
    1230. +
    1231.  
    1232. +
    1233. $rply = $this->get_lines();
    1234. +
    1235. $code = substr($rply,0,3);
    1236. +
    1237.  
    1238. +
    1239. if($this->do_debug >= 2) {
    1240. +
    1241. echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
    1242. +
    1243. }
    1244. +
    1245.  
    1246. +
    1247. if($code != 250) {
    1248. +
    1249. $this->error =
    1250. +
    1251. array("error" => "MAIL not accepted from server",
    1252. +
    1253. "smtp_code" => $code,
    1254. +
    1255. "smtp_msg" => substr($rply,4));
    1256. +
    1257. if($this->do_debug >= 1) {
    1258. +
    1259. echo "SMTP -> ERROR: " . $this->error["error"] .
    1260. +
    1261. ": " . $rply . $this->CRLF;
    1262. +
    1263. }
    1264. +
    1265. return false;
    1266. +
    1267. }
    1268. +
    1269. return true;
    1270. +
    1271. }
    1272. +
    1273.  
    1274. +
    1275. /**
    1276. +
    1277. * Sends the command NOOP to the SMTP server.
    1278. +
    1279. *
    1280. +
    1281. * Implements from rfc 821: NOOP <CRLF>
    1282. +
    1283. *
    1284. +
    1285. * SMTP CODE SUCCESS: 250
    1286. +
    1287. * SMTP CODE ERROR : 500, 421
    1288. +
    1289. * @access public
    1290. +
    1291. * @return bool
    1292. +
    1293. */
    1294. +
    1295. function Noop() {
    1296. +
    1297. $this->error = null; # so no confusion is caused
    1298. +
    1299.  
    1300. +
    1301. if(!$this->connected()) {
    1302. +
    1303. $this->error = array(
    1304. +
    1305. "error" => "Called Noop() without being connected");
    1306. +
    1307. return false;
    1308. +
    1309. }
    1310. +
    1311.  
    1312. +
    1313. fputs($this->smtp_conn,"NOOP" . $this->CRLF);
    1314. +
    1315.  
    1316. +
    1317. $rply = $this->get_lines();
    1318. +
    1319. $code = substr($rply,0,3);
    1320. +
    1321.  
    1322. +
    1323. if($this->do_debug >= 2) {
    1324. +
    1325. echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
    1326. +
    1327. }
    1328. +
    1329.  
    1330. +
    1331. if($code != 250) {
    1332. +
    1333. $this->error =
    1334. +
    1335. array("error" => "NOOP not accepted from server",
    1336. +
    1337. "smtp_code" => $code,
    1338. +
    1339. "smtp_msg" => substr($rply,4));
    1340. +
    1341. if($this->do_debug >= 1) {
    1342. +
    1343. echo "SMTP -> ERROR: " . $this->error["error"] .
    1344. +
    1345. ": " . $rply . $this->CRLF;
    1346. +
    1347. }
    1348. +
    1349. return false;
    1350. +
    1351. }
    1352. +
    1353. return true;
    1354. +
    1355. }
    1356. +
    1357.  
    1358. +
    1359. /**
    1360. +
    1361. * Sends the quit command to the server and then closes the socket
    1362. +
    1363. * if there is no error or the $close_on_error argument is true.
    1364. +
    1365. *
    1366. +
    1367. * Implements from rfc 821: QUIT <CRLF>
    1368. +
    1369. *
    1370. +
    1371. * SMTP CODE SUCCESS: 221
    1372. +
    1373. * SMTP CODE ERROR : 500
    1374. +
    1375. * @access public
    1376. +
    1377. * @return bool
    1378. +
    1379. */
    1380. +
    1381. function Quit($close_on_error=true) {
    1382. +
    1383. $this->error = null; # so there is no confusion
    1384. +
    1385.  
    1386. +
    1387. if(!$this->connected()) {
    1388. +
    1389. $this->error = array(
    1390. +
    1391. "error" => "Called Quit() without being connected");
    1392. +
    1393. return false;
    1394. +
    1395. }
    1396. +
    1397.  
    1398. +
    1399. # send the quit command to the server
    1400. +
    1401. fputs($this->smtp_conn,"quit" . $this->CRLF);
    1402. +
    1403.  
    1404. +
    1405. # get any good-bye messages
    1406. +
    1407. $byemsg = $this->get_lines();
    1408. +
    1409.  
    1410. +
    1411. if($this->do_debug >= 2) {
    1412. +
    1413. echo "SMTP -> FROM SERVER:" . $this->CRLF . $byemsg;
    1414. +
    1415. }
    1416. +
    1417.  
    1418. +
    1419. $rval = true;
    1420. +
    1421. $e = null;
    1422. +
    1423.  
    1424. +
    1425. $code = substr($byemsg,0,3);
    1426. +
    1427. if($code != 221) {
    1428. +
    1429. # use e as a tmp var cause Close will overwrite $this->error
    1430. +
    1431. $e = array("error" => "SMTP server rejected quit command",
    1432. +
    1433. "smtp_code" => $code,
    1434. +
    1435. "smtp_rply" => substr($byemsg,4));
    1436. +
    1437. $rval = false;
    1438. +
    1439. if($this->do_debug >= 1) {
    1440. +
    1441. echo "SMTP -> ERROR: " . $e["error"] . ": " .
    1442. +
    1443. $byemsg . $this->CRLF;
    1444. +
    1445. }
    1446. +
    1447. }
    1448. +
    1449.  
    1450. +
    1451. if(empty($e) || $close_on_error) {
    1452. +
    1453. $this->Close();
    1454. +
    1455. }
    1456. +
    1457.  
    1458. +
    1459. return $rval;
    1460. +
    1461. }
    1462. +
    1463.  
    1464. +
    1465. /**
    1466. +
    1467. * Sends the command RCPT to the SMTP server with the TO: argument of $to.
    1468. +
    1469. * Returns true if the recipient was accepted false if it was rejected.
    1470. +
    1471. *
    1472. +
    1473. * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
    1474. +
    1475. *
    1476. +
    1477. * SMTP CODE SUCCESS: 250,251
    1478. +
    1479. * SMTP CODE FAILURE: 550,551,552,553,450,451,452
    1480. +
    1481. * SMTP CODE ERROR : 500,501,503,421
    1482. +
    1483. * @access public
    1484. +
    1485. * @return bool
    1486. +
    1487. */
    1488. +
    1489. function Recipient($to) {
    1490. +
    1491. $this->error = null; # so no confusion is caused
    1492. +
    1493.  
    1494. +
    1495. if(!$this->connected()) {
    1496. +
    1497. $this->error = array(
    1498. +
    1499. "error" => "Called Recipient() without being connected");
    1500. +
    1501. return false;
    1502. +
    1503. }
    1504. +
    1505.  
    1506. +
    1507. fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF);
    1508. +
    1509.  
    1510. +
    1511. $rply = $this->get_lines();
    1512. +
    1513. $code = substr($rply,0,3);
    1514. +
    1515.  
    1516. +
    1517. if($this->do_debug >= 2) {
    1518. +
    1519. echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
    1520. +
    1521. }
    1522. +
    1523.  
    1524. +
    1525. if($code != 250 && $code != 251) {
    1526. +
    1527. $this->error =
    1528. +
    1529. array("error" => "RCPT not accepted from server",
    1530. +
    1531. "smtp_code" => $code,
    1532. +
    1533. "smtp_msg" => substr($rply,4));
    1534. +
    1535. if($this->do_debug >= 1) {
    1536. +
    1537. echo "SMTP -> ERROR: " . $this->error["error"] .
    1538. +
    1539. ": " . $rply . $this->CRLF;
    1540. +
    1541. }
    1542. +
    1543. return false;
    1544. +
    1545. }
    1546. +
    1547. return true;
    1548. +
    1549. }
    1550. +
    1551.  
    1552. +
    1553. /**
    1554. +
    1555. * Sends the RSET command to abort and transaction that is
    1556. +
    1557. * currently in progress. Returns true if successful false
    1558. +
    1559. * otherwise.
    1560. +
    1561. *
    1562. +
    1563. * Implements rfc 821: RSET <CRLF>
    1564. +
    1565. *
    1566. +
    1567. * SMTP CODE SUCCESS: 250
    1568. +
    1569. * SMTP CODE ERROR : 500,501,504,421
    1570. +
    1571. * @access public
    1572. +
    1573. * @return bool
    1574. +
    1575. */
    1576. +
    1577. function Reset() {
    1578. +
    1579. $this->error = null; # so no confusion is caused
    1580. +
    1581.  
    1582. +
    1583. if(!$this->connected()) {
    1584. +
    1585. $this->error = array(
    1586. +
    1587. "error" => "Called Reset() without being connected");
    1588. +
    1589. return false;
    1590. +
    1591. }
    1592. +
    1593.  
    1594. +
    1595. fputs($this->smtp_conn,"RSET" . $this->CRLF);
    1596. +
    1597.  
    1598. +
    1599. $rply = $this->get_lines();
    1600. +
    1601. $code = substr($rply,0,3);
    1602. +
    1603.  
    1604. +
    1605. if($this->do_debug >= 2) {
    1606. +
    1607. echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
    1608. +
    1609. }
    1610. +
    1611.  
    1612. +
    1613. if($code != 250) {
    1614. +
    1615. $this->error =
    1616. +
    1617. array("error" => "RSET failed",
    1618. +
    1619. "smtp_code" => $code,
    1620. +
    1621. "smtp_msg" => substr($rply,4));
    1622. +
    1623. if($this->do_debug >= 1) {
    1624. +
    1625. echo "SMTP -> ERROR: " . $this->error["error"] .
    1626. +
    1627. ": " . $rply . $this->CRLF;
    1628. +
    1629. }
    1630. +
    1631. return false;
    1632. +
    1633. }
    1634. +
    1635.  
    1636. +
    1637. return true;
    1638. +
    1639. }
    1640. +
    1641.  
    1642. +
    1643. /**
    1644. +
    1645. * Starts a mail transaction from the email address specified in
    1646. +
    1647. * $from. Returns true if successful or false otherwise. If True
    1648. +
    1649. * the mail transaction is started and then one or more Recipient
    1650. +
    1651. * commands may be called followed by a Data command. This command
    1652. +
    1653. * will send the message to the users terminal if they are logged
    1654. +
    1655. * in.
    1656. +
    1657. *
    1658. +
    1659. * Implements rfc 821: SEND <SP> FROM:<reverse-path> <CRLF>
    1660. +
    1661. *
    1662. +
    1663. * SMTP CODE SUCCESS: 250
    1664. +
    1665. * SMTP CODE SUCCESS: 552,451,452
    1666. +
    1667. * SMTP CODE SUCCESS: 500,501,502,421
    1668. +
    1669. * @access public
    1670. +
    1671. * @return bool
    1672. +
    1673. */
    1674. +
    1675. function Send($from) {
    1676. +
    1677. $this->error = null; # so no confusion is caused
    1678. +
    1679.  
    1680. +
    1681. if(!$this->connected()) {
    1682. +
    1683. $this->error = array(
    1684. +
    1685. "error" => "Called Send() without being connected");
    1686. +
    1687. return false;
    1688. +
    1689. }
    1690. +
    1691.  
    1692. +
    1693. fputs($this->smtp_conn,"SEND FROM:" . $from . $this->CRLF);
    1694. +
    1695.  
    1696. +
    1697. $rply = $this->get_lines();
    1698. +
    1699. $code = substr($rply,0,3);
    1700. +
    1701.  
    1702. +
    1703. if($this->do_debug >= 2) {
    1704. +
    1705. echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
    1706. +
    1707. }
    1708. +
    1709.  
    1710. +
    1711. if($code != 250) {
    1712. +
    1713. $this->error =
    1714. +
    1715. array("error" => "SEND not accepted from server",
    1716. +
    1717. "smtp_code" => $code,
    1718. +
    1719. "smtp_msg" => substr($rply,4));
    1720. +
    1721. if($this->do_debug >= 1) {
    1722. +
    1723. echo "SMTP -> ERROR: " . $this->error["error"] .
    1724. +
    1725. ": " . $rply . $this->CRLF;
    1726. +
    1727. }
    1728. +
    1729. return false;
    1730. +
    1731. }
    1732. +
    1733. return true;
    1734. +
    1735. }
    1736. +
    1737.  
    1738. +
    1739. /**
    1740. +
    1741. * Starts a mail transaction from the email address specified in
    1742. +
    1743. * $from. Returns true if successful or false otherwise. If True
    1744. +
    1745. * the mail transaction is started and then one or more Recipient
    1746. +
    1747. * commands may be called followed by a Data command. This command
    1748. +
    1749. * will send the message to the users terminal if they are logged
    1750. +
    1751. * in and send them an email.
    1752. +
    1753. *
    1754. +
    1755. * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
    1756. +
    1757. *
    1758. +
    1759. * SMTP CODE SUCCESS: 250
    1760. +
    1761. * SMTP CODE SUCCESS: 552,451,452
    1762. +
    1763. * SMTP CODE SUCCESS: 500,501,502,421
    1764. +
    1765. * @access public
    1766. +
    1767. * @return bool
    1768. +
    1769. */
    1770. +
    1771. function SendAndMail($from) {
    1772. +
    1773. $this->error = null; # so no confusion is caused
    1774. +
    1775.  
    1776. +
    1777. if(!$this->connected()) {
    1778. +
    1779. $this->error = array(
    1780. +
    1781. "error" => "Called SendAndMail() without being connected");
    1782. +
    1783. return false;
    1784. +
    1785. }
    1786. +
    1787.  
    1788. +
    1789. fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF);
    1790. +
    1791.  
    1792. +
    1793. $rply = $this->get_lines();
    1794. +
    1795. $code = substr($rply,0,3);
    1796. +
    1797.  
    1798. +
    1799. if($this->do_debug >= 2) {
    1800. +
    1801. echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
    1802. +
    1803. }
    1804. +
    1805.  
    1806. +
    1807. if($code != 250) {
    1808. +
    1809. $this->error =
    1810. +
    1811. array("error" => "SAML not accepted from server",
    1812. +
    1813. "smtp_code" => $code,
    1814. +
    1815. "smtp_msg" => substr($rply,4));
    1816. +
    1817. if($this->do_debug >= 1) {
    1818. +
    1819. echo "SMTP -> ERROR: " . $this->error["error"] .
    1820. +
    1821. ": " . $rply . $this->CRLF;
    1822. +
    1823. }
    1824. +
    1825. return false;
    1826. +
    1827. }
    1828. +
    1829. return true;
    1830. +
    1831. }
    1832. +
    1833.  
    1834. +
    1835. /**
    1836. +
    1837. * Starts a mail transaction from the email address specified in
    1838. +
    1839. * $from. Returns true if successful or false otherwise. If True
    1840. +
    1841. * the mail transaction is started and then one or more Recipient
    1842. +
    1843. * commands may be called followed by a Data command. This command
    1844. +
    1845. * will send the message to the users terminal if they are logged
    1846. +
    1847. * in or mail it to them if they are not.
    1848. +
    1849. *
    1850. +
    1851. * Implements rfc 821: SOML <SP> FROM:<reverse-path> <CRLF>
    1852. +
    1853. *
    1854. +
    1855. * SMTP CODE SUCCESS: 250
    1856. +
    1857. * SMTP CODE SUCCESS: 552,451,452
    1858. +
    1859. * SMTP CODE SUCCESS: 500,501,502,421
    1860. +
    1861. * @access public
    1862. +
    1863. * @return bool
    1864. +
    1865. */
    1866. +
    1867. function SendOrMail($from) {
    1868. +
    1869. $this->error = null; # so no confusion is caused
    1870. +
    1871.  
    1872. +
    1873. if(!$this->connected()) {
    1874. +
    1875. $this->error = array(
    1876. +
    1877. "error" => "Called SendOrMail() without being connected");
    1878. +
    1879. return false;
    1880. +
    1881. }
    1882. +
    1883.  
    1884. +
    1885. fputs($this->smtp_conn,"SOML FROM:" . $from . $this->CRLF);
    1886. +
    1887.  
    1888. +
    1889. $rply = $this->get_lines();
    1890. +
    1891. $code = substr($rply,0,3);
    1892. +
    1893.  
    1894. +
    1895. if($this->do_debug >= 2) {
    1896. +
    1897. echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
    1898. +
    1899. }
    1900. +
    1901.  
    1902. +
    1903. if($code != 250) {
    1904. +
    1905. $this->error =
    1906. +
    1907. array("error" => "SOML not accepted from server",
    1908. +
    1909. "smtp_code" => $code,
    1910. +
    1911. "smtp_msg" => substr($rply,4));
    1912. +
    1913. if($this->do_debug >= 1) {
    1914. +
    1915. echo "SMTP -> ERROR: " . $this->error["error"] .
    1916. +
    1917. ": " . $rply . $this->CRLF;
    1918. +
    1919. }
    1920. +
    1921. return false;
    1922. +
    1923. }
    1924. +
    1925. return true;
    1926. +
    1927. }
    1928. +
    1929.  
    1930. +
    1931. /**
    1932. +
    1933. * This is an optional command for SMTP that this class does not
    1934. +
    1935. * support. This method is here to make the RFC821 Definition
    1936. +
    1937. * complete for this class and __may__ be implimented in the future
    1938. +
    1939. *
    1940. +
    1941. * Implements from rfc 821: TURN <CRLF>
    1942. +
    1943. *
    1944. +
    1945. * SMTP CODE SUCCESS: 250
    1946. +
    1947. * SMTP CODE FAILURE: 502
    1948. +
    1949. * SMTP CODE ERROR : 500, 503
    1950. +
    1951. * @access public
    1952. +
    1953. * @return bool
    1954. +
    1955. */
    1956. +
    1957. function Turn() {
    1958. +
    1959. $this->error = array("error" => "This method, TURN, of the SMTP ".
    1960. +
    1961. "is not implemented");
    1962. +
    1963. if($this->do_debug >= 1) {
    1964. +
    1965. echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF;
    1966. +
    1967. }
    1968. +
    1969. return false;
    1970. +
    1971. }
    1972. +
    1973.  
    1974. +
    1975. /**
    1976. +
    1977. * Verifies that the name is recognized by the server.
    1978. +
    1979. * Returns false if the name could not be verified otherwise
    1980. +
    1981. * the response from the server is returned.
    1982. +
    1983. *
    1984. +
    1985. * Implements rfc 821: VRFY <SP> <string> <CRLF>
    1986. +
    1987. *
    1988. +
    1989. * SMTP CODE SUCCESS: 250,251
    1990. +
    1991. * SMTP CODE FAILURE: 550,551,553
    1992. +
    1993. * SMTP CODE ERROR : 500,501,502,421
    1994. +
    1995. * @access public
    1996. +
    1997. * @return int
    1998. +
    1999. */
    2000. +
    2001. function Verify($name) {
    2002. +
    2003. $this->error = null; # so no confusion is caused
    2004. +
    2005.  
    2006. +
    2007. if(!$this->connected()) {
    2008. +
    2009. $this->error = array(
    2010. +
    2011. "error" => "Called Verify() without being connected");
    2012. +
    2013. return false;
    2014. +
    2015. }
    2016. +
    2017.  
    2018. +
    2019. fputs($this->smtp_conn,"VRFY " . $name . $this->CRLF);
    2020. +
    2021.  
    2022. +
    2023. $rply = $this->get_lines();
    2024. +
    2025. $code = substr($rply,0,3);
    2026. +
    2027.  
    2028. +
    2029. if($this->do_debug >= 2) {
    2030. +
    2031. echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;
    2032. +
    2033. }
    2034. +
    2035.  
    2036. +
    2037. if($code != 250 && $code != 251) {
    2038. +
    2039. $this->error =
    2040. +
    2041. array("error" => "VRFY failed on name '$name'",
    2042. +
    2043. "smtp_code" => $code,
    2044. +
    2045. "smtp_msg" => substr($rply,4));
    2046. +
    2047. if($this->do_debug >= 1) {
    2048. +
    2049. echo "SMTP -> ERROR: " . $this->error["error"] .
    2050. +
    2051. ": " . $rply . $this->CRLF;
    2052. +
    2053. }
    2054. +
    2055. return false;
    2056. +
    2057. }
    2058. +
    2059. return $rply;
    2060. +
    2061. }
    2062. +
    2063.  
    2064. +
    2065. /*****************************************************************
    2066. +
    2067. * INTERNAL FUNCTIONS *
    2068. +
    2069. ******************************************************************/
    2070. +
    2071.  
    2072. +
    2073.  
    2074. +
    2075. /**
    2076. +
    2077. * Read in as many lines as possible
    2078. +
    2079. * either before eof or socket timeout occurs on the operation.
    2080. +
    2081. * With SMTP we can tell if we have more lines to read if the
    2082. +
    2083. * 4th character is '-' symbol. If it is a space then we don't
    2084. +
    2085. * need to read anything else.
    2086. +
    2087. * @access private
    2088. +
    2089. * @return string
    2090. +
    2091. */
    2092. +
    2093. function get_lines() {
    2094. +
    2095. $data = "";
    2096. +
    2097. while($str = @fgets($this->smtp_conn,515)) {
    2098. +
    2099. if($this->do_debug >= 4) {
    2100. +
    2101. echo "SMTP -> get_lines(): \$data was \"$data\"" .
    2102. +
    2103. $this->CRLF;
    2104. +
    2105. echo "SMTP -> get_lines(): \$str is \"$str\"" .
    2106. +
    2107. $this->CRLF;
    2108. +
    2109. }
    2110. +
    2111. $data .= $str;
    2112. +
    2113. if($this->do_debug >= 4) {
    2114. +
    2115. echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF;
    2116. +
    2117. }
    2118. +
    2119. # if the 4th character is a space then we are done reading
    2120. +
    2121. # so just break the loop
    2122. +
    2123. if(substr($str,3,1) == " ") { break; }
    2124. +
    2125. }
    2126. +
    2127. return $data;
    2128. +
    2129. }
    2130. +
    2131.  
    2132. +
    2133. }
    2134. +
    2135.  
    2136. +
    2137.  
    2138. +
    2139. ?>
    2140. +
    +
    +

    + Documentation generated on Thu, 02 Apr 2009 21:19:51 -0400 by phpDocumentor 1.3.0RC3 +

    + + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/blank.html b/plugin/PHPMailer_v2.0.4/phpdocs/blank.html new file mode 100644 index 000000000..04842f8d4 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/blank.html @@ -0,0 +1,13 @@ + + + PHPMailer version 2.0.4 + + + + +

    PHPMailer version 2.0.4

    +Welcome to PHPMailer!
    +
    +This documentation was generated by phpDocumentor v1.3.0RC3
    + + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/classtrees_PHPMailer.html b/plugin/PHPMailer_v2.0.4/phpdocs/classtrees_PHPMailer.html new file mode 100644 index 000000000..46ff94bc7 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/classtrees_PHPMailer.html @@ -0,0 +1,32 @@ + + + + + + + + + + + + +

    + +

    +

    Root class PHPMailer

    + + +

    Root class POP3

    + + +

    Root class SMTP

    + + +

    + Documentation generated on Thu, 02 Apr 2009 21:19:46 -0400 by phpDocumentor 1.3.0RC3 +

    + + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/elementindex.html b/plugin/PHPMailer_v2.0.4/phpdocs/elementindex.html new file mode 100644 index 000000000..b1526d2dc --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/elementindex.html @@ -0,0 +1,1049 @@ + + + + + + + + + + + +

    Full index

    +

    Package indexes

    + +
    +
    + a + b + c + d + e + f + g + h + i + l + m + n + p + q + r + s + t + u + v + w +
    + + +
    +
    a
    + +
    +
    +
    +
    + $AltBody +
    +
    +
    PHPMailer::$AltBody in class.phpmailer.php
    +
    Sets the text-only body of the message. This automatically sets the email to multipart/alternative. This body can be read by mail clients that do not have HTML email capability such as mutt. Clients that can read HTML will view the normal Body.
    +
    +
    + $attachment +
    +
    +
    PHPMailer::$attachment in class.phpmailer.php
    +
    +
    + AddAddress +
    +
    +
    PHPMailer::AddAddress() in class.phpmailer.php
    +
    Adds a "To" address.
    +
    +
    + AddAttachment +
    +
    +
    PHPMailer::AddAttachment() in class.phpmailer.php
    +
    Adds an attachment from a path on the filesystem.
    +
    +
    + AddBCC +
    +
    +
    PHPMailer::AddBCC() in class.phpmailer.php
    +
    Adds a "Bcc" address. Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
    +
    +
    + AddCC +
    +
    +
    PHPMailer::AddCC() in class.phpmailer.php
    +
    Adds a "Cc" address. Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
    +
    +
    + AddCustomHeader +
    +
    +
    PHPMailer::AddCustomHeader() in class.phpmailer.php
    +
    Adds a custom header.
    +
    +
    + AddEmbeddedImage +
    +
    +
    PHPMailer::AddEmbeddedImage() in class.phpmailer.php
    +
    Adds an embedded attachment. This can include images, sounds, and just about any other document. Make sure to set the $type to an image type. For JPEG images use "image/jpeg" and for GIF images use "image/gif".
    +
    +
    + AddReplyTo +
    +
    +
    PHPMailer::AddReplyTo() in class.phpmailer.php
    +
    Adds a "Reply-To" address.
    +
    +
    + AddStringAttachment +
    +
    +
    PHPMailer::AddStringAttachment() in class.phpmailer.php
    +
    Adds a string or binary attachment (non-filesystem) to the list.
    +
    +
    + Authenticate +
    +
    +
    SMTP::Authenticate() in class.smtp.php
    +
    Performs SMTP authentication. Must be run after running the Hello() method. Returns true if successfully authenticated.
    +
    +
    + Authorise +
    +
    +
    POP3::Authorise() in class.pop3.php
    +
    Combination of public events - connect, login, disconnect
    +
    +
    + +
    +
    b
    + +
    +
    +
    +
    + $bcc +
    +
    +
    PHPMailer::$bcc in class.phpmailer.php
    +
    +
    + $Body +
    +
    +
    PHPMailer::$Body in class.phpmailer.php
    +
    Sets the Body of the message. This can be either an HTML or text body.
    +
    +
    + $boundary +
    +
    +
    PHPMailer::$boundary in class.phpmailer.php
    +
    +
    + +
    +
    c
    + +
    +
    +
    +
    + $cc +
    +
    +
    PHPMailer::$cc in class.phpmailer.php
    +
    +
    + $CharSet +
    +
    +
    PHPMailer::$CharSet in class.phpmailer.php
    +
    Sets the CharSet of the message.
    +
    +
    + $ConfirmReadingTo +
    +
    +
    PHPMailer::$ConfirmReadingTo in class.phpmailer.php
    +
    Sets the email address that a reading confirmation will be sent.
    +
    +
    + $ContentType +
    +
    +
    PHPMailer::$ContentType in class.phpmailer.php
    +
    Sets the Content-type of the message.
    +
    +
    + $CRLF +
    +
    +
    SMTP::$CRLF in class.smtp.php
    +
    SMTP reply line ending
    +
    +
    + $CRLF +
    +
    +
    POP3::$CRLF in class.pop3.php
    +
    POP3 Carriage Return + Line Feed
    +
    +
    + $CustomHeader +
    +
    +
    PHPMailer::$CustomHeader in class.phpmailer.php
    +
    +
    + catchWarning +
    +
    +
    POP3::catchWarning() in class.pop3.php
    +
    Takes over from PHP for the socket warning handler
    +
    +
    + checkResponse +
    +
    +
    POP3::checkResponse() in class.pop3.php
    +
    Checks the POP3 server response for +OK or -ERR
    +
    +
    + ClearAddresses +
    +
    +
    PHPMailer::ClearAddresses() in class.phpmailer.php
    +
    Clears all recipients assigned in the TO array. Returns void.
    +
    +
    + ClearAllRecipients +
    +
    +
    PHPMailer::ClearAllRecipients() in class.phpmailer.php
    +
    Clears all recipients assigned in the TO, CC and BCC array. Returns void.
    +
    +
    + ClearAttachments +
    +
    +
    PHPMailer::ClearAttachments() in class.phpmailer.php
    +
    Clears all previously set filesystem, string, and binary attachments. Returns void.
    +
    +
    + ClearBCCs +
    +
    +
    PHPMailer::ClearBCCs() in class.phpmailer.php
    +
    Clears all recipients assigned in the BCC array. Returns void.
    +
    +
    + ClearCCs +
    +
    +
    PHPMailer::ClearCCs() in class.phpmailer.php
    +
    Clears all recipients assigned in the CC array. Returns void.
    +
    +
    + ClearCustomHeaders +
    +
    +
    PHPMailer::ClearCustomHeaders() in class.phpmailer.php
    +
    Clears all custom headers. Returns void.
    +
    +
    + ClearReplyTos +
    +
    +
    PHPMailer::ClearReplyTos() in class.phpmailer.php
    +
    Clears all recipients assigned in the ReplyTo array. Returns void.
    +
    +
    + Close +
    +
    +
    SMTP::Close() in class.smtp.php
    +
    Closes the socket and cleans up the state of the class.
    +
    +
    + Connect +
    +
    +
    SMTP::Connect() in class.smtp.php
    +
    Connect to the server specified on the port specified.
    +
    +
    + Connect +
    +
    +
    POP3::Connect() in class.pop3.php
    +
    Connect to the POP3 server
    +
    +
    + class.phpmailer.php +
    +
    +
    class.phpmailer.php in class.phpmailer.php
    +
    +
    + class.pop3.php +
    +
    +
    class.pop3.php in class.pop3.php
    +
    +
    + class.smtp.php +
    +
    +
    class.smtp.php in class.smtp.php
    +
    +
    + +
    +
    d
    + +
    +
    +
    +
    + $do_debug +
    +
    +
    SMTP::$do_debug in class.smtp.php
    +
    Sets whether debugging is turned on
    +
    +
    + $do_debug +
    +
    +
    POP3::$do_debug in class.pop3.php
    +
    Displaying Debug warnings? (0 = now, 1+ = yes)
    +
    +
    + $do_verp +
    +
    +
    SMTP::$do_verp in class.smtp.php
    +
    Sets VERP use on/off (default is off)
    +
    +
    + Data +
    +
    +
    SMTP::Data() in class.smtp.php
    +
    Issues a data command and sends the msg_data to the server
    +
    +
    + Disconnect +
    +
    +
    POP3::Disconnect() in class.pop3.php
    +
    Disconnect from the POP3 server
    +
    +
    + displayErrors +
    +
    +
    POP3::displayErrors() in class.pop3.php
    +
    If debug is enabled, display the error message array
    +
    +
    + +
    +
    e
    + +
    +
    +
    +
    + $Encoding +
    +
    +
    PHPMailer::$Encoding in class.phpmailer.php
    +
    Sets the Encoding of the message. Options for this are "8bit", "7bit", "binary", "base64", and "quoted-printable".
    +
    +
    + $ErrorInfo +
    +
    +
    PHPMailer::$ErrorInfo in class.phpmailer.php
    +
    Holds the most recent mailer error message.
    +
    +
    + $error_count +
    +
    +
    PHPMailer::$error_count in class.phpmailer.php
    +
    +
    + Expand +
    +
    +
    SMTP::Expand() in class.smtp.php
    +
    Expand takes the name and asks the server to list all the people who are members of the _list_. Expand will return back and array of the result or false if an error occurs.
    +
    +
    + +
    +
    f
    + +
    +
    +
    +
    + $From +
    +
    +
    PHPMailer::$From in class.phpmailer.php
    +
    Sets the From email address for the message.
    +
    +
    + $FromName +
    +
    +
    PHPMailer::$FromName in class.phpmailer.php
    +
    Sets the From name of the message.
    +
    +
    + +
    +
    g
    + +
    +
    +
    +
    + getFile +
    +
    +
    PHPMailer::getFile() in class.phpmailer.php
    +
    Read a file from a supplied filename and return it.
    +
    +
    + getResponse +
    +
    +
    POP3::getResponse() in class.pop3.php
    +
    Get the socket response back.
    +
    +
    + +
    +
    h
    + +
    +
    +
    +
    + $Helo +
    +
    +
    PHPMailer::$Helo in class.phpmailer.php
    +
    Sets the SMTP HELO of the message (Default is $Hostname).
    +
    +
    + $Host +
    +
    +
    PHPMailer::$Host in class.phpmailer.php
    +
    Sets the SMTP hosts. All hosts must be separated by a semicolon. You can also specify a different port for each host by using this format: [hostname:port] (e.g. "smtp1.example.com:25;smtp2.example.com").
    +
    +
    + $host +
    +
    +
    POP3::$host in class.pop3.php
    +
    POP3 Mail Server
    +
    +
    + $Hostname +
    +
    +
    PHPMailer::$Hostname in class.phpmailer.php
    +
    Sets the hostname to use in Message-Id and Received headers and as default HELO string. If empty, the value returned by SERVER_NAME is used or 'localhost.localdomain'.
    +
    +
    + HeaderLine +
    +
    +
    PHPMailer::HeaderLine() in class.phpmailer.php
    +
    +
    + Hello +
    +
    +
    SMTP::Hello() in class.smtp.php
    +
    Sends the HELO command to the smtp server.
    +
    +
    + Help +
    +
    +
    SMTP::Help() in class.smtp.php
    +
    Gets help information on the keyword specified. If the keyword
    +
    +
    + +
    +
    i
    + +
    +
    +
    +
    + IsError +
    +
    +
    PHPMailer::IsError() in class.phpmailer.php
    +
    Returns true if an error occurred.
    +
    +
    + IsHTML +
    +
    +
    PHPMailer::IsHTML() in class.phpmailer.php
    +
    Sets message type to HTML.
    +
    +
    + IsMail +
    +
    +
    PHPMailer::IsMail() in class.phpmailer.php
    +
    Sets Mailer to send message using PHP mail() function.
    +
    +
    + IsQmail +
    +
    +
    PHPMailer::IsQmail() in class.phpmailer.php
    +
    Sets Mailer to send message using the qmail MTA.
    +
    +
    + IsSendmail +
    +
    +
    PHPMailer::IsSendmail() in class.phpmailer.php
    +
    Sets Mailer to send message using the $Sendmail program.
    +
    +
    + IsSMTP +
    +
    +
    PHPMailer::IsSMTP() in class.phpmailer.php
    +
    Sets Mailer to send message using SMTP.
    +
    +
    + +
    +
    l
    + +
    +
    +
    +
    + $language +
    +
    +
    PHPMailer::$language in class.phpmailer.php
    +
    +
    + $LE +
    +
    +
    PHPMailer::$LE in class.phpmailer.php
    +
    +
    + Login +
    +
    +
    POP3::Login() in class.pop3.php
    +
    Login to the POP3 server (does not support APOP yet)
    +
    +
    + +
    +
    m
    + +
    +
    +
    +
    + $Mailer +
    +
    +
    PHPMailer::$Mailer in class.phpmailer.php
    +
    Method to send mail: ("mail", "sendmail", or "smtp").
    +
    +
    + $MessageID +
    +
    +
    PHPMailer::$MessageID in class.phpmailer.php
    +
    Sets the message ID to be used in the Message-Id header.
    +
    +
    + $message_type +
    +
    +
    PHPMailer::$message_type in class.phpmailer.php
    +
    +
    + Mail +
    +
    +
    SMTP::Mail() in class.smtp.php
    +
    Starts a mail transaction from the email address specified in $from. Returns true if successful or false otherwise. If True the mail transaction is started and then one or more Recipient commands may be called followed by a Data command.
    +
    +
    + MsgHTML +
    +
    +
    PHPMailer::MsgHTML() in class.phpmailer.php
    +
    Evaluates the message and returns modifications for inline images and backgrounds
    +
    +
    + +
    +
    n
    + +
    +
    +
    +
    + Noop +
    +
    +
    SMTP::Noop() in class.smtp.php
    +
    Sends the command NOOP to the SMTP server.
    +
    +
    + +
    +
    p
    + +
    +
    +
    +
    + $Password +
    +
    +
    PHPMailer::$Password in class.phpmailer.php
    +
    Sets SMTP password.
    +
    +
    + $password +
    +
    +
    POP3::$password in class.pop3.php
    +
    POP3 Password
    +
    +
    + $PluginDir +
    +
    +
    PHPMailer::$PluginDir in class.phpmailer.php
    +
    Path to PHPMailer plugins. This is now only useful if the SMTP class is in a different directory than the PHP include path.
    +
    +
    + $POP3_PORT +
    +
    +
    POP3::$POP3_PORT in class.pop3.php
    +
    Default POP3 port
    +
    +
    + $POP3_TIMEOUT +
    +
    +
    POP3::$POP3_TIMEOUT in class.pop3.php
    +
    Default Timeout
    +
    +
    + $Port +
    +
    +
    PHPMailer::$Port in class.phpmailer.php
    +
    Sets the default SMTP server port.
    +
    +
    + $port +
    +
    +
    POP3::$port in class.pop3.php
    +
    POP3 Port
    +
    +
    + $Priority +
    +
    +
    PHPMailer::$Priority in class.phpmailer.php
    +
    Email priority (1 = High, 3 = Normal, 5 = low).
    +
    +
    + PHPMailer +
    +
    +
    PHPMailer in class.phpmailer.php
    +
    +
    + POP3 +
    +
    +
    POP3::POP3() in class.pop3.php
    +
    Constructor, sets the initial values
    +
    +
    + POP3 +
    +
    +
    POP3 in class.pop3.php
    +
    +
    + +
    +
    q
    + +
    +
    +
    +
    + Quit +
    +
    +
    SMTP::Quit() in class.smtp.php
    +
    Sends the quit command to the server and then closes the socket if there is no error or the $close_on_error argument is true.
    +
    +
    + +
    +
    r
    + +
    +
    +
    +
    + $ReplyTo +
    +
    +
    PHPMailer::$ReplyTo in class.phpmailer.php
    +
    +
    + Recipient +
    +
    +
    SMTP::Recipient() in class.smtp.php
    +
    Sends the command RCPT to the SMTP server with the TO: argument of $to.
    +
    +
    + Reset +
    +
    +
    SMTP::Reset() in class.smtp.php
    +
    Sends the RSET command to abort and transaction that is currently in progress. Returns true if successful false otherwise.
    +
    +
    + +
    +
    s
    + +
    +
    +
    +
    + $Sender +
    +
    +
    PHPMailer::$Sender in class.phpmailer.php
    +
    Sets the Sender email (Return-Path) of the message. If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
    +
    +
    + $Sendmail +
    +
    +
    PHPMailer::$Sendmail in class.phpmailer.php
    +
    Sets the path of the sendmail program.
    +
    +
    + $sign_cert_file +
    +
    +
    PHPMailer::$sign_cert_file in class.phpmailer.php
    +
    +
    + $sign_key_file +
    +
    +
    PHPMailer::$sign_key_file in class.phpmailer.php
    +
    +
    + $sign_key_pass +
    +
    +
    PHPMailer::$sign_key_pass in class.phpmailer.php
    +
    +
    + $SingleTo +
    +
    +
    PHPMailer::$SingleTo in class.phpmailer.php
    +
    Provides the ability to have the TO field process individual
    +
    +
    + $smtp +
    +
    +
    PHPMailer::$smtp in class.phpmailer.php
    +
    +
    + $SMTPAuth +
    +
    +
    PHPMailer::$SMTPAuth in class.phpmailer.php
    +
    Sets SMTP authentication. Utilizes the Username and Password variables.
    +
    +
    + $SMTPDebug +
    +
    +
    PHPMailer::$SMTPDebug in class.phpmailer.php
    +
    Sets SMTP class debugging on or off.
    +
    +
    + $SMTPKeepAlive +
    +
    +
    PHPMailer::$SMTPKeepAlive in class.phpmailer.php
    +
    Prevents the SMTP connection from being closed after each mail sending. If this is set to true then to close the connection requires an explicit call to SmtpClose().
    +
    +
    + $SMTPSecure +
    +
    +
    PHPMailer::$SMTPSecure in class.phpmailer.php
    +
    Sets connection prefix.
    +
    +
    + $SMTP_PORT +
    +
    +
    SMTP::$SMTP_PORT in class.smtp.php
    +
    SMTP server port
    +
    +
    + $Subject +
    +
    +
    PHPMailer::$Subject in class.phpmailer.php
    +
    Sets the Subject of the message.
    +
    +
    + Send +
    +
    +
    SMTP::Send() in class.smtp.php
    +
    Starts a mail transaction from the email address specified in
    +
    +
    + Send +
    +
    +
    PHPMailer::Send() in class.phpmailer.php
    +
    Creates message and assigns Mailer. If the message is not sent successfully then it returns false. Use the ErrorInfo variable to view description of the error.
    +
    +
    + SendAndMail +
    +
    +
    SMTP::SendAndMail() in class.smtp.php
    +
    Starts a mail transaction from the email address specified in
    +
    +
    + SendOrMail +
    +
    +
    SMTP::SendOrMail() in class.smtp.php
    +
    Starts a mail transaction from the email address specified in
    +
    +
    + sendString +
    +
    +
    POP3::sendString() in class.pop3.php
    +
    Send a string down the open socket connection to the POP3 server
    +
    +
    + set +
    +
    +
    PHPMailer::set() in class.phpmailer.php
    +
    Set (or reset) Class Objects (variables)
    +
    +
    + SetLanguage +
    +
    +
    PHPMailer::SetLanguage() in class.phpmailer.php
    +
    Sets the language for all class error messages. Returns false if it cannot load the language file. The default language type is English.
    +
    +
    + Sign +
    +
    +
    PHPMailer::Sign() in class.phpmailer.php
    +
    Set the private key file and password to sign the message.
    +
    +
    + SMTP +
    +
    +
    SMTP in class.smtp.php
    +
    +
    + SMTP +
    +
    +
    SMTP::SMTP() in class.smtp.php
    +
    Initialize the class so that the data is in a known state.
    +
    +
    + SmtpClose +
    +
    +
    PHPMailer::SmtpClose() in class.phpmailer.php
    +
    Closes the active SMTP session if one exists.
    +
    +
    + +
    +
    t
    + +
    +
    +
    +
    + $Timeout +
    +
    +
    PHPMailer::$Timeout in class.phpmailer.php
    +
    Sets the SMTP server timeout in seconds. This function will not work with the win32 version.
    +
    +
    + $to +
    +
    +
    PHPMailer::$to in class.phpmailer.php
    +
    +
    + $tval +
    +
    +
    POP3::$tval in class.pop3.php
    +
    POP3 Timeout Value
    +
    +
    + Turn +
    +
    +
    SMTP::Turn() in class.smtp.php
    +
    This is an optional command for SMTP that this class does not support. This method is here to make the RFC821 Definition complete for this class and __may__ be implimented in the future
    +
    +
    + +
    +
    u
    + +
    +
    +
    +
    + $username +
    +
    +
    POP3::$username in class.pop3.php
    +
    POP3 Username
    +
    +
    + $Username +
    +
    +
    PHPMailer::$Username in class.phpmailer.php
    +
    Sets SMTP username.
    +
    +
    + +
    +
    v
    + +
    +
    +
    +
    + $Version +
    +
    +
    PHPMailer::$Version in class.phpmailer.php
    +
    Holds PHPMailer version.
    +
    +
    + Verify +
    +
    +
    SMTP::Verify() in class.smtp.php
    +
    Verifies that the name is recognized by the server.
    +
    +
    + +
    +
    w
    + +
    +
    +
    +
    + $WordWrap +
    +
    +
    PHPMailer::$WordWrap in class.phpmailer.php
    +
    Sets word wrapping on the body of the message to a given number of characters.
    +
    +
    + +
    + a + b + c + d + e + f + g + h + i + l + m + n + p + q + r + s + t + u + v + w +
    + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/elementindex_PHPMailer.html b/plugin/PHPMailer_v2.0.4/phpdocs/elementindex_PHPMailer.html new file mode 100644 index 000000000..7694cdec6 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/elementindex_PHPMailer.html @@ -0,0 +1,1046 @@ + + + + + + + + + + + +

    [PHPMailer] element index

    +All elements +
    +
    + a + b + c + d + e + f + g + h + i + l + m + n + p + q + r + s + t + u + v + w +
    + + +
    +
    a
    + +
    +
    +
    +
    + $AltBody +
    +
    +
    PHPMailer::$AltBody in class.phpmailer.php
    +
    Sets the text-only body of the message. This automatically sets the email to multipart/alternative. This body can be read by mail clients that do not have HTML email capability such as mutt. Clients that can read HTML will view the normal Body.
    +
    +
    + $attachment +
    +
    +
    PHPMailer::$attachment in class.phpmailer.php
    +
    +
    + AddAddress +
    +
    +
    PHPMailer::AddAddress() in class.phpmailer.php
    +
    Adds a "To" address.
    +
    +
    + AddAttachment +
    +
    +
    PHPMailer::AddAttachment() in class.phpmailer.php
    +
    Adds an attachment from a path on the filesystem.
    +
    +
    + AddBCC +
    +
    +
    PHPMailer::AddBCC() in class.phpmailer.php
    +
    Adds a "Bcc" address. Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
    +
    +
    + AddCC +
    +
    +
    PHPMailer::AddCC() in class.phpmailer.php
    +
    Adds a "Cc" address. Note: this function works with the SMTP mailer on win32, not with the "mail" mailer.
    +
    +
    + AddCustomHeader +
    +
    +
    PHPMailer::AddCustomHeader() in class.phpmailer.php
    +
    Adds a custom header.
    +
    +
    + AddEmbeddedImage +
    +
    +
    PHPMailer::AddEmbeddedImage() in class.phpmailer.php
    +
    Adds an embedded attachment. This can include images, sounds, and just about any other document. Make sure to set the $type to an image type. For JPEG images use "image/jpeg" and for GIF images use "image/gif".
    +
    +
    + AddReplyTo +
    +
    +
    PHPMailer::AddReplyTo() in class.phpmailer.php
    +
    Adds a "Reply-To" address.
    +
    +
    + AddStringAttachment +
    +
    +
    PHPMailer::AddStringAttachment() in class.phpmailer.php
    +
    Adds a string or binary attachment (non-filesystem) to the list.
    +
    +
    + Authenticate +
    +
    +
    SMTP::Authenticate() in class.smtp.php
    +
    Performs SMTP authentication. Must be run after running the Hello() method. Returns true if successfully authenticated.
    +
    +
    + Authorise +
    +
    +
    POP3::Authorise() in class.pop3.php
    +
    Combination of public events - connect, login, disconnect
    +
    +
    + +
    +
    b
    + +
    +
    +
    +
    + $bcc +
    +
    +
    PHPMailer::$bcc in class.phpmailer.php
    +
    +
    + $Body +
    +
    +
    PHPMailer::$Body in class.phpmailer.php
    +
    Sets the Body of the message. This can be either an HTML or text body.
    +
    +
    + $boundary +
    +
    +
    PHPMailer::$boundary in class.phpmailer.php
    +
    +
    + +
    +
    c
    + +
    +
    +
    +
    + $cc +
    +
    +
    PHPMailer::$cc in class.phpmailer.php
    +
    +
    + $CharSet +
    +
    +
    PHPMailer::$CharSet in class.phpmailer.php
    +
    Sets the CharSet of the message.
    +
    +
    + $ConfirmReadingTo +
    +
    +
    PHPMailer::$ConfirmReadingTo in class.phpmailer.php
    +
    Sets the email address that a reading confirmation will be sent.
    +
    +
    + $ContentType +
    +
    +
    PHPMailer::$ContentType in class.phpmailer.php
    +
    Sets the Content-type of the message.
    +
    +
    + $CRLF +
    +
    +
    SMTP::$CRLF in class.smtp.php
    +
    SMTP reply line ending
    +
    +
    + $CRLF +
    +
    +
    POP3::$CRLF in class.pop3.php
    +
    POP3 Carriage Return + Line Feed
    +
    +
    + $CustomHeader +
    +
    +
    PHPMailer::$CustomHeader in class.phpmailer.php
    +
    +
    + catchWarning +
    +
    +
    POP3::catchWarning() in class.pop3.php
    +
    Takes over from PHP for the socket warning handler
    +
    +
    + checkResponse +
    +
    +
    POP3::checkResponse() in class.pop3.php
    +
    Checks the POP3 server response for +OK or -ERR
    +
    +
    + ClearAddresses +
    +
    +
    PHPMailer::ClearAddresses() in class.phpmailer.php
    +
    Clears all recipients assigned in the TO array. Returns void.
    +
    +
    + ClearAllRecipients +
    +
    +
    PHPMailer::ClearAllRecipients() in class.phpmailer.php
    +
    Clears all recipients assigned in the TO, CC and BCC array. Returns void.
    +
    +
    + ClearAttachments +
    +
    +
    PHPMailer::ClearAttachments() in class.phpmailer.php
    +
    Clears all previously set filesystem, string, and binary attachments. Returns void.
    +
    +
    + ClearBCCs +
    +
    +
    PHPMailer::ClearBCCs() in class.phpmailer.php
    +
    Clears all recipients assigned in the BCC array. Returns void.
    +
    +
    + ClearCCs +
    +
    +
    PHPMailer::ClearCCs() in class.phpmailer.php
    +
    Clears all recipients assigned in the CC array. Returns void.
    +
    +
    + ClearCustomHeaders +
    +
    +
    PHPMailer::ClearCustomHeaders() in class.phpmailer.php
    +
    Clears all custom headers. Returns void.
    +
    +
    + ClearReplyTos +
    +
    +
    PHPMailer::ClearReplyTos() in class.phpmailer.php
    +
    Clears all recipients assigned in the ReplyTo array. Returns void.
    +
    +
    + Close +
    +
    +
    SMTP::Close() in class.smtp.php
    +
    Closes the socket and cleans up the state of the class.
    +
    +
    + Connect +
    +
    +
    SMTP::Connect() in class.smtp.php
    +
    Connect to the server specified on the port specified.
    +
    +
    + Connect +
    +
    +
    POP3::Connect() in class.pop3.php
    +
    Connect to the POP3 server
    +
    +
    + class.phpmailer.php +
    +
    +
    class.phpmailer.php in class.phpmailer.php
    +
    +
    + class.pop3.php +
    +
    +
    class.pop3.php in class.pop3.php
    +
    +
    + class.smtp.php +
    +
    +
    class.smtp.php in class.smtp.php
    +
    +
    + +
    +
    d
    + +
    +
    +
    +
    + $do_debug +
    +
    +
    SMTP::$do_debug in class.smtp.php
    +
    Sets whether debugging is turned on
    +
    +
    + $do_debug +
    +
    +
    POP3::$do_debug in class.pop3.php
    +
    Displaying Debug warnings? (0 = now, 1+ = yes)
    +
    +
    + $do_verp +
    +
    +
    SMTP::$do_verp in class.smtp.php
    +
    Sets VERP use on/off (default is off)
    +
    +
    + Data +
    +
    +
    SMTP::Data() in class.smtp.php
    +
    Issues a data command and sends the msg_data to the server
    +
    +
    + Disconnect +
    +
    +
    POP3::Disconnect() in class.pop3.php
    +
    Disconnect from the POP3 server
    +
    +
    + displayErrors +
    +
    +
    POP3::displayErrors() in class.pop3.php
    +
    If debug is enabled, display the error message array
    +
    +
    + +
    +
    e
    + +
    +
    +
    +
    + $Encoding +
    +
    +
    PHPMailer::$Encoding in class.phpmailer.php
    +
    Sets the Encoding of the message. Options for this are "8bit", "7bit", "binary", "base64", and "quoted-printable".
    +
    +
    + $ErrorInfo +
    +
    +
    PHPMailer::$ErrorInfo in class.phpmailer.php
    +
    Holds the most recent mailer error message.
    +
    +
    + $error_count +
    +
    +
    PHPMailer::$error_count in class.phpmailer.php
    +
    +
    + Expand +
    +
    +
    SMTP::Expand() in class.smtp.php
    +
    Expand takes the name and asks the server to list all the people who are members of the _list_. Expand will return back and array of the result or false if an error occurs.
    +
    +
    + +
    +
    f
    + +
    +
    +
    +
    + $From +
    +
    +
    PHPMailer::$From in class.phpmailer.php
    +
    Sets the From email address for the message.
    +
    +
    + $FromName +
    +
    +
    PHPMailer::$FromName in class.phpmailer.php
    +
    Sets the From name of the message.
    +
    +
    + +
    +
    g
    + +
    +
    +
    +
    + getFile +
    +
    +
    PHPMailer::getFile() in class.phpmailer.php
    +
    Read a file from a supplied filename and return it.
    +
    +
    + getResponse +
    +
    +
    POP3::getResponse() in class.pop3.php
    +
    Get the socket response back.
    +
    +
    + +
    +
    h
    + +
    +
    +
    +
    + $Helo +
    +
    +
    PHPMailer::$Helo in class.phpmailer.php
    +
    Sets the SMTP HELO of the message (Default is $Hostname).
    +
    +
    + $Host +
    +
    +
    PHPMailer::$Host in class.phpmailer.php
    +
    Sets the SMTP hosts. All hosts must be separated by a semicolon. You can also specify a different port for each host by using this format: [hostname:port] (e.g. "smtp1.example.com:25;smtp2.example.com").
    +
    +
    + $host +
    +
    +
    POP3::$host in class.pop3.php
    +
    POP3 Mail Server
    +
    +
    + $Hostname +
    +
    +
    PHPMailer::$Hostname in class.phpmailer.php
    +
    Sets the hostname to use in Message-Id and Received headers and as default HELO string. If empty, the value returned by SERVER_NAME is used or 'localhost.localdomain'.
    +
    +
    + HeaderLine +
    +
    +
    PHPMailer::HeaderLine() in class.phpmailer.php
    +
    +
    + Hello +
    +
    +
    SMTP::Hello() in class.smtp.php
    +
    Sends the HELO command to the smtp server.
    +
    +
    + Help +
    +
    +
    SMTP::Help() in class.smtp.php
    +
    Gets help information on the keyword specified. If the keyword
    +
    +
    + +
    +
    i
    + +
    +
    +
    +
    + IsError +
    +
    +
    PHPMailer::IsError() in class.phpmailer.php
    +
    Returns true if an error occurred.
    +
    +
    + IsHTML +
    +
    +
    PHPMailer::IsHTML() in class.phpmailer.php
    +
    Sets message type to HTML.
    +
    +
    + IsMail +
    +
    +
    PHPMailer::IsMail() in class.phpmailer.php
    +
    Sets Mailer to send message using PHP mail() function.
    +
    +
    + IsQmail +
    +
    +
    PHPMailer::IsQmail() in class.phpmailer.php
    +
    Sets Mailer to send message using the qmail MTA.
    +
    +
    + IsSendmail +
    +
    +
    PHPMailer::IsSendmail() in class.phpmailer.php
    +
    Sets Mailer to send message using the $Sendmail program.
    +
    +
    + IsSMTP +
    +
    +
    PHPMailer::IsSMTP() in class.phpmailer.php
    +
    Sets Mailer to send message using SMTP.
    +
    +
    + +
    +
    l
    + +
    +
    +
    +
    + $language +
    +
    +
    PHPMailer::$language in class.phpmailer.php
    +
    +
    + $LE +
    +
    +
    PHPMailer::$LE in class.phpmailer.php
    +
    +
    + Login +
    +
    +
    POP3::Login() in class.pop3.php
    +
    Login to the POP3 server (does not support APOP yet)
    +
    +
    + +
    +
    m
    + +
    +
    +
    +
    + $Mailer +
    +
    +
    PHPMailer::$Mailer in class.phpmailer.php
    +
    Method to send mail: ("mail", "sendmail", or "smtp").
    +
    +
    + $MessageID +
    +
    +
    PHPMailer::$MessageID in class.phpmailer.php
    +
    Sets the message ID to be used in the Message-Id header.
    +
    +
    + $message_type +
    +
    +
    PHPMailer::$message_type in class.phpmailer.php
    +
    +
    + Mail +
    +
    +
    SMTP::Mail() in class.smtp.php
    +
    Starts a mail transaction from the email address specified in $from. Returns true if successful or false otherwise. If True the mail transaction is started and then one or more Recipient commands may be called followed by a Data command.
    +
    +
    + MsgHTML +
    +
    +
    PHPMailer::MsgHTML() in class.phpmailer.php
    +
    Evaluates the message and returns modifications for inline images and backgrounds
    +
    +
    + +
    +
    n
    + +
    +
    +
    +
    + Noop +
    +
    +
    SMTP::Noop() in class.smtp.php
    +
    Sends the command NOOP to the SMTP server.
    +
    +
    + +
    +
    p
    + +
    +
    +
    +
    + $Password +
    +
    +
    PHPMailer::$Password in class.phpmailer.php
    +
    Sets SMTP password.
    +
    +
    + $password +
    +
    +
    POP3::$password in class.pop3.php
    +
    POP3 Password
    +
    +
    + $PluginDir +
    +
    +
    PHPMailer::$PluginDir in class.phpmailer.php
    +
    Path to PHPMailer plugins. This is now only useful if the SMTP class is in a different directory than the PHP include path.
    +
    +
    + $POP3_PORT +
    +
    +
    POP3::$POP3_PORT in class.pop3.php
    +
    Default POP3 port
    +
    +
    + $POP3_TIMEOUT +
    +
    +
    POP3::$POP3_TIMEOUT in class.pop3.php
    +
    Default Timeout
    +
    +
    + $Port +
    +
    +
    PHPMailer::$Port in class.phpmailer.php
    +
    Sets the default SMTP server port.
    +
    +
    + $port +
    +
    +
    POP3::$port in class.pop3.php
    +
    POP3 Port
    +
    +
    + $Priority +
    +
    +
    PHPMailer::$Priority in class.phpmailer.php
    +
    Email priority (1 = High, 3 = Normal, 5 = low).
    +
    +
    + PHPMailer +
    +
    +
    PHPMailer in class.phpmailer.php
    +
    +
    + POP3 +
    +
    +
    POP3::POP3() in class.pop3.php
    +
    Constructor, sets the initial values
    +
    +
    + POP3 +
    +
    +
    POP3 in class.pop3.php
    +
    +
    + +
    +
    q
    + +
    +
    +
    +
    + Quit +
    +
    +
    SMTP::Quit() in class.smtp.php
    +
    Sends the quit command to the server and then closes the socket if there is no error or the $close_on_error argument is true.
    +
    +
    + +
    +
    r
    + +
    +
    +
    +
    + $ReplyTo +
    +
    +
    PHPMailer::$ReplyTo in class.phpmailer.php
    +
    +
    + Recipient +
    +
    +
    SMTP::Recipient() in class.smtp.php
    +
    Sends the command RCPT to the SMTP server with the TO: argument of $to.
    +
    +
    + Reset +
    +
    +
    SMTP::Reset() in class.smtp.php
    +
    Sends the RSET command to abort and transaction that is currently in progress. Returns true if successful false otherwise.
    +
    +
    + +
    +
    s
    + +
    +
    +
    +
    + $Sender +
    +
    +
    PHPMailer::$Sender in class.phpmailer.php
    +
    Sets the Sender email (Return-Path) of the message. If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
    +
    +
    + $Sendmail +
    +
    +
    PHPMailer::$Sendmail in class.phpmailer.php
    +
    Sets the path of the sendmail program.
    +
    +
    + $sign_cert_file +
    +
    +
    PHPMailer::$sign_cert_file in class.phpmailer.php
    +
    +
    + $sign_key_file +
    +
    +
    PHPMailer::$sign_key_file in class.phpmailer.php
    +
    +
    + $sign_key_pass +
    +
    +
    PHPMailer::$sign_key_pass in class.phpmailer.php
    +
    +
    + $SingleTo +
    +
    +
    PHPMailer::$SingleTo in class.phpmailer.php
    +
    Provides the ability to have the TO field process individual
    +
    +
    + $smtp +
    +
    +
    PHPMailer::$smtp in class.phpmailer.php
    +
    +
    + $SMTPAuth +
    +
    +
    PHPMailer::$SMTPAuth in class.phpmailer.php
    +
    Sets SMTP authentication. Utilizes the Username and Password variables.
    +
    +
    + $SMTPDebug +
    +
    +
    PHPMailer::$SMTPDebug in class.phpmailer.php
    +
    Sets SMTP class debugging on or off.
    +
    +
    + $SMTPKeepAlive +
    +
    +
    PHPMailer::$SMTPKeepAlive in class.phpmailer.php
    +
    Prevents the SMTP connection from being closed after each mail sending. If this is set to true then to close the connection requires an explicit call to SmtpClose().
    +
    +
    + $SMTPSecure +
    +
    +
    PHPMailer::$SMTPSecure in class.phpmailer.php
    +
    Sets connection prefix.
    +
    +
    + $SMTP_PORT +
    +
    +
    SMTP::$SMTP_PORT in class.smtp.php
    +
    SMTP server port
    +
    +
    + $Subject +
    +
    +
    PHPMailer::$Subject in class.phpmailer.php
    +
    Sets the Subject of the message.
    +
    +
    + Send +
    +
    +
    SMTP::Send() in class.smtp.php
    +
    Starts a mail transaction from the email address specified in
    +
    +
    + Send +
    +
    +
    PHPMailer::Send() in class.phpmailer.php
    +
    Creates message and assigns Mailer. If the message is not sent successfully then it returns false. Use the ErrorInfo variable to view description of the error.
    +
    +
    + SendAndMail +
    +
    +
    SMTP::SendAndMail() in class.smtp.php
    +
    Starts a mail transaction from the email address specified in
    +
    +
    + SendOrMail +
    +
    +
    SMTP::SendOrMail() in class.smtp.php
    +
    Starts a mail transaction from the email address specified in
    +
    +
    + sendString +
    +
    +
    POP3::sendString() in class.pop3.php
    +
    Send a string down the open socket connection to the POP3 server
    +
    +
    + set +
    +
    +
    PHPMailer::set() in class.phpmailer.php
    +
    Set (or reset) Class Objects (variables)
    +
    +
    + SetLanguage +
    +
    +
    PHPMailer::SetLanguage() in class.phpmailer.php
    +
    Sets the language for all class error messages. Returns false if it cannot load the language file. The default language type is English.
    +
    +
    + Sign +
    +
    +
    PHPMailer::Sign() in class.phpmailer.php
    +
    Set the private key file and password to sign the message.
    +
    +
    + SMTP +
    +
    +
    SMTP in class.smtp.php
    +
    +
    + SMTP +
    +
    +
    SMTP::SMTP() in class.smtp.php
    +
    Initialize the class so that the data is in a known state.
    +
    +
    + SmtpClose +
    +
    +
    PHPMailer::SmtpClose() in class.phpmailer.php
    +
    Closes the active SMTP session if one exists.
    +
    +
    + +
    +
    t
    + +
    +
    +
    +
    + $Timeout +
    +
    +
    PHPMailer::$Timeout in class.phpmailer.php
    +
    Sets the SMTP server timeout in seconds. This function will not work with the win32 version.
    +
    +
    + $to +
    +
    +
    PHPMailer::$to in class.phpmailer.php
    +
    +
    + $tval +
    +
    +
    POP3::$tval in class.pop3.php
    +
    POP3 Timeout Value
    +
    +
    + Turn +
    +
    +
    SMTP::Turn() in class.smtp.php
    +
    This is an optional command for SMTP that this class does not support. This method is here to make the RFC821 Definition complete for this class and __may__ be implimented in the future
    +
    +
    + +
    +
    u
    + +
    +
    +
    +
    + $username +
    +
    +
    POP3::$username in class.pop3.php
    +
    POP3 Username
    +
    +
    + $Username +
    +
    +
    PHPMailer::$Username in class.phpmailer.php
    +
    Sets SMTP username.
    +
    +
    + +
    +
    v
    + +
    +
    +
    +
    + $Version +
    +
    +
    PHPMailer::$Version in class.phpmailer.php
    +
    Holds PHPMailer version.
    +
    +
    + Verify +
    +
    +
    SMTP::Verify() in class.smtp.php
    +
    Verifies that the name is recognized by the server.
    +
    +
    + +
    +
    w
    + +
    +
    +
    +
    + $WordWrap +
    +
    +
    PHPMailer::$WordWrap in class.phpmailer.php
    +
    Sets word wrapping on the body of the message to a given number of characters.
    +
    +
    + +
    + a + b + c + d + e + f + g + h + i + l + m + n + p + q + r + s + t + u + v + w +
    + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/index.html b/plugin/PHPMailer_v2.0.4/phpdocs/index.html new file mode 100644 index 000000000..3d66c1e28 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/index.html @@ -0,0 +1,24 @@ + + + + + + PHPMailer version 2.0.4 + + + + + + + + + + + <H2>Frame Alert</H2> + <P>This document is designed to be viewed using the frames feature. + If you see this message, you are using a non-frame-capable web client.</P> + + + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/li_PHPMailer.html b/plugin/PHPMailer_v2.0.4/phpdocs/li_PHPMailer.html new file mode 100644 index 000000000..e88a5803a --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/li_PHPMailer.html @@ -0,0 +1,38 @@ + + + + + + + + + + +
    PHPMailer
    +
    + +
    + +
    Description
    +
    + Class trees
    + Index of elements
    +
    + + + +
    Classes
    +
    PHPMailer
    +
    POP3
    +
    SMTP
    +
    Files
    +
    class.phpmailer.php
    +
    class.pop3.php
    +
    class.smtp.php
    + + +
    +
    +

    phpDocumentor v 1.3.0RC3

    + + \ No newline at end of file diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/media/banner.css b/plugin/PHPMailer_v2.0.4/phpdocs/media/banner.css new file mode 100644 index 000000000..f2149ebb4 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/media/banner.css @@ -0,0 +1,32 @@ +body +{ + background-color: #CCCCFF; + margin: 0px; + padding: 0px; +} + +/* Banner (top bar) classes */ + +.banner { } + +.banner-menu +{ + clear: both; + padding: .5em; + border-top: 2px solid #6666AA; +} + +.banner-title +{ + text-align: right; + font-size: 20pt; + font-weight: bold; + margin: .2em; +} + +.package-selector +{ + background-color: #AAAADD; + border: 1px solid black; + color: yellow; +} diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/media/stylesheet.css b/plugin/PHPMailer_v2.0.4/phpdocs/media/stylesheet.css new file mode 100644 index 000000000..94870fb5a --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/media/stylesheet.css @@ -0,0 +1,144 @@ +a { color: #336699; text-decoration: none; } +a:hover { color: #6699CC; text-decoration: underline; } +a:active { color: #6699CC; text-decoration: underline; } + +body { background : #FFFFFF; } +body, table { font-family: Georgia, Times New Roman, Times, serif; font-size: 10pt } +p, li { line-height: 140% } +a img { border: 0px; } +dd { margin-left: 0px; padding-left: 1em; } + +/* Page layout/boxes */ + +.info-box {} +.info-box-title { margin: 1em 0em 0em 0em; padding: .25em; font-weight: normal; font-size: 14pt; border: 2px solid #999999; background-color: #CCCCFF } +.info-box-body { border: 1px solid #999999; padding: .5em; } +.nav-bar { font-size: 8pt; white-space: nowrap; text-align: right; padding: .2em; margin: 0em 0em 1em 0em; } + +.oddrow { background-color: #F8F8F8; border: 1px solid #AAAAAA; padding: .5em; margin-bottom: 1em} +.evenrow { border: 1px solid #AAAAAA; padding: .5em; margin-bottom: 1em} + +.page-body { max-width: 800px; margin: auto; } +.tree dl { margin: 0px } + +/* Index formatting classes */ + +.index-item-body { margin-top: .5em; margin-bottom: .5em} +.index-item-description { margin-top: .25em } +.index-item-details { font-weight: normal; font-style: italic; font-size: 8pt } +.index-letter-section { background-color: #EEEEEE; border: 1px dotted #999999; padding: .5em; margin-bottom: 1em} +.index-letter-title { font-size: 12pt; font-weight: bold } +.index-letter-menu { text-align: center; margin: 1em } +.index-letter { font-size: 12pt } + +/* Docbook classes */ + +.description {} +.short-description { font-weight: bold; color: #666666; } +.tags { padding-left: 0em; margin-left: 3em; color: #666666; list-style-type: square; } +.parameters { padding-left: 0em; margin-left: 3em; font-style: italic; list-style-type: square; } +.redefinitions { font-size: 8pt; padding-left: 0em; margin-left: 2em; } +.package { } +.package-title { font-weight: bold; font-size: 14pt; border-bottom: 1px solid black } +.package-details { font-size: 85%; } +.sub-package { font-weight: bold; font-size: 120% } +.tutorial { border-width: thin; border-color: #0066ff } +.tutorial-nav-box { width: 100%; border: 1px solid #999999; background-color: #F8F8F8; } +.nav-button-disabled { color: #999999; } +.nav-button:active, +.nav-button:focus, +.nav-button:hover { background-color: #DDDDDD; outline: 1px solid #999999; text-decoration: none } +.folder-title { font-style: italic } + +/* Generic formatting */ + +.field { font-weight: bold; } +.detail { font-size: 8pt; } +.notes { font-style: italic; font-size: 8pt; } +.separator { background-color: #999999; height: 2px; } +.warning { color: #FF6600; } +.disabled { font-style: italic; color: #999999; } + +/* Code elements */ + +.line-number { } + +.class-table { width: 100%; } +.class-table-header { border-bottom: 1px dotted #666666; text-align: left} +.class-name { color: #000000; font-weight: bold; } + +.method-summary { padding-left: 1em; font-size: 8pt } +.method-header { } +.method-definition { margin-bottom: .3em } +.method-title { font-weight: bold; } +.method-name { font-weight: bold; } +.method-signature { font-size: 85%; color: #666666; margin: .5em 0em } +.method-result { font-style: italic; } + +.var-summary { padding-left: 1em; font-size: 8pt; } +.var-header { } +.var-title { margin-bottom: .3em } +.var-type { font-style: italic; } +.var-name { font-weight: bold; } +.var-default {} +.var-description { font-weight: normal; color: #000000; } + +.include-title { } +.include-type { font-style: italic; } +.include-name { font-weight: bold; } + +.const-title { } +.const-name { font-weight: bold; } + +/* Syntax highlighting */ + +.src-code { border: 1px solid #336699; padding: 1em; background-color: #EEEEEE; } +*[class="src-code"] { line-height : 0.5em } + +.src-comm { color: green; } +.src-id { } +.src-inc { color: #0000FF; } +.src-key { color: #0000FF; } +.src-num { color: #CC0000; } +.src-str { color: #66cccc; } +.src-sym { font-weight: bold; } +.src-var { } + +.src-php { font-weight: bold; } + +.src-doc { color: #009999 } +.src-doc-close-template { color: #0000FF } +.src-doc-coretag { color: #0099FF; font-weight: bold } +.src-doc-inlinetag { color: #0099FF } +.src-doc-internal { color: #6699cc } +.src-doc-tag { color: #0080CC } +.src-doc-template { color: #0000FF } +.src-doc-type { font-style: italic } +.src-doc-var { font-style: italic } + +.tute-tag { color: #009999 } +.tute-attribute-name { color: #0000FF } +.tute-attribute-value { color: #0099FF } +.tute-entity { font-weight: bold; } +.tute-comment { font-style: italic } +.tute-inline-tag { color: #636311; font-weight: bold } + +/* tutorial */ + +.authors { } +.author { font-style: italic; font-weight: bold } +.author-blurb { margin: .5em 0em .5em 2em; font-size: 85%; font-weight: normal; font-style: normal } +.example { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; } +*[class="example"] { line-height : 0.5em } +.listing { border: 1px dashed #999999; background-color: #EEEEEE; padding: .5em; white-space: nowrap; } +*[class="listing"] { line-height : 0.5em } +.release-info { font-size: 85%; font-style: italic; margin: 1em 0em } +.ref-title-box { } +.ref-title { } +.ref-purpose { font-style: italic; color: #666666 } +.ref-synopsis { } +.title { font-weight: bold; margin: 1em 0em 0em 0em; padding: .25em; border: 2px solid #999999; background-color: #CCCCFF } +.cmd-synopsis { margin: 1em 0em } +.cmd-title { font-weight: bold } +.toc { margin-left: 2em; padding-left: 0em } + diff --git a/plugin/PHPMailer_v2.0.4/phpdocs/packages.html b/plugin/PHPMailer_v2.0.4/phpdocs/packages.html new file mode 100644 index 000000000..fdf40b0b8 --- /dev/null +++ b/plugin/PHPMailer_v2.0.4/phpdocs/packages.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugin/editor/ckeditor4/CHANGES.md b/plugin/editor/ckeditor4/CHANGES.md new file mode 100644 index 000000000..98ecdf4e1 --- /dev/null +++ b/plugin/editor/ckeditor4/CHANGES.md @@ -0,0 +1,12 @@ +CKEditor 4 Changelog +==================== + +## CKEditor 4.0 + +The first stable release of the new CKEditor 4 code line. + +The CKEditor JavaScript API has been kept compatible with CKEditor 4, whenever +possible. The list of relevant changes can be found in the [API Changes page of +the CKEditor 4 documentation][1]. + +[1]: http://docs.ckeditor.com/#!/guide/dev_api_changes "API Changes"" diff --git a/plugin/editor/ckeditor4/LICENSE.md b/plugin/editor/ckeditor4/LICENSE.md new file mode 100644 index 000000000..2a69d60fd --- /dev/null +++ b/plugin/editor/ckeditor4/LICENSE.md @@ -0,0 +1,1264 @@ +Software License Agreement +========================== + +CKEditor - The text editor for Internet - http://ckeditor.com +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. + +Licensed under the terms of any of the following licenses at your +choice: + + - GNU General Public License Version 2 or later (the "GPL") + http://www.gnu.org/licenses/gpl.html + (See Appendix A) + + - GNU Lesser General Public License Version 2.1 or later (the "LGPL") + http://www.gnu.org/licenses/lgpl.html + (See Appendix B) + + - Mozilla Public License Version 1.1 or later (the "MPL") + http://www.mozilla.org/MPL/MPL-1.1.html + (See Appendix C) + +You are not required to, but if you want to explicitly declare the +license you have chosen to be bound to when using, reproducing, +modifying and distributing this software, just include a text file +titled "legal.txt" in your version of this software, indicating your +license choice. In any case, your choice will not restrict any +recipient of your version of this software to use, reproduce, modify +and distribute this software under any of the above licenses. + +Sources of Intellectual Property Included in CKEditor +----------------------------------------------------- + +Where not otherwise indicated, all CKEditor content is authored by +CKSource engineers and consists of CKSource-owned intellectual +property. In some specific instances, CKEditor will incorporate work +done by developers outside of CKSource with their express permission. + +Trademarks +---------- + +CKEditor is a trademark of CKSource - Frederico Knabben. All other brand +and product names are trademarks, registered trademarks or service +marks of their respective holders. + +--- + +Appendix A: The GPL License +--------------------------- + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software-to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + + +Appendix B: The LGPL License +---------------------------- + +GNU LESSER GENERAL PUBLIC LICENSE +Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + +Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software-to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages-typically libraries-of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + +GNU LESSER GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + +NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +END OF TERMS AND CONDITIONS + + +Appendix C: The MPL License +--------------------------- + +MOZILLA PUBLIC LICENSE +Version 1.1 + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the + Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to + the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original + Code, prior Modifications used by a Contributor, and the Modifications + made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the + combination of the Original Code and Modifications, in each case + including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally + accepted in the software development community for the electronic + transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source + Code. + + 1.6. "Initial Developer" means the individual or entity identified + as the Initial Developer in the Source Code notice required by Exhibit + A. + + 1.7. "Larger Work" means a work which combines Covered Code or + portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum + extent possible, whether at the time of the initial grant or + subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the + substance or structure of either the Original Code or any previous + Modifications. When Covered Code is released as a series of files, a + Modification is: + A. Any addition to or deletion from the contents of a file + containing Original Code or previous Modifications. + + B. Any new file that contains any part of the Original Code or + previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code + which is described in the Source Code notice required by Exhibit A as + Original Code, and which, at the time of its release under this + License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or + hereafter acquired, including without limitation, method, process, + and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for + making modifications to it, including all modules it contains, plus + any associated interface definition files, scripts used to control + compilation and installation of an Executable, or source code + differential comparisons against either the Original Code or another + well known, available Covered Code of the Contributor's choice. The + Source Code can be in a compressed or archival form, provided the + appropriate decompression or de-archiving software is widely available + for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this + License or a future version of this License issued under Section 6.1. + For legal entities, "You" includes any entity which controls, is + controlled by, or is under common control with You. For purposes of + this definition, "control" means (a) the power, direct or indirect, + to cause the direction or management of such entity, whether by + contract or otherwise, or (b) ownership of more than fifty percent + (50%) of the outstanding shares or beneficial ownership of such + entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. + The Initial Developer hereby grants You a world-wide, royalty-free, + non-exclusive license, subject to third party intellectual property + claims: + (a) under intellectual property rights (other than patent or + trademark) Licensable by Initial Developer to use, reproduce, + modify, display, perform, sublicense and distribute the Original + Code (or portions thereof) with or without Modifications, and/or + as part of a Larger Work; and + + (b) under Patents Claims infringed by the making, using or + selling of Original Code, to make, have made, use, practice, + sell, and offer for sale, and/or otherwise dispose of the + Original Code (or portions thereof). + + (c) the licenses granted in this Section 2.1(a) and (b) are + effective on the date Initial Developer first distributes + Original Code under the terms of this License. + + (d) Notwithstanding Section 2.1(b) above, no patent license is + granted: 1) for code that You delete from the Original Code; 2) + separate from the Original Code; or 3) for infringements caused + by: i) the modification of the Original Code or ii) the + combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. + Subject to third party intellectual property claims, each Contributor + hereby grants You a world-wide, royalty-free, non-exclusive license + + (a) under intellectual property rights (other than patent or + trademark) Licensable by Contributor, to use, reproduce, modify, + display, perform, sublicense and distribute the Modifications + created by such Contributor (or portions thereof) either on an + unmodified basis, with other Modifications, as Covered Code + and/or as part of a Larger Work; and + + (b) under Patent Claims infringed by the making, using, or + selling of Modifications made by that Contributor either alone + and/or in combination with its Contributor Version (or portions + of such combination), to make, use, sell, offer for sale, have + made, and/or otherwise dispose of: 1) Modifications made by that + Contributor (or portions thereof); and 2) the combination of + Modifications made by that Contributor with its Contributor + Version (or portions of such combination). + + (c) the licenses granted in Sections 2.2(a) and 2.2(b) are + effective on the date Contributor first makes Commercial Use of + the Covered Code. + + (d) Notwithstanding Section 2.2(b) above, no patent license is + granted: 1) for any code that Contributor has deleted from the + Contributor Version; 2) separate from the Contributor Version; + 3) for infringements caused by: i) third party modifications of + Contributor Version or ii) the combination of Modifications made + by that Contributor with other software (except as part of the + Contributor Version) or other devices; or 4) under Patent Claims + infringed by Covered Code in the absence of Modifications made by + that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. + The Modifications which You create or to which You contribute are + governed by the terms of this License, including without limitation + Section 2.2. The Source Code version of Covered Code may be + distributed only under the terms of this License or a future version + of this License released under Section 6.1, and You must include a + copy of this License with every copy of the Source Code You + distribute. You may not offer or impose any terms on any Source Code + version that alters or restricts the applicable version of this + License or the recipients' rights hereunder. However, You may include + an additional document offering the additional rights described in + Section 3.5. + + 3.2. Availability of Source Code. + Any Modification which You create or to which You contribute must be + made available in Source Code form under the terms of this License + either on the same media as an Executable version or via an accepted + Electronic Distribution Mechanism to anyone to whom you made an + Executable version available; and if made available via Electronic + Distribution Mechanism, must remain available for at least twelve (12) + months after the date it initially became available, or at least six + (6) months after a subsequent version of that particular Modification + has been made available to such recipients. You are responsible for + ensuring that the Source Code version remains available even if the + Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. + You must cause all Covered Code to which You contribute to contain a + file documenting the changes You made to create that Covered Code and + the date of any change. You must include a prominent statement that + the Modification is derived, directly or indirectly, from Original + Code provided by the Initial Developer and including the name of the + Initial Developer in (a) the Source Code, and (b) in any notice in an + Executable version or related documentation in which You describe the + origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + (a) Third Party Claims. + If Contributor has knowledge that a license under a third party's + intellectual property rights is required to exercise the rights + granted by such Contributor under Sections 2.1 or 2.2, + Contributor must include a text file with the Source Code + distribution titled "LEGAL" which describes the claim and the + party making the claim in sufficient detail that a recipient will + know whom to contact. If Contributor obtains such knowledge after + the Modification is made available as described in Section 3.2, + Contributor shall promptly modify the LEGAL file in all copies + Contributor makes available thereafter and shall take other steps + (such as notifying appropriate mailing lists or newsgroups) + reasonably calculated to inform those who received the Covered + Code that new knowledge has been obtained. + + (b) Contributor APIs. + If Contributor's Modifications include an application programming + interface and Contributor has knowledge of patent licenses which + are reasonably necessary to implement that API, Contributor must + also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to + Section 3.4(a) above, Contributor believes that Contributor's + Modifications are Contributor's original creation(s) and/or + Contributor has sufficient rights to grant the rights conveyed by + this License. + + 3.5. Required Notices. + You must duplicate the notice in Exhibit A in each file of the Source + Code. If it is not possible to put such notice in a particular Source + Code file due to its structure, then You must include such notice in a + location (such as a relevant directory) where a user would be likely + to look for such a notice. If You created one or more Modification(s) + You may add your name as a Contributor to the notice described in + Exhibit A. You must also duplicate this License in any documentation + for the Source Code where You describe recipients' rights or ownership + rights relating to Covered Code. You may choose to offer, and to + charge a fee for, warranty, support, indemnity or liability + obligations to one or more recipients of Covered Code. However, You + may do so only on Your own behalf, and not on behalf of the Initial + Developer or any Contributor. You must make it absolutely clear than + any such warranty, support, indemnity or liability obligation is + offered by You alone, and You hereby agree to indemnify the Initial + Developer and every Contributor for any liability incurred by the + Initial Developer or such Contributor as a result of warranty, + support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. + You may distribute Covered Code in Executable form only if the + requirements of Section 3.1-3.5 have been met for that Covered Code, + and if You include a notice stating that the Source Code version of + the Covered Code is available under the terms of this License, + including a description of how and where You have fulfilled the + obligations of Section 3.2. The notice must be conspicuously included + in any notice in an Executable version, related documentation or + collateral in which You describe recipients' rights relating to the + Covered Code. You may distribute the Executable version of Covered + Code or ownership rights under a license of Your choice, which may + contain terms different from this License, provided that You are in + compliance with the terms of this License and that the license for the + Executable version does not attempt to limit or alter the recipient's + rights in the Source Code version from the rights set forth in this + License. If You distribute the Executable version under a different + license You must make it absolutely clear that any terms which differ + from this License are offered by You alone, not by the Initial + Developer or any Contributor. You hereby agree to indemnify the + Initial Developer and every Contributor for any liability incurred by + the Initial Developer or such Contributor as a result of any such + terms You offer. + + 3.7. Larger Works. + You may create a Larger Work by combining Covered Code with other code + not governed by the terms of this License and distribute the Larger + Work as a single product. In such a case, You must make sure the + requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + + If it is impossible for You to comply with any of the terms of this + License with respect to some or all of the Covered Code due to + statute, judicial order, or regulation then You must: (a) comply with + the terms of this License to the maximum extent possible; and (b) + describe the limitations and the code they affect. Such description + must be included in the LEGAL file described in Section 3.4 and must + be included with all distributions of the Source Code. Except to the + extent prohibited by statute or regulation, such description must be + sufficiently detailed for a recipient of ordinary skill to be able to + understand it. + +5. Application of this License. + + This License applies to code to which the Initial Developer has + attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions. + Netscape Communications Corporation ("Netscape") may publish revised + and/or new versions of the License from time to time. Each version + will be given a distinguishing version number. + + 6.2. Effect of New Versions. + Once Covered Code has been published under a particular version of the + License, You may always continue to use it under the terms of that + version. You may also choose to use such Covered Code under the terms + of any subsequent version of the License published by Netscape. No one + other than Netscape has the right to modify the terms applicable to + Covered Code created under this License. + + 6.3. Derivative Works. + If You create or use a modified version of this License (which you may + only do in order to apply it to code which is not already Covered Code + governed by this License), You must (a) rename Your license so that + the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", + "MPL", "NPL" or any confusingly similar phrase do not appear in your + license (except to note that your license differs from this License) + and (b) otherwise make it clear that Your version of the license + contains terms which differ from the Mozilla Public License and + Netscape Public License. (Filling in the name of the Initial + Developer, Original Code or Contributor in the notice described in + Exhibit A shall not of themselves be deemed to be modifications of + this License.) + +7. DISCLAIMER OF WARRANTY. + + COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF + DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. + THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE + IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, + YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE + COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER + OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF + ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. TERMINATION. + + 8.1. This License and the rights granted hereunder will terminate + automatically if You fail to comply with terms herein and fail to cure + such breach within 30 days of becoming aware of the breach. All + sublicenses to the Covered Code which are properly granted shall + survive any termination of this License. Provisions which, by their + nature, must remain in effect beyond the termination of this License + shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement + claim (excluding declatory judgment actions) against Initial Developer + or a Contributor (the Initial Developer or Contributor against whom + You file such action is referred to as "Participant") alleging that: + + (a) such Participant's Contributor Version directly or indirectly + infringes any patent, then any and all rights granted by such + Participant to You under Sections 2.1 and/or 2.2 of this License + shall, upon 60 days notice from Participant terminate prospectively, + unless if within 60 days after receipt of notice You either: (i) + agree in writing to pay Participant a mutually agreeable reasonable + royalty for Your past and future use of Modifications made by such + Participant, or (ii) withdraw Your litigation claim with respect to + the Contributor Version against such Participant. If within 60 days + of notice, a reasonable royalty and payment arrangement are not + mutually agreed upon in writing by the parties or the litigation claim + is not withdrawn, the rights granted by Participant to You under + Sections 2.1 and/or 2.2 automatically terminate at the expiration of + the 60 day notice period specified above. + + (b) any software, hardware, or device, other than such Participant's + Contributor Version, directly or indirectly infringes any patent, then + any rights granted to You by such Participant under Sections 2.1(b) + and 2.2(b) are revoked effective as of the date You first made, used, + sold, distributed, or had made, Modifications made by that + Participant. + + 8.3. If You assert a patent infringement claim against Participant + alleging that such Participant's Contributor Version directly or + indirectly infringes any patent where such claim is resolved (such as + by license or settlement) prior to the initiation of patent + infringement litigation, then the reasonable value of the licenses + granted by such Participant under Sections 2.1 or 2.2 shall be taken + into account in determining the amount or value of any payment or + license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, + all end user license agreements (excluding distributors and resellers) + which have been validly granted by You or any distributor hereunder + prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY. + + UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT + (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL + DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, + OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR + ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY + CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, + WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER + COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN + INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF + LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY + RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW + PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE + EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO + THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. GOVERNMENT END USERS. + + The Covered Code is a "commercial item," as that term is defined in + 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer + software" and "commercial computer software documentation," as such + terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 + C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), + all U.S. Government End Users acquire Covered Code with only those + rights set forth herein. + +11. MISCELLANEOUS. + + This License represents the complete agreement concerning subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. This License shall be governed by + California law provisions (except to the extent applicable law, if + any, provides otherwise), excluding its conflict-of-law provisions. + With respect to disputes in which at least one party is a citizen of, + or an entity chartered or registered to do business in the United + States of America, any litigation relating to this License shall be + subject to the jurisdiction of the Federal Courts of the Northern + District of California, with venue lying in Santa Clara County, + California, with the losing party responsible for costs, including + without limitation, court costs and reasonable attorneys' fees and + expenses. The application of the United Nations Convention on + Contracts for the International Sale of Goods is expressly excluded. + Any law or regulation which provides that the language of a contract + shall be construed against the drafter shall not apply to this + License. + +12. RESPONSIBILITY FOR CLAIMS. + + As between Initial Developer and the Contributors, each party is + responsible for claims and damages arising, directly or indirectly, + out of its utilization of rights under this License and You agree to + work with Initial Developer and Contributors to distribute such + responsibility on an equitable basis. Nothing herein is intended or + shall be deemed to constitute any admission of liability. + +13. MULTIPLE-LICENSED CODE. + + Initial Developer may designate portions of the Covered Code as + "Multiple-Licensed". "Multiple-Licensed" means that the Initial + Developer permits you to utilize portions of the Covered Code under + Your choice of the NPL or the alternative licenses, if any, specified + by the Initial Developer in the file described in Exhibit A. + +EXHIBIT A -Mozilla Public License. + + ``The contents of this file are subject to the Mozilla Public License + Version 1.1 (the "License"); you may not use this file except in + compliance with the License. You may obtain a copy of the License at + http://www.mozilla.org/MPL/ + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + License for the specific language governing rights and limitations + under the License. + + The Original Code is ______________________________________. + + The Initial Developer of the Original Code is ________________________. + Portions created by ______________________ are Copyright (C) ______ + _______________________. All Rights Reserved. + + Contributor(s): ______________________________________. + + Alternatively, the contents of this file may be used under the terms + of the _____ license (the "[___] License"), in which case the + provisions of [______] License are applicable instead of those + above. If you wish to allow use of your version of this file only + under the terms of the [____] License and not to allow others to use + your version of this file under the MPL, indicate your decision by + deleting the provisions above and replace them with the notice and + other provisions required by the [___] License. If you do not delete + the provisions above, a recipient may use your version of this file + under either the MPL or the [___] License." + + [NOTE: The text of this Exhibit A may differ slightly from the text of + the notices in the Source Code files of the Original Code. You should + use the text of this Exhibit A rather than the text found in the + Original Code Source Code for Your Modifications.] diff --git a/plugin/editor/ckeditor4/README.md b/plugin/editor/ckeditor4/README.md new file mode 100644 index 000000000..68f930b93 --- /dev/null +++ b/plugin/editor/ckeditor4/README.md @@ -0,0 +1,39 @@ +CKEditor 4 +========== + +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. +http://ckeditor.com - See LICENSE.md for license information. + +CKEditor is a text editor to be used inside web pages. It's not a replacement +for desktop text editors like Word or OpenOffice, but a component to be used as +part of web applications and websites. + +## Documentation + +The full editor documentation is available online at the following address: +http://docs.ckeditor.com + +## Installation + +Installing CKEditor is an easy task. Just follow these simple steps: + + 1. **Download** the latest version from the CKEditor website: + http://ckeditor.com. You should have already completed this step, but be + sure you have the very latest version. + 2. **Extract** (decompress) the downloaded file into the root of your website. + +**Note:** CKEditor is by default installed in the `ckeditor` folder. You can +place the files in whichever you want though. + +## Checking Your Installation + +The editor comes with a few sample pages that can be used to verify that +installation proceeded properly. Take a look at the `samples` directory. + +To test your installation, just call the following page at your website: + + http:////samples/index.html + +For example: + + http://www.example.com/ckeditor/samples/index.html diff --git a/plugin/editor/ckeditor4/build-config.js b/plugin/editor/ckeditor4/build-config.js new file mode 100644 index 000000000..0d0a54da1 --- /dev/null +++ b/plugin/editor/ckeditor4/build-config.js @@ -0,0 +1,158 @@ + +/** + * @license Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. + * For licensing, see LICENSE.html or http://ckeditor.com/license + */ + +/** + * This file was added automatically by CKEditor builder. + * You may re-use it at any time at http://ckeditor.com/builder to build CKEditor again. + * + * NOTE: + * This file is not used by CKEditor, you may remove it. + * Changing this file will not change your CKEditor configuration. + */ + +var CKBUILDER_CONFIG = { + skin: 'moono', + preset: 'full', + ignore: [ + 'dev', + '.gitignore', + '.gitattributes', + 'README.md', + '.mailmap' + ], + plugins : { + 'about' : 1, + 'a11yhelp' : 1, + 'dialogadvtab' : 1, + 'basicstyles' : 1, + 'bidi' : 1, + 'blockquote' : 1, + 'clipboard' : 1, + 'colorbutton' : 1, + 'colordialog' : 1, + 'templates' : 1, + 'contextmenu' : 1, + 'div' : 1, + 'resize' : 1, + 'toolbar' : 1, + 'elementspath' : 1, + 'enterkey' : 1, + 'entities' : 1, + 'filebrowser' : 1, + 'find' : 1, + 'flash' : 1, + 'floatingspace' : 1, + 'font' : 1, + 'forms' : 1, + 'format' : 1, + 'htmlwriter' : 1, + 'horizontalrule' : 1, + 'iframe' : 1, + 'wysiwygarea' : 1, + 'image' : 1, + 'indent' : 1, + 'smiley' : 1, + 'justify' : 1, + 'link' : 1, + 'list' : 1, + 'liststyle' : 1, + 'magicline' : 1, + 'maximize' : 1, + 'newpage' : 1, + 'pagebreak' : 1, + 'pastetext' : 1, + 'pastefromword' : 1, + 'preview' : 1, + 'print' : 1, + 'removeformat' : 1, + 'save' : 1, + 'selectall' : 1, + 'showblocks' : 1, + 'showborders' : 1, + 'sourcearea' : 1, + 'specialchar' : 1, + 'stylescombo' : 1, + 'tab' : 1, + 'table' : 1, + 'tabletools' : 1, + 'undo' : 1, + 'dialog' : 1, + 'dialogui' : 1, + 'panelbutton' : 1, + 'button' : 1, + 'floatpanel' : 1, + 'panel' : 1, + 'menu' : 1, + 'popup' : 1, + 'fakeobjects' : 1, + 'richcombo' : 1, + 'listblock' : 1 + }, + languages : { + 'af' : 1, + 'ar' : 1, + 'eu' : 1, + 'bn' : 1, + 'bs' : 1, + 'bg' : 1, + 'ca' : 1, + 'zh-cn' : 1, + 'zh' : 1, + 'hr' : 1, + 'cs' : 1, + 'da' : 1, + 'nl' : 1, + 'en' : 1, + 'en-au' : 1, + 'en-ca' : 1, + 'en-gb' : 1, + 'eo' : 1, + 'et' : 1, + 'fo' : 1, + 'fi' : 1, + 'fr' : 1, + 'fr-ca' : 1, + 'gl' : 1, + 'ka' : 1, + 'de' : 1, + 'el' : 1, + 'gu' : 1, + 'he' : 1, + 'hi' : 1, + 'hu' : 1, + 'is' : 1, + 'it' : 1, + 'ja' : 1, + 'km' : 1, + 'ko' : 1, + 'ku' : 1, + 'lv' : 1, + 'lt' : 1, + 'mk' : 1, + 'ms' : 1, + 'mn' : 1, + 'no' : 1, + 'nb' : 1, + 'fa' : 1, + 'pl' : 1, + 'pt-br' : 1, + 'pt' : 1, + 'ro' : 1, + 'ru' : 1, + 'sr' : 1, + 'sr-latn' : 1, + 'sk' : 1, + 'sl' : 1, + 'es' : 1, + 'sv' : 1, + 'th' : 1, + 'tr' : 1, + 'ug' : 1, + 'uk' : 1, + 'vi' : 1, + 'cy' : 1, + } +}; \ No newline at end of file diff --git a/plugin/editor/ckeditor4/ckeditor.js b/plugin/editor/ckeditor4/ckeditor.js new file mode 100644 index 000000000..b8f3d548c --- /dev/null +++ b/plugin/editor/ckeditor4/ckeditor.js @@ -0,0 +1,890 @@ +/* +Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved. +For licensing, see LICENSE.html or http://ckeditor.com/license +*/ +(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;window.CKEDITOR||(window.CKEDITOR=function(){var b={timestamp:"CAPD",version:"4.0",revision:"769d96134b",rnd:Math.floor(900*Math.random())+100,_:{pending:[]},status:"unloaded",basePath:function(){var a=window.CKEDITOR_BASEPATH||"";if(!a)for(var b=document.getElementsByTagName("script"),d=0;d=0;o--)if(m[o].priority<=k){m.splice(o+1,0,h);return{removeListener:l}}m.unshift(h)}return{removeListener:l}}, +once:function(){var a=arguments[1];arguments[1]=function(b){b.removeListener();return a.apply(this,arguments)};return this.on.apply(this,arguments)},capture:function(){CKEDITOR.event.useCapture=1;var a=this.on.apply(this,arguments);CKEDITOR.event.useCapture=0;return a},fire:function(){var a=0,b=function(){a=1},d=0,g=function(){d=1};return function(k,h,l){var m=c(this)[k],k=a,n=d;a=d=0;if(m){var o=m.listeners;if(o.length)for(var o=o.slice(0),i,q=0;q=0&&d.listeners.splice(g,1)}},removeAllListeners:function(){var a=c(this),b;for(b in a)delete a[b]},hasListeners:function(a){return(a=c(this)[a])&&a.listeners.length>0}}}()); +CKEDITOR.editor||(CKEDITOR.editor=function(){CKEDITOR._.pending.push([this,arguments]);CKEDITOR.event.call(this)},CKEDITOR.editor.prototype.fire=function(b,c){b in{instanceReady:1,loaded:1}&&(this[b]=true);return CKEDITOR.event.prototype.fire.call(this,b,c,this)},CKEDITOR.editor.prototype.fireOnce=function(b,c){b in{instanceReady:1,loaded:1}&&(this[b]=true);return CKEDITOR.event.prototype.fireOnce.call(this,b,c,this)},CKEDITOR.event.implementOn(CKEDITOR.editor.prototype,!0)); +CKEDITOR.env||(CKEDITOR.env=function(){var b=navigator.userAgent.toLowerCase(),c=window.opera,a={ie:eval("/*@cc_on!@*/false"),opera:!!c&&c.version,webkit:b.indexOf(" applewebkit/")>-1,air:b.indexOf(" adobeair/")>-1,mac:b.indexOf("macintosh")>-1,quirks:document.compatMode=="BackCompat",mobile:b.indexOf("mobile")>-1,iOS:/(ipad|iphone|ipod)/.test(b),isCustomDomain:function(){if(!this.ie)return false;var a=document.domain,b=window.location.hostname;return a!=b&&a!="["+b+"]"},secure:location.protocol== +"https:"};a.gecko=navigator.product=="Gecko"&&!a.webkit&&!a.opera;if(a.webkit)b.indexOf("chrome")>-1?a.chrome=true:a.safari=true;var f=0;if(a.ie){f=a.quirks||!document.documentMode?parseFloat(b.match(/msie (\d+)/)[1]):document.documentMode;a.ie9Compat=f==9;a.ie8Compat=f==8;a.ie7Compat=f==7;a.ie6Compat=f<7||a.quirks}if(a.gecko){var e=b.match(/rv:([\d\.]+)/);if(e){e=e[1].split(".");f=e[0]*1E4+(e[1]||0)*100+(e[2]||0)*1}}a.opera&&(f=parseFloat(c.version()));a.air&&(f=parseFloat(b.match(/ adobeair\/(\d+)/)[1])); +a.webkit&&(f=parseFloat(b.match(/ applewebkit\/(\d+)/)[1]));a.version=f;a.isCompatible=a.iOS&&f>=534||!a.mobile&&(a.ie&&f>6||a.gecko&&f>=10801||a.opera&&f>=9.5||a.air&&f>=1||a.webkit&&f>=522||false);a.cssClass="cke_browser_"+(a.ie?"ie":a.gecko?"gecko":a.opera?"opera":a.webkit?"webkit":"unknown");if(a.quirks)a.cssClass=a.cssClass+" cke_browser_quirks";if(a.ie){a.cssClass=a.cssClass+(" cke_browser_ie"+(a.quirks||a.version<7?"6":a.version));if(a.quirks)a.cssClass=a.cssClass+" cke_browser_iequirks"}if(a.gecko&& +f<10900)a.cssClass=a.cssClass+" cke_browser_gecko18";if(a.air)a.cssClass=a.cssClass+" cke_browser_air";return a}()); +"unloaded"==CKEDITOR.status&&function(){CKEDITOR.event.implementOn(CKEDITOR);CKEDITOR.loadFullCore=function(){if(CKEDITOR.status!="basic_ready")CKEDITOR.loadFullCore._load=1;else{delete CKEDITOR.loadFullCore;var b=document.createElement("script");b.type="text/javascript";b.src=CKEDITOR.basePath+"ckeditor.js";document.getElementsByTagName("head")[0].appendChild(b)}};CKEDITOR.loadFullCoreTimeout=0;CKEDITOR.add=function(b){(this._.pending||(this._.pending=[])).push(b)};(function(){CKEDITOR.domReady(function(){var b= +CKEDITOR.loadFullCore,c=CKEDITOR.loadFullCoreTimeout;if(b){CKEDITOR.status="basic_ready";b&&b._load?b():c&&setTimeout(function(){CKEDITOR.loadFullCore&&CKEDITOR.loadFullCore()},c*1E3)}})})();CKEDITOR.status="basic_loaded"}();CKEDITOR.dom={}; +(function(){var b=[],c=CKEDITOR.env.gecko?"-moz-":CKEDITOR.env.webkit?"-webkit-":CKEDITOR.env.opera?"-o-":CKEDITOR.env.ie?"-ms-":"";CKEDITOR.on("reset",function(){b=[]});CKEDITOR.tools={arrayCompare:function(a,b){if(!a&&!b)return true;if(!a||!b||a.length!=b.length)return false;for(var e=0;e"+b+""):e.push('');return e.join("")},htmlEncode:function(a){return(""+a).replace(/&/g,"&").replace(/>/g,">").replace(//g,">")},getNextNumber:function(){var a= +0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(a,b){var e=b(a);e.prototype=a.prototype;return e},setTimeout:function(a,b,e,c,g){g||(g=window);e||(e=g);return g.setTimeout(function(){c?a.apply(e,[].concat(c)):a.apply(e)},b||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(b){return b.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(b){return b.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g; +return function(b){return b.replace(a,"")}}(),indexOf:function(a,b){if(typeof b=="function")for(var c=0,d=a.length;c=0?a[c]:null},bind:function(a,b){return function(){return a.apply(b,arguments)}},createClass:function(a){var b=a.$,c=a.base,d=a.privates||a._,g=a.proto,a=a.statics;!b&&(b=function(){c&&this.base.apply(this, +arguments)});if(d)var k=b,b=function(){var a=this._||(this._={}),b;for(b in d){var f=d[b];a[b]=typeof f=="function"?CKEDITOR.tools.bind(f,this):f}k.apply(this,arguments)};if(c){b.prototype=this.prototypedCopy(c.prototype);b.prototype.constructor=b;b.base=c;b.baseProto=c.prototype;b.prototype.base=function(){this.base=c.prototype.base;c.apply(this,arguments);this.base=arguments.callee}}g&&this.extend(b.prototype,g,true);a&&this.extend(b,a,true);return b},addFunction:function(a,f){return b.push(function(){return a.apply(f|| +this,arguments)})-1},removeFunction:function(a){b[a]=null},callFunction:function(a){var f=b[a];return f&&f.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a=/^-?\d+\.?\d*px$/,b;return function(c){b=CKEDITOR.tools.trim(c+"")+"px";return a.test(b)?b:c||""}}(),convertToPx:function(){var a;return function(b){if(!a){a=CKEDITOR.dom.element.createFromHtml('
    ',CKEDITOR.document); +CKEDITOR.document.getBody().append(a)}if(!/%$/.test(b)){a.setStyle("width",b);return a.$.clientWidth}return b}}(),repeat:function(a,b){return Array(b+1).join(a)},tryThese:function(){for(var a,b=0,c=arguments.length;b8)&&c)b=c+":"+b;return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(b))},getHead:function(){var b=this.$.getElementsByTagName("head")[0];return b= +b?new CKEDITOR.dom.element(b):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),true)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){var b=new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView);return(this.getWindow=function(){return b})()},write:function(b){this.$.open("text/html","replace");CKEDITOR.env.isCustomDomain()&&(this.$.domain=document.domain); +this.$.write(b);this.$.close()}});CKEDITOR.dom.nodeList=function(b){this.$=b};CKEDITOR.dom.nodeList.prototype={count:function(){return this.$.length},getItem:function(b){if(b<0||b>=this.$.length)return null;return(b=this.$[b])?new CKEDITOR.dom.node(b):null}};CKEDITOR.dom.element=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createElement(b));CKEDITOR.dom.domObject.call(this,b)}; +CKEDITOR.dom.element.get=function(b){return(b=typeof b=="string"?document.getElementById(b)||document.getElementsByName(b)[0]:b)&&(b.$?b:new CKEDITOR.dom.element(b))};CKEDITOR.dom.element.prototype=new CKEDITOR.dom.node;CKEDITOR.dom.element.createFromHtml=function(b,c){var a=new CKEDITOR.dom.element("div",c);a.setHtml(b);return a.getFirst().remove()}; +CKEDITOR.dom.element.setMarker=function(b,c,a,f){var e=c.getCustomData("list_marker_id")||c.setCustomData("list_marker_id",CKEDITOR.tools.getNextNumber()).getCustomData("list_marker_id"),d=c.getCustomData("list_marker_names")||c.setCustomData("list_marker_names",{}).getCustomData("list_marker_names");b[e]=c;d[a]=1;return c.setCustomData(a,f)};CKEDITOR.dom.element.clearAllMarkers=function(b){for(var c in b)CKEDITOR.dom.element.clearMarkers(b,b[c],1)}; +CKEDITOR.dom.element.clearMarkers=function(b,c,a){var f=c.getCustomData("list_marker_names"),e=c.getCustomData("list_marker_id"),d;for(d in f)c.removeCustomData(d);c.removeCustomData("list_marker_names");if(a){c.removeCustomData("list_marker_id");delete b[e]}}; +(function(){function b(a){for(var b=0,e=0,d=c[a].length;e]*>/g, +""):a},getOuterHtml:function(){if(this.$.outerHTML)return this.$.outerHTML.replace(/<\?[^>]*>/,"");var a=this.$.ownerDocument.createElement("div");a.appendChild(this.$.cloneNode(true));return a.innerHTML},getClientRect:function(){var a=CKEDITOR.tools.extend({},this.$.getBoundingClientRect());!a.width&&(a.width=a.right-a.left);!a.height&&(a.height=a.bottom-a.top);return a},setHtml:function(){var a=function(a){return this.$.innerHTML=a};return CKEDITOR.env.ie&&CKEDITOR.env.version<9?function(a){try{return this.$.innerHTML= +a}catch(b){this.$.innerHTML="";var c=new CKEDITOR.dom.element("body",this.getDocument());c.$.innerHTML=a;for(c=c.getChildren();c.count();)this.append(c.getItem(0));return a}}:a}(),setText:function(a){CKEDITOR.dom.element.prototype.setText=this.$.innerText!=void 0?function(a){return this.$.innerText=a}:function(a){return this.$.textContent=a};return this.setText(a)},getAttribute:function(){var a=function(a){return this.$.getAttribute(a,2)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)? +function(a){switch(a){case "class":a="className";break;case "http-equiv":a="httpEquiv";break;case "name":return this.$.name;case "tabindex":a=this.$.getAttribute(a,2);a!==0&&this.$.tabIndex===0&&(a=null);return a;case "checked":a=this.$.attributes.getNamedItem(a);return(a.specified?a.nodeValue:this.$.checked)?"checked":null;case "hspace":case "value":return this.$[a];case "style":return this.$.style.cssText;case "contenteditable":case "contentEditable":return this.$.attributes.getNamedItem("contentEditable").specified? +this.$.getAttribute("contentEditable"):null}return this.$.getAttribute(a,2)}:a}(),getChildren:function(){return new CKEDITOR.dom.nodeList(this.$.childNodes)},getComputedStyle:CKEDITOR.env.ie?function(a){return this.$.currentStyle[CKEDITOR.tools.cssStyleToDomStyle(a)]}:function(a){var b=this.getWindow().$.getComputedStyle(this.$,null);return b?b.getPropertyValue(a):""},getDtd:function(){var a=CKEDITOR.dtd[this.getName()];this.getDtd=function(){return a};return a},getElementsByTag:CKEDITOR.dom.document.prototype.getElementsByTag, +getTabIndex:CKEDITOR.env.ie?function(){var a=this.$.tabIndex;a===0&&(!CKEDITOR.dtd.$tabIndex[this.getName()]&&parseInt(this.getAttribute("tabindex"),10)!==0)&&(a=-1);return a}:CKEDITOR.env.webkit?function(){var a=this.$.tabIndex;if(a==void 0){a=parseInt(this.getAttribute("tabindex"),10);isNaN(a)&&(a=-1)}return a}:function(){return this.$.tabIndex},getText:function(){return this.$.textContent||this.$.innerText||""},getWindow:function(){return this.getDocument().getWindow()},getId:function(){return this.$.id|| +null},getNameAtt:function(){return this.$.name||null},getName:function(){var a=this.$.nodeName.toLowerCase();if(CKEDITOR.env.ie&&!(document.documentMode>8)){var b=this.$.scopeName;b!="HTML"&&(a=b.toLowerCase()+":"+a)}return(this.getName=function(){return a})()},getValue:function(){return this.$.value},getFirst:function(a){var b=this.$.firstChild;(b=b&&new CKEDITOR.dom.node(b))&&(a&&!a(b))&&(b=b.getNext(a));return b},getLast:function(a){var b=this.$.lastChild;(b=b&&new CKEDITOR.dom.node(b))&&(a&&!a(b))&& +(b=b.getPrevious(a));return b},getStyle:function(a){return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]},is:function(){var a=this.getName();if(typeof arguments[0]=="object")return!!arguments[0][a];for(var b=0;b0&&(b>2||!c[a[0].nodeName]||b==2&&!c[a[1].nodeName])},hasAttribute:function(){function a(a){a=this.$.attributes.getNamedItem(a); +return!(!a||!a.specified)}return CKEDITOR.env.ie&&CKEDITOR.env.version<8?function(b){return b=="name"?!!this.$.name:a.call(this,b)}:a}(),hide:function(){this.setStyle("display","none")},moveChildren:function(a,b){var c=this.$,a=a.$;if(c!=a){var d;if(b)for(;d=c.lastChild;)a.insertBefore(c.removeChild(d),a.firstChild);else for(;d=c.firstChild;)a.appendChild(c.removeChild(d))}},mergeSiblings:function(){function a(a,b,c){if(b&&b.type==CKEDITOR.NODE_ELEMENT){for(var g=[];b.data("cke-bookmark")||b.isEmptyInlineRemoveable();){g.push(b); +b=c?b.getNext():b.getPrevious();if(!b||b.type!=CKEDITOR.NODE_ELEMENT)return}if(a.isIdentical(b)){for(var k=c?a.getLast():a.getFirst();g.length;)g.shift().move(a,!c);b.moveChildren(a,!c);b.remove();k&&k.type==CKEDITOR.NODE_ELEMENT&&k.mergeSiblings()}}}return function(b){if(b===false||CKEDITOR.dtd.$removeEmpty[this.getName()]||this.is("a")){a(this,this.getNext(),true);a(this,this.getPrevious())}}}(),show:function(){this.setStyles({display:"",visibility:""})},setAttribute:function(){var a=function(a, +b){this.$.setAttribute(a,b);return this};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(b,c){b=="class"?this.$.className=c:b=="style"?this.$.style.cssText=c:b=="tabindex"?this.$.tabIndex=c:b=="checked"?this.$.checked=c:b=="contenteditable"?a.call(this,"contentEditable",c):a.apply(this,arguments);return this}:CKEDITOR.env.ie8Compat&&CKEDITOR.env.secure?function(b,c){if(b=="src"&&c.match(/^http:\/\//))try{a.apply(this,arguments)}catch(d){}else a.apply(this,arguments); +return this}:a}(),setAttributes:function(a){for(var b in a)this.setAttribute(b,a[b]);return this},setValue:function(a){this.$.value=a;return this},removeAttribute:function(){var a=function(a){this.$.removeAttribute(a)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(a){a=="class"?a="className":a=="tabindex"?a="tabIndex":a=="contenteditable"&&(a="contentEditable");this.$.removeAttribute(a)}:a}(),removeAttributes:function(a){if(CKEDITOR.tools.isArray(a))for(var b=0;b< +a.length;b++)this.removeAttribute(a[b]);else for(b in a)a.hasOwnProperty(b)&&this.removeAttribute(b)},removeStyle:function(a){var b=this.$.style;if(!b.removeProperty&&(a=="border"||a=="margin"||a=="padding")){var c=["top","left","right","bottom"],d;a=="border"&&(d=["color","style","width"]);for(var b=[],g=0;g=100?"":"progid:DXImageTransform.Microsoft.Alpha(opacity="+a+")")}else this.setStyle("opacity",a)},unselectable:function(){this.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select", +"none"));if(CKEDITOR.env.ie||CKEDITOR.env.opera){this.setAttribute("unselectable","on");for(var a,b=this.getElementsByTag("*"),c=0,d=b.count();c0)l(0,b===true?h:b===false?g:h<0?h:g);if(c&&(k<0||d>0))l(k<0?k:d,0)},setState:function(a,b,c){b=b||"cke";switch(a){case CKEDITOR.TRISTATE_ON:this.addClass(b+"_on");this.removeClass(b+"_off");this.removeClass(b+"_disabled");c&&this.setAttribute("aria-pressed",true);c&&this.removeAttribute("aria-disabled"); +break;case CKEDITOR.TRISTATE_DISABLED:this.addClass(b+"_disabled");this.removeClass(b+"_off");this.removeClass(b+"_on");c&&this.setAttribute("aria-disabled",true);c&&this.removeAttribute("aria-pressed");break;default:this.addClass(b+"_off");this.removeClass(b+"_on");this.removeClass(b+"_disabled");c&&this.removeAttribute("aria-pressed");c&&this.removeAttribute("aria-disabled")}},getFrameDocument:function(){var a=this.$;try{a.contentWindow.document}catch(b){a.src=a.src}return a&&new CKEDITOR.dom.document(a.contentWindow.document)}, +copyAttributes:function(a,b){for(var c=this.$.attributes,b=b||{},d=0;d=0&&b0&&c;)c=a(c,b.shift());else c=a(c,b);return c?new CKEDITOR.dom.node(c):null}}(),getChildCount:function(){return this.$.childNodes.length},disableContextMenu:function(){this.on("contextmenu", +function(a){a.data.getTarget().hasClass("cke_enable_context_menu")||a.data.preventDefault()})},getDirection:function(a){return a?this.getComputedStyle("direction")||this.getDirection()||this.getParent()&&this.getParent().getDirection(1)||this.getDocument().$.dir||"ltr":this.getStyle("direction")||this.getAttribute("dir")},data:function(a,b){a="data-"+a;if(b===void 0)return this.getAttribute(a);b===false?this.removeAttribute(a):this.setAttribute(a,b);return null},getEditor:function(){var a=CKEDITOR.instances, +b,c;for(b in a){c=a[b];if(c.element.equals(this)&&c.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO)return c}return null}});var c={width:["border-left-width","border-right-width","padding-left","padding-right"],height:["border-top-width","border-bottom-width","padding-top","padding-bottom"]};CKEDITOR.dom.element.prototype.setSize=function(a,c,e){if(typeof c=="number"){if(e&&(!CKEDITOR.env.ie||!CKEDITOR.env.quirks))c=c-b.call(this,a);this.setStyle(a,c+"px")}};CKEDITOR.dom.element.prototype.getSize=function(a, +c){var e=Math.max(this.$["offset"+CKEDITOR.tools.capitalize(a)],this.$["client"+CKEDITOR.tools.capitalize(a)])||0;c&&(e=e-b.call(this,a));return e}})();CKEDITOR.dom.documentFragment=function(b){b=b||CKEDITOR.document;this.$=b.type==CKEDITOR.NODE_DOCUMENT?b.$.createDocumentFragment():b}; +CKEDITOR.tools.extend(CKEDITOR.dom.documentFragment.prototype,CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,insertAfterNode:function(b){b=b.$;b.parentNode.insertBefore(this.$,b.nextSibling)}},!0,{append:1,appendBogus:1,getFirst:1,getLast:1,getParent:1,getNext:1,getPrevious:1,appendTo:1,moveChildren:1,insertBefore:1,insertAfterNode:1,replace:1,trim:1,type:1,ltrim:1,rtrim:1,getDocument:1,getChildCount:1,getChild:1,getChildren:1}); +(function(){function b(a,b){var c=this.range;if(this._.end)return null;if(!this._.start){this._.start=1;if(c.collapsed){this.end();return null}c.optimize()}var d,m=c.startContainer;d=c.endContainer;var n=c.startOffset,o=c.endOffset,i,q=this.guard,f=this.type,e=a?"getPreviousSourceNode":"getNextSourceNode";if(!a&&!this._.guardLTR){var j=d.type==CKEDITOR.NODE_ELEMENT?d:d.getParent(),s=d.type==CKEDITOR.NODE_ELEMENT?d.getChild(o):d.getNext();this._.guardLTR=function(a,b){return(!b||!j.equals(a))&&(!s|| +!a.equals(s))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}if(a&&!this._.guardRTL){var A=m.type==CKEDITOR.NODE_ELEMENT?m:m.getParent(),B=m.type==CKEDITOR.NODE_ELEMENT?n?m.getChild(n-1):null:m.getPrevious();this._.guardRTL=function(a,b){return(!b||!A.equals(a))&&(!B||!a.equals(B))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}var p=a?this._.guardRTL:this._.guardLTR;i=q?function(a,b){return p(a,b)===false?false:q(a,b)}:p;if(this.current)d=this.current[e](false,f,i);else{if(a)d.type== +CKEDITOR.NODE_ELEMENT&&(d=o>0?d.getChild(o-1):i(d,true)===false?null:d.getPreviousSourceNode(true,f,i));else{d=m;if(d.type==CKEDITOR.NODE_ELEMENT&&!(d=d.getChild(n)))d=i(m,true)===false?null:m.getNextSourceNode(true,f,i)}d&&i(d)===false&&(d=null)}for(;d&&!this._.end;){this.current=d;if(!this.evaluator||this.evaluator(d)!==false){if(!b)return d}else if(b&&this.evaluator)return false;d=d[e](false,f,i)}this.end();return this.current=null}function c(a){for(var c,d=null;c=b.call(this,a);)d=c;return d} +CKEDITOR.dom.walker=CKEDITOR.tools.createClass({$:function(a){this.range=a;this._={}},proto:{end:function(){this._.end=1},next:function(){return b.call(this)},previous:function(){return b.call(this,1)},checkForward:function(){return b.call(this,0,1)!==false},checkBackward:function(){return b.call(this,1,1)!==false},lastForward:function(){return c.call(this)},lastBackward:function(){return c.call(this,1)},reset:function(){delete this.current;this._={}}}});var a={block:1,"list-item":1,table:1,"table-row-group":1, +"table-header-group":1,"table-footer-group":1,"table-row":1,"table-column-group":1,"table-column":1,"table-cell":1,"table-caption":1};CKEDITOR.dom.element.prototype.isBlockBoundary=function(b){b=b?CKEDITOR.tools.extend({},CKEDITOR.dtd.$block,b||{}):CKEDITOR.dtd.$block;return this.getComputedStyle("float")=="none"&&a[this.getComputedStyle("display")]||b[this.getName()]};CKEDITOR.dom.walker.blockBoundary=function(a){return function(b){return!(b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary(a))}};CKEDITOR.dom.walker.listItemBoundary= +function(){return this.blockBoundary({br:1})};CKEDITOR.dom.walker.bookmark=function(a,b){function c(a){return a&&a.getName&&a.getName()=="span"&&a.data("cke-bookmark")}return function(d){var m,n;m=d&&d.type!=CKEDITOR.NODE_ELEMENT&&(n=d.getParent())&&c(n);m=a?m:m||c(d);return!!(b^m)}};CKEDITOR.dom.walker.whitespaces=function(a){return function(b){var c;b&&b.type==CKEDITOR.NODE_TEXT&&(c=!CKEDITOR.tools.trim(b.getText())||CKEDITOR.env.webkit&&b.getText()=="​");return!!(a^c)}};CKEDITOR.dom.walker.invisible= +function(a){var b=CKEDITOR.dom.walker.whitespaces();return function(c){if(b(c))c=1;else{c.type==CKEDITOR.NODE_TEXT&&(c=c.getParent());c=!c.$.offsetHeight}return!!(a^c)}};CKEDITOR.dom.walker.nodeType=function(a,b){return function(c){return!!(b^c.type==a)}};CKEDITOR.dom.walker.bogus=function(a){function b(a){return!e(a)&&!d(a)}return function(c){var d=!CKEDITOR.env.ie?c.is&&c.is("br"):c.getText&&f.test(c.getText());if(d){d=c.getParent();c=c.getNext(b);d=d.isBlockBoundary()&&(!c||c.type==CKEDITOR.NODE_ELEMENT&& +c.isBlockBoundary())}return!!(a^d)}};var f=/^[\t\r\n ]*(?: |\xa0)$/,e=CKEDITOR.dom.walker.whitespaces(),d=CKEDITOR.dom.walker.bookmark();CKEDITOR.dom.element.prototype.getBogus=function(){var a=this;do a=a.getPreviousSourceNode();while(d(a)||e(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in CKEDITOR.dtd.$inline&&!(a.getName()in CKEDITOR.dtd.$empty));return a&&(!CKEDITOR.env.ie?a.is&&a.is("br"):a.getText&&f.test(a.getText()))?a:false}})(); +CKEDITOR.dom.range=function(b){this.endOffset=this.endContainer=this.startOffset=this.startContainer=null;this.collapsed=true;var c=b instanceof CKEDITOR.dom.document;this.document=c?b:b.getDocument();this.root=c?b.getBody():b}; +(function(){function b(){var a=false,b=CKEDITOR.dom.walker.whitespaces(),o=CKEDITOR.dom.walker.bookmark(true),c=CKEDITOR.dom.walker.bogus();return function(q){if(o(q)||b(q))return true;if(c(q)&&!a)return a=true;return q.type==CKEDITOR.NODE_TEXT&&(q.hasAscendant("pre")||CKEDITOR.tools.trim(q.getText()).length)||q.type==CKEDITOR.NODE_ELEMENT&&!q.is(d)?false:true}}function c(a){var b=CKEDITOR.dom.walker.whitespaces(),o=CKEDITOR.dom.walker.bookmark(1);return function(c){return o(c)||b(c)?true:!a&&g(c)|| +c.type==CKEDITOR.NODE_ELEMENT&&c.is(CKEDITOR.dtd.$removeEmpty)}}function a(a){return!k(a)&&!h(a)}var f=function(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer.equals(a.endContainer)&&a.startOffset==a.endOffset},e=function(a,b,o,c){a.optimizeBookmark();var d=a.startContainer,g=a.endContainer,f=a.startOffset,j=a.endOffset,e,k;if(g.type==CKEDITOR.NODE_TEXT)g=g.split(j);else if(g.getChildCount()>0)if(j>=g.getChildCount()){g=g.append(a.document.createText(""));k=true}else g=g.getChild(j); +if(d.type==CKEDITOR.NODE_TEXT){d.split(f);d.equals(g)&&(g=d.getNext())}else if(f)if(f>=d.getChildCount()){d=d.append(a.document.createText(""));e=true}else d=d.getChild(f).getPrevious();else{d=d.append(a.document.createText(""),1);e=true}var f=d.getParents(),j=g.getParents(),h,p,l;for(h=0;h0&&!r.equals(g)&&(F=u.append(r.clone()));if(!f[o]||r.$.parentNode!=f[o].$.parentNode)for(r=r.getPrevious();r;){if(r.equals(f[o])||r.equals(d))break;v=r.getPrevious();if(b==2)u.$.insertBefore(r.$.cloneNode(true),u.$.firstChild);else{r.remove();b==1&&u.$.insertBefore(r.$,u.$.firstChild)}r=v}u&&(u=F)}if(b==2){p=a.startContainer;if(p.type==CKEDITOR.NODE_TEXT){p.$.data=p.$.data+p.$.nextSibling.data; +p.$.parentNode.removeChild(p.$.nextSibling)}a=a.endContainer;if(a.type==CKEDITOR.NODE_TEXT&&a.$.nextSibling){a.$.data=a.$.data+a.$.nextSibling.data;a.$.parentNode.removeChild(a.$.nextSibling)}}else{if(p&&l&&(d.$.parentNode!=p.$.parentNode||g.$.parentNode!=l.$.parentNode)){b=l.getIndex();e&&l.$.parentNode==d.$.parentNode&&b--;if(c&&p.type==CKEDITOR.NODE_ELEMENT){c=CKEDITOR.dom.element.createFromHtml(' ',a.document);c.insertAfter(p);p.mergeSiblings(false); +a.moveToBookmark({startNode:c})}else a.setStart(l.getParent(),b)}a.collapse(true)}e&&d.remove();k&&g.$.parentNode&&g.remove()},d={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1},g=CKEDITOR.dom.walker.bogus(),k=new CKEDITOR.dom.walker.whitespaces,h=new CKEDITOR.dom.walker.bookmark,l=/^[\t\r\n ]*(?: |\xa0)$/;CKEDITOR.dom.range.prototype={clone:function(){var a=new CKEDITOR.dom.range(this.root); +a.startContainer=this.startContainer;a.startOffset=this.startOffset;a.endContainer=this.endContainer;a.endOffset=this.endOffset;a.collapsed=this.collapsed;return a},collapse:function(a){if(a){this.endContainer=this.startContainer;this.endOffset=this.startOffset}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset}this.collapsed=true},cloneContents:function(){var a=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||e(this,2,a);return a},deleteContents:function(a){this.collapsed|| +e(this,0,null,a)},extractContents:function(a){var b=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||e(this,1,b,a);return b},createBookmark:function(a){var b,o,c,d,g=this.collapsed;b=this.document.createElement("span");b.data("cke-bookmark",1);b.setStyle("display","none");b.setHtml(" ");if(a){c="cke_bm_"+CKEDITOR.tools.getNextNumber();b.setAttribute("id",c+(g?"C":"S"))}if(!g){o=b.clone();o.setHtml(" ");a&&o.setAttribute("id",c+"E");d=this.clone();d.collapse();d.insertNode(o)}d= +this.clone();d.collapse(true);d.insertNode(b);if(o){this.setStartAfter(b);this.setEndBefore(o)}else this.moveToPosition(b,CKEDITOR.POSITION_AFTER_END);return{startNode:a?c+(g?"C":"S"):b,endNode:a?c+"E":o,serializable:a,collapsed:g}},createBookmark2:function(a){var b=this.startContainer,o=this.endContainer,c=this.startOffset,d=this.endOffset,g=this.collapsed,f,j;if(!b||!o)return{start:0,end:0};if(a){if(b.type==CKEDITOR.NODE_ELEMENT){if((f=b.getChild(c))&&f.type==CKEDITOR.NODE_TEXT&&c>0&&f.getPrevious().type== +CKEDITOR.NODE_TEXT){b=f;c=0}f&&f.type==CKEDITOR.NODE_ELEMENT&&(c=f.getIndex(1))}for(;b.type==CKEDITOR.NODE_TEXT&&(j=b.getPrevious())&&j.type==CKEDITOR.NODE_TEXT;){b=j;c=c+j.getLength()}if(!g){if(o.type==CKEDITOR.NODE_ELEMENT){if((f=o.getChild(d))&&f.type==CKEDITOR.NODE_TEXT&&d>0&&f.getPrevious().type==CKEDITOR.NODE_TEXT){o=f;d=0}f&&f.type==CKEDITOR.NODE_ELEMENT&&(d=f.getIndex(1))}for(;o.type==CKEDITOR.NODE_TEXT&&(j=o.getPrevious())&&j.type==CKEDITOR.NODE_TEXT;){o=j;d=d+j.getLength()}}}return{start:b.getAddress(a), +end:g?null:o.getAddress(a),startOffset:c,endOffset:d,normalized:a,collapsed:g,is2:true}},moveToBookmark:function(a){if(a.is2){var b=this.document.getByAddress(a.start,a.normalized),c=a.startOffset,i=a.end&&this.document.getByAddress(a.end,a.normalized),a=a.endOffset;this.setStart(b,c);i?this.setEnd(i,a):this.collapse(true)}else{b=(c=a.serializable)?this.document.getById(a.startNode):a.startNode;a=c?this.document.getById(a.endNode):a.endNode;this.setStartBefore(b);b.remove();if(a){this.setEndBefore(a); +a.remove()}else this.collapse(true)}},getBoundaryNodes:function(){var a=this.startContainer,b=this.endContainer,c=this.startOffset,i=this.endOffset,d;if(a.type==CKEDITOR.NODE_ELEMENT){d=a.getChildCount();if(d>c)a=a.getChild(c);else if(d<1)a=a.getPreviousSourceNode();else{for(a=a.$;a.lastChild;)a=a.lastChild;a=new CKEDITOR.dom.node(a);a=a.getNextSourceNode()||a}}if(b.type==CKEDITOR.NODE_ELEMENT){d=b.getChildCount();if(d>i)b=b.getChild(i).getPreviousSourceNode(true);else if(d<1)b=b.getPreviousSourceNode(); +else{for(b=b.$;b.lastChild;)b=b.lastChild;b=new CKEDITOR.dom.node(b)}}a.getPosition(b)&CKEDITOR.POSITION_FOLLOWING&&(a=b);return{startNode:a,endNode:b}},getCommonAncestor:function(a,b){var c=this.startContainer,i=this.endContainer,c=c.equals(i)?a&&c.type==CKEDITOR.NODE_ELEMENT&&this.startOffset==this.endOffset-1?c.getChild(this.startOffset):c:c.getCommonAncestor(i);return b&&!c.is?c.getParent():c},optimize:function(){var a=this.startContainer,b=this.startOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>= +a.getLength()&&this.setStartAfter(a):this.setStartBefore(a));a=this.endContainer;b=this.endOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setEndAfter(a):this.setEndBefore(a))},optimizeBookmark:function(){var a=this.startContainer,b=this.endContainer;a.is&&(a.is("span")&&a.data("cke-bookmark"))&&this.setStartAt(a,CKEDITOR.POSITION_BEFORE_START);b&&(b.is&&b.is("span")&&b.data("cke-bookmark"))&&this.setEndAt(b,CKEDITOR.POSITION_AFTER_END)},trim:function(a,b){var c=this.startContainer, +i=this.startOffset,d=this.collapsed;if((!a||d)&&c&&c.type==CKEDITOR.NODE_TEXT){if(i)if(i>=c.getLength()){i=c.getIndex()+1;c=c.getParent()}else{var g=c.split(i),i=c.getIndex()+1,c=c.getParent();if(this.startContainer.equals(this.endContainer))this.setEnd(g,this.endOffset-this.startOffset);else if(c.equals(this.endContainer))this.endOffset=this.endOffset+1}else{i=c.getIndex();c=c.getParent()}this.setStart(c,i);if(d){this.collapse(true);return}}c=this.endContainer;i=this.endOffset;if(!b&&!d&&c&&c.type== +CKEDITOR.NODE_TEXT){if(i){i>=c.getLength()||c.split(i);i=c.getIndex()+1}else i=c.getIndex();c=c.getParent();this.setEnd(c,i)}},enlarge:function(a,b){switch(a){case CKEDITOR.ENLARGE_INLINE:var c=1;case CKEDITOR.ENLARGE_ELEMENT:if(this.collapsed)break;var i=this.getCommonAncestor(),d=this.root,g,f,j,e,h,k=false,p,l;p=this.startContainer;l=this.startOffset;if(p.type==CKEDITOR.NODE_TEXT){if(l){p=!CKEDITOR.tools.trim(p.substring(0,l)).length&&p;k=!!p}if(p&&!(e=p.getPrevious()))j=p.getParent()}else{l&& +(e=p.getChild(l-1)||p.getLast());e||(j=p)}for(;j||e;){if(j&&!e){!h&&j.equals(i)&&(h=true);if(c?j.isBlockBoundary():!d.contains(j))break;if(!k||j.getComputedStyle("display")!="inline"){k=false;h?g=j:this.setStartBefore(j)}e=j.getPrevious()}for(;e;){p=false;if(e.type==CKEDITOR.NODE_COMMENT)e=e.getPrevious();else{if(e.type==CKEDITOR.NODE_TEXT){l=e.getText();/[^\s\ufeff]/.test(l)&&(e=null);p=/[\s\ufeff]$/.test(l)}else if((e.$.offsetWidth>0||b&&e.is("br"))&&!e.data("cke-bookmark"))if(k&&CKEDITOR.dtd.$removeEmpty[e.getName()]){l= +e.getText();if(/[^\s\ufeff]/.test(l))e=null;else for(var u=e.$.getElementsByTagName("*"),r=0,F;F=u[r++];)if(!CKEDITOR.dtd.$removeEmpty[F.nodeName.toLowerCase()]){e=null;break}e&&(p=!!l.length)}else e=null;p&&(k?h?g=j:j&&this.setStartBefore(j):k=true);if(e){p=e.getPrevious();if(!j&&!p){j=e;e=null;break}e=p}else j=null}}j&&(j=j.getParent())}p=this.endContainer;l=this.endOffset;j=e=null;h=k=false;if(p.type==CKEDITOR.NODE_TEXT){p=!CKEDITOR.tools.trim(p.substring(l)).length&&p;k=!(p&&p.getLength());if(p&& +!(e=p.getNext()))j=p.getParent()}else(e=p.getChild(l))||(j=p);for(;j||e;){if(j&&!e){!h&&j.equals(i)&&(h=true);if(c?j.isBlockBoundary():!d.contains(j))break;if(!k||j.getComputedStyle("display")!="inline"){k=false;h?f=j:j&&this.setEndAfter(j)}e=j.getNext()}for(;e;){p=false;if(e.type==CKEDITOR.NODE_TEXT){l=e.getText();/[^\s\ufeff]/.test(l)&&(e=null);p=/^[\s\ufeff]/.test(l)}else if(e.type==CKEDITOR.NODE_ELEMENT){if((e.$.offsetWidth>0||b&&e.is("br"))&&!e.data("cke-bookmark"))if(k&&CKEDITOR.dtd.$removeEmpty[e.getName()]){l= +e.getText();if(/[^\s\ufeff]/.test(l))e=null;else{u=e.$.getElementsByTagName("*");for(r=0;F=u[r++];)if(!CKEDITOR.dtd.$removeEmpty[F.nodeName.toLowerCase()]){e=null;break}}e&&(p=!!l.length)}else e=null}else p=1;p&&k&&(h?f=j:this.setEndAfter(j));if(e){p=e.getNext();if(!j&&!p){j=e;e=null;break}e=p}else j=null}j&&(j=j.getParent())}if(g&&f){i=g.contains(f)?f:g;this.setStartBefore(i);this.setEndAfter(i)}break;case CKEDITOR.ENLARGE_BLOCK_CONTENTS:case CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:j=new CKEDITOR.dom.range(this.root); +d=this.root;j.setStartAt(d,CKEDITOR.POSITION_AFTER_START);j.setEnd(this.startContainer,this.startOffset);j=new CKEDITOR.dom.walker(j);var v,t,w=CKEDITOR.dom.walker.blockBoundary(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?{br:1}:null),I=function(a){var b=w(a);b||(v=a);return b},c=function(a){var b=I(a);!b&&(a.is&&a.is("br"))&&(t=a);return b};j.guard=I;j=j.lastBackward();v=v||d;this.setStartAt(v,!v.is("br")&&(!j&&this.checkStartOfBlock()||j&&v.contains(j))?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_AFTER_END); +if(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS){j=this.clone();j=new CKEDITOR.dom.walker(j);var G=CKEDITOR.dom.walker.whitespaces(),C=CKEDITOR.dom.walker.bookmark();j.evaluator=function(a){return!G(a)&&!C(a)};if((j=j.previous())&&j.type==CKEDITOR.NODE_ELEMENT&&j.is("br"))break}j=this.clone();j.collapse();j.setEndAt(d,CKEDITOR.POSITION_BEFORE_END);j=new CKEDITOR.dom.walker(j);j.guard=a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?c:I;v=null;j=j.lastForward();v=v||d;this.setEndAt(v,!j&&this.checkEndOfBlock()||j&& +v.contains(j)?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_BEFORE_START);t&&this.setEndAfter(t)}},shrink:function(a,b,c){if(!this.collapsed){var a=a||CKEDITOR.SHRINK_TEXT,i=this.clone(),d=this.startContainer,g=this.endContainer,f=this.startOffset,e=this.endOffset,k=1,h=1;if(d&&d.type==CKEDITOR.NODE_TEXT)if(f)if(f>=d.getLength())i.setStartAfter(d);else{i.setStartBefore(d);k=0}else i.setStartBefore(d);if(g&&g.type==CKEDITOR.NODE_TEXT)if(e)if(e>=g.getLength())i.setEndAfter(g);else{i.setEndAfter(g); +h=0}else i.setEndBefore(g);var i=new CKEDITOR.dom.walker(i),l=CKEDITOR.dom.walker.bookmark();i.evaluator=function(b){return b.type==(a==CKEDITOR.SHRINK_ELEMENT?CKEDITOR.NODE_ELEMENT:CKEDITOR.NODE_TEXT)};var p;i.guard=function(b,i){if(l(b))return true;if(a==CKEDITOR.SHRINK_ELEMENT&&b.type==CKEDITOR.NODE_TEXT||i&&b.equals(p)||c===false&&b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary())return false;!i&&b.type==CKEDITOR.NODE_ELEMENT&&(p=b);return true};if(k)(d=i[a==CKEDITOR.SHRINK_ELEMENT?"lastForward": +"next"]())&&this.setStartAt(d,b?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_START);if(h){i.reset();(i=i[a==CKEDITOR.SHRINK_ELEMENT?"lastBackward":"previous"]())&&this.setEndAt(i,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_END)}return!(!k&&!h)}},insertNode:function(a){this.optimizeBookmark();this.trim(false,true);var b=this.startContainer,c=b.getChild(this.startOffset);c?a.insertBefore(c):b.append(a);a.getParent()&&a.getParent().equals(this.endContainer)&&this.endOffset++;this.setStartBefore(a)}, +moveToPosition:function(a,b){this.setStartAt(a,b);this.collapse(true)},moveToRange:function(a){this.setStart(a.startContainer,a.startOffset);this.setEnd(a.endContainer,a.endOffset)},selectNodeContents:function(a){this.setStart(a,0);this.setEnd(a,a.type==CKEDITOR.NODE_TEXT?a.getLength():a.getChildCount())},setStart:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex();a=a.getParent()}this.startContainer=a;this.startOffset=b;if(!this.endContainer){this.endContainer= +a;this.endOffset=b}f(this)},setEnd:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex()+1;a=a.getParent()}this.endContainer=a;this.endOffset=b;if(!this.startContainer){this.startContainer=a;this.startOffset=b}f(this)},setStartAfter:function(a){this.setStart(a.getParent(),a.getIndex()+1)},setStartBefore:function(a){this.setStart(a.getParent(),a.getIndex())},setEndAfter:function(a){this.setEnd(a.getParent(),a.getIndex()+1)},setEndBefore:function(a){this.setEnd(a.getParent(), +a.getIndex())},setStartAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setStart(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==CKEDITOR.NODE_TEXT?this.setStart(a,a.getLength()):this.setStart(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setStartBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setStartAfter(a)}f(this)},setEndAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setEnd(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type== +CKEDITOR.NODE_TEXT?this.setEnd(a,a.getLength()):this.setEnd(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setEndBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setEndAfter(a)}f(this)},fixBlock:function(a,b){var c=this.createBookmark(),i=this.document.createElement(b);this.collapse(a);this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);this.extractContents().appendTo(i);i.trim();CKEDITOR.env.ie||i.appendBogus();this.insertNode(i);this.moveToBookmark(c);return i},splitBlock:function(a){var b= +new CKEDITOR.dom.elementPath(this.startContainer,this.root),c=new CKEDITOR.dom.elementPath(this.endContainer,this.root),i=b.block,d=c.block,g=null;if(!b.blockLimit.equals(c.blockLimit))return null;if(a!="br"){if(!i){i=this.fixBlock(true,a);d=(new CKEDITOR.dom.elementPath(this.endContainer,this.root)).block}d||(d=this.fixBlock(false,a))}a=i&&this.checkStartOfBlock();b=d&&this.checkEndOfBlock();this.deleteContents();if(i&&i.equals(d))if(b){g=new CKEDITOR.dom.elementPath(this.startContainer,this.root); +this.moveToPosition(d,CKEDITOR.POSITION_AFTER_END);d=null}else if(a){g=new CKEDITOR.dom.elementPath(this.startContainer,this.root);this.moveToPosition(i,CKEDITOR.POSITION_BEFORE_START);i=null}else{d=this.splitElement(i);!CKEDITOR.env.ie&&!i.is("ul","ol")&&i.appendBogus()}return{previousBlock:i,nextBlock:d,wasStartOfBlock:a,wasEndOfBlock:b,elementPath:g}},splitElement:function(a){if(!this.collapsed)return null;this.setEndAt(a,CKEDITOR.POSITION_BEFORE_END);var b=this.extractContents(),c=a.clone(false); +b.appendTo(c);c.insertAfter(a);this.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);return c},removeEmptyBlocksAtEnd:function(){function a(d){return function(a){return b(a)||(c(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.isEmptyInlineRemoveable())||d.is("table")&&a.is("caption")?false:true}}var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(false);return function(b){for(var c=this.createBookmark(),o=this[b?"endPath":"startPath"](),d=o.block||o.blockLimit,n;d&&!d.equals(o.root)&&!d.getFirst(a(d));){n= +d.getParent();this[b?"setEndAt":"setStartAt"](d,CKEDITOR.POSITION_AFTER_END);d.remove(1);d=n}this.moveToBookmark(c)}}(),startPath:function(){return new CKEDITOR.dom.elementPath(this.startContainer,this.root)},endPath:function(){return new CKEDITOR.dom.elementPath(this.endContainer,this.root)},checkBoundaryOfElement:function(a,b){var o=b==CKEDITOR.START,d=this.clone();d.collapse(o);d[o?"setStartAt":"setEndAt"](a,o?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END);d=new CKEDITOR.dom.walker(d); +d.evaluator=c(o);return d[o?"checkBackward":"checkForward"]()},checkStartOfBlock:function(){var a=this.startContainer,c=this.startOffset;if(CKEDITOR.env.ie&&c&&a.type==CKEDITOR.NODE_TEXT){a=CKEDITOR.tools.ltrim(a.substring(0,c));l.test(a)&&this.trim(0,1)}this.trim();a=new CKEDITOR.dom.elementPath(this.startContainer,this.root);c=this.clone();c.collapse(true);c.setStartAt(a.block||a.blockLimit,CKEDITOR.POSITION_AFTER_START);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkBackward()},checkEndOfBlock:function(){var a= +this.endContainer,c=this.endOffset;if(CKEDITOR.env.ie&&a.type==CKEDITOR.NODE_TEXT){a=CKEDITOR.tools.rtrim(a.substring(c));l.test(a)&&this.trim(1,0)}this.trim();a=new CKEDITOR.dom.elementPath(this.endContainer,this.root);c=this.clone();c.collapse(false);c.setEndAt(a.block||a.blockLimit,CKEDITOR.POSITION_BEFORE_END);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkForward()},getPreviousNode:function(a,b,c){var d=this.clone();d.collapse(1);d.setStartAt(c||this.root,CKEDITOR.POSITION_AFTER_START); +c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.previous()},getNextNode:function(a,b,c){var d=this.clone();d.collapse();d.setEndAt(c||this.root,CKEDITOR.POSITION_BEFORE_END);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.next()},checkReadOnly:function(){function a(b,c){for(;b;){if(b.type==CKEDITOR.NODE_ELEMENT){if(b.getAttribute("contentEditable")=="false"&&!b.data("cke-editable"))return 0;if(b.is("html")||b.getAttribute("contentEditable")=="true"&&(b.contains(c)||b.equals(c)))break}b= +b.getParent()}return 1}return function(){var b=this.startContainer,c=this.endContainer;return!(a(b,c)&&a(c,b))}}(),moveToElementEditablePosition:function(b,c){if(b.type==CKEDITOR.NODE_ELEMENT&&!b.isEditable(false)){this.moveToPosition(b,c?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);return true}for(var o=0;b;){if(b.type==CKEDITOR.NODE_TEXT){c&&this.checkEndOfBlock()&&l.test(b.getText())?this.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START):this.moveToPosition(b,c?CKEDITOR.POSITION_AFTER_END: +CKEDITOR.POSITION_BEFORE_START);o=1;break}if(b.type==CKEDITOR.NODE_ELEMENT)if(b.isEditable()){this.moveToPosition(b,c?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_START);o=1}else c&&(b.is("br")&&this.checkEndOfBlock())&&this.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START);var d=b,g=o,f=void 0;d.type==CKEDITOR.NODE_ELEMENT&&d.isEditable(false)&&(f=d[c?"getLast":"getFirst"](a));!g&&!f&&(f=d[c?"getPrevious":"getNext"](a));b=f}return!!o},moveToElementEditStart:function(a){return this.moveToElementEditablePosition(a)}, +moveToElementEditEnd:function(a){return this.moveToElementEditablePosition(a,true)},getEnclosedNode:function(){var a=this.clone();a.optimize();if(a.startContainer.type!=CKEDITOR.NODE_ELEMENT||a.endContainer.type!=CKEDITOR.NODE_ELEMENT)return null;var a=new CKEDITOR.dom.walker(a),b=CKEDITOR.dom.walker.bookmark(false,true),c=CKEDITOR.dom.walker.whitespaces(true);a.evaluator=function(a){return c(a)&&b(a)};var d=a.next();a.reset();return d&&d.equals(a.previous())?d:null},getTouchedStartNode:function(){var a= +this.startContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.startOffset)||a},getTouchedEndNode:function(){var a=this.endContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.endOffset-1)||a},scrollIntoView:function(){var a=new CKEDITOR.dom.element.createFromHtml(" ",this.document),b,c,d,g=this.clone();g.optimize();if(d=g.startContainer.type==CKEDITOR.NODE_TEXT){c=g.startContainer.getText();b=g.startContainer.split(g.startOffset); +a.insertAfter(g.startContainer)}else g.insertNode(a);a.scrollIntoView();if(d){g.startContainer.setText(c);b.remove()}a.remove()}}})();CKEDITOR.POSITION_AFTER_START=1;CKEDITOR.POSITION_BEFORE_END=2;CKEDITOR.POSITION_BEFORE_START=3;CKEDITOR.POSITION_AFTER_END=4;CKEDITOR.ENLARGE_ELEMENT=1;CKEDITOR.ENLARGE_BLOCK_CONTENTS=2;CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS=3;CKEDITOR.ENLARGE_INLINE=4;CKEDITOR.START=1;CKEDITOR.END=2;CKEDITOR.SHRINK_ELEMENT=1;CKEDITOR.SHRINK_TEXT=2; +(function(){function b(a){if(!(arguments.length<1)){this.range=a;this.forceBrBreak=0;this.enlargeBr=1;this.enforceRealBlocks=0;this._||(this._={})}}function c(a,b,c){for(a=a.getNextSourceNode(b,null,c);!f(a);)a=a.getNextSourceNode(b,null,c);return a}var a=/^[\r\n\t ]+$/,f=CKEDITOR.dom.walker.bookmark(false,true),e=CKEDITOR.dom.walker.whitespaces(true),d=function(a){return f(a)&&e(a)};b.prototype={getNextParagraph:function(b){b=b||"p";if(!CKEDITOR.dtd[this.range.root.getName()][b])return null;var e, +h,l,m,n,o;if(!this._.started){h=this.range.clone();h.shrink(CKEDITOR.NODE_ELEMENT,true);m=h.endContainer.hasAscendant("pre",true)||h.startContainer.hasAscendant("pre",true);h.enlarge(this.forceBrBreak&&!m||!this.enlargeBr?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS);if(!h.collapsed){m=new CKEDITOR.dom.walker(h.clone());var i=CKEDITOR.dom.walker.bookmark(true,true);m.evaluator=i;this._.nextNode=m.next();m=new CKEDITOR.dom.walker(h.clone());m.evaluator=i;m=m.previous();this._.lastNode= +m.getNextSourceNode(true);if(this._.lastNode&&this._.lastNode.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(this._.lastNode.getText())&&this._.lastNode.getParent().isBlockBoundary()){i=this.range.clone();i.moveToPosition(this._.lastNode,CKEDITOR.POSITION_AFTER_END);if(i.checkEndOfBlock()){i=new CKEDITOR.dom.elementPath(i.endContainer,i.root);this._.lastNode=(i.block||i.blockLimit).getNextSourceNode(true)}}if(!this._.lastNode){this._.lastNode=this._.docEndMarker=h.document.createText("");this._.lastNode.insertAfter(m)}h= +null}this._.started=1}i=this._.nextNode;m=this._.lastNode;for(this._.nextNode=null;i;){var q=0,y=i.hasAscendant("pre"),z=i.type!=CKEDITOR.NODE_ELEMENT,j=0;if(z)i.type==CKEDITOR.NODE_TEXT&&a.test(i.getText())&&(z=0);else{var s=i.getName();if(i.isBlockBoundary(this.forceBrBreak&&!y&&{br:1})){if(s=="br")z=1;else if(!h&&!i.getChildCount()&&s!="hr"){e=i;l=i.equals(m);break}if(h){h.setEndAt(i,CKEDITOR.POSITION_BEFORE_START);if(s!="br")this._.nextNode=i}q=1}else{if(i.getFirst()){if(!h){h=this.range.clone(); +h.setStartAt(i,CKEDITOR.POSITION_BEFORE_START)}i=i.getFirst();continue}z=1}}if(z&&!h){h=this.range.clone();h.setStartAt(i,CKEDITOR.POSITION_BEFORE_START)}l=(!q||z)&&i.equals(m);if(h&&!q)for(;!i.getNext(d)&&!l;){s=i.getParent();if(s.isBlockBoundary(this.forceBrBreak&&!y&&{br:1})){q=1;z=0;l||s.equals(m);h.setEndAt(s,CKEDITOR.POSITION_BEFORE_END);break}i=s;z=1;l=i.equals(m);j=1}z&&h.setEndAt(i,CKEDITOR.POSITION_AFTER_END);i=c(i,j,m);if((l=!i)||q&&h)break}if(!e){if(!h){this._.docEndMarker&&this._.docEndMarker.remove(); +return this._.nextNode=null}e=new CKEDITOR.dom.elementPath(h.startContainer,h.root);i=e.blockLimit;q={div:1,th:1,td:1};e=e.block;if(!e&&i&&!this.enforceRealBlocks&&q[i.getName()]&&h.checkStartOfBlock()&&h.checkEndOfBlock()&&!i.equals(h.root))e=i;else if(!e||this.enforceRealBlocks&&e.getName()=="li"){e=this.range.document.createElement(b);h.extractContents().appendTo(e);e.trim();h.insertNode(e);n=o=true}else if(e.getName()!="li"){if(!h.checkStartOfBlock()||!h.checkEndOfBlock()){e=e.clone(false);h.extractContents().appendTo(e); +e.trim();o=h.splitBlock();n=!o.wasStartOfBlock;o=!o.wasEndOfBlock;h.insertNode(e)}}else if(!l)this._.nextNode=e.equals(m)?null:c(h.getBoundaryNodes().endNode,1,m)}if(n)(h=e.getPrevious())&&h.type==CKEDITOR.NODE_ELEMENT&&(h.getName()=="br"?h.remove():h.getLast()&&h.getLast().$.nodeName.toLowerCase()=="br"&&h.getLast().remove());if(o)(h=e.getLast())&&h.type==CKEDITOR.NODE_ELEMENT&&h.getName()=="br"&&(CKEDITOR.env.ie||h.getPrevious(f)||h.getNext(f))&&h.remove();if(!this._.nextNode)this._.nextNode=l|| +e.equals(m)||!m?null:c(e,1,m);return e}};CKEDITOR.dom.range.prototype.createIterator=function(){return new b(this)}})(); +CKEDITOR.command=function(b,c){this.uiItems=[];this.exec=function(a){if(this.state==CKEDITOR.TRISTATE_DISABLED)return false;this.editorFocus&&b.focus();return this.fire("exec")===false?true:c.exec.call(this,b,a)!==false};this.refresh=function(a,b){if(!this.readOnly&&a.readOnly)return true;if(this.context&&!b.isContextFor(this.context)){this.disable();return true}this.enable();return this.fire("refresh",{editor:a,path:b})===false?true:c.refresh&&c.refresh.apply(this,arguments)!==false};CKEDITOR.tools.extend(this, +c,{modes:{wysiwyg:1},editorFocus:1,contextSensitive:!!c.context,state:CKEDITOR.TRISTATE_OFF});CKEDITOR.event.call(this)}; +CKEDITOR.command.prototype={enable:function(){this.state==CKEDITOR.TRISTATE_DISABLED&&this.setState(!this.preserveState||typeof this.previousState=="undefined"?CKEDITOR.TRISTATE_OFF:this.previousState)},disable:function(){this.setState(CKEDITOR.TRISTATE_DISABLED)},setState:function(b){if(this.state==b)return false;this.previousState=this.state;this.state=b;this.fire("state");return true},toggleState:function(){this.state==CKEDITOR.TRISTATE_OFF?this.setState(CKEDITOR.TRISTATE_ON):this.state==CKEDITOR.TRISTATE_ON&& +this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.event.implementOn(CKEDITOR.command.prototype,!0);CKEDITOR.ENTER_P=1;CKEDITOR.ENTER_BR=2;CKEDITOR.ENTER_DIV=3; +CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:"",bodyId:"",bodyClass:"",fullPage:!1,height:200,extraPlugins:"",removePlugins:"",protectedSource:[],tabIndex:0,width:"",baseFloatZIndex:1E4,blockedKeystrokes:[CKEDITOR.CTRL+66,CKEDITOR.CTRL+73,CKEDITOR.CTRL+85]}; +(function(){CKEDITOR.focusManager=function(b){if(b.focusManager)return b.focusManager;this.hasFocus=false;this.currentActive=null;this._={editor:b};return this};CKEDITOR.focusManager._={blurDelay:200};CKEDITOR.focusManager.prototype={focus:function(){this._.timer&&clearTimeout(this._.timer);if(!this.hasFocus&&!this._.locked){var b=CKEDITOR.currentInstance;b&&b.focusManager.blur(1);this.hasFocus=true;(b=this._.editor.container)&&b.addClass("cke_focus");this._.editor.fire("focus")}},lock:function(){this._.locked= +1},unlock:function(){delete this._.locked},blur:function(b){function c(){if(this.hasFocus){this.hasFocus=false;var a=this._.editor.container;a&&a.removeClass("cke_focus");this._.editor.fire("blur")}}if(!this._.locked){this._.timer&&clearTimeout(this._.timer);var a=CKEDITOR.focusManager._.blurDelay;b||!a?c.call(this):this._.timer=CKEDITOR.tools.setTimeout(function(){delete this._.timer;c.call(this)},a,this)}},add:function(b,c){var a=b.getCustomData("focusmanager");if(!a||a!=this){a&&a.remove(b);var a= +"focus",f="blur";if(c)if(CKEDITOR.env.ie){a="focusin";f="focusout"}else CKEDITOR.event.useCapture=1;var e={blur:function(){b.equals(this.currentActive)&&this.blur()},focus:function(){this.currentActive=b;this.focus()}};b.on(a,e.focus,this);b.on(f,e.blur,this);if(c)CKEDITOR.event.useCapture=0;b.setCustomData("focusmanager",this);b.setCustomData("focusmanager_handlers",e)}},remove:function(b){b.removeCustomData("focusmanager");var c=b.removeCustomData("focusmanager_handlers");b.removeListener("blur", +c.blur);b.removeListener("focus",c.focus)}}})();CKEDITOR.keystrokeHandler=function(b){if(b.keystrokeHandler)return b.keystrokeHandler;this.keystrokes={};this.blockedKeystrokes={};this._={editor:b};return this}; +(function(){var b,c=function(a){var a=a.data,c=a.getKeystroke(),d=this.keystrokes[c],g=this._.editor;b=g.fire("key",{keyCode:c})===false;if(!b){d&&(b=g.execCommand(d,{from:"keystrokeHandler"})!==false);b||(b=!!this.blockedKeystrokes[c])}b&&a.preventDefault(true);return!b},a=function(a){if(b){b=false;a.data.preventDefault(true)}};CKEDITOR.keystrokeHandler.prototype={attach:function(b){b.on("keydown",c,this);if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)b.on("keypress",a,this)}}})(); +(function(){CKEDITOR.lang={languages:{af:1,ar:1,bg:1,bn:1,bs:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,"en-au":1,"en-ca":1,"en-gb":1,en:1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,"fr-ca":1,fr:1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,is:1,it:1,ja:1,ka:1,km:1,ko:1,ku:1,lt:1,lv:1,mn:1,ms:1,nb:1,nl:1,no:1,pl:1,"pt-br":1,pt:1,ro:1,ru:1,sk:1,sl:1,"sr-latn":1,sr:1,sv:1,th:1,tr:1,uk:1,vi:1,"zh-cn":1,zh:1},load:function(b,c,a){if(!b||!CKEDITOR.lang.languages[b])b=this.detect(c,b);this[b]?a(b,this[b]):CKEDITOR.scriptLoader.load(CKEDITOR.getUrl("lang/"+ +b+".js"),function(){a(b,this[b])},this)},detect:function(b,c){var a=this.languages,c=c||navigator.userLanguage||navigator.language||b,f=c.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),e=f[1],f=f[2];a[e+"-"+f]?e=e+"-"+f:a[e]||(e=null);CKEDITOR.lang.detect=e?function(){return e}:function(a){return a};return e||b}}})(); +CKEDITOR.scriptLoader=function(){var b={},c={};return{load:function(a,f,e,d){var g=typeof a=="string";g&&(a=[a]);e||(e=CKEDITOR);var k=a.length,h=[],l=[],m=function(a){f&&(g?f.call(e,a):f.call(e,h,l))};if(k===0)m(true);else{var n=function(a,b){(b?h:l).push(a);if(--k<=0){d&&CKEDITOR.document.getDocumentElement().removeStyle("cursor");m(b)}},o=function(a,o){b[a]=1;var d=c[a];delete c[a];for(var i=0;i +1)){var i=new CKEDITOR.dom.element("script");i.setAttributes({type:"text/javascript",src:a});if(f)if(CKEDITOR.env.ie)i.$.onreadystatechange=function(){if(i.$.readyState=="loaded"||i.$.readyState=="complete"){i.$.onreadystatechange=null;o(a,true)}};else{i.$.onload=function(){setTimeout(function(){o(a,true)},0)};i.$.onerror=function(){o(a,false)}}i.appendTo(CKEDITOR.document.getHead())}}};d&&CKEDITOR.document.getDocumentElement().setStyle("cursor","wait");for(var q=0;q=0)q=a.langCode;else{q=a.langCode.replace(/-.*/,"");q=q!=a.langCode&&CKEDITOR.tools.indexOf(h,q)>=0?q:CKEDITOR.tools.indexOf(h,"en")>=0?"en":h[0]}if(!j.langEntries||!j.langEntries[q])e.push(CKEDITOR.getUrl(j.path+"lang/"+q+".js"));else{a.lang[f]=j.langEntries[q];q=null}}n.push(q);d.push(j)}CKEDITOR.scriptLoader.load(e,function(){for(var c=["beforeInit","init","afterInit"],e=0;e]+)>)|(?:!--([\\S|\\s]*?)--\>)|(?:([^\\s>]+)\\s*((?:(?:\"[^\"]*\")|(?:'[^']*')|[^\"'>])*)\\/?>))","g")}}; +(function(){var b=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,c={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};CKEDITOR.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(a){for(var f,e,d=0,g;f=this._.htmlPartsRegex.exec(a);){e=f.index;if(e>d){d=a.substring(d,e);if(g)g.push(d);else this.onText(d)}d= +this._.htmlPartsRegex.lastIndex;if(e=f[1]){e=e.toLowerCase();if(g&&CKEDITOR.dtd.$cdata[e]){this.onCDATA(g.join(""));g=null}if(!g){this.onTagClose(e);continue}}if(g)g.push(f[0]);else if(e=f[3]){e=e.toLowerCase();if(!/="/.test(e)){var k={},h;f=f[4];var l=!!(f&&f.charAt(f.length-1)=="/");if(f)for(;h=b.exec(f);){var m=h[1].toLowerCase();h=h[2]||h[3]||h[4]||"";k[m]=!h&&c[m]?m:h}this.onTagOpen(e,k,l);!g&&CKEDITOR.dtd.$cdata[e]&&(g=[])}}else if(e=f[2])this.onComment(e)}if(a.length>d)this.onText(a.substring(d, +a.length))}}})(); +CKEDITOR.htmlParser.basicWriter=CKEDITOR.tools.createClass({$:function(){this._={output:[]}},proto:{openTag:function(b){this._.output.push("<",b)},openTagClose:function(b,c){c?this._.output.push(" />"):this._.output.push(">")},attribute:function(b,c){typeof c=="string"&&(c=CKEDITOR.tools.htmlEncodeAttr(c));this._.output.push(" ",b,'="',c,'"')},closeTag:function(b){this._.output.push("")},text:function(b){this._.output.push(b)},comment:function(b){this._.output.push("<\!--",b,"--\>")},write:function(b){this._.output.push(b)}, +reset:function(){this._.output=[];this._.indent=false},getHtml:function(b){var c=this._.output.join("");b&&this.reset();return c}}});CKEDITOR.htmlParser.comment=function(b){this.value=b;this._={isBlockLike:false}};CKEDITOR.htmlParser.comment.prototype={type:CKEDITOR.NODE_COMMENT,writeHtml:function(b,c){var a=this.value;if(c){if(!(a=c.onComment(a,this)))return;if(typeof a!="string"){a.parent=this.parent;a.writeHtml(b,c);return}}b.comment(a)}}; +(function(){CKEDITOR.htmlParser.text=function(b){this.value=b;this._={isBlockLike:false}};CKEDITOR.htmlParser.text.prototype={type:CKEDITOR.NODE_TEXT,writeHtml:function(b,c){var a=this.value;(!c||(a=c.onText(a,this)))&&b.text(a)}}})();(function(){CKEDITOR.htmlParser.cdata=function(b){this.value=b};CKEDITOR.htmlParser.cdata.prototype={type:CKEDITOR.NODE_TEXT,writeHtml:function(b){b.write(this.value)}}})(); +CKEDITOR.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:true,hasInlineStarted:false}}; +(function(){function b(a){return a.name=="a"&&a.attributes.href||CKEDITOR.dtd.$removeEmpty[a.name]}var c=CKEDITOR.tools.extend({table:1,ul:1,ol:1,dl:1},CKEDITOR.dtd.table,CKEDITOR.dtd.ul,CKEDITOR.dtd.ol,CKEDITOR.dtd.dl),a={ol:1,ul:1},f=CKEDITOR.tools.extend({},{html:1},CKEDITOR.dtd.html,CKEDITOR.dtd.body,CKEDITOR.dtd.head,{style:1,script:1});CKEDITOR.htmlParser.fragment.fromHtml=function(e,d,g){function k(a){var b;if(y.length>0)for(var c=0;c=0;b--)if(a==y[b].name){y.splice(b,1);return}for(var c=[],d=[],n=j;n!=q&&n.name!=a;){n._.isBlockLike||d.unshift(n);c.push(n);n=n.returnPoint||n.parent}if(n!=q){for(b=0;b0?this.children[b-1]:null;if(c){if(a._.isBlockLike&&c.type==CKEDITOR.NODE_TEXT){c.value=CKEDITOR.tools.rtrim(c.value);if(c.value.length===0){this.children.pop();this.add(a);return}}c.next=a}a.previous=c;a.parent=this; +this.children.splice(b,0,a);if(!this._.hasInlineStarted)this._.hasInlineStarted=a.type==CKEDITOR.NODE_TEXT||a.type==CKEDITOR.NODE_ELEMENT&&!a._.isBlockLike},writeHtml:function(a,b){var c;this.filterChildren=function(){var a=new CKEDITOR.htmlParser.basicWriter;this.writeChildrenHtml.call(this,a,b);a=a.getHtml();this.children=(new CKEDITOR.htmlParser.fragment.fromHtml(a)).children;c=1};b&&b.onRoot(this);this.writeChildrenHtml(a,c?null:b)},writeChildrenHtml:function(a,b,c){if(c&&!this.parent&&b)b.onRoot(this); +for(c=0;c=0;f--)if(m=b[f]){m.pri=c;a.splice(e,0,m)}}}function a(a,b,c){if(b)for(var e in b){var l=a[e];a[e]=f(l,b[e],c);l||a.$length++}}function f(a,b,f){if(b){b.pri=f;if(a){if(a.splice)c(a,b,f);else{a=a.pri>f?[b,a]:[a,b];a.filter=e}return a}return b.filter=b}}function e(a){for(var b= +a.type||a instanceof CKEDITOR.htmlParser.fragment,c=0;c7||i.name in CKEDITOR.dtd.tr||i.name in CKEDITOR.dtd.$listItem))e=false;else{e=a(i);e=!e||i.name=="form"&&e.name=="input"}e&&i.add(n(b))}}}function o(a,b){if((!t||!CKEDITOR.env.ie)&&a.type==CKEDITOR.NODE_ELEMENT&&a.name=="br"&&!a.attributes["data-cke-eol"])return true;var c;if(a.type== +CKEDITOR.NODE_TEXT&&(c=a.value.match(s))){if(c.index){g(a,new CKEDITOR.htmlParser.text(a.value.substring(0,c.index)));a.value=c[0]}if(CKEDITOR.env.ie&&t&&(!b||a.parent.name in h))return true;if(!t)if((c=a.previous)&&c.name=="br"||!c||d(c))return true}return false}var j={elements:{}},t=c=="html",h=CKEDITOR.tools.extend({},D),q;for(q in h)"#"in B[q]||delete h[q];for(q in h)j.elements[q]=i(t,b.config.fillEmptyBlocks!==false);j.root=i(t);j.elements.br=function(a){return function(b){if(b.parent.type!= +CKEDITOR.NODE_DOCUMENT_FRAGMENT){var c=b.attributes;if("data-cke-bogus"in c||"data-cke-eol"in c)delete c["data-cke-bogus"];else{for(c=b.next;c&&e(c);)c=c.next;var i=f(b);if(!c&&d(b.parent)){b=b.parent;c=n(a);i=b.children[b.children.length-1];b.children.push(c);c.parent=b;if(i){i.next=c;c.previous=i}}else d(c)&&(i&&!d(i))&&g(c,n(a))}}}}(t);return j}function c(a){return a.enterMode!=CKEDITOR.ENTER_BR&&a.autoParagraph!==false?a.enterMode==CKEDITOR.ENTER_DIV?"div":"p":false}function a(a){for(a=a.children[a.children.length- +1];a&&e(a);)a=a.previous;return a}function f(a){for(a=a.previous;a&&e(a);)a=a.previous;return a}function e(a){return a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(a.value)||a.type==CKEDITOR.NODE_ELEMENT&&a.attributes["data-cke-bookmark"]}function d(a){return a&&(a.type==CKEDITOR.NODE_ELEMENT&&a.name in D||a.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)}function g(a,b){var c=a.parent.children,d=CKEDITOR.tools.indexOf(c,a);c.splice(d,0,b);c=a.previous;a.previous=b;b.next=a;b.parent=a.parent;if(c){b.previous= +c;c.next=b}}function k(a){var b=a.parent.children,c=CKEDITOR.tools.indexOf(b,a),d=a.previous,a=a.next;d&&(d.next=a);a&&(a.previous=d);b.splice(c,1)}function h(a){var b=a.parent;return b?CKEDITOR.tools.indexOf(b.children,a):-1}function l(a){a=a.attributes;a.contenteditable!="false"&&(a["data-cke-editable"]=a.contenteditable?"true":1);a.contenteditable="false"}function m(a){a=a.attributes;switch(a["data-cke-editable"]){case "true":a.contenteditable="true";break;case "1":delete a.contenteditable}}function n(a){return a.replace(v, +function(a,b,c){return"<"+b+c.replace(t,function(a,b){return!/^on/.test(b)&&c.indexOf("data-cke-saved-"+b)==-1?" data-cke-saved-"+a+" data-cke-"+CKEDITOR.rnd+"-"+a:a})+">"})}function o(a){return a.replace(w,function(a){return""+encodeURIComponent(a)+""})}function i(a){return a.replace(I,function(a,b){return decodeURIComponent(b)})}function q(a){return a.replace(/<\!--(?!{cke_protected})[\s\S]+?--\>/g,function(a){return"<\!--"+A+"{C}"+encodeURIComponent(a).replace(/--/g, +"%2D%2D")+"--\>"})}function y(a){return a.replace(/<\!--\{cke_protected\}\{C\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)})}function z(a,b){var c=b._.dataStore;return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)}).replace(/\{cke_protected_(\d+)\}/g,function(a,b){return c&&c[b]||""})}function j(a,b){for(var c=[],d=b.config.protectedSource,n=b._.dataStore||(b._.dataStore={id:1}),i=/<\!--\{cke_temp(comment)?\}(\d*?)--\>/g,d=[//gi, +//gi].concat(d),a=a.replace(/<\!--[\s\S]*?--\>/g,function(a){return"<\!--{cke_tempcomment}"+(c.push(a)-1)+"--\>"}),o=0;o"});a=a.replace(i,function(a,b,d){return"<\!--"+A+(b?"{C}":"")+encodeURIComponent(c[d]).replace(/--/g,"%2D%2D")+"--\>"});return a.replace(/(['"]).*?\1/g,function(a){return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g, +function(a,b){n[n.id]=decodeURIComponent(b);return"{cke_protected_"+n.id++ +"}"})})}CKEDITOR.htmlDataProcessor=function(a){var c,d;this.editor=a;this.dataFilter=c=new CKEDITOR.htmlParser.filter;this.htmlFilter=d=new CKEDITOR.htmlParser.filter;this.writer=new CKEDITOR.htmlParser.basicWriter;c.addRules(u);c.addRules(b(a,"data"));d.addRules(r);d.addRules(b(a,"html"))};CKEDITOR.htmlDataProcessor.prototype={toHtml:function(a,b,d){var a=j(a,this.editor),a=n(a),a=o(a),a=a.replace(G,"$1cke:$2"),a=a.replace(Q, +""),a=CKEDITOR.env.opera?a:a.replace(/(]*>)(\r\n|\n)/g,"$1$2$2"),e=this.editor.editable(),f;!b&&b!==null&&(b=e.getName());e=b||e.getName();if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&e=="pre"){e="div";a="
    "+a+"
    ";f=1}e=this.editor.document.createElement(e);e.setHtml("a"+a);a=e.getHtml().substr(1);a=a.replace(RegExp(" data-cke-"+CKEDITOR.rnd+"-","ig")," ");f&&(a=a.replace(/^
    |<\/pre>$/gi,""));a=a.replace(C,"$1$2");a=i(a);a=y(a);a=CKEDITOR.htmlParser.fragment.fromHtml(a,
    +b,d===false?false:c(this.editor.config));b=new CKEDITOR.htmlParser.basicWriter;a.writeChildrenHtml(b,this.dataFilter,1);a=b.getHtml(true);return a=q(a)},toDataFormat:function(a){var b=this.editor.editable(),d=this.writer,a=CKEDITOR.htmlParser.fragment.fromHtml(a,b.getName(),c(this.editor.config));d.reset();a.writeChildrenHtml(d,this.htmlFilter,1);d=d.getHtml(true);d=y(d);return d=z(d,this.editor)}};var s=/(?: |\xa0)$/,A="{cke_protected}",B=CKEDITOR.dtd,p=["caption","colgroup","col","thead","tfoot",
    +"tbody"],D=CKEDITOR.tools.extend({},B.$blockLimit,B.$block),u={elements:{},attributeNames:[[/^on/,"data-cke-pa-on"]]},r={elementNames:[[/^cke:/,""],[/^\?xml:namespace$/,""]],attributeNames:[[/^data-cke-(saved|pa)-/,""],[/^data-cke-.*/,""],["hidefocus",""]],elements:{$:function(a){var b=a.attributes;if(b){if(b["data-cke-temp"])return false;for(var c=["name","href","src"],d,n=0;n-1&&d>-1&&c!=d)){c=h(a);d=h(b)}return c>d?1:-1})},embed:function(a){var b=a.parent;if(b&&b.name=="object"){var c=b.attributes.width,b=b.attributes.height;c&&(a.attributes.width=c);b&&(a.attributes.height=b)}},param:function(a){a.children=[];a.isEmpty=true;return a},a:function(a){if(!a.children.length&&!a.attributes.name&&!a.attributes["data-cke-saved-name"])return false},
    +span:function(a){a.attributes["class"]=="Apple-style-span"&&delete a.name},html:function(a){delete a.attributes.contenteditable;delete a.attributes["class"]},body:function(a){delete a.attributes.spellcheck;delete a.attributes.contenteditable},style:function(a){var b=a.children[0];b&&b.value&&(b.value=CKEDITOR.tools.trim(b.value));if(!a.attributes.type)a.attributes.type="text/css"},title:function(a){var b=a.children[0];b&&(b.value=a.attributes["data-cke-title"]||"")}},attributes:{"class":function(a){return CKEDITOR.tools.ltrim(a.replace(/(?:^|\s+)cke_[^\s]*/g,
    +""))||false}}};if(CKEDITOR.env.ie)r.attributes.style=function(a){return a.replace(/(^|;)([^\:]+)/g,function(a){return a.toLowerCase()})};for(var F in{input:1,textarea:1}){u.elements[F]=l;r.elements[F]=m}var v=/<(a|area|img|input|source)\b([^>]*)>/gi,t=/\b(on\w+|href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,w=/(?:])[^>]*>[\s\S]*<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,I=/([^<]*)<\/cke:encoded>/gi,G=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,
    +C=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,Q=/]*?)\/?>(?!\s*<\/cke:\1)/gi})();
    +CKEDITOR.htmlParser.element=function(b,c){this.name=b;this.attributes=c||{};this.children=[];var a=b||"",f=a.match(/^cke:(.*)/);f&&(a=f[1]);a=!(!CKEDITOR.dtd.$nonBodyContent[a]&&!CKEDITOR.dtd.$block[a]&&!CKEDITOR.dtd.$listItem[a]&&!CKEDITOR.dtd.$tableContent[a]&&!(CKEDITOR.dtd.$nonEditable[a]||a=="br"));this.isEmpty=!!CKEDITOR.dtd.$empty[b];this.isUnknown=!CKEDITOR.dtd[b];this._={isBlockLike:a,hasInlineStarted:this.isEmpty||!a}};
    +CKEDITOR.htmlParser.cssStyle=function(b){var c={};((b instanceof CKEDITOR.htmlParser.element?b.attributes.style:b)||"").replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,b,e){b=="font-family"&&(e=e.replace(/["']/g,""));c[b.toLowerCase()]=e});return{rules:c,populate:function(a){var b=this.toString();if(b)a instanceof CKEDITOR.dom.element?a.setAttribute("style",b):a instanceof CKEDITOR.htmlParser.element?a.attributes.style=b:a.style=b},toString:function(){var a=[],b;
    +for(b in c)c[b]&&a.push(b,":",c[b],";");return a.join("")}}};
    +(function(){var b=function(b,a){b=b[0];a=a[0];return ba?1:0};CKEDITOR.htmlParser.element.prototype={type:CKEDITOR.NODE_ELEMENT,add:CKEDITOR.htmlParser.fragment.prototype.add,clone:function(){return new CKEDITOR.htmlParser.element(this.name,this.attributes)},writeHtml:function(c,a){var f=this.attributes,e=this,d=e.name,g,k,h,l;e.filterChildren=function(){if(!l){var b=new CKEDITOR.htmlParser.basicWriter;CKEDITOR.htmlParser.fragment.prototype.writeChildrenHtml.call(e,b,a);e.children=(new CKEDITOR.htmlParser.fragment.fromHtml(b.getHtml(),
    +e.clone(),0)).children;l=1}};if(a){if(!this.parent)a.onRoot(this);for(;;){if(!(d=a.onElementName(d)))return;e.name=d;if(!(e=a.onElement(e)))return;e.parent=this.parent;if(e.name==d)break;if(e.type!=CKEDITOR.NODE_ELEMENT){e.writeHtml(c,a);return}d=e.name;if(!d){for(var d=0,m=this.children.length;d{voiceLabel}<{outerEl} class="cke_inner cke_reset" role="presentation">{topHtml}<{outerEl} id="{contentId}" class="cke_contents cke_reset" role="presentation">{bottomHtml}'));b=CKEDITOR.dom.element.createFromHtml(e.output({id:a.id,name:b,langDir:a.lang.dir,langCode:a.langCode,voiceLabel:a.lang.editor,
    +topHtml:l?''+l+"":"",contentId:a.ui.spaceId("contents"),bottomHtml:m?''+m+"":"",outerEl:CKEDITOR.env.ie?"span":"div"}));if(f==CKEDITOR.ELEMENT_MODE_REPLACE){c.hide();b.insertAfter(c)}else c.append(b);a.container=b;l&&a.ui.space("top").unselectable();m&&a.ui.space("bottom").unselectable();c=
    +a.config.width;f=a.config.height;c&&b.setStyle("width",CKEDITOR.tools.cssLength(c));f&&a.ui.space("contents").setStyle("height",CKEDITOR.tools.cssLength(f));b.disableContextMenu();CKEDITOR.env.webkit&&b.on("focus",function(){a.focus()});a.fireOnce("uiReady")}function f(a){var b=a.element;if(a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&b.is("textarea")){var c=b.$.form&&new CKEDITOR.dom.element(b.$.form);if(c){var e=function(){a.updateElement()};c.on("submit",e);if(!c.$.submit.nodeName&&!c.$.submit.length)c.$.submit=
    +CKEDITOR.tools.override(c.$.submit,function(b){return function(){a.updateElement();b.apply?b.apply(this,arguments):b()}});a.on("destroy",function(){c.removeListener("submit",e)})}}}CKEDITOR.replace=function(a,c){return b(a,c,null,CKEDITOR.ELEMENT_MODE_REPLACE)};CKEDITOR.appendTo=function(a,c,e){return b(a,c,e,CKEDITOR.ELEMENT_MODE_APPENDTO)};CKEDITOR.replaceAll=function(){for(var a=document.getElementsByTagName("textarea"),b=0;b",j="",a=g+a.replace(f,function(){return j+g})+j}a=a.replace(/\n/g,"
    ");b||(a=a.replace(RegExp("
    (?=)"),function(a){return e.repeat(a,2)}));a=a.replace(/^ | $/g," ");a=a.replace(/(>|\s) /g,function(a,b){return b+" "}).replace(/ (?=<)/g," ");m(this,"text",a)},insertElement:function(b){d(this);for(var c= +this.editor,e=c.config.enterMode,f=c.getSelection(),h=f.getRanges(),l=b.getName(),j=CKEDITOR.dtd.$block[l],m,k,B,p=h.length-1;p>=0;p--){m=h[p];if(!m.checkReadOnly()){m.deleteContents(1);k=!p&&b||b.clone(1);var D,u;if(j)for(;(D=m.getCommonAncestor(0,1))&&(u=CKEDITOR.dtd[D.getName()])&&(!u||!u[l]);)if(D.getName()in CKEDITOR.dtd.span)m.splitElement(D);else if(m.checkStartOfBlock()&&m.checkEndOfBlock()){m.setStartBefore(D);m.collapse(true);D.remove()}else m.splitBlock(e==CKEDITOR.ENTER_DIV?"div":"p", +c.editable());m.insertNode(k);B||(B=k)}}if(B){m.moveToPosition(B,CKEDITOR.POSITION_AFTER_END);if(j)if((b=B.getNext(a))&&b.type==CKEDITOR.NODE_ELEMENT&&b.is(CKEDITOR.dtd.$block))b.getDtd()["#"]?m.moveToElementEditStart(b):m.moveToElementEditEnd(B);else if(!b&&e!=CKEDITOR.ENTER_BR){b=m.fixBlock(true,e==CKEDITOR.ENTER_DIV?"div":"p");m.moveToElementEditStart(b)}}f.selectRanges([m]);g(this,CKEDITOR.env.opera)},setData:function(a,b){!b&&this.editor.dataProcessor&&(a=this.editor.dataProcessor.toHtml(a)); +this.setHtml(a);this.editor.fire("dataReady")},getData:function(a){var b=this.getHtml();!a&&this.editor.dataProcessor&&(b=this.editor.dataProcessor.toDataFormat(b));return b},setReadOnly:function(a){this.setAttribute("contenteditable",!a)},detach:function(){this.removeClass("cke_editable");var a=this.editor;this._.detach();delete a.document;delete a.window},isInline:function(){return this.getDocument().equals(CKEDITOR.document)},setup:function(){var a=this.editor;this.attachListener(a,"beforeGetData", +function(){var b=this.getData();this.is("textarea")||a.config.ignoreEmptyParagraph!==false&&(b=b.replace(k,function(a,b){return b}));a.setData(b,null,1)},this);this.attachListener(a,"getSnapshot",function(a){a.data=this.getData(1)},this);this.attachListener(a,"afterSetData",function(){this.setData(a.getData(1))},this);this.attachListener(a,"loadSnapshot",function(a){this.setData(a.data,1)},this);this.attachListener(a,"beforeFocus",function(){var b=a.getSelection();(b=b&&b.getNative())&&b.type=="Control"|| +this.focus()},this);this.attachListener(a,"insertHtml",function(a){this.insertHtml(a.data.dataValue,a.data.mode)},this);this.attachListener(a,"insertElement",function(a){this.insertElement(a.data)},this);this.attachListener(a,"insertText",function(a){this.insertText(a.data)},this);this.setReadOnly(a.readOnly);this.attachClass("cke_editable");this.attachClass(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"cke_editable_inline":a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE||a.elementMode==CKEDITOR.ELEMENT_MODE_APPENDTO? +"cke_editable_themed":"");this.attachClass("cke_contents_"+a.config.contentsLangDirection);a.keystrokeHandler.blockedKeystrokes[8]=a.readOnly;a.keystrokeHandler.attach(this);this.on("blur",function(a){CKEDITOR.env.opera&&CKEDITOR.document.getActive().equals(this.isInline()?this:this.getWindow().getFrame())?a.cancel():this.hasFocus=false},null,null,-1);this.on("focus",function(){this.hasFocus=true},null,null,-1);a.focusManager.add(this);if(this.equals(CKEDITOR.document.getActive())){this.hasFocus= +true;a.once("contentDom",function(){a.focusManager.focus()})}if(!this.is("textarea")){a.document=this.getDocument();a.window=this.getWindow();var b=a.document;this.changeAttr("spellcheck",!a.config.disableNativeSpellChecker);var d=a.config.contentsLangDirection;this.getDirection(1)!=d&&this.changeAttr("dir",d);a.document.equals(CKEDITOR.document)&&this.changeAttr("tabindex",a.tabIndex);var f=CKEDITOR.getCss();if(f){d=b.getHead();if(!d.getCustomData("stylesheet")){f=b.appendStyleText(f);f=new CKEDITOR.dom.element(f.ownerNode|| +f.owningElement);d.setCustomData("stylesheet",f);f.data("cke-temp",1)}}d=b.getCustomData("stylesheet_ref")||0;b.setCustomData("stylesheet_ref",d+1);this.setCustomData("cke_includeReadonly",!a.config.disableReadonlyStyling);this.attachListener(this,"click",function(a){var a=a.data,b=a.getTarget();b.is("a")&&(a.$.button!=2&&b.isReadOnly())&&a.preventDefault()});this.attachListener(a,"key",function(b){if(a.readOnly)return false;var c=b.data.keyCode,d;if(c in{8:1,46:1}){var i=a.getSelection(),b=i.getRanges()[0], +f=b.startPath(),o,g,l,c=c==8;if(i=e(i)){a.fire("saveSnapshot");b.moveToPosition(i,CKEDITOR.POSITION_BEFORE_START);i.remove();b.select();a.fire("saveSnapshot");d=1}else if(b.collapsed)if((o=f.block)&&b[c?"checkStartOfBlock":"checkEndOfBlock"]()&&(l=o[c?"getPrevious":"getNext"](h))&&l.is("table")){a.fire("saveSnapshot");b[c?"checkEndOfBlock":"checkStartOfBlock"]()&&o.remove();b["moveToElementEdit"+(c?"End":"Start")](l);b.select();a.fire("saveSnapshot");d=1}else if(f.blockLimit&&f.blockLimit.is("td")&& +(g=f.blockLimit.getAscendant("table"))&&b.checkBoundaryOfElement(g,c?CKEDITOR.START:CKEDITOR.END)&&(l=g[c?"getPrevious":"getNext"](h))){a.fire("saveSnapshot");b["moveToElementEdit"+(c?"End":"Start")](l);b.checkStartOfBlock()&&b.checkEndOfBlock()?l.remove():b.select();a.fire("saveSnapshot");d=1}else if((g=f.contains(["td","th","caption"]))&&b.checkBoundaryOfElement(g,c?CKEDITOR.START:CKEDITOR.END))if((l=g[c?"getPreviousSourceNode":"getNextSourceNode"](1,CKEDITOR.NODE_ELEMENT))&&!l.isReadOnly()&&b.root.contains(l)){b[c? +"moveToElementEditEnd":"moveToElementEditStart"](l);b.select();d=1}}return!d});CKEDITOR.env.ie&&this.attachListener(this,"click",c);!CKEDITOR.env.ie&&!CKEDITOR.env.opera&&this.attachListener(this,"mousedown",function(b){var c=b.data.getTarget();if(c.is("img","hr","input","textarea","select")){a.getSelection().selectElement(c);c.is("input","textarea","select")&&b.data.preventDefault()}});CKEDITOR.env.gecko&&this.attachListener(this,"mouseup",function(b){if(b.data.$.button==2){b=b.data.getTarget(); +if(!b.getOuterHtml().replace(k,"")){var c=a.createRange();c.moveToElementEditStart(b);c.select(true)}}});if(CKEDITOR.env.webkit){this.attachListener(this,"click",function(a){a.data.getTarget().is("input","select")&&a.data.preventDefault()});this.attachListener(this,"mouseup",function(a){a.data.getTarget().is("input","textarea")&&a.data.preventDefault()})}}}},_:{detach:function(){this.editor.setData(this.editor.getData(),0,1);this.clearListeners();this.restoreAttrs();var a;if(a=this.removeCustomData("classes"))for(;a.length;)this.removeClass(a.pop()); +a=this.getDocument();var b=a.getHead();if(b.getCustomData("stylesheet")){var c=a.getCustomData("stylesheet_ref");if(--c)a.setCustomData("stylesheet_ref",c);else{a.removeCustomData("stylesheet_ref");b.removeCustomData("stylesheet").remove()}}delete this.editor}}});CKEDITOR.editor.prototype.editable=function(a){var b=this._.editable;if(b&&a)return 0;if(arguments.length)b=this._.editable=a?a instanceof CKEDITOR.editable?a:new CKEDITOR.editable(this,a):(b&&b.detach(),null);return b};var k=/(^|]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:]*>| |\u00A0| )?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi, +h=CKEDITOR.dom.walker.whitespaces(true),l=CKEDITOR.dom.walker.bookmark(false,true);CKEDITOR.on("instanceLoaded",function(a){var c=a.editor;c.on("insertElement",function(a){a=a.data;if(a.type==CKEDITOR.NODE_ELEMENT&&(a.is("input")||a.is("textarea"))){a.getAttribute("contentEditable")!="false"&&a.data("cke-editable",a.hasAttribute("contenteditable")?"true":"1");a.setAttribute("contentEditable",false)}});c.on("selectionChange",function(a){if(!c.readOnly){var d=c.getSelection();if(d&&!d.isLocked){d=c.checkDirty(); +c.fire("lockSnapshot");b(a);c.fire("unlockSnapshot");!d&&c.resetDirty()}}})});CKEDITOR.addCss(".cke_editable{cursor:text}.cke_editable img,.cke_editable input,.cke_editable textarea{cursor:default}");var m=function(){function b(a){return a.type==CKEDITOR.NODE_ELEMENT}function c(a,d){var e,f,i,g,t=[],h=d.range.startContainer;e=d.range.startPath();for(var h=j[h.getName()],l=0,m=a.getChildren(),q=m.count(),k=-1,z=-1,y=0,s=e.contains(j.$list);l-1)t[k].firstNotAllowed=1;if(z>-1)t[z].lastNotAllowed=1;return t}function d(a,c){var e=[],f=a.getChildren(),o=f.count(),g,t=0,h=j[c],l=!a.is(j.$inline)|| +a.is("br");for(l&&e.push(" ");t ",r.document);r.insertNode(w);r.setStartAfter(w)}I=new CKEDITOR.dom.elementPath(r.startContainer); +s.endPath=G=new CKEDITOR.dom.elementPath(r.endContainer);if(!r.collapsed){t=G.block||G.blockLimit;var Q=r.getCommonAncestor();t&&(!t.equals(Q)&&!t.contains(Q)&&r.checkEndOfBlock())&&s.zombies.push(t);r.deleteContents()}for(;(C=b(r.startContainer)&&r.startContainer.getChild(r.startOffset-1))&&b(C)&&C.isBlockBoundary()&&I.contains(C);)r.moveToPosition(C,CKEDITOR.POSITION_BEFORE_END);f(r,s.blockLimit,I,G);if(w){r.setEndBefore(w);r.collapse();w.remove()}w=r.startPath();if(t=w.contains(e,false,1)){r.splitElement(t); +s.inlineStylesRoot=t;s.inlineStylesPeak=w.lastElement}w=r.createBookmark();(t=w.startNode.getPrevious(a))&&b(t)&&e(t)&&v.push(t);(t=w.startNode.getNext(a))&&b(t)&&e(t)&&v.push(t);for(t=w.startNode;(t=t.getParent())&&e(t);)v.push(t);r.moveToBookmark(w);if(u){C=u;u=s.range;if(s.type=="text"&&s.inlineStylesRoot){w=C;C=s.inlineStylesPeak;r=C.getDocument().createText("{cke-peak}");for(v=s.inlineStylesRoot.getParent();!C.equals(v);){r=r.appendTo(C.clone());C=C.getParent()}C=r.getOuterHtml().replace("{cke-peak}", +w)}w=s.blockLimit.getName();if(/^\s+|\s+$/.test(C)&&"span"in CKEDITOR.dtd[w]){var K=' ';C=K+C+K}C=s.editor.dataProcessor.toHtml(C,null,false);w=u.document.createElement("body");w.setHtml(C);if(K){w.getFirst().remove();w.getLast().remove()}if((K=u.startPath().block)&&!(K.getChildCount()==1&&K.getBogus()))a:{var E;if(w.getChildCount()==1&&b(E=w.getFirst())&&E.is(m)){K=E.getElementsByTag("*");u=0;for(r=K.count();u0;else{x=E.startPath();if(!G.isBlock&&(N=s.editor.config.enterMode!=CKEDITOR.ENTER_BR&&s.editor.config.autoParagraph!==false?s.editor.config.enterMode==CKEDITOR.ENTER_DIV?"div":"p":false)&&!x.block&&x.blockLimit&&x.blockLimit.equals(E.root)){N=K.createElement(N);!CKEDITOR.env.ie&&N.appendBogus();E.insertNode(N);!CKEDITOR.env.ie&& +(J=N.getBogus())&&J.remove();E.moveToPosition(N,CKEDITOR.POSITION_BEFORE_END)}if((x=E.startPath().block)&&!x.equals(H)){if(J=x.getBogus()){J.remove();C.push(x)}H=x}G.firstNotAllowed&&(r=1);if(r&&G.isElement){x=E.startContainer;for(L=null;x&&!j[x.getName()][G.name];){if(x.equals(u)){x=null;break}L=x;x=x.getParent()}if(x){if(L){O=E.splitElement(L);s.zombies.push(O);s.zombies.push(L)}}else{L=u.getName();P=!w;x=w==I.length-1;L=d(G.node,L);for(var M=[],R=L.length,T=0,U=void 0,V=0,W=-1;T1&&f&&f.intersectsNode(c.$)){d=[e.anchorOffset,e.focusOffset];f=e.focusNode==c.$&&e.focusOffset>0;e.anchorNode==c.$&&e.anchorOffset>0&&d[0]--;f&&d[1]--;var g;f=e;if(!f.isCollapsed){g=f.getRangeAt(0);g.setStart(f.anchorNode,f.anchorOffset);g.setEnd(f.focusNode,f.focusOffset);g=g.collapsed}g&&d.unshift(d.pop())}}c.setText(c.getText().replace(/\u200B/g,""));if(d){c=e.getRangeAt(0);c.setStart(c.startContainer,d[0]);c.setEnd(c.startContainer,d[1]);e.removeAllRanges();e.addRange(c)}}} +var g,k,h=CKEDITOR.dom.walker.invisible(1);CKEDITOR.on("instanceCreated",function(a){function e(){var a=f.getSelection();a&&a.removeAllRanges()}var f=a.editor;f.define("selectionChange",{errorProof:1});f.on("contentDom",function(){var a=f.document,e=CKEDITOR.document,g=f.editable(),o=a.getBody(),n=a.getDocumentElement(),h=g.isInline();if(CKEDITOR.env.ie||CKEDITOR.env.opera||h){var m;g.attachListener(g,"focus",function(){f.unlockSelection(m);m=0},null,null,-1);var k,D=function(){k=f.getSelection(1); +k.lock()};l?g.attachListener(g,"beforedeactivate",D,null,null,-1):g.attachListener(f,"selectionCheck",D,null,null,-1);g.attachListener(g,"blur",function(){f.lockSelection(k);m=1},null,null,-1);g.attachListener(g,"mousedown",function(){m=0})}if(CKEDITOR.env.ie&&!h){var u;g.attachListener(g,"mousedown",function(a){a.data.$.button==2&&f.document.$.selection.type=="None"&&(u=f.window.getScrollPosition())});g.attachListener(g,"mouseup",function(a){if(a.data.$.button==2&&u){f.document.$.documentElement.scrollLeft= +u.x;f.document.$.documentElement.scrollTop=u.y}u=null});if(a.$.compatMode!="BackCompat"){if(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)n.on("mousedown",function(a){function b(a){a=a.data.$;if(d){var c=o.$.createTextRange();try{c.moveToPoint(a.x,a.y)}catch(e){}d.setEndPoint(g.compareEndPoints("StartToStart",c)<0?"EndToEnd":"StartToStart",c);d.select()}}function c(){n.removeListener("mousemove",b);e.removeListener("mouseup",c);n.removeListener("mouseup",c);d.select()}a=a.data;if(a.getTarget().is("html")&& +a.$.y7){n.on("mousedown",function(a){if(a.data.getTarget().is("html")){e.on("mouseup",r);n.on("mouseup",r)}});var r=function(){e.removeListener("mouseup",r);n.removeListener("mouseup",r);var b=CKEDITOR.document.$.selection,c=b.createRange();b.type!="None"&&c.parentElement().ownerDocument== +a.$&&c.select()}}}}g.attachListener(g,"selectionchange",b,f);g.attachListener(g,"mouseup",c,f);g.attachListener(g,"keyup",c,f);g.attachListener(g,"focus",function(){f.forceNextSelectionCheck();f.selectionChange(1)});if(CKEDITOR.env.webkit)a.on("keydown",function(a){switch(a.data.getKey()){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:d(f.editable())}},null,null,-1)});f.on("contentDomUnload",f.forceNextSelectionCheck,f);f.on("dataReady",function(){f.selectionChange(1)}); +CKEDITOR.env.ie9Compat&&f.on("beforeDestroy",e,null,null,9);CKEDITOR.env.webkit&&f.on("setData",e);f.on("contentDomUnload",function(){f.unlockSelection()})});CKEDITOR.on("instanceReady",function(a){var b=a.editor,c=b.editable();if(CKEDITOR.env.webkit){b.on("selectionChange",function(){var a=e(c);a&&(a.getCustomData("ready")?d(c):a.setCustomData("ready",1))},null,null,-1);b.on("beforeSetMode",function(){d(c)},null,null,-1);var f,g,a=function(){var a=b.document,d=e(c);if(d){a=a.$.defaultView.getSelection(); +a.type=="Caret"&&a.anchorNode==d.$&&(g=1);f=d.getText();d.setText(f.replace(/\u200B/g,""))}},h=function(){var a=b.document,d=e(c);if(d){d.setText(f);if(g){a.$.defaultView.getSelection().setPosition(d.$,d.getLength());g=0}}};b.on("beforeUndoImage",a);b.on("afterUndoImage",h);b.on("beforeGetData",a,null,null,0);b.on("getData",h)}});CKEDITOR.editor.prototype.selectionChange=function(a){(a?b:c).call(this)};CKEDITOR.editor.prototype.getSelection=function(a){if(this._.savedSelection&&!a)return this._.savedSelection; +return(a=this.editable())?new CKEDITOR.dom.selection(a):null};CKEDITOR.editor.prototype.lockSelection=function(a){a=a||this.getSelection(1);if(a.getType()!=CKEDITOR.SELECTION_NONE){!a.isLocked&&a.lock();this._.savedSelection=a;return true}return false};CKEDITOR.editor.prototype.unlockSelection=function(a){var b=this._.savedSelection;if(b){b.unlock(a);delete this._.savedSelection;return true}return false};CKEDITOR.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath}; +CKEDITOR.dom.document.prototype.getSelection=function(){return new CKEDITOR.dom.selection(this)};CKEDITOR.dom.range.prototype.select=function(){var a=this.root instanceof CKEDITOR.editable?this.root.editor.getSelection():new CKEDITOR.dom.selection(this.root);a.selectRanges([this]);return a};CKEDITOR.SELECTION_NONE=1;CKEDITOR.SELECTION_TEXT=2;CKEDITOR.SELECTION_ELEMENT=3;var l=typeof window.getSelection!="function";CKEDITOR.dom.selection=function(a){var b=a instanceof CKEDITOR.dom.element;this.document= +a instanceof CKEDITOR.dom.document?a:a.getDocument();this.root=b?a:this.document.getBody();this.isLocked=0;this._={cache:{}};if(CKEDITOR.env.webkit){a=this.document.getWindow().$.getSelection();if(a.type=="None"&&this.document.getActive().equals(this.root)||a.type=="Caret"&&a.anchorNode.nodeType==CKEDITOR.NODE_DOCUMENT){var c=new CKEDITOR.dom.range(this.root);c.moveToPosition(this.root,CKEDITOR.POSITION_AFTER_START);b=this.document.$.createRange();b.setStart(c.startContainer.$,c.startOffset);b.collapse(1); +a.addRange(b)}}var a=this.getNative(),d;if(a)if(a.getRangeAt)d=(c=a.rangeCount&&a.getRangeAt(0))&&new CKEDITOR.dom.node(c.commonAncestorContainer);else{try{c=a.createRange()}catch(e){}d=c&&CKEDITOR.dom.element.get(c.item&&c.item(0)||c.parentElement())}if(!d||!this.root.equals(d)&&!this.root.contains(d)){this._.cache.type=CKEDITOR.SELECTION_NONE;this._.cache.startElement=null;this._.cache.selectedElement=null;this._.cache.selectedText="";this._.cache.ranges=new CKEDITOR.dom.rangeList}return this}; +var m={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};CKEDITOR.dom.selection.prototype={getNative:function(){return this._.cache.nativeSel!==void 0?this._.cache.nativeSel:this._.cache.nativeSel=l?this.document.$.selection:this.document.getWindow().$.getSelection()},getType:l?function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_NONE;try{var c=this.getNative(),d=c.type;if(d=="Text")b= +CKEDITOR.SELECTION_TEXT;if(d=="Control")b=CKEDITOR.SELECTION_ELEMENT;if(c.createRange().parentElement())b=CKEDITOR.SELECTION_TEXT}catch(e){}return a.type=b}:function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_TEXT,c=this.getNative();if(!c||!c.rangeCount)b=CKEDITOR.SELECTION_NONE;else if(c.rangeCount==1){var c=c.getRangeAt(0),d=c.startContainer;if(d==c.endContainer&&d.nodeType==1&&c.endOffset-c.startOffset==1&&m[d.childNodes[c.startOffset].nodeName.toLowerCase()])b=CKEDITOR.SELECTION_ELEMENT}return a.type= +b},getRanges:function(){var a=l?function(){function a(b){return(new CKEDITOR.dom.node(b)).getIndex()}var b=function(b,c){b=b.duplicate();b.collapse(c);var d=b.parentElement(),e=d.ownerDocument;if(!d.hasChildNodes())return{container:d,offset:0};for(var f=d.children,g,i,h=b.duplicate(),n=0,l=f.length-1,m=-1,k,v;n<=l;){m=Math.floor((n+l)/2);g=f[m];h.moveToElementText(g);k=h.compareEndPoints("StartToStart",b);if(k>0)l=m-1;else if(k<0)n=m+1;else{if(CKEDITOR.env.ie9Compat&&g.tagName=="BR"){f=e.defaultView.getSelection(); +return{container:f[c?"anchorNode":"focusNode"],offset:f[c?"anchorOffset":"focusOffset"]}}return{container:d,offset:a(g)}}}if(m==-1||m==f.length-1&&k<0){h.moveToElementText(d);h.setEndPoint("StartToStart",b);e=h.text.replace(/(\r\n|\r)/g,"\n").length;f=d.childNodes;if(!e){g=f[f.length-1];return g.nodeType!=CKEDITOR.NODE_TEXT?{container:d,offset:f.length}:{container:g,offset:g.nodeValue.length}}for(d=f.length;e>0&&d>0;){i=f[--d];if(i.nodeType==CKEDITOR.NODE_TEXT){v=i;e=e-i.nodeValue.length}}return{container:v, +offset:-e}}h.collapse(k>0?true:false);h.setEndPoint(k>0?"StartToStart":"EndToStart",b);e=h.text.replace(/(\r\n|\r)/g,"\n").length;if(!e)return{container:d,offset:a(g)+(k>0?0:1)};for(;e>0;)try{i=g[k>0?"previousSibling":"nextSibling"];if(i.nodeType==CKEDITOR.NODE_TEXT){e=e-i.nodeValue.length;v=i}g=i}catch(t){return{container:d,offset:a(g)}}return{container:v,offset:k>0?-e:v.nodeValue.length+e}};return function(){var a=this.getNative(),c=a&&a.createRange(),d=this.getType();if(!a)return[];if(d==CKEDITOR.SELECTION_TEXT){a= +new CKEDITOR.dom.range(this.root);d=b(c,true);a.setStart(new CKEDITOR.dom.node(d.container),d.offset);d=b(c);a.setEnd(new CKEDITOR.dom.node(d.container),d.offset);a.endContainer.getPosition(a.startContainer)&CKEDITOR.POSITION_PRECEDING&&a.endOffset<=a.startContainer.getIndex()&&a.collapse();return[a]}if(d==CKEDITOR.SELECTION_ELEMENT){for(var d=[],e=0;e=b.getLength()?m.setStartAfter(b):m.setStartBefore(b));g&& +g.type==CKEDITOR.NODE_TEXT&&(l?m.setEndAfter(g):m.setEndBefore(g));b=new CKEDITOR.dom.walker(m);b.evaluator=function(a){if(a.type==CKEDITOR.NODE_ELEMENT&&a.isReadOnly()){var b=f.clone();f.setEndBefore(a);f.collapsed&&d.splice(e--,1);if(!(a.getPosition(m.endContainer)&CKEDITOR.POSITION_CONTAINS)){b.setStartAfter(a);b.collapsed||d.splice(e+1,0,b)}return true}return false};b.next()}}return c.ranges}}(),getStartElement:function(){var a=this._.cache;if(a.startElement!==void 0)return a.startElement;var b; +switch(this.getType()){case CKEDITOR.SELECTION_ELEMENT:return this.getSelectedElement();case CKEDITOR.SELECTION_TEXT:var c=this.getRanges()[0];if(c){if(c.collapsed){b=c.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent())}else{for(c.optimize();;){b=c.startContainer;if(c.startOffset==(b.getChildCount?b.getChildCount():b.getLength())&&!b.isBlockBoundary())c.setStartAfter(b);else break}b=c.startContainer;if(b.type!=CKEDITOR.NODE_ELEMENT)return b.getParent();b=b.getChild(c.startOffset);if(!b|| +b.type!=CKEDITOR.NODE_ELEMENT)b=c.startContainer;else for(c=b.getFirst();c&&c.type==CKEDITOR.NODE_ELEMENT;){b=c;c=c.getFirst()}}b=b.$}}return a.startElement=b?new CKEDITOR.dom.element(b):null},getSelectedElement:function(){var a=this._.cache;if(a.selectedElement!==void 0)return a.selectedElement;var b=this,c=CKEDITOR.tools.tryThese(function(){return b.getNative().createRange().item(0)},function(){for(var a=b.getRanges()[0],c,d,e=2;e&&(!(c=a.getEnclosedNode())||!(c.type==CKEDITOR.NODE_ELEMENT&&m[c.getName()]&& +(d=c)));e--)a.shrink(CKEDITOR.SHRINK_ELEMENT);return d.$});return a.selectedElement=c?new CKEDITOR.dom.element(c):null},getSelectedText:function(){var a=this._.cache;if(a.selectedText!==void 0)return a.selectedText;var b=this.getNative(),b=l?b.type=="Control"?"":b.createRange().text:b.toString();return a.selectedText=b},lock:function(){this.getRanges();this.getStartElement();this.getSelectedElement();this.getSelectedText();this._.cache.nativeSel=null;this.isLocked=1},unlock:function(a){if(this.isLocked){if(a)var b= +this.getSelectedElement(),c=!b&&this.getRanges();this.isLocked=0;this.reset();if(a)(a=b||c[0].getCommonAncestor())&&a.getAscendant("body",1)&&(b?this.selectElement(b):this.selectRanges(c))}},reset:function(){this._.cache={}},selectElement:function(a){var b=new CKEDITOR.dom.range(this.root);b.setStartBefore(a);b.setEndAfter(a);this.selectRanges([b])},selectRanges:function(a){if(a.length)if(this.isLocked){var b=CKEDITOR.document.getActive();this.unlock();this.selectRanges(a);this.lock();!b.equals(this.root)&& +b.focus()}else{if(l){var c=CKEDITOR.dom.walker.whitespaces(true),e=/\ufeff|\u00a0/,g={table:1,tbody:1,tr:1};if(a.length>1){b=a[a.length-1];a[0].setEnd(b.endContainer,b.endOffset)}var b=a[0],a=b.collapsed,h,j,k,A=b.getEnclosedNode();if(A&&A.type==CKEDITOR.NODE_ELEMENT&&A.getName()in m&&(!A.is("a")||!A.getText()))try{k=A.$.createControlRange();k.addElement(A.$);k.select();return}catch(B){}(b.startContainer.type==CKEDITOR.NODE_ELEMENT&&b.startContainer.getName()in g||b.endContainer.type==CKEDITOR.NODE_ELEMENT&& +b.endContainer.getName()in g)&&b.shrink(CKEDITOR.NODE_ELEMENT,true);k=b.createBookmark();var g=k.startNode,p;if(!a)p=k.endNode;k=b.document.$.body.createTextRange();k.moveToElementText(g.$);k.moveStart("character",1);if(p){e=b.document.$.body.createTextRange();e.moveToElementText(p.$);k.setEndPoint("EndToEnd",e);k.moveEnd("character",-1)}else{h=g.getNext(c);j=g.hasAscendant("pre");h=!(h&&h.getText&&h.getText().match(e))&&(j||!g.hasPrevious()||g.getPrevious().is&&g.getPrevious().is("br"));j=b.document.createElement("span"); +j.setHtml("");j.insertBefore(g);h&&b.document.createText("").insertBefore(g)}b.setStartBefore(g);g.remove();if(a){if(h){k.moveStart("character",-1);k.select();b.document.$.selection.clear()}else k.select();b.moveToPosition(j,CKEDITOR.POSITION_BEFORE_START);j.remove()}else{b.setEndBefore(p);p.remove();k.select()}}else{p=this.getNative();if(!p)return;if(CKEDITOR.env.opera){b=this.document.$.createRange();b.selectNodeContents(this.root.$);p.addRange(b)}this.removeAllRanges();for(e=0;e=0){b.collapse(1);k.setEnd(b.endContainer.$,b.endOffset)}else throw D;}p.addRange(k)}}this.reset();this.root.fire("selectionchange")}},createBookmarks:function(a){return this.getRanges().createBookmarks(a)},createBookmarks2:function(a){return this.getRanges().createBookmarks2(a)},selectBookmarks:function(a){for(var b=[],c=0;c]*>)[ \t\r\n]*/gi,"$1");f=f.replace(/([ \t\n\r]+| )/g," ");f=f.replace(/]*>/gi,"\n");if(CKEDITOR.env.ie){var g=a.getDocument().createElement("div");g.append(e);e.$.outerHTML="
    "+f+"
    ";e.copyAttributes(g.getFirst());e=g.getFirst().remove()}else e.setHtml(f);b=e}else f?b=m(c?[a.getHtml()]:h(a),b):a.moveChildren(b);b.replace(a);if(d){var c=b,i;if((i=c.getPrevious(v))&&i.is&&i.is("pre")){d=l(i.getHtml(),/\n$/,"")+ +"\n\n"+l(c.getHtml(),/^\n/,"");CKEDITOR.env.ie?c.$.outerHTML="
    "+d+"
    ":c.setHtml(d);i.remove()}}else c&&q(b)}function h(a){a.getName();var b=[];l(a.getOuterHtml(),/(\S\s*)\n(?:\s|(]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,function(a,b,c){return b+"
    "+c+"
    "}).replace(/([\s\S]*?)<\/pre>/gi,function(a,c){b.push(c)});return b}function l(a,b,c){var d="",e="",a=a.replace(/(^]+data-cke-bookmark.*?\/span>)|(]+data-cke-bookmark.*?\/span>$)/gi,function(a,
    +b,c){b&&(d=b);c&&(e=c);return""});return d+a.replace(b,c)+e}function m(a,b){var c;a.length>1&&(c=new CKEDITOR.dom.documentFragment(b.getDocument()));for(var d=0;d"),e=e.replace(/[ \t]{2,}/g,function(a){return CKEDITOR.tools.repeat(" ",
    +a.length-1)+" "});if(c){var f=b.clone();f.setHtml(e);c.append(f)}else b.setHtml(e)}return c||b}function n(a){var b=this._.definition,c=b.attributes,b=b.styles,d=s(this)[a.getName()],e=CKEDITOR.tools.isEmpty(c)&&CKEDITOR.tools.isEmpty(b),f;for(f in c)if(!((f=="class"||this._.definition.fullMatch)&&a.getAttribute(f)!=A(f,c[f]))){e=a.hasAttribute(f);a.removeAttribute(f)}for(var g in b)if(!(this._.definition.fullMatch&&a.getStyle(g)!=A(g,b[g],true))){e=e||!!a.getStyle(g);a.removeStyle(g)}i(a,d,p[a.getName()]);
    +e&&(this._.definition.alwaysRemoveElement?q(a,1):!CKEDITOR.dtd.$block[a.getName()]||this._.enterMode==CKEDITOR.ENTER_BR&&!a.hasAttributes()?q(a):a.renameNode(this._.enterMode==CKEDITOR.ENTER_P?"p":"div"))}function o(a){for(var b=s(this),c=a.getElementsByTag(this.element),d=c.count();--d>=0;)n.call(this,c.getItem(d));for(var e in b)if(e!=this.element){c=a.getElementsByTag(e);for(d=c.count()-1;d>=0;d--){var f=c.getItem(d);i(f,b[e])}}}function i(a,b,c){if(b=b&&b.attributes)for(var d=0;d",a||b.name,"");return c.join("")}};CKEDITOR.style.getStyleText=function(a){var b=a._ST;if(b)return b;var b=a.styles,c=a.attributes&&a.attributes.style||
    +"",d="";c.length&&(c=c.replace(u,";"));for(var e in b){var f=b[e],g=(e+":"+f).replace(u,";");f=="inherit"?d=d+g:c=c+g}c.length&&(c=CKEDITOR.tools.normalizeCssText(c,true));return a._ST=c+d}})();CKEDITOR.styleCommand=function(b){this.style=b};CKEDITOR.styleCommand.prototype.exec=function(b){b.focus();this.state==CKEDITOR.TRISTATE_OFF?b.applyStyle(this.style):this.state==CKEDITOR.TRISTATE_ON&&b.removeStyle(this.style)};CKEDITOR.stylesSet=new CKEDITOR.resourceManager("","stylesSet");
    +CKEDITOR.addStylesSet=CKEDITOR.tools.bind(CKEDITOR.stylesSet.add,CKEDITOR.stylesSet);CKEDITOR.loadStylesSet=function(b,c,a){CKEDITOR.stylesSet.addExternal(b,c,"");CKEDITOR.stylesSet.load(b,a)};
    +CKEDITOR.editor.prototype.getStylesSet=function(b){if(this._.stylesDefinitions)b(this._.stylesDefinitions);else{var c=this,a=c.config.stylesCombo_stylesSet||c.config.stylesSet||"default";if(a instanceof Array){c._.stylesDefinitions=a;b(a)}else{var a=a.split(":"),f=a[0];CKEDITOR.stylesSet.addExternal(f,a[1]?a.slice(1).join(":"):CKEDITOR.getUrl("styles.js"),"");CKEDITOR.stylesSet.load(f,function(a){c._.stylesDefinitions=a[f];b(c._.stylesDefinitions)})}}};
    +CKEDITOR.dom.comment=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createComment(b));CKEDITOR.dom.domObject.call(this,b)};CKEDITOR.dom.comment.prototype=new CKEDITOR.dom.node;CKEDITOR.tools.extend(CKEDITOR.dom.comment.prototype,{type:CKEDITOR.NODE_COMMENT,getOuterHtml:function(){return"<\!--"+this.$.nodeValue+"--\>"}});
    +(function(){var b={},c;for(c in CKEDITOR.dtd.$blockLimit)c in CKEDITOR.dtd.$list||(b[c]=1);var a={};for(c in CKEDITOR.dtd.$block)c in CKEDITOR.dtd.$blockLimit||c in CKEDITOR.dtd.$empty||(a[c]=1);CKEDITOR.dom.elementPath=function(c,e){var d=null,g=null,k=[],e=e||c.getDocument().getBody(),h=c;do if(h.type==CKEDITOR.NODE_ELEMENT){k.push(h);if(!this.lastElement){this.lastElement=h;if(h.is(CKEDITOR.dtd.$object))continue}var l=h.getName();if(!g){!d&&a[l]&&(d=h);if(b[l]){var m;if(m=!d){if(l=l=="div"){a:{l=
    +h.getChildren();m=0;for(var n=l.count();m-1}:typeof b=="function"?f=b:typeof b=="object"&&(f=
    +function(a){return a.getName()in b});var e=this.elements,d=e.length;c&&d--;if(a){e=Array.prototype.slice.call(e,0);e.reverse()}for(c=0;c=f){d=e.createText("");d.insertAfter(this)}else{b=e.createText("");b.insertAfter(d);b.remove()}return d},substring:function(b,
    +c){return typeof c!="number"?this.$.nodeValue.substr(b):this.$.nodeValue.substring(b,c)}});
    +(function(){function b(a,b,c){var d=a.serializable,g=b[c?"endContainer":"startContainer"],k=c?"endOffset":"startOffset",h=d?b.document.getById(a.startNode):a.startNode,a=d?b.document.getById(a.endNode):a.endNode;if(g.equals(h.getPrevious())){b.startOffset=b.startOffset-g.getLength()-a.getPrevious().getLength();g=a.getNext()}else if(g.equals(a.getPrevious())){b.startOffset=b.startOffset-g.getLength();g=a.getNext()}g.equals(h.getParent())&&b[k]++;g.equals(a.getParent())&&b[k]++;b[c?"endContainer":"startContainer"]=
    +g;return b}CKEDITOR.dom.rangeList=function(a){if(a instanceof CKEDITOR.dom.rangeList)return a;a?a instanceof CKEDITOR.dom.range&&(a=[a]):a=[];return CKEDITOR.tools.extend(a,c)};var c={createIterator:function(){var a=this,b=CKEDITOR.dom.walker.bookmark(),c=[],d;return{getNextRange:function(g){d=d==void 0?0:d+1;var k=a[d];if(k&&a.length>1){if(!d)for(var h=a.length-1;h>=0;h--)c.unshift(a[h].createBookmark(true));if(g)for(var l=0;a[d+l+1];){for(var m=k.document,g=0,h=m.getById(c[l].endNode),m=m.getById(c[l+
    +1].startNode);;){h=h.getNextSourceNode(false);if(m.equals(h))g=1;else if(b(h)||h.type==CKEDITOR.NODE_ELEMENT&&h.isBlockBoundary())continue;break}if(!g)break;l++}for(k.moveToBookmark(c.shift());l--;){h=a[++d];h.moveToBookmark(c.shift());k.setEnd(h.endContainer,h.endOffset)}}return k}}},createBookmarks:function(a){for(var c=[],e,d=0;db?-1:1}),e=0,f;e',CKEDITOR.document);b.appendTo(CKEDITOR.document.getHead());try{CKEDITOR.env.hc=b.getComputedStyle("border-top-color")==b.getComputedStyle("border-right-color")}catch(c){CKEDITOR.env.hc=false}b.remove()}if(CKEDITOR.env.hc)CKEDITOR.env.cssClass=CKEDITOR.env.cssClass+" cke_hc";CKEDITOR.document.appendStyleText(".cke{visibility:hidden;}");
    +CKEDITOR.status="loaded";CKEDITOR.fireOnce("loaded");if(b=CKEDITOR._.pending){delete CKEDITOR._.pending;for(var a=0;ac;c++){var f=a,h=c,d;d=parseInt(a[c],16);d=("0"+(0>e?0|d*(1+e):0|d+(255-d)*e).toString(16)).slice(-2);f[h]=d}return"#"+a.join("")}}(),c=function(){var b=new CKEDITOR.template("background:#{to};background-image:-webkit-gradient(linear,lefttop,leftbottom,from({from}),to({to}));background-image:-moz-linear-gradient(top,{from},{to});background-image:-webkit-linear-gradient(top,{from},{to});background-image:-o-linear-gradient(top,{from},{to});background-image:-ms-linear-gradient(top,{from},{to});background-image:linear-gradient(top,{from},{to});filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='{from}',endColorstr='{to}');");return function(c,
    +a){return b.output({from:c,to:a})}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ {defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_bottom [{defaultGradient}border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [{defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [{defaultGradient}outline-color:{defaultBorder};border-top-color:{defaultBorder};] {id} .cke_dialog_tab [{lightGradient}border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [{mediumGradient}] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} .cke_toolgroup [{lightGradient}border-color:{defaultBorder};] {id} a.cke_button_off:hover, {id} a.cke_button_off:focus, {id} a.cke_button_off:active [{mediumGradient}] {id} .cke_button_on [{ckeButtonOn}] {id} .cke_toolbar_separator [background-color: {ckeToolbarSeparator};] {id} .cke_combo_button [border-color:{defaultBorder};{lightGradient}] {id} a.cke_combo_button:hover, {id} a.cke_combo_button:focus, {id} .cke_combo_on a.cke_combo_button [border-color:{defaultBorder};{mediumGradient}] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover, {id} a.cke_path_item:focus, {id} a.cke_path_item:active [background-color:{elementsPathBg};] {id}.cke_panel [border-color:{defaultBorder};] "),
    +panel:new CKEDITOR.template(".cke_panel_grouptitle [{lightGradient}border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:focus.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:focus.cke_colorauto, a:focus.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")};
    +return function(g,e){var a=g.uiColor,a={id:"."+g.id,defaultBorder:b(a,-0.1),defaultGradient:c(b(a,0.9),a),lightGradient:c(b(a,1),b(a,0.7)),mediumGradient:c(b(a,0.8),b(a,0.5)),ckeButtonOn:c(b(a,0.6),b(a,0.7)),ckeResizer:b(a,-0.4),ckeToolbarSeparator:b(a,0.5),ckeColorauto:b(a,0.8),dialogBody:b(a,0.7),dialogTabSelected:c("#FFFFFF","#FFFFFF"),dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-0.6),elementsPathBg:a,menubuttonIcon:b(a,0.5),menubuttonIconHover:b(a,0.3)};return f[e].output(a).replace(/\[/g,
    +"{").replace(/\]/g,"}")}}();CKEDITOR.plugins.add("dialogui",{onLoad:function(){var h=function(b){this._||(this._={});this._["default"]=this._.initValue=b["default"]||"";this._.required=b.required||!1;for(var a=[this._],d=1;darguments.length)){var c=h.call(this,a);c.labelId=CKEDITOR.tools.getNextId()+"_label";this._.children=[];CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"div",null,{role:"presentation"},function(){var f=[],d=a.required?" cke_required":"";"horizontal"!=
    +a.labelLayout?f.push('",'"):(d={type:"hbox",widths:a.widths,padding:0,children:[{type:"html",html:'#", $paging_html))
    +        $php_eol = '';
    +    else
    +        $php_eol = PHP_EOL;
    +
    +    return preg_replace("#()$#", $php_eol.$insert_html.'$1', $paging_html);
     }
     
     // 변수 또는 배열의 이름과 값을 얻어냄. print_r() 함수의 변형
    diff --git a/mobile/skin/member/basic/register_form.skin.php b/mobile/skin/member/basic/register_form.skin.php
    index 19313c9e2..94c633039 100644
    --- a/mobile/skin/member/basic/register_form.skin.php
    +++ b/mobile/skin/member/basic/register_form.skin.php
    @@ -146,7 +146,7 @@ add_stylesheet('',
                     -
                     
                      class="frm_input " size="3" maxlength="3">
    -                주소 검색
    +
    class="frm_input frm_address " size="50">
    diff --git a/mobile/skin/member/basic/register_result.skin.php b/mobile/skin/member/basic/register_result.skin.php index e74d6945a..73517f159 100644 --- a/mobile/skin/member/basic/register_result.skin.php +++ b/mobile/skin/member/basic/register_result.skin.php @@ -29,7 +29,7 @@ add_stylesheet('',

    회원님의 비밀번호는 아무도 알 수 없는 암호화 코드로 저장되므로 안심하셔도 좋습니다.
    - 아이디, 비밀번호 분실시에는 회원가입시 입력하신 비밀번호 분실시 질문, 답변을 이용하여 찾을 수 있습니다. + 아이디, 비밀번호 분실시에는 회원가입시 입력하신 이메일 주소를 이용하여 찾을 수 있습니다.

    diff --git a/plugin/jquery-ui/datepicker.php b/plugin/jquery-ui/datepicker.php index 6c5a3a9e1..f351816bc 100644 --- a/plugin/jquery-ui/datepicker.php +++ b/plugin/jquery-ui/datepicker.php @@ -1,11 +1,11 @@ ', 0); +add_stylesheet('', 0); add_stylesheet('', 0); ?> - + '; -if ($w == "") { +if ($w == '') { goto_url(G5_HTTP_BBS_URL.'/register_result.php'); } else if ($w == 'u') { $row = sql_fetch(" select mb_password from {$g5['member_table']} where mb_id = '{$member['mb_id']}' "); $tmp_password = $row['mb_password']; if ($old_email != $mb_email && $config['cf_use_email_certify']) { - set_session("ss_mb_id", ""); + set_session('ss_mb_id', ''); alert('회원 정보가 수정 되었습니다.\n\nE-mail 주소가 변경되었으므로 다시 인증하셔야 합니다.', G5_URL); } else { alert('회원 정보가 수정 되었습니다.', G5_URL); diff --git a/bbs/write.php b/bbs/write.php index da62a1917..03f8b3aae 100644 --- a/bbs/write.php +++ b/bbs/write.php @@ -408,7 +408,7 @@ include_once('./board_head.php'); $action_url = https_url(G5_BBS_DIR)."/write_update.php"; -echo ''; +echo ''; include_once ($board_skin_path.'/write.skin.php'); include_once('./board_tail.php'); From 7ea9d2e1d2f1d4685011a84ead49a545f90a1fe0 Mon Sep 17 00:00:00 2001 From: chicpro Date: Tue, 2 Dec 2014 10:16:35 +0900 Subject: [PATCH 032/269] =?UTF-8?q?=EA=B7=B8=EB=88=84=EB=B3=B4=EB=93=9C=20?= =?UTF-8?q?5.0.23=20=EC=88=98=EC=A0=95=20=EB=82=B4=EC=97=AD=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adm/config_form.php | 5 +- adm/contentform.php | 33 ++++++++++++ adm/contentformupdate.php | 5 +- adm/member_list_delete.php | 2 +- bbs/board.php | 2 +- bbs/content.php | 47 ++++++++---------- bbs/db_table.optimize.php | 7 +++ css/default.css | 7 --- css/mobile.css | 7 --- install/gnuboard5.sql | 3 ++ lib/common.lib.php | 16 +++--- mobile/content.php | 27 +++++----- mobile/skin/content/basic/content.skin.php | 18 +++++++ mobile/skin/content/basic/style.css | 8 +++ mobile/skin/latest/basic/latest.skin.php | 2 +- mobile/tail.php | 9 ++++ perms.sh | 1 + .../editor/smarteditor2/SmartEditor2Skin.html | 2 +- plugin/editor/smarteditor2/js/smarteditor2.js | 14 +++++- .../smarteditor2/js/smarteditor2.min.js | 2 +- plugin/kcaptcha/kcaptcha_mp3.php | 4 +- plugin/kcpcert/bin/ct_cli_x64 | Bin 0 -> 582902 bytes plugin/kcpcert/kcpcert_result.php | 6 ++- plugin/kcpcert/lib/ct_cli_lib.php | 13 +++-- skin/content/basic/content.skin.php | 17 +++++++ skin/content/basic/style.css | 8 +++ 26 files changed, 186 insertions(+), 79 deletions(-) create mode 100644 mobile/skin/content/basic/content.skin.php create mode 100644 mobile/skin/content/basic/style.css create mode 100755 plugin/kcpcert/bin/ct_cli_x64 create mode 100644 skin/content/basic/content.skin.php create mode 100644 skin/content/basic/style.css diff --git a/adm/config_form.php b/adm/config_form.php index 02da0575d..aaec76ca8 100644 --- a/adm/config_form.php +++ b/adm/config_form.php @@ -1282,7 +1282,10 @@ if($config['cf_cert_use']) { // kcp일 때 if($config['cf_cert_hp'] == 'kcp') { - $exe = G5_KCPCERT_PATH.'/bin/ct_cli'; + if(PHP_INT_MAX == 2147483647) // 32-bit + $exe = G5_KCPCERT_PATH . '/bin/ct_cli'; + else + $exe = G5_KCPCERT_PATH . '/bin/ct_cli_x64'; echo module_exec_check($exe, 'ct_cli'); } diff --git a/adm/contentform.php b/adm/contentform.php index 8f00030ff..a20bf373e 100644 --- a/adm/contentform.php +++ b/adm/contentform.php @@ -19,6 +19,20 @@ if(!sql_query(" select co_tag_filter_use from {$g5['content_table']} limit 1 ", sql_query(" update {$g5['content_table']} set co_tag_filter_use = '1' "); } +// 모바일 내용 추가 +if(!sql_query(" select co_mobile_content from {$g5['content_table']} limit 1", false)) { + sql_query(" ALTER TABLE `{$g5['content_table']}` + ADD `co_mobile_content` longtext NOT NULL AFTER `co_content` ", true); +} + +// 스킨 설정 추가 +if(!sql_query(" select co_skin from {$g5['content_table']} limit 1 ", false)) { + sql_query(" ALTER TABLE `{$g5['content_table']}` + ADD `co_skin` varchar(255) NOT NULL DEFAULT '' AFTER `co_mobile_content`, + ADD `co_mobile_skin` varchar(255) NOT NULL DEFAULT '' AFTER `co_skin` ", true); + sql_query(" update {$g5['content_table']} set co_skin = 'basic', co_mobile_skin = 'basic' "); +} + $html_title = "내용"; $g5['title'] = $html_title.' 관리'; @@ -36,6 +50,8 @@ else { $html_title .= ' 입력'; $co['co_html'] = 2; + $co['co_skin'] = 'basic'; + $co['co_mobile_skin'] = 'basic'; } include_once (G5_ADMIN_PATH.'/admin.head.php'); @@ -69,6 +85,22 @@ include_once (G5_ADMIN_PATH.'/admin.head.php'); 내용 + + 모바일 내용 + + + + + + + + + + + + + + @@ -160,6 +192,7 @@ function frmcontentform_check(f) + check_field(f.co_id, "ID를 입력하세요."); check_field(f.co_subject, "제목을 입력하세요."); diff --git a/adm/contentformupdate.php b/adm/contentformupdate.php index 4f9786ffd..57c26e172 100644 --- a/adm/contentformupdate.php +++ b/adm/contentformupdate.php @@ -21,7 +21,10 @@ $sql_common = " co_include_head = '$co_include_head', co_html = '$co_html', co_tag_filter_use = '$co_tag_filter_use', co_subject = '$co_subject', - co_content = '$co_content' "; + co_content = '$co_content', + co_mobile_content = '$co_mobile_content', + co_skin = '$co_skin', + co_mobile_skin = '$co_mobile_skin' "; if ($w == "") { diff --git a/adm/member_list_delete.php b/adm/member_list_delete.php index 0deced561..c4810fc8f 100644 --- a/adm/member_list_delete.php +++ b/adm/member_list_delete.php @@ -16,7 +16,7 @@ for ($i=0; $i= $board['bo_list_level'] && $board['bo_use_list_view'] include_once('./board_tail.php'); -echo "\n\n"; +echo "\n\n"; include_once(G5_PATH.'/tail.sub.php'); ?> diff --git a/bbs/content.php b/bbs/content.php index a8ba46f2a..f712cffc6 100644 --- a/bbs/content.php +++ b/bbs/content.php @@ -30,7 +30,6 @@ $str = conv_content($co['co_content'], $co['co_html'], $co['co_tag_filter_use']) unset($src); unset($dst); $src[] = "/{{쇼핑몰명}}|{{홈페이지제목}}/"; -//$dst[] = $default[de_subject]; $dst[] = $config['cf_title']; $src[] = "/{{회사명}}|{{상호}}/"; $dst[] = $default['de_admin_company_name']; @@ -59,39 +58,33 @@ $dst[] = $default['de_admin_info_email']; $str = preg_replace($src, $dst, $str); -if ($is_admin) - echo '

    '; -?> +// 스킨경로 +if(trim($co['co_skin']) == '') + $co['co_skin'] = 'basic'; - -'; -?> - -
    -
    -

    -
    - -
    - -
    - -
    - -'; +$content_skin_path = G5_SKIN_PATH.'/content/'.$co['co_skin']; +$content_skin_url = G5_SKIN_URL.'/content/'.$co['co_skin']; +$skin_file = $content_skin_path.'/content.skin.php'; if ($is_admin) echo ''; ?> - '; + + include($skin_file); + + $timg = G5_DATA_PATH.'/content/'.$co_id.'_t'; + if (file_exists($timg)) // 하단 이미지 + echo '
    '; +} else { + echo '

    '.str_replace(G5_PATH.'/', '', $skin_file).'이 존재하지 않습니다.

    '; +} + if ($co['co_include_tail']) @include_once($co['co_include_tail']); else diff --git a/bbs/db_table.optimize.php b/bbs/db_table.optimize.php index f676ce4ef..3d0c38c3a 100644 --- a/bbs/db_table.optimize.php +++ b/bbs/db_table.optimize.php @@ -50,6 +50,13 @@ if($config['cf_leave_day'] > 0) { } } +// 음성 캡챠 파일 삭제 +foreach (glob(G5_PATH.'/data/cache/kcaptcha-*.mp3') as $file) { + if (filemtime($file) + 86400 < G5_SERVER_TIME) { + @unlink($file); + } +} + // 실행일 기록 if(isset($config['cf_optimize_date'])) { sql_query(" update {$g5['config_table']} set cf_optimize_date = '".G5_TIME_YMD."' "); diff --git a/css/default.css b/css/default.css index a90193c32..9a9e4288c 100644 --- a/css/default.css +++ b/css/default.css @@ -252,13 +252,6 @@ a.btn_admin:focus, a.btn_admin:hover {text-decoration:none} .new_win .win_btn a {display:inline-block;padding:0 10px;height:30px;background:#4b545e;color:#fff;vertical-align:middle;line-height:2.4em} .new_win .win_btn a:focus, .new_win .win_btn a:hover {text-decoration:none} -/* 내용관리 */ -#ctt {margin:10px 0;padding:10px;border:1px solid #e9e9e9} -.ctt_admin {text-align:right} -#ctt header h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} -#ctt_con {padding:10px 0} -.ctt_img {text-align:center} - /* 검색결과 색상 */ .sch_word {color:#ff3061} diff --git a/css/mobile.css b/css/mobile.css index 9d2b3328a..feb6f507f 100644 --- a/css/mobile.css +++ b/css/mobile.css @@ -225,13 +225,6 @@ a.btn_admin:focus, a.btn_admin:hover {text-decoration:none} .new_win .win_btn button {display:inline-block;padding:0 10px;height:2.5em;border:0;background:#666;color:#fff;text-decoration:none;line-height:2.5em} .new_win .win_btn input {padding:0 10px;height:2.5em;line-height:2.5em} -/* 내용관리 */ -#ctt {margin:10px 0;padding:10px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} -.ctt_admin {margin:0 5px;text-align:right} -#ctt header h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} -#ctt_con {padding:10px 0} -.ctt_img {text-align:center} - /* 검색결과 색상 */ .sch_word {color:#ff3061} diff --git a/install/gnuboard5.sql b/install/gnuboard5.sql index 5c1a5a2bb..731e6f53b 100644 --- a/install/gnuboard5.sql +++ b/install/gnuboard5.sql @@ -781,6 +781,9 @@ CREATE TABLE IF NOT EXISTS `g5_content` ( `co_html` tinyint(4) NOT NULL DEFAULT '0', `co_subject` varchar(255) NOT NULL DEFAULT '', `co_content` longtext NOT NULL, + `co_mobile_content` longtext NOT NULL, + `co_skin` varchar(255) NOT NULL DEFAULT '', + `co_mobile_skin` varchar(255) NOT NULL DEFAULT '', `co_tag_filter_use` tinyint(4) NOT NULL DEFAULT '0', `co_hit` int(11) NOT NULL DEFAULT '0', `co_include_head` varchar(255) NOT NULL, diff --git a/lib/common.lib.php b/lib/common.lib.php index 4d9660b77..8b8b0a7a1 100644 --- a/lib/common.lib.php +++ b/lib/common.lib.php @@ -141,7 +141,7 @@ function get_cookie($cookie_name) { $cookie = md5($cookie_name); if (array_key_exists($cookie, $_COOKIE)) - return base64_decode($_COOKIE[md5($cookie_name)]); + return base64_decode($_COOKIE[$cookie]); else return ""; } @@ -214,11 +214,12 @@ function url_auto_link($str) // 140326 유창화님 제안코드로 수정 // http://sir.co.kr/bbs/board.php?bo_table=pg_lecture&wr_id=461 // http://sir.co.kr/bbs/board.php?bo_table=pg_lecture&wr_id=463 - $str = str_replace(array("<", ">", "&", """, " "), array("\t_lt_\t", "\t_gt_\t", "&", "\"", "\t_nbsp_\t"), $str); - $str = preg_replace("`(?:(?:(?:href|src)\s*=\s*(?:\"|'|)){0})((http|https|ftp|telnet|news|mms)://[^\"'\s()]+)`", "\\1", $str); - $str = preg_replace("/(^|[\"'\s(])(www\.[^\"'\s()]+)/i", "\\1\\2", $str); - $str = preg_replace("/[0-9a-z_-]+@[a-z0-9._-]{4,}/i", "\\0", $str); - $str = str_replace(array("\t_nbsp_\t", "\t_lt_\t", "\t_gt_\t"), array(" ", "<", ">"), $str); + $str = str_replace(array("<", ">", "&", """, " ", "'"), array("\t_lt_\t", "\t_gt_\t", "&", "\"", "\t_nbsp_\t", "'"), $str); + //$str = preg_replace("`(?:(?:(?:href|src)\s*=\s*(?:\"|'|)){0})((http|https|ftp|telnet|news|mms)://[^\"'\s()]+)`", "\\1", $str); + $str = preg_replace("/([^(href=\"?'?)|(src=\"?'?)]|\(|^)((http|https|ftp|telnet|news|mms):\/\/[a-zA-Z0-9\.-]+\.[가-힣\xA1-\xFEa-zA-Z0-9\.:&#=_\?\/~\+%@;\-\|\,\(\)]+)/i", "\\1\\2", $str); + $str = preg_replace("/(^|[\"'\s(])(www\.[^\"'\s()]+)/i", "\\1\\2", $str); + $str = preg_replace("/[0-9a-z_-]+@[a-z0-9._-]{4,}/i", "\\0", $str); + $str = str_replace(array("\t_nbsp_\t", "\t_lt_\t", "\t_gt_\t", "'"), array(" ", "<", ">", "'"), $str); /* // 속도 향상 031011 @@ -483,7 +484,7 @@ function search_font($stx, $str) // 제목을 변환 function conv_subject($subject, $len, $suffix='') { - return cut_str(get_text($subject), $len, $suffix); + return get_text(cut_str($subject, $len, $suffix)); } // 내용을 변환 @@ -528,7 +529,6 @@ function conv_content($content, $html, $filter=true) $content = str_replace("\n ", "\n ", $content); $content = get_text($content, 1); - $content = url_auto_link($content); } diff --git a/mobile/content.php b/mobile/content.php index 4ca181961..c789834b8 100644 --- a/mobile/content.php +++ b/mobile/content.php @@ -10,13 +10,13 @@ if (!$co['co_id']) $g5['title'] = $co['co_subject']; include_once('./_head.php'); -$str = conv_content($co['co_content'], $co['co_html'], $co['co_tag_filter_use']); +$co_content = $co['co_mobile_content'] ? $co['co_mobile_content'] : $co['co_content']; +$str = conv_content($co_content, $co['co_html'], $co['co_tag_filter_use']); // $src 를 $dst 로 변환 unset($src); unset($dst); $src[] = "/{{쇼핑몰명}}|{{홈페이지제목}}/"; -//$dst[] = $default[de_subject]; $dst[] = $config['cf_title']; $src[] = "/{{회사명}}|{{상호}}/"; $dst[] = $default['de_admin_company_name']; @@ -44,21 +44,20 @@ $src[] = "/{{정보관리책임자e-mail}}|{{정보책임자e-mail}}/i"; $dst[] = $default['de_admin_info_email']; $str = preg_replace($src, $dst, $str); -?> - -
    -
    -

    -
    +// 스킨경로 +if(trim($co['co_mobile_skin']) == '') + $co['co_mobile_skin'] = 'basic'; -
    - -
    +$content_skin_path = G5_MOBILE_PATH .'/'.G5_SKIN_DIR.'/content/'.$co['co_mobile_skin']; +$content_skin_url = G5_MOBILE_URL .'/'.G5_SKIN_DIR.'/content/'.$co['co_mobile_skin']; +$skin_file = $content_skin_path.'/content.skin.php'; -
    - +if(is_file($skin_file)) { + include($skin_file); +} else { + echo '

    '.str_replace(G5_PATH.'/', '', $skin_file).'이 존재하지 않습니다.

    '; +} - diff --git a/mobile/skin/content/basic/content.skin.php b/mobile/skin/content/basic/content.skin.php new file mode 100644 index 000000000..79d47d932 --- /dev/null +++ b/mobile/skin/content/basic/content.skin.php @@ -0,0 +1,18 @@ +', 0); + +?> + +
    +
    +

    +
    + +
    + +
    + +
    \ No newline at end of file diff --git a/mobile/skin/content/basic/style.css b/mobile/skin/content/basic/style.css new file mode 100644 index 000000000..638229597 --- /dev/null +++ b/mobile/skin/content/basic/style.css @@ -0,0 +1,8 @@ +@charset "utf-8"; + +/* 내용관리 */ +#ctt {margin:10px 0;padding:10px;border-top:1px solid #e9e9e9;border-bottom:1px solid #e9e9e9} +.ctt_admin {margin:0 5px;text-align:right} +#ctt header h1 {position:absolute;font-size:0;line-height:0;overflow:hidden} +#ctt_con {padding:10px 0} +.ctt_img {text-align:center} \ No newline at end of file diff --git a/mobile/skin/latest/basic/latest.skin.php b/mobile/skin/latest/basic/latest.skin.php index 89ac1b4b8..6a2e4e9c2 100644 --- a/mobile/skin/latest/basic/latest.skin.php +++ b/mobile/skin/latest/basic/latest.skin.php @@ -6,7 +6,7 @@ add_stylesheet('', ?>
    - +
    • diff --git a/mobile/tail.php b/mobile/tail.php index faa5a9ddb..6ada54bbd 100644 --- a/mobile/tail.php +++ b/mobile/tail.php @@ -52,6 +52,15 @@ if(G5_DEVICE_BUTTON_DISPLAY && G5_IS_MOBILE) { if ($config['cf_analytics']) { echo $config['cf_analytics']; } +?> + + + \ No newline at end of file diff --git a/perms.sh b/perms.sh index 6542ef41b..8719b01c4 100644 --- a/perms.sh +++ b/perms.sh @@ -2,6 +2,7 @@ # kcp 본인확인 실행 파일 chmod 755 plugin/kcpcert/bin/ct_cli +chmod 755 plugin/kcpcert/bin/ct_cli_x64 # okname 본인확인 실행 파일 chmod 755 plugin/okname/bin/okname diff --git a/plugin/editor/smarteditor2/SmartEditor2Skin.html b/plugin/editor/smarteditor2/SmartEditor2Skin.html index 03c99f4eb..febc72e54 100644 --- a/plugin/editor/smarteditor2/SmartEditor2Skin.html +++ b/plugin/editor/smarteditor2/SmartEditor2Skin.html @@ -15,7 +15,7 @@ - + diff --git a/plugin/editor/smarteditor2/js/smarteditor2.js b/plugin/editor/smarteditor2/js/smarteditor2.js index 45585d59a..4151b3999 100644 --- a/plugin/editor/smarteditor2/js/smarteditor2.js +++ b/plugin/editor/smarteditor2/js/smarteditor2.js @@ -12138,9 +12138,19 @@ nhn.husky.SE2M_Hyperlink = jindo.$Class({ var sResult; if (sWWWURL){ - sResult = ''+sURL+''; + var exp = /([-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?)/gi; + if( sWWWURL.match(exp) ){ + sResult = sWWWURL.replace(exp, '$1'); + } else { + sResult = ''+sURL+''; + } } else { - sResult = ''+sURL+''; + var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; + if( sHTTPURL.match(exp) ){ + sResult = sHTTPURL.replace(exp,"$1"); + } else { + sResult = ''+sURL+''; + } } return sBreaker+sResult; diff --git a/plugin/editor/smarteditor2/js/smarteditor2.min.js b/plugin/editor/smarteditor2/js/smarteditor2.min.js index 310d882f3..66b6517ad 100644 --- a/plugin/editor/smarteditor2/js/smarteditor2.min.js +++ b/plugin/editor/smarteditor2/js/smarteditor2.min.js @@ -1 +1 @@ -var nSE2Version=11329;if(typeof window.nhn=="undefined"){window.nhn={}}nhn.FindReplace=jindo.$Class({sKeyword:"",window:null,document:null,bBrowserSupported:false,bEOC:false,$init:function(c){this.sInlineContainer="SPAN|B|U|I|S|STRIKE";this.rxInlineContainer=new RegExp("^("+this.sInlineContainer+")$");this.window=c;this.document=this.window.document;if(this.document.domain!=this.document.location.hostname){var a=jindo.$Agent();var b=a.navigator();if(b.firefox&&b.version<3){this.bBrowserSupported=false;this.find=function(){return 3};return}}this.bBrowserSupported=true},_findNextElement:function(b){if(!b||b.tagName=="BODY"){return null}var a=b.nextSibling;if(a){return(a.nodeType==1?a:this._findNextElement(a))}else{return this._findNextElement(b.parentNode)}},find:function(a,c,d,e){var f,b;this.window.focus();if(!a){return 2}this.bEOC=false;f=this.findNext(a,c,d,e);if(f){return 0}this.bEOC=true;f=this.findNew(a,c,d,e);if(f){return 0}return 1},findNew:function(a,b,c,d){this.findReset();return this.findNext(a,b,c,d)},findNext:function(g,f,b,a){var c;f=f||false;a=a||false;b=b||false;if(this.window.find){var k=false;return this.window.find(g,f,b,k,a)}if(this.document.body.createTextRange){try{var j=0;if(b){j+=1}if(a){j+=2}if(f){j+=4}this.window.focus();if(this.document.selection){this._range=this.document.selection.createRangeCollection().item(0);this._range.collapse(false)}else{this._range=this.document.body.createTextRange();var d=this._findNextElement(this.window.getSelection().focusNode);if(d){this._range.moveToElementText(d)}}c=this._range.findText(g,1,j);this._range.select();return c}catch(h){return false}}return false},findReset:function(){if(this.window.find){this.window.getSelection().removeAllRanges();return}if(this.document.body.createTextRange){if(this.document.selection){this._range=this.document.body.createTextRange();this._range.collapse(true);this._range.select()}else{if(this.window.getSelection){var a=this.window.getSelection();a.removeAllRanges();a.selectAllChildren(this.document.body);a.collapseToStart()}}}},replace:function(b,d,a,c,e){return this._replace(b,d,a,c,e)},_replace:function(c,f,b,d,g,e){if(!c){return 4}e=e||new nhn.HuskyRange(this.window);e.setFromSelection();b=b||false;var a,h=e.toString();if(b){a=(h==c)}else{a=(h.toLowerCase()==c.toLowerCase())}if(!a){return this.find(c,b,d,g)+2}if(typeof f=="function"){e=f(e)}else{e.pasteText(f)}e.select();return this.find(c,b,d,g)},replaceAll:function(e,h,j,b){if(!e){return -1}var c=false;var l;var a=0;var k=this.window;if(this.find(e,j,c,b)!==0){return a}var g=new nhn.HuskyRange(this.window);g.setFromSelection();g.collapseToStart();var m=this.window.document.createElement("SPAN");m.innerHTML=unescape("%uFEFF");g.insertNode(m);g.select();var d=g.placeStringBookmark();this.bEOC=false;while(!this.bEOC){l=this._replace(e,h,j,c,b,g);if(l==0||l==1){a++}}var f=function(){var n=new nhn.HuskyRange(k);n.setFromSelection();g.moveToBookmark(d);var o=g.compareBoundaryPoints(nhn.W3CDOMRange.START_TO_END,n);if(o==1){return false}return true};l=0;this.bEOC=false;while(!f()&&l==0&&!this.bEOC){l=this._replace(e,h,j,c,b,g);if(l==0||l==1){a++}}g.moveToBookmark(d);g.deleteContents();g.removeStringBookmark(d);setTimeout(function(){m.parentNode.removeChild(m)},0);return a},_isBlankTextNode:function(a){if(a.nodeType==3&&a.nodeValue==""){return true}return false},_getNextNode:function(a,b){if(!a||a.tagName=="BODY"){return{elNextNode:null,bDisconnected:false}}if(a.nextSibling){a=a.nextSibling;while(a.firstChild){if(a.tagName&&!this.rxInlineContainer.test(a.tagName)){b=true}a=a.firstChild}return{elNextNode:a,bDisconnected:b}}return this._getNextNode(nhn.DOMFix.parentNode(a),b)},_getNextTextNode:function(a,b){var c,a;while(true){c=this._getNextNode(a,b);a=c.elNextNode;b=c.bDisconnected;if(a&&a.nodeType!=3&&!this.rxInlineContainer.test(a.tagName)){b=true}if(!a||(a.nodeType==3&&!this._isBlankTextNode(a))){break}}return{elNextText:a,bDisconnected:b}},_getFirstTextNode:function(){var b=this.document.body.firstChild;while(!!b&&b.firstChild){b=b.firstChild}if(!b){return null}if(b.nodeType!=3||this._isBlankTextNode(b)){var a=this._getNextTextNode(b,false);b=a.elNextText}return b},_addToTextMap:function(b,d,g,f){var e=d[f].length;for(var c=0,a=b.nodeValue.length;c=0;q--){var d=o.substring(q,q+a);if(u&&(q>0&&o.charAt(q-1).match(/[a-zA-Z가-힣]/))){continue}if(d==t){h++;var b=new nhn.HuskyRange(this.window);var p,m;if(q+a=0&&nhn.DOMFix.parentNode(l[m])==l[k]){m=this._recurConstructClonedTree(l,m,h)}j.insertBefore(h,j.firstChild);return m};this._recurConstructClonedTree=g;b[b.length]=nhn.DOMFix.parentNode(b[b.length-1]);this._recurConstructClonedTree(b,b.length-1,d);return{oStartContainer:a,oEndContainer:c}},cloneRange:function(){return this._copyRange(new nhn.W3CDOMRange(this._window))},_copyRange:function(a){a.collapsed=this.collapsed;a.commonAncestorContainer=this.commonAncestorContainer;a.endContainer=this.endContainer;a.endOffset=this.endOffset;a.startContainer=this.startContainer;a.startOffset=this.startOffset;a._document=this._document;return a},collapse:function(a){if(a){this.endContainer=this.startContainer;this.endOffset=this.startOffset}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset}this._updateRangeInfo()},compareBoundaryPoints:function(a,b){switch(a){case nhn.W3CDOMRange.START_TO_START:return this._compareEndPoint(this.startContainer,this.startOffset,b.startContainer,b.startOffset);case nhn.W3CDOMRange.START_TO_END:return this._compareEndPoint(this.endContainer,this.endOffset,b.startContainer,b.startOffset);case nhn.W3CDOMRange.END_TO_END:return this._compareEndPoint(this.endContainer,this.endOffset,b.endContainer,b.endOffset);case nhn.W3CDOMRange.END_TO_START:return this._compareEndPoint(this.startContainer,this.startOffset,b.endContainer,b.endOffset)}},_findBody:function(a){if(!a){return null}while(a){if(a.tagName=="BODY"){return a}a=nhn.DOMFix.parentNode(a)}return null},_compareEndPoint:function(d,g,c,e){return this.oBrowserSelection.compareEndPoints(d,g,c,e);var l,j;if(!d||this._findBody(d)!=this._document.body){d=this._document.body;g=0}if(!c||this._findBody(c)!=this._document.body){c=this._document.body;e=0}var f=function(n,m){if(m==-1){m=n+1}if(nb.nodeValue.length){a=b.nodeValue.length}}else{if(a>nhn.DOMFix.childNodes(b).length){a=nhn.DOMFix.childNodes(b).length}}return a},setEnd:function(a,d,c,b){if(!c){d=this._endsNodeValidation(a,d)}this.endContainer=a;this.endOffset=d;if(!b){if(!this.startContainer||this._compareEndPoint(this.startContainer,this.startOffset,this.endContainer,this.endOffset)!=-1){this.collapse(false)}else{this._updateRangeInfo()}}},setEndAfter:function(a,b){if(!a){throw new Error("INVALID_NODE_TYPE_ERR in setEndAfter")}if(a.tagName=="BODY"){this.setEnd(a,nhn.DOMFix.childNodes(a).length,true,b);return}this.setEnd(nhn.DOMFix.parentNode(a),this._getPosIdx(a)+1,true,b)},setEndBefore:function(a,b){if(!a){throw new Error("INVALID_NODE_TYPE_ERR in setEndBefore")}if(a.tagName=="BODY"){this.setEnd(a,0,true,b);return}this.setEnd(nhn.DOMFix.parentNode(a),this._getPosIdx(a),true,b)},setStart:function(a,d,c,b){if(!c){d=this._endsNodeValidation(a,d)}this.startContainer=a;this.startOffset=d;if(!b){if(!this.endContainer||this._compareEndPoint(this.startContainer,this.startOffset,this.endContainer,this.endOffset)!=-1){this.collapse(true)}else{this._updateRangeInfo()}}},setStartAfter:function(a,b){if(!a){throw new Error("INVALID_NODE_TYPE_ERR in setStartAfter")}if(a.tagName=="BODY"){this.setStart(a,nhn.DOMFix.childNodes(a).length,true,b);return}this.setStart(nhn.DOMFix.parentNode(a),this._getPosIdx(a)+1,true,b)},setStartBefore:function(a,b){if(!a){throw new Error("INVALID_NODE_TYPE_ERR in setStartBefore")}if(a.tagName=="BODY"){this.setStart(a,0,true,b);return}this.setStart(nhn.DOMFix.parentNode(a),this._getPosIdx(a),true,b)},surroundContents:function(a){a.appendChild(this.extractContents());this.insertNode(a);this.selectNode(a)},toString:function(){var a=this._document.createElement("DIV");a.appendChild(this.cloneContents());return a.textContent||a.innerText||""},fixCommonAncestorContainer:function(){if(!jindo.$Agent().navigator().ie){return}this.commonAncestorContainer=this._getCommonAncestorContainer()},_isBlankTextNode:function(a){if(a.nodeType==3&&a.nodeValue==""){return true}return false},_isAllChildBlankText:function(a){for(var b=0,c=a.childNodes.length;b=c.nodeValue.length){return b}if(a===0){return b}c.splitText(a);return{oStartContainer:e,iStartOffset:d,oEndContainer:c,iEndOffset:a}},_getNodesInRange:function(){if(this.collapsed){return[]}var b=this._getActualStartNode(this.startContainer,this.startOffset);var a=this._getActualEndNode(this.endContainer,this.endOffset);return this._getNodesBetween(b,a)},_getActualStartNode:function(c,b){var a=c;if(c.nodeType==3){if(b>=c.nodeValue.length){a=this._getNextNode(c);if(a.tagName=="BODY"){a=null}}else{a=c}}else{if(b)$/i,setWindow:function(a){this.reset(a||window)},$init:function(a){this.HUSKY_BOOMARK_START_ID_PREFIX="husky_bookmark_start_";this.HUSKY_BOOMARK_END_ID_PREFIX="husky_bookmark_end_";this.sBlockElement="P|DIV|LI|H[1-6]|PRE";this.sBlockContainer="BODY|TABLE|TH|TR|TD|UL|OL|BLOCKQUOTE|FORM";this.rxBlockElement=new RegExp("^("+this.sBlockElement+")$");this.rxBlockContainer=new RegExp("^("+this.sBlockContainer+")$");this.rxLineBreaker=new RegExp("^("+this.sBlockElement+"|"+this.sBlockContainer+")$");this.setWindow(a)},select:function(){try{this.oBrowserSelection.selectRange(this)}catch(a){}},setFromSelection:function(a){this.setRange(this.oBrowserSelection.getRangeAt(a),true)},setRange:function(a,b){this.reset(this._window);this.setStart(a.startContainer,a.startOffset,b,true);this.setEnd(a.endContainer,a.endOffset,b)},setEndNodes:function(b,a){this.reset(this._window);this.setEndAfter(a,true);this.setStartBefore(b)},splitTextAtBothEnds:function(){this._splitTextEndNodesOfTheRange()},getStartNode:function(){if(this.collapsed){if(this.startContainer.nodeType==3){if(this.startOffset===0){return null}if(this.startContainer.nodeValue.length<=this.startOffset){return null}return this.startContainer}return null}if(this.startContainer.nodeType==3){if(this.startOffset>=this.startContainer.nodeValue.length){return this._getNextNode(this.startContainer)}return this.startContainer}else{if(this.startOffset>=nhn.DOMFix.childNodes(this.startContainer).length){return this._getNextNode(this.startContainer)}return nhn.DOMFix.childNodes(this.startContainer)[this.startOffset]}},getEndNode:function(){if(this.collapsed){return this.getStartNode()}if(this.endContainer.nodeType==3){if(this.endOffset===0){return this._getPrevNode(this.endContainer)}return this.endContainer}else{if(this.endOffset===0){return this._getPrevNode(this.endContainer)}return nhn.DOMFix.childNodes(this.endContainer)[this.endOffset-1]}},getNodeAroundRange:function(d,a){if(!this.collapsed){return this.getStartNode()}if(this.startContainer&&this.startContainer.nodeType==3){return this.startContainer}var e,c,b;if(this.startOffset>=nhn.DOMFix.childNodes(this.startContainer).length){c=this._getNextNode(this.startContainer)}else{c=nhn.DOMFix.childNodes(this.startContainer)[this.startOffset]}if(this.endOffset===0){e=this._getPrevNode(this.endContainer)}else{e=nhn.DOMFix.childNodes(this.endContainer)[this.endOffset-1]}if(d){b=e;if(!b&&!a){b=c}}else{b=c;if(!b&&!a){b=e}}return b},_getXPath:function(b){var a="";while(b&&b.nodeType==1){a="/"+b.tagName+"["+this._getPosIdx4XPath(b)+"]"+a;b=nhn.DOMFix.parentNode(b)}return a},_getPosIdx4XPath:function(b){var a=0;for(var c=b.previousSibling;c;c=c.previousSibling){if(c.tagName==b.tagName){a++}}return a},_evaluateXPath:function(l,j){l=l.substring(1,l.length-1);var f=l.split(/\//);var d=j.body;for(var e=2;e-1&&e){var g=nhn.DOMFix.childNodes(e);var d=null;var b=a;var f=c;while((d=g[b])&&d.nodeType==3&&d.nodeValue.length=0){return true}if(f){if(c==1){return false}if(d==-1){return false}return true}return false},isNodeInRange:function(d,c,b){var a=new nhn.HuskyRange(this._window);if(b&&d.firstChild){a.setStartBefore(d.firstChild);a.setEndAfter(d.lastChild)}else{a.selectNode(d)}return this.isRangeInRange(a,c)},pasteText:function(a){this.pasteHTML(a.replace(/&/g,"&").replace(//g,">").replace(/ /g," ").replace(/"/g,"""))},pasteHTML:function(c){var b=this._document.createElement("DIV");b.innerHTML=c;if(!b.firstChild){this.deleteContents();return}var e=b.firstChild;var d=b.lastChild;var f=this.cloneRange();var a=f.placeStringBookmark();this.collapseToStart();while(b.lastChild){this.insertNode(b.lastChild)}this.setEndNodes(e,d);f.moveToBookmark(a);f.deleteContents();f.removeStringBookmark(a)},toString:function(){this.toString=nhn.W3CDOMRange.prototype.toString;return this.toString()},toHTMLString:function(){var a=this._document.createElement("DIV");a.appendChild(this.cloneContents());return a.innerHTML},findAncestorByTagName:function(a){var b=this.commonAncestorContainer;while(b&&b.tagName!=a){b=nhn.DOMFix.parentNode(b)}return b},selectNodeContents:function(c){if(!c){return}var b=c.firstChild?c.firstChild:c;var a=c.lastChild?c.lastChild:c;this.reset(this._window);if(b.nodeType==3){this.setStart(b,0,true)}else{this.setStartBefore(b)}if(a.nodeType==3){this.setEnd(a,a.nodeValue.length,true)}else{this.setEndAfter(a)}},_hasTextDecoration:function(a,b){if(!a||!a.style){return false}if(a.style.textDecoration.indexOf(b)>-1){return true}if(b==="underline"&&a.tagName==="U"){return true}if(b==="line-through"&&(a.tagName==="S"||a.tagName==="STRIKE")){return true}return false},_setTextDecoration:function(a,b){if(jindo.$Agent().navigator().firefox){a.style.textDecoration=(a.style.textDecoration)?a.style.textDecoration+" "+b:b}else{if(b==="underline"){a.innerHTML=""+a.innerHTML+""}else{if(b==="line-through"){a.innerHTML=""+a.innerHTML+""}}}},_checkTextDecoration:function(e){if(e.tagName!=="SPAN"){return}var c=false,a=false,d="",b=null;oChildNode=e.firstChild;while(oChildNode){if(oChildNode.nodeType===1){c=(c||oChildNode.tagName==="U");a=(a||oChildNode.tagName==="S"||oChildNode.tagName==="STRIKE")}if(c&&a){return}oChildNode=oChildNode.nextSibling}b=nhn.DOMFix.parentNode(e);while(b&&b.tagName!=="BODY"){if(b.nodeType!==1){b=nhn.DOMFix.parentNode(b);continue}if(!c&&this._hasTextDecoration(b,"underline")){c=true;this._setTextDecoration(e,"underline")}if(!a&&this._hasTextDecoration(b,"line-through")){a=true;this._setTextDecoration(e,"line-through")}if(c&&a){return}b=nhn.DOMFix.parentNode(b)}},styleRange:function(k,f,b,a,e){var j=this.aStyleParents=this._getStyleParentNodes(b,a);if(j.length<1){return}var d,h;for(var c=0;c1){return null}}if(e.nodeName==="SPAN"){return e}else{return this._findParentSingleSpan(e.parentNode)}},_isFullyContained:function(d,c,f){var a,e;var b=this._getVeryFirstRealChild(d);if(f&&b==f){a=1}else{a=c.indexOf(b)}if(a!=-1){b=this._getVeryLastRealChild(d);if(f&&b==f){e=1}else{e=c.indexOf(b)}}return(a!=-1&&e!=-1)},_getVeryFirstChild:function(a){if(a.firstChild){return this._getVeryFirstChild(a.firstChild)}return a},_getVeryLastChild:function(a){if(a.lastChild){return this._getVeryLastChild(a.lastChild)}return a},_getFirstRealChild:function(b){var a=b.firstChild;while(a&&a.nodeType==3&&a.nodeValue==""){a=a.nextSibling}return a},_getLastRealChild:function(b){var a=b.lastChild;while(a&&a.nodeType==3&&a.nodeValue==""){a=a.previousSibling}return a},_getVeryFirstRealChild:function(b){var a=this._getFirstRealChild(b);if(a){return this._getVeryFirstRealChild(a)}return b},_getVeryLastRealChild:function(b){var a=this._getLastRealChild(b);if(a){return this._getVeryLastChild(a)}return b},_getLineStartInfo:function(f){var h=null;var a=f;var g=f;var e=false;var d=this.rxLineBreaker;function b(j){if(!j){return}if(h){return}if(d.test(j.tagName)){g=j;h=a;e=true;return}else{a=j}c(j.previousSibling);if(h){return}b(nhn.DOMFix.parentNode(j))}function c(k){if(!k){return}if(h){return}if(d.test(k.tagName)){g=k;h=a;e=false;return}if(k.firstChild&&k.tagName!="TABLE"){var j=k.lastChild;while(j&&!h){c(j);j=j.previousSibling}}else{a=k}if(!h){c(k.previousSibling)}}if(d.test(f.tagName)){h=f}else{b(f)}return{oNode:h,oLineBreaker:g,bParentBreak:e}},_getLineEndInfo:function(f){var b=null;var a=f;var g=f;var e=false;var d=this.rxLineBreaker;function h(j){if(!j){return}if(b){return}if(d.test(j.tagName)){g=j;b=a;e=true;return}else{a=j}c(j.nextSibling);if(b){return}h(nhn.DOMFix.parentNode(j))}function c(k){if(!k){return}if(b){return}if(d.test(k.tagName)){g=k;b=a;e=false;return}if(k.firstChild&&k.tagName!="TABLE"){var j=k.firstChild;while(j&&!b){c(j);j=j.nextSibling}}else{a=k}if(!b){c(k.nextSibling)}}if(d.test(f.tagName)){b=f}else{h(f)}return{oNode:b,oLineBreaker:g,bParentBreak:e}},getLineInfo:function(h){var h=h||false;var b=this.getStartNode();var e=this.getEndNode();if(!b){b=this.getNodeAroundRange(!h,true)}if(!e){e=this.getNodeAroundRange(!h,true)}var j=this._getLineStartInfo(b);var f=j.oNode;var c=this._getLineEndInfo(e);var a=c.oNode;if(b!=f||e!=a){var g=this._compareEndPoint(nhn.DOMFix.parentNode(f),this._getPosIdx(f),this.endContainer,this.endOffset);var d=this._compareEndPoint(nhn.DOMFix.parentNode(a),this._getPosIdx(a)+1,this.startContainer,this.startOffset);if(!(g<=0&&d>=0)){b=this.getNodeAroundRange(false,true);e=this.getNodeAroundRange(false,true);j=this._getLineStartInfo(b);c=this._getLineEndInfo(e)}}return{oStart:j,oEnd:c}},_findSingleChild:function(f){if(!f){return null}var b=null;for(var c=0,a=0,g,d,e=f.childNodes;(d=e[c]);c++){g=d.nodeValue;if(this._rxCursorHolder.test(g)){continue}else{b=d;a++}if(a>1){return null}}return b},_hasCursorHolderOnly:function(a){if(!a||a.nodeType!==1){return false}if(this._rxCursorHolder.test(a.innerHTML)){return true}else{return this._hasCursorHolderOnly(this._findSingleChild(a))}}}).extend(nhn.W3CDOMRange);nhn.BrowserSelection=function(a){this.init=function(b){this._window=b||window;this._document=this._window.document};this.init(a);if(!!this._document.createRange){nhn.BrowserSelectionImpl_FF.apply(this)}else{nhn.BrowserSelectionImpl_IE.apply(this)}this.selectRange=function(b){this.selectNone();this.addRange(b)};this.selectionLoaded=true;if(!this._oSelection){this.selectionLoaded=false}};nhn.BrowserSelectionImpl_FF=function(){this._oSelection=this._window.getSelection();this.getRangeAt=function(a){a=a||0;try{var b=this._oSelection.getRangeAt(a)}catch(c){return new nhn.W3CDOMRange(this._window)}return this._FFRange2W3CRange(b)};this.addRange=function(a){var b=this._W3CRange2FFRange(a);this._oSelection.addRange(b)};this.selectNone=function(){this._oSelection.removeAllRanges()};this.getCommonAncestorContainer=function(a){var b=this._W3CRange2FFRange(a);return b.commonAncestorContainer};this.isCollapsed=function(a){var b=this._W3CRange2FFRange(a);return b.collapsed};this.compareEndPoints=function(g,d,c,a){var f=this._document.createRange();var b=this._document.createRange();f.setStart(g,d);b.setStart(c,a);f.collapse(true);b.collapse(true);try{return f.compareBoundaryPoints(1,b)}catch(h){return 1}};this._FFRange2W3CRange=function(b){var a=new nhn.W3CDOMRange(this._window);a.setStart(b.startContainer,b.startOffset,true);a.setEnd(b.endContainer,b.endOffset,true);return a};this._W3CRange2FFRange=function(a){var b=this._document.createRange();b.setStart(a.startContainer,a.startOffset);b.setEnd(a.endContainer,a.endOffset);return b}};nhn.BrowserSelectionImpl_IE=function(){this._oSelection=this._document.selection;this.oLastRange={oBrowserRange:null,elStartContainer:null,nStartOffset:-1,elEndContainer:null,nEndOffset:-1};this._updateLastRange=function(b,a){this.oLastRange.oBrowserRange=b;this.oLastRange.elStartContainer=a.startContainer;this.oLastRange.nStartOffset=a.startOffset;this.oLastRange.elEndContainer=a.endContainer;this.oLastRange.nEndOffset=a.endOffset};this.getRangeAt=function(b){b=b||0;var a,c;if(this._oSelection.type=="Control"){a=new nhn.W3CDOMRange(this._window);var d=this._oSelection.createRange().item(b);if(!d||d.ownerDocument!=this._document){return a}a.selectNode(d);return a}else{c=this._oSelection.createRange();var d=c.parentElement();if(!d||d.ownerDocument!=this._document){a=new nhn.W3CDOMRange(this._window);return a}a=this._IERange2W3CRange(c);return a}};this.addRange=function(a){var b=this._W3CRange2IERange(a);b.select()};this.selectNone=function(){this._oSelection.empty()};this.getCommonAncestorContainer=function(a){return this._W3CRange2IERange(a).parentElement()};this.isCollapsed=function(a){var c=this._W3CRange2IERange(a);var b=c.duplicate();b.collapse();return c.isEqual(b)};this.compareEndPoints=function(d,c,b,a){var f,e;if(d===this.oLastRange.elStartContainer&&c===this.oLastRange.nStartOffset){f=this.oLastRange.oBrowserRange.duplicate();f.collapse(true)}else{if(d===this.oLastRange.elEndContainer&&c===this.oLastRange.nEndOffset){f=this.oLastRange.oBrowserRange.duplicate();f.collapse(false)}else{f=this._getIERangeAt(d,c)}}if(b===this.oLastRange.elStartContainer&&a===this.oLastRange.nStartOffset){e=this.oLastRange.oBrowserRange.duplicate();e.collapse(true)}else{if(b===this.oLastRange.elEndContainer&&a===this.oLastRange.nEndOffset){e=this.oLastRange.oBrowserRange.duplicate();e.collapse(false)}else{e=this._getIERangeAt(b,a)}}return f.compareEndPoints("StartToStart",e)};this._W3CRange2IERange=function(a){if(this.oLastRange.elStartContainer===a.startContainer&&this.oLastRange.nStartOffset===a.startOffset&&this.oLastRange.elEndContainer===a.endContainer&&this.oLastRange.nEndOffset===a.endOffset){return this.oLastRange.oBrowserRange}var b=this._getIERangeAt(a.startContainer,a.startOffset);var c=this._getIERangeAt(a.endContainer,a.endOffset);b.setEndPoint("EndToEnd",c);this._updateLastRange(b,a);return b};this._getIERangeAt=function(f,d){var c=this._document.body.createTextRange();var b=this._getSelectableNodeAndOffsetForIE(f,d);var e=b.oSelectableNodeForIE;var a=b.iOffsetForIE;c.moveToElementText(e);c.collapse(b.bCollapseToStart);c.moveStart("character",a);return c};this._getSelectableNodeAndOffsetForIE=function(e,g){var a=null;var d=null;var b=0;if(e.nodeType==3){a=nhn.DOMFix.parentNode(e);d=nhn.DOMFix.childNodes(a);b=d.length}else{a=e;d=nhn.DOMFix.childNodes(a);b=(g=0){break}g=k[j]}var n=j;if(n!==0&&k[n-1].nodeType==3){var a=this._document.body.createTextRange();var d=null;if(g){a.moveToElementText(g);a.collapse(false);d=g.nextSibling}else{a.moveToElementText(o);a.collapse(true);d=o.firstChild}var m=p.duplicate();m.setEndPoint("StartToStart",a);var b=m.text.replace(/[\r\n]/g,"").length;while(b>d.nodeValue.length&&d.nextSibling){b-=d.nodeValue.length;d=d.nextSibling}var l=d.nodeValue;if(f&&d.nextSibling&&d.nextSibling.nodeType==3&&b==d.nodeValue.length){b-=d.nodeValue.length;d=d.nextSibling}o=d;h=b}else{o=p.parentElement();h=n}return{oContainer:o,iOffset:h}}};nhn.DOMFix=new (jindo.$Class({$init:function(){if(jindo.$Agent().navigator().ie||jindo.$Agent().navigator().opera){this.childNodes=this._childNodes_Fix;this.parentNode=this._parentNode_Fix}else{this.childNodes=this._childNodes_Native;this.parentNode=this._parentNode_Native}},_parentNode_Native:function(a){return a.parentNode},_parentNode_Fix:function(a){if(!a){return a}while(a.previousSibling){a=a.previousSibling}return a.parentNode},_childNodes_Native:function(a){return a.childNodes},_childNodes_Fix:function(a){var c=null;var b=0;if(a){var c=[];a=a.firstChild;while(a){c[b++]=a;a=a.nextSibling}}return c}}))();nhn.husky.CorePlugin=jindo.$Class({name:"CorePlugin",htLazyLoadRequest_plugins:{},htLazyLoadRequest_allFiles:{},htHTMLLoaded:{},$AFTER_MSG_APP_READY:function(){this.oApp.exec("EXEC_ON_READY_FUNCTION",[])},$ON_ADD_APP_PROPERTY:function(a,b){this.oApp[a]=b},$ON_REGISTER_BROWSER_EVENT:function(d,e,b,c,a){this.oApp.registerBrowserEvent(d,e,b,c,a)},$ON_DISABLE_MESSAGE:function(a){this.oApp.disableMessage(a,true)},$ON_ENABLE_MESSAGE:function(a){this.oApp.disableMessage(a,false)},$ON_LOAD_FULL_PLUGIN:function(f,b,e,c,d){var g=c.$this||c;var a=f[0];if(!this.htLazyLoadRequest_plugins[a]){this.htLazyLoadRequest_plugins[a]={nStatus:1,sContents:""}}if(this.htLazyLoadRequest_plugins[a].nStatus===2){this.oApp.exec("MSG_FULL_PLUGIN_LOADED",[a,b,e,c,d,false])}else{this._loadFullPlugin(f,b,e,c,d,0)}},_loadFullPlugin:function(f,a,e,c,d,b){jindo.LazyLoading.load(nhn.husky.SE2M_Configuration.LazyLoad.sJsBaseURI+"/"+f[b],jindo.$Fn(function(o,h,n,l,m,k){var j=o[k];var g=o[0];if(k==o.length-1){this.htLazyLoadRequest_plugins[g].nStatus=2;this.oApp.exec("MSG_FULL_PLUGIN_LOADED",[o,h,n,l,m]);return}this._loadFullPlugin(o,h,n,l,m,k+1)},this).bind(f,a,e,c,d,b),"utf-8")},$ON_MSG_FULL_PLUGIN_LOADED:function(aFilenames,sClassName,sMsgName,oThisRef,oArguments,oRes){var oPluginRef=oThisRef.$this||oThisRef;var sFilename=aFilenames;for(var i=0,nLen=oThisRef._huskyFLT.length;ili>button")}},$LOCAL_BEFORE_FIRST:function(a){var c=jindo.$$(">ul>li[class*="+this.sUIClassPrefix+"]>button",this.elTextTool);var b=c.length;this.elFirstToolbarItem=this.elFirstToolbarItem||c[0];this.elLastToolbarItem=c[b-1];this.oApp.registerBrowserEvent(this.toolbarArea,"keydown","NAVIGATE_TOOLBAR",[])},$init:function(a){this.htUIList={};this.htWrappedUIList={};this.aUICmdMap={};this._assignHTMLElements(a);this._setRoundedCornerButton()},$ON_MSG_APP_READY:function(){this.oApp.registerBrowserEvent(this.toolbarArea,"mouseover","EVENT_TOOLBAR_MOUSEOVER",[]);this.oApp.registerBrowserEvent(this.toolbarArea,"mouseout","EVENT_TOOLBAR_MOUSEOUT",[]);this.oApp.registerBrowserEvent(this.toolbarArea,"mousedown","EVENT_TOOLBAR_MOUSEDOWN",[]);this.oApp.exec("ADD_APP_PROPERTY",["getToolbarButtonByUIName",jindo.$Fn(this.getToolbarButtonByUIName,this).bind()]);var a=jindo.$$.getSingle(".se2_tool");this.oApp.exec("REGISTER_HOTKEY",["esc","FOCUS_EDITING_AREA",[],a])},$ON_NAVIGATE_TOOLBAR:function(b){var a=9;if((b.element==this.elLastToolbarItem)&&(b.key().keyCode==a)){if(b.key().shift){}else{this.elFirstToolbarItem.focus();b.stopDefault()}}if(b.element==this.elFirstToolbarItem&&(b.key().keyCode==a)){if(b.key().shift){b.stopDefault();this.elLastToolbarItem.focus()}}},$ON_FOCUS_EDITING_AREA:function(){this.oApp.exec("FOCUS")},$ON_TOGGLE_TOOLBAR_ACTIVE_LAYER:function(b,d,e,a,f,c){this.oApp.exec("TOGGLE_ACTIVE_LAYER",[b,"MSG_TOOLBAR_LAYER_SHOWN",[b,d,e,a],f,c])},$ON_MSG_TOOLBAR_LAYER_SHOWN:function(c,d,b,a){this.oApp.exec("POSITION_TOOLBAR_LAYER",[c,d]);if(b){this.oApp.exec(b,a)}},$ON_SHOW_TOOLBAR_ACTIVE_LAYER:function(a,d,c,b){this.oApp.exec("SHOW_ACTIVE_LAYER",[a,d,c]);this.oApp.exec("POSITION_TOOLBAR_LAYER",[a,b])},$ON_ENABLE_UI:function(a){this._enableUI(a)},$ON_DISABLE_UI:function(a){this._disableUI(a)},$ON_SELECT_UI:function(a){var b=this.htWrappedUIList[a];if(!b){return}b.removeClass("hover");b.addClass("active")},$ON_DESELECT_UI:function(a){var b=this.htWrappedUIList[a];if(!b){return}b.removeClass("active")},$ON_TOGGLE_UI_SELECTED:function(a){var b=this.htWrappedUIList[a];if(!b){return}if(b.hasClass("active")){b.removeClass("active")}else{b.removeClass("hover");b.addClass("active")}},$ON_ENABLE_ALL_UI:function(b){if(this.nUIStatus===1){return}var c,a;b=b||{};var d=jindo.$A(b.aExceptions||[]);for(c in this.htUIList){if(c&&!d.has(c)){this._enableUI(c)}}this.nUIStatus=1},$ON_DISABLE_ALL_UI:function(b){if(this.nUIStatus===2){return}var c;b=b||{};var d=jindo.$A(b.aExceptions||[]);var a=b.bLeaveActiveLayer||false;if(!a){this.oApp.exec("HIDE_ACTIVE_LAYER",[])}for(c in this.htUIList){if(c&&!d.has(c)){this._disableUI(c)}}this.nUIStatus=2},$ON_MSG_STYLE_CHANGED:function(b,a){if(a==="@^"){this.oApp.exec("SELECT_UI",[b])}else{this.oApp.exec("DESELECT_UI",[b])}},$ON_POSITION_TOOLBAR_LAYER:function(f,j){var b,k,e,a;f=jindo.$(f);j=j||{};var d=jindo.$(j.elBtn);var g=j.sAlign;var c=-1;if(!f){return}if(d&&d.tagName&&d.tagName=="BUTTON"){d.parentNode.appendChild(f)}var h=jindo.$Element(f);if(g!="right"){f.style.left="0";b=h.offset().left;k=b+f.offsetWidth;e=this.welToolbarArea.offset().left;a=e+this.toolbarArea.offsetWidth;if(k>a){h.css("left",(a-k-c)+"px")}if(ba){h.css("right",-1*(a-k-c)+"px")}if(b2||a.parentNode.className.match(/se2_pair/))){return}a=a.parentNode}this.oApp.exec("HIDE_ACTIVE_LAYER_IF_NOT_CHILD",[b.element])},_enableUI:function(d){var b,c;this.nUIStatus=0;var e=this.htWrappedUIList[d];var g=this.htUIList[d];if(!e){return}e.removeClass("off");var a=g.getElementsByTagName("BUTTON");for(b=0,c=a.length;bul>li[class*="+this.sUIClassPrefix+"]:only-child",this.elTextTool);for(e=0,g=f.length;espan._buttonRound",d)).addClass("tool_bg")}b=jindo.$$("ul>li[class*="+this.sUIClassPrefix+"]:first-child",this.elTextTool);for(e=0,g=b.length;espan._buttonRound",d)).addClass("tool_bg")}h=jindo.$$("ul>li[class*="+this.sUIClassPrefix+"]:last-child",this.elTextTool);for(e=0,g=h.length;espan._buttonRound",d)).addClass("tool_bg")}},$ON_REGISTER_UI_EVENT:function(c,d,e,b){if(!this.htUIList[c]){return}var a;if(!this.aUICmdMap[c]){this.aUICmdMap[c]=[]}this.aUICmdMap[c][this.aUICmdMap[c].length]=e;a=jindo.$$.getSingle("button",this.htUIList[c]);if(!a){return}this.oApp.registerBrowserEvent(a,d,e,b)},getToolbarButtonByUIName:function(a){return jindo.$$.getSingle("BUTTON",this.htUIList[a])}});nhn.husky.SE2M_EditingModeChanger=jindo.$Class({name:"SE2M_EditingModeChanger",htConversionMode:null,$init:function(b,a){this.htConversionMode=a;this._assignHTMLElements(b)},_assignHTMLElements:function(a){a=jindo.$(a)||document;this.elWYSIWYGButton=jindo.$$.getSingle("BUTTON.se2_to_editor",a);this.elHTMLSrcButton=jindo.$$.getSingle("BUTTON.se2_to_html",a);this.elTEXTButton=jindo.$$.getSingle("BUTTON.se2_to_text",a);this.elModeToolbar=jindo.$$.getSingle("DIV.se2_conversion_mode",a);this.welWYSIWYGButtonLi=jindo.$Element(this.elWYSIWYGButton.parentNode);this.welHTMLSrcButtonLi=jindo.$Element(this.elHTMLSrcButton.parentNode);this.welTEXTButtonLi=jindo.$Element(this.elTEXTButton.parentNode)},$BEFORE_MSG_APP_READY:function(){this.oApp.exec("ADD_APP_PROPERTY",["isUseModeChanger",jindo.$Fn(this.isUseModeChanger,this).bind()])},$ON_MSG_APP_READY:function(){this.oApp.registerBrowserEvent(this.elWYSIWYGButton,"click","EVENT_CHANGE_EDITING_MODE_CLICKED",["WYSIWYG"]);this.oApp.registerBrowserEvent(this.elHTMLSrcButton,"click","EVENT_CHANGE_EDITING_MODE_CLICKED",["HTMLSrc"]);this.oApp.registerBrowserEvent(this.elTEXTButton,"click","EVENT_CHANGE_EDITING_MODE_CLICKED",["TEXT",false]);this.showModeChanger();if(this.isUseModeChanger()===false&&this.oApp.isUseVerticalResizer()===false){this.elModeToolbar.style.display="none"}},showModeChanger:function(){if(this.isUseModeChanger()){this.elWYSIWYGButton.style.display="block";this.elHTMLSrcButton.style.display="block";this.elTEXTButton.style.display="block"}else{this.elWYSIWYGButton.style.display="none";this.elHTMLSrcButton.style.display="none";this.elTEXTButton.style.display="none"}},isUseModeChanger:function(){return(typeof(this.htConversionMode)==="undefined"||typeof(this.htConversionMode.bUseModeChanger)==="undefined"||this.htConversionMode.bUseModeChanger===true)?true:false},$ON_EVENT_CHANGE_EDITING_MODE_CLICKED:function(b,a){if(b=="TEXT"){var c=this.oApp.getIR();if(c.length>0&&!a){if(!confirm(this.oApp.$MSG("SE2M_EditingModeChanger.confirmTextMode"))){return false}}this.oApp.exec("CHANGE_EDITING_MODE",[b])}else{this.oApp.exec("CHANGE_EDITING_MODE",[b])}if("HTMLSrc"==b){this.oApp.exec("MSG_NOTIFY_CLICKCR",["htmlmode"])}else{if("TEXT"==b){this.oApp.exec("MSG_NOTIFY_CLICKCR",["textmode"])}else{this.oApp.exec("MSG_NOTIFY_CLICKCR",["editormode"])}}},$ON_DISABLE_ALL_UI:function(a){a=a||{};var b=jindo.$A(a.aExceptions||[]);if(b.has("mode_switcher")){return}if(this.oApp.getEditingMode()=="WYSIWYG"){this.welWYSIWYGButtonLi.removeClass("active");this.elHTMLSrcButton.disabled=true;this.elTEXTButton.disabled=true}else{if(this.oApp.getEditingMode()=="TEXT"){this.welTEXTButtonLi.removeClass("active");this.elWYSIWYGButton.disabled=true;this.elHTMLSrcButton.disabled=true}else{this.welHTMLSrcButtonLi.removeClass("active");this.elWYSIWYGButton.disabled=true;this.elTEXTButton.disabled=true}}},$ON_ENABLE_ALL_UI:function(){if(this.oApp.getEditingMode()=="WYSIWYG"){this.welWYSIWYGButtonLi.addClass("active");this.elHTMLSrcButton.disabled=false;this.elTEXTButton.disabled=false}else{if(this.oApp.getEditingMode()=="TEXT"){this.welTEXTButtonLi.addClass("active");this.elWYSIWYGButton.disabled=false;this.elHTMLSrcButton.disabled=false}else{this.welHTMLSrcButtonLi.addClass("active");this.elWYSIWYGButton.disabled=false;this.elTEXTButton.disabled=false}}},$ON_CHANGE_EDITING_MODE:function(a){if(a=="HTMLSrc"){this.welWYSIWYGButtonLi.removeClass("active");this.welHTMLSrcButtonLi.addClass("active");this.welTEXTButtonLi.removeClass("active");this.elWYSIWYGButton.disabled=false;this.elHTMLSrcButton.disabled=true;this.elTEXTButton.disabled=false;this.oApp.exec("HIDE_ALL_DIALOG_LAYER");this.oApp.exec("DISABLE_ALL_UI",[{aExceptions:["mode_switcher"]}])}else{if(a=="TEXT"){this.welWYSIWYGButtonLi.removeClass("active");this.welHTMLSrcButtonLi.removeClass("active");this.welTEXTButtonLi.addClass("active");this.elWYSIWYGButton.disabled=false;this.elHTMLSrcButton.disabled=false;this.elTEXTButton.disabled=true;this.oApp.exec("HIDE_ALL_DIALOG_LAYER");this.oApp.exec("DISABLE_ALL_UI",[{aExceptions:["mode_switcher"]}])}else{this.welWYSIWYGButtonLi.addClass("active");this.welHTMLSrcButtonLi.removeClass("active");this.welTEXTButtonLi.removeClass("active");this.elWYSIWYGButton.disabled=true;this.elHTMLSrcButton.disabled=false;this.elTEXTButton.disabled=false;this.oApp.exec("RESET_STYLE_STATUS");this.oApp.exec("ENABLE_ALL_UI",[])}}}});nhn.husky.SE_EditingAreaManager=jindo.$Class({name:"SE_EditingAreaManager",oActivePlugin:null,elContentsField:null,bIsDirty:false,bAutoResize:false,$init:function(g,f,a,e,d){this.sDefaultEditingMode=g;this.elContentsField=jindo.$(f);this._assignHTMLElements(d);this.fOnBeforeUnload=e;this.oEditingMode={};this.elContentsField.style.display="none";this.nMinWidth=parseInt((a.nMinWidth||60),10);this.nMinHeight=parseInt((a.nMinHeight||60),10);var b=this._getSize([a.nWidth,a.width,this.elEditingAreaContainer.offsetWidth],this.nMinWidth);var c=this._getSize([a.nHeight,a.height,this.elEditingAreaContainer.offsetHeight],this.nMinHeight);this.elEditingAreaContainer.style.width=b.nSize+b.sUnit;this.elEditingAreaContainer.style.height=c.nSize+c.sUnit;if(b.sUnit==="px"){d.style.width=(b.nSize+2)+"px"}else{if(b.sUnit==="%"){d.style.minWidth=this.nMinWidth+"px"}}},_getSize:function(c,b){var e,g,h,d,a,f="px";b=parseInt(b,10);for(e=0,g=c.length;eli.active",this.toolbarArea,{oneTimeOffCache:true});if(b){var a=b.parentNode}if(a&&(a.className=="se2_itool2"||a.className=="se2_itool4")){this._isLayerReasonablyShown=true}this._fitElementInEditingArea(this.elEditingAreaContainer);this.oApp.exec("STOP_AUTORESIZE_EDITING_AREA");this.oApp.exec("SHOW_EDITING_AREA_COVER");this.elEditingAreaContainer.style.overflow="hidden";this.iStartingHeight=parseInt(this.elEditingAreaContainer.style.height,10)},$ON_STOP_AUTORESIZE_EDITING_AREA:function(){if(!this.bAutoResize){return}this.stopAutoResize();this.bAutoResize=false},startAutoResize:function(){if(!this.bAutoResize||!this.oActivePlugin||typeof this.oActivePlugin.startAutoResize!="function"){return}this.oActivePlugin.startAutoResize()},stopAutoResize:function(){if(!this.bAutoResize||!this.oActivePlugin||typeof this.oActivePlugin.stopAutoResize!="function"){return}this.oActivePlugin.stopAutoResize()},$ON_RESIZE_EDITING_AREA:function(b,a){if(b!==null&&typeof b!=="undefined"){this._resizeWidth(b,"px")}if(a!==null&&typeof a!=="undefined"){this._resizeHeight(a,"px")}this._fitElementInEditingArea(this.elResizingBoard);this._setEditingAreaDimension()},_resizeWidth:function(c,a){var b=parseInt(c,10);if(bthis.oApp.elEditingAreaContainer.offsetHeight){if(typeof a=="number"){b.style.top=c-b.offsetHeight-a+"px"}else{b.style.top=this.oApp.elEditingAreaContainer.offsetHeight-b.offsetHeight+"px"}}var d=parseInt(b.style.left,10);if(d+b.offsetWidth>this.oApp.elEditingAreaContainer.offsetWidth){b.style.left=this.oApp.elEditingAreaContainer.offsetWidth-b.offsetWidth+"px"}},$ON_EVENT_EDITING_AREA_KEYDOWN:function(){this.oApp.exec("HIDE_ACTIVE_LAYER",[])},$ON_EVENT_EDITING_AREA_MOUSEDOWN:function(){this.oApp.exec("HIDE_ACTIVE_LAYER",[])},$ON_EVENT_EDITING_AREA_SCROLL:function(){this.oApp.exec("HIDE_ACTIVE_LAYER",[])},_setEditingAreaDimension:function(a){a=a||this.oActivePlugin;this._fitElementInEditingArea(a.elEditingArea)},_fitElementInEditingArea:function(a){a.style.height=this.elEditingAreaContainer.offsetHeight+"px"},attachDocumentEvents:function(a){this.oApp.registerBrowserEvent(a,"click","EVENT_EDITING_AREA_CLICK");this.oApp.registerBrowserEvent(a,"dblclick","EVENT_EDITING_AREA_DBLCLICK");this.oApp.registerBrowserEvent(a,"mousedown","EVENT_EDITING_AREA_MOUSEDOWN");this.oApp.registerBrowserEvent(a,"mousemove","EVENT_EDITING_AREA_MOUSEMOVE");this.oApp.registerBrowserEvent(a,"mouseup","EVENT_EDITING_AREA_MOUSEUP");this.oApp.registerBrowserEvent(a,"mouseout","EVENT_EDITING_AREA_MOUSEOUT");this.oApp.registerBrowserEvent(a,"mousewheel","EVENT_EDITING_AREA_MOUSEWHEEL");this.oApp.registerBrowserEvent(a,"keydown","EVENT_EDITING_AREA_KEYDOWN");this.oApp.registerBrowserEvent(a,"keypress","EVENT_EDITING_AREA_KEYPRESS");this.oApp.registerBrowserEvent(a,"keyup","EVENT_EDITING_AREA_KEYUP");this.oApp.registerBrowserEvent(a,"scroll","EVENT_EDITING_AREA_SCROLL")},createCoverDiv:function(){this.elResizingBoard=document.createElement("DIV");this.elEditingAreaContainer.insertBefore(this.elResizingBoard,this.elEditingAreaContainer.firstChild);this.elResizingBoard.style.position="absolute";this.elResizingBoard.style.background="#000000";this.elResizingBoard.style.zIndex=100;this.elResizingBoard.style.border=1;this.elResizingBoard.style.opacity=0;this.elResizingBoard.style.filter="alpha(opacity=0.0)";this.elResizingBoard.style.MozOpacity=0;this.elResizingBoard.style["-moz-opacity"]=0;this.elResizingBoard.style["-khtml-opacity"]=0;this._fitElementInEditingArea(this.elResizingBoard);this.elResizingBoard.style.width=this.elEditingAreaContainer.offsetWidth+"px";this.elResizingBoard.style.display="none"},$ON_GET_COVER_DIV:function(a,b){if(!!this.elResizingBoard){b[a]=this.elResizingBoard}},getIR:function(){if(!this.oActivePlugin){return""}return this.oActivePlugin.getIR()},setIR:function(b,a){this.oApp.exec("SET_IR",[b,a])},getRawContents:function(){if(!this.oActivePlugin){return""}return this.oActivePlugin.getRawContents()},getContents:function(){var b=this.oApp.getIR();var a;if(this.oApp.applyConverter){a=this.oApp.applyConverter("IR_TO_DB",b,this.oApp.getWYSIWYGDocument())}else{a=b}a=this._cleanContents(a);return a},_cleanContents:function(a){return a.replace(new RegExp("(]*>)"+unescape("%uFEFF")+"","ig"),"$1")},setContents:function(a,b){var c;if(this.oApp.applyConverter){c=this.oApp.applyConverter("DB_TO_IR",a,this.oApp.getWYSIWYGDocument())}else{c=a}this.oApp.exec("SET_IR",[c,b])},getEditingMode:function(){return this.oActivePlugin.sMode},getEditingAreaWidth:function(){return this.elEditingAreaContainer.offsetWidth},getEditingAreaHeight:function(){return this.elEditingAreaContainer.offsetHeight}});nhn.husky.SE_EditingAreaVerticalResizer=jindo.$Class({name:"SE_EditingAreaVerticalResizer",oResizeGrip:null,sCookieNotice:"bHideResizeNotice",nEditingAreaMinHeight:null,htConversionMode:null,$init:function(b,a){this.htConversionMode=a;this._assignHTMLElements(b)},$BEFORE_MSG_APP_READY:function(){this.oApp.exec("ADD_APP_PROPERTY",["isUseVerticalResizer",jindo.$Fn(this.isUseVerticalResizer,this).bind()])},$ON_MSG_APP_READY:function(){if(jindo.$Agent().navigator().msafari){jindo.$Element(this.oResizeGrip).first().text("입력창 높이 자동 조정 바");this.oResizeGrip.disabled=true;return}this.$FnMouseDown=jindo.$Fn(this._mousedown,this);this.$FnMouseMove=jindo.$Fn(this._mousemove,this);this.$FnMouseUp=jindo.$Fn(this._mouseup,this);this.$FnMouseOver=jindo.$Fn(this._mouseover,this);this.$FnMouseOut=jindo.$Fn(this._mouseout,this);this.$FnMouseDown.attach(this.oResizeGrip,"mousedown");this.$FnMouseOver.attach(this.oResizeGrip,"mouseover");this.$FnMouseOut.attach(this.oResizeGrip,"mouseout");this.oApp.exec("REGISTER_HOTKEY",["shift+esc","FOCUS_RESIZER"]);this.oApp.exec("ADD_APP_PROPERTY",["checkResizeGripPosition",jindo.$Fn(this.checkResizeGripPosition,this).bind()]);if(!!this.welNoticeLayer&&!Number(jindo.$Cookie().get(this.sCookieNotice))){this.welNoticeLayer.delegate("click","BUTTON.bt_clse",jindo.$Fn(this._closeNotice,this).bind());this.welNoticeLayer.show()}if(!!this.oApp.getEditingAreaHeight){this.nEditingAreaMinHeight=this.oApp.getEditingAreaHeight()}this.showVerticalResizer();if(this.isUseVerticalResizer()===false&&this.oApp.isUseModeChanger()===false){this.elModeToolbar.style.display="none"}},showVerticalResizer:function(){if(this.isUseVerticalResizer()){this.oResizeGrip.style.display="block"}else{this.oResizeGrip.style.display="none"}},isUseVerticalResizer:function(){return(typeof(this.htConversionMode)==="undefined"||typeof(this.htConversionMode.bUseVerticalResizer)==="undefined"||this.htConversionMode.bUseVerticalResizer===true)?true:false},checkResizeGripPosition:function(b){var a=jindo.$Document();var c=(jindo.$Element(this.oResizeGrip).offset().top-a.scrollPosition().top+25)-a.clientSize().height;if(c<=0){return}if(b){if(this.nEditingAreaMinHeight>this.oApp.getEditingAreaHeight()-c){c=(-1)*(this.nEditingAreaMinHeight-this.oApp.getEditingAreaHeight())}this.oApp.exec("MSG_EDITING_AREA_RESIZE_STARTED");this.oApp.exec("RESIZE_EDITING_AREA_BY",[0,(-1)*c]);this.oApp.exec("MSG_EDITING_AREA_RESIZE_ENDED")}this.oApp.exec("STOP_AUTORESIZE_EDITING_AREA")},$ON_FOCUS_RESIZER:function(){this.oApp.exec("IE_HIDE_CURSOR");this.oResizeGrip.focus()},_assignHTMLElements:function(b,a){this.oResizeGrip=jindo.$$.getSingle("BUTTON.husky_seditor_editingArea_verticalResizer",b);this.elModeToolbar=jindo.$$.getSingle("DIV.se2_conversion_mode",b);this.welNoticeLayer=jindo.$Element(jindo.$$.getSingle("DIV.husky_seditor_resize_notice",b));this.welConversionMode=jindo.$Element(this.oResizeGrip.parentNode)},_mouseover:function(a){a.stopBubble();this.welConversionMode.addClass("controller_on")},_mouseout:function(a){a.stopBubble();this.welConversionMode.removeClass("controller_on")},_mousedown:function(a){this.iStartHeight=a.pos().clientY;this.iStartHeightOffset=a.pos().layerY;this.$FnMouseMove.attach(document,"mousemove");this.$FnMouseUp.attach(document,"mouseup");this.iStartHeight=a.pos().clientY;this.oApp.exec("HIDE_ACTIVE_LAYER");this.oApp.exec("HIDE_ALL_DIALOG_LAYER");this.oApp.exec("MSG_EDITING_AREA_RESIZE_STARTED",[this.$FnMouseDown,this.$FnMouseMove,this.$FnMouseUp])},_mousemove:function(b){var a=b.pos().clientY-this.iStartHeight;this.oApp.exec("RESIZE_EDITING_AREA_BY",[0,a])},_mouseup:function(a){this.$FnMouseMove.detach(document,"mousemove");this.$FnMouseUp.detach(document,"mouseup");this.oApp.exec("MSG_EDITING_AREA_RESIZE_ENDED",[this.$FnMouseDown,this.$FnMouseMove,this.$FnMouseUp])},_closeNotice:function(){this.welNoticeLayer.hide();jindo.$Cookie().set(this.sCookieNotice,1,365*10)}});nhn.husky.SE_EditingArea_HTMLSrc=jindo.$Class({name:"SE_EditingArea_HTMLSrc",sMode:"HTMLSrc",bAutoResize:false,nMinHeight:null,$init:function(a){this.elEditingArea=jindo.$(a)},$BEFORE_MSG_APP_READY:function(){this.oNavigator=jindo.$Agent().navigator();this.oApp.exec("REGISTER_EDITING_AREA",[this])},$ON_MSG_APP_READY:function(){if(!!this.oApp.getEditingAreaHeight){this.nMinHeight=this.oApp.getEditingAreaHeight()}},$ON_CHANGE_EDITING_MODE:function(a){if(a==this.sMode){this.elEditingArea.style.display="block"}else{this.elEditingArea.style.display="none"}},$AFTER_CHANGE_EDITING_MODE:function(a,b){if(a==this.sMode&&!b){var c=new TextRange(this.elEditingArea);c.setSelection(0,0)}},startAutoResize:function(){var a={nMinHeight:this.nMinHeight,wfnCallback:jindo.$Fn(this.oApp.checkResizeGripPosition,this).bind()};if(this.oNavigator.msafari){a.wfnCallback=function(){}}this.bAutoResize=true;this.AutoResizer=new nhn.husky.AutoResizer(this.elEditingArea,a);this.AutoResizer.bind()},stopAutoResize:function(){this.AutoResizer.unbind()},getIR:function(){var a=this.getRawContents();if(this.oApp.applyConverter){a=this.oApp.applyConverter(this.sMode+"_TO_IR",a,this.oApp.getWYSIWYGDocument())}return a},setIR:function(c){if(c.toLowerCase()==="
      "||c.toLowerCase()==="

       

      "||c.toLowerCase()==="


      "||c.toLowerCase()==="

      "){c=""}var b=jindo.$Agent().navigator();if(b.ie&&b.nativeVersion==11&&document.documentMode==11){c=c.replace(/(

      $)/,"")}var a=c;if(this.oApp.applyConverter){a=this.oApp.applyConverter("IR_TO_"+this.sMode,a,this.oApp.getWYSIWYGDocument())}this.setRawContents(a)},setRawContents:function(a){if(typeof a!=="undefined"){this.elEditingArea.value=a}},getRawContents:function(){return this.elEditingArea.value},focus:function(){this.elEditingArea.focus()}});if(typeof window.TextRange=="undefined"){window.TextRange={}}TextRange=function(b,a){this._o=b;this._oDoc=(a||document)};TextRange.prototype.getSelection=function(){var d=this._o;var b=[-1,-1];if(isNaN(this._o.selectionStart)){d.focus();var a=this._oDoc.body.createTextRange();var c=null;c=this._oDoc.selection.createRange().duplicate();a.moveToElementText(d);c.collapse(true);a.setEndPoint("EndToEnd",c);b[0]=a.text.length;c=this._oDoc.selection.createRange().duplicate();a.moveToElementText(d);c.collapse(false);a.setEndPoint("EndToEnd",c);b[1]=a.text.length;d.blur()}else{b[0]=d.selectionStart;b[1]=d.selectionEnd}return b};TextRange.prototype.setSelection=function(d,a){var c=this._o;if(typeof a=="undefined"){a=d}if(c.setSelectionRange){c.setSelectionRange(d,a)}else{if(c.createTextRange){var b=c.createTextRange();b.collapse(true);b.moveStart("character",d);b.moveEnd("character",a-d);b.select();c.blur()}}};TextRange.prototype.copy=function(){var a=this.getSelection();return this._o.value.substring(a[0],a[1])};TextRange.prototype.paste=function(c){var h=this._o;var f=this.getSelection();var e=h.value;var g=e.substr(0,f[0]);var d=e.substr(f[1]);e=g+c+d;h.value=e;var j=0;if(typeof this._oDoc.body.style.maxHeight=="undefined"){var b=g.match(/\n/gi);j=(b!==null?b.length:0)}this.setSelection(f[0]+c.length-j)};TextRange.prototype.cut=function(){var a=this.copy();this.paste("");return a};nhn.husky.SE_EditingArea_TEXT=jindo.$Class({name:"SE_EditingArea_TEXT",sMode:"TEXT",sRxConverter:"@[0-9]+@",bAutoResize:false,nMinHeight:null,$init:function(a){this.elEditingArea=jindo.$(a)},$BEFORE_MSG_APP_READY:function(){this.oNavigator=jindo.$Agent().navigator();this.oApp.exec("REGISTER_EDITING_AREA",[this]);this.oApp.exec("ADD_APP_PROPERTY",["getTextAreaContents",jindo.$Fn(this.getRawContents,this).bind()])},$ON_MSG_APP_READY:function(){if(!!this.oApp.getEditingAreaHeight){this.nMinHeight=this.oApp.getEditingAreaHeight()}},$ON_REGISTER_CONVERTERS:function(){this.oApp.exec("ADD_CONVERTER",["IR_TO_TEXT",jindo.$Fn(this.irToText,this).bind()]);this.oApp.exec("ADD_CONVERTER",["TEXT_TO_IR",jindo.$Fn(this.textToIr,this).bind()])},$ON_CHANGE_EDITING_MODE:function(a){if(a==this.sMode){this.elEditingArea.style.display="block"}else{this.elEditingArea.style.display="none"}},$AFTER_CHANGE_EDITING_MODE:function(a,b){if(a==this.sMode&&!b){var c=new TextRange(this.elEditingArea);c.setSelection(0,0)}},irToText:function(d){var a=d,b=0;var c=a.match(new RegExp(this.sRxConverter));if(c!==null){a=a.replace(new RegExp(this.sRxConverter),"")}a=a.replace(/\r/g,"");a=a.replace(/[\n|\t]/g,"");a=a.replace(/[\v|\f]/g,"");a=a.replace(/


      <\/p>/gi,"\n");a=a.replace(/

       <\/P>/gi,"\n");a=a.replace(//gi,"\n");a=a.replace(//gi,"\n");a=a.replace(/<\/p(\s[^\/]*)?>/gi,"\n");a=a.replace(/<\/li(\s[^\/]*)?>/gi,"\n");a=a.replace(/<\/tr(\s[^\/]*)?>/gi,"\n");b=a.lastIndexOf("\n");if(b>-1&&a.substring(b)=="\n"){a=a.substring(0,b)}a=jindo.$S(a).stripTags().toString();a=this.unhtmlSpecialChars(a);if(c!==null){a=c[0]+a}return a},textToIr:function(c){if(!c){return}var a=c,b=null;b=a.match(new RegExp(this.sRxConverter));if(b!==null){a=a.replace(b[0],"")}a=this.htmlSpecialChars(a);a=this._addLineBreaker(a);if(b!==null){a=b[0]+a}return a},_addLineBreaker:function(b){if(this.oApp.sLineBreaker==="BR"){return b.replace(/\r?\n/g,"
      ")}var c=new StringBuffer(),f=b.split("\n"),e=f.length,d="";for(var a=0;a");c.append(f[a]);c.append("

      ")}else{if(!jindo.$Agent().navigator().ie){c.append("


      ")}else{c.append("

       

      ")}}}return c.toString()},startAutoResize:function(){var a={nMinHeight:this.nMinHeight,wfnCallback:jindo.$Fn(this.oApp.checkResizeGripPosition,this).bind()};if(this.oNavigator.msafari){a.wfnCallback=function(){}}this.bAutoResize=true;this.AutoResizer=new nhn.husky.AutoResizer(this.elEditingArea,a);this.AutoResizer.bind()},stopAutoResize:function(){this.AutoResizer.unbind()},getIR:function(){var a=this.getRawContents();if(this.oApp.applyConverter){a=this.oApp.applyConverter(this.sMode+"_TO_IR",a,this.oApp.getWYSIWYGDocument())}return a},setIR:function(b){var a=b;if(this.oApp.applyConverter){a=this.oApp.applyConverter("IR_TO_"+this.sMode,a,this.oApp.getWYSIWYGDocument())}this.setRawContents(a)},setRawContents:function(a){if(typeof a!=="undefined"){this.elEditingArea.value=a}},getRawContents:function(){return this.elEditingArea.value},focus:function(){this.elEditingArea.focus()},htmlSpecialChars:function(a){return a.replace(/&/g,"&").replace(//g,">").replace(/ /g," ")},unhtmlSpecialChars:function(a){return a.replace(/</g,"<").replace(/>/g,">").replace(/ /g," ").replace(/&/g,"&")}});nhn.husky.SE_EditingArea_WYSIWYG=jindo.$Class({name:"SE_EditingArea_WYSIWYG",status:nhn.husky.PLUGIN_STATUS.NOT_READY,sMode:"WYSIWYG",iframe:null,doc:null,bStopCheckingBodyHeight:false,bAutoResize:false,nBodyMinHeight:0,nScrollbarWidth:0,iLastUndoRecorded:0,_nIFrameReadyCount:50,bWYSIWYGEnabled:false,$init:function(b){this.iframe=jindo.$(b);var a=jindo.$Agent().navigator();if(a.ie){this.iframe.style.display="none"}this.sBlankPageURL="smart_editor2_inputarea.html";this.sBlankPageURL_EmulateIE7="smart_editor2_inputarea_ie8.html";this.aAddtionalEmulateIE7=[];this.htOptions=nhn.husky.SE2M_Configuration.SE_EditingAreaManager;if(this.htOptions){this.sBlankPageURL=this.htOptions.sBlankPageURL||this.sBlankPageURL;this.sBlankPageURL_EmulateIE7=this.htOptions.sBlankPageURL_EmulateIE7||this.sBlankPageURL_EmulateIE7;this.aAddtionalEmulateIE7=this.htOptions.aAddtionalEmulateIE7||this.aAddtionalEmulateIE7}this.aAddtionalEmulateIE7.push(8);this.sIFrameSrc=this.sBlankPageURL;if(a.ie&&jindo.$A(this.aAddtionalEmulateIE7).has(a.nativeVersion)){this.sIFrameSrc=this.sBlankPageURL_EmulateIE7}var e=this.sIFrameSrc,b=this.iframe,d=jindo.$Fn(this.initIframe,this).bind(),c=jindo.$Fn(function(){this.iframe.src=e},this).bind();if(!a.ie||(a.version>=9&&!!document.addEventListener)){b.addEventListener("load",d,false);b.addEventListener("error",c,false)}else{b.attachEvent("onload",d);b.attachEvent("onerror",c)}b.src=e;this.elEditingArea=b},$BEFORE_MSG_APP_READY:function(){this.oEditingArea=this.iframe.contentWindow.document;this.oApp.exec("REGISTER_EDITING_AREA",[this]);this.oApp.exec("ADD_APP_PROPERTY",["getWYSIWYGWindow",jindo.$Fn(this.getWindow,this).bind()]);this.oApp.exec("ADD_APP_PROPERTY",["getWYSIWYGDocument",jindo.$Fn(this.getDocument,this).bind()]);this.oApp.exec("ADD_APP_PROPERTY",["isWYSIWYGEnabled",jindo.$Fn(this.isWYSIWYGEnabled,this).bind()]);this.oApp.exec("ADD_APP_PROPERTY",["getRawHTMLContents",jindo.$Fn(this.getRawHTMLContents,this).bind()]);this.oApp.exec("ADD_APP_PROPERTY",["setRawHTMLContents",jindo.$Fn(this.setRawHTMLContents,this).bind()]);if(!!this.isWYSIWYGEnabled()){this.oApp.exec("ENABLE_WYSIWYG_RULER",[])}this.oApp.registerBrowserEvent(this.getDocument().body,"paste","EVENT_EDITING_AREA_PASTE")},$ON_MSG_APP_READY:function(){if(!this.oApp.hasOwnProperty("saveSnapShot")){this.$ON_EVENT_EDITING_AREA_MOUSEUP=function(){};this._recordUndo=function(){}}this._bIERangeReset=true;if(this.oApp.oNavigator.ie){jindo.$Fn(function(b){var a=this.iframe.contentWindow.document.selection;if(a&&a.type.toLowerCase()==="control"&&b.key().keyCode===8){this.oApp.exec("EXECCOMMAND",["delete",false,false]);b.stop()}this._bIERangeReset=false},this).attach(this.iframe.contentWindow.document,"keydown");jindo.$Fn(function(a){this._oIERange=null;this._bIERangeReset=true},this).attach(this.iframe.contentWindow.document.body,"mousedown");jindo.$Fn(this._onIEBeforeDeactivate,this).attach(this.iframe.contentWindow.document.body,"beforedeactivate");jindo.$Fn(function(a){this._bIERangeReset=false},this).attach(this.iframe.contentWindow.document.body,"mouseup")}else{}this.fnSetBodyHeight=jindo.$Fn(this._setBodyHeight,this).bind();this.fnCheckBodyChange=jindo.$Fn(this._checkBodyChange,this).bind();this.fnSetBodyHeight();this._setScrollbarWidth()},_setScrollbarWidth:function(){var a=this.getDocument(),b=a.createElement("div");b.style.width="100px";b.style.height="100px";b.style.overflow="scroll";b.style.position="absolute";b.style.top="-9999px";a.body.appendChild(b);this.nScrollbarWidth=b.offsetWidth-b.clientWidth;a.body.removeChild(b)},$AFTER_EVENT_EDITING_AREA_KEYUP:function(a){if(!this.bAutoResize){return}var b=a.key();if((b.keyCode>=33&&b.keyCode<=40)||b.alt||b.ctrl||b.keyCode===16){return}this._setAutoResize()},$AFTER_PASTE_HTML:function(){if(!this.bAutoResize){return}this._setAutoResize()},startAutoResize:function(){this.oApp.exec("STOP_CHECKING_BODY_HEIGHT");this.bAutoResize=true;var a=this.oApp.oNavigator;if(a.ie&&a.version<9){jindo.$Element(this.getDocument().body).css({overflow:"visible"})}else{jindo.$Element(this.getDocument().body).css({overflowX:"visible",overflowY:"hidden"})}this._setAutoResize();this.nCheckBodyInterval=setInterval(this.fnCheckBodyChange,500);this.oApp.exec("START_FLOAT_TOOLBAR")},stopAutoResize:function(){this.bAutoResize=false;clearInterval(this.nCheckBodyInterval);this.oApp.exec("STOP_FLOAT_TOOLBAR");jindo.$Element(this.getDocument().body).css({overflow:"visible",overflowY:"visible"});this.oApp.exec("START_CHECKING_BODY_HEIGHT")},_checkBodyChange:function(){if(!this.bAutoResize){return}var a=this.getDocument().body.innerHTML.length;if(a!==this.nBodyLength){this.nBodyLength=a;this._setAutoResize()}},_getResizeHeight:function(){var d=this.getDocument().body,b,f,a=["width","fontFamily","fontSize","fontWeight","fontStyle","lineHeight","letterSpacing","textTransform","wordSpacing"],e,c;if(!this.oApp.oNavigator.firefox&&!this.oApp.oNavigator.safari){if(this.oApp.oNavigator.ie&&this.oApp.oNavigator.version===8&&document.documentMode===8){jindo.$Element(d).css("height","0px")}f=parseInt(d.scrollHeight,10);if(f-1){e.lineHeight=(parseInt(e.lineHeight,10)/parseInt(e.fontSize,10))}jindo.$Element(this.elDummy).css(e);this.elDummy.innerHTML=d.innerHTML;f=this.elDummy.scrollHeight;return f},_setAutoResize:function(){var g=this.getDocument().body,c=jindo.$Element(g),h,d,b,f,e=false,a=this.oApp.oNavigator;this.nTopBottomMargin=this.nTopBottomMargin||(parseInt(c.css("marginTop"),10)+parseInt(c.css("marginBottom"),10));this.nBodyMinHeight=this.nBodyMinHeight||(this.oApp.getEditingAreaHeight()-this.nTopBottomMargin);if((a.ie&&a.nativeVersion>=9)||a.chrome){c.css("height","0px");this.iframe.style.height="0px"}h=this._getResizeHeight();if(a.ie){if(h>this.nBodyMinHeight){b=this.oApp.getCurrentStyle();f=parseInt(b.fontSize,10)*b.lineHeight;if(fthis.nBodyMinHeight){b=this.oApp.getCurrentStyle();f=parseInt(b.fontSize,10)*b.lineHeight;if(fa?f-h:d);if(this._isHorizontalScrollbarVisible()){c-=this.nScrollbarWidth}b.css("height",c+"px");setTimeout(this.fnSetBodyHeight,500)},_isHorizontalScrollbarVisible:function(){var a=this.getDocument();if(a.documentElement.clientWidth8){var d=jindo.$$.getSingle("DIV.husky_seditor_editing_area_container").childNodes[0];if((d.tagName=="DIV")&&(d.style.zIndex==1000)){d.parentNode.removeChild(d)}}this.iframe.style.display="block";this.oApp.exec("REFRESH_WYSIWYG",[]);this.oApp.exec("SET_EDITING_WINDOW",[this.getWindow()]);this.oApp.exec("START_CHECKING_BODY_HEIGHT")}else{this.iframe.style.display="none";this.oApp.exec("STOP_CHECKING_BODY_HEIGHT")}},$AFTER_CHANGE_EDITING_MODE:function(a,b){this._oIERange=null},$ON_REFRESH_WYSIWYG:function(){if(!jindo.$Agent().navigator().firefox){return}this._disableWYSIWYG();this._enableWYSIWYG()},$ON_ENABLE_WYSIWYG:function(){this._enableWYSIWYG()},$ON_DISABLE_WYSIWYG:function(){this._disableWYSIWYG()},$ON_IE_HIDE_CURSOR:function(){if(!this.oApp.oNavigator.ie){return}this._onIEBeforeDeactivate();var a=this.oApp.getWYSIWYGDocument().selection;if(a&&a.createRange){try{a.empty()}catch(b){a=this.oApp.getSelection();a.select();a.oBrowserSelection.selectNone()}}else{this.oApp.getEmptySelection().oBrowserSelection.selectNone()}},$AFTER_SHOW_ACTIVE_LAYER:function(){this.oApp.exec("IE_HIDE_CURSOR",[]);this.bActiveLayerShown=true},$BEFORE_EVENT_EDITING_AREA_KEYDOWN:function(a){this._bKeyDown=true},$ON_EVENT_EDITING_AREA_KEYDOWN:function(a){if(this.oApp.getEditingMode()!==this.sMode){return}var b=a.key();if(this.oApp.oNavigator.ie){switch(b.keyCode){case 33:this._pageUp(a);break;case 34:this._pageDown(a);break;case 8:this._backspace(a);break;default:}}else{if(this.oApp.oNavigator.firefox){if(b.keyCode===8){this._backspace(a)}}}this._recordUndo(b)},_backspace:function(b){var a=this.oApp.getSelection(),c=null;if(!a.collapsed){return}c=a.getNodeAroundRange(true,false);if(c&&c.nodeType===3){if(/^[\n]*$/.test(c.nodeValue)){c=c.previousSibling}else{if(c.nodeValue==="\u200B"||c.nodeValue==="\uFEFF"){c.nodeValue=""}}}if(!!c&&c.nodeType===1&&c.tagName==="TABLE"){jindo.$Element(c).leave();b.stop(jindo.$Event.CANCEL_ALL)}},$BEFORE_EVENT_EDITING_AREA_KEYUP:function(a){if(!this._bKeyDown){return false}this._bKeyDown=false},$ON_EVENT_EDITING_AREA_MOUSEUP:function(a){this.oApp.saveSnapShot()},$BEFORE_PASTE_HTML:function(){if(this.oApp.getEditingMode()!==this.sMode){this.oApp.exec("CHANGE_EDITING_MODE",[this.sMode])}},$ON_PASTE_HTML:function(b,g,e){var c,j,f,l,h,d,k,a;if(this.oApp.getEditingMode()!==this.sMode){return}if(!e){this.oApp.exec("RECORD_UNDO_BEFORE_ACTION",["PASTE HTML"])}j=jindo.$Agent().navigator();c=g||this.oApp.getSelection();if(j.ie&&j.nativeVersion==8&&document.documentMode==8){b=b+unescape("%uFEFF")}c.pasteHTML(b);if(!j.ie){f=c.placeStringBookmark();this.oApp.getWYSIWYGDocument().body.innerHTML=this.oApp.getWYSIWYGDocument().body.innerHTML;c.moveToBookmark(f);c.collapseToEnd();c.select();c.removeStringBookmark(f);c=this.oApp.getSelection();if(!!g){g.setRange(c)}}else{c.collapseToEnd();c.select();this._oIERange=null;this._bIERangeReset=false}if(b.indexOf("-1){l=c.startContainer;if(l.nodeType===1&&l.tagName==="P"){h=jindo.$Element(l).child(function(m){return(m.$value().nodeType===1&&m.$value().tagName==="IMG")},1);if(h.length>0){d=h[h.length-1].$value();k=d.nextSibling;while(k){a=k.nextSibling;if(k.nodeType===3&&(k.nodeValue===" "||k.nodeValue===unescape("%u00A0"))){l.removeChild(k)}k=a}}}}if(!e){this.oApp.exec("RECORD_UNDO_AFTER_ACTION",["PASTE HTML"])}},$ON_FOCUS_N_CURSOR:function(d,a){var b,c;if(a&&(b=jindo.$(a,this.getDocument()))){clearTimeout(this._nTimerFocus);this._nTimerFocus=setTimeout(jindo.$Fn(function(e){this._scrollIntoView(e);this.oApp.exec("FOCUS")},this).bind(b),300);return}c=this.oApp.getSelection();if(!c.collapsed){if(d){c.collapseToEnd()}else{c.collapseToStart()}c.select()}else{if(d){this.oApp.exec("FOCUS");b=this.getDocument().body;c.selectNode(b);c.collapseToEnd();c.select();this._scrollIntoView(b)}else{this.oApp.exec("FOCUS")}}},_getElementVerticalPosition:function(b){var a=0,c=b,d={nTop:0,nBottom:0};if(!b){return d}while(c){a+=c.offsetTop;c=c.offsetParent}d.nTop=a;d.nBottom=a+jindo.$Element(b).height();return d},_getVisibleVerticalPosition:function(){var a,b,d,c={nTop:0,nBottom:0};a=this.getWindow();b=this.getDocument();d=a.innerHeight?a.innerHeight:b.documentElement.clientHeight||b.body.clientHeight;c.nTop=a.pageYOffset||b.documentElement.scrollTop;c.nBottom=c.nTop+d;return c},_isElementVisible:function(b,a){return(b.nTop>=a.nTop&&b.nBottom<=a.nBottom)},_scrollIntoView:function(c){var d=this._getElementVerticalPosition(c),b=this._getVisibleVerticalPosition(),a=0;if(this._isElementVisible(d,b)){return}if((a=d.nBottom-b.nBottom)>0){this.getWindow().scrollTo(0,b.nTop+a);return}this.getWindow().scrollTo(0,d.nTop)},$BEFORE_MSG_EDITING_AREA_RESIZE_STARTED:function(){if(!jindo.$Agent().navigator().ie){var a=null;a=this.oApp.getSelection();this.sBM=a.placeStringBookmark()}},$AFTER_MSG_EDITING_AREA_RESIZE_ENDED:function(a,b,d){if(this.oApp.getEditingMode()!==this.sMode){return}this.oApp.exec("REFRESH_WYSIWYG",[]);if(!jindo.$Agent().navigator().ie){var c=this.oApp.getEmptySelection();c.moveToBookmark(this.sBM);c.select();c.removeStringBookmark(this.sBM)}},$ON_CLEAR_IE_BACKUP_SELECTION:function(){this._oIERange=null},$ON_RESTORE_IE_SELECTION:function(){if(this._oIERange){try{this._oIERange.select();this._oPrevIERange=this._oIERange;this._oIERange=null}catch(a){}}},$ON_EVENT_EDITING_AREA_PASTE:function(a){this.oApp.delayedExec("EVENT_EDITING_AREA_PASTE_DELAY",[a],0)},$ON_EVENT_EDITING_AREA_PASTE_DELAY:function(a){this._replaceBlankToNbsp(a.element)},_replaceBlankToNbsp:function(c){var b=this.oApp.oNavigator;if(!b.ie){return}if(b.nativeVersion!==9||document.documentMode!==7){return}if(c.nodeType!==1){return}if(c.tagName==="BR"){return}var a=jindo.$$("p:empty()",this.oApp.getWYSIWYGDocument().body,{oneTimeOffCache:true});jindo.$A(a).forEach(function(e,d,f){e.innerHTML=" "})},_pageUp:function(c){var b=this._getEditorHeight(),d=jindo.$Document(this.oApp.getWYSIWYGDocument()).scrollPosition(),a;if(d.top<=b){a=0}else{a=d.top-b}this.oApp.getWYSIWYGWindow().scrollTo(0,a);c.stop()},_pageDown:function(c){var b=this._getEditorHeight(),d=jindo.$Document(this.oApp.getWYSIWYGDocument()).scrollPosition(),e=this._getBodyHeight(),a;if(d.top+b>=e){a=e-b}else{a=d.top+b}this.oApp.getWYSIWYGWindow().scrollTo(0,a);c.stop()},_getEditorHeight:function(){return this.oApp.elEditingAreaContainer.offsetHeight-this.nTopBottomMargin},_getBodyHeight:function(){return parseInt(this.getDocument().body.scrollHeight,10)},initIframe:function(){try{if(!this.iframe.contentWindow.document||!this.iframe.contentWindow.document.body||this.iframe.contentWindow.document.location.href==="about:blank"){throw new Error("Access denied")}var b=(!!nhn.husky.SE2M_Configuration.SE2M_CSSLoader&&nhn.husky.SE2M_Configuration.SE2M_CSSLoader.sCSSBaseURI)?nhn.husky.SE2M_Configuration.SE2M_CSSLoader.sCSSBaseURI:"";if(!!nhn.husky.SE2M_Configuration.SE_EditingAreaManager.sCSSBaseURI){b=nhn.husky.SE2M_Configuration.SE_EditingAreaManager.sCSSBaseURI}if(b){var f=this.getDocument();var c=f.getElementsByTagName("head")[0];var a=f.createElement("link");a.type="text/css";a.rel="stylesheet";a.href=b+"/smart_editor2_in.css";c.appendChild(a)}this._enableWYSIWYG();this.status=nhn.husky.PLUGIN_STATUS.READY}catch(d){if(this._nIFrameReadyCount-->0){setTimeout(jindo.$Fn(this.initIframe,this).bind(),100)}else{throw ("iframe for WYSIWYG editing mode can't be initialized. Please check if the iframe document exists and is also accessable(cross-domain issues). ")}}},getIR:function(){var a=this.iframe.contentWindow.document.body.innerHTML,b;if(this.oApp.applyConverter){b=this.oApp.applyConverter(this.sMode+"_TO_IR",a,this.oApp.getWYSIWYGDocument())}else{b=a}return b},setIR:function(a){var f,g=this.oApp.oNavigator,h=jindo.$Agent().navigator(),d=g.ie&&h.nativeVersion<11,j=d?"":"
      ";if(this.oApp.applyConverter){f=this.oApp.applyConverter("IR_TO_"+this.sMode,a,this.oApp.getWYSIWYGDocument())}else{f=a}this.iframe.contentWindow.document.body.innerHTML=f;if((this.iframe.contentWindow.document.body.innerHTML).replace(/[\r\n\t\s]*/,"")===""){if(this.oApp.sLineBreaker!=="BR"){j="

      "+j+"

      "}this.iframe.contentWindow.document.body.innerHTML=j}if(d&&this.oApp.getEditingMode()===this.sMode){var c=this.oApp.getWYSIWYGDocument().body.getElementsByTagName("P");for(var e=0,b=c.length;e=33&&a.keyCode<=40){this.oApp.saveSnapShot();return}if(a.alt||a.ctrl||a.keyCode===16){return}if(this.oApp.getLastKey()===a.keyCode){return}this.oApp.setLastKey(a.keyCode);if(!a.enter&&a.keyCode!==46&&a.keyCode!==8){return}this.oApp.exec("RECORD_UNDO_ACTION",["KEYPRESS("+a.keyCode+")",{bMustBlockContainer:true}])},_enableWYSIWYG:function(){if(this.iframe.contentWindow.document.body.contentEditable!==null){this.iframe.contentWindow.document.body.contentEditable=true}else{this.iframe.contentWindow.document.designMode="on"}this.bWYSIWYGEnabled=true;if(jindo.$Agent().navigator().firefox){setTimeout(jindo.$Fn(function(){this.iframe.contentWindow.document.execCommand("enableInlineTableEditing",false,false)},this).bind(),0)}},_disableWYSIWYG:function(){if(this.iframe.contentWindow.document.body.contentEditable!==null){this.iframe.contentWindow.document.body.contentEditable=false}else{this.iframe.contentWindow.document.designMode="off"}this.bWYSIWYGEnabled=false},isWYSIWYGEnabled:function(){return this.bWYSIWYGEnabled}});nhn.husky.SE_PasteHandler=jindo.$Class({name:"SE_PasteHandler",$init:function(a){this.sParagraphContainer=a||"P";this.aConversionTarget=["TABLE"];this.htBrowser=jindo.$Agent().navigator()},$ON_MSG_APP_READY:function(){if(!this.htBrowser.safari||(this.htBrowser.safari&&this.htBrowser.version>=6)){this.elBody=this.oApp.getWYSIWYGDocument().body;this.wfnPasteHandler=jindo.$Fn(this._handlePaste,this);this.wfnPasteHandler.attach(this.elBody,"paste");this.elEditingAreaContainer=jindo.$$.getSingle("DIV.husky_seditor_editing_area_container",null,{oneTimeOffCache:true});if(this.htBrowser.ie&&this.htBrowser.nativeVersion<=10&&this.htBrowser.version<=10){this.wfnBeforePasteHandler=jindo.$Fn(this._handleBeforePaste,this);this.wfnBeforePasteHandler.attach(this.elBody,"beforePaste")}}},_handleBeforePaste:function(d){if(!d){var d=window.event}var f=d.key(),b=this.oApp.getSelection();if(!b.collapsed&&f.ctrl!=false){b.deleteContents()}this._sBM_IE=b.placeStringBookmark();var c=b.getStringBookmark(this._sBM_IE,true);var a=document.createTextNode("");this.zwspStart=a.cloneNode(true);this.zwspStart.nodeValue="\u200b";this.zwspEnd=this.zwspStart.cloneNode(true);c.parentNode.insertBefore(this.zwspEnd,c);c.parentNode.insertBefore(this.zwspStart,this.zwspEnd);b.setEndBefore(this.zwspEnd);b.collapseToEnd();if(f.ctrl){b.select()}},_handlePaste:function(c){if(this.htBrowser.chrome||(this.htBrowser.safari&&this.htBrowser.version>=6)){var b=c._event.clipboardData.getData("text/html");var d=document.createElement("DIV");d.innerHTML=b;var a=jindo.$$.getSingle("style",d,{oneTimeOffCache:true});if(a){var e=a.innerHTML;e=e.replace(/"/g,"'");this._sStyleFromClipboard=e}}this._preparePaste();setTimeout(jindo.$Fn(function(){var m=new RegExp("^[\u200b]");if(!!this.zwspStart&&!!this.zwspStart.nodeValue){this.zwspStart.nodeValue=this.zwspStart.nodeValue.replace(m,"");if(this.zwspStart.nodeValue==""&&!!this.zwspStart.paretNode){this.zwspStart.parentNode.removeChild(this.zwspStart)}}var g=new RegExp("[\u200b]$");if(!!this.zwspEnd&&!!this.zwspEnd.nodeValue){this.zwspEnd.nodeValue=this.zwspEnd.nodeValue.replace(g,"");if(this.zwspEnd.nodeValue==""&&!!this.zwspEnd.parentNode){this.zwspEnd.parentNode.removeChild(this.zwspEnd)}}try{this._processPaste()}catch(l){if(typeof(JEagleEyeClient)!="undefined"){var f=l.lineNumber;if(!f){f=0}var j="hp_SE_PasteHandler.js/_handlePaste";if(j){var h="http://blog.naver.com/";h+=j;j=h}JEagleEyeClient.sendError(l,j,f)}}var k=this.oApp.getSelection();this._moveToStringBookmark(k);k.collapseToEnd();k.select();this._removeStringBookmark(k)},this).bind(),0)},_preparePaste:function(){this._saveOriginalContents()},_saveOriginalContents:function(){var b=this.oApp.getSelection();if(!b.isCollapsed){b.deleteContents()}if(!this._sBM_IE){this._sBM=b.placeStringBookmark();var c=b.getStringBookmark(this._sBM,true);var d=b.getStringBookmark(this._sBM);var a=document.createTextNode("");this.zwspStart=a.cloneNode(true);this.zwspStart.nodeValue="\u200b";this.zwspEnd=this.zwspStart.cloneNode(true);c.parentNode.insertBefore(this.zwspEnd,c);c.parentNode.insertBefore(this.zwspStart,this.zwspEnd);b.setEndBefore(this.zwspEnd);b.collapseToEnd();b.select();if(this.htBrowser.ie&&this.htBrowser.nativeVersion==11&&this.htBrowser.version==11){}}},_processPaste:function(){this._savePastedContents();try{if(!!this.elPasteHelper){this._clearPasteHelper();this._showPasteHelper()}else{this._createPasteHelper()}this._loadToPasteHelper();this._loadToBody();this._hidePasteHelper()}catch(a){this._hidePasteHelper();throw a}this._hidePasteHelper()},_savePastedContents:function(){var c=this.oApp.getSelection();this._moveToStringBookmark(c);c.select();this.oSelectionClone=c.cloneContents();c.collapseToEnd();c.select();var a=this._outerHTML(this.oSelectionClone);this._isPastedContentsEmpty=true;if(a!=""){this._isPastedContentsEmpty=false;if(this.htBrowser.firefox||(this.htBrowser.safari&&this.htBrowser.version>=6)){var b=a.match(/"):e.push('');return e.join("")},htmlEncode:function(a){return(""+a).replace(/&/g,"&").replace(/>/g,">").replace(//g,">")},getNextNumber:function(){var a= -0;return function(){return++a}}(),getNextId:function(){return"cke_"+this.getNextNumber()},override:function(a,b){var e=b(a);e.prototype=a.prototype;return e},setTimeout:function(a,b,e,c,g){g||(g=window);e||(e=g);return g.setTimeout(function(){c?a.apply(e,[].concat(c)):a.apply(e)},b||0)},trim:function(){var a=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(b){return b.replace(a,"")}}(),ltrim:function(){var a=/^[ \t\n\r]+/g;return function(b){return b.replace(a,"")}}(),rtrim:function(){var a=/[ \t\n\r]+$/g; -return function(b){return b.replace(a,"")}}(),indexOf:function(a,b){if(typeof b=="function")for(var c=0,d=a.length;c=0?a[c]:null},bind:function(a,b){return function(){return a.apply(b,arguments)}},createClass:function(a){var b=a.$,c=a.base,d=a.privates||a._,g=a.proto,a=a.statics;!b&&(b=function(){c&&this.base.apply(this, -arguments)});if(d)var k=b,b=function(){var a=this._||(this._={}),b;for(b in d){var f=d[b];a[b]=typeof f=="function"?CKEDITOR.tools.bind(f,this):f}k.apply(this,arguments)};if(c){b.prototype=this.prototypedCopy(c.prototype);b.prototype.constructor=b;b.base=c;b.baseProto=c.prototype;b.prototype.base=function(){this.base=c.prototype.base;c.apply(this,arguments);this.base=arguments.callee}}g&&this.extend(b.prototype,g,true);a&&this.extend(b,a,true);return b},addFunction:function(a,f){return b.push(function(){return a.apply(f|| -this,arguments)})-1},removeFunction:function(a){b[a]=null},callFunction:function(a){var f=b[a];return f&&f.apply(window,Array.prototype.slice.call(arguments,1))},cssLength:function(){var a=/^-?\d+\.?\d*px$/,b;return function(c){b=CKEDITOR.tools.trim(c+"")+"px";return a.test(b)?b:c||""}}(),convertToPx:function(){var a;return function(b){if(!a){a=CKEDITOR.dom.element.createFromHtml('
      ',CKEDITOR.document); -CKEDITOR.document.getBody().append(a)}if(!/%$/.test(b)){a.setStyle("width",b);return a.$.clientWidth}return b}}(),repeat:function(a,b){return Array(b+1).join(a)},tryThese:function(){for(var a,b=0,c=arguments.length;b8)&&c)b=c+":"+b;return new CKEDITOR.dom.nodeList(this.$.getElementsByTagName(b))},getHead:function(){var b=this.$.getElementsByTagName("head")[0];return b= -b?new CKEDITOR.dom.element(b):this.getDocumentElement().append(new CKEDITOR.dom.element("head"),true)},getBody:function(){return new CKEDITOR.dom.element(this.$.body)},getDocumentElement:function(){return new CKEDITOR.dom.element(this.$.documentElement)},getWindow:function(){var b=new CKEDITOR.dom.window(this.$.parentWindow||this.$.defaultView);return(this.getWindow=function(){return b})()},write:function(b){this.$.open("text/html","replace");CKEDITOR.env.isCustomDomain()&&(this.$.domain=document.domain); -this.$.write(b);this.$.close()}});CKEDITOR.dom.nodeList=function(b){this.$=b};CKEDITOR.dom.nodeList.prototype={count:function(){return this.$.length},getItem:function(b){if(b<0||b>=this.$.length)return null;return(b=this.$[b])?new CKEDITOR.dom.node(b):null}};CKEDITOR.dom.element=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createElement(b));CKEDITOR.dom.domObject.call(this,b)}; -CKEDITOR.dom.element.get=function(b){return(b=typeof b=="string"?document.getElementById(b)||document.getElementsByName(b)[0]:b)&&(b.$?b:new CKEDITOR.dom.element(b))};CKEDITOR.dom.element.prototype=new CKEDITOR.dom.node;CKEDITOR.dom.element.createFromHtml=function(b,c){var a=new CKEDITOR.dom.element("div",c);a.setHtml(b);return a.getFirst().remove()}; -CKEDITOR.dom.element.setMarker=function(b,c,a,f){var e=c.getCustomData("list_marker_id")||c.setCustomData("list_marker_id",CKEDITOR.tools.getNextNumber()).getCustomData("list_marker_id"),d=c.getCustomData("list_marker_names")||c.setCustomData("list_marker_names",{}).getCustomData("list_marker_names");b[e]=c;d[a]=1;return c.setCustomData(a,f)};CKEDITOR.dom.element.clearAllMarkers=function(b){for(var c in b)CKEDITOR.dom.element.clearMarkers(b,b[c],1)}; -CKEDITOR.dom.element.clearMarkers=function(b,c,a){var f=c.getCustomData("list_marker_names"),e=c.getCustomData("list_marker_id"),d;for(d in f)c.removeCustomData(d);c.removeCustomData("list_marker_names");if(a){c.removeCustomData("list_marker_id");delete b[e]}}; -(function(){function b(a){for(var b=0,e=0,d=c[a].length;e]*>/g, -""):a},getOuterHtml:function(){if(this.$.outerHTML)return this.$.outerHTML.replace(/<\?[^>]*>/,"");var a=this.$.ownerDocument.createElement("div");a.appendChild(this.$.cloneNode(true));return a.innerHTML},getClientRect:function(){var a=CKEDITOR.tools.extend({},this.$.getBoundingClientRect());!a.width&&(a.width=a.right-a.left);!a.height&&(a.height=a.bottom-a.top);return a},setHtml:function(){var a=function(a){return this.$.innerHTML=a};return CKEDITOR.env.ie&&CKEDITOR.env.version<9?function(a){try{return this.$.innerHTML= -a}catch(b){this.$.innerHTML="";var c=new CKEDITOR.dom.element("body",this.getDocument());c.$.innerHTML=a;for(c=c.getChildren();c.count();)this.append(c.getItem(0));return a}}:a}(),setText:function(a){CKEDITOR.dom.element.prototype.setText=this.$.innerText!=void 0?function(a){return this.$.innerText=a}:function(a){return this.$.textContent=a};return this.setText(a)},getAttribute:function(){var a=function(a){return this.$.getAttribute(a,2)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)? -function(a){switch(a){case "class":a="className";break;case "http-equiv":a="httpEquiv";break;case "name":return this.$.name;case "tabindex":a=this.$.getAttribute(a,2);a!==0&&this.$.tabIndex===0&&(a=null);return a;case "checked":a=this.$.attributes.getNamedItem(a);return(a.specified?a.nodeValue:this.$.checked)?"checked":null;case "hspace":case "value":return this.$[a];case "style":return this.$.style.cssText;case "contenteditable":case "contentEditable":return this.$.attributes.getNamedItem("contentEditable").specified? -this.$.getAttribute("contentEditable"):null}return this.$.getAttribute(a,2)}:a}(),getChildren:function(){return new CKEDITOR.dom.nodeList(this.$.childNodes)},getComputedStyle:CKEDITOR.env.ie?function(a){return this.$.currentStyle[CKEDITOR.tools.cssStyleToDomStyle(a)]}:function(a){var b=this.getWindow().$.getComputedStyle(this.$,null);return b?b.getPropertyValue(a):""},getDtd:function(){var a=CKEDITOR.dtd[this.getName()];this.getDtd=function(){return a};return a},getElementsByTag:CKEDITOR.dom.document.prototype.getElementsByTag, -getTabIndex:CKEDITOR.env.ie?function(){var a=this.$.tabIndex;a===0&&(!CKEDITOR.dtd.$tabIndex[this.getName()]&&parseInt(this.getAttribute("tabindex"),10)!==0)&&(a=-1);return a}:CKEDITOR.env.webkit?function(){var a=this.$.tabIndex;if(a==void 0){a=parseInt(this.getAttribute("tabindex"),10);isNaN(a)&&(a=-1)}return a}:function(){return this.$.tabIndex},getText:function(){return this.$.textContent||this.$.innerText||""},getWindow:function(){return this.getDocument().getWindow()},getId:function(){return this.$.id|| -null},getNameAtt:function(){return this.$.name||null},getName:function(){var a=this.$.nodeName.toLowerCase();if(CKEDITOR.env.ie&&!(document.documentMode>8)){var b=this.$.scopeName;b!="HTML"&&(a=b.toLowerCase()+":"+a)}return(this.getName=function(){return a})()},getValue:function(){return this.$.value},getFirst:function(a){var b=this.$.firstChild;(b=b&&new CKEDITOR.dom.node(b))&&(a&&!a(b))&&(b=b.getNext(a));return b},getLast:function(a){var b=this.$.lastChild;(b=b&&new CKEDITOR.dom.node(b))&&(a&&!a(b))&& -(b=b.getPrevious(a));return b},getStyle:function(a){return this.$.style[CKEDITOR.tools.cssStyleToDomStyle(a)]},is:function(){var a=this.getName();if(typeof arguments[0]=="object")return!!arguments[0][a];for(var b=0;b0&&(b>2||!c[a[0].nodeName]||b==2&&!c[a[1].nodeName])},hasAttribute:function(){function a(a){a=this.$.attributes.getNamedItem(a); -return!(!a||!a.specified)}return CKEDITOR.env.ie&&CKEDITOR.env.version<8?function(b){return b=="name"?!!this.$.name:a.call(this,b)}:a}(),hide:function(){this.setStyle("display","none")},moveChildren:function(a,b){var c=this.$,a=a.$;if(c!=a){var d;if(b)for(;d=c.lastChild;)a.insertBefore(c.removeChild(d),a.firstChild);else for(;d=c.firstChild;)a.appendChild(c.removeChild(d))}},mergeSiblings:function(){function a(a,b,c){if(b&&b.type==CKEDITOR.NODE_ELEMENT){for(var g=[];b.data("cke-bookmark")||b.isEmptyInlineRemoveable();){g.push(b); -b=c?b.getNext():b.getPrevious();if(!b||b.type!=CKEDITOR.NODE_ELEMENT)return}if(a.isIdentical(b)){for(var k=c?a.getLast():a.getFirst();g.length;)g.shift().move(a,!c);b.moveChildren(a,!c);b.remove();k&&k.type==CKEDITOR.NODE_ELEMENT&&k.mergeSiblings()}}}return function(b){if(b===false||CKEDITOR.dtd.$removeEmpty[this.getName()]||this.is("a")){a(this,this.getNext(),true);a(this,this.getPrevious())}}}(),show:function(){this.setStyles({display:"",visibility:""})},setAttribute:function(){var a=function(a, -b){this.$.setAttribute(a,b);return this};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(b,c){b=="class"?this.$.className=c:b=="style"?this.$.style.cssText=c:b=="tabindex"?this.$.tabIndex=c:b=="checked"?this.$.checked=c:b=="contenteditable"?a.call(this,"contentEditable",c):a.apply(this,arguments);return this}:CKEDITOR.env.ie8Compat&&CKEDITOR.env.secure?function(b,c){if(b=="src"&&c.match(/^http:\/\//))try{a.apply(this,arguments)}catch(d){}else a.apply(this,arguments); -return this}:a}(),setAttributes:function(a){for(var b in a)this.setAttribute(b,a[b]);return this},setValue:function(a){this.$.value=a;return this},removeAttribute:function(){var a=function(a){this.$.removeAttribute(a)};return CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)?function(a){a=="class"?a="className":a=="tabindex"?a="tabIndex":a=="contenteditable"&&(a="contentEditable");this.$.removeAttribute(a)}:a}(),removeAttributes:function(a){if(CKEDITOR.tools.isArray(a))for(var b=0;b< -a.length;b++)this.removeAttribute(a[b]);else for(b in a)a.hasOwnProperty(b)&&this.removeAttribute(b)},removeStyle:function(a){var b=this.$.style;if(!b.removeProperty&&(a=="border"||a=="margin"||a=="padding")){var c=["top","left","right","bottom"],d;a=="border"&&(d=["color","style","width"]);for(var b=[],g=0;g=100?"":"progid:DXImageTransform.Microsoft.Alpha(opacity="+a+")")}else this.setStyle("opacity",a)},unselectable:function(){this.setStyles(CKEDITOR.tools.cssVendorPrefix("user-select", -"none"));if(CKEDITOR.env.ie||CKEDITOR.env.opera){this.setAttribute("unselectable","on");for(var a,b=this.getElementsByTag("*"),c=0,d=b.count();c0)l(0,b===true?h:b===false?g:h<0?h:g);if(c&&(k<0||d>0))l(k<0?k:d,0)},setState:function(a,b,c){b=b||"cke";switch(a){case CKEDITOR.TRISTATE_ON:this.addClass(b+"_on");this.removeClass(b+"_off");this.removeClass(b+"_disabled");c&&this.setAttribute("aria-pressed",true);c&&this.removeAttribute("aria-disabled"); -break;case CKEDITOR.TRISTATE_DISABLED:this.addClass(b+"_disabled");this.removeClass(b+"_off");this.removeClass(b+"_on");c&&this.setAttribute("aria-disabled",true);c&&this.removeAttribute("aria-pressed");break;default:this.addClass(b+"_off");this.removeClass(b+"_on");this.removeClass(b+"_disabled");c&&this.removeAttribute("aria-pressed");c&&this.removeAttribute("aria-disabled")}},getFrameDocument:function(){var a=this.$;try{a.contentWindow.document}catch(b){a.src=a.src}return a&&new CKEDITOR.dom.document(a.contentWindow.document)}, -copyAttributes:function(a,b){for(var c=this.$.attributes,b=b||{},d=0;d=0&&b0&&c;)c=a(c,b.shift());else c=a(c,b);return c?new CKEDITOR.dom.node(c):null}}(),getChildCount:function(){return this.$.childNodes.length},disableContextMenu:function(){this.on("contextmenu", -function(a){a.data.getTarget().hasClass("cke_enable_context_menu")||a.data.preventDefault()})},getDirection:function(a){return a?this.getComputedStyle("direction")||this.getDirection()||this.getParent()&&this.getParent().getDirection(1)||this.getDocument().$.dir||"ltr":this.getStyle("direction")||this.getAttribute("dir")},data:function(a,b){a="data-"+a;if(b===void 0)return this.getAttribute(a);b===false?this.removeAttribute(a):this.setAttribute(a,b);return null},getEditor:function(){var a=CKEDITOR.instances, -b,c;for(b in a){c=a[b];if(c.element.equals(this)&&c.elementMode!=CKEDITOR.ELEMENT_MODE_APPENDTO)return c}return null}});var c={width:["border-left-width","border-right-width","padding-left","padding-right"],height:["border-top-width","border-bottom-width","padding-top","padding-bottom"]};CKEDITOR.dom.element.prototype.setSize=function(a,c,e){if(typeof c=="number"){if(e&&(!CKEDITOR.env.ie||!CKEDITOR.env.quirks))c=c-b.call(this,a);this.setStyle(a,c+"px")}};CKEDITOR.dom.element.prototype.getSize=function(a, -c){var e=Math.max(this.$["offset"+CKEDITOR.tools.capitalize(a)],this.$["client"+CKEDITOR.tools.capitalize(a)])||0;c&&(e=e-b.call(this,a));return e}})();CKEDITOR.dom.documentFragment=function(b){b=b||CKEDITOR.document;this.$=b.type==CKEDITOR.NODE_DOCUMENT?b.$.createDocumentFragment():b}; -CKEDITOR.tools.extend(CKEDITOR.dom.documentFragment.prototype,CKEDITOR.dom.element.prototype,{type:CKEDITOR.NODE_DOCUMENT_FRAGMENT,insertAfterNode:function(b){b=b.$;b.parentNode.insertBefore(this.$,b.nextSibling)}},!0,{append:1,appendBogus:1,getFirst:1,getLast:1,getParent:1,getNext:1,getPrevious:1,appendTo:1,moveChildren:1,insertBefore:1,insertAfterNode:1,replace:1,trim:1,type:1,ltrim:1,rtrim:1,getDocument:1,getChildCount:1,getChild:1,getChildren:1}); -(function(){function b(a,b){var c=this.range;if(this._.end)return null;if(!this._.start){this._.start=1;if(c.collapsed){this.end();return null}c.optimize()}var d,m=c.startContainer;d=c.endContainer;var n=c.startOffset,o=c.endOffset,i,q=this.guard,f=this.type,e=a?"getPreviousSourceNode":"getNextSourceNode";if(!a&&!this._.guardLTR){var j=d.type==CKEDITOR.NODE_ELEMENT?d:d.getParent(),s=d.type==CKEDITOR.NODE_ELEMENT?d.getChild(o):d.getNext();this._.guardLTR=function(a,b){return(!b||!j.equals(a))&&(!s|| -!a.equals(s))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}if(a&&!this._.guardRTL){var A=m.type==CKEDITOR.NODE_ELEMENT?m:m.getParent(),B=m.type==CKEDITOR.NODE_ELEMENT?n?m.getChild(n-1):null:m.getPrevious();this._.guardRTL=function(a,b){return(!b||!A.equals(a))&&(!B||!a.equals(B))&&(a.type!=CKEDITOR.NODE_ELEMENT||!b||!a.equals(c.root))}}var p=a?this._.guardRTL:this._.guardLTR;i=q?function(a,b){return p(a,b)===false?false:q(a,b)}:p;if(this.current)d=this.current[e](false,f,i);else{if(a)d.type== -CKEDITOR.NODE_ELEMENT&&(d=o>0?d.getChild(o-1):i(d,true)===false?null:d.getPreviousSourceNode(true,f,i));else{d=m;if(d.type==CKEDITOR.NODE_ELEMENT&&!(d=d.getChild(n)))d=i(m,true)===false?null:m.getNextSourceNode(true,f,i)}d&&i(d)===false&&(d=null)}for(;d&&!this._.end;){this.current=d;if(!this.evaluator||this.evaluator(d)!==false){if(!b)return d}else if(b&&this.evaluator)return false;d=d[e](false,f,i)}this.end();return this.current=null}function c(a){for(var c,d=null;c=b.call(this,a);)d=c;return d} -CKEDITOR.dom.walker=CKEDITOR.tools.createClass({$:function(a){this.range=a;this._={}},proto:{end:function(){this._.end=1},next:function(){return b.call(this)},previous:function(){return b.call(this,1)},checkForward:function(){return b.call(this,0,1)!==false},checkBackward:function(){return b.call(this,1,1)!==false},lastForward:function(){return c.call(this)},lastBackward:function(){return c.call(this,1)},reset:function(){delete this.current;this._={}}}});var a={block:1,"list-item":1,table:1,"table-row-group":1, -"table-header-group":1,"table-footer-group":1,"table-row":1,"table-column-group":1,"table-column":1,"table-cell":1,"table-caption":1};CKEDITOR.dom.element.prototype.isBlockBoundary=function(b){b=b?CKEDITOR.tools.extend({},CKEDITOR.dtd.$block,b||{}):CKEDITOR.dtd.$block;return this.getComputedStyle("float")=="none"&&a[this.getComputedStyle("display")]||b[this.getName()]};CKEDITOR.dom.walker.blockBoundary=function(a){return function(b){return!(b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary(a))}};CKEDITOR.dom.walker.listItemBoundary= -function(){return this.blockBoundary({br:1})};CKEDITOR.dom.walker.bookmark=function(a,b){function c(a){return a&&a.getName&&a.getName()=="span"&&a.data("cke-bookmark")}return function(d){var m,n;m=d&&d.type!=CKEDITOR.NODE_ELEMENT&&(n=d.getParent())&&c(n);m=a?m:m||c(d);return!!(b^m)}};CKEDITOR.dom.walker.whitespaces=function(a){return function(b){var c;b&&b.type==CKEDITOR.NODE_TEXT&&(c=!CKEDITOR.tools.trim(b.getText())||CKEDITOR.env.webkit&&b.getText()=="​");return!!(a^c)}};CKEDITOR.dom.walker.invisible= -function(a){var b=CKEDITOR.dom.walker.whitespaces();return function(c){if(b(c))c=1;else{c.type==CKEDITOR.NODE_TEXT&&(c=c.getParent());c=!c.$.offsetHeight}return!!(a^c)}};CKEDITOR.dom.walker.nodeType=function(a,b){return function(c){return!!(b^c.type==a)}};CKEDITOR.dom.walker.bogus=function(a){function b(a){return!e(a)&&!d(a)}return function(c){var d=!CKEDITOR.env.ie?c.is&&c.is("br"):c.getText&&f.test(c.getText());if(d){d=c.getParent();c=c.getNext(b);d=d.isBlockBoundary()&&(!c||c.type==CKEDITOR.NODE_ELEMENT&& -c.isBlockBoundary())}return!!(a^d)}};var f=/^[\t\r\n ]*(?: |\xa0)$/,e=CKEDITOR.dom.walker.whitespaces(),d=CKEDITOR.dom.walker.bookmark();CKEDITOR.dom.element.prototype.getBogus=function(){var a=this;do a=a.getPreviousSourceNode();while(d(a)||e(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.getName()in CKEDITOR.dtd.$inline&&!(a.getName()in CKEDITOR.dtd.$empty));return a&&(!CKEDITOR.env.ie?a.is&&a.is("br"):a.getText&&f.test(a.getText()))?a:false}})(); -CKEDITOR.dom.range=function(b){this.endOffset=this.endContainer=this.startOffset=this.startContainer=null;this.collapsed=true;var c=b instanceof CKEDITOR.dom.document;this.document=c?b:b.getDocument();this.root=c?b.getBody():b}; -(function(){function b(){var a=false,b=CKEDITOR.dom.walker.whitespaces(),o=CKEDITOR.dom.walker.bookmark(true),c=CKEDITOR.dom.walker.bogus();return function(q){if(o(q)||b(q))return true;if(c(q)&&!a)return a=true;return q.type==CKEDITOR.NODE_TEXT&&(q.hasAscendant("pre")||CKEDITOR.tools.trim(q.getText()).length)||q.type==CKEDITOR.NODE_ELEMENT&&!q.is(d)?false:true}}function c(a){var b=CKEDITOR.dom.walker.whitespaces(),o=CKEDITOR.dom.walker.bookmark(1);return function(c){return o(c)||b(c)?true:!a&&g(c)|| -c.type==CKEDITOR.NODE_ELEMENT&&c.is(CKEDITOR.dtd.$removeEmpty)}}function a(a){return!k(a)&&!h(a)}var f=function(a){a.collapsed=a.startContainer&&a.endContainer&&a.startContainer.equals(a.endContainer)&&a.startOffset==a.endOffset},e=function(a,b,o,c){a.optimizeBookmark();var d=a.startContainer,g=a.endContainer,f=a.startOffset,j=a.endOffset,e,k;if(g.type==CKEDITOR.NODE_TEXT)g=g.split(j);else if(g.getChildCount()>0)if(j>=g.getChildCount()){g=g.append(a.document.createText(""));k=true}else g=g.getChild(j); -if(d.type==CKEDITOR.NODE_TEXT){d.split(f);d.equals(g)&&(g=d.getNext())}else if(f)if(f>=d.getChildCount()){d=d.append(a.document.createText(""));e=true}else d=d.getChild(f).getPrevious();else{d=d.append(a.document.createText(""),1);e=true}var f=d.getParents(),j=g.getParents(),h,p,l;for(h=0;h0&&!r.equals(g)&&(F=u.append(r.clone()));if(!f[o]||r.$.parentNode!=f[o].$.parentNode)for(r=r.getPrevious();r;){if(r.equals(f[o])||r.equals(d))break;v=r.getPrevious();if(b==2)u.$.insertBefore(r.$.cloneNode(true),u.$.firstChild);else{r.remove();b==1&&u.$.insertBefore(r.$,u.$.firstChild)}r=v}u&&(u=F)}if(b==2){p=a.startContainer;if(p.type==CKEDITOR.NODE_TEXT){p.$.data=p.$.data+p.$.nextSibling.data; -p.$.parentNode.removeChild(p.$.nextSibling)}a=a.endContainer;if(a.type==CKEDITOR.NODE_TEXT&&a.$.nextSibling){a.$.data=a.$.data+a.$.nextSibling.data;a.$.parentNode.removeChild(a.$.nextSibling)}}else{if(p&&l&&(d.$.parentNode!=p.$.parentNode||g.$.parentNode!=l.$.parentNode)){b=l.getIndex();e&&l.$.parentNode==d.$.parentNode&&b--;if(c&&p.type==CKEDITOR.NODE_ELEMENT){c=CKEDITOR.dom.element.createFromHtml(' ',a.document);c.insertAfter(p);p.mergeSiblings(false); -a.moveToBookmark({startNode:c})}else a.setStart(l.getParent(),b)}a.collapse(true)}e&&d.remove();k&&g.$.parentNode&&g.remove()},d={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,"var":1},g=CKEDITOR.dom.walker.bogus(),k=new CKEDITOR.dom.walker.whitespaces,h=new CKEDITOR.dom.walker.bookmark,l=/^[\t\r\n ]*(?: |\xa0)$/;CKEDITOR.dom.range.prototype={clone:function(){var a=new CKEDITOR.dom.range(this.root); -a.startContainer=this.startContainer;a.startOffset=this.startOffset;a.endContainer=this.endContainer;a.endOffset=this.endOffset;a.collapsed=this.collapsed;return a},collapse:function(a){if(a){this.endContainer=this.startContainer;this.endOffset=this.startOffset}else{this.startContainer=this.endContainer;this.startOffset=this.endOffset}this.collapsed=true},cloneContents:function(){var a=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||e(this,2,a);return a},deleteContents:function(a){this.collapsed|| -e(this,0,null,a)},extractContents:function(a){var b=new CKEDITOR.dom.documentFragment(this.document);this.collapsed||e(this,1,b,a);return b},createBookmark:function(a){var b,o,c,d,g=this.collapsed;b=this.document.createElement("span");b.data("cke-bookmark",1);b.setStyle("display","none");b.setHtml(" ");if(a){c="cke_bm_"+CKEDITOR.tools.getNextNumber();b.setAttribute("id",c+(g?"C":"S"))}if(!g){o=b.clone();o.setHtml(" ");a&&o.setAttribute("id",c+"E");d=this.clone();d.collapse();d.insertNode(o)}d= -this.clone();d.collapse(true);d.insertNode(b);if(o){this.setStartAfter(b);this.setEndBefore(o)}else this.moveToPosition(b,CKEDITOR.POSITION_AFTER_END);return{startNode:a?c+(g?"C":"S"):b,endNode:a?c+"E":o,serializable:a,collapsed:g}},createBookmark2:function(a){var b=this.startContainer,o=this.endContainer,c=this.startOffset,d=this.endOffset,g=this.collapsed,f,j;if(!b||!o)return{start:0,end:0};if(a){if(b.type==CKEDITOR.NODE_ELEMENT){if((f=b.getChild(c))&&f.type==CKEDITOR.NODE_TEXT&&c>0&&f.getPrevious().type== -CKEDITOR.NODE_TEXT){b=f;c=0}f&&f.type==CKEDITOR.NODE_ELEMENT&&(c=f.getIndex(1))}for(;b.type==CKEDITOR.NODE_TEXT&&(j=b.getPrevious())&&j.type==CKEDITOR.NODE_TEXT;){b=j;c=c+j.getLength()}if(!g){if(o.type==CKEDITOR.NODE_ELEMENT){if((f=o.getChild(d))&&f.type==CKEDITOR.NODE_TEXT&&d>0&&f.getPrevious().type==CKEDITOR.NODE_TEXT){o=f;d=0}f&&f.type==CKEDITOR.NODE_ELEMENT&&(d=f.getIndex(1))}for(;o.type==CKEDITOR.NODE_TEXT&&(j=o.getPrevious())&&j.type==CKEDITOR.NODE_TEXT;){o=j;d=d+j.getLength()}}}return{start:b.getAddress(a), -end:g?null:o.getAddress(a),startOffset:c,endOffset:d,normalized:a,collapsed:g,is2:true}},moveToBookmark:function(a){if(a.is2){var b=this.document.getByAddress(a.start,a.normalized),c=a.startOffset,i=a.end&&this.document.getByAddress(a.end,a.normalized),a=a.endOffset;this.setStart(b,c);i?this.setEnd(i,a):this.collapse(true)}else{b=(c=a.serializable)?this.document.getById(a.startNode):a.startNode;a=c?this.document.getById(a.endNode):a.endNode;this.setStartBefore(b);b.remove();if(a){this.setEndBefore(a); -a.remove()}else this.collapse(true)}},getBoundaryNodes:function(){var a=this.startContainer,b=this.endContainer,c=this.startOffset,i=this.endOffset,d;if(a.type==CKEDITOR.NODE_ELEMENT){d=a.getChildCount();if(d>c)a=a.getChild(c);else if(d<1)a=a.getPreviousSourceNode();else{for(a=a.$;a.lastChild;)a=a.lastChild;a=new CKEDITOR.dom.node(a);a=a.getNextSourceNode()||a}}if(b.type==CKEDITOR.NODE_ELEMENT){d=b.getChildCount();if(d>i)b=b.getChild(i).getPreviousSourceNode(true);else if(d<1)b=b.getPreviousSourceNode(); -else{for(b=b.$;b.lastChild;)b=b.lastChild;b=new CKEDITOR.dom.node(b)}}a.getPosition(b)&CKEDITOR.POSITION_FOLLOWING&&(a=b);return{startNode:a,endNode:b}},getCommonAncestor:function(a,b){var c=this.startContainer,i=this.endContainer,c=c.equals(i)?a&&c.type==CKEDITOR.NODE_ELEMENT&&this.startOffset==this.endOffset-1?c.getChild(this.startOffset):c:c.getCommonAncestor(i);return b&&!c.is?c.getParent():c},optimize:function(){var a=this.startContainer,b=this.startOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>= -a.getLength()&&this.setStartAfter(a):this.setStartBefore(a));a=this.endContainer;b=this.endOffset;a.type!=CKEDITOR.NODE_ELEMENT&&(b?b>=a.getLength()&&this.setEndAfter(a):this.setEndBefore(a))},optimizeBookmark:function(){var a=this.startContainer,b=this.endContainer;a.is&&(a.is("span")&&a.data("cke-bookmark"))&&this.setStartAt(a,CKEDITOR.POSITION_BEFORE_START);b&&(b.is&&b.is("span")&&b.data("cke-bookmark"))&&this.setEndAt(b,CKEDITOR.POSITION_AFTER_END)},trim:function(a,b){var c=this.startContainer, -i=this.startOffset,d=this.collapsed;if((!a||d)&&c&&c.type==CKEDITOR.NODE_TEXT){if(i)if(i>=c.getLength()){i=c.getIndex()+1;c=c.getParent()}else{var g=c.split(i),i=c.getIndex()+1,c=c.getParent();if(this.startContainer.equals(this.endContainer))this.setEnd(g,this.endOffset-this.startOffset);else if(c.equals(this.endContainer))this.endOffset=this.endOffset+1}else{i=c.getIndex();c=c.getParent()}this.setStart(c,i);if(d){this.collapse(true);return}}c=this.endContainer;i=this.endOffset;if(!b&&!d&&c&&c.type== -CKEDITOR.NODE_TEXT){if(i){i>=c.getLength()||c.split(i);i=c.getIndex()+1}else i=c.getIndex();c=c.getParent();this.setEnd(c,i)}},enlarge:function(a,b){switch(a){case CKEDITOR.ENLARGE_INLINE:var c=1;case CKEDITOR.ENLARGE_ELEMENT:if(this.collapsed)break;var i=this.getCommonAncestor(),d=this.root,g,f,j,e,h,k=false,p,l;p=this.startContainer;l=this.startOffset;if(p.type==CKEDITOR.NODE_TEXT){if(l){p=!CKEDITOR.tools.trim(p.substring(0,l)).length&&p;k=!!p}if(p&&!(e=p.getPrevious()))j=p.getParent()}else{l&& -(e=p.getChild(l-1)||p.getLast());e||(j=p)}for(;j||e;){if(j&&!e){!h&&j.equals(i)&&(h=true);if(c?j.isBlockBoundary():!d.contains(j))break;if(!k||j.getComputedStyle("display")!="inline"){k=false;h?g=j:this.setStartBefore(j)}e=j.getPrevious()}for(;e;){p=false;if(e.type==CKEDITOR.NODE_COMMENT)e=e.getPrevious();else{if(e.type==CKEDITOR.NODE_TEXT){l=e.getText();/[^\s\ufeff]/.test(l)&&(e=null);p=/[\s\ufeff]$/.test(l)}else if((e.$.offsetWidth>0||b&&e.is("br"))&&!e.data("cke-bookmark"))if(k&&CKEDITOR.dtd.$removeEmpty[e.getName()]){l= -e.getText();if(/[^\s\ufeff]/.test(l))e=null;else for(var u=e.$.getElementsByTagName("*"),r=0,F;F=u[r++];)if(!CKEDITOR.dtd.$removeEmpty[F.nodeName.toLowerCase()]){e=null;break}e&&(p=!!l.length)}else e=null;p&&(k?h?g=j:j&&this.setStartBefore(j):k=true);if(e){p=e.getPrevious();if(!j&&!p){j=e;e=null;break}e=p}else j=null}}j&&(j=j.getParent())}p=this.endContainer;l=this.endOffset;j=e=null;h=k=false;if(p.type==CKEDITOR.NODE_TEXT){p=!CKEDITOR.tools.trim(p.substring(l)).length&&p;k=!(p&&p.getLength());if(p&& -!(e=p.getNext()))j=p.getParent()}else(e=p.getChild(l))||(j=p);for(;j||e;){if(j&&!e){!h&&j.equals(i)&&(h=true);if(c?j.isBlockBoundary():!d.contains(j))break;if(!k||j.getComputedStyle("display")!="inline"){k=false;h?f=j:j&&this.setEndAfter(j)}e=j.getNext()}for(;e;){p=false;if(e.type==CKEDITOR.NODE_TEXT){l=e.getText();/[^\s\ufeff]/.test(l)&&(e=null);p=/^[\s\ufeff]/.test(l)}else if(e.type==CKEDITOR.NODE_ELEMENT){if((e.$.offsetWidth>0||b&&e.is("br"))&&!e.data("cke-bookmark"))if(k&&CKEDITOR.dtd.$removeEmpty[e.getName()]){l= -e.getText();if(/[^\s\ufeff]/.test(l))e=null;else{u=e.$.getElementsByTagName("*");for(r=0;F=u[r++];)if(!CKEDITOR.dtd.$removeEmpty[F.nodeName.toLowerCase()]){e=null;break}}e&&(p=!!l.length)}else e=null}else p=1;p&&k&&(h?f=j:this.setEndAfter(j));if(e){p=e.getNext();if(!j&&!p){j=e;e=null;break}e=p}else j=null}j&&(j=j.getParent())}if(g&&f){i=g.contains(f)?f:g;this.setStartBefore(i);this.setEndAfter(i)}break;case CKEDITOR.ENLARGE_BLOCK_CONTENTS:case CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:j=new CKEDITOR.dom.range(this.root); -d=this.root;j.setStartAt(d,CKEDITOR.POSITION_AFTER_START);j.setEnd(this.startContainer,this.startOffset);j=new CKEDITOR.dom.walker(j);var v,t,w=CKEDITOR.dom.walker.blockBoundary(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?{br:1}:null),I=function(a){var b=w(a);b||(v=a);return b},c=function(a){var b=I(a);!b&&(a.is&&a.is("br"))&&(t=a);return b};j.guard=I;j=j.lastBackward();v=v||d;this.setStartAt(v,!v.is("br")&&(!j&&this.checkStartOfBlock()||j&&v.contains(j))?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_AFTER_END); -if(a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS){j=this.clone();j=new CKEDITOR.dom.walker(j);var G=CKEDITOR.dom.walker.whitespaces(),C=CKEDITOR.dom.walker.bookmark();j.evaluator=function(a){return!G(a)&&!C(a)};if((j=j.previous())&&j.type==CKEDITOR.NODE_ELEMENT&&j.is("br"))break}j=this.clone();j.collapse();j.setEndAt(d,CKEDITOR.POSITION_BEFORE_END);j=new CKEDITOR.dom.walker(j);j.guard=a==CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS?c:I;v=null;j=j.lastForward();v=v||d;this.setEndAt(v,!j&&this.checkEndOfBlock()||j&& -v.contains(j)?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_BEFORE_START);t&&this.setEndAfter(t)}},shrink:function(a,b,c){if(!this.collapsed){var a=a||CKEDITOR.SHRINK_TEXT,i=this.clone(),d=this.startContainer,g=this.endContainer,f=this.startOffset,e=this.endOffset,k=1,h=1;if(d&&d.type==CKEDITOR.NODE_TEXT)if(f)if(f>=d.getLength())i.setStartAfter(d);else{i.setStartBefore(d);k=0}else i.setStartBefore(d);if(g&&g.type==CKEDITOR.NODE_TEXT)if(e)if(e>=g.getLength())i.setEndAfter(g);else{i.setEndAfter(g); -h=0}else i.setEndBefore(g);var i=new CKEDITOR.dom.walker(i),l=CKEDITOR.dom.walker.bookmark();i.evaluator=function(b){return b.type==(a==CKEDITOR.SHRINK_ELEMENT?CKEDITOR.NODE_ELEMENT:CKEDITOR.NODE_TEXT)};var p;i.guard=function(b,i){if(l(b))return true;if(a==CKEDITOR.SHRINK_ELEMENT&&b.type==CKEDITOR.NODE_TEXT||i&&b.equals(p)||c===false&&b.type==CKEDITOR.NODE_ELEMENT&&b.isBlockBoundary())return false;!i&&b.type==CKEDITOR.NODE_ELEMENT&&(p=b);return true};if(k)(d=i[a==CKEDITOR.SHRINK_ELEMENT?"lastForward": -"next"]())&&this.setStartAt(d,b?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_START);if(h){i.reset();(i=i[a==CKEDITOR.SHRINK_ELEMENT?"lastBackward":"previous"]())&&this.setEndAt(i,b?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_END)}return!(!k&&!h)}},insertNode:function(a){this.optimizeBookmark();this.trim(false,true);var b=this.startContainer,c=b.getChild(this.startOffset);c?a.insertBefore(c):b.append(a);a.getParent()&&a.getParent().equals(this.endContainer)&&this.endOffset++;this.setStartBefore(a)}, -moveToPosition:function(a,b){this.setStartAt(a,b);this.collapse(true)},moveToRange:function(a){this.setStart(a.startContainer,a.startOffset);this.setEnd(a.endContainer,a.endOffset)},selectNodeContents:function(a){this.setStart(a,0);this.setEnd(a,a.type==CKEDITOR.NODE_TEXT?a.getLength():a.getChildCount())},setStart:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex();a=a.getParent()}this.startContainer=a;this.startOffset=b;if(!this.endContainer){this.endContainer= -a;this.endOffset=b}f(this)},setEnd:function(a,b){if(a.type==CKEDITOR.NODE_ELEMENT&&CKEDITOR.dtd.$empty[a.getName()]){b=a.getIndex()+1;a=a.getParent()}this.endContainer=a;this.endOffset=b;if(!this.startContainer){this.startContainer=a;this.startOffset=b}f(this)},setStartAfter:function(a){this.setStart(a.getParent(),a.getIndex()+1)},setStartBefore:function(a){this.setStart(a.getParent(),a.getIndex())},setEndAfter:function(a){this.setEnd(a.getParent(),a.getIndex()+1)},setEndBefore:function(a){this.setEnd(a.getParent(), -a.getIndex())},setStartAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setStart(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type==CKEDITOR.NODE_TEXT?this.setStart(a,a.getLength()):this.setStart(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setStartBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setStartAfter(a)}f(this)},setEndAt:function(a,b){switch(b){case CKEDITOR.POSITION_AFTER_START:this.setEnd(a,0);break;case CKEDITOR.POSITION_BEFORE_END:a.type== -CKEDITOR.NODE_TEXT?this.setEnd(a,a.getLength()):this.setEnd(a,a.getChildCount());break;case CKEDITOR.POSITION_BEFORE_START:this.setEndBefore(a);break;case CKEDITOR.POSITION_AFTER_END:this.setEndAfter(a)}f(this)},fixBlock:function(a,b){var c=this.createBookmark(),i=this.document.createElement(b);this.collapse(a);this.enlarge(CKEDITOR.ENLARGE_BLOCK_CONTENTS);this.extractContents().appendTo(i);i.trim();CKEDITOR.env.ie||i.appendBogus();this.insertNode(i);this.moveToBookmark(c);return i},splitBlock:function(a){var b= -new CKEDITOR.dom.elementPath(this.startContainer,this.root),c=new CKEDITOR.dom.elementPath(this.endContainer,this.root),i=b.block,d=c.block,g=null;if(!b.blockLimit.equals(c.blockLimit))return null;if(a!="br"){if(!i){i=this.fixBlock(true,a);d=(new CKEDITOR.dom.elementPath(this.endContainer,this.root)).block}d||(d=this.fixBlock(false,a))}a=i&&this.checkStartOfBlock();b=d&&this.checkEndOfBlock();this.deleteContents();if(i&&i.equals(d))if(b){g=new CKEDITOR.dom.elementPath(this.startContainer,this.root); -this.moveToPosition(d,CKEDITOR.POSITION_AFTER_END);d=null}else if(a){g=new CKEDITOR.dom.elementPath(this.startContainer,this.root);this.moveToPosition(i,CKEDITOR.POSITION_BEFORE_START);i=null}else{d=this.splitElement(i);!CKEDITOR.env.ie&&!i.is("ul","ol")&&i.appendBogus()}return{previousBlock:i,nextBlock:d,wasStartOfBlock:a,wasEndOfBlock:b,elementPath:g}},splitElement:function(a){if(!this.collapsed)return null;this.setEndAt(a,CKEDITOR.POSITION_BEFORE_END);var b=this.extractContents(),c=a.clone(false); -b.appendTo(c);c.insertAfter(a);this.moveToPosition(a,CKEDITOR.POSITION_AFTER_END);return c},removeEmptyBlocksAtEnd:function(){function a(d){return function(a){return b(a)||(c(a)||a.type==CKEDITOR.NODE_ELEMENT&&a.isEmptyInlineRemoveable())||d.is("table")&&a.is("caption")?false:true}}var b=CKEDITOR.dom.walker.whitespaces(),c=CKEDITOR.dom.walker.bookmark(false);return function(b){for(var c=this.createBookmark(),o=this[b?"endPath":"startPath"](),d=o.block||o.blockLimit,n;d&&!d.equals(o.root)&&!d.getFirst(a(d));){n= -d.getParent();this[b?"setEndAt":"setStartAt"](d,CKEDITOR.POSITION_AFTER_END);d.remove(1);d=n}this.moveToBookmark(c)}}(),startPath:function(){return new CKEDITOR.dom.elementPath(this.startContainer,this.root)},endPath:function(){return new CKEDITOR.dom.elementPath(this.endContainer,this.root)},checkBoundaryOfElement:function(a,b){var o=b==CKEDITOR.START,d=this.clone();d.collapse(o);d[o?"setStartAt":"setEndAt"](a,o?CKEDITOR.POSITION_AFTER_START:CKEDITOR.POSITION_BEFORE_END);d=new CKEDITOR.dom.walker(d); -d.evaluator=c(o);return d[o?"checkBackward":"checkForward"]()},checkStartOfBlock:function(){var a=this.startContainer,c=this.startOffset;if(CKEDITOR.env.ie&&c&&a.type==CKEDITOR.NODE_TEXT){a=CKEDITOR.tools.ltrim(a.substring(0,c));l.test(a)&&this.trim(0,1)}this.trim();a=new CKEDITOR.dom.elementPath(this.startContainer,this.root);c=this.clone();c.collapse(true);c.setStartAt(a.block||a.blockLimit,CKEDITOR.POSITION_AFTER_START);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkBackward()},checkEndOfBlock:function(){var a= -this.endContainer,c=this.endOffset;if(CKEDITOR.env.ie&&a.type==CKEDITOR.NODE_TEXT){a=CKEDITOR.tools.rtrim(a.substring(c));l.test(a)&&this.trim(1,0)}this.trim();a=new CKEDITOR.dom.elementPath(this.endContainer,this.root);c=this.clone();c.collapse(false);c.setEndAt(a.block||a.blockLimit,CKEDITOR.POSITION_BEFORE_END);a=new CKEDITOR.dom.walker(c);a.evaluator=b();return a.checkForward()},getPreviousNode:function(a,b,c){var d=this.clone();d.collapse(1);d.setStartAt(c||this.root,CKEDITOR.POSITION_AFTER_START); -c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.previous()},getNextNode:function(a,b,c){var d=this.clone();d.collapse();d.setEndAt(c||this.root,CKEDITOR.POSITION_BEFORE_END);c=new CKEDITOR.dom.walker(d);c.evaluator=a;c.guard=b;return c.next()},checkReadOnly:function(){function a(b,c){for(;b;){if(b.type==CKEDITOR.NODE_ELEMENT){if(b.getAttribute("contentEditable")=="false"&&!b.data("cke-editable"))return 0;if(b.is("html")||b.getAttribute("contentEditable")=="true"&&(b.contains(c)||b.equals(c)))break}b= -b.getParent()}return 1}return function(){var b=this.startContainer,c=this.endContainer;return!(a(b,c)&&a(c,b))}}(),moveToElementEditablePosition:function(b,c){if(b.type==CKEDITOR.NODE_ELEMENT&&!b.isEditable(false)){this.moveToPosition(b,c?CKEDITOR.POSITION_AFTER_END:CKEDITOR.POSITION_BEFORE_START);return true}for(var o=0;b;){if(b.type==CKEDITOR.NODE_TEXT){c&&this.checkEndOfBlock()&&l.test(b.getText())?this.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START):this.moveToPosition(b,c?CKEDITOR.POSITION_AFTER_END: -CKEDITOR.POSITION_BEFORE_START);o=1;break}if(b.type==CKEDITOR.NODE_ELEMENT)if(b.isEditable()){this.moveToPosition(b,c?CKEDITOR.POSITION_BEFORE_END:CKEDITOR.POSITION_AFTER_START);o=1}else c&&(b.is("br")&&this.checkEndOfBlock())&&this.moveToPosition(b,CKEDITOR.POSITION_BEFORE_START);var d=b,g=o,f=void 0;d.type==CKEDITOR.NODE_ELEMENT&&d.isEditable(false)&&(f=d[c?"getLast":"getFirst"](a));!g&&!f&&(f=d[c?"getPrevious":"getNext"](a));b=f}return!!o},moveToElementEditStart:function(a){return this.moveToElementEditablePosition(a)}, -moveToElementEditEnd:function(a){return this.moveToElementEditablePosition(a,true)},getEnclosedNode:function(){var a=this.clone();a.optimize();if(a.startContainer.type!=CKEDITOR.NODE_ELEMENT||a.endContainer.type!=CKEDITOR.NODE_ELEMENT)return null;var a=new CKEDITOR.dom.walker(a),b=CKEDITOR.dom.walker.bookmark(false,true),c=CKEDITOR.dom.walker.whitespaces(true);a.evaluator=function(a){return c(a)&&b(a)};var d=a.next();a.reset();return d&&d.equals(a.previous())?d:null},getTouchedStartNode:function(){var a= -this.startContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.startOffset)||a},getTouchedEndNode:function(){var a=this.endContainer;return this.collapsed||a.type!=CKEDITOR.NODE_ELEMENT?a:a.getChild(this.endOffset-1)||a},scrollIntoView:function(){var a=new CKEDITOR.dom.element.createFromHtml(" ",this.document),b,c,d,g=this.clone();g.optimize();if(d=g.startContainer.type==CKEDITOR.NODE_TEXT){c=g.startContainer.getText();b=g.startContainer.split(g.startOffset); -a.insertAfter(g.startContainer)}else g.insertNode(a);a.scrollIntoView();if(d){g.startContainer.setText(c);b.remove()}a.remove()}}})();CKEDITOR.POSITION_AFTER_START=1;CKEDITOR.POSITION_BEFORE_END=2;CKEDITOR.POSITION_BEFORE_START=3;CKEDITOR.POSITION_AFTER_END=4;CKEDITOR.ENLARGE_ELEMENT=1;CKEDITOR.ENLARGE_BLOCK_CONTENTS=2;CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS=3;CKEDITOR.ENLARGE_INLINE=4;CKEDITOR.START=1;CKEDITOR.END=2;CKEDITOR.SHRINK_ELEMENT=1;CKEDITOR.SHRINK_TEXT=2; -(function(){function b(a){if(!(arguments.length<1)){this.range=a;this.forceBrBreak=0;this.enlargeBr=1;this.enforceRealBlocks=0;this._||(this._={})}}function c(a,b,c){for(a=a.getNextSourceNode(b,null,c);!f(a);)a=a.getNextSourceNode(b,null,c);return a}var a=/^[\r\n\t ]+$/,f=CKEDITOR.dom.walker.bookmark(false,true),e=CKEDITOR.dom.walker.whitespaces(true),d=function(a){return f(a)&&e(a)};b.prototype={getNextParagraph:function(b){b=b||"p";if(!CKEDITOR.dtd[this.range.root.getName()][b])return null;var e, -h,l,m,n,o;if(!this._.started){h=this.range.clone();h.shrink(CKEDITOR.NODE_ELEMENT,true);m=h.endContainer.hasAscendant("pre",true)||h.startContainer.hasAscendant("pre",true);h.enlarge(this.forceBrBreak&&!m||!this.enlargeBr?CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS:CKEDITOR.ENLARGE_BLOCK_CONTENTS);if(!h.collapsed){m=new CKEDITOR.dom.walker(h.clone());var i=CKEDITOR.dom.walker.bookmark(true,true);m.evaluator=i;this._.nextNode=m.next();m=new CKEDITOR.dom.walker(h.clone());m.evaluator=i;m=m.previous();this._.lastNode= -m.getNextSourceNode(true);if(this._.lastNode&&this._.lastNode.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(this._.lastNode.getText())&&this._.lastNode.getParent().isBlockBoundary()){i=this.range.clone();i.moveToPosition(this._.lastNode,CKEDITOR.POSITION_AFTER_END);if(i.checkEndOfBlock()){i=new CKEDITOR.dom.elementPath(i.endContainer,i.root);this._.lastNode=(i.block||i.blockLimit).getNextSourceNode(true)}}if(!this._.lastNode){this._.lastNode=this._.docEndMarker=h.document.createText("");this._.lastNode.insertAfter(m)}h= -null}this._.started=1}i=this._.nextNode;m=this._.lastNode;for(this._.nextNode=null;i;){var q=0,y=i.hasAscendant("pre"),z=i.type!=CKEDITOR.NODE_ELEMENT,j=0;if(z)i.type==CKEDITOR.NODE_TEXT&&a.test(i.getText())&&(z=0);else{var s=i.getName();if(i.isBlockBoundary(this.forceBrBreak&&!y&&{br:1})){if(s=="br")z=1;else if(!h&&!i.getChildCount()&&s!="hr"){e=i;l=i.equals(m);break}if(h){h.setEndAt(i,CKEDITOR.POSITION_BEFORE_START);if(s!="br")this._.nextNode=i}q=1}else{if(i.getFirst()){if(!h){h=this.range.clone(); -h.setStartAt(i,CKEDITOR.POSITION_BEFORE_START)}i=i.getFirst();continue}z=1}}if(z&&!h){h=this.range.clone();h.setStartAt(i,CKEDITOR.POSITION_BEFORE_START)}l=(!q||z)&&i.equals(m);if(h&&!q)for(;!i.getNext(d)&&!l;){s=i.getParent();if(s.isBlockBoundary(this.forceBrBreak&&!y&&{br:1})){q=1;z=0;l||s.equals(m);h.setEndAt(s,CKEDITOR.POSITION_BEFORE_END);break}i=s;z=1;l=i.equals(m);j=1}z&&h.setEndAt(i,CKEDITOR.POSITION_AFTER_END);i=c(i,j,m);if((l=!i)||q&&h)break}if(!e){if(!h){this._.docEndMarker&&this._.docEndMarker.remove(); -return this._.nextNode=null}e=new CKEDITOR.dom.elementPath(h.startContainer,h.root);i=e.blockLimit;q={div:1,th:1,td:1};e=e.block;if(!e&&i&&!this.enforceRealBlocks&&q[i.getName()]&&h.checkStartOfBlock()&&h.checkEndOfBlock()&&!i.equals(h.root))e=i;else if(!e||this.enforceRealBlocks&&e.getName()=="li"){e=this.range.document.createElement(b);h.extractContents().appendTo(e);e.trim();h.insertNode(e);n=o=true}else if(e.getName()!="li"){if(!h.checkStartOfBlock()||!h.checkEndOfBlock()){e=e.clone(false);h.extractContents().appendTo(e); -e.trim();o=h.splitBlock();n=!o.wasStartOfBlock;o=!o.wasEndOfBlock;h.insertNode(e)}}else if(!l)this._.nextNode=e.equals(m)?null:c(h.getBoundaryNodes().endNode,1,m)}if(n)(h=e.getPrevious())&&h.type==CKEDITOR.NODE_ELEMENT&&(h.getName()=="br"?h.remove():h.getLast()&&h.getLast().$.nodeName.toLowerCase()=="br"&&h.getLast().remove());if(o)(h=e.getLast())&&h.type==CKEDITOR.NODE_ELEMENT&&h.getName()=="br"&&(CKEDITOR.env.ie||h.getPrevious(f)||h.getNext(f))&&h.remove();if(!this._.nextNode)this._.nextNode=l|| -e.equals(m)||!m?null:c(e,1,m);return e}};CKEDITOR.dom.range.prototype.createIterator=function(){return new b(this)}})(); -CKEDITOR.command=function(b,c){this.uiItems=[];this.exec=function(a){if(this.state==CKEDITOR.TRISTATE_DISABLED)return false;this.editorFocus&&b.focus();return this.fire("exec")===false?true:c.exec.call(this,b,a)!==false};this.refresh=function(a,b){if(!this.readOnly&&a.readOnly)return true;if(this.context&&!b.isContextFor(this.context)){this.disable();return true}this.enable();return this.fire("refresh",{editor:a,path:b})===false?true:c.refresh&&c.refresh.apply(this,arguments)!==false};CKEDITOR.tools.extend(this, -c,{modes:{wysiwyg:1},editorFocus:1,contextSensitive:!!c.context,state:CKEDITOR.TRISTATE_OFF});CKEDITOR.event.call(this)}; -CKEDITOR.command.prototype={enable:function(){this.state==CKEDITOR.TRISTATE_DISABLED&&this.setState(!this.preserveState||typeof this.previousState=="undefined"?CKEDITOR.TRISTATE_OFF:this.previousState)},disable:function(){this.setState(CKEDITOR.TRISTATE_DISABLED)},setState:function(b){if(this.state==b)return false;this.previousState=this.state;this.state=b;this.fire("state");return true},toggleState:function(){this.state==CKEDITOR.TRISTATE_OFF?this.setState(CKEDITOR.TRISTATE_ON):this.state==CKEDITOR.TRISTATE_ON&& -this.setState(CKEDITOR.TRISTATE_OFF)}};CKEDITOR.event.implementOn(CKEDITOR.command.prototype,!0);CKEDITOR.ENTER_P=1;CKEDITOR.ENTER_BR=2;CKEDITOR.ENTER_DIV=3; -CKEDITOR.config={customConfig:"config.js",autoUpdateElement:!0,language:"",defaultLanguage:"en",contentsLangDirection:"",enterMode:CKEDITOR.ENTER_P,forceEnterMode:!1,shiftEnterMode:CKEDITOR.ENTER_BR,docType:"",bodyId:"",bodyClass:"",fullPage:!1,height:200,extraPlugins:"",removePlugins:"",protectedSource:[],tabIndex:0,width:"",baseFloatZIndex:1E4,blockedKeystrokes:[CKEDITOR.CTRL+66,CKEDITOR.CTRL+73,CKEDITOR.CTRL+85]}; -(function(){CKEDITOR.focusManager=function(b){if(b.focusManager)return b.focusManager;this.hasFocus=false;this.currentActive=null;this._={editor:b};return this};CKEDITOR.focusManager._={blurDelay:200};CKEDITOR.focusManager.prototype={focus:function(){this._.timer&&clearTimeout(this._.timer);if(!this.hasFocus&&!this._.locked){var b=CKEDITOR.currentInstance;b&&b.focusManager.blur(1);this.hasFocus=true;(b=this._.editor.container)&&b.addClass("cke_focus");this._.editor.fire("focus")}},lock:function(){this._.locked= -1},unlock:function(){delete this._.locked},blur:function(b){function c(){if(this.hasFocus){this.hasFocus=false;var a=this._.editor.container;a&&a.removeClass("cke_focus");this._.editor.fire("blur")}}if(!this._.locked){this._.timer&&clearTimeout(this._.timer);var a=CKEDITOR.focusManager._.blurDelay;b||!a?c.call(this):this._.timer=CKEDITOR.tools.setTimeout(function(){delete this._.timer;c.call(this)},a,this)}},add:function(b,c){var a=b.getCustomData("focusmanager");if(!a||a!=this){a&&a.remove(b);var a= -"focus",f="blur";if(c)if(CKEDITOR.env.ie){a="focusin";f="focusout"}else CKEDITOR.event.useCapture=1;var e={blur:function(){b.equals(this.currentActive)&&this.blur()},focus:function(){this.currentActive=b;this.focus()}};b.on(a,e.focus,this);b.on(f,e.blur,this);if(c)CKEDITOR.event.useCapture=0;b.setCustomData("focusmanager",this);b.setCustomData("focusmanager_handlers",e)}},remove:function(b){b.removeCustomData("focusmanager");var c=b.removeCustomData("focusmanager_handlers");b.removeListener("blur", -c.blur);b.removeListener("focus",c.focus)}}})();CKEDITOR.keystrokeHandler=function(b){if(b.keystrokeHandler)return b.keystrokeHandler;this.keystrokes={};this.blockedKeystrokes={};this._={editor:b};return this}; -(function(){var b,c=function(a){var a=a.data,c=a.getKeystroke(),d=this.keystrokes[c],g=this._.editor;b=g.fire("key",{keyCode:c})===false;if(!b){d&&(b=g.execCommand(d,{from:"keystrokeHandler"})!==false);b||(b=!!this.blockedKeystrokes[c])}b&&a.preventDefault(true);return!b},a=function(a){if(b){b=false;a.data.preventDefault(true)}};CKEDITOR.keystrokeHandler.prototype={attach:function(b){b.on("keydown",c,this);if(CKEDITOR.env.opera||CKEDITOR.env.gecko&&CKEDITOR.env.mac)b.on("keypress",a,this)}}})(); -(function(){CKEDITOR.lang={languages:{af:1,ar:1,bg:1,bn:1,bs:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,"en-au":1,"en-ca":1,"en-gb":1,en:1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,"fr-ca":1,fr:1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,is:1,it:1,ja:1,ka:1,km:1,ko:1,ku:1,lt:1,lv:1,mn:1,ms:1,nb:1,nl:1,no:1,pl:1,"pt-br":1,pt:1,ro:1,ru:1,sk:1,sl:1,"sr-latn":1,sr:1,sv:1,th:1,tr:1,uk:1,vi:1,"zh-cn":1,zh:1},load:function(b,c,a){if(!b||!CKEDITOR.lang.languages[b])b=this.detect(c,b);this[b]?a(b,this[b]):CKEDITOR.scriptLoader.load(CKEDITOR.getUrl("lang/"+ -b+".js"),function(){a(b,this[b])},this)},detect:function(b,c){var a=this.languages,c=c||navigator.userLanguage||navigator.language||b,f=c.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),e=f[1],f=f[2];a[e+"-"+f]?e=e+"-"+f:a[e]||(e=null);CKEDITOR.lang.detect=e?function(){return e}:function(a){return a};return e||b}}})(); -CKEDITOR.scriptLoader=function(){var b={},c={};return{load:function(a,f,e,d){var g=typeof a=="string";g&&(a=[a]);e||(e=CKEDITOR);var k=a.length,h=[],l=[],m=function(a){f&&(g?f.call(e,a):f.call(e,h,l))};if(k===0)m(true);else{var n=function(a,b){(b?h:l).push(a);if(--k<=0){d&&CKEDITOR.document.getDocumentElement().removeStyle("cursor");m(b)}},o=function(a,o){b[a]=1;var d=c[a];delete c[a];for(var i=0;i -1)){var i=new CKEDITOR.dom.element("script");i.setAttributes({type:"text/javascript",src:a});if(f)if(CKEDITOR.env.ie)i.$.onreadystatechange=function(){if(i.$.readyState=="loaded"||i.$.readyState=="complete"){i.$.onreadystatechange=null;o(a,true)}};else{i.$.onload=function(){setTimeout(function(){o(a,true)},0)};i.$.onerror=function(){o(a,false)}}i.appendTo(CKEDITOR.document.getHead())}}};d&&CKEDITOR.document.getDocumentElement().setStyle("cursor","wait");for(var q=0;q=0)q=a.langCode;else{q=a.langCode.replace(/-.*/,"");q=q!=a.langCode&&CKEDITOR.tools.indexOf(h,q)>=0?q:CKEDITOR.tools.indexOf(h,"en")>=0?"en":h[0]}if(!j.langEntries||!j.langEntries[q])e.push(CKEDITOR.getUrl(j.path+"lang/"+q+".js"));else{a.lang[f]=j.langEntries[q];q=null}}n.push(q);d.push(j)}CKEDITOR.scriptLoader.load(e,function(){for(var c=["beforeInit","init","afterInit"],e=0;e]+)>)|(?:!--([\\S|\\s]*?)--\>)|(?:([^\\s>]+)\\s*((?:(?:\"[^\"]*\")|(?:'[^']*')|[^\"'>])*)\\/?>))","g")}}; -(function(){var b=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,c={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};CKEDITOR.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(a){for(var f,e,d=0,g;f=this._.htmlPartsRegex.exec(a);){e=f.index;if(e>d){d=a.substring(d,e);if(g)g.push(d);else this.onText(d)}d= -this._.htmlPartsRegex.lastIndex;if(e=f[1]){e=e.toLowerCase();if(g&&CKEDITOR.dtd.$cdata[e]){this.onCDATA(g.join(""));g=null}if(!g){this.onTagClose(e);continue}}if(g)g.push(f[0]);else if(e=f[3]){e=e.toLowerCase();if(!/="/.test(e)){var k={},h;f=f[4];var l=!!(f&&f.charAt(f.length-1)=="/");if(f)for(;h=b.exec(f);){var m=h[1].toLowerCase();h=h[2]||h[3]||h[4]||"";k[m]=!h&&c[m]?m:h}this.onTagOpen(e,k,l);!g&&CKEDITOR.dtd.$cdata[e]&&(g=[])}}else if(e=f[2])this.onComment(e)}if(a.length>d)this.onText(a.substring(d, -a.length))}}})(); -CKEDITOR.htmlParser.basicWriter=CKEDITOR.tools.createClass({$:function(){this._={output:[]}},proto:{openTag:function(b){this._.output.push("<",b)},openTagClose:function(b,c){c?this._.output.push(" />"):this._.output.push(">")},attribute:function(b,c){typeof c=="string"&&(c=CKEDITOR.tools.htmlEncodeAttr(c));this._.output.push(" ",b,'="',c,'"')},closeTag:function(b){this._.output.push("")},text:function(b){this._.output.push(b)},comment:function(b){this._.output.push("<\!--",b,"--\>")},write:function(b){this._.output.push(b)}, -reset:function(){this._.output=[];this._.indent=false},getHtml:function(b){var c=this._.output.join("");b&&this.reset();return c}}});CKEDITOR.htmlParser.comment=function(b){this.value=b;this._={isBlockLike:false}};CKEDITOR.htmlParser.comment.prototype={type:CKEDITOR.NODE_COMMENT,writeHtml:function(b,c){var a=this.value;if(c){if(!(a=c.onComment(a,this)))return;if(typeof a!="string"){a.parent=this.parent;a.writeHtml(b,c);return}}b.comment(a)}}; -(function(){CKEDITOR.htmlParser.text=function(b){this.value=b;this._={isBlockLike:false}};CKEDITOR.htmlParser.text.prototype={type:CKEDITOR.NODE_TEXT,writeHtml:function(b,c){var a=this.value;(!c||(a=c.onText(a,this)))&&b.text(a)}}})();(function(){CKEDITOR.htmlParser.cdata=function(b){this.value=b};CKEDITOR.htmlParser.cdata.prototype={type:CKEDITOR.NODE_TEXT,writeHtml:function(b){b.write(this.value)}}})(); -CKEDITOR.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:true,hasInlineStarted:false}}; -(function(){function b(a){return a.name=="a"&&a.attributes.href||CKEDITOR.dtd.$removeEmpty[a.name]}var c=CKEDITOR.tools.extend({table:1,ul:1,ol:1,dl:1},CKEDITOR.dtd.table,CKEDITOR.dtd.ul,CKEDITOR.dtd.ol,CKEDITOR.dtd.dl),a={ol:1,ul:1},f=CKEDITOR.tools.extend({},{html:1},CKEDITOR.dtd.html,CKEDITOR.dtd.body,CKEDITOR.dtd.head,{style:1,script:1});CKEDITOR.htmlParser.fragment.fromHtml=function(e,d,g){function k(a){var b;if(y.length>0)for(var c=0;c=0;b--)if(a==y[b].name){y.splice(b,1);return}for(var c=[],d=[],n=j;n!=q&&n.name!=a;){n._.isBlockLike||d.unshift(n);c.push(n);n=n.returnPoint||n.parent}if(n!=q){for(b=0;b0?this.children[b-1]:null;if(c){if(a._.isBlockLike&&c.type==CKEDITOR.NODE_TEXT){c.value=CKEDITOR.tools.rtrim(c.value);if(c.value.length===0){this.children.pop();this.add(a);return}}c.next=a}a.previous=c;a.parent=this; -this.children.splice(b,0,a);if(!this._.hasInlineStarted)this._.hasInlineStarted=a.type==CKEDITOR.NODE_TEXT||a.type==CKEDITOR.NODE_ELEMENT&&!a._.isBlockLike},writeHtml:function(a,b){var c;this.filterChildren=function(){var a=new CKEDITOR.htmlParser.basicWriter;this.writeChildrenHtml.call(this,a,b);a=a.getHtml();this.children=(new CKEDITOR.htmlParser.fragment.fromHtml(a)).children;c=1};b&&b.onRoot(this);this.writeChildrenHtml(a,c?null:b)},writeChildrenHtml:function(a,b,c){if(c&&!this.parent&&b)b.onRoot(this); -for(c=0;c=0;f--)if(m=b[f]){m.pri=c;a.splice(e,0,m)}}}function a(a,b,c){if(b)for(var e in b){var l=a[e];a[e]=f(l,b[e],c);l||a.$length++}}function f(a,b,f){if(b){b.pri=f;if(a){if(a.splice)c(a,b,f);else{a=a.pri>f?[b,a]:[a,b];a.filter=e}return a}return b.filter=b}}function e(a){for(var b= -a.type||a instanceof CKEDITOR.htmlParser.fragment,c=0;c7||i.name in CKEDITOR.dtd.tr||i.name in CKEDITOR.dtd.$listItem))e=false;else{e=a(i);e=!e||i.name=="form"&&e.name=="input"}e&&i.add(n(b))}}}function o(a,b){if((!t||!CKEDITOR.env.ie)&&a.type==CKEDITOR.NODE_ELEMENT&&a.name=="br"&&!a.attributes["data-cke-eol"])return true;var c;if(a.type== -CKEDITOR.NODE_TEXT&&(c=a.value.match(s))){if(c.index){g(a,new CKEDITOR.htmlParser.text(a.value.substring(0,c.index)));a.value=c[0]}if(CKEDITOR.env.ie&&t&&(!b||a.parent.name in h))return true;if(!t)if((c=a.previous)&&c.name=="br"||!c||d(c))return true}return false}var j={elements:{}},t=c=="html",h=CKEDITOR.tools.extend({},D),q;for(q in h)"#"in B[q]||delete h[q];for(q in h)j.elements[q]=i(t,b.config.fillEmptyBlocks!==false);j.root=i(t);j.elements.br=function(a){return function(b){if(b.parent.type!= -CKEDITOR.NODE_DOCUMENT_FRAGMENT){var c=b.attributes;if("data-cke-bogus"in c||"data-cke-eol"in c)delete c["data-cke-bogus"];else{for(c=b.next;c&&e(c);)c=c.next;var i=f(b);if(!c&&d(b.parent)){b=b.parent;c=n(a);i=b.children[b.children.length-1];b.children.push(c);c.parent=b;if(i){i.next=c;c.previous=i}}else d(c)&&(i&&!d(i))&&g(c,n(a))}}}}(t);return j}function c(a){return a.enterMode!=CKEDITOR.ENTER_BR&&a.autoParagraph!==false?a.enterMode==CKEDITOR.ENTER_DIV?"div":"p":false}function a(a){for(a=a.children[a.children.length- -1];a&&e(a);)a=a.previous;return a}function f(a){for(a=a.previous;a&&e(a);)a=a.previous;return a}function e(a){return a.type==CKEDITOR.NODE_TEXT&&!CKEDITOR.tools.trim(a.value)||a.type==CKEDITOR.NODE_ELEMENT&&a.attributes["data-cke-bookmark"]}function d(a){return a&&(a.type==CKEDITOR.NODE_ELEMENT&&a.name in D||a.type==CKEDITOR.NODE_DOCUMENT_FRAGMENT)}function g(a,b){var c=a.parent.children,d=CKEDITOR.tools.indexOf(c,a);c.splice(d,0,b);c=a.previous;a.previous=b;b.next=a;b.parent=a.parent;if(c){b.previous= -c;c.next=b}}function k(a){var b=a.parent.children,c=CKEDITOR.tools.indexOf(b,a),d=a.previous,a=a.next;d&&(d.next=a);a&&(a.previous=d);b.splice(c,1)}function h(a){var b=a.parent;return b?CKEDITOR.tools.indexOf(b.children,a):-1}function l(a){a=a.attributes;a.contenteditable!="false"&&(a["data-cke-editable"]=a.contenteditable?"true":1);a.contenteditable="false"}function m(a){a=a.attributes;switch(a["data-cke-editable"]){case "true":a.contenteditable="true";break;case "1":delete a.contenteditable}}function n(a){return a.replace(v, -function(a,b,c){return"<"+b+c.replace(t,function(a,b){return!/^on/.test(b)&&c.indexOf("data-cke-saved-"+b)==-1?" data-cke-saved-"+a+" data-cke-"+CKEDITOR.rnd+"-"+a:a})+">"})}function o(a){return a.replace(w,function(a){return""+encodeURIComponent(a)+""})}function i(a){return a.replace(I,function(a,b){return decodeURIComponent(b)})}function q(a){return a.replace(/<\!--(?!{cke_protected})[\s\S]+?--\>/g,function(a){return"<\!--"+A+"{C}"+encodeURIComponent(a).replace(/--/g, -"%2D%2D")+"--\>"})}function y(a){return a.replace(/<\!--\{cke_protected\}\{C\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)})}function z(a,b){var c=b._.dataStore;return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g,function(a,b){return decodeURIComponent(b)}).replace(/\{cke_protected_(\d+)\}/g,function(a,b){return c&&c[b]||""})}function j(a,b){for(var c=[],d=b.config.protectedSource,n=b._.dataStore||(b._.dataStore={id:1}),i=/<\!--\{cke_temp(comment)?\}(\d*?)--\>/g,d=[//gi, -//gi].concat(d),a=a.replace(/<\!--[\s\S]*?--\>/g,function(a){return"<\!--{cke_tempcomment}"+(c.push(a)-1)+"--\>"}),o=0;o"});a=a.replace(i,function(a,b,d){return"<\!--"+A+(b?"{C}":"")+encodeURIComponent(c[d]).replace(/--/g,"%2D%2D")+"--\>"});return a.replace(/(['"]).*?\1/g,function(a){return a.replace(/<\!--\{cke_protected\}([\s\S]+?)--\>/g, -function(a,b){n[n.id]=decodeURIComponent(b);return"{cke_protected_"+n.id++ +"}"})})}CKEDITOR.htmlDataProcessor=function(a){var c,d;this.editor=a;this.dataFilter=c=new CKEDITOR.htmlParser.filter;this.htmlFilter=d=new CKEDITOR.htmlParser.filter;this.writer=new CKEDITOR.htmlParser.basicWriter;c.addRules(u);c.addRules(b(a,"data"));d.addRules(r);d.addRules(b(a,"html"))};CKEDITOR.htmlDataProcessor.prototype={toHtml:function(a,b,d){var a=j(a,this.editor),a=n(a),a=o(a),a=a.replace(G,"$1cke:$2"),a=a.replace(Q, -""),a=CKEDITOR.env.opera?a:a.replace(/(]*>)(\r\n|\n)/g,"$1$2$2"),e=this.editor.editable(),f;!b&&b!==null&&(b=e.getName());e=b||e.getName();if(CKEDITOR.env.ie&&CKEDITOR.env.version<9&&e=="pre"){e="div";a="
      "+a+"
      ";f=1}e=this.editor.document.createElement(e);e.setHtml("a"+a);a=e.getHtml().substr(1);a=a.replace(RegExp(" data-cke-"+CKEDITOR.rnd+"-","ig")," ");f&&(a=a.replace(/^
      |<\/pre>$/gi,""));a=a.replace(C,"$1$2");a=i(a);a=y(a);a=CKEDITOR.htmlParser.fragment.fromHtml(a,
      -b,d===false?false:c(this.editor.config));b=new CKEDITOR.htmlParser.basicWriter;a.writeChildrenHtml(b,this.dataFilter,1);a=b.getHtml(true);return a=q(a)},toDataFormat:function(a){var b=this.editor.editable(),d=this.writer,a=CKEDITOR.htmlParser.fragment.fromHtml(a,b.getName(),c(this.editor.config));d.reset();a.writeChildrenHtml(d,this.htmlFilter,1);d=d.getHtml(true);d=y(d);return d=z(d,this.editor)}};var s=/(?: |\xa0)$/,A="{cke_protected}",B=CKEDITOR.dtd,p=["caption","colgroup","col","thead","tfoot",
      -"tbody"],D=CKEDITOR.tools.extend({},B.$blockLimit,B.$block),u={elements:{},attributeNames:[[/^on/,"data-cke-pa-on"]]},r={elementNames:[[/^cke:/,""],[/^\?xml:namespace$/,""]],attributeNames:[[/^data-cke-(saved|pa)-/,""],[/^data-cke-.*/,""],["hidefocus",""]],elements:{$:function(a){var b=a.attributes;if(b){if(b["data-cke-temp"])return false;for(var c=["name","href","src"],d,n=0;n-1&&d>-1&&c!=d)){c=h(a);d=h(b)}return c>d?1:-1})},embed:function(a){var b=a.parent;if(b&&b.name=="object"){var c=b.attributes.width,b=b.attributes.height;c&&(a.attributes.width=c);b&&(a.attributes.height=b)}},param:function(a){a.children=[];a.isEmpty=true;return a},a:function(a){if(!a.children.length&&!a.attributes.name&&!a.attributes["data-cke-saved-name"])return false},
      -span:function(a){a.attributes["class"]=="Apple-style-span"&&delete a.name},html:function(a){delete a.attributes.contenteditable;delete a.attributes["class"]},body:function(a){delete a.attributes.spellcheck;delete a.attributes.contenteditable},style:function(a){var b=a.children[0];b&&b.value&&(b.value=CKEDITOR.tools.trim(b.value));if(!a.attributes.type)a.attributes.type="text/css"},title:function(a){var b=a.children[0];b&&(b.value=a.attributes["data-cke-title"]||"")}},attributes:{"class":function(a){return CKEDITOR.tools.ltrim(a.replace(/(?:^|\s+)cke_[^\s]*/g,
      -""))||false}}};if(CKEDITOR.env.ie)r.attributes.style=function(a){return a.replace(/(^|;)([^\:]+)/g,function(a){return a.toLowerCase()})};for(var F in{input:1,textarea:1}){u.elements[F]=l;r.elements[F]=m}var v=/<(a|area|img|input|source)\b([^>]*)>/gi,t=/\b(on\w+|href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,w=/(?:])[^>]*>[\s\S]*<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,I=/([^<]*)<\/cke:encoded>/gi,G=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,
      -C=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,Q=/]*?)\/?>(?!\s*<\/cke:\1)/gi})();
      -CKEDITOR.htmlParser.element=function(b,c){this.name=b;this.attributes=c||{};this.children=[];var a=b||"",f=a.match(/^cke:(.*)/);f&&(a=f[1]);a=!(!CKEDITOR.dtd.$nonBodyContent[a]&&!CKEDITOR.dtd.$block[a]&&!CKEDITOR.dtd.$listItem[a]&&!CKEDITOR.dtd.$tableContent[a]&&!(CKEDITOR.dtd.$nonEditable[a]||a=="br"));this.isEmpty=!!CKEDITOR.dtd.$empty[b];this.isUnknown=!CKEDITOR.dtd[b];this._={isBlockLike:a,hasInlineStarted:this.isEmpty||!a}};
      -CKEDITOR.htmlParser.cssStyle=function(b){var c={};((b instanceof CKEDITOR.htmlParser.element?b.attributes.style:b)||"").replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(a,b,e){b=="font-family"&&(e=e.replace(/["']/g,""));c[b.toLowerCase()]=e});return{rules:c,populate:function(a){var b=this.toString();if(b)a instanceof CKEDITOR.dom.element?a.setAttribute("style",b):a instanceof CKEDITOR.htmlParser.element?a.attributes.style=b:a.style=b},toString:function(){var a=[],b;
      -for(b in c)c[b]&&a.push(b,":",c[b],";");return a.join("")}}};
      -(function(){var b=function(b,a){b=b[0];a=a[0];return ba?1:0};CKEDITOR.htmlParser.element.prototype={type:CKEDITOR.NODE_ELEMENT,add:CKEDITOR.htmlParser.fragment.prototype.add,clone:function(){return new CKEDITOR.htmlParser.element(this.name,this.attributes)},writeHtml:function(c,a){var f=this.attributes,e=this,d=e.name,g,k,h,l;e.filterChildren=function(){if(!l){var b=new CKEDITOR.htmlParser.basicWriter;CKEDITOR.htmlParser.fragment.prototype.writeChildrenHtml.call(e,b,a);e.children=(new CKEDITOR.htmlParser.fragment.fromHtml(b.getHtml(),
      -e.clone(),0)).children;l=1}};if(a){if(!this.parent)a.onRoot(this);for(;;){if(!(d=a.onElementName(d)))return;e.name=d;if(!(e=a.onElement(e)))return;e.parent=this.parent;if(e.name==d)break;if(e.type!=CKEDITOR.NODE_ELEMENT){e.writeHtml(c,a);return}d=e.name;if(!d){for(var d=0,m=this.children.length;d{voiceLabel}<{outerEl} class="cke_inner cke_reset" role="presentation">{topHtml}<{outerEl} id="{contentId}" class="cke_contents cke_reset" role="presentation">{bottomHtml}'));b=CKEDITOR.dom.element.createFromHtml(e.output({id:a.id,name:b,langDir:a.lang.dir,langCode:a.langCode,voiceLabel:a.lang.editor,
      -topHtml:l?''+l+"":"",contentId:a.ui.spaceId("contents"),bottomHtml:m?''+m+"":"",outerEl:CKEDITOR.env.ie?"span":"div"}));if(f==CKEDITOR.ELEMENT_MODE_REPLACE){c.hide();b.insertAfter(c)}else c.append(b);a.container=b;l&&a.ui.space("top").unselectable();m&&a.ui.space("bottom").unselectable();c=
      -a.config.width;f=a.config.height;c&&b.setStyle("width",CKEDITOR.tools.cssLength(c));f&&a.ui.space("contents").setStyle("height",CKEDITOR.tools.cssLength(f));b.disableContextMenu();CKEDITOR.env.webkit&&b.on("focus",function(){a.focus()});a.fireOnce("uiReady")}function f(a){var b=a.element;if(a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&b.is("textarea")){var c=b.$.form&&new CKEDITOR.dom.element(b.$.form);if(c){var e=function(){a.updateElement()};c.on("submit",e);if(!c.$.submit.nodeName&&!c.$.submit.length)c.$.submit=
      -CKEDITOR.tools.override(c.$.submit,function(b){return function(){a.updateElement();b.apply?b.apply(this,arguments):b()}});a.on("destroy",function(){c.removeListener("submit",e)})}}}CKEDITOR.replace=function(a,c){return b(a,c,null,CKEDITOR.ELEMENT_MODE_REPLACE)};CKEDITOR.appendTo=function(a,c,e){return b(a,c,e,CKEDITOR.ELEMENT_MODE_APPENDTO)};CKEDITOR.replaceAll=function(){for(var a=document.getElementsByTagName("textarea"),b=0;b",j="",a=g+a.replace(f,function(){return j+g})+j}a=a.replace(/\n/g,"
      ");b||(a=a.replace(RegExp("
      (?=)"),function(a){return e.repeat(a,2)}));a=a.replace(/^ | $/g," ");a=a.replace(/(>|\s) /g,function(a,b){return b+" "}).replace(/ (?=<)/g," ");m(this,"text",a)},insertElement:function(b){d(this);for(var c= -this.editor,e=c.config.enterMode,f=c.getSelection(),h=f.getRanges(),l=b.getName(),j=CKEDITOR.dtd.$block[l],m,k,B,p=h.length-1;p>=0;p--){m=h[p];if(!m.checkReadOnly()){m.deleteContents(1);k=!p&&b||b.clone(1);var D,u;if(j)for(;(D=m.getCommonAncestor(0,1))&&(u=CKEDITOR.dtd[D.getName()])&&(!u||!u[l]);)if(D.getName()in CKEDITOR.dtd.span)m.splitElement(D);else if(m.checkStartOfBlock()&&m.checkEndOfBlock()){m.setStartBefore(D);m.collapse(true);D.remove()}else m.splitBlock(e==CKEDITOR.ENTER_DIV?"div":"p", -c.editable());m.insertNode(k);B||(B=k)}}if(B){m.moveToPosition(B,CKEDITOR.POSITION_AFTER_END);if(j)if((b=B.getNext(a))&&b.type==CKEDITOR.NODE_ELEMENT&&b.is(CKEDITOR.dtd.$block))b.getDtd()["#"]?m.moveToElementEditStart(b):m.moveToElementEditEnd(B);else if(!b&&e!=CKEDITOR.ENTER_BR){b=m.fixBlock(true,e==CKEDITOR.ENTER_DIV?"div":"p");m.moveToElementEditStart(b)}}f.selectRanges([m]);g(this,CKEDITOR.env.opera)},setData:function(a,b){!b&&this.editor.dataProcessor&&(a=this.editor.dataProcessor.toHtml(a)); -this.setHtml(a);this.editor.fire("dataReady")},getData:function(a){var b=this.getHtml();!a&&this.editor.dataProcessor&&(b=this.editor.dataProcessor.toDataFormat(b));return b},setReadOnly:function(a){this.setAttribute("contenteditable",!a)},detach:function(){this.removeClass("cke_editable");var a=this.editor;this._.detach();delete a.document;delete a.window},isInline:function(){return this.getDocument().equals(CKEDITOR.document)},setup:function(){var a=this.editor;this.attachListener(a,"beforeGetData", -function(){var b=this.getData();this.is("textarea")||a.config.ignoreEmptyParagraph!==false&&(b=b.replace(k,function(a,b){return b}));a.setData(b,null,1)},this);this.attachListener(a,"getSnapshot",function(a){a.data=this.getData(1)},this);this.attachListener(a,"afterSetData",function(){this.setData(a.getData(1))},this);this.attachListener(a,"loadSnapshot",function(a){this.setData(a.data,1)},this);this.attachListener(a,"beforeFocus",function(){var b=a.getSelection();(b=b&&b.getNative())&&b.type=="Control"|| -this.focus()},this);this.attachListener(a,"insertHtml",function(a){this.insertHtml(a.data.dataValue,a.data.mode)},this);this.attachListener(a,"insertElement",function(a){this.insertElement(a.data)},this);this.attachListener(a,"insertText",function(a){this.insertText(a.data)},this);this.setReadOnly(a.readOnly);this.attachClass("cke_editable");this.attachClass(a.elementMode==CKEDITOR.ELEMENT_MODE_INLINE?"cke_editable_inline":a.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE||a.elementMode==CKEDITOR.ELEMENT_MODE_APPENDTO? -"cke_editable_themed":"");this.attachClass("cke_contents_"+a.config.contentsLangDirection);a.keystrokeHandler.blockedKeystrokes[8]=a.readOnly;a.keystrokeHandler.attach(this);this.on("blur",function(a){CKEDITOR.env.opera&&CKEDITOR.document.getActive().equals(this.isInline()?this:this.getWindow().getFrame())?a.cancel():this.hasFocus=false},null,null,-1);this.on("focus",function(){this.hasFocus=true},null,null,-1);a.focusManager.add(this);if(this.equals(CKEDITOR.document.getActive())){this.hasFocus= -true;a.once("contentDom",function(){a.focusManager.focus()})}if(!this.is("textarea")){a.document=this.getDocument();a.window=this.getWindow();var b=a.document;this.changeAttr("spellcheck",!a.config.disableNativeSpellChecker);var d=a.config.contentsLangDirection;this.getDirection(1)!=d&&this.changeAttr("dir",d);a.document.equals(CKEDITOR.document)&&this.changeAttr("tabindex",a.tabIndex);var f=CKEDITOR.getCss();if(f){d=b.getHead();if(!d.getCustomData("stylesheet")){f=b.appendStyleText(f);f=new CKEDITOR.dom.element(f.ownerNode|| -f.owningElement);d.setCustomData("stylesheet",f);f.data("cke-temp",1)}}d=b.getCustomData("stylesheet_ref")||0;b.setCustomData("stylesheet_ref",d+1);this.setCustomData("cke_includeReadonly",!a.config.disableReadonlyStyling);this.attachListener(this,"click",function(a){var a=a.data,b=a.getTarget();b.is("a")&&(a.$.button!=2&&b.isReadOnly())&&a.preventDefault()});this.attachListener(a,"key",function(b){if(a.readOnly)return false;var c=b.data.keyCode,d;if(c in{8:1,46:1}){var i=a.getSelection(),b=i.getRanges()[0], -f=b.startPath(),o,g,l,c=c==8;if(i=e(i)){a.fire("saveSnapshot");b.moveToPosition(i,CKEDITOR.POSITION_BEFORE_START);i.remove();b.select();a.fire("saveSnapshot");d=1}else if(b.collapsed)if((o=f.block)&&b[c?"checkStartOfBlock":"checkEndOfBlock"]()&&(l=o[c?"getPrevious":"getNext"](h))&&l.is("table")){a.fire("saveSnapshot");b[c?"checkEndOfBlock":"checkStartOfBlock"]()&&o.remove();b["moveToElementEdit"+(c?"End":"Start")](l);b.select();a.fire("saveSnapshot");d=1}else if(f.blockLimit&&f.blockLimit.is("td")&& -(g=f.blockLimit.getAscendant("table"))&&b.checkBoundaryOfElement(g,c?CKEDITOR.START:CKEDITOR.END)&&(l=g[c?"getPrevious":"getNext"](h))){a.fire("saveSnapshot");b["moveToElementEdit"+(c?"End":"Start")](l);b.checkStartOfBlock()&&b.checkEndOfBlock()?l.remove():b.select();a.fire("saveSnapshot");d=1}else if((g=f.contains(["td","th","caption"]))&&b.checkBoundaryOfElement(g,c?CKEDITOR.START:CKEDITOR.END))if((l=g[c?"getPreviousSourceNode":"getNextSourceNode"](1,CKEDITOR.NODE_ELEMENT))&&!l.isReadOnly()&&b.root.contains(l)){b[c? -"moveToElementEditEnd":"moveToElementEditStart"](l);b.select();d=1}}return!d});CKEDITOR.env.ie&&this.attachListener(this,"click",c);!CKEDITOR.env.ie&&!CKEDITOR.env.opera&&this.attachListener(this,"mousedown",function(b){var c=b.data.getTarget();if(c.is("img","hr","input","textarea","select")){a.getSelection().selectElement(c);c.is("input","textarea","select")&&b.data.preventDefault()}});CKEDITOR.env.gecko&&this.attachListener(this,"mouseup",function(b){if(b.data.$.button==2){b=b.data.getTarget(); -if(!b.getOuterHtml().replace(k,"")){var c=a.createRange();c.moveToElementEditStart(b);c.select(true)}}});if(CKEDITOR.env.webkit){this.attachListener(this,"click",function(a){a.data.getTarget().is("input","select")&&a.data.preventDefault()});this.attachListener(this,"mouseup",function(a){a.data.getTarget().is("input","textarea")&&a.data.preventDefault()})}}}},_:{detach:function(){this.editor.setData(this.editor.getData(),0,1);this.clearListeners();this.restoreAttrs();var a;if(a=this.removeCustomData("classes"))for(;a.length;)this.removeClass(a.pop()); -a=this.getDocument();var b=a.getHead();if(b.getCustomData("stylesheet")){var c=a.getCustomData("stylesheet_ref");if(--c)a.setCustomData("stylesheet_ref",c);else{a.removeCustomData("stylesheet_ref");b.removeCustomData("stylesheet").remove()}}delete this.editor}}});CKEDITOR.editor.prototype.editable=function(a){var b=this._.editable;if(b&&a)return 0;if(arguments.length)b=this._.editable=a?a instanceof CKEDITOR.editable?a:new CKEDITOR.editable(this,a):(b&&b.detach(),null);return b};var k=/(^|]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:]*>| |\u00A0| )?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi, -h=CKEDITOR.dom.walker.whitespaces(true),l=CKEDITOR.dom.walker.bookmark(false,true);CKEDITOR.on("instanceLoaded",function(a){var c=a.editor;c.on("insertElement",function(a){a=a.data;if(a.type==CKEDITOR.NODE_ELEMENT&&(a.is("input")||a.is("textarea"))){a.getAttribute("contentEditable")!="false"&&a.data("cke-editable",a.hasAttribute("contenteditable")?"true":"1");a.setAttribute("contentEditable",false)}});c.on("selectionChange",function(a){if(!c.readOnly){var d=c.getSelection();if(d&&!d.isLocked){d=c.checkDirty(); -c.fire("lockSnapshot");b(a);c.fire("unlockSnapshot");!d&&c.resetDirty()}}})});CKEDITOR.addCss(".cke_editable{cursor:text}.cke_editable img,.cke_editable input,.cke_editable textarea{cursor:default}");var m=function(){function b(a){return a.type==CKEDITOR.NODE_ELEMENT}function c(a,d){var e,f,i,g,t=[],h=d.range.startContainer;e=d.range.startPath();for(var h=j[h.getName()],l=0,m=a.getChildren(),q=m.count(),k=-1,z=-1,y=0,s=e.contains(j.$list);l-1)t[k].firstNotAllowed=1;if(z>-1)t[z].lastNotAllowed=1;return t}function d(a,c){var e=[],f=a.getChildren(),o=f.count(),g,t=0,h=j[c],l=!a.is(j.$inline)|| -a.is("br");for(l&&e.push(" ");t ",r.document);r.insertNode(w);r.setStartAfter(w)}I=new CKEDITOR.dom.elementPath(r.startContainer); -s.endPath=G=new CKEDITOR.dom.elementPath(r.endContainer);if(!r.collapsed){t=G.block||G.blockLimit;var Q=r.getCommonAncestor();t&&(!t.equals(Q)&&!t.contains(Q)&&r.checkEndOfBlock())&&s.zombies.push(t);r.deleteContents()}for(;(C=b(r.startContainer)&&r.startContainer.getChild(r.startOffset-1))&&b(C)&&C.isBlockBoundary()&&I.contains(C);)r.moveToPosition(C,CKEDITOR.POSITION_BEFORE_END);f(r,s.blockLimit,I,G);if(w){r.setEndBefore(w);r.collapse();w.remove()}w=r.startPath();if(t=w.contains(e,false,1)){r.splitElement(t); -s.inlineStylesRoot=t;s.inlineStylesPeak=w.lastElement}w=r.createBookmark();(t=w.startNode.getPrevious(a))&&b(t)&&e(t)&&v.push(t);(t=w.startNode.getNext(a))&&b(t)&&e(t)&&v.push(t);for(t=w.startNode;(t=t.getParent())&&e(t);)v.push(t);r.moveToBookmark(w);if(u){C=u;u=s.range;if(s.type=="text"&&s.inlineStylesRoot){w=C;C=s.inlineStylesPeak;r=C.getDocument().createText("{cke-peak}");for(v=s.inlineStylesRoot.getParent();!C.equals(v);){r=r.appendTo(C.clone());C=C.getParent()}C=r.getOuterHtml().replace("{cke-peak}", -w)}w=s.blockLimit.getName();if(/^\s+|\s+$/.test(C)&&"span"in CKEDITOR.dtd[w]){var K=' ';C=K+C+K}C=s.editor.dataProcessor.toHtml(C,null,false);w=u.document.createElement("body");w.setHtml(C);if(K){w.getFirst().remove();w.getLast().remove()}if((K=u.startPath().block)&&!(K.getChildCount()==1&&K.getBogus()))a:{var E;if(w.getChildCount()==1&&b(E=w.getFirst())&&E.is(m)){K=E.getElementsByTag("*");u=0;for(r=K.count();u0;else{x=E.startPath();if(!G.isBlock&&(N=s.editor.config.enterMode!=CKEDITOR.ENTER_BR&&s.editor.config.autoParagraph!==false?s.editor.config.enterMode==CKEDITOR.ENTER_DIV?"div":"p":false)&&!x.block&&x.blockLimit&&x.blockLimit.equals(E.root)){N=K.createElement(N);!CKEDITOR.env.ie&&N.appendBogus();E.insertNode(N);!CKEDITOR.env.ie&& -(J=N.getBogus())&&J.remove();E.moveToPosition(N,CKEDITOR.POSITION_BEFORE_END)}if((x=E.startPath().block)&&!x.equals(H)){if(J=x.getBogus()){J.remove();C.push(x)}H=x}G.firstNotAllowed&&(r=1);if(r&&G.isElement){x=E.startContainer;for(L=null;x&&!j[x.getName()][G.name];){if(x.equals(u)){x=null;break}L=x;x=x.getParent()}if(x){if(L){O=E.splitElement(L);s.zombies.push(O);s.zombies.push(L)}}else{L=u.getName();P=!w;x=w==I.length-1;L=d(G.node,L);for(var M=[],R=L.length,T=0,U=void 0,V=0,W=-1;T1&&f&&f.intersectsNode(c.$)){d=[e.anchorOffset,e.focusOffset];f=e.focusNode==c.$&&e.focusOffset>0;e.anchorNode==c.$&&e.anchorOffset>0&&d[0]--;f&&d[1]--;var g;f=e;if(!f.isCollapsed){g=f.getRangeAt(0);g.setStart(f.anchorNode,f.anchorOffset);g.setEnd(f.focusNode,f.focusOffset);g=g.collapsed}g&&d.unshift(d.pop())}}c.setText(c.getText().replace(/\u200B/g,""));if(d){c=e.getRangeAt(0);c.setStart(c.startContainer,d[0]);c.setEnd(c.startContainer,d[1]);e.removeAllRanges();e.addRange(c)}}} -var g,k,h=CKEDITOR.dom.walker.invisible(1);CKEDITOR.on("instanceCreated",function(a){function e(){var a=f.getSelection();a&&a.removeAllRanges()}var f=a.editor;f.define("selectionChange",{errorProof:1});f.on("contentDom",function(){var a=f.document,e=CKEDITOR.document,g=f.editable(),o=a.getBody(),n=a.getDocumentElement(),h=g.isInline();if(CKEDITOR.env.ie||CKEDITOR.env.opera||h){var m;g.attachListener(g,"focus",function(){f.unlockSelection(m);m=0},null,null,-1);var k,D=function(){k=f.getSelection(1); -k.lock()};l?g.attachListener(g,"beforedeactivate",D,null,null,-1):g.attachListener(f,"selectionCheck",D,null,null,-1);g.attachListener(g,"blur",function(){f.lockSelection(k);m=1},null,null,-1);g.attachListener(g,"mousedown",function(){m=0})}if(CKEDITOR.env.ie&&!h){var u;g.attachListener(g,"mousedown",function(a){a.data.$.button==2&&f.document.$.selection.type=="None"&&(u=f.window.getScrollPosition())});g.attachListener(g,"mouseup",function(a){if(a.data.$.button==2&&u){f.document.$.documentElement.scrollLeft= -u.x;f.document.$.documentElement.scrollTop=u.y}u=null});if(a.$.compatMode!="BackCompat"){if(CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)n.on("mousedown",function(a){function b(a){a=a.data.$;if(d){var c=o.$.createTextRange();try{c.moveToPoint(a.x,a.y)}catch(e){}d.setEndPoint(g.compareEndPoints("StartToStart",c)<0?"EndToEnd":"StartToStart",c);d.select()}}function c(){n.removeListener("mousemove",b);e.removeListener("mouseup",c);n.removeListener("mouseup",c);d.select()}a=a.data;if(a.getTarget().is("html")&& -a.$.y7){n.on("mousedown",function(a){if(a.data.getTarget().is("html")){e.on("mouseup",r);n.on("mouseup",r)}});var r=function(){e.removeListener("mouseup",r);n.removeListener("mouseup",r);var b=CKEDITOR.document.$.selection,c=b.createRange();b.type!="None"&&c.parentElement().ownerDocument== -a.$&&c.select()}}}}g.attachListener(g,"selectionchange",b,f);g.attachListener(g,"mouseup",c,f);g.attachListener(g,"keyup",c,f);g.attachListener(g,"focus",function(){f.forceNextSelectionCheck();f.selectionChange(1)});if(CKEDITOR.env.webkit)a.on("keydown",function(a){switch(a.data.getKey()){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:d(f.editable())}},null,null,-1)});f.on("contentDomUnload",f.forceNextSelectionCheck,f);f.on("dataReady",function(){f.selectionChange(1)}); -CKEDITOR.env.ie9Compat&&f.on("beforeDestroy",e,null,null,9);CKEDITOR.env.webkit&&f.on("setData",e);f.on("contentDomUnload",function(){f.unlockSelection()})});CKEDITOR.on("instanceReady",function(a){var b=a.editor,c=b.editable();if(CKEDITOR.env.webkit){b.on("selectionChange",function(){var a=e(c);a&&(a.getCustomData("ready")?d(c):a.setCustomData("ready",1))},null,null,-1);b.on("beforeSetMode",function(){d(c)},null,null,-1);var f,g,a=function(){var a=b.document,d=e(c);if(d){a=a.$.defaultView.getSelection(); -a.type=="Caret"&&a.anchorNode==d.$&&(g=1);f=d.getText();d.setText(f.replace(/\u200B/g,""))}},h=function(){var a=b.document,d=e(c);if(d){d.setText(f);if(g){a.$.defaultView.getSelection().setPosition(d.$,d.getLength());g=0}}};b.on("beforeUndoImage",a);b.on("afterUndoImage",h);b.on("beforeGetData",a,null,null,0);b.on("getData",h)}});CKEDITOR.editor.prototype.selectionChange=function(a){(a?b:c).call(this)};CKEDITOR.editor.prototype.getSelection=function(a){if(this._.savedSelection&&!a)return this._.savedSelection; -return(a=this.editable())?new CKEDITOR.dom.selection(a):null};CKEDITOR.editor.prototype.lockSelection=function(a){a=a||this.getSelection(1);if(a.getType()!=CKEDITOR.SELECTION_NONE){!a.isLocked&&a.lock();this._.savedSelection=a;return true}return false};CKEDITOR.editor.prototype.unlockSelection=function(a){var b=this._.savedSelection;if(b){b.unlock(a);delete this._.savedSelection;return true}return false};CKEDITOR.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath}; -CKEDITOR.dom.document.prototype.getSelection=function(){return new CKEDITOR.dom.selection(this)};CKEDITOR.dom.range.prototype.select=function(){var a=this.root instanceof CKEDITOR.editable?this.root.editor.getSelection():new CKEDITOR.dom.selection(this.root);a.selectRanges([this]);return a};CKEDITOR.SELECTION_NONE=1;CKEDITOR.SELECTION_TEXT=2;CKEDITOR.SELECTION_ELEMENT=3;var l=typeof window.getSelection!="function";CKEDITOR.dom.selection=function(a){var b=a instanceof CKEDITOR.dom.element;this.document= -a instanceof CKEDITOR.dom.document?a:a.getDocument();this.root=b?a:this.document.getBody();this.isLocked=0;this._={cache:{}};if(CKEDITOR.env.webkit){a=this.document.getWindow().$.getSelection();if(a.type=="None"&&this.document.getActive().equals(this.root)||a.type=="Caret"&&a.anchorNode.nodeType==CKEDITOR.NODE_DOCUMENT){var c=new CKEDITOR.dom.range(this.root);c.moveToPosition(this.root,CKEDITOR.POSITION_AFTER_START);b=this.document.$.createRange();b.setStart(c.startContainer.$,c.startOffset);b.collapse(1); -a.addRange(b)}}var a=this.getNative(),d;if(a)if(a.getRangeAt)d=(c=a.rangeCount&&a.getRangeAt(0))&&new CKEDITOR.dom.node(c.commonAncestorContainer);else{try{c=a.createRange()}catch(e){}d=c&&CKEDITOR.dom.element.get(c.item&&c.item(0)||c.parentElement())}if(!d||!this.root.equals(d)&&!this.root.contains(d)){this._.cache.type=CKEDITOR.SELECTION_NONE;this._.cache.startElement=null;this._.cache.selectedElement=null;this._.cache.selectedText="";this._.cache.ranges=new CKEDITOR.dom.rangeList}return this}; -var m={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};CKEDITOR.dom.selection.prototype={getNative:function(){return this._.cache.nativeSel!==void 0?this._.cache.nativeSel:this._.cache.nativeSel=l?this.document.$.selection:this.document.getWindow().$.getSelection()},getType:l?function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_NONE;try{var c=this.getNative(),d=c.type;if(d=="Text")b= -CKEDITOR.SELECTION_TEXT;if(d=="Control")b=CKEDITOR.SELECTION_ELEMENT;if(c.createRange().parentElement())b=CKEDITOR.SELECTION_TEXT}catch(e){}return a.type=b}:function(){var a=this._.cache;if(a.type)return a.type;var b=CKEDITOR.SELECTION_TEXT,c=this.getNative();if(!c||!c.rangeCount)b=CKEDITOR.SELECTION_NONE;else if(c.rangeCount==1){var c=c.getRangeAt(0),d=c.startContainer;if(d==c.endContainer&&d.nodeType==1&&c.endOffset-c.startOffset==1&&m[d.childNodes[c.startOffset].nodeName.toLowerCase()])b=CKEDITOR.SELECTION_ELEMENT}return a.type= -b},getRanges:function(){var a=l?function(){function a(b){return(new CKEDITOR.dom.node(b)).getIndex()}var b=function(b,c){b=b.duplicate();b.collapse(c);var d=b.parentElement(),e=d.ownerDocument;if(!d.hasChildNodes())return{container:d,offset:0};for(var f=d.children,g,i,h=b.duplicate(),n=0,l=f.length-1,m=-1,k,v;n<=l;){m=Math.floor((n+l)/2);g=f[m];h.moveToElementText(g);k=h.compareEndPoints("StartToStart",b);if(k>0)l=m-1;else if(k<0)n=m+1;else{if(CKEDITOR.env.ie9Compat&&g.tagName=="BR"){f=e.defaultView.getSelection(); -return{container:f[c?"anchorNode":"focusNode"],offset:f[c?"anchorOffset":"focusOffset"]}}return{container:d,offset:a(g)}}}if(m==-1||m==f.length-1&&k<0){h.moveToElementText(d);h.setEndPoint("StartToStart",b);e=h.text.replace(/(\r\n|\r)/g,"\n").length;f=d.childNodes;if(!e){g=f[f.length-1];return g.nodeType!=CKEDITOR.NODE_TEXT?{container:d,offset:f.length}:{container:g,offset:g.nodeValue.length}}for(d=f.length;e>0&&d>0;){i=f[--d];if(i.nodeType==CKEDITOR.NODE_TEXT){v=i;e=e-i.nodeValue.length}}return{container:v, -offset:-e}}h.collapse(k>0?true:false);h.setEndPoint(k>0?"StartToStart":"EndToStart",b);e=h.text.replace(/(\r\n|\r)/g,"\n").length;if(!e)return{container:d,offset:a(g)+(k>0?0:1)};for(;e>0;)try{i=g[k>0?"previousSibling":"nextSibling"];if(i.nodeType==CKEDITOR.NODE_TEXT){e=e-i.nodeValue.length;v=i}g=i}catch(t){return{container:d,offset:a(g)}}return{container:v,offset:k>0?-e:v.nodeValue.length+e}};return function(){var a=this.getNative(),c=a&&a.createRange(),d=this.getType();if(!a)return[];if(d==CKEDITOR.SELECTION_TEXT){a= -new CKEDITOR.dom.range(this.root);d=b(c,true);a.setStart(new CKEDITOR.dom.node(d.container),d.offset);d=b(c);a.setEnd(new CKEDITOR.dom.node(d.container),d.offset);a.endContainer.getPosition(a.startContainer)&CKEDITOR.POSITION_PRECEDING&&a.endOffset<=a.startContainer.getIndex()&&a.collapse();return[a]}if(d==CKEDITOR.SELECTION_ELEMENT){for(var d=[],e=0;e=b.getLength()?m.setStartAfter(b):m.setStartBefore(b));g&& -g.type==CKEDITOR.NODE_TEXT&&(l?m.setEndAfter(g):m.setEndBefore(g));b=new CKEDITOR.dom.walker(m);b.evaluator=function(a){if(a.type==CKEDITOR.NODE_ELEMENT&&a.isReadOnly()){var b=f.clone();f.setEndBefore(a);f.collapsed&&d.splice(e--,1);if(!(a.getPosition(m.endContainer)&CKEDITOR.POSITION_CONTAINS)){b.setStartAfter(a);b.collapsed||d.splice(e+1,0,b)}return true}return false};b.next()}}return c.ranges}}(),getStartElement:function(){var a=this._.cache;if(a.startElement!==void 0)return a.startElement;var b; -switch(this.getType()){case CKEDITOR.SELECTION_ELEMENT:return this.getSelectedElement();case CKEDITOR.SELECTION_TEXT:var c=this.getRanges()[0];if(c){if(c.collapsed){b=c.startContainer;b.type!=CKEDITOR.NODE_ELEMENT&&(b=b.getParent())}else{for(c.optimize();;){b=c.startContainer;if(c.startOffset==(b.getChildCount?b.getChildCount():b.getLength())&&!b.isBlockBoundary())c.setStartAfter(b);else break}b=c.startContainer;if(b.type!=CKEDITOR.NODE_ELEMENT)return b.getParent();b=b.getChild(c.startOffset);if(!b|| -b.type!=CKEDITOR.NODE_ELEMENT)b=c.startContainer;else for(c=b.getFirst();c&&c.type==CKEDITOR.NODE_ELEMENT;){b=c;c=c.getFirst()}}b=b.$}}return a.startElement=b?new CKEDITOR.dom.element(b):null},getSelectedElement:function(){var a=this._.cache;if(a.selectedElement!==void 0)return a.selectedElement;var b=this,c=CKEDITOR.tools.tryThese(function(){return b.getNative().createRange().item(0)},function(){for(var a=b.getRanges()[0],c,d,e=2;e&&(!(c=a.getEnclosedNode())||!(c.type==CKEDITOR.NODE_ELEMENT&&m[c.getName()]&& -(d=c)));e--)a.shrink(CKEDITOR.SHRINK_ELEMENT);return d.$});return a.selectedElement=c?new CKEDITOR.dom.element(c):null},getSelectedText:function(){var a=this._.cache;if(a.selectedText!==void 0)return a.selectedText;var b=this.getNative(),b=l?b.type=="Control"?"":b.createRange().text:b.toString();return a.selectedText=b},lock:function(){this.getRanges();this.getStartElement();this.getSelectedElement();this.getSelectedText();this._.cache.nativeSel=null;this.isLocked=1},unlock:function(a){if(this.isLocked){if(a)var b= -this.getSelectedElement(),c=!b&&this.getRanges();this.isLocked=0;this.reset();if(a)(a=b||c[0].getCommonAncestor())&&a.getAscendant("body",1)&&(b?this.selectElement(b):this.selectRanges(c))}},reset:function(){this._.cache={}},selectElement:function(a){var b=new CKEDITOR.dom.range(this.root);b.setStartBefore(a);b.setEndAfter(a);this.selectRanges([b])},selectRanges:function(a){if(a.length)if(this.isLocked){var b=CKEDITOR.document.getActive();this.unlock();this.selectRanges(a);this.lock();!b.equals(this.root)&& -b.focus()}else{if(l){var c=CKEDITOR.dom.walker.whitespaces(true),e=/\ufeff|\u00a0/,g={table:1,tbody:1,tr:1};if(a.length>1){b=a[a.length-1];a[0].setEnd(b.endContainer,b.endOffset)}var b=a[0],a=b.collapsed,h,j,k,A=b.getEnclosedNode();if(A&&A.type==CKEDITOR.NODE_ELEMENT&&A.getName()in m&&(!A.is("a")||!A.getText()))try{k=A.$.createControlRange();k.addElement(A.$);k.select();return}catch(B){}(b.startContainer.type==CKEDITOR.NODE_ELEMENT&&b.startContainer.getName()in g||b.endContainer.type==CKEDITOR.NODE_ELEMENT&& -b.endContainer.getName()in g)&&b.shrink(CKEDITOR.NODE_ELEMENT,true);k=b.createBookmark();var g=k.startNode,p;if(!a)p=k.endNode;k=b.document.$.body.createTextRange();k.moveToElementText(g.$);k.moveStart("character",1);if(p){e=b.document.$.body.createTextRange();e.moveToElementText(p.$);k.setEndPoint("EndToEnd",e);k.moveEnd("character",-1)}else{h=g.getNext(c);j=g.hasAscendant("pre");h=!(h&&h.getText&&h.getText().match(e))&&(j||!g.hasPrevious()||g.getPrevious().is&&g.getPrevious().is("br"));j=b.document.createElement("span"); -j.setHtml("");j.insertBefore(g);h&&b.document.createText("").insertBefore(g)}b.setStartBefore(g);g.remove();if(a){if(h){k.moveStart("character",-1);k.select();b.document.$.selection.clear()}else k.select();b.moveToPosition(j,CKEDITOR.POSITION_BEFORE_START);j.remove()}else{b.setEndBefore(p);p.remove();k.select()}}else{p=this.getNative();if(!p)return;if(CKEDITOR.env.opera){b=this.document.$.createRange();b.selectNodeContents(this.root.$);p.addRange(b)}this.removeAllRanges();for(e=0;e=0){b.collapse(1);k.setEnd(b.endContainer.$,b.endOffset)}else throw D;}p.addRange(k)}}this.reset();this.root.fire("selectionchange")}},createBookmarks:function(a){return this.getRanges().createBookmarks(a)},createBookmarks2:function(a){return this.getRanges().createBookmarks2(a)},selectBookmarks:function(a){for(var b=[],c=0;c]*>)[ \t\r\n]*/gi,"$1");f=f.replace(/([ \t\n\r]+| )/g," ");f=f.replace(/]*>/gi,"\n");if(CKEDITOR.env.ie){var g=a.getDocument().createElement("div");g.append(e);e.$.outerHTML="
      "+f+"
      ";e.copyAttributes(g.getFirst());e=g.getFirst().remove()}else e.setHtml(f);b=e}else f?b=m(c?[a.getHtml()]:h(a),b):a.moveChildren(b);b.replace(a);if(d){var c=b,i;if((i=c.getPrevious(v))&&i.is&&i.is("pre")){d=l(i.getHtml(),/\n$/,"")+ -"\n\n"+l(c.getHtml(),/^\n/,"");CKEDITOR.env.ie?c.$.outerHTML="
      "+d+"
      ":c.setHtml(d);i.remove()}}else c&&q(b)}function h(a){a.getName();var b=[];l(a.getOuterHtml(),/(\S\s*)\n(?:\s|(]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,function(a,b,c){return b+"
      "+c+"
      "}).replace(/([\s\S]*?)<\/pre>/gi,function(a,c){b.push(c)});return b}function l(a,b,c){var d="",e="",a=a.replace(/(^]+data-cke-bookmark.*?\/span>)|(]+data-cke-bookmark.*?\/span>$)/gi,function(a,
      -b,c){b&&(d=b);c&&(e=c);return""});return d+a.replace(b,c)+e}function m(a,b){var c;a.length>1&&(c=new CKEDITOR.dom.documentFragment(b.getDocument()));for(var d=0;d"),e=e.replace(/[ \t]{2,}/g,function(a){return CKEDITOR.tools.repeat(" ",
      -a.length-1)+" "});if(c){var f=b.clone();f.setHtml(e);c.append(f)}else b.setHtml(e)}return c||b}function n(a){var b=this._.definition,c=b.attributes,b=b.styles,d=s(this)[a.getName()],e=CKEDITOR.tools.isEmpty(c)&&CKEDITOR.tools.isEmpty(b),f;for(f in c)if(!((f=="class"||this._.definition.fullMatch)&&a.getAttribute(f)!=A(f,c[f]))){e=a.hasAttribute(f);a.removeAttribute(f)}for(var g in b)if(!(this._.definition.fullMatch&&a.getStyle(g)!=A(g,b[g],true))){e=e||!!a.getStyle(g);a.removeStyle(g)}i(a,d,p[a.getName()]);
      -e&&(this._.definition.alwaysRemoveElement?q(a,1):!CKEDITOR.dtd.$block[a.getName()]||this._.enterMode==CKEDITOR.ENTER_BR&&!a.hasAttributes()?q(a):a.renameNode(this._.enterMode==CKEDITOR.ENTER_P?"p":"div"))}function o(a){for(var b=s(this),c=a.getElementsByTag(this.element),d=c.count();--d>=0;)n.call(this,c.getItem(d));for(var e in b)if(e!=this.element){c=a.getElementsByTag(e);for(d=c.count()-1;d>=0;d--){var f=c.getItem(d);i(f,b[e])}}}function i(a,b,c){if(b=b&&b.attributes)for(var d=0;d",a||b.name,"");return c.join("")}};CKEDITOR.style.getStyleText=function(a){var b=a._ST;if(b)return b;var b=a.styles,c=a.attributes&&a.attributes.style||
      -"",d="";c.length&&(c=c.replace(u,";"));for(var e in b){var f=b[e],g=(e+":"+f).replace(u,";");f=="inherit"?d=d+g:c=c+g}c.length&&(c=CKEDITOR.tools.normalizeCssText(c,true));return a._ST=c+d}})();CKEDITOR.styleCommand=function(b){this.style=b};CKEDITOR.styleCommand.prototype.exec=function(b){b.focus();this.state==CKEDITOR.TRISTATE_OFF?b.applyStyle(this.style):this.state==CKEDITOR.TRISTATE_ON&&b.removeStyle(this.style)};CKEDITOR.stylesSet=new CKEDITOR.resourceManager("","stylesSet");
      -CKEDITOR.addStylesSet=CKEDITOR.tools.bind(CKEDITOR.stylesSet.add,CKEDITOR.stylesSet);CKEDITOR.loadStylesSet=function(b,c,a){CKEDITOR.stylesSet.addExternal(b,c,"");CKEDITOR.stylesSet.load(b,a)};
      -CKEDITOR.editor.prototype.getStylesSet=function(b){if(this._.stylesDefinitions)b(this._.stylesDefinitions);else{var c=this,a=c.config.stylesCombo_stylesSet||c.config.stylesSet||"default";if(a instanceof Array){c._.stylesDefinitions=a;b(a)}else{var a=a.split(":"),f=a[0];CKEDITOR.stylesSet.addExternal(f,a[1]?a.slice(1).join(":"):CKEDITOR.getUrl("styles.js"),"");CKEDITOR.stylesSet.load(f,function(a){c._.stylesDefinitions=a[f];b(c._.stylesDefinitions)})}}};
      -CKEDITOR.dom.comment=function(b,c){typeof b=="string"&&(b=(c?c.$:document).createComment(b));CKEDITOR.dom.domObject.call(this,b)};CKEDITOR.dom.comment.prototype=new CKEDITOR.dom.node;CKEDITOR.tools.extend(CKEDITOR.dom.comment.prototype,{type:CKEDITOR.NODE_COMMENT,getOuterHtml:function(){return"<\!--"+this.$.nodeValue+"--\>"}});
      -(function(){var b={},c;for(c in CKEDITOR.dtd.$blockLimit)c in CKEDITOR.dtd.$list||(b[c]=1);var a={};for(c in CKEDITOR.dtd.$block)c in CKEDITOR.dtd.$blockLimit||c in CKEDITOR.dtd.$empty||(a[c]=1);CKEDITOR.dom.elementPath=function(c,e){var d=null,g=null,k=[],e=e||c.getDocument().getBody(),h=c;do if(h.type==CKEDITOR.NODE_ELEMENT){k.push(h);if(!this.lastElement){this.lastElement=h;if(h.is(CKEDITOR.dtd.$object))continue}var l=h.getName();if(!g){!d&&a[l]&&(d=h);if(b[l]){var m;if(m=!d){if(l=l=="div"){a:{l=
      -h.getChildren();m=0;for(var n=l.count();m-1}:typeof b=="function"?f=b:typeof b=="object"&&(f=
      -function(a){return a.getName()in b});var e=this.elements,d=e.length;c&&d--;if(a){e=Array.prototype.slice.call(e,0);e.reverse()}for(c=0;c=f){d=e.createText("");d.insertAfter(this)}else{b=e.createText("");b.insertAfter(d);b.remove()}return d},substring:function(b,
      -c){return typeof c!="number"?this.$.nodeValue.substr(b):this.$.nodeValue.substring(b,c)}});
      -(function(){function b(a,b,c){var d=a.serializable,g=b[c?"endContainer":"startContainer"],k=c?"endOffset":"startOffset",h=d?b.document.getById(a.startNode):a.startNode,a=d?b.document.getById(a.endNode):a.endNode;if(g.equals(h.getPrevious())){b.startOffset=b.startOffset-g.getLength()-a.getPrevious().getLength();g=a.getNext()}else if(g.equals(a.getPrevious())){b.startOffset=b.startOffset-g.getLength();g=a.getNext()}g.equals(h.getParent())&&b[k]++;g.equals(a.getParent())&&b[k]++;b[c?"endContainer":"startContainer"]=
      -g;return b}CKEDITOR.dom.rangeList=function(a){if(a instanceof CKEDITOR.dom.rangeList)return a;a?a instanceof CKEDITOR.dom.range&&(a=[a]):a=[];return CKEDITOR.tools.extend(a,c)};var c={createIterator:function(){var a=this,b=CKEDITOR.dom.walker.bookmark(),c=[],d;return{getNextRange:function(g){d=d==void 0?0:d+1;var k=a[d];if(k&&a.length>1){if(!d)for(var h=a.length-1;h>=0;h--)c.unshift(a[h].createBookmark(true));if(g)for(var l=0;a[d+l+1];){for(var m=k.document,g=0,h=m.getById(c[l].endNode),m=m.getById(c[l+
      -1].startNode);;){h=h.getNextSourceNode(false);if(m.equals(h))g=1;else if(b(h)||h.type==CKEDITOR.NODE_ELEMENT&&h.isBlockBoundary())continue;break}if(!g)break;l++}for(k.moveToBookmark(c.shift());l--;){h=a[++d];h.moveToBookmark(c.shift());k.setEnd(h.endContainer,h.endOffset)}}return k}}},createBookmarks:function(a){for(var c=[],e,d=0;db?-1:1}),e=0,f;e
    ',CKEDITOR.document);b.appendTo(CKEDITOR.document.getHead());try{CKEDITOR.env.hc=b.getComputedStyle("border-top-color")==b.getComputedStyle("border-right-color")}catch(c){CKEDITOR.env.hc=false}b.remove()}if(CKEDITOR.env.hc)CKEDITOR.env.cssClass=CKEDITOR.env.cssClass+" cke_hc";CKEDITOR.document.appendStyleText(".cke{visibility:hidden;}"); -CKEDITOR.status="loaded";CKEDITOR.fireOnce("loaded");if(b=CKEDITOR._.pending){delete CKEDITOR._.pending;for(var a=0;ac;c++){var f=a,h=c,d;d=parseInt(a[c],16);d=("0"+(0>e?0|d*(1+e):0|d+(255-d)*e).toString(16)).slice(-2);f[h]=d}return"#"+a.join("")}}(),c=function(){var b=new CKEDITOR.template("background:#{to};background-image:-webkit-gradient(linear,lefttop,leftbottom,from({from}),to({to}));background-image:-moz-linear-gradient(top,{from},{to});background-image:-webkit-linear-gradient(top,{from},{to});background-image:-o-linear-gradient(top,{from},{to});background-image:-ms-linear-gradient(top,{from},{to});background-image:linear-gradient(top,{from},{to});filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='{from}',endColorstr='{to}');");return function(c, -a){return b.output({from:c,to:a})}}(),f={editor:new CKEDITOR.template("{id}.cke_chrome [border-color:{defaultBorder};] {id} .cke_top [ {defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_bottom [{defaultGradient}border-top-color:{defaultBorder};] {id} .cke_resizer [border-right-color:{ckeResizer}] {id} .cke_dialog_title [{defaultGradient}border-bottom-color:{defaultBorder};] {id} .cke_dialog_footer [{defaultGradient}outline-color:{defaultBorder};border-top-color:{defaultBorder};] {id} .cke_dialog_tab [{lightGradient}border-color:{defaultBorder};] {id} .cke_dialog_tab:hover [{mediumGradient}] {id} .cke_dialog_contents [border-top-color:{defaultBorder};] {id} .cke_dialog_tab_selected, {id} .cke_dialog_tab_selected:hover [background:{dialogTabSelected};border-bottom-color:{dialogTabSelectedBorder};] {id} .cke_dialog_body [background:{dialogBody};border-color:{defaultBorder};] {id} .cke_toolgroup [{lightGradient}border-color:{defaultBorder};] {id} a.cke_button_off:hover, {id} a.cke_button_off:focus, {id} a.cke_button_off:active [{mediumGradient}] {id} .cke_button_on [{ckeButtonOn}] {id} .cke_toolbar_separator [background-color: {ckeToolbarSeparator};] {id} .cke_combo_button [border-color:{defaultBorder};{lightGradient}] {id} a.cke_combo_button:hover, {id} a.cke_combo_button:focus, {id} .cke_combo_on a.cke_combo_button [border-color:{defaultBorder};{mediumGradient}] {id} .cke_path_item [color:{elementsPathColor};] {id} a.cke_path_item:hover, {id} a.cke_path_item:focus, {id} a.cke_path_item:active [background-color:{elementsPathBg};] {id}.cke_panel [border-color:{defaultBorder};] "), -panel:new CKEDITOR.template(".cke_panel_grouptitle [{lightGradient}border-color:{defaultBorder};] .cke_menubutton_icon [background-color:{menubuttonIcon};] .cke_menubutton:hover .cke_menubutton_icon, .cke_menubutton:focus .cke_menubutton_icon, .cke_menubutton:active .cke_menubutton_icon [background-color:{menubuttonIconHover};] .cke_menuseparator [background-color:{menubuttonIcon};] a:hover.cke_colorbox, a:focus.cke_colorbox, a:active.cke_colorbox [border-color:{defaultBorder};] a:hover.cke_colorauto, a:hover.cke_colormore, a:focus.cke_colorauto, a:focus.cke_colormore, a:active.cke_colorauto, a:active.cke_colormore [background-color:{ckeColorauto};border-color:{defaultBorder};] ")}; -return function(g,e){var a=g.uiColor,a={id:"."+g.id,defaultBorder:b(a,-0.1),defaultGradient:c(b(a,0.9),a),lightGradient:c(b(a,1),b(a,0.7)),mediumGradient:c(b(a,0.8),b(a,0.5)),ckeButtonOn:c(b(a,0.6),b(a,0.7)),ckeResizer:b(a,-0.4),ckeToolbarSeparator:b(a,0.5),ckeColorauto:b(a,0.8),dialogBody:b(a,0.7),dialogTabSelected:c("#FFFFFF","#FFFFFF"),dialogTabSelectedBorder:"#FFF",elementsPathColor:b(a,-0.6),elementsPathBg:a,menubuttonIcon:b(a,0.5),menubuttonIconHover:b(a,0.3)};return f[e].output(a).replace(/\[/g, -"{").replace(/\]/g,"}")}}();CKEDITOR.plugins.add("dialogui",{onLoad:function(){var h=function(b){this._||(this._={});this._["default"]=this._.initValue=b["default"]||"";this._.required=b.required||!1;for(var a=[this._],d=1;darguments.length)){var c=h.call(this,a);c.labelId=CKEDITOR.tools.getNextId()+"_label";this._.children=[];CKEDITOR.ui.dialog.uiElement.call(this,b,a,d,"div",null,{role:"presentation"},function(){var f=[],d=a.required?" cke_required":"";"horizontal"!= -a.labelLayout?f.push('",'"):(d={type:"hbox",widths:a.widths,padding:0,children:[{type:"html",html:'
    +

    + +
    + +
    + + + +
    + 사이트 내 전체검색 +
    + + + + + +
    + + +
    + + + +
    + + + + +
    +
    + +
    + + +