﻿/** CLEARCHANNEL CINEMA **/

(function($) {

	$(function() { //domready

		var calculator = $('#campaign-calculator');
  
		calculator.find('.selectbox').each(function(index, element) {
			var h2 = $(element).children('h2');
			var ul = $(element).children('ul');
			var originalText = h2.text();
    
			h2.click(function() {
				var pos = $(element).position();
      
				if(!ul.disabled) {
					ul.css({
						top: pos.top + $(element).outerHeight(),
						left: pos.left
					});
        
					calculator.find('.selectbox').removeClass('open');
					$(element).addClass('open');
				}
			});

			var hider;
    
			$(element).mouseenter(function() {
				window.clearTimeout(hider);
			}).mouseleave(function() {
				hider = window.setTimeout(function() {
					$(element).removeClass('open');
				}, 500);
			});

			ul.children().click(function(e) {
				var target = e.target;
				var text = $(target).text();
				if (h2.hasClass('retain-right')) text += ' ' + originalText;
				if (h2.hasClass('retain-left')) text = originalText + ' ' + text;
				h2.text(text);
				$(element).removeClass('open').addClass('done');
				$(this).find('.selected').removeClass('selected');
				$(target).addClass('selected');
			});

		});

		calculator.find('.checkbox').each(function(index, checkbox) {
			if($(checkbox).hasClass('weekbox')) {
				$(checkbox).find('select').change(function() {
					updateOffscreen();
				});
			} else {
				$(checkbox).find('.button').click(function() {
					if(calculator.find('.done').length >= 5) {
						$(this).toggleClass('active');
						$(this).parent().toggleClass('checked');
						updateOffscreen();
					}
				});
			}
    
			var htext = offscreen[$(checkbox).attr('rel')].hover;
    
			if(htext.length > 0) {
				$(checkbox).mouseenter(function() {
					this.hover = $('<div/>', {'id': 'campaign-calculator-hover'}).appendTo('body');
					this.hover.css('opacity', 0).animate({opacity: 1});
					this.hover.html(htext);
				}).mousemove(function(e) {
					if(this.hover) {
						this.hover.css({
							left: e.pageX,
							top: e.pageY
						});
					}
				}).mouseleave(function() {
					if(this.hover) {
						this.hover.remove();
						this.hover = false; 
					}
				});
			}
		});

		calculator.find('.selectbox ul li').click(function() {
			if(calculator.find('.done').length == 5) {
				calculatePrice();
				var type = '', typeEl, typeMap;
				typeEl = $('#medialaskuri-type').find('li.selected');
				if (typeEl) {
					type = typeEl.attr('rel').toLowerCase();
					typeMap = {
						miehet: 'men',
						naiset: 'women'
					};
					if (typeMap[type]) type = typeMap[type];
				}
      
				$.get('/ajax/premiere-ajax', 
					{
						start: parseInt($('#medialaskuri-start li.selected').text(), 10), 
						end: (parseInt($('#medialaskuri-start li.selected').text(), 10) + parseInt($('#medialaskuri-weeks li.selected').text(),10)) % 52,
						type: type
					}, 
					function(data) {
						$('#ensi-ilta').html(data);
				});
			}
		});

		calculator.find('input.alennus').change(function() {
			this.value = Math.max(0, Math.min(parseFloat(this.value.replace(',', '.')), 100));
			updateTotal();
		});
  
		$('#medialaskuri-type li').click(function() {
			var val = $(this).text().trim();
			switch (val) {
				case '2D & 3D':
				case '3D':
					$('#medialaskuri-area li').removeClass('selected').each(function(index, li) {
						if($(li).text().trim() == 'Koko maa') {
							$(li).addClass('selected');
						}
					});
					//$('#medialaskuri-area li').value = 'Koko maa';
					$('#medialaskuri-area').parent().addClass('done').find('h2').text('Koko maa');
					$('#medialaskuri-area').disabled = true;
	      
					if(calculator.find('.done').length == 5) {
						calculatePrice();
					}
					if (val == '3D') {
						$('#aulakanava').removeClass('checked').addClass('disabled').children('.button').removeClass('active');
					} else {
						$('#aulakanava').removeClass('disabled');
					}
					break;
				case 'FAMILY':
				default:
					$('#medialaskuri-area').disabled = false;
					$('#aulakanava').removeClass('disabled');
					break;
			}
			updateOffscreen();
		});

		calculator.find('input.send').click(function() {
			if(calculator.find('input.email').val().indexOf('@') == -1) {
				alert('Sinun on annettava sähköpostiosoite lähettääksesi laskelman.');
				return(false);
			}
			function strip(numeric) {
				return String(numeric).replace(/[^0-9 ,]/g, '');
			}
    
			var data = {
				'target':   $('#medialaskuri-type').prev('h2').text(),
				'email':    calculator.find('input.email').val(),
				'area':     $('#medialaskuri-area').prev('h2').text(),
				'length':   $('#medialaskuri-length').prev('h2').text(),
				'start':    $('#medialaskuri-start').prev('h2').text(),
				'weeks':    $('#medialaskuri-weeks').prev('h2').text(),
				'duration':    $('#duration').text(),
				'valkokangas_hinta': strip($('#valkokangas-hinta').text()),
				'valkokangas_kontaktiennuste': $('#valkokangas-kontaktiennuste').text(),
				'valkokangas_jalkituotanto': strip($('#valkokangas-jalkituotanto').text()),
				'offscreen_aulakanava': strip($('#aulakanava-hinta').text()),
				'offscreen_netti': strip($('#netti-hinta').text()),
				'offscreen_hinta': strip($('#offscreen-hinta').text()),
				'offscreen_kontaktiennuste': $('#offscreen-kontaktiennuste').text(),
				'offscreen_jalkituotanto': strip($('#offscreen-jalkituotanto').text()),
				'preshowa': strip($('#preshowa-hinta').text()),
				'preshowb': strip($('#preshowb-hinta').text()),
				'alennus1': $('#alennus1').val(),
				'alennus2': $('#alennus2').val(),
				'netto_hinta': strip($('#netto-hinta').text()),
				'netto_kontaktiennuste': $('#netto-kontaktiennuste').text(),
				'netto_jalkituotanto': strip($('#netto-jalkituotanto').text()),
				'bruttohinta': formatNumber(bruttohinta),
				'ensi_ilta': $('#ensi-ilta').text()
			};
			$.post('/cinema/kampanjalaskuri/kampanjalaskuri-email?mail_sendnow=1', data, function() {
				alert('Suunnitelma lähetetty sähköpostiisi.');
			}); 
		});


	}); //domready


	var medialaskuri_totals = {
		valkokangas: {
			hinta: 0,
			kontaktiennuste: 0,
			jalkituotanto: 0
		},
		offscreen: {
			hinta: 0,
			kontaktiennuste: 0,
			jalkituotanto: 0
		},
		netto: {
			hinta: 0,
			kontaktiennuste: 0,
			jalkituotanto: 0,
			cpt: 0
		},
		mainoselokuva: {
			hinta: 0,
			kontaktiennuste: 0,
			jalkituotanto: 0
		}
	};

	function formatNumber(num, numDecimals) {
		if (isNaN(num)) return num;
		if (isNaN(numDecimals)) numDecimals = 2;
		var intPart = Math.floor(num);
		var floatPart = num - intPart;
		var decimalString = String(Math.round(floatPart * Math.pow(10, numDecimals)));
		var intString = String(intPart);
		var groups = [];
		for (i = intString.length; i >= 0; ) {
			groups.unshift(intString.substring(Math.max(0, i -= 3), i + 3));
		}
		while (decimalString.length < numDecimals) decimalString = '0' + decimalString;
		return groups.join(' ') + (numDecimals > 0 ? ',' + decimalString : '');
	}

	function calculatePrice() {
		// Kohderyhmä
console.log('calculatePrice called');
		var type_el = $('#medialaskuri-type li.selected');
		var real_type = type_el.attr('rel').trim();
		var type = real_type.replace(/^.+,/, '');
		// avoid a firefox bug with .{0}. Don't ask, it's really weird.
		var type_i = parseInt(type_el.attr('id').replace(/type(?:\d+.{0}-remap)?/, ''),10);
		var total_type_i = parseInt($('#medialaskuri-type li[rel=total]').attr('id').replace('type', ''),10);
  
		// CPT:n laskeminen kampanjan kestosta
		var cpt_values = $('#medialaskuri-weeks li.selected').attr('rel').split(';');
		var cpt = parseInt(cpt_values[type_i],10);
		var total_cpt = parseInt(cpt_values[total_type_i],10);
  
		// Aluealennus
		var area = $('#medialaskuri-area li.selected').text();
		if(area.trim() == 'Koko maa') {
			area = 1;
		} else {
			area = 1.15;
		}
  
		// Mainospätkän pituus
		var spot_length_index = $('#medialaskuri-length li.selected').attr('rel');
		spot_length_index = parseFloat(spot_length_index.split(';')[type_i]);
  
		// Superboard-alennus
		var superboard_discount = 1;
  
		// Katsojaennusteen laskeminen
		var start = parseInt($('#medialaskuri-start li.selected').text(),10);
		var length = parseInt($('#medialaskuri-weeks').text(),10);
  
		// Lasketaan valittu kontaktiennuste
		var admissions = 0;
		var total_admissions = 0;
  
		for(i = start; i < start+length; i++) {
			var e = i;
			if(i > 52) {
				e = i % 52;
 			}
    
			if(type == 'total') {
				admissions += parseInt(katsojamaarat[e][type],10);
			} else {
				admissions += parseInt(katsojamaarat[e]['total'],10) * katsojamaarat[e][type];
			}
    
			// Lasketaan myös total-valinnan mukainen kontaktiennuste
			total_admissions += parseInt(katsojamaarat[e]['total'],10);
		}
  
		var areadata = $('#medialaskuri-area li.selected').attr('rel').split(';');
  
		// Aluekerroin mukaan katsojaennusteeseen
		admissions *= parseFloat(areadata[0]);
		admissions = Math.round(admissions);
  
		total_admissions *= parseFloat(areadata[0]);
		total_admissions = Math.round(total_admissions);
  
		var tuotantokustannus_per_sekunti = (type == '3d') ? 54 : 42;
  
		// Jälkituotanto
		// note: might get modified later on
		var jalkituotanto = 170 + (parseInt($('#medialaskuri-length li.selected').text(),10) * tuotantokustannus_per_sekunti);
  
		// Laskulogiikka
		var result = {};

		if (type == real_type || real_type.indexOf('total') == -1) {
			result.price = Math.round(((cpt / 1000) * admissions * spot_length_index * area * superboard_discount * parseFloat(areadata[1])),2);
			result.total_price = Math.round(((total_cpt / 1000) * total_admissions * spot_length_index * area * superboard_discount * parseFloat(areadata[1])),2);
			result.cpt   = Math.round(((result.price / admissions) * 1000),2);
    
			// Näytetään tulos yhteenvedon valkokangas-osiossa
			medialaskuri_totals.valkokangas.hinta = result.price;
			medialaskuri_totals.valkokangas.jalkituotanto = jalkituotanto;
			medialaskuri_totals.valkokangas.kontaktiennuste = admissions;

			medialaskuri_totals.mainoselokuva.hinta = result.price / superboard_discount;
			medialaskuri_totals.mainoselokuva.total_hinta = result.total_price / superboard_discount;
			medialaskuri_totals.mainoselokuva.kontaktiennuste = admissions;

			medialaskuri_totals.valkokangas.total_kontaktiennuste = total_admissions;
			medialaskuri_totals.mainoselokuva.total_kontaktiennuste = total_admissions;
    
			$('#valkokangas-hinta').html(formatNumber(result.price)+'<span>&euro;</span>');
			$('#valkokangas-kontaktiennuste').html(formatNumber(admissions, 0));
			$('#valkokangas-jalkituotanto').html(formatNumber(jalkituotanto)+'<span>&euro;</span>');
		} else {
			result.price = Math.round(((cpt / 1000) * admissions * spot_length_index * area * superboard_discount * parseFloat(areadata[1])),2);
			result.total_price = Math.round(((total_cpt / 1000) * (total_admissions - admissions) * spot_length_index * area * superboard_discount * parseFloat(areadata[1])),2);
			result.price += result.total_price;
			result.cpt   = Math.round(((result.price / total_admissions) * 1000),2);
    
			jalkituotanto += 170 + parseInt($('#medialaskuri-length li.selected').text(),10) * 42;
    
			// Näytetään tulos yhteenvedon valkokangas-osiossa
			medialaskuri_totals.valkokangas.hinta = result.price;
			medialaskuri_totals.valkokangas.jalkituotanto = jalkituotanto;
			medialaskuri_totals.valkokangas.kontaktiennuste = total_admissions;
    
			medialaskuri_totals.mainoselokuva.hinta = result.price / superboard_discount;
			medialaskuri_totals.mainoselokuva.total_hinta = result.total_price / superboard_discount;
			medialaskuri_totals.mainoselokuva.kontaktiennuste = total_admissions;
    
			medialaskuri_totals.valkokangas.total_kontaktiennuste = total_admissions;
			medialaskuri_totals.mainoselokuva.total_kontaktiennuste = total_admissions;
    
			$('#valkokangas-hinta').html(formatNumber(result.price)+'<span>&euro;</span>');
			$('#valkokangas-kontaktiennuste').html(formatNumber(total_admissions - admissions, 0) + ' + ' + formatNumber(admissions, 0));
			$('#valkokangas-jalkituotanto').html(formatNumber(jalkituotanto)+'<span>&euro;</span>');
		}
  
		updateOffscreen();
		updateTotal();
	}

	var bruttohinta;

	function updateTotal() {
		// Nettohinta = Valkokankaan hinta + Offscreenin hinta
		medialaskuri_totals.netto.hinta = medialaskuri_totals.valkokangas.hinta + medialaskuri_totals.offscreen.hinta;
  
		// Lasketaan alennukset nettohintaan
		var alennus1 = 1 - parseFloat($('#alennus1').val()) / 100;
		var alennus2 = 1 - parseFloat($('#alennus2').val()) / 100;
  
		bruttohinta = medialaskuri_totals.netto.hinta;
  
		medialaskuri_totals.netto.hinta *= alennus1 * alennus2;
		medialaskuri_totals.netto.hinta = Math.round(medialaskuri_totals.netto.hinta, 2);
  
		// Lasketaan nettokontaktiennuste (valkokangas + offscreen)
		medialaskuri_totals.netto.kontaktiennuste = medialaskuri_totals.valkokangas.kontaktiennuste + medialaskuri_totals.offscreen.kontaktiennuste;
  
		medialaskuri_totals.netto.cpt = Math.round(((medialaskuri_totals.netto.hinta / medialaskuri_totals.netto.kontaktiennuste) * 1000), 2);
  
		// Jälkituotanto
		medialaskuri_totals.netto.jalkituotanto = medialaskuri_totals.valkokangas.jalkituotanto + medialaskuri_totals.offscreen.jalkituotanto;
  
		// Tiedot näkyviin
		$('#netto-hinta').html(formatNumber(medialaskuri_totals.netto.hinta)+'<span>&euro;</span>');
		$('#netto-jalkituotanto').html(formatNumber(medialaskuri_totals.netto.jalkituotanto)+'<span>&euro;</span>');
		$('#netto-kontaktiennuste').html(formatNumber(medialaskuri_totals.netto.kontaktiennuste, 0));
	}

	function updateOffscreen() {
		var totals = {
			hinta: 0,
			kontaktit: 0,
			jalkituotanto: 0
		};
  
		$('#checkboxes').find('.checkbox').each(function(index,checkbox) {
			var data = offscreen[$(checkbox).attr('rel')];
			var wb = $(checkbox).hasClass('weekbox');
    
			if(wb) {
				var weeks = $(checkbox).find('select');
				weeks = parseInt($(weeks).val(), 10);
			}
    
			if(data.kontaktimaara_type == 'osuusvalko') {
				if(medialaskuri_totals.valkokangas.total_kontaktiennuste) {
					var kontaktit = Math.round((medialaskuri_totals.valkokangas.total_kontaktiennuste * data.kontaktimaara));
				} else {
					var kontaktit = Math.round((medialaskuri_totals.valkokangas.kontaktiennuste * data.kontaktimaara));
				}
			} else {
				var kontaktit = (wb ? weeks : parseInt($('#medialaskuri-weeks li.selected').text(),10)) * data.kontaktimaara;
			}

			if($(checkbox).hasClass('checked') || (wb && weeks > 0)) {
				var hinta;

				switch (data.hintakerroin_type) {
					case 'viikko':
						hinta = (wb ? weeks : parseInt($('#medialaskuri-weeks li.selected').text(),10)) * data.hintakerroin;
						break;
					case 'osuustotal':
						hinta = Math.round((medialaskuri_totals.mainoselokuva.total_hinta * data.hintakerroin), 2);
						break;
					default:
						hinta = Math.round((medialaskuri_totals.mainoselokuva.hinta * data.hintakerroin), 2);
						break;
				}
      
				if(!wb) {
					if($('#medialaskuri-length li.selected').length) {
						var length = parseInt($('#medialaskuri-length li.selected').text(),10);
					}
				}
      
				$.each(offscreen_tuotanto, function(o) {
					if(o.media == $(checkbox).attr('rel') && (wb || (o.limit[0] <= length && o.limit[1] >= length))) {
						totals.jalkituotanto += o.hinta;
					}
				});
      
				totals.hinta += hinta;
				totals.kontaktit += kontaktit;
			} else {
				var hinta = '-';
			}
    
			var spans = $(checkbox).find('span');
			$(spans[0]).html(formatNumber(hinta)+'<span>&euro;</span>');
			$(spans[2]).html(formatNumber(kontaktit, 0));
		});
  
		totals.hinta = Math.round(totals.hinta, 2);
  
		medialaskuri_totals.offscreen.hinta = totals.hinta;
		medialaskuri_totals.offscreen.kontaktiennuste = totals.kontaktit;
		medialaskuri_totals.offscreen.jalkituotanto = totals.jalkituotanto;
  
		$('#offscreen-hinta').html(formatNumber(totals.hinta) + '<span>&euro;</span>');
		$('#offscreen-kontaktiennuste').html(formatNumber(totals.kontaktit, 0));
		$('#offscreen-jalkituotanto').html(formatNumber(totals.jalkituotanto) + '<span>&euro;</span>');
  
		updateTotal();
	}

})(jQuery);
