// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// initiative/control.js
//
// copyright (c) 2009-2010 drow <drow@bin.sh>
// all rights reserved.

var form="init_form",icon_dir="/d20/initiative/icons",rpc_url="/d20/initiative/rpc.cgi",fmt={saved:'Initiative data has been saved to ID <a href="?load=#{id}">#{id}</a>'};Object.keys(fmt).each(function(a){fmt[a]=new Template(fmt[a])});
function init_form(){client_form(form);Event.observe("add","click",add_actor);Event.observe("add_form","submit",append_actor);Event.observe("add_save","click",append_actor);Event.observe("add_cancel","click",cancel);Event.observe("sort","click",sort_actors);Event.observe("dice","change",new_dice);Event.observe("roll","click",new_dice);Event.observe("load","click",load_form);Event.observe("load_form","submit",load_actors);Event.observe("load_from","click",load_actors);Event.observe("load_cancel","click",
cancel);Event.observe("save","click",save_actors);if(location.search){var a=location.search.toQueryParams();a.load&&load_actors_from(a.load)}}function load_form(){$(form).hide();$("load_form").show();$("load_form").elements.id.focus()}function load_actors(a){a&&a.stop();$("load_form").hide();$("loading").show();$("stdout").update("");a=form_data("load_form");load_actors_from(a.id)}
function load_actors_from(a){a={method:"get",parameters:{load:a},onSuccess:function(b){load_data(b.responseJSON)},onFailure:function(b){load_error(b.statusText)},onException:function(){load_error("System Error")}};new Ajax.Request(rpc_url,a)}function load_data(a){if(a.error)load_error(a.error);else{$("actors").update("");stop_timer();a.each(function(b){append_row(b)});rehook_tracker();$("loading").hide();Effect.BlindDown(form)}}
function load_error(a){$("loading").hide();$("stdout").update(a);$(form).show()}function cancel(a){a.element().form.hide();$(form).show()}function save_actors(){var a=list_actors().map(actor_data);a=Object.toJSON(a);a={method:"post",parameters:{store:a},onSuccess:function(b){save_complete(b.responseJSON)},onFailure:function(b){save_error(b.statusText)},onException:function(){save_error("System Error")}};new Ajax.Request(rpc_url,a)}
function save_complete(a){if(a.error)save_error(a.error);else{a=fmt.saved.evaluate(a);$("stdout").update(a)}}function save_error(a){$("stdout").update(a)}function add_actor(){$(form).hide();$("add_form").show();$("add_form").elements.name.focus()}function append_actor(a){a&&a.stop();$("add_form").hide();a=form_data("add_form");var b=parseInt(a.n);if(b>1){var c=a.name;for(i=1;i<=b;i++){a.name=c+" #"+i;append_row(roll_actor(a))}}else append_row(roll_actor(a));rehook_tracker();$(form).show()}
function roll_actor(a){a=Object.clone(a);var b=/\d*d\d+/;if(a.init.match(b))a.init=roll_dice(a.init);if(a.hp.match(b))a.hp=roll_dice(a.hp);return a}function append_row(a){a=create_actor(a);$("actors").insert(a)}
var actor_seq=1,input_attr={name:{type:"hidden"},init:{"class":"stat init",size:5},status:{type:"hidden"},wait:{type:"image",src:icon_dir+"/wait.gif"},act:{type:"image",src:icon_dir+"/act.gif"},ready:{type:"image",src:icon_dir+"/ready.gif"},delay:{type:"image",src:icon_dir+"/delay.gif"},inact:{id:"inact",name:"inact"},ac:{"class":"stat ac",size:3},fort:{"class":"stat fort",size:3},reflex:{"class":"stat reflex",size:3},will:{"class":"stat will",size:3},hp:{"class":"stat hp",size:5},notes:{size:20},
rm:{type:"image",src:icon_dir+"/delete.gif"}};
function create_actor(a){var b="z"+actor_seq++,c=new Element("tr",{id:b});c.appendChild(create_name(b,a.name));c.appendChild(create_stat(b,"init",a.init));c.appendChild(create_status(b,a.status));c.appendChild(create_stat(b,"ac",a.ac));c.appendChild(create_stat(b,"fort",a.fort));c.appendChild(create_stat(b,"reflex",a.reflex));c.appendChild(create_stat(b,"will",a.will));c.appendChild(create_stat(b,"hp",a.hp));c.appendChild(create_stat(b,"notes",a.notes));c.appendChild(create_cmd(b,"rm"));return c}
function create_name(a,b){var c=new Element("td");c.appendChild(build_input(a,"name",b));c.appendChild(create_text(b));return c}function create_stat(a,b,c){var d=new Element("td");d.appendChild(build_input(a,b,c));return d}function create_status(a,b){input_attr[b]||(b="wait");var c={id:"td."+a+".status","class":"status"},d=new Element("td",c);a=build_status(a,b);a.each(function(e){d.appendChild(e)});return d}
function create_cmd(a,b){var c=new Element("td"),d=input_attr[b];d.id=a+"."+b;a=new Element("input",d);c.appendChild(a);return c}function create_text(a){return document.createTextNode(a)}function build_input(a,b,c){var d=input_attr[b];d.id=a+"."+b;d.name=a+"."+b;d.value=typeof c!="undefined"?c:"";return new Element("input",d)}function build_option(a,b){if(typeof b=="undefined")b=a;a=new Element("option",{value:a});a.appendChild(create_text(b));return a}
function remove_actor(a){$(a.element().identify().split(".")[0]).remove();alter_rows()}function sort_actors(){var a=list_rows().sort(sort_init);update_actors(a);a.each(function(b){set_status(actor_id(b),"wait")});rehook_tracker()}function sort_init(a,b){var c=$(form).elements;a=parseInt(c[actor_id(a)+".init"].value);b=parseInt(c[actor_id(b)+".init"].value);return c.reverse&&c.reverse.checked?a-b:b-a}function reverse_actors(a){a=list_rows().reverse();update_actors(a)}
function update_actors(a){$("actors").update("");a.each(function(b){$("actors").insert(b)})}
function change_status(a){a=a.element();var b=a.identify();if(b=="inact"){b=current_actor();a=a.options[a.selectedIndex].value;if(a=="ready")set_status(b,"ready");else a=="delay"?set_status(b,"delay"):set_status(b,"wait")}else{b=b.split(".")[0];a=a.value;if(a=="wait"){if(cd=current_actor())end_turn(cd);set_status(b,"act")}else if(a=="act")return stop_watch();else if(a=="ready"){if(cd=current_actor())move_before(b,cd);set_status(b,"wait")}else if(a=="delay"){if(cd=current_actor()){end_turn(cd);move_after(b,
cd)}set_status(b,"act")}else set_status(b,"wait")}rehook_tracker()}function end_turn(a){set_status(a,"wait");stop_timer()}function move_after(a,b){var c=[];list_rows().each(function(d){var e=actor_id(d);if(e!=a){c.push(d);e==b&&c.push($(a))}});update_actors(c)}function move_before(a,b){var c=[];list_rows().each(function(d){var e=actor_id(d);if(e!=a){e==b&&c.push($(a));c.push(d)}});update_actors(c)}
function set_status(a,b){input_attr[b]||(b="wait");var c=$("td."+a+".status");c.update("");a=build_status(a,b);a.each(function(d){c.appendChild(d)})}
function build_status(a,b){var c=input_attr[b];c.id=a+".status";c.name=a+".status";c.value=b;a=new Element("input",c);a=[a];if(b=="act"){a.push(new Element("span",{id:"act_timer"}));a.push(new Element("br"));b=new Element("select",input_attr.inact);b.appendChild(build_option(""));b.appendChild(build_option("ready","Ready"));b.appendChild(build_option("delay","Delay"));a.push(b)}else if(b=="ready")a.push(create_text("Ready"));else b=="delay"&&a.push(create_text("Delay"));return a}
function list_rows(){return $("actors").childElements()}function list_actors(){return list_rows().map(actor_id)}function actor_id(a){return a.identify()}function current_actor(){return list_actors().find(current_ka)}function current_ka(a){return $(a+".status").value=="act"}
function actor_data(a){var b=$(form).elements,c={};c.name=b[a+".name"].value;c.init=b[a+".init"].value;c.status=$(a+".status").value;c.ac=b[a+".ac"].value;c.fort=b[a+".fort"].value;c.reflex=b[a+".reflex"].value;c.will=b[a+".will"].value;c.hp=b[a+".hp"].value;c.notes=b[a+".notes"].value;return c}
function form_data(a){var b=$(a).getInputs(),c={};b.each(function(d){c[d.name]=d.value});$(a).reset();if(c.ac=="AC")c.ac="";if(c.fort=="Fort")c.fort="";if(c.reflex=="Reflex")c.reflex="";if(c.will=="Will")c.will="";return c}var sort_attr={tag:"tr",ghosting:true,onUpdate:function(){alter_rows()}};
function rehook_tracker(){var a=list_rows();a.each(function(b){rehook_actor(actor_id(b))});if($("act_timer")){Event.observe("act_timer","mousedown",stop_watch);timer||start_timer()}$("inact")&&Event.observe("inact","change",change_status);Sortable.destroy("actors");Sortable.create("actors",sort_attr);alter_rows()}
function rehook_actor(a){Event.observe(a+".init","click",select_field);Event.observe(a+".status","click",change_status);Event.observe(a+".hp","click",select_field);Event.observe(a+".rm","click",remove_actor)}function select_field(a){var b=a.element();a.stop();b.focus();b.select()}function alter_rows(){var a=list_rows();a.each(function(b,c){alter_row(b,c)})}function alter_row(a,b){alter_class(a,b);alter_tabidx(a,b)}function alter_class(a,b){b=(b%2?"add":"remove")+"ClassName";a[b]("grey")}
function alter_tabidx(a,b){a=actor_id(a);var c=$(form).elements;c[a+".init"].writeAttribute("tabindex",b+1);c[a+".ac"].writeAttribute("tabindex",b+101);c[a+".fort"].writeAttribute("tabindex",b+201);c[a+".reflex"].writeAttribute("tabindex",b+301);c[a+".will"].writeAttribute("tabindex",b+401);c[a+".hp"].writeAttribute("tabindex",b*2+501);c[a+".notes"].writeAttribute("tabindex",b*2+502)}var timer=false,t_last=0,t_elapsed=0;
function start_timer(){$("act_timer").update("0:00");t_last=get_time();t_elapsed=0;timer=setInterval("update_timer()",100)}function stop_watch(){if(timer){clearInterval(timer);timer=false;$("act_timer").addClassName("paused")}else{$("act_timer").removeClassName("paused");t_last=get_time();timer=setInterval("update_timer()",100)}}
function update_timer(){if($("act_timer")){var a=get_time();t_elapsed+=a-t_last;t_last=a;var b=(t_elapsed/1E3).floor();a=(b/60).floor();b=b-a*60;if(b<10)b="0"+b;$("act_timer").update(""+a+":"+b)}else stop_timer()}function stop_timer(){timer&&clearInterval(timer);timer=false;t_elapsed=t_last=0}function get_time(){var a=new Date;return a.getTime()}var dice_out=[];function new_dice(){dice_out=[".","..","...",roll_dice($("dice").value)];setTimeout("dice_result()",100)}
function dice_result(){if(dice_out.length){$("result").value=dice_out.shift();dice_out.length&&setTimeout("dice_result()",100)}}document.observe("dom:loaded",init_form);
