function substr (str, start, len) {
    var i = 0, allBMP = true, es = 0, el = 0, se = 0, ret = '';
    str += '';
    var end = str.length;
 
    this.php_js = this.php_js || {};
    this.php_js.ini = this.php_js.ini || {};
    switch(
        (this.php_js.ini['unicode.semantics'] && 
            this.php_js.ini['unicode.semantics'].local_value.toLowerCase())) {
        case 'on': 
            for (i=0; i < str.length; i++) {
                if (/[\uD800-\uDBFF]/.test(str.charAt(i)) && /[\uDC00-\uDFFF]/.test(str.charAt(i+1))) {
                    allBMP = false;
                    break;
                }
            }
 
            if (!allBMP) {
                if (start < 0) {
                    for (i = end - 1, es = (start += end); i >= es; i--) {
                        if (/[\uDC00-\uDFFF]/.test(str.charAt(i)) && /[\uD800-\uDBFF]/.test(str.charAt(i-1))) {
                            start--;
                            es--;
                        }
                    }
                }
                else {
                    var surrogatePairs = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
                    while ((surrogatePairs.exec(str)) != null) {
                        var li = surrogatePairs.lastIndex;
                        if (li - 2 < start) {
                            start++;
                        }
                        else {
                            break;
                        }
                    }
                }
 
                if (start >= end || start < 0) {
                    return false;
                }
                if (len < 0) {
                    for (i = end - 1, el = (end += len); i >= el; i--) {
                        if (/[\uDC00-\uDFFF]/.test(str.charAt(i)) && /[\uD800-\uDBFF]/.test(str.charAt(i-1))) {
                            end--;
                            el--;
                        }
                    }
                    if (start > end) {
                        return false;
                    }
                    return str.slice(start, end);
                }
                else {
                    se = start + len;
                    for (i = start; i < se; i++) {
                        ret += str.charAt(i);
                        if (/[\uD800-\uDBFF]/.test(str.charAt(i)) && /[\uDC00-\uDFFF]/.test(str.charAt(i+1))) {
                            se++;
                        }
                    }
                    return ret;
                }
                break;
            }
        case 'off': 

        default:
            if (start < 0) {
                start += end;
            }
            end = typeof len === 'undefined' ? end : (len < 0 ? len + end : len + start);
            return start >= str.length || start < 0 || start > end ? !1 : str.slice(start, end);
    }
    return undefined;
}


function strlen (string) {
    var str = string+'';
    var i = 0, chr = '', lgth = 0;
 
    if (!this.php_js || !this.php_js.ini || !this.php_js.ini['unicode.semantics'] ||
        this.php_js.ini['unicode.semantics'].local_value.toLowerCase() !== 'on') {
        return string.length;
    }
 
    var getWholeChar = function (str, i) {
        var code = str.charCodeAt(i);
        var next = '', prev = '';
        if (0xD800 <= code && code <= 0xDBFF) {
            if (str.length <= (i+1))  {
                throw 'High surrogate without following low surrogate';
            }
            next = str.charCodeAt(i+1);
            if (0xDC00 > next || next > 0xDFFF) {
                throw 'High surrogate without following low surrogate';
            }
            return str.charAt(i)+str.charAt(i+1);
        } else if (0xDC00 <= code && code <= 0xDFFF) {
            if (i === 0) {
                throw 'Low surrogate without preceding high surrogate';
            }
            prev = str.charCodeAt(i-1);
            if (0xD800 > prev || prev > 0xDBFF) {
                throw 'Low surrogate without preceding high surrogate';
            }
            return false;
        }
        return str.charAt(i);
    };
 
    for (i=0, lgth=0; i < str.length; i++) {
        if ((chr = getWholeChar(str, i)) === false) {
            continue;
        }
        lgth++;
    }
    return lgth;
}

function strpos (haystack, needle, offset) {
    var i = (haystack+'').indexOf(needle, (offset || 0));
    return i === -1 ? false : i;
}

function calculateShipping() {	
	if(
		jQuery('#billing_postcode').val()!="" &&
		jQuery('#billing_state').val()!="" &&
		jQuery('#billing_country').val()!="" &&
		jQuery('#shipping_postcode').val()=="" &&
		jQuery('.same').val()==1
	) {
	
jQuery.post("/shop/js_shipping", { billing_postcode: jQuery('#billing_postcode').val(), billing_state: jQuery('#billing_state').val(), billing_country: jQuery('#billing_country').val(), total_weight: jQuery('#total_weight').val(),subtotal:jQuery('#cost').html()}, function (data) {


			
			if(data[0].options==0) { 
			} else if(data[0].options==2) {
				jQuery('.field-shipping').html('<input type="radio" class="carrier" name="carrier" value="'+data[1].form+'" checked="checked" />'+data[1].carrier+'<br /><input type="radio" name="carrier" class="carrier" value="'+data[2].form+'" />'+data[2].carrier+'<div class="'+data[1].form+'_cost" style="display:none">'+data[1].cost+'</div>'+'<div class="'+data[2].form+'_cost" style="display:none">'+data[2].cost+'</div>');
				var shipcost = data[1].cost;
			} else {
				jQuery('.field-shipping').html(data[1].carrier);
				var shipcost = data[1].cost;
			}
		
			if(strpos(shipcost,'.',0)==0) {
				shipcost = shipcost+'.00';
			} else {
				if(String(shipcost).length-strpos(shipcost,'.',0)==2) {
					shipcost = shipcost+'0';
				}
			}

			jQuery('#ship_cost').html(shipcost);
			cost = parseFloat(data[1].cost) + parseFloat(jQuery('#cost').html());
			
			if(strpos(cost,'.',0)==0) {
				cost = cost+'.00';
			} else {
				if(String(cost).length-strpos(cost,'.',0)==2) {
					cost = cost+'0';
				}
			}
			if(String(cost).length-strpos(cost,'.',0)>3) {
				pos = strpos(cost,'.',0)+2;
				cost = substr(cost,0,pos);
			}
			
			jQuery('#total_cost').html(cost);
			if(jQuery('#data').length==0) {
				jQuery('.submit').append('<input type="hidden" name="shipping" value="'+data[1].form+'" id="data" />');
				jQuery('.submit .checkout').val('Checkout');
			}
			jQuery('#calculate').hide();
			jQuery('.checkout').show();
		}, "json");
	}
	
	if(
		jQuery('#shipping_postcode').val()!="" &&
		jQuery('#shipping_state').val()!="" &&
		jQuery('#shipping_country').val()!=""
	)
	 {
		jQuery.post("/shop/js_shipping", { billing_postcode: jQuery('#shipping_postcode').val(), billing_state: jQuery('#shipping_state').val(), billing_country: 'AU', total_weight: jQuery('#total_weight').val()}, function (data) {

			if(data[0].options==0) { 
			} else if(data[0].options==2) {
				jQuery('.field-shipping').html('<input type="radio" class="carrier" name="carrier" value="'+data[1].form+'" checked="checked" />'+data[1].carrier+'<br /><input type="radio" name="carrier" class="carrier" value="'+data[2].form+'" />'+data[2].carrier+'<div class="'+data[1].form+'_cost" style="display:none">'+data[1].cost+'</div>'+'<div class="'+data[2].form+'_cost" style="display:none">'+data[2].cost+'</div>');
				var shipcost = data[1].cost;
			} else {
				jQuery('.field-shipping').html(data[1].carrier);
				var shipcost = data[1].cost;
			}
		
			if(strpos(shipcost,'.',0)==0) {
				shipcost = shipcost+'.00';
			} else {
				if(String(shipcost).length-strpos(shipcost,'.',0)==2) {
					shipcost = shipcost+'0';
				}
			}

			jQuery('#ship_cost').html(shipcost);
			cost = parseFloat(data[1].cost) + parseFloat(jQuery('#cost').html());
			
			if(strpos(cost,'.',0)==0) {
				cost = cost+'.00';
			} else {
				if(String(cost).length-strpos(cost,'.',0)==2) {
					cost = cost+'0';
				}
			}
			if(String(cost).length-strpos(cost,'.',0)>3) {
				pos = strpos(cost,'.',0)+2;
				cost = substr(cost,0,pos);
			}
			
			jQuery('#total_cost').html(cost);
			if(jQuery('#data').length==0) {
				jQuery('.submit').append('<input type="hidden" name="shipping" value="'+data[1].form+'" id="data" />');
				jQuery('.submit .checkout').val('Checkout');
			}
			jQuery('#calculate').hide();
			jQuery('.checkout').show();
			
		}, "json");
	}
}
		
jQuery(document).ready(function($) {
	$("#page").after('<div id="modal"/><div id="overlay"/>');
	$("#overlay").hide();
	
	$('.shipping-fields').hide();
	
	$('.same').click(function(){
		if($(this).val()=="0") {
			$('.shipping-fields').slideDown();
		} else {
			$('.shipping-fields').slideUp();
		}
		calculateShipping();
	});
	
	$('form').append('<input type="hidden" name="js" value="true" />');	
	
	$("#billing_state").change(function(){
		calculateShipping();
	});
	
	$("#billing_country").change(function(){
		calculateShipping();
	});
	
	$("#shipping_state").change(function(){
		calculateShipping();
	});

	$(".add-cart").bind("click", function (e) {
		$("#overlay").fadeIn(500);
		$("#modal").html('<div class="loading"/>');
		$("#modal").fadeIn(500);
		
		var el = $(this);
		var items = parseInt($('#count').html());
		items = items + 1;
		var name = $('.name', el.parents('form')).val();
		var productID = $('.id', el.parents('form')).val();

		$.post("/shop/add", $(el.parents('form')).serialize(), function (data) {
			$("#modal").html(data.message + '<div id="AddCartOptions"><a href="#" class="closemodal">Continue Shopping</a> | <a href="/shop/cart">View Shopping Cart</a> | <a href="/shop/cart">Checkout</a></div>');
			$("#count").text(items);
		}, "json");
		return false;
	});

	$(".closemodal").live('click', function(){
		$("#overlay").fadeOut(500);
		$("#modal").fadeOut(500);
		$("#modal").html('');
		return false;
	});
	
	$("#overlay").click(function(){
		$("#overlay").fadeOut(500);
		$("#modal").fadeOut(500);
		$("#modal").html('');
		return false;
	});
	
	$('.carrier').live('click', function() {
		var name = $(this).val();
		
		//alert($(this).val());
		if($(this).val()==$("#data").val()) {
			//alert('unchanged'); 
		} else { 
			//alert('changed'); 
			$("#data").val($(this).val())
			
			var shipcost = $('.'+name+'_cost').html();
			//alert(shipcost);
				
			if(strpos(shipcost,'.',0)==0) {
				shipcost = shipcost+'.00';
			} else {
				if(String(shipcost).length-strpos(shipcost,'.',0)==2) {
					shipcost = shipcost+'0';
				}
			}

			jQuery('#ship_cost').html(shipcost);
			var cost = parseFloat(shipcost) + parseFloat(jQuery('#cost').html());
			
			if(strpos(cost,'.',0)==0) {
				cost = cost+'.00';
			} else {
				if(String(cost).length-strpos(cost,'.',0)==2) {
					cost = cost+'0';
				}
			}
			if(String(cost).length-strpos(cost,'.',0)>3) {
				pos = strpos(cost,'.',0)+2;
				cost = substr(cost,0,pos);
			}
			
			jQuery('#total_cost').html(cost);
		}
	});

	
	
	$(".theaddressbook").change(function(){
 	   	var selected=$(".theaddressbook").val();
 	   	if (selected!="0"){
			$("#billing_details").slideUp();
			$.post("/shop/js_shipping", { billing_postcode: $('#address_'+selected+'_1').val(), billing_state: $('#address_'+selected+'_2').val(), billing_country: $('#address_'+selected+'_3').val(), total_weight: $('#total_weight').val()}, function (data) {
				$('#ship_cost').html(data.cost);
				var cost = parseFloat(data.cost) + parseFloat($('#cost').html());
				$('#total_cost').html(cost);
				if($('#data').length==0) {
					$('.submit').append('<input type="hidden" name="shipping" value="'+data.form+'" id="data" />');
				}
				$('#calculate').hide();
				$('.field-shipping').html(data.carrier);
				$('.checkout').show();
			}, "json");
			
			return false;
		}
    	else{
			$("#billing_details").slideDown();
			return false;
		}
 	});
});
