// object priceform
priceForm = {};

/**
 *    Update vanuit een price select field
 *
 *    update hidden field met meerprijs
 *    bereken premie en totaalprijs opnieuw
 */
priceForm.updateTotalPriceSelect = function(sHidden, oSelect){

	var aPrices = eval(oSelect.getAttribute('rel'));
	
    var fPrice = aPrices[oSelect.selectedIndex];
    if (isNaN(fPrice)){
        fPrice = 0;
    }
	document.getElementById(sHidden).value = fPrice;

	priceForm.calcPremie();
    priceForm.updatePrice();

}

/**
 *  init filters, onchange event koppelen en direct firen
 *
 */
priceForm.initFilter = function(sFilterElement, sTargetElement, aFilter){

    
    addEvent(document.getElementById(sFilterElement), 'change', function(){
    
        priceForm.changeFilter(this.value, sTargetElement, aFilter);
        
    });
    
    priceForm.fireEvent(document.getElementById(sFilterElement), 'change'); 
    
}

/**
 *  Filters toepassen onchange
 *
 *
 */
priceForm.changeFilter = function(sValue, sTargetElement, aFilter){

    if (!this.aTargetElement){
        this.aTargetElement = [];
    }
    if (!this.aTargetElement[sTargetElement]){
    
        // opties en prijzen opslaan bij eerste aanroep
        var oTargetElement = document.getElementById(sTargetElement);
        var aPrices = eval(oTargetElement.getAttribute('rel'));  
        
        // options array opbouwen
        var aTmp = oTargetElement.options;
        var iMax = aTmp.length;
        var aOptions = [];
        for(var i=0; i < iMax; i++){
            aOptions.push(aTmp[i].value);
        }
        
        this.aTargetElement[sTargetElement] = [ aFilter, 
                                                aOptions, 
                                                aPrices];
    }
    

    // bepalen welke elementen uit array moeten
    var aFilter = this.aTargetElement[sTargetElement][0];
    var iMax = aFilter.length;
    var aRemove = [];
    for(var i = 0; i < iMax; i++){
        if (aFilter[i] != sValue){
            aRemove.push(i);
        }
    }
   
    var aOptions = this.aTargetElement[sTargetElement][1]; 
    var aPrices  = this.aTargetElement[sTargetElement][2];
    
     var aNewOptionArray = [];
     var aNewPriceArray = [];
     var iMax = aOptions.length;


     var oTarget = document.getElementById(sTargetElement);   	
     
     // huidige value opslaan
     var sValue = oTarget.value;

     for(var i=0; i < iMax; i++){
        if (!priceForm.inArray(i, aRemove)){
            aNewOptionArray.push(aOptions[i]);    
            aNewPriceArray.push(aPrices[i]);    
        }
     }
        
     aOptions = aNewOptionArray;
     aPrices  = aNewPriceArray; 
     
    
    // rel terugzetten
    oTarget.setAttribute('rel', '[' + aPrices.join(',') + ']');
    
    // options opnieuw opbouwen
    oTarget.options.length = 0;    
    var iMax = aOptions.length;
    for(var i=0; i < iMax; i++){
    	if (aOptions[i] == sValue){
        	oTarget.options[i] = new Option(aOptions[i], aOptions[i], false, true);
		} else {
			oTarget.options[i] = new Option(aOptions[i], aOptions[i]); 
		}
    }
    
    
    
    // events firen
    priceForm.fireEvent(oTarget, 'change');
        
}

priceForm.inArray = function(mValue, aArray){
    
     for (var i in aArray) { 
        if (aArray[i] == mValue) {
            return i; 
        }
    }
    return false;
    
}

priceForm.updateTotalPriceSelectAantal = function(sHidden, oSelect){

	var aPrices = eval(oSelect.getAttribute('rel'));  	
	var fPrice 	= parseFloat(aPrices[oSelect.selectedIndex]);

	var iAantal = 1;
	if (document.getElementById(oSelect.name + '_meerprijs_aantal')){
		var iAantal = parseInt(document.getElementById(oSelect.name + '_meerprijs_aantal').value);
	}
	if (isNaN(iAantal)){
		iAantal = 0;
	}
    if (isNaN(fPrice)){
        fPrice = 0;
    }

	var fTotalPrice = fPrice * iAantal;

	document.getElementById(sHidden).value = fTotalPrice;

	priceForm.calcPremie();
    priceForm.updatePrice();

}

// formulierwizard_checkbox_prijs

priceForm.changeCheckboxes = function(sName){

	var aCheckboxes = document.getElementsByTagName('input');
	var i = aCheckboxes.length;
	while(i--){
		if (aCheckboxes[i].type == 'checkbox'){
			if (aCheckboxes[i].id.indexOf(sName + '_') != -1){
                priceForm.fireEvent(aCheckboxes[i], 'change');
			}
		}
	}
}

/**
 *    Update vanuit een price checkbox
 *
 *    update hidden field met meerprijs als checkbox checked is
 *    bereken premie en totaalprijs opnieuw
 */
priceForm.updateTotalPriceCheckBox = function(oCheckBox, aPrices){
	
    var iIndex = 0;
    var aCheckBox = document.getElementsByTagName('input');
    var iMax = aCheckBox.length;

    var oHidden = oCheckBox.parentNode.getElementsByTagName('input')[1];

    var aIndex = {};
    var j = 0;
    for(var i=0; i < iMax; i++){
        if (aCheckBox[i].name == oCheckBox.name){
            aIndex[aCheckBox[i].id] = j;
            j++;
        }
    }

    iIndex = aIndex[oCheckBox.id];

    if (oCheckBox.checked){
        oHidden.value = aPrices[iIndex];
    } else {
        oHidden.value = 0;
    }



    priceForm.calcPremie();
    priceForm.updatePrice();
}

priceForm.annuleringsverzekeringPremie = false;
priceForm.annuleringsverzekeringAssurantien = false;
priceForm.annuleringsverzekeringPoliskosten = false;

/**
 *   initialiseer de annuleringsverzekering indien aanwezig op het formulier
 *
 *	 stel de premie in (percentage)
 *   stel de assurantienbelasting in (percentage)
 *   stel de poliskosten in (bedrag)
 */
priceForm.initAnnuleringsverzekering = function(fPremie, fAssurantien, fPoliskosten){

    priceForm.annuleringsverzekeringPremie = new Number(fPremie);
    priceForm.annuleringsverzekeringAssurantien = new Number(fAssurantien);
    priceForm.annuleringsverzekeringPoliskosten = new Number(fPoliskosten);
}

/**
 * 	update de totaalprijs
 *
 */
priceForm.updatePrice = function(){

    var fTotal = 0;
	if (document.getElementById('totalprice')){

		oDiv = document.getElementById('totalprice_div');
        fTotal = priceForm.calcPrice();
        //oDiv.innerHTML = 'totaalprijs: € ' + fTotal;
		oDiv.innerHTML = '&euro; ' + fTotal;
	    document.getElementById('totalprice').value = fTotal;
	}

}


/**
 * 	Bereken de annuleringsverzekering aan de hand van voorgaande velden
 *
 */
priceForm.calcPremie = function(){

    // door alle velden heenlopen tot aan verzekeringsveld

    if (document.getElementById('annuleringsverzekering_div')){
        var fStart = 0;
        var aFields = document.getElementsByTagName('input');
        var iMax = aFields.length;
        for(var i=0; i<iMax; i++){
            if (aFields[i].id == 'annuleringsverzekering'){
                // we zijn bij de annuleringsverzekering, niet meer verder rekeken
                break;
            }
            if (aFields[i].className == 'price_add'){
                fStart += parseFloat(aFields[i].value);
            }
        }

        var fPremie = (fStart / 100) * priceForm.annuleringsverzekeringPremie;
        var fAssurantien = (fPremie / 100) * priceForm.annuleringsverzekeringAssurantien;
        var fPoliskosten = priceForm.annuleringsverzekeringPoliskosten;

        var aHtml = [];
        // Preview/webbeheer weergave:
        /*
        aHtml.push('<table>');
        aHtml.push('    <tr>');
        aHtml.push('        <td>Annuleringsverzekering&nbsp;</td>');
        aHtml.push('        <td>€</td>');
        aHtml.push('        <td>' + fPremie.toFixed(2).replace('.', ',')  + '</td>');
        aHtml.push('    </tr>');
        aHtml.push('    <tr>');
        aHtml.push('        <td>Assurantie</td>');
        aHtml.push('        <td>€</td>');
        aHtml.push('        <td>' + fAssurantien.toFixed(2).replace('.', ',') + '</td>');
        aHtml.push('    </tr>');
        aHtml.push('    <tr>');
        aHtml.push('        <td>Poliskosten</td>');
        aHtml.push('        <td>€</td>');
        aHtml.push('        <td>' + fPoliskosten.toFixed(2).replace('.', ',') + '</td>');
        aHtml.push('    </tr>');
        aHtml.push('</table>');
        */

        // Website weergave:
        aHtml.push('<div class="box-yellow">');
        aHtml.push('    <div class="txt">');
        aHtml.push('        <div class="col-large">Annuleringsverzekering</div> <div class="col-small right">&euro; ' + fPremie.toFixed(2).replace('.', ',')  + '</div><br class="clearfix"/>');
        aHtml.push('        <div class="col-large">Assurantiebelasting</div> <div class="col-small right">&euro; ' + fAssurantien.toFixed(2).replace('.', ',') + '</div><br class="clearfix"/>');
        aHtml.push('        <div class="col-large">Poliskosten</div> <div class="col-small right">&euro; ' + fPoliskosten.toFixed(2).replace('.', ',') + '</div><br class="clearfix"/>');
        aHtml.push('    </div>');
        aHtml.push('    <div class="btm"></div>');
        aHtml.push('</div>');

        var sHtml = aHtml.join("\n");

        document.getElementById('annuleringsverzekering_div').innerHTML = sHtml;

        if (document.getElementById('annuleringsverzekering_toggle').checked){
            // aangevinkt, meetellen voor totaalprijs
            document.getElementById('annuleringsverzekering').value = fPremie + fAssurantien + fPoliskosten;
        } else {
            document.getElementById('annuleringsverzekering').value = 0;
        }

    }


}

/**
 * 		Bereken de totaalprijs.
 *		Loop door alle hidden fields met classname 'price_add' om totaalprijs te berekenen
 *      alleen velden tot aan deze totaalprijs worden meegenomen
 */
priceForm.calcPrice = function(){

	var fStart = 0;
	var aFields = document.getElementsByTagName('input');
	var iMax = aFields.length;
	for(var i=0; i<iMax; i++){
		if (aFields[i].className == 'totalprice'){
            // we zijn bij de totaalprijs, niet meer verder rekeken
			break;
		}
		if (aFields[i].className == 'price_add'){
			fStart += parseFloat(aFields[i].value);
		}
	}
	return fStart.toFixed(2).replace('.', ',');

}



/**
*   Fire een eventhandler
*
*   @param obj element
*   @param event eventname
*
*/
priceForm.fireEvent = function(element,event){

    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
    }
    else{
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}
/**
 * Voeg een event toe aan een object
 *
 */

// written by Dean Edwards, 2005
// with input from Tino Zijdel - crisp@xs4all.nl
// http://dean.edwards.name/weblog/2005/10/add-event/
function addEvent(element, type, handler)
{
	if (element.addEventListener)
		element.addEventListener(type, handler, false);
	else
	{
		if (!handler.$$guid) handler.$$guid = addEvent.guid++;
		if (!element.events) element.events = {};
		var handlers = element.events[type];
		if (!handlers)
		{
			handlers = element.events[type] = {};
			if (element['on' + type]) handlers[0] = element['on' + type];
			element['on' + type] = handleEvent;
		}
	
		handlers[handler.$$guid] = handler;
	}
}
addEvent.guid = 1;

function removeEvent(element, type, handler)
{
	if (element.removeEventListener)
		element.removeEventListener(type, handler, false);
	else if (element.events && element.events[type] && handler.$$guid)
		delete element.events[type][handler.$$guid];
}

function handleEvent(event)
{
	event = event || fixEvent(window.event);
	var returnValue = true;
	var handlers = this.events[event.type];

	for (var i in handlers)
	{
		if (!Object.prototype[i])
		{
			this.$$handler = handlers[i];
			if (this.$$handler(event) === false) returnValue = false;
		}
	}

	if (this.$$handler) this.$$handler = null;

	return returnValue;
}

function fixEvent(event)
{
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
}
fixEvent.preventDefault = function()
{
	this.returnValue = false;
}
fixEvent.stopPropagation = function()
{
	this.cancelBubble = true;
}

// This little snippet fixes the problem that the onload attribute on the body-element will overwrite
// previous attached events on the window object for the onload event
if (!window.addEventListener)
{
	document.onreadystatechange = function()
	{
		if (window.onload && window.onload != handleEvent)
		{
			addEvent(window, 'load', window.onload);
			window.onload = handleEvent;
		}
	}
} 
 
 
/*
priceForm.addEvent = function( obj, type, fn ) {
  if ( obj.attachEvent ) {
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){
    		obj['e'+type+fn](window.event);
    }
    obj.attachEvent( 'on'+type, obj[type+fn] );
  } else
    obj.addEventListener( type, fn, false );
}
/**
 * Verwijder een event van een object
 *
 */
 /*
priceForm.removeEvent = function( obj, type, fn ) {
  if ( obj.detachEvent ) {
    obj.detachEvent( 'on'+type, obj[type+fn] );
    obj[type+fn] = null;
  } else
    obj.removeEventListener( type, fn, false );
}
*/
