var Blogdoc = Fsz.Class({
    nate_cmn:null,   
    confirmMessage : {
        post:   '선택한 글을 목록에서 삭제하시겠습니까?',
        like:   '선택한 글을 좋아! 목록에서 삭제하시겠습니까?',
        friend: '선택한 친구를 목록에서 삭제하시겠습니까?',
        filter: '선택한 회원을 차단 해제하시겠습니까?',
        fan:    '선택한 회원을 친구로 추가하시겠습니까?'
    },
    noSelectMessage : {
        post:   '삭제할 글을 선택해 주세요!',
        like:   '삭제할 좋아! 글을 선택해 주세요!',
        friend: '삭제할 친구를 선택해 주세요!',
        filter: '차단해제할 회원을 선택해 주세요!',
        fan:    '추가할 회원을 선택해 주세요!'
    },
    initialize: function(action) {
        this.commentAction  = action;
    },

    checkOne: function() {
        var allCheckBtn = Fsz.$('allcheck');
        if(allCheckBtn.checked) {
            allCheckBtn.checked = false;
        }
    },

    checkedAll: function(form, obj, formtype) {
        var input = Fsz.$$('#' + form + ' input[type=' + formtype + ']');
        var checked = obj.checked;
        input.each(function(e) {
            if (e.disabled == false) e.checked = checked;
        });
    },

    checkedCnt: function(form, formtype) {
        var cnt = 0;
        var input = Fsz.$$('#' + form + ' input[type=' + formtype + ']');
        input.each(function(e) {
            if (e.checked == true) {
                cnt++;
            } 
        });
        return cnt;
    }, 

    removePost: function(post_seq, page) {
        if (confirm(this.confirmMessage.post)) {
            var AJAXOption = {
                parameters: {
                    'post_seq'  : post_seq,
                    'page'      : isNaN(page) || parseInt(page) < 1 ? 1 : page
                },
                method:'POST',
                asynchronous: true,
                onComplete:this.removePostHandler.bind(this)
            };
            new Fsz.Ajax.Request('/user/removePost', AJAXOption);
        }
    },

    removeLike: function(post_seq, page) {
        if (confirm(this.confirmMessage.like)) {
            var AJAXOption = {
                parameters: {
                    'post_seq'  : post_seq,
                    'page'      : isNaN(page) || parseInt(page) < 1 ? 1 : page
                },
                method:'POST',
                asynchronous: true,
                onComplete:this.removeLikeHandler.bind(this)
            };
            new Fsz.Ajax.Request('/user/removeLike', AJAXOption);
        }
    },

    listFriends : function(page, fr_list_cmn) {
        var url = '/user/retrieveMyFriend';
        var AJAXOption = {
            parameters: {page: page, fr_list_cmn: fr_list_cmn},
            method:'POST',
            asynchronous: true
        };      
        new Fsz.Ajax.Update(Fsz.$('side_my_friend'), url, AJAXOption);
    },

    registerFriends: function(loginstatus, fr_list_cmn) {
        if (loginstatus == 0) {
            openLogin();
            return false;
        }

        var parameters = {
            fr_list_cmn: fr_list_cmn
        }
        var AJAXOption = {
            parameters: parameters,
            method:'POST',
            asynchronous: true,
            onComplete: function(response) {
                result = Fsz.json.decode(response);
                if (result.status == true) {
                    if (Fsz.$('id_btn_add_friend')) {
                        Fsz.$('id_btn_add_friend').hide();
                        Fsz.$('id_msg_add_friend').update('(내친구로 추가 되었습니다)');
                    }
                    this.listFriends(1, fr_list_cmn);
                }
                if(result.message == 'notlogin') {
                    openLogin();
                }
                else {
                    alert(result.message);
                }
            }.bind(this)
        };      
        new Fsz.Ajax.Request('/user/registerFriends', AJAXOption);
    },

    deleteFriends: function(fr_list_cmn, page) {
        if (confirm(this.confirmMessage.friend)) {
            var AJAXOption = {
                parameters: {
                    'fr_list_cmn'   : fr_list_cmn,
                    'page'          : isNaN(page) || parseInt(page) < 1 ? 1 : page
                },
                method:'POST',
                asynchronous: true,
                onComplete:this.removeFriendHandler.bind(this)
            };
            new Fsz.Ajax.Request('/user/removeFriends', AJAXOption);
        }
    },

    addFriends: function(fr_list_cmn, page) {
        if (confirm(this.confirmMessage.fan)) {
            var AJAXOption = {
                parameters: {
                    'fr_list_cmn'   : fr_list_cmn,
                    'page'          : isNaN(page) || parseInt(page) < 1 ? 1 : page
                },
                method: 'POST',
                asynchronous: true,
                onComplete: this.registerFriendHandler.bind(this)
            };
            new Fsz.Ajax.Request('/user/registerFriends', AJAXOption);
        }
    },

    registerFilter: function(loginstatus,filter_cmn) {
        if(loginstatus == 0) {
            openLogin();
            return false;
        }
        
        if (confirm('선택한 회원의 글이나 리플을 검색결과와\n내 키워드 글 목록에서 보지 않겠습니까?')) {
            var AJAXOption = {
                parameters: {f_list_cmn : filter_cmn},
                method:'POST',
                asynchronous: true,
                onComplete: function(response) {
                    result = Fsz.json.decode(response);
                    alert(result.message);
                }
            };      
            new Fsz.Ajax.Request('/user/registerFilter', AJAXOption);
        }
    },

    deleteFilter: function(f_list_cmn, page) {
        if (confirm(this.confirmMessage.filter)) {
            var AJAXOption = {
                parameters: {
                    'f_list_cmn'    : f_list_cmn,
                    'page'          : isNaN(page) || parseInt(page) < 1 ? 1 : page
                },
                method:'POST',
                asynchronous: true,
                onComplete:this.removeFilterHandler.bind(this)
            };
            new Fsz.Ajax.Request('/user/removeFilter', AJAXOption);
        }
    },

    deleteAll: function(form, action, page) {
        var addCheckValue = function(elements) {
            var arr = new Array();
            for (var i=0; i<elements.length; i++) {
                if (elements[i].tagName.toUpperCase() == 'INPUT' 
                        && elements[i].type.toUpperCase() == 'CHECKBOX'
                        && elements[i].checked == true) {
                    arr.push(elements[i].value);
                }
            }
            return arr;
        };
        var Data = {};

        if (action == 'user/filter') {
            Data = {
                message     : this.confirmMessage.filter,
                nonMessage  : this.noSelectMessage.filter,
                url         : '/user/removeFilter',
                parameters  : {
                    'f_list_cmn'    : addCheckValue(Fsz.$(form).elements),
                    'page'          : isNaN(page) || parseInt(page) < 1 ? 1 : page
                },
                handler     : this.removeFilterHandler
            };
        } else if (action == 'user/friend') {
            Data = {
                message     : this.confirmMessage.friend,
                nonMessage  : this.noSelectMessage.friend,
                url         : '/user/removeFriends',
                parameters  : {
                    'fr_list_cmn'   : addCheckValue(Fsz.$(form).elements),
                    'page'          : isNaN(page) || parseInt(page) < 1 ? 1 : page
                },
                handler     : this.removeFriendHandler
            };
        } else if (action == 'user/fan') {
            Data = {
                message     : this.confirmMessage.fan,
                nonMessage  : this.noSelectMessage.fan,
                url         : '/user/registerFriends',
                parameters  : {
                    'fr_list_cmn'   : addCheckValue(Fsz.$(form).elements),
                    'page'          : isNaN(page) || parseInt(page) < 1 ? 1 : page
                },
                handler     : this.registerFriendHandler
            };
        } else if (action == 'user/list') {
            Data = {
                message     : this.confirmMessage.post,
                nonMessage  : this.noSelectMessage.post,
                url         : '/user/removePost',
                parameters  : {
                    'post_seq'  : addCheckValue(Fsz.$(form).elements),
                    'page'      : isNaN(page) || parseInt(page) < 1 ? 1 : page
                },
                handler     : this.removePostHandler
            };
        } else if (action == 'user/star') {
            Data = {
                message     : this.confirmMessage.like,
                nonMessage  : this.noSelectMessage.like,
                url         : '/user/removeLike',
                parameters  : {
                    'post_seq'  : addCheckValue(Fsz.$(form).elements),
                    'page'      : isNaN(page) || parseInt(page) < 1 ? 1 : page
                },
                handler     : this.removePostHandler
            };
        }

        if (this.checkedCnt(form, 'checkbox') == 0) {
            alert(Data.nonMessage);
            return;
        }

        if (confirm(Data.message)) {
            var AJAXOption = {
                parameters: Data.parameters,
                method: 'POST',
                asynchronous: true,
                onComplete: Data.handler.bind(this)
            };
            new Fsz.Ajax.Request(Data.url, AJAXOption);
        }
    },

    removePostHandler: function(response) {
        var result = Fsz.json.decode(response);

        if (result.status == '1') {
            window.location.reload(true);
        } else {
            if (result.message) {
                alert(result.message);
            }
            else {
                alert('글 삭제에 실패했습니다.');
            }
        }
        return;
    },

    removeLikeHandler: function(response) {
        var result = Fsz.json.decode(response);

        if (result.status == '1') {
            window.location.reload(true);
        } else {
            if (result.message) {
                alert(result.message);
            }
            else {
                alert('좋아 삭제에 실패했습니다.');
            }
        }
        return;
    },

    removeFriendHandler: function(response) {
        var result = Fsz.json.decode(response);

        if (result.status == '1') {
            window.location.reload(true);
        } else {
            alert('친구 삭제에 실패했습니다.');
        }
    },
    
    registerFriendHandler: function(response) {
        var result = Fsz.json.decode(response);

        if (result.status == '1') {
            window.location.reload(true);
        } else {
            alert('친구 등록에 실패했습니다.');
        }
    },
    removeFilterHandler: function(response) {
        var result = Fsz.json.decode(response);

        if (result.status == '1') {
            window.location.reload(true);
        } else {
            alert('차단 해제에 실패했습니다.');
        }
    },

    showToolTip: function(seq, type) {
        if ( type != null && type == 'tb' ) {
            var tooltip_id = Fsz.$('tb_tooltip_' + seq);
            tooltip_id.show();
            tolltip_id.focus();
        }
        else {
            var tooltip_id = Fsz.$('reply_tooltip_' + seq);
            tooltip_id.show();
        }
    },
    openComment: function(post_seq, nate_cmn) {
        this.nate_cmn       = nate_cmn;
        var space           = Fsz.$('reply_' + post_seq); 
        var direction       = Fsz.$('comment_arrow_direction' + post_seq); 

        if (space.style.display == 'none') {
            direction.swapClassName('close', 'open');
            space.show();
            this.showComment(post_seq, 1);
        } else {
            direction.swapClassName('open', 'close');
            space.hide();
        }
    },
    toggleChildComment: function(comment_seq) {
        var childId = Fsz.$('child_comment_input' + comment_seq);
        var childTextAreaId = Fsz.$('child_comment_value' + comment_seq);
        childTextAreaId.value = '';
        childTextAreaId.style.height = '16px';
        childId.toggle();
    },
    showComment: function(post_seq, page) {
        var space   = Fsz.$('reply_' + post_seq); 
        var is_sync = Fsz.$('is_sync_' + post_seq).value;
        var parameters = {
            post_seq: post_seq,
            page: page,
            is_sync: is_sync,
            nate_cmn: this.nate_cmn,
            comment_type: this.commentAction
        };

        if (BlogdocUI.ReplyUI == 'undefined') {
            BlogdocUI.ReplyUI     = new blogdocUI.ReplyUI();
        }
        
        var AJAXOption = {
            parameters: parameters,
            method:'POST',
            asynchronous: true,
            onComplete: function(response) {
                BlogdocUI.ReplyUI.registTextboxAction({duration:0.2});
            }.bind(this)
        };      
        new Fsz.Ajax.Update(space, '/comment/list', AJAXOption);
    },
    checkAuth:function(isAuth) {
        if (isAuth == false) {
            var param = 'resrestrictedUserAuthRedirect.php';
            window.open("/restrictedUserAuth.php?succ_url="+param,"restrictedUserAuthPopup","width=450,height=625,status=0,toolbar=0");
            return false;
        }
    },
    registerComment:function(post_seq, p_comment_seq, isAuth, page) {
        if (this.checkAuth(isAuth) == false) {
            return false;
        }
        var org_post_seq = Fsz.$('org_post_seq' + post_seq).value; 
        var commentVal = '';
        var syncVal    = 0;

        if (p_comment_seq.match(/[0-9]/)) {
            // 자식댓글일 경우
            var child_comment   = Fsz.$('child_comment_value' + p_comment_seq).value;
            commentVal  = child_comment.trim();
            commentVal  = commentVal.replace(/\s\s+/g, ' ');
            syncVal    = Fsz.$('c_sync' + p_comment_seq);
        } else {
            var comment = Fsz.$('comment_value' + post_seq).value;
            commentVal  = comment.trim();
            commentVal  = commentVal.replace(/\s\s+/g, ' ');
            syncVal     = Fsz.$('p_sync' + post_seq);
        }
        var is_sync = syncVal.value;
        if (is_sync == 2 && syncVal.checked == false) {
            is_sync = 0;
        }

        if (commentVal.length == 0) {
            alert('리플 내용을 입력해주세요.');
            return;
        }
        if (commentVal.length > 200) {
            alert('리플은 200자까지 입력가능합니다.');
            return;
        }

        var parameters = {
            post_seq: post_seq,
            org_post_seq: org_post_seq,
            p_comment_seq: p_comment_seq,
            is_sync: is_sync,
            comment_type: this.commentAction,
            page : page,
            content: commentVal
        };
        var AJAXOption = {
            parameters: parameters,
            method:'POST',
            asynchronous: true,
            onComplete:this.requestCommentHandler.bind(this)
        };      
        new Fsz.Ajax.Request('/comment/register', AJAXOption);
    },
    removeComment: function(comment_seq) {
        var parameters = {
            comment_seq: comment_seq,
            comment_type: this.commentAction
        };
        var AJAXOption = {
            parameters: parameters,
            method: 'POST',
            asynchronous: true,
            onComplete:this.requestCommentHandler.bind(this)
        };      
        new Fsz.Ajax.Request('/comment/delete', AJAXOption);
    },
    requestCommentHandler: function(response) {
        result = Fsz.json.decode(response);
        if (result.status == true) {
            this.showComment(result.post_seq, result.page);
            if (Fsz.$('reply_cnt' + result.post_seq)) {
                this.commentCnt(result.post_seq, result.comment_type);
            }
        } else {
            alert('리플 등록에 실패했습니다. 다시 시도해주세요.');
        }
    },

    // 댓글 갯수 영역 change
    commentCnt: function(post_seq, comment_type) {
        var Data = {
            post_seq: post_seq,
            comment_type: comment_type,
            url : '/comment/count'
        };

        var parameters = {
            post_seq: Data.post_seq,
            comment_type: Data.comment_type
        };

        var AJAXOption = {
            parameters: parameters,
            method:'GET',
            asynchronous: true,
            onComplete:this.requestCountHandler.bind(this)
        };      
        new Fsz.Ajax.Request(Data.url, AJAXOption);
    },

    // 댓글 여부 화살표 icon change
    requestCountHandler: function(response) {
        result = Fsz.json.decode(response);
        var reply_cnt = parseInt(result.cnt);
        
        var space = Fsz.$('reply_cnt' + result.post_seq);
        var arrow = Fsz.$('comment_arrow' + result.post_seq);

        if (reply_cnt > 0) {
            space.update(result.cnt);
        } else {
            space.update('');
        }
        var arrow_class = arrow.getClassName();

        if (result.cnt.toNumber() > 0) {
            arrow_class.each(function(arr) {
                if (arr == 'null') {
                    arrow.removeClassName('null');
                }
            });
        } else {
            arrow.addClassName('null');
        }
    }
});

// comment effect module
blogdocUI.ReplyUI = Fsz.Class({
    textAreaList:[],
    animation:true,
    duration:0.5,

    noValueMessage:null,
    initialize:function() {
    },
    registTextboxAction:function(option) {
        option = option || {};
        this.duration = option.duration || 0.2; 
        this.textAreaList = Fsz.$$('#contents .bList textarea.comment_text');

        if (true == Fsz.datatype.isArray(this.textAreaList)) {
            this.noValueMessage = '';
            this.addEventHandlerToTextarea();
        }
    },
    addEventHandlerToTextarea: function() {
        for(var i = 0; i < this.textAreaList.length; i++) {
            Fsz.Event.observe(this.textAreaList[i], 'focus', this.onFocusHandler.bind(this));
            Fsz.Event.observe(this.textAreaList[i], 'blur',  this.onBlurHandler.bind(this));
            Fsz.Event.observe(this.textAreaList[i], 'keyup',  this.onKeyUpHandler.bind(this));
            this.textAreaList[i].doesModified = false;
            KeyObserve.attachCountValueHandler(this.textAreaList[i]); 
        }
    },
    onFocusHandler: function(e) {
        var target = Fsz.Event.element(e);
        if (target.doesModified == false) {
            target.value = '';
        } else {
            target.addClassName('write');
            var targetHeight = Math.max(50, target.scrollHeight);
            target.setStyle('height', targetHeight + 'px');
            return;
        }
        target.style.height = '16px';
        var targetHeight = Math.max(50, target.scrollHeight);
        var options = {
            time:this.duration,
            transition:'easeInOutExpo',
            suffix: {height:'px'},
            height:targetHeight,
            onComplete:function() {
            }
        }
        Fsz.Tweener.addTween(target.style, options);
        target.addClassName('write');
    },
    onBlurHandler: function(e) {
        var target = Fsz.Event.element(e);
        this.toolTipLayer(target);
        target.removeClassName('write');
        if (target.value.length < 1) {
            target.value = this.noValueMessage;
            target.style.height = '16px';
            //setTimeout(function() { target.style.height = '16px'; }, 200);
            target.doesModified = false;
        } else {
            target.doesModified = true;
        }
    },
    onKeyUpHandler: function(e) {
        var target = Fsz.Event.element(e);
        this.countValue(target);
        this.resizeTextarea(target);
    },
    resizeTextarea: function(element) {
        element.style.height = element.clientHeight - 18 + 'px';;
        element.style.height = Math.max(50, Math.max(element.scrollHeight, element.clientHeight)) + 'px';
    },
    countValue:function(element) {
        var indicator = '';
        element.nextElements().each(function(e) {
            if (e.className == 'limit') {
                indicator = e.firstChild;
            }
        }.bind(this));
        indicator.innerHTML = (element.value).toString().length;
    },
    toolTipLayer: function(element) {
        // tooltip 클릭시 체크해서 닫기
        var indicator = element.nextElement().nextElement().childElements()[1];
        if (indicator) {
            indicator.hide();
        }
    }
});

var openNateAlarm = function() {
    window.open('http://nateonalarm.nate.com/interface/check_connect.php?service_id=52', 'NateonAlarm', 'toolbar=no,status=no,menubar=no, scrollbars=no,resizable=no,width=430,height=480');
}

var Search = Fsz.Class({
    noValueMessage:'',
    initialize: function() {
    },
    onFocusHandler: function(e) {
        var target = Fsz.$(e.id);
        if (target.value == e.defaultValue) {
            target.value = '';
        }
        if (target.doesModified == false) {
            target.value = '';
        } else {
            target.addClassName('write');
            return;
        }
        target.addClassName('write');
    },
    onBlurHandler: function(e) {
        var target = Fsz.$(e.id);
        //target.removeClassName('write');
        if (target.value.length < 1) {
            target.value = this.noValueMessage;
            target.doesModified = false;
        } else {
            target.doesModified = true;
        }
    },
    show : function() {
        if (BlogdocUI.Layer == undefined) {
            BlogdocUI.Layer = new blogdocUI.Layer();
        }
        if (BlogdocUI.Layer.target != null && BlogdocUI.Layer.target.id != 'id_search_bloger') {
            BlogdocUI.Layer.hide();
        }
        var target = Fsz.$('search_keyword');
        target.removeClassName('write');

        var keyword = Fsz.$('keyword1');
        if (keyword) {
            keyword = keyword.value.trim();
            if (keyword.length > 0) {
                target.addClassName('write');
                target.value = Fsz.$('keyword1').value;
                this.searchBlog(1);
            }
        }
        BlogdocUI.Layer.setOption('id_search_bloger', {modal:true, opacity:70}); 
        BlogdocUI.Layer.showOnPosition(100); 
    },
    hide : function() {
        if (BlogdocUI.Layer == 'undefined') {
            BlogdocUI.Layer = new blogdocUI.Layer();
        }
        BlogdocUI.Layer.hide();
        Fsz.$('search_keyword').value = Fsz.$('search_keyword').defaultValue;
        Fsz.$('id_search_bloger_result').update(''); 
    },
    searchBlog : function(page) {
        var keyword = Fsz.$('search_keyword').value;
        keyword = keyword.trim();
        keyword = keyword.replace(/\s\s+/g, ' ');
        
        if (keyword == '' || keyword == Fsz.$('search_keyword').defaultValue) {
            alert('블로그 이름이나 닉네임을 입력해주세요.');
            Fsz.$('search_keyword').focus();
            return false;
        }

        // server에서 받을때 decode 처리를 해버리는 바람에 두번 encode처리
        keyword = encodeURIComponent(keyword);
        keyword = keyword.replace(/\./g, '%2E'); // .은 encodeURIComponent로 인코딩이 안되서 별도처리
        keyword = encodeURIComponent(keyword);

        var space   = Fsz.$('id_search_bloger_result'); 
        var AJAXOption = {
            parameters: null,
            method:'POST',
            asynchronous: true
        };      
        new Fsz.Ajax.Update(space, '/searchblog/' + keyword + '/' + page, AJAXOption);

        return false;
    }
});
