
// ============================================================================
// PrototypeJS Extension: 
// Adds mouse:enter and mouse:leave support to Event
if (typeof Event.observe_without_mouseenter_and_mouseleave == 'undefined') {
  Event.observe_without_mouseenter_and_mouseleave = Event.observe
  Event.observe = function (element, event_name) {
    if (['mouse:enter', 'mouse:leave'].include(event_name)) {
      var mouse_is_over = false
      element.observe('mouseover', function (event) {
        if (mouse_is_over) return
        mouse_is_over = true
        if (event_name == 'mouse:enter') element.fire('mouse:enter')
      })
      element.observe('mouseout', function (event) {
        if (!mouse_is_over) return
        var to = (event.relatedTarget) ? event.relatedTarget : event.toElement
        if (!to) return false
        if (to == element) return false
        // the mouse has left if +to+ is _not_ within +element+
				try {
					while (to && to.nodeName != 'BODY' && to != element) to = to.parentNode
					if (to != element) {
						mouse_is_over = false
						if (event_name == 'mouse:leave') element.fire('mouse:leave')
					}
				} catch (e) {
					// Ugly hack, if mouse:leave is triggerd by replaced elements
					// firefox throws a permission denied exception on access to nodeName 
					// property.
					// Our assumption is that mouse has leaved to an input element,
					// but that must not be true in any case.
					mouse_is_over = false
					if (event_name == 'mouse:leave') element.fire('mouse:leave')
				}
      })
    }
    return Event.observe_without_mouseenter_and_mouseleave.apply(element, arguments)
  }

  Element.addMethods({
    observe: Event.observe
  })
}
// ----------------------------------------------------------------------------

var FcSlidingMiniBasket = Class.create({
	containerId: 'fc_top_basket',
	slidedElementId: 'basket_layer',
	duration: 0.4,
	
	initialize: function () {
		this.container = $(this.containerId);
		this.slidedElement = $(this.slidedElementId);
		if (!this.container || !this.slidedElement) return;
		
		this.effect = null;
		this.actual = 'closed';
		this.should = 'closed';
		
		this.container.observe('mouse:enter', this.onMouseEnter.bind(this));
		this.container.observe('mouse:leave', this.onMouseLeave.bind(this));
	},
	
	onMouseEnter: function () {
		this.should = 'open';
		if (this.effect) return;
		
		this.actual = 'open';
		this.effect = new Effect.SlideDown(this.slidedElement, {
			duration: this.duration, 
			afterFinish: this.onSlideFinished.bind(this)});
	},
	
	onMouseLeave: function () {
		this.should = 'closed';
		if (this.effect) return;

		this.actual = 'closed';
		this.effect = new Effect.SlideUp(this.slidedElement, {
			duration: this.duration, 
			afterFinish: this.onSlideFinished.bind(this)});
	},
	
	onSlideFinished: function () {
		this.effect = null;
		if (this.actual != this.should) {
			if (this.should == 'open') {
				this.onMouseEnter();
			} else { // this.should == 'closed'
				this.onMouseLeave();
			}
		}
	}
});

// Init Basket
document.observe("dom:loaded", function() {
	new FcSlidingMiniBasket();
});
// ----------------------------------------------------------------------------

function toolTip(e, content){
    if($('tooltip')){
        $('tooltip').remove();
    }
    if(e){
        tooltip = new Element('div', {
                        id: 'tooltip'
        });
        tooltip.className = 'tooltip';
        tooltip.style.left = (Event.pointerX(e)-365)+'px';
        tooltip.style.top = (Event.pointerY(e)+0)+'px';
        tooltip.innerHTML = content;
        document.body.appendChild(tooltip);
    }
}

function number_format (number, decimals, dec_point, thousands_sep) {
    // Formats a number with grouped thousands
    //
    // version: 906.1806
    // discuss at: http://phpjs.org/functions/number_format    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://getsprink.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +     bugfix by: Howard Yeend
    // +    revised by: Luke Smith (http://lucassmith.name)
    // +     bugfix by: Diogo Resende
    // +     bugfix by: Rival    // +     input by: Kheang Hok Chin (http://www.distantia.ca/)
    // +     improved by: davook
    // +     improved by: Brett Zamir (http://brett-zamir.me)
    // +     input by: Jay Klehr
    // +     improved by: Brett Zamir (http://brett-zamir.me)    // +     input by: Amir Habibi (http://www.residence-mixte.com/)
    // +     bugfix by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: number_format(1234.56);
    // *     returns 1: '1,235'
    // *     example 2: number_format(1234.56, 2, ',', ' ');    // *     returns 2: '1 234,56'
    // *     example 3: number_format(1234.5678, 2, '.', '');
    // *     returns 3: '1234.57'
    // *     example 4: number_format(67, 2, ',', '.');
    // *     returns 4: '67,00'    // *     example 5: number_format(1000);
    // *     returns 5: '1,000'
    // *     example 6: number_format(67.311, 2);
    // *     returns 6: '67.31'
    // *     example 7: number_format(1000.55, 1);    // *     returns 7: '1,000.6'
    // *     example 8: number_format(67000, 5, ',', '.');
    // *     returns 8: '67.000,00000'
    // *     example 9: number_format(0.9, 0);
    // *     returns 9: '1'    // *     example 10: number_format('1.20', 2);
    // *     returns 10: '1.20'
    // *     example 11: number_format('1.20', 4);
    // *     returns 11: '1.2000'
    // *     example 12: number_format('1.2000', 3);    // *     returns 12: '1.200'
    var n = number, prec = decimals;

    var toFixedFix = function (n,prec) {
        var k = Math.pow(10,prec);return (Math.round(n*k)/k).toString();
    };

    n = !isFinite(+n) ? 0 : +n;
    prec = !isFinite(+prec) ? 0 : Math.abs(prec);var sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep;
    var dec = (typeof dec_point === 'undefined') ? '.' : dec_point;

    var s = (prec > 0) ? toFixedFix(n, prec) : toFixedFix(Math.round(n), prec); //fix for IE parseFloat(0.55).toFixed(0) = 0;
     var abs = toFixedFix(Math.abs(n), prec);
    var _, i;

    if (abs >= 1000) {
        _ = abs.split(/\D/);i = _[0].length % 3 || 3;

        _[0] = s.slice(0,i + (n < 0)) +
              _[0].slice(i).replace(/(\d{3})/g, sep+'$1');
        s = _.join(dec);} else {
        s = s.replace('.', dec);
    }

    var decPos = s.indexOf(dec);if (prec >= 1 && decPos !== -1 && (s.length-decPos-1) < prec) {
        s += new Array(prec-(s.length-decPos-1)).join(0)+'0';
    }
    else if (prec >= 1 && decPos === -1) {
        s += dec+new Array(prec).join(0)+'0';}
    return s;
}

function calcBMI() {
    var gewicht = parseInt(document.getElementById('fc_bmi_gewicht').value);
    var groesse = parseInt(document.getElementById('fc_bmi_groesse').value);
    groesse = groesse/100;
    var bmi = gewicht / (groesse * groesse)
    document.getElementById('fc_bmi_ergebnis').innerHTML = number_format(bmi, 1, '.', '');
    document.getElementById('fc_bmi_ergebnis').className = 'fc_bmi_done';
}

function submitAddress() {
    if(document.getElementById('fcCheckAddress').value == '1') {
        new Ajax.Request('ajaxRequests/getAddressChoiceLayer.php', {
            method: 'post',
            parameters: '&hash=' + document.getElementById('fcAddressHash').value + '&street=' + document.getElementById('fcAddressStreet').value + '&streetnr=' + document.getElementById('fcAddressStreetNr').value + '&zip=' + document.getElementById('fcAddressZip').value + '&city=' + document.getElementById('fcAddressCity').value + '&country=' + document.getElementById('fcAddressCountry').options[document.getElementById('fcAddressCountry').selectedIndex].text,
            onSuccess: fcShowRequest
        });
        return false;
    }
    document.getElementById('fcAddressDoctorConfirmed').value = '1';
    return true;
}

function fcShowRequest(transport) {
    if(transport.responseText == '1') {
        fcSubmitAddressForm();
    } else {
        document.getElementById('fcAddressUpdateContainer').innerHTML = transport.responseText;
        scroll(0,0);
    }
}

function fcSubmitAddressForm() {
    document.getElementById('fc_form_order').submit();
}

function fcSwitchAddress(iNumber) {
    document.getElementById('fcAddressStreet').value = document.getElementById('fcAddressChangeStreet' + iNumber).innerHTML;
    document.getElementById('fcAddressStreetNr').value = document.getElementById('fcAddressChangeStreetnr' + iNumber).innerHTML;
    document.getElementById('fcAddressZip').value = document.getElementById('fcAddressChangeZip' + iNumber).innerHTML;
    document.getElementById('fcAddressCity').value = document.getElementById('fcAddressChangeCity' + iNumber).innerHTML;
    closeAddressChangeOverlay();
    fcSubmitAddressForm();
}

function closeAddressChangeOverlay() {
    document.getElementById('fc_address_overlay_container').style.display = 'none';
}
