
function Calculator() {
	// dom handlers
	this.internet = {
		speed_1		: $('ctl0_Main_Internet_1'),
		speed_2		: $('ctl0_Main_Internet_2'),
		speed_4		: $('ctl0_Main_Internet_4'),
		speed_20	: $('ctl0_Main_Internet_20')
	};

	this.tv = {
		analog_social	: $('ctl0_Main_TV_Analog_Social'),
		analog_normal	: $('ctl0_Main_TV_Analog_Normal'),
		digital_sd		: $('ctl0_Main_TV_Digital_SD'),
		digital_hd		: $('ctl0_Main_TV_Digital_HD')
	};

	this.canal = {
		sd	: $('ctl0_Main_Canal_SD'),
		hd	: $('ctl0_Main_Canal_HD')
	};

	this.phone = $('ctl0_Main_Phone');
	
	this.cost = {
		before	: $('summary'),
		after	: $('summary-promotion')		
	};
	
	function OnChangeInvoker( obj ) {
    	var reference = obj;
		this.invoke = function( event ) {
			reference.OnChange( event );	
		}
	};   
	var onChangeInvoker = new OnChangeInvoker( this );
	
	// attach event handler
	Event.observe( this.internet.speed_1, 'click', onChangeInvoker.invoke );
	Event.observe( this.internet.speed_2, 'click', onChangeInvoker.invoke );
	Event.observe( this.internet.speed_4, 'click', onChangeInvoker.invoke );
	Event.observe( this.internet.speed_20, 'click', onChangeInvoker.invoke );
	
	Event.observe( this.tv.analog_social, 'click', onChangeInvoker.invoke );
	Event.observe( this.tv.analog_normal, 'click', onChangeInvoker.invoke );
	Event.observe( this.tv.digital_sd, 'click', onChangeInvoker.invoke );
	Event.observe( this.tv.digital_hd, 'click', onChangeInvoker.invoke );

	Event.observe( this.canal.sd, 'click', onChangeInvoker.invoke );
	Event.observe( this.canal.hd, 'click', onChangeInvoker.invoke );

	Event.observe( this.phone, 'click', onChangeInvoker.invoke );
};

Calculator.prototype.OnChange = function( event ) {
	
	// first uncheck other options in every group
	var element = Event.element( event );
	
	if( element == this.internet.speed_1 ) {
		this.internet.speed_2.checked = false;
		this.internet.speed_4.checked = false;
		this.internet.speed_20.checked = false;
	}
	if( element == this.internet.speed_2 ) {
		this.internet.speed_1.checked = false;
		this.internet.speed_4.checked = false;
		this.internet.speed_20.checked = false;
	}
	if( element == this.internet.speed_4 ) {
		this.internet.speed_1.checked = false;
		this.internet.speed_2.checked = false;
		this.internet.speed_20.checked = false;
	}
	if( element == this.internet.speed_20 ) {
		this.internet.speed_1.checked = false;
		this.internet.speed_2.checked = false;
		this.internet.speed_4.checked = false;
	}
	

	if( element == this.tv.analog_social ) {
		this.tv.analog_normal.checked = false;
	}
	if( element == this.tv.analog_normal ) {
		this.tv.analog_social.checked = false;
	}
	
	
	if( element == this.tv.digital_sd ) {
		this.tv.digital_hd.checked = false;
	}
	if( element == this.tv.digital_hd ) {
		this.tv.digital_sd.checked = false;
	}
		
	if( element == this.canal.sd ) {
		this.canal.hd.checked = false;
	}
	if( element == this.canal.hd ) {
		this.canal.sd.checked = false;
	}
	
	
	// start calculating
	
	var internet = 0.0;
	var tv = 0.0;
	var canal = 0.0;
	var phone = 0.0;
	
	// internet cost
	if( this.internet.speed_1.checked ) {
		internet = this.internet.speed_1.value*1.0;				
	}
	if( this.internet.speed_2.checked ) {
		internet = this.internet.speed_2.value*1.0;				
	}
	if( this.internet.speed_4.checked ) {
		internet = this.internet.speed_4.value*1.0;				
	}
	if( this.internet.speed_20.checked ) {
		internet = this.internet.speed_20.value*1.0;				
	}
	
	// tv cost
	if( this.tv.analog_social.checked ) {
		tv = this.tv.analog_social.value*1.0;		
		
		var e = Event.element( event );
		if( e.id == 'ctl0_Main_TV_Analog_Social' ) {
			this.tv.digital_sd.checked = false;			
			this.tv.digital_hd.checked = false;			
			this.canal.sd.checked = false;			
			this.canal.hd.checked = false;		
		}	
	}
	if( this.tv.analog_normal.checked ) {
		tv = this.tv.analog_normal.value*1.0;				
	}
	if( this.tv.digital_sd.checked ) {
		tv = this.tv.digital_sd.value*1.0;
		
		var e = Event.element( event );
		if( e.id == 'ctl0_Main_TV_Digital_SD' ) {
			this.tv.analog_social.checked = false;			
			this.tv.analog_normal.checked = true;	
		}		
	}
	if( this.tv.digital_hd.checked ) {
		tv = this.tv.digital_hd.value*1.0;				

		var e = Event.element( event );
		if( e.id == 'ctl0_Main_TV_Digital_HD' ) {
			this.tv.analog_social.checked = false;			
			this.tv.analog_normal.checked = true;	
		}			
	}
	
	// canal+ cost
	if( this.canal.sd.checked ) {
		canal = this.canal.sd.value*1.0;
		
		var e = Event.element( event );
		if( e.id == 'ctl0_Main_Canal_SD' ) {
			this.tv.analog_social.checked = false;			
			this.tv.analog_normal.checked = true;	
		}		
	}
	if( this.canal.hd.checked ) {
		canal = this.canal.hd.value*1.0;				

		var e = Event.element( event );
		if( e.id == 'ctl0_Main_Canal_HD' ) {
			this.tv.analog_social.checked = false;			
			this.tv.analog_normal.checked = true;	
		}			
	}	
	
	// phone cost
	if( this.phone.checked ) {
		phone = this.phone.value*1.0;
	}
		
	var summary_before = internet+tv+canal+phone;
	
	var summary_after = summary_before;
			
	function myXOR(a,b) {
		return ( a || b ) && !( a && b );
	}	

	if( window.CalculatorRebatesData ) {
		for( var i=0; i<window.CalculatorRebatesData.length; i++ ) {
			var flags = ''+window.CalculatorRebatesData[i].selectedItemsFlag;

			if(				
				!myXOR( this.internet.speed_1.checked, !!(flags.charAt(0)*1) ) &&
				!myXOR( this.internet.speed_2.checked, !!(flags.charAt(1)*1) ) &&
				!myXOR( this.internet.speed_4.checked, !!(flags.charAt(2)*1) ) &&
				!myXOR( this.internet.speed_20.checked, !!(flags.charAt(3)*1) ) &&
				!myXOR( this.tv.analog_social.checked, !!(flags.charAt(4)*1) ) &&
				!myXOR( this.tv.analog_normal.checked, !!(flags.charAt(5)*1) ) &&
				!myXOR( this.tv.digital_sd.checked, !!(flags.charAt(6)*1) ) &&
				!myXOR( this.tv.digital_hd.checked, !!(flags.charAt(7)*1) ) &&
				!myXOR( this.canal.sd.checked, !!(flags.charAt(8)*1) ) &&
				!myXOR( this.canal.hd.checked, !!(flags.charAt(9)*1) ) &&
				!myXOR( this.phone.checked, !!(flags.charAt(10)*1) )
			) {
				summary_after -= window.CalculatorRebatesData[i].rebate;
				break;	
			}
		}
	}
	
	this.cost.before.update( summary_before.toFixed(2)+'zł' );			
	this.cost.after.update( summary_after.toFixed(2)+'zł' );		
};

Event.observe( window, 'load', function(event) { var c = new Calculator(); } );