//This is the URL for testing 'http://yhsb.test.leads.com/YHSB/communications.ashx';
var Ysmbpartners = {
    leads: {
        difmmId: null, // Must be set externally.
	trackingnumbers: null, // Set by the JSON request.
        LeadsCookie: 'ysbltc',
	DomLoaded: {
		onload: [],
		loaded: function() {
			if(arguments.callee.done) {
				return;
			}
			arguments.callee.done = true;
			for(var i = 0, len = Ysmbpartners.leads.DomLoaded.onload.length; i < len; i++) {
				Ysmbpartners.leads.DomLoaded.onload[i]();
			}
		},
		load: function(fireThis) {
			this.onload.push(fireThis);
			if(document.addEventListener) {
				document.addEventListener('DOMContentLoaded', Ysmbpartners.leads.DomLoaded.loaded, null);
			}
			if(/KHTML|WebKit/i.test(navigator.userAgent)) { 
				var _timer = setInterval(function() {
					if(/loaded|complete/.test(document.readyState)) {
						clearInterval(_timer);
						Ysmbpartners.leads.DomLoaded.loaded();
					}
				}, 10);
			}
			/*@cc_on @*/
			/*@if (@_win32)
			var proto = 'src=javascript:void(0)';
			if (location.protocol == 'https:') proto = 'src=//0';
			document.write('<script id=__ie_onload defer ' + proto + '><\/script>');
			var script = document.getElementById('__ie_onload');
			script.onreadystatechange = function() {
				if(this.readyState == 'complete') {
					Ysmbpartners.leads.DomLoaded.loaded();
				}
			};
			/*@end @*/
			
			// Set the onload event as a fallback. This should only be done once.
			if(this.onload.length === 1) {
				if(window.addEventListener) { // Firefox, Safari, Opera
					window.addEventListener('load', Ysmbpartners.leads.DomLoaded.loaded, false); 
				} 
				else if(window.attachEvent) { // IE
					window.attachEvent('onload', Ysmbpartners.leads.DomLoaded.loaded);
				}
			}
		}
	},

	numpat: {
		'patterns': [
			['',     '-',     '-'],
			['\\\(', '\\\) ', '-'],
			['\\\(', '\\\)',  '-'],
			['',     '\\\.',  '\\\.'],
			['',     '',      ''],
			['',     ' ',     ' '],
			['',     ' ',     '-'],
			['',     ' ',     '']
		],
		'replace': [
			['',     '-',     '-'],
			['(',    ') ',    '-'],
			['(',    ')',     '-'],
			['',     '\.',    '\.'],
			['',     '',      ''],
			['',     ' ',     ' '],
			['',     ' ',     '-'],
			['',     ' ',     '']
		]
	},
	
	strTrim: function(s) {
		return s.replace(/^\s+|\s+$/g, '');
	},
	
	PageQuery: function (q) { // This is an instantiable class.
		if(q.length > 1) {
			this.q = q.substring(1, q.length);
		}
		else {
			this.q = null;
		}
		this.keyValuePairs = [];
		if(q) {
			var pieces = this.q.split('&');
			for(var i = 0, len = pieces.length; i < len; i++) {
				this.keyValuePairs[i] = pieces[i];
			}
		}

		this.getKeyValuePairs = function() { 
			return this.keyValuePairs; 
		};
		this.getValue = function(s) { // This returns unfiltered GET vars. Any data returned from this method should be 
		                              // considered tainted, and should be filtered or only be used for comparisons.
			for(var j = 0, jLen = this.keyValuePairs.length; j < jLen; j++) {
				if(this.keyValuePairs[j].split('=')[0] === s) {
					return this.keyValuePairs[j].split('=')[1];
				}
			}
			return false;
		};
		this.getParameters = function() {
			for(var a = [], j = 0, jLen = this.keyValuePairs.length; j < jLen; j++) {
				a.push(this.keyValuePairs[j].split('=')[0]);
			}
			return a;
		};
		this.getLength = function() { 
			return this.keyValuePairs.length; 
		};
	},

	queryString: function(key) { 
		var page = new Ysmbpartners.leads.PageQuery(window.location.search.toLowerCase()); 
		return Ysmbpartners.leads.processQueryData(page.getValue(key.toLowerCase())); // Filter and return the data.
	},
	
	processQueryData: function(inputString) { // Filter data to prevent XSS.
		if(typeof inputString !== 'string') {
			return inputString;
		}
		var outputString = unescape(inputString);
		outputString = outputString.replace(/[<>'"]/g, ''); // Remove angle brackets and quotes.
		return outputString;
	},

	jsonRequest: function(url) {
		var el = document.createElement('script');
		el.type = 'text/javascript';
		el.src = url;
		document.getElementsByTagName('head')[0].appendChild(el);
	},

	tracking: { 
		createCookie: function(name, value, days) {
			var expires = '';
			if(days) {
				var date = new Date();
				date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
				expires = '; expires=' + date.toGMTString();
			}
			document.cookie = name + '=' + value + expires + '; path=/';
		},
		readCookie: function(name) {
			var nameEQ = name + '=';
			var ca = document.cookie.split(';');
			for(var i = 0, len = ca.length; i < len; i++) {
				var c = ca[i];
				while(c.charAt(0) === ' ') {
					c = c.substring(1, c.length);
				}
				if(c.indexOf(nameEQ) === 0) {
					return c.substring(nameEQ.length, c.length);
				}
			}
			return null;
		},
		setTrackingCookie: function(bln) {
			var mycookie = this.readCookie(Ysmbpartners.leads.LeadsCookie);
			if(mycookie === null || mycookie === 'false') {
				this.createCookie(Ysmbpartners.leads.LeadsCookie, bln || false, 5);
			}
		},		
		swaptxt: function() {
			var numpat = Ysmbpartners.leads.numpat,
			    trackingnumbers = Ysmbpartners.leads.trackingnumbers,
			    trackingInfoLen = trackingnumbers.TrackingInfo.length, 
			    numPatternsLen = numpat.patterns.length,
			    n = [], t = [],
			    foundEls = [],
			    numRegEx = /\d{3,}/g,
			    srchtext, replacement, s;

			function splitNumber(num) {
				num = Ysmbpartners.leads.strTrim(num);
				var start = (num.length === 10) ? 0 : 1;
				return [num.substring(0 + start, 3 + start), num.substring(3 + start, 6 + start), num.substring(6 + start, 10 + start)];
			}

			function formatNumber(na, first, second, third) {
				return first + na[0] + second + na[1] + third + na[2];
			}
			
			function replaceNumbers(s) {
				for(var j = 0; j < trackingInfoLen; j++) {
					for(var k = 0; k < numPatternsLen; k++) {
						srchtext = formatNumber(n[j], numpat.patterns[k][0], numpat.patterns[k][1], numpat.patterns[k][2]);
						replacement = formatNumber(t[j], numpat.patterns[k][0], numpat.patterns[k][1], numpat.patterns[k][2]).replace(/\\/g, '');
						s = s.replace(new RegExp(srchtext, 'g'), replacement);
					}
				}
				return s;
			}

			function domWalk(obj) {
				for(var i = 0, len = obj.childNodes.length; i < len; i++) {
					var childObj = obj.childNodes[i];
					if(childObj.nodeType === 3 && childObj.data.search(numRegEx) >= 0) {
						childObj.data = replaceNumbers(childObj.data);
					}
					domWalk(childObj);
				}
			}
						
			for(var i = 0; i < trackingInfoLen; i++) {
				n[i] = splitNumber(trackingnumbers.TrackingInfo[i].DestinationNumber);
				t[i] = splitNumber(trackingnumbers.TrackingInfo[i].PublishedNumber);
			}

			domWalk(document.getElementsByTagName('body')[0]);
		},
		onload_init: function () {
			var url = 'http://webhosting.yahoo.com/leads/telnumbers.php?d=' + 
					(new Date().getTime()) + 
					'&id=1&jsonp=Ysmbpartners.leads.getConfigAndParse&Message=&SiteId=' + 
					Ysmbpartners.leads.difmmId + 
					'&Url=';
			var mycookie = Ysmbpartners.leads.tracking.readCookie(Ysmbpartners.leads.LeadsCookie);
			if(mycookie !== null && mycookie === 'true') {
				Ysmbpartners.leads.jsonRequest(url);
			}
			else if(mycookie === null || mycookie === 'false') {
				if(Ysmbpartners.leads.queryString('le2et') !== false) {
					Ysmbpartners.leads.tracking.setTrackingCookie(true);
					Ysmbpartners.leads.jsonRequest(url);
				}
				else {
					Ysmbpartners.leads.tracking.setTrackingCookie(false);
				}
			}
		}
	},

	getConfigAndParse : function(data){
		Ysmbpartners.leads.trackingnumbers = data;
		Ysmbpartners.leads.tracking.swaptxt();	
	}
    }
};

