if (!SAINTRYN)
    var SAINTRYN = {};

//selectors 
SAINTRYN.$ = function (element) {
    if (typeof element == 'string'){
		element = document.getElementById(element);
	}
    return element;
}

SAINTRYN.$$ = function(nodeTree, className) {
	nodeTree = SAINTRYN.$(nodeTree);
	
    var localArray = new Array();
    
    if(nodeTree == null) return false;
    for (var iLoopA = 0; iLoopA < nodeTree.childNodes.length; iLoopA++) {
        if (nodeTree.childNodes[iLoopA].nodeType == 1) {
            if (nodeTree.childNodes[iLoopA].className != undefined) {
                if (SAINTRYN.HasClass(nodeTree.childNodes[iLoopA], className)) {
                    localArray[localArray.length] = nodeTree.childNodes[iLoopA];
                }
            }
            var recursiveSearch = SAINTRYN.$$(nodeTree.childNodes[iLoopA], className);
            if (recursiveSearch.length > 0) {
                for (var iLoopB = 0; iLoopB < recursiveSearch.length; iLoopB++) {
                    localArray.push(recursiveSearch[iLoopB]);
                }
            }
        }
    }

    return localArray;
}

// event management
SAINTRYN.BindEvent = function(targetElement, eventType, eventCallback) {
	if (SAINTRYN.$(targetElement)) {
		targetElement = SAINTRYN.$(targetElement);
		targetElement[eventType] = function(e) {
			if (!e) {
				var e = window.event;
				if (!e.currentTarget) e.currentTarget = this;
			}
			return eventCallback.call(this, e);
		}
	} else {
		//alert('could not find element to attach event!');
		return false;
	}
}
SAINTRYN.ClearEvent = function(targetElement, eventType) {
	targetElement = SAINTRYN.$(targetElement);
	targetElement[eventType] = null;
}
SAINTRYN.BindClick = function(targetElement, eventCallback) {
	SAINTRYN.BindEvent(targetElement, 'onclick', eventCallback);
}
SAINTRYN.BindMouseOver = function(targetElement, eventCallback) {
	SAINTRYN.BindEvent(targetElement, 'onmouseover', eventCallback);
}
SAINTRYN.BindMouseOut = function(targetElement, eventCallback) {
	SAINTRYN.BindEvent(targetElement, 'onmouseout', eventCallback);
}

// css class management
SAINTRYN.ClassSwitcher = function(myAction, element, c1, c2) {
	return _ClassSwitcher(myAction, SAINTRYN.$(element), c1, c2);
}
SAINTRYN.AddClass = function(element, c1) {
	element = SAINTRYN.$(element);
	if (!SAINTRYN.HasClass(element, c1)) {
		element.className += element.className ? ' ' + c1 : c1;
	}
}
SAINTRYN.RemoveClass = function(element, c1) {
	element = SAINTRYN.$(element);
	var rep = element.className.match(' ' + c1) ? ' ' + c1 : c1;
	element.className = element.className.replace(rep, '');
}
SAINTRYN.HasClass = function(element, c1) {
	element = SAINTRYN.$(element);
	return new RegExp('\\b' + c1 + '\\b').test(element.className);
}
SAINTRYN.ToggleClass = function(element, c1) {
	element = SAINTRYN.$(element);
	if (SAINTRYN.HasClass(element, c1)) {
		SAINTRYN.RemoveClass(element, c1);
	} else {
		SAINTRYN.AddClass(element, c1);
	}
}
SAINTRYN.SwapClass = function(element, c1, c2) {
	element = SAINTRYN.$(element);
	element.className = !SAINTRYN.HasClass(element, c1) ? element.className.replace(c2, c1) : element.className.replace(c1, c2);
}

// Facebook animation management class
SAINTRYN.AnimationManager = function() {

    function _Scroll(subject, toPos, options) {
        var scrollLeft = parseInt(subject.scrollLeft);
        var change = toPos - scrollLeft;

        var total = scrollLeft + Math.ceil((change / 1.5));

        if (change == -1)
            change = 0;

        subject.scrollLeft = total;
        function recursiveRepeat() {
            _Scroll(subject, toPos, options);
        }
        if (change == 0) {
            //done
            options.completedCallback(options.completedCallbackTarget);
            clearTimeout(timer);
            return;
        }
        var timer = setTimeout(recursiveRepeat, 100);
    }

    function _Fade(subject, toOpacity, timeEffectFrequency) {
        var currentOpacity = subject.style.opacity * 100;
        var change = toOpacity - currentOpacity;
        var total = currentOpacity + Math.ceil((change / 2));

        if (change == -1)
            change = 0;

        subject.style.opacity = total / 100;
        function recursiveRepeat() {
            _Fade(subject, toOpacity, timeEffectFrequency);
        }
        if (change == 0) {
            clearTimeout(timer);
            return;
        }
        timer = setTimeout(recursiveRepeat, 100);

    }

    return {
        Scroll: function(subject, toPos, options) {
            _Scroll(subject, toPos, options);
            
        },
        Fade: function(subject, toOpacity, timeEffectFrequency) {
            _Fade(subject, toOpacity, timeEffectFrequency);
        }
    }
} ();


SAINTRYN.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);
    }
}




Number.extend({

	/*
	Property: numberFormat
		Format a number with grouped thousands.

	Arguments:
		decimals, optional - integer, number of decimal percision; default, 2
		dec_point, optional - string, decimal point notation; default, '.'
		thousands_sep, optional - string, grouped thousands notation; default, ','

	Returns:
		a formatted version of number.

	Example:
		>(36432.556).numberFormat()  // returns 36,432.56
		>(36432.556).numberFormat(2, '.', ',')  // returns 36,432.56
	*/

	numberFormat : function(decimals, dec_point, thousands_sep) {
		decimals = Math.abs(decimals) + 1 ? decimals : 2;
		dec_point = dec_point || '.';
		thousands_sep = thousands_sep || ',';
	
		var matches = /(-)?(\d+)(\.\d+)?/.exec((isNaN(this) ? 0 : this) + ''); // returns matches[1] as sign, matches[2] as numbers and matches[3] as decimals
		var remainder = matches[2].length > 3 ? matches[2].length % 3 : 0;
		return (matches[1] ? matches[1] : '') + (remainder ? matches[2].substr(0, remainder) + thousands_sep : '') + matches[2].substr(remainder).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep) + 
				(decimals ? dec_point + (+matches[3] || 0).toFixed(decimals).substr(2) : '');
	}


});

if(!CWLib)
	var CWLib = {};
	
CWLib.Carousel = function() {
	
    var CarouselPaginationPosition;
	
	//default settings
	var _Settings = {
	    targetCarousel : '',
		numberOfVisibleItems : 5,
		itemPadding : 0,
		doAnimation : false,
		scrollByCount : 1
	}
	
	function _RegisterPaginationEventHandlers() {
    
        var found = SAINTRYN.$$(_Settings.targetCarousel, 'paginationControls');
        
        SAINTRYN.BindClick(SAINTRYN.$$(found[0], 'next')[0], _ShowNext);
        SAINTRYN.BindClick(SAINTRYN.$$(found[0], 'prev')[0], _ShowPrev);
        SAINTRYN.BindClick(SAINTRYN.$('carouselTabControl'), function(){
           //if the carousel is not displayed
           if(!SAINTRYN.HasClass(SAINTRYN.$('pointsControl'), 'carousel')){
                //reset the scrollers (otherwise firefox sets the carousel scroll position to 0 when the carousel tab is opened)
                _ResetScrollers();
           }    
        });
    
        //alert('_RegisterPaginationEventHandlers');
    }
	
	function _ResetScrollers() {
		
	    CarouselPaginationPosition = 0;
	
	    //hide prev buttons
	    SAINTRYN.AddClass(SAINTRYN.$$(_Settings.targetCarousel, 'prev')[0], 'hidden');
	    
	
	    //show/hide next buttons and/or center contents
	    var nextButton = SAINTRYN.$$(_Settings.targetCarousel, 'next')[0];
	
	    //reset scroll position
	    var scrollableContent = SAINTRYN.$$(_Settings.targetCarousel, 'scrollable')[0];
	    
	    scrollableContent.scrollLeft = 0;
	    
		var items = SAINTRYN.$$(_Settings.targetCarousel, 'twistItem');

    	    
	    if (items.length != 0) {
		    if(_Settings.numberOfVisibleItems < items.length)
		    {
		        SAINTRYN.RemoveClass(nextButton, 'hidden');
		    }
			
	    }
    }
	
	
	function _ScrollToItem(itemNumber, doAnimation)
	{
			_Settings.scrollByCount = itemNumber;
			_Settings.doAnimation = doAnimation;
			
			SAINTRYN.fireEvent(SAINTRYN.$$(_Settings.targetCarousel, 'next')[0],'click');
			
			//reset behaviour
			_Settings.scrollByCount = 1;
			_Settings.doAnimation = true;
			
	}
    
    function _ShowPrev(e) {
    
        var scrollableControl = SAINTRYN.$$(_Settings.targetCarousel, 'scrollable')[0];
	    var items = SAINTRYN.$$(scrollableControl, 'twistItem');

	    if (scrollableControl.scrollLeft != 0) {
    	
		    SAINTRYN.BindClick(this, function() { return false });
		    var shift = 0;
		    for (var iLoopA =0; iLoopA < items.length; iLoopA++) {
			    if (!SAINTRYN.HasClass(items[iLoopA], 'hidden')) {
				
				    shift = _Settings.scrollByCount * (items[iLoopA].clientWidth + _Settings.itemPadding) + 1;
				    break;
			    }
		    }
		    
		    if(_Settings.doAnimation)
	        {
		        SAINTRYN.AnimationManager.Scroll(scrollableControl, scrollableControl.scrollLeft - shift, {
			        completedCallback: function (target) {
				        SAINTRYN.BindClick(target, _ShowPrev);
			        },
			        completedCallbackTarget: this
		        });
    		    
		    }
	        else{
	            scrollableControl.scrollLeft = scrollableControl.scrollLeft - shift;
	            SAINTRYN.BindClick(this, _ShowPrev);
	        }
		    
		    CarouselPaginationPosition = CarouselPaginationPosition - _Settings.scrollByCount;
	    }
		
		if (CarouselPaginationPosition == 0) {
		    SAINTRYN.AddClass(SAINTRYN.$$(_Settings.targetCarousel, 'prev')[0], 'hidden');     
	    }

	    if (items.length - CarouselPaginationPosition > _Settings.numberOfVisibleItems) {
		    SAINTRYN.RemoveClass(SAINTRYN.$$(_Settings.targetCarousel, 'next')[0], 'hidden');
	    }

        return false;
    }
	
	
	function _ShowNext(e) {
	
	    var scrollableControl = SAINTRYN.$$(_Settings.targetCarousel, 'scrollable')[0];
	    var items = SAINTRYN.$$(scrollableControl, 'twistItem');
	

	    SAINTRYN.BindClick(this, function() { return false });
	    
	    var shift = 0;
	    for (var iLoopA = 0; iLoopA < items.length; iLoopA++) {
		    if (!SAINTRYN.HasClass(items[iLoopA], 'hidden')) {
				//alert('going to the next' + _Settings.scrollByCount);
			    shift = _Settings.scrollByCount * (items[iLoopA].clientWidth + _Settings.itemPadding);
			    break;
		    }
	    }
	    
	    if(_Settings.doAnimation)
	    {
	        SAINTRYN.AnimationManager.Scroll(scrollableControl, scrollableControl.scrollLeft + shift, {
		        completedCallback: function (target) {
			        SAINTRYN.BindClick(target, _ShowNext)
		        },
		        completedCallbackTarget: this
	        });
	    }
	    else{
	        scrollableControl.scrollLeft = scrollableControl.scrollLeft + shift;
	        SAINTRYN.BindClick(this, _ShowNext);
	    }
	    
	    CarouselPaginationPosition = CarouselPaginationPosition + _Settings.scrollByCount;
		
        //moved off of first item, make previous button visible
	    if (CarouselPaginationPosition > 0) {
		    SAINTRYN.RemoveClass(SAINTRYN.$$(_Settings.targetCarousel, 'prev')[0], 'hidden');
	    }
	    //reached the end of the carousel, hide the next button
	    if (items.length - CarouselPaginationPosition <= _Settings.numberOfVisibleItems) {
	        SAINTRYN.AddClass(SAINTRYN.$$(_Settings.targetCarousel, 'next')[0], 'hidden');
        }


        return false;
    }

    //initialisation code - do not edit
	function _Initialise(instanceDefinedSettings)
	{
		//alert('initialising');
		_Settings = instanceDefinedSettings;
		_ResetScrollers();
		_RegisterPaginationEventHandlers();
	}
    _Initialise(arguments[0]);
    //initialisation ends

	return {
		GetSettings : function(){
			return _Settings;
		},
		ShowNext : function() {
			//return _ShowNextItem();
			fireEvent(SAINTRYN.$$(_Settings.targetCarousel, 'next')[0],'click');
		},
		CarouselPosition : function() {
			return CarouselPaginationPosition;
		},	
		ScrollTo : function(itemNumber, doAnimation) {
			return _ScrollToItem(itemNumber, doAnimation);
		}
    }
};	
	




function validateSpendField(spend)
{
    if(spend != ''){
        return !isNaN(spend);
    }
    else{
        return false;
    }
}

function doCalculation(spend)
{
	var pointsPerPound = 2;
	var accumulationDuration = 104;
    var maxBonusPointsPerProduct = 60000;


    var basePoints = spend * pointsPerPound * accumulationDuration;
    var bonusPointsPerProduct = (basePoints > maxBonusPointsPerProduct)? maxBonusPointsPerProduct : basePoints; 
  
    return {
	    doublePoints : (basePoints + bonusPointsPerProduct),
	    triplePoints : (basePoints + 2 * bonusPointsPerProduct),
	    quadruplePoints : (basePoints + 3 * bonusPointsPerProduct),
	    quintuplePoints : (basePoints + 4 * bonusPointsPerProduct),
	    sextuplePoints : (basePoints + 5 * bonusPointsPerProduct)

    };
	    
}

function _StringFormatStatic() {
    for (var iLoopA = 1; iLoopA < arguments.length; iLoopA++) {
        var exp = new RegExp('\\{' + (iLoopA - 1) + '\\}', 'gm');
        arguments[0] = arguments[0].replace(exp, arguments[iLoopA]);
    }
    return arguments[0];
}


if (!String.format) {
    String.format = _StringFormatStatic;
}

function toggleTabControl()
{
	//console.log(this.id);
	if($('pointsControl').className == 'calculator')
	{
		if(this.id != 'calculatorTabControl')
			$('pointsControl').className = 'carousel';
	}
	else
	{
		if(this.id != 'carouselTabControl')
			$('pointsControl').className = 'calculator';
	}	
}


window.addEvent('domready', function() {

	$('pointsForm').className = 'form';
	$('pointsControlNavigation').className = 'form';
	$('noJsCounter').className = 'hidden';
	$('pointsNavigationNoJS').className = 'hidden';
	$('p_findoutmore').className = '';
	$('p_findoutmoreNoJS').className = 'hidden';
	$$('.noJS').each(function(e) { e.className = 'hidden';  });
	
	

	//set up carousel 
	var twistsCarousel = new CWLib.Carousel({
		targetCarousel : 'carousel',
		itemPadding : 0,
		numberOfVisibleItems : 1,
		doAnimation : true,
		scrollByCount : 1
	});


	
	$('btnSubmit').addEvent('click', function(e) {

		if (e.preventDefault) {
		    e.preventDefault();
		}
		
		if(validateSpendField($('txbWeeklyShopSpend').value))
		{
		    var spend = parseInt($('txbWeeklyShopSpend').value);
		
			//work out calculations
			var values = doCalculation(spend);
			
			//present markup for double points
			var doublePointsString = values.doublePoints.toString().split("");
			var output = '<p>';
			for(var iLoopA = 0; iLoopA < doublePointsString.length; iLoopA++)
			{
				output += String.format('<span class="number{0}">{0}</span>',doublePointsString[iLoopA]);
			}
			output += '</p>';
			
			//output to page
			$('doublePointsCounter').innerHTML 						= output;
			$('triplePointsCounter').childNodes[0].innerHTML 		= String.format('2 new products = x 3 points <strong>{0}</strong>'	,values.triplePoints.numberFormat(0,'',','));
			$('quadruplePointsCounter').childNodes[0].innerHTML 	= String.format('3 new products = x 4 points <strong>{0}</strong>'	,values.quadruplePoints.numberFormat(0,'',','));
			$('quintuplePointsCounter').childNodes[0].innerHTML 	= String.format('4 new products = x 5 points <strong>{0}</strong>'	,values.quintuplePoints.numberFormat(0,'',','));
			$('sextuplePointsCounter').childNodes[0].innerHTML 	= String.format('5 new products = x 6 points <strong>{0}</strong>'	,values.sextuplePoints.numberFormat(0,'',','));

		}
		else{
		    //output to page
			$('doublePointsCounter').innerHTML 						= '';
			$('triplePointsCounter').childNodes[0].innerHTML 		= '2 new products = x 3 points';
			$('quadruplePointsCounter').childNodes[0].innerHTML 	= '3 new products = x 4 points';
			$('quintuplePointsCounter').childNodes[0].innerHTML 	= '4 new products = x 5 points';
			$('sextuplePointsCounter').childNodes[0].innerHTML 	= '5 new products = x 6 points';

		}
		return false;
	});

		
	$('calculatorTabControl').addEvent('click', toggleTabControl);
	$('carouselTabControl').addEvent('click', toggleTabControl);


});

