﻿/*
ID: feedWriter.js
History
	0.1(2010-12-16) 파일생성 - maninblu
	2011-10-26 공통 JS로 분리 xsm 사용방식 적용

Description
	챗 쓰기 영역에 대한 레이어 및 메뉴 컨트롤
	
	interface
		$( {챗쓰기 영역} ).feedwriter( options );
	
	options
		
Dependency
	jquery.js(1.4.3)
	jquery.ui.js(1.8.5)


Comment
	public enum FeedTypeCode : byte
	{
		All = 0,
		Chat = 1,
		Photo = 2,
		Link = 3,		
		Movie = 4,
		Blog = 5,
		Comment = 11,
		ProfileName = 31,
		Achievement = 101,
		GameFeed = 102,

	}
*/
(function($) {

$.widget("ui.feedwriter", {
    options: {
        maxLength: 140
        , GameCode : 65536
        , methodPath : "/xsm/method/chatmethod.aspx?_vb="
        , onCreationSucceeded : function( results, context ){}
        , initMsg : ""
        , initWaterMarkMsg : ""
    }

	, feedTypeCode: 1
	, jsonData: ""
	, currentPos: 0// 현제 각 기능의 진행 단계 (일단은 링크만 ㅋㅋ)

	, $currentMenu: null

	, $textarea: null
	, $byteSec: null

	, $menu: null

	, $photoWrite: null
	, $photoView: null

	, $videoWrite: null
	, $videoView: null

	, $linkWrite: null
	, $linkView: null

	, $achievementsWrite: null
	, $achievementsWrite2: null
	, $achievementsView: null

	, $layerCall: null

	, popWindow: null

	, _create: function() {
	    var self = this, opts = self.options, $target = self.element;

	    self.$textarea = $("#d_chatEditor textarea");
	    self.$byteSec = $("#d_chatEditor .byte");
	    self.$menu = $(".chatAction", $target);
	    self.$menuItems = $("li", self.$menu);
	    self.$layers = $target.find(".photoWrite, .photoView, .videoWrite, .videoView, .linkWrite, .linkView, .achievementsWrite, .achievementsWrite2, .achievementsView, .layerCall, .layerTag");
	    self.$photoWrite = $(".photoWrite", $target);
	    self.$photoView = $(".photoView", $target);
	    self.$videoWrite = $(".videoWrite", $target);
	    self.$videoView = $(".videoView", $target);
	    self.$linkWrite = $(".linkWrite", $target);
	    self.$linkView = $(".linkView", $target);
	    self.$achievementsWrite = $(".achievementsWrite", $target);
	    self.$achievementsWrite2 = $(".achievementsWrite2", $target);
	    self.$achievementsView = $(".achievementsView", $target);
	    self.$layerCall = $("#d_layerCall");

	    $target.addClass("dev_feedwriter");
	    self.hideAll();

	    $("#d_chatEditor button").click(function(event) {
			if (!$.LoginUserInfo.IsLogin) {
                $.Login.confirmLogin();
                return false;
            }
	        self.createFeed();
	        return false;
	    });

	    $(document).bind("mousedown.feedwriter", function(event) {
	        var $eventTarget = $(event.target);
	       
	        if ( 
				($eventTarget.parents(".wrapper").length == 0)
				 &&  ($eventTarget.parents(".layerAlert").length == 0)
				 && ($(".d_WidgetGlobalLayer").length == 0) 
				 && ($("#divLayerCam").css("top") == "-5000px")
				) 
			{	            
	            if (self.$textarea.val().length > 0) {
	                $.confirm("작성 중인 내용이 있어요. <br/>그래도 취소 하시겠어요?", function() { self.hideAll(); ; });
	                return false;
	            }
	            if (self.jsonData.length <= 0 && (self.popWindow == null || self.popWindow.closed)) {
	                self.hideAll();
	            }
	        }
	    });

	    $("button.d_useFeedType", self.$menuItems).click(function() {
	        self.$menu.addClass( "chatActionCurrent" );	        
			$("button.d_useFeedType", self.$menuItems).removeClass("current");
			self.$layers.hide();			
	        self.currentPos = 1; // 메뉴가 클릭된 상태
	        self.$currentMenu = $(this).parent();
	        var currentMenu = self.$currentMenu.attr("class");
	        //$( ".chatAction", $target ).css( "height", "45px" );			
	        $(this).addClass("current");
	        var $curWrite = $("." + currentMenu + "Write", $target);
	        $curWrite.show();
	        $("textarea", $curWrite).watermark({
	            containerCss: {
	                opacity: "1.0"
	            }
	        });
	        
	        self.feedTypeCode = self.$currentMenu.tagdata().FeedTypeCode;

	        if (self.feedTypeCode == 101) {
	            $curWrite.ajaxNet(
					opts.methodPath + "GetCharacterList",
					{
					    "NexonSN": $.LoginUserInfo.NexonSN
					},
					function(results, context) {
					    $curWrite.find("ul").html(results);
					    if (results.trim().length <= 0) {
					        $curWrite.find("p.text").html("홈과 연결되는 게임의 업적만 붙일 수 있어요.<br/>홈 게임은 계속 늘어날 예정이에요");
					    } else {
					        $curWrite.find("li").each(function() {
					            var li = this;
					            $(li).click(function() {
					                var $achWrt2 = $("." + currentMenu + "Write2", $target);
					                var $pagerSec = $achWrt2.find(".pagerSec");

					                $pagerSec.pager({
					                    oldpage: 1,
					                    pagecut: 0,
					                    currentPageNo: 1,
					                    totalCount: 0,
					                    blockSize: 1,
					                    pageSize: 12,
					                    firstBtn: '',
					                    lastBtn: '',
					                    callback: function(pageNo) {
					                        self._getAchievementList(li);
					                    }
					                });

					                $achWrt2.find("p.text span").text(
										$(this).find("span").text()
									);
					                $curWrite.hide();
					                $achWrt2.show();
					                //$(".achievementsView" ).show();
					                self._getAchievementList(li);
					            }); // end of click
					        }); // end of each
					    }
					}
				);
	        }
	        return false;
	    });

	    //친구콜
	    $("#d_writeCall button").click(function() {
	        self.$layerCall.show();
	        self.$layerCall.find(".default p").show();
	        self.$layerCall.find(".resultSec").hide();
	        $("#d_layerCallInput").focus();
	        return false;
	    });

	    $("#d_layerCallBtn").click(function() {
	        var val = $("#d_layerCallInput").val();
	        if (val.length <= 0) {
	            $.alert("닉네임을 입력해주세요.");
	            return false;
	        }
	        self.appendUserTag($("#d_layerCallInput").val());
	        return false;
	    });

	    $("#d_layerCallInput").autocomplete({
	        url: opts.methodPath + "GetPingListAutoComplete",
	        valueName: "SearchWord"
			, delay: 300
			, success: function(results) {

			    if (results.length > 0) {
			        self.$layerCall.find(".resultSec").show();
			        self.$layerCall.find(".default p").hide();
			    } else {
			        self.$layerCall.find(".default p").show();
			        self.$layerCall.find(".resultSec").hide();
			    }

			    $("#d_layerCallList").empty();
			    for (var i = 0; i < results.length; i++) {
			        var nick = results[i].NickName,
					profileImg = results[i].ProfileImg;

			        $("#d_layerCallList").append('<li><a href="#"><span class="userImg"><img src="'
						+ profileImg + '" width="30" height="30" alt="'
						+ nick + '" /></span><span class="nickname">'
						+ nick + '</a></span></a></li>');
			        $("#d_layerCallList li").eq(i).bind("click", { nick: nick }, function(e) {
			            self.appendUserTag(e.data.nick);
			            return false;
			        });
			    }
			}
			, requestSkip: function() {
			    self.$layerCall.find(".default p").show();
			    self.$layerCall.find(".resultSec").hide();
			    $("#d_layerCallList").empty();
			}
	    });

	    //친구콜 end

	    $(".btClose", $target).click(function(event) {
	        if ($(this).hasClass("d_callClose")) {
	            //친구콜에 닫기 버튼
	            self.$layerCall.find(".resultSec").hide();
	            self.$layerCall.find(".default p").show();
	            self.$layerCall.hide();
	            $("#d_layerCallInput").val("");
	        } else {
	            $("button.d_useFeedType", self.$menuItems).removeClass("current");
	            var $eventTarget = $(event.target);
	            if (self.jsonData.length <= 0) {
	                $eventTarget.closest("div").hide();
	                self.$currentMenu.removeClass("current");
	                self.initMember();
	            } else {
	                $.confirm("취소 하시겠어요?", function() {
	                    $eventTarget.closest("div").hide();
	                    self.$currentMenu.removeClass("current");
	                    self.initMember();
	                });
	            }
	        }
	        return false;
	    });

	    //노트쓰기
	    $("#d_writeNote button").click(function() {
	        $.movePage( "http://www.nexon.com/profile/note.aspx?sn="+$.LoginUserInfo.NexonSN+"&mode=write" );
	        return false;
	    });

	    $(".btBack", self.$achievementsWrite2).click(function(event) {
	        self.$achievementsWrite2.hide();
	        self.$achievementsWrite.show();
	        return false;
	    });

	    $(".btBack", self.$achievementsView).click(function(event) {
	        self.$achievementsView.hide();
	        self.jsonData = "";
	        self.$achievementsWrite2.show();
	        return false;
	    });

	    $("button:eq(0)", self.$photoWrite).click(function() {
	        self.currentPos = 2;
	        self.popWindow = $.Photo.openPhotoUploader("$.ui.feedwriter.photoUploadCallback");
	        $.ui.feedwriter.Instance = self;
	        return false;
	    });

	    $("button:eq(1)", self.$photoWrite).click(function() {
	        self.currentPos = 2;
	        self.popWindow = $.Photo.openPhotoEditor("$.ui.feedwriter.photoUploadCallback");
	        $.ui.feedwriter.Instance = self;
	        return false;
	    });

	    $("button:eq(2)", self.$photoWrite).click(function() {
	        self.currentPos = 2;
	        self.popWindow = $.Photo.openPhotoCanvas("$.ui.feedwriter.photoUploadCallback");
	        $.ui.feedwriter.Instance = self;
	        return false;
	    });
	    //웹캠으로찍기
	    $("button:eq(3)", self.$photoWrite).click(function() {
	        self.currentPos = 2;
	        self.popWindow = $.PhotoCam.Open("$.ui.feedwriter.camPhotoUploadCallback");
	        $.ui.feedwriter.Instance = self;
	        return false;
	    });

	    $("button:eq(0)", self.$linkWrite).click(function() {
	        self.currentPos = 2;
	        var linkTxt = $("input:text", self.$linkWrite).val().trim();
	        if (!linkTxt.isValidURL()) {
	            $.alert("링크가 잘 못 되었습니다. <br/>확인 후 입력해 주세요.");
	            return false;
	        }
	        self.jsonData = linkTxt;


	        $("p.linkSec", self.$linkView).text(self.jsonData);
	        self.$layers.hide();
	        self.$linkView.show();
	        return false;
	    });


	    self.$textarea.click(function() {
	        self.closeLayerCall();
	    })

	    $("button:eq(0)", self.$videoWrite).click(function() {
	        self.currentPos = 2;
	        var txt = $("textarea", self.$videoWrite).val().trim();
	        self.jsonData = txt;

	        self.$videoWrite.ajaxNet(
				opts.methodPath + "ScrapVideo"
				, {
				    "source": self.jsonData
				}
				, function(results, context) {
				    var thumbOver = "http://s.nx.com/S2/p2/icon/ico_cate_video.png";
				    var thumbOverLink = "http://s.nx.com/S2/p2/icon/ico_cate_video2.png";
				    if (results[1].length > 0) {
				        if (results[0].length > 0)
				            self.$videoView.find(".d_videoThumb").show().attr("src", results[0]);
				        else
				            self.$videoView.find(".d_videoThumb").show().attr("src", "http://s.nx.com/S2/p2/global/img_video_none.gif");
				        self.$videoView.find(".d_videoThumbOver").attr("src", thumbOver);
				    } else {
				        self.$videoView.find(".d_videoThumb").hide();
				        self.$videoView.find(".d_videoThumbOver").attr("src", thumbOverLink);
				    }
				    self.$layers.hide();
				    self.$videoView.show();
				    self.jsonData = txt;
				}
			);
	        return false;
	    });

	    var $layerTag = $("#d_layerTag_writeSec");

	    $("#d_openTagLayer").click(function() {
	        $layerTag.show();
	        return false;
	    });

	    $layerTag.find(".btClose button:eq(0)").click(function() {
	        $layerTag.hide();
	        return false;
	    });

	    $("#d_layerTag_writeSec").find("li>button").each(function() {
	        var $tag = $(this);
	        $tag.click(function() {
	            var s = $tag.html();
	            self.$textarea.val(self.$textarea.val() + s + " ");
	            self.$textarea.putCursorAtEnd().watermark("option", "container").hide();
	            $layerTag.hide();
	            return false;
	        });
	    });
	    
	    $layerTag.find("p.allGame button").click(function(){	    
			if ($layerTag.find("div.gameList").is(":visible")){
				$layerTag.find("div.gameList").hide();				
			}else{
				$layerTag.find("div.gameList").show();
			}
			return false;
	    });

	    //self._processTextarea();
	    
	    self.$textarea.bind("focus", function() {	        
	        $("#d_chatEditor").addClass("current");
	        self.$menu.addClass("chatActionCurrent");
	        self._showMenu();
	    }).bind("keyup", function() {
			self.$byteSec.removeClass("byteMinus");
			self.$byteSec.text(opts.maxLength - $(this).val().length);
			if (self.$byteSec.text() < 0){
				self.$byteSec.addClass("byteMinus");
			}
	    }).bind("blur", function() {
	        var cnt = $(this).val().length;
	        self.$byteSec.text(opts.maxLength - cnt);
	    });
	}
        // 챗 초기값 입력시 처리
	, setInitText: function(msg) {
	    var self = this, opts = self.options, $target = self.element;

	    if (msg != null && msg.length > 0) {
	        self.$textarea.val(msg);
	        self.$textarea.putCursorAtEnd().watermark("option", "container").hide();
	        var cnt = msg.trim().length;
	        self.$byteSec.text(opts.maxLength - cnt);
	        self.$byteSec.removeClass("byteMinus");
	        if (self.$byteSec.text() < 0){
				self.$byteSec.addClass("byteMinus");
			}
	    }
	}
	, _init: function() {
	    var self = this, opts = self.options, $target = self.element;
	    self._processTextarea();
	    self.hideAll();	    
	}
	, destroy: function() {
	    var self = this, opts = self.options, $target = self.element;

	    $.Widget.prototype.destroy.apply(this, arguments);

	    $target.removeClass("dev_feedwriter");
	    $(document).unbind("mousedown.feedwriter");
	}
	, hideAll: function() {
	    var self = this, opts = self.options, $target = self.element;
	    self.$menuItems.find("button").removeClass("current");
	    self.$menu.removeClass( "chatActionCurrent" );
	    self.$layers.hide();
	    self.initMember();
	    self.initShortContents();
	}
	, _showMenu: function() {
	    var self = this, opts = self.options, $target = self.element;
	    self.$menu.show();
	}
	, _processTextarea: function() {
	    var self = this, opts = self.options, $target = self.element;
		
	    self.$textarea.watermark({
	        overlayCss: {
	            opacity: ""
	        }
	        ,
	        checkHidden: function() {
	            if (!$.LoginUserInfo.IsLogin) {
	                $.Login.confirmLogin();
	                return false;
	            }
	            
				self.$textarea.val( opts.initMsg ); 
				self.$textarea.putCursorAtEnd(); 
				self.$byteSec.text(opts.maxLength - opts.initMsg.length); 
				
	            return true;
	        }
	    });
	    
	    if( opts.initWaterMarkMsg.length > 0 ){
			self.$textarea.watermark("changeText", opts.initWaterMarkMsg);
	    }
	}
	, _getAchievementList: function(elem) {
	    var self = this, opts = self.options, $target = self.element;
	    var $row = $(elem).closest("li");
	    var $achWrt2 = $(".achievementsWrite2", $target);

	    var $pagerSec = $(".pagerSec", $achWrt2);
	    var curPageNo = $pagerSec.pager("option", "currentPageNo");
	    var $list = $("ul", $achWrt2);

	    $achWrt2.ajaxNet(
			opts.methodPath + "GetAchievementList",
			{
			    "NexonSN": $.LoginUserInfo.NexonSN
				, "GameCode": $row.tagdata().GameCode
				, "ServerCode": $row.tagdata().ServerCode
				, "CharacterSN": $row.tagdata().CharacterSN
				, "PageSize": $pagerSec.pager("option", "pageSize")
				, "PageNo": curPageNo
				, "PageNo_Old": $pagerSec.pager("option", "oldpage")
				, "AchievementSN_BlockStart_Old": $pagerSec.pager("option", "pagecut")
			},
			function(results, context) {
			    $list.html(results[0]);
			    $pagerSec.pager("update", results[1]);
			    $pagerSec.pager("option", "pagecut", results[2]);
			    $pagerSec.pager("option", "oldpage", curPageNo);

			    var $achView = $target.find(".achievementsView");
			    $list.find("li").click(function() {
			        if (!$.isEmptyObject($(this).tagdata())) {
			            $achWrt2.hide();
			            self._getGameCard(this, $achView);
			        } else {
			            return false;
			        }
			    });
			}
		);
	}
	, _getGameCard: function(elem, $view) {
	    var self = this, opts = self.options, $target = self.element;
	    var tagdata = $(elem).tagdata();
	    $.ajaxNet(
			opts.methodPath + "GetAchievementCard",
			{
			    "NexonSN": tagdata.NexonSN
				, "GameCode": tagdata.GameCode
				, "ServerCode": tagdata.ServerCode
				, "CharacterSN": tagdata.CharacterSN
				, "AchievementSN": tagdata.AchievementSN
			},
			function(results, context) {
			    $view.find("div.d_gamecard").html(results[0]);
			    self.jsonData = tagdata;
			    $view.show();
			}
		);
	}
	, getFeedTypeCode: function() {
	    var self = this, opts = self.options, $target = self.element;
	    return self.feedTypeCode;
	}
	, getJsonData: function() {
	    var self = this, opts = self.options, $target = self.element;
	    return self.jsonData;
	}
	, getShortContents: function() {
	    var self = this, opts = self.options, $target = self.element;
	    return self.$textarea.val();

	}
	, getCurrentPos: function() {
	    var self = this, opts = self.options, $target = self.element;
	    return self.currentPos;
	}

        /*
        @클릭시 챗 입력창에 유저 테그 덧 붙임.
        */
	, appendUserTag: function(nick) {
	    var self = this, opts = self.options, $target = self.element;
	    var userTag = "@" + nick + "@ ";
	    self.$textarea.val(self.$textarea.val() + userTag);
	    self.$textarea.putCursorAtEnd().watermark("option", "container").hide();
	}
	, initMember: function() {
	    var self = this, opts = self.options, $target = self.element;
	    self.jsonData = "";
	    self.feedTypeCode = 1;
	    self.$layers.hide();
	    //self.$textarea.val( "" );
	    self.$menuItems.find("button").removeClass("current");
	    $("input:text", self.$linkWrite).val("http://");
	    $("textarea", self.$videoWrite).val("");		
	}
	, initShortContents: function() {
	    var self = this, opts = self.options, $target = self.element;
	    self.$textarea.val("");
	    self.emptyCallText();
	    
	    self.$byteSec.removeClass("byteMinus");
	    var cnt = self.$textarea.val().length;		
		self.$byteSec.text(opts.maxLength - cnt);
	}

	, closeLayerCall: function() {
	    var self = this, opts = self.options, $target = self.element;
	    self.emptyCallText();
	    self.$layerCall.find(".resultSec").hide();
	    self.$layerCall.find(".default p").show();
	    self.$layerCall.hide();
	}
	, emptyCallText: function() {
	    $("#d_layerCallInput").val("");
	}
	
	, setGameCode: function(gameCode) {
		this.options.GameCode = gameCode;		
	}
	
	, createFeed: function() {
	    var self = this, opts = self.options, $target = self.element;
	    //var $chatWrite = $("#d_chatWrite");
	    var content = self.getShortContents(); //$( "#chatContent" ).val();
	    var feedType = self.getFeedTypeCode();
	    if (content.trim().length <= 0) {
	        $.alert("앗! 내용이 없어요.");
	        return false;
	    } else if (content.trim().length > 140) {
	        $.alert("아앗! 내용이 너무 길어요.<br/>140자 이내로 작성해 주세요.");
	        return false;
	    }

	    var methodName = "CreateFeed";
	    var params = {
	        "Content": content
			, "FeedType": feedType
			, "JsonData": self.getJsonData()
			, "GameCode": opts.GameCode
	    };

	    if (feedType == 2) {
	        if (params.JsonData.trim().length <= 0) {
	            $.alert("첨부된 이미지가 없어요. <br/> 이미지를 첨부하고 내용을 입력해 주세요.");
	            return false;
	        }
	    }

	    if (feedType == 3) {
	        if (self.getCurrentPos() == 1) {
	            $.alert(" 링크넣기 버튼을 클릭해주세요.");
	            return false;
	        } else if (!params.JsonData.trim().isValidURL()) {
	            $.alert("링크가 잘 못 되었습니다. <br/>확인 후 입력해 주세요.");
	            return false;
	        }
	    }

	    if (feedType == 4) {
	        if (params.JsonData.trim().length <= 0) {
	            $.alert("첨부된 동영상이 없어요. <br/> 동영상을 첨부하고 내용을 입력해 주세요.");
	            return false;
	        }
	    }

	    if (feedType == 101) {
	        var jsonObject = self.getJsonData();
	        if (jsonObject.length == 0 || $.isEmptyObject(jsonObject) || jsonObject.AchievementSN.length <= 0) {
	            $.alert("선택한 업적이 없어요. <br/> 업적을 선택하고 내용을 입력해 주세요.");
	            return false;
	        }
	        methodName = "CreateAchievmentFeed";

	        params = {
	            "Content": content
				, "FeedType": feedType
				, "NexonSN": jsonObject.NexonSN
				, "ServerCode": jsonObject.ServerCode
				, "GameCode": jsonObject.GameCode
				, "CharacterSN": jsonObject.CharacterSN
				, "AchievementSN": jsonObject.AchievementSN
	        };
	    }

	    $("#d_chatWrite").ajaxNet(
			opts.methodPath + methodName
			, params
			, function(results, context) {
			    self.hideAll();
			    opts.onCreationSucceeded(results, context);
			    self.$textarea.trigger("blur");
			}
		);
	}
});


$.ui.feedwriter.photoUploadCallback = function(result) {
    $.ui.feedwriter.Instance.jsonData = result;
    var widget = $.ui.feedwriter.Instance;
    widget.$layers.hide();

    var photoURL = "http://photo.nexon.com/ShowPhotoThumbnail.nhs?Key=" + result;
    widget.$photoView.show().find(".photoSec>img").attr("src", photoURL);
}

$.ui.feedwriter.camPhotoUploadCallback = function(result) {
    $.ui.feedwriter.Instance.jsonData = result;
    var widget = $.ui.feedwriter.Instance;
    widget.$layers.hide();

    var photoURL = "http://photo.nexon.com/ShowPhotoThumbnail.nhs?Key=" + result;
    widget.$photoView.show().find(".photoSec>img").attr("src", photoURL);
}


})(jQuery);

