Revision: 363
Author: todd.chambery
Date: Thu Oct 15 19:00:34 2009
Log: large log entries (each entry stored in a separate cookie)
http://code.google.com/p/charactermanager/source/detail?r=363
Modified:
/trunk/charmgrjs/common.js
/trunk/charmgrjs/edit_weapons.js
/trunk/charmgrjs/main.js
/trunk/charmgrjs/resources/felonious.grendel
=======================================
--- /trunk/charmgrjs/common.js Wed Oct 14 14:50:27 2009
+++ /trunk/charmgrjs/common.js Thu Oct 15 19:00:34 2009
@@ -370,19 +370,11 @@
function lod() {
chardata = {};
- if (document.cookie.length > 0) {
- c_start = document.cookie.indexOf("chardata=");
- if (c_start != -1) {
- c_start = c_start + 9; // c_name.length + 1;
- c_end = document.cookie.indexOf(";", c_start);
- if (c_end == -1) {
- c_end = document.cookie.length;
- }
- cookie_data = document.cookie.substring(c_start, c_end);
- parse_character_data(cookie_data);
- }
- }
-
+ // TODO - refactor for scoping issues
+ var cookie_data = get_cookie_data("chardata");
+ if(cookie_data != null) {
+ parse_character_data(cookie_data);
+ }
return chardata;
}
@@ -396,6 +388,13 @@
}
function parse_character_data(data) {
+ // strip off the log entries
+ var log_entries = data.substring(data.indexOf('`') + 1);
+ log_entries = log_entries.split(',');
+ for(var i=0; i<log_entries.length; i++) {
+ sav("chardata_log_" + log_entries[i].id, log_entries[i]);
+ }
+ data = data.substring(data.indexOf('`'));
chardata = {};
chardata = TAFFY.JSON.parse(unescape(data));
if (chardata.skills != null) {
@@ -476,20 +475,41 @@
}
function export_character() {
+
+ var cookie_data = get_cookie_data("chardata");
+ if (cookie_data.length > 0) {
+ if(chardata.log.length > 0) {
+ // add log entries delimiter
+ cookie_data += "`";
+ }
+ for ( var i = 0; i < chardata.log.length; i++) {
+ cookie_data += get_cookie_data("chardata_log_" + chardata.log[i]) + (i
+ 1 < chardata.log.length ? "," : "");
+ }
+ alert("Copy the below string to save your character:\n" + cookie_data);
+
+ } else {
+ alert("No character data to export");
+ }
+}
+
+
+
+function get_cookie_data(cookie_name) {
+ var data = null;
if (document.cookie.length > 0) {
- c_start = document.cookie.indexOf("chardata=");
+ c_start = document.cookie.indexOf(cookie_name + "=");
if (c_start != -1) {
- c_start = c_start + 9; // c_name.length + 1;
+ c_start = c_start + cookie_name.length + 1; // c_name.length + 1
c_end = document.cookie.indexOf(";", c_start);
if (c_end == -1) {
c_end = document.cookie.length;
}
- cookie_data = document.cookie.substring(c_start, c_end);
- alert("Copy the below string to save your character:\n" + cookie_data);
- }
- } else {
- alert("No character data to export");
- }
+ data = document.cookie.substring(c_start, c_end);
+ }
+ }
+
+ return data;
+
}
/*function save(table, obj, key) {
=======================================
--- /trunk/charmgrjs/edit_weapons.js Wed Oct 14 14:50:27 2009
+++ /trunk/charmgrjs/edit_weapons.js Thu Oct 15 19:00:34 2009
@@ -84,7 +84,7 @@
for(var i in window[id_name + "_edit_data"]) {
var edit_attr_name = window[id_name + "_edit_data"][i];
var value = $("#" + id_name + "_" + item_index + edit_attr_name).val();
- if(value != null && value.length > 0) {
+ if(value != null && jQuery.trim(value).length > 0) {
chardata[data_name][item_index][edit_attr_name] = value;
} else {
delete chardata[data_name][item_index][edit_attr_name];
=======================================
--- /trunk/charmgrjs/main.js Wed Oct 14 19:26:16 2009
+++ /trunk/charmgrjs/main.js Thu Oct 15 19:00:34 2009
@@ -191,10 +191,11 @@
// TODO - populate with char overrides
// TODO - create links on Att/Dam/Crit to dialog with breakdown
calculations
weapon_html += "<tr><td>Att</td><td id='weapon_" + j + "_att'
class='box' width='50%'></td><td>Crit</td><td id='weapon_" + j + "_crit'
class='box' width='50%'></td></tr>";
- weapon_html += "<tr><td>Dam</td><td id='weapon_" + j + "_dam'
class='box' width='50%'></td><td></td><td></td></tr>";
- weapon_html += "<tr><td valign='top'>Note</td><td id='weapon_" + j
+ "_note' colspan='3' width='100%'></td></tr></table>";
+ weapon_html += "<tr><td>Dam</td><td id='weapon_" + j + "_dam'
class='box' width='50%'></td><td>Bon</td><td id='weapon_" + j + "_bon'
class='box'></td></tr>";
+ weapon_html += "<tr id='weapon_" + j + "_note'><td
valign='top'>Note</td><td id='weapon_" + j + "_note' colspan='3'
width='100%'></td></tr></table>";
}
$('#weaponspart').html(weapon_html);
+ $('#weaponspart').css('margin-top', '5px');
// $('#weaponspart').addClass('box');
// $('#weaponspart').css('border-color', '#D0D0D0');
@@ -205,14 +206,14 @@
id : chardata.armor[j]['armor_id']
});
armor_html += "<table width='100%' border='0' margin='0'><tr><td
id='armor_"
- + j + "_name' armor_id='" + chardata.armor[j]['armor_id'] + "'
colspan='2' bgcolor='#C5C6F6'></td></tr>";
+ + j + "_name' armor_id='" + chardata.armor[j]['armor_id'] + "'
colspan='4' bgcolor='#C5C6F6'></td></tr>";
// populate with char overrides
- armor_html += "<tr><td>Bon</td><td id='armor_" + j + "_bon' class='box'
width='100%'></td></tr>";
- armor_html += "<tr><td>ACP</td><td id='armor_" + j + "_acp' class='box'
width='100%'></td></tr>";
- armor_html += "<tr><td valign='top'>Note</td><td id='armor_" + j
+ "_note' width='100%'></td></tr></table>";
+ armor_html += "<tr><td>Bon</td><td id='armor_" + j + "_bon' class='box'
width='50%'></td><td>ACP</td><td id='armor_" + j + "_acp' class='box'
width='50%'></td></tr>";
+ armor_html += "<tr id='armor_" + j + "_note'><td
valign='top'>Note</td><td colspan='3' id='armor_" + j + "_note'
width='100%'></td></tr></table>";
}
$('#armorpart').html(armor_html);
+ $('#armorpart').css('margin-top', '5px');
// spells
// TODO - what's the modifier for SPD?
@@ -299,6 +300,7 @@
}
spells_html += "</tr></table>";
$('#spellspart').html(spells_html);
+ $('#spellspart').css('margin-top', '10px');
}
}
@@ -314,7 +316,7 @@
chardata.log.push(entry_id);
}
// edit entry
- sav({xp: $('#log_xp').text(), hp: $('#log_hp').text(), date:
$('#log_date').text(), note:
htmlize($('#log_note').val())}, 'chardata_log_' + entry_id);
+ sav({id: entry_id, xp: $('#log_xp').text(), hp: $('#log_hp').text(),
date: Date.parse($('#log_date').text()), note:
htmlize($('#log_note').val())}, 'chardata_log_' + entry_id);
$('#entry_id').val('');
$('#save_log').val('save');
@@ -341,11 +343,17 @@
// use the "live" hp value if it's populated
var log_hp = ($('#hp_input').val().length > 0 ? $('#hp_input').val() :
(chardata.hp == null ? 0 : chardata.hp));
content += "<div id='new_entry' style='height: 50%'><input
id='entry_id' type='hidden' value='' /><table style='width: 100%'>";
- content += "<tr><td id='log_date' style='font-size: xx-small'>" + (new
Date()).toDateString() + "</td><td id='log_hp' class='numeric'
style='font-size: xx-small'>" + log_hp + "</td><td id='log_xp'
class='numeric' style='font-size: xx-small'>" + (chardata.xp == null ? 0 :
chardata.xp) + "</td><td style='text-align: right;'><input id='save_log'
type='button' value='save' onclick='save_log(chardata)'/></td></tr>";
+ content += "<tr><td id='log_date' style='font-size: xx-small'
onclick=\"edit_log_metadata('log_date', $('#log_date').text())\">" + (new
Date()).toDateString() + "</td><td id='log_hp' class='numeric'
style='font-size: xx-small' onclick=\"edit_log_metadata('log_hp',
$('#log_hp').text())\">" + log_hp + "</td><td id='log_xp' class='numeric'
style='font-size: xx-small' onclick=\"edit_log_metadata('log_xp',
$('#log_xp').text())\">" + (chardata.xp == null ? 0 : chardata.xp)
+ "</td><td style='text-align: right;'><input id='save_log' type='button'
value='save' onclick='save_log(chardata)'/></td></tr>";
content += "<tr><td colspan=4><textarea id='log_note' style='width:
100%'/></td></tr></table>";
show_dialog(title, content);
return false;
}
+
+function edit_log_metadata(element_id, string) {
+ $('#' + element_id).html("<input id='temp' type='text' value='" + string
+ "'");
+ $('#temp').bind('blur', function(){ $('#' +
element_id).text($('#temp').val()); });
+ $('#temp').focus();
+}
function populate_log_history(chardata) {
var history = "<table style='width: 100%'>";
@@ -372,7 +380,13 @@
});
for(var i=0; i<entries.length; i++) {
- history += "<tr style='background-color: #EFF1F1; border: 1px
solid #EFF1F1;'><td style='font-size: xx-small'>" + entries[i].date
+ "</td><td class='numeric' style='font-size: xx-small'>" + entries[i].hp
+ "</td><td class='numeric' style='font-size: xx-small'>" + entries[i].xp
+ "</td><td style='text-align: right; font-size: xx-small''><a
class='fake_link' onclick=\"edit_log_entry(chardata, '" + entries[i].id
+ "')\")\">edit</a> <a class='fake_link'
onclick=\"delete_log_entry(chardata, '" + entries[i].id
+ "')\">delete</a></td></tr>";
+ var d = new Date();
+ d.setTime(entries[i].date);
+ history += "<tr style='background-color: #EFF1F1; border: 1px
solid #EFF1F1;'><td style='font-size: xx-small'>" + d.toDateString()
+ "</td>";
+ history += "<td class='numeric' style='font-size: xx-small'>" +
entries[i].hp + "</td>";
+ history += "<td class='numeric' style='font-size: xx-small'>" +
entries[i].xp + "</td>";
+ history += "<td style='text-align: right; font-size: xx-small''><a
class='fake_link' onclick=\"edit_log_entry(chardata, '" + entries[i].id
+ "')\")\">edit</a> ";
+ history += "<a class='fake_link'
onclick=\"delete_log_entry(chardata, '" + entries[i].id
+ "')\">delete</a></td></tr>";
history += "<tr><td colspan=4 style='border: 1px solid; padding:
5px;' >" + entries[i].note + "</td></tr>";
history += "<tr><td colspan=4 style='padding-bottom:
1em;'></td></tr>";
}
@@ -393,26 +407,21 @@
}
function edit_log_entry(chardata, entry) {
- var log = {};
- if (document.cookie.length > 0) {
- c_start = document.cookie.indexOf("chardata_log_" + entry + "=");
- if (c_start != -1) {
- c_start = c_start + 14 + entry.length; // c_name.length + 1
- c_end = document.cookie.indexOf(";", c_start);
- if (c_end == -1) {
- c_end = document.cookie.length;
- }
- log = TAFFY.JSON.parse(unescape(document.cookie.substring(c_start,
c_end)));
- }
- }
-
+ var log = get_log_entry(entry);
+
$('#entry_id').val(entry);
- $('#log_date').text(log.date);
+ var d = new Date();
+ d.setTime(log.date);
+ $('#log_date').text(d.toDateString());
$('#log_hp').text(log.hp);
$('#log_xp').text(log.xp);
$('#log_note').val(dehtmlize(log.note));
$('#save_log').val('update');
}
+
+function get_log_entry(entry_id) {
+ return TAFFY.JSON.parse(unescape(get_cookie_data("chardata_log_" +
entry_id)));
+}
function adjust_mod(type, magnitude) {
var curr_val = parseInt($('#' + type + '_mod').text());
@@ -453,7 +462,13 @@
});
$('#weapon_' + j + '_name').text(chardata.weapons[j].name != null ?
chardata.weapons[j].name + " (" +
weapon_data.name + ")" :
weapon_data.name);
$('#weapon_' + j + '_crit').text(calc_critical(weapon_data.crit,
chardata.weapons[j], chardata.feats));
- $('#weapon_' + j + '_note').text(chardata.weapons[j].note);
+ $('#weapon_' + j + '_bon').text(chardata.weapons[j].att != null ?
chardata.weapons[j].att : "");
+ $("td[id='weapon_" + j + "_note']").text(chardata.weapons[j].note);
+ if(chardata.weapons[j].note == null || chardata.weapons[j].note.length
== 0) {
+ $("tr[id='weapon_" + j + "_note']").hide();
+ } else {
+ $("tr[id='weapon_" + j + "_note']").show();
+ }
}
// armor
@@ -466,6 +481,11 @@
$('#armor_' + j + '_bon').text(armor_data.bon);
$('#armor_' + j + '_acp').text(armor_data.acp);
$('#armor_' + j + '_note').text(chardata.armor[j]['notes']);
+ if(chardata.armor[j].notes == null || chardata.armor[j].notes.length ==
0) {
+ $("tr[id='armor_" + j + "_note']").hide();
+ } else {
+ $("tr[id='armor_" + j + "_note']").show();
+ }
}
}
=======================================
--- /trunk/charmgrjs/resources/felonious.grendel Wed Oct 14 14:50:27 2009
+++ /trunk/charmgrjs/resources/felonious.grendel Thu Oct 15 19:00:34 2009
@@ -1,1 +1,1 @@
-{"name":"Felonious","xp":"30990","hp":"46","race_id":"4","class_id":"7","alignment_id":"0","goodness_id":"0","deity_id":"0","domain_id":"0","weapon_style":"archery","abilities":{"0":"16","1":"22","2":"10","3":"13","4":"12","5":"13"},"weapons":{"0":{"weapon_id":"34","name":"Mithrandir's","damage":"1d8","critical":"x3","note":"+1
(more)
vs Giant/Goblin kin,
light/dark/fire","attack":"+2","dam":"1d8+2","crit":"x3","att":"+2"},"1":{"weapon_id":"48","name":"Rapier","dam":"1d6","crit":"18-20/x2"}},"armor":{"0":{"armor_id":"1"}},"feats":[{"feat_id":49},{"feat_id":51},{"feat_id":35},{"feat_id":74}],"xp_log":{},"languages":{"0":7},"skills":[{"skill_id":0,"ranks":"2"},{"skill_id":3,"ranks":"2"},{"skill_id":4,"ranks":"7"},{"skill_id":10,"ranks":"4"},{"skill_id":13,"ranks":"2"},{"skill_id":15,"ranks":"7"},{"skill_id":17,"ranks":"5"},{"skill_id":21,"ranks":"1"},{"skill_id":24,"ranks":"1"},{"skill_id":28,"ranks":"6"},{"skill_id":29,"ranks":"4"},{"skill_id":34,"ranks":"2"},{"skill_id":35,"ranks":"3"},{"skill_id":39,"ranks":"7"},{"skill_id":42,"ranks":"5"},{"skill_id":44,"ranks":"1"},{"skill_id":1,"ranks":"2"},{"skill_id":33,"ranks":"2"},{"skill_id":43,"ranks":"2"}]}
+{"name":"Felonious","xp":"30990","hp":"46","race_id":"4","class_id":"7","alignment_id":"0","goodness_id":"0","deity_id":"0","domain_id":"0","weapon_style":"archery","abilities":{"0":"16","1":"22","2":"10","3":"13","4":"12","5":"13"},"weapons":{"0":{"weapon_id":"34","name":"Mithrandir's","damage":"1d8","critical":"x3","note":"+1
(more)
vs Giant/Goblin kin,
light/dark/fire","attack":"+2","dam":"1d8+2","crit":"x3","att":"+2"},"1":{"weapon_id":"48","name":"Rapier","dam":"1d6","crit":"18-20/x2"}},"armor":{"0":{"armor_id":"1"}},"feats":[{"feat_id":49},{"feat_id":51},{"feat_id":35},{"feat_id":74}],"log":{"0":"b240bfef","1":"14267602","2":"e198b030","3":"5a36dd3c"}}`{"id":"b240bfef","xp":"26040","hp":"42","date":1249531200000,"note":"After
the
outpost."},{"id":"14267602","xp":"27340","hp":"42","date":1251950400000,"note":"Siege
at the outpost with
Thain."},{"id":"e198b030","xp":"28340","hp":"46","date":1254974400000,"note":"Arrived
in Rockholm, sequestered in a pub. Audience with the king after the feast,
but no headway with the high priest. Journey through the tunnel to
Soulforge."},{"id":"5a36dd3c","xp":"30990","hp":"46","date":1255492800000,"note":"Month-long
journey through the tunnel on lizards. Near drowning in accident caused by
claustrophobic madness. Soulforge sacked and overrun by undead dwarves and
forest creatures."}