/**
 * href re-writer for cr.am
 */


var cramSettings = new Array();
cramSettings['createUrl'] = 'http://cr.am/framed.php?url=';
cramSettings['ref'] = 'driverguide';
cramSettings['debug'] = location.href.indexOf('Debug') > 0 ? true : false;
cramSettings['enabled'] = true; //location.href.indexOf('Enabled') > 0 ? true : false;



// whitelist[0] will always be the current domain
// and whitelist[1] is always cr.am
cramSettings['whitelist'] = new Array();
//cramSettings['whitelist'].push(document.domain); // current domain can't be added automatically since we haven't automated the regex escaping
cramSettings['whitelist'].push('cr\.am'); // domain separator dots should be escaped
//cramSettings['whitelist'].push('.*\.iplayforthem\.com'); // the first dot is not escaped, since it's the "any char" for the regex

cramSettings['whitelist'].push("driverguide\.com");
cramSettings['whitelist'].push("www\.driverguide\.com");
cramSettings['whitelist'].push("members\.driverguide\.com");
cramSettings['whitelist'].push("driverscan\.driverguide\.com");
cramSettings['whitelist'].push("toolkit\.driverguide\.com");
cramSettings['whitelist'].push("computers\.driverguide\.com");
cramSettings['whitelist'].push("profiles\.driverguide\.com");
cramSettings['whitelist'].push("scan\.driverguide\.com");
cramSettings['whitelist'].push("freescan\.driverguide\.com");
cramSettings['whitelist'].push("forums\.driverguide\.com");

cramSettings['whitelist'].push("memedex\.com");
cramSettings['whitelist'].push("www\.memedex\.com");
cramSettings['whitelist'].push("iplayforthem\.com");
cramSettings['whitelist'].push("www\.iplayforthem\.com");



if (cramSettings['debug']) {
    var debugBox;
    // var debugBox = new Element('div', {'id': 'debugBox', 'style': 'z-index: 20001; background-color: white; border:2px solid red; position: absolute; top:0; left:0;' });
}

function URLEncode (clearString) {
  var output = '';
  var x = 0;
  clearString = clearString.toString();

  var regex = /(^[a-zA-Z0-9_.]*)/;
  while (x < clearString.length) {
    var match = regex.exec(clearString.substr(x));
    if (match != null && match.length > 1 && match[1] != '') {
    	output += match[1];
      x += match[1].length;
    } else {
      if (clearString[x] == ' ')
        output += '+';
      else {
        var charCode = clearString.charCodeAt(x);
        var hexVal = charCode.toString(16);
        output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase();
      }
      x++;
    }
  }

  return output;
}

/**
 * Rewrites the URL in a link element for cr.am.
 *
 * This will rewrite the given link's URL, appending
 * the cramSettings['createUrl'] to the href's original
 * URL.
 *
 * @param Link link The link or area DOM element
 */
function cram__rewriteHref (link) {
    // what should we do with popup's and alike?
    if (cramSettings['debug']) debugBox.innerHTML += link.href;

    if (!cram__isInWhitelist(link.href)) {
		var ref = "";

		if (cramSettings['ref']) {
			ref = "&ref="+cramSettings['ref'];
		}

        if (cramSettings['debug']) debugBox.innerHTML += "<br /><span style='color:#ff0000;' class='bold'>" + link.href + "<br /> rewritten as <br />" + cramSettings['createUrl'] + link.href  + "</span>";

        var inner = link.innerHTML;
        
        
        var url = link.href;
        url = URLEncode(url);
        
		//alert("["+url+"]");
		//alert(escape('http://www.cnn.com/'));
		//link.href = escape(unescape(link.href));
        //link.href = escape(link.href);
        //link.href = URLEncode(link.href+"");
		//alert("[["+url+"]]");        
		//alert(cramSettings['createUrl'] +" ||| " + url +" ||| " +  ref);
		//alert(link.href);        
		
        link.href = cramSettings['createUrl'] + url + ref;

        link.innerHTML = inner;
    }
}

/**
 * Check if the given href's domain is in the whitelist
 *
 * The whitelist is contained in cramSettings['whitelist']
 *
 * @param string href The url to check.
 * @return bool True if the URL is whitelisted, false otherwise
 */
function cram__isInWhitelist (href) {
    // @todo: shouldn't we also try to provide security focused on SSL certificates and e-secure seals and alike?
    // @todo: handle port numbers in domains (example.com:80)
    var inWhiteList = false;

    if (href.indexOf("/") === 0) {
        if (cramSettings['debug']) debugBox.innerHTML += "<br /> relative URL detected..."  ;
        inWhiteList = true;
    } else {
        if (href.indexOf("http://") === 0 || href.indexOf("https://") === 0) {
            var protocolStrPos = href.indexOf("://") + 3;
            var hrefDomain = href.substring(protocolStrPos, href.indexOf("/", protocolStrPos));
            if (cramSettings['debug']) debugBox.innerHTML += "<br />HTTP or HTTPS URL detected...";
            if (cramSettings['debug']) debugBox.innerHTML += "<br />extracted domain: " + hrefDomain;
            var i=0;
            //for (i; i < cramSettings['whitelist'].length; i++) {

                var matchWhitelist = cramSettings['whitelist'].join('|');

                // alert(matchWhitelist);
                // var matchWhitelist = '.*\.iplayforthem\.com|cr\.am|.*\.besiex\//.com';
                var matchWhitelistRe = new RegExp('\\b' + matchWhitelist + '\\b');
                if (cramSettings['debug']) debugBox.innerHTML += "<br />matchWhtelist: " +matchWhitelist;
                //if (hrefDomain.match(cramSettings['whitelist'][i])) {
                if (hrefDomain.match(matchWhitelistRe))  {
                    if (cramSettings['debug']) debugBox.innerHTML += "<br /><span style='color:#33AA33;' class='bold'>" + hrefDomain + " is whitelisted (matches " +  cramSettings['whitelist'][i] + ")</span>";
                    inWhiteList = true;
                    //break;
                }
            //}
        } else {
            if (cramSettings['debug']) debugBox.innerHTML += "<br /> Unsupported protocol detected..." + href.substring(0, href.indexOf("://"));
            inWhiteList = true;
        }
    }
    return inWhiteList;
}

function cram__relink () {
	if (!cramSettings['enabled']) return;
	
    if (cramSettings['debug']) {
        document.getElementsByTagName('body')[0].innerHTML += '<div id="debugBox" style="z-index: 20001; background-color: white; border:2px solid red; position: absolute; top:0; left:0;"><div>';
        debugBox = document.getElementById('debugBox');
        debugBox.innerHTML = '<span onclick="$(\'debugBox\').innerHTML=\'\'; $(\'debugBox\').style.display=\'none\'">X</span><hr />';
        debugBox.style.display = "block";
        debugBox.innerHTML += "<br />cramSettings['createUrl']: " + cramSettings['createUrl'] + "<hr />";

    }

    var links = new Array();
    links.push(document.getElementsByTagName('a'));
    links.push(document.getElementsByTagName('area'));
    var i, j;
    for (i in links) {
        for (j in links[i]) {
            if (links[i][j].href != undefined) {
            	// this next line I modified to fix a bug, but 
            	// not sure if it might break something else.
                //links[i][j].href = escape(unescape(links[i][j].href));
                cram__rewriteHref(links[i][j]);
                if (cramSettings['debug']) debugBox.innerHTML += "<hr />";
            }
        }
    }
}