function gcSavePayment() {

	//pruefen ob cc verfuegbar, sonst ueberspringen

	if($('p_method_globalcollect_cc')) {

		//pruefen ob cc gewaehlt, dann GC abwicklung

		if($('p_method_globalcollect_cc').checked) {	

			

			//Validierung der Adressfelder

			if(!addresses.validate())

				return false;

			

			//Validierung der Kreditkartenfelder

			if(!validateGlobalCollectCC())

				return false;

	

			snslightbox.showLoader();

	

			//Create Payment

			new Ajax.Request(gcInsertURL, {  

				method: 'post',

				onSuccess: function(transport) {

					returnValues = transport.responseText.evalJSON();

					//Schon bezahlt?

					if(returnValues.complete == true) {

						snslightbox.hideLoader();

						addresses.save();

					} else {				

						//Pay

						new Ajax.Request(gcPaymentURL, {  

							method: 'post',

							parameters: "cc_type="+$('globalcollect_cc_cc_type').value,

							onSuccess: function(transport) {

								returnValues = transport.responseText.evalJSON();							

								if(returnValues.error == false) {

								    $('gcFrame').observe('load', function(event){

								        //Formulardaten in iFrame submitten

								    	$('gcFrame').stopObserving('load');

								    	$('gcFrame').observe('load', function(event){

									    	//Statusabfrage

											new Ajax.Request(gcCheckURL, {  

												method: 'post',

												onSuccess: function(transport) {  

													returnValues = transport.responseText.evalJSON();

													//Status OK?

													if(returnValues.error == false) {

														snslightbox.hideLoader();

														addresses.save()

													} else {

														snslightbox.hideLoader();

														showErrorMessage(errorMsg+' (1)');

														return false;

													}

												},

												onFailure: function() {

													snslightbox.hideLoader();

													showErrorMessage(errorMsg+' (2)');

													return false;

									            }

											});

								    	});

								    	$('gcForm').submit();

								    });	

									$('gcFrame').src = returnValues.iFrameUrl;								

									

								    $('gc_CREDITCARDNUMBER').value = $('globalcollect_cc_cc_number').value;

								    $('gc_EXPIRYDATE').value = $('globalcollect_cc_expiration').value + $('globalcollect_cc_expiration_yr').value;

								    $('gc_ACTION').value = 'DO_CONTINUE';

								    $('gc_PAYMENTPRODUCTID').value = $('globalcollect_cc_cc_type').value;

								    $('gc_CVV').value = $('globalcollect_cc_cc_cid').value;

								    $('gc_CREDITCARDNUMBER_CLEAR').value = '';

								    $('gc_CREDITCARDNUMBER_OBFUSCATED').value = '';

								    $('gc_CVV_CLEAR').value = '';

								    $('gc_CVV_OBFUSCATED').value = '';

								    $('gc_EXPIRYDATE_MM').value = $('globalcollect_cc_expiration').value;

								    $('gc_EXPIRYDATE_YY').value = $('globalcollect_cc_expiration_yr').value;

		

								    $('gc_ACTION').name = 'ACTION_temp';

								    $('gcForm').action = returnValues.formUrl;

								    $('gcForm').target = 'gcFrame';

								    $('gc_ACTION').name = 'ACTION';

								} else {

									snslightbox.hideLoader();

									showErrorMessage(errorMsg+' (3)');

									return false;

								}

							},

							onFailure: function() {

								snslightbox.hideLoader();

								showErrorMessage(errorMsg+' (4)');

								return false;

				            }  

						}); 

					}

				},

				onFailure: function() {

					snslightbox.hideLoader();

					showErrorMessage(errorMsg+' (5)');

					return false;

	            }

			}); 

	

		//sonst direkt payment.save()

		} else {

			addresses.save()

		}

	} else {

		addresses.save()

	}

}



/* validateCreditCard */

function validateCreditCard(s){

	var v="0123456789";

	var w="";

	for(i=0;i<s.length;i++){

		x=s.charAt(i);

		if(v.indexOf(x,0)!=-1)

			w+=x;

	}

	j=w.length/2;

	k=Math.floor(j);

	m=Math.ceil(j)-k;

	c=0;

	for(i=0;i<k;i++){

		a=w.charAt(i*2+m)*2;

		c+=a>9?Math.floor(a/10+a%10):a;

	}

	for(i=0;i<k+m;i++)

		c+=w.charAt(i*2+1-m)*1;

	

	return(c%10==0);

}



/**

 * Hash with credit card types wich can be simply extended in payment modules

 * 0 - regexp for card number

 * 1 - regexp for cvn

 * 2 - check or not credit card number trough Luhn algorithm by

 *     function validateCreditCard wich you can find above in this file

 */

/* VI = 1 ; MC = 3 */

Validation.creditCartTypes = $H({

    '1':  [new RegExp('^4[0-9]{12}([0-9]{3})?$'), new RegExp('^[0-9]{3}$'), true],

    '3':  [new RegExp('^5[1-5][0-9]{14}$'), new RegExp('^[0-9]{3}$'), true]

});
