/* 
Copyright 2011  Jess Johnson  (email : jess@grokcode.com)
This file is subject to the terms and conditions defined in
file 'LICENSE.txt', which is part of this source code package.

http://geotargeter.net for more info.

*/

var amzUrlRegex = 'https?\://(www\.)?amazon\.(com|co\.uk|ca|de|cn|fr|co\.jp|it)/';

jQuery(document).ready(function() {

	if (containsAmazonLinks()) {

		// Check if we stored the location in a cookie.
		country = getCookie("loc");

		if (country) {
			rewrite(country);
		} else {
			jQuery.getJSON('http://api.ipinfodb.com/v3/ip-country/?key=' + MyAjax.key + ' &format=json&callback=?',
			               {},
						   function(response) {
							   setCookie("loc", response.countryCode, 365);
							   rewrite(response.countryCode);
						   });
		}
	}
});	
					   
					   
function rewrite(country) {

	if (!country) return; // couldn't get user's location - abort 

	var amzTldToUse;
	amzTldToUse = getTLDFromLocation(country);
	
	if (!amzTldToUse) return; // location doesn't have a local amazon - abort
	
	var amzMatch;
	var linksToRewrite = {};
	var amzLocs = [];

	//var urlMap = jQuery("<div/>").html(MyAjax.urlMap).text();
	var urlMap = JSON.parse(base64_decode(MyAjax.urlMap));

	for (var i = 0; i < document.links.length; i++) {

		// Check for links to any Amazon site
		amzMatch = document.links[i].href.match(amzUrlRegex);
		if (amzMatch) {

		
		
			var linkTld = amzMatch[amzMatch.length - 1];

			// See if the link was already sent to us 
			if (urlMap[amzTldToUse] && urlMap[amzTldToUse][document.links[i].href]){ 
				document.links[i].href = urlMap[amzTldToUse][document.links[i].href];
				
			// If the link goes to the wrong domain, put it in the list to rewrite
			} else if (! (amzTldToUse === linkTld)) {
				linksToRewrite[document.links[i].href] = linkTld;
				amzLocs.push(i);
			// If the link doesn't have an aff link, put it in the list to rewrite
			} else if (! hasAffLink(document.links[i].href)) {
				linksToRewrite[document.links[i].href] = linkTld;
				amzLocs.push(i);
			}
		}
		
	}
	
	if (!jQuery.isEmptyObject(linksToRewrite)) {
		
		jQuery.post(MyAjax.ajaxurl,
		           { action : 'amz_ajax_submit', 
				     urlList : linksToRewrite, 
					 amzTld : amzTldToUse,
				     slug : MyAjax.slug},
					function (response) { 
						for (var j = 0; j < amzLocs.length; j++) {
							var newLink = response[document.links[amzLocs[j]].href];
							if (newLink) {
								document.links[amzLocs[j]].href = newLink;
							}
						}
						//alert(JSON.stringify(response));
					} );
	}

}
					   


function hasAffLink(link) {
	var affRegex = "[\&\?]tag\=";
	return link.match(affRegex);
}

function getTLDFromLocation(country) {
	
	switch (country) {
	case 'US':
		return 'com';
	case 'GB':
	case 'IE':
	case 'UK':
		return 'co.uk';
	case 'CA':
		return 'ca';
	case 'AT':
	case 'DE':
		return 'de';
	case 'CN':
		return 'cn';
	case 'FR':
		return 'fr';
	case 'JP':
		return 'co.jp';
	case 'IT':
		return 'it';
	case 'ES':
		return 'es';
	default:
		// If we couldn't get the location,
		// or the country doesn't have a local amazon store,
		// then leave the urls the same.
		return;
	}
}

function containsAmazonLinks() {
	for (var i = 0; i < document.links.length; i++) {
		if (document.links[i].href.match(amzUrlRegex)) {
			return true;
		}
	}
	return false;
}

function setCookie(name, value, exdays) {
	var exdate = new Date();
	exdate.setDate(exdate.getDate() + exdays);
	var value = escape(value) + ((exdays==null) ? "" : "; expires=" + exdate.toUTCString());
	document.cookie= name + "=" + value;
}

function getCookie(name) {
	var i, x, y, ARRcookies = document.cookie.split(";");
	for (i=0;i<ARRcookies.length;i++) {
		x = ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
		y = ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
		x = x.replace(/^\s+|\s+$/g,"");
		if (x == name) {
			return unescape(y);
		}
	}
}


function utf8_decode (str_data) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +      input by: Aman Gupta
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Norman "zEh" Fuchs
    // +   bugfixed by: hitwork
    // +   bugfixed by: Onno Marsman
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: utf8_decode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'
    var tmp_arr = [],
        i = 0,
        ac = 0,
        c1 = 0,
        c2 = 0,
        c3 = 0;

    str_data += '';

    while (i < str_data.length) {
        c1 = str_data.charCodeAt(i);
        if (c1 < 128) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if (c1 > 191 && c1 < 224) {
            c2 = str_data.charCodeAt(i + 1);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
            i += 2;
        } else {
            c2 = str_data.charCodeAt(i + 1);
            c3 = str_data.charCodeAt(i + 2);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }
    }

    return tmp_arr.join('');
}


function base64_decode (data) {
    // http://kevin.vanzonneveld.net
    // +   original by: Tyler Akins (http://rumkin.com)
    // +   improved by: Thunder.m
    // +      input by: Aman Gupta
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // +   bugfixed by: Pellentesque Malesuada
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // -    depends on: utf8_decode
    // *     example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
    // *     returns 1: 'Kevin van Zonneveld'
    // mozilla has this native
    // - but breaks in 2.0.0.12!
    //if (typeof this.window['btoa'] == 'function') {
    //    return btoa(data);
    //}
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
        ac = 0,
        dec = "",
        tmp_arr = [];

    if (!data) {
        return data;
    }

    data += '';

    do { // unpack four hexets into three octets using index points in b64
        h1 = b64.indexOf(data.charAt(i++));
        h2 = b64.indexOf(data.charAt(i++));
        h3 = b64.indexOf(data.charAt(i++));
        h4 = b64.indexOf(data.charAt(i++));

        bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;

        o1 = bits >> 16 & 0xff;
        o2 = bits >> 8 & 0xff;
        o3 = bits & 0xff;

        if (h3 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1);
        } else if (h4 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1, o2);
        } else {
            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
        }
    } while (i < data.length);

    dec = tmp_arr.join('');
    dec = this.utf8_decode(dec);

    return dec;
}


