/////////////////////////////////////////////////////    
// Прототип cайта компании "Философт"
//
// М. Острогорский (misha@philosoft.ru)
//
// Калькулятор переводов
//
/////////////////////////////////////////////////////


// выбранный язык оригинала
var LAST_SOURCE = "en";

// выбранный язык перевода
var LAST_DESTINATION = "en";

// расценки
var RATES = load_rates();

// справочник режимов перевода
var MODES = new Array( "best", "good", "cheap", "fast", "shit" );

// текущий режим
var CURRENT_MODE = "good";


// Загружает скорости работы и расценки на перевод
function load_rates()
{
 var rates = new Array();
 
 // расценки. В коде, да. Мне стыдно :(
 
 // расценки на работу русского переводчика, р./ тыс. зн.
 rates.rate_russian = new Array();
 rates.rate_russian["en"] = 550;
 rates.rate_russian["sp"] = 550;
 rates.rate_russian["it"] = 550;
 rates.rate_russian["de"] = 550;
 rates.rate_russian["ru"] = 550;
 rates.rate_russian["fr"] = 550;
 
 // расценки на работу русского иностранного, р./ тыс. зн.
 rates.rate_native = new Array();
 rates.rate_native["en"] = 750;
 rates.rate_native["sp"] = 750;
 rates.rate_native["it"] = 750;
 rates.rate_native["de"] = 750;
 rates.rate_native["ru"] = 550;
 rates.rate_native["fr"] = 750;
 
 // во сколько раз редактирование дороже перевода
 rates.rate_editing_factor = 0.33;
 
 // ставка менеджера, р./час
 rates.rate_manager = 1500;
 
 // затраты времени менеджера на одного переводчика, ч./пер.
 rates.manager_per_translator_static = 0.5; // разово 
 rates.manager_per_translator_weekly = 0.5; // в неделю
 
 // наценки на тип документа
 rates.docstype_scale = new Array();
 rates.docstype_scale["techdocs"] = 1;
 rates.docstype_scale["learning"] = 1;
 rates.docstype_scale["legal"]    = 1.2;
 rates.docstype_scale["orgdocs"]  = 1;
 rates.docstype_scale["findocs"]  = 1.2;
 rates.docstype_scale["advs"]     = 1.2;
 rates.docstype_scale["other"]    = 1.1;
 
 // наценки на предметную область
 rates.branch_scale = new Array();
 rates.branch_scale["it"]       = 1;
 rates.branch_scale["hardware"] = 1;
 rates.branch_scale["telecom"]  = 1;
 rates.branch_scale["pm"]       = 1;
 rates.branch_scale["industry"] = 1.1;
 rates.branch_scale["builders"] = 1.2;
 rates.branch_scale["other"]    = 1.1;
 
 // наценки на формат
 rates.srcformat_scale = new Array();
 rates.srcformat_scale["paper"]    = 1.2;
 rates.srcformat_scale["text"]     = 1;
 rates.srcformat_scale["word"]     = 1;
 rates.srcformat_scale["rtf"]      = 1;
 rates.srcformat_scale["oo"]       = 1;
 rates.srcformat_scale["pdf"]      = 1;
 rates.srcformat_scale["fm"]       = 1;
 rates.srcformat_scale["html"]     = 1.1;
 rates.srcformat_scale["docbook"]  = 1;
 rates.srcformat_scale["dita"]     = 1;
 rates.srcformat_scale["xmlsgml"]  = 1;
 rates.srcformat_scale["tex"]      = 1.1;
 rates.srcformat_scale["other"]    = 1;
 
 // продуктивность переводчика, тыс. зн./раб. день
 rates.productivity = 10;
 
 // продуктивность редактора, тыс. зн./раб. день
 rates.editing_productivity = 30;
 
 // время на резмещения заказа, раб. дни
 rates.tstart  = 1;
 
 // время сборки с сдачи заказа, раб. дни
 rates.tfinish = 1;
 
 return rates;
}


// Возвращает расценки на перевод
function get_rates()
{
 return RATES;
}


// Сохранаяет текущее значение языка оригинала
function save_source()
{
 var source_select = document.getElementById( "source" );
 LAST_SOURCE = source_select.value;
}


// Сохраняет текущее значение языка перевода
function save_destination()
{
 var destination_select = document.getElementById( "destination" );
 LAST_DESTINATION = destination_select.value;
}


// Форматирует срок
function format_terms( terms, format )
{
 return terms ? terms : "";
}


// Форматирует число по шаблону ### ### ###
function format_price( price )
{

 if( price )
 {
  var s = "  " + Math.round( price );
 
  var g1 = "";
  var g2 = "";
  var g3 = "";
  var g4 = "";
 
  g1 = s.substr( s.length - 3, 3 );
  if( price > 999 ) g2 = s.substr( s.length - 6, 3 ) + " ";
  if( price > 999999 ) g3 = s.substr( s.length - 9, 3 ) + " ";
  if( price > 999999999 ) g4 = s.substr( s.length - 12, 3 ) + " ";
  
  s = g4 + g3 + g2 + g1;
  }
  else 
   s = "";
 
 return s; 
}


// Проверяет корректность заполнения поля "Объем"
function validate_charsize()
{
 var valid = true;
 
 var charsize_input = document.getElementById( "charsize" );
 
 var charsize = parseInt( charsize_input.value );  
 
 var errmsg = document.getElementById( "errmsg" );
 
 if( !charsize )
 {
  valid = false;
  errmsg.style.display = "none";
 }
 if( charsize <= 0 || charsize > 1000000 || ( charsize_input.value.length > 0 && !charsize ) )
 {
  errmsg.style.display = "";
  valid = false;
 }
 else
  errmsg.style.display = "none";
 
 return valid;
}


// Устанавливает режим
function set_mode( mode )
{
 CURRENT_MODE = mode;
}


// Возвращает выбранный режим
function get_current_mode()
{ 
 return CURRENT_MODE;
}


// Возвращает название нужного режима
function get_mode_title( mode )
{
 var span = document.getElementById( "mode_" + mode + "_label" );
 if( span )
  return span.innerHTML;
 else
  return "";
}


// Считывает из формы и возвращает заказ или выбранное предложение
function get_proposal()
{
 var proposal = new Array();
 
 // получаем элементы формы
 proposal.source_select      = document.getElementById( "source" );
 proposal.docstype_select    = document.getElementById( "docstype" );
 proposal.branch_select      = document.getElementById( "branch" );
 proposal.srcformat_select   = document.getElementById( "srcformat" );
 proposal.destination_select = document.getElementById( "destination" );
 proposal.charsize_input     = document.getElementById( "charsize" );
 proposal.trmode             = document.getElementById( "trmode" );
 proposal.ordertrans_button  = document.getElementById( "ordertrans" );
 
 // считываем из формы первичные данные
 proposal.source      = proposal.source_select.value;
 proposal.docstype    = proposal.docstype_select.value;
 proposal.branch      = proposal.branch_select.value;
 proposal.srcformat   = proposal.srcformat_select.value;
 proposal.destination = proposal.destination_select.value;
 proposal.charsize    = parseInt( proposal.charsize_input.value );  
 proposal.mode        = get_current_mode();
  
 // извлекаем сроки и цену
 proposal.terms_hidden = document.getElementById( "terms_" + proposal.mode );
 proposal.price_hidden = document.getElementById( "price_" + proposal.mode ); 
 if( proposal.terms_hidden && proposal.price_hidden )
 {
  proposal.terms = proposal.terms_hidden.value ? proposal.terms_hidden.value : 0;
  proposal.price = proposal.price_hidden.value ? proposal.price_hidden.value : 0;
 }
 else
 {
  proposal.terms = 0;
  proposal.price = 0;
 }
 
 return proposal;
}


// Выводит предложение в форму
function output_proposal( proposal, reset )
{
 // находим элементы на странице
 var terms_span   = document.getElementById( "terms_" + proposal.mode + "_span" );
 var price_span   = document.getElementById( "price_" + proposal.mode + "_span" );
 var terms_hidden = document.getElementById( "terms_" + proposal.mode );
 var price_hidden = document.getElementById( "price_" + proposal.mode );  
 
 if( !reset )
 {
  // выводим спаны
  terms_span.innerHTML  = format_terms( proposal.terms );
  price_span.innerHTML  = format_price( proposal.price );     
  terms_hidden.value    = proposal.terms;
  price_hidden.value    = proposal.price;
 }
 else
 {
  terms_span.innerHTML  = "&nbsp;";
  price_span.innerHTML  = "&nbsp;";  
  terms_hidden.value    = "";
  price_hidden.value    = "";
 }
 
}


// Очищает предложения в форме
function reset_output()
{
 var ordertrans_button  = document.getElementById( "ordertrans" );
  
 var proposal = new Array();
 
 for( i = 0; i < MODES.length; i++ )
 {  
  proposal.mode = MODES[i];
  output_proposal( proposal, true ); 
 } 
}


// Пакует предложение для отправки в симформу
function pack_current_proposal( prop )
{ 
 if( prop )
  var proposal = prop;
 else
  var proposal = get_proposal();
 
 // пакуем параметры заказа
 var source_option = document.getElementById( "source_" + proposal.source );
 var source_text_hidden = document.getElementById( "source_text" );
 source_text_hidden.value = source_option.innerHTML;
 
 var docstype_option = document.getElementById( "docstype_" + proposal.docstype );
 var docstype_text_hidden = document.getElementById( "docstype_text" );
 docstype_text_hidden.value = docstype_option.innerHTML;
 
 var branch_option = document.getElementById( "branch_" + proposal.branch );
 var branch_text_hidden = document.getElementById( "branch_text" );
 branch_text_hidden.value = branch_option.innerHTML;
 
 var srcformat_option = document.getElementById( "srcformat_" + proposal.srcformat );
 var srcformat_text_hidden = document.getElementById( "srcfileformat_text" );
 srcformat_text_hidden.value = srcformat_option.innerHTML;
 
 var destination_option = document.getElementById( "destination_" + proposal.destination );
 var destination_text_hidden = document.getElementById( "destination_text" );
 destination_text_hidden.value = destination_option.innerHTML;
 
 // пакуем режим
 var current_mode = get_current_mode(); 
 var mode_text_hidden = document.getElementById( "mode_text" );
 mode_text_hidden.value = get_mode_title( current_mode );
 
 // пакуем сроки
 var terms_hidden = document.getElementById( "terms_" + current_mode );
 var terms_text_hidden = document.getElementById( "terms_text" );
 terms_text_hidden.value = format_terms( terms_hidden.value );
 
 // пакуем цену
 var price_hidden = document.getElementById( "price_" + current_mode );
 var price_text_hidden = document.getElementById( "price_text" );
 price_text_hidden.value = format_price( price_hidden.value );
}


// Возвращает количество переводчиков
function count_translators( charsize, mode )
{
 var ct = 0;
 
 switch( mode )
 {  
  case "best":
  case "good":
  case "cheap":
   if( charsize <= 200 )   
    ct = 1;   
   else if ( charsize <= 500 )
    ct = 2; 
   else
    ct = 3;     
  break;
  case "fast":   
   if( charsize <= 50 )   
    ct = 1;    
   else if ( charsize <= 100 )
    ct = 2; 
   else if ( charsize <= 200 )
    ct = 4;  
   else if ( charsize <= 400 )
    ct = 6;   
   else if ( charsize <= 600 )
    ct = 8;   
   else
    ct = 10; 
  break;  
  case "shit":   
  
   ct = Math.ceil( charsize/30 );
   
   if( ct > 10 ) ct = 10;
      
 } 
 
 return ct;
}


// Возвращает предложение для заданного заказа и режима
function transcalc( order, rates, mode )
{
 order.mode  = mode;
 
 //
 // решаем, сколько и каких переводчиков у нас будет
 //
 
 // сколько
 number_of_translators = count_translators( order.charsize, mode );
 
 // каких
 switch( mode )
 {  
  case "best":     
   translators_rate = rates.rate_native[order.destination];
   editors_rate     = rates.rate_native[order.destination];   
   managers_rate    = 0;
  break;
  case "good":       
   if( number_of_translators == 1 )   
   {
    translators_rate = rates.rate_native[order.destination];
    editors_rate     = 0;
   } 
   else
   {
    translators_rate = rates.rate_russian[order.destination];
    editors_rate     = rates.rate_native[order.destination];   
   }                 
   managers_rate = 0;
  break;
  case "cheap":
   if( number_of_translators == 1 )   
   {
    translators_rate = rates.rate_russian[order.destination];
    editors_rate     = 0;
   } 
   else
   {
    translators_rate = rates.rate_russian[order.destination];
    editors_rate     = rates.rate_russian[order.destination];   
   }                 
   managers_rate = 0;
  break;
  case "fast":    
   if( number_of_translators == 1 )   
   {
    translators_rate = rates.rate_native[order.destination];
    editors_rate     = 0;
   } 
   else
   {    
    translators_rate = rates.rate_russian[order.destination];
    editors_rate     = rates.rate_native[order.destination];   
    managers_rate    = rates.rate_manager;
   }       
  break;
  case "shit":   
   translators_rate = rates.rate_russian[order.destination];
   editors_rate     = 0;
   managers_rate    = rates.rate_manager;
  break;
  default:
   translators_rate = rates.rate_russian[order.destination];
   editors_rate     = rates.rate_native[order.destination];  
   managers_rate    = rates.rate_manager;
 }
 
 // объем редактирования
 editors_charsize = number_of_translators == 1 ? order.charsize : order.charsize * ( number_of_translators - 1 )/number_of_translators;
 
 //
 // считаем срок
 //
 
 // человеко-дни перевода
 translators_days_total = Math.round( order.charsize/rates.productivity );

 // срок перевода
 terms_of_translation = Math.round( translators_days_total/number_of_translators );
 
 // срок редактирования
 terms_of_editing = editors_rate ? Math.ceil( editors_charsize/rates.editing_productivity ) : 0;
 
 // срок работы
 order.terms =  rates.tstart 
              + terms_of_translation 
              + terms_of_editing 
              + rates.tfinish;
  
 //
 // считаем стоимость
 //
 
 // стоимость перевода
 price_of_translation = order.charsize * translators_rate;
 
 // корректируем ставку редактора
 editors_rate *= rates.rate_editing_factor;
 
 // стоимость редактирования
 price_of_editing = editors_charsize * editors_rate;
 
 // перевод + редактирование
 price_of_text = price_of_translation + price_of_editing;
 
 // стоимость менеджмента
 price_of_management = number_of_translators 
                       * ( rates.manager_per_translator_static 
                          + rates.manager_per_translator_static 
                           * Math.round( order.terms / 5 ) ) * managers_rate;
                           
 // стоимость работы
 order.price = price_of_text
               * rates.docstype_scale[order.docstype] 
               * rates.branch_scale[order.branch] 
               * rates.srcformat_scale[order.srcformat]
               + price_of_management;
  
 return order;
}


// Выполняет расчет и выводит результаты
function process_transcalc( changesmaker )
{ 
 var order = get_proposal();

 // подавляем недопустимые языковые пары
 var source_select      = document.getElementById( "source" ); 
 var destination_select = document.getElementById( "destination" );
 
 if( order.source != "ru" && changesmaker == "source" )
 {
  destination_select.value = "ru";
  order.destination = "ru";  
 } 
 else if( order.destination != "ru" && changesmaker == "destination" )
 {
  source_select.value = "ru";
  order.source = "ru";
 }
 else if( order.source == "ru" && order.destination == "ru" && changesmaker == "source" )
 {
  destination_select.value = LAST_SOURCE;
  order.destination = LAST_SOURCE;
 }
 else if( order.source == "ru" && order.destination == "ru" && changesmaker == "destination" )
 {
  source_select.value = LAST_DESTINATION;
  order.source = LAST_DESTINATION;
 }
 
 // если введен корректный объем 
 if( validate_charsize() )
 {
  // рассчитываем заказ для разных режимов
  
  // берем расценки
  var rates = get_rates();
  
  // массив вариантов
  var proposals = new Array();
  
  // собственно расчет и вывод результатов
  for( i = 0; i < MODES.length; i++ )
  {
   proposals[i] = transcalc( order, rates, MODES[i] );
   output_proposal( proposals[i] );
  } 
        
 }
 else 
  reset_output();  
 
 pack_current_proposal( order );    
 
}

