function Record( name , value )
{
    this.name = name;
    this.value = value;
}

function BaseRate( name , v_natural , v_legal , calcClass , Kt )
{
    this.name = name;
    this.v_natural = v_natural;
	this.v_legal = v_legal;
    this.calcClass = calcClass;
    this.Kt = Kt;
}

function CityRate(name, kt1, kt2) {
  this.city = name;
  this.kt1 = kt1;
  this.kt2 = kt2;
}

function Factor( name )
{
   this.name = name;
   this.value = 1;
   this.enabled = true;
   this.used = true;
   this.process = process;
   function process()
   {
		//at first taking value from input
		if( get( this.name ) != null )  this.value = get( this.name ).value;
		//processing this factor
		eval( "process_" + this.name + "()" );
		//enable/disable factor input field
		if( get( this.name ) != null )  get( this.name ).disabled = !this.enabled;
		
		if (this.name == 'Tb') {
			if( this.used ){
				get( "l_" + this.name ).innerHTML = this.value;
			}
		}
		//changing corresponding label 
		/*if( this.used )
		{
			get( "l_" + this.name ).innerHTML = this.value;
		}
		else
		{
			get( "l_" + this.name ).innerHTML = "не используется";
			this.value = 1.0;
		}*/
   }
}

function setSelectContents( selectObj ,  aRecord , startingWith )
{
		try
		{
			selectObj.innerHTML = "";
			selectObj.disabled = false;
			if( startingWith != null )
			{
				var o = document.createElement( "OPTION" );
				o.value = "";
				o.innerHTML = startingWith;
				selectObj.appendChild( o );
			}
			for( i = 0; i < aRecord.length; i++ )
	        {
	            o = document.createElement( "OPTION" );
	            o.value = aRecord[i].value;
	            o.innerHTML = aRecord[i].name;
	            selectObj.appendChild( o );
	        }
		}
		catch(e){}		
}

function DriversOptionsStorage( storedDOSCount )
{
    this.driversCount = storedDOSCount;
    this.aKvs = new Array();
    this.storeDOS = storeDOS;
    this.applyDOS = applyDOS;
    function storeDOS()
    {
        for( i = 1; i <= this.driversCount; i++ ) this.aKvs[i] = get( "Kvs" + i ).selectedIndex;
    }
    function applyDOS()
    {
        for( i = 1; i <= this.driversCount; i++ ) get( "Kvs" + i ).selectedIndex = this.aKvs[i];
    }
    function enableDOS( b )
    {
    	for( i = 1; i <= this.driversCount; i++ ) get( "Kvs" + i ).disabled = b;
    }
}

function addDriver()
{
	var driversCount = get( "driversCount" ).value;
	var dos  = new DriversOptionsStorage( driversCount );
	dos.storeDOS();
	driversCount++;
	var addHTML =  "";
	for( i = 1; i <= driversCount; i++ ) addHTML +=  getDriverFragment( i );
	get( "driversPanel" ).innerHTML = addHTML;
	get( "driversCount" ).value = driversCount;
	get( "btnAddDriver" ).value = "Добавить водителя №" + ( driversCount + 1 );
	get( "btnRemoveDriver" ).disabled = false;
	dos.applyDOS();
	calculate();
}
function removeDriver()
{
	var driversCount = get( "driversCount" ).value;
	if( driversCount < 2 ) return;
	driversCount--;
	var dos = new DriversOptionsStorage( driversCount );
	dos.storeDOS();
	var addHTML = "";
	for( i = 1; i <= driversCount; i++ ) addHTML +=  getDriverFragment( i );
	get( "driversPanel" ).innerHTML = addHTML;
	get( "driversCount" ).value = driversCount;
	get( "btnAddDriver" ).value = "Добавить водителя №" + ( driversCount + 1 );
	if( driversCount < 2 ) get( "btnRemoveDriver" ).disabled = true;
	dos.applyDOS();
	get( "btnAddDriver" ).disabled = false;
	calculate();
}
function getDriverFragment( driverIndex )
{
	var fragment = driverFragment;
	while( fragment.indexOf( insertionPoint ) != -1 ) fragment = fragment.replace( insertionPoint , driverIndex );
	return fragment;
}

/* --------------------------------------------------------------------------------------------------------------------- */

function isTaxi()
{
	return ( baseRates[ get( "Tb" ).selectedIndex ].calcClass == 1 );
}

function isTrailer()
{
	return ( baseRates[ get( "Tb" ).selectedIndex ].calcClass == 3 );
}

function isLegalEntity()
{
	return ( get( "legal" ).checked );
}

function isOnRegistrationWay()
{
	return get( "on_registration_way" ).checked;
}

function isRegisteredAbroad()
{
	return get( "is_registered_abroad" ).checked;
}

function isOtherCountry()
{
    return ( isRegisteredAbroad() && get( "other_country" ).checked );
}

function isFriendlyCountry()
{
    return ( isRegisteredAbroad() && get( "friendly_country" ).checked );
}

function isBillionDrivers()
{
	return get( "Ko" ).checked;
}

function getDriversCount()
{
	return get( "driversCount" ).value;
}

function hasViolations()
{
	return get( "Kn" ).checked;
}

/* --------------------------------------------------------------------------------------------------------------------- */

function onRegistrationWay()
{
	get( "is_registered_abroad" ).disabled = isOnRegistrationWay();
	calculate();
}

function onRegisteredAbroad()
{
	//get( "reg_abroad" ).style.display = isRegisteredAbroad() ? "inline" : "none";
	get( "friendly_country" ).checked = false;
	get( "other_country" ).checked = isRegisteredAbroad();
	get( "on_registration_way" ).disabled = isRegisteredAbroad();
	setSelectContents( get( "Kp" ) , isRegisteredAbroad() ? Kps2 : Kps1 );
	calculate();
}


function isStupidIEVersion()
{
	var ver = "not_ie";
	var ua = navigator.userAgent;
	var MSIEOffset = ua.indexOf( "MSIE " );
	if( MSIEOffset != -1 ) 	ver = parseFloat( ua.substring( MSIEOffset + 5 , ua.indexOf( ";" , MSIEOffset ) ) );
	return ( !isNaN( ver ) && ver < 6.0 );
}

/* --------------------------------------------------------------------------------------------------------------------- */
var Tb = new Factor( "Tb" );
var Km = new Factor( "Km" );
var Kp = new Factor( "Kp" );
var Ks = new Factor( "Ks" );
var Kbm = new Factor( "Kbm" );
var Kt = new Factor( "Kt" );
var Kvs = new Factor( "Kvs" );
var Ko = new Factor( "Ko" );
var Kn = new Factor( "Kn" );

function process_Kbm_Description()
{
	if( getDriversCount() > 1 ) get( "Kbm_description" ).innerHTML = 
	"В поле «Класс» необходимо указывать минимальный класс среди всех лиц, допущенных к управлению транспортным средством<br/>";
	else get( "Kbm_description" ).innerHTML = "";
	if( isBillionDrivers() ) get( "Kbm_description" ).innerHTML = "В поле «Класс» необходимо указывать класс, определенный для собственника данного транспортного средства<br/>";	
	if( !Kbm.enabled ) get( "Kbm_description" ).innerHTML = "";
}

function process_Tb()
{
	Tb.value = isLegalEntity() ? baseRates[ get( "Tb" ).selectedIndex ].v_legal : baseRates[ get( "Tb" ).selectedIndex ].v_natural;
}
function process_Km()
{
	Km.enabled = isTaxi();
	Km.used = isTaxi();
}
function process_Kp()
{
	Kp.used =  isOnRegistrationWay() || isRegisteredAbroad();
	Kp.enabled = !isOnRegistrationWay();
	if( !isOnRegistrationWay() && !isRegisteredAbroad() ) Kp.enabled = false;
	get( "d_Kp" ).style.display = isOnRegistrationWay() ? "none" : "inline";
	get( "d_Kp_FAKE" ).style.display = isOnRegistrationWay() ? "inline" : "none";
	if( isOnRegistrationWay() ) Kp.value = 0.2;
}
function process_Ks()
{
	// Ks.used = !( isLegalEntity() || isOnRegistrationWay() || isRegisteredAbroad() ) ;
	Ks.used = !( isOnRegistrationWay() || isRegisteredAbroad() ) ;
	Ks.enabled = Ks.used;
	var getks = get("Ks");
  var ind = !isNaN(getks.selectedIndex) ? getks.selectedIndex : getks.options.length-1;
  var len = getks.options.length;
  source = isLegalEntity() ? get("KsLegal") : get("KsOwner");
  if (getks.options.length!=source.options.length) {
    getks.options.length = 0;
    getks.innerHTML = "";
    while(getks.firstChild) getks.removeNode(getks.firstChild);
    var opt;
    for (var i=0, l=source.options.length; i<l; i++) {
      opt = document.createElement("option");
      opt.value = source.options[i].value;
      opt.text = opt.innerHTML = source.options[i].text;
      getks.appendChild(opt);
    }
    getks.options.length = l;
    var newInd = ind - (len - getks.options.length);
    if (newInd<0) newInd = 0;
    if (navigator.userAgent.indexOf("MSIE")>-1 || navigator.userAgent.indexOf("Opera")>-1) {
      // window.setTimeout( function() { get("Ks").options[newInd].selected = true; }, 1 );
      window.setTimeout( function() { get("Ks").options[get("Ks").options.length-1].selected = true; }, 1 );
    } else {
      get("Ks").options[get("Ks").options.length-1].selected = true;
    }
  }
}
function process_Kbm()
{
	Kbm.enabled = !( isTrailer() || isRegisteredAbroad() || isOnRegistrationWay() );
	Kbm.used = !( isTrailer() || isOnRegistrationWay() );
	if( isRegisteredAbroad() ) Kbm.value = "1.0";
	process_Kbm_Description();
}
function process_Kt()
{
	if (typeof(process_Kt_element) == "function") {
		process_Kt_element(); // в шаблоне Calc-new
		return;
	}
	Kt.enabled = !( isOnRegistrationWay() || isRegisteredAbroad() );
	Kt.used = !isOnRegistrationWay();
	
	var Kt_value;
    Kt_value = baseRates[ get( "Tb" ).selectedIndex ].Kt;
    Kt.value = ( Kt_value == 1 ) ? get( "Kt1" ).value : get( "Kt2" ).value;
	if( isRegisteredAbroad() )
	{
		Kt.value = isOtherCountry() ? "2.0" : "1.0";
	}
	get( "region" ).disabled = !Kt.enabled;
}
function process_Kvs()
{
	if (typeof(process_Kvs_element) == "function") {
		process_Kvs_element(); // в шаблоне Calc-new
		return;
	}
	Kvs.enabled = !( isRegisteredAbroad() || isTrailer() || isLegalEntity() || isBillionDrivers() );
	Kvs.used = !( isLegalEntity() || isTrailer() );
	if( isRegisteredAbroad() )
	{
		if( isLegalEntity() ) Kvs.value = "1.0";
		else Kvs.value = "1.3";
		if( !isOtherCountry() ) Kvs.value = "1.0";
	}
	else
	{
		var kMax = 0;
		for( i = 1; i <= getDriversCount(); i++ )
		{
		    var k = new Number( get( "Kvs" + i ).value );
			if( !isNaN( k ) ) kMax = Math.max( kMax , k );
		}
		if( kMax != 0 && kMax != 1 ) Kvs.value = parseFloat( kMax , 2 );
		else if( kMax == 1 ) Kvs.value = "1.0";
		else Kvs.value= "не указан";		
		if( isBillionDrivers() ) Kvs.value = "1.0";
	}
	for( i = 1; i <= getDriversCount(); i++ ) get( "Kvs" + i ).disabled = !Kvs.enabled;
	get( "btnAddDriver" ).disabled = !Kvs.enabled;
	get( "btnRemoveDriver" ).disabled = !Kvs.enabled;
	if( getDriversCount() == 1 ) get( "btnRemoveDriver" ).disabled = true;
}
var Ko_auto = false;
function process_Ko()
{
	if (typeof(process_Ko_element) == "function") {
		process_Ko_element(); // в шаблоне Calc-new
		return;
	}
	Ko.enabled = !( isTrailer() || isRegisteredAbroad() || isLegalEntity() );
	Ko.used = !( isTrailer() );
	if( isLegalEntity() && !isFriendlyCountry() ) 
	{
		Ko.value = "1.5";
		if( !isBillionDrivers() )
		{
			Ko_auto = true;
			get( "Ko" ).checked = true;
			//alert( "auto" );
		}
	}
	else
	{
		if( Ko_auto ) 
		{
			get( "Ko" ).checked = false;
			Ko_auto = false;
		}
		if( !Ko.enabled ) get( "Ko" ).checked = false;
	}
	Ko.value = ( isBillionDrivers() && !isFriendlyCountry() ) ? "1.5" : "1.0";
	get( "Ko" ).disabled = !Ko.enabled;
	process_Kbm_Description();
}
function process_Kn()
{
	Kn.value = hasViolations() ? "1.5" : "1.0";
	var iKp = get( "Kp" );
	var iKbm = get( "Kbm" );
	Kn.enabled = ( !isTrailer() && !isOnRegistrationWay() && ( iKp.selectedIndex == ( iKp.options.length - 1 ) ) && ( iKbm.selectedIndex > 0 ) );
	Kn.used = Kn.enabled;
	if( !Kn.enabled ) get( "Kn" ).checked = false;
	get( "Kn" ).disabled = !Kn.enabled;
}
function performCity(index) {
  if (index) {
    get( "Kt1" ).value = cities[index - 1].kt1; 
    get( "Kt2" ).value = cities[index - 1].kt2; 
  }
  else {
    get( "Kt1" ).value = "не выбрано"; 
    get( "Kt2" ).value = "не выбрано"; 
  }
  calculate();
}

/* --------------------------------------------------------------------------------------------------------------------- */
function precalculate()
{
	Tb.process();
	Km.process();
	Kp.process();
	Ks.process();
	Kbm.process();
	Kt.process();
	Ko.process();
	Kvs.process();
	Kn.process();
}

function get( id )
{
    return document.getElementById( id );
}

function calculate()
{
	precalculate();
    var formula = "Tb.value*Km.value*Kp.value*Ks.value*Kbm.value*Kt.value*Kvs.value*Ko.value*Kn.value";
    if( !isNaN( eval( formula ) ) )
    {
        var out = eval( formula );
		try
		{
			out = out.toFixed( 2 );
		}
		catch( e )
		{
			
			var sOut = out + "";
			var dotPos = sOut.indexOf( "." );
			if( dotPos != -1 ) sOut = sOut.substring( 0 , dotPos + 2 );
			out = parseFloat( sOut );
		}

        if( ( out > eval( "Tb.value*Kt.value*3" ) ) && ( Kn.value == 1 ) )
		{
			out = eval( "3*Tb.value*Kt.value" );
		}
        if( ( out > eval( "Tb.value*Kt.value*5" ) ) && ( Kn.value == 1.5 ) )
		{
			out = eval( "5*Tb.value*Kt.value" );
		}
        get( "payment" ).innerHTML = out + " руб.";

        var arr = new Array();
		arr = formula.split( "*" );
		var values = "";
		for( i = 0; i < arr.length; i++ ) values += eval( arr[i] ) + "*";		 
		get( "formula" ).innerHTML = formula + " = " + values;
    }
    else
    {

        get( "formula" ).innerHTML = "<u>NaN</u>: " + formula;  
		get( "payment" ).innerHTML = "недостаточно данных";
    }
	return formula;
}

function printStuff()
{
    win = window.open( "calc_print.wbp","calcPrint",
	"width=800, height=670, resizeable=yes, scrollbars=no, toolbar=no, location=no, directories=no, status=yes, menubar=yes, copyhistory=no" );
}
