function Project(project_id){var self=this;this.users=[];this.project_id=project_id;Project.prototype.init=function(){this.ajaxGetUsersForProject();};Project.prototype.ajaxGetUsersForProjectCB=function(data,textStatus){self.users=data;$('body').trigger("CurrentProject.UsersLoaded")}
Project.prototype.ajaxGetUsersForProject=function(){$.get("/projects/"+project_id+"/users",{},this.ajaxGetUsersForProjectCB,"json")}
Project.prototype.getUser=function(id){for(var i=0;i<this.users.length;i++){var user=this.users[i]
if(user.id==id){return user;}}
throw"No user found for id '"+id+"'"}
Project.prototype.setUsers=function(users_json){self.users=users_json;}}
$(function(){$.fn.project_tout=function(options){var defaults={};var options=$.extend(defaults,options);var self=this;function delete_project(parent){if(confirm('Are you sure you want to remove this project?')){var project_id=$(this).attr('project_id')
$.post(project_url(project_id),{"_method":"delete","authenticity_token":window._auth_token},delete_project_callback_success,"json");}
return true;}
function delete_project_callback_success(data,textStatus){return true;}
$('img.project_delete',this).click(delete_project);};$.fn.project_user=function(options){var defaults={};var options=$.extend(defaults,options);function remove_user_from_project(){if(confirm('Are you sure you want to remove this user from the project?')){var user_id=$(this).attr('id').replace(/[^\d]+/g,'');$.post(admin_remove_user_from_project_url(project_id,user_id),{"authenticity_token":window._auth_token},function(date){$('#user_'+user_id).remove()},"json");}
return true;}
$('img.project_user_delete',this).click(remove_user_from_project);return $(this);}
$('#myprojects .project').project_tout();$('div.project_user').project_user();});var User=function(){}
ElementId={card_id:function(element){return element.closest(".kanban_card").attr("card_id");},extract_project_id:function(element){return element.closest(".kanban_card").attr("project_id");}}
function popup_card_dialog(){var url="/projects/"+ElementId.extract_project_id($(this))+"/cards/"+ElementId.card_id($(this))+".js";$(this).parent().prev().children('.spinner').show();$(this).parent().prev().children('.delete_card').hide();$.get(url,{},null,"script");return false;}
$(function(){function make_card_id(id,prefix){if(typeof prefix=="undefined"){prefix="card_";}
return prefix+id;}
function delete_card(id_prefix){if(confirm('Are you sure you want to delete this card.  All data associated with this card will be lost and cannot be retrieved.  Are you *REALLY* sure?')){$.post(project_card_url(project_id,ElementId.card_id($(this))),{"_method":"delete","authenticity_token":window._auth_token},function(data,textStatus){$('#'+make_card_id(data.card_id,id_prefix)).fadeOut();},"json");}};function remove_from_kanban(){function remove_card_success(card,textStatus){$("#kanban_card_"+card.id).fadeOut();}
if(confirm('Move this card to the backlog?')){$.post(project_card_move_to_backlog_url(project_id,ElementId.card_id($(this))),{"authenticity_token":window._auth_token},remove_card_success,"json");}}
function make_inner_card_content(options){function task_state_class(task){switch(task.task_state_id%3){case 0:return"task_not_started";break;case 1:return"task_started";break;case 2:return"task_completed";break;}}
function tooltip_content(card){var x='';if(options.tasklist_popup){x+='<div class="card_comments_tooltip_content" id="cardtasklist-content-'+card.id+'">';x+='<div class="header">Tasks</div>';if(card.tasks!=null&&card.tasks.length>0){x+='<table>';for(var j=0;j<card.tasks.length;j++){var task=card.tasks[j];x+='<tr><td><div class="task_state '+task_state_class(task)+'"></div></td><td></td><td>'+task.name+'</td></tr>';}
x+='</table>';}else{x+='<span>No Tasks Defined Yet.</span>';}
x+='</div>';}
if(options.description_popup){x+='<div class="card_comments_tooltip_content" id="cardpreamble-content-'+card.id+'">';x+='<div class="header">Description</div>';x+='<div class="preamble">'+(card.description==null?"No description has been entered.":card.description)+'</div>';x+='</div>';}
return x;};function card_type_image_icon_tag(card){var number_of_card_types_for_project=5;return'<a href="'+project_card_url(CurrentProject.project_id,card.id)+'" class="card_type_icon"><span card_id="'+card.id+'" class="card_type_icon card_type_icon_'+(card.card_type_id%number_of_card_types_for_project)+'"/></a>'}
var card=options.card;var card_display='<div class="card_header">';if(options.display_go_back){card_display+='<img src="/images/icons/move_card_to_backlog.png" id="cardpreamble-target-'+card.id+'" class="remove_from_kanban" title="Move Card to Backlog" style="width: 16px; height: 16px;" />';}
card_display+=card_type_image_icon_tag(card)
if(options.tasklist_popup){card_display+='<img src="/images/icons/tasklist-16x16.png" id="cardtasklist-target-'+card.id+'" class="tooltip" title="Task List"/>';}
if(options.description_popup){card_display+='<img src="/images/icons/story_preamble-16x16.png" id="cardpreamble-target-'+card.id+'" class="tooltip" title="Description" />';}
card_display+='<img src="/images/icons/cog_delete.png" title="Delete this card" class="delete_card" style="float:right; margin-left: 6px;"/>';card_display+='<img src="/images/icons/spinner.gif" title="Loading card ..." class="spinner" style="float:right; margin-left: 6px; display: none;"/>';if(options.display_cardowner){card_display+='<span style="float:right; margin-top: 0px;">'+CardOwnerWidget.display(card)+'</span><br />';}
card_display+='</div>';card_display+='<div class="card_body">';card_display+='<a href="'+project_card_url(CurrentProject.project_id,card.id)+'" class="popup_card_link">'+card.id+': '+card.title+'</a>';card_display+='</div>';card_display+=tooltip_content(card);return card_display;}
$.fn.update_kanban_card=function(options){function init(parent){parent.html(make_inner_card_content(options));CardOwnerWidget.setup_events(parent);var base='#'+make_card_id(options.card.id,options.id_prefix);alert("updating: "+base);$(base+' img.delete_card',parent).click(delete_card.curry(options.id_prefix));$(base+' a.popup_card_link',parent).click(popup_card_dialog);var card=options.card;$(base+' img.remove_from_kanban',parent).click(remove_from_kanban);}
init($(this));}
$.fn.kanban_card=function(options){var defaults={card:null,tasklist_popup:true,description_popup:true,display_cardowner:true,display_go_back:true,card_tag:'li',id_prefix:'card_',card_class:'',position:{"left":"","top":""}};var options=$.extend(defaults,options);function make_card_html(options){var card=options.card;var content='<'+options.card_tag+' id="'+make_card_id(card.id,options.id_prefix)+'" class="kanban_card '+options.card_class+'"'+' project_id="'+card.project_id+'" card_id="'+card.id+'">';content+='</'+options.card_tag+'>';return $(content).append(make_inner_card_content(options));};$(this).append($(make_card_html(options)));var base='#'+make_card_id(options.card.id,options.id_prefix);$(base+' img.delete_card',this).click(delete_card.curry(options.id_prefix));$(base+' img.remove_from_kanban',this).click(remove_from_kanban);var colorbox_attributes={opacity:0.3,onComplete:function(){$('#cboxLoadedContent').css("overflow","visible")}}
$(base+' a.card_type_icon',this).colorbox(colorbox_attributes);$(base+' a.popup_card_link',this).colorbox(colorbox_attributes);CardOwnerWidget.setup_events(this);return $(this);};});CardOwnerWidget={selected_option:function(owner,user){if(owner.id==user.id)return"selected='selected'";},option:function(card,user){return'<option value="'+user.id+'" '+CardOwnerWidget.selected_option(card.owner,user)+'>'+user.name+'</option>';},owner_select_list:function(card){var select='<select class="card_owner_select" style="display:none;">';select+='<option value="unknown"></option>';$.each(CurrentProject.users,function(){select+=CardOwnerWidget.option(card,this);});select+='</select>';return select;},card_owner:function(card){return"<span class='owner_name' id='owner_name_"+card.id+"' title='Click to change owner'>"+card.owner.name+"</span>";},done_button:function(){return"<button type='button' class='done_button' style='display:none;'>Done</button>";},display:function(card,users){return CardOwnerWidget.card_owner(card)+CardOwnerWidget.owner_select_list(card,CurrentProject.users)+CardOwnerWidget.done_button();},setup_events:function(parent){$(".owner_name",parent).click(function(){$(this).hide();$(this).siblings('button').show();$(this).siblings('select').show();$(this).parent().parent().find('.delete_card').hide();});$('.owner_name',parent).hover(function(){$(this).css('cursor','pointer');$(this).css('background-color','#F4D7B6');},function(){$(this).css('background-color','');$(this).css('cursor','');});$(".card_owner_select",parent).change(function(){$.ajax({type:"POST",url:project_card_url(CurrentProject.project_id,ElementId.card_id($(this))),data:"_method=put&card[user_id]="+$(this).val()+"&project_id="+ElementId.extract_project_id($(this))+"&authenticity_token="+encodeURIComponent(AUTH_TOKEN),dataType:'json',beforeSend:function(x){if(x&&x.overrideMimeType){x.overrideMimeType("application/j-son;charset=UTF-8");}},success:function(json){$('span#owner_name_'+json.id).text(json.owner.name);},error:function(XMLHttpRequest,textStatus,errorThrown){console.log("error: "+textStatus);},});});$(".done_button",parent).click(function(){$(this).hide();$(this).siblings('select').hide();$(this).siblings('span').show();$(this).parent().parent().find('.delete_card').show();});},}
$(function(){$.fn.kanban=function(options){var defaults={cards:[],card_states:card_states,};var options=$.extend(defaults,options);var div='';for(var j=0;j<options.card_states.length;j++){card_state=options.card_states[j];wip_limit_indicator=card_state.wip_limit==0?"":' ('+card_state.wip_limit+')';ul=$('<ul id="card_state_'+card_state.id+'" class="kanban_swimlane" style="float: left; width:'+(85/(options.card_states.length))+'%;"/>');ul.append('<li class="header">'+card_state.name+wip_limit_indicator+'</li>');for(var i=0;i<options.cards.length;i++){var card=options.cards[i];if(card.card_state_id==card_state.id){ul.kanban_card({card:card,tasklist_popup:false,description_popup:false,display_go_back:true,display_cardowner:true,card_tag:'li',id_prefix:'kanban_card_',position:'relative'});}};$(this).append(ul);$('.kanban_swimlane').sortable({items:'.kanban_card',connectWith:'.kanban_swimlane',stop:CardDragged,});};updateWipLimitFeedback();$(this).fadeIn(2000);function CardDragged(x,ui){var card_id=$(ui.item).attr('id').replace(/[^\d]+/g,'');var sibling_cards=$(ui.item).siblings('.kanban_card');var position=ui.item.prevAll().length;var card_state=ui.item.parent().attr("id");var to_cards=$('#'+card_state).sortable("serialize");$.post(project_kanban_card_dropped_path(project_id),{'authenticity_token':window._auth_token,'card_id':card_id,'position':position,'card_state':card_state,'cards':to_cards});$(ui.item).fadeIn();updateWipLimitFeedback();};function updateWipLimitFeedback(){for(var j=0;j<options.card_states.length;j++){card_state=options.card_states[j];$('#'+'card_state_'+card_state.id).removeClass("wip_limit_exceeded");$('#'+'card_state_'+card_state.id).removeClass("wip_limit_acheived");var numberOfCards=$('#'+'card_state_'+card_state.id).find('li.kanban_card').length
if(card_state.wip_limit>0){if(card_state.wip_limit<numberOfCards){$('#'+'card_state_'+card_state.id).addClass("wip_limit_exceeded");}else if(card_state.wip_limit==numberOfCards){$('#'+'card_state_'+card_state.id).addClass("wip_limit_acheived");}}}};CardOwnerWidget.setup_events(this);return $(this);}});$(function(){$.fn.backlog=function(options){var defaults={project_id:0,cards:[],card_positions:[]};var options=$.extend(defaults,options);var card_positions=options.card_positions;self.enableLivesearch=function(){var backlog_cards='.kanban_backlog_card'
$('input[name="f"]').search(backlog_cards,function(on){on.reset(function(){$(this).removeClass("livesearch_empty")
$('#none').hide();$(backlog_cards).show();});on.empty(function(){$(this).addClass("livesearch_empty")
$(backlog_cards).hide();});on.results(function(results){$(this).removeClass("livesearch_empty")
$('#none').hide();$(backlog_cards).hide();results.show();});});}
enableLivesearch();self.enableFilterByCardType=function(){$('.card_type_filter_icon').click(function(){var card_type_id=$(this).attr("card_type_id")
$(this).toggleClass("card_type_filter_icon_on")
if($(this).hasClass("card_type_filter_icon_on")){$('.kanban_backlog .card_type_icon_'+card_type_id).closest(".kanban_card").hide()}else{$('.kanban_backlog .card_type_icon_'+card_type_id).closest(".kanban_card").show()}})}
enableFilterByCardType();var board=$(this);var ul=$('<ul/>').addClass("kanban_backlog");function getCardPosition(id){for(var i=0;i<card_positions.length;i++){if(card_positions[i].id==id){return card_positions[i].position}};return{"top":"","left":""};}
for(var i=0;i<options.cards.length;i++){var card=options.cards[i];if(card.card_state_id==null){ul.kanban_card({card:card,card_tag:'li',id_prefix:'backlog_card_',tasklist_popup:false,description_popup:false,display_cardowner:true,display_go_back:false,card_class:'kanban_backlog_card',position:getCardPosition(card.id)});}};board.append(ul);$('.kanban_card',ul).draggable({containment:'#backlog',items:'.kanban_card',stop:function(data,ui){var self=this;var card_id=$(this).attr("card_id");var project_id=$(this).attr("project_id");var position=$(this).position()
if($(self).css("position")=="relative"){$(self).css("top",position.top+"px")
$(self).css("left",position.left+"px")
$(this).css("position","absolute")}
$('.kanban_backlog_card').each(function(index,element){var x=$(element);var pos=x.position()})
$.post(project_card_backlog_card_drop_url(project_id,card_id),{"authenticity_token":window._auth_token,"left":position.left,"top":position.top},function(data,textStatus){},"json");}});board.append('<div class="kanban_staging_arrow"><img src="/images/vertical_arrow.gif"/></div>');queue=$('<div/>').addClass("kanban_swimlane").addClass("kanban_queue").attr("id","kanban_queue");queue.append('<div class="header">Kanban Acceptor</div>')
queue.append('<div class="header2">(Drag Cards Here Place Them on the Kanban)</div>')
board.append(queue);$("#kanban_queue").droppable({drop:function(event,ui){var card_id=$(ui.draggable).attr("card_id");var project_id=$(ui.draggable).attr("project_id");$.post(project_card_activate_url(project_id,card_id),{"authenticity_token":window._auth_token},function(data,textStatus){$(ui.draggable).hide("puff",{},500).fadeOut();},"json");}});for(var i=0;i<card_positions.length;i++){var pos=card_positions[i]
var card=$('#backlog_card_'+pos.id);card.css("position","absolute")
card.css("top",pos.position.top+"px")
card.css("left",pos.position.left+"px")};return $(this);function kanban_backlog_resize(){var w=$(window);var H=w.height();var W=w.width();$('.kanban_backlog').css({width:W-360});};kanban_backlog_resize();$(window).wresize(kanban_backlog_resize);};});var Card=function(){var findBy=function(id){alert("find card "+id)}}
$(function(){$.fn.colorbox_add_task_row=function(task){var self=this;function task_owner_changed(){var user_id=$(this).val();var card_id=$(this).attr('card_id');var task_id=$(this).attr('task_id');var url=project_card_task_url(CurrentProject.project_id,card_id,task_id)
$.post(url,{"task[user_id]":user_id,"authenticity_token":window._auth_token,"_method":"put"});}
function taskOwnerDropdown(task){var html='';html+='<select task_id="'+task.id+'" card_id="'+task.card_id+'" project_id="'+CurrentProject.project_id+'"" class="task_owner">'
html+='<option value =""></option>'
for(var i=0;i<CurrentProject.users.length;i++){var user=CurrentProject.users[i]
html+='<option value="'+user.id+'"'+(task.user_id==user.id?' selected="selected"':'')+'>'+user.name+'</option>'};html+='</select>'
return html}
function task_state_select(task){var html='<select id="task_state_'+task.id+'" class="task_state">';for(var i=0;i<task_states.length;i++){task_state=task_states[i];html+='<option value="'+task_state.id+'"';if(task_state.id==task.task_state_id){html+=' "selected=\"selected\"';}
html+='>'+task_state.name+'</option>';}
html+='</select>';return html;}
function task_state_changed(task){var task_state_id=$(this).val()
var url=project_card_task_url(CurrentProject.project_id,task.card_id,task.id)
$.post(url,{"task[task_state_id]":task_state_id,"authenticity_token":window._auth_token,"_method":"put"});};function delete_task(){function delete_task_callback_success(data,textStatus){$(self).find("#task_"+data.id).fadeOut();}
if(confirm('Are you sure you want to delete this task ?')){$.post(project_card_task_url(CurrentProject.project_id,task.card_id,task.id),{"_method":"delete","authenticity_token":window._auth_token},delete_task_callback_success,"json");};return true;};var html='';html+='<tr id="task_'+task.id+'" class="task" task_id="'+task.id+'" card_id='+task.card_id+' >';html+='<td class="owner">'+taskOwnerDropdown(task)+'</td>';html+='<td class="name">'+task.name+'</td>';html+='<td class="states">'+task_state_select(task)+'</td>';html+='<td class="actions"><img class="task_delete" src="/images/icons/cog_delete.png" style="cursor: pointer" title="Delete this task"/></td>';html+='</tr>';$(this).find('table').append(html);$(this).find("#task_"+task.id+" .task_owner").bind("change",task_owner_changed)
$(this).find("#task_"+task.id+" .task_delete").click(delete_task)
$(this).find("#task_"+task.id+" .task_state").bind("change",task_state_changed.curry(task));}
$.fn.colorbox_tasklist_table=function(options){var defaults={users:CurrentProject.users,tasks:[]};var options=$.extend(defaults,options);var tasks=options.tasks;for(var i=0;i<tasks.length;i++){var task=tasks[i];$(this).colorbox_add_task_row(task);}
$('.task td.name',this).each(function(index,element){var task=$(this).parents(".task:first");$(this).editInPlace({url:project_card_task_update_attribute_url(CurrentProject.project_id,task.attr("card_id"),task.attr("task_id")),params:"attribute=name"})});return $(this);var url=$.post(url,{"task[name]":value,"authenticity_token":window._auth_token,"_method":"put"});};$.fn.colorbox_card=function(options){var defaults={card:null};var options=$.extend(defaults,options);var card=options.card;var self=this;function card_description(card){return card.description==null?"No Description":card.description;}
function card_number(card){return card.id}
function card_attribute_updated(attribute_name,value){function update_title(parent,value){parent.find("."+"card_body a").html(card_number(card)+":"+value)}
if(attribute_name=="title"){update_title($('#backlog_card_'+card.id),value);update_title($('#kanban_card_'+card.id),value);}}
var html=''
html+='<div class="title">'
html+=card.title+'</div>'
html+='<div class="description">'+card_description(card)+'</div>'
html+='<div class="tasks" style="overflow:auto;">'
html+='<table>'
html+='<thead>'
html+='<tr>'
html+='<td class="task_owner label"><img alt="radtrack - Agility with Cards" class="radtrack_logo" src="/images/graffle/radtrack_logo_header.png?1276439082"></td>'
html+='<td colspan="3">'
html+='<span><form method="POST" class="create_new_task" action="'+project_card_tasks_url(card.project_id,card.id)+'.json">'
html+='<input id="authenticity_token" name="authenticity_token" type="hidden" value="'+window._auth_token+'">'
html+='<input name="task[name]" value="... To Create a Task, Enter the New Task Name Here ..."/>'
html+='</form></span>'
html+='</td>'
html+='</tr>'
html+='</thead>'
html+='<tbody/>'
html+='</table>'
html+='</div>'
$(this).html(html)
$(this).find('form.create_new_task input').clearOnFocus()
$(this).find('form.create_new_task').ajaxForm({dataType:'json',success:function(json){$(self).find('.tasks').colorbox_add_task_row(json)
$(self).find('form.create_new_task input').val("")}})
$(this).find('.description').editInPlace({field_type:"textarea",cols:132,rows:3,url:project_card_update_attribute_url(project_id,card.id),params:"_method=put&attribute=description",success:card_attribute_updated.curry("description")})
$(this).find('.title').editInPlace({url:project_card_update_attribute_url(project_id,card.id),params:"_method=put&attribute=title",style:"inherit",success:card_attribute_updated.curry("title")})
$(this).find('.tasks').colorbox_tasklist_table({tasks:card.tasks})
return $(this)};});$(function(){function add_team_member(user,pending){$('#invite_user_working').hide();var html="";html+='<div id="user_'+user.id+'" class="user project_user">';html+='<h1>'+user.email;html+='<img title="Remove this user from the project?" style="cursor: pointer; float: right;" src="/images/icons/cog_delete.png" id="project_user_'+user.id+'" class="project_user_delete" alt="Cog_delete">';html+='</h1>';if(pending){html+='<h2>(Invitation Pending)</h2>';}
html+='</div>'
$('#project_users').append($(html).project_user());}
function popup_invite_user_dialog(){$('#invite_user_dialog').dialog({title:"Invite a Person to this Project"});$('#invite_user_dialog').dialog("open");}
function showInvitingUserWorking(){$('#invite_user_form').hide();$('#invite_user_working').show();}
$(function(){$('#invite_user_button').click(function(){popup_invite_user_dialog();})
var options={dataType:'json',beforeSubmit:showInvitingUserWorking,success:function(json){$('#invite_user_dialog').dialog("close");add_team_member(json,true);}};$('#invite_user_dialog form').ajaxForm(options);$('.project_user .user_tasks .tasks').each(function(index,element){$('body').bind("CurrentProject.UsersLoaded",function(){$(element).colorbox_tasklist_table({})})})})})
$.fn.UserTabs=function(options){var defaults={tabs:[{title:"Sample Tab",url:"http://www.fluidia.org"}]};var options=$.extend(defaults,options);var html='';html+='<div id="project-tools-tabs" style="float: left; width: 100%; height: 800px;">';html+='<ul>';for(var i=0;i<options.tabs.length;i++){var tab=options.tabs[i];}
$(this).tabs({});}