Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1fe4684537 | ||
|
|
0803de998b | ||
|
|
273983c87c | ||
|
|
94cc7639a9 | ||
|
|
84009dc16c |
No files matched your search
@@ -8,5 +8,6 @@ $menu['menu300'] = array (
|
|||||||
array('300500', '1:1문의설정', ''.G5_ADMIN_URL.'/qa_config.php', 'qa'),
|
array('300500', '1:1문의설정', ''.G5_ADMIN_URL.'/qa_config.php', 'qa'),
|
||||||
array('300600', '내용관리', G5_ADMIN_URL.'/contentlist.php', 'scf_contents', 1),
|
array('300600', '내용관리', G5_ADMIN_URL.'/contentlist.php', 'scf_contents', 1),
|
||||||
array('300700', 'FAQ관리', G5_ADMIN_URL.'/faqmasterlist.php', 'scf_faq', 1),
|
array('300700', 'FAQ관리', G5_ADMIN_URL.'/faqmasterlist.php', 'scf_faq', 1),
|
||||||
|
array('300820', '글,댓글 현황', G5_ADMIN_URL.'/write_count.php', 'scf_write_count'),
|
||||||
);
|
);
|
||||||
?>
|
?>
|
||||||
@@ -6,7 +6,6 @@ $menu["menu900"] = array (
|
|||||||
array('900300', '문자 보내기', ''.G5_SMS5_ADMIN_URL.'/sms_write.php', 'sms_write'),
|
array('900300', '문자 보내기', ''.G5_SMS5_ADMIN_URL.'/sms_write.php', 'sms_write'),
|
||||||
array('900400', '전송내역-건별', ''.G5_SMS5_ADMIN_URL.'/history_list.php', 'sms_history' , 1),
|
array('900400', '전송내역-건별', ''.G5_SMS5_ADMIN_URL.'/history_list.php', 'sms_history' , 1),
|
||||||
array('900410', '전송내역-번호별', ''.G5_SMS5_ADMIN_URL.'/history_num.php', 'sms_history_num' , 1),
|
array('900410', '전송내역-번호별', ''.G5_SMS5_ADMIN_URL.'/history_num.php', 'sms_history_num' , 1),
|
||||||
array('900450', '전송내역-회원', ''.G5_SMS5_ADMIN_URL.'/history_member.php', 'sms_history_mb' , 1),
|
|
||||||
array('900500', '이모티콘 그룹', ''.G5_SMS5_ADMIN_URL.'/form_group.php' , 'emoticon_group'),
|
array('900500', '이모티콘 그룹', ''.G5_SMS5_ADMIN_URL.'/form_group.php' , 'emoticon_group'),
|
||||||
array('900600', '이모티콘 관리', ''.G5_SMS5_ADMIN_URL.'/form_list.php', 'emoticon_list'),
|
array('900600', '이모티콘 관리', ''.G5_SMS5_ADMIN_URL.'/form_list.php', 'emoticon_list'),
|
||||||
array('900700', '휴대폰번호 그룹', ''.G5_SMS5_ADMIN_URL.'/num_group.php' , 'hp_group', 1),
|
array('900700', '휴대폰번호 그룹', ''.G5_SMS5_ADMIN_URL.'/num_group.php' , 'hp_group', 1),
|
||||||
|
|||||||
@@ -12,16 +12,25 @@ if (!$bo_table) { alert('게시판 TABLE명은 반드시 입력하세요.'); }
|
|||||||
if (!preg_match("/^([A-Za-z0-9_]{1,20})$/", $bo_table)) { alert('게시판 TABLE명은 공백없이 영문자, 숫자, _ 만 사용 가능합니다. (20자 이내)'); }
|
if (!preg_match("/^([A-Za-z0-9_]{1,20})$/", $bo_table)) { alert('게시판 TABLE명은 공백없이 영문자, 숫자, _ 만 사용 가능합니다. (20자 이내)'); }
|
||||||
if (!$_POST['bo_subject']) { alert('게시판 제목을 입력하세요.'); }
|
if (!$_POST['bo_subject']) { alert('게시판 제목을 입력하세요.'); }
|
||||||
|
|
||||||
|
$_POST['bo_include_head'] = preg_replace("#[\\\]+$#", "", substr($_POST['bo_include_head'], 0, 255));
|
||||||
|
$_POST['bo_include_tail'] = preg_replace("#[\\\]+$#", "", substr($_POST['bo_include_tail'], 0, 255));
|
||||||
|
|
||||||
if ($file = $_POST['bo_include_head']) {
|
if ($file = $_POST['bo_include_head']) {
|
||||||
|
$purl = parse_url($file);
|
||||||
|
$file = $purl['path'];
|
||||||
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
|
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
|
||||||
alert('상단 파일 경로가 php, html 파일이 아닙니다.');
|
alert('상단 파일 경로가 php, html 파일이 아닙니다.');
|
||||||
}
|
}
|
||||||
|
$_POST['bo_include_head'] = $file;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($file = $_POST['bo_include_tail']) {
|
if ($file = $_POST['bo_include_tail']) {
|
||||||
|
$purl = parse_url($file);
|
||||||
|
$file = $purl['path'];
|
||||||
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
|
if (!preg_match("/\.(php|htm['l']?)$/i", $file)) {
|
||||||
alert('하단 파일 경로가 php, html 파일이 아닙니다.');
|
alert('하단 파일 경로가 php, html 파일이 아닙니다.');
|
||||||
}
|
}
|
||||||
|
$_POST['bo_include_tail'] = $file;
|
||||||
}
|
}
|
||||||
|
|
||||||
$board_path = G5_DATA_PATH.'/file/'.$bo_table;
|
$board_path = G5_DATA_PATH.'/file/'.$bo_table;
|
||||||
|
|||||||
+17
-8
@@ -180,6 +180,12 @@ if(!isset($config['cf_kakao_js_apikey'])) {
|
|||||||
ADD `cf_kakao_js_apikey` varchar(255) NOT NULL DEFAULT '' AFTER `cf_googl_shorturl_apikey` ", true);
|
ADD `cf_kakao_js_apikey` varchar(255) NOT NULL DEFAULT '' AFTER `cf_googl_shorturl_apikey` ", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SMS 전송유형 필드 추가
|
||||||
|
if(!isset($config['cf_sms_type'])) {
|
||||||
|
sql_query(" ALTER TABLE `{$g5['config_table']}`
|
||||||
|
ADD `cf_sms_type` varchar(10) NOT NULL DEFAULT '' AFTER `cf_sms_use` ", true);
|
||||||
|
}
|
||||||
|
|
||||||
if(!$config['cf_faq_skin']) $config['cf_faq_skin'] = "basic";
|
if(!$config['cf_faq_skin']) $config['cf_faq_skin'] = "basic";
|
||||||
if(!$config['cf_mobile_faq_skin']) $config['cf_mobile_faq_skin'] = "basic";
|
if(!$config['cf_mobile_faq_skin']) $config['cf_mobile_faq_skin'] = "basic";
|
||||||
|
|
||||||
@@ -209,7 +215,7 @@ $frm_submit = '<div class="btn_confirm01 btn_confirm">
|
|||||||
if (!$config['cf_icode_server_ip']) $config['cf_icode_server_ip'] = '211.172.232.124';
|
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_server_port']) $config['cf_icode_server_port'] = '7295';
|
||||||
|
|
||||||
if ($config['cf_icode_id'] && $config['cf_icode_pw']) {
|
if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw']) {
|
||||||
$userinfo = get_icode_userinfo($config['cf_icode_id'], $config['cf_icode_pw']);
|
$userinfo = get_icode_userinfo($config['cf_icode_id'], $config['cf_icode_pw']);
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
@@ -1034,6 +1040,16 @@ if ($config['cf_icode_id'] && $config['cf_icode_pw']) {
|
|||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row"><label for="cf_sms_type">SMS 전송유형</label></th>
|
||||||
|
<td>
|
||||||
|
<?php echo help("전송유형을 SMS로 선택하시면 최대 80바이트까지 전송하실 수 있으며<br>LMS로 선택하시면 90바이트 이하는 SMS로, 그 이상은 1500바이트까지 LMS로 전송됩니다.<br>요금은 건당 SMS는 16원, LMS는 48원입니다."); ?>
|
||||||
|
<select id="cf_sms_type" name="cf_sms_type">
|
||||||
|
<option value="" <?php echo get_selected($config['cf_sms_type'], ''); ?>>SMS</option>
|
||||||
|
<option value="LMS" <?php echo get_selected($config['cf_sms_type'], 'LMS'); ?>>LMS</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><label for="cf_icode_id">아이코드 회원아이디</label></th>
|
<th scope="row"><label for="cf_icode_id">아이코드 회원아이디</label></th>
|
||||||
<td>
|
<td>
|
||||||
@@ -1069,7 +1085,6 @@ if ($config['cf_icode_id'] && $config['cf_icode_pw']) {
|
|||||||
<tr>
|
<tr>
|
||||||
<th scope="row">아이코드 SMS 신청<br>회원가입</th>
|
<th scope="row">아이코드 SMS 신청<br>회원가입</th>
|
||||||
<td>
|
<td>
|
||||||
<?php echo help("아래 링크에서 회원가입 하시면 문자 건당 16원에 제공 받을 수 있습니다."); ?>
|
|
||||||
<a href="http://icodekorea.com/res/join_company_fix_a.php?sellid=sir2" target="_blank" class="btn_frmline">아이코드 회원가입</a>
|
<a href="http://icodekorea.com/res/join_company_fix_a.php?sellid=sir2" target="_blank" class="btn_frmline">아이코드 회원가입</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -1081,12 +1096,6 @@ if ($config['cf_icode_id'] && $config['cf_icode_pw']) {
|
|||||||
<a href="http://www.icodekorea.com/smsbiz/credit_card_amt.php?icode_id=<?php echo $config['cf_icode_id']; ?>&icode_passwd=<?php echo $config['cf_icode_pw']; ?>" target="_blank" class="btn_frmline" onclick="window.open(this.href,'icode_payment', 'scrollbars=1,resizable=1'); return false;">충전하기</a>
|
<a href="http://www.icodekorea.com/smsbiz/credit_card_amt.php?icode_id=<?php echo $config['cf_icode_id']; ?>&icode_passwd=<?php echo $config['cf_icode_pw']; ?>" target="_blank" class="btn_frmline" onclick="window.open(this.href,'icode_payment', 'scrollbars=1,resizable=1'); return false;">충전하기</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<th scope="row">건수별 금액</th>
|
|
||||||
<td colspan="3">
|
|
||||||
<?php echo number_format($userinfo['gpay']); ?> 원.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -124,6 +124,7 @@ $sql = " update {$g5['config_table']}
|
|||||||
cf_cert_limit = '{$_POST['cf_cert_limit']}',
|
cf_cert_limit = '{$_POST['cf_cert_limit']}',
|
||||||
cf_cert_req = '{$_POST['cf_cert_req']}',
|
cf_cert_req = '{$_POST['cf_cert_req']}',
|
||||||
cf_sms_use = '{$_POST['cf_sms_use']}',
|
cf_sms_use = '{$_POST['cf_sms_use']}',
|
||||||
|
cf_sms_type = '{$_POST['cf_sms_type']}',
|
||||||
cf_icode_id = '{$_POST['cf_icode_id']}',
|
cf_icode_id = '{$_POST['cf_icode_id']}',
|
||||||
cf_icode_pw = '{$_POST['cf_icode_pw']}',
|
cf_icode_pw = '{$_POST['cf_icode_pw']}',
|
||||||
cf_icode_server_ip = '{$_POST['cf_icode_server_ip']}',
|
cf_icode_server_ip = '{$_POST['cf_icode_server_ip']}',
|
||||||
|
|||||||
+1
-1
@@ -69,7 +69,7 @@ $result = sql_query($sql);
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<?php for ($i=0; $row=mysql_fetch_array($result); $i++) {
|
<?php for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||||
$bg = 'bg'.($i%2);
|
$bg = 'bg'.($i%2);
|
||||||
?>
|
?>
|
||||||
<tr class="<?php echo $bg; ?>">
|
<tr class="<?php echo $bg; ?>">
|
||||||
|
|||||||
+17
-1
@@ -747,4 +747,20 @@ strong.sodr_nonpay {display:block;padding:5px 0;text-align:right}
|
|||||||
#theme_detail table{border-collapse:collapse;margin:5px 0 10px}
|
#theme_detail table{border-collapse:collapse;margin:5px 0 10px}
|
||||||
#theme_detail table th{padding: 5px 0; border: 1px solid #d1dee2; background: #e5ecef;width:50px;padding:10px;text-align:left}
|
#theme_detail table th{padding: 5px 0; border: 1px solid #d1dee2; background: #e5ecef;width:50px;padding:10px;text-align:left}
|
||||||
#theme_detail table td{ border: 1px solid #ececec;padding:10px}
|
#theme_detail table td{ border: 1px solid #ececec;padding:10px}
|
||||||
.no_theme{text-align:center;padding:100px 0;color:#555}
|
.no_theme{text-align:center;padding:100px 0;color:#555}
|
||||||
|
|
||||||
|
/*글,댓글현황*/
|
||||||
|
#wr_cont{position:relative;margin:10px 20px}
|
||||||
|
#wr_cont input[type="submit"]{background:#ff3061;border:none;color:#fff;padding: 0 5px;height: 24px;}
|
||||||
|
#wr_cont select{height: 24px;}
|
||||||
|
#grp_color{border:2px solid #ddd;position:absolute;top:0;right:0;list-style:none;padding: 5px 5px; margin:0;}
|
||||||
|
#grp_color li{padding:5px 10px;}
|
||||||
|
#grp_color li span{width:10px;height:10px; display:inline-block;background:rgb(75, 178, 197);margin-right:5px;}
|
||||||
|
#grp_color li.color2 span{background:rgb(234, 162, 40);}
|
||||||
|
#chart_wr h5{text-align:center;border:1px solid #eee;padding:30px 0}
|
||||||
|
#chart_wr{margin:20px }
|
||||||
|
|
||||||
|
/*전송실패 문자 재전송 내역*/
|
||||||
|
.sms_table{padding:0 20px 40px;}
|
||||||
|
.sms_table table th{border:1px solid #ddd;padding:9px 0}
|
||||||
|
.sms_table table td{border:1px solid #ddd;text-align:center;width:16%;padding:9px 0}
|
||||||
@@ -21,7 +21,7 @@ if ($w == "")
|
|||||||
$sql_common ";
|
$sql_common ";
|
||||||
sql_query($sql);
|
sql_query($sql);
|
||||||
|
|
||||||
$fa_id = mysql_insert_id();
|
$fa_id = sql_insert_id();
|
||||||
}
|
}
|
||||||
else if ($w == "u")
|
else if ($w == "u")
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ if ($w == "")
|
|||||||
$sql = " insert {$g5['faq_master_table']} $sql_common ";
|
$sql = " insert {$g5['faq_master_table']} $sql_common ";
|
||||||
sql_query($sql);
|
sql_query($sql);
|
||||||
|
|
||||||
$fm_id = mysql_insert_id();
|
$fm_id = sql_insert_id();
|
||||||
}
|
}
|
||||||
else if ($w == "u")
|
else if ($w == "u")
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ $result = sql_query($sql);
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<?php for ($i=0; $row=mysql_fetch_array($result); $i++) {
|
<?php for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||||
$sql1 = " select COUNT(*) as cnt from {$g5['faq_table']} where fm_id = '{$row['fm_id']}' ";
|
$sql1 = " select COUNT(*) as cnt from {$g5['faq_table']} where fm_id = '{$row['fm_id']}' ";
|
||||||
$row1 = sql_fetch($sql1);
|
$row1 = sql_fetch($sql1);
|
||||||
$cnt = $row1['cnt'];
|
$cnt = $row1['cnt'];
|
||||||
|
|||||||
+1
-1
@@ -91,7 +91,7 @@ $colspan = 12;
|
|||||||
$leave_date = $row['mb_leave_date'] ? $row['mb_leave_date'] : date("Ymd", G5_SERVER_TIME);
|
$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);
|
$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_nick = get_sideview($row['mb_id'], get_text($row['mb_nick']), $row['mb_email'], $row['mb_homepage']);
|
||||||
|
|
||||||
$mb_id = $row['mb_id'];
|
$mb_id = $row['mb_id'];
|
||||||
if ($row['mb_leave_date'])
|
if ($row['mb_leave_date'])
|
||||||
|
|||||||
+1
-1
@@ -51,7 +51,7 @@ $colspan = 7;
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<?php
|
<?php
|
||||||
for ($i=0; $row=mysql_fetch_array($result); $i++) {
|
for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||||
$s_vie = '<a href="./mail_preview.php?ma_id='.$row['ma_id'].'" target="_blank">미리보기</a>';
|
$s_vie = '<a href="./mail_preview.php?ma_id='.$row['ma_id'].'" target="_blank">미리보기</a>';
|
||||||
|
|
||||||
$num = number_format($total_count - ($page - 1) * $config['cf_page_rows'] - $i);
|
$num = number_format($total_count - ($page - 1) * $config['cf_page_rows'] - $i);
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ else if ($w == 'u')
|
|||||||
$required_mb_password = '';
|
$required_mb_password = '';
|
||||||
$html_title = '수정';
|
$html_title = '수정';
|
||||||
|
|
||||||
|
$mb['mb_name'] = get_text($mb['mb_name']);
|
||||||
|
$mb['mb_nick'] = get_text($mb['mb_nick']);
|
||||||
$mb['mb_email'] = get_text($mb['mb_email']);
|
$mb['mb_email'] = get_text($mb['mb_email']);
|
||||||
$mb['mb_homepage'] = get_text($mb['mb_homepage']);
|
$mb['mb_homepage'] = get_text($mb['mb_homepage']);
|
||||||
$mb['mb_birth'] = get_text($mb['mb_birth']);
|
$mb['mb_birth'] = get_text($mb['mb_birth']);
|
||||||
@@ -38,6 +40,7 @@ else if ($w == 'u')
|
|||||||
$mb['mb_hp'] = get_text($mb['mb_hp']);
|
$mb['mb_hp'] = get_text($mb['mb_hp']);
|
||||||
$mb['mb_addr1'] = get_text($mb['mb_addr1']);
|
$mb['mb_addr1'] = get_text($mb['mb_addr1']);
|
||||||
$mb['mb_addr2'] = get_text($mb['mb_addr2']);
|
$mb['mb_addr2'] = get_text($mb['mb_addr2']);
|
||||||
|
$mb['mb_addr3'] = get_text($mb['mb_addr3']);
|
||||||
$mb['mb_signature'] = get_text($mb['mb_signature']);
|
$mb['mb_signature'] = get_text($mb['mb_signature']);
|
||||||
$mb['mb_recommend'] = get_text($mb['mb_recommend']);
|
$mb['mb_recommend'] = get_text($mb['mb_recommend']);
|
||||||
$mb['mb_profile'] = get_text($mb['mb_profile']);
|
$mb['mb_profile'] = get_text($mb['mb_profile']);
|
||||||
|
|||||||
+2
-2
@@ -166,7 +166,7 @@ $colspan = 16;
|
|||||||
$leave_date = $row['mb_leave_date'] ? $row['mb_leave_date'] : date('Ymd', G5_SERVER_TIME);
|
$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);
|
$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_nick = get_sideview($row['mb_id'], get_text($row['mb_nick']), $row['mb_email'], $row['mb_homepage']);
|
||||||
|
|
||||||
$mb_id = $row['mb_id'];
|
$mb_id = $row['mb_id'];
|
||||||
$leave_msg = '';
|
$leave_msg = '';
|
||||||
@@ -211,7 +211,7 @@ $colspan = 16;
|
|||||||
<tr class="<?php echo $bg; ?>">
|
<tr class="<?php echo $bg; ?>">
|
||||||
<td headers="mb_list_chk" class="td_chk" rowspan="2">
|
<td headers="mb_list_chk" class="td_chk" rowspan="2">
|
||||||
<input type="hidden" name="mb_id[<?php echo $i ?>]" value="<?php echo $row['mb_id'] ?>" id="mb_id_<?php echo $i ?>">
|
<input type="hidden" name="mb_id[<?php echo $i ?>]" value="<?php echo $row['mb_id'] ?>" id="mb_id_<?php echo $i ?>">
|
||||||
<label for="chk_<?php echo $i; ?>" class="sound_only"><?php echo get_text($row['mb_name']); ?> <?php echo $row['mb_nick']; ?>님</label>
|
<label for="chk_<?php echo $i; ?>" class="sound_only"><?php echo get_text($row['mb_name']); ?> <?php echo get_text($row['mb_nick']); ?>님</label>
|
||||||
<input type="checkbox" name="chk[]" value="<?php echo $i ?>" id="chk_<?php echo $i ?>">
|
<input type="checkbox" name="chk[]" value="<?php echo $i ?>" id="chk_<?php echo $i ?>">
|
||||||
</td>
|
</td>
|
||||||
<td headers="mb_list_id" rowspan="2" class="td_name sv_use"><?php echo $mb_id ?></td>
|
<td headers="mb_list_id" rowspan="2" class="td_name sv_use"><?php echo $mb_id ?></td>
|
||||||
|
|||||||
+1
-1
@@ -73,7 +73,7 @@ $colspan = 7;
|
|||||||
}
|
}
|
||||||
|
|
||||||
$search = array('"', "'");
|
$search = array('"', "'");
|
||||||
$replace = array('"', ''');
|
$replace = array('"', ''');
|
||||||
$me_name = str_replace($search, $replace, $row['me_name']);
|
$me_name = str_replace($search, $replace, $row['me_name']);
|
||||||
?>
|
?>
|
||||||
<tr class="<?php echo $bg; ?> menu_list menu_group_<?php echo substr($row['me_code'], 0, 2); ?>">
|
<tr class="<?php echo $bg; ?> menu_list menu_group_<?php echo substr($row['me_code'], 0, 2); ?>">
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ if($w == "")
|
|||||||
$sql = " insert {$g5['new_win_table']} set $sql_common ";
|
$sql = " insert {$g5['new_win_table']} set $sql_common ";
|
||||||
sql_query($sql);
|
sql_query($sql);
|
||||||
|
|
||||||
$nw_id = mysql_insert_id();
|
$nw_id = sql_insert_id();
|
||||||
}
|
}
|
||||||
else if ($w == "u")
|
else if ($w == "u")
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -70,7 +70,7 @@ $result = sql_query($sql);
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<?php
|
<?php
|
||||||
for ($i=0; $row=mysql_fetch_array($result); $i++) {
|
for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||||
$bg = 'bg'.($i%2);
|
$bg = 'bg'.($i%2);
|
||||||
|
|
||||||
switch($row['nw_device']) {
|
switch($row['nw_device']) {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ if ($w == '')
|
|||||||
values ( '{$_POST['po_subject']}', '{$_POST['po_poll1']}', '{$_POST['po_poll2']}', '{$_POST['po_poll3']}', '{$_POST['po_poll4']}', '{$_POST['po_poll5']}', '{$_POST['po_poll6']}', '{$_POST['po_poll7']}', '{$_POST['po_poll8']}', '{$_POST['po_poll9']}', '{$_POST['po_cnt1']}', '{$_POST['po_cnt2']}', '{$_POST['po_cnt3']}', '{$_POST['po_cnt4']}', '{$_POST['po_cnt5']}', '{$_POST['po_cnt6']}', '{$_POST['po_cnt7']}', '{$_POST['po_cnt8']}', '{$_POST['po_cnt9']}', '{$_POST['po_etc']}', '{$_POST['po_level']}', '{$_POST['po_point']}', '".G5_TIME_YMD."' ) ";
|
values ( '{$_POST['po_subject']}', '{$_POST['po_poll1']}', '{$_POST['po_poll2']}', '{$_POST['po_poll3']}', '{$_POST['po_poll4']}', '{$_POST['po_poll5']}', '{$_POST['po_poll6']}', '{$_POST['po_poll7']}', '{$_POST['po_poll8']}', '{$_POST['po_poll9']}', '{$_POST['po_cnt1']}', '{$_POST['po_cnt2']}', '{$_POST['po_cnt3']}', '{$_POST['po_cnt4']}', '{$_POST['po_cnt5']}', '{$_POST['po_cnt6']}', '{$_POST['po_cnt7']}', '{$_POST['po_cnt8']}', '{$_POST['po_cnt9']}', '{$_POST['po_etc']}', '{$_POST['po_level']}', '{$_POST['po_point']}', '".G5_TIME_YMD."' ) ";
|
||||||
sql_query($sql);
|
sql_query($sql);
|
||||||
|
|
||||||
$po_id = mysql_insert_id();
|
$po_id = sql_insert_id();
|
||||||
}
|
}
|
||||||
else if ($w == 'u')
|
else if ($w == 'u')
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ $sql_order = " order by cnt desc ";
|
|||||||
|
|
||||||
$sql = " select pp_word {$sql_common} {$sql_search} {$sql_group} ";
|
$sql = " select pp_word {$sql_common} {$sql_search} {$sql_group} ";
|
||||||
$result = sql_query($sql);
|
$result = sql_query($sql);
|
||||||
$total_count = mysql_num_rows($result);
|
$total_count = sql_num_rows($result);
|
||||||
|
|
||||||
$rows = $config['cf_page_rows'];
|
$rows = $config['cf_page_rows'];
|
||||||
$total_page = ceil($total_count / $rows); // 전체 페이지 계산
|
$total_page = ceil($total_count / $rows); // 전체 페이지 계산
|
||||||
|
|||||||
@@ -2,9 +2,10 @@
|
|||||||
define('G5_IS_ADMIN', true);
|
define('G5_IS_ADMIN', true);
|
||||||
include_once ('../../common.php');
|
include_once ('../../common.php');
|
||||||
include_once(G5_ADMIN_PATH.'/admin.lib.php');
|
include_once(G5_ADMIN_PATH.'/admin.lib.php');
|
||||||
|
include_once(G5_SMS5_PATH.'/sms5.lib.php');
|
||||||
|
|
||||||
if (!strstr($_SERVER['SCRIPT_NAME'], 'install.php')) {
|
if (!strstr($_SERVER['SCRIPT_NAME'], 'install.php')) {
|
||||||
if(!mysql_num_rows(mysql_query(" show tables like '{$g5['sms5_config_table']}' ")))
|
if(!sql_num_rows(sql_query(" show tables like '{$g5['sms5_config_table']}' ")))
|
||||||
goto_url('install.php');
|
goto_url('install.php');
|
||||||
|
|
||||||
// SMS 설정값 배열변수
|
// SMS 설정값 배열변수
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ $g5['title'] = "SMS 기본설정";
|
|||||||
if (!$config['cf_icode_server_ip']) $config['cf_icode_server_ip'] = '211.172.232.124';
|
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_server_port']) $config['cf_icode_server_port'] = '7295';
|
||||||
|
|
||||||
if ($config['cf_icode_id'] && $config['cf_icode_pw'])
|
if ($config['cf_sms_use'] && $config['cf_icode_id'] && $config['cf_icode_pw'])
|
||||||
{
|
{
|
||||||
$userinfo = get_icode_userinfo($config['cf_icode_id'], $config['cf_icode_pw']);
|
$userinfo = get_icode_userinfo($config['cf_icode_id'], $config['cf_icode_pw']);
|
||||||
}
|
}
|
||||||
@@ -86,57 +86,14 @@ if ($config['cf_sms_use'] == 'icode') { // 아이코드 사용
|
|||||||
<input type="button" value="충전하기" class="btn_frmline" onclick="window.open('http://icodekorea.com/company/credit_card_input.php?icode_id=<?php echo $config['cf_icode_id']?>&icode_passwd=<?php echo $config['cf_icode_pw']?>','icode_payment','width=650,height=500')">
|
<input type="button" value="충전하기" class="btn_frmline" onclick="window.open('http://icodekorea.com/company/credit_card_input.php?icode_id=<?php echo $config['cf_icode_id']?>&icode_passwd=<?php echo $config['cf_icode_pw']?>','icode_payment','width=650,height=500')">
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<th scope="row">건별 금액</th>
|
|
||||||
<td><?php echo number_format($userinfo['gpay'])?> 원</td>
|
|
||||||
</tr>
|
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><label for="cf_phone">회신번호<strong class="sound_only"> 필수</strong></label></th>
|
<th scope="row"><label for="cf_phone">회신번호<strong class="sound_only"> 필수</strong></label></th>
|
||||||
<td>
|
<td>
|
||||||
<?php echo help("회신받을 휴대폰 번호를 입력하세요. '-' 를 꼭 입력하세요.<br>예) 010-123-4567"); ?>
|
<?php echo help("회신받을 휴대폰 번호를 입력하세요. 회신번호는 발신번호로 사전등록된 번호와 동일해야 합니다.<br>예) 010-123-4567"); ?>
|
||||||
<input type="text" name="cf_phone" value="<?php echo $sms5['cf_phone']; ?>" id="cf_phone" required class="frm_input required" size="12">
|
<input type="text" name="cf_phone" value="<?php echo $sms5['cf_phone']; ?>" id="cf_phone" required class="frm_input required" size="12">
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<th scope="row"><label for="cf_member">회원간 문자전송</label></th>
|
|
||||||
<td>
|
|
||||||
<?php echo help("허용에 체크하면 회원끼리 문자전송이 가능합니다.");?>
|
|
||||||
<input type="checkbox" name="cf_member" value="1" id="cf_member" <?php echo get_checked(1, $sms5['cf_member']); ?>> <label for="cf_member">허용</label>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"><label for="cf_level">문자전송가능 레벨</label></th>
|
|
||||||
<td>
|
|
||||||
<?php echo help("문자전송을 허용할 회원레벨을 선택해주세요.");?>
|
|
||||||
<select name="cf_level" id="cf_level">
|
|
||||||
<?php for ($i=1; $i<=10; $i++) { ?>
|
|
||||||
<option value="<?php echo $i?>"<?php echo get_selected($i, $sms5['cf_level']);?>> <?php echo $i?> </option>
|
|
||||||
<?php } ?>
|
|
||||||
</select>
|
|
||||||
레벨 이상
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"><label for="cf_point">문자전송 차감 포인트<strong class="sound_only"> 필수</strong></label></th>
|
|
||||||
<td>
|
|
||||||
<?php echo help("회원이 문자를 전송할시에 차감할 포인트를 입력해주세요. 0이면 포인트를 차감하지 않습니다.");?>
|
|
||||||
<input type="text" name="cf_point" value="<?php echo $sms5['cf_point']; ?>" id="cf_point" required class="frm_input required" size="5">
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"><label for="cf_day_count">문자전송 하루제한 갯수<strong class="sound_only"> 필수</strong></label></th>
|
|
||||||
<td>
|
|
||||||
<?php echo help("회원이 하루에 보낼수 있는 문자 갯수를 입력해주세요. 0이면 제한하지 않습니다.");?>
|
|
||||||
<input type="text" name="cf_day_count" value="<?php echo $sms5['cf_day_count']; ?>" id="cf_day_count" required class="frm_input required" size="5">
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row"><label for="cf_skin">스킨 디렉토리<strong class="sound_only">필수</strong></label></th>
|
|
||||||
<td>
|
|
||||||
<?php echo get_sms5_skin_select('skin', 'cf_skin', 'cf_skin', $sms5['cf_skin'], 'required'); ?>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -8,16 +8,15 @@ check_demo();
|
|||||||
|
|
||||||
$g5['title'] = "SMS 기본설정";
|
$g5['title'] = "SMS 기본설정";
|
||||||
|
|
||||||
|
// 회신번호 체크
|
||||||
|
if(!check_vaild_callback($cf_phone))
|
||||||
|
alert('회신번호가 올바르지 않습니다.');
|
||||||
|
|
||||||
$userinfo = get_icode_userinfo($cf_icode_id, $cf_icode_pw);
|
$userinfo = get_icode_userinfo($cf_icode_id, $cf_icode_pw);
|
||||||
|
|
||||||
if ($userinfo['code'] == '202')
|
if ($userinfo['code'] == '202')
|
||||||
alert('아이코드 아이디와 패스워드가 맞지 않습니다.');
|
alert('아이코드 아이디와 패스워드가 맞지 않습니다.');
|
||||||
|
|
||||||
if ($cf_member == '1')
|
|
||||||
$cf_member = 1;
|
|
||||||
else
|
|
||||||
$cf_member = 0;
|
|
||||||
|
|
||||||
$res = sql_fetch("select * from ".$g5['sms5_config_table']." limit 1");
|
$res = sql_fetch("select * from ".$g5['sms5_config_table']." limit 1");
|
||||||
|
|
||||||
if (!$res)
|
if (!$res)
|
||||||
@@ -25,7 +24,7 @@ if (!$res)
|
|||||||
else
|
else
|
||||||
$sql = "update ";
|
$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 .= $g5['sms5_config_table']." set cf_phone='$cf_phone' ";
|
||||||
|
|
||||||
sql_query($sql);
|
sql_query($sql);
|
||||||
|
|
||||||
|
|||||||
@@ -1,90 +0,0 @@
|
|||||||
<?php
|
|
||||||
$sub_menu = "900410";
|
|
||||||
include_once("./_common.php");
|
|
||||||
|
|
||||||
$page_size = 20;
|
|
||||||
$colspan = 7;
|
|
||||||
|
|
||||||
auth_check($auth[$sub_menu], "r");
|
|
||||||
|
|
||||||
$g5['title'] = "문자전송 내역 (회원)";
|
|
||||||
|
|
||||||
if ($page < 1) $page = 1;
|
|
||||||
|
|
||||||
if ($st && trim($sv))
|
|
||||||
$sql_search = " and $st like '%$sv%' ";
|
|
||||||
else
|
|
||||||
$sql_search = "";
|
|
||||||
|
|
||||||
$total_res = sql_fetch("select count(*) as cnt from {$g5['sms5_member_history_table']} where 1 $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);
|
|
||||||
|
|
||||||
include_once(G5_ADMIN_PATH.'/admin.head.php');
|
|
||||||
?>
|
|
||||||
|
|
||||||
<form name="search_form" method="get" action="<?php echo $_SEVER['SCRIPT_NAME']?>" class="local_sch01 local_sch">
|
|
||||||
<label for="st" class="sound_only">검색대상</label>
|
|
||||||
<select name="st" id="st">
|
|
||||||
<option value="mb_id"<?php echo get_selected('mh_name', $st); ?>>아이디</option>
|
|
||||||
<option value="mh_hp"<?php echo get_selected('mh_hp', $st); ?>>받는번호</option>
|
|
||||||
<option value="mh_reply"<?php echo get_selected('mh_reply', $st); ?>>보내는번호</option>
|
|
||||||
</select>
|
|
||||||
<label for="sv" class="sound_only">검색어<strong class="sound_only"> 필수</strong></label>
|
|
||||||
<input type="text" name="sv" value="<?php echo $sv ?>" id="sv" required class="required frm_input">
|
|
||||||
<input type="submit" value="검색" class="btn_submit">
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<div class="tbl_head01 tbl_wrap">
|
|
||||||
<table>
|
|
||||||
<caption><?php echo $g5['title']; ?> 목록</caption>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th scope="col">번호</th>
|
|
||||||
<th scope="col">회원</th>
|
|
||||||
<th scope="col">보내는번호</th>
|
|
||||||
<th scope="col">받는번호</th>
|
|
||||||
<th scope="col">전송일시</th>
|
|
||||||
<th scope="col">예약</th>
|
|
||||||
<th scope="col">Log</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<?php if (!$total_count) { ?>
|
|
||||||
<tr>
|
|
||||||
<td colspan="<?php echo $colspan?>" class="empty_table" >
|
|
||||||
데이터가 없습니다.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
$qry = sql_query("select * from {$g5['sms5_member_history_table']} where 1 $sql_search order by mh_no desc limit $page_start, $page_size");
|
|
||||||
while($row = sql_fetch_array($qry)) {
|
|
||||||
$bg = 'bg'.($line++%2);
|
|
||||||
|
|
||||||
$mb = get_member($row['mb_id']);
|
|
||||||
$mb_id = get_sideview($row['mb_id'], $mb['mb_nick']);
|
|
||||||
?>
|
|
||||||
<tr class="<?php echo $bg; ?>">
|
|
||||||
<td class="td_num"><?php echo $vnum--?></td>
|
|
||||||
<td class="td_mbid"><?php echo $mb_id?></td>
|
|
||||||
<td class="td_numbig"><?php echo $row['mh_reply']?></td>
|
|
||||||
<td class="td_numbig"><?php echo $row['mh_hp']?></td>
|
|
||||||
<td class="td_datetime"><?php echo $row['mh_datetime']?></td>
|
|
||||||
<td class="td_boolean"><?php echo $row['mh_booking']!='0000-00-00 00:00:00'?"<span title='{$row['mh_booking']}'>예약</span>":'';?></td>
|
|
||||||
<td><?php echo $row['mh_log']?></td>
|
|
||||||
</tr>
|
|
||||||
<?php } ?>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<?php echo get_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $page, $total_page, $_SERVER['SCRIPT_NAME']."?st=$st&sv=$sv&page="); ?>
|
|
||||||
|
|
||||||
<?php
|
|
||||||
include_once(G5_ADMIN_PATH.'/admin.tail.php');
|
|
||||||
?>
|
|
||||||
+151
-58
@@ -39,7 +39,8 @@ if (!$res['cnt']) {
|
|||||||
$sql = sql_query("select * from {$g5['sms5_history_table']} where wr_no='$wr_no' $sql_renum $sql_flag");
|
$sql = sql_query("select * from {$g5['sms5_history_table']} where wr_no='$wr_no' $sql_renum $sql_flag");
|
||||||
while ($res = sql_fetch_array($sql))
|
while ($res = sql_fetch_array($sql))
|
||||||
{
|
{
|
||||||
$res['bk_hp'] = get_hp($res['bk_hp'], 0);
|
$res['bk_hp'] = get_hp($res['hs_hp'], 0);
|
||||||
|
$res['bk_name'] = $res['hs_name'];
|
||||||
|
|
||||||
if ($g5['sms5_demo'])
|
if ($g5['sms5_demo'])
|
||||||
$res['bk_hp'] = '0100000000';
|
$res['bk_hp'] = '0100000000';
|
||||||
@@ -48,6 +49,7 @@ while ($res = sql_fetch_array($sql))
|
|||||||
}
|
}
|
||||||
|
|
||||||
$wr_total = count($list);
|
$wr_total = count($list);
|
||||||
|
$reply = str_replace('-', '', trim($write['wr_reply']));
|
||||||
|
|
||||||
if ($config['cf_sms_use'] != 'icode') {
|
if ($config['cf_sms_use'] != 'icode') {
|
||||||
alert('기본환경설정에서 icode sms 사용이 비활성화 되어 있습니다.');
|
alert('기본환경설정에서 icode sms 사용이 비활성화 되어 있습니다.');
|
||||||
@@ -55,79 +57,170 @@ if ($config['cf_sms_use'] != 'icode') {
|
|||||||
include_once(G5_ADMIN_PATH.'/admin.head.php');
|
include_once(G5_ADMIN_PATH.'/admin.head.php');
|
||||||
|
|
||||||
$SMS = new SMS5;
|
$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($write['wr_reply']));
|
if($config['cf_sms_type'] == 'LMS') {
|
||||||
|
$port_setting = get_icode_port_type($config['cf_icode_id'], $config['cf_icode_pw']);
|
||||||
|
|
||||||
$result = $SMS->Add($list, $reply, '', '', $write['wr_message'], '', $wr_total);
|
if($port_setting !== false) {
|
||||||
|
$SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting);
|
||||||
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='".addslashes($write['wr_reply'])."', wr_message='".addslashes($write['wr_message'])."', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'");
|
|
||||||
|
|
||||||
$wr_success = 0;
|
$wr_success = 0;
|
||||||
$wr_failure = 0;
|
$wr_failure = 0;
|
||||||
$count = 0;
|
$count = 0;
|
||||||
|
|
||||||
foreach ($SMS->Result as $result)
|
for($i=0; $i<$wr_total; $i++) {
|
||||||
{
|
$strDest = array();
|
||||||
list($phone, $code) = explode(":", $result);
|
$strDest[] = $list[$i]['bk_hp'];
|
||||||
|
$strCallBack = $reply;
|
||||||
|
$strCaller = $config['cf_title'];
|
||||||
|
$strSubject = '';
|
||||||
|
$strURL = '';
|
||||||
|
$strData = $write['wr_message'];
|
||||||
|
if( !empty($list[$i]['bk_name']) ){
|
||||||
|
$strData = str_replace("{이름}", $list[$i]['bk_name'], $strData);
|
||||||
|
}
|
||||||
|
$strDate = $booking;
|
||||||
|
$nCount = 1;
|
||||||
|
|
||||||
if (substr($code,0,5) == "Error")
|
$result = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount);
|
||||||
{
|
|
||||||
$hs_code = substr($code,6,2);
|
|
||||||
|
|
||||||
switch ($hs_code) {
|
if($result) {
|
||||||
case '02': // "02:형식오류"
|
$result = $SMS->Send();
|
||||||
$hs_memo = "형식이 잘못되어 전송이 실패하였습니다.";
|
|
||||||
break;
|
if ($result) //SMS 서버에 접속했습니다.
|
||||||
case '23': // "23:인증실패,데이터오류,전송날짜오류"
|
{
|
||||||
$hs_memo = "데이터를 다시 확인해 주시기바랍니다.";
|
foreach ($SMS->Result as $result)
|
||||||
break;
|
{
|
||||||
case '97': // "97:잔여코인부족"
|
list($phone, $code) = explode(":", $result);
|
||||||
$hs_memo = "잔여코인이 부족합니다.";
|
|
||||||
break;
|
if (substr($code,0,5) == "Error")
|
||||||
case '98': // "98:사용기간만료"
|
{
|
||||||
$hs_memo = "사용기간이 만료되었습니다.";
|
$hs_code = substr($code,6,2);
|
||||||
break;
|
|
||||||
case '99': // "99:인증실패"
|
switch ($hs_code) {
|
||||||
$hs_memo = "인증 받지 못하였습니다. 계정을 다시 확인해 주세요.";
|
case '02': // "02:형식오류"
|
||||||
break;
|
$hs_memo = "형식이 잘못되어 전송이 실패하였습니다.";
|
||||||
default: // "미 확인 오류"
|
break;
|
||||||
$hs_memo = "알 수 없는 오류로 전송이 실패하었습니다.";
|
case '23': // "23:인증실패,데이터오류,전송날짜오류"
|
||||||
break;
|
$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 = $list[$i];
|
||||||
|
$row['bk_hp'] = get_hp($row['bk_hp'], 1);
|
||||||
|
|
||||||
|
$log = array_shift($SMS->Log);
|
||||||
|
$log = @iconv('euc-kr', 'utf-8', $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='".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)."'", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
$SMS->Init(); // 보관하고 있던 결과값을 지웁니다.
|
||||||
}
|
}
|
||||||
$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);
|
|
||||||
$log = @iconv('euc-kr', 'utf-8', $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)."'", false);
|
|
||||||
}
|
}
|
||||||
$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("insert into {$g5['sms5_write_table']} set wr_no='$wr_no', wr_renum='$new_wr_renum', wr_reply='".addslashes($write['wr_reply'])."', wr_message='".addslashes($write['wr_message'])."', wr_success='$wr_success', wr_failure='$wr_failure', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'");
|
||||||
|
|
||||||
sql_query("update {$g5['sms5_write_table']} set wr_re_total=wr_re_total+1 where wr_no='$wr_no' and wr_renum=0");
|
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 {
|
||||||
|
$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($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='".addslashes($write['wr_reply'])."', wr_message='".addslashes($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);
|
||||||
|
$log = @iconv('euc-kr', 'utf-8', $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)."'", false);
|
||||||
|
}
|
||||||
|
$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 데이터 입력도중 에러가 발생하였습니다.");
|
||||||
}
|
}
|
||||||
else alert("에러: SMS 데이터 입력도중 에러가 발생하였습니다.");
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ function all_send()
|
|||||||
|
|
||||||
<?php if ($write['wr_re_total'] && !$wr_renum) { ?>
|
<?php if ($write['wr_re_total'] && !$wr_renum) { ?>
|
||||||
<h2>전송실패 문자 재전송 내역</h2>
|
<h2>전송실패 문자 재전송 내역</h2>
|
||||||
|
<div class="sms_table">
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -138,6 +139,7 @@ function all_send()
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
if( $write['wr_memo'] ){
|
if( $write['wr_memo'] ){
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ eval("\$file = \"$file\";");
|
|||||||
$f = explode(";", $file);
|
$f = explode(";", $file);
|
||||||
for ($i=0; $i<count($f); $i++) {
|
for ($i=0; $i<count($f); $i++) {
|
||||||
if (trim($f[$i]) == "") continue;
|
if (trim($f[$i]) == "") continue;
|
||||||
mysql_query($f[$i]) or die(mysql_error());
|
sql_query($f[$i]) or die(mysqli_error());
|
||||||
}
|
}
|
||||||
// 테이블 생성 ------------------------------------
|
// 테이블 생성 ------------------------------------
|
||||||
|
|
||||||
@@ -68,7 +68,7 @@ $download_point = -20;
|
|||||||
//-------------------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------------------
|
||||||
// config 테이블 설정
|
// config 테이블 설정
|
||||||
$sql = " insert into {$g5['sms5_book_group_table']} set bg_name='미분류'";
|
$sql = " insert into {$g5['sms5_book_group_table']} set bg_name='미분류'";
|
||||||
mysql_query($sql) or die(mysql_error() . "<p>" . $sql);
|
sql_query($sql) or die(mysqli_error() . "<p>" . $sql);
|
||||||
|
|
||||||
echo "<script>document.getElementById('sms5_job_02').innerHTML='DB설정 완료';</script>";
|
echo "<script>document.getElementById('sms5_job_02').innerHTML='DB설정 완료';</script>";
|
||||||
flush(); usleep(50000);
|
flush(); usleep(50000);
|
||||||
|
|||||||
+1
-28
@@ -65,12 +65,7 @@ DROP TABLE IF EXISTS `{$g5['sms5_config_table']}`;
|
|||||||
|
|
||||||
CREATE TABLE `{$g5['sms5_config_table']}` (
|
CREATE TABLE `{$g5['sms5_config_table']}` (
|
||||||
`cf_phone` varchar(255) NOT NULL default '',
|
`cf_phone` varchar(255) NOT NULL default '',
|
||||||
`cf_datetime` datetime NOT NULL default '0000-00-00 00:00:00',
|
`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;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
|
||||||
@@ -164,25 +159,3 @@ CREATE TABLE `{$g5['sms5_write_table']}` (
|
|||||||
`wr_memo` text NOT NULL,
|
`wr_memo` text NOT NULL,
|
||||||
KEY `wr_no` (`wr_no`,`wr_renum`)
|
KEY `wr_no` (`wr_no`,`wr_renum`)
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
) 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;
|
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ if ($config['cf_sms_use'] == 'icode') { // 아이코드 사용
|
|||||||
<label for="wr_message" id="wr_message_lbl">내용</label>
|
<label for="wr_message" id="wr_message_lbl">내용</label>
|
||||||
<textarea name="wr_message" id="wr_message" class="box_txt box_square" onkeyup="byte_check('wr_message', 'sms_bytes');" accesskey="m"></textarea>
|
<textarea name="wr_message" id="wr_message" class="box_txt box_square" onkeyup="byte_check('wr_message', 'sms_bytes');" accesskey="m"></textarea>
|
||||||
|
|
||||||
<div id="sms_byte"><span id="sms_bytes">0</span> / 80 byte</div>
|
<div id="sms_byte"><span id="sms_bytes">0</span> / <span id="sms_max_bytes"><?php echo ($config['cf_sms_type'] == 'LMS' ? 90 : 80); ?></span> byte</div>
|
||||||
|
|
||||||
<button type="button" id="write_sc_btn" class="write_scemo_btn">특수<br>기호</button>
|
<button type="button" id="write_sc_btn" class="write_scemo_btn">특수<br>기호</button>
|
||||||
<div id="write_sc" class="write_scemo">
|
<div id="write_sc" class="write_scemo">
|
||||||
@@ -114,7 +114,7 @@ if ($config['cf_sms_use'] == 'icode') { // 아이코드 사용
|
|||||||
|
|
||||||
<div id="write_reply">
|
<div id="write_reply">
|
||||||
<label for="wr_reply">회신<strong class="sound_only"> 필수</strong></label>
|
<label for="wr_reply">회신<strong class="sound_only"> 필수</strong></label>
|
||||||
<input type="text" name="wr_reply" value="<?php echo $sms5['cf_phone']?>" id="wr_reply" required class="frm_input required" size="17" maxlength="20">
|
<input type="text" name="wr_reply" value="<?php echo $sms5['cf_phone']?>" id="wr_reply" required class="frm_input required" size="17" maxlength="20" readonly="readonly">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="write_recv" class="write_inner">
|
<div id="write_recv" class="write_inner">
|
||||||
@@ -406,6 +406,7 @@ function byte_check(wr_message, sms_bytes)
|
|||||||
{
|
{
|
||||||
var conts = document.getElementById(wr_message);
|
var conts = document.getElementById(wr_message);
|
||||||
var bytes = document.getElementById(sms_bytes);
|
var bytes = document.getElementById(sms_bytes);
|
||||||
|
var max_bytes = document.getElementById("sms_max_bytes");
|
||||||
|
|
||||||
var i = 0;
|
var i = 0;
|
||||||
var cnt = 0;
|
var cnt = 0;
|
||||||
@@ -424,6 +425,40 @@ function byte_check(wr_message, sms_bytes)
|
|||||||
|
|
||||||
bytes.innerHTML = cnt;
|
bytes.innerHTML = cnt;
|
||||||
|
|
||||||
|
<?php if($config['cf_sms_type'] == 'LMS') { ?>
|
||||||
|
if(cnt > 90)
|
||||||
|
max_bytes.innerHTML = 1500;
|
||||||
|
else
|
||||||
|
max_bytes.innerHTML = 90;
|
||||||
|
|
||||||
|
if (cnt > 1500)
|
||||||
|
{
|
||||||
|
exceed = cnt - 1500;
|
||||||
|
alert('메시지 내용은 1500바이트를 넘을수 없습니다.\n\n작성하신 메세지 내용은 '+ exceed +'byte가 초과되었습니다.\n\n초과된 부분은 자동으로 삭제됩니다.');
|
||||||
|
var tcnt = 0;
|
||||||
|
var xcnt = 0;
|
||||||
|
var tmp = conts.value;
|
||||||
|
for (i=0; i<tmp.length; i++)
|
||||||
|
{
|
||||||
|
ch = tmp.charAt(i);
|
||||||
|
if (escape(ch).length > 4) {
|
||||||
|
tcnt += 2;
|
||||||
|
} else {
|
||||||
|
tcnt += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tcnt > 1500) {
|
||||||
|
tmp = tmp.substring(0,i);
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
xcnt = tcnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
conts.value = tmp;
|
||||||
|
bytes.innerHTML = xcnt;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
<?php } else { ?>
|
||||||
if (cnt > 80)
|
if (cnt > 80)
|
||||||
{
|
{
|
||||||
exceed = cnt - 80;
|
exceed = cnt - 80;
|
||||||
@@ -451,6 +486,7 @@ function byte_check(wr_message, sms_bytes)
|
|||||||
bytes.innerHTML = xcnt;
|
bytes.innerHTML = xcnt;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
<?php } ?>
|
||||||
}
|
}
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
@@ -496,7 +532,7 @@ if ($wr_no)
|
|||||||
// 회원목록
|
// 회원목록
|
||||||
$sql = " select * from {$g5['sms5_history_table']} where wr_no = '$wr_no' and bk_no > 0 ";
|
$sql = " select * from {$g5['sms5_history_table']} where wr_no = '$wr_no' and bk_no > 0 ";
|
||||||
$qry = sql_query($sql);
|
$qry = sql_query($sql);
|
||||||
$tot = mysql_num_rows($qry);
|
$tot = sql_num_rows($qry);
|
||||||
|
|
||||||
if ($tot > 0) {
|
if ($tot > 0) {
|
||||||
|
|
||||||
@@ -514,7 +550,7 @@ if ($wr_no)
|
|||||||
// 비회원 목록
|
// 비회원 목록
|
||||||
$sql = " select * from {$g5['sms5_history_table']} where wr_no = '$wr_no' and bk_no = 0 ";
|
$sql = " select * from {$g5['sms5_history_table']} where wr_no = '$wr_no' and bk_no = 0 ";
|
||||||
$qry = sql_query($sql);
|
$qry = sql_query($sql);
|
||||||
$tot = mysql_num_rows($qry);
|
$tot = sql_num_rows($qry);
|
||||||
|
|
||||||
if ($tot > 0)
|
if ($tot > 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ $wr_message = clean_xss_tags(trim($wr_message));
|
|||||||
if (!$wr_reply)
|
if (!$wr_reply)
|
||||||
win_close_alert('회신 번호를 숫자, - 로 입력해주세요.');
|
win_close_alert('회신 번호를 숫자, - 로 입력해주세요.');
|
||||||
|
|
||||||
|
if(!check_vaild_callback($wr_reply))
|
||||||
|
win_close_alert('회신 번호를 올바르게 입력해 주십시오.');
|
||||||
|
|
||||||
if (!$wr_message)
|
if (!$wr_message)
|
||||||
win_close_alert('메세지를 입력해주세요.');
|
win_close_alert('메세지를 입력해주세요.');
|
||||||
|
|
||||||
@@ -42,6 +45,9 @@ while ($row = array_shift($send_list))
|
|||||||
while ($row = sql_fetch_array($qry))
|
while ($row = sql_fetch_array($qry))
|
||||||
{
|
{
|
||||||
$row['bk_hp'] = get_hp($row['bk_hp'], 0);
|
$row['bk_hp'] = get_hp($row['bk_hp'], 0);
|
||||||
|
|
||||||
|
if(!$row['bk_hp']) continue;
|
||||||
|
|
||||||
if ($wr_overlap && array_overlap($hps, $row['bk_hp'])) {
|
if ($wr_overlap && array_overlap($hps, $row['bk_hp'])) {
|
||||||
$overlap++;
|
$overlap++;
|
||||||
array_push( $duplicate_data['hp'], $row['bk_hp'] );
|
array_push( $duplicate_data['hp'], $row['bk_hp'] );
|
||||||
@@ -63,6 +69,8 @@ while ($row = array_shift($send_list))
|
|||||||
$hp = get_hp($row['mb_hp'], 0);
|
$hp = get_hp($row['mb_hp'], 0);
|
||||||
$mb_id = $row['mb_id'];
|
$mb_id = $row['mb_id'];
|
||||||
|
|
||||||
|
if(!$hp) continue;
|
||||||
|
|
||||||
if ($wr_overlap && array_overlap($hps, $hp)) {
|
if ($wr_overlap && array_overlap($hps, $hp)) {
|
||||||
$overlap++;
|
$overlap++;
|
||||||
array_push( $duplicate_data['hp'], $row['bk_hp'] );
|
array_push( $duplicate_data['hp'], $row['bk_hp'] );
|
||||||
@@ -84,6 +92,8 @@ while ($row = array_shift($send_list))
|
|||||||
$hp = get_hp($item[$i][1], 0);
|
$hp = get_hp($item[$i][1], 0);
|
||||||
$name = $item[$i][0];
|
$name = $item[$i][0];
|
||||||
|
|
||||||
|
if(!$hp) continue;
|
||||||
|
|
||||||
if ($wr_overlap && array_overlap($hps, $hp)) {
|
if ($wr_overlap && array_overlap($hps, $hp)) {
|
||||||
$overlap++;
|
$overlap++;
|
||||||
array_push( $duplicate_data['hp'], $row['bk_hp'] );
|
array_push( $duplicate_data['hp'], $row['bk_hp'] );
|
||||||
@@ -99,6 +109,8 @@ while ($row = array_shift($send_list))
|
|||||||
$row = sql_fetch("select * from {$g5['sms5_book_table']} where bk_no='$item[$i]'");
|
$row = sql_fetch("select * from {$g5['sms5_book_table']} where bk_no='$item[$i]'");
|
||||||
$row['bk_hp'] = get_hp($row['bk_hp'], 0);
|
$row['bk_hp'] = get_hp($row['bk_hp'], 0);
|
||||||
|
|
||||||
|
if(!$row['bk_hp']) continue;
|
||||||
|
|
||||||
if ($wr_overlap && array_overlap($hps, $row['bk_hp'])) {
|
if ($wr_overlap && array_overlap($hps, $row['bk_hp'])) {
|
||||||
$overlap++;
|
$overlap++;
|
||||||
array_push( $duplicate_data['hp'], $row['bk_hp'] );
|
array_push( $duplicate_data['hp'], $row['bk_hp'] );
|
||||||
@@ -133,86 +145,180 @@ if ($config['cf_sms_use'] != 'icode') {
|
|||||||
|
|
||||||
include_once(G5_ADMIN_PATH.'/admin.head.php');
|
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));
|
$reply = str_replace('-', '', trim($wr_reply));
|
||||||
$wr_message = conv_unescape_nl($wr_message);
|
$wr_message = conv_unescape_nl($wr_message);
|
||||||
|
|
||||||
$result = $SMS->Add($list, $reply, '', '', $wr_message, $booking, $wr_total);
|
$SMS = new SMS5;
|
||||||
|
|
||||||
if ($result)
|
if($config['cf_sms_type'] == 'LMS') {
|
||||||
{
|
$port_setting = get_icode_port_type($config['cf_icode_id'], $config['cf_icode_pw']);
|
||||||
$result = $SMS->Send();
|
|
||||||
|
|
||||||
if ($result) //SMS 서버에 접속했습니다.
|
if($port_setting !== false) {
|
||||||
{
|
$SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting);
|
||||||
$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_success = 0;
|
||||||
$wr_failure = 0;
|
$wr_failure = 0;
|
||||||
$count = 0;
|
$count = 0;
|
||||||
|
|
||||||
foreach ($SMS->Result as $result)
|
$row2 = sql_fetch("select max(wr_no) as wr_no from {$g5['sms5_write_table']}");
|
||||||
{
|
if ($row2)
|
||||||
list($phone, $code) = explode(":", $result);
|
$wr_no = $row2['wr_no'] + 1;
|
||||||
|
else
|
||||||
|
$wr_no = 1;
|
||||||
|
|
||||||
if (substr($code,0,5) == "Error")
|
for($i=0; $i<$wr_total; $i++) {
|
||||||
{
|
$strDest = array();
|
||||||
$hs_code = substr($code,6,2);
|
$strDest[] = $list[$i]['bk_hp'];
|
||||||
|
$strCallBack = $reply;
|
||||||
|
$strCaller = $config['cf_title'];
|
||||||
|
$strSubject = '';
|
||||||
|
$strURL = '';
|
||||||
|
$strData = $wr_message;
|
||||||
|
if( !empty($list[$i]['bk_name']) ){
|
||||||
|
$strData = str_replace("{이름}", $list[$i]['bk_name'], $strData);
|
||||||
|
}
|
||||||
|
$strDate = $booking;
|
||||||
|
$nCount = 1;
|
||||||
|
|
||||||
switch ($hs_code) {
|
$result = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount);
|
||||||
case '02': // "02:형식오류"
|
|
||||||
$hs_memo = "형식이 잘못되어 전송이 실패하였습니다.";
|
if($result) {
|
||||||
break;
|
$result = $SMS->Send();
|
||||||
case '23': // "23:인증실패,데이터오류,전송날짜오류"
|
|
||||||
$hs_memo = "데이터를 다시 확인해 주시기바랍니다.";
|
if ($result) //SMS 서버에 접속했습니다.
|
||||||
break;
|
{
|
||||||
case '97': // "97:잔여코인부족"
|
foreach ($SMS->Result as $result)
|
||||||
$hs_memo = "잔여코인이 부족합니다.";
|
{
|
||||||
break;
|
list($phone, $code) = explode(":", $result);
|
||||||
case '98': // "98:사용기간만료"
|
|
||||||
$hs_memo = "사용기간이 만료되었습니다.";
|
if (substr($code,0,5) == "Error")
|
||||||
break;
|
{
|
||||||
case '99': // "99:인증실패"
|
$hs_code = substr($code,6,2);
|
||||||
$hs_memo = "인증 받지 못하였습니다. 계정을 다시 확인해 주세요.";
|
|
||||||
break;
|
switch ($hs_code) {
|
||||||
default: // "미 확인 오류"
|
case '02': // "02:형식오류"
|
||||||
$hs_memo = "알 수 없는 오류로 전송이 실패하였습니다.";
|
$hs_memo = "형식이 잘못되어 전송이 실패하였습니다.";
|
||||||
break;
|
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 = $list[$i];
|
||||||
|
$row['bk_hp'] = get_hp($row['bk_hp'], 1);
|
||||||
|
|
||||||
|
$log = array_shift($SMS->Log);
|
||||||
|
$log = @iconv('euc-kr', 'utf-8', $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)."'", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
$SMS->Init(); // 보관하고 있던 결과값을 지웁니다.
|
||||||
}
|
}
|
||||||
$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);
|
|
||||||
$log = @iconv('euc-kr', 'utf-8', $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)."'", false);
|
|
||||||
}
|
}
|
||||||
$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");
|
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_success='$wr_success', wr_failure='$wr_failure', wr_memo='$str_serialize', wr_booking='$wr_booking', wr_total='$wr_total', wr_datetime='".G5_TIME_YMDHIS."'");
|
||||||
}
|
}
|
||||||
else win_close_alert("에러: SMS 서버와 통신이 불안정합니다.");
|
} else {
|
||||||
|
$SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']);
|
||||||
|
$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);
|
||||||
|
$log = @iconv('euc-kr', 'utf-8', $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)."'", false);
|
||||||
|
}
|
||||||
|
$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 데이터 입력도중 에러가 발생하였습니다.");
|
||||||
}
|
}
|
||||||
else win_close_alert("에러: SMS 데이터 입력도중 에러가 발생하였습니다.");
|
|
||||||
|
|
||||||
function win_close_alert($msg) {
|
function win_close_alert($msg) {
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
$sub_menu = "300100";
|
$sub_menu = "100280";
|
||||||
include_once('./_common.php');
|
include_once('./_common.php');
|
||||||
include_once(G5_LIB_PATH.'/json.lib.php');
|
include_once(G5_LIB_PATH.'/json.lib.php');
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,210 @@
|
|||||||
|
<?php
|
||||||
|
$sub_menu = '300820';
|
||||||
|
include_once('./_common.php');
|
||||||
|
|
||||||
|
check_demo();
|
||||||
|
|
||||||
|
auth_check($auth[$sub_menu], 'r');
|
||||||
|
|
||||||
|
// http://www.jqplot.com/
|
||||||
|
add_stylesheet('<link rel="stylesheet" href="'.G5_PLUGIN_URL.'/jqplot/jquery.jqplot.css">', 0);
|
||||||
|
add_javascript('<script src="'.G5_PLUGIN_URL.'/jqplot/jquery.jqplot.js"></script>', 0);
|
||||||
|
add_javascript('<script src="'.G5_PLUGIN_URL.'/jqplot/plugins/jqplot.canvasTextRenderer.min.js"></script>', 0);
|
||||||
|
add_javascript('<script src="'.G5_PLUGIN_URL.'/jqplot/plugins/jqplot.categoryAxisRenderer.min.js"></script>', 0);
|
||||||
|
add_javascript('<script src="'.G5_PLUGIN_URL.'/jqplot/plugins/jqplot.pointLabels.min.js"></script>', 0);
|
||||||
|
add_javascript('<!--[if lt IE 9]><script src="'.G5_PLUGIN_URL.'/jqplot/excanvas.js"></script><![endif]-->', 0);
|
||||||
|
|
||||||
|
if (!($graph == 'line' || $graph == 'bar'))
|
||||||
|
$graph = 'line';
|
||||||
|
|
||||||
|
if ($graph == 'bar') {
|
||||||
|
// 바 타입으로 사용하는 코드입니다.
|
||||||
|
add_javascript('<script src="'.G5_PLUGIN_URL.'/jqplot/jqplot.barRenderer.min.js"></script>', 0);
|
||||||
|
add_javascript('<script src="'.G5_PLUGIN_URL.'/jqplot/jqplot.categoryAxisRenderer.min.js"></script>', 0);
|
||||||
|
add_javascript('<script src="'.G5_PLUGIN_URL.'/jqplot/jqplot.pointLabels.min.js"></script>', 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
$g5['title'] = '글,댓글 현황';
|
||||||
|
include_once ('./admin.head.php');
|
||||||
|
|
||||||
|
$period_array = array(
|
||||||
|
'오늘'=>array('시간', 0),
|
||||||
|
'어제'=>array('시간', 0),
|
||||||
|
'7일전'=>array('일', 7),
|
||||||
|
'14일전'=>array('일', 14),
|
||||||
|
'30일전'=>array('일', 30),
|
||||||
|
'3개월전'=>array('주', 90),
|
||||||
|
'6개월전'=>array('주', 180),
|
||||||
|
'1년전'=>array('월', 365),
|
||||||
|
'2년전'=>array('월', 365*2),
|
||||||
|
'3년전'=>array('월', 365*3),
|
||||||
|
'5년전'=>array('년', 365*5),
|
||||||
|
'10년전'=>array('년', 365*10),
|
||||||
|
);
|
||||||
|
|
||||||
|
$is_period = false;
|
||||||
|
foreach($period_array as $key=>$value) {
|
||||||
|
if ($key == $period) {
|
||||||
|
$is_period = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$is_period)
|
||||||
|
$period = '오늘';
|
||||||
|
|
||||||
|
$day = $period_array[$period][0];
|
||||||
|
|
||||||
|
$today = date('Y-m-d', G5_SERVER_TIME);
|
||||||
|
$yesterday = date('Y-m-d', G5_SERVER_TIME - 86400);
|
||||||
|
|
||||||
|
if ($period == '오늘') {
|
||||||
|
$from = $today;
|
||||||
|
$to = $from;
|
||||||
|
} else if ($period == '어제') {
|
||||||
|
$from = $yesterday;
|
||||||
|
$to = $from;
|
||||||
|
} else if ($period == '내일') {
|
||||||
|
$from = date('Y-m-d', G5_SERVER_TIME + (86400 * 2));
|
||||||
|
$to = $from;
|
||||||
|
} else {
|
||||||
|
$from = date('Y-m-d', G5_SERVER_TIME - (86400 * $period_array[$period][1]));
|
||||||
|
$to = $yesterday;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql_bo_table = '';
|
||||||
|
if ($bo_table)
|
||||||
|
$sql_bo_table = "and bo_table = '$bo_table'";
|
||||||
|
|
||||||
|
switch ($day) {
|
||||||
|
case '시간' :
|
||||||
|
$sql = " select substr(bn_datetime,6,8) as hours, sum(if(wr_id=wr_parent,1,0)) as wcount, sum(if(wr_id=wr_parent,0,1)) as ccount from {$g5['board_new_table']} where substr(bn_datetime,1,10) between '$from' and '$to' {$sql_bo_table} group by hours order by bn_datetime ";
|
||||||
|
$result = sql_query($sql);
|
||||||
|
for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||||
|
// 월-일 시간
|
||||||
|
$line1[] = "['".substr($row['hours'],0,8)."',".$row['wcount'].']';
|
||||||
|
$line2[] = "['".substr($row['hours'],0,8)."',".$row['ccount'].']';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '일' :
|
||||||
|
$sql = " select substr(bn_datetime,1,10) as days, sum(if(wr_id=wr_parent,1,0)) as wcount, sum(if(wr_id=wr_parent,0,1)) as ccount from {$g5['board_new_table']} where substr(bn_datetime,1,10) between '$from' and '$to' {$sql_bo_table} group by days order by bn_datetime ";
|
||||||
|
$result = sql_query($sql);
|
||||||
|
for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||||
|
// 월-일
|
||||||
|
$line1[] = "['".substr($row['days'],5,5)."',".$row['wcount'].']';
|
||||||
|
$line2[] = "['".substr($row['days'],5,5)."',".$row['ccount'].']';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '주' :
|
||||||
|
$sql = " select concat(substr(bn_datetime,1,4), '-', weekofyear(bn_datetime)) as weeks, sum(if(wr_id=wr_parent,1,0)) as wcount, sum(if(wr_id=wr_parent,0,1)) as ccount from {$g5['board_new_table']} where substr(bn_datetime,1,10) between '$from' and '$to' {$sql_bo_table} group by weeks order by bn_datetime ";
|
||||||
|
$result = sql_query($sql);
|
||||||
|
for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||||
|
// 올해의 몇주로 보여주면 바로 확인이 안되므로 주를 날짜로 바꾼다.
|
||||||
|
// 년-월-일
|
||||||
|
list($lyear, $lweek) = explode('-', $row['weeks']);
|
||||||
|
$date = date('y-m-d', strtotime($lyear.'W'.str_pad($lweek, 2, '0', STR_PAD_LEFT)));
|
||||||
|
$line1[] = "['".$date."',".$row['wcount'].']';
|
||||||
|
$line2[] = "['".$date."',".$row['ccount'].']';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '월' :
|
||||||
|
$sql = " select substr(bn_datetime,1,7) as months, sum(if(wr_id=wr_parent,1,0)) as wcount, sum(if(wr_id=wr_parent,0,1)) as ccount from {$g5['board_new_table']} where substr(bn_datetime,1,10) between '$from' and '$to' {$sql_bo_table} group by months order by bn_datetime ";
|
||||||
|
$result = sql_query($sql);
|
||||||
|
for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||||
|
// 년-월
|
||||||
|
$line1[] = "['".substr($row['months'],2,5)."',".$row['wcount'].']';
|
||||||
|
$line2[] = "['".substr($row['months'],2,5)."',".$row['ccount'].']';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '년' :
|
||||||
|
$sql = " select substr(bn_datetime,1,4) as years, sum(if(wr_id=wr_parent,1,0)) as wcount, sum(if(wr_id=wr_parent,0,1)) as ccount from {$g5['board_new_table']} where substr(bn_datetime,1,10) between '$from' and '$to' {$sql_bo_table} group by years order by bn_datetime ";
|
||||||
|
$result = sql_query($sql);
|
||||||
|
for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||||
|
// 년(4자리)
|
||||||
|
$line1[] = "['".substr($row['years'],0,4)."',".$row['wcount'].']';
|
||||||
|
$line2[] = "['".substr($row['years'],0,4)."',".$row['ccount'].']';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<div id="wr_cont">
|
||||||
|
<form>
|
||||||
|
<select name="bo_table">
|
||||||
|
<option value="">전체게시판</a>
|
||||||
|
<?php
|
||||||
|
$sql = " select bo_table, bo_subject from {$g5['board_table']} order by bo_count_write desc ";
|
||||||
|
$result = sql_query($sql);
|
||||||
|
for($i=0; $row=sql_fetch_array($result); $i++) {
|
||||||
|
echo "<option value=\"{$row['bo_table']}\"";
|
||||||
|
if ($bo_table == $row['bo_table'])
|
||||||
|
echo ' selected="selected"';
|
||||||
|
echo ">{$row['bo_subject']}</option>\n";
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select name="period">
|
||||||
|
<?php
|
||||||
|
foreach($period_array as $key=>$value) {
|
||||||
|
echo "<option value=\"{$key}\"";
|
||||||
|
if ($key == $period)
|
||||||
|
echo " selected=\"selected\"";
|
||||||
|
echo ">{$key}</option>\n";
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select name="graph">
|
||||||
|
<option value="line" <?php echo ($graph == 'line' ? 'selected="selected"' : ''); ?>>선그래프</option>
|
||||||
|
<option value="bar" <?php echo ($graph == 'bar' ? 'selected="selected"' : ''); ?>>막대그래프</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<input type="submit" class="btn_submit" value="확인">
|
||||||
|
</form>
|
||||||
|
<ul id="grp_color">
|
||||||
|
<li><span></span>글 수</li>
|
||||||
|
<li class="color2"><span></span>댓글 수</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<div id="chart_wr">
|
||||||
|
<?php
|
||||||
|
if (empty($line1) || empty($line2)) {
|
||||||
|
echo "<h5>그래프를 만들 데이터가 없습니다.</h5>\n";
|
||||||
|
} else {
|
||||||
|
?>
|
||||||
|
<div id="chart1" style="height:500px; width:100%;"></div>
|
||||||
|
<div>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function(){
|
||||||
|
var line1 = [<?php echo implode($line1, ','); ?>];
|
||||||
|
var line2 = [<?php echo implode($line2, ','); ?>];
|
||||||
|
var plot1 = $.jqplot ('chart1', [line1, line2], {
|
||||||
|
seriesDefaults: {
|
||||||
|
<?php if ($graph == 'bar') { ?>
|
||||||
|
renderer:$.jqplot.BarRenderer,
|
||||||
|
<?php } ?>
|
||||||
|
pointLabels: { show: true }
|
||||||
|
},
|
||||||
|
axes:{
|
||||||
|
xaxis: {
|
||||||
|
renderer: $.jqplot.CategoryAxisRenderer,
|
||||||
|
label: '<?php echo $day; ?>',
|
||||||
|
pad:0,
|
||||||
|
max:23
|
||||||
|
},
|
||||||
|
yaxis: {
|
||||||
|
label: '글수',
|
||||||
|
min: 0
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
|
<?
|
||||||
|
include_once ('./admin.tail.php');
|
||||||
|
?>
|
||||||
+9
-3
@@ -1,5 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
include_once('./_common.php');
|
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||||
|
|
||||||
|
if(!$is_admin)
|
||||||
|
alert('접근 권한이 없습니다.', G5_URL);
|
||||||
|
|
||||||
// 4.11
|
// 4.11
|
||||||
@include_once($board_skin_path.'/delete_all.head.skin.php');
|
@include_once($board_skin_path.'/delete_all.head.skin.php');
|
||||||
@@ -13,13 +16,16 @@ if ($wr_id) // 건별삭제
|
|||||||
else // 일괄삭제
|
else // 일괄삭제
|
||||||
$tmp_array = $_POST['chk_wr_id'];
|
$tmp_array = $_POST['chk_wr_id'];
|
||||||
|
|
||||||
|
$chk_count = count($tmp_array);
|
||||||
|
|
||||||
|
if($chk_count > (G5_IS_MOBILE ? $board['bo_mobile_page_rows'] : $board['bo_page_rows']))
|
||||||
|
alert('올바른 방법으로 이용해 주십시오.');
|
||||||
|
|
||||||
// 사용자 코드 실행
|
// 사용자 코드 실행
|
||||||
@include_once($board_skin_path.'/delete_all.skin.php');
|
@include_once($board_skin_path.'/delete_all.skin.php');
|
||||||
|
|
||||||
|
|
||||||
// 거꾸로 읽는 이유는 답변글부터 삭제가 되어야 하기 때문임
|
// 거꾸로 읽는 이유는 답변글부터 삭제가 되어야 하기 때문임
|
||||||
for ($i=count($tmp_array)-1; $i>=0; $i--)
|
for ($i=$chk_count-1; $i>=0; $i--)
|
||||||
{
|
{
|
||||||
$write = sql_fetch(" select * from $write_table where wr_id = '$tmp_array[$i]' ");
|
$write = sql_fetch(" select * from $write_table where wr_id = '$tmp_array[$i]' ");
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -76,7 +76,8 @@ if (!get_session($ss_name))
|
|||||||
|
|
||||||
$g5['title'] = '다운로드 > '.conv_subject($write['wr_subject'], 255);
|
$g5['title'] = '다운로드 > '.conv_subject($write['wr_subject'], 255);
|
||||||
|
|
||||||
$original = urlencode($file['bf_source']);
|
//$original = urlencode($file['bf_source']);
|
||||||
|
$original = iconv('utf-8', 'euc-kr', $file['bf_source']); // SIR 잉끼님 제안코드
|
||||||
|
|
||||||
@include_once($board_skin_path.'/download.tail.skin.php');
|
@include_once($board_skin_path.'/download.tail.skin.php');
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ include_once(G5_PATH.'/head.sub.php');
|
|||||||
|
|
||||||
if (!$name)
|
if (!$name)
|
||||||
$name = base64_decode($email);
|
$name = base64_decode($email);
|
||||||
|
else
|
||||||
|
$name = get_text(stripslashes($name), true);
|
||||||
|
|
||||||
if (!isset($type))
|
if (!isset($type))
|
||||||
$type = 0;
|
$type = 0;
|
||||||
|
|||||||
+1
-1
@@ -53,7 +53,7 @@ if ($sca || $stx) {
|
|||||||
/*
|
/*
|
||||||
$sql = " select distinct wr_parent from {$write_table} where {$sql_search} ";
|
$sql = " select distinct wr_parent from {$write_table} where {$sql_search} ";
|
||||||
$result = sql_query($sql);
|
$result = sql_query($sql);
|
||||||
$total_count = mysql_num_rows($result);
|
$total_count = sql_num_rows($result);
|
||||||
*/
|
*/
|
||||||
} else {
|
} else {
|
||||||
$sql_search = "";
|
$sql_search = "";
|
||||||
|
|||||||
+3
-3
@@ -2,8 +2,8 @@
|
|||||||
include_once('./_common.php');
|
include_once('./_common.php');
|
||||||
|
|
||||||
// 이호경님 제안 코드
|
// 이호경님 제안 코드
|
||||||
session_unset(); // 모든 세션변수를 언레지스터 시켜줌
|
session_unset(); // 모든 세션변수를 언레지스터 시켜줌
|
||||||
session_destroy(); // 세션해제함
|
session_destroy(); // 세션해제함
|
||||||
|
|
||||||
// 자동로그인 해제 --------------------------------
|
// 자동로그인 해제 --------------------------------
|
||||||
set_cookie('ck_mb_id', '', 0);
|
set_cookie('ck_mb_id', '', 0);
|
||||||
@@ -11,7 +11,7 @@ set_cookie('ck_auto', '', 0);
|
|||||||
// 자동로그인 해제 end --------------------------------
|
// 자동로그인 해제 end --------------------------------
|
||||||
|
|
||||||
if ($url) {
|
if ($url) {
|
||||||
$p = parse_url($url);
|
$p = @parse_url($url);
|
||||||
if ($p['scheme'] || $p['host']) {
|
if ($p['scheme'] || $p['host']) {
|
||||||
alert('url에 도메인을 지정할 수 없습니다.');
|
alert('url에 도메인을 지정할 수 없습니다.');
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -55,7 +55,7 @@ for ($i=0; $row=sql_fetch_array($result); $i++)
|
|||||||
<input type="hidden" name="sod" value="<?php echo $sod ?>">
|
<input type="hidden" name="sod" value="<?php echo $sod ?>">
|
||||||
<input type="hidden" name="page" value="<?php echo $page ?>">
|
<input type="hidden" name="page" value="<?php echo $page ?>">
|
||||||
<input type="hidden" name="act" value="<?php echo $act ?>">
|
<input type="hidden" name="act" value="<?php echo $act ?>">
|
||||||
<input type="hidden" name="url" value="<?php echo clean_xss_tags($_SERVER['HTTP_REFERER']); ?>">
|
<input type="hidden" name="url" value="<?php echo get_text(clean_xss_tags($_SERVER['HTTP_REFERER'])); ?>">
|
||||||
|
|
||||||
<div class="tbl_head01 tbl_wrap">
|
<div class="tbl_head01 tbl_wrap">
|
||||||
<table>
|
<table>
|
||||||
|
|||||||
+1
-1
@@ -99,7 +99,7 @@ while ($row = sql_fetch_array($result))
|
|||||||
wr_10 = '".addslashes($row2['wr_10'])."' ";
|
wr_10 = '".addslashes($row2['wr_10'])."' ";
|
||||||
sql_query($sql);
|
sql_query($sql);
|
||||||
|
|
||||||
$insert_id = mysql_insert_id();
|
$insert_id = sql_insert_id();
|
||||||
|
|
||||||
// 코멘트가 아니라면
|
// 코멘트가 아니라면
|
||||||
if (!$row2['wr_is_comment'])
|
if (!$row2['wr_is_comment'])
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ include_once('./_common.php');
|
|||||||
if ($is_guest)
|
if ($is_guest)
|
||||||
alert_close('회원만 조회하실 수 있습니다.');
|
alert_close('회원만 조회하실 수 있습니다.');
|
||||||
|
|
||||||
$g5['title'] = $member['mb_nick'].' 님의 포인트 내역';
|
$g5['title'] = get_text($member['mb_nick']).' 님의 포인트 내역';
|
||||||
include_once(G5_PATH.'/head.sub.php');
|
include_once(G5_PATH.'/head.sub.php');
|
||||||
|
|
||||||
$list = array();
|
$list = array();
|
||||||
|
|||||||
+2
-2
@@ -17,14 +17,14 @@ if (!$mb['mb_open'] && $is_admin != 'super' && $member['mb_id'] != $mb_id)
|
|||||||
$g5['title'] = $mb['mb_nick'].'님의 자기소개';
|
$g5['title'] = $mb['mb_nick'].'님의 자기소개';
|
||||||
include_once(G5_PATH.'/head.sub.php');
|
include_once(G5_PATH.'/head.sub.php');
|
||||||
|
|
||||||
$mb_nick = get_sideview($mb['mb_id'], $mb['mb_nick'], $mb['mb_email'], $mb['mb_homepage'], $mb['mb_open']);
|
$mb_nick = get_sideview($mb['mb_id'], get_text($mb['mb_nick']), $mb['mb_email'], $mb['mb_homepage'], $mb['mb_open']);
|
||||||
|
|
||||||
// 회원가입후 몇일째인지? + 1 은 당일을 포함한다는 뜻
|
// 회원가입후 몇일째인지? + 1 은 당일을 포함한다는 뜻
|
||||||
$sql = " select (TO_DAYS('".G5_TIME_YMDHIS."') - TO_DAYS('{$mb['mb_datetime']}') + 1) as days ";
|
$sql = " select (TO_DAYS('".G5_TIME_YMDHIS."') - TO_DAYS('{$mb['mb_datetime']}') + 1) as days ";
|
||||||
$row = sql_fetch($sql);
|
$row = sql_fetch($sql);
|
||||||
$mb_reg_after = $row['days'];
|
$mb_reg_after = $row['days'];
|
||||||
|
|
||||||
$mb_homepage = set_http(clean_xss_tags($mb['mb_homepage']));
|
$mb_homepage = set_http(get_text(clean_xss_tags($mb['mb_homepage'])));
|
||||||
$mb_profile = $mb['mb_profile'] ? conv_content($mb['mb_profile'],0) : '소개 내용이 없습니다.';
|
$mb_profile = $mb['mb_profile'] ? conv_content($mb['mb_profile'],0) : '소개 내용이 없습니다.';
|
||||||
|
|
||||||
include_once($member_skin_path.'/profile.skin.php');
|
include_once($member_skin_path.'/profile.skin.php');
|
||||||
|
|||||||
+1
-2
@@ -57,8 +57,7 @@ if(is_file($skin_file)) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$is_dhtml_editor = false;
|
$is_dhtml_editor = false;
|
||||||
// 모바일에서는 DHTML 에디터 사용불가
|
if ($config['cf_editor'] && $qaconfig['qa_use_editor'] && (!is_mobile() || defined('G5_IS_MOBILE_DHTML_USE') && G5_IS_MOBILE_DHTML_USE)) {
|
||||||
if ($config['cf_editor'] && $qaconfig['qa_use_editor'] && !G5_IS_MOBILE) {
|
|
||||||
$is_dhtml_editor = true;
|
$is_dhtml_editor = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+91
-24
@@ -217,7 +217,7 @@ if($w == '' || $w == 'a' || $w == 'r') {
|
|||||||
$sql = " insert into {$g5['qa_content_table']}
|
$sql = " insert into {$g5['qa_content_table']}
|
||||||
set qa_num = '$qa_num',
|
set qa_num = '$qa_num',
|
||||||
mb_id = '{$member['mb_id']}',
|
mb_id = '{$member['mb_id']}',
|
||||||
qa_name = '{$member['mb_nick']}',
|
qa_name = '".addslashes($member['mb_nick'])."',
|
||||||
qa_email = '$qa_email',
|
qa_email = '$qa_email',
|
||||||
qa_hp = '$qa_hp',
|
qa_hp = '$qa_hp',
|
||||||
qa_type = '$qa_type',
|
qa_type = '$qa_type',
|
||||||
@@ -244,7 +244,7 @@ if($w == '' || $w == 'a' || $w == 'r') {
|
|||||||
sql_query($sql);
|
sql_query($sql);
|
||||||
|
|
||||||
if($w == '' || $w == 'r') {
|
if($w == '' || $w == 'r') {
|
||||||
$qa_id = mysql_insert_id();
|
$qa_id = sql_insert_id();
|
||||||
|
|
||||||
if($w == 'r' && $write['qa_related']) {
|
if($w == 'r' && $write['qa_related']) {
|
||||||
$qa_related = $write['qa_related'];
|
$qa_related = $write['qa_related'];
|
||||||
@@ -300,33 +300,100 @@ if($w == '' || $w == 'a' || $w == 'r') {
|
|||||||
|
|
||||||
// SMS 알림
|
// SMS 알림
|
||||||
if($config['cf_sms_use'] == 'icode' && $qaconfig['qa_use_sms']) {
|
if($config['cf_sms_use'] == 'icode' && $qaconfig['qa_use_sms']) {
|
||||||
include_once(G5_LIB_PATH.'/icode.sms.lib.php');
|
if($config['cf_sms_type'] == 'LMS') {
|
||||||
|
include_once(G5_LIB_PATH.'/icode.lms.lib.php');
|
||||||
|
|
||||||
// 답변글은 질문 등록자에게 전송
|
$port_setting = get_icode_port_type($config['cf_icode_id'], $config['cf_icode_pw']);
|
||||||
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 모듈 클래스 생성
|
||||||
$SMS = new SMS; // SMS 연결
|
if($port_setting !== false) {
|
||||||
$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)), "");
|
if($w == 'a' && $write['qa_sms_recv'] && trim($write['qa_hp'])) {
|
||||||
$SMS->Send();
|
$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) {
|
||||||
|
$strDest = array();
|
||||||
|
$strDest[] = $recv_number;
|
||||||
|
$strCallBack = $send_number;
|
||||||
|
$strCaller = iconv_euckr(trim($config['cf_title']));
|
||||||
|
$strSubject = '';
|
||||||
|
$strURL = '';
|
||||||
|
$strData = iconv_euckr($sms_content);
|
||||||
|
$strDate = '';
|
||||||
|
$nCount = count($strDest);
|
||||||
|
|
||||||
|
$SMS = new LMS;
|
||||||
|
$SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting);
|
||||||
|
$res = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount);
|
||||||
|
|
||||||
|
if($res) {
|
||||||
|
$SMS->Send();
|
||||||
|
}
|
||||||
|
|
||||||
|
$SMS->Init(); // 보관하고 있던 결과값을 지웁니다.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 문의글 등록시 관리자에게 전송
|
||||||
|
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) {
|
||||||
|
$strDest = array();
|
||||||
|
$strDest[] = $recv_number;
|
||||||
|
$strCallBack = $send_number;
|
||||||
|
$strCaller = iconv_euckr(trim($config['cf_title']));;
|
||||||
|
$strSubject = '';
|
||||||
|
$strURL = '';
|
||||||
|
$strData = iconv_euckr($sms_content);
|
||||||
|
$strDate = '';
|
||||||
|
$nCount = count($strDest);
|
||||||
|
|
||||||
|
$SMS = new LMS;
|
||||||
|
$SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting);
|
||||||
|
$res = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount);
|
||||||
|
|
||||||
|
if($res) {
|
||||||
|
$SMS->Send();
|
||||||
|
}
|
||||||
|
|
||||||
|
$SMS->Init(); // 보관하고 있던 결과값을 지웁니다.
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
include_once(G5_LIB_PATH.'/icode.sms.lib.php');
|
||||||
|
|
||||||
// 문의글 등록시 관리자에게 전송
|
// 답변글은 질문 등록자에게 전송
|
||||||
if(($w == '' || $w == 'r') && trim($qaconfig['qa_admin_hp'])) {
|
if($w == 'a' && $write['qa_sms_recv'] && trim($write['qa_hp'])) {
|
||||||
$sms_content = $config['cf_title'].' '.$qaconfig['qa_title'].'에 문의글이 등록되었습니다.';
|
$sms_content = $config['cf_title'].' '.$qaconfig['qa_title'].'에 답변이 등록되었습니다.';
|
||||||
$send_number = preg_replace('/[^0-9]/', '', $qa_hp);
|
$send_number = preg_replace('/[^0-9]/', '', $qaconfig['qa_send_number']);
|
||||||
$recv_number = preg_replace('/[^0-9]/', '', $qaconfig['qa_admin_hp']);
|
$recv_number = preg_replace('/[^0-9]/', '', $write['qa_hp']);
|
||||||
|
|
||||||
if($recv_number) {
|
if($recv_number) {
|
||||||
$SMS = new SMS; // SMS 연결
|
$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->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->Add($recv_number, $send_number, $config['cf_icode_id'], iconv("utf-8", "euc-kr", stripslashes($sms_content)), "");
|
||||||
$SMS->Send();
|
$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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,9 @@ if ($w == "") {
|
|||||||
alert('개인정보처리방침안내의 내용에 동의하셔야 회원가입 하실 수 있습니다.', G5_BBS_URL.'/register.php');
|
alert('개인정보처리방침안내의 내용에 동의하셔야 회원가입 하실 수 있습니다.', G5_BBS_URL.'/register.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$agree = preg_replace('#[^0-9]#', '', $_POST['agree']);
|
||||||
|
$agree2 = preg_replace('#[^0-9]#', '', $_POST['agree2']);
|
||||||
|
|
||||||
$member['mb_birth'] = '';
|
$member['mb_birth'] = '';
|
||||||
$member['mb_sex'] = '';
|
$member['mb_sex'] = '';
|
||||||
$member['mb_name'] = '';
|
$member['mb_name'] = '';
|
||||||
|
|||||||
+1
-1
@@ -4,7 +4,7 @@ include_once('./_common.php');
|
|||||||
if (!$is_member)
|
if (!$is_member)
|
||||||
alert_close('회원만 조회하실 수 있습니다.');
|
alert_close('회원만 조회하실 수 있습니다.');
|
||||||
|
|
||||||
$g5['title'] = $member['mb_nick'].'님의 스크랩';
|
$g5['title'] = get_text($member['mb_nick']).'님의 스크랩';
|
||||||
include_once(G5_PATH.'/head.sub.php');
|
include_once(G5_PATH.'/head.sub.php');
|
||||||
|
|
||||||
$sql_common = " from {$g5['scrap_table']} where mb_id = '{$member['mb_id']}' ";
|
$sql_common = " from {$g5['scrap_table']} where mb_id = '{$member['mb_id']}' ";
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ if ($wr_content && ($member['mb_level'] >= $board['bo_comment_level']))
|
|||||||
wr_ip = '{$_SERVER['REMOTE_ADDR']}' ";
|
wr_ip = '{$_SERVER['REMOTE_ADDR']}' ";
|
||||||
sql_query($sql);
|
sql_query($sql);
|
||||||
|
|
||||||
$comment_id = mysql_insert_id();
|
$comment_id = sql_insert_id();
|
||||||
|
|
||||||
// 원글에 코멘트수 증가
|
// 원글에 코멘트수 증가
|
||||||
sql_query(" update $write_table set wr_comment = wr_comment + 1 where wr_id = '$wr_id' ");
|
sql_query(" update $write_table set wr_comment = wr_comment + 1 where wr_id = '$wr_id' ");
|
||||||
|
|||||||
+1
-1
@@ -120,7 +120,7 @@ if ($stx) {
|
|||||||
|
|
||||||
$sql = " select wr_id from {$tmp_write_table} where {$sql_search} ";
|
$sql = " select wr_id from {$tmp_write_table} where {$sql_search} ";
|
||||||
$result = sql_query($sql, false);
|
$result = sql_query($sql, false);
|
||||||
$row['cnt'] = @mysql_num_rows($result);
|
$row['cnt'] = @sql_num_rows($result);
|
||||||
|
|
||||||
$total_count += $row['cnt'];
|
$total_count += $row['cnt'];
|
||||||
if ($row['cnt']) {
|
if ($row['cnt']) {
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@ switch($_REQUEST['sns']) {
|
|||||||
header("Location:http://www.facebook.com/sharer/sharer.php?s=100&u=".$short_url."&p=".$title);
|
header("Location:http://www.facebook.com/sharer/sharer.php?s=100&u=".$short_url."&p=".$title);
|
||||||
break;
|
break;
|
||||||
case 'twitter' :
|
case 'twitter' :
|
||||||
header("Location:http://twitter.com/home?status=".$title_url);
|
header("Location:https://twitter.com/intent/tweet?text=".$title_url);
|
||||||
break;
|
break;
|
||||||
case 'gplus' :
|
case 'gplus' :
|
||||||
header("Location:https://plus.google.com/share?url=".$short_url);
|
header("Location:https://plus.google.com/share?url=".$short_url);
|
||||||
|
|||||||
+10
-2
@@ -390,9 +390,17 @@ if ($is_guest) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$is_dhtml_editor = false;
|
$is_dhtml_editor = false;
|
||||||
// 모바일에서는 DHTML 에디터 사용불가
|
$is_dhtml_editor_use = false;
|
||||||
if ($config['cf_editor'] && !G5_IS_MOBILE && $board['bo_use_dhtml_editor'] && $member['mb_level'] >= $board['bo_html_level']) {
|
$editor_content_js = '';
|
||||||
|
if(!is_mobile() || defined('G5_IS_MOBILE_DHTML_USE') && G5_IS_MOBILE_DHTML_USE)
|
||||||
|
$is_dhtml_editor_use = true;
|
||||||
|
|
||||||
|
// 모바일에서는 G5_IS_MOBILE_DHTML_USE 설정에 따라 DHTML 에디터 적용
|
||||||
|
if ($config['cf_editor'] && $is_dhtml_editor_use && $board['bo_use_dhtml_editor'] && $member['mb_level'] >= $board['bo_html_level']) {
|
||||||
$is_dhtml_editor = true;
|
$is_dhtml_editor = true;
|
||||||
|
|
||||||
|
if(is_file(G5_EDITOR_PATH.'/'.$config['cf_editor'].'/autosave.editor.js'))
|
||||||
|
$editor_content_js = '<script src="'.G5_EDITOR_URL.'/'.$config['cf_editor'].'/autosave.editor.js"></script>'.PHP_EOL;
|
||||||
}
|
}
|
||||||
$editor_html = editor_html('wr_content', $content, $is_dhtml_editor);
|
$editor_html = editor_html('wr_content', $content, $is_dhtml_editor);
|
||||||
$editor_js = '';
|
$editor_js = '';
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ if ($w == 'c') // 댓글 입력
|
|||||||
wr_10 = '$wr_10' ";
|
wr_10 = '$wr_10' ";
|
||||||
sql_query($sql);
|
sql_query($sql);
|
||||||
|
|
||||||
$comment_id = mysql_insert_id();
|
$comment_id = sql_insert_id();
|
||||||
|
|
||||||
// 원글에 댓글수 증가 & 마지막 시간 반영
|
// 원글에 댓글수 증가 & 마지막 시간 반영
|
||||||
sql_query(" update $write_table set wr_comment = wr_comment + 1, wr_last = '".G5_TIME_YMDHIS."' where wr_id = '$wr_id' ");
|
sql_query(" update $write_table set wr_comment = wr_comment + 1, wr_last = '".G5_TIME_YMDHIS."' where wr_id = '$wr_id' ");
|
||||||
|
|||||||
@@ -244,7 +244,7 @@ if ($w == '' || $w == 'r') {
|
|||||||
wr_10 = '$wr_10' ";
|
wr_10 = '$wr_10' ";
|
||||||
sql_query($sql);
|
sql_query($sql);
|
||||||
|
|
||||||
$wr_id = mysql_insert_id();
|
$wr_id = sql_insert_id();
|
||||||
|
|
||||||
// 부모 아이디에 UPDATE
|
// 부모 아이디에 UPDATE
|
||||||
sql_query(" update $write_table set wr_parent = '$wr_id' where wr_id = '$wr_id' ");
|
sql_query(" update $write_table set wr_parent = '$wr_id' where wr_id = '$wr_id' ");
|
||||||
|
|||||||
+2
-2
@@ -135,7 +135,7 @@ if (file_exists($dbconfig_file)) {
|
|||||||
// mysql connect resource $g5 배열에 저장 - 명랑폐인님 제안
|
// mysql connect resource $g5 배열에 저장 - 명랑폐인님 제안
|
||||||
$g5['connect_db'] = $connect_db;
|
$g5['connect_db'] = $connect_db;
|
||||||
|
|
||||||
sql_query(" set names utf8 ");
|
sql_set_charset('utf8', $connect_db);
|
||||||
if(defined('G5_MYSQL_SET_MODE') && G5_MYSQL_SET_MODE) sql_query("SET SESSION sql_mode = ''");
|
if(defined('G5_MYSQL_SET_MODE') && G5_MYSQL_SET_MODE) sql_query("SET SESSION sql_mode = ''");
|
||||||
if (defined(G5_TIMEZONE)) sql_query(" set time_zone = '".G5_TIMEZONE."'");
|
if (defined(G5_TIMEZONE)) sql_query(" set time_zone = '".G5_TIMEZONE."'");
|
||||||
} else {
|
} else {
|
||||||
@@ -319,7 +319,7 @@ if (isset($_REQUEST['url'])) {
|
|||||||
$url = '';
|
$url = '';
|
||||||
$urlencode = urlencode($_SERVER['REQUEST_URI']);
|
$urlencode = urlencode($_SERVER['REQUEST_URI']);
|
||||||
if (G5_DOMAIN) {
|
if (G5_DOMAIN) {
|
||||||
$p = parse_url(G5_DOMAIN);
|
$p = @parse_url(G5_DOMAIN);
|
||||||
$urlencode = G5_DOMAIN.urldecode(preg_replace("/^".urlencode($p['path'])."/", "", $urlencode));
|
$urlencode = G5_DOMAIN.urldecode(preg_replace("/^".urlencode($p['path'])."/", "", $urlencode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-1
@@ -5,7 +5,7 @@
|
|||||||
********************/
|
********************/
|
||||||
|
|
||||||
define('G5_VERSION', '그누보드5');
|
define('G5_VERSION', '그누보드5');
|
||||||
define('G5_GNUBOARD_VER', '5.1.0');
|
define('G5_GNUBOARD_VER', '5.1.3');
|
||||||
|
|
||||||
// 이 상수가 정의되지 않으면 각각의 개별 페이지는 별도로 실행될 수 없음
|
// 이 상수가 정의되지 않으면 각각의 개별 페이지는 별도로 실행될 수 없음
|
||||||
define('_GNUBOARD_', true);
|
define('_GNUBOARD_', true);
|
||||||
@@ -192,6 +192,12 @@ define('G5_THUMB_JPG_QUALITY', 90);
|
|||||||
// 썸네일 png Compress 설정
|
// 썸네일 png Compress 설정
|
||||||
define('G5_THUMB_PNG_COMPRESS', 5);
|
define('G5_THUMB_PNG_COMPRESS', 5);
|
||||||
|
|
||||||
|
// 모바일 기기에서 DHTML 에디터 사용여부를 설정합니다.
|
||||||
|
define('G5_IS_MOBILE_DHTML_USE', false);
|
||||||
|
|
||||||
|
// MySQLi 사용여부를 설정합니다.
|
||||||
|
define('G5_MYSQLI_USE', true);
|
||||||
|
|
||||||
// ip 숨김방법 설정
|
// ip 숨김방법 설정
|
||||||
/* 123.456.789.012 ip의 숨김 방법을 변경하는 방법은
|
/* 123.456.789.012 ip의 숨김 방법을 변경하는 방법은
|
||||||
\\1 은 123, \\2는 456, \\3은 789, \\4는 012에 각각 대응되므로
|
\\1 은 123, \\2는 456, \\3은 789, \\4는 012에 각각 대응되므로
|
||||||
|
|||||||
+7
-1
@@ -283,4 +283,10 @@ a.btn_admin:focus, a.btn_admin:hover {text-decoration:none}
|
|||||||
|
|
||||||
/*메일인증*/
|
/*메일인증*/
|
||||||
.rg_em{margin-top:5px}
|
.rg_em{margin-top:5px}
|
||||||
.rg_em caption{padding:0;font-size:0;line-height:0;overflow:hidden}
|
.rg_em caption{padding:0;font-size:0;line-height:0;overflow:hidden}
|
||||||
|
|
||||||
|
/*캡챠 모바일에서 피시버젼*/
|
||||||
|
#captcha.m_captcha audio{display:block;margin:5px 0 10px;}
|
||||||
|
#captcha.m_captcha #captcha_key{margin-left:3px }
|
||||||
|
#captcha.m_captcha #captcha_reload span{background:none;display:inline}
|
||||||
|
#captcha.m_captcha #captcha_reload {position:relative ;width:auto;top:0;left:0;margin:0;padding:0 10px;height:43px;border:0;background:#e4eaec;vertical-align:middle;overflow:hidden;cursor:pointer}
|
||||||
@@ -102,6 +102,7 @@ a:hover, a:focus, a:active {color:#000;text-decoration:underline}
|
|||||||
/* 화면낭독기 사용자용 */
|
/* 화면낭독기 사용자용 */
|
||||||
#hd_login_msg {position:absolute;top:0;left:0;width:0;height:0;overflow:hidden}
|
#hd_login_msg {position:absolute;top:0;left:0;width:0;height:0;overflow:hidden}
|
||||||
.msg_sound_only, .sound_only {display:inline-block;position:absolute;top:0;left:0;margin:0 !important;padding:0 !important;width:1px !important;height:1px !important;font-size:0 !important;line-height:0 !important;overflow:hidden}
|
.msg_sound_only, .sound_only {display:inline-block;position:absolute;top:0;left:0;margin:0 !important;padding:0 !important;width:1px !important;height:1px !important;font-size:0 !important;line-height:0 !important;overflow:hidden}
|
||||||
|
|
||||||
/* 본문 바로가기 */
|
/* 본문 바로가기 */
|
||||||
.to_content a {z-index:100000;position:absolute;top:0;left:0;width:0;height:0;font-size:0;line-height:0;overflow:hidden}
|
.to_content a {z-index:100000;position:absolute;top:0;left:0;width:0;height:0;font-size:0;line-height:0;overflow:hidden}
|
||||||
|
|
||||||
@@ -116,6 +117,17 @@ a:hover, a:focus, a:active {color:#000;text-decoration:underline}
|
|||||||
#captcha #captcha_reload {margin:0;padding:0 5px;height:32px;border:0;background:#e4eaec;vertical-align:middle;overflow:hidden;cursor:pointer}
|
#captcha #captcha_reload {margin:0;padding:0 5px;height:32px;border:0;background:#e4eaec;vertical-align:middle;overflow:hidden;cursor:pointer}
|
||||||
#captcha #captcha_key {margin:0 0 0 4px;padding:0 5px;width:50px;height:30px;border:1px solid #b8c9c2;background:#f7f7f7;font-size:1.333em;font-weight:bold;text-align:center;line-height:2em}
|
#captcha #captcha_key {margin:0 0 0 4px;padding:0 5px;width:50px;height:30px;border:1px solid #b8c9c2;background:#f7f7f7;font-size:1.333em;font-weight:bold;text-align:center;line-height:2em}
|
||||||
#captcha #captcha_info {display:block;margin:5px 0 0;font-size:0.95em;letter-spacing:-0.1em}
|
#captcha #captcha_info {display:block;margin:5px 0 0;font-size:0.95em;letter-spacing:-0.1em}
|
||||||
|
#captcha #captcha_mp3{margin:0;padding:0 5px;height:32px;border:0;background:#e4eaec;vertical-align:middle;overflow:hidden;cursor:pointer}
|
||||||
|
|
||||||
|
/*단축키일람 */
|
||||||
|
.btn_cke_sc{background:#333;color:#fff;padding:5px;border:none;margin-bottom:5px}
|
||||||
|
.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:50%;font-weight:bold}
|
||||||
|
.cke_sc_def dd {width:50%}
|
||||||
|
.btn_cke_sc_close{background:#333;padding:5px;border:none;color:#fff}
|
||||||
|
|
||||||
/* 버튼 */
|
/* 버튼 */
|
||||||
a.btn01 {display:inline-block;padding:8px 7px 7px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none;vertical-align:middle}
|
a.btn01 {display:inline-block;padding:8px 7px 7px;border:1px solid #ccc;background:#fafafa;color:#000;text-decoration:none;vertical-align:middle}
|
||||||
|
|||||||
@@ -22,23 +22,10 @@ $g5['sms5_book_table'] = $g5['sms5_prefix'] . 'book';
|
|||||||
$g5['sms5_book_group_table'] = $g5['sms5_prefix'] . 'book_group';
|
$g5['sms5_book_group_table'] = $g5['sms5_prefix'] . 'book_group';
|
||||||
$g5['sms5_form_table'] = $g5['sms5_prefix'] . 'form';
|
$g5['sms5_form_table'] = $g5['sms5_prefix'] . 'form';
|
||||||
$g5['sms5_form_group_table'] = $g5['sms5_prefix'] . 'form_group';
|
$g5['sms5_form_group_table'] = $g5['sms5_prefix'] . 'form_group';
|
||||||
$g5['sms5_member_history_table'] = $g5['sms5_prefix'] . 'member_history';
|
|
||||||
|
|
||||||
if (!empty($config['cf_sms_use'])) {
|
if (!empty($config['cf_sms_use'])) {
|
||||||
|
|
||||||
$sms5 = sql_fetch("select * from {$g5['sms5_config_table']} ", false);
|
$sms5 = sql_fetch("select * from {$g5['sms5_config_table']} ", false);
|
||||||
if( $sms5['cf_member'] && trim($member['mb_hp']) ) {
|
|
||||||
$g5['sms5_use_sideview'] = true; //회원 사이드뷰 레이어에 추가
|
|
||||||
} else {
|
|
||||||
$g5['sms5_use_sideview'] = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
//==============================================================================
|
|
||||||
// 스킨경로
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
$sms5_skin_path = G5_SMS5_PATH.'/skin/'.$sms5['cf_skin']; //sms5 스킨 path
|
|
||||||
$sms5_skin_url = G5_SMS5_URL .'/skin/'.$sms5['cf_skin']; //sms5 스킨 url
|
|
||||||
|
|
||||||
// Demo 설정
|
// Demo 설정
|
||||||
if (file_exists(G5_PATH.'/DEMO'))
|
if (file_exists(G5_PATH.'/DEMO'))
|
||||||
@@ -49,9 +36,5 @@ if (!empty($config['cf_sms_use'])) {
|
|||||||
// 아이코드에 실제로 보내지 않고 가상(Random)으로 전송결과를 저장합니다.
|
// 아이코드에 실제로 보내지 않고 가상(Random)으로 전송결과를 저장합니다.
|
||||||
$g5['sms5_demo_send'] = true;
|
$g5['sms5_demo_send'] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
include_once(G5_LIB_PATH.'/icode.sms.lib.php');
|
|
||||||
include_once(G5_SMS5_PATH.'/sms5.lib.php');
|
|
||||||
|
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
+5
-35
@@ -169,13 +169,7 @@ document.onkeydown = noRefresh ;
|
|||||||
$is_euckr = true;
|
$is_euckr = true;
|
||||||
|
|
||||||
// member table 복사
|
// member table 복사
|
||||||
$columns = array();
|
$columns = sql_field_names($g5['member_table']);
|
||||||
$fields = mysql_list_fields(G5_MYSQL_DB, $g5['member_table']);
|
|
||||||
$count = mysql_num_fields($fields);
|
|
||||||
for ($i = 0; $i < $count; $i++) {
|
|
||||||
$fld = mysql_field_name($fields, $i);
|
|
||||||
$columns[] = $fld;
|
|
||||||
}
|
|
||||||
|
|
||||||
$sql = " select * from {$g4['member_table']} ";
|
$sql = " select * from {$g4['member_table']} ";
|
||||||
$result = sql_query($sql);
|
$result = sql_query($sql);
|
||||||
@@ -325,13 +319,7 @@ document.onkeydown = noRefresh ;
|
|||||||
echo '<li>visit sum table 복사</li>'.PHP_EOL;
|
echo '<li>visit sum table 복사</li>'.PHP_EOL;
|
||||||
|
|
||||||
// group table 복사
|
// group table 복사
|
||||||
$columns = array();
|
$columns = sql_field_names($g5['group_table']);
|
||||||
$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']} ";
|
$sql = " select * from {$g4['group_table']} ";
|
||||||
$result = sql_query($sql);
|
$result = sql_query($sql);
|
||||||
@@ -365,13 +353,7 @@ document.onkeydown = noRefresh ;
|
|||||||
unset($fiels);
|
unset($fiels);
|
||||||
|
|
||||||
// board 복사
|
// board 복사
|
||||||
$columns = array();
|
$columns = sql_field_names($g5['board_table']);
|
||||||
$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']} ";
|
$sql = " select * from {$g4['board_table']} ";
|
||||||
$result = sql_query($sql);
|
$result = sql_query($sql);
|
||||||
@@ -413,13 +395,7 @@ document.onkeydown = noRefresh ;
|
|||||||
// 게시글 복사
|
// 게시글 복사
|
||||||
if(sql_query($sql, FALSE)) {
|
if(sql_query($sql, FALSE)) {
|
||||||
$write_table = $g4['write_prefix'].$bo_table;
|
$write_table = $g4['write_prefix'].$bo_table;
|
||||||
$columns2 = array();
|
$columns2 = sql_field_names($create_table);
|
||||||
$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 ";
|
$sql3 = " select * from $write_table ";
|
||||||
$result3 = sql_query($sql3);
|
$result3 = sql_query($sql3);
|
||||||
@@ -461,13 +437,7 @@ document.onkeydown = noRefresh ;
|
|||||||
$tables = array('board_file', 'board_new', 'board_good', 'mail', 'memo', 'group_member', 'auth', 'popular', 'poll', 'poll_etc', 'scrap');
|
$tables = array('board_file', 'board_new', 'board_good', 'mail', 'memo', 'group_member', 'auth', 'popular', 'poll', 'poll_etc', 'scrap');
|
||||||
|
|
||||||
foreach($tables as $table) {
|
foreach($tables as $table) {
|
||||||
$columns = array();
|
$columns = sql_field_names($g5[$table.'_table']);
|
||||||
$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'];
|
$src_table = $g4[$table.'_table'];
|
||||||
$dst_table = $g5[$table.'_table'];
|
$dst_table = $g5[$table.'_table'];
|
||||||
|
|||||||
+1
-1
@@ -100,7 +100,7 @@ if ($is_member) { // 회원이라면 로그인 중이라는 메세지를 출력
|
|||||||
else if ($is_admin == 'group') $sr_admin_msg = "그룹관리자 ";
|
else if ($is_admin == 'group') $sr_admin_msg = "그룹관리자 ";
|
||||||
else if ($is_admin == 'board') $sr_admin_msg = "게시판관리자 ";
|
else if ($is_admin == 'board') $sr_admin_msg = "게시판관리자 ";
|
||||||
|
|
||||||
echo '<div id="hd_login_msg">'.$sr_admin_msg.$member['mb_nick'].'님 로그인 중 ';
|
echo '<div id="hd_login_msg">'.$sr_admin_msg.get_text($member['mb_nick']).'님 로그인 중 ';
|
||||||
echo '<a href="'.G5_BBS_URL.'/logout.php">로그아웃</a></div>';
|
echo '<a href="'.G5_BBS_URL.'/logout.php">로그아웃</a></div>';
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
@@ -285,8 +285,9 @@ CREATE TABLE IF NOT EXISTS `g5_config` (
|
|||||||
`cf_cert_limit` int(11) NOT NULL DEFAULT '0',
|
`cf_cert_limit` int(11) NOT NULL DEFAULT '0',
|
||||||
`cf_cert_req` tinyint(4) NOT NULL DEFAULT '0',
|
`cf_cert_req` tinyint(4) NOT NULL DEFAULT '0',
|
||||||
`cf_sms_use` varchar(255) NOT NULL DEFAULT '',
|
`cf_sms_use` varchar(255) NOT NULL DEFAULT '',
|
||||||
|
`cf_sms_type` varchar(10) NOT NULL DEFAULT '',
|
||||||
`cf_icode_id` varchar(255) NOT NULL DEFAULT '',
|
`cf_icode_id` varchar(255) NOT NULL DEFAULT '',
|
||||||
`cf_icode_pw` 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_ip` varchar(255) NOT NULL DEFAULT '',
|
||||||
`cf_icode_server_port` varchar(255) NOT NULL DEFAULT '',
|
`cf_icode_server_port` varchar(255) NOT NULL DEFAULT '',
|
||||||
`cf_googl_shorturl_apikey` varchar(255) NOT NULL DEFAULT '',
|
`cf_googl_shorturl_apikey` varchar(255) NOT NULL DEFAULT '',
|
||||||
|
|||||||
+19
-13
@@ -8,6 +8,8 @@ header('Cache-Control: pre-check=0, post-check=0, max-age=0'); // HTTP/1.1
|
|||||||
header('Pragma: no-cache'); // HTTP/1.0
|
header('Pragma: no-cache'); // HTTP/1.0
|
||||||
|
|
||||||
include_once ('../config.php');
|
include_once ('../config.php');
|
||||||
|
include_once ('../lib/common.lib.php');
|
||||||
|
|
||||||
$title = G5_VERSION." 설치 완료 3/3";
|
$title = G5_VERSION." 설치 완료 3/3";
|
||||||
include_once ('./install.inc.php');
|
include_once ('./install.inc.php');
|
||||||
|
|
||||||
@@ -23,7 +25,7 @@ $admin_pass = $_POST['admin_pass'];
|
|||||||
$admin_name = $_POST['admin_name'];
|
$admin_name = $_POST['admin_name'];
|
||||||
$admin_email = $_POST['admin_email'];
|
$admin_email = $_POST['admin_email'];
|
||||||
|
|
||||||
$dblink = @mysql_connect($mysql_host, $mysql_user, $mysql_pass);
|
$dblink = sql_connect($mysql_host, $mysql_user, $mysql_pass, $mysql_db);
|
||||||
if (!$dblink) {
|
if (!$dblink) {
|
||||||
?>
|
?>
|
||||||
|
|
||||||
@@ -37,7 +39,7 @@ if (!$dblink) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
$select_db = @mysql_select_db($mysql_db, $dblink);
|
$select_db = sql_select_db($mysql_db, $dblink);
|
||||||
if (!$select_db) {
|
if (!$select_db) {
|
||||||
?>
|
?>
|
||||||
|
|
||||||
@@ -52,11 +54,15 @@ if (!$select_db) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$mysql_set_mode = 'false';
|
$mysql_set_mode = 'false';
|
||||||
@mysql_query('set names utf8');
|
sql_set_charset('utf8', $dblink);
|
||||||
if(version_compare(mysql_get_server_info(), '5.6.6', '>=') == 1) {
|
$result = sql_query(" SELECT @@sql_mode as mode ", true, $dblink);
|
||||||
@mysql_query("SET SESSION sql_mode = ''");
|
$row = sql_fetch_array($result);
|
||||||
|
if($row['mode']) {
|
||||||
|
sql_query("SET SESSION sql_mode = ''", true, $dblink);
|
||||||
$mysql_set_mode = 'true';
|
$mysql_set_mode = 'true';
|
||||||
}
|
}
|
||||||
|
unset($result);
|
||||||
|
unset($row);
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div class="ins_inner">
|
<div class="ins_inner">
|
||||||
@@ -73,7 +79,7 @@ $file = preg_replace('/`g5_([^`]+`)/', '`'.$table_prefix.'$1', $file);
|
|||||||
$f = explode(';', $file);
|
$f = explode(';', $file);
|
||||||
for ($i=0; $i<count($f); $i++) {
|
for ($i=0; $i<count($f); $i++) {
|
||||||
if (trim($f[$i]) == '') continue;
|
if (trim($f[$i]) == '') continue;
|
||||||
mysql_query($f[$i]) or die(mysql_error());
|
sql_query($f[$i], true, $dblink);
|
||||||
}
|
}
|
||||||
// 테이블 생성 ------------------------------------
|
// 테이블 생성 ------------------------------------
|
||||||
?>
|
?>
|
||||||
@@ -152,14 +158,14 @@ $sql = " insert into `{$table_prefix}config`
|
|||||||
cf_stipulation = '해당 홈페이지에 맞는 회원가입약관을 입력합니다.',
|
cf_stipulation = '해당 홈페이지에 맞는 회원가입약관을 입력합니다.',
|
||||||
cf_privacy = '해당 홈페이지에 맞는 개인정보처리방침을 입력합니다.'
|
cf_privacy = '해당 홈페이지에 맞는 개인정보처리방침을 입력합니다.'
|
||||||
";
|
";
|
||||||
mysql_query($sql) or die(mysql_error() . "<p>" . $sql);
|
sql_query($sql, true, $dblink);
|
||||||
|
|
||||||
// 1:1문의 설정
|
// 1:1문의 설정
|
||||||
$sql = " insert into `{$table_prefix}qa_config`
|
$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 )
|
( 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
|
values
|
||||||
( '1:1문의', '회원|포인트', 'basic', 'basic', '1', '0', '1', '0', '1', '60', '30', '15', '15', '600', '1048576', '' ) ";
|
( '1:1문의', '회원|포인트', 'basic', 'basic', '1', '0', '1', '0', '1', '60', '30', '15', '15', '600', '1048576', '' ) ";
|
||||||
mysql_query($sql);
|
sql_query($sql, true, $dblink);
|
||||||
|
|
||||||
// 관리자 회원가입
|
// 관리자 회원가입
|
||||||
$sql = " insert into `{$table_prefix}member`
|
$sql = " insert into `{$table_prefix}member`
|
||||||
@@ -175,15 +181,15 @@ $sql = " insert into `{$table_prefix}member`
|
|||||||
mb_datetime = '".G5_TIME_YMDHIS."',
|
mb_datetime = '".G5_TIME_YMDHIS."',
|
||||||
mb_ip = '{$_SERVER['REMOTE_ADDR']}'
|
mb_ip = '{$_SERVER['REMOTE_ADDR']}'
|
||||||
";
|
";
|
||||||
@mysql_query($sql);
|
sql_query($sql, true, $dblink);
|
||||||
|
|
||||||
// 내용관리 생성
|
// 내용관리 생성
|
||||||
@mysql_query(" insert into `{$table_prefix}content` set co_id = 'company', co_html = '1', co_subject = '회사소개', co_content= '<p align=center><b>회사소개에 대한 내용을 입력하십시오.</b></p>' ") or die(mysql_error() . "<p>" . $sql);
|
sql_query(" insert into `{$table_prefix}content` set co_id = 'company', co_html = '1', co_subject = '회사소개', co_content= '<p align=center><b>회사소개에 대한 내용을 입력하십시오.</b></p>' ", true, $dblink);
|
||||||
@mysql_query(" insert into `{$table_prefix}content` set co_id = 'privacy', co_html = '1', co_subject = '개인정보 처리방침', co_content= '<p align=center><b>개인정보 처리방침에 대한 내용을 입력하십시오.</b></p>' ") or die(mysql_error() . "<p>" . $sql);
|
sql_query(" insert into `{$table_prefix}content` set co_id = 'privacy', co_html = '1', co_subject = '개인정보 처리방침', co_content= '<p align=center><b>개인정보 처리방침에 대한 내용을 입력하십시오.</b></p>' ", true, $dblink);
|
||||||
@mysql_query(" insert into `{$table_prefix}content` set co_id = 'provision', co_html = '1', co_subject = '서비스 이용약관', co_content= '<p align=center><b>서비스 이용약관에 대한 내용을 입력하십시오.</b></p>' ") or die(mysql_error() . "<p>" . $sql);
|
sql_query(" insert into `{$table_prefix}content` set co_id = 'provision', co_html = '1', co_subject = '서비스 이용약관', co_content= '<p align=center><b>서비스 이용약관에 대한 내용을 입력하십시오.</b></p>' ", true, $dblink);
|
||||||
|
|
||||||
// FAQ Master
|
// FAQ Master
|
||||||
@mysql_query(" insert into `{$table_prefix}faq_master` set fm_id = '1', fm_subject = '자주하시는 질문' ") or die(mysql_error() . "<p>" . $sql);
|
sql_query(" insert into `{$table_prefix}faq_master` set fm_id = '1', fm_subject = '자주하시는 질문' ", true, $dblink);
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<li>DB설정 완료</li>
|
<li>DB설정 완료</li>
|
||||||
|
|||||||
+21
-14
@@ -7,13 +7,18 @@ var save_wr_content = null;
|
|||||||
|
|
||||||
function autosave() {
|
function autosave() {
|
||||||
$("form#fwrite").each(function() {
|
$("form#fwrite").each(function() {
|
||||||
if (g5_editor.indexOf("ckeditor4") != -1 && typeof(CKEDITOR.instances.wr_content)!="undefined") {
|
if(g5_editor != "") {
|
||||||
this.wr_content.value = CKEDITOR.instances.wr_content.getData();
|
if (g5_editor.indexOf("ckeditor4") != -1 && typeof(CKEDITOR.instances.wr_content)!="undefined") {
|
||||||
} else if (g5_editor.indexOf("cheditor5") != -1 && typeof(ed_wr_content)!="undefined") {
|
this.wr_content.value = CKEDITOR.instances.wr_content.getData();
|
||||||
this.wr_content.value = ed_wr_content.outputBodyHTML();
|
} else if (g5_editor.indexOf("cheditor5") != -1 && typeof(ed_wr_content)!="undefined") {
|
||||||
} else if (g5_editor.indexOf("smarteditor2") != -1 && typeof(oEditors)!="undefined" && typeof(oEditors.getById['wr_content'])!="undefined" ) {
|
this.wr_content.value = ed_wr_content.outputBodyHTML();
|
||||||
this.wr_content.value = oEditors.getById['wr_content'].getIR();
|
} else {
|
||||||
|
if(typeof get_editor_wr_content == "function") {
|
||||||
|
this.wr_content.value = get_editor_wr_content();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 변수에 저장해 놓은 값과 다를 경우에만 임시 저장함
|
// 변수에 저장해 놓은 값과 다를 경우에만 임시 저장함
|
||||||
if (save_wr_subject != this.wr_subject.value || save_wr_content != this.wr_content.value) {
|
if (save_wr_subject != this.wr_subject.value || save_wr_content != this.wr_content.value) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
@@ -78,14 +83,16 @@ $(function(){
|
|||||||
var subject = $(data).find("item").find("subject").text();
|
var subject = $(data).find("item").find("subject").text();
|
||||||
var content = $(data).find("item").find("content").text();
|
var content = $(data).find("item").find("content").text();
|
||||||
$("#wr_subject").val(subject);
|
$("#wr_subject").val(subject);
|
||||||
if (g5_editor.indexOf("ckeditor4") != -1 && typeof(CKEDITOR.instances.wr_content)!="undefined") {
|
if(g5_editor != "") {
|
||||||
CKEDITOR.instances.wr_content.setData(content);
|
if (g5_editor.indexOf("ckeditor4") != -1 && typeof(CKEDITOR.instances.wr_content)!="undefined") {
|
||||||
} else if (g5_editor.indexOf("cheditor5") != -1 && typeof(ed_wr_content)!="undefined") {
|
CKEDITOR.instances.wr_content.setData(content);
|
||||||
ed_wr_content.putContents(content);
|
} else if (g5_editor.indexOf("cheditor5") != -1 && typeof(ed_wr_content)!="undefined") {
|
||||||
} else if (g5_editor.indexOf("smarteditor2") != -1 && typeof(oEditors)!="undefined" && typeof(oEditors.getById['wr_content'])!="undefined" ) {
|
ed_wr_content.putContents(content);
|
||||||
oEditors.getById["wr_content"].exec("SET_CONTENTS", [""]);
|
} else {
|
||||||
//oEditors.getById["wr_content"].exec("SET_IR", [""]);
|
if(typeof put_editor_wr_content == "function") {
|
||||||
oEditors.getById["wr_content"].exec("PASTE_HTML", [content]);
|
put_editor_wr_content(content);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
$("#fwrite #wr_content").val(content);
|
$("#fwrite #wr_content").val(content);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -503,14 +503,6 @@ var win_zip = function(frm_name, frm_zip, frm_addr1, frm_addr2, frm_addr3, frm_j
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* sms5 창
|
|
||||||
**/
|
|
||||||
var win_sms5 = function(href) {
|
|
||||||
var new_win = window.open(href, 'win_sms5', 'width=474, height=560, scrollbars=1');
|
|
||||||
new_win.focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 새로운 비밀번호 분실 창 : 101123
|
* 새로운 비밀번호 분실 창 : 101123
|
||||||
**/
|
**/
|
||||||
@@ -590,11 +582,6 @@ $(function(){
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$(".win_sms5").click(function() {
|
|
||||||
win_sms5(this.href);
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
$(".win_poll").click(function() {
|
$(".win_poll").click(function() {
|
||||||
win_poll(this.href);
|
win_poll(this.href);
|
||||||
|
|||||||
+192
-59
@@ -380,11 +380,12 @@ function get_list($write_row, $board, $skin_url, $subject_len=40)
|
|||||||
else
|
else
|
||||||
$list['last2'] = substr($list['last2'],5,5);
|
$list['last2'] = substr($list['last2'],5,5);
|
||||||
|
|
||||||
$list['wr_homepage'] = get_text(addslashes($list['wr_homepage']));
|
$list['wr_homepage'] = get_text($list['wr_homepage']);
|
||||||
|
|
||||||
$tmp_name = get_text(cut_str($list['wr_name'], $config['cf_cut_name'])); // 설정된 자리수 만큼만 이름 출력
|
$tmp_name = get_text(cut_str($list['wr_name'], $config['cf_cut_name'])); // 설정된 자리수 만큼만 이름 출력
|
||||||
|
$tmp_name2 = cut_str($list['wr_name'], $config['cf_cut_name']); // 설정된 자리수 만큼만 이름 출력
|
||||||
if ($board['bo_use_sideview'])
|
if ($board['bo_use_sideview'])
|
||||||
$list['name'] = get_sideview($list['mb_id'], $tmp_name, $list['wr_email'], $list['wr_homepage']);
|
$list['name'] = get_sideview($list['mb_id'], $tmp_name2, $list['wr_email'], $list['wr_homepage']);
|
||||||
else
|
else
|
||||||
$list['name'] = '<span class="'.($list['mb_id']?'sv_member':'sv_guest').'">'.$tmp_name.'</span>';
|
$list['name'] = '<span class="'.($list['mb_id']?'sv_member':'sv_guest').'">'.$tmp_name.'</span>';
|
||||||
|
|
||||||
@@ -1201,10 +1202,9 @@ function get_sideview($mb_id, $name='', $email='', $homepage='')
|
|||||||
$email = base64_encode($email);
|
$email = base64_encode($email);
|
||||||
$homepage = set_http(clean_xss_tags($homepage));
|
$homepage = set_http(clean_xss_tags($homepage));
|
||||||
|
|
||||||
$name = preg_replace("/\'/", "", $name);
|
$name = get_text($name, 0, true);
|
||||||
$name = preg_replace("/\'/", "", $name);
|
$email = get_text($email);
|
||||||
$name = preg_replace("/\"/", """, $name);
|
$homepage = get_text($homepage);
|
||||||
$title_name = $name;
|
|
||||||
|
|
||||||
$tmp_name = "";
|
$tmp_name = "";
|
||||||
if ($mb_id) {
|
if ($mb_id) {
|
||||||
@@ -1240,10 +1240,6 @@ function get_sideview($mb_id, $name='', $email='', $homepage='')
|
|||||||
$title_mb_id = '[비회원]';
|
$title_mb_id = '[비회원]';
|
||||||
}
|
}
|
||||||
|
|
||||||
$name = get_text($name);
|
|
||||||
$email = get_text($email);
|
|
||||||
$homepage = get_text($homepage);
|
|
||||||
|
|
||||||
$str = "<span class=\"sv_wrap\">\n";
|
$str = "<span class=\"sv_wrap\">\n";
|
||||||
$str .= $tmp_name."\n";
|
$str .= $tmp_name."\n";
|
||||||
|
|
||||||
@@ -1264,10 +1260,6 @@ function get_sideview($mb_id, $name='', $email='', $homepage='')
|
|||||||
}
|
}
|
||||||
if($mb_id)
|
if($mb_id)
|
||||||
$str2 .= "<a href=\"".G5_BBS_URL."/new.php?mb_id=".$mb_id."\">전체게시물</a>\n";
|
$str2 .= "<a href=\"".G5_BBS_URL."/new.php?mb_id=".$mb_id."\">전체게시물</a>\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 .= "<a href=\"".G5_SMS5_URL."/?mb_id=".$mb_id."\" class=\"win_sms5\" target=\"_blank\">문자보내기</a>\n";
|
|
||||||
}
|
|
||||||
if($is_admin == "super" && $mb_id) {
|
if($is_admin == "super" && $mb_id) {
|
||||||
$str2 .= "<a href=\"".G5_ADMIN_URL."/member_form.php?w=u&mb_id=".$mb_id."\" target=\"_blank\">회원정보변경</a>\n";
|
$str2 .= "<a href=\"".G5_ADMIN_URL."/member_form.php?w=u&mb_id=".$mb_id."\" target=\"_blank\">회원정보변경</a>\n";
|
||||||
$str2 .= "<a href=\"".G5_ADMIN_URL."/point_list.php?sfl=mb_id&stx=".$mb_id."\" target=\"_blank\">포인트내역</a>\n";
|
$str2 .= "<a href=\"".G5_ADMIN_URL."/point_list.php?sfl=mb_id&stx=".$mb_id."\" target=\"_blank\">포인트내역</a>\n";
|
||||||
@@ -1365,12 +1357,19 @@ function cut_str($str, $len, $suffix="…")
|
|||||||
|
|
||||||
|
|
||||||
// TEXT 형식으로 변환
|
// TEXT 형식으로 변환
|
||||||
function get_text($str, $html=0)
|
function get_text($str, $html=0, $restore=false)
|
||||||
{
|
{
|
||||||
/* 3.22 막음 (HTML 체크 줄바꿈시 출력 오류때문)
|
$source[] = "<";
|
||||||
$source[] = "/ /";
|
$target[] = "<";
|
||||||
$target[] = " ";
|
$source[] = ">";
|
||||||
*/
|
$target[] = ">";
|
||||||
|
$source[] = "\"";
|
||||||
|
$target[] = """;
|
||||||
|
$source[] = "\'";
|
||||||
|
$target[] = "'";
|
||||||
|
|
||||||
|
if($restore)
|
||||||
|
$str = str_replace($target, $source, $str);
|
||||||
|
|
||||||
// 3.31
|
// 3.31
|
||||||
// TEXT 출력일 경우 & 등의 코드를 정상으로 출력해 주기 위함
|
// TEXT 출력일 경우 & 등의 코드를 정상으로 출력해 주기 위함
|
||||||
@@ -1378,21 +1377,12 @@ function get_text($str, $html=0)
|
|||||||
$str = html_symbol($str);
|
$str = html_symbol($str);
|
||||||
}
|
}
|
||||||
|
|
||||||
$source[] = "/</";
|
|
||||||
$target[] = "<";
|
|
||||||
$source[] = "/>/";
|
|
||||||
$target[] = ">";
|
|
||||||
//$source[] = "/\"/";
|
|
||||||
//$target[] = """;
|
|
||||||
$source[] = "/\'/";
|
|
||||||
$target[] = "'";
|
|
||||||
//$source[] = "/}/"; $target[] = "}";
|
|
||||||
if ($html) {
|
if ($html) {
|
||||||
$source[] = "/\n/";
|
$source[] = "\n";
|
||||||
$target[] = "<br/>";
|
$target[] = "<br/>";
|
||||||
}
|
}
|
||||||
|
|
||||||
return preg_replace($source, $target, $str);
|
return str_replace($source, $target, $str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1422,11 +1412,22 @@ function html_symbol($str)
|
|||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
// DB 연결
|
// DB 연결
|
||||||
function sql_connect($host, $user, $pass)
|
function sql_connect($host, $user, $pass, $db=G5_MYSQL_DB)
|
||||||
{
|
{
|
||||||
global $g5;
|
global $g5;
|
||||||
|
|
||||||
return @mysql_connect($host, $user, $pass);
|
if(function_exists('mysqli_connect') && G5_MYSQLI_USE) {
|
||||||
|
$link = mysqli_connect($host, $user, $pass, $db);
|
||||||
|
|
||||||
|
// 연결 오류 발생 시 스크립트 종료
|
||||||
|
if (mysqli_connect_errno()) {
|
||||||
|
die('Connect Error: '.mysqli_connect_error());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$link = mysql_connect($host, $user, $pass);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $link;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1435,16 +1436,36 @@ function sql_select_db($db, $connect)
|
|||||||
{
|
{
|
||||||
global $g5;
|
global $g5;
|
||||||
|
|
||||||
return @mysql_select_db($db, $connect);
|
if(function_exists('mysqli_select_db') && G5_MYSQLI_USE)
|
||||||
|
return @mysqli_select_db($connect, $db);
|
||||||
|
else
|
||||||
|
return @mysql_select_db($db, $connect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// mysql_query 와 mysql_error 를 한꺼번에 처리
|
function sql_set_charset($charset, $link=null)
|
||||||
// mysql connect resource 지정 - 명랑폐인님 제안
|
|
||||||
function sql_query($sql, $error=G5_DISPLAY_SQL_ERROR)
|
|
||||||
{
|
{
|
||||||
global $g5;
|
global $g5;
|
||||||
|
|
||||||
|
if(!$link)
|
||||||
|
$link = $g5['connect_db'];
|
||||||
|
|
||||||
|
if(function_exists('mysqli_set_charset') && G5_MYSQLI_USE)
|
||||||
|
mysqli_set_charset($link, $charset);
|
||||||
|
else
|
||||||
|
sql_query(" set names {$charset} ");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// mysqli_query 와 mysqli_error 를 한꺼번에 처리
|
||||||
|
// mysql connect resource 지정 - 명랑폐인님 제안
|
||||||
|
function sql_query($sql, $error=G5_DISPLAY_SQL_ERROR, $link=null)
|
||||||
|
{
|
||||||
|
global $g5;
|
||||||
|
|
||||||
|
if(!$link)
|
||||||
|
$link = $g5['connect_db'];
|
||||||
|
|
||||||
// Blind SQL Injection 취약점 해결
|
// Blind SQL Injection 취약점 해결
|
||||||
$sql = trim($sql);
|
$sql = trim($sql);
|
||||||
// union의 사용을 허락하지 않습니다.
|
// union의 사용을 허락하지 않습니다.
|
||||||
@@ -1453,20 +1474,34 @@ function sql_query($sql, $error=G5_DISPLAY_SQL_ERROR)
|
|||||||
// `information_schema` DB로의 접근을 허락하지 않습니다.
|
// `information_schema` DB로의 접근을 허락하지 않습니다.
|
||||||
$sql = preg_replace("#^select.*from.*where.*`?information_schema`?.*#i", "select 1", $sql);
|
$sql = preg_replace("#^select.*from.*where.*`?information_schema`?.*#i", "select 1", $sql);
|
||||||
|
|
||||||
if ($error)
|
if(function_exists('mysqli_query') && G5_MYSQLI_USE) {
|
||||||
$result = @mysql_query($sql, $g5['connect_db']) or die("<p>$sql<p>" . mysql_errno() . " : " . mysql_error() . "<p>error file : {$_SERVER['SCRIPT_NAME']}");
|
if ($error) {
|
||||||
else
|
$result = @mysqli_query($link, $sql) or die("<p>$sql<p>" . mysqli_errno($link) . " : " . mysqli_error($link) . "<p>error file : {$_SERVER['SCRIPT_NAME']}");
|
||||||
$result = @mysql_query($sql, $g5['connect_db']);
|
} else {
|
||||||
|
$result = @mysqli_query($link, $sql);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($error) {
|
||||||
|
$result = @mysql_query($sql, $link) or die("<p>$sql<p>" . mysql_errno() . " : " . mysql_error() . "<p>error file : {$_SERVER['SCRIPT_NAME']}");
|
||||||
|
} else {
|
||||||
|
$result = @mysql_query($sql, $link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 쿼리를 실행한 후 결과값에서 한행을 얻는다.
|
// 쿼리를 실행한 후 결과값에서 한행을 얻는다.
|
||||||
function sql_fetch($sql, $error=G5_DISPLAY_SQL_ERROR)
|
function sql_fetch($sql, $error=G5_DISPLAY_SQL_ERROR, $link=null)
|
||||||
{
|
{
|
||||||
$result = sql_query($sql, $error);
|
global $g5;
|
||||||
//$row = @sql_fetch_array($result) or die("<p>$sql<p>" . mysql_errno() . " : " . mysql_error() . "<p>error file : $_SERVER['SCRIPT_NAME']");
|
|
||||||
|
if(!$link)
|
||||||
|
$link = $g5['connect_db'];
|
||||||
|
|
||||||
|
$result = sql_query($sql, $error, $link);
|
||||||
|
//$row = @sql_fetch_array($result) or die("<p>$sql<p>" . mysqli_errno() . " : " . mysqli_error() . "<p>error file : $_SERVER['SCRIPT_NAME']");
|
||||||
$row = sql_fetch_array($result);
|
$row = sql_fetch_array($result);
|
||||||
return $row;
|
return $row;
|
||||||
}
|
}
|
||||||
@@ -1475,7 +1510,11 @@ function sql_fetch($sql, $error=G5_DISPLAY_SQL_ERROR)
|
|||||||
// 결과값에서 한행 연관배열(이름으로)로 얻는다.
|
// 결과값에서 한행 연관배열(이름으로)로 얻는다.
|
||||||
function sql_fetch_array($result)
|
function sql_fetch_array($result)
|
||||||
{
|
{
|
||||||
$row = @mysql_fetch_assoc($result);
|
if(function_exists('mysqli_fetch_assoc') && G5_MYSQLI_USE)
|
||||||
|
$row = @mysqli_fetch_assoc($result);
|
||||||
|
else
|
||||||
|
$row = @mysql_fetch_assoc($result);
|
||||||
|
|
||||||
return $row;
|
return $row;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1485,7 +1524,10 @@ function sql_fetch_array($result)
|
|||||||
// 단, 결과 값은 스크립트(script) 실행부가 종료되면서 메모리에서 자동적으로 지워진다.
|
// 단, 결과 값은 스크립트(script) 실행부가 종료되면서 메모리에서 자동적으로 지워진다.
|
||||||
function sql_free_result($result)
|
function sql_free_result($result)
|
||||||
{
|
{
|
||||||
return mysql_free_result($result);
|
if(function_exists('mysqli_free_result') && G5_MYSQLI_USE)
|
||||||
|
return mysqli_free_result($result);
|
||||||
|
else
|
||||||
|
return mysql_free_result($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1499,6 +1541,74 @@ function sql_password($value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function sql_insert_id($link=null)
|
||||||
|
{
|
||||||
|
global $g5;
|
||||||
|
|
||||||
|
if(!$link)
|
||||||
|
$link = $g5['connect_db'];
|
||||||
|
|
||||||
|
if(function_exists('mysqli_insert_id') && G5_MYSQLI_USE)
|
||||||
|
return mysqli_insert_id($link);
|
||||||
|
else
|
||||||
|
return mysql_insert_id($link);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function sql_num_rows($result)
|
||||||
|
{
|
||||||
|
if(function_exists('mysqli_num_rows') && G5_MYSQLI_USE)
|
||||||
|
return mysqli_num_rows($result);
|
||||||
|
else
|
||||||
|
return mysql_num_rows($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function sql_field_names($table, $link=null)
|
||||||
|
{
|
||||||
|
global $g5;
|
||||||
|
|
||||||
|
if(!$link)
|
||||||
|
$link = $g5['connect_db'];
|
||||||
|
|
||||||
|
$columns = array();
|
||||||
|
|
||||||
|
$sql = " select * from `$table` limit 1 ";
|
||||||
|
$result = sql_query($sql, $link);
|
||||||
|
|
||||||
|
if(function_exists('mysqli_fetch_field') && G5_MYSQLI_USE) {
|
||||||
|
while($field = mysqli_fetch_field($result)) {
|
||||||
|
$columns[] = $field->name;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$i = 0;
|
||||||
|
$cnt = mysql_num_fields($result);
|
||||||
|
while($i < $cnt) {
|
||||||
|
$field = mysql_fetch_field($result, $i);
|
||||||
|
$columns[] = $field->name;
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $columns;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function sql_error_info($link=null)
|
||||||
|
{
|
||||||
|
global $g5;
|
||||||
|
|
||||||
|
if(!$link)
|
||||||
|
$link = $g5['connect_db'];
|
||||||
|
|
||||||
|
if(function_exists('mysqli_error') && G5_MYSQLI_USE) {
|
||||||
|
return mysqli_errno($link) . ' : ' . mysqli_error($link);
|
||||||
|
} else {
|
||||||
|
return mysql_errno($link) . ' : ' . mysql_error($link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// PHPMyAdmin 참고
|
// PHPMyAdmin 참고
|
||||||
function get_table_define($table, $crlf="\n")
|
function get_table_define($table, $crlf="\n")
|
||||||
{
|
{
|
||||||
@@ -1899,12 +2009,15 @@ function convert_charset($from_charset, $to_charset, $str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// mysql_real_escape_string 의 alias 기능을 한다.
|
// mysqli_real_escape_string 의 alias 기능을 한다.
|
||||||
function sql_real_escape_string($field)
|
function sql_real_escape_string($str, $link=null)
|
||||||
{
|
{
|
||||||
global $g5;
|
global $g5;
|
||||||
|
|
||||||
return mysql_real_escape_string($field, $g5['connect_db']);
|
if(!$link)
|
||||||
|
$link = $g5['connect_db'];
|
||||||
|
|
||||||
|
return mysqli_real_escape_string($link, $str);
|
||||||
}
|
}
|
||||||
|
|
||||||
function escape_trim($field)
|
function escape_trim($field)
|
||||||
@@ -2066,7 +2179,7 @@ function delete_editor_thumbnail($contents)
|
|||||||
|
|
||||||
for($i=0; $i<count($matchs[1]); $i++) {
|
for($i=0; $i<count($matchs[1]); $i++) {
|
||||||
// 이미지 path 구함
|
// 이미지 path 구함
|
||||||
$imgurl = parse_url($matchs[1][$i]);
|
$imgurl = @parse_url($matchs[1][$i]);
|
||||||
$srcfile = $_SERVER['DOCUMENT_ROOT'].$imgurl['path'];
|
$srcfile = $_SERVER['DOCUMENT_ROOT'].$imgurl['path'];
|
||||||
|
|
||||||
$filename = preg_replace("/\.[^\.]+$/i", "", basename($srcfile));
|
$filename = preg_replace("/\.[^\.]+$/i", "", basename($srcfile));
|
||||||
@@ -2643,9 +2756,9 @@ function module_exec_check($exe, $type)
|
|||||||
// 주소출력
|
// 주소출력
|
||||||
function print_address($addr1, $addr2, $addr3, $addr4)
|
function print_address($addr1, $addr2, $addr3, $addr4)
|
||||||
{
|
{
|
||||||
$address = trim($addr1);
|
$address = get_text(trim($addr1));
|
||||||
$addr2 = trim($addr2);
|
$addr2 = get_text(trim($addr2));
|
||||||
$addr3 = trim($addr3);
|
$addr3 = get_text(trim($addr3));
|
||||||
|
|
||||||
if($addr4 == 'N') {
|
if($addr4 == 'N') {
|
||||||
if($addr2)
|
if($addr2)
|
||||||
@@ -2723,11 +2836,6 @@ function clean_xss_tags($str)
|
|||||||
{
|
{
|
||||||
$str = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $str);
|
$str = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $str);
|
||||||
|
|
||||||
$search = array('"', "'");
|
|
||||||
$replace = array('"', ''');
|
|
||||||
|
|
||||||
$str = str_replace($search, $replace, $str);
|
|
||||||
|
|
||||||
return $str;
|
return $str;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2857,7 +2965,7 @@ function check_url_host($url, $msg='', $return_url=G5_URL)
|
|||||||
if(!$msg)
|
if(!$msg)
|
||||||
$msg = 'url에 타 도메인을 지정할 수 없습니다.';
|
$msg = 'url에 타 도메인을 지정할 수 없습니다.';
|
||||||
|
|
||||||
$p = parse_url($url);
|
$p = @parse_url($url);
|
||||||
$host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']);
|
$host = preg_replace('/:[0-9]+$/', '', $_SERVER['HTTP_HOST']);
|
||||||
|
|
||||||
if ((isset($p['scheme']) && $p['scheme']) || (isset($p['host']) && $p['host'])) {
|
if ((isset($p['scheme']) && $p['scheme']) || (isset($p['host']) && $p['host'])) {
|
||||||
@@ -2962,7 +3070,7 @@ function clean_query_string($query, $amp=true)
|
|||||||
|
|
||||||
function get_device_change_url()
|
function get_device_change_url()
|
||||||
{
|
{
|
||||||
$p = parse_url(G5_URL);
|
$p = @parse_url(G5_URL);
|
||||||
$href = $p['scheme'].'://'.$p['host'];
|
$href = $p['scheme'].'://'.$p['host'];
|
||||||
if(isset($p['port']) && $p['port'])
|
if(isset($p['port']) && $p['port'])
|
||||||
$href .= ':'.$p['port'];
|
$href .= ':'.$p['port'];
|
||||||
@@ -3028,4 +3136,29 @@ function get_skin_url($dir, $skin)
|
|||||||
|
|
||||||
return str_replace(G5_PATH, G5_URL, $skin_path);
|
return str_replace(G5_PATH, G5_URL, $skin_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 발신번호 유효성 체크
|
||||||
|
function check_vaild_callback($callback){
|
||||||
|
$_callback = preg_replace('/[^0-9]/','', $callback);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1588 로시작하면 총8자리인데 7자리라 차단
|
||||||
|
* 02 로시작하면 총9자리 또는 10자리인데 11자리라차단
|
||||||
|
* 1366은 그자체가 원번호이기에 다른게 붙으면 차단
|
||||||
|
* 030으로 시작하면 총10자리 또는 11자리인데 9자리라차단
|
||||||
|
*/
|
||||||
|
|
||||||
|
if( substr($_callback,0,4) == '1588') if( strlen($_callback) != 8) return false;
|
||||||
|
if( substr($_callback,0,2) == '02') if( strlen($_callback) != 9 && strlen($_callback) != 10 ) return false;
|
||||||
|
if( substr($_callback,0,3) == '030') if( strlen($_callback) != 10 && strlen($_callback) != 11 ) return false;
|
||||||
|
|
||||||
|
if( !preg_match("/^(02|0[3-6]\d|01(0|1|3|5|6|7|8|9)|070|080|007)\-?\d{3,4}\-?\d{4,5}$/",$_callback) &&
|
||||||
|
!preg_match("/^(15|16|18)\d{2}\-?\d{4,5}$/",$_callback) ){
|
||||||
|
return false;
|
||||||
|
} else if( preg_match("/^(02|0[3-6]\d|01(0|1|3|5|6|7|8|9)|070|080)\-?0{3,4}\-?\d{4}$/",$_callback )) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
?>
|
?>
|
||||||
@@ -0,0 +1,249 @@
|
|||||||
|
<?php
|
||||||
|
if (!defined('_GNUBOARD_')) exit;
|
||||||
|
|
||||||
|
// 요금제에 따른 port 구분
|
||||||
|
function get_icode_port_type($id, $pw)
|
||||||
|
{
|
||||||
|
$userinfo = get_icode_userinfo($id, $pw);
|
||||||
|
|
||||||
|
if($userinfo['payment'] == 'A') { // 충전제
|
||||||
|
return 1;
|
||||||
|
} else if($userinfo['payment'] == 'C') { // 정액제
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SMS 발송을 관장하는 메인 클래스이다.
|
||||||
|
*
|
||||||
|
* 접속, 발송, URL발송, 결과등의 실질적으로 쓰이는 모든 부분이 포함되어 있다.
|
||||||
|
*/
|
||||||
|
class LMS {
|
||||||
|
var $icode_id;
|
||||||
|
var $icode_pw;
|
||||||
|
var $socket_host;
|
||||||
|
var $socket_port;
|
||||||
|
var $socket_portcode;
|
||||||
|
var $Data = array();
|
||||||
|
var $Result = array();
|
||||||
|
|
||||||
|
// SMS 서버 접속
|
||||||
|
function SMS_con($host, $id, $pw, $portcode) {
|
||||||
|
$this->socket_host = $host;
|
||||||
|
$this->socket_portcode = $portcode;
|
||||||
|
$this->icode_id = FillSpace($id, 10);
|
||||||
|
$this->icode_pw = FillSpace($pw, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
function Init() {
|
||||||
|
$this->Data = ""; // 발송하기 위한 패킷내용이 배열로 들어간다.
|
||||||
|
$this->Result = ""; // 발송결과값이 배열로 들어간다.
|
||||||
|
}
|
||||||
|
|
||||||
|
function Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate="", $nCount) {
|
||||||
|
|
||||||
|
// 문자 타입별 Port 설정.
|
||||||
|
$sendType = strlen($strData) > 90 ? 1 : 0; // 0: SMS / 1: LMS
|
||||||
|
|
||||||
|
/* 개발 완료 후 아래 포트를 rand 함수를 이용하는 라인으로 변경 바랍니다.*/
|
||||||
|
|
||||||
|
// 충전식
|
||||||
|
if ($this->socket_portcode == 1) {
|
||||||
|
if($sendType && $sendType == 1) {
|
||||||
|
//$this->socket_port = 8200; // LMS
|
||||||
|
$this->socket_port=(int)rand(8200,8201); // LMS
|
||||||
|
} else {
|
||||||
|
//$this->socket_port = 6295; // SMS
|
||||||
|
$this->socket_port=(int)rand(6295,6297); // SMS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 정액제
|
||||||
|
else {
|
||||||
|
if($sendType && $sendType == 1) {
|
||||||
|
//$this->socket_port = 8300; // LMS
|
||||||
|
$this->socket_port=(int)rand(8300,8301); // LMS
|
||||||
|
} else {
|
||||||
|
//$this->socket_port = 6291; // SMS
|
||||||
|
$this->socket_port=(int)rand(6291,6293); // SMS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$strCallBack = FillSpace($strCallBack, 11); // 회신번호
|
||||||
|
$strDate = FillSpace($strDate, 12); // 즉시(12byte 공백), 예약전송(YmdHi)
|
||||||
|
|
||||||
|
if ($sendType && $sendType == 1) {
|
||||||
|
|
||||||
|
/** LMS 제목 **/
|
||||||
|
/*
|
||||||
|
제목필드의 값이 없을 경우 단말기 기종및 설정에 따라 표기 방법이 다름
|
||||||
|
1.설정에서 제목필드보기 설정 Disable -> 제목필드값을 넣어도 미표기
|
||||||
|
2.설정에서 제목필드보기 설정 Enable -> 제목을 넣지 않을 경우 제목없음으로 자동표시
|
||||||
|
|
||||||
|
제목의 첫글자에 "<",">", 개행문자가 있을경우 단말기종류 및 통신사에 따라 메세지 전송실패 -> 글자를 체크하거나 취환처리요망
|
||||||
|
*/
|
||||||
|
$strSubject = str_replace("\r\n", " ", $strSubject);
|
||||||
|
$strSubject = str_replace("<", "[", $strSubject);
|
||||||
|
$strSubject = str_replace(">", "]", $strSubject);
|
||||||
|
|
||||||
|
$strSubject = FillSpace($strSubject,30);
|
||||||
|
$strData = FillSpace(CutChar($strData,1500),1500);
|
||||||
|
} else if (!$strURL) {
|
||||||
|
$strData = FillSpace(CutChar($strData,90),90);
|
||||||
|
$strCaller = FillSpace($strCaller,10);
|
||||||
|
} else {
|
||||||
|
$strURL = FillSpace($strURL,50);
|
||||||
|
}
|
||||||
|
|
||||||
|
$Error = CheckCommonTypeDest($strDest, $nCount);
|
||||||
|
$Error = is_vaild_callback($strCallBack);
|
||||||
|
$Error = CheckCommonTypeDate($strDate);
|
||||||
|
|
||||||
|
for ($i=0; $i<$nCount; $i++) {
|
||||||
|
|
||||||
|
$strDest[$i] = FillSpace($strDest[$i],11);
|
||||||
|
if ($sendType && $sendType == 1) {
|
||||||
|
$this->Data[$i] = '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strSubject.$strDate.$strData;
|
||||||
|
} else if (!$strURL) {
|
||||||
|
$this->Data[$i] = '01144 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strCaller.$strDate.$strData;
|
||||||
|
} else {
|
||||||
|
$strData = FillSpace(CheckCallCenter($strURL, $strDest[$i], $strData),80);
|
||||||
|
$this->Data[$i] = '05173 '.$this->icode_id.$this->icode_pw.$strDest[$i].$strCallBack.$strURL.$strDate.$strData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function Send() {
|
||||||
|
$fsocket = fsockopen($this->socket_host,$this->socket_port, $errno, $errstr, 2);
|
||||||
|
if (!$fsocket) return false;
|
||||||
|
set_time_limit(300);
|
||||||
|
|
||||||
|
foreach($this->Data as $puts) {
|
||||||
|
fputs($fsocket, $puts);
|
||||||
|
while(!$gets) { $gets = fgets($fsocket,30); }
|
||||||
|
$dest = substr($puts,26,11);
|
||||||
|
if (substr($gets,0,19) == "0223 00".$dest) {
|
||||||
|
$this->Result[] = $dest.":".substr($gets,19,10);
|
||||||
|
} else {
|
||||||
|
$this->Result[$dest] = $dest.":Error(".substr($gets,6,2).")";
|
||||||
|
}
|
||||||
|
$gets = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose($fsocket);
|
||||||
|
$this->Data = "";
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 원하는 문자열의 길이를 원하는 길이만큼 공백을 넣어 맞추도록 합니다.
|
||||||
|
*
|
||||||
|
* @param text 원하는 문자열입니다.
|
||||||
|
* size 원하는 길이입니다.
|
||||||
|
* @return 변경된 문자열을 넘깁니다.
|
||||||
|
*/
|
||||||
|
function FillSpace($text,$size) {
|
||||||
|
for ($i=0; $i<$size; $i++) $text.= " ";
|
||||||
|
$text = substr($text,0,$size);
|
||||||
|
return $text;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 원하는 문자열을 원하는 길에 맞는지 확인해서 조정하는 기능을 합니다.
|
||||||
|
*
|
||||||
|
* @param word 원하는 문자열입니다.
|
||||||
|
* cut 원하는 길이입니다.
|
||||||
|
* @return 변경된 문자열입니다.
|
||||||
|
*/
|
||||||
|
function CutChar($word, $cut) {
|
||||||
|
$word=substr($word,0,$cut); // 필요한 길이만큼 취함.
|
||||||
|
for ($k = $cut-1; $k > 1; $k--) {
|
||||||
|
if (ord(substr($word,$k,1))<128) break; // 한글값은 160 이상.
|
||||||
|
}
|
||||||
|
$word = substr($word, 0, $cut-($cut-$k+1)%2);
|
||||||
|
return $word;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 수신번호의 값이 정확한 값인지 확인합니다.
|
||||||
|
*
|
||||||
|
* @param strDest 발송번호 배열입니다.
|
||||||
|
* nCount 배열의 크기입니다.
|
||||||
|
* @return 처리결과입니다.
|
||||||
|
*/
|
||||||
|
function CheckCommonTypeDest($strDest, $nCount) {
|
||||||
|
for ($i=0; $i<$nCount; $i++) {
|
||||||
|
$strDest[$i] = preg_replace("/[^0-9]/","",$strDest[$i]);
|
||||||
|
if(!preg_match("/^01[0-9]{8,9}$/", $strDest[$i]))
|
||||||
|
return "수신번호오류";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 회신번호 유효성 여부조회 *
|
||||||
|
* @param string callback 회신번호
|
||||||
|
* @return 처리결과입니다
|
||||||
|
* 한국인터넷진흥원 권고
|
||||||
|
*/
|
||||||
|
function is_vaild_callback($callback){
|
||||||
|
|
||||||
|
$_callback = preg_replace('/[^0-9]/', '', $callback);
|
||||||
|
|
||||||
|
if (!preg_match("/^(02|0[3-6]\d|01(0|1|3|5|6|7|8|9)|070|080|007)\-?\d{3,4}\-?\d{4,5}$/", $_callback) &&
|
||||||
|
!preg_match("/^(15|16|18)\d{2}\-?\d{4,5}$/", $_callback)){
|
||||||
|
return "회신번호오류";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (preg_match("/^(02|0[3-6]\d|01(0|1|3|5|6|7|8|9)|070|080)\-?0{3,4}\-?\d{4}$/", $_callback)){
|
||||||
|
return "회신번호오류";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 예약날짜의 값이 정확한 값인지 확인합니다.
|
||||||
|
*
|
||||||
|
* @param string strDate (예약시간)
|
||||||
|
* @return 처리결과입니다
|
||||||
|
*/
|
||||||
|
function CheckCommonTypeDate($strDate) {
|
||||||
|
$strDate = preg_replace("/[^0-9]/", "", $strDate);
|
||||||
|
if ($strDate){
|
||||||
|
if (!checkdate(substr($strDate,4,2),substr($strDate,6,2),substr($rsvTime,0,4)))
|
||||||
|
return "예약날짜오류";
|
||||||
|
if (substr($strDate,8,2)>23 || substr($strDate,10,2)>59) return false;
|
||||||
|
return "예약날짜오류";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* URL콜백용으로 메세지 크기를 수정합니다.
|
||||||
|
*
|
||||||
|
* @param url URL 내용입니다.
|
||||||
|
* msg 결과메시지입니다.
|
||||||
|
* desk 문자내용입니다.
|
||||||
|
*/
|
||||||
|
function CheckCallCenter($url, $dest, $data) {
|
||||||
|
switch (substr($dest,0,3)) {
|
||||||
|
case '010': //20바이트
|
||||||
|
return CutChar($data,20); break;
|
||||||
|
case '011': //80바이트
|
||||||
|
return CutChar($data,80); break;
|
||||||
|
case '016': // 80바이트
|
||||||
|
return CutChar($data,80); break;
|
||||||
|
case '017': // URL 포함 80바이트
|
||||||
|
return CutChar($data,80 - strlen($url)); break;
|
||||||
|
case '018': // 20바이트
|
||||||
|
return CutChar($data,20); break;
|
||||||
|
case '019': // 20바이트
|
||||||
|
return CutChar($data,20); break;
|
||||||
|
default:
|
||||||
|
return CutChar($data,80); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
@@ -7,7 +7,7 @@ function outlogin($skin_dir='basic')
|
|||||||
global $config, $member, $g5, $urlencode, $is_admin, $is_member;
|
global $config, $member, $g5, $urlencode, $is_admin, $is_member;
|
||||||
|
|
||||||
if (array_key_exists('mb_nick', $member)) {
|
if (array_key_exists('mb_nick', $member)) {
|
||||||
$nick = cut_str($member['mb_nick'], $config['cf_cut_name']);
|
$nick = get_text(cut_str($member['mb_nick'], $config['cf_cut_name']));
|
||||||
}
|
}
|
||||||
if (array_key_exists('mb_point', $member)) {
|
if (array_key_exists('mb_point', $member)) {
|
||||||
$point = number_format($member['mb_point']);
|
$point = number_format($member['mb_point']);
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@ function popular($skin_dir='basic', $pop_cnt=7, $date_cnt=3)
|
|||||||
for ($i=0; $row=sql_fetch_array($result); $i++) {
|
for ($i=0; $row=sql_fetch_array($result); $i++) {
|
||||||
$list[$i] = $row;
|
$list[$i] = $row;
|
||||||
// 스크립트등의 실행금지
|
// 스크립트등의 실행금지
|
||||||
$list[$i]['pp_word'] = get_text($list[$i]['pp_word']);
|
//$list[$i]['pp_word'] = get_text($list[$i]['pp_word']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(preg_match('#^theme/(.+)$#', $skin_dir, $match)) {
|
if(preg_match('#^theme/(.+)$#', $skin_dir, $match)) {
|
||||||
|
|||||||
@@ -59,15 +59,19 @@ function get_list_thumbnail($bo_table, $wr_id, $thumb_width, $thumb_height, $is_
|
|||||||
|
|
||||||
if($tname) {
|
if($tname) {
|
||||||
if($edt) {
|
if($edt) {
|
||||||
|
// 오리지날 이미지
|
||||||
|
$ori = G5_URL.$data_path;
|
||||||
|
// 썸네일 이미지
|
||||||
$src = G5_URL.str_replace($filename, $tname, $data_path);
|
$src = G5_URL.str_replace($filename, $tname, $data_path);
|
||||||
} else {
|
} else {
|
||||||
|
$ori = G5_DATA_URL.'/file/'.$bo_table.'/'.$filename;
|
||||||
$src = G5_DATA_URL.'/file/'.$bo_table.'/'.$tname;
|
$src = G5_DATA_URL.'/file/'.$bo_table.'/'.$tname;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$thumb = array("src"=>$src, "alt"=>$alt);
|
$thumb = array("src"=>$src, "ori"=>$ori, "alt"=>$alt);
|
||||||
|
|
||||||
return $thumb;
|
return $thumb;
|
||||||
}
|
}
|
||||||
@@ -470,7 +474,7 @@ and the roundoff errors in the Gaussian blur process, are welcome.
|
|||||||
|
|
||||||
$radius = abs(round($radius)); // Only integers make sense.
|
$radius = abs(round($radius)); // Only integers make sense.
|
||||||
if ($radius == 0) {
|
if ($radius == 0) {
|
||||||
return $img; imagedestroy($img); break; }
|
return $img; imagedestroy($img); }
|
||||||
$w = imagesx($img); $h = imagesy($img);
|
$w = imagesx($img); $h = imagesy($img);
|
||||||
$imgCanvas = imagecreatetruecolor($w, $h);
|
$imgCanvas = imagecreatetruecolor($w, $h);
|
||||||
$imgBlur = imagecreatetruecolor($w, $h);
|
$imgBlur = imagecreatetruecolor($w, $h);
|
||||||
|
|||||||
@@ -193,8 +193,7 @@ function html_auto_br(obj)
|
|||||||
|
|
||||||
function fwrite_submit(f)
|
function fwrite_submit(f)
|
||||||
{
|
{
|
||||||
<?php echo get_editor_js('wr_content', $is_dhtml_editor); ?>
|
<?php echo $editor_js; // 에디터 사용시 자바스크립트에서 내용을 폼필드로 넣어주며 내용이 입력되었는지 검사함 ?>
|
||||||
<?php echo chk_editor_js('wr_content', $is_dhtml_editor); ?>
|
|
||||||
|
|
||||||
var subject = "";
|
var subject = "";
|
||||||
var content = "";
|
var content = "";
|
||||||
@@ -243,7 +242,7 @@ function fwrite_submit(f)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
<?php if ($is_guest) { echo chk_captcha_js(); } ?>
|
<?php echo $captcha_js; // 캡챠 사용시 자바스크립트에서 입력된 캡챠를 검사함 ?>
|
||||||
|
|
||||||
document.getElementById("btn_submit").disabled = "disabled";
|
document.getElementById("btn_submit").disabled = "disabled";
|
||||||
|
|
||||||
|
|||||||
@@ -192,8 +192,7 @@ function html_auto_br(obj)
|
|||||||
|
|
||||||
function fwrite_submit(f)
|
function fwrite_submit(f)
|
||||||
{
|
{
|
||||||
<?php echo get_editor_js('wr_content', $is_dhtml_editor); ?>
|
<?php echo $editor_js; // 에디터 사용시 자바스크립트에서 내용을 폼필드로 넣어주며 내용이 입력되었는지 검사함 ?>
|
||||||
<?php echo chk_editor_js('wr_content', $is_dhtml_editor); ?>
|
|
||||||
|
|
||||||
var subject = "";
|
var subject = "";
|
||||||
var content = "";
|
var content = "";
|
||||||
@@ -242,7 +241,7 @@ function fwrite_submit(f)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
<?php if ($is_guest) { echo chk_captcha_js(); } ?>
|
<?php echo $captcha_js; // 캡챠 사용시 자바스크립트에서 입력된 캡챠를 검사함 ?>
|
||||||
|
|
||||||
document.getElementById("btn_submit").disabled = "disabled";
|
document.getElementById("btn_submit").disabled = "disabled";
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">',
|
|||||||
<input type="hidden" name="attach" value="2">
|
<input type="hidden" name="attach" value="2">
|
||||||
<input type="hidden" name="token" value="<?php echo $token ?>">
|
<input type="hidden" name="token" value="<?php echo $token ?>">
|
||||||
<?php if ($is_member) { // 회원이면 ?>
|
<?php if ($is_member) { // 회원이면 ?>
|
||||||
<input type="hidden" name="fnick" value="<?php echo $member['mb_nick'] ?>">
|
<input type="hidden" name="fnick" value="<?php echo get_text($member['mb_nick']); ?>">
|
||||||
<input type="hidden" name="fmail" value="<?php echo $member['mb_email'] ?>">
|
<input type="hidden" name="fmail" value="<?php echo $member['mb_email'] ?>">
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">',
|
|||||||
<ul id="memo_list_ul">
|
<ul id="memo_list_ul">
|
||||||
<?php for ($i=0; $i<count($list); $i++) { ?>
|
<?php for ($i=0; $i<count($list); $i++) { ?>
|
||||||
<li>
|
<li>
|
||||||
<a href="<?php echo $list[$i]['view_href'] ?>" class="memo_link"><?php echo $list[$i]['send_datetime'] ?> 에 받은 쪽지</a>
|
<a href="<?php echo $list[$i]['view_href'] ?>" class="memo_link"><?php echo $list[$i]['send_datetime'] ?> 에 <?php echo ($kind == "recv") ? "받은" : "보낸"; ?> 쪽지</a>
|
||||||
<span class="memo_read"><?php echo $list[$i]['read_datetime'] ?></span>
|
<span class="memo_read"><?php echo $list[$i]['read_datetime'] ?></span>
|
||||||
<span class="memo_send"><?php echo $list[$i]['name'] ?></span>
|
<span class="memo_send"><?php echo $list[$i]['name'] ?></span>
|
||||||
<a href="<?php echo $list[$i]['del_href'] ?>" onclick="del(this.href); return false;" class="memo_del">삭제</a>
|
<a href="<?php echo $list[$i]['del_href'] ?>" onclick="del(this.href); return false;" class="memo_del">삭제</a>
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">',
|
|||||||
<input type="hidden" name="cert_no" value="">
|
<input type="hidden" name="cert_no" value="">
|
||||||
<?php if (isset($member['mb_sex'])) { ?><input type="hidden" name="mb_sex" value="<?php echo $member['mb_sex'] ?>"><?php } ?>
|
<?php if (isset($member['mb_sex'])) { ?><input type="hidden" name="mb_sex" value="<?php echo $member['mb_sex'] ?>"><?php } ?>
|
||||||
<?php if (isset($member['mb_nick_date']) && $member['mb_nick_date'] > date("Y-m-d", G5_SERVER_TIME - ($config['cf_nick_modify'] * 86400))) { // 닉네임수정일이 지나지 않았다면 ?>
|
<?php if (isset($member['mb_nick_date']) && $member['mb_nick_date'] > date("Y-m-d", G5_SERVER_TIME - ($config['cf_nick_modify'] * 86400))) { // 닉네임수정일이 지나지 않았다면 ?>
|
||||||
<input type="hidden" name="mb_nick_default" value="<?php echo $member['mb_nick'] ?>">
|
<input type="hidden" name="mb_nick_default" value="<?php echo get_text($member['mb_nick']) ?>">
|
||||||
<input type="hidden" name="mb_nick" value="<?php echo $member['mb_nick'] ?>">
|
<input type="hidden" name="mb_nick" value="<?php echo get_text($member['mb_nick']) ?>">
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<div class="tbl_frm01 tbl_wrap">
|
<div class="tbl_frm01 tbl_wrap">
|
||||||
@@ -55,7 +55,7 @@ add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">',
|
|||||||
<?php if ($config['cf_cert_use']) { ?>
|
<?php if ($config['cf_cert_use']) { ?>
|
||||||
<span class="frm_info">아이핀 본인확인 후에는 이름이 자동 입력되고 휴대폰 본인확인 후에는 이름과 휴대폰번호가 자동 입력되어 수동으로 입력할수 없게 됩니다.</span>
|
<span class="frm_info">아이핀 본인확인 후에는 이름이 자동 입력되고 휴대폰 본인확인 후에는 이름과 휴대폰번호가 자동 입력되어 수동으로 입력할수 없게 됩니다.</span>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
<input type="text" id="reg_mb_name" name="mb_name" value="<?php echo $member['mb_name'] ?>" <?php echo $required ?> <?php echo $readonly; ?> class="frm_input <?php echo $required ?> <?php echo $readonly ?>">
|
<input type="text" id="reg_mb_name" name="mb_name" value="<?php echo get_text($member['mb_name']) ?>" <?php echo $required ?> <?php echo $readonly; ?> class="frm_input <?php echo $required ?> <?php echo $readonly ?>">
|
||||||
<?php
|
<?php
|
||||||
if($config['cf_cert_use']) {
|
if($config['cf_cert_use']) {
|
||||||
if($config['cf_cert_ipin'])
|
if($config['cf_cert_ipin'])
|
||||||
@@ -87,8 +87,8 @@ add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">',
|
|||||||
공백없이 한글,영문,숫자만 입력 가능 (한글2자, 영문4자 이상)<br>
|
공백없이 한글,영문,숫자만 입력 가능 (한글2자, 영문4자 이상)<br>
|
||||||
닉네임을 바꾸시면 앞으로 <?php echo (int)$config['cf_nick_modify'] ?>일 이내에는 변경 할 수 없습니다.
|
닉네임을 바꾸시면 앞으로 <?php echo (int)$config['cf_nick_modify'] ?>일 이내에는 변경 할 수 없습니다.
|
||||||
</span>
|
</span>
|
||||||
<input type="hidden" name="mb_nick_default" value="<?php echo isset($member['mb_nick'])?$member['mb_nick']:''; ?>">
|
<input type="hidden" name="mb_nick_default" value="<?php echo isset($member['mb_nick'])?get_text($member['mb_nick']):''; ?>">
|
||||||
<input type="text" name="mb_nick" value="<?php echo isset($member['mb_nick'])?$member['mb_nick']:''; ?>" id="reg_mb_nick" required class="frm_input required nospace" maxlength="20">
|
<input type="text" name="mb_nick" value="<?php echo isset($member['mb_nick'])?get_text($member['mb_nick']):''; ?>" id="reg_mb_nick" required class="frm_input required nospace" maxlength="20">
|
||||||
<span id="msg_mb_nick"></span>
|
<span id="msg_mb_nick"></span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -111,14 +111,14 @@ add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">',
|
|||||||
<?php if ($config['cf_use_homepage']) { ?>
|
<?php if ($config['cf_use_homepage']) { ?>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><label for="reg_mb_homepage">홈페이지<?php if ($config['cf_req_homepage']){ ?><strong class="sound_only">필수</strong><?php } ?></label></th>
|
<th scope="row"><label for="reg_mb_homepage">홈페이지<?php if ($config['cf_req_homepage']){ ?><strong class="sound_only">필수</strong><?php } ?></label></th>
|
||||||
<td><input type="url" name="mb_homepage" value="<?php echo $member['mb_homepage'] ?>" id="reg_mb_homepage" class="frm_input <?php echo $config['cf_req_homepage']?"required":""; ?>" maxlength="255" <?php echo $config['cf_req_homepage']?"required":""; ?>></td>
|
<td><input type="url" name="mb_homepage" value="<?php echo get_text($member['mb_homepage']) ?>" id="reg_mb_homepage" class="frm_input <?php echo $config['cf_req_homepage']?"required":""; ?>" maxlength="255" <?php echo $config['cf_req_homepage']?"required":""; ?>></td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<?php if ($config['cf_use_tel']) { ?>
|
<?php if ($config['cf_use_tel']) { ?>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><label for="reg_mb_tel">전화번호<?php if ($config['cf_req_tel']) { ?><strong class="sound_only">필수</strong><?php } ?></label></th>
|
<th scope="row"><label for="reg_mb_tel">전화번호<?php if ($config['cf_req_tel']) { ?><strong class="sound_only">필수</strong><?php } ?></label></th>
|
||||||
<td><input type="text" name="mb_tel" value="<?php echo $member['mb_tel'] ?>" id="reg_mb_tel" class="frm_input <?php echo $config['cf_req_tel']?"required":""; ?>" maxlength="20" <?php echo $config['cf_req_tel']?"required":""; ?>></td>
|
<td><input type="text" name="mb_tel" value="<?php echo get_text($member['mb_tel']) ?>" id="reg_mb_tel" class="frm_input <?php echo $config['cf_req_tel']?"required":""; ?>" maxlength="20" <?php echo $config['cf_req_tel']?"required":""; ?>></td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
@@ -126,9 +126,9 @@ add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">',
|
|||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><label for="reg_mb_hp">휴대폰번호<?php if ($config['cf_req_hp']) { ?><strong class="sound_only">필수</strong><?php } ?></label></th>
|
<th scope="row"><label for="reg_mb_hp">휴대폰번호<?php if ($config['cf_req_hp']) { ?><strong class="sound_only">필수</strong><?php } ?></label></th>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" name="mb_hp" value="<?php echo $member['mb_hp'] ?>" id="reg_mb_hp" <?php echo ($config['cf_req_hp'])?"required":""; ?> class="frm_input <?php echo ($config['cf_req_hp'])?"required":""; ?>" maxlength="20">
|
<input type="text" name="mb_hp" value="<?php echo get_text($member['mb_hp']) ?>" id="reg_mb_hp" <?php echo ($config['cf_req_hp'])?"required":""; ?> class="frm_input <?php echo ($config['cf_req_hp'])?"required":""; ?>" maxlength="20">
|
||||||
<?php if ($config['cf_cert_use'] && $config['cf_cert_hp']) { ?>
|
<?php if ($config['cf_cert_use'] && $config['cf_cert_hp']) { ?>
|
||||||
<input type="hidden" name="old_mb_hp" value="<?php echo $member['mb_hp'] ?>">
|
<input type="hidden" name="old_mb_hp" value="<?php echo get_text($member['mb_hp']) ?>">
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -145,13 +145,13 @@ add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">',
|
|||||||
<input type="text" name="mb_zip" value="<?php echo $member['mb_zip1'].$member['mb_zip2']; ?>" id="reg_mb_zip" <?php echo $config['cf_req_addr']?"required":""; ?> class="frm_input <?php echo $config['cf_req_addr']?"required":""; ?>" size="5" maxlength="6">
|
<input type="text" name="mb_zip" value="<?php echo $member['mb_zip1'].$member['mb_zip2']; ?>" id="reg_mb_zip" <?php echo $config['cf_req_addr']?"required":""; ?> class="frm_input <?php echo $config['cf_req_addr']?"required":""; ?>" size="5" maxlength="6">
|
||||||
<button type="button" class="btn_frmline" onclick="win_zip('fregisterform', 'mb_zip', 'mb_addr1', 'mb_addr2', 'mb_addr3', 'mb_addr_jibeon');">주소 검색</button><br>
|
<button type="button" class="btn_frmline" onclick="win_zip('fregisterform', 'mb_zip', 'mb_addr1', 'mb_addr2', 'mb_addr3', 'mb_addr_jibeon');">주소 검색</button><br>
|
||||||
<label for="reg_mb_addr1" class="sound_only">주소<?php echo $config['cf_req_addr']?'<strong class="sound_only"> 필수</strong>':''; ?></label>
|
<label for="reg_mb_addr1" class="sound_only">주소<?php echo $config['cf_req_addr']?'<strong class="sound_only"> 필수</strong>':''; ?></label>
|
||||||
<input type="text" name="mb_addr1" value="<?php echo $member['mb_addr1'] ?>" id="reg_mb_addr1" <?php echo $config['cf_req_addr']?"required":""; ?> class="frm_input frm_address <?php echo $config['cf_req_addr']?"required":""; ?>" size="50"><br>
|
<input type="text" name="mb_addr1" value="<?php echo get_text($member['mb_addr1']) ?>" id="reg_mb_addr1" <?php echo $config['cf_req_addr']?"required":""; ?> class="frm_input frm_address <?php echo $config['cf_req_addr']?"required":""; ?>" size="50"><br>
|
||||||
<label for="reg_mb_addr2" class="sound_only">상세주소</label>
|
<label for="reg_mb_addr2" class="sound_only">상세주소</label>
|
||||||
<input type="text" name="mb_addr2" value="<?php echo $member['mb_addr2'] ?>" id="reg_mb_addr2" class="frm_input frm_address" size="50">
|
<input type="text" name="mb_addr2" value="<?php echo get_text($member['mb_addr2']) ?>" id="reg_mb_addr2" class="frm_input frm_address" size="50">
|
||||||
<br>
|
<br>
|
||||||
<label for="reg_mb_addr3" class="sound_only">참고항목</label>
|
<label for="reg_mb_addr3" class="sound_only">참고항목</label>
|
||||||
<input type="text" name="mb_addr3" value="<?php echo $member['mb_addr3'] ?>" id="reg_mb_addr3" class="frm_input frm_address" size="50" readonly="readonly">
|
<input type="text" name="mb_addr3" value="<?php echo get_text($member['mb_addr3']) ?>" id="reg_mb_addr3" class="frm_input frm_address" size="50" readonly="readonly">
|
||||||
<input type="hidden" name="mb_addr_jibeon" value="<?php echo $member['mb_addr_jibeon']; ?>">
|
<input type="hidden" name="mb_addr_jibeon" value="<?php echo get_text($member['mb_addr_jibeon']); ?>">
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ add_stylesheet('<link rel="stylesheet" href="'.$poll_skin_url.'/style.css">', 0)
|
|||||||
<input type="hidden" name="po_id" value="<?php echo $po_id ?>">
|
<input type="hidden" name="po_id" value="<?php echo $po_id ?>">
|
||||||
<input type="hidden" name="w" value="">
|
<input type="hidden" name="w" value="">
|
||||||
<input type="hidden" name="skin_dir" value="<?php echo $skin_dir ?>">
|
<input type="hidden" name="skin_dir" value="<?php echo $skin_dir ?>">
|
||||||
<?php if ($is_member) { ?><input type="hidden" name="pc_name" value="<?php echo cut_str($member['mb_nick'],255) ?>"><?php } ?>
|
<?php if ($is_member) { ?><input type="hidden" name="pc_name" value="<?php echo get_text(cut_str($member['mb_nick'],255)); ?>"><?php } ?>
|
||||||
<h3><?php echo $po_etc ?></h3>
|
<h3><?php echo $po_etc ?></h3>
|
||||||
|
|
||||||
<div class="tbl_frm01 tbl_wrap">
|
<div class="tbl_frm01 tbl_wrap">
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ add_stylesheet('<link rel="stylesheet" href="'.$popular_skin_url.'/style.css">',
|
|||||||
<h2>인기검색어</h2>
|
<h2>인기검색어</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<?php for ($i=0; $i<count($list); $i++) { ?>
|
<?php for ($i=0; $i<count($list); $i++) { ?>
|
||||||
<li><a href="<?php echo G5_BBS_URL ?>/search.php?sfl=wr_subject&sop=and&stx=<?php echo urlencode($list[$i]['pp_word']) ?>"><?php echo $list[$i]['pp_word'] ?></a></li>
|
<li><a href="<?php echo G5_BBS_URL ?>/search.php?sfl=wr_subject&sop=and&stx=<?php echo urlencode($list[$i]['pp_word']) ?>"><?php echo get_text($list[$i]['pp_word']); ?></a></li>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ add_stylesheet('<link rel="stylesheet" href="'.$qa_skin_url.'/style.css">', 0);
|
|||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><label for="qa_email">이메일</label></th>
|
<th scope="row"><label for="qa_email">이메일</label></th>
|
||||||
<td>
|
<td>
|
||||||
<input type="email" name="qa_email" value="<?php echo $write['qa_email']; ?>" id="qa_email" <?php echo $req_email; ?> class="<?php echo $req_email.' '; ?>frm_input email" maxlength="100">
|
<input type="email" name="qa_email" value="<?php echo get_text($write['qa_email']); ?>" id="qa_email" <?php echo $req_email; ?> class="<?php echo $req_email.' '; ?>frm_input email" maxlength="100">
|
||||||
<input type="checkbox" name="qa_email_recv" value="1" id="qa_email_recv" <?php if($write['qa_email_recv']) echo 'checked="checked"'; ?>>
|
<input type="checkbox" name="qa_email_recv" value="1" id="qa_email_recv" <?php if($write['qa_email_recv']) echo 'checked="checked"'; ?>>
|
||||||
<label for="qa_email_recv">답변받기</label>
|
<label for="qa_email_recv">답변받기</label>
|
||||||
</td>
|
</td>
|
||||||
@@ -64,7 +64,7 @@ add_stylesheet('<link rel="stylesheet" href="'.$qa_skin_url.'/style.css">', 0);
|
|||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><label for="qa_hp">휴대폰</label></th>
|
<th scope="row"><label for="qa_hp">휴대폰</label></th>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" name="qa_hp" value="<?php echo $write['qa_hp']; ?>" id="qa_hp" <?php echo $req_hp; ?> class="<?php echo $req_hp.' '; ?>frm_input" size="30">
|
<input type="text" name="qa_hp" value="<?php echo get_text($write['qa_hp']); ?>" id="qa_hp" <?php echo $req_hp; ?> class="<?php echo $req_hp.' '; ?>frm_input" size="30">
|
||||||
<?php if($qaconfig['qa_use_sms']) { ?>
|
<?php if($qaconfig['qa_use_sms']) { ?>
|
||||||
<input type="checkbox" name="qa_sms_recv" value="1" <?php if($write['qa_sms_recv']) echo 'checked="checked"'; ?>> 답변등록 SMS알림 수신
|
<input type="checkbox" name="qa_sms_recv" value="1" <?php if($write['qa_sms_recv']) echo 'checked="checked"'; ?>> 답변등록 SMS알림 수신
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
@@ -75,7 +75,7 @@ add_stylesheet('<link rel="stylesheet" href="'.$qa_skin_url.'/style.css">', 0);
|
|||||||
<tr>
|
<tr>
|
||||||
<th scope="row"><label for="qa_subject">제목<strong class="sound_only">필수</strong></label></th>
|
<th scope="row"><label for="qa_subject">제목<strong class="sound_only">필수</strong></label></th>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" name="qa_subject" value="<?php echo $write['qa_subject']; ?>" id="qa_subject" required class="frm_input required" maxlength="255">
|
<input type="text" name="qa_subject" value="<?php echo get_text($write['qa_subject']); ?>" id="qa_subject" required class="frm_input required" maxlength="255">
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
function get_editor_wr_content()
|
||||||
|
{
|
||||||
|
return oEditors.getById['wr_content'].getIR();;
|
||||||
|
}
|
||||||
|
|
||||||
|
function put_editor_wr_content(content)
|
||||||
|
{
|
||||||
|
oEditors.getById["wr_content"].exec("SET_CONTENTS", [""]);
|
||||||
|
//oEditors.getById["wr_content"].exec("SET_IR", [""]);
|
||||||
|
oEditors.getById["wr_content"].exec("PASTE_HTML", [content]);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
Title: MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2009-2013 Chris Leonello
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
File diff suppressed because it is too large.
Load diff
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
/* jqPlot @VERSION | (c) 2009-2013 Chris Leonello | jplot.com
|
||||||
|
jsDate | (c) 2010-2013 Chris Leonello
|
||||||
|
*/if(!document.createElement("canvas").getContext){(function(){var ab=Math;var n=ab.round;var l=ab.sin;var A=ab.cos;var H=ab.abs;var N=ab.sqrt;var d=10;var f=d/2;var z=+navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];function y(){return this.context_||(this.context_=new D(this))}var t=Array.prototype.slice;function g(j,m,p){var i=t.call(arguments,2);return function(){return j.apply(m,i.concat(t.call(arguments)))}}function af(i){return String(i).replace(/&/g,"&").replace(/"/g,""")}function Y(m,j,i){if(!m.namespaces[j]){m.namespaces.add(j,i,"#default#VML")}}function R(j){Y(j,"g_vml_","urn:schemas-microsoft-com:vml");Y(j,"g_o_","urn:schemas-microsoft-com:office:office");if(!j.styleSheets.ex_canvas_){var i=j.createStyleSheet();i.owningElement.id="ex_canvas_";i.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}"}}R(document);var e={init:function(i){var j=i||document;j.createElement("canvas");j.attachEvent("onreadystatechange",g(this.init_,this,j))},init_:function(p){var m=p.getElementsByTagName("canvas");for(var j=0;j<m.length;j++){this.initElement(m[j])}},initElement:function(j){if(!j.getContext){j.getContext=y;R(j.ownerDocument);j.innerHTML="";j.attachEvent("onpropertychange",x);j.attachEvent("onresize",W);var i=j.attributes;if(i.width&&i.width.specified){j.style.width=i.width.nodeValue+"px"}else{j.width=j.clientWidth}if(i.height&&i.height.specified){j.style.height=i.height.nodeValue+"px"}else{j.height=j.clientHeight}}return j},uninitElement:function(j){if(j.getContext){var i=j.getContext();delete i.element_;delete i.canvas;j.innerHTML="";j.context_=null;j.getContext=null;j.detachEvent("onpropertychange",x);j.detachEvent("onresize",W)}}};function x(j){var i=j.srcElement;switch(j.propertyName){case"width":i.getContext().clearRect();i.style.width=i.attributes.width.nodeValue+"px";i.firstChild.style.width=i.clientWidth+"px";break;case"height":i.getContext().clearRect();i.style.height=i.attributes.height.nodeValue+"px";i.firstChild.style.height=i.clientHeight+"px";break}}function W(j){var i=j.srcElement;if(i.firstChild){i.firstChild.style.width=i.clientWidth+"px";i.firstChild.style.height=i.clientHeight+"px"}}e.init();var k=[];for(var ae=0;ae<16;ae++){for(var ad=0;ad<16;ad++){k[ae*16+ad]=ae.toString(16)+ad.toString(16)}}function B(){return[[1,0,0],[0,1,0],[0,0,1]]}function J(p,m){var j=B();for(var i=0;i<3;i++){for(var ah=0;ah<3;ah++){var Z=0;for(var ag=0;ag<3;ag++){Z+=p[i][ag]*m[ag][ah]}j[i][ah]=Z}}return j}function v(j,i){i.fillStyle=j.fillStyle;i.lineCap=j.lineCap;i.lineJoin=j.lineJoin;i.lineWidth=j.lineWidth;i.miterLimit=j.miterLimit;i.shadowBlur=j.shadowBlur;i.shadowColor=j.shadowColor;i.shadowOffsetX=j.shadowOffsetX;i.shadowOffsetY=j.shadowOffsetY;i.strokeStyle=j.strokeStyle;i.globalAlpha=j.globalAlpha;i.font=j.font;i.textAlign=j.textAlign;i.textBaseline=j.textBaseline;i.arcScaleX_=j.arcScaleX_;i.arcScaleY_=j.arcScaleY_;i.lineScale_=j.lineScale_}var b={aliceblue:"#F0F8FF",antiquewhite:"#FAEBD7",aquamarine:"#7FFFD4",azure:"#F0FFFF",beige:"#F5F5DC",bisque:"#FFE4C4",black:"#000000",blanchedalmond:"#FFEBCD",blueviolet:"#8A2BE2",brown:"#A52A2A",burlywood:"#DEB887",cadetblue:"#5F9EA0",chartreuse:"#7FFF00",chocolate:"#D2691E",coral:"#FF7F50",cornflowerblue:"#6495ED",cornsilk:"#FFF8DC",crimson:"#DC143C",cyan:"#00FFFF",darkblue:"#00008B",darkcyan:"#008B8B",darkgoldenrod:"#B8860B",darkgray:"#A9A9A9",darkgreen:"#006400",darkgrey:"#A9A9A9",darkkhaki:"#BDB76B",darkmagenta:"#8B008B",darkolivegreen:"#556B2F",darkorange:"#FF8C00",darkorchid:"#9932CC",darkred:"#8B0000",darksalmon:"#E9967A",darkseagreen:"#8FBC8F",darkslateblue:"#483D8B",darkslategray:"#2F4F4F",darkslategrey:"#2F4F4F",darkturquoise:"#00CED1",darkviolet:"#9400D3",deeppink:"#FF1493",deepskyblue:"#00BFFF",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1E90FF",firebrick:"#B22222",floralwhite:"#FFFAF0",forestgreen:"#228B22",gainsboro:"#DCDCDC",ghostwhite:"#F8F8FF",gold:"#FFD700",goldenrod:"#DAA520",grey:"#808080",greenyellow:"#ADFF2F",honeydew:"#F0FFF0",hotpink:"#FF69B4",indianred:"#CD5C5C",indigo:"#4B0082",ivory:"#FFFFF0",khaki:"#F0E68C",lavender:"#E6E6FA",lavenderblush:"#FFF0F5",lawngreen:"#7CFC00",lemonchiffon:"#FFFACD",lightblue:"#ADD8E6",lightcoral:"#F08080",lightcyan:"#E0FFFF",lightgoldenrodyellow:"#FAFAD2",lightgreen:"#90EE90",lightgrey:"#D3D3D3",lightpink:"#FFB6C1",lightsalmon:"#FFA07A",lightseagreen:"#20B2AA",lightskyblue:"#87CEFA",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#B0C4DE",lightyellow:"#FFFFE0",limegreen:"#32CD32",linen:"#FAF0E6",magenta:"#FF00FF",mediumaquamarine:"#66CDAA",mediumblue:"#0000CD",mediumorchid:"#BA55D3",mediumpurple:"#9370DB",mediumseagreen:"#3CB371",mediumslateblue:"#7B68EE",mediumspringgreen:"#00FA9A",mediumturquoise:"#48D1CC",mediumvioletred:"#C71585",midnightblue:"#191970",mintcream:"#F5FFFA",mistyrose:"#FFE4E1",moccasin:"#FFE4B5",navajowhite:"#FFDEAD",oldlace:"#FDF5E6",olivedrab:"#6B8E23",orange:"#FFA500",orangered:"#FF4500",orchid:"#DA70D6",palegoldeLine truncated
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
|
||||||
|
jsDate | (c) 2010-2013 Chris Leonello
|
||||||
|
*/(function(d){d.jqplot.BarRenderer=function(){d.jqplot.LineRenderer.call(this)};d.jqplot.BarRenderer.prototype=new d.jqplot.LineRenderer();d.jqplot.BarRenderer.prototype.constructor=d.jqplot.BarRenderer;d.jqplot.BarRenderer.prototype.init=function(o,q){this.barPadding=8;this.barMargin=10;this.barDirection="vertical";this.barWidth=null;this.shadowOffset=2;this.shadowDepth=5;this.shadowAlpha=0.08;this.waterfall=false;this.groups=1;this.varyBarColor=false;this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColors=[];this.transposedData=true;this.renderer.animation={show:false,direction:"down",speed:3000,_supported:true};this._type="bar";if(o.highlightMouseDown&&o.highlightMouseOver==null){o.highlightMouseOver=false}d.extend(true,this,o);d.extend(true,this.renderer,o);this.fill=true;if(this.barDirection==="horizontal"&&this.rendererOptions.animation&&this.rendererOptions.animation.direction==null){this.renderer.animation.direction="left"}if(this.waterfall){this.fillToZero=false;this.disableStack=true}if(this.barDirection=="vertical"){this._primaryAxis="_xaxis";this._stackAxis="y";this.fillAxis="y"}else{this._primaryAxis="_yaxis";this._stackAxis="x";this.fillAxis="x"}this._highlightedPoint=null;this._plotSeriesInfo=null;this._dataColors=[];this._barPoints=[];var p={lineJoin:"miter",lineCap:"round",fill:true,isarc:false,strokeStyle:this.color,fillStyle:this.color,closePath:this.fill};this.renderer.shapeRenderer.init(p);var n={lineJoin:"miter",lineCap:"round",fill:true,isarc:false,angle:this.shadowAngle,offset:this.shadowOffset,alpha:this.shadowAlpha,depth:this.shadowDepth,closePath:this.fill};this.renderer.shadowRenderer.init(n);q.postInitHooks.addOnce(h);q.postDrawHooks.addOnce(j);q.eventListenerHooks.addOnce("jqplotMouseMove",b);q.eventListenerHooks.addOnce("jqplotMouseDown",a);q.eventListenerHooks.addOnce("jqplotMouseUp",l);q.eventListenerHooks.addOnce("jqplotClick",e);q.eventListenerHooks.addOnce("jqplotRightClick",m)};function g(t,p,o,w){if(this.rendererOptions.barDirection=="horizontal"){this._stackAxis="x";this._primaryAxis="_yaxis"}if(this.rendererOptions.waterfall==true){this._data=d.extend(true,[],this.data);var s=0;var u=(!this.rendererOptions.barDirection||this.rendererOptions.barDirection==="vertical"||this.transposedData===false)?1:0;for(var q=0;q<this.data.length;q++){s+=this.data[q][u];if(q>0){this.data[q][u]+=this.data[q-1][u]}}this.data[this.data.length]=(u==1)?[this.data.length+1,s]:[s,this.data.length+1];this._data[this._data.length]=(u==1)?[this._data.length+1,s]:[s,this._data.length+1]}if(this.rendererOptions.groups>1){this.breakOnNull=true;var n=this.data.length;var v=parseInt(n/this.rendererOptions.groups,10);var r=0;for(var q=v;q<n;q+=v){this.data.splice(q+r,0,[null,null]);this._plotData.splice(q+r,0,[null,null]);this._stackData.splice(q+r,0,[null,null]);r++}for(q=0;q<this.data.length;q++){if(this._primaryAxis=="_xaxis"){this.data[q][0]=q+1;this._plotData[q][0]=q+1;this._stackData[q][0]=q+1}else{this.data[q][1]=q+1;this._plotData[q][1]=q+1;this._stackData[q][1]=q+1}}}}d.jqplot.preSeriesInitHooks.push(g);d.jqplot.BarRenderer.prototype.calcSeriesNumbers=function(){var r=0;var t=0;var q=this[this._primaryAxis];var p,o,u;for(var n=0;n<q._series.length;n++){o=q._series[n];if(o===this){u=n}if(o.renderer.constructor==d.jqplot.BarRenderer){r+=o.data.length;t+=1}}return[r,t,u]};d.jqplot.BarRenderer.prototype.setBarWidth=function(){var q;var n=0;var o=0;var t=this[this._primaryAxis];var x,r,v;var w=this._plotSeriesInfo=this.renderer.calcSeriesNumbers.call(this);n=w[0];o=w[1];var u=t.numberTicks;var p=(u-1)/2;if(t.name=="xaxis"||t.name=="x2axis"){if(this._stack){this.barWidth=(t._offsets.max-t._offsets.min)/n*o-this.barMargin}else{this.barWidth=((t._offsets.max-t._offsets.min)/p-this.barPadding*(o-1)-this.barMargin*2)/o}}else{if(this._stack){this.barWidth=(t._offsets.min-t._offsets.max)/n*o-this.barMargin}else{this.barWidth=((t._offsets.min-t._offsets.max)/p-this.barPadding*(o-1)-this.barMargin*2)/o}}return[n,o]};function f(o){var q=[];for(var s=0;s<o.length;s++){var r=d.jqplot.getColorComponents(o[s]);var n=[r[0],r[1],r[2]];var t=n[0]+n[1]+n[2];for(var p=0;p<3;p++){n[p]=(t>570)?n[p]*0.8:n[p]+0.3*(255-n[p]);n[p]=parseInt(n[p],10)}q.push("rgb("+n[0]+","+n[1]+","+n[2]+")")}return q}function i(v,u,s,t,o){var q=v,w=v-1,n,p,r=(o==="x")?0:1;if(q>0){p=t.series[w]._plotData[u][r];if((s*p)<0){n=i(w,u,s,t,o)}else{n=t.series[w].gridData[u][r]}}else{n=(r===0)?t.series[q]._xaxis.series_u2p(0):t.series[q]._yaxis.series_u2p(0)}return n}d.jqplot.BarRenderer.prototype.draw=function(E,L,q,G){var I;var A=d.extend({},q);var w=(A.shadow!=undefined)?A.shadow:this.shadow;var O=(A.showLine!=undefined)?A.showLine:this.showLine;var F=(A.fill!=undefined)?A.fill:this.fill;var p=this.xaxis;var J=this.yaxis;var y=this._xaxis.series_u2p;var K=this._yaxis.series_u2p;var D,C;this._dataColors=[];this._barPoints=[];if(this.barWidth==null){this.renderer.setBarWidth.call(this)}var N=this._plotSeriesInfo=this.renLine truncated
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
|
||||||
|
jsDate | (c) 2010-2013 Chris Leonello
|
||||||
|
*/(function(a){a.jqplot.CategoryAxisRenderer=function(b){a.jqplot.LinearAxisRenderer.call(this);this.sortMergedLabels=false};a.jqplot.CategoryAxisRenderer.prototype=new a.jqplot.LinearAxisRenderer();a.jqplot.CategoryAxisRenderer.prototype.constructor=a.jqplot.CategoryAxisRenderer;a.jqplot.CategoryAxisRenderer.prototype.init=function(e){this.groups=1;this.groupLabels=[];this._groupLabels=[];this._grouped=false;this._barsPerGroup=null;this.reverse=false;a.extend(true,this,{tickOptions:{formatString:"%d"}},e);var b=this._dataBounds;for(var f=0;f<this._series.length;f++){var g=this._series[f];if(g.groups){this.groups=g.groups}var h=g.data;for(var c=0;c<h.length;c++){if(this.name=="xaxis"||this.name=="x2axis"){if(h[c][0]<b.min||b.min==null){b.min=h[c][0]}if(h[c][0]>b.max||b.max==null){b.max=h[c][0]}}else{if(h[c][1]<b.min||b.min==null){b.min=h[c][1]}if(h[c][1]>b.max||b.max==null){b.max=h[c][1]}}}}if(this.groupLabels.length){this.groups=this.groupLabels.length}};a.jqplot.CategoryAxisRenderer.prototype.createTicks=function(){var D=this._ticks;var z=this.ticks;var F=this.name;var C=this._dataBounds;var v,A;var q,w;var d,c;var b,x;if(z.length){if(this.groups>1&&!this._grouped){var r=z.length;var p=parseInt(r/this.groups,10);var e=0;for(var x=p;x<r;x+=p){z.splice(x+e,0," ");e++}this._grouped=true}this.min=0.5;this.max=z.length+0.5;var m=this.max-this.min;this.numberTicks=2*z.length+1;for(x=0;x<z.length;x++){b=this.min+2*x*m/(this.numberTicks-1);var h=new this.tickRenderer(this.tickOptions);h.showLabel=false;h.setTick(b,this.name);this._ticks.push(h);var h=new this.tickRenderer(this.tickOptions);h.label=z[x];h.showMark=false;h.showGridline=false;h.setTick(b+0.5,this.name);this._ticks.push(h)}var h=new this.tickRenderer(this.tickOptions);h.showLabel=false;h.setTick(b+1,this.name);this._ticks.push(h)}else{if(F=="xaxis"||F=="x2axis"){v=this._plotDimensions.width}else{v=this._plotDimensions.height}if(this.min!=null&&this.max!=null&&this.numberTicks!=null){this.tickInterval=null}if(this.min!=null&&this.max!=null&&this.tickInterval!=null){if(parseInt((this.max-this.min)/this.tickInterval,10)!=(this.max-this.min)/this.tickInterval){this.tickInterval=null}}var y=[];var B=0;var q=0.5;var w,E;var f=false;for(var x=0;x<this._series.length;x++){var k=this._series[x];for(var u=0;u<k.data.length;u++){if(this.name=="xaxis"||this.name=="x2axis"){E=k.data[u][0]}else{E=k.data[u][1]}if(a.inArray(E,y)==-1){f=true;B+=1;y.push(E)}}}if(f&&this.sortMergedLabels){if(typeof y[0]=="string"){y.sort()}else{y.sort(function(j,i){return j-i})}}this.ticks=y;for(var x=0;x<this._series.length;x++){var k=this._series[x];for(var u=0;u<k.data.length;u++){if(this.name=="xaxis"||this.name=="x2axis"){E=k.data[u][0]}else{E=k.data[u][1]}var n=a.inArray(E,y)+1;if(this.name=="xaxis"||this.name=="x2axis"){k.data[u][0]=n}else{k.data[u][1]=n}}}if(this.groups>1&&!this._grouped){var r=y.length;var p=parseInt(r/this.groups,10);var e=0;for(var x=p;x<r;x+=p+1){y[x]=" "}this._grouped=true}w=B+0.5;if(this.numberTicks==null){this.numberTicks=2*B+1}var m=w-q;this.min=q;this.max=w;var o=0;var g=parseInt(3+v/10,10);var p=parseInt(B/g,10);if(this.tickInterval==null){this.tickInterval=m/(this.numberTicks-1)}for(var x=0;x<this.numberTicks;x++){b=this.min+x*this.tickInterval;var h=new this.tickRenderer(this.tickOptions);if(x/2==parseInt(x/2,10)){h.showLabel=false;h.showMark=true}else{if(p>0&&o<p){h.showLabel=false;o+=1}else{h.showLabel=true;o=0}h.label=h.formatter(h.formatString,y[(x-1)/2]);h.showMark=false;h.showGridline=false}h.setTick(b,this.name);this._ticks.push(h)}}};a.jqplot.CategoryAxisRenderer.prototype.draw=function(b,j){if(this.show){this.renderer.createTicks.call(this);var h=0;var c;if(this._elem){this._elem.emptyForce()}this._elem=this._elem||a('<div class="jqplot-axis jqplot-'+this.name+'" style="position:absolute;"></div>');if(this.name=="xaxis"||this.name=="x2axis"){this._elem.width(this._plotDimensions.width)}else{this._elem.height(this._plotDimensions.height)}this.labelOptions.axis=this.name;this._label=new this.labelRenderer(this.labelOptions);if(this._label.show){var g=this._label.draw(b,j);g.appendTo(this._elem)}var f=this._ticks;for(var e=0;e<f.length;e++){var d=f[e];if(d.showLabel&&(!d.isMinorTick||this.showMinorTicks)){var g=d.draw(b,j);g.appendTo(this._elem)}}this._groupLabels=[];for(var e=0;e<this.groupLabels.length;e++){var g=a('<div style="position:absolute;" class="jqplot-'+this.name+'-groupLabel"></div>');g.html(this.groupLabels[e]);this._groupLabels.push(g);g.appendTo(this._elem)}}return this._elem};a.jqplot.CategoryAxisRenderer.prototype.set=function(){var e=0;var m;var k=0;var f=0;var d=(this._label==null)?false:this._label.show;if(this.show){var n=this._ticks;for(var c=0;c<n.length;c++){var g=n[c];if(g.showLabel&&(!g.isMinorTick||this.showMinorTicks)){if(this.name=="xaxis"||this.name=="x2axis"){m=g._elem.outerHeight(true)}else{m=g._elem.outerWidth(true)}if(m>e){e=m}}}var j=0;for(var c=0;c<this._groupLabels.length;c++){var b=this._groupLabels[c];Line truncated
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
|
||||||
|
jsDate | (c) 2010-2013 Chris Leonello
|
||||||
|
*/(function(c){c.jqplot.PointLabels=function(e){this.show=c.jqplot.config.enablePlugins;this.location="n";this.labelsFromSeries=false;this.seriesLabelIndex=null;this.labels=[];this._labels=[];this.stackedValue=false;this.ypadding=6;this.xpadding=6;this.escapeHTML=true;this.edgeTolerance=-5;this.formatter=c.jqplot.DefaultTickFormatter;this.formatString="";this.hideZeros=false;this._elems=[];c.extend(true,this,e)};var a=["nw","n","ne","e","se","s","sw","w"];var d={nw:0,n:1,ne:2,e:3,se:4,s:5,sw:6,w:7};var b=["se","s","sw","w","nw","n","ne","e"];c.jqplot.PointLabels.init=function(j,h,f,g,i){var e=c.extend(true,{},f,g);e.pointLabels=e.pointLabels||{};if(this.renderer.constructor===c.jqplot.BarRenderer&&this.barDirection==="horizontal"&&!e.pointLabels.location){e.pointLabels.location="e"}this.plugins.pointLabels=new c.jqplot.PointLabels(e.pointLabels);this.plugins.pointLabels.setLabels.call(this)};c.jqplot.PointLabels.prototype.setLabels=function(){var f=this.plugins.pointLabels;var h;if(f.seriesLabelIndex!=null){h=f.seriesLabelIndex}else{if(this.renderer.constructor===c.jqplot.BarRenderer&&this.barDirection==="horizontal"){h=(this._plotData[0].length<3)?0:this._plotData[0].length-1}else{h=(this._plotData.length===0)?0:this._plotData[0].length-1}}f._labels=[];if(f.labels.length===0||f.labelsFromSeries){if(f.stackedValue){if(this._plotData.length&&this._plotData[0].length){for(var e=0;e<this._plotData.length;e++){f._labels.push(this._plotData[e][h])}}}else{var g=this.data;if(this.renderer.constructor===c.jqplot.BarRenderer&&this.waterfall){g=this._data}if(g.length&&g[0].length){for(var e=0;e<g.length;e++){f._labels.push(g[e][h])}}g=null}}else{if(f.labels.length){f._labels=f.labels}}};c.jqplot.PointLabels.prototype.xOffset=function(f,e,g){e=e||this.location;g=g||this.xpadding;var h;switch(e){case"nw":h=-f.outerWidth(true)-this.xpadding;break;case"n":h=-f.outerWidth(true)/2;break;case"ne":h=this.xpadding;break;case"e":h=this.xpadding;break;case"se":h=this.xpadding;break;case"s":h=-f.outerWidth(true)/2;break;case"sw":h=-f.outerWidth(true)-this.xpadding;break;case"w":h=-f.outerWidth(true)-this.xpadding;break;default:h=-f.outerWidth(true)-this.xpadding;break}return h};c.jqplot.PointLabels.prototype.yOffset=function(f,e,g){e=e||this.location;g=g||this.xpadding;var h;switch(e){case"nw":h=-f.outerHeight(true)-this.ypadding;break;case"n":h=-f.outerHeight(true)-this.ypadding;break;case"ne":h=-f.outerHeight(true)-this.ypadding;break;case"e":h=-f.outerHeight(true)/2;break;case"se":h=this.ypadding;break;case"s":h=this.ypadding;break;case"sw":h=this.ypadding;break;case"w":h=-f.outerHeight(true)/2;break;default:h=-f.outerHeight(true)-this.ypadding;break}return h};c.jqplot.PointLabels.draw=function(x,j,v){var t=this.plugins.pointLabels;t.setLabels.call(this);for(var w=0;w<t._elems.length;w++){t._elems[w].emptyForce()}t._elems.splice(0,t._elems.length);if(t.show){var r="_"+this._stackAxis+"axis";if(!t.formatString){t.formatString=this[r]._ticks[0].formatString;t.formatter=this[r]._ticks[0].formatter}var E=this._plotData;var D=this._prevPlotData;var A=this._xaxis;var q=this._yaxis;var z,f;for(var w=0,u=t._labels.length;w<u;w++){var o=t._labels[w];if(o==null||(t.hideZeros&&parseInt(o,10)==0)){continue}o=t.formatter(t.formatString,o);f=document.createElement("div");t._elems[w]=c(f);z=t._elems[w];z.addClass("jqplot-point-label jqplot-series-"+this.index+" jqplot-point-"+w);z.css("position","absolute");z.insertAfter(x.canvas);if(t.escapeHTML){z.text(o)}else{z.html(o)}var g=t.location;if((this.fillToZero&&E[w][1]<0)||(this.fillToZero&&this._type==="bar"&&this.barDirection==="horizontal"&&E[w][0]<0)||(this.waterfall&&parseInt(o,10))<0){g=b[d[g]]}var n=A.u2p(E[w][0])+t.xOffset(z,g);var h=q.u2p(E[w][1])+t.yOffset(z,g);if(this._stack&&!t.stackedValue){if(this.barDirection==="vertical"){h=(this._barPoints[w][0][1]+this._barPoints[w][1][1])/2+v._gridPadding.top-0.5*z.outerHeight(true)}else{n=(this._barPoints[w][2][0]+this._barPoints[w][0][0])/2+v._gridPadding.left-0.5*z.outerWidth(true)}}if(this.renderer.constructor==c.jqplot.BarRenderer){if(this.barDirection=="vertical"){n+=this._barNudge}else{h-=this._barNudge}}z.css("left",n);z.css("top",h);var k=n+z.width();var s=h+z.height();var C=t.edgeTolerance;var e=c(x.canvas).position().left;var y=c(x.canvas).position().top;var B=x.canvas.width+e;var m=x.canvas.height+y;if(n-C<e||h-C<y||k+C>B||s+C>m){z.remove()}z=null;f=null}}};c.jqplot.postSeriesInitHooks.push(c.jqplot.PointLabels.init);c.jqplot.postDrawSeriesHooks.push(c.jqplot.PointLabels.draw)})(jQuery);
|
||||||
@@ -0,0 +1,261 @@
|
|||||||
|
/*rules for the plot target div. These will be cascaded down to all plot elements according to css rules*/
|
||||||
|
.jqplot-target {
|
||||||
|
position: relative;
|
||||||
|
color: #666666;
|
||||||
|
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 1em;
|
||||||
|
/* height: 300px;
|
||||||
|
width: 400px;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/*rules applied to all axes*/
|
||||||
|
.jqplot-axis {
|
||||||
|
font-size: 0.9em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-xaxis {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-x2axis {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-yaxis {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-y2axis, .jqplot-y3axis, .jqplot-y4axis, .jqplot-y5axis, .jqplot-y6axis, .jqplot-y7axis, .jqplot-y8axis, .jqplot-y9axis, .jqplot-yMidAxis {
|
||||||
|
margin-left: 10px;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*rules applied to all axis tick divs*/
|
||||||
|
.jqplot-axis-tick, .jqplot-xaxis-tick, .jqplot-yaxis-tick, .jqplot-x2axis-tick, .jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick, .jqplot-yMidAxis-tick {
|
||||||
|
position: absolute;
|
||||||
|
white-space: pre;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.jqplot-xaxis-tick {
|
||||||
|
top: 0px;
|
||||||
|
/* initial position untill tick is drawn in proper place */
|
||||||
|
left: 15px;
|
||||||
|
/* padding-top: 10px;*/
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-x2axis-tick {
|
||||||
|
bottom: 0px;
|
||||||
|
/* initial position untill tick is drawn in proper place */
|
||||||
|
left: 15px;
|
||||||
|
/* padding-bottom: 10px;*/
|
||||||
|
vertical-align: bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-yaxis-tick {
|
||||||
|
right: 0px;
|
||||||
|
/* initial position untill tick is drawn in proper place */
|
||||||
|
top: 15px;
|
||||||
|
/* padding-right: 10px;*/
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-yaxis-tick.jqplot-breakTick {
|
||||||
|
right: -20px;
|
||||||
|
margin-right: 0px;
|
||||||
|
padding:1px 5px 1px 5px;
|
||||||
|
/*background-color: white;*/
|
||||||
|
z-index: 2;
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-y2axis-tick, .jqplot-y3axis-tick, .jqplot-y4axis-tick, .jqplot-y5axis-tick, .jqplot-y6axis-tick, .jqplot-y7axis-tick, .jqplot-y8axis-tick, .jqplot-y9axis-tick {
|
||||||
|
left: 0px;
|
||||||
|
/* initial position untill tick is drawn in proper place */
|
||||||
|
top: 15px;
|
||||||
|
/* padding-left: 10px;*/
|
||||||
|
/* padding-right: 15px;*/
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-yMidAxis-tick {
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-xaxis-label {
|
||||||
|
margin-top: 10px;
|
||||||
|
font-size: 11pt;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-x2axis-label {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
font-size: 11pt;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-yaxis-label {
|
||||||
|
margin-right: 10px;
|
||||||
|
/* text-align: center;*/
|
||||||
|
font-size: 11pt;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-yMidAxis-label {
|
||||||
|
font-size: 11pt;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-y2axis-label, .jqplot-y3axis-label, .jqplot-y4axis-label, .jqplot-y5axis-label, .jqplot-y6axis-label, .jqplot-y7axis-label, .jqplot-y8axis-label, .jqplot-y9axis-label {
|
||||||
|
/* text-align: center;*/
|
||||||
|
font-size: 11pt;
|
||||||
|
margin-left: 10px;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-meterGauge-tick {
|
||||||
|
font-size: 0.75em;
|
||||||
|
color: #999999;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-meterGauge-label {
|
||||||
|
font-size: 1em;
|
||||||
|
color: #999999;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.jqplot-table-legend {
|
||||||
|
margin-top: 12px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
margin-left: 12px;
|
||||||
|
margin-right: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.jqplot-table-legend, table.jqplot-cursor-legend {
|
||||||
|
background-color: rgba(255,255,255,0.6);
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
position: absolute;
|
||||||
|
font-size: 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.jqplot-table-legend {
|
||||||
|
vertical-align:middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
These rules could be used instead of assigning
|
||||||
|
element styles and relying on js object properties.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
td.jqplot-table-legend-swatch {
|
||||||
|
padding-top: 0.5em;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.jqplot-table-legend:first td.jqplot-table-legend-swatch {
|
||||||
|
padding-top: 0px;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
td.jqplot-seriesToggle:hover, td.jqplot-seriesToggle:active {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-table-legend .jqplot-series-hidden {
|
||||||
|
text-decoration: line-through;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jqplot-table-legend-swatch-outline {
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
padding:1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jqplot-table-legend-swatch {
|
||||||
|
width:0px;
|
||||||
|
height:0px;
|
||||||
|
border-top-width: 5px;
|
||||||
|
border-bottom-width: 5px;
|
||||||
|
border-left-width: 6px;
|
||||||
|
border-right-width: 6px;
|
||||||
|
border-top-style: solid;
|
||||||
|
border-bottom-style: solid;
|
||||||
|
border-left-style: solid;
|
||||||
|
border-right-style: solid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-title {
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
padding-bottom: 0.5em;
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.jqplot-cursor-tooltip {
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
font-size: 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.jqplot-cursor-tooltip {
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
font-size: 0.75em;
|
||||||
|
white-space: nowrap;
|
||||||
|
background: rgba(208,208,208,0.5);
|
||||||
|
padding: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-highlighter-tooltip, .jqplot-canvasOverlay-tooltip {
|
||||||
|
border: 1px solid #cccccc;
|
||||||
|
font-size: 0.75em;
|
||||||
|
white-space: nowrap;
|
||||||
|
background: rgba(208,208,208,0.5);
|
||||||
|
padding: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-point-label {
|
||||||
|
font-size: 1em;
|
||||||
|
z-index: 2;
|
||||||
|
font-weight:bold;
|
||||||
|
color:#ff670f;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.jqplot-cursor-legend-swatch {
|
||||||
|
vertical-align: middle;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jqplot-cursor-legend-swatch {
|
||||||
|
width: 1.2em;
|
||||||
|
height: 0.7em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-error {
|
||||||
|
/* Styles added to the plot target container when there is an error go here.*/
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.jqplot-error-message {
|
||||||
|
/* Styling of the custom error message div goes here.*/
|
||||||
|
position: relative;
|
||||||
|
top: 46%;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jqplot-bubble-label {
|
||||||
|
font-size: 0.8em;
|
||||||
|
/* background: rgba(90%, 90%, 90%, 0.15);*/
|
||||||
|
padding-left: 2px;
|
||||||
|
padding-right: 2px;
|
||||||
|
color: rgb(20%, 20%, 20%);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jqplot-bubble-label.jqplot-bubble-label-highlight {
|
||||||
|
background: rgba(90%, 90%, 90%, 0.7);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.jqplot-noData-container {
|
||||||
|
text-align: center;
|
||||||
|
background-color: rgba(96%, 96%, 96%, 0.3);
|
||||||
|
}
|
||||||
File diff suppressed because it is too large.
Load diff
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
.jqplot-target{position:relative;color:#666;font-family:"Trebuchet MS",Arial,Helvetica,sans-serif;font-size:1em}.jqplot-axis{font-size:.75em}.jqplot-xaxis{margin-top:10px}.jqplot-x2axis{margin-bottom:10px}.jqplot-yaxis{margin-right:10px}.jqplot-y2axis,.jqplot-y3axis,.jqplot-y4axis,.jqplot-y5axis,.jqplot-y6axis,.jqplot-y7axis,.jqplot-y8axis,.jqplot-y9axis,.jqplot-yMidAxis{margin-left:10px;margin-right:10px}.jqplot-axis-tick,.jqplot-xaxis-tick,.jqplot-yaxis-tick,.jqplot-x2axis-tick,.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick,.jqplot-yMidAxis-tick{position:absolute;white-space:pre}.jqplot-xaxis-tick{top:0;left:15px;vertical-align:top}.jqplot-x2axis-tick{bottom:0;left:15px;vertical-align:bottom}.jqplot-yaxis-tick{right:0;top:15px;text-align:right}.jqplot-yaxis-tick.jqplot-breakTick{right:-20px;margin-right:0;padding:1px 5px 1px 5px;z-index:2;font-size:1.5em}.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick{left:0;top:15px;text-align:left}.jqplot-yMidAxis-tick{text-align:center;white-space:nowrap}.jqplot-xaxis-label{margin-top:10px;font-size:11pt;position:absolute}.jqplot-x2axis-label{margin-bottom:10px;font-size:11pt;position:absolute}.jqplot-yaxis-label{margin-right:10px;font-size:11pt;position:absolute}.jqplot-yMidAxis-label{font-size:11pt;position:absolute}.jqplot-y2axis-label,.jqplot-y3axis-label,.jqplot-y4axis-label,.jqplot-y5axis-label,.jqplot-y6axis-label,.jqplot-y7axis-label,.jqplot-y8axis-label,.jqplot-y9axis-label{font-size:11pt;margin-left:10px;position:absolute}.jqplot-meterGauge-tick{font-size:.75em;color:#999}.jqplot-meterGauge-label{font-size:1em;color:#999}table.jqplot-table-legend{margin-top:12px;margin-bottom:12px;margin-left:12px;margin-right:12px}table.jqplot-table-legend,table.jqplot-cursor-legend{background-color:rgba(255,255,255,0.6);border:1px solid #ccc;position:absolute;font-size:.75em}td.jqplot-table-legend{vertical-align:middle}td.jqplot-seriesToggle:hover,td.jqplot-seriesToggle:active{cursor:pointer}.jqplot-table-legend .jqplot-series-hidden{text-decoration:line-through}div.jqplot-table-legend-swatch-outline{border:1px solid #ccc;padding:1px}div.jqplot-table-legend-swatch{width:0;height:0;border-top-width:5px;border-bottom-width:5px;border-left-width:6px;border-right-width:6px;border-top-style:solid;border-bottom-style:solid;border-left-style:solid;border-right-style:solid}.jqplot-title{top:0;left:0;padding-bottom:.5em;font-size:1.2em}table.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em}.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,0.5);padding:1px}.jqplot-highlighter-tooltip,.jqplot-canvasOverlay-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,0.5);padding:1px}.jqplot-point-label{font-size:.75em;z-index:2}td.jqplot-cursor-legend-swatch{vertical-align:middle;text-align:center}div.jqplot-cursor-legend-swatch{width:1.2em;height:.7em}.jqplot-error{text-align:center}.jqplot-error-message{position:relative;top:46%;display:inline-block}div.jqplot-bubble-label{font-size:.8em;padding-left:2px;padding-right:2px;color:rgb(20%,20%,20%)}div.jqplot-bubble-label.jqplot-bubble-label-highlight{background:rgba(90%,90%,90%,0.7)}div.jqplot-noData-container{text-align:center;background-color:rgba(96%,96%,96%,0.3)}
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
|
||||||
|
jsDate | (c) 2010-2013 Chris Leonello
|
||||||
|
*/(function(L){var u;L.fn.emptyForce=function(){for(var ah=0,ai;(ai=L(this)[ah])!=null;ah++){if(ai.nodeType===1){L.cleanData(ai.getElementsByTagName("*"))}if(L.jqplot.use_excanvas){ai.outerHTML=""}else{while(ai.firstChild){ai.removeChild(ai.firstChild)}}ai=null}return L(this)};L.fn.removeChildForce=function(ah){while(ah.firstChild){this.removeChildForce(ah.firstChild);ah.removeChild(ah.firstChild)}};L.fn.jqplot=function(){var ah=[];var aj=[];for(var ak=0,ai=arguments.length;ak<ai;ak++){if(L.isArray(arguments[ak])){ah.push(arguments[ak])}else{if(L.isPlainObject(arguments[ak])){aj.push(arguments[ak])}}}return this.each(function(an){var at,ar,aq=L(this),am=ah.length,al=aj.length,ap,ao;if(an<am){ap=ah[an]}else{ap=am?ah[am-1]:null}if(an<al){ao=aj[an]}else{ao=al?aj[al-1]:null}at=aq.attr("id");if(at===u){at="jqplot_target_"+L.jqplot.targetCounter++;aq.attr("id",at)}ar=L.jqplot(at,ap,ao);aq.data("jqplot",ar)})};L.jqplot=function(an,ak,ai){var aj=null,ah=null;if(arguments.length===3){aj=ak;ah=ai}else{if(arguments.length===2){if(L.isArray(ak)){aj=ak}else{if(L.isPlainObject(ak)){ah=ak}}}}if(aj===null&&ah!==null&&ah.data){aj=ah.data}var am=new R();L("#"+an).removeClass("jqplot-error");if(L.jqplot.config.catchErrors){try{am.init(an,aj,ah);am.draw();am.themeEngine.init.call(am);return am}catch(al){var ao=L.jqplot.config.errorMessage||al.message;L("#"+an).append('<div class="jqplot-error-message">'+ao+"</div>");L("#"+an).addClass("jqplot-error");document.getElementById(an).style.background=L.jqplot.config.errorBackground;document.getElementById(an).style.border=L.jqplot.config.errorBorder;document.getElementById(an).style.fontFamily=L.jqplot.config.errorFontFamily;document.getElementById(an).style.fontSize=L.jqplot.config.errorFontSize;document.getElementById(an).style.fontStyle=L.jqplot.config.errorFontStyle;document.getElementById(an).style.fontWeight=L.jqplot.config.errorFontWeight}}else{am.init(an,aj,ah);am.draw();am.themeEngine.init.call(am);return am}};L.jqplot.version="1.0.8";L.jqplot.revision="1250";L.jqplot.targetCounter=1;L.jqplot.CanvasManager=function(){if(typeof L.jqplot.CanvasManager.canvases=="undefined"){L.jqplot.CanvasManager.canvases=[];L.jqplot.CanvasManager.free=[]}var ah=[];this.getCanvas=function(){var ak;var aj=true;if(!L.jqplot.use_excanvas){for(var al=0,ai=L.jqplot.CanvasManager.canvases.length;al<ai;al++){if(L.jqplot.CanvasManager.free[al]===true){aj=false;ak=L.jqplot.CanvasManager.canvases[al];L.jqplot.CanvasManager.free[al]=false;ah.push(al);break}}}if(aj){ak=document.createElement("canvas");ah.push(L.jqplot.CanvasManager.canvases.length);L.jqplot.CanvasManager.canvases.push(ak);L.jqplot.CanvasManager.free.push(false)}return ak};this.initCanvas=function(ai){if(L.jqplot.use_excanvas){return window.G_vmlCanvasManager.initElement(ai)}return ai};this.freeAllCanvases=function(){for(var aj=0,ai=ah.length;aj<ai;aj++){this.freeCanvas(ah[aj])}ah=[]};this.freeCanvas=function(ai){if(L.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==u){window.G_vmlCanvasManager.uninitElement(L.jqplot.CanvasManager.canvases[ai]);L.jqplot.CanvasManager.canvases[ai]=null}else{var aj=L.jqplot.CanvasManager.canvases[ai];aj.getContext("2d").clearRect(0,0,aj.width,aj.height);L(aj).unbind().removeAttr("class").removeAttr("style");L(aj).css({left:"",top:"",position:""});aj.width=0;aj.height=0;L.jqplot.CanvasManager.free[ai]=true}}};L.jqplot.log=function(){if(window.console){window.console.log.apply(window.console,arguments)}};L.jqplot.config={addDomReference:false,enablePlugins:false,defaultHeight:300,defaultWidth:400,UTCAdjust:false,timezoneOffset:new Date(new Date().getTimezoneOffset()*60000),errorMessage:"",errorBackground:"",errorBorder:"",errorFontFamily:"",errorFontSize:"",errorFontStyle:"",errorFontWeight:"",catchErrors:false,defaultTickFormatString:"%.1f",defaultColors:["#4bb2c5","#EAA228","#c5b47f","#579575","#839557","#958c12","#953579","#4b5de4","#d8b83f","#ff5800","#0085cc","#c747a3","#cddf54","#FBD178","#26B4E3","#bd70c7"],defaultNegativeColors:["#498991","#C08840","#9F9274","#546D61","#646C4A","#6F6621","#6E3F5F","#4F64B0","#A89050","#C45923","#187399","#945381","#959E5C","#C7AF7B","#478396","#907294"],dashLength:4,gapLength:4,dotGapLength:2.5,srcLocation:"jqplot/src/",pluginLocation:"jqplot/src/plugins/"};L.jqplot.arrayMax=function(ah){return Math.max.apply(Math,ah)};L.jqplot.arrayMin=function(ah){return Math.min.apply(Math,ah)};L.jqplot.enablePlugins=L.jqplot.config.enablePlugins;L.jqplot.support_canvas=function(){if(typeof L.jqplot.support_canvas.result=="undefined"){L.jqplot.support_canvas.result=!!document.createElement("canvas").getContext}return L.jqplot.support_canvas.result};L.jqplot.support_canvas_text=function(){if(typeof L.jqplot.support_canvas_text.result=="undefined"){if(window.G_vmlCanvasManager!==u&&window.G_vmlCanvasManager._version>887){L.jqplot.support_canvas_text.result=true}else{L.jqplot.support_canvas_text.result=!!(document.createElement("canvas").getContext&&typeof document.creLine truncated
|
||||||
@@ -0,0 +1,314 @@
|
|||||||
|
/**
|
||||||
|
* jqPlot
|
||||||
|
* Pure JavaScript plotting plugin using jQuery
|
||||||
|
*
|
||||||
|
* Version: 1.0.8
|
||||||
|
* Revision: 1250
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009-2013 Chris Leonello
|
||||||
|
* jqPlot is currently available for use in all personal or commercial projects
|
||||||
|
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
|
||||||
|
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
|
||||||
|
* choose the license that best suits your project and use it accordingly.
|
||||||
|
*
|
||||||
|
* Although not required, the author would appreciate an email letting him
|
||||||
|
* know of any substantial use of jqPlot. You can reach the author at:
|
||||||
|
* chris at jqplot dot com or see http://www.jqplot.com/info.php .
|
||||||
|
*
|
||||||
|
* If you are feeling kind and generous, consider supporting the project by
|
||||||
|
* making a donation at: http://www.jqplot.com/donate.php .
|
||||||
|
*
|
||||||
|
* sprintf functions contained in jqplot.sprintf.js by Ash Searle:
|
||||||
|
*
|
||||||
|
* version 2007.04.27
|
||||||
|
* author Ash Searle
|
||||||
|
* http://hexmen.com/blog/2007/03/printf-sprintf/
|
||||||
|
* http://hexmen.com/js/sprintf.js
|
||||||
|
* The author (Ash Searle) has placed this code in the public domain:
|
||||||
|
* "This code is unrestricted: you are free to use it however you like."
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
(function($) {
|
||||||
|
// Class: $.jqplot.BezierCurveRenderer.js
|
||||||
|
// Renderer which draws lines as stacked bezier curves.
|
||||||
|
// Data for the line will not be specified as an array of
|
||||||
|
// [x, y] data point values, but as a an array of [start piont, bezier curve]
|
||||||
|
// So, the line is specified as: [[xstart, ystart], [cp1x, cp1y, cp2x, cp2y, xend, yend]].
|
||||||
|
$.jqplot.BezierCurveRenderer = function(){
|
||||||
|
$.jqplot.LineRenderer.call(this);
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BezierCurveRenderer.prototype = new $.jqplot.LineRenderer();
|
||||||
|
$.jqplot.BezierCurveRenderer.prototype.constructor = $.jqplot.BezierCurveRenderer;
|
||||||
|
|
||||||
|
|
||||||
|
// Method: setGridData
|
||||||
|
// converts the user data values to grid coordinates and stores them
|
||||||
|
// in the gridData array.
|
||||||
|
// Called with scope of a series.
|
||||||
|
$.jqplot.BezierCurveRenderer.prototype.setGridData = function(plot) {
|
||||||
|
// recalculate the grid data
|
||||||
|
var xp = this._xaxis.series_u2p;
|
||||||
|
var yp = this._yaxis.series_u2p;
|
||||||
|
// this._plotData should be same as this.data
|
||||||
|
var data = this.data;
|
||||||
|
this.gridData = [];
|
||||||
|
this._prevGridData = [];
|
||||||
|
// if seriesIndex = 0, fill to x axis.
|
||||||
|
// if seriesIndex > 0, fill to previous series data.
|
||||||
|
var idx = this.index;
|
||||||
|
if (data.length == 2) {
|
||||||
|
if (idx == 0) {
|
||||||
|
this.gridData = [
|
||||||
|
[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],
|
||||||
|
[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),
|
||||||
|
xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]),
|
||||||
|
xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])],
|
||||||
|
[xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, this._yaxis.min)],
|
||||||
|
[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var psd = plot.series[idx-1].data;
|
||||||
|
this.gridData = [
|
||||||
|
[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],
|
||||||
|
[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),
|
||||||
|
xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]),
|
||||||
|
xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])],
|
||||||
|
[xp.call(this._xaxis, psd[1][4]), yp.call(this._yaxis, psd[1][5])],
|
||||||
|
[xp.call(this._xaxis, psd[1][2]), yp.call(this._yaxis, psd[1][3]),
|
||||||
|
xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]),
|
||||||
|
xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (idx == 0) {
|
||||||
|
this.gridData = [
|
||||||
|
[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],
|
||||||
|
[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),
|
||||||
|
xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]),
|
||||||
|
xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])],
|
||||||
|
[xp.call(this._xaxis, data[3][1]), yp.call(this._yaxis, this._yaxis.min)],
|
||||||
|
[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var psd = plot.series[idx-1].data;
|
||||||
|
this.gridData = [
|
||||||
|
[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],
|
||||||
|
[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),
|
||||||
|
xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]),
|
||||||
|
xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])],
|
||||||
|
[xp.call(this._xaxis, psd[3][0]), yp.call(this._yaxis, psd[3][1])],
|
||||||
|
[xp.call(this._xaxis, psd[2][0]), yp.call(this._yaxis, psd[2][1]),
|
||||||
|
xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]),
|
||||||
|
xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Method: makeGridData
|
||||||
|
// converts any arbitrary data values to grid coordinates and
|
||||||
|
// returns them. This method exists so that plugins can use a series'
|
||||||
|
// linerenderer to generate grid data points without overwriting the
|
||||||
|
// grid data associated with that series.
|
||||||
|
// Called with scope of a series.
|
||||||
|
$.jqplot.BezierCurveRenderer.prototype.makeGridData = function(data, plot) {
|
||||||
|
// recalculate the grid data
|
||||||
|
var xp = this._xaxis.series_u2p;
|
||||||
|
var yp = this._yaxis.series_u2p;
|
||||||
|
var gd = [];
|
||||||
|
var pgd = [];
|
||||||
|
// if seriesIndex = 0, fill to x axis.
|
||||||
|
// if seriesIndex > 0, fill to previous series data.
|
||||||
|
var idx = this.index;
|
||||||
|
if (data.length == 2) {
|
||||||
|
if (idx == 0) {
|
||||||
|
gd = [
|
||||||
|
[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],
|
||||||
|
[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),
|
||||||
|
xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]),
|
||||||
|
xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])],
|
||||||
|
[xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, this._yaxis.min)],
|
||||||
|
[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var psd = plot.series[idx-1].data;
|
||||||
|
gd = [
|
||||||
|
[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],
|
||||||
|
[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),
|
||||||
|
xp.call(this._xaxis, data[1][2]), yp.call(this._yaxis, data[1][3]),
|
||||||
|
xp.call(this._xaxis, data[1][4]), yp.call(this._yaxis, data[1][5])],
|
||||||
|
[xp.call(this._xaxis, psd[1][4]), yp.call(this._yaxis, psd[1][5])],
|
||||||
|
[xp.call(this._xaxis, psd[1][2]), yp.call(this._yaxis, psd[1][3]),
|
||||||
|
xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]),
|
||||||
|
xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (idx == 0) {
|
||||||
|
gd = [
|
||||||
|
[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],
|
||||||
|
[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),
|
||||||
|
xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]),
|
||||||
|
xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])],
|
||||||
|
[xp.call(this._xaxis, data[3][1]), yp.call(this._yaxis, this._yaxis.min)],
|
||||||
|
[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, this._yaxis.min)]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var psd = plot.series[idx-1].data;
|
||||||
|
gd = [
|
||||||
|
[xp.call(this._xaxis, data[0][0]), yp.call(this._yaxis, data[0][1])],
|
||||||
|
[xp.call(this._xaxis, data[1][0]), yp.call(this._yaxis, data[1][1]),
|
||||||
|
xp.call(this._xaxis, data[2][0]), yp.call(this._yaxis, data[2][1]),
|
||||||
|
xp.call(this._xaxis, data[3][0]), yp.call(this._yaxis, data[3][1])],
|
||||||
|
[xp.call(this._xaxis, psd[3][0]), yp.call(this._yaxis, psd[3][1])],
|
||||||
|
[xp.call(this._xaxis, psd[2][0]), yp.call(this._yaxis, psd[2][1]),
|
||||||
|
xp.call(this._xaxis, psd[1][0]), yp.call(this._yaxis, psd[1][1]),
|
||||||
|
xp.call(this._xaxis, psd[0][0]), yp.call(this._yaxis, psd[0][1])]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return gd;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// called within scope of series.
|
||||||
|
$.jqplot.BezierCurveRenderer.prototype.draw = function(ctx, gd, options) {
|
||||||
|
var i;
|
||||||
|
ctx.save();
|
||||||
|
if (gd.length) {
|
||||||
|
if (this.showLine) {
|
||||||
|
ctx.save();
|
||||||
|
var opts = (options != null) ? options : {};
|
||||||
|
ctx.fillStyle = opts.fillStyle || this.color;
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.moveTo(gd[0][0], gd[0][1]);
|
||||||
|
ctx.bezierCurveTo(gd[1][0], gd[1][1], gd[1][2], gd[1][3], gd[1][4], gd[1][5]);
|
||||||
|
ctx.lineTo(gd[2][0], gd[2][1]);
|
||||||
|
if (gd[3].length == 2) {
|
||||||
|
ctx.lineTo(gd[3][0], gd[3][1]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ctx.bezierCurveTo(gd[3][0], gd[3][1], gd[3][2], gd[3][3], gd[3][4], gd[3][5]);
|
||||||
|
}
|
||||||
|
ctx.closePath();
|
||||||
|
ctx.fill();
|
||||||
|
ctx.restore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.restore();
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BezierCurveRenderer.prototype.drawShadow = function(ctx, gd, options) {
|
||||||
|
// This is a no-op, shadows drawn with lines.
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BezierAxisRenderer = function() {
|
||||||
|
$.jqplot.LinearAxisRenderer.call(this);
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BezierAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();
|
||||||
|
$.jqplot.BezierAxisRenderer.prototype.constructor = $.jqplot.BezierAxisRenderer;
|
||||||
|
|
||||||
|
|
||||||
|
// Axes on a plot with Bezier Curves
|
||||||
|
$.jqplot.BezierAxisRenderer.prototype.init = function(options){
|
||||||
|
$.extend(true, this, options);
|
||||||
|
var db = this._dataBounds;
|
||||||
|
// Go through all the series attached to this axis and find
|
||||||
|
// the min/max bounds for this axis.
|
||||||
|
for (var i=0; i<this._series.length; i++) {
|
||||||
|
var s = this._series[i];
|
||||||
|
var d = s.data;
|
||||||
|
if (d.length == 4) {
|
||||||
|
for (var j=0; j<d.length; j++) {
|
||||||
|
if (this.name == 'xaxis' || this.name == 'x2axis') {
|
||||||
|
if (d[j][0] < db.min || db.min == null) {
|
||||||
|
db.min = d[j][0];
|
||||||
|
}
|
||||||
|
if (d[j][0] > db.max || db.max == null) {
|
||||||
|
db.max = d[j][0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (d[j][1] < db.min || db.min == null) {
|
||||||
|
db.min = d[j][1];
|
||||||
|
}
|
||||||
|
if (d[j][1] > db.max || db.max == null) {
|
||||||
|
db.max = d[j][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (this.name == 'xaxis' || this.name == 'x2axis') {
|
||||||
|
if (d[0][0] < db.min || db.min == null) {
|
||||||
|
db.min = d[0][0];
|
||||||
|
}
|
||||||
|
if (d[0][0] > db.max || db.max == null) {
|
||||||
|
db.max = d[0][0];
|
||||||
|
}
|
||||||
|
for (var j=0; j<5; j+=2) {
|
||||||
|
if (d[1][j] < db.min || db.min == null) {
|
||||||
|
db.min = d[1][j];
|
||||||
|
}
|
||||||
|
if (d[1][j] > db.max || db.max == null) {
|
||||||
|
db.max = d[1][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (d[0][1] < db.min || db.min == null) {
|
||||||
|
db.min = d[0][1];
|
||||||
|
}
|
||||||
|
if (d[0][1] > db.max || db.max == null) {
|
||||||
|
db.max = d[0][1];
|
||||||
|
}
|
||||||
|
for (var j=1; j<6; j+=2) {
|
||||||
|
if (d[1][j] < db.min || db.min == null) {
|
||||||
|
db.min = d[1][j];
|
||||||
|
}
|
||||||
|
if (d[1][j] > db.max || db.max == null) {
|
||||||
|
db.max = d[1][j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// setup default renderers for axes and legend so user doesn't have to
|
||||||
|
// called with scope of plot
|
||||||
|
function preInit(target, data, options) {
|
||||||
|
options = options || {};
|
||||||
|
options.axesDefaults = $.extend(true, {pad:0}, options.axesDefaults);
|
||||||
|
options.seriesDefaults = options.seriesDefaults || {};
|
||||||
|
options.legend = $.extend(true, {placement:'outside'}, options.legend);
|
||||||
|
// only set these if there is a pie series
|
||||||
|
var setopts = false;
|
||||||
|
if (options.seriesDefaults.renderer == $.jqplot.BezierCurveRenderer) {
|
||||||
|
setopts = true;
|
||||||
|
}
|
||||||
|
else if (options.series) {
|
||||||
|
for (var i=0; i < options.series.length; i++) {
|
||||||
|
if (options.series[i].renderer == $.jqplot.BezierCurveRenderer) {
|
||||||
|
setopts = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setopts) {
|
||||||
|
options.axesDefaults.renderer = $.jqplot.BezierAxisRenderer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$.jqplot.preInitHooks.push(preInit);
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
|
||||||
|
jsDate | (c) 2010-2013 Chris Leonello
|
||||||
|
*/(function(b){b.jqplot.BezierCurveRenderer=function(){b.jqplot.LineRenderer.call(this)};b.jqplot.BezierCurveRenderer.prototype=new b.jqplot.LineRenderer();b.jqplot.BezierCurveRenderer.prototype.constructor=b.jqplot.BezierCurveRenderer;b.jqplot.BezierCurveRenderer.prototype.setGridData=function(h){var e=this._xaxis.series_u2p;var g=this._yaxis.series_u2p;var f=this.data;this.gridData=[];this._prevGridData=[];var d=this.index;if(f.length==2){if(d==0){this.gridData=[[e.call(this._xaxis,f[0][0]),g.call(this._yaxis,f[0][1])],[e.call(this._xaxis,f[1][0]),g.call(this._yaxis,f[1][1]),e.call(this._xaxis,f[1][2]),g.call(this._yaxis,f[1][3]),e.call(this._xaxis,f[1][4]),g.call(this._yaxis,f[1][5])],[e.call(this._xaxis,f[1][4]),g.call(this._yaxis,this._yaxis.min)],[e.call(this._xaxis,f[0][0]),g.call(this._yaxis,this._yaxis.min)]]}else{var c=h.series[d-1].data;this.gridData=[[e.call(this._xaxis,f[0][0]),g.call(this._yaxis,f[0][1])],[e.call(this._xaxis,f[1][0]),g.call(this._yaxis,f[1][1]),e.call(this._xaxis,f[1][2]),g.call(this._yaxis,f[1][3]),e.call(this._xaxis,f[1][4]),g.call(this._yaxis,f[1][5])],[e.call(this._xaxis,c[1][4]),g.call(this._yaxis,c[1][5])],[e.call(this._xaxis,c[1][2]),g.call(this._yaxis,c[1][3]),e.call(this._xaxis,c[1][0]),g.call(this._yaxis,c[1][1]),e.call(this._xaxis,c[0][0]),g.call(this._yaxis,c[0][1])]]}}else{if(d==0){this.gridData=[[e.call(this._xaxis,f[0][0]),g.call(this._yaxis,f[0][1])],[e.call(this._xaxis,f[1][0]),g.call(this._yaxis,f[1][1]),e.call(this._xaxis,f[2][0]),g.call(this._yaxis,f[2][1]),e.call(this._xaxis,f[3][0]),g.call(this._yaxis,f[3][1])],[e.call(this._xaxis,f[3][1]),g.call(this._yaxis,this._yaxis.min)],[e.call(this._xaxis,f[0][0]),g.call(this._yaxis,this._yaxis.min)]]}else{var c=h.series[d-1].data;this.gridData=[[e.call(this._xaxis,f[0][0]),g.call(this._yaxis,f[0][1])],[e.call(this._xaxis,f[1][0]),g.call(this._yaxis,f[1][1]),e.call(this._xaxis,f[2][0]),g.call(this._yaxis,f[2][1]),e.call(this._xaxis,f[3][0]),g.call(this._yaxis,f[3][1])],[e.call(this._xaxis,c[3][0]),g.call(this._yaxis,c[3][1])],[e.call(this._xaxis,c[2][0]),g.call(this._yaxis,c[2][1]),e.call(this._xaxis,c[1][0]),g.call(this._yaxis,c[1][1]),e.call(this._xaxis,c[0][0]),g.call(this._yaxis,c[0][1])]]}}};b.jqplot.BezierCurveRenderer.prototype.makeGridData=function(g,i){var f=this._xaxis.series_u2p;var h=this._yaxis.series_u2p;var e=[];var j=[];var d=this.index;if(g.length==2){if(d==0){e=[[f.call(this._xaxis,g[0][0]),h.call(this._yaxis,g[0][1])],[f.call(this._xaxis,g[1][0]),h.call(this._yaxis,g[1][1]),f.call(this._xaxis,g[1][2]),h.call(this._yaxis,g[1][3]),f.call(this._xaxis,g[1][4]),h.call(this._yaxis,g[1][5])],[f.call(this._xaxis,g[1][4]),h.call(this._yaxis,this._yaxis.min)],[f.call(this._xaxis,g[0][0]),h.call(this._yaxis,this._yaxis.min)]]}else{var c=i.series[d-1].data;e=[[f.call(this._xaxis,g[0][0]),h.call(this._yaxis,g[0][1])],[f.call(this._xaxis,g[1][0]),h.call(this._yaxis,g[1][1]),f.call(this._xaxis,g[1][2]),h.call(this._yaxis,g[1][3]),f.call(this._xaxis,g[1][4]),h.call(this._yaxis,g[1][5])],[f.call(this._xaxis,c[1][4]),h.call(this._yaxis,c[1][5])],[f.call(this._xaxis,c[1][2]),h.call(this._yaxis,c[1][3]),f.call(this._xaxis,c[1][0]),h.call(this._yaxis,c[1][1]),f.call(this._xaxis,c[0][0]),h.call(this._yaxis,c[0][1])]]}}else{if(d==0){e=[[f.call(this._xaxis,g[0][0]),h.call(this._yaxis,g[0][1])],[f.call(this._xaxis,g[1][0]),h.call(this._yaxis,g[1][1]),f.call(this._xaxis,g[2][0]),h.call(this._yaxis,g[2][1]),f.call(this._xaxis,g[3][0]),h.call(this._yaxis,g[3][1])],[f.call(this._xaxis,g[3][1]),h.call(this._yaxis,this._yaxis.min)],[f.call(this._xaxis,g[0][0]),h.call(this._yaxis,this._yaxis.min)]]}else{var c=i.series[d-1].data;e=[[f.call(this._xaxis,g[0][0]),h.call(this._yaxis,g[0][1])],[f.call(this._xaxis,g[1][0]),h.call(this._yaxis,g[1][1]),f.call(this._xaxis,g[2][0]),h.call(this._yaxis,g[2][1]),f.call(this._xaxis,g[3][0]),h.call(this._yaxis,g[3][1])],[f.call(this._xaxis,c[3][0]),h.call(this._yaxis,c[3][1])],[f.call(this._xaxis,c[2][0]),h.call(this._yaxis,c[2][1]),f.call(this._xaxis,c[1][0]),h.call(this._yaxis,c[1][1]),f.call(this._xaxis,c[0][0]),h.call(this._yaxis,c[0][1])]]}}return e};b.jqplot.BezierCurveRenderer.prototype.draw=function(c,g,d){var e;c.save();if(g.length){if(this.showLine){c.save();var f=(d!=null)?d:{};c.fillStyle=f.fillStyle||this.color;c.beginPath();c.moveTo(g[0][0],g[0][1]);c.bezierCurveTo(g[1][0],g[1][1],g[1][2],g[1][3],g[1][4],g[1][5]);c.lineTo(g[2][0],g[2][1]);if(g[3].length==2){c.lineTo(g[3][0],g[3][1])}else{c.bezierCurveTo(g[3][0],g[3][1],g[3][2],g[3][3],g[3][4],g[3][5])}c.closePath();c.fill();c.restore()}}c.restore()};b.jqplot.BezierCurveRenderer.prototype.drawShadow=function(c,e,d){};b.jqplot.BezierAxisRenderer=function(){b.jqplot.LinearAxisRenderer.call(this)};b.jqplot.BezierAxisRenderer.prototype=new b.jqplot.LinearAxisRenderer();b.jqplot.BezierAxisRenderer.prototype.constructor=b.jqplot.BezierAxisRenderer;b.jqplot.BezierAxisRenderer.prototype.init=function(f){b.extend(true,this,f);var c=this.Line truncated
|
||||||
@@ -0,0 +1,801 @@
|
|||||||
|
/**
|
||||||
|
* jqPlot
|
||||||
|
* Pure JavaScript plotting plugin using jQuery
|
||||||
|
*
|
||||||
|
* Version: 1.0.8
|
||||||
|
* Revision: 1250
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009-2013 Chris Leonello
|
||||||
|
* jqPlot is currently available for use in all personal or commercial projects
|
||||||
|
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
|
||||||
|
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
|
||||||
|
* choose the license that best suits your project and use it accordingly.
|
||||||
|
*
|
||||||
|
* Although not required, the author would appreciate an email letting him
|
||||||
|
* know of any substantial use of jqPlot. You can reach the author at:
|
||||||
|
* chris at jqplot dot com or see http://www.jqplot.com/info.php .
|
||||||
|
*
|
||||||
|
* If you are feeling kind and generous, consider supporting the project by
|
||||||
|
* making a donation at: http://www.jqplot.com/donate.php .
|
||||||
|
*
|
||||||
|
* sprintf functions contained in jqplot.sprintf.js by Ash Searle:
|
||||||
|
*
|
||||||
|
* version 2007.04.27
|
||||||
|
* author Ash Searle
|
||||||
|
* http://hexmen.com/blog/2007/03/printf-sprintf/
|
||||||
|
* http://hexmen.com/js/sprintf.js
|
||||||
|
* The author (Ash Searle) has placed this code in the public domain:
|
||||||
|
* "This code is unrestricted: you are free to use it however you like."
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
(function($) {
|
||||||
|
|
||||||
|
// Class: $.jqplot.BarRenderer
|
||||||
|
// A plugin renderer for jqPlot to draw a bar plot.
|
||||||
|
// Draws series as a line.
|
||||||
|
|
||||||
|
$.jqplot.BarRenderer = function(){
|
||||||
|
$.jqplot.LineRenderer.call(this);
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BarRenderer.prototype = new $.jqplot.LineRenderer();
|
||||||
|
$.jqplot.BarRenderer.prototype.constructor = $.jqplot.BarRenderer;
|
||||||
|
|
||||||
|
// called with scope of series.
|
||||||
|
$.jqplot.BarRenderer.prototype.init = function(options, plot) {
|
||||||
|
// Group: Properties
|
||||||
|
//
|
||||||
|
// prop: barPadding
|
||||||
|
// Number of pixels between adjacent bars at the same axis value.
|
||||||
|
this.barPadding = 8;
|
||||||
|
// prop: barMargin
|
||||||
|
// Number of pixels between groups of bars at adjacent axis values.
|
||||||
|
this.barMargin = 10;
|
||||||
|
// prop: barDirection
|
||||||
|
// 'vertical' = up and down bars, 'horizontal' = side to side bars
|
||||||
|
this.barDirection = 'vertical';
|
||||||
|
// prop: barWidth
|
||||||
|
// Width of the bar in pixels (auto by devaul). null = calculated automatically.
|
||||||
|
this.barWidth = null;
|
||||||
|
// prop: shadowOffset
|
||||||
|
// offset of the shadow from the slice and offset of
|
||||||
|
// each succesive stroke of the shadow from the last.
|
||||||
|
this.shadowOffset = 2;
|
||||||
|
// prop: shadowDepth
|
||||||
|
// number of strokes to apply to the shadow,
|
||||||
|
// each stroke offset shadowOffset from the last.
|
||||||
|
this.shadowDepth = 5;
|
||||||
|
// prop: shadowAlpha
|
||||||
|
// transparency of the shadow (0 = transparent, 1 = opaque)
|
||||||
|
this.shadowAlpha = 0.08;
|
||||||
|
// prop: waterfall
|
||||||
|
// true to enable waterfall plot.
|
||||||
|
this.waterfall = false;
|
||||||
|
// prop: groups
|
||||||
|
// group bars into this many groups
|
||||||
|
this.groups = 1;
|
||||||
|
// prop: varyBarColor
|
||||||
|
// true to color each bar of a series separately rather than
|
||||||
|
// have every bar of a given series the same color.
|
||||||
|
// If used for non-stacked multiple series bar plots, user should
|
||||||
|
// specify a separate 'seriesColors' array for each series.
|
||||||
|
// Otherwise, each series will set their bars to the same color array.
|
||||||
|
// This option has no Effect for stacked bar charts and is disabled.
|
||||||
|
this.varyBarColor = false;
|
||||||
|
// prop: highlightMouseOver
|
||||||
|
// True to highlight slice when moused over.
|
||||||
|
// This must be false to enable highlightMouseDown to highlight when clicking on a slice.
|
||||||
|
this.highlightMouseOver = true;
|
||||||
|
// prop: highlightMouseDown
|
||||||
|
// True to highlight when a mouse button is pressed over a slice.
|
||||||
|
// This will be disabled if highlightMouseOver is true.
|
||||||
|
this.highlightMouseDown = false;
|
||||||
|
// prop: highlightColors
|
||||||
|
// an array of colors to use when highlighting a bar.
|
||||||
|
this.highlightColors = [];
|
||||||
|
// prop: transposedData
|
||||||
|
// NOT IMPLEMENTED YET. True if this is a horizontal bar plot and
|
||||||
|
// x and y values are "transposed". Tranposed, or "swapped", data is
|
||||||
|
// required prior to rev. 894 builds of jqPlot with horizontal bars.
|
||||||
|
// Allows backward compatability of bar renderer horizontal bars with
|
||||||
|
// old style data sets.
|
||||||
|
this.transposedData = true;
|
||||||
|
this.renderer.animation = {
|
||||||
|
show: false,
|
||||||
|
direction: 'down',
|
||||||
|
speed: 3000,
|
||||||
|
_supported: true
|
||||||
|
};
|
||||||
|
this._type = 'bar';
|
||||||
|
|
||||||
|
// if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver
|
||||||
|
if (options.highlightMouseDown && options.highlightMouseOver == null) {
|
||||||
|
options.highlightMouseOver = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////
|
||||||
|
// This is probably wrong here.
|
||||||
|
// After going back and forth on whether renderer should be the thing
|
||||||
|
// or extend the thing, it seems that it it best if it is a property
|
||||||
|
// on the thing. This should be something that is commonized
|
||||||
|
// among series renderers in the future.
|
||||||
|
//////
|
||||||
|
$.extend(true, this, options);
|
||||||
|
|
||||||
|
// really should probably do this
|
||||||
|
$.extend(true, this.renderer, options);
|
||||||
|
// fill is still needed to properly draw the legend.
|
||||||
|
// bars have to be filled.
|
||||||
|
this.fill = true;
|
||||||
|
|
||||||
|
// if horizontal bar and animating, reset the default direction
|
||||||
|
if (this.barDirection === 'horizontal' && this.rendererOptions.animation && this.rendererOptions.animation.direction == null) {
|
||||||
|
this.renderer.animation.direction = 'left';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.waterfall) {
|
||||||
|
this.fillToZero = false;
|
||||||
|
this.disableStack = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.barDirection == 'vertical' ) {
|
||||||
|
this._primaryAxis = '_xaxis';
|
||||||
|
this._stackAxis = 'y';
|
||||||
|
this.fillAxis = 'y';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this._primaryAxis = '_yaxis';
|
||||||
|
this._stackAxis = 'x';
|
||||||
|
this.fillAxis = 'x';
|
||||||
|
}
|
||||||
|
// index of the currenty highlighted point, if any
|
||||||
|
this._highlightedPoint = null;
|
||||||
|
// total number of values for all bar series, total number of bar series, and position of this series
|
||||||
|
this._plotSeriesInfo = null;
|
||||||
|
// Array of actual data colors used for each data point.
|
||||||
|
this._dataColors = [];
|
||||||
|
this._barPoints = [];
|
||||||
|
|
||||||
|
// set the shape renderer options
|
||||||
|
var opts = {lineJoin:'miter', lineCap:'round', fill:true, isarc:false, strokeStyle:this.color, fillStyle:this.color, closePath:this.fill};
|
||||||
|
this.renderer.shapeRenderer.init(opts);
|
||||||
|
// set the shadow renderer options
|
||||||
|
var sopts = {lineJoin:'miter', lineCap:'round', fill:true, isarc:false, angle:this.shadowAngle, offset:this.shadowOffset, alpha:this.shadowAlpha, depth:this.shadowDepth, closePath:this.fill};
|
||||||
|
this.renderer.shadowRenderer.init(sopts);
|
||||||
|
|
||||||
|
plot.postInitHooks.addOnce(postInit);
|
||||||
|
plot.postDrawHooks.addOnce(postPlotDraw);
|
||||||
|
plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);
|
||||||
|
plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);
|
||||||
|
plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);
|
||||||
|
plot.eventListenerHooks.addOnce('jqplotClick', handleClick);
|
||||||
|
plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick);
|
||||||
|
};
|
||||||
|
|
||||||
|
// called with scope of series
|
||||||
|
function barPreInit(target, data, seriesDefaults, options) {
|
||||||
|
if (this.rendererOptions.barDirection == 'horizontal') {
|
||||||
|
this._stackAxis = 'x';
|
||||||
|
this._primaryAxis = '_yaxis';
|
||||||
|
}
|
||||||
|
if (this.rendererOptions.waterfall == true) {
|
||||||
|
this._data = $.extend(true, [], this.data);
|
||||||
|
var sum = 0;
|
||||||
|
var pos = (!this.rendererOptions.barDirection || this.rendererOptions.barDirection === 'vertical' || this.transposedData === false) ? 1 : 0;
|
||||||
|
for(var i=0; i<this.data.length; i++) {
|
||||||
|
sum += this.data[i][pos];
|
||||||
|
if (i>0) {
|
||||||
|
this.data[i][pos] += this.data[i-1][pos];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.data[this.data.length] = (pos == 1) ? [this.data.length+1, sum] : [sum, this.data.length+1];
|
||||||
|
this._data[this._data.length] = (pos == 1) ? [this._data.length+1, sum] : [sum, this._data.length+1];
|
||||||
|
}
|
||||||
|
if (this.rendererOptions.groups > 1) {
|
||||||
|
this.breakOnNull = true;
|
||||||
|
var l = this.data.length;
|
||||||
|
var skip = parseInt(l/this.rendererOptions.groups, 10);
|
||||||
|
var count = 0;
|
||||||
|
for (var i=skip; i<l; i+=skip) {
|
||||||
|
this.data.splice(i+count, 0, [null, null]);
|
||||||
|
this._plotData.splice(i+count, 0, [null, null]);
|
||||||
|
this._stackData.splice(i+count, 0, [null, null]);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
for (i=0; i<this.data.length; i++) {
|
||||||
|
if (this._primaryAxis == '_xaxis') {
|
||||||
|
this.data[i][0] = i+1;
|
||||||
|
this._plotData[i][0] = i+1;
|
||||||
|
this._stackData[i][0] = i+1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.data[i][1] = i+1;
|
||||||
|
this._plotData[i][1] = i+1;
|
||||||
|
this._stackData[i][1] = i+1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$.jqplot.preSeriesInitHooks.push(barPreInit);
|
||||||
|
|
||||||
|
// needs to be called with scope of series, not renderer.
|
||||||
|
$.jqplot.BarRenderer.prototype.calcSeriesNumbers = function() {
|
||||||
|
var nvals = 0;
|
||||||
|
var nseries = 0;
|
||||||
|
var paxis = this[this._primaryAxis];
|
||||||
|
var s, series, pos;
|
||||||
|
// loop through all series on this axis
|
||||||
|
for (var i=0; i < paxis._series.length; i++) {
|
||||||
|
series = paxis._series[i];
|
||||||
|
if (series === this) {
|
||||||
|
pos = i;
|
||||||
|
}
|
||||||
|
// is the series rendered as a bar?
|
||||||
|
if (series.renderer.constructor == $.jqplot.BarRenderer) {
|
||||||
|
// gridData may not be computed yet, use data length insted
|
||||||
|
nvals += series.data.length;
|
||||||
|
nseries += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// return total number of values for all bar series, total number of bar series, and position of this series
|
||||||
|
return [nvals, nseries, pos];
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BarRenderer.prototype.setBarWidth = function() {
|
||||||
|
// need to know how many data values we have on the approprate axis and figure it out.
|
||||||
|
var i;
|
||||||
|
var nvals = 0;
|
||||||
|
var nseries = 0;
|
||||||
|
var paxis = this[this._primaryAxis];
|
||||||
|
var s, series, pos;
|
||||||
|
var temp = this._plotSeriesInfo = this.renderer.calcSeriesNumbers.call(this);
|
||||||
|
nvals = temp[0];
|
||||||
|
nseries = temp[1];
|
||||||
|
var nticks = paxis.numberTicks;
|
||||||
|
var nbins = (nticks-1)/2;
|
||||||
|
// so, now we have total number of axis values.
|
||||||
|
if (paxis.name == 'xaxis' || paxis.name == 'x2axis') {
|
||||||
|
if (this._stack) {
|
||||||
|
this.barWidth = (paxis._offsets.max - paxis._offsets.min) / nvals * nseries - this.barMargin;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.barWidth = ((paxis._offsets.max - paxis._offsets.min)/nbins - this.barPadding * (nseries-1) - this.barMargin*2)/nseries;
|
||||||
|
// this.barWidth = (paxis._offsets.max - paxis._offsets.min) / nvals - this.barPadding - this.barMargin/nseries;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (this._stack) {
|
||||||
|
this.barWidth = (paxis._offsets.min - paxis._offsets.max) / nvals * nseries - this.barMargin;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.barWidth = ((paxis._offsets.min - paxis._offsets.max)/nbins - this.barPadding * (nseries-1) - this.barMargin*2)/nseries;
|
||||||
|
// this.barWidth = (paxis._offsets.min - paxis._offsets.max) / nvals - this.barPadding - this.barMargin/nseries;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return [nvals, nseries];
|
||||||
|
};
|
||||||
|
|
||||||
|
function computeHighlightColors (colors) {
|
||||||
|
var ret = [];
|
||||||
|
for (var i=0; i<colors.length; i++){
|
||||||
|
var rgba = $.jqplot.getColorComponents(colors[i]);
|
||||||
|
var newrgb = [rgba[0], rgba[1], rgba[2]];
|
||||||
|
var sum = newrgb[0] + newrgb[1] + newrgb[2];
|
||||||
|
for (var j=0; j<3; j++) {
|
||||||
|
// when darkening, lowest color component can be is 60.
|
||||||
|
newrgb[j] = (sum > 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);
|
||||||
|
newrgb[j] = parseInt(newrgb[j], 10);
|
||||||
|
}
|
||||||
|
ret.push('rgb('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+')');
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStart(sidx, didx, comp, plot, axis) {
|
||||||
|
// check if sign change
|
||||||
|
var seriesIndex = sidx,
|
||||||
|
prevSeriesIndex = sidx - 1,
|
||||||
|
start,
|
||||||
|
prevVal,
|
||||||
|
aidx = (axis === 'x') ? 0 : 1;
|
||||||
|
|
||||||
|
// is this not the first series?
|
||||||
|
if (seriesIndex > 0) {
|
||||||
|
prevVal = plot.series[prevSeriesIndex]._plotData[didx][aidx];
|
||||||
|
|
||||||
|
// is there a sign change
|
||||||
|
if ((comp * prevVal) < 0) {
|
||||||
|
start = getStart(prevSeriesIndex, didx, comp, plot, axis);
|
||||||
|
}
|
||||||
|
|
||||||
|
// no sign change.
|
||||||
|
else {
|
||||||
|
start = plot.series[prevSeriesIndex].gridData[didx][aidx];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// if first series, return value at 0
|
||||||
|
else {
|
||||||
|
|
||||||
|
start = (aidx === 0) ? plot.series[seriesIndex]._xaxis.series_u2p(0) : plot.series[seriesIndex]._yaxis.series_u2p(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$.jqplot.BarRenderer.prototype.draw = function(ctx, gridData, options, plot) {
|
||||||
|
var i;
|
||||||
|
// Ughhh, have to make a copy of options b/c it may be modified later.
|
||||||
|
var opts = $.extend({}, options);
|
||||||
|
var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;
|
||||||
|
var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;
|
||||||
|
var fill = (opts.fill != undefined) ? opts.fill : this.fill;
|
||||||
|
var xaxis = this.xaxis;
|
||||||
|
var yaxis = this.yaxis;
|
||||||
|
var xp = this._xaxis.series_u2p;
|
||||||
|
var yp = this._yaxis.series_u2p;
|
||||||
|
var pointx, pointy;
|
||||||
|
// clear out data colors.
|
||||||
|
this._dataColors = [];
|
||||||
|
this._barPoints = [];
|
||||||
|
|
||||||
|
if (this.barWidth == null) {
|
||||||
|
this.renderer.setBarWidth.call(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
var temp = this._plotSeriesInfo = this.renderer.calcSeriesNumbers.call(this);
|
||||||
|
var nvals = temp[0];
|
||||||
|
var nseries = temp[1];
|
||||||
|
var pos = temp[2];
|
||||||
|
var points = [];
|
||||||
|
|
||||||
|
if (this._stack) {
|
||||||
|
this._barNudge = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this._barNudge = (-Math.abs(nseries/2 - 0.5) + pos) * (this.barWidth + this.barPadding);
|
||||||
|
}
|
||||||
|
if (showLine) {
|
||||||
|
var negativeColors = new $.jqplot.ColorGenerator(this.negativeSeriesColors);
|
||||||
|
var positiveColors = new $.jqplot.ColorGenerator(this.seriesColors);
|
||||||
|
var negativeColor = negativeColors.get(this.index);
|
||||||
|
if (! this.useNegativeColors) {
|
||||||
|
negativeColor = opts.fillStyle;
|
||||||
|
}
|
||||||
|
var positiveColor = opts.fillStyle;
|
||||||
|
var base;
|
||||||
|
var xstart;
|
||||||
|
var ystart;
|
||||||
|
|
||||||
|
if (this.barDirection == 'vertical') {
|
||||||
|
for (var i=0; i<gridData.length; i++) {
|
||||||
|
if (!this._stack && this.data[i][1] == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
points = [];
|
||||||
|
base = gridData[i][0] + this._barNudge;
|
||||||
|
|
||||||
|
// stacked
|
||||||
|
if (this._stack && this._prevGridData.length) {
|
||||||
|
ystart = getStart(this.index, i, this._plotData[i][1], plot, 'y');
|
||||||
|
}
|
||||||
|
|
||||||
|
// not stacked
|
||||||
|
else {
|
||||||
|
if (this.fillToZero) {
|
||||||
|
ystart = this._yaxis.series_u2p(0);
|
||||||
|
}
|
||||||
|
else if (this.waterfall && i > 0 && i < this.gridData.length-1) {
|
||||||
|
ystart = this.gridData[i-1][1];
|
||||||
|
}
|
||||||
|
else if (this.waterfall && i == 0 && i < this.gridData.length-1) {
|
||||||
|
if (this._yaxis.min <= 0 && this._yaxis.max >= 0) {
|
||||||
|
ystart = this._yaxis.series_u2p(0);
|
||||||
|
}
|
||||||
|
else if (this._yaxis.min > 0) {
|
||||||
|
ystart = ctx.canvas.height;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ystart = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (this.waterfall && i == this.gridData.length - 1) {
|
||||||
|
if (this._yaxis.min <= 0 && this._yaxis.max >= 0) {
|
||||||
|
ystart = this._yaxis.series_u2p(0);
|
||||||
|
}
|
||||||
|
else if (this._yaxis.min > 0) {
|
||||||
|
ystart = ctx.canvas.height;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ystart = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ystart = ctx.canvas.height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((this.fillToZero && this._plotData[i][1] < 0) || (this.waterfall && this._data[i][1] < 0)) {
|
||||||
|
if (this.varyBarColor && !this._stack) {
|
||||||
|
if (this.useNegativeColors) {
|
||||||
|
opts.fillStyle = negativeColors.next();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
opts.fillStyle = positiveColors.next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
opts.fillStyle = negativeColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (this.varyBarColor && !this._stack) {
|
||||||
|
opts.fillStyle = positiveColors.next();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
opts.fillStyle = positiveColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.fillToZero || this._plotData[i][1] >= 0) {
|
||||||
|
points.push([base-this.barWidth/2, ystart]);
|
||||||
|
points.push([base-this.barWidth/2, gridData[i][1]]);
|
||||||
|
points.push([base+this.barWidth/2, gridData[i][1]]);
|
||||||
|
points.push([base+this.barWidth/2, ystart]);
|
||||||
|
}
|
||||||
|
// for negative bars make sure points are always ordered clockwise
|
||||||
|
else {
|
||||||
|
points.push([base-this.barWidth/2, gridData[i][1]]);
|
||||||
|
points.push([base-this.barWidth/2, ystart]);
|
||||||
|
points.push([base+this.barWidth/2, ystart]);
|
||||||
|
points.push([base+this.barWidth/2, gridData[i][1]]);
|
||||||
|
}
|
||||||
|
this._barPoints.push(points);
|
||||||
|
// now draw the shadows if not stacked.
|
||||||
|
// for stacked plots, they are predrawn by drawShadow
|
||||||
|
if (shadow && !this._stack) {
|
||||||
|
var sopts = $.extend(true, {}, opts);
|
||||||
|
// need to get rid of fillStyle on shadow.
|
||||||
|
delete sopts.fillStyle;
|
||||||
|
this.renderer.shadowRenderer.draw(ctx, points, sopts);
|
||||||
|
}
|
||||||
|
var clr = opts.fillStyle || this.color;
|
||||||
|
this._dataColors.push(clr);
|
||||||
|
this.renderer.shapeRenderer.draw(ctx, points, opts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (this.barDirection == 'horizontal'){
|
||||||
|
for (var i=0; i<gridData.length; i++) {
|
||||||
|
if (!this._stack && this.data[i][0] == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
points = [];
|
||||||
|
base = gridData[i][1] - this._barNudge;
|
||||||
|
xstart;
|
||||||
|
|
||||||
|
if (this._stack && this._prevGridData.length) {
|
||||||
|
xstart = getStart(this.index, i, this._plotData[i][0], plot, 'x');
|
||||||
|
}
|
||||||
|
// not stacked
|
||||||
|
else {
|
||||||
|
if (this.fillToZero) {
|
||||||
|
xstart = this._xaxis.series_u2p(0);
|
||||||
|
}
|
||||||
|
else if (this.waterfall && i > 0 && i < this.gridData.length-1) {
|
||||||
|
xstart = this.gridData[i-1][0];
|
||||||
|
}
|
||||||
|
else if (this.waterfall && i == 0 && i < this.gridData.length-1) {
|
||||||
|
if (this._xaxis.min <= 0 && this._xaxis.max >= 0) {
|
||||||
|
xstart = this._xaxis.series_u2p(0);
|
||||||
|
}
|
||||||
|
else if (this._xaxis.min > 0) {
|
||||||
|
xstart = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
xstart = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (this.waterfall && i == this.gridData.length - 1) {
|
||||||
|
if (this._xaxis.min <= 0 && this._xaxis.max >= 0) {
|
||||||
|
xstart = this._xaxis.series_u2p(0);
|
||||||
|
}
|
||||||
|
else if (this._xaxis.min > 0) {
|
||||||
|
xstart = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
xstart = ctx.canvas.width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
xstart = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ((this.fillToZero && this._plotData[i][0] < 0) || (this.waterfall && this._data[i][0] < 0)) {
|
||||||
|
if (this.varyBarColor && !this._stack) {
|
||||||
|
if (this.useNegativeColors) {
|
||||||
|
opts.fillStyle = negativeColors.next();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
opts.fillStyle = positiveColors.next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
opts.fillStyle = negativeColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (this.varyBarColor && !this._stack) {
|
||||||
|
opts.fillStyle = positiveColors.next();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
opts.fillStyle = positiveColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!this.fillToZero || this._plotData[i][0] >= 0) {
|
||||||
|
points.push([xstart, base + this.barWidth / 2]);
|
||||||
|
points.push([xstart, base - this.barWidth / 2]);
|
||||||
|
points.push([gridData[i][0], base - this.barWidth / 2]);
|
||||||
|
points.push([gridData[i][0], base + this.barWidth / 2]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
points.push([gridData[i][0], base + this.barWidth / 2]);
|
||||||
|
points.push([gridData[i][0], base - this.barWidth / 2]);
|
||||||
|
points.push([xstart, base - this.barWidth / 2]);
|
||||||
|
points.push([xstart, base + this.barWidth / 2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._barPoints.push(points);
|
||||||
|
// now draw the shadows if not stacked.
|
||||||
|
// for stacked plots, they are predrawn by drawShadow
|
||||||
|
if (shadow && !this._stack) {
|
||||||
|
var sopts = $.extend(true, {}, opts);
|
||||||
|
delete sopts.fillStyle;
|
||||||
|
this.renderer.shadowRenderer.draw(ctx, points, sopts);
|
||||||
|
}
|
||||||
|
var clr = opts.fillStyle || this.color;
|
||||||
|
this._dataColors.push(clr);
|
||||||
|
this.renderer.shapeRenderer.draw(ctx, points, opts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.highlightColors.length == 0) {
|
||||||
|
this.highlightColors = $.jqplot.computeHighlightColors(this._dataColors);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (typeof(this.highlightColors) == 'string') {
|
||||||
|
var temp = this.highlightColors;
|
||||||
|
this.highlightColors = [];
|
||||||
|
for (var i=0; i<this._dataColors.length; i++) {
|
||||||
|
this.highlightColors.push(temp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// for stacked plots, shadows will be pre drawn by drawShadow.
|
||||||
|
$.jqplot.BarRenderer.prototype.drawShadow = function(ctx, gridData, options, plot) {
|
||||||
|
var i;
|
||||||
|
var opts = (options != undefined) ? options : {};
|
||||||
|
var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;
|
||||||
|
var showLine = (opts.showLine != undefined) ? opts.showLine : this.showLine;
|
||||||
|
var fill = (opts.fill != undefined) ? opts.fill : this.fill;
|
||||||
|
var xaxis = this.xaxis;
|
||||||
|
var yaxis = this.yaxis;
|
||||||
|
var xp = this._xaxis.series_u2p;
|
||||||
|
var yp = this._yaxis.series_u2p;
|
||||||
|
var pointx, points, pointy, nvals, nseries, pos;
|
||||||
|
|
||||||
|
if (this._stack && this.shadow) {
|
||||||
|
if (this.barWidth == null) {
|
||||||
|
this.renderer.setBarWidth.call(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
var temp = this._plotSeriesInfo = this.renderer.calcSeriesNumbers.call(this);
|
||||||
|
nvals = temp[0];
|
||||||
|
nseries = temp[1];
|
||||||
|
pos = temp[2];
|
||||||
|
|
||||||
|
if (this._stack) {
|
||||||
|
this._barNudge = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this._barNudge = (-Math.abs(nseries/2 - 0.5) + pos) * (this.barWidth + this.barPadding);
|
||||||
|
}
|
||||||
|
if (showLine) {
|
||||||
|
|
||||||
|
if (this.barDirection == 'vertical') {
|
||||||
|
for (var i=0; i<gridData.length; i++) {
|
||||||
|
if (this.data[i][1] == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
points = [];
|
||||||
|
var base = gridData[i][0] + this._barNudge;
|
||||||
|
var ystart;
|
||||||
|
|
||||||
|
if (this._stack && this._prevGridData.length) {
|
||||||
|
ystart = getStart(this.index, i, this._plotData[i][1], plot, 'y');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (this.fillToZero) {
|
||||||
|
ystart = this._yaxis.series_u2p(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ystart = ctx.canvas.height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
points.push([base-this.barWidth/2, ystart]);
|
||||||
|
points.push([base-this.barWidth/2, gridData[i][1]]);
|
||||||
|
points.push([base+this.barWidth/2, gridData[i][1]]);
|
||||||
|
points.push([base+this.barWidth/2, ystart]);
|
||||||
|
this.renderer.shadowRenderer.draw(ctx, points, opts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (this.barDirection == 'horizontal'){
|
||||||
|
for (var i=0; i<gridData.length; i++) {
|
||||||
|
if (this.data[i][0] == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
points = [];
|
||||||
|
var base = gridData[i][1] - this._barNudge;
|
||||||
|
var xstart;
|
||||||
|
|
||||||
|
if (this._stack && this._prevGridData.length) {
|
||||||
|
xstart = getStart(this.index, i, this._plotData[i][0], plot, 'x');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (this.fillToZero) {
|
||||||
|
xstart = this._xaxis.series_u2p(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
xstart = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
points.push([xstart, base+this.barWidth/2]);
|
||||||
|
points.push([gridData[i][0], base+this.barWidth/2]);
|
||||||
|
points.push([gridData[i][0], base-this.barWidth/2]);
|
||||||
|
points.push([xstart, base-this.barWidth/2]);
|
||||||
|
this.renderer.shadowRenderer.draw(ctx, points, opts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function postInit(target, data, options) {
|
||||||
|
for (var i=0; i<this.series.length; i++) {
|
||||||
|
if (this.series[i].renderer.constructor == $.jqplot.BarRenderer) {
|
||||||
|
// don't allow mouseover and mousedown at same time.
|
||||||
|
if (this.series[i].highlightMouseOver) {
|
||||||
|
this.series[i].highlightMouseDown = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// called within context of plot
|
||||||
|
// create a canvas which we can draw on.
|
||||||
|
// insert it before the eventCanvas, so eventCanvas will still capture events.
|
||||||
|
function postPlotDraw() {
|
||||||
|
// Memory Leaks patch
|
||||||
|
if (this.plugins.barRenderer && this.plugins.barRenderer.highlightCanvas) {
|
||||||
|
|
||||||
|
this.plugins.barRenderer.highlightCanvas.resetCanvas();
|
||||||
|
this.plugins.barRenderer.highlightCanvas = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.plugins.barRenderer = {highlightedSeriesIndex:null};
|
||||||
|
this.plugins.barRenderer.highlightCanvas = new $.jqplot.GenericCanvas();
|
||||||
|
|
||||||
|
this.eventCanvas._elem.before(this.plugins.barRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-barRenderer-highlight-canvas', this._plotDimensions, this));
|
||||||
|
this.plugins.barRenderer.highlightCanvas.setContext();
|
||||||
|
this.eventCanvas._elem.bind('mouseleave', {plot:this}, function (ev) { unhighlight(ev.data.plot); });
|
||||||
|
}
|
||||||
|
|
||||||
|
function highlight (plot, sidx, pidx, points) {
|
||||||
|
var s = plot.series[sidx];
|
||||||
|
var canvas = plot.plugins.barRenderer.highlightCanvas;
|
||||||
|
canvas._ctx.clearRect(0,0,canvas._ctx.canvas.width, canvas._ctx.canvas.height);
|
||||||
|
s._highlightedPoint = pidx;
|
||||||
|
plot.plugins.barRenderer.highlightedSeriesIndex = sidx;
|
||||||
|
var opts = {fillStyle: s.highlightColors[pidx]};
|
||||||
|
s.renderer.shapeRenderer.draw(canvas._ctx, points, opts);
|
||||||
|
canvas = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function unhighlight (plot) {
|
||||||
|
var canvas = plot.plugins.barRenderer.highlightCanvas;
|
||||||
|
canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height);
|
||||||
|
for (var i=0; i<plot.series.length; i++) {
|
||||||
|
plot.series[i]._highlightedPoint = null;
|
||||||
|
}
|
||||||
|
plot.plugins.barRenderer.highlightedSeriesIndex = null;
|
||||||
|
plot.target.trigger('jqplotDataUnhighlight');
|
||||||
|
canvas = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function handleMove(ev, gridpos, datapos, neighbor, plot) {
|
||||||
|
if (neighbor) {
|
||||||
|
var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];
|
||||||
|
var evt1 = jQuery.Event('jqplotDataMouseOver');
|
||||||
|
evt1.pageX = ev.pageX;
|
||||||
|
evt1.pageY = ev.pageY;
|
||||||
|
plot.target.trigger(evt1, ins);
|
||||||
|
if (plot.series[ins[0]].show && plot.series[ins[0]].highlightMouseOver &&
|
||||||
|
!(ins[0] == plot.plugins.barRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {
|
||||||
|
var evt = jQuery.Event('jqplotDataHighlight');
|
||||||
|
evt.which = ev.which;
|
||||||
|
evt.pageX = ev.pageX;
|
||||||
|
evt.pageY = ev.pageY;
|
||||||
|
plot.target.trigger(evt, ins);
|
||||||
|
highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (neighbor == null) {
|
||||||
|
unhighlight (plot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {
|
||||||
|
if (neighbor) {
|
||||||
|
var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];
|
||||||
|
if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.barRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {
|
||||||
|
var evt = jQuery.Event('jqplotDataHighlight');
|
||||||
|
evt.which = ev.which;
|
||||||
|
evt.pageX = ev.pageX;
|
||||||
|
evt.pageY = ev.pageY;
|
||||||
|
plot.target.trigger(evt, ins);
|
||||||
|
highlight (plot, neighbor.seriesIndex, neighbor.pointIndex, neighbor.points);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (neighbor == null) {
|
||||||
|
unhighlight (plot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMouseUp(ev, gridpos, datapos, neighbor, plot) {
|
||||||
|
var idx = plot.plugins.barRenderer.highlightedSeriesIndex;
|
||||||
|
if (idx != null && plot.series[idx].highlightMouseDown) {
|
||||||
|
unhighlight(plot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleClick(ev, gridpos, datapos, neighbor, plot) {
|
||||||
|
if (neighbor) {
|
||||||
|
var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];
|
||||||
|
var evt = jQuery.Event('jqplotDataClick');
|
||||||
|
evt.which = ev.which;
|
||||||
|
evt.pageX = ev.pageX;
|
||||||
|
evt.pageY = ev.pageY;
|
||||||
|
plot.target.trigger(evt, ins);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleRightClick(ev, gridpos, datapos, neighbor, plot) {
|
||||||
|
if (neighbor) {
|
||||||
|
var ins = [neighbor.seriesIndex, neighbor.pointIndex, neighbor.data];
|
||||||
|
var idx = plot.plugins.barRenderer.highlightedSeriesIndex;
|
||||||
|
if (idx != null && plot.series[idx].highlightMouseDown) {
|
||||||
|
unhighlight(plot);
|
||||||
|
}
|
||||||
|
var evt = jQuery.Event('jqplotDataRightClick');
|
||||||
|
evt.which = ev.which;
|
||||||
|
evt.pageX = ev.pageX;
|
||||||
|
evt.pageY = ev.pageY;
|
||||||
|
plot.target.trigger(evt, ins);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
|
||||||
|
jsDate | (c) 2010-2013 Chris Leonello
|
||||||
|
*/(function(d){d.jqplot.BarRenderer=function(){d.jqplot.LineRenderer.call(this)};d.jqplot.BarRenderer.prototype=new d.jqplot.LineRenderer();d.jqplot.BarRenderer.prototype.constructor=d.jqplot.BarRenderer;d.jqplot.BarRenderer.prototype.init=function(o,q){this.barPadding=8;this.barMargin=10;this.barDirection="vertical";this.barWidth=null;this.shadowOffset=2;this.shadowDepth=5;this.shadowAlpha=0.08;this.waterfall=false;this.groups=1;this.varyBarColor=false;this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColors=[];this.transposedData=true;this.renderer.animation={show:false,direction:"down",speed:3000,_supported:true};this._type="bar";if(o.highlightMouseDown&&o.highlightMouseOver==null){o.highlightMouseOver=false}d.extend(true,this,o);d.extend(true,this.renderer,o);this.fill=true;if(this.barDirection==="horizontal"&&this.rendererOptions.animation&&this.rendererOptions.animation.direction==null){this.renderer.animation.direction="left"}if(this.waterfall){this.fillToZero=false;this.disableStack=true}if(this.barDirection=="vertical"){this._primaryAxis="_xaxis";this._stackAxis="y";this.fillAxis="y"}else{this._primaryAxis="_yaxis";this._stackAxis="x";this.fillAxis="x"}this._highlightedPoint=null;this._plotSeriesInfo=null;this._dataColors=[];this._barPoints=[];var p={lineJoin:"miter",lineCap:"round",fill:true,isarc:false,strokeStyle:this.color,fillStyle:this.color,closePath:this.fill};this.renderer.shapeRenderer.init(p);var n={lineJoin:"miter",lineCap:"round",fill:true,isarc:false,angle:this.shadowAngle,offset:this.shadowOffset,alpha:this.shadowAlpha,depth:this.shadowDepth,closePath:this.fill};this.renderer.shadowRenderer.init(n);q.postInitHooks.addOnce(h);q.postDrawHooks.addOnce(j);q.eventListenerHooks.addOnce("jqplotMouseMove",b);q.eventListenerHooks.addOnce("jqplotMouseDown",a);q.eventListenerHooks.addOnce("jqplotMouseUp",l);q.eventListenerHooks.addOnce("jqplotClick",e);q.eventListenerHooks.addOnce("jqplotRightClick",m)};function g(t,p,o,w){if(this.rendererOptions.barDirection=="horizontal"){this._stackAxis="x";this._primaryAxis="_yaxis"}if(this.rendererOptions.waterfall==true){this._data=d.extend(true,[],this.data);var s=0;var u=(!this.rendererOptions.barDirection||this.rendererOptions.barDirection==="vertical"||this.transposedData===false)?1:0;for(var q=0;q<this.data.length;q++){s+=this.data[q][u];if(q>0){this.data[q][u]+=this.data[q-1][u]}}this.data[this.data.length]=(u==1)?[this.data.length+1,s]:[s,this.data.length+1];this._data[this._data.length]=(u==1)?[this._data.length+1,s]:[s,this._data.length+1]}if(this.rendererOptions.groups>1){this.breakOnNull=true;var n=this.data.length;var v=parseInt(n/this.rendererOptions.groups,10);var r=0;for(var q=v;q<n;q+=v){this.data.splice(q+r,0,[null,null]);this._plotData.splice(q+r,0,[null,null]);this._stackData.splice(q+r,0,[null,null]);r++}for(q=0;q<this.data.length;q++){if(this._primaryAxis=="_xaxis"){this.data[q][0]=q+1;this._plotData[q][0]=q+1;this._stackData[q][0]=q+1}else{this.data[q][1]=q+1;this._plotData[q][1]=q+1;this._stackData[q][1]=q+1}}}}d.jqplot.preSeriesInitHooks.push(g);d.jqplot.BarRenderer.prototype.calcSeriesNumbers=function(){var r=0;var t=0;var q=this[this._primaryAxis];var p,o,u;for(var n=0;n<q._series.length;n++){o=q._series[n];if(o===this){u=n}if(o.renderer.constructor==d.jqplot.BarRenderer){r+=o.data.length;t+=1}}return[r,t,u]};d.jqplot.BarRenderer.prototype.setBarWidth=function(){var q;var n=0;var o=0;var t=this[this._primaryAxis];var x,r,v;var w=this._plotSeriesInfo=this.renderer.calcSeriesNumbers.call(this);n=w[0];o=w[1];var u=t.numberTicks;var p=(u-1)/2;if(t.name=="xaxis"||t.name=="x2axis"){if(this._stack){this.barWidth=(t._offsets.max-t._offsets.min)/n*o-this.barMargin}else{this.barWidth=((t._offsets.max-t._offsets.min)/p-this.barPadding*(o-1)-this.barMargin*2)/o}}else{if(this._stack){this.barWidth=(t._offsets.min-t._offsets.max)/n*o-this.barMargin}else{this.barWidth=((t._offsets.min-t._offsets.max)/p-this.barPadding*(o-1)-this.barMargin*2)/o}}return[n,o]};function f(o){var q=[];for(var s=0;s<o.length;s++){var r=d.jqplot.getColorComponents(o[s]);var n=[r[0],r[1],r[2]];var t=n[0]+n[1]+n[2];for(var p=0;p<3;p++){n[p]=(t>570)?n[p]*0.8:n[p]+0.3*(255-n[p]);n[p]=parseInt(n[p],10)}q.push("rgb("+n[0]+","+n[1]+","+n[2]+")")}return q}function i(v,u,s,t,o){var q=v,w=v-1,n,p,r=(o==="x")?0:1;if(q>0){p=t.series[w]._plotData[u][r];if((s*p)<0){n=i(w,u,s,t,o)}else{n=t.series[w].gridData[u][r]}}else{n=(r===0)?t.series[q]._xaxis.series_u2p(0):t.series[q]._yaxis.series_u2p(0)}return n}d.jqplot.BarRenderer.prototype.draw=function(E,L,q,G){var I;var A=d.extend({},q);var w=(A.shadow!=undefined)?A.shadow:this.shadow;var O=(A.showLine!=undefined)?A.showLine:this.showLine;var F=(A.fill!=undefined)?A.fill:this.fill;var p=this.xaxis;var J=this.yaxis;var y=this._xaxis.series_u2p;var K=this._yaxis.series_u2p;var D,C;this._dataColors=[];this._barPoints=[];if(this.barWidth==null){this.renderer.setBarWidth.call(this)}var N=this._plotSeriesInfo=this.renLine truncated
|
||||||
@@ -0,0 +1,235 @@
|
|||||||
|
/**
|
||||||
|
* jqPlot
|
||||||
|
* Pure JavaScript plotting plugin using jQuery
|
||||||
|
*
|
||||||
|
* Version: 1.0.8
|
||||||
|
* Revision: 1250
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009-2013 Chris Leonello
|
||||||
|
* jqPlot is currently available for use in all personal or commercial projects
|
||||||
|
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
|
||||||
|
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
|
||||||
|
* choose the license that best suits your project and use it accordingly.
|
||||||
|
*
|
||||||
|
* Although not required, the author would appreciate an email letting him
|
||||||
|
* know of any substantial use of jqPlot. You can reach the author at:
|
||||||
|
* chris at jqplot dot com or see http://www.jqplot.com/info.php .
|
||||||
|
*
|
||||||
|
* If you are feeling kind and generous, consider supporting the project by
|
||||||
|
* making a donation at: http://www.jqplot.com/donate.php .
|
||||||
|
*
|
||||||
|
* sprintf functions contained in jqplot.sprintf.js by Ash Searle:
|
||||||
|
*
|
||||||
|
* version 2007.04.27
|
||||||
|
* author Ash Searle
|
||||||
|
* http://hexmen.com/blog/2007/03/printf-sprintf/
|
||||||
|
* http://hexmen.com/js/sprintf.js
|
||||||
|
* The author (Ash Searle) has placed this code in the public domain:
|
||||||
|
* "This code is unrestricted: you are free to use it however you like."
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
(function($) {
|
||||||
|
/**
|
||||||
|
* Class: $.jqplot.BlockRenderer
|
||||||
|
* Plugin renderer to draw a x-y block chart. A Block chart has data points displayed as
|
||||||
|
* colored squares with a text label inside. Data must be supplied in the form:
|
||||||
|
*
|
||||||
|
* > [[x1, y1, "label 1", {css}], [x2, y2, "label 2", {css}], ...]
|
||||||
|
*
|
||||||
|
* The label and css object are optional. If the label is ommitted, the
|
||||||
|
* box will collapse unless a css height and/or width is specified.
|
||||||
|
*
|
||||||
|
* The css object is an object specifying css properties
|
||||||
|
* such as:
|
||||||
|
*
|
||||||
|
* > {background:'#4f98a5', border:'3px solid gray', padding:'1px'}
|
||||||
|
*
|
||||||
|
* Note that css properties specified with the data point override defaults
|
||||||
|
* specified with the series.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
$.jqplot.BlockRenderer = function(){
|
||||||
|
$.jqplot.LineRenderer.call(this);
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BlockRenderer.prototype = new $.jqplot.LineRenderer();
|
||||||
|
$.jqplot.BlockRenderer.prototype.constructor = $.jqplot.BlockRenderer;
|
||||||
|
|
||||||
|
// called with scope of a series
|
||||||
|
$.jqplot.BlockRenderer.prototype.init = function(options) {
|
||||||
|
// Group: Properties
|
||||||
|
//
|
||||||
|
// prop: css
|
||||||
|
// default css styles that will be applied to all data blocks.
|
||||||
|
// these values will be overridden by css styles supplied with the
|
||||||
|
// individulal data points.
|
||||||
|
this.css = {padding:'2px', border:'1px solid #999', textAlign:'center'};
|
||||||
|
// prop: escapeHtml
|
||||||
|
// true to escape html in the box label.
|
||||||
|
this.escapeHtml = false;
|
||||||
|
// prop: insertBreaks
|
||||||
|
// true to turn spaces in data block label into html breaks <br />.
|
||||||
|
this.insertBreaks = true;
|
||||||
|
// prop: varyBlockColors
|
||||||
|
// true to vary the color of each block in this series according to
|
||||||
|
// the seriesColors array. False to set each block to the color
|
||||||
|
// specified on this series. This has no effect if a css background color
|
||||||
|
// option is specified in the renderer css options.
|
||||||
|
this.varyBlockColors = false;
|
||||||
|
$.extend(true, this, options);
|
||||||
|
if (this.css.backgroundColor) {
|
||||||
|
this.color = this.css.backgroundColor;
|
||||||
|
}
|
||||||
|
else if (this.css.background) {
|
||||||
|
this.color = this.css.background;
|
||||||
|
}
|
||||||
|
else if (!this.varyBlockColors) {
|
||||||
|
this.css.background = this.color;
|
||||||
|
}
|
||||||
|
this.canvas = new $.jqplot.BlockCanvas();
|
||||||
|
this.shadowCanvas = new $.jqplot.BlockCanvas();
|
||||||
|
this.canvas._plotDimensions = this._plotDimensions;
|
||||||
|
this.shadowCanvas._plotDimensions = this._plotDimensions;
|
||||||
|
this._type = 'block';
|
||||||
|
|
||||||
|
// group: Methods
|
||||||
|
//
|
||||||
|
// Method: moveBlock
|
||||||
|
// Moves an individual block. More efficient than redrawing
|
||||||
|
// the whole series by calling plot.drawSeries().
|
||||||
|
// Properties:
|
||||||
|
// idx - the 0 based index of the block or point in this series.
|
||||||
|
// x - the x coordinate in data units (value on x axis) to move the block to.
|
||||||
|
// y - the y coordinate in data units (value on the y axis) to move the block to.
|
||||||
|
// duration - optional parameter to create an animated movement. Can be a
|
||||||
|
// number (higher is slower animation) or 'fast', 'normal' or 'slow'. If not
|
||||||
|
// provided, the element is moved without any animation.
|
||||||
|
this.moveBlock = function (idx, x, y, duration) {
|
||||||
|
// update plotData, stackData, data and gridData
|
||||||
|
// x and y are in data coordinates.
|
||||||
|
var el = this.canvas._elem.children(':eq('+idx+')');
|
||||||
|
this.data[idx][0] = x;
|
||||||
|
this.data[idx][1] = y;
|
||||||
|
this._plotData[idx][0] = x;
|
||||||
|
this._plotData[idx][1] = y;
|
||||||
|
this._stackData[idx][0] = x;
|
||||||
|
this._stackData[idx][1] = y;
|
||||||
|
this.gridData[idx][0] = this._xaxis.series_u2p(x);
|
||||||
|
this.gridData[idx][1] = this._yaxis.series_u2p(y);
|
||||||
|
var w = el.outerWidth();
|
||||||
|
var h = el.outerHeight();
|
||||||
|
var left = this.gridData[idx][0] - w/2 + 'px';
|
||||||
|
var top = this.gridData[idx][1] - h/2 + 'px';
|
||||||
|
if (duration) {
|
||||||
|
if (parseInt(duration, 10)) {
|
||||||
|
duration = parseInt(duration, 10);
|
||||||
|
}
|
||||||
|
el.animate({left:left, top:top}, duration);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
el.css({left:left, top:top});
|
||||||
|
}
|
||||||
|
el = null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// called with scope of series
|
||||||
|
$.jqplot.BlockRenderer.prototype.draw = function (ctx, gd, options) {
|
||||||
|
if (this.plugins.pointLabels) {
|
||||||
|
this.plugins.pointLabels.show = false;
|
||||||
|
}
|
||||||
|
var i, el, d, gd, t, css, w, h, left, top;
|
||||||
|
var opts = (options != undefined) ? options : {};
|
||||||
|
var colorGenerator = new $.jqplot.ColorGenerator(this.seriesColors);
|
||||||
|
this.canvas._elem.empty();
|
||||||
|
for (i=0; i<this.gridData.length; i++) {
|
||||||
|
d = this.data[i];
|
||||||
|
gd = this.gridData[i];
|
||||||
|
t = '';
|
||||||
|
css = {};
|
||||||
|
if (typeof d[2] == 'string') {
|
||||||
|
t = d[2];
|
||||||
|
}
|
||||||
|
else if (typeof d[2] == 'object') {
|
||||||
|
css = d[2];
|
||||||
|
}
|
||||||
|
if (typeof d[3] == 'object') {
|
||||||
|
css = d[3];
|
||||||
|
}
|
||||||
|
if (this.insertBreaks){
|
||||||
|
t = t.replace(/ /g, '<br />');
|
||||||
|
}
|
||||||
|
css = $.extend(true, {}, this.css, css);
|
||||||
|
// create a div
|
||||||
|
el = $('<div style="position:absolute;margin-left:auto;margin-right:auto;"></div>');
|
||||||
|
this.canvas._elem.append(el);
|
||||||
|
// set text
|
||||||
|
this.escapeHtml ? el.text(t) : el.html(t);
|
||||||
|
// style it
|
||||||
|
// remove styles we don't want overridden.
|
||||||
|
delete css.position;
|
||||||
|
delete css.marginRight;
|
||||||
|
delete css.marginLeft;
|
||||||
|
if (!css.background && !css.backgroundColor && !css.backgroundImage){
|
||||||
|
css.background = colorGenerator.next();
|
||||||
|
}
|
||||||
|
el.css(css);
|
||||||
|
w = el.outerWidth();
|
||||||
|
h = el.outerHeight();
|
||||||
|
left = gd[0] - w/2 + 'px';
|
||||||
|
top = gd[1] - h/2 + 'px';
|
||||||
|
el.css({left:left, top:top});
|
||||||
|
el = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BlockCanvas = function() {
|
||||||
|
$.jqplot.ElemContainer.call(this);
|
||||||
|
this._ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BlockCanvas.prototype = new $.jqplot.ElemContainer();
|
||||||
|
$.jqplot.BlockCanvas.prototype.constructor = $.jqplot.BlockCanvas;
|
||||||
|
|
||||||
|
$.jqplot.BlockCanvas.prototype.createElement = function(offsets, clss, plotDimensions) {
|
||||||
|
this._offsets = offsets;
|
||||||
|
var klass = 'jqplot-blockCanvas';
|
||||||
|
if (clss != undefined) {
|
||||||
|
klass = clss;
|
||||||
|
}
|
||||||
|
var elem;
|
||||||
|
// if this canvas already has a dom element, don't make a new one.
|
||||||
|
if (this._elem) {
|
||||||
|
elem = this._elem.get(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
elem = document.createElement('div');
|
||||||
|
}
|
||||||
|
// if new plotDimensions supplied, use them.
|
||||||
|
if (plotDimensions != undefined) {
|
||||||
|
this._plotDimensions = plotDimensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
var w = this._plotDimensions.width - this._offsets.left - this._offsets.right + 'px';
|
||||||
|
var h = this._plotDimensions.height - this._offsets.top - this._offsets.bottom + 'px';
|
||||||
|
this._elem = $(elem);
|
||||||
|
this._elem.css({ position: 'absolute', width:w, height:h, left: this._offsets.left, top: this._offsets.top });
|
||||||
|
|
||||||
|
this._elem.addClass(klass);
|
||||||
|
return this._elem;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BlockCanvas.prototype.setContext = function() {
|
||||||
|
this._ctx = {
|
||||||
|
canvas:{
|
||||||
|
width:0,
|
||||||
|
height:0
|
||||||
|
},
|
||||||
|
clearRect:function(){return null;}
|
||||||
|
};
|
||||||
|
return this._ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
|
||||||
|
jsDate | (c) 2010-2013 Chris Leonello
|
||||||
|
*/(function(a){a.jqplot.BlockRenderer=function(){a.jqplot.LineRenderer.call(this)};a.jqplot.BlockRenderer.prototype=new a.jqplot.LineRenderer();a.jqplot.BlockRenderer.prototype.constructor=a.jqplot.BlockRenderer;a.jqplot.BlockRenderer.prototype.init=function(b){this.css={padding:"2px",border:"1px solid #999",textAlign:"center"};this.escapeHtml=false;this.insertBreaks=true;this.varyBlockColors=false;a.extend(true,this,b);if(this.css.backgroundColor){this.color=this.css.backgroundColor}else{if(this.css.background){this.color=this.css.background}else{if(!this.varyBlockColors){this.css.background=this.color}}}this.canvas=new a.jqplot.BlockCanvas();this.shadowCanvas=new a.jqplot.BlockCanvas();this.canvas._plotDimensions=this._plotDimensions;this.shadowCanvas._plotDimensions=this._plotDimensions;this._type="block";this.moveBlock=function(l,j,i,e){var c=this.canvas._elem.children(":eq("+l+")");this.data[l][0]=j;this.data[l][1]=i;this._plotData[l][0]=j;this._plotData[l][1]=i;this._stackData[l][0]=j;this._stackData[l][1]=i;this.gridData[l][0]=this._xaxis.series_u2p(j);this.gridData[l][1]=this._yaxis.series_u2p(i);var k=c.outerWidth();var f=c.outerHeight();var d=this.gridData[l][0]-k/2+"px";var g=this.gridData[l][1]-f/2+"px";if(e){if(parseInt(e,10)){e=parseInt(e,10)}c.animate({left:d,top:g},e)}else{c.css({left:d,top:g})}c=null}};a.jqplot.BlockRenderer.prototype.draw=function(q,o,r){if(this.plugins.pointLabels){this.plugins.pointLabels.show=false}var f,c,l,o,p,k,n,g,e,m;var b=(r!=undefined)?r:{};var j=new a.jqplot.ColorGenerator(this.seriesColors);this.canvas._elem.empty();for(f=0;f<this.gridData.length;f++){l=this.data[f];o=this.gridData[f];p="";k={};if(typeof l[2]=="string"){p=l[2]}else{if(typeof l[2]=="object"){k=l[2]}}if(typeof l[3]=="object"){k=l[3]}if(this.insertBreaks){p=p.replace(/ /g,"<br />")}k=a.extend(true,{},this.css,k);c=a('<div style="position:absolute;margin-left:auto;margin-right:auto;"></div>');this.canvas._elem.append(c);this.escapeHtml?c.text(p):c.html(p);delete k.position;delete k.marginRight;delete k.marginLeft;if(!k.background&&!k.backgroundColor&&!k.backgroundImage){k.background=j.next()}c.css(k);n=c.outerWidth();g=c.outerHeight();e=o[0]-n/2+"px";m=o[1]-g/2+"px";c.css({left:e,top:m});c=null}};a.jqplot.BlockCanvas=function(){a.jqplot.ElemContainer.call(this);this._ctx};a.jqplot.BlockCanvas.prototype=new a.jqplot.ElemContainer();a.jqplot.BlockCanvas.prototype.constructor=a.jqplot.BlockCanvas;a.jqplot.BlockCanvas.prototype.createElement=function(i,e,c){this._offsets=i;var b="jqplot-blockCanvas";if(e!=undefined){b=e}var g;if(this._elem){g=this._elem.get(0)}else{g=document.createElement("div")}if(c!=undefined){this._plotDimensions=c}var d=this._plotDimensions.width-this._offsets.left-this._offsets.right+"px";var f=this._plotDimensions.height-this._offsets.top-this._offsets.bottom+"px";this._elem=a(g);this._elem.css({position:"absolute",width:d,height:f,left:this._offsets.left,top:this._offsets.top});this._elem.addClass(b);return this._elem};a.jqplot.BlockCanvas.prototype.setContext=function(){this._ctx={canvas:{width:0,height:0},clearRect:function(){return null}};return this._ctx}})(jQuery);
|
||||||
@@ -0,0 +1,759 @@
|
|||||||
|
/**
|
||||||
|
* jqPlot
|
||||||
|
* Pure JavaScript plotting plugin using jQuery
|
||||||
|
*
|
||||||
|
* Version: 1.0.8
|
||||||
|
* Revision: 1250
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009-2013 Chris Leonello
|
||||||
|
* jqPlot is currently available for use in all personal or commercial projects
|
||||||
|
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
|
||||||
|
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
|
||||||
|
* choose the license that best suits your project and use it accordingly.
|
||||||
|
*
|
||||||
|
* Although not required, the author would appreciate an email letting him
|
||||||
|
* know of any substantial use of jqPlot. You can reach the author at:
|
||||||
|
* chris at jqplot dot com or see http://www.jqplot.com/info.php .
|
||||||
|
*
|
||||||
|
* If you are feeling kind and generous, consider supporting the project by
|
||||||
|
* making a donation at: http://www.jqplot.com/donate.php .
|
||||||
|
*
|
||||||
|
* sprintf functions contained in jqplot.sprintf.js by Ash Searle:
|
||||||
|
*
|
||||||
|
* version 2007.04.27
|
||||||
|
* author Ash Searle
|
||||||
|
* http://hexmen.com/blog/2007/03/printf-sprintf/
|
||||||
|
* http://hexmen.com/js/sprintf.js
|
||||||
|
* The author (Ash Searle) has placed this code in the public domain:
|
||||||
|
* "This code is unrestricted: you are free to use it however you like."
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
(function($) {
|
||||||
|
var arrayMax = function( array ){
|
||||||
|
return Math.max.apply( Math, array );
|
||||||
|
};
|
||||||
|
var arrayMin = function( array ){
|
||||||
|
return Math.min.apply( Math, array );
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class: $.jqplot.BubbleRenderer
|
||||||
|
* Plugin renderer to draw a bubble chart. A Bubble chart has data points displayed as
|
||||||
|
* colored circles with an optional text label inside. To use
|
||||||
|
* the bubble renderer, you must include the bubble renderer like:
|
||||||
|
*
|
||||||
|
* > <script language="javascript" type="text/javascript" src="../src/plugins/jqplot.bubbleRenderer.js"></script>
|
||||||
|
*
|
||||||
|
* Data must be supplied in
|
||||||
|
* the form:
|
||||||
|
*
|
||||||
|
* > [[x1, y1, r1, <label or {label:'text', color:color}>], ...]
|
||||||
|
*
|
||||||
|
* where the label or options
|
||||||
|
* object is optional.
|
||||||
|
*
|
||||||
|
* Note that all bubble colors will be the same
|
||||||
|
* unless the "varyBubbleColors" option is set to true. Colors can be specified in the data array
|
||||||
|
* or in the seriesColors array option on the series. If no colors are defined, the default jqPlot
|
||||||
|
* series of 16 colors are used. Colors are automatically cycled around again if there are more
|
||||||
|
* bubbles than colors.
|
||||||
|
*
|
||||||
|
* Bubbles are autoscaled by default to fit within the chart area while maintaining
|
||||||
|
* relative sizes. If the "autoscaleBubbles" option is set to false, the r(adius) values
|
||||||
|
* in the data array a treated as literal pixel values for the radii of the bubbles.
|
||||||
|
*
|
||||||
|
* Properties are passed into the bubble renderer in the rendererOptions object of
|
||||||
|
* the series options like:
|
||||||
|
*
|
||||||
|
* > seriesDefaults: {
|
||||||
|
* > renderer: $.jqplot.BubbleRenderer,
|
||||||
|
* > rendererOptions: {
|
||||||
|
* > bubbleAlpha: 0.7,
|
||||||
|
* > varyBubbleColors: false
|
||||||
|
* > }
|
||||||
|
* > }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
$.jqplot.BubbleRenderer = function(){
|
||||||
|
$.jqplot.LineRenderer.call(this);
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BubbleRenderer.prototype = new $.jqplot.LineRenderer();
|
||||||
|
$.jqplot.BubbleRenderer.prototype.constructor = $.jqplot.BubbleRenderer;
|
||||||
|
|
||||||
|
// called with scope of a series
|
||||||
|
$.jqplot.BubbleRenderer.prototype.init = function(options, plot) {
|
||||||
|
// Group: Properties
|
||||||
|
//
|
||||||
|
// prop: varyBubbleColors
|
||||||
|
// True to vary the color of each bubble in this series according to
|
||||||
|
// the seriesColors array. False to set each bubble to the color
|
||||||
|
// specified on this series. This has no effect if a css background color
|
||||||
|
// option is specified in the renderer css options.
|
||||||
|
this.varyBubbleColors = true;
|
||||||
|
// prop: autoscaleBubbles
|
||||||
|
// True to scale the bubble radius based on plot size.
|
||||||
|
// False will use the radius value as provided as a raw pixel value for
|
||||||
|
// bubble radius.
|
||||||
|
this.autoscaleBubbles = true;
|
||||||
|
// prop: autoscaleMultiplier
|
||||||
|
// Multiplier the bubble size if autoscaleBubbles is true.
|
||||||
|
this.autoscaleMultiplier = 1.0;
|
||||||
|
// prop: autoscalePointsFactor
|
||||||
|
// Factor which decreases bubble size based on how many bubbles on on the chart.
|
||||||
|
// 0 means no adjustment for number of bubbles. Negative values will decrease
|
||||||
|
// size of bubbles as more bubbles are added. Values between 0 and -0.2
|
||||||
|
// should work well.
|
||||||
|
this.autoscalePointsFactor = -0.07;
|
||||||
|
// prop: escapeHtml
|
||||||
|
// True to escape html in bubble label text.
|
||||||
|
this.escapeHtml = true;
|
||||||
|
// prop: highlightMouseOver
|
||||||
|
// True to highlight bubbles when moused over.
|
||||||
|
// This must be false to enable highlightMouseDown to highlight when clicking on a slice.
|
||||||
|
this.highlightMouseOver = true;
|
||||||
|
// prop: highlightMouseDown
|
||||||
|
// True to highlight when a mouse button is pressed over a bubble.
|
||||||
|
// This will be disabled if highlightMouseOver is true.
|
||||||
|
this.highlightMouseDown = false;
|
||||||
|
// prop: highlightColors
|
||||||
|
// An array of colors to use when highlighting a slice. Calculated automatically
|
||||||
|
// if not supplied.
|
||||||
|
this.highlightColors = [];
|
||||||
|
// prop: bubbleAlpha
|
||||||
|
// Alpha transparency to apply to all bubbles in this series.
|
||||||
|
this.bubbleAlpha = 1.0;
|
||||||
|
// prop: highlightAlpha
|
||||||
|
// Alpha transparency to apply when highlighting bubble.
|
||||||
|
// Set to value of bubbleAlpha by default.
|
||||||
|
this.highlightAlpha = null;
|
||||||
|
// prop: bubbleGradients
|
||||||
|
// True to color the bubbles with gradient fills instead of flat colors.
|
||||||
|
// NOT AVAILABLE IN IE due to lack of excanvas support for radial gradient fills.
|
||||||
|
// will be ignored in IE.
|
||||||
|
this.bubbleGradients = false;
|
||||||
|
// prop: showLabels
|
||||||
|
// True to show labels on bubbles (if any), false to not show.
|
||||||
|
this.showLabels = true;
|
||||||
|
// array of [point index, radius] which will be sorted in descending order to plot
|
||||||
|
// largest points below smaller points.
|
||||||
|
this.radii = [];
|
||||||
|
this.maxRadius = 0;
|
||||||
|
// index of the currenty highlighted point, if any
|
||||||
|
this._highlightedPoint = null;
|
||||||
|
// array of jQuery labels.
|
||||||
|
this.labels = [];
|
||||||
|
this.bubbleCanvases = [];
|
||||||
|
this._type = 'bubble';
|
||||||
|
|
||||||
|
// if user has passed in highlightMouseDown option and not set highlightMouseOver, disable highlightMouseOver
|
||||||
|
if (options.highlightMouseDown && options.highlightMouseOver == null) {
|
||||||
|
options.highlightMouseOver = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$.extend(true, this, options);
|
||||||
|
|
||||||
|
if (this.highlightAlpha == null) {
|
||||||
|
this.highlightAlpha = this.bubbleAlpha;
|
||||||
|
if (this.bubbleGradients) {
|
||||||
|
this.highlightAlpha = 0.35;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.autoscaleMultiplier = this.autoscaleMultiplier * Math.pow(this.data.length, this.autoscalePointsFactor);
|
||||||
|
|
||||||
|
// index of the currenty highlighted point, if any
|
||||||
|
this._highlightedPoint = null;
|
||||||
|
|
||||||
|
// adjust the series colors for options colors passed in with data or for alpha.
|
||||||
|
// note, this can leave undefined holes in the seriesColors array.
|
||||||
|
var comps;
|
||||||
|
for (var i=0; i<this.data.length; i++) {
|
||||||
|
var color = null;
|
||||||
|
var d = this.data[i];
|
||||||
|
this.maxRadius = Math.max(this.maxRadius, d[2]);
|
||||||
|
if (d[3]) {
|
||||||
|
if (typeof(d[3]) == 'object') {
|
||||||
|
color = d[3]['color'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (color == null) {
|
||||||
|
if (this.seriesColors[i] != null) {
|
||||||
|
color = this.seriesColors[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (color && this.bubbleAlpha < 1.0) {
|
||||||
|
comps = $.jqplot.getColorComponents(color);
|
||||||
|
color = 'rgba('+comps[0]+', '+comps[1]+', '+comps[2]+', '+this.bubbleAlpha+')';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (color) {
|
||||||
|
this.seriesColors[i] = color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.varyBubbleColors) {
|
||||||
|
this.seriesColors = [this.color];
|
||||||
|
}
|
||||||
|
|
||||||
|
this.colorGenerator = new $.jqplot.ColorGenerator(this.seriesColors);
|
||||||
|
|
||||||
|
// set highlight colors if none provided
|
||||||
|
if (this.highlightColors.length == 0) {
|
||||||
|
for (var i=0; i<this.seriesColors.length; i++){
|
||||||
|
var rgba = $.jqplot.getColorComponents(this.seriesColors[i]);
|
||||||
|
var newrgb = [rgba[0], rgba[1], rgba[2]];
|
||||||
|
var sum = newrgb[0] + newrgb[1] + newrgb[2];
|
||||||
|
for (var j=0; j<3; j++) {
|
||||||
|
// when darkening, lowest color component can be is 60.
|
||||||
|
newrgb[j] = (sum > 570) ? newrgb[j] * 0.8 : newrgb[j] + 0.3 * (255 - newrgb[j]);
|
||||||
|
newrgb[j] = parseInt(newrgb[j], 10);
|
||||||
|
}
|
||||||
|
this.highlightColors.push('rgba('+newrgb[0]+','+newrgb[1]+','+newrgb[2]+', '+this.highlightAlpha+')');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.highlightColorGenerator = new $.jqplot.ColorGenerator(this.highlightColors);
|
||||||
|
|
||||||
|
var sopts = {fill:true, isarc:true, angle:this.shadowAngle, alpha:this.shadowAlpha, closePath:true};
|
||||||
|
|
||||||
|
this.renderer.shadowRenderer.init(sopts);
|
||||||
|
|
||||||
|
this.canvas = new $.jqplot.DivCanvas();
|
||||||
|
this.canvas._plotDimensions = this._plotDimensions;
|
||||||
|
|
||||||
|
plot.eventListenerHooks.addOnce('jqplotMouseMove', handleMove);
|
||||||
|
plot.eventListenerHooks.addOnce('jqplotMouseDown', handleMouseDown);
|
||||||
|
plot.eventListenerHooks.addOnce('jqplotMouseUp', handleMouseUp);
|
||||||
|
plot.eventListenerHooks.addOnce('jqplotClick', handleClick);
|
||||||
|
plot.eventListenerHooks.addOnce('jqplotRightClick', handleRightClick);
|
||||||
|
plot.postDrawHooks.addOnce(postPlotDraw);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// converts the user data values to grid coordinates and stores them
|
||||||
|
// in the gridData array.
|
||||||
|
// Called with scope of a series.
|
||||||
|
$.jqplot.BubbleRenderer.prototype.setGridData = function(plot) {
|
||||||
|
// recalculate the grid data
|
||||||
|
var xp = this._xaxis.series_u2p;
|
||||||
|
var yp = this._yaxis.series_u2p;
|
||||||
|
var data = this._plotData;
|
||||||
|
this.gridData = [];
|
||||||
|
var radii = [];
|
||||||
|
this.radii = [];
|
||||||
|
var dim = Math.min(plot._height, plot._width);
|
||||||
|
for (var i=0; i<this.data.length; i++) {
|
||||||
|
if (data[i] != null) {
|
||||||
|
this.gridData.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1]), data[i][2]]);
|
||||||
|
this.radii.push([i, data[i][2]]);
|
||||||
|
radii.push(data[i][2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var r, val, maxr = this.maxRadius = arrayMax(radii);
|
||||||
|
var l = this.gridData.length;
|
||||||
|
if (this.autoscaleBubbles) {
|
||||||
|
for (var i=0; i<l; i++) {
|
||||||
|
val = radii[i]/maxr;
|
||||||
|
r = this.autoscaleMultiplier * dim / 6;
|
||||||
|
this.gridData[i][2] = r * val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.radii.sort(function(a, b) { return b[1] - a[1]; });
|
||||||
|
};
|
||||||
|
|
||||||
|
// converts any arbitrary data values to grid coordinates and
|
||||||
|
// returns them. This method exists so that plugins can use a series'
|
||||||
|
// linerenderer to generate grid data points without overwriting the
|
||||||
|
// grid data associated with that series.
|
||||||
|
// Called with scope of a series.
|
||||||
|
$.jqplot.BubbleRenderer.prototype.makeGridData = function(data, plot) {
|
||||||
|
// recalculate the grid data
|
||||||
|
var xp = this._xaxis.series_u2p;
|
||||||
|
var yp = this._yaxis.series_u2p;
|
||||||
|
var gd = [];
|
||||||
|
var radii = [];
|
||||||
|
this.radii = [];
|
||||||
|
var dim = Math.min(plot._height, plot._width);
|
||||||
|
for (var i=0; i<data.length; i++) {
|
||||||
|
if (data[i] != null) {
|
||||||
|
gd.push([xp.call(this._xaxis, data[i][0]), yp.call(this._yaxis, data[i][1]), data[i][2]]);
|
||||||
|
radii.push(data[i][2]);
|
||||||
|
this.radii.push([i, data[i][2]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var r, val, maxr = this.maxRadius = arrayMax(radii);
|
||||||
|
var l = this.gridData.length;
|
||||||
|
if (this.autoscaleBubbles) {
|
||||||
|
for (var i=0; i<l; i++) {
|
||||||
|
val = radii[i]/maxr;
|
||||||
|
r = this.autoscaleMultiplier * dim / 6;
|
||||||
|
gd[i][2] = r * val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.radii.sort(function(a, b) { return b[1] - a[1]; });
|
||||||
|
return gd;
|
||||||
|
};
|
||||||
|
|
||||||
|
// called with scope of series
|
||||||
|
$.jqplot.BubbleRenderer.prototype.draw = function (ctx, gd, options) {
|
||||||
|
if (this.plugins.pointLabels) {
|
||||||
|
this.plugins.pointLabels.show = false;
|
||||||
|
}
|
||||||
|
var opts = (options != undefined) ? options : {};
|
||||||
|
var shadow = (opts.shadow != undefined) ? opts.shadow : this.shadow;
|
||||||
|
this.canvas._elem.empty();
|
||||||
|
for (var i=0; i<this.radii.length; i++) {
|
||||||
|
var idx = this.radii[i][0];
|
||||||
|
var t=null;
|
||||||
|
var color = null;
|
||||||
|
var el = null;
|
||||||
|
var tel = null;
|
||||||
|
var d = this.data[idx];
|
||||||
|
var gd = this.gridData[idx];
|
||||||
|
if (d[3]) {
|
||||||
|
if (typeof(d[3]) == 'object') {
|
||||||
|
t = d[3]['label'];
|
||||||
|
}
|
||||||
|
else if (typeof(d[3]) == 'string') {
|
||||||
|
t = d[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// color = (this.varyBubbleColors) ? this.colorGenerator.get(idx) : this.color;
|
||||||
|
color = this.colorGenerator.get(idx);
|
||||||
|
|
||||||
|
// If we're drawing a shadow, expand the canvas dimensions to accomodate.
|
||||||
|
var canvasRadius = gd[2];
|
||||||
|
var offset, depth;
|
||||||
|
if (this.shadow) {
|
||||||
|
offset = (0.7 + gd[2]/40).toFixed(1);
|
||||||
|
depth = 1 + Math.ceil(gd[2]/15);
|
||||||
|
canvasRadius += offset*depth;
|
||||||
|
}
|
||||||
|
this.bubbleCanvases[idx] = new $.jqplot.BubbleCanvas();
|
||||||
|
this.canvas._elem.append(this.bubbleCanvases[idx].createElement(gd[0], gd[1], canvasRadius));
|
||||||
|
this.bubbleCanvases[idx].setContext();
|
||||||
|
var ctx = this.bubbleCanvases[idx]._ctx;
|
||||||
|
var x = ctx.canvas.width/2;
|
||||||
|
var y = ctx.canvas.height/2;
|
||||||
|
if (this.shadow) {
|
||||||
|
this.renderer.shadowRenderer.draw(ctx, [x, y, gd[2], 0, 2*Math.PI], {offset: offset, depth: depth});
|
||||||
|
}
|
||||||
|
this.bubbleCanvases[idx].draw(gd[2], color, this.bubbleGradients, this.shadowAngle/180*Math.PI);
|
||||||
|
|
||||||
|
// now draw label.
|
||||||
|
if (t && this.showLabels) {
|
||||||
|
tel = $('<div style="position:absolute;" class="jqplot-bubble-label"></div>');
|
||||||
|
if (this.escapeHtml) {
|
||||||
|
tel.text(t);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tel.html(t);
|
||||||
|
}
|
||||||
|
this.canvas._elem.append(tel);
|
||||||
|
var h = $(tel).outerHeight();
|
||||||
|
var w = $(tel).outerWidth();
|
||||||
|
var top = gd[1] - 0.5*h;
|
||||||
|
var left = gd[0] - 0.5*w;
|
||||||
|
tel.css({top: top, left: left});
|
||||||
|
this.labels[idx] = $(tel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
$.jqplot.DivCanvas = function() {
|
||||||
|
$.jqplot.ElemContainer.call(this);
|
||||||
|
this._ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.DivCanvas.prototype = new $.jqplot.ElemContainer();
|
||||||
|
$.jqplot.DivCanvas.prototype.constructor = $.jqplot.DivCanvas;
|
||||||
|
|
||||||
|
$.jqplot.DivCanvas.prototype.createElement = function(offsets, clss, plotDimensions) {
|
||||||
|
this._offsets = offsets;
|
||||||
|
var klass = 'jqplot-DivCanvas';
|
||||||
|
if (clss != undefined) {
|
||||||
|
klass = clss;
|
||||||
|
}
|
||||||
|
var elem;
|
||||||
|
// if this canvas already has a dom element, don't make a new one.
|
||||||
|
if (this._elem) {
|
||||||
|
elem = this._elem.get(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
elem = document.createElement('div');
|
||||||
|
}
|
||||||
|
// if new plotDimensions supplied, use them.
|
||||||
|
if (plotDimensions != undefined) {
|
||||||
|
this._plotDimensions = plotDimensions;
|
||||||
|
}
|
||||||
|
|
||||||
|
var w = this._plotDimensions.width - this._offsets.left - this._offsets.right + 'px';
|
||||||
|
var h = this._plotDimensions.height - this._offsets.top - this._offsets.bottom + 'px';
|
||||||
|
this._elem = $(elem);
|
||||||
|
this._elem.css({ position: 'absolute', width:w, height:h, left: this._offsets.left, top: this._offsets.top });
|
||||||
|
|
||||||
|
this._elem.addClass(klass);
|
||||||
|
return this._elem;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.DivCanvas.prototype.setContext = function() {
|
||||||
|
this._ctx = {
|
||||||
|
canvas:{
|
||||||
|
width:0,
|
||||||
|
height:0
|
||||||
|
},
|
||||||
|
clearRect:function(){return null;}
|
||||||
|
};
|
||||||
|
return this._ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BubbleCanvas = function() {
|
||||||
|
$.jqplot.ElemContainer.call(this);
|
||||||
|
this._ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BubbleCanvas.prototype = new $.jqplot.ElemContainer();
|
||||||
|
$.jqplot.BubbleCanvas.prototype.constructor = $.jqplot.BubbleCanvas;
|
||||||
|
|
||||||
|
// initialize with the x,y pont of bubble center and the bubble radius.
|
||||||
|
$.jqplot.BubbleCanvas.prototype.createElement = function(x, y, r) {
|
||||||
|
var klass = 'jqplot-bubble-point';
|
||||||
|
|
||||||
|
var elem;
|
||||||
|
// if this canvas already has a dom element, don't make a new one.
|
||||||
|
if (this._elem) {
|
||||||
|
elem = this._elem.get(0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
elem = document.createElement('canvas');
|
||||||
|
}
|
||||||
|
|
||||||
|
elem.width = (r != null) ? 2*r : elem.width;
|
||||||
|
elem.height = (r != null) ? 2*r : elem.height;
|
||||||
|
this._elem = $(elem);
|
||||||
|
var l = (x != null && r != null) ? x - r : this._elem.css('left');
|
||||||
|
var t = (y != null && r != null) ? y - r : this._elem.css('top');
|
||||||
|
this._elem.css({ position: 'absolute', left: l, top: t });
|
||||||
|
|
||||||
|
this._elem.addClass(klass);
|
||||||
|
if ($.jqplot.use_excanvas) {
|
||||||
|
window.G_vmlCanvasManager.init_(document);
|
||||||
|
elem = window.G_vmlCanvasManager.initElement(elem);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this._elem;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BubbleCanvas.prototype.draw = function(r, color, gradients, angle) {
|
||||||
|
var ctx = this._ctx;
|
||||||
|
// r = Math.floor(r*1.04);
|
||||||
|
// var x = Math.round(ctx.canvas.width/2);
|
||||||
|
// var y = Math.round(ctx.canvas.height/2);
|
||||||
|
var x = ctx.canvas.width/2;
|
||||||
|
var y = ctx.canvas.height/2;
|
||||||
|
ctx.save();
|
||||||
|
if (gradients && !$.jqplot.use_excanvas) {
|
||||||
|
r = r*1.04;
|
||||||
|
var comps = $.jqplot.getColorComponents(color);
|
||||||
|
var colorinner = 'rgba('+Math.round(comps[0]+0.8*(255-comps[0]))+', '+Math.round(comps[1]+0.8*(255-comps[1]))+', '+Math.round(comps[2]+0.8*(255-comps[2]))+', '+comps[3]+')';
|
||||||
|
var colorend = 'rgba('+comps[0]+', '+comps[1]+', '+comps[2]+', 0)';
|
||||||
|
// var rinner = Math.round(0.35 * r);
|
||||||
|
// var xinner = Math.round(x - Math.cos(angle) * 0.33 * r);
|
||||||
|
// var yinner = Math.round(y - Math.sin(angle) * 0.33 * r);
|
||||||
|
var rinner = 0.35 * r;
|
||||||
|
var xinner = x - Math.cos(angle) * 0.33 * r;
|
||||||
|
var yinner = y - Math.sin(angle) * 0.33 * r;
|
||||||
|
var radgrad = ctx.createRadialGradient(xinner, yinner, rinner, x, y, r);
|
||||||
|
radgrad.addColorStop(0, colorinner);
|
||||||
|
radgrad.addColorStop(0.93, color);
|
||||||
|
radgrad.addColorStop(0.96, colorend);
|
||||||
|
radgrad.addColorStop(1, colorend);
|
||||||
|
// radgrad.addColorStop(.98, colorend);
|
||||||
|
ctx.fillStyle = radgrad;
|
||||||
|
ctx.fillRect(0,0, ctx.canvas.width, ctx.canvas.height);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ctx.fillStyle = color;
|
||||||
|
ctx.strokeStyle = color;
|
||||||
|
ctx.lineWidth = 1;
|
||||||
|
ctx.beginPath();
|
||||||
|
var ang = 2*Math.PI;
|
||||||
|
ctx.arc(x, y, r, 0, ang, 0);
|
||||||
|
ctx.closePath();
|
||||||
|
ctx.fill();
|
||||||
|
}
|
||||||
|
ctx.restore();
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BubbleCanvas.prototype.setContext = function() {
|
||||||
|
this._ctx = this._elem.get(0).getContext("2d");
|
||||||
|
return this._ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BubbleAxisRenderer = function() {
|
||||||
|
$.jqplot.LinearAxisRenderer.call(this);
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.BubbleAxisRenderer.prototype = new $.jqplot.LinearAxisRenderer();
|
||||||
|
$.jqplot.BubbleAxisRenderer.prototype.constructor = $.jqplot.BubbleAxisRenderer;
|
||||||
|
|
||||||
|
// called with scope of axis object.
|
||||||
|
$.jqplot.BubbleAxisRenderer.prototype.init = function(options){
|
||||||
|
$.extend(true, this, options);
|
||||||
|
var db = this._dataBounds;
|
||||||
|
var minsidx = 0,
|
||||||
|
minpidx = 0,
|
||||||
|
maxsidx = 0,
|
||||||
|
maxpidx = 0,
|
||||||
|
maxr = 0,
|
||||||
|
minr = 0,
|
||||||
|
minMaxRadius = 0,
|
||||||
|
maxMaxRadius = 0,
|
||||||
|
maxMult = 0,
|
||||||
|
minMult = 0;
|
||||||
|
// Go through all the series attached to this axis and find
|
||||||
|
// the min/max bounds for this axis.
|
||||||
|
for (var i=0; i<this._series.length; i++) {
|
||||||
|
var s = this._series[i];
|
||||||
|
var d = s._plotData;
|
||||||
|
|
||||||
|
for (var j=0; j<d.length; j++) {
|
||||||
|
if (this.name == 'xaxis' || this.name == 'x2axis') {
|
||||||
|
if (d[j][0] < db.min || db.min == null) {
|
||||||
|
db.min = d[j][0];
|
||||||
|
minsidx=i;
|
||||||
|
minpidx=j;
|
||||||
|
minr = d[j][2];
|
||||||
|
minMaxRadius = s.maxRadius;
|
||||||
|
minMult = s.autoscaleMultiplier;
|
||||||
|
}
|
||||||
|
if (d[j][0] > db.max || db.max == null) {
|
||||||
|
db.max = d[j][0];
|
||||||
|
maxsidx=i;
|
||||||
|
maxpidx=j;
|
||||||
|
maxr = d[j][2];
|
||||||
|
maxMaxRadius = s.maxRadius;
|
||||||
|
maxMult = s.autoscaleMultiplier;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (d[j][1] < db.min || db.min == null) {
|
||||||
|
db.min = d[j][1];
|
||||||
|
minsidx=i;
|
||||||
|
minpidx=j;
|
||||||
|
minr = d[j][2];
|
||||||
|
minMaxRadius = s.maxRadius;
|
||||||
|
minMult = s.autoscaleMultiplier;
|
||||||
|
}
|
||||||
|
if (d[j][1] > db.max || db.max == null) {
|
||||||
|
db.max = d[j][1];
|
||||||
|
maxsidx=i;
|
||||||
|
maxpidx=j;
|
||||||
|
maxr = d[j][2];
|
||||||
|
maxMaxRadius = s.maxRadius;
|
||||||
|
maxMult = s.autoscaleMultiplier;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var minRatio = minr/minMaxRadius;
|
||||||
|
var maxRatio = maxr/maxMaxRadius;
|
||||||
|
|
||||||
|
// need to estimate the effect of the radius on total axis span and adjust axis accordingly.
|
||||||
|
var span = db.max - db.min;
|
||||||
|
// var dim = (this.name == 'xaxis' || this.name == 'x2axis') ? this._plotDimensions.width : this._plotDimensions.height;
|
||||||
|
var dim = Math.min(this._plotDimensions.width, this._plotDimensions.height);
|
||||||
|
|
||||||
|
var minfact = minRatio * minMult/3 * span;
|
||||||
|
var maxfact = maxRatio * maxMult/3 * span;
|
||||||
|
db.max += maxfact;
|
||||||
|
db.min -= minfact;
|
||||||
|
};
|
||||||
|
|
||||||
|
function highlight (plot, sidx, pidx) {
|
||||||
|
plot.plugins.bubbleRenderer.highlightLabelCanvas.empty();
|
||||||
|
var s = plot.series[sidx];
|
||||||
|
var canvas = plot.plugins.bubbleRenderer.highlightCanvas;
|
||||||
|
var ctx = canvas._ctx;
|
||||||
|
ctx.clearRect(0,0,ctx.canvas.width, ctx.canvas.height);
|
||||||
|
s._highlightedPoint = pidx;
|
||||||
|
plot.plugins.bubbleRenderer.highlightedSeriesIndex = sidx;
|
||||||
|
|
||||||
|
var color = s.highlightColorGenerator.get(pidx);
|
||||||
|
var x = s.gridData[pidx][0],
|
||||||
|
y = s.gridData[pidx][1],
|
||||||
|
r = s.gridData[pidx][2];
|
||||||
|
ctx.save();
|
||||||
|
ctx.fillStyle = color;
|
||||||
|
ctx.strokeStyle = color;
|
||||||
|
ctx.lineWidth = 1;
|
||||||
|
ctx.beginPath();
|
||||||
|
ctx.arc(x, y, r, 0, 2*Math.PI, 0);
|
||||||
|
ctx.closePath();
|
||||||
|
ctx.fill();
|
||||||
|
ctx.restore();
|
||||||
|
// bring label to front
|
||||||
|
if (s.labels[pidx]) {
|
||||||
|
plot.plugins.bubbleRenderer.highlightLabel = s.labels[pidx].clone();
|
||||||
|
plot.plugins.bubbleRenderer.highlightLabel.appendTo(plot.plugins.bubbleRenderer.highlightLabelCanvas);
|
||||||
|
plot.plugins.bubbleRenderer.highlightLabel.addClass('jqplot-bubble-label-highlight');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function unhighlight (plot) {
|
||||||
|
var canvas = plot.plugins.bubbleRenderer.highlightCanvas;
|
||||||
|
var sidx = plot.plugins.bubbleRenderer.highlightedSeriesIndex;
|
||||||
|
plot.plugins.bubbleRenderer.highlightLabelCanvas.empty();
|
||||||
|
canvas._ctx.clearRect(0,0, canvas._ctx.canvas.width, canvas._ctx.canvas.height);
|
||||||
|
for (var i=0; i<plot.series.length; i++) {
|
||||||
|
plot.series[i]._highlightedPoint = null;
|
||||||
|
}
|
||||||
|
plot.plugins.bubbleRenderer.highlightedSeriesIndex = null;
|
||||||
|
plot.target.trigger('jqplotDataUnhighlight');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function handleMove(ev, gridpos, datapos, neighbor, plot) {
|
||||||
|
if (neighbor) {
|
||||||
|
var si = neighbor.seriesIndex;
|
||||||
|
var pi = neighbor.pointIndex;
|
||||||
|
var ins = [si, pi, neighbor.data, plot.series[si].gridData[pi][2]];
|
||||||
|
var evt1 = jQuery.Event('jqplotDataMouseOver');
|
||||||
|
evt1.pageX = ev.pageX;
|
||||||
|
evt1.pageY = ev.pageY;
|
||||||
|
plot.target.trigger(evt1, ins);
|
||||||
|
if (plot.series[ins[0]].highlightMouseOver && !(ins[0] == plot.plugins.bubbleRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {
|
||||||
|
var evt = jQuery.Event('jqplotDataHighlight');
|
||||||
|
evt.which = ev.which;
|
||||||
|
evt.pageX = ev.pageX;
|
||||||
|
evt.pageY = ev.pageY;
|
||||||
|
plot.target.trigger(evt, ins);
|
||||||
|
highlight (plot, ins[0], ins[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (neighbor == null) {
|
||||||
|
unhighlight (plot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMouseDown(ev, gridpos, datapos, neighbor, plot) {
|
||||||
|
if (neighbor) {
|
||||||
|
var si = neighbor.seriesIndex;
|
||||||
|
var pi = neighbor.pointIndex;
|
||||||
|
var ins = [si, pi, neighbor.data, plot.series[si].gridData[pi][2]];
|
||||||
|
if (plot.series[ins[0]].highlightMouseDown && !(ins[0] == plot.plugins.bubbleRenderer.highlightedSeriesIndex && ins[1] == plot.series[ins[0]]._highlightedPoint)) {
|
||||||
|
var evt = jQuery.Event('jqplotDataHighlight');
|
||||||
|
evt.which = ev.which;
|
||||||
|
evt.pageX = ev.pageX;
|
||||||
|
evt.pageY = ev.pageY;
|
||||||
|
plot.target.trigger(evt, ins);
|
||||||
|
highlight (plot, ins[0], ins[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (neighbor == null) {
|
||||||
|
unhighlight (plot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleMouseUp(ev, gridpos, datapos, neighbor, plot) {
|
||||||
|
var idx = plot.plugins.bubbleRenderer.highlightedSeriesIndex;
|
||||||
|
if (idx != null && plot.series[idx].highlightMouseDown) {
|
||||||
|
unhighlight(plot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleClick(ev, gridpos, datapos, neighbor, plot) {
|
||||||
|
if (neighbor) {
|
||||||
|
var si = neighbor.seriesIndex;
|
||||||
|
var pi = neighbor.pointIndex;
|
||||||
|
var ins = [si, pi, neighbor.data, plot.series[si].gridData[pi][2]];
|
||||||
|
var evt = jQuery.Event('jqplotDataClick');
|
||||||
|
evt.which = ev.which;
|
||||||
|
evt.pageX = ev.pageX;
|
||||||
|
evt.pageY = ev.pageY;
|
||||||
|
plot.target.trigger(evt, ins);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleRightClick(ev, gridpos, datapos, neighbor, plot) {
|
||||||
|
if (neighbor) {
|
||||||
|
var si = neighbor.seriesIndex;
|
||||||
|
var pi = neighbor.pointIndex;
|
||||||
|
var ins = [si, pi, neighbor.data, plot.series[si].gridData[pi][2]];
|
||||||
|
var idx = plot.plugins.bubbleRenderer.highlightedSeriesIndex;
|
||||||
|
if (idx != null && plot.series[idx].highlightMouseDown) {
|
||||||
|
unhighlight(plot);
|
||||||
|
}
|
||||||
|
var evt = jQuery.Event('jqplotDataRightClick');
|
||||||
|
evt.which = ev.which;
|
||||||
|
evt.pageX = ev.pageX;
|
||||||
|
evt.pageY = ev.pageY;
|
||||||
|
plot.target.trigger(evt, ins);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// called within context of plot
|
||||||
|
// create a canvas which we can draw on.
|
||||||
|
// insert it before the eventCanvas, so eventCanvas will still capture events.
|
||||||
|
function postPlotDraw() {
|
||||||
|
// Memory Leaks patch
|
||||||
|
if (this.plugins.bubbleRenderer && this.plugins.bubbleRenderer.highlightCanvas) {
|
||||||
|
this.plugins.bubbleRenderer.highlightCanvas.resetCanvas();
|
||||||
|
this.plugins.bubbleRenderer.highlightCanvas = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.plugins.bubbleRenderer = {highlightedSeriesIndex:null};
|
||||||
|
this.plugins.bubbleRenderer.highlightCanvas = new $.jqplot.GenericCanvas();
|
||||||
|
this.plugins.bubbleRenderer.highlightLabel = null;
|
||||||
|
this.plugins.bubbleRenderer.highlightLabelCanvas = $('<div style="position:absolute;"></div>');
|
||||||
|
var top = this._gridPadding.top;
|
||||||
|
var left = this._gridPadding.left;
|
||||||
|
var width = this._plotDimensions.width - this._gridPadding.left - this._gridPadding.right;
|
||||||
|
var height = this._plotDimensions.height - this._gridPadding.top - this._gridPadding.bottom;
|
||||||
|
this.plugins.bubbleRenderer.highlightLabelCanvas.css({top:top, left:left, width:width+'px', height:height+'px'});
|
||||||
|
|
||||||
|
this.eventCanvas._elem.before(this.plugins.bubbleRenderer.highlightCanvas.createElement(this._gridPadding, 'jqplot-bubbleRenderer-highlight-canvas', this._plotDimensions, this));
|
||||||
|
this.eventCanvas._elem.before(this.plugins.bubbleRenderer.highlightLabelCanvas);
|
||||||
|
|
||||||
|
var hctx = this.plugins.bubbleRenderer.highlightCanvas.setContext();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// setup default renderers for axes and legend so user doesn't have to
|
||||||
|
// called with scope of plot
|
||||||
|
function preInit(target, data, options) {
|
||||||
|
options = options || {};
|
||||||
|
options.axesDefaults = options.axesDefaults || {};
|
||||||
|
options.seriesDefaults = options.seriesDefaults || {};
|
||||||
|
// only set these if there is a Bubble series
|
||||||
|
var setopts = false;
|
||||||
|
if (options.seriesDefaults.renderer == $.jqplot.BubbleRenderer) {
|
||||||
|
setopts = true;
|
||||||
|
}
|
||||||
|
else if (options.series) {
|
||||||
|
for (var i=0; i < options.series.length; i++) {
|
||||||
|
if (options.series[i].renderer == $.jqplot.BubbleRenderer) {
|
||||||
|
setopts = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setopts) {
|
||||||
|
options.axesDefaults.renderer = $.jqplot.BubbleAxisRenderer;
|
||||||
|
options.sortData = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$.jqplot.preInitHooks.push(preInit);
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
|
||||||
|
jsDate | (c) 2010-2013 Chris Leonello
|
||||||
|
*/(function(f){var d=function(m){return Math.max.apply(Math,m)};var j=function(m){return Math.min.apply(Math,m)};f.jqplot.BubbleRenderer=function(){f.jqplot.LineRenderer.call(this)};f.jqplot.BubbleRenderer.prototype=new f.jqplot.LineRenderer();f.jqplot.BubbleRenderer.prototype.constructor=f.jqplot.BubbleRenderer;f.jqplot.BubbleRenderer.prototype.init=function(w,t){this.varyBubbleColors=true;this.autoscaleBubbles=true;this.autoscaleMultiplier=1;this.autoscalePointsFactor=-0.07;this.escapeHtml=true;this.highlightMouseOver=true;this.highlightMouseDown=false;this.highlightColors=[];this.bubbleAlpha=1;this.highlightAlpha=null;this.bubbleGradients=false;this.showLabels=true;this.radii=[];this.maxRadius=0;this._highlightedPoint=null;this.labels=[];this.bubbleCanvases=[];this._type="bubble";if(w.highlightMouseDown&&w.highlightMouseOver==null){w.highlightMouseOver=false}f.extend(true,this,w);if(this.highlightAlpha==null){this.highlightAlpha=this.bubbleAlpha;if(this.bubbleGradients){this.highlightAlpha=0.35}}this.autoscaleMultiplier=this.autoscaleMultiplier*Math.pow(this.data.length,this.autoscalePointsFactor);this._highlightedPoint=null;var n;for(var r=0;r<this.data.length;r++){var p=null;var v=this.data[r];this.maxRadius=Math.max(this.maxRadius,v[2]);if(v[3]){if(typeof(v[3])=="object"){p=v[3]["color"]}}if(p==null){if(this.seriesColors[r]!=null){p=this.seriesColors[r]}}if(p&&this.bubbleAlpha<1){n=f.jqplot.getColorComponents(p);p="rgba("+n[0]+", "+n[1]+", "+n[2]+", "+this.bubbleAlpha+")"}if(p){this.seriesColors[r]=p}}if(!this.varyBubbleColors){this.seriesColors=[this.color]}this.colorGenerator=new f.jqplot.ColorGenerator(this.seriesColors);if(this.highlightColors.length==0){for(var r=0;r<this.seriesColors.length;r++){var o=f.jqplot.getColorComponents(this.seriesColors[r]);var u=[o[0],o[1],o[2]];var s=u[0]+u[1]+u[2];for(var q=0;q<3;q++){u[q]=(s>570)?u[q]*0.8:u[q]+0.3*(255-u[q]);u[q]=parseInt(u[q],10)}this.highlightColors.push("rgba("+u[0]+","+u[1]+","+u[2]+", "+this.highlightAlpha+")")}}this.highlightColorGenerator=new f.jqplot.ColorGenerator(this.highlightColors);var m={fill:true,isarc:true,angle:this.shadowAngle,alpha:this.shadowAlpha,closePath:true};this.renderer.shadowRenderer.init(m);this.canvas=new f.jqplot.DivCanvas();this.canvas._plotDimensions=this._plotDimensions;t.eventListenerHooks.addOnce("jqplotMouseMove",a);t.eventListenerHooks.addOnce("jqplotMouseDown",b);t.eventListenerHooks.addOnce("jqplotMouseUp",k);t.eventListenerHooks.addOnce("jqplotClick",g);t.eventListenerHooks.addOnce("jqplotRightClick",l);t.postDrawHooks.addOnce(h)};f.jqplot.BubbleRenderer.prototype.setGridData=function(w){var q=this._xaxis.series_u2p;var m=this._yaxis.series_u2p;var t=this._plotData;this.gridData=[];var s=[];this.radii=[];var v=Math.min(w._height,w._width);for(var u=0;u<this.data.length;u++){if(t[u]!=null){this.gridData.push([q.call(this._xaxis,t[u][0]),m.call(this._yaxis,t[u][1]),t[u][2]]);this.radii.push([u,t[u][2]]);s.push(t[u][2])}}var n,o,x=this.maxRadius=d(s);var p=this.gridData.length;if(this.autoscaleBubbles){for(var u=0;u<p;u++){o=s[u]/x;n=this.autoscaleMultiplier*v/6;this.gridData[u][2]=n*o}}this.radii.sort(function(y,r){return r[1]-y[1]})};f.jqplot.BubbleRenderer.prototype.makeGridData=function(t,w){var q=this._xaxis.series_u2p;var n=this._yaxis.series_u2p;var x=[];var s=[];this.radii=[];var v=Math.min(w._height,w._width);for(var u=0;u<t.length;u++){if(t[u]!=null){x.push([q.call(this._xaxis,t[u][0]),n.call(this._yaxis,t[u][1]),t[u][2]]);s.push(t[u][2]);this.radii.push([u,t[u][2]])}}var m,o,y=this.maxRadius=d(s);var p=this.gridData.length;if(this.autoscaleBubbles){for(var u=0;u<p;u++){o=s[u]/y;m=this.autoscaleMultiplier*v/6;x[u][2]=m*o}}this.radii.sort(function(z,r){return r[1]-z[1]});return x};f.jqplot.BubbleRenderer.prototype.draw=function(D,J,n){if(this.plugins.pointLabels){this.plugins.pointLabels.show=false}var A=(n!=undefined)?n:{};var r=(A.shadow!=undefined)?A.shadow:this.shadow;this.canvas._elem.empty();for(var G=0;G<this.radii.length;G++){var C=this.radii[G][0];var z=null;var F=null;var m=null;var p=null;var I=this.data[C];var J=this.gridData[C];if(I[3]){if(typeof(I[3])=="object"){z=I[3]["label"]}else{if(typeof(I[3])=="string"){z=I[3]}}}F=this.colorGenerator.get(C);var E=J[2];var q,K;if(this.shadow){q=(0.7+J[2]/40).toFixed(1);K=1+Math.ceil(J[2]/15);E+=q*K}this.bubbleCanvases[C]=new f.jqplot.BubbleCanvas();this.canvas._elem.append(this.bubbleCanvases[C].createElement(J[0],J[1],E));this.bubbleCanvases[C].setContext();var D=this.bubbleCanvases[C]._ctx;var u=D.canvas.width/2;var s=D.canvas.height/2;if(this.shadow){this.renderer.shadowRenderer.draw(D,[u,s,J[2],0,2*Math.PI],{offset:q,depth:K})}this.bubbleCanvases[C].draw(J[2],F,this.bubbleGradients,this.shadowAngle/180*Math.PI);if(z&&this.showLabels){p=f('<div style="position:absolute;" class="jqplot-bubble-label"></div>');if(this.escapeHtml){p.text(z)}else{p.html(z)}this.canvas._elem.append(p);var H=f(p).outerHeight();var v=f(p).outerWidth();var B=J[1]-0.5*H;vLine truncated
|
||||||
@@ -0,0 +1,203 @@
|
|||||||
|
/**
|
||||||
|
* jqPlot
|
||||||
|
* Pure JavaScript plotting plugin using jQuery
|
||||||
|
*
|
||||||
|
* Version: 1.0.8
|
||||||
|
* Revision: 1250
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009-2013 Chris Leonello
|
||||||
|
* jqPlot is currently available for use in all personal or commercial projects
|
||||||
|
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
|
||||||
|
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
|
||||||
|
* choose the license that best suits your project and use it accordingly.
|
||||||
|
*
|
||||||
|
* Although not required, the author would appreciate an email letting him
|
||||||
|
* know of any substantial use of jqPlot. You can reach the author at:
|
||||||
|
* chris at jqplot dot com or see http://www.jqplot.com/info.php .
|
||||||
|
*
|
||||||
|
* If you are feeling kind and generous, consider supporting the project by
|
||||||
|
* making a donation at: http://www.jqplot.com/donate.php .
|
||||||
|
*
|
||||||
|
* sprintf functions contained in jqplot.sprintf.js by Ash Searle:
|
||||||
|
*
|
||||||
|
* version 2007.04.27
|
||||||
|
* author Ash Searle
|
||||||
|
* http://hexmen.com/blog/2007/03/printf-sprintf/
|
||||||
|
* http://hexmen.com/js/sprintf.js
|
||||||
|
* The author (Ash Searle) has placed this code in the public domain:
|
||||||
|
* "This code is unrestricted: you are free to use it however you like."
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
(function($) {
|
||||||
|
/**
|
||||||
|
* Class: $.jqplot.CanvasAxisLabelRenderer
|
||||||
|
* Renderer to draw axis labels with a canvas element to support advanced
|
||||||
|
* featrues such as rotated text. This renderer uses a separate rendering engine
|
||||||
|
* to draw the text on the canvas. Two modes of rendering the text are available.
|
||||||
|
* If the browser has native font support for canvas fonts (currently Mozila 3.5
|
||||||
|
* and Safari 4), you can enable text rendering with the canvas fillText method.
|
||||||
|
* You do so by setting the "enableFontSupport" option to true.
|
||||||
|
*
|
||||||
|
* Browsers lacking native font support will have the text drawn on the canvas
|
||||||
|
* using the Hershey font metrics. Even if the "enableFontSupport" option is true
|
||||||
|
* non-supporting browsers will still render with the Hershey font.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
$.jqplot.CanvasAxisLabelRenderer = function(options) {
|
||||||
|
// Group: Properties
|
||||||
|
|
||||||
|
// prop: angle
|
||||||
|
// angle of text, measured clockwise from x axis.
|
||||||
|
this.angle = 0;
|
||||||
|
// name of the axis associated with this tick
|
||||||
|
this.axis;
|
||||||
|
// prop: show
|
||||||
|
// whether or not to show the tick (mark and label).
|
||||||
|
this.show = true;
|
||||||
|
// prop: showLabel
|
||||||
|
// whether or not to show the label.
|
||||||
|
this.showLabel = true;
|
||||||
|
// prop: label
|
||||||
|
// label for the axis.
|
||||||
|
this.label = '';
|
||||||
|
// prop: fontFamily
|
||||||
|
// CSS spec for the font-family css attribute.
|
||||||
|
// Applies only to browsers supporting native font rendering in the
|
||||||
|
// canvas tag. Currently Mozilla 3.5 and Safari 4.
|
||||||
|
this.fontFamily = '"Trebuchet MS", Arial, Helvetica, sans-serif';
|
||||||
|
// prop: fontSize
|
||||||
|
// CSS spec for font size.
|
||||||
|
this.fontSize = '11pt';
|
||||||
|
// prop: fontWeight
|
||||||
|
// CSS spec for fontWeight: normal, bold, bolder, lighter or a number 100 - 900
|
||||||
|
this.fontWeight = 'normal';
|
||||||
|
// prop: fontStretch
|
||||||
|
// Multiplier to condense or expand font width.
|
||||||
|
// Applies only to browsers which don't support canvas native font rendering.
|
||||||
|
this.fontStretch = 1.0;
|
||||||
|
// prop: textColor
|
||||||
|
// css spec for the color attribute.
|
||||||
|
this.textColor = '#666666';
|
||||||
|
// prop: enableFontSupport
|
||||||
|
// true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.
|
||||||
|
// If true, label will be drawn with canvas tag native support for fonts.
|
||||||
|
// If false, label will be drawn with Hershey font metrics.
|
||||||
|
this.enableFontSupport = true;
|
||||||
|
// prop: pt2px
|
||||||
|
// Point to pixel scaling factor, used for computing height of bounding box
|
||||||
|
// around a label. The labels text renderer has a default setting of 1.4, which
|
||||||
|
// should be suitable for most fonts. Leave as null to use default. If tops of
|
||||||
|
// letters appear clipped, increase this. If bounding box seems too big, decrease.
|
||||||
|
// This is an issue only with the native font renderering capabilities of Mozilla
|
||||||
|
// 3.5 and Safari 4 since they do not provide a method to determine the font height.
|
||||||
|
this.pt2px = null;
|
||||||
|
|
||||||
|
this._elem;
|
||||||
|
this._ctx;
|
||||||
|
this._plotWidth;
|
||||||
|
this._plotHeight;
|
||||||
|
this._plotDimensions = {height:null, width:null};
|
||||||
|
|
||||||
|
$.extend(true, this, options);
|
||||||
|
|
||||||
|
if (options.angle == null && this.axis != 'xaxis' && this.axis != 'x2axis') {
|
||||||
|
this.angle = -90;
|
||||||
|
}
|
||||||
|
|
||||||
|
var ropts = {fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily};
|
||||||
|
if (this.pt2px) {
|
||||||
|
ropts.pt2px = this.pt2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.enableFontSupport) {
|
||||||
|
if ($.jqplot.support_canvas_text()) {
|
||||||
|
this._textRenderer = new $.jqplot.CanvasFontRenderer(ropts);
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasAxisLabelRenderer.prototype.init = function(options) {
|
||||||
|
$.extend(true, this, options);
|
||||||
|
this._textRenderer.init({fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily});
|
||||||
|
};
|
||||||
|
|
||||||
|
// return width along the x axis
|
||||||
|
// will check first to see if an element exists.
|
||||||
|
// if not, will return the computed text box width.
|
||||||
|
$.jqplot.CanvasAxisLabelRenderer.prototype.getWidth = function(ctx) {
|
||||||
|
if (this._elem) {
|
||||||
|
return this._elem.outerWidth(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var tr = this._textRenderer;
|
||||||
|
var l = tr.getWidth(ctx);
|
||||||
|
var h = tr.getHeight(ctx);
|
||||||
|
var w = Math.abs(Math.sin(tr.angle)*h) + Math.abs(Math.cos(tr.angle)*l);
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// return height along the y axis.
|
||||||
|
$.jqplot.CanvasAxisLabelRenderer.prototype.getHeight = function(ctx) {
|
||||||
|
if (this._elem) {
|
||||||
|
return this._elem.outerHeight(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var tr = this._textRenderer;
|
||||||
|
var l = tr.getWidth(ctx);
|
||||||
|
var h = tr.getHeight(ctx);
|
||||||
|
var w = Math.abs(Math.cos(tr.angle)*h) + Math.abs(Math.sin(tr.angle)*l);
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasAxisLabelRenderer.prototype.getAngleRad = function() {
|
||||||
|
var a = this.angle * Math.PI/180;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasAxisLabelRenderer.prototype.draw = function(ctx, plot) {
|
||||||
|
// Memory Leaks patch
|
||||||
|
if (this._elem) {
|
||||||
|
if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {
|
||||||
|
window.G_vmlCanvasManager.uninitElement(this._elem.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
this._elem.emptyForce();
|
||||||
|
this._elem = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create a canvas here, but can't draw on it untill it is appended
|
||||||
|
// to dom for IE compatability.
|
||||||
|
var elem = plot.canvasManager.getCanvas();
|
||||||
|
|
||||||
|
this._textRenderer.setText(this.label, ctx);
|
||||||
|
var w = this.getWidth(ctx);
|
||||||
|
var h = this.getHeight(ctx);
|
||||||
|
elem.width = w;
|
||||||
|
elem.height = h;
|
||||||
|
elem.style.width = w;
|
||||||
|
elem.style.height = h;
|
||||||
|
|
||||||
|
elem = plot.canvasManager.initCanvas(elem);
|
||||||
|
|
||||||
|
this._elem = $(elem);
|
||||||
|
this._elem.css({ position: 'absolute'});
|
||||||
|
this._elem.addClass('jqplot-'+this.axis+'-label');
|
||||||
|
|
||||||
|
elem = null;
|
||||||
|
return this._elem;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasAxisLabelRenderer.prototype.pack = function() {
|
||||||
|
this._textRenderer.draw(this._elem.get(0).getContext("2d"), this.label);
|
||||||
|
};
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
|
||||||
|
jsDate | (c) 2010-2013 Chris Leonello
|
||||||
|
*/(function(a){a.jqplot.CanvasAxisLabelRenderer=function(b){this.angle=0;this.axis;this.show=true;this.showLabel=true;this.label="";this.fontFamily='"Trebuchet MS", Arial, Helvetica, sans-serif';this.fontSize="11pt";this.fontWeight="normal";this.fontStretch=1;this.textColor="#666666";this.enableFontSupport=true;this.pt2px=null;this._elem;this._ctx;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null};a.extend(true,this,b);if(b.angle==null&&this.axis!="xaxis"&&this.axis!="x2axis"){this.angle=-90}var c={fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily};if(this.pt2px){c.pt2px=this.pt2px}if(this.enableFontSupport){if(a.jqplot.support_canvas_text()){this._textRenderer=new a.jqplot.CanvasFontRenderer(c)}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}};a.jqplot.CanvasAxisLabelRenderer.prototype.init=function(b){a.extend(true,this,b);this._textRenderer.init({fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily})};a.jqplot.CanvasAxisLabelRenderer.prototype.getWidth=function(d){if(this._elem){return this._elem.outerWidth(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.sin(f.angle)*e)+Math.abs(Math.cos(f.angle)*c);return b}};a.jqplot.CanvasAxisLabelRenderer.prototype.getHeight=function(d){if(this._elem){return this._elem.outerHeight(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.cos(f.angle)*e)+Math.abs(Math.sin(f.angle)*c);return b}};a.jqplot.CanvasAxisLabelRenderer.prototype.getAngleRad=function(){var b=this.angle*Math.PI/180;return b};a.jqplot.CanvasAxisLabelRenderer.prototype.draw=function(c,f){if(this._elem){if(a.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==undefined){window.G_vmlCanvasManager.uninitElement(this._elem.get(0))}this._elem.emptyForce();this._elem=null}var e=f.canvasManager.getCanvas();this._textRenderer.setText(this.label,c);var b=this.getWidth(c);var d=this.getHeight(c);e.width=b;e.height=d;e.style.width=b;e.style.height=d;e=f.canvasManager.initCanvas(e);this._elem=a(e);this._elem.css({position:"absolute"});this._elem.addClass("jqplot-"+this.axis+"-label");e=null;return this._elem};a.jqplot.CanvasAxisLabelRenderer.prototype.pack=function(){this._textRenderer.draw(this._elem.get(0).getContext("2d"),this.label)}})(jQuery);
|
||||||
@@ -0,0 +1,253 @@
|
|||||||
|
/**
|
||||||
|
* jqPlot
|
||||||
|
* Pure JavaScript plotting plugin using jQuery
|
||||||
|
*
|
||||||
|
* Version: 1.0.8
|
||||||
|
* Revision: 1250
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009-2013 Chris Leonello
|
||||||
|
* jqPlot is currently available for use in all personal or commercial projects
|
||||||
|
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
|
||||||
|
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
|
||||||
|
* choose the license that best suits your project and use it accordingly.
|
||||||
|
*
|
||||||
|
* Although not required, the author would appreciate an email letting him
|
||||||
|
* know of any substantial use of jqPlot. You can reach the author at:
|
||||||
|
* chris at jqplot dot com or see http://www.jqplot.com/info.php .
|
||||||
|
*
|
||||||
|
* If you are feeling kind and generous, consider supporting the project by
|
||||||
|
* making a donation at: http://www.jqplot.com/donate.php .
|
||||||
|
*
|
||||||
|
* sprintf functions contained in jqplot.sprintf.js by Ash Searle:
|
||||||
|
*
|
||||||
|
* version 2007.04.27
|
||||||
|
* author Ash Searle
|
||||||
|
* http://hexmen.com/blog/2007/03/printf-sprintf/
|
||||||
|
* http://hexmen.com/js/sprintf.js
|
||||||
|
* The author (Ash Searle) has placed this code in the public domain:
|
||||||
|
* "This code is unrestricted: you are free to use it however you like."
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
(function($) {
|
||||||
|
/**
|
||||||
|
* Class: $.jqplot.CanvasAxisTickRenderer
|
||||||
|
* Renderer to draw axis ticks with a canvas element to support advanced
|
||||||
|
* featrues such as rotated text. This renderer uses a separate rendering engine
|
||||||
|
* to draw the text on the canvas. Two modes of rendering the text are available.
|
||||||
|
* If the browser has native font support for canvas fonts (currently Mozila 3.5
|
||||||
|
* and Safari 4), you can enable text rendering with the canvas fillText method.
|
||||||
|
* You do so by setting the "enableFontSupport" option to true.
|
||||||
|
*
|
||||||
|
* Browsers lacking native font support will have the text drawn on the canvas
|
||||||
|
* using the Hershey font metrics. Even if the "enableFontSupport" option is true
|
||||||
|
* non-supporting browsers will still render with the Hershey font.
|
||||||
|
*/
|
||||||
|
$.jqplot.CanvasAxisTickRenderer = function(options) {
|
||||||
|
// Group: Properties
|
||||||
|
|
||||||
|
// prop: mark
|
||||||
|
// tick mark on the axis. One of 'inside', 'outside', 'cross', '' or null.
|
||||||
|
this.mark = 'outside';
|
||||||
|
// prop: showMark
|
||||||
|
// whether or not to show the mark on the axis.
|
||||||
|
this.showMark = true;
|
||||||
|
// prop: showGridline
|
||||||
|
// whether or not to draw the gridline on the grid at this tick.
|
||||||
|
this.showGridline = true;
|
||||||
|
// prop: isMinorTick
|
||||||
|
// if this is a minor tick.
|
||||||
|
this.isMinorTick = false;
|
||||||
|
// prop: angle
|
||||||
|
// angle of text, measured clockwise from x axis.
|
||||||
|
this.angle = 0;
|
||||||
|
// prop: markSize
|
||||||
|
// Length of the tick marks in pixels. For 'cross' style, length
|
||||||
|
// will be stoked above and below axis, so total length will be twice this.
|
||||||
|
this.markSize = 4;
|
||||||
|
// prop: show
|
||||||
|
// whether or not to show the tick (mark and label).
|
||||||
|
this.show = true;
|
||||||
|
// prop: showLabel
|
||||||
|
// whether or not to show the label.
|
||||||
|
this.showLabel = true;
|
||||||
|
// prop: labelPosition
|
||||||
|
// 'auto', 'start', 'middle' or 'end'.
|
||||||
|
// Whether tick label should be positioned so the start, middle, or end
|
||||||
|
// of the tick mark.
|
||||||
|
this.labelPosition = 'auto';
|
||||||
|
this.label = '';
|
||||||
|
this.value = null;
|
||||||
|
this._styles = {};
|
||||||
|
// prop: formatter
|
||||||
|
// A class of a formatter for the tick text.
|
||||||
|
// The default $.jqplot.DefaultTickFormatter uses sprintf.
|
||||||
|
this.formatter = $.jqplot.DefaultTickFormatter;
|
||||||
|
// prop: formatString
|
||||||
|
// string passed to the formatter.
|
||||||
|
this.formatString = '';
|
||||||
|
// prop: prefix
|
||||||
|
// String to prepend to the tick label.
|
||||||
|
// Prefix is prepended to the formatted tick label.
|
||||||
|
this.prefix = '';
|
||||||
|
// prop: fontFamily
|
||||||
|
// css spec for the font-family css attribute.
|
||||||
|
this.fontFamily = '"Trebuchet MS", Arial, Helvetica, sans-serif';
|
||||||
|
// prop: fontSize
|
||||||
|
// CSS spec for font size.
|
||||||
|
this.fontSize = '10pt';
|
||||||
|
// prop: fontWeight
|
||||||
|
// CSS spec for fontWeight
|
||||||
|
this.fontWeight = 'normal';
|
||||||
|
// prop: fontStretch
|
||||||
|
// Multiplier to condense or expand font width.
|
||||||
|
// Applies only to browsers which don't support canvas native font rendering.
|
||||||
|
this.fontStretch = 1.0;
|
||||||
|
// prop: textColor
|
||||||
|
// css spec for the color attribute.
|
||||||
|
this.textColor = '#666666';
|
||||||
|
// prop: enableFontSupport
|
||||||
|
// true to turn on native canvas font support in Mozilla 3.5+ and Safari 4+.
|
||||||
|
// If true, tick label will be drawn with canvas tag native support for fonts.
|
||||||
|
// If false, tick label will be drawn with Hershey font metrics.
|
||||||
|
this.enableFontSupport = true;
|
||||||
|
// prop: pt2px
|
||||||
|
// Point to pixel scaling factor, used for computing height of bounding box
|
||||||
|
// around a label. The labels text renderer has a default setting of 1.4, which
|
||||||
|
// should be suitable for most fonts. Leave as null to use default. If tops of
|
||||||
|
// letters appear clipped, increase this. If bounding box seems too big, decrease.
|
||||||
|
// This is an issue only with the native font renderering capabilities of Mozilla
|
||||||
|
// 3.5 and Safari 4 since they do not provide a method to determine the font height.
|
||||||
|
this.pt2px = null;
|
||||||
|
|
||||||
|
this._elem;
|
||||||
|
this._ctx;
|
||||||
|
this._plotWidth;
|
||||||
|
this._plotHeight;
|
||||||
|
this._plotDimensions = {height:null, width:null};
|
||||||
|
|
||||||
|
$.extend(true, this, options);
|
||||||
|
|
||||||
|
var ropts = {fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily};
|
||||||
|
if (this.pt2px) {
|
||||||
|
ropts.pt2px = this.pt2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.enableFontSupport) {
|
||||||
|
if ($.jqplot.support_canvas_text()) {
|
||||||
|
this._textRenderer = new $.jqplot.CanvasFontRenderer(ropts);
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this._textRenderer = new $.jqplot.CanvasTextRenderer(ropts);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasAxisTickRenderer.prototype.init = function(options) {
|
||||||
|
$.extend(true, this, options);
|
||||||
|
this._textRenderer.init({fontSize:this.fontSize, fontWeight:this.fontWeight, fontStretch:this.fontStretch, fillStyle:this.textColor, angle:this.getAngleRad(), fontFamily:this.fontFamily});
|
||||||
|
};
|
||||||
|
|
||||||
|
// return width along the x axis
|
||||||
|
// will check first to see if an element exists.
|
||||||
|
// if not, will return the computed text box width.
|
||||||
|
$.jqplot.CanvasAxisTickRenderer.prototype.getWidth = function(ctx) {
|
||||||
|
if (this._elem) {
|
||||||
|
return this._elem.outerWidth(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var tr = this._textRenderer;
|
||||||
|
var l = tr.getWidth(ctx);
|
||||||
|
var h = tr.getHeight(ctx);
|
||||||
|
var w = Math.abs(Math.sin(tr.angle)*h) + Math.abs(Math.cos(tr.angle)*l);
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// return height along the y axis.
|
||||||
|
$.jqplot.CanvasAxisTickRenderer.prototype.getHeight = function(ctx) {
|
||||||
|
if (this._elem) {
|
||||||
|
return this._elem.outerHeight(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var tr = this._textRenderer;
|
||||||
|
var l = tr.getWidth(ctx);
|
||||||
|
var h = tr.getHeight(ctx);
|
||||||
|
var w = Math.abs(Math.cos(tr.angle)*h) + Math.abs(Math.sin(tr.angle)*l);
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// return top.
|
||||||
|
$.jqplot.CanvasAxisTickRenderer.prototype.getTop = function(ctx) {
|
||||||
|
if (this._elem) {
|
||||||
|
return this._elem.position().top;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasAxisTickRenderer.prototype.getAngleRad = function() {
|
||||||
|
var a = this.angle * Math.PI/180;
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
$.jqplot.CanvasAxisTickRenderer.prototype.setTick = function(value, axisName, isMinor) {
|
||||||
|
this.value = value;
|
||||||
|
if (isMinor) {
|
||||||
|
this.isMinorTick = true;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasAxisTickRenderer.prototype.draw = function(ctx, plot) {
|
||||||
|
if (!this.label) {
|
||||||
|
this.label = this.prefix + this.formatter(this.formatString, this.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Memory Leaks patch
|
||||||
|
if (this._elem) {
|
||||||
|
if ($.jqplot.use_excanvas && window.G_vmlCanvasManager.uninitElement !== undefined) {
|
||||||
|
window.G_vmlCanvasManager.uninitElement(this._elem.get(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
this._elem.emptyForce();
|
||||||
|
this._elem = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create a canvas here, but can't draw on it untill it is appended
|
||||||
|
// to dom for IE compatability.
|
||||||
|
|
||||||
|
var elem = plot.canvasManager.getCanvas();
|
||||||
|
|
||||||
|
this._textRenderer.setText(this.label, ctx);
|
||||||
|
var w = this.getWidth(ctx);
|
||||||
|
var h = this.getHeight(ctx);
|
||||||
|
// canvases seem to need to have width and heigh attributes directly set.
|
||||||
|
elem.width = w;
|
||||||
|
elem.height = h;
|
||||||
|
elem.style.width = w;
|
||||||
|
elem.style.height = h;
|
||||||
|
elem.style.textAlign = 'left';
|
||||||
|
elem.style.position = 'absolute';
|
||||||
|
|
||||||
|
elem = plot.canvasManager.initCanvas(elem);
|
||||||
|
|
||||||
|
this._elem = $(elem);
|
||||||
|
this._elem.css(this._styles);
|
||||||
|
this._elem.addClass('jqplot-'+this.axis+'-tick');
|
||||||
|
|
||||||
|
elem = null;
|
||||||
|
return this._elem;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasAxisTickRenderer.prototype.pack = function() {
|
||||||
|
this._textRenderer.draw(this._elem.get(0).getContext("2d"), this.label);
|
||||||
|
};
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
|
||||||
|
jsDate | (c) 2010-2013 Chris Leonello
|
||||||
|
*/(function(a){a.jqplot.CanvasAxisTickRenderer=function(b){this.mark="outside";this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.angle=0;this.markSize=4;this.show=true;this.showLabel=true;this.labelPosition="auto";this.label="";this.value=null;this._styles={};this.formatter=a.jqplot.DefaultTickFormatter;this.formatString="";this.prefix="";this.fontFamily='"Trebuchet MS", Arial, Helvetica, sans-serif';this.fontSize="10pt";this.fontWeight="normal";this.fontStretch=1;this.textColor="#666666";this.enableFontSupport=true;this.pt2px=null;this._elem;this._ctx;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null};a.extend(true,this,b);var c={fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily};if(this.pt2px){c.pt2px=this.pt2px}if(this.enableFontSupport){if(a.jqplot.support_canvas_text()){this._textRenderer=new a.jqplot.CanvasFontRenderer(c)}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}};a.jqplot.CanvasAxisTickRenderer.prototype.init=function(b){a.extend(true,this,b);this._textRenderer.init({fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily})};a.jqplot.CanvasAxisTickRenderer.prototype.getWidth=function(d){if(this._elem){return this._elem.outerWidth(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.sin(f.angle)*e)+Math.abs(Math.cos(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getHeight=function(d){if(this._elem){return this._elem.outerHeight(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.cos(f.angle)*e)+Math.abs(Math.sin(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getTop=function(b){if(this._elem){return this._elem.position().top}else{return null}};a.jqplot.CanvasAxisTickRenderer.prototype.getAngleRad=function(){var b=this.angle*Math.PI/180;return b};a.jqplot.CanvasAxisTickRenderer.prototype.setTick=function(b,d,c){this.value=b;if(c){this.isMinorTick=true}return this};a.jqplot.CanvasAxisTickRenderer.prototype.draw=function(c,f){if(!this.label){this.label=this.prefix+this.formatter(this.formatString,this.value)}if(this._elem){if(a.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==undefined){window.G_vmlCanvasManager.uninitElement(this._elem.get(0))}this._elem.emptyForce();this._elem=null}var e=f.canvasManager.getCanvas();this._textRenderer.setText(this.label,c);var b=this.getWidth(c);var d=this.getHeight(c);e.width=b;e.height=d;e.style.width=b;e.style.height=d;e.style.textAlign="left";e.style.position="absolute";e=f.canvasManager.initCanvas(e);this._elem=a(e);this._elem.css(this._styles);this._elem.addClass("jqplot-"+this.axis+"-tick");e=null;return this._elem};a.jqplot.CanvasAxisTickRenderer.prototype.pack=function(){this._textRenderer.draw(this._elem.get(0).getContext("2d"),this.label)}})(jQuery);
|
||||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,3 @@
|
|||||||
|
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
|
||||||
|
jsDate | (c) 2010-2013 Chris Leonello
|
||||||
|
*/(function(d){var f=0;d.jqplot.CanvasOverlay=function(q){var o=q||{};this.options={show:d.jqplot.config.enablePlugins,deferDraw:false};this.objects=[];this.objectNames=[];this.canvas=null;this.markerRenderer=new d.jqplot.MarkerRenderer({style:"line"});this.markerRenderer.init();this.highlightObjectIndex=null;if(o.objects){var s=o.objects,r;for(var p=0;p<s.length;p++){r=s[p];for(var t in r){switch(t){case"line":this.addLine(r[t]);break;case"horizontalLine":this.addHorizontalLine(r[t]);break;case"dashedHorizontalLine":this.addDashedHorizontalLine(r[t]);break;case"verticalLine":this.addVerticalLine(r[t]);break;case"dashedVerticalLine":this.addDashedVerticalLine(r[t]);break;case"rectangle":this.addRectangle(r[t]);break;default:break}}}}d.extend(true,this.options,o)};d.jqplot.CanvasOverlay.postPlotInit=function(q,p,o){var n=o||{};this.plugins.canvasOverlay=new d.jqplot.CanvasOverlay(n.canvasOverlay)};function i(){this.uid=null;this.type=null;this.gridStart=null;this.gridStop=null;this.tooltipWidthFactor=0;this.options={name:null,show:true,lineWidth:2,lineCap:"round",color:"#666666",shadow:true,shadowAngle:45,shadowOffset:1,shadowDepth:3,shadowAlpha:"0.07",xaxis:"xaxis",yaxis:"yaxis",showTooltip:false,showTooltipPrecision:0.6,tooltipLocation:"nw",fadeTooltip:true,tooltipFadeSpeed:"fast",tooltipOffset:4,tooltipFormatString:"%d, %d"}}function m(n){i.call(this);this.type="rectangle";var o={xmin:null,xmax:null,xOffset:"6px",xminOffset:null,xmaxOffset:null,ymin:null,ymax:null,yOffset:"6px",yminOffset:null,ymaxOffset:null};d.extend(true,this.options,o,n);if(this.options.showTooltipPrecision<0.01){this.options.showTooltipPrecision=0.01}}m.prototype=new i();m.prototype.constructor=m;function b(n){i.call(this);this.type="line";var o={start:[],stop:[]};d.extend(true,this.options,o,n);if(this.options.showTooltipPrecision<0.01){this.options.showTooltipPrecision=0.01}}b.prototype=new i();b.prototype.constructor=b;function e(n){i.call(this);this.type="horizontalLine";var o={y:null,xmin:null,xmax:null,xOffset:"6px",xminOffset:null,xmaxOffset:null};d.extend(true,this.options,o,n);if(this.options.showTooltipPrecision<0.01){this.options.showTooltipPrecision=0.01}}e.prototype=new i();e.prototype.constructor=e;function j(n){i.call(this);this.type="dashedHorizontalLine";var o={y:null,xmin:null,xmax:null,xOffset:"6px",xminOffset:null,xmaxOffset:null,dashPattern:[8,8]};d.extend(true,this.options,o,n);if(this.options.showTooltipPrecision<0.01){this.options.showTooltipPrecision=0.01}}j.prototype=new i();j.prototype.constructor=j;function c(n){i.call(this);this.type="verticalLine";var o={x:null,ymin:null,ymax:null,yOffset:"6px",yminOffset:null,ymaxOffset:null};d.extend(true,this.options,o,n);if(this.options.showTooltipPrecision<0.01){this.options.showTooltipPrecision=0.01}}c.prototype=new i();c.prototype.constructor=c;function l(n){i.call(this);this.type="dashedVerticalLine";this.start=null;this.stop=null;var o={x:null,ymin:null,ymax:null,yOffset:"6px",yminOffset:null,ymaxOffset:null,dashPattern:[8,8]};d.extend(true,this.options,o,n);if(this.options.showTooltipPrecision<0.01){this.options.showTooltipPrecision=0.01}}l.prototype=new i();l.prototype.constructor=l;d.jqplot.CanvasOverlay.prototype.addLine=function(o){var n=new b(o);n.uid=f++;this.objects.push(n);this.objectNames.push(n.options.name)};d.jqplot.CanvasOverlay.prototype.addHorizontalLine=function(o){var n=new e(o);n.uid=f++;this.objects.push(n);this.objectNames.push(n.options.name)};d.jqplot.CanvasOverlay.prototype.addDashedHorizontalLine=function(o){var n=new j(o);n.uid=f++;this.objects.push(n);this.objectNames.push(n.options.name)};d.jqplot.CanvasOverlay.prototype.addVerticalLine=function(o){var n=new c(o);n.uid=f++;this.objects.push(n);this.objectNames.push(n.options.name)};d.jqplot.CanvasOverlay.prototype.addDashedVerticalLine=function(o){var n=new l(o);n.uid=f++;this.objects.push(n);this.objectNames.push(n.options.name)};d.jqplot.CanvasOverlay.prototype.addRectangle=function(o){var n=new m(o);n.uid=f++;this.objects.push(n);this.objectNames.push(n.options.name)};d.jqplot.CanvasOverlay.prototype.removeObject=function(n){if(d.type(n)=="number"){this.objects.splice(n,1);this.objectNames.splice(n,1)}else{var o=d.inArray(n,this.objectNames);if(o!=-1){this.objects.splice(o,1);this.objectNames.splice(o,1)}}};d.jqplot.CanvasOverlay.prototype.getObject=function(n){if(d.type(n)=="number"){return this.objects[n]}else{var o=d.inArray(n,this.objectNames);if(o!=-1){return this.objects[o]}}};d.jqplot.CanvasOverlay.prototype.get=d.jqplot.CanvasOverlay.prototype.getObject;d.jqplot.CanvasOverlay.prototype.clear=function(n){this.canvas._ctx.clearRect(0,0,this.canvas.getWidth(),this.canvas.getHeight())};d.jqplot.CanvasOverlay.prototype.draw=function(K){var A,v=this.objects,F=this.markerRenderer,s,G;if(this.options.show){this.canvas._ctx.clearRect(0,0,this.canvas.getWidth(),this.canvas.getHeight());for(var H=0;H<v.length;H++){A=v[H];var B=d.extend(true,{},A.options);if(A.options.show){F.shadow=Line truncated
|
||||||
@@ -0,0 +1,449 @@
|
|||||||
|
/**
|
||||||
|
* jqPlot
|
||||||
|
* Pure JavaScript plotting plugin using jQuery
|
||||||
|
*
|
||||||
|
* Version: 1.0.8
|
||||||
|
* Revision: 1250
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009-2013 Chris Leonello
|
||||||
|
* jqPlot is currently available for use in all personal or commercial projects
|
||||||
|
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
|
||||||
|
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
|
||||||
|
* choose the license that best suits your project and use it accordingly.
|
||||||
|
*
|
||||||
|
* Although not required, the author would appreciate an email letting him
|
||||||
|
* know of any substantial use of jqPlot. You can reach the author at:
|
||||||
|
* chris at jqplot dot com or see http://www.jqplot.com/info.php .
|
||||||
|
*
|
||||||
|
* If you are feeling kind and generous, consider supporting the project by
|
||||||
|
* making a donation at: http://www.jqplot.com/donate.php .
|
||||||
|
*
|
||||||
|
* sprintf functions contained in jqplot.sprintf.js by Ash Searle:
|
||||||
|
*
|
||||||
|
* version 2007.04.27
|
||||||
|
* author Ash Searle
|
||||||
|
* http://hexmen.com/blog/2007/03/printf-sprintf/
|
||||||
|
* http://hexmen.com/js/sprintf.js
|
||||||
|
* The author (Ash Searle) has placed this code in the public domain:
|
||||||
|
* "This code is unrestricted: you are free to use it however you like."
|
||||||
|
*
|
||||||
|
* included jsDate library by Chris Leonello:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2010-2013 Chris Leonello
|
||||||
|
*
|
||||||
|
* jsDate is currently available for use in all personal or commercial projects
|
||||||
|
* under both the MIT and GPL version 2.0 licenses. This means that you can
|
||||||
|
* choose the license that best suits your project and use it accordingly.
|
||||||
|
*
|
||||||
|
* jsDate borrows many concepts and ideas from the Date Instance
|
||||||
|
* Methods by Ken Snyder along with some parts of Ken's actual code.
|
||||||
|
*
|
||||||
|
* Ken's original Date Instance Methods and copyright notice:
|
||||||
|
*
|
||||||
|
* Ken Snyder (ken d snyder at gmail dot com)
|
||||||
|
* 2008-09-10
|
||||||
|
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
|
||||||
|
* Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
|
||||||
|
*
|
||||||
|
* jqplotToImage function based on Larry Siden's export-jqplot-to-png.js.
|
||||||
|
* Larry has generously given permission to adapt his code for inclusion
|
||||||
|
* into jqPlot.
|
||||||
|
*
|
||||||
|
* Larry's original code can be found here:
|
||||||
|
*
|
||||||
|
* https://github.com/lsiden/export-jqplot-to-png
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function($) {
|
||||||
|
// This code is a modified version of the canvastext.js code, copyright below:
|
||||||
|
//
|
||||||
|
// This code is released to the public domain by Jim Studt, 2007.
|
||||||
|
// He may keep some sort of up to date copy at http://www.federated.com/~jim/canvastext/
|
||||||
|
//
|
||||||
|
$.jqplot.CanvasTextRenderer = function(options){
|
||||||
|
this.fontStyle = 'normal'; // normal, italic, oblique [not implemented]
|
||||||
|
this.fontVariant = 'normal'; // normal, small caps [not implemented]
|
||||||
|
this.fontWeight = 'normal'; // normal, bold, bolder, lighter, 100 - 900
|
||||||
|
this.fontSize = '10px';
|
||||||
|
this.fontFamily = 'sans-serif';
|
||||||
|
this.fontStretch = 1.0;
|
||||||
|
this.fillStyle = '#666666';
|
||||||
|
this.angle = 0;
|
||||||
|
this.textAlign = 'start';
|
||||||
|
this.textBaseline = 'alphabetic';
|
||||||
|
this.text;
|
||||||
|
this.width;
|
||||||
|
this.height;
|
||||||
|
this.pt2px = 1.28;
|
||||||
|
|
||||||
|
$.extend(true, this, options);
|
||||||
|
this.normalizedFontSize = this.normalizeFontSize(this.fontSize);
|
||||||
|
this.setHeight();
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.init = function(options) {
|
||||||
|
$.extend(true, this, options);
|
||||||
|
this.normalizedFontSize = this.normalizeFontSize(this.fontSize);
|
||||||
|
this.setHeight();
|
||||||
|
};
|
||||||
|
|
||||||
|
// convert css spec into point size
|
||||||
|
// returns float
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.normalizeFontSize = function(sz) {
|
||||||
|
sz = String(sz);
|
||||||
|
var n = parseFloat(sz);
|
||||||
|
if (sz.indexOf('px') > -1) {
|
||||||
|
return n/this.pt2px;
|
||||||
|
}
|
||||||
|
else if (sz.indexOf('pt') > -1) {
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
else if (sz.indexOf('em') > -1) {
|
||||||
|
return n*12;
|
||||||
|
}
|
||||||
|
else if (sz.indexOf('%') > -1) {
|
||||||
|
return n*12/100;
|
||||||
|
}
|
||||||
|
// default to pixels;
|
||||||
|
else {
|
||||||
|
return n/this.pt2px;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.fontWeight2Float = function(w) {
|
||||||
|
// w = normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900
|
||||||
|
// return values adjusted for Hershey font.
|
||||||
|
if (Number(w)) {
|
||||||
|
return w/400;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
switch (w) {
|
||||||
|
case 'normal':
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
case 'bold':
|
||||||
|
return 1.75;
|
||||||
|
break;
|
||||||
|
case 'bolder':
|
||||||
|
return 2.25;
|
||||||
|
break;
|
||||||
|
case 'lighter':
|
||||||
|
return 0.75;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.getText = function() {
|
||||||
|
return this.text;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.setText = function(t, ctx) {
|
||||||
|
this.text = t;
|
||||||
|
this.setWidth(ctx);
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.getWidth = function(ctx) {
|
||||||
|
return this.width;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.setWidth = function(ctx, w) {
|
||||||
|
if (!w) {
|
||||||
|
this.width = this.measure(ctx, this.text);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.width = w;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
// return height in pixels.
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.getHeight = function(ctx) {
|
||||||
|
return this.height;
|
||||||
|
};
|
||||||
|
|
||||||
|
// w - height in pt
|
||||||
|
// set heigh in px
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.setHeight = function(w) {
|
||||||
|
if (!w) {
|
||||||
|
//height = this.fontSize /0.75;
|
||||||
|
this.height = this.normalizedFontSize * this.pt2px;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.height = w;
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.letter = function (ch)
|
||||||
|
{
|
||||||
|
return this.letters[ch];
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.ascent = function()
|
||||||
|
{
|
||||||
|
return this.normalizedFontSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.descent = function()
|
||||||
|
{
|
||||||
|
return 7.0*this.normalizedFontSize/25.0;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.measure = function(ctx, str)
|
||||||
|
{
|
||||||
|
var total = 0;
|
||||||
|
var len = str.length;
|
||||||
|
|
||||||
|
for (var i = 0; i < len; i++) {
|
||||||
|
var c = this.letter(str.charAt(i));
|
||||||
|
if (c) {
|
||||||
|
total += c.width * this.normalizedFontSize / 25.0 * this.fontStretch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return total;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.draw = function(ctx,str)
|
||||||
|
{
|
||||||
|
var x = 0;
|
||||||
|
// leave room at bottom for descenders.
|
||||||
|
var y = this.height*0.72;
|
||||||
|
var total = 0;
|
||||||
|
var len = str.length;
|
||||||
|
var mag = this.normalizedFontSize / 25.0;
|
||||||
|
|
||||||
|
ctx.save();
|
||||||
|
var tx, ty;
|
||||||
|
|
||||||
|
// 1st quadrant
|
||||||
|
if ((-Math.PI/2 <= this.angle && this.angle <= 0) || (Math.PI*3/2 <= this.angle && this.angle <= Math.PI*2)) {
|
||||||
|
tx = 0;
|
||||||
|
ty = -Math.sin(this.angle) * this.width;
|
||||||
|
}
|
||||||
|
// 4th quadrant
|
||||||
|
else if ((0 < this.angle && this.angle <= Math.PI/2) || (-Math.PI*2 <= this.angle && this.angle <= -Math.PI*3/2)) {
|
||||||
|
tx = Math.sin(this.angle) * this.height;
|
||||||
|
ty = 0;
|
||||||
|
}
|
||||||
|
// 2nd quadrant
|
||||||
|
else if ((-Math.PI < this.angle && this.angle < -Math.PI/2) || (Math.PI <= this.angle && this.angle <= Math.PI*3/2)) {
|
||||||
|
tx = -Math.cos(this.angle) * this.width;
|
||||||
|
ty = -Math.sin(this.angle) * this.width - Math.cos(this.angle) * this.height;
|
||||||
|
}
|
||||||
|
// 3rd quadrant
|
||||||
|
else if ((-Math.PI*3/2 < this.angle && this.angle < Math.PI) || (Math.PI/2 < this.angle && this.angle < Math.PI)) {
|
||||||
|
tx = Math.sin(this.angle) * this.height - Math.cos(this.angle)*this.width;
|
||||||
|
ty = -Math.cos(this.angle) * this.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.strokeStyle = this.fillStyle;
|
||||||
|
ctx.fillStyle = this.fillStyle;
|
||||||
|
ctx.translate(tx, ty);
|
||||||
|
ctx.rotate(this.angle);
|
||||||
|
ctx.lineCap = "round";
|
||||||
|
// multiplier was 2.0
|
||||||
|
var fact = (this.normalizedFontSize > 30) ? 2.0 : 2 + (30 - this.normalizedFontSize)/20;
|
||||||
|
ctx.lineWidth = fact * mag * this.fontWeight2Float(this.fontWeight);
|
||||||
|
|
||||||
|
for ( var i = 0; i < len; i++) {
|
||||||
|
var c = this.letter( str.charAt(i));
|
||||||
|
if ( !c) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.beginPath();
|
||||||
|
|
||||||
|
var penUp = 1;
|
||||||
|
var needStroke = 0;
|
||||||
|
for ( var j = 0; j < c.points.length; j++) {
|
||||||
|
var a = c.points[j];
|
||||||
|
if ( a[0] == -1 && a[1] == -1) {
|
||||||
|
penUp = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ( penUp) {
|
||||||
|
ctx.moveTo( x + a[0]*mag*this.fontStretch, y - a[1]*mag);
|
||||||
|
penUp = false;
|
||||||
|
} else {
|
||||||
|
ctx.lineTo( x + a[0]*mag*this.fontStretch, y - a[1]*mag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ctx.stroke();
|
||||||
|
x += c.width*mag*this.fontStretch;
|
||||||
|
}
|
||||||
|
ctx.restore();
|
||||||
|
return total;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasTextRenderer.prototype.letters = {
|
||||||
|
' ': { width: 16, points: [] },
|
||||||
|
'!': { width: 10, points: [[5,21],[5,7],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]] },
|
||||||
|
'"': { width: 16, points: [[4,21],[4,14],[-1,-1],[12,21],[12,14]] },
|
||||||
|
'#': { width: 21, points: [[11,25],[4,-7],[-1,-1],[17,25],[10,-7],[-1,-1],[4,12],[18,12],[-1,-1],[3,6],[17,6]] },
|
||||||
|
'$': { width: 20, points: [[8,25],[8,-4],[-1,-1],[12,25],[12,-4],[-1,-1],[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] },
|
||||||
|
'%': { width: 24, points: [[21,21],[3,0],[-1,-1],[8,21],[10,19],[10,17],[9,15],[7,14],[5,14],[3,16],[3,18],[4,20],[6,21],[8,21],[10,20],[13,19],[16,19],[19,20],[21,21],[-1,-1],[17,7],[15,6],[14,4],[14,2],[16,0],[18,0],[20,1],[21,3],[21,5],[19,7],[17,7]] },
|
||||||
|
'&': { width: 26, points: [[23,12],[23,13],[22,14],[21,14],[20,13],[19,11],[17,6],[15,3],[13,1],[11,0],[7,0],[5,1],[4,2],[3,4],[3,6],[4,8],[5,9],[12,13],[13,14],[14,16],[14,18],[13,20],[11,21],[9,20],[8,18],[8,16],[9,13],[11,10],[16,3],[18,1],[20,0],[22,0],[23,1],[23,2]] },
|
||||||
|
'\'': { width: 10, points: [[5,19],[4,20],[5,21],[6,20],[6,18],[5,16],[4,15]] },
|
||||||
|
'(': { width: 14, points: [[11,25],[9,23],[7,20],[5,16],[4,11],[4,7],[5,2],[7,-2],[9,-5],[11,-7]] },
|
||||||
|
')': { width: 14, points: [[3,25],[5,23],[7,20],[9,16],[10,11],[10,7],[9,2],[7,-2],[5,-5],[3,-7]] },
|
||||||
|
'*': { width: 16, points: [[8,21],[8,9],[-1,-1],[3,18],[13,12],[-1,-1],[13,18],[3,12]] },
|
||||||
|
'+': { width: 26, points: [[13,18],[13,0],[-1,-1],[4,9],[22,9]] },
|
||||||
|
',': { width: 10, points: [[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] },
|
||||||
|
'-': { width: 18, points: [[6,9],[12,9]] },
|
||||||
|
'.': { width: 10, points: [[5,2],[4,1],[5,0],[6,1],[5,2]] },
|
||||||
|
'/': { width: 22, points: [[20,25],[2,-7]] },
|
||||||
|
'0': { width: 20, points: [[9,21],[6,20],[4,17],[3,12],[3,9],[4,4],[6,1],[9,0],[11,0],[14,1],[16,4],[17,9],[17,12],[16,17],[14,20],[11,21],[9,21]] },
|
||||||
|
'1': { width: 20, points: [[6,17],[8,18],[11,21],[11,0]] },
|
||||||
|
'2': { width: 20, points: [[4,16],[4,17],[5,19],[6,20],[8,21],[12,21],[14,20],[15,19],[16,17],[16,15],[15,13],[13,10],[3,0],[17,0]] },
|
||||||
|
'3': { width: 20, points: [[5,21],[16,21],[10,13],[13,13],[15,12],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] },
|
||||||
|
'4': { width: 20, points: [[13,21],[3,7],[18,7],[-1,-1],[13,21],[13,0]] },
|
||||||
|
'5': { width: 20, points: [[15,21],[5,21],[4,12],[5,13],[8,14],[11,14],[14,13],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] },
|
||||||
|
'6': { width: 20, points: [[16,18],[15,20],[12,21],[10,21],[7,20],[5,17],[4,12],[4,7],[5,3],[7,1],[10,0],[11,0],[14,1],[16,3],[17,6],[17,7],[16,10],[14,12],[11,13],[10,13],[7,12],[5,10],[4,7]] },
|
||||||
|
'7': { width: 20, points: [[17,21],[7,0],[-1,-1],[3,21],[17,21]] },
|
||||||
|
'8': { width: 20, points: [[8,21],[5,20],[4,18],[4,16],[5,14],[7,13],[11,12],[14,11],[16,9],[17,7],[17,4],[16,2],[15,1],[12,0],[8,0],[5,1],[4,2],[3,4],[3,7],[4,9],[6,11],[9,12],[13,13],[15,14],[16,16],[16,18],[15,20],[12,21],[8,21]] },
|
||||||
|
'9': { width: 20, points: [[16,14],[15,11],[13,9],[10,8],[9,8],[6,9],[4,11],[3,14],[3,15],[4,18],[6,20],[9,21],[10,21],[13,20],[15,18],[16,14],[16,9],[15,4],[13,1],[10,0],[8,0],[5,1],[4,3]] },
|
||||||
|
':': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]] },
|
||||||
|
';': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] },
|
||||||
|
'<': { width: 24, points: [[20,18],[4,9],[20,0]] },
|
||||||
|
'=': { width: 26, points: [[4,12],[22,12],[-1,-1],[4,6],[22,6]] },
|
||||||
|
'>': { width: 24, points: [[4,18],[20,9],[4,0]] },
|
||||||
|
'?': { width: 18, points: [[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],[-1,-1],[9,2],[8,1],[9,0],[10,1],[9,2]] },
|
||||||
|
'@': { width: 27, points: [[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],[-1,-1],[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],[-1,-1],[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],[-1,-1],[19,16],[18,8],[18,6],[19,5]] },
|
||||||
|
'A': { width: 18, points: [[9,21],[1,0],[-1,-1],[9,21],[17,0],[-1,-1],[4,7],[14,7]] },
|
||||||
|
'B': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[-1,-1],[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]] },
|
||||||
|
'C': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]] },
|
||||||
|
'D': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]] },
|
||||||
|
'E': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11],[-1,-1],[4,0],[17,0]] },
|
||||||
|
'F': { width: 18, points: [[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11]] },
|
||||||
|
'G': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],[-1,-1],[13,8],[18,8]] },
|
||||||
|
'H': { width: 22, points: [[4,21],[4,0],[-1,-1],[18,21],[18,0],[-1,-1],[4,11],[18,11]] },
|
||||||
|
'I': { width: 8, points: [[4,21],[4,0]] },
|
||||||
|
'J': { width: 16, points: [[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]] },
|
||||||
|
'K': { width: 21, points: [[4,21],[4,0],[-1,-1],[18,21],[4,7],[-1,-1],[9,12],[18,0]] },
|
||||||
|
'L': { width: 17, points: [[4,21],[4,0],[-1,-1],[4,0],[16,0]] },
|
||||||
|
'M': { width: 24, points: [[4,21],[4,0],[-1,-1],[4,21],[12,0],[-1,-1],[20,21],[12,0],[-1,-1],[20,21],[20,0]] },
|
||||||
|
'N': { width: 22, points: [[4,21],[4,0],[-1,-1],[4,21],[18,0],[-1,-1],[18,21],[18,0]] },
|
||||||
|
'O': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]] },
|
||||||
|
'P': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]] },
|
||||||
|
'Q': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],[-1,-1],[12,4],[18,-2]] },
|
||||||
|
'R': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],[-1,-1],[11,11],[18,0]] },
|
||||||
|
'S': { width: 20, points: [[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] },
|
||||||
|
'T': { width: 16, points: [[8,21],[8,0],[-1,-1],[1,21],[15,21]] },
|
||||||
|
'U': { width: 22, points: [[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]] },
|
||||||
|
'V': { width: 18, points: [[1,21],[9,0],[-1,-1],[17,21],[9,0]] },
|
||||||
|
'W': { width: 24, points: [[2,21],[7,0],[-1,-1],[12,21],[7,0],[-1,-1],[12,21],[17,0],[-1,-1],[22,21],[17,0]] },
|
||||||
|
'X': { width: 20, points: [[3,21],[17,0],[-1,-1],[17,21],[3,0]] },
|
||||||
|
'Y': { width: 18, points: [[1,21],[9,11],[9,0],[-1,-1],[17,21],[9,11]] },
|
||||||
|
'Z': { width: 20, points: [[17,21],[3,0],[-1,-1],[3,21],[17,21],[-1,-1],[3,0],[17,0]] },
|
||||||
|
'[': { width: 14, points: [[4,25],[4,-7],[-1,-1],[5,25],[5,-7],[-1,-1],[4,25],[11,25],[-1,-1],[4,-7],[11,-7]] },
|
||||||
|
'\\': { width: 14, points: [[0,21],[14,-3]] },
|
||||||
|
']': { width: 14, points: [[9,25],[9,-7],[-1,-1],[10,25],[10,-7],[-1,-1],[3,25],[10,25],[-1,-1],[3,-7],[10,-7]] },
|
||||||
|
'^': { width: 16, points: [[6,15],[8,18],[10,15],[-1,-1],[3,12],[8,17],[13,12],[-1,-1],[8,17],[8,0]] },
|
||||||
|
'_': { width: 16, points: [[0,-2],[16,-2]] },
|
||||||
|
'`': { width: 10, points: [[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]] },
|
||||||
|
'a': { width: 19, points: [[15,14],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
|
||||||
|
'b': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] },
|
||||||
|
'c': { width: 18, points: [[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
|
||||||
|
'd': { width: 19, points: [[15,21],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
|
||||||
|
'e': { width: 18, points: [[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
|
||||||
|
'f': { width: 12, points: [[10,21],[8,21],[6,20],[5,17],[5,0],[-1,-1],[2,14],[9,14]] },
|
||||||
|
'g': { width: 19, points: [[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
|
||||||
|
'h': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] },
|
||||||
|
'i': { width: 8, points: [[3,21],[4,20],[5,21],[4,22],[3,21],[-1,-1],[4,14],[4,0]] },
|
||||||
|
'j': { width: 10, points: [[5,21],[6,20],[7,21],[6,22],[5,21],[-1,-1],[6,14],[6,-3],[5,-6],[3,-7],[1,-7]] },
|
||||||
|
'k': { width: 17, points: [[4,21],[4,0],[-1,-1],[14,14],[4,4],[-1,-1],[8,8],[15,0]] },
|
||||||
|
'l': { width: 8, points: [[4,21],[4,0]] },
|
||||||
|
'm': { width: 30, points: [[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],[-1,-1],[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]] },
|
||||||
|
'n': { width: 19, points: [[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] },
|
||||||
|
'o': { width: 19, points: [[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]] },
|
||||||
|
'p': { width: 19, points: [[4,14],[4,-7],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] },
|
||||||
|
'q': { width: 19, points: [[15,14],[15,-7],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
|
||||||
|
'r': { width: 13, points: [[4,14],[4,0],[-1,-1],[4,8],[5,11],[7,13],[9,14],[12,14]] },
|
||||||
|
's': { width: 17, points: [[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]] },
|
||||||
|
't': { width: 12, points: [[5,21],[5,4],[6,1],[8,0],[10,0],[-1,-1],[2,14],[9,14]] },
|
||||||
|
'u': { width: 19, points: [[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],[-1,-1],[15,14],[15,0]] },
|
||||||
|
'v': { width: 16, points: [[2,14],[8,0],[-1,-1],[14,14],[8,0]] },
|
||||||
|
'w': { width: 22, points: [[3,14],[7,0],[-1,-1],[11,14],[7,0],[-1,-1],[11,14],[15,0],[-1,-1],[19,14],[15,0]] },
|
||||||
|
'x': { width: 17, points: [[3,14],[14,0],[-1,-1],[14,14],[3,0]] },
|
||||||
|
'y': { width: 16, points: [[2,14],[8,0],[-1,-1],[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]] },
|
||||||
|
'z': { width: 17, points: [[14,14],[3,0],[-1,-1],[3,14],[14,14],[-1,-1],[3,0],[14,0]] },
|
||||||
|
'{': { width: 14, points: [[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],[-1,-1],[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],[-1,-1],[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]] },
|
||||||
|
'|': { width: 8, points: [[4,25],[4,-7]] },
|
||||||
|
'}': { width: 14, points: [[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],[-1,-1],[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],[-1,-1],[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]] },
|
||||||
|
'~': { width: 24, points: [[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],[-1,-1],[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]] }
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasFontRenderer = function(options) {
|
||||||
|
options = options || {};
|
||||||
|
if (!options.pt2px) {
|
||||||
|
options.pt2px = 1.5;
|
||||||
|
}
|
||||||
|
$.jqplot.CanvasTextRenderer.call(this, options);
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasFontRenderer.prototype = new $.jqplot.CanvasTextRenderer({});
|
||||||
|
$.jqplot.CanvasFontRenderer.prototype.constructor = $.jqplot.CanvasFontRenderer;
|
||||||
|
|
||||||
|
$.jqplot.CanvasFontRenderer.prototype.measure = function(ctx, str)
|
||||||
|
{
|
||||||
|
// var fstyle = this.fontStyle+' '+this.fontVariant+' '+this.fontWeight+' '+this.fontSize+' '+this.fontFamily;
|
||||||
|
var fstyle = this.fontSize+' '+this.fontFamily;
|
||||||
|
ctx.save();
|
||||||
|
ctx.font = fstyle;
|
||||||
|
var w = ctx.measureText(str).width;
|
||||||
|
ctx.restore();
|
||||||
|
return w;
|
||||||
|
};
|
||||||
|
|
||||||
|
$.jqplot.CanvasFontRenderer.prototype.draw = function(ctx, str)
|
||||||
|
{
|
||||||
|
var x = 0;
|
||||||
|
// leave room at bottom for descenders.
|
||||||
|
var y = this.height*0.72;
|
||||||
|
//var y = 12;
|
||||||
|
|
||||||
|
ctx.save();
|
||||||
|
var tx, ty;
|
||||||
|
|
||||||
|
// 1st quadrant
|
||||||
|
if ((-Math.PI/2 <= this.angle && this.angle <= 0) || (Math.PI*3/2 <= this.angle && this.angle <= Math.PI*2)) {
|
||||||
|
tx = 0;
|
||||||
|
ty = -Math.sin(this.angle) * this.width;
|
||||||
|
}
|
||||||
|
// 4th quadrant
|
||||||
|
else if ((0 < this.angle && this.angle <= Math.PI/2) || (-Math.PI*2 <= this.angle && this.angle <= -Math.PI*3/2)) {
|
||||||
|
tx = Math.sin(this.angle) * this.height;
|
||||||
|
ty = 0;
|
||||||
|
}
|
||||||
|
// 2nd quadrant
|
||||||
|
else if ((-Math.PI < this.angle && this.angle < -Math.PI/2) || (Math.PI <= this.angle && this.angle <= Math.PI*3/2)) {
|
||||||
|
tx = -Math.cos(this.angle) * this.width;
|
||||||
|
ty = -Math.sin(this.angle) * this.width - Math.cos(this.angle) * this.height;
|
||||||
|
}
|
||||||
|
// 3rd quadrant
|
||||||
|
else if ((-Math.PI*3/2 < this.angle && this.angle < Math.PI) || (Math.PI/2 < this.angle && this.angle < Math.PI)) {
|
||||||
|
tx = Math.sin(this.angle) * this.height - Math.cos(this.angle)*this.width;
|
||||||
|
ty = -Math.cos(this.angle) * this.height;
|
||||||
|
}
|
||||||
|
ctx.strokeStyle = this.fillStyle;
|
||||||
|
ctx.fillStyle = this.fillStyle;
|
||||||
|
// var fstyle = this.fontStyle+' '+this.fontVariant+' '+this.fontWeight+' '+this.fontSize+' '+this.fontFamily;
|
||||||
|
var fstyle = this.fontSize+' '+this.fontFamily;
|
||||||
|
ctx.font = fstyle;
|
||||||
|
ctx.translate(tx, ty);
|
||||||
|
ctx.rotate(this.angle);
|
||||||
|
ctx.fillText(str, x, y);
|
||||||
|
// ctx.strokeText(str, x, y);
|
||||||
|
|
||||||
|
ctx.restore();
|
||||||
|
};
|
||||||
|
|
||||||
|
})(jQuery);
|
||||||
Loaded 100 of 183 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user