function popWin(url,win,para) {
    var win = window.open(url,win,para);
    win.focus();
}

function setLocation(url){
    window.location.href = url;
}

function setPLocation(url, setFocus){
    if( setFocus ) {
        window.opener.focus();
    }
    window.opener.location.href = url;
}

function setLanguageCode(code, fromCode){
    //TODO: javascript cookies have different domain and path than php cookies
    var href = window.location.href;
    var after = '', dash;
    if (dash = href.match(/\#(.*)$/)) {
        href = href.replace(/\#(.*)$/, '');
        after = dash[0];
    }

    if (href.match(/[?]/)) {
        var re = /([?&]store=)[a-z0-9_]*/;
        if (href.match(re)) {
            href = href.replace(re, '$1'+code);
        } else {
            href += '&store='+code;
        }

        var re = /([?&]from_store=)[a-z0-9_]*/;
        if (href.match(re)) {
            href = href.replace(re, '');
        }
    } else {
        href += '?store='+code;
    }
    if (typeof(fromCode) != 'undefined') {
        href += '&from_store='+fromCode;
    }
    href += after;

    setLocation(href);
}

/**
 * Add classes to specified elements.
 * Supported classes are: 'odd', 'even', 'first', 'last'
 *
 * @param elements - array of elements to be decorated
 * [@param decorateParams] - array of classes to be set. If omitted, all available will be used
 */
function decorateGeneric(elements, decorateParams)
{
    var allSupportedParams = ['odd', 'even', 'first', 'last'];
    var _decorateParams = {};
    var total = elements.length;

    if (total) {
        // determine params called
        if (typeof(decorateParams) == 'undefined') {
            decorateParams = allSupportedParams;
        }
        if (!decorateParams.length) {
            return;
        }
        for (var k in allSupportedParams) {
            _decorateParams[allSupportedParams[k]] = false;
        }
        for (var k in decorateParams) {
            _decorateParams[decorateParams[k]] = true;
        }

        // decorate elements
        // elements[0].addClassName('first'); // will cause bug in IE (#5587)
        if (_decorateParams.first) {
            Element.addClassName(elements[0], 'first');
        }
        if (_decorateParams.last) {
            Element.addClassName(elements[total-1], 'last');
        }
        for (var i = 0; i < total; i++) {
            if ((i + 1) % 2 == 0) {
                if (_decorateParams.even) {
                    Element.addClassName(elements[i], 'even');
                }
            }
            else {
                if (_decorateParams.odd) {
                    Element.addClassName(elements[i], 'odd');
                }
            }
        }
    }
}

/**
 * Decorate table rows and cells, tbody etc
 * @see decorateGeneric()
 */
function decorateTable(table, options) {
    var table = $(table);
    if (table) {
        // set default options
        var _options = {
            'tbody'    : false,
            'tbody tr' : ['odd', 'even', 'first', 'last'],
            'thead tr' : ['first', 'last'],
            'tfoot tr' : ['first', 'last'],
            'tr td'    : ['last']
        };
        // overload options
        if (typeof(options) != 'undefined') {
            for (var k in options) {
                _options[k] = options[k];
            }
        }
        // decorate
        if (_options['tbody']) {
            decorateGeneric(table.select('tbody'), _options['tbody']);
        }
        if (_options['tbody tr']) {
            decorateGeneric(table.select('tbody tr'), _options['tbody tr']);
        }
        if (_options['thead tr']) {
            decorateGeneric(table.select('thead tr'), _options['thead tr']);
        }
        if (_options['tfoot tr']) {
            decorateGeneric(table.select('tfoot tr'), _options['tfoot tr']);
        }
        if (_options['tr td']) {
            var allRows = table.select('tr');
            if (allRows.length) {
                for (var i = 0; i < allRows.length; i++) {
                    decorateGeneric(allRows[i].getElementsByTagName('TD'), _options['tr td']);
                }
            }
        }
    }
}

/**
 * Set "odd", "even" and "last" CSS classes for list items
 * @see decorateGeneric()
 */
function decorateList(list, nonRecursive) {
    if ($(list)) {
        if (typeof(nonRecursive) == 'undefined') {
            var items = $(list).select('li')
        }
        else {
            var items = $(list).childElements();
        }
        decorateGeneric(items, ['odd', 'even', 'last']);
    }
}

/**
 * Set "odd", "even" and "last" CSS classes for list items
 * @see decorateGeneric()
 */
function decorateDataList(list) {
    list = $(list);
    if (list) {
        decorateGeneric(list.select('dt'), ['odd', 'even', 'last']);
        decorateGeneric(list.select('dd'), ['odd', 'even', 'last']);
    }
}

/**
 * Formats currency using patern
 * format - JSON (pattern, decimal, decimalsDelimeter, groupsDelimeter)
 * showPlus - true (always show '+'or '-'),
 *      false (never show '-' even if number is negative)
 *      null (show '-' if number is negative)
 */

function formatCurrency(price, format, showPlus){
    precision = isNaN(format.precision = Math.abs(format.precision)) ? 2 : format.precision;
    requiredPrecision = isNaN(format.requiredPrecision = Math.abs(format.requiredPrecision)) ? 2 : format.requiredPrecision;

    //precision = (precision > requiredPrecision) ? precision : requiredPrecision;
    //for now we don't need this difference so precision is requiredPrecision
    precision = requiredPrecision;

    integerRequired = isNaN(format.integerRequired = Math.abs(format.integerRequired)) ? 1 : format.integerRequired;

    decimalSymbol = format.decimalSymbol == undefined ? "," : format.decimalSymbol;
    groupSymbol = format.groupSymbol == undefined ? "." : format.groupSymbol;
    groupLength = format.groupLength == undefined ? 3 : format.groupLength;

    if (showPlus == undefined || showPlus == true) {
        s = price < 0 ? "-" : ( showPlus ? "+" : "");
    } else if (showPlus == false) {
        s = '';
    }

    i = parseInt(price = Math.abs(+price || 0).toFixed(precision)) + "";
    pad = (i.length < integerRequired) ? (integerRequired - i.length) : 0;
    while (pad) { i = '0' + i; pad--; }

    j = (j = i.length) > groupLength ? j % groupLength : 0;
    re = new RegExp("(\\d{" + groupLength + "})(?=\\d)", "g");

    /**
     * replace(/-/, 0) is only for fixing Safari bug which appears
     * when Math.abs(0).toFixed() executed on "0" number.
     * Result is "0.-0" :(
     */
    r = (j ? i.substr(0, j) + groupSymbol : "") + i.substr(j).replace(re, "$1" + groupSymbol) + (precision ? decimalSymbol + Math.abs(price - i).toFixed(precision).replace(/-/, 0).slice(2) : "")

    if (format.pattern.indexOf('{sign}') == -1) {
        pattern = s + format.pattern;
    } else {
        pattern = format.pattern.replace('{sign}', s);
    }

    return pattern.replace('%s', r).replace(/^\s\s*/, '').replace(/\s\s*$/, '');
};

function expandDetails(el, childClass) {
    if (Element.hasClassName(el,'show-details')) {
        $$(childClass).each(function(item){item.hide()});
        Element.removeClassName(el,'show-details');
    }
    else {
        $$(childClass).each(function(item){item.show()});
        Element.addClassName(el,'show-details');
    }
}

// Version 1.0
var isIE = navigator.appVersion.match(/MSIE/) == "MSIE";

if (!window.Varien)
    var Varien = new Object();

Varien.showLoading = function(){
    Element.show('loading-process');
}
Varien.hideLoading = function(){
    Element.hide('loading-process');
}
Varien.GlobalHandlers = {
    onCreate: function() {
        Varien.showLoading();
    },

    onComplete: function() {
        if(Ajax.activeRequestCount == 0) {
            Varien.hideLoading();
        }
    }
};

Ajax.Responders.register(Varien.GlobalHandlers);

/**
 * Quick Search form client model
 */
Varien.searchForm = Class.create();
Varien.searchForm.prototype = {
    initialize : function(form, field, emptyText){
        this.form   = $(form);
        this.field  = $(field);
        this.emptyText = emptyText;

        Event.observe(this.form,  'submit', this.submit.bind(this));
        Event.observe(this.field, 'focus', this.focus.bind(this));
        Event.observe(this.field, 'blur', this.blur.bind(this));
        this.blur();
    },

    submit : function(event){
        if (this.field.value == this.emptyText || this.field.value == ''){
            Event.stop(event);
            return false;
        }
        return true;
    },

    focus : function(event){
        if(this.field.value==this.emptyText){
            this.field.value='';
        }

    },

    blur : function(event){
        if(this.field.value==''){
            this.field.value=this.emptyText;
        }
    },

    initAutocomplete : function(url, destinationElement){
        new Ajax.Autocompleter(
            this.field,
            destinationElement,
            url,
            {
                paramName: this.field.name,
                minChars: 2,
                updateElement: this._selectAutocompleteItem.bind(this),
                onShow : function(element, update) { 
                    if(!update.style.position || update.style.position=='absolute') {
                        update.style.position = 'absolute';
                        Position.clone(element, update, {
                            setHeight: false, 
                            offsetTop: element.offsetHeight
                        });
                    }
                    Effect.Appear(update,{duration:0});
                }

            }
        );
    },

    _selectAutocompleteItem : function(element){
        if(element.title){
            this.field.value = element.title;
        }
        this.form.submit();
    }
}

Varien.Tabs = Class.create();
Varien.Tabs.prototype = {
  initialize: function(selector) {
    var self=this;
    $$(selector+' a').each(this.initTab.bind(this));
  },

  initTab: function(el) {
      el.href = 'javascript:void(0)';
      if ($(el.parentNode).hasClassName('active')) {
        this.showContent(el);
      }
      el.observe('click', this.showContent.bind(this, el));
  },

  showContent: function(a) {
    var li = $(a.parentNode), ul = $(li.parentNode);
    ul.getElementsBySelector('li', 'ol').each(function(el){
      var contents = $(el.id+'_contents');
      if (el==li) {
        el.addClassName('active');
        contents.show();
      } else {
        el.removeClassName('active');
        contents.hide();
      }
    });
  }
}

Varien.DOB = Class.create();
Varien.DOB.prototype = {
    initialize: function(selector, required, format) {
        var el        = $$(selector)[0];
        this.day      = Element.select($(el), '.dob-day select')[0];
        this.month    = Element.select($(el), '.dob-month select')[0];
        this.year     = Element.select($(el), '.dob-year select')[0];
        this.dob      = Element.select($(el), '.dob-full input')[0];
        this.advice   = Element.select($(el), '.validation-advice')[0];
        this.required = required;
        this.format   = format;

        this.day.validate = this.validate.bind(this);
        this.month.validate = this.validate.bind(this);
        this.year.validate = this.validate.bind(this);

        this.advice.hide();
    },

    validate: function() {
        var error = false;
        if (this.day.value=='' && this.month.value=='' && this.year.value=='') {
            if (this.required) {
                error = 'This date is a required value.';
            } else {
                this.dob.value = '';
            }
        } else if (this.day.value=='' || this.month.value=='' || this.year.value=='') {
            error = 'Please enter a valid full date.';
        } else {
            var date = new Date();
            if (this.day.value<1 || this.day.value>31) {
                error = 'Please enter a valid day (1-31).';
            } else if (this.month.value<1 || this.month.value>12) {
                error = 'Please enter a valid month (1-12).';
            } else if (this.year.value<1900 || this.year.value>date.getFullYear()) {
                error = 'Please enter a valid year (1900-'+date.getFullYear()+').';
            } else {
                this.dob.value = this.format.replace(/(%m|%b)/i, this.month.value).replace(/(%d|%e)/i, this.day.value).replace(/%y/i, this.year.value);
                var testDOB = this.month.value + '/' + this.day.value + '/'+ this.year.value;
                var test = new Date(testDOB);
                if (isNaN(test)) {
                    error = 'Please enter a valid date.';
                }
            }
        }

        if (error !== false) {
            try {
                this.advice.innerHTML = Translator.translate(error);
            }
            catch (e) {
                this.advice.innerHTML = error;
            }
            this.advice.show();
            return false;
        }

        this.advice.hide();
        return true;
    }
}

Validation.addAllThese([
    ['validate-custom', ' ', function(v,elm) {
        return elm.validate();
    }]
]);

function truncateOptions() {
    $$('.truncated').each(function(element){
        Event.observe(element, 'mouseover', function(){
            if (element.down('div.truncated_full_value')) {
                element.down('div.truncated_full_value').addClassName('show')
            }
        });
        Event.observe(element, 'mouseout', function(){
            if (element.down('div.truncated_full_value')) {
                element.down('div.truncated_full_value').removeClassName('show')
            }
        });

    });
}
Event.observe(window, 'load', function(){
   truncateOptions();
});

// Ben Cole
// 23rd Sept 2010
// Ajax for guift guide

function reloadGiftGuide(request_url, baseurl, selectCount){
		
		if(request_url===''){
			return false;
		}
		//append a div to the window and 'grey out' the part being reloaded
		var apply = "<img src='"+baseurl+"skin/frontend/pacman/default/images/global/ajax-loader.gif' class='v-middle' /> &nbsp; Finding your perfect gift - Please Wait... &nbsp;";
		$j('#ajax_loader').empty();
		$j('#ajax_loader').html(apply);
		$j('#ajax_loader').show();		
		$j('#category_wrapper').addClass('gg_opaque');
		
		$j(document).ready(function() { 
			$j('#current_url').html(request_url);
			//get total block
			$j.ajax({
				type: "GET",
				url: request_url,
				success: function(html){
					//append ajax repsonse to div here
					$j('#category_wrapper').empty();
					$j('#category_wrapper').html(html);
					//loop through all filter selects
					for(counter=1; counter < 4; counter++){
						var selectName = '#ajax_select'+counter;
						$j(selectName).each(function(){
							//loop through each option and move the value to the orig
							$j('option', this).each(function() {
								//work out matching select
								var current_id = ieProofSubstr(this.id, 2);
								var current_val = this.value;
								var origSelectName = '#orig_select'+counter;
								//loop through orig select options
								$j(origSelectName).each(function(){
									$j('option', this).each(function() {
										var newId = ieProofSubstr(this.id, 2);
										//make sure id is correct and update value to new ajax value
										if(newId == current_id){
											$j(this).val(current_val);
										}
									});
								});

							});
						});
					}
					//if we are clearing a filter then set that filters drop down back to null
					if ( selectCount !== undefined ) {
						var origSelectName = '#orig_select'+selectCount;
						var origSelectOption = '#orig_select'+selectCount+' option:first';
						$j(origSelectName).val($j(origSelectOption).val());
					}
					
					//set opacity back to normal
					$j('#ajax_loader').hide();		
					$j('#category_wrapper').removeClass('gg_opaque');
		
				}
			});
		});
	}
	
	function ieProofSubstr(string, to){
		var full_id_len = string.length;
		var new_id = string.substring(full_id_len-to);
		return new_id;						
	}
	
	function removeFilter(filter, baseurl){
		var current = $j('#current_url').html();
		var substr = current.split('&amp;');
		var return_url = substr[0];
		for(var i = 1; i<substr.length; i++){
			var part = substr[i];
			var code = part.split('=');
			if(code.length >1){
				if(code[0] != filter){
					return_url += '&'+part;
				}
			}
		};
		reloadGiftGuide(return_url, baseurl);
		return false;
	}

// Ben Cole
// 30th July 2010
// Ajax reload parts of the page for load balancer caching
	function refresh_dynamic_content(baseUrl){
		//warp a div around recently viewed items for reloading later
		$j('#recently_viewed').wrap('<div id="recently_viewed_wrapper" />')
		//reload cart
		$j.ajax({
			type: "GET",
			url: baseUrl+'checkout/cart/reloadtopcart',
			success: function(response){
				//append cart to div
				$j('#basket_content').hide();
				$j('#basket_content').html(response);
				$j('#basket_content').fadeIn('1000');
			}
		})
		//reload recently viewed items
		$j.ajax({
			type: "GET",
			url: baseUrl+'checkout/cart/reloadviewed',
			success: function(response){
				//append recently viewed items to wrapper div
				$j('#recently_viewed').hide();
				$j('#recently_viewed').html(response);
				$j('#recently_viewed').fadeIn('1000');
			}
		})
	}
	
	
// Ben Cole
// 8th April 2010
// Ben's Onepage Checkout

	//declare global variables
	var completeArray = new Array();
	var baseUrlGlobal = '';
	var reloading_cart= false;
	var firstload= true;
	
	function  setGlobalBaseUrl(baseUrl){
		baseUrlGlobal = baseUrl;
	}
	
	//move scroll bar to top of page
	function reset_scroll() {
		javascript:scroll(0,0)
	}
	
	//check if a value is in an array
	function in_array(needle, haystack, argStrict) {
		var key = '', strict = !!argStrict; 
		if (strict) {
			for (key in haystack) {
				if (haystack[key] === needle) {
					return true;            }
			}
		} else {
			for (key in haystack) {
				if (haystack[key] == needle) {                return true;
				}
			}
		}
		 return false;
	}
		
	//new checkout refresh cart using jquery
	function reload_cart(baseUrl) { 
		
		if(firstload){
			firstload = false;
			reloading_cart = false;
			/*if(!methodNotRunning('shipMethod')){
				setTimeout("reload_cart()",2000);
			}
			return;*/
		}
		
		if(!baseUrl){
			baseUrl = baseUrlGlobal;
		}
		$j(document).ready(function() { 
			
		
		$j.ajaxSetup ({  
			cache: false  
		}); 
				
		//set ajax cart loader
		//var loader = "<div class ='checkout_cart_loader'><img src='"+baseUrl+"skin/frontend/pacman/default/images/global/opc-ajax-loader.gif' class='v-middle' /> &nbsp; Loading... &nbsp;</div>";
		//$j('#checkout-cart-wrapper').html(loader);
		
			//get cart 
			$j.ajaxSync({
				type: "GET",
				url: baseUrl+"checkout/onepage/cart",
				success: function(responseCart){
					//reloadTotal(baseUrl);
					$j('#checkout-cart-wrapper').hide();
					$j('#checkout-cart-wrapper').html(responseCart);
					$j('#checkout-cart-wrapper').fadeIn('2000');
					$j('#checkout-cart-wrapper-review').hide();
					$j('#checkout-cart-wrapper-review').html(responseCart);
					$j('#checkout-cart-wrapper-review').fadeIn('2000');
					
					if($('shipping:new_address_flag')){
						if($('shipping:new_address_flag').value=='1'){
							$j.ajax({
								type: "GET",
								url: baseUrl+'checkout/onepage/reloadShipping',
								success: function(responseShipping){
									$j('#checkout-shipping-wrapper').html(responseShipping);
									//show the address book
									$j('#checkout_address_book').show(); 
									$j('#default_address').hide(); 
									//change drop down and radio button for last address in list to true
										$('shipping-address-select').value='';
										var addresses = $j('input[name=shipping_addresses]');
										for( var counter = 0, address_count = addresses.length;  counter < address_count;  ++counter ) {
											if(counter == address_count-1){
												var last_element_value = addresses[counter].value;
												$('shipping-address-select').value= last_element_value;
												$j("input[name=shipping_addresses]").attr("checked", true); 
											}
										}
									//changeStoredAddress(last_element_value, baseUrl)
									setDefaultClass(last_element_value);
									placeOrderButton(true, true);
									if(!checkout.loadWaiting){
										$('shipping_addresses_row_loader').hide();
									}else{
										checkout.setLoadWaiting(false);
									}
								}
							})
						}else{
							placeOrderButton(true, true);
							checkout.setLoadWaiting(false);
						}
					}else{
						placeOrderButton(true, true);
						checkout.setLoadWaiting(false);
					}
				}
			})
		})	
		reloading_cart = false;		
	}		
	
	function saveAll(baseUrl){
		
		$j.ajaxSetup ({  
			cache: false  
		}); 
		
		var load_waiting = 'shipping';
		checkout.setLoadWaiting(load_waiting);
		
		if($j("#co-shipping-form").length > 0 ){
			//collect shipping and method post data
			var shippingPost = $("co-shipping-form").serialize();
	
			$j.ajaxSync({
				type: "POST",
				url: baseUrl+"checkout/onepage/saveShipping/",
				data: shippingPost,
				success: function(html){
					$j.ajaxSync({
						type: "GET",
						url: baseUrl+"checkout/onepage/reloadMethods/",
						success: function(html){
							$j('#checkout-shipping-methods-wrapper').empty();
							$j('#checkout-shipping-methods-wrapper').html(html);
							//on shiping save complete save shipping method
							var shippingMethodPost = $("co-shipping-method-form").serialize();
							$j.ajaxSync({
								type: "POST",
								url: baseUrl+"checkout/onepage/saveShippingMethod/",
								data: shippingMethodPost,
								success: function(html){
									reload_cart();
									if($('shipping:new_address_flag').value!='1'){
										checkout.setLoadWaiting(false);
									}
								}
							})
						}
					})
				}
			})
		}else{
			reload_cart();
			checkout.setLoadWaiting(false);
		}
	}
	
	//after adding new shipping address callback
	//save shipping method and reload stored address block and then reload cart
	function reload_NewShipping(baseUrl){
		//var load_waiting = 'shipping';
		//checkout.setLoadWaiting(load_waiting);
		
			var shippingMethodPost = $("co-shipping-method-form").serialize();
				$j.ajaxSync({
					type: "POST",
					url: baseUrl+"checkout/onepage/saveShippingMethod/",
					data: shippingMethodPost,
					success: function(html){
						reload_cart();
					}
				})
			
	}
	
	//reload grand total block
	function reloadTotal(baseUrl){
		$j(document).ready(function() { 
			
			$j.ajaxSetup ({  
				cache: false  
			}); 
				
			//get total block
			$j.ajax({
				type: "GET",
				url: baseUrl+"checkout/onepage/reloadTotal",
				success: function(html){
					//append result to div here
					$j('#final_grand_total').html(html);
				}
			})
		})		
	}
	
	//get available shipping methods ajax call
	function getMethods(baseUrl){
		$j(document).ready(function() { 
			if($j("#co-shipping-form").length > 0 ){
				placeOrderButton(false, true);
						
				$j.ajaxSetup ({  
					cache: false  
				}); 
				
				//get shipping methods
				$j.ajaxSync({
					type: "POST",
					url: baseUrl+"checkout/onepage/reloadMethods",
					data: $("co-shipping-form").serialize(),
					success: function(html){
						$j('#checkout-shipping-methods-wrapper').html(html);
								
						var shippingMethodPost = $("co-shipping-method-form").serialize();
						$j.ajaxSync({
							type: "POST",
							url: baseUrl+"checkout/onepage/saveShippingMethod/",
							data: shippingMethodPost,
							success: function(html){
								reload_cart(baseUrl);
							}
						})
					}
				})
			}else{
				reload_cart(baseUrl);
			}
		})		
	}
	
	//show/ hide place order button
	function placeOrderButton(show, loader){
		if (show){
			placeOrderMessage('off');
			$j('#review-button').attr("disabled", "");
			$j('#review-button').css('opacity', '1' );
			$j('#order-please-wait').hide();
		}else{
			$j('#review-button').attr("disabled", "disabled");
			$j('#review-button').css('opacity', '0.5' );
			if(loader){
				$j('#order-please-wait').show();
			}
		}
	}
	
	function placeOrderMessage(type){
		switch(type){
			case('billing'):
				$j('#review_message').html('Please save your billing address before placing your order');
				$j('#review_message').show();
			break;
			case('shipping'):
				$j('#message_loader').show();
				$j('#review_message').html('Calculating Shipping Costs...');
				$j('#review_message').show();
			break;
			case('shipping-edit'):
				$j('#review_message').html('Please save your shipping address before placing your order');
				$j('#review_message').show();
			break;
			case('discount-add'):
				$j('#message_loader').show();
				$j('#review_message').html('Applying discount voucher please wait...');
				$j('#review_message').show();
			break;
			case('discount-remove'):
				$j('#message_loader').show();
				$j('#review_message').html('Removing discount voucher please wait...');
				$j('#review_message').show();
			break;
			case('off'):
				$j('#message_loader').hide();	
				$j('#review_message').hide();	
			break;
		}
	}
	
	//new address save order action
	//when the customer does not having addresses we need to save the billing and shipping address
	//when the place order button is clicked b4 saving the rest of the order as normal
	function saveOrder(baseUrl){
		$j(document).ready(function() { 
		
		checkout.setLoadWaiting('review');
        
			//collect billing and shipping post data
			var billingPost = $("co-billing-form").serialize();
			if($('shipping:new_address_flag')){
				var shippingPost = $("co-shipping-form").serialize();
			}
			
			$j.ajax({
				type: "POST",
				url: baseUrl+"checkout/onepage/saveBilling",
				data: billingPost,
				success: function(html){
					//if checkout is virtual we dont need to save shipping
					if($j("#co-shipping-form").length > 0 ){
						//on billing save complete save shipping
						$j.ajax({
							type: "POST",
							url: baseUrl+"checkout/onepage/saveShipping",
							data: shippingPost,
							success: function(html){
								//on shipping save complete save rest of order as normal
								review.save();
							}
						})
					}else{
						review.save();
					}
				}
			})
		})	
	}
	
	//submit a discount voucher ajax call to apply and refresh discount code box
	function submitVoucher(baseUrl, removing, type){
		placeOrderButton(false, false);
		var formdata = $("discount-coupon-form").serialize();
		
			
		//set ajax cart loader
		var apply = "<div class ='discount_loader'><img src='"+baseUrl+"skin/frontend/pacman/default/images/global/opc-ajax-loader.gif' class='v-middle' /> &nbsp; Applying "+type+" please wait... &nbsp;</div>";
		var unapply = "<div class ='discount_loader'><img src='"+baseUrl+"skin/frontend/pacman/default/images/global/opc-ajax-loader.gif' class='v-middle' /> &nbsp; Removing discount voucher please wait... &nbsp;</div>";
		
		if(removing){
			placeOrderMessage('discount-remove');
			$j('#coupon_wrapper').html(unapply);
		}else{
			placeOrderMessage('discount-add');
			$j('#coupon_wrapper').html(apply);
		}
		
		$j.ajaxSync({
			type: "POST",
			url: baseUrl+"checkout/cart/couponPost",
			data: formdata,
			success: function(html){
				reloadPayment(baseUrl,false);
				reloadCartAfterVoucher(baseUrl, html);
			}
		})
	
	}
	
	//reload cart after discount post and show messages
	function reloadCartAfterVoucher(baseUrl,message){
		reloading_cart = true;	
		//get cart 
		$j.ajaxSync({
			type: "GET",
			url: baseUrl+"checkout/onepage/cart",
			success: function(responseCart){
				//reloadTotal(baseUrl);
				$j('#checkout-cart-wrapper').hide();
				$j('#checkout-cart-wrapper').html(responseCart);
				$j('#messages').append(message)
				$j('#checkout-cart-wrapper').fadeIn('2000');
				
				placeOrderButton(true, true);
				placeOrderMessage('off');
				checkout.setLoadWaiting(false);
			}
			
		})

		reloading_cart = false;		
	
	}
	
	function cancelGiftcard(url, baseUrl){
		placeOrderButton(false, false);
		//set ajax cart loader
		var unapply = "<div class ='discount_loader'><img src='"+baseUrl+"skin/frontend/pacman/default/images/global/opc-ajax-loader.gif' class='v-middle' /> &nbsp; Removing gift card please wait... &nbsp;</div>";
		$j('#coupon_wrapper').html(unapply);
		var cancelUrl = baseUrl+url;
		$j.ajaxSync({
			type: "GET",
			url: cancelUrl,
			success: function(html){
				/*$j.ajaxSync({
					type: "GET",
					url: baseUrl+'checkout/cart/reloaddiscount',
					success: function(response){
						$j('#coupon_wrapper').html(response);
						
					}
				})*/
				reloadPayment(baseUrl, true);
				$j('#messages').append(html);
			}
		})
	}
	
	//reload payment block
	function reloadPayment(baseUrl,cart){
		$j.ajaxSync({
			type: "GET",
			url: baseUrl+'checkout/onepage/reloadPayment',
			success: function(response){
				$j('#checkout_payments_wrapper').html(response);
				if(cart){
					reload_cart();
				}
			}
		})
	}
	
	//reload billing address after edit
	function billingEdit(baseUrl){
		var formdata = $("co-billing-form").serialize();
		
		$j.ajax({
			type: "POST",
			url: baseUrl+"checkout/onepage/reloadBilling",
			data: formdata,
			success: function(html){
				if(html=='error'){
					$j.ajax({
						type: "GET",
						url: baseUrl+"checkout/onepage/reloadBillingError",
						success: function(html){
							alert('There was an error saving your billing address.');
							$j('#billing_ajax_wrapper').html(html);	
							checkout.setLoadWaiting(false);
						}
					})
				}else{
					$j('#billing_ajax_wrapper').html(html);
					if($('shipping:new_address_flag')){
						checkout.setLoadWaiting('shipping');	
						reloadShippingBlock(baseUrl, false)
						checkout.setLoadWaiting(false);
					}else{
						reload_cart();
					}
				}
				placeOrderButton(false, false);
			}
		})
	
	}
	
	//fire onclick when saving an address through the checkout
	function shippingEdit(baseUrl, id){
		var get_url = baseUrl+"checkout/onepage/editShipping/id/"+id;
		placeOrderButton(false, false);
		placeOrderMessage('shipping-edit');
					
		if($('shipping_edit:saving_address')){
			if($('shipping_edit:saving_address').value == '1'){
				var formdata = $("shipping-edit-form").serialize();
				if($('shipping_edit:address_id')){
					var saveid = $('shipping_edit:address_id').value;
				}
				var validator = new Validation('shipping-edit-form');
				if (validator.validate()) {
					if($('checkout_address_book')){
						$('checkout_address_book').setStyle({opacity:.5});
					}
					checkout.setLoadWaiting('shipping');
					$j.ajax({
						type: "POST",
						data: formdata,
						url: get_url,
						success: function(html){
							if(html=='success'){
								if(saveid){
									reloadShippingBlock(baseUrl,saveid);
								}
							}else{
								alert(html);
							}
						}
					})
				}
			}
		}else{
			$j('#co-shipping-form').wrap('<div id="shipping_edit_wrap" />')
					
			$j.ajax({
				type: "GET",
				url: get_url,
				success: function(html){
					$j('#shipping_edit_wrap').html(html);
					$j('#shipping_edit_wrap').fadeIn('3000');
					checkout.setLoadWaiting(false);					
				}
			})
		}
	}
	
	function reloadShippingBlock(baseUrl, saveid){
		if($j('#checkout-shipping-wrapper')){
			var show_book = false;
			if($j('#checkout_address_book').is(":visible")){
				show_book = true;
			}
			$j.ajax({
				type: "GET",
				url: baseUrl+'checkout/onepage/reloadShipping',
				success: function(responseShipping){
					$j('#checkout-shipping-wrapper').hide();
					if(saveid){
						$j('#checkout-shipping-wrapper').html(responseShipping);
						$j('#checkout-shipping-wrapper').fadeIn('2000');
						if($('shipping-address-select')){
							//show the address book
							$j('#checkout_address_book').show(); 
							$j('#default_address').hide(); 
																
							//change drop down and radio button to the address just saved and then resave the address model
							$('shipping-address-select').value= saveid;
							var addresses = $j('input[name=shipping_addresses]');
							for( var counter = 0, address_count = addresses.length;  counter < address_count;  ++counter ) {
								var current_id = addresses[counter].value;
								if(current_id == saveid){
									$j("input[name=shipping_addresses]:eq("+counter+")").attr("checked", true); 
								}
							}
							setDefaultClass(saveid);
							checkout.setLoadWaiting(false);
							placeOrderMessage('shipping');
							saveAll(baseUrl);
						}
					}else{
						$j('#checkout-shipping-wrapper').html(responseShipping);
						if(show_book){
							$j('#checkout_address_book').show(); 
							$j('#default_address').hide(); 
						}
						$j('#checkout-shipping-wrapper').fadeIn('2000');
							
						checkout.setLoadWaiting(false);
						placeOrderButton(true, true);
					}
					
				}
			})	
		}
	
	}
			
	//change the selected address in the address book
	function changeAddress(object, baseUrl, addressId){
		setDefaultClass(addressId); 
		placeOrderButton(false, false); 
		placeOrderMessage('shipping'); 
		$('shipping-address-select').value=addressId; 
		$('shipping-new-address-form').hide(); 
		$('shipping:new_address_flag').value='0'; 
		var current_li = "#"+$j(object).attr('id');
		var current_radio = "#"+$j(current_li).children("input[@type=radio]").attr('id');
		$j(current_radio).attr('checked', true);
		saveAll(baseUrl);
	}
	
	function changeStoredAddress(value, baseUrl){
		var address_query = "address_id="+value;
		$j.ajax({
			type: "GET",
			url: baseUrl+'checkout/onepage/changeStoredAddress?'+address_query,
			success: function(response){
				$j('#default_address').html(response);
				$('checkout_address_book').hide(); 
				$('default_address').show();
			}
		})	
	
	}

	function toogleDefaultShipping(checkedValue){
	
		if(checkedValue){
			$('default_shipping_wrapper').hide();
			$j('#shipping_default').attr('checked', true);
		}else{
			$('default_shipping_wrapper').show();
			$j('#shipping_default').attr('checked', false);
		}
	
	}
	
	function setDefaultClass(id){
		
		var selected_address = "addressBook_"+id;
			//remove default class from all addresses
			$j("#checkout_address_book li").each(function(i) {
				$j(this).removeClass('selected');
				if($j(this).attr('id') == selected_address){
					$j(this).addClass('selected');
				}
				
			});
	}
	
	//add new address
	function showAddAddress(){
		//placeOrderButton(false, false); 
		$('shipping:new_address_flag').value='1'; 
		$('shipping-address-select').value=''; 
		$j('#shipping-new-address-form').slideToggle();  
		$('action_buttons').show(); 
		$j('#checkout_address_book').slideToggle(); 
		return false;
	}
	
	function showAddressBook(){
		$j('#default_address').hide(); 
		$j('#checkout_address_book').show(); 
		return false;
	}
	
	//remove cart item when on checkout 
	
	function removeCartItem(postUrl, baseUrl, itemId){
		var url = postUrl;
		$('checkout-cart').setStyle({opacity:.5});
		$j('#remove_link_'+itemId).addClass('buy_button_grid_ajax');
		$j('#remove_img_'+itemId).hide();
		
		$j.ajax({
			type: "GET",
			url: url,
			success: function(html){
				if (html.indexOf('***NO ITEMS***') == -1){
					reload_cart();
				}else{
					setLocation(baseUrl+'checkout/cart/');
				}				
				
			}
		})
	
	}
