function hexToRgb(hex) { var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return result ? { r: parseInt(result[1], 16), g: parseInt(result[2], 16), b: parseInt(result[3], 16) } : null; } function isBrightColor(color){ color = hexToRgb(color); if ((color.r*0.299 + color.g*0.587 + color.b*0.114) > 186){ return true; } else{ return false; } } var messageTemplate = ''; var myGeneralID=null; var isChief = false; var sequence =null; var myNation = null; var lastMsg = null; function refreshMsg(){ var deferred = $.ajax({ url: 'json_result.php', type: 'post', dataType:'json', contentType: 'application/json', data: JSON.stringify({ sequence:sequence }) }); function registerSequence(obj){ if(!obj.result){ deferred.reject(); return; } sequence = obj.sequence; return obj; } function refineMessageObjs(obj){ var msgList = [obj.public, obj.private, obj.diplomacy, obj.national]; $.each(msgList, function(){ if(!this){ return true; } $.each(this, function(){ var msg = this; if(!msg.src.nation){ msg.src.nation = '재야'; msg.src.color = '#ffffff'; } if(!msg.dest.nation){ msg.dest.nation = '재야'; msg.dest.color = '#ffffff'; } msg.src.colorType = isBrightColor(msg.src.color)?'bright':'dark'; msg.dest.colorType = isBrightColor(msg.dest.color)?'bright':'dark'; }); }); return obj; } function printTemplate(obj){ var printList = [ [obj.public, $('#message_board .public_message'), 'public'], [obj.private, $('#message_board .private_message'), 'private'], [obj.diplomacy, $('#message_board .diplomacy_message'), 'diplomacy'], [obj.national, $('#message_board .national_message'), 'national'], ]; $.each(printList, function(){ var msgSource = this[0]; var $msgBoard = this[1]; var msgType = this[2]; if(!msgSource || $msgBoard.length == 0){ console.log('No Items', msgSource, $msgBoard); return true; } if(msgType == 'diplomacy'){ //외교는 항상 새로 그린다 $msgBoard.empty(); } //list의 맨 앞이 가장 최신 메시지임. var msgHtmls = msgSource.map(function(msg){ msg.msgType = msgType; var msgHtml = TemplateEngine(messageTemplate, msg); return msgHtml; }); var $items = $(msgHtmls.join('')); $msgBoard.prepend($items); }); } deferred .then(registerSequence) .then(refineMessageObjs) .then(printTemplate); } function refreshMailboxList(obj){ var $mailboxList = $('#mailbox_list'); $mailboxList.change(function(){ console.log($(this).val()); }) var oldSelected = $mailboxList.val(); $mailboxList.empty(); $.each(obj.nation, function(){ var nation = this; console.log(nation); var $optgroup = $(''.format(nation.nation)); $optgroup.css('background-color', nation.color); if(myNation.mailbox == nation.mailbox){ myNation.color = nation.color; } if(isBrightColor(nation.color)){ $optgroup.css('color', 'black'); } else{ $optgroup.css('color', 'white'); } $.each(nation.general, function(){ var generalID = this[0]; var generalName = this[1]; var isRuler = this.length>2; if(generalID == lastMsg.id){ lastMsg.name = generalName; } if(generalID == myGeneralID){ return true; } var textName = generalName; if(isRuler){ textName = '*{0}*'.format(textName); } var $item = $(''.format(generalID, textName)); $optgroup.append($item); }); $mailboxList.append($optgroup); }); var $favorite = $(''); //아국메시지, 전체메시지 var $ourCountry = $(''.format(myNation.mailbox)) .css({'background-color':myNation.color, 'color':isBrightColor(myNation.color)?'black':'white'}); var $toPublic = $(''); $favorite.append($ourCountry); $favorite.append($toPublic); //최근 대화상대 if(lastMsg.id){ var $last = $(''.format(lastMsg.id, lastMsg.name)); $favorite.append($last); } //TODO:운영자를 추가하는 코드도 넣을 것. $mailboxList.prepend($favorite); if(!oldSelected){ $mailboxList.val(myNation.mailbox); } else{ $mailboxList.val(oldSelected); } } function registerGlobal(basicInfo, senderList){ //$.ajax는 data, textStatus, jqXHR를 가진다 //when으로 묶었으므로 data를 풀어야함. basicInfo = basicInfo[0]; senderList = senderList[0]; myNation = { 'mailbox':basicInfo.myNationMailbox, 'color':'#000000', 'nation':'재야' }; lastMsg = { id : basicInfo.last }; myGeneralID = basicInfo.generalID; isChief = basicInfo.isChief; return senderList; } jQuery(function($){ //tmp_template.html은 추후 msg.js에 통합될 수 있음 var getTemplate = $.get('tmp_template.html',function(obj){ messageTemplate = obj; }); //basic_info.json은 세션값에 따라 동적으로 바뀌는 데이터임. var basicInfo = $.ajax({ url:'basic_info.json', type: 'post', dataType:'json', contentType: 'application/json', data: JSON.stringify({ }) }); //sender_list.json 은 서버측에선 캐시 가능한 데이터임. var senderList = $.ajax({ url: 'sender_list.json', type: 'post', dataType:'json', contentType: 'application/json', data: JSON.stringify({ }) }); $.when(basicInfo, senderList) .then(registerGlobal) .then(refreshMailboxList); $.when(basicInfo, getTemplate) .then(refreshMsg); });