/* 
* Online Quoting Tool by Cristian Graziano
* Version: 0.1 (Beta)
* http://www.cristiangraziano.com
*
* Quoting Algorithm based on C-Factor discussed here:
* http://www.cristiangraziano.com/blog/improving-fixed-fee-quoting-by-using-the-complexity-factor
*/

function roundNumber(strValue)
{strValue=strValue.toString().replace(/\$|\,/g,'');dblValue=parseFloat(strValue);blnSign=(dblValue==(dblValue=Math.abs(dblValue)));dblValue=Math.floor(dblValue*100+0.50000000001);intCents=dblValue%100;strCents=intCents.toString();dblValue=Math.floor(dblValue/100).toString();if(intCents<10)
strCents="0"+strCents;for(var i=0;i<Math.floor((dblValue.length-(1+i))/3);i++)
dblValue=dblValue.substring(0,dblValue.length-(4*i+3))+''+
dblValue.substring(dblValue.length-(4*i+3));return(((blnSign)?'':'-')+dblValue+'.'+strCents);}
function updateTotals(mID)
{var estTime=0;var subTotal=0;var start=$("tr#mtr-"+mID).get(0).rowIndex+1;var end=$("tr.sub-"+mID).get(0).rowIndex;for(i=start;i<end;++i){var thisI=$("#quoteTable").find("tr:eq("+i+")");estTime+=parseFloat(thisI.find("td:eq(4)").text());var rowSubTotal=thisI.find("td:eq(5)").text();var rowSubTotal=rowSubTotal.substring(1);subTotal+=parseFloat(rowSubTotal);}
$("tr.sub-"+mID+" td:eq(4)").text(roundNumber(estTime));$("tr.sub-"+mID+" td:eq(5)").text("$"+roundNumber(subTotal));setComplexity();}
function setComplexity()
{var estTime=0;var best=0;var total=0;$("#quoteTable td.auto").not(":contains('$')").each(function(){estTime+=parseFloat($(this).text());});$("#quoteTable td.auto:contains('$')").each(function(){var tempTotal=$(this).text();total+=parseFloat(tempTotal.substring(1));});$("#quoteTable tbody tr.task").each(function(){var el=$(this).find("td:eq(4)");if(el.attr("class")!="auto"){val=el.val();var est=parseFloat(el.text());var ps=$(this).find("td:eq(3)").text();var ps=parseFloat(ps.replace('%',''));var ps=ps/100;var weight=est/estTime;best+=(weight*ps);}});var worst=1-best;var bestPercentage=roundNumber(best*100);var worstPercentage=roundNumber(worst*100);var cFactor=roundNumber(worstPercentage);$("td#bestPercent").text(bestPercentage+"%");$("td#worstPercent").text(worstPercentage+"%");$("td#cFactor").text(cFactor);$("td#total").text("$"+roundNumber(total));}
$(document).ready(function(){var mID=0;$('#tabs').tabs();$('#switcher').themeswitcher();$("tr[id^='mtr-']").livequery(function(){$(this).sortable({accept:'sortableitem',helperclass:'sorthelper',activeclass:'sortableactive',hoverclass:'sortablehover',opacity:0.8,fx:200,axis:'vertically',revert:true});});$("#add-milestone-dialog").dialog({bgiframe:true,autoOpen:false,height:200,modal:true,buttons:{'Add Milestone':function(){var bValid=true;$("label[for='milestone']").removeClass("invalid");bValid=bValid&&$("input#milestone").val()!="";if(bValid){$("#milestones").append('<li id="'+mID+'">'+$("#milestone").val()+'</li>');$("#quoteTable tbody tr#table-separator").before('<tr id="mtr-'+mID+'"><td colspan="6" class="milestone">'+$("#milestone").val()+'</td></tr>');$("#quoteTable tbody tr#table-separator").before('<tr class="sub-'+mID+'"><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td class="auto"> - </td><td class="auto"> - </td></tr>');$("#forMilestone").append('<option value="'+mID+'">'+$("#milestone").val()+'</option>');$("#milestone").val("");$(this).dialog("close");mID+=1;}else{$("label[for='milestone']").addClass("invalid");$("input#milestone").focus();}},Cancel:function(){$("#milestone").val("");$(this).dialog("close");}},close:function(){$("label[for='milestone']").removeClass("invalid");}});$("ul#milestones li").livequery(function(){$(this).dblclick(function(){var text=$(this).text();$(this).html('<input type="text" style="border: 0px;" value="'+text+'" />');var currID=$(this).attr("id");$(this).find("input").blur(function(){var text=$(this).val();$(this).parent("li").html("").text(text);$("#quoteTable tr['id=mtr-' + currID] td").text(text);});});});$("#add-task-dialog").dialog({bgiframe:true,autoOpen:false,height:400,modal:true,buttons:{'Add Task':function(){var bValid=true;$("label[for='task']").removeClass("invalid");var mID=$("#forMilestone").val();if(mID==""){bValid=false;}
bValid=bValid&&$("input#task").val()!="";if(bValid){var taskName=$("#task").val();var bestHr=parseInt($("#bestHr").val());var bestMin=parseFloat($("#bestMin").val());var worstHr=parseInt($("#worstHr").val());var worstMin=parseFloat($("#worstMin").val());var Ps=parseInt($("#ps").val());var hourlyRate=parseFloat($("input[name='hourly_rate']").val());var Pf=1-(Ps/100);var bestTime=bestHr+(bestMin/60);var bestTime=roundNumber(bestTime);var worstTime=worstHr+(worstMin/60);var worstTime=roundNumber(worstTime);var estTime=roundNumber((bestTime*(Ps/100))+(worstTime*Pf));var subTotal=roundNumber(estTime*hourlyRate);$("tr.sub-"+mID).before("<tr class=\"task\"><td style=\"text-align: left;\">"+taskName+"</td><td>"+bestTime+"</td><td>"+worstTime+"</td><td>"+Ps+"%</td><td>"+estTime+"</td><td>$"+subTotal+"</td></tr>");updateTotals(mID);$("#task").val("");$("#bestHr").val("");$("#bestMin").val("");$("#worstHr").val("");$("#worstMin").val("");$("#ps").val("");$("#forMilestone").val("");$(this).dialog("close");}else{$("label[for='task']").addClass("invalid");$("#task").val("");$("#bestHr").val("");$("#bestMin").val("");$("#worstHr").val("");$("#worstMin").val("");$("#ps").val("");$("#forMilestone").val("");$("input#task").focus();}},Cancel:function(){$("#task").val("");$("#bestHr").val("");$("#bestMin").val("");$("#worstHr").val("");$("#worstMin").val("");$("#ps").val("");$("#forMilestone").val("");$(this).dialog("close");}},close:function(){$("label[for='task']").removeClass("invalid");}});$("#add-milestone, #add-task").click(function(){var el=$(this).attr("id")+"-dialog";$("#"+el).dialog("open");return false;}).hover(function(){$(this).addClass("ui-state-hover");},function(){$(this).removeClass("ui-state-hover");}).mousedown(function(){$(this).addClass("ui-state-active");}).mouseup(function(){$(this).removeClass("ui-state-active");});});