지정날짜에 이미지 보여주기 혹은 감추기

질문)
안녕하세요?

예를 들어 추석기간에는 쇼핑을 하실 수 없습니다.

메인에 쇼핑하기 버튼을 10월4일 00:00부터~ 10월8일 24:00 까지 안보이게 할 수 있을까요?

부탁드립니다~~~~~~~~

모두들 연휴 잘보내세요~ ^^*


답)

$now = date(‘Y-m-d H:i:s’)
if( $now > ‘2006-10-04 00:00:00’ && $now < ‘2006-10-08 23:59:59’)
{
~~~~~~~
}

구글 메일(GMail)로 메일 발송하기

메일 발송에 대해선 포탈에 IP를 등록한다는 둥 서버이름을 제대로 써야한다는 둥 말도 많고 탈도 많은데요, 메일서버를 구비하지 않고도 구글 메일을 이용해서 메일을 발송할 수 있습니다.

엄청난 뒷북일 수도 있지만, 검색해보니 없네요 🙂

급조한 소스 들어갑니다. 간단하기 때문에 딱 보시면 알듯 하구요, 중요한 것은 구글의 SMTP 메일 설정 몇가지 일듯 합니다.

우선 문자셋 기준은 UTF-8로 되어 있고, 예제로 만든 페이지에서 구글 광고를 삭제한 원본 그대로입니다.

원래 메일러를 PEAR로 쓰려 했는데 의존성이 있어서, XPertMailer라는 것을 사용했습니다. 말 그대로 전문가들이 쓰는 것이라는 뜻인 듯 하지만, 꽤나 편하게 쓸 수 있도록 되어 있더군요. XPertMailer.php 파일을 동일 폴더에 넣으면 작동할 것 같네요.

아참, 그리고 서버에 SSL 모듈이 깔려있어야 합니다.

————————————–

if(isset($_POST[‘submit’])) {
    $password =    $_POST[‘password’];
    $sender_email =    $_POST[‘sender_email’];
    $sender =    ‘=?UTF-8?B?’.base64_encode($_POST[‘sender’]).’?=’;
    $receiver =    ‘”‘.’=?UTF-8?B?’.base64_encode($_POST[‘receiver’]).’?=’.'” <‘.$_POST[‘receiver_email’].’>’;
    $subject =    ‘=?UTF-8?B?’.base64_encode($_POST[‘subject’]).’?=’;
    $contents =    $_POST[‘contents’];
    $contents .= ‘


———————-
이 메일은 리플넷에서 제공하는 구글 SMTP를 이용한 시험 메일 발송입니다.
자세한 사항은 어바웃웹을 참고하세요.
http://blog.repl.net/web/
http://www.repl.net/smtp/
    ‘;
    require(“XPertMailer.php”);
    $mail = new XPertMailer(SMTP_RELAY_CLIENT, ‘66.249.93.109’, 1, true);
    $mail->auth($sender_email, $password, AUTH_LOGIN, SSL_TRUE, 465);
    //$mail->port(25);
    $mail->timeout(10);
    $mail->priority(P_HIGH);
    $mail->from($sender_email, $sender);
    $header[‘Reply-To’] = $sender_email;
    $header[‘X-Whatever’] = ‘description’;
    $mail->headers($header);
    $html = ‘<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
    <html>
    <body>
‘.nl2br($contents).’
    </body>
    </html>’;
    $text    =    $contents;
    $send = $mail->send($receiver, $subject, $text, $html, ‘UTF-8’);
    echo $send ? “Done.” : “Error.”;
    echo “<br>Server response: “.$mail->response;
    if($send==”Done.”) {
?>
<script>
alert(‘Success’);
document.location = ‘http://www.repl.net/smtp/’;
</script>
<?PHP
    exit;
    }
}
?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en” lang=”en”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
<title>구글의 SMTP 서버를 이용한 메일 발송</title>
<meta http-equiv=”Content-Style-Type” content=”text/css” />
<META NAME=”Author” CONTENT=”이삼구”>
<META NAME=”Keywords” CONTENT=”지메일 SMTP 메일발송”>
<META NAME=”Description” CONTENT=”구글의 지메일 SMTP를 이용한 메일발송 테스트 페이지입니다.”>
</head>
<body style=”margin: 0 0 0 0px”><script type=”text/javascript” src=”http://www.repl.net/js/repl_top.js”></script>

<div align=center>
<h1 style=”font-size: 40px; font-family: 돋움”>구글메일의 SMTP를 이용한 메일발송 <th>Beta!</th></h1>
아래의 정보를 정확히 넣고 발송 버튼을 눌러주세요.<br />
(보내는 메일은 실제 구글 메일이어야 합니다. 정확한 계정과 비밀번호를 넣으세요.)
<br /><br />
<form action=”” method=”POST”>
보내는 이름 : <input type=”text” name=”sender” value=”<?PHP echo @$_POST[‘sender’];?>” style=”width: 450px;”><br />
구글 이메일 : <input type=”text” name=”sender_email” value=”<?PHP echo @$_POST[‘sender_email’];?>” style=”width: 450px;”><br />
구글 계정 암호 : <input type=”password” name=”password” value=”<?PHP echo @$_POST[‘password’];?>” style=”width: 450px;”><br />
받는 이름 : <input type=”text” name=”receiver” value=”<?PHP echo @$_POST[‘receiver’];?>” style=”width: 450px;”><br />
받는 이메일 : <input type=”text” name=”receiver_email” value=”<?PHP echo @$_POST[‘receiver_email’];?>” style=”width: 450px;”><br />

제목 : <input type=”text” name=”subject” value=”<?PHP echo @$_POST[‘subject’];?>” style=”width: 450px;”><br />
내용 : <textarea name=”contents” style=”width: 450px; height: 200px”><?PHP echo @$_POST[‘contents’];?></textarea><br />
<input type=”submit” name=”submit” value=”발송”>
</form><br /><br />
Copyright © 2006 <a href=”http://www.repl.net/”>리플넷</a>
</div>
</body>
</html>

window 스스로 닫기

<html>
<body>
<script type=”text/javascript”>self.close();</script>
</body>
</html>

위와 같은 코드를 실행하면 IE에서는 종료 여부를 확인하는 창이 나타나고, FF에서는 “스크립트로 열린 창만 닫을 수 있습니다”라고 에러를 뱉어냅니다. Opera에서는 조용히 먹통이 되네요.

별로 필요할 것 같지는 않지만 자기 자신을 스스로 닫을 수 있는 스크립트를 만들어 봤습니다.

<html>
<head>
<script language=”JavaScript”>
<!–
function selfClose()
{
    if (/MSIE/.test(navigator.userAgent)) {
        window.opener = self;
        self.close();
    } else {
        window.name = ‘__t__’;
        var w = window.open(‘about:blank’);
        w.document.open();
        w.document.write(‘<html><body><script type=”text/javascript”>function _(){var w=window.open(“about:blank”,”‘+window.name+'”);w.close();self.close();}</’+’script></body></html>’);
        w.document.close();
        w._();
    }
}
//–>
</script>
</head>
<body>
<span onclick=”selfClose();” style=”cursor:pointer”>close</span>
</body>
</html>

원리를 말하자면.. IE에선 예전에 나왔던 버그? 를 이용해서 스스로를 opener 로 등록해서 닫는 방법을 사용했고, FF와 Opera에서는 새 창을 열고 거기서 또 새창을 열어서 현재의 창을 스크립트로 연 창으로 바꾸어 줍니다.

끝.

이미지를 지정된 비율로 자르기 (crop)

// 생성될 이미지의 가로 세로 비율
$B_width = 50;
$B_height = 100;

// 대상 이미지명
$srcimg = “tmp/nosundo.gif”;

// 생성 이미지명
$tgtimg = “tmp/cropimg.gif”;


$size = getimagesize($srcimg);
if($B_width * $size[1] < $B_height * $size[0])
{

    // 원본 이미지의 가로크기가 지정 비율보다 크다.
    $rs_img_width = round($size[1] * ($B_width / $B_height));
    $rs_img_height = $size[1];

    // 자를 시작 x,y좌표
    $sc_x = round(($size[0] – $rs_img_width) / 2);
    $sc_y = 0;


}
else
{
    // 원본 이미지의 세로크기가 지정 비율보다 크다.
    $rs_img_width  = $size[0];
    $rs_img_height = round($size[0] * ($B_height / $B_width));

    // 자를 시작 x,y좌표
    $sc_x = 0;
    $sc_y = round(($size[1] – $rs_img_height) / 2);
}

// copyresampled 값이 동일하다 why? 이미지의 확대 축소가 발생하지는 않기 때문이다.
$sc_img_width = $rs_img_width;
$sc_img_height = $rs_img_height;

$rs_x =0;
$rs_y =0;

$sc_img = imagecreatefromgif($srcimg);
$rs_img = imagecreatetruecolor($rs_img_width, $rs_img_height);
imagecopyresampled($rs_img, $sc_img, $rs_x, $rs_y, $sc_x, $sc_y, $rs_img_width, $rs_img_height, $sc_img_width, $sc_img_height);
imagegif($rs_img, $tgtimg, 100);
imagedestroy($sc_img);

JavaScript로 만든 달력(popup 객체사용)

/* @charset=euc-kr */
/******************************************************************************
* Description :
* input=text object에 대한 Data Picker Script
* HTC로 개발하였으나, 잦은 IE 충돌로 인하여 변형함.
* IE 5.5 이상에서 테스트
* 사용법 : <input type=”text” name=”textbox” value=”2006-01-01″ isEmpty=”true”  empty=”날짜없음”
* arrowImage=”/images/ico_dtp_def.gif” prevImage=”/images/ico_arrow_left_gray.gif” nextImage=”/images/ico_arrow_right_gray.gif”>
* 해결 문제 : 해당객체의 disabled = true일때 이벤트 훅킹이 어려움, 이벤트에 따른 색상 교체 소스 최적화 -_-;;
* ** 
* Last update : 2006.
* Copyright (c) 2006, By Lee N.THU
* e-Mail : <support@x-wiz.com>
* – 사람이면 맘대로 쓸 수 있는 데, 단 제작자 표기는 해주삼.
* PS : 달력 선택 시 SELECT BOX 또는 팝업창 형태인것이 불편해 4시간 동안 고민해서 제작 -.-, 년도 선택부분 시간관계상 생략
******************************************************************************/
var xwzDatePicker = function(objTextbox){
    if(window.__xwzDatePickers == null) window.__xwzDatePickers = new Array(0);
    this.index = window.__xwzDatePickers.length;
    window.__xwzDatePickers[this.index] = this;

    this.oText = objTextbox;
    this.dtCurrent = null;//입력된 날짜
    this.dtDisplay = new Date();//출력용 날짜
    this.objField =null;// 디스플레이 테이블
    this.objLabel = null;// 날짜 출력될 셀
    this.objArrow = null;// 화살표 셀
    this.imgArrow = null;// 화살표 이미지
    this.objSelectBox = null;// focus에 대한 효과를 주기 위한 SELECT BOX -> 레이어보다는 상위 객체이므로
    this.isEmpty = false;// 날짜 없음 을 출력할지 여부
    this.emptyValue = “”;// 날짜 없음 표기 값
    this.isVisible = false;// 팝업창 보임 여부
    this.isActive = false;// 활성화되었는지 여부
    this.Images = {arrow : “”, prev : “”, next : “”};//디스플레이에서 화살표 이미지,  달력에서 이전, 다음 이미지
    this.Week = new Array(0);// 주 표기 텍스트 배열
    this.Formula = new Array(0);//날짜 포멧 형태
    this.WeekColor = [‘#CC0000′, ”, ”, ”, ”, ”,’#0066CC’];//일별 색상
    this.Styles = {def:new Array(0), hov:new Array(0), act:new Array(0), flt:new Array(0)}// 기본, 마우스 오버, 활성화 되었을 때 색상 설정, 활성화, 오버 되었을 때 오른쪽 화살표 필터효과 색상

    this.objWindow = null;//팝업창 객체
    this.lblCaption = null;// 달력에서 월, 년 표기 레이어
    this.lblEmpty = null;// 달력에서 날짜 없음 출력 객체
    this.cellCalendar = null;//달력의 각 셀을 배열로 저장

    this.setLanguage(“ko”);//기본 날짜 출력 포멧을 한글
    //기본 색상 설정
    this.setStyleColor(“default:#ABC1DE,#EAF2FB,#740048;Hover:#ABC1DE,#FFFFFF,#740048;Active:#ABC1DE,#AEC4E8,#500040;filter:#E0D4B2,#FFD456,#E0D4B2,#FFD456”);

    this.Initializ();//초기화
    this.oText.DatePick = this;//대상 텍스트 박스의 객체 속성으로 현재 function으로 지정
    //텍스트 박스의 프로퍼티가 변경될 때 분기함수
    this.oText.onpropertychange=function(){if(window.event.type == “propertychange” && this.DatePick !=null) this.DatePick.__setPropertyAttribute(window.event.propertyName);}
}
xwzDatePicker.prototype.Version            = ‘1.0.1’ ;
/*=========================================================
날짜없음 출력여부 및 날짜없음 표시 문자 설정
=========================================================*/
xwzDatePicker.prototype.letDisplayEmpty = function(bool){this.isEmpty=eval(bool);if(this.lblEmpty!=null) this.lblEmpty.style.display = this.isEmpty ? ” : ‘none’; }
xwzDatePicker.prototype.letEmptyValue = function(str){this.emptyValue=str;}
/*=========================================================
이미지 셋팅
=========================================================*/
xwzDatePicker.prototype.setArrowImageValue = function(str){this.Images.arrow = str;}
xwzDatePicker.prototype.setPrevImageValue = function(str){this.Images.prev = str;}
xwzDatePicker.prototype.setNextImageValue = function(str){this.Images.next = str;}
xwzDatePicker.prototype.letDisabled = function(bool){
    if(bool == true){
        this.objLabel.style.color=”#666666″;
        this.objLabel.style.filter=”gray()”;
        this.objArrow.style.filter=”gray()”;
    }else{
        this.objLabel.style.color=””;
        this.objLabel.style.filter=””;
        this.objArrow.style.filter=””;
    }
}
/*=========================================================
주 표시 단위
=========================================================*/
xwzDatePicker.prototype.setLanguage = function(str){
    var WeekText = {“ch”: [‘日’,’月’,’火’,’水’,’木’,’金’,’土’],”ko” : [‘일’,’월’,’화’,’수’,’목’,’금’,’토’],”en” : [‘Sun’,’Mon’,’Tue’,’Wed’,’Thu’,’Fri’,’Sat’]};
    var DateText = {“ch”: [‘月 ‘,’日’,’年 ‘],”ko” : [‘월 ‘,’일’, ‘년 ‘],”en” : [‘-‘, ”, ‘-‘]};
    if(WeekText[str] != null) this.Weeks = WeekText[str];else this.Weeks = WeekText[“ko”];
    if(DateText[str] != null) this.Formula = DateText[str];else this.Formula = DateText[“ko”];
}

/*=========================================================
마우스 오버등의 이벤트에 따른 색상 설정 함수
=========================================================*/
xwzDatePicker.prototype.setStyleColor = function(str){
    var Composition = new Array(0), Rule = new Array(0), sSelector = “”, Colors = new Array(0);
    Composition = str.replace(/s/gi, ”).toString().split(“;”)
    if(Composition.length == 0) return;
    for(var i = 0 ; i < Composition.length; i++){
        Composition[i] = Composition[i].replace(/s/gi, ”);//무효문자 제거
        if(Composition[i] == ”) continue;sSelector = Composition[i].split(‘:’).shift();Colors = Composition[i].split(‘:’).pop().toString().split(‘,’);
        if(sSelector.toLowerCase() == ‘default’){for(var n = 0; n < Colors.length;n++) this.Styles.def[n] = Colors[n];}
        else if(sSelector.toLowerCase() == ‘hover’){for(var n = 0; n < Colors.length;n++) this.Styles.hov[n] = Colors[n];}
        else if(sSelector.toLowerCase() == ‘active’){for(var n = 0; n < Colors.length;n++) this.Styles.act[n] = Colors[n];}
        else if(sSelector.toLowerCase() == ‘filter’){for(var n = 0; n < Colors.length;n++) this.Styles.flt[n] = Colors[n];}
    }
}

/*=========================================================
값 변경에 따른 셋팅
=========================================================*/
xwzDatePicker.prototype.changeValue = function(sValue){
    if( (/^([0-9]){4}-([0-9]){2}-([0-9]){2}/).test(sValue) == true){
        this.dtCurrent = new Date(sValue.substr(0,4), sValue.substr(5,2)-1, sValue.substr(8,2));
        this.dtDisplay=this.dtCurrent;
        this.setDateValue(this.dtCurrent.getDate());
        this.display();//==재출력 시 자세히 보면 느려짐 re-drow 때문인듯 싶음. 해결하기 귀찬음, 일반사용자들 모름
    }else{
        this.setEmptyValue();
    }
}
xwzDatePicker.prototype.setEmptyValue = function(){
    this.oText.onpropertychange=new Function(“return false”);
    this.oText.value = “”;
    this.objLabel.innerHTML = this.emptyValue;
    this.isVisible = true;
    this.swapVisible();
    this.oText.onpropertychange=function(){if(window.event.type==”propertychange”&&this.DatePick!=null) this.DatePick.__setPropertyAttribute(window.event.propertyName);}
}
/*=========================================================
선택된 날짜에 대한 출력
=========================================================*/
xwzDatePicker.prototype.setDateValue = function(day){

    this.oText.onpropertychange=new Function(“return false”);

    var year = this.dtDisplay.getYear(), month = this.dtDisplay.getMonth();
    this.dtCurrent = new Date(year, month, day);
    this.oText.value = year + “-” + this.__fillZero(month+1, 2) + “-” +  this.__fillZero(day, 2);
    this.objLabel.innerHTML = year + this.Formula[2] + this.__fillZero(month+1, 2) + this.Formula[0] +  this.__fillZero(day, 2) +this.Formula[1] ;
    this.isVisible = true;
    this.swapVisible();
    this.oText.onpropertychange=function(){if(window.event.type == “propertychange” && this.DatePick !=null) this.DatePick.__setPropertyAttribute(window.event.propertyName);}
}
/*=========================================================
프로퍼티 설정 — 속성값이 변경될때
=========================================================*/
xwzDatePicker.prototype.__setPropertyAttribute = function(sType){
    switch(sType.toString()){
        case “isEmpty” : this.letDisplayEmpty(this.oText.getAttribute(sType));break;
        case “empty” : this.letEmptyValue(this.oText.getAttribute(sType));break;
        case “value” : this.changeValue(this.oText.getAttribute(sType));break;
        case “arrowImage” : this.setArrowImageValue(this.oText.getAttribute(sType));break;
        case “prevImage” : this.setPrevImageValue(this.oText.getAttribute(sType));break;
        case “nextImage” : this.setNextImageValue(this.oText.getAttribute(sType));break;
        case “colorStyle” : this.setStyleColor(this.oText.getAttribute(sType));break;
        case “language” : this.setLanguage(this.oText.getAttribute(sType));break;
        case “disabled” : this.letDisabled(this.oText.disabled);break;
        default : break;
    }
}
xwzDatePicker.prototype.__isPopupView = function(){{if(this.objWindow == null) return false;return this.objWindow.isOpen;}}
xwzDatePicker.prototype.__fillZero = function(num, len){if(num.toString().length >= len) return num;var nMax = len-( num.toString().length );var str = “”;for(var i=0; i < nMax; i++) str +=”0″;return str + (num).toString();}
/*=========================================================
마우스 이벤트에 따른 효과 – 최적화 필요 -.-;; 귀찮아서 안하고 있음
=========================================================*/
xwzDatePicker.prototype.hoverIn = function(){
    if(this.isActive == false && this.oText.disabled == false){
        this.objField.style.border=this.Styles.hov[0] + ” 1px solid” ;
        this.objField.style.backgroundColor=this.Styles.hov[1] ;

        this.objLabel.style.border=this.Styles.hov[1] + ” 1px solid”;
        this.objLabel.style.backgroundColor=this.Styles.hov[1] ;
        this.objLabel.style.color=this.Styles.hov[2];

        this.objArrow.style.border=this.Styles.hov[0] + ” 1px solid”;
        this.objArrow.style.backgroundColor=this.Styles.hov[1] ;
        this.objArrow.style.color=this.Styles.hov[1];
        this.objArrow.style.filter=”progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorStr=”+this.Styles.flt[0]+”,endColorStr=”+this.Styles.flt[1]+”);”;
    }
}
xwzDatePicker.prototype.hoverOut = function(){
    if(this.isActive == false && this.oText.disabled == false){
        this.objField.style.border=this.Styles.def[0] + ” 1px solid” ;
        this.objField.style.backgroundColor=this.Styles.def[1] ;

        this.objLabel.style.border=this.Styles.def[1] + ” 1px solid”;
        this.objLabel.style.backgroundColor=this.Styles.def[1] ;
        this.objLabel.style.color=this.Styles.def[2];

        this.objArrow.style.border=this.Styles.def[1] + ” 1px solid”;
        this.objArrow.style.backgroundColor=this.Styles.def[1] ;
        this.objArrow.style.color=this.Styles.def[1];
        this.objArrow.style.filter=””;
    }
}

xwzDatePicker.prototype.deactive = function(){
    if(this.oText.disabled == false){
        this.isActive = false;
        this.objField.style.border=this.Styles.def[0] + ” 1px solid” ;
        this.objField.style.backgroundColor=this.Styles.def[1] ;

        this.objLabel.style.border=this.Styles.def[1] + ” 1px solid”;
        this.objLabel.style.backgroundColor=this.Styles.def[1] ;
        this.objLabel.style.color=this.Styles.def[2];

        this.objArrow.style.border=this.Styles.def[1] + ” 1px solid”;
        this.objArrow.style.backgroundColor=this.Styles.def[1] ;
        this.objArrow.style.color=this.Styles.def[1];
        this.objArrow.style.filter=””;
    }
}
xwzDatePicker.prototype.active = function(){
    if(this.oText.disabled == false){
        this.isActive = true;
        this.objField.style.border=this.Styles.act[0] + ” 1px solid” ;
        this.objField.style.backgroundColor=this.Styles.hov[1] ;

        this.objLabel.style.border=this.Styles.act[1] + ” 1px solid”;
        this.objLabel.style.backgroundColor=this.Styles.act[1] ;
        this.objLabel.style.color=this.Styles.act[2];

        this.objArrow.style.border=this.Styles.act[0] + ” 1px solid”;
        this.objArrow.style.backgroundColor=this.Styles.act[1] ;
        this.objArrow.style.color=this.Styles.act[1];
        this.objArrow.style.filter=”progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorStr=”+this.Styles.flt[2]+”,endColorStr=”+this.Styles.flt[3]+”);”;
    }
}
/* ================================================
팝업창 출력 결정
================================================ */
xwzDatePicker.prototype.swapVisible = function(){

    if(this.isVisible == false){
        if(this.oText.disabled == false && this.objWindow != null){
            var nHeight = 164;
            if(this.isEmpty == true) nHeight =183;
            var nDiff = window.screen.height – window.event.screenY – nHeight;posY = nDiff < nHeight ?  nHeight *-1 : this.objField.offsetHeight;
            this.objWindow.show(0, posY, 139, nHeight, this.objField);
            this.objWindow.document.getElementById(‘IDS_MONTH_LIST’).style.display = “none”;
            this.active();
            this.isVisible = true;
        }
    }else{
        this.deactive();
        if(this.__isPopupView()==true) this.objWindow.hide();
        this.objSelectBox.focus();
        this.isVisible = false;
        setTimeout(“window.__xwzDatePickers[” +this.index + “].display()”, 30);
    }
}
/* ================================================
초기화 함수
insertRow(index) <= 요게 편한데 -.- 파이어폭스에서도 지원
================================================ */
xwzDatePicker.prototype.Initializ = function(){
    var bwver = new Number(((window.navigator.appVersion.split(‘; ‘))[1].split(‘ ‘))[1]);
    if(window.navigator.appName != “Microsoft Internet Explorer” || bwver < 5.5) return;
    //== 기본변수대입
    var sValue=this.oText.getAttribute(“value”);
    if(sValue != “” && sValue != null) this.dtCurrent = new Date(sValue.substr(0,4), sValue.substr(5,2)-1, sValue.substr(8,2));
    if(isNaN(this.dtCurrent) || this.dtCurrent == null){this.oText.value=””;this.dtCurrent=new Date();}
    this.dtDisplay=this.dtCurrent;
    var attributes = [“isEmpty”,”empty”, “arrowImage”, “prevImage”,”nextImage”, “colorStyle”, “language”];
    for(var i = 0; i < attributes.length; i++){
        if(this.oText.getAttribute(attributes[i]) == null || this.oText.getAttribute(attributes[i]) ==”” ) continue;
        this.__setPropertyAttribute(attributes[i]);
    }

    var row = null;
    //=== 테이블 생성
    this.objField = document.createElement(“TABLE”);
    this.objField.setAttribute(‘cellPadding’, 1);
    this.objField.setAttribute(‘cellSpacing’, 1);
    this.objField.style.display=’inline’ ;
    this.objField.style.verticalAlign = “bottom”;
    this.objField.style.margin=”0 0 0 0″;
    this.objField.style.padding=”0 0 0 0″;
     this.objField.style.border=this.Styles.def[0] + ” 1px solid” ;
    this.objField.style.backgroundColor=this.Styles.def[1];

    this.objField.onmouseover=new Function(“window.__xwzDatePickers[” +this.index + “].hoverIn()”);
    this.objField.onmouseout=new Function(“window.__xwzDatePickers[” + this.index+ “].hoverOut()”);

    //=== Row 생성
    var tBody = document.createElement(“TBODY”);
    this.objField.appendChild(tBody);

    row = document.createElement(“TR”);
    row.style.cssText = “”;
    row.onmousedown=new Function(“window.__xwzDatePickers[” +this.index + “].swapVisible()”);

    //=== 디스플레이 cell 생성
    this.objLabel = document.createElement(“TD”);
    this.objLabel.onselectstart=new Function(“return false”);
    this.objLabel.setAttribute(“vAlign”, “absmiddle”);
    if(this.oText.value == “”){
        this.objLabel.setAttribute(“innerText”, this.emptyValue);
    }else{
        this.objLabel.innerHTML = this.dtDisplay.getYear() + this.Formula[2] + this.__fillZero(this.dtDisplay.getMonth()+1, 2) + this.Formula[0] +  this.__fillZero(this.dtDisplay.getDate(), 2) + this.Formula[1];
    }
    this.objLabel.style.cssText = “”;
    this.objLabel.style.width=116;
    this.objLabel.style.height=19;
    this.objLabel.style.font=”normal normal normal 8pt 돋음”;
    this.objLabel.style.cursor=”default”;
    this.objLabel.style.textAlign=”center”;
    this.objLabel.style.verticalAlign=”text-bottom”;
    this.objLabel.style.margin=”0 0 0 0″;
    this.objLabel.style.padding=”0 0 0 0″;

    this.objLabel.style.border=this.Styles.def[1] + ” 1px solid”;
    this.objLabel.style.backgroundColor=this.Styles.def[1] ;
    this.objLabel.style.color=this.Styles.def[2];
    row.appendChild(this.objLabel);

    //=== 화살표 생성
    this.imgArrow=document.createElement(“IMG”);
    this.imgArrow.src = this.Images.arrow;
    this.imgArrow.valign = “bottom”;
    this.imgArrow.style.cssText = “”;
    this.objSelectBox = document.createElement(“SELECT”);
    this.objSelectBox.style.cssText=”border:0;margin:0;padding:0;width:0;font: 1pt”;
    this.objSelectBox.onfocus=new Function(“window.__xwzDatePickers[” +this.index + “].active()”);
    this.objSelectBox.onblur=new Function(“window.__xwzDatePickers[” +this.index + “].deactive()”);

    this.objArrow= document.createElement(“TD”);
    this.objArrow.onselectstart=new Function(“return false”);
    this.objArrow.style.margin=”0 0 0 0″;
    this.objArrow.style.padding=”0 3 0 3″;
    this.objArrow.style.border=this.Styles.def[1] + ” 1px solid”;
    this.objArrow.style.backgroundColor=this.Styles.def[1] ;
    this.objArrow.style.color=this.Styles.def[1];
    this.objArrow.appendChild(this.imgArrow);
    this.objArrow.appendChild(this.objSelectBox);
    this.objSelectBox.options[0] = new Option(‘xwz’,’xwz’)
    row.appendChild(this.objArrow);
    tBody.appendChild(row);
    this.oText.insertAdjacentElement(“afterEnd”, this.objField);
    
    if(this.oText.disabled == true) this.__setPropertyAttribute(‘disabled’);

    this.oText.style.width=’0px’;this.oText.style.visibility=’hidden’;
    this.createWindow();
    this.InitializCalendar();
    this.

AJAX 컨트롤 많이 있겠지만, Form 메소드 형태로

/* @charset=euc-kr */
/******************************************************************************
* Description :
1. 기본 사용법
    var ajax = new Ajax();

    ajax.Method        = ‘POST’;
    ajax.Action        = ‘/path/페이지’;
    ajax.addParam(‘키’, ‘값’);
    ajax.onError = function(오류코드, 오류메세지){};
    ajax.onComplete = function(데이터){처리}
    ajax.submit();


2. 각 멤버 변수
 – XMlHttp : XMLHttpRequest 객체
 – Method : 전송방식[= ‘POST’, ‘GET’]
 – Action    : 서버 페이지 [ URL ]
 – Parameters : 전달 변수(배열) – 실제 직접 컨트롤할 작업이 없음
 – DataType : 데이터 수신 방식[=’Text’, ‘XML’]
 – Values      : 사용자 정의 변수 선언을 위한 변수
3. 각 함수
 – onLoad : 데이터 전송된 후 서버로 부터  데이터 전송이 완료되기 전까지 이벤트(함수객체)

  onLoad = 함수명
  function 함수명(){
      document.getElementById(‘msg’).innerHTML = “데이터 전송 중…”;
  }

 – onComplete : 데이터 전송이 완료되는 순간 이벤트 발생(함수객체)
 
    onComplete = 함수명
    fuction 함수(Text = [Text, XML]){
         document.getElementById(‘msg’).innerHTML = Text;
    }

 – onError : 오류가 발생했을 경우 처리하는 함수(함수객체
 
    onError = 함수명
    fuction 함수(errno = 숫자, error = 문자열){
        alert(errno + ” : ” + error)
    }

 – addParam : 파라미터 입력 함수
    addParam(‘name’, ‘ajax’)

 – submit() : 데이터 전송 함수
* 해결 문제 : 멀티 쓰레드 -.-;;;;
* ** 
* Last update : 2006. 5
* Copyright (c) 2006, By Lee N.THU
* e-Mail : <support@x-wiz.com>
*
******************************************************************************/
function xwzAjax(){
    window.xwzXmlHttp = this;
    this.XmlHttp        = null;
    this.Method        = ‘GET’;
    this.Parameters= new Array(0);
    this.Action        = window.location.href;
    this.DataType    = “Text”;

    this.onLoad                = null;
    this.onComplete        = null;
    this.onError                = null;

    this.addParam    = function(Name, Value){this.Parameters[Name] = Value;}
    this.getParam    = function(Name){return this.Parameters[Name];}
    this.addValue    = function(Name, Value){this.Values[Name] = Value;}
    this.getValue    = function(Name){return this.Values[Name];}
    this.getStatus = function(){
        var eventValue = this.XmlHttp.readyState;
        var Events = [‘Uninitialized’, ‘Loading’, ‘Loaded’, ‘Interactive’, ‘Complete’];
        return Events[eventValue];
    }
    
    this.submit = function(){
        if(this.XmlHttp != null) this.XmlHttp = null;

        if(window.ActiveXObject){
            try{this.XmlHttp = new ActiveXObject(“Msxml2.XMLHTTP”);}catch(e){try{this.XmlHttp = new ActiveXObject(“Microsoft.XMLHTTP”);}catch(e){}    }
        }else if(window.XMLHttpRequest){
            this.XmlHttp = new XMLHttpRequest();
        }

        if(this.XmlHttp == null){
            if(this.onError != null && typeof(this.onError) == “function”) this.onError(1, “Not install.”);
            return false;
        }
        var TYPE        = “text/xml”;
        var URI            = this.Action;
        var Entry = “”, QUERY_STRING    = “”;
        var QUERYS    = new Array(0);
        for(var Name in this.Parameters){Entry=Name+”=”+encodeURIComponent(this.Parameters[Name]);QUERYS.push(Entry);}
        QUERY_STRING = QUERYS.join(“&”);

        if(this.Method.toUpperCase() == ‘POST’){
            TYPE = “application/x-www-form-urlencoded”;
            this.XmlHttp.open(“POST”,URI, true);
        }else{
            if(URI.indexOf(“?”) === -1) URI += “?” + QUERY_STRING; else URI += “&” + QUERY_STRING;
            this.XmlHttp.open(“GET”,URI, true);
            QUERY_STRING = “”;
        }

        this.XmlHttp.setRequestHeader(“Content-type”, TYPE);
        this.XmlHttp.setRequestHeader(“Cache-Control”, “no-cache”);
        this.XmlHttp.setRequestHeader(“Pragma”, “no-cache”);
        this.XmlHttp.send(QUERY_STRING);
        this.XmlHttp.onreadystatechange = function(){
            var oXmlHttp = xwzXmlHttp.XmlHttp;
            if(oXmlHttp.readyState == 4){
                if(oXmlHttp.status == 200 && xwzXmlHttp.onComplete != null && typeof(xwzXmlHttp.onComplete) == “function”){
                    switch(xwzXmlHttp.DataType.toUpperCase()){
                        case “XML”:window.xwzXmlHttp.onComplete(oXmlHttp.responseXML);break;
                        default:window.xwzXmlHttp.onComplete(oXmlHttp.responseText);break;
                    }

                }else{
                    if(xwzXmlHttp.onError != null && typeof(xwzXmlHttp.onError) == “function”) xwzXmlHttp.onError(oXmlHttp.status, oXmlHttp.statusText);
                }
            }else if(xwzXmlHttp.onLoad != null && typeof(xwzXmlHttp.onLoad) == “function” ){
                xwzXmlHttp.onLoad(oXmlHttp.readyState);
            }
        }
    }

}

자연분만, 6주간의 생활 변화 가이드

▶ 출산 당일
자궁이 어른 머리 크기로 줄어든다. 배꼽 아래 3~5cm위치에 자리한다.
출산 3시간 후부터 붉은색 오로가 배출되기 시작한다. 혈액 섞인 점액질로 핏덩어리나 냄새 가 없는 게 특징. 만약 덩어리가 보이면 의사에게 말한다. 늘어났던 자궁이 수축하는 통증인 훗배앓이가 시작된다. 분만 직후 5~6kg정도 몸무게가 줄어든다. 손등이나 얼굴이 많이 붓는다. 체온이 떨어져 오한을 느끼기도 한다. 잠이 많이 온다. 회음 절개 부위가 아파 똑바로 앉기 어렵다. 통증을 참으며 오로 처리를 할 수 있다. 빠르면 신생아실 왕래도 가능하다.

▶ 2일 째
혈액이 섞인 붉은색 오로가 계속된다. 회음 절개 부분이 따끔거려 움직이기 어렵다. 통증을 참으며 신생아실이나 화장실에 갈 정도의 움직임이 가능하다. 소변과 땀의 양이 많아진다.
샤워를 할 수 없으므로 젖은 속옷을 자주 갈아입고 깨끗한 타월로 몸을 닦는다.
임신 중 눌린 방광 때문에 소변 보고 싶은 느낌이 약해지므로 급하지 않더라도 몇 시간마다 정기적으로 소변을 본다. 젖이 돌기 시작한다. 유방이 단단해지고 통증이 있다. 빠르면 노란 색 초유가 비친다. 유방 마사지를 하지 않으면 유선염으로 번지기 쉽다.
젖을 먹이면 자궁 수축이 빨라져 훗배앓이가 더 심해진다. 얼굴이나 손등의 부기가 조금씩 빠지기 시작한다.

▶ 3일 째
병원에서 퇴원해 집으로 돌아올 수 있다. 유방이 커지고 체온이 올라간다. 유방에 통증이 있 다. 훗배앓이가 어느 정도 가라앉는다. 자궁 내 점막이 새로 생기기 시작한다.
식욕이 왕성해지기 시작한다. 처음 걸을 때는 회음 봉합 부위가 약간 죄는 느낌이 있지만 시간이 지나면서 부드러워진다.

▶ 4일 째
오로의 양이 줄어들면서 붉은색에서 갈색으로 바뀐다. 약간 시큼한 냄새가 나는 게 특징. 오 로가 여전히 붉은색이거나 덩어리가 섞이면 전문의와 상담하는 게 바람직. 젖이 제법 잘 나 온다.
회음 절개 부위가 어느 정도 아물어 통증이 덜하다. 배변이 시작된다. 이때가 한참 지나도 배변이 없으면 의사와 상담해 관장이나 하제를 복용한다.

▶ 5일 째
피로가 풀리고 몸이 많이 좋아진다. 젖이 잘 나온다. 회음부 통증이 훨씬 줄어든다. 갈색 오 로가 계속 나온다. 오로의 양은 많이 줄어든다.

▶ 6일 째
자궁이 어른 주먹만한 크기로 줄어든다. 부기가 많이 가라앉는다. 노란 초유 대신 뽀얀 젖이 나온다. 소변량과 빈도가 평상시의 수준으로 줄어든다. 몸무게가 2~3kg정도 더 줄어든다. 회 음 절개 부위가 겉으로 보기에 거의 아문다.

▶ 7일 째
회음 절개 부위가 아물어 똑바로 앉을 수 있다. 부어 올랐던 질과 외음부가 많이 가라앉는 다. 갈색 오로가 여전히 나오지만 양은 현저히 줄어든다. 임신선이 옅어진다.

▶ 산후 2주 째
9일째 되는 날부터 오로가 갈색에서 황색으로 바뀐다. 약 2주일 정도 계속되며 짙은 황색이 나 크림색을 띠는 게 특징이다. 오로의 양이 줄어든다. 모유 분비량이 일정해진다. 자궁이 겉에서 만졌을 때 만져지지 않을 정도로 작아진다. 실제로는 달걀 크기로 작아져 골반 안으 로 들어간다. 책이나 신문 등을 보는 것에 쉽게 피로를 느낀다.

▶ 산후 3주 째
오로의 양이 많이 줄어들면서 황색 오로가 거의 없어진다. 산후 우울증의 정도가 덜해진다. 이후에도 계속 심하면 전문의의 상담을 받도록.

▶ 산후 4주 째
오로가 줄어들면서 황색에서 점액질의 백색으로 바뀐다. 냄새가 없고 양도 적은 편. 뽀얀 색깔의 성숙한 모유가 본격적으로 나온다. 자궁과 질 회음부 절개 부위가 거의 다 회 복해 정상으로 돌아온다. 병원에 가 산모와 아기의 건강 진단을 받는다.

▶ 산후 5주 째
오로가 거의 없어진다.

▶ 산후 6주 째
자궁 안이 거의 회복된다. 자궁이 원래의 위치로 돌아온다. 질벽은 아직 약해 상처가 나기 쉽다. 생리가 없어도 배란이 되는 경우가 있다. 산욕기 중 제대로 조리하면 임신 중 늘어났 던 몸무게가 정상으로 돌아올 수 있는 시기.
자궁과 질 회음부 절개 부위가 거의 다 회복해 정상으로 돌아온다. 병원에 가 산모와 아기 의 건강 진단을 받는다.

산후 다이어트, 무리 없이 시작하기

엄마들은 왜 살이 쉽게 안 빠질까? 하루종일 아이와 씨름하고 집안을 종종걸음치면서 돌아 다니는데 체중이 좀처럼 줄지 않는 이유가 참 궁금하다. 또 어떤 경우는 몸무게는 임신 전과 거의 비슷한데 옷이 맞지 않거나 예전의 몸매와는 너무 다른 자신을 발견하고 실망하기도 한다. 마지만 아직 시작도 해보지 않고 포기하기는 이르다. 왜 엄마가 된 후에는 살이 쉽게 빠지지 않는 걸까?

임신 때 식사량이 아직도 그대로!
입덧과 갑작스런 피로감으로 임신 3개월까지는 오히려 체중이 줄어들지만 임신 4개월이 되면서부터 식욕이 증가하고 먹는 음식의 양이 늘어난다. 물론 임신 중에 음식 섭취량이 늘어야 하는 것은 당연하지만 식사는 습관이기 때문에 출산 후에도 임신 때 먹던 양에 대한 습 관이 남아있어서 출산 후에도 먹는 양이 좀처럼 줄지 않기 때문에 체중이 줄어들지 않는 것이다. 그러므로 출산 후 산후조리가 완전히 끝나는 6주가 지난 다음부터는 의식적으로 식사량을 줄이면서 다이어트를 시작해도 된다. 이제 두 사람의 식사량에서 성인 여성 한사람의 식사량으로 하루에 200~300Kcal 정도를 줄여야 한다. 하지만 모유수유를 한다면 아직도 두 사람의 영양을 엄마의 식사에서 섭취해야 하므로 음식 섭취량이 여전할 수밖에 없다. 그러므로 모유수유를 하는 엄마는 수유를 완전히 마친 다음에 다이어트를 시작해야 한다.

몸무게는 줄어들어도 엉덩이, 허벅지, 뱃살은 그대로!
몸무게는 임신 전과 몇 킬로그램 차이가 나지 않는데 임신 전에 입던 옷이 들어갈 생각도 안하거나 도무지 옷맵시가 나지 않을 때는 부분 살빼기가 최고의 명약. 이럴 때는 전체적인 체중감량 다이어트보다 부분별 셰이프업 프로그램이 필요하다. 부분별로 셰이프업을 하다보면 체중도 조금 줄어들면서 몸에 탄력이 생겨 오히려 임신 전보다 탄력 있는 몸매와 옷맵시가 연출될 수 있다. 임신 중에는 안전한 아기집 만들기를 위해 생리적으로 엉덩이와 허벅지, 배에 지방층이 모이면서 부분별로 통통해지는 것이 정상이다. 하지만 임신으로 인해 자연스레 생긴 지방은 불행히 출산 후 자연히 사라져주지 않는다. 일부러 운동과 체조를 통해 부분 살빼기의 노력을 하지 않으면 예전의 몸매로 돌아오지 않는다.

이렇게 힘든데 살은 왜 안 빠질까?
하루 종일 아이와 씨름해보지 않은 사람은 절대 이해하지 못할 말. 더운 여름에는 땀을 한바가지씩 흘릴 정도로 고된 육아에 하루 종일 시달리는데도 살이 안 빠지는 것은 왜일까? 이유는 노동과 운동은 엄연히 다르기 때문이다. 예를 들어 아이를 들었다 내렸다 하면서 아이를 어르는 동작은 얼핏보면 팔운동과 비슷해 보인다. 하지만 아이를 들었다 내렸다 하는 동작은 팔 근육에 스트레스를 주기 때문에 지방을 분해하지 못하고 근육에 무리를 줘서 오히려 팔뚝을 두껍게 만드는 역효과를 낸다. 날씬한 엄마들도 팔뚝만은 오동통. ‘나는 아기 키우는 엄마예요’하고 표시 나는 이유가 바로 여기에 있다. 육아와 마찬가지로 가사노동도 운동일 수 없다. 쪼그리고 앉아서 하는 손빨래도 땀을 흘릴 정도로 힘들지만 지방을 분해하지 못하고 근육이나 뼈에 무리를 주기 때문에 육체적으로는 피곤하지만 군살이나 몸속 지방 을 없앨 수 없는 것이다.
그럼 이제부터 내게 꼭 맞는 가정식 다이어트의 방법을 찾아보자. 임신 전보다 오히려 더 날씬하게 그리고 건강하게 탄력 있는 몸매를 만드는 목표를 가지고…

무리한 다이어트 계획이 실패를 부른다
다이어트를 결심하는 엄마들은 한 달에 6∼7Kg 정도를 빼서 한 달만에 예전의 몸매로 돌아가기를 원하는 경우가 대부분이다. 하지만 오랫동안 조금씩 늘어난 체중은 한꺼번에 줄어 들지 않는다. 오랫동안 조금씩 늘어난 경우는 대부분 생활습관이 원인이기 때문이다. 이상적인 다이어트 계획은 한 달에 2Kg 정도가 적당하다. 한 달에 3Kg을 넘게되면 몸에 무리가 가고 호르몬의 균형이 깨져 빈혈이나 변비, 생리불순 등의 부작용이 나타나기 쉽다.
다이어트에 성공하려면 다이어트를 생활의 습관으로 만들어야 한다. 특히 출산 후 6개월 때의 몸매와 체중이 마흔까지 간다고 하니 지금 당장 체중을 줄이는 것보다 다이어트에 맞춘 바른 생활습관 들이기부터 시작해야 한다.
생활습관 들이기는 크게 두 가지. 식사 조절과 운동이다. 당장 오늘 하루 굶는 것은 쉽지만 한달 내내 세끼 식사를 모두 하면서 밥의 양을 1/4공기씩을 줄이는 것은 어려우므로 식사의 양을 갑자기 줄이는 식이요법은 좋지 않다.
우선 세끼 식사를 규칙적으로 한다. 다이어트의 기본 중의 기본 원칙이다. 특히 아침은 꼭 챙겨먹어야 하며 식전에 물을 충분히 마셔야 한다. 저녁식사는 7시 이전에 배가 부르지 않게 먹고 9시 이후에는 아무 것도 먹지 않는다. 활동량이 줄어들기 때문에 9시 이후에 먹은 음식은 곧바로 군살이 되기 때문이다. 다이어트 식단을 새로 짜느라 번거롭게 하지말고 우리나라 전통식단을 따라 식사를 하면 좋은 다이어트 식단이 된다.
또 식사는 천천히 하고 식사 외에 다른 일을 하면서 먹는 것은 삼간다. 튀김류, 초콜릿, 아이스크림 같은 간식은 삼가고 술을 마실 때는 안주는 조금만 먹는 것이 좋다.

운동도 꾸준히 할 수 있는 것으로 스스로 선택한다
유산소 운동 중에서 힘들이지 않고 쉽게 할 수 있는 것을 고른다. 에어로빅, 조깅, 배드민턴 등 운동을 한 가지 정하고 시간을 정해서 꾸준히 해야 한다. 운동시간만큼 아이에게서 해방 될 수 있고 자신만을 위해 시간을 투자한다는 것 자체만으로도 생활에 활력소가 된다. 엄 마들끼리 아이 보기 품앗이를 해서 자신의 운동시간만은 방해받지 않도록 하는 것이 좋다.
하지만 아이를 맡길 곳도 없고 경제적으로도 한 달에 몇 만원씩 하는 운동강습에 투자하기가 망설여진다면 스트레칭부터 시작한다. 사실 스트레칭은 자신도 모르는 사이에 이미 하고 있는 운동이다. 아침에 잠에서 깨어 하품하면서 기지개를 켜는 것, 몸이 찌뿌듯하면서 온몸을 쭉 펴는 행동이 모두 스트레칭이다. 간단한 체조도 제대로 하면 격렬한 운동만큼이나 열량을 소비할 수 있다. 체조는 특히 몸에 탄력을 주는 효과가 큰데 뉴스를 보면서 윗몸 일으키기를 하고 식사 후에 다리를 소파에 올려놓은 채 어깨를 바닥에서 15℃ 각도 정도 일으키 는 복부 체조를 하는 등 간단한 맨손체조를 생활하면 따로 시간을 내서 운동하지 않아도 탄탄한 몸매를 유지할 수 있다. 물론 여러번 반복하면서 체중감량의 효과까지 볼 수 있다.
그러나 강제성이 없어서 한두 번 따라하다가 쉽게 포기한 경험이 있다면 비디오를 이용하는 것도 좋다. 비디오를 틀어놓고 그대로 따라하기만 하면 땀이 온몸을 흠뻑 적신다. 하루에 한 번씩 하면 한 달에 최고 3Kg까지 감량효과를 볼 수 있는 내용으로 구성된 비디오가 대부분 이다.
또 혼자서 다이어트 계획을 매번 세우지만 계속 실패하면서 요요 현상이 생겨 조금씩 체중이 더 불어나는 결과만 초래했던 경험이 있다면 비만 클리닉의 전문의와 상담해 내게 꼭 맞는 다이어트 프로그램을 처방 받는 것도 좋다.
다시 한번 강조하지만 출산 후 6개월의 몸무게가 40세까지 간다는 사실을 잊지 말자. 다이어트에도 늦었다고 생각하는 때가 바로 시작할 시기라는 점과함께.