/*
 * scripts/paypal/paypal_calculate.js
 *
 * This does the dynamic calculations and validation for the contribute form
 *
 *
 * @package dreambank
 * @copyright Copyright 2007 FCV Technologies
 * @version $Id: paypal_calculate.js,v 1.28 2008/07/01 02:40:03 david.moseley Exp $
 */

function updateGST(locale)
{
	if( locale=='CAN' )
	{
		// Show the GST table cells
		$$( '.gst_collection' ).each(
			function( e ) { e.show(); });

		var gst_fee = parseFloat($('default_gst_fee').value).toFixed(2);
		$('gst_fees').innerHTML = gst_fee; // display
		$('tax').value	= gst_fee; // hidden form field
	}
	else
	{
		// Hide the GST table cells
		$$( '.gst_collection' ).each(
			function( e ) { e.hide(); });

		$('gst_fees').innerHTML = "0"; // display
		$('tax').value	= "0"; // hidden form field
	}

	updateFees();
}


function updateFees()
{
	var amount = $('contribution_amount').value;
	amount = amount.replace(/[^0-9\.]+/ig,'');
	var gst_fees = $('tax').value;
	gst_fees = parseFloat(gst_fees);

	$('tax').value = gst_fees;

	var paypal_transaction_percent = parseFloat($('paypal_transaction_percent').value / 100);
	var paypal_transaction_fee = parseFloat($('paypal_transaction_fee').value);
	var dreambank_additional_transaction_fee = parseFloat($('paypal_dreambank_additional_transaction_fee').value);

	$('return').value = "http://www.dreambank.org/donation_confirmation.php?dream_id="+$('dream_id').value;


	if (IsNumeric(amount)){

		var dbFees = amount * paypal_transaction_percent + paypal_transaction_fee + dreambank_additional_transaction_fee;

		var total_amount_less_tax = ( parseFloat(amount) + dreambank_additional_transaction_fee);
		var total_amount = ( parseFloat(amount) + dreambank_additional_transaction_fee + parseFloat(gst_fees));
		
		$( 'total_contribution' ).innerHTML = total_amount.toFixed(2);
		$( 'amount' ).value = total_amount_less_tax .toFixed(2);

		var make_member = false;

		// set custom values
		$('custom').value = "Ttl~ "+total_amount.toFixed(2)
												+"|Fees~ "+dreambank_additional_transaction_fee
												+"|Amnt~ "+amount
												+"|Drmid~ "+$('dream_id').value
												+"|chck~"+$('random_number_dreambank').value
												+"|Mmbrid~"+$('member_id').value
												+"|isAnon~"+$('is_anonymous').checked
												+"|hideAmnt~"+$('is_hide_amount').checked
												+"|crtMember~"+make_member
												+"|dnrFirst~"+$('first_name').value
												+"|dnrLast~"+$('last_name').value
												+"|dnrEmail~"+$('donor_email').value
												+"|cmmnts~"+$('comments').value;

	}
	else
	{
		alert("Please enter an amount in the form of dollars and cents - i.e. 20.00");
	}


}
var CONTRIBUTE = null;
var CONFIRM = null;



function contribute_form_submission( formObj ) {
    var validation_result = false;
    var ajax_result = false;
    
    validation_result = validateContributeForm();

    if ( true == validation_result )
    { ajax_result = beginContribution( formObj ); }

    return false;
}



/* 
*	Attempt to understand:
*
*	This function is called from validateContributeForm(), below.
*
*	This function first sends the data over to the begincontribution.php page via Ajax 
*	which appears to store the data in the database in the pp_contribution_ table.
*	If that action fails then it does nothing silently, if that action succeeds it then actually submits the form
*	which sends the contribution data to Paypal.
*/
function beginContribution( formObj )
{
    new Ajax.Request( '/begincontribution.php', {
     parameters: $( formObj ).serialize(true),
     method: 'put',
   onSuccess: function(transport) {
       var response = transport.responseText;

     if (response.length > 0)
     { $( 'frmContribute' ).on1.value = response; }

     // Now we submit the form properly, handing the data over to paypal
     formObj.submit();
   },
   onFailure: function(transport) { alert( 'Storage of form data in database failed.' ); }
 });
}


function validateContributeForm()
{
	var valid = true;

	var donor_amount = $('contribution_amount').value;
	var donor_email = $('donor_email').value;
	var donor_first_name = $('first_name').value;
	var donor_last_name = $('last_name').value;
	var terms_checked = $('read_terms').checked;

	var error_array = new Array();

	if ( ( false == IsNumeric( donor_amount ) ) || ( parseFloat( donor_amount ) < 0.01 ) )
	{ error_array.push( "Please enter a numeric contribution amount greater than zero." ); }

	if ( 0 == donor_first_name.length ) 
	{ error_array.push( "Please enter your first name." ); }

	if ( 0 == donor_last_name.length ) 
	{ error_array.push( "Please enter your last name." ); }

	if ( ( 0 == donor_email.length ) || ( false == emailValidator( donor_email ) ) )
	{ error_array.push( "Please enter a valid email address." ); }

	if ( terms_checked == false) 
	{ error_array.push( "Please read our Terms and Conditions and check the checkbox." ); }
	
	// If an error was encountered, display it to the user and halt submission of the form
	if ( 0 < error_array.length )
	{
		alert( error_array.join( " " ) );
		return false;
	}
	else
	{
	    updateFees();
    	return true;
	}
}


function closeContributeForm()
{
	var contrib = $('contribute');
	contrib.parentNode.removeChild(contrib);
}


function getContributeOverlay( member_id, dream_id )
{
	if (CONTRIBUTE != null)
		return;
	CONTRIBUTE = new Ajax.Request('/contribute.html',
	{
	    parameters: 'member_id='+member_id+'&dream_id='+dream_id,
		onSuccess: function(transport)
		{
			var response = transport.responseText;

			if (response.length > 0)
			{
				var contrib = $('contribute');
				if (contrib)
				{
					Element.replace(contrib, response);
				}
				else
				{
					Element.insert(document.body, response);
				}
				contrib = $('contribute');
				contrib.style.display = 'block';
				window.scrollTo(0,80);
			}
		},
		onFailure: function() { CONTRIBUTE = null; },
		onComplete: function() { CONTRIBUTE = null; }
	});
}


function showContributeOverlay( dreamID, dreamTitle, dreamerName, dreamDescription ){
	$( 'dream_id' ).value = dreamID;

	// Render the dream title into the page
	var dream_titles = $$( 'span.contribution_dream_title' );
	for ( var a = 0; a < dream_titles.length; a++ )
	{ dream_titles[a].innerHTML = dreamTitle; }

	// Render the dream's owner's name into the page
	var dreamer_names = $$( 'span.contribution_name' );
	for ( var a = 0; a < dreamer_names.length; a++ )
	{ dreamer_names[a].innerHTML =  dreamerName; }

	// Render the dream description into the page
	var dream_descriptions = $$( 'p.contribute_dream_description' );
	for ( var a = 0; a < dream_descriptions.length; a++ )
	{ dream_descriptions[a].innerHTML = dreamDescription; }

	$( 'item_number' ).value = dreamID;
	$( 'dream_id' ).value = dreamID;
	$( 'item_name' ).value = "DreamBank Donation: " + dreamTitle;

	$( 'contribute' ).style.display = 'block';
}


function update_currency_display( currency_code )
{ $( 'final_currency' ).innerHTML = currency_code; }


function resetValidation( formID )
{
	var valid = new Validation( formID );
	valid.reset();
}


function IsNumeric( sText )
{
   var ValidChars = "0123456789.";
   var IsNumber=true;
   var Char;


   for ( i = 0; i < sText.length && IsNumber == true; i++ )
	{
	  Char = sText.charAt(i);
	  if (ValidChars.indexOf(Char) == -1)
		 {
		 IsNumber = false;
		 }
	  }
   return IsNumber;

}


//Function to limit text entered into textarea
function limitText(textArea, length) {
    if (textArea.value.length > length) {
        textArea.value = textArea.value.substr(0,255);
    }
}


function emailValidator(str) {

		var at="@";
		var dot=".";
		var lat=str.indexOf(at);
		var lstr=str.length;
		var ldot=str.indexOf(dot);
		if (str.indexOf(at)==-1){
		   return false;
		}

		if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
		   return false;
		}

		if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
		    return false;
		}

		 if (str.indexOf(at,(lat+1))!=-1){
		    return false;
		 }

		 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
		    return false;
		 }

		 if (str.indexOf(dot,(lat+2))==-1){
		    return false;
		 }

		 if (str.indexOf(" ")!=-1){
		    return false;
		 }

 		 return true;
	}



