                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                /*
 * Copyright (c) 2008 JackNyfe, Inc.
 * ALL RIGHTS RESERVED.
 */


if(!window.JSKitLib) JSKitLib = {vars:{}};





JSKitLib.map = function(f, arr) {
	if(arr) for(var i = 0; i < arr.length; i++) f(arr[i], i, arr);
	return arr;
}

JSKitLib.filter = function(f, arr) {
	var newArr = [];
	if(arr)
		for(var i = 0; i < arr.length; i++)
			if(f(arr[i], i, arr))
				newArr.push(arr[i]);
	return newArr;
}

JSKitLib.lookup = function(f, arr){
	return JSKitLib.filter(f, arr).shift();
}

JSKitLib.fmap = function(o,f) {
	var r, a = [], l = o.length;
	if(l > 0 || l === 0)
		for(var i = 0; i < l; i++) {
			r = f.call(this,o[i],i,arguments);
			if(r !== undefined) a.push(r);
		}
	else
		for(var i in o)
			if(o.hasOwnProperty(i)) {
				r = f.call(this,o[i],i,arguments);
				if(r !== undefined) a.push(r);
			}
	return a;
}

JSKitLib.foldl = function(acc,o,f) {
	var r, l = o.length;
	if(l > 0 || l === 0)
		for(var i = 0; i < l; i++) {
			r = f.call(this,o[i],acc,i);
			if(r != undefined) acc = r;
		}
	else
		for(var i in o)
			if(o.hasOwnProperty(i)) {
				r = f.call(this,o[i],acc,i);
				if(r != undefined) acc = r;
			}
	return acc;
}

JSKitLib.intersperse = function(f) {
	return JSKitLib.foldl([], this, function(e, acc, i) {
		if(acc.length) acc.push(f);
		acc.push(e);
	});
}

JSKitLib.merge = function() {
	return Array.prototype.concat.apply([], arguments);
}

JSKitLib.cloneObject = function(obj) {
	return JSKitLib.foldl({}, obj, function(value, acc, key) { acc[key] = value; });
}





JSKitLib.removeChildren = function(element) {
	while(element && element.hasChildNodes())
		element.removeChild(element.firstChild);
}

JSKitLib.visible = function(element) {
	return element.style.display != 'none';
}

JSKitLib.show = function(element, style) {
	element.style.display = style || '';
}

JSKitLib.hide = function(element) {
	element.style.display = 'none';
}

JSKitLib.toggle = function(element, style) {
	(element.style.display == 'none') ? JSKitLib.show(element, style) :  JSKitLib.hide(element);
}

JSKitLib.getStyle = function(element) {
	if (typeof element.style.cssText != "undefined") {
		return element.style.cssText;
	} else {
		return element.getAttribute("style");
	}
}

JSKitLib.setStyle = function(element, style) {
	if (typeof element.style.cssText != "undefined") {
		element.style.cssText = style;
	} else {
		element.setAttribute("style", style);
	}
}

JSKitLib.addStyle = function(element, style) {
	var oldStyle = JSKitLib.getStyle(element);
	JSKitLib.setStyle(element, oldStyle + '; ' + style); // IE needs ;
}

JSKitLib.getStyleProperty = function(el, prop) {
	if (typeof el == 'string') {
		el = document.getElementById(el);
	}
	if (el.currentStyle) {
		return el.currentStyle[prop];
	} else if (window.getComputedStyle) {
		return document.defaultView.getComputedStyle(el, null).getPropertyValue(prop);
	} else {
		return el.style[prop];
	}
}

JSKitLib.findPos = function(obj) {
	var origObj = obj;
	var curleft = curtop = curright = curbottom = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}
	}
	curright = curleft + origObj.offsetWidth;
	curbottom = curtop + origObj.offsetHeight;
	return [curleft,curtop,curright,curbottom];
}

JSKitLib.calcCenterPos = function(elmWidth, elmHeight) {
	var doc = (document.compatMode == "BackCompat") ? document.body : document.documentElement;
	var scroll = JSDL.prototype.getCurScroll();
	return [
		scroll.scroll_left + Math.max(0, Math.round((doc.clientWidth - elmWidth)/2)),
		scroll.scroll_top + Math.max(0, Math.round((doc.clientHeight - elmHeight)/2))
	];
}

JSKitLib.getDocSize = function (){
	var doc_width,doc_height;
	if(typeof window.innerWidth=="number"){
		if(document.documentElement && document.defaultView && typeof document.defaultView.scrollMaxY=="number"){
			doc_height=document.documentElement.offsetHeight-document.defaultView.scrollMaxY;
			doc_width=document.documentElement.offsetWidth;
		} else {
			doc_height=window.innerHeight;
			doc_width=window.innerWidth;
		}
	} else {
		if(document.documentElement && typeof document.documentElement.clientWidth=="number" && document.documentElement.clientWidth){
			doc_height=document.documentElement.clientHeight;
			doc_width=document.documentElement.clientWidth;
		} else {
			if(document.compatMode == "BackCompat"){
				doc_height=document.body.offsetHeight;
				doc_width=document.body.offsetWidth;
			} else {                                
				doc_height=document.body.clientHeight;
				doc_width=document.body.clientWidth;
			}
		}
	}
	return [doc_height,doc_width];
}

JSKitLib.getJSKitBodyElement = function() {
	var be = document.getElementById('js-kit-body-element');
	if (!be) {
		be = document.createElement('div');
		be.id = "js-kit-body-element";
		document.body.appendChild(be);
	}
	return be;
}

JSKitLib.isChildNodeOf = function(parent, child) {
	if (parent === child) 
		return false
	while (child && child !== parent) {
		try {child = child.parentNode;}
		catch(e){child = parent;}
	}
	return child === parent;
}

JSKitLib.replaceChildren = function(where, replacement) {
	JSKitLib.removeChildren(where);
	JSKitLib.addChild(where, replacement);
}

JSKitLib.addChild = function(to, what) {
	if (typeof(to) != 'object')
		return;
	if(arguments.length == 3 && arguments[2])
		to.insertBefore(what, to.firstChild);
	else
		to.appendChild(what);
}

JSKitLib.hasParentNode = function(el) {
	return el && el.parentNode && el.parentNode.nodeType != 11;
}

JSKitLib.setOpacity = function(div, val) {
	if(document.body.filters) {
		if(val == 1) div.style.filter = '';
		else div.style.filter = 'alpha(opacity: ' + Math.round(val * 100) + ')';
	} else {
		div.style.opacity = val;
	}
}





JSKitLib.setEventHandler = function(obj, eventNames, eventHandler) {
	JSKitLib.fmap(eventNames, function(eventName) {
		obj["on" + eventName] = function(){
			eventHandler();
			return false;
		}
	});
}

JSKitLib.resetEventHandler = function(obj, eventNames) {
	JSKitLib.fmap(eventNames, function(eventName) {
		obj["on" + eventName] = function(){};
	});
}

JSKitLib.addEventHandler = function(obj, eventNames, eventHandler, capture) {
	JSKitLib.fmap(eventNames, function(e) {
		if (obj.addEventListener) {
			obj.addEventListener(e, eventHandler, !!capture);
		} else if (obj.attachEvent) {
			if (capture) {
				if (capture === true) capture = obj;
				capture.setCapture();
				capture.attachEvent('onlosecapture', eventHandler);
			}
			obj.attachEvent('on' + e, eventHandler);
		}
	});
}

JSKitLib.removeEventHandler = function(obj, eventNames, eventHandler, capture) {
	JSKitLib.fmap(eventNames, function(e) {
		if (obj.removeEventListener) {
			obj.removeEventListener(e, eventHandler, !!capture);
		} else if (obj.detachEvent) {
			if (capture) {
				if (capture === true) capture = obj;
				capture.detachEvent('onlosecapture', eventHandler);
				capture.releaseCapture();
			}
			obj.detachEvent('on' + e, eventHandler);
		}
	});
}

JSKitLib.setMouseEvent = function(obj, eventName, eventHandler) {
	var normalize = function(pr_event){
		e = pr_event || window.event;
		if (!e.target)
			e.target = e.srcElement || document;
		if (e.target.nodeType == 3)
			e.target = e.target.parentNode;
		if (!e.relatedTarget && e.fromElement)
			e.relatedTarget = (e.fromElement == e.target) ? e.toElement : e.fromElement;
		return e;
	};
	obj["onmouse" + eventName] = function(pr_event) {
		var e = normalize(pr_event);
		if (e.relatedTarget == obj || JSKitLib.isChildNodeOf(obj, e.relatedTarget)) return false;
		eventHandler(e);
	};
}

JSKitLib.stopEventPropagation = function(e) {
	if (!e) e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

JSKitLib.preventDefaultEvent = function(e) {
  if (!e) e = window.event;
  e.returnValue = false;
  if (e.preventDefault) e.preventDefault();
}

JSKitLib.deferCall = function(func, onlyIE) {
	if (!JSKitLib.vars.windowOnLoadFired && (!onlyIE || (onlyIE && JSKitLib.isIE() && !window.$JSKitNoDeferCallIfIE))) {
		JSKitLib.addEventHandler(window, ['load'], func);
	} else {
		func();
	}
}

JSKitLib.addHandlers = function(obj, moveHandler, upHandler, capture) {
	JSKitLib.addEventHandler(obj, ['mousemove'], moveHandler, capture);
	JSKitLib.addEventHandler(obj, ['mouseup'], upHandler, capture);
}

JSKitLib.removeHandlers = function(obj, moveHandler, upHandler, capture) {
	JSKitLib.removeEventHandler(obj, ['mousemove'], moveHandler, capture);
	JSKitLib.removeEventHandler(obj, ['mouseup'], upHandler, capture);
}

JSKitLib.notDraggable = function(element) {
	element.onselectstart = function(ev) { JSKitLib.stopEventPropagation(ev); return true; }
	element.onmousedown = JSKitLib.stopEventPropagation;
	return element;
}

JSKitLib.getMousePosition = function(e) {
	if (!e) var e = window.event;
	if (e.clientX || e.clientY) {
		return {x:e.clientX, y:e.clientY};
	} else {
		return {x:e.pageX, y:e.pageY};
	}
}

JSKitLib.preventSelect = function(element, exceptions) {
	var browser = JSKitLib.getBrowser();
	var prevent = function() {
		if (browser == 'IE' || browser == 'safari') {
			element.onselectstart = function() { return false; }
		} else if (browser == 'gecko') {
			JSKitLib.addClass(element, 'js-nsgecko');
		}
	}
	if (typeof exceptions == 'object') {
		var include = exceptions.include || [];
		var exclude = exceptions.exclude || [];
		// Do not handle for certain browsers
		if (exclude.length) {
			for (var i=0; i < exclude.length; i++) {
				if (exclude[i] != browser) {
					prevent();
				}
			}
		}
		// Handle for certain browsers
		if (include.length) {
			for (var i=0; i < include.length; i++) {
				if (include[i] == browser) {
					prevent();
				}
			}
		}
	} else {
		prevent();
	}
}

JSKitLib.timedRetry = function(obj) {
	if(obj.pred()) {
		obj.onSuccess();
	} else {
		obj.currentRetries = (obj.currentRetries || 0) + 1;
		if(obj.currentRetries > obj.maxRetries) {
			if(obj.onFailure) obj.onFailure();
		} else {
			if(obj.onRetry) obj.onRetry();
			setTimeout(function(){
					JSKitLib.timedRetry(obj);
				}, obj.timeout);
		}
	}
}

JSKitLib.addDOMLoadedListener = function(callback) {
	window.JSK$DOMLoadedCallbacks = window.JSK$DOMLoadedCallbacks || [];
	window.JSK$DOMLoadedCallbacks.push(callback);
	if (window.JSK$DOMLoadedCallbacks.length > 1)
		return;
	var totalListener = function() {
		JSKitLib.fmap(window.JSK$DOMLoadedCallbacks, function(c) { c(); });
	}
	switch (JSKitLib.getBrowser()) {
		case 'gecko':
		case 'opera':
			document.addEventListener("DOMContentLoaded", totalListener, false);
			break;
		case 'IE':
			var temp = document.createElement('div');
			(function() {
				try {
					temp.doScroll('left');
				} catch (e) {
					setTimeout(arguments.callee, 100);
					return;
				}
				totalListener();
			})();
			break;
		case 'safari':
			(function() {
				if (document.readyState != 'complete') {
					setTimeout(arguments.callee, 100);
					return;
				}
				totalListener();
			})();
			break;
		default:
			JSKitLib.addEventHandler(window, ['load'], totalListener);
	}
}






if (typeof JSKitLib.vars.windowOnLoadFired == 'undefined') {
        JSKitLib.vars.windowOnLoadFired = false;
        JSKitLib.addEventHandler(window, ['load'], function(){ JSKitLib.vars.windowOnLoadFired = true; });
}





JSKitLib.isPreIE7 = function() {
	if (document.body && document.body.filters && parseInt(navigator.appVersion.split("MSIE") [1]) < 7)
		return true;
}

JSKitLib.isPreIE8 = function() {
	if (document.body && document.body.filters && parseInt(navigator.appVersion.split("MSIE") [1]) < 8)
		return true;
}

JSKitLib.isIE = function() {
	if (document.body && document.body.filters && navigator.appVersion.match(/MSIE/))
		return true;
}

JSKitLib.getBrowser = function() {
	if (JSKitLib.vars.browser) return JSKitLib.vars.browser;
	if (document.body && document.body.filters && navigator.appVersion.match(/MSIE/)) {
			JSKitLib.vars.browser = "IE";
	} else if ((navigator.appCodeName.toLowerCase()=="mozilla") 
		&& (navigator.appName.toLowerCase()=="netscape") 
		&& (navigator.product.toLowerCase()=="gecko") 
	) {
		if (navigator.userAgent.toLowerCase().indexOf("safari")!=-1) {
			JSKitLib.vars.browser = "safari";
		} else if (navigator.userAgent.toLowerCase().indexOf("firefox")!=-1) {
			JSKitLib.vars.browser = "gecko";
		}
	} else if (navigator.product && navigator.product.toLowerCase()=="gecko") {
		JSKitLib.vars.browser = "gecko";
	} else if (navigator.appName.match(/Opera/)) { 
		JSKitLib.vars.browser = "opera"; 
	}
	return JSKitLib.vars.browser;
}

JSKitLib.isFF3 = function() {
	return (navigator.userAgent.indexOf("Firefox/3") != -1);
}

JSKitLib.isGChrome = function() {
	return (navigator.userAgent.toLowerCase().indexOf('chrome') != -1);
}

JSKitLib.isSafari = function() {
	if (navigator.appVersion.match(/Safari/)) {
		return true;
	}
}

JSKitLib.isOpera = function() {
	if (navigator.appName.match(/Opera/)) {
		return true;
	}
}





function JSDL(elmParent, arrDragElms) {
       var self = this;
       self.isIE = JSKitLib.isIE();
       var drgElms = arrDragElms || [elmParent];
       for(var i=0; i<drgElms.length; i++) {
               self.addDraggableChild(drgElms[i]);
       }
       self.elmParent = elmParent;
       self.setParent = 1;
}

JSDL.prototype.reSetDragParent = function () {
       if(!this.setParent) return;
       if(this.elmParent.parentNode!=document.body
       || JSKitLib.getStyleProperty(this.elmParent, 'position') != 'absolute') {
               var elmPos;
               if(this.elmParent.parentNode) {
                       elmPos = this.getElmAbsPos(this.elmParent, false);
                       this.elmParent.parentNode.removeChild(this.elmParent);
               }
               document.body.appendChild(this.elmParent);
               this.elmParent.style.position = 'absolute';
               if(elmPos) {
                       this.elmParent.style.left = elmPos.x + "px";
                       this.elmParent.style.top = elmPos.y + "px";
               }
       }
       this.setParent = 0;
}

JSDL.prototype.getCurScroll = function() {
       var scroll_left=0,scroll_top=0;
       if(self.pageXOffset){
               scroll_left=self.pageXOffset;
       } else {
               if(document.documentElement&&document.documentElement.scrollLeft){
                       scroll_left=document.documentElement.scrollLeft;
               } else {
                       if(document.body){
                               scroll_left=document.body.scrollLeft;
                       }
               }
       }
       if(self.pageYOffset){
               scroll_top=self.pageYOffset;
       } else {
               if(document.documentElement&&document.documentElement.scrollTop){
                       scroll_top=document.documentElement.scrollTop;
               } else {
                       if(document.body){
                               scroll_top=document.body.scrollTop;
                       }
               }
       }
       return {"scroll_left":scroll_left,"scroll_top":scroll_top};
}

JSDL.prototype.getElmAbsPos = function (element, usescroll){
       var x=0;
       var y=0;
       var e=element;
       var scroll_left=0,scroll_top=0,cur_scroll;
       if(usescroll){
               cur_scroll=this.getCurScroll();
               scroll_left=cur_scroll.scroll_left;
               scroll_top=cur_scroll.scroll_top;
       }
       if(!this.isIE){
               while(e){
                       x+=e.offsetLeft;
                       y+=e.offsetTop;
                       e=e.offsetParent;
               }
               e=element;
               while(e && e!=document.body && e!=document.documentElement){
		       x -= e.scrollLeft || 0;
		       y -= e.scrollTop || 0;
                       e=e.parentNode;
               }
               if(usescroll){
                       x-=scroll_left;
                       y-=scroll_top;
               }
               return {x:x,y:y};
       }
       e=element;
       while(e){
               var left_border=0;
               var top_border=0;
               if(e!=element){
                       var left_border = parseInt(e.style.borderLeftWidth) || 0;
                       var top_border = parseInt(e.style.borderTopWidth) || 0;
               }
               if(document.compatMode == "BackCompat"){
                       x+=e.offsetLeft-left_border;
                       y+=e.offsetTop-top_border;
               } else {
                       x+=e.offsetLeft+left_border;
                       y+=e.offsetTop+top_border;
               }
               try {
                       e=e.offsetParent;
               } catch(err) { e=null; };
       }
       if(usescroll){
               x-=scroll_left;
               y-=scroll_top;
       }
       return {x:x,y:y};
}

JSDL.prototype.addDraggableChild = function(dragElm) {
       var self = this;
       dragElm.style.cursor = "move";
       dragElm.onmousedown = function(e){self.onStartDragHandler(e);}
}

JSDL.prototype.onStartDragHandler = function (e) {
       var self = this;
       self.reSetDragParent();
       e=e || window.event;
       var elmPos = self.getElmAbsPos(this.elmParent, false);
       var mousePos = JSKitLib.getMousePosition(e);
       self.startx = mousePos.x - elmPos.x;
       self.starty = mousePos.y - elmPos.y;
       var maxLeft = document.body.clientWidth - self.elmParent.offsetWidth -
               (parseInt(self.elmParent.style.marginLeft) || 0) -
               (parseInt(self.elmParent.style.marginRight) || 0);

       var onMoveDragHandler = function(event) {
               event = event || window.event;
               var mousePos = JSKitLib.getMousePosition(event);
               var left = mousePos.x - self.startx;
	       self.elmParent.style.left = (left >= maxLeft ? maxLeft : (left < 0 ? 0 : left)) + "px";
               self.elmParent.style.top = (mousePos.y - self.starty < 0) ? 0 : (mousePos.y - self.starty) + "px";
       }

       var onStopDragHandler = function(event) {
               event = event || window.event;
               JSKitLib.removeHandlers(document, onMoveDragHandler, onStopDragHandler, self.elmParent);
               JSKitLib.stopEventPropagation(event);
               if(self.elmParent.jsk$on_stop_drag) self.elmParent.jsk$on_stop_drag(e);
       }

       JSKitLib.addHandlers(document, onMoveDragHandler, onStopDragHandler, self.elmParent);
       JSKitLib.stopEventPropagation(e);
       JSKitLib.preventDefaultEvent(e);
       if(self.elmParent.jsk$on_start_drag) self.elmParent.jsk$on_start_drag(e);
}



var jskw$explink = "link=6000&offercode=JSK";



JSKW$Exps = [];

function JSKW$Exp() {
	var target = arguments.length ? arguments[0] : null;
	this.wdgoptions = window.JSK$AdvisorOptions || {};
	if(target) {
		this.parseContractor(target);
		this.target = target;
		JSKW$Exps.push(this);
		return this;
	} else {
		var wdgopts = this.wdgoptions;
		var wopt = function(pn, dfl) {
			return wdgopts.hasOwnProperty(pn) ? wdgopts[pn] : dfl;
		}
		var afetch = wopt("autofetch", true)
		var forcef = wopt("force_autofetch", false);

		var contractors = this.gbcn("contractor");
		if(!contractors.length) return;
		var req = [];
		for(var i = 0; i < contractors.length; i++) {
			try {
				var ei = JSKW$Exps.length;
				var wdg = new JSKW$Exp(contractors[i]);
				var prm = wdg.params;
				prm.i = ei;
				this.indexize(req, prm, ei);
				if(!afetch || (prm.bin && !forcef)) {
					wdg.delayedLookup(req[ei]);
					if(prm.bin) req[ei] = null;
				}
			} catch(e) { };
		}
		if(afetch) {
			this.target = contractors[0];
			this.server("/api/experian", req);
		}
	}
}

JSKW$Exp.prototype.makeClickTarget = function(f) {
	var self = this;
	var tgt = this.div;
	tgt.className = (tgt.className || '') + ' jsk-hasInfo';

	var onclickf = function(ev) {
		if(window.JSKW$Exp$Displayed) return true;
		JSKitLib.stopEventPropagation(ev);
		try { f.call(self); } catch(e) { }
		return false; }

	var clickAreas = this.gbcn(tgt, "advisorClickTarget");
	if(clickAreas.length < 1) clickAreas = [tgt];
	JSKitLib.fmap(clickAreas, function(area) {
		area.style.cursor = "pointer";
		area.style.visibility = "visible";
		area.onclick = onclickf;
		JSKitLib.fmap(area.getElementsByTagName("a"), function(a) {
			if(a.href = "") a.onclick = onclickf;
		});
	});
}

JSKW$Exp.prototype.colorClickTarget = function(data) {
	this.qbResults(data);
	var ccss = "contractor-" + data.QbResultsColor;
	var tgt = this.div;
	tgt.className = (tgt.className || '') + ' ' + ccss;
}

JSKW$Exp.prototype.delayedLookup = function(req) {
	this.makeClickTarget(function() {
		if(this.data) {
			this.displayContractor(data);
		} else {
			this.onDataFetch = function(data) {
				this.data = data;
				this.displayContractor(data);
			}
			this.server("/api/experian", [req]);
		}
	});
}

JSKW$Exp.prototype.indexize = function(tgt, prm, idx) {
	var o = tgt[idx] = {};
	for(var p in prm) o[p + "[" + idx + "]" ] = prm[p];
}
JSKW$Exp.prototype.server = function(script, req) {
	var rest = null;
	var str = this.genRequest(req);
	if(typeof str != 'string') { rest = str[1]; str = str[0] }
	var wl = window.location;
	var sc = document.createElement("script");
	sc.src = (wl.protocol.substr(0, 4) != 'http' ? 'http:' : '')
		+ "//js-kit.com" + script + "?" + str + "&" + jskw$explink;
	this.target.appendChild(sc);
	if(rest) this.server(script, rest);
}
JSKW$Exp.prototype.cr = function(n) { return document.createElement(n); }
JSKW$Exp.prototype.gbcn = function(where, cn) {
	if(!cn) { cn = where; where = document; }
	if(where.getElementsByClassName)
		return where.getElementsByClassName(cn);
	var a = [];
	var f = function(t) {
		var r = false;
		JSKitLib.fmap((t.className||'').split(/ ,/),
			function(n){if(n==cn)r=true});
		if(r) a.push(t);
	};
	JSKitLib.fmap(where.getElementsByTagName("*"), f);
	return a;
}
JSKW$Exp.prototype.log = function() {
	var a = [];
	for(var i = 0; i < arguments.length; i++) a.push(arguments[i]);
	if(window.console)
		window.console.log(a.join());
}
JSKW$Exp.prototype.innerTexts = function(coll) {
	for(var p in coll) {
		coll[p] = coll[p].innerText || coll[p].innerHTML;
	}
	return coll;
}
JSKW$Exp.prototype.collectClasses = function(where) {
	var coll = {};
	for(var i = arguments.length - 1; i >= 1; i--) {
		var cn = arguments[i];
		var els = this.gbcn(where, cn);
		if(els.length != 1) throw "Class " + cn + " not found";
		coll[cn] = els[0];
	}
	return coll;
}
JSKW$Exp.prototype.genRequest = function(coll) {
	var req = '';
	while(coll.length) {
		var o = coll.shift();
		var i = req.length;
		for(var p in o) req += (p+"="+encodeURIComponent(o[p])+'&');
		if(req.length > 1900) {
			coll.unshift(o);
			return [req.substr(0, i), coll];
		}
	}
	return req;
}
JSKW$Exp.prototype.parseContractor = function(contractor) {
	var bin = this.gbcn(contractor, "business-bin");
	if(bin && bin.length) {
		var params = this.innerTexts({bin: bin[0]});
	} else {
		var params = this.innerTexts(this.collectClasses(contractor,
			"business", "street", "city"));
		var components = params.city.match(/(.*),[ ]+([A-Z][A-Z]),?[ ]+([0-9]{5})/);
		if(!components) throw "City non-parseable";
		params.city = components[1];
		params.state = components[2];
		params.zip = components[3];
	}
	this.params = params;
	this.div = contractor;
}
JSKW$Exp.prototype.gtmpl = function(t) {
	var lowercase = function(a, m) { return String(m).toLowerCase(); }
	t = t.replace(/^[^<]*(<.*>)[^>]*$/m, "$1");
	t = t.replace(/(<[\/]?[A-Z]+)/g, lowercase);
	t = t.replace(/{Label:([^}]*)}/g,function(a,m){return $JCL(m);});
	return t;
}
JSKW$Exp.prototype.tmpl = function(t, obj) {
	var self = this;
	t = self.gtmpl(t);
	t = t.replace(/{Fn:([A-Za-z0-9.]+)}/g,function(a,m){return self[m](obj)});
	t = t.replace(/{([A-Za-z0-9.]+)}/g,function(a,m){return self.resolveHash(obj, m).shift()||'';});
	return t;
}
JSKW$Exp.prototype.resolveHash = function(obj, na, ni, res) {
	if(typeof na == 'string') return this.resolveHash(obj,na.split(/\./),0,[]);
	if(ni >= na.length) return res;
	var v = obj[na[ni]] || '';
	if(typeof(v) === 'string') {
		if(ni + 1 === na.length) res.push(v);
		return res;
	} else {
		if(ni + 1 === na.length) return res;
	}

	if(v.length === 0 || v.length > 0) {
		JSKitLib.fmap.call(this, v,
			function(e) { this.resolveHash(e, na, ni+1, res); })
	} else {
		this.resolveHash(v, na, ni + 1, res);
	}
	return res;
}
JSKW$Exp.prototype.templateTop =
  '<div class="jsk-contractor">'
+ '<div class="jsk-contractor-close">{Fn:qbCloseButton}</div>'
+ '<div class="jsk-qbFrame">'
+ '<div class="jsk-qb-name">{Fn:qbBusinessName}</div>'
+ '<div class="jsk-qbSubFrameL">'
+ '<span class="jsk-qb-info">{Fn:qbAddress}</span>'
+ '<div class="jsk-qb-info">{Fn:qbPhoneNbr}</div>'
+ '</div>'
+ '<div class="jsk-qbSubFrameR">'
+ '<div class="jsk-qb-info">{Fn:qbContactInfo}</div>'
+ '<div class="jsk-qb-info">{Fn:qbBusinessInfo}</div>'
+ '</div>'
+ '<div style="clear: both;"></div><br clear="all" />'
+ '</div>'
+ '<div class="jsk-qbResultsFrame"><div class="jsk-qbResultsFrameBg"><img src="//cdn.js-kit.com/images/experian/check_mark_{QbResultsColor}.gif" width="62" height="61" /><div class="jsk-qbResultsInfo"><div class="jsk-qbResultsTitle">{QbResultsTitle}</div>{Fn:qbResults}<br /><a class="jsk-qbExpLink jsk-qbLinkFCR" href="//js-kit.com/api/experian_redirect?'+ jskw$explink + '&to=' + encodeURIComponent('http://www.SmartBusinessReports.com/search2.aspx?fn=') +'{QualifiedBusiness.BIN}'+ encodeURIComponent('&'+jskw$explink)+'">Get Full Credit Report from Experian</a><a class="jsk-qbExpLink jsk-qbLinkUMB" href="http://www.businesscreditfacts.com/search.aspx?fn={QualifiedBusiness.BIN}&'+jskw$explink+'">Update My Business</a></div><div style="clear:both"></div></div></div>'
+ '</div>';
JSKW$Exp.prototype.templateBottom = ''
+ '<div class="jsk-ExperianProvider"><table border="0" cellspacing="0" cellpadding="0" width="100%"><tr><td align="left" width="50%"><img src="//cdn.js-kit.com/images/experian/experianLogo.gif" width="99" height="28"/></td><td align="right" width="40%"><input type="button" class="jsk-expw-button" id="jsk-expw-bbuy" name="jsk-expw-bbuy" value="Get Full Report"></td><td align="right" width="10%"><input type="button" class="jsk-expw-button" id="jsk-expw-bclose" name="jsk-expw-bclose" value="Close" /></td></tr><tr><td align="left"><a href="http://js-kit.com/" class="jsk-ExperianProvider">Powered by JS-Kit</a></td><td align="right" class="jsk-ExperianProvider" colspan="2"><a href="http://www.experian.com/privacy/" class="jsk-ExperianProvider">Privacy Policy</a> | <a href="http://js-kit.com/partners/experian/terms.html" class="jsk-ExperianProvider">Terms and Conditions</a></td></tr></table></div>';
JSKW$Exp.prototype.templateFeedback = ''
+ '<div><div class="jsk-CFeedback">Community feedback is moderated by ' + window.location.host + '. Experian is not responsible for the contents of this tab.</div><div class="js-kit-ratings" notop="yes" id="jsexp-qbin-{QualifiedBusiness.BIN}-r"></div>'
+ '<div class="js-kit-comments" id="jsexp-qbin-{QualifiedBusiness.BIN}-c" paginate="5" skin="wireframe" avatars="no" label="Review this contractor">Loading community feedback...</div>'
+ '</div>';

JSKW$Exp.prototype.checkConcerns = function(data, name) {
	var vals = this.resolveHash(data, "BusinessRating." + name);
	var r = 0;
	for(var i = vals.length-1; i >= 0; i--) {
		switch(vals[i].toUpperCase()) {
		case '':
		case "GOOD":
		case "ACTIVE":
			break;
		case "UNKNOWN":
		case "LIMITED CONDITIONED":
		case "APPLICATION IN PROGRESS":
		case "PROBATION":
		case "RENEWAL PENDING":
			r |= 1;
			break;
		default:
			r |= 2;
		}
	}
	return r;
}

JSKW$Exp.prototype.concernLevelFor = function(data, names) {
	return JSKitLib.foldl.call(this, 0, names, function(name, acc) {
		return (acc | this.checkConcerns(data, name));
	});
}

JSKW$Exp.prototype.qbResults = function(data) {
	var c = this.checkConcerns(data, "OverallRating");
	if(0) {
		c = c | this.checkConcerns(data, "Bond.Rating")
		| this.checkConcerns(data, "Insurance.Rating")
		| this.checkConcerns(data, "Liens.Rating")
		| this.checkConcerns(data, "Judgments.Rating")
		| this.checkConcerns(data, "Bankruptcies.Rating")
		| this.checkConcerns(data, "Credit.Rating")
		| this.checkConcerns(data, "License.Rating")
		| this.checkConcerns(data, "License.LicenseDetails.LicenseStatus");
	}
	switch(c) {
	case 0:
		data.QbResultsColor = "green";
		data.QbResultsTitle = "This Business Checks Out";
		return 'Experian found no problems or concerns for '
		+ (this.qbBusinessName(data) || 'this contractor')
		+ ' that you should be aware of. See below for details.';
	case 1:
		data.QbResultsColor = "yellow";
		data.QbResultsTitle = "This Business Has Questions Identified";
		return 'Experian found some issues with '
		+ (this.qbBusinessName(data) || 'this contractor')
		+ ' that you should be aware of. See below for details.';
	default:
		data.QbResultsColor = "red";
		data.QbResultsTitle = "This Business Has Problems Found";
		return 'Experian found some concerns with '
		+ (this.qbBusinessName(data) || 'this contractor')
		+ ' that you should be aware of. See below for details.';
	}
}

JSKW$Exp.prototype.qbBusinessName = function(data) {
	return this.recapitalize(data.QualifiedBusiness.BusinessName);
}

JSKW$Exp.prototype.qbCloseButton = function(data) {
	return '&#x2620;';
}

JSKW$Exp.prototype.qbPhoneNbr = function(data) {
	var pn = data.QualifiedBusiness.Phone;
	if(!pn || !pn.Nbr) return '';
	pn = pn.Nbr.replace(/([)-])([0-9])/g, '$1 $2');
	var raw = pn.replace(/[)( -]/g, '').replace(/^([0-9]{10})$/, '+1$1');
	pn = pn.replace(/-/g, '&ndash;');
	return 'Phone: <a href="tel:'+raw+'">' + pn + '</a>';
}

JSKW$Exp.prototype.qbAddress = function(data) {
	var ad = data.QualifiedBusiness.BusinessAddress;
	if(!ad) return '';

	var after = ['<br/>', '<br/>', ', ', ' ', ''];
	return JSKitLib.fmap.call(this, [ad.StreetAddress,
	  ad.AdditionalStreetAddress, ad.City, ad.State,
	  (ad.Zip||'').replace(/^([0-9]{5}).*/, '$1')], function(s,i) {
		if(s && s.match(/[^ ]/)) return this.recapitalize(s) + after[i];
	}).join('</span><span class="jsk-qb-info">');
}

JSKW$Exp.prototype.qbBusinessInfo = function(data) {
	var qb = data.QualifiedBusiness;
	var before = ['Years in business: ', 'Employee size: '];
	var ybiz = function(years) { if(years < 999) return years; }
	var esize = function(emps) {
	  if(emps) { if(emps.LowRange === emps.HighRange) return emps.LowRange;
			else return emps.LowRange + '-' + emps.HighRange; }
	}
	return JSKitLib.fmap([ybiz(qb.YearsInBusiness), esize(qb.EmployeeSize)],
		function(s, i) { if(s) return before[i]+s; }
	).join('</div><div class="jsk-qb-info">');
}

JSKW$Exp.prototype.qbContactInfo = function(data) {
	var bcs = data.QualifiedBusiness.BusinessContacts;
	if(!bcs || bcs.length === 0) return '';
	var bc = (bcs.length > 0 ? bcs[0] : bcs).BusinessContact;
	if(bc.length) bcs = bc; else bcs = [bc];
	return JSKitLib.fmap.call(this, bcs, function(bc) {
		return JSKitLib.fmap.call(this, [bc.ContactTitle, bc.Name],
		function(s,i) {if(s) return this.recapitalize(s);}).join(': ');
	}).join('</div><div class="jsk-qb-info">');
}

JSKW$Exp.prototype.hideContractor = function(data) {
	var d = window.JSKW$Exp$Displayed;
	if(!d) return;
	if(window.JSKW$Exp$BDrop) {
		JSKitLib.setOpacity(JSKW$Exp$BDrop, 0);
		setTimeout(function() {
			if(!window.JSKW$Exp$Displayed)
				JSKW$Exp$BDrop.style.display = 'none';
		}, 300);
	}
	d.parentNode.removeChild(d);
	window.JSKW$Exp$Displayed = null;
}

JSKW$Exp.prototype.displayContractor = function(data) {
	var self = this;
	if(window.JSKW$Exp$Displayed) return;

	var closef = function(e) {
		JSKitLib.stopEventPropagation(e);
		self.hideContractor();
		if (window.JSKW$Events) JSKW$Events.syncBroadcast("comments_closeControlsPopup");
	}

	var eopts = this.wdgoptions.experian || {};
	var opt = function(pn, dfl) {
		return eopts.hasOwnProperty(pn) ? eopts[pn] : dfl;
	}

	var tgt = this.div;
	var displ = JSKW$Exp$Displayed = this.cr('div');
	displ.className = "jsk-contractorFrame";
	displ.innerHTML = this.tmpl(this.templateTop, data);
	displ.firstChild.firstChild.onclick = closef;	// unused
	new JSDL(displ, [displ.firstChild.firstChild.nextSibling]);
	var tabs = [
		["Credit Summary", function() {
			return this.mkTbl(this.tblLiensDetails,
					data.BusinessRating.Liens)
				+ this.mkTbl(this.tblJudgmentsDetails,
					data.BusinessRating.Judgments)
				+ this.mkTbl(this.tblBankruptciesDetails,
					data.BusinessRating.Bankruptcies)
				+ this.mkTbl(this.tblCreditDetails,
					data.BusinessRating.Credit);
		}, this.concernLevelFor(data, ["Liens.Rating",
				"Judgments.Rating", "Bankruptcies.Rating",
				"Credit.Rating"])],
		["Bonding & Insurance", function() {
			return this.mkTbl(this.tblLicenseDetails,
					data.BusinessRating.License)
				 + this.mkTbl(this.tblBondDetails,
					data.BusinessRating.Bond)
				+ this.mkTbl(this.tblInsuranceDetails,
					data.BusinessRating.Insurance);
		}, this.concernLevelFor(data, ["License.Rating",
				"License.LicenseDetails.LicenseStatus",
				"Insurance.Rating"])]
	];
	if(opt("user_feedback", true)) {
		tabs.push(["Feedback", function() {
			var r = this.tmpl(this.templateFeedback, data);
			setTimeout(function() { try {
				var bin = data.QualifiedBusiness.BIN;
				var seta = function(d,k,v){d.setAttribute(k,v);d[k]=v;}
				var setp = function(e) {
					var id = "jsexp-qbin-" + bin;
					var d = document.getElementById(id+e);
					if(!d) throw("");
					var p = "/" + id;
					seta(d,"path",p);
					seta(d,"permalink","http://www.SmartBusinessReports.com/search2.aspx?"+jskw$explink+"&fn="+bin);
					return d;
				}
				var r = setp('-r');
				var c = setp('-c');
				var countLoadedScripts = 0;
				var loadApplication = function(name) {
					var app = document.createElement('script');
					app.src = "//js-kit.com/" + name + ".js";
					self.div.appendChild(app);
					app.onreadystatechange = app.onload = function() {
						countLoadedScripts++;
						if (countLoadedScripts == 2 && self.closeBtn) self.closeBtn.disabled = false;
					}
				}
				if (window.$JRA && window.$JRA.length) {
					new JSRC(r, {autorequest:true});
					if (window.$JSKitGlobal) $JSKitGlobal.setRatingsAppAvailable();
					countLoadedScripts++;
				} else loadApplication("ratings"); 
				if(window.JSCC) {
					new JSCC(c);
					if (window.$JSKitGlobal) $JSKitGlobal.setCommentsAppAvailable();
					countLoadedScripts++;
				} else loadApplication("comments");
				if (self.closeBtn && countLoadedScripts < 2) self.closeBtn.disabled = true;
			} catch(e) {}}, 0);
			return r;
		}, -1]);
	}
	displ.firstChild.appendChild(this.mkTabs(tabs));
	var tb = this.cr('div');
	tb.innerHTML = this.tmpl(this.templateBottom, data);
	displ.firstChild.appendChild(tb);
	displ.onselectstart = function() { return false; };
	this.div.position = 'relative';
	this.div.insertBefore(displ, this.div.firstChild);

	// Place dialog box to the window center
	var docSize = JSKitLib.getDocSize();
	var curScroll = JSDL.prototype.getCurScroll();
	var left = curScroll.scroll_left+Math.round(docSize[1]/2-displ.offsetWidth/2);
	displ.style.left = ((left > 0) ? left : 5)+"px";
	var top = curScroll.scroll_top+Math.round(docSize[0]/2-displ.offsetHeight/2);
	displ.style.top = ((top > 0) ? top : 5)+"px";
	if (displ.scrollIntoView) displ.scrollIntoView();

	this.closeBtn = document.getElementById("jsk-expw-bclose");
	if (this.closeBtn) this.closeBtn.onclick = closef;
	var bbuy = document.getElementById("jsk-expw-bbuy");
	if(bbuy) bbuy.onclick = function() {
		window.open("//js-kit.com/api/experian_redirect?"+jskw$explink+'&to='+ encodeURIComponent("http://www.SmartBusinessReports.com/search2.aspx?fn="+data.QualifiedBusiness.BIN+'&'+jskw$explink));
		return false;
	}

	// Display backdrop
	if(!window.JSKW$Exp$BDrop) {
		var bdrop = JSKW$Exp$BDrop = this.cr('div');
		bdrop.className = 'jsk-contractorBackdrop';
		document.body.insertBefore(bdrop, document.body.firstChild);
	}
	JSKW$Exp$BDrop.style.display = '';
	JSKitLib.setOpacity(JSKW$Exp$BDrop, 0.5);
}

JSKW$Exp.prototype.tblBondDetails = {
	tableInfo: { title: "Bonding information", rowIn: "BondDetails",
		lastRow: { 'var': "Rating", f: function(v) {
			return "Overall bond rating: " + this.recapitalize(v);
		}}},
	BondNumber: { i: 1, title: "Number" },
	BondAmount: { i: 2, title: "Amount", f: function(v) {
		var r = /([0-9])([0-9][0-9][0-9])((,...)*)$/;
		do { var oldv = v; v = oldv.replace(r, '$1,$2$3'); }
			while(v != oldv);
		return '$' + v;
	}},
	BondCompany: { i: 3, title: "Company" },
	BondEffectiveDate : { i: 4, title: "Effective date" }
}

JSKW$Exp.prototype.tblInsuranceDetails = {
	tableInfo: { title: "Insurance information", rowIn: "InsuranceDetails",
		lastRow: { 'var': "Rating", f: function(v) {
			return "Overall insurance rating: "
				+ this.recapitalize(v);
		}}},
	Policynumber: { i: 1, title: "Policy number" },
	InsuranceType: { i: 2, title: "Insurance type", f: function(v) {
		return this.recapitalize(v); }},
	Insurer: { i: 3, title: "Insurer" },
	InsuranceEffectiveDate: { i: 4, title: "Effective / Expires dates",
		f: function(v, p) {
			return v + " / " + p.InsuranceExpirationDate;
		}}
}


JSKW$Exp.prototype.recapitalize = function(v) {
  return JSKitLib.fmap((v||'').split(/ /), function(s){if(s.length < 3) return s; return s.charAt(0) + s.slice(1).toLowerCase()}).join(' ');
}

JSKW$Exp.prototype.checkMark = function(color, px) {
	return '<img class="jsk-checkMark-'+px+'" src="//cdn.js-kit.com/images/experian/check_mark_'+color+'.gif" width="'+px+'" height="'+px+'" />';
}

JSKW$Exp.prototype.tblLicenseDetails = {
  tableInfo: { title: "License information", rowIn: "LicenseDetails",
	lastRow: { 'var': "Rating", f: function(v) {
		return "Overall license rating: " + this.recapitalize(v);
	}}},
  LicenseState: { i: 1, title: "State", f: function(v, r) {
		var pre = "";
		switch(r.LicenseStatus.toUpperCase()) {
		case "ACTIVE": pre = this.checkMark("green", 12); break;
		case "LIMITED CONDITIONED":
		case "APPLICATION IN PROGRESS":
		case "PROBATION":
		case "RENEWAL PENDING":
			pre = this.checkMark("yellow", 12); break;
		default: pre = this.checkMark("red", 12); break;
		}
		return pre + v;
	}},
  LicenseNumber: { i: 2, title: "Number" },
  LicenseDateIssued: { i: 3, title: "Issued" },
  LicenseStatus: { i: 4, title: "Status", f: function(v) {
		return this.recapitalize(v); }}
}

JSKW$Exp.prototype.tblLiensDetails = {
  tableInfo: { title: "Liens" },
  Rating: { i: 1, title: "Rating", f: function(v) {
		var pre = "";
		switch(v.toUpperCase()) {
		case "GOOD": pre = this.checkMark("green", 12); break;
		case "UNKNOWN": pre = this.checkMark("yellow", 12); break;
		default: pre = this.checkMark("red", 12); break;
		}
		return pre + this.recapitalize(v);
	}},
  NumberOfLiens: { i: 2, title: "Number of liens" }
}

JSKW$Exp.prototype.tblJudgmentsDetails = {
  tableInfo: { title: "Judgments" },
  Rating: { i: 1, title: "Rating", f: function(v) {
		var pre = "";
		switch(v.toUpperCase()) {
		case "GOOD": pre = this.checkMark("green", 12); break;
		case "UNKNOWN": pre = this.checkMark("yellow", 12); break;
		default: pre = this.checkMark("red", 12); break;
		}
		return pre + this.recapitalize(v);
	}},
  NumberOfJudgments: { i: 2, title: "Number of judgments" }
}

JSKW$Exp.prototype.tblBankruptciesDetails = {
  tableInfo: { title: "Bankruptcies" },
  Rating: { i: 1, title: "Rating", f: function(v, r) {
		var pre = "";
		switch(v.toUpperCase()) {
		case "GOOD":
			pre = this.checkMark("green", 12);
			//if(r.BankruptcyPresent == "N") break;
			break;
		case "UNKNOWN": pre = this.checkMark("yellow", 12); break;
		default: pre = this.checkMark("red", 12); break;
		}
		return pre + this.recapitalize(v);
	}},
  BankruptcyPresent: { i: 2, title: "Bankruptcy present", f: function(v) {
		switch(v) {
		case "Y": return "Yes";
		case "N": return "No";
		default: return v;
		}
		}},
  BankruptcyYear: { i: 3, title: "Year", f: function(v, r) {
			return (r.BankruptcyPresent == "Y") ? v : '';
		}},
  BankruptcyState: { i: 4, title: "State", f: function(v, r) {
			return (r.BankruptcyPresent == "Y") ? v : '';
		}}
}

JSKW$Exp.prototype.tblCreditDetails = {
  tableInfo: { title: "Credit review" },
  Rating: { i: 1, title: "Rating", f: function(v) {
		var pre = "";
		switch(v.toUpperCase()) {
		case "GOOD": pre = this.checkMark("green", 12); break;
		case "UNKNOWN": pre = this.checkMark("yellow", 12); break;
		default: pre = this.checkMark("red", 12); break;
		}
		return pre + this.recapitalize(v);
	}},
  ActiveCollectionAccounts: { i: 2, title: "Active collection accounts",
		f: function(v) { switch(v) { case "N": return "No"; default: return v; }}
	},
  DerogatoryAccounts: { i: 3, title: "Derogatory accounts",
		f: function(v) { switch(v) { case "N": return "No"; default: return v; }}
	}
}

JSKW$Exp.prototype.mkTbl = function(tmpl, data) {
	var self = this;
	tmpl.tableInfo.i = -1;
	var hdrs = JSKitLib.fmap(tmpl,function(e,n){e.name=n;return e})
			.sort(function(a,b) {return a.i==b.i?0:(a.i<b.i?-1:1)});
	var tinfo = hdrs.shift();
	var ths = JSKitLib.fmap(hdrs, function(e){
		var className = "js-exp-tbl" + e.title.replace(/[^a-zA-Z0-9]/g, "");
		return "<th class='" + className + "'>" + e.title + "</th>";
	}).join('');
	var rowsData = (tinfo.rowIn?data[tinfo.rowIn]:data) || [];
	if(rowsData.length === 0) return '';
	if(!(rowsData.length>0)) rowsData=[rowsData];
	var rows = JSKitLib.fmap(rowsData, function(row){
		return "<td>" + JSKitLib.fmap(hdrs, function(hdr) {
			var v = row[hdr.name] || "";
			return hdr.f ? hdr.f.call(self, v, row) : v;
		}).join("</td><td>") + "</td>";
	});
	rows.unshift(ths);
	if(tinfo.lastRow) {
		var v = data[tinfo.lastRow['var']];
		if(v && tinfo.lastRow.f) v = tinfo.lastRow.f.call(self, v);
		if(v) rows.push('<td class="jsk-mkTblLastRow"'
			+ ' colspan="'+hdrs.length+'">' + v + '</td>');
	}
	return '<table class="jsk-mkTbl" cellpadding="0" cellspacing="0">'
		+ '<tr><td class="jsk-mkTblTitle" colspan="'+hdrs.length+'">'
			+ tinfo.title + '</td></tr>'
		+ '<tr class="jsk-mkTblHdr">'
		+ rows.join("</tr><tr>")+'</tr></table>';
}

JSKW$Exp.prototype.mkTabs = function(tabs) {
	var tbl = this.cr('table');
	tbl.className = "jsk-ExpTabs";
	var htr = this.cr('tr');
	var win = this.cr('div');
	win.className = "jsk-ExpTabWin";

	// Remove non-functioning tabs
	tabs = JSKitLib.foldl.call(this, [], tabs, function(tab, tacc) {
		var content = tab[1].call(this);
		if(content !== '') tacc.push(tab);
	})

	var maxConcernTab = JSKitLib.foldl(0, tabs, function(tab, m, i) {
		return (tab[2] > tabs[m][2]) ? i : m;
	});

	JSKitLib.fmap.call(this, tabs, function(tab, i) {
		var th = this.cr('th');
		th.className = "jsk-ExpTab";
		if(i) th.style.paddingLeft = "6px";
		th.appendChild(this.mkTab.call(this, win, tab, i == maxConcernTab));
		htr.appendChild(th);
	});

	var dtr = this.cr('tr');
	var wtb = this.cr('td');
	wtb.className = "jsk-ExpTabWin";
	wtb.colSpan = tabs.length;
	wtb.appendChild(win);
	dtr.appendChild(wtb);
	var tb = this.cr('tbody');
	tb.appendChild(htr);
	tb.appendChild(dtr);
	tbl.appendChild(tb);

	if(0)
	setTimeout(function() {
		var ow = tbl.parentNode.offsetWidth || tbl.offsetWidth;
		if(ow) tbl.style.width = ow + 'px';
	}, 0);

	return tbl;
}

JSKW$Exp.prototype.mkTab = function(win, tab, chosen) {
	var self = this;
	var hdr = self.cr('div');
	hdr.appendChild(document.createTextNode(tab[0]));
	hdr.className = "jsk-ExpTab" + (chosen?" jsk-ExpTabSel":"");
	var fillWindow = function(hdr) {
		var content = hdr.oldContent || (typeof(tab[1]) == "function" ? tab[1].call(self) : tab[1]);
		while(win.firstChild) win.removeChild(win.firstChild);
		if(typeof(content) == 'string') {
			hdr.oldContent = self.cr('div');
			hdr.oldContent.innerHTML = content;
		} else {
			hdr.oldContent = content;
		}
		win.appendChild(hdr.oldContent);
		self.chosenTab = hdr;
		var d = self.cr('div');
		d.className = "jsk-ExpTabStrip";
		hdr.appendChild(d);
	}
	if(chosen) fillWindow(hdr);
	hdr.onclick = function(e) {
		self.chosenTab.className = "jsk-ExpTab";
		self.chosenTab.removeChild(self.chosenTab.lastChild);
		this.className = "jsk-ExpTab jsk-ExpTabSel"
		fillWindow(this);
		JSKitLib.stopEventPropagation(e);
		return false;
	}
	return hdr;
}

new JSKW$Exp();

document.write("<style>"
 + ".jsk-contractorBackdrop { opacity: 0; background-color: #404040; z-Index: 13999; width: 100%; " + (JSKitLib.isPreIE8() ? "filter:progid:DXImageTransform.Microsoft.Alpha(opacity='0'); position: absolute; top: expression(eval(document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + 'px'); right: 0; bottom: 0; height: expression(eval(document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight)); width: expression(eval(document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth));" : "position: fixed; left: 0; top: 0; height: 100%; -webkit-transition: opacity 0.5s ease-out;" ) + "}"
 + ".jsk-contractorFrame { width: 420px; font-family: Arial, Helvetica; position:absolute; background: #dcdccb url('//cdn.js-kit.com/images/experian/gradient." + (JSKitLib.isPreIE7() ? "gif" : "png") + "') top left repeat-x; border: solid 1px #c0c0c0; padding: 6px; margin: 0.5em; -moz-user-select: none; -webkit-box-shadow: 0px 10px 50px #222; cursor: default; -moz-border-radius: 7px; " + (JSKitLib.isGChrome() ? "" :  "-webkit-border-radius: 7px;") + " z-Index: 14000; text-align: left; line-height: normal; }"
 + ".jsk-contractorFrame .jsk-contractor { position:relative; zoom: 1; }"
 + ".jsk-contractorFrame .jsk-contractor-close { display: none; position:absolute; right: 0px; top: 0px; font-size: 16pt; text-shadow: 0 0 3px #888; cursor: pointer; }"
 + ".jsk-contractorFrame .jsk-qbFrame { color: #303300; padding: 6px 25px 0 6px; }"
 + ".jsk-contractorFrame .jsk-qbSubFrameL { float: left; }"
 + ".jsk-contractorFrame .jsk-qbSubFrameR { float: right; }"
 + ".jsk-contractorFrame .jsk-qb-name { font-weight: bold; font-size: 20px; }"
 + ".jsk-contractorFrame .jsk-qbl-yellow { font-weight: bold; color: #c0c000; }"
 + ".jsk-contractorFrame .jsk-qbl-red { font-weight: bold; color: #c00000; }"
 + ".jsk-contractorFrame .jsk-qb-info { font-size: 12px; line-height: 21px; }"
 + ".jsk-contractorFrame .jsk-qb-info a { color: #303300; text-decoration: none; }"
 + ".jsk-contractorFrame .jsk-qbResultsFrame { border: solid 2px #dcdccb; -moz-border-radius: 6px; -webkit-border-radius: 6px; margin-top: 6px; }"
 + ".jsk-contractorFrame .jsk-qbResultsFrameBg {" + (JSKitLib.isPreIE7() ? "width: 96%;" : "") + "background-color: #ececdb; border: solid 2px #fff; padding: 6px; color: #303300; -moz-border-radius: 6px; -webkit-border-radius: 6px; }"
 + ".jsk-contractorFrame .jsk-qbResultsFrame IMG { float: left; padding: 3px 12px 0px 6px; border-style: none; margin: 0px; top: 0px; }"
 + ".jsk-contractorFrame .jsk-qbResultsTitle { font-size: 18px; font-weight: bold; }"
 + ".jsk-contractorFrame .jsk-qbResultsInfo { font-size: 11px; margin-left: 80px; }"
 + ".jsk-contractorFrame .jsk-qbExpLink { display: block; padding-top: 6px; font-size: 10px; font-family: Tahoma; font-weight: bold; color: #001FAA; }"
 + ".jsk-contractorFrame .jsk-qbLinkUMB { float: right; padding-top: 7px; font-weight: normal; font-size: 9px; text-decoration: none; }"
 + ".jsk-contractorFrame .jsk-qbLinkFCR { float: left; padding-right: 12px; }"
 + ".jsk-contractorFrame table.jsk-ExpTabs { width: 100%; border-collapse: collapse; border: none; margin-top: 10px; }"
 + ".jsk-contractorFrame th.jsk-ExpTab { padding: 0; margin: 0; width: 100px; color: #333; }"
 + ".jsk-contractorFrame div.jsk-ExpTab {" + (JSKitLib.isPreIE7() ? "" : "position: relative;") + "font-size: 12px; line-height: 14px; font-weight: normal; padding: 4px 2px; padding-bottom: 4px; border: solid 1px #dcdccb; border-bottom: solid 1px #dcdccb; background: white; margin-bottom: 3px; -moz-border-radius: 5px; -webkit-border-radius: 5px; cursor: pointer; text-align: center; zoom: 1; }"
 + ".jsk-contractorFrame div.jsk-ExpTabSel { font-weight: bold; border-bottom: none; padding-bottom: 8px; margin-bottom: 0px; -moz-border-radius-bottomleft: 0; -moz-border-radius-bottomright: 0; -webkit-border-bottom-left-radius: 0; -webkit-border-bottom-right-radius: 0; cursor: default; }"
 + ".jsk-contractorFrame div.jsk-ExpTabWin { background-color: #ffffff; padding: 17px 6px 6px 6px; border: solid 1px #dcdccb; -moz-border-radius-bottomleft: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-left-radius: 5px; -webkit-border-bottom-right-radius: 5px; }"
 + ".jsk-contractorFrame table.jsk-ExpTabs td.jsk-ExpTabWin { padding: 0; margin: 0; border: 0px; }"
 + ".jsk-contractorFrame div.jsk-ExpTabStrip { position: absolute; z-Index: 14050; width: 100%; border-top: solid 1px #fff; left: 0px; bottom: -1px; " + (JSKitLib.isPreIE7() ? "display: none;" : "") + "}"
 + (document.body.filters?".jsk-contractorFrame div.jsk-ExpTabStrip { bottom: -16px; }":"")
 + "div.jsk-contractorFrame .jsk-ExperianProvider { font-family: Arial; font-size: 10px; color: #5c5c55; text-decoration: none; border: 0px; }"
 + "div.jsk-contractorFrame div.jsk-ExperianProvider td { border: 0px; padding: 0; margin: 0; background-color: #DCDCCB; }"
 + "div.jsk-contractorFrame div.jsk-ExperianProvider td.jsk-ExperianProvider { text-align: right; }"
 + ".jsk-contractorFrame div.jsk-ExperianProvider { margin: 10px 0 10px 6px; }"
 + ".jsk-contractorFrame table.jsk-mkTbl td.jsk-mkTblTitle { font-size: 12px; font-weight: bold; background: #d3d3ac; padding: 2px 1em 2px 3px; margin: 0; color: #000000; }"
 + ".jsk-contractorFrame table.jsk-mkTbl { width: 100%; padding-bottom: 6px; }"
 + ".jsk-contractorFrame .jsk-mkTbl { font-size: 11px; color: #000000; }"
 + ".jsk-contractorFrame table.jsk-mkTbl TH { padding: 2px 1em 2px 3px; text-align: left; font-weight: normal; color: #000000; font-size: 11px; }"
 + "div.jsk-contractorFrame table.jsk-mkTbl TD { padding: 2px 1em 2px 3px; vertical-align: top; border: 0px; background-color: #FFFFFF; }"
 + ".jsk-contractorFrame .jsk-mkTblLastRow { text-align: right; }"
 + ".jsk-contractorFrame TR.jsk-mkTblHdr { background: #ececd9; }"
 + ".jsk-contractorFrame .jsk-checkMark-12 { top: 0px; width: 12px; height: 12px; margin-bottom: -2px; margin-right: 4px; }"
 + ".jsk-contractorFrame .jsk-CFeedback { zoom: 1; font-size: 10px; margin-bottom: 6px; }"
 + ".jsk-contractorFrame .js-LeaveComment, .js-CreateComment { font-size: 12px; font-family: Arial, Helvetica; }"
 + ".jsk-contractorFrame .jsk-expw-button { margin: 4px; padding: " + (JSKitLib.isPreIE8()?"3px 0px 4px 0px":"3px 6px 4px 6px") + "; font-family: Verdana; font-size: 11px; height: 24px; border-width: 1px; background: url('//cdn.js-kit.com/images/experian/cart-button.png') no-repeat -32px -14px; -moz-border-radius: 5px; -webkit-border-radius: 5px; }"
 + ".jsk-contractorFrame .jsk-expw-button#jsk-expw-bclose { padding: 3px 6px 4px 6px; background-position: -32px -14px; }"
 + ".jsk-contractorFrame .js-exp-tblRating { width: 25%; }"
 + ".jsk-contractorFrame .js-poweredBy { display: none; }"
 + ".js-SettingsWindow { z-index: 16000 !important; }"
 + (JSKitLib.isIE() ? ".jsk-contractorFrame .js-singleCommentBg { position: static; zoom: 1; } .jsk-contractorFrame .js-OldComments { zoom:1; padding-bottom: 1px; }" : "")
 + "</style>");

JSKW$Exp.prototype.onData = function(data) {
	this.colorClickTarget(data);
	this.makeClickTarget(function() { this.displayContractor(data); });
	if(this.onDataFetch) this.onDataFetch(data);
}



