view.container.css('overflow', 'auto')
const getModelWithId = id => model.playerModel.getModelWithId(id)
const tableComponents = model.asfProperty.layout.components
const kfDiscontCompIds = []
const playbackPeriodsCompIds = []
const cumulativeTotalCompIds = []
const costOfStreamsCompIds = []
const doCalculation = index => {
const kf_discont = getModelWithId(kfDiscontCompIds[index]).getValue()
const year = getModelWithId(yearCompIds[index]).getValue()
const result_field = getModelWithId(resultCompIds[index])
if (kf_discont && year) {
const result = Math.pow((1 / (1 + (kf_discont / 100))), year)
result_field.setValue(String(result))
const calculatePlaybackPeriod2015 = () => {
const playbackPeriod2015 = getModelWithId(playbackPeriodsCompIds[0])
const totalPlaybackPeriod = getModelWithId('total_payback_period').getValue()
const playbackPeriodsValues = []
playbackPeriodsCompIds.forEach((item, index) => {
const value = getModelWithId(item).getValue()
value && playbackPeriodsValues.push(value)
const sumFrom2016To2030 = playbackPeriodsValues.reduce((sum, elem) => {
const e = Number(elem) ? Number(elem) : 0
playbackPeriod2015.setValue(String(sumFrom2016To2030 ? sumFrom2016To2030 : (totalPlaybackPeriod ? totalPlaybackPeriod : '')))
const calculatePlaybackPeriodFrom2016To2030 = index => {
let currentConstOfStreams = getModelWithId(costOfStreamsCompIds[index]).getValue()
let prevCumulativeTotal = getModelWithId(cumulativeTotalCompIds[index - 1]).getValue()
let currentCumulativeTotal = getModelWithId(cumulativeTotalCompIds[index]).getValue()
let playbackPeriodModel = getModelWithId(playbackPeriodsCompIds[index])
if (!currentConstOfStreams || !prevCumulativeTotal || !currentCumulativeTotal || !playbackPeriodModel) return
currentConstOfStreams = Number(currentConstOfStreams) ? Number(currentConstOfStreams) : 0
prevCumulativeTotal = Number(prevCumulativeTotal) ?Number(prevCumulativeTotal) : 0
currentCumulativeTotal = Number(currentCumulativeTotal) ? Number(currentCumulativeTotal) : 0
const isTrue = (Math.abs(prevCumulativeTotal) + Math.abs(currentConstOfStreams)) > Math.abs(prevCumulativeTotal + currentConstOfStreams)
playbackPeriodModel.setValue(String(isTrue && currentConstOfStreams > 0 ? (index + Math.abs(prevCumulativeTotal / currentConstOfStreams)) : ''))
tableComponents.forEach(i => {
const column = i['column']
const isRequiredColumn = column > 0 && column <= 16
if (!isRequiredColumn) return
case 0: return kfDiscontCompIds.push(id)
case 2: return yearCompIds.push(id)
case 17: return resultCompIds.push(id)
case 21: return costOfStreamsCompIds.push(id)
case 22: return cumulativeTotalCompIds.push(id)
case 23: return playbackPeriodsCompIds.push(id)
kfDiscontCompIds.forEach((item, index) => {
const kfDiscontModel = getModelWithId(item)
const yearModel = getModelWithId(yearCompIds[index])
kfDiscontModel.on('valueChange', () => doCalculation(index))
yearModel.on('valueChange', () => doCalculation(index))
const playbackModel = getModelWithId(playbackPeriodsCompIds[index])
const currentConstOfStreamsModel = getModelWithId(costOfStreamsCompIds[index])
const prevCumulativeTotalModel = getModelWithId(cumulativeTotalCompIds[index - 1])
const currentCumulativeTotalModel = getModelWithId(cumulativeTotalCompIds[index])
playbackModel.on('valueChange', () => calculatePlaybackPeriod2015())
currentConstOfStreamsModel.on('valueChange', () => calculatePlaybackPeriodFrom2016To2030(index))
prevCumulativeTotalModel.on('valueChange', () => calculatePlaybackPeriodFrom2016To2030(index))
currentCumulativeTotalModel.on('valueChange', () => calculatePlaybackPeriodFrom2016To2030(index))
const total = getModelWithId('total_payback_period')
total.on('valueChange', () => calculatePlaybackPeriod2015())