                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                

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.getOuterHTML = function(node) {
	var clone = node.cloneNode(true);
	var parent = document.createElement('div');
	parent.appendChild(clone);
	var ihtml = parent.innerHTML;

    // ff converts sp characters inside of href to hex ascii
	var ihtmlHref = ihtml.match(/href\s*=\s*"[^"]*(%7B|%7D)[^"]*"/g) || [];
	for (var i=0; i< ihtmlHref.length; i++) {
		var a = ihtmlHref[i];
		var b = a.replace(/%7B/g, '{');
		b = b.replace(/%7D/g, '}');
		ihtml = ihtml.replace(a, b);
	}
	return ihtml;
};

JSKitLib.html = function() {
        var div = document.createElement("div");
        for(var text = '', i = 0; i < arguments.length; i++)
                text += arguments[i];
        div.innerHTML = text;
        var ch = div.firstChild;
        div = null;
        return ch;
}

JSKitLib.text = function(text, element, clear) {
	var textNode = document.createTextNode(text);
	if (element) {
		if (clear) JSKitLib.removeChildren(element);
		element.appendChild(textNode);
	}
	return textNode;
}

JSKitLib.attachDescriptors2Elements = function(elements, layoutBlocksPrefix, descriptors, parentStructure) {
	JSKitLib.fmap(elements, function(element, id) {
		var pattern = id.match(layoutBlocksPrefix + "(.*)");
		var name = pattern ? pattern[1] : undefined;
		if (name && typeof(descriptors[name]) == "function") {
			var node = descriptors[name](element, parentStructure);
			if (node) element.appendChild(node);
		}
	});
}

JSKitLib.toDOM = function(template, layoutBlocksPrefix, descriptors) {
	var content = JSKitLib.html(template);
	var elements = JSKitLib.mapClass2Object({}, content);
	var structure = {
		"set" : function(name, element) { elements[layoutBlocksPrefix + name] = element; },
		"get" : function(name, ignorePrefix) { return elements[((ignorePrefix) ? "" : layoutBlocksPrefix) + name]; },
		"content" : content
	};
	JSKitLib.attachDescriptors2Elements(elements, layoutBlocksPrefix, descriptors, structure);
	return structure;
}

JSKitLib.htmlQuote = function (newValue, param) {
	newValue = newValue.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")
	param = param || {};
	if(!param.title)
		newValue = newValue.replace(/ /,"&nbsp;");
	if(param.attribute)
		newValue = newValue.replace(/"/g,"&quot;");
	return newValue;
}

JSKitLib.htmlUnquote = function (newValue) {
	return newValue.replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&");
}

JSKitLib.addScript = function(src, content, callback) {
	var sId = "js-kit-script-"+src.replace(/[\/.]/g, '');
	content.jsk$scriptId = sId;
	if(document.getElementById(sId)) {
		if (callback) callback();
		return;
	}
	var s = document.createElement('script');
	s.id = sId;
	s.type ='text/javascript';
	s.charset = 'utf-8';
	s.src = src;
	content.appendChild(s);
	if (callback) {
		s.onload = s.onreadystatechange = function() {
			if (s.readyState && s.readyState != 'loaded' && s.readyState != 'complete') return;
			s.onreadystatechange = s.onload = null;
			callback();
		}
	}
	return s;
}

JSKitLib.stripTags = function(text) {
	var r = /<\/?(a|em|strong|i|b|u|sup|sub|object|param|embed|span|pre|p)(.|\n)*?>/gi;
	text = text.replace(/<object(.|\n)+?<\/object>/gi,"[video]");
	text = text.replace(r,"");
	return (text.length > 150) ? text.slice(0,150) + "..." : text;
}

JSKitLib.createHiddenIframe = function(id, target, cb, clearOnload, src) {
	clearOnload = (typeof clearOnload == 'undefined' ? true : !!clearOnload);
	src = src || 'about:blank';
	target = target || document.body;
	var d = document.createElement('div');
	d.style.height = 0;
	d.innerHTML = '<iframe id="' + id + '" name="' + id + '" src="' + src + '" width="0" height="0" frameborder="0"  style="border: none"></iframe>';
	target.appendChild(d);
	var ifr = d.firstChild;
	if (cb) {
		ifr.onreadystatechange = function(e) {
			if (ifr.readyState && ifr.readyState != 'loaded' && ifr.readyState != 'complete') return;
			if (clearOnload) {
				ifr.onreadystatechange = ifr.onload = null;
			}
			cb();
		};
		if (!JSKitLib.isOpera()) {
			ifr.onload = ifr.onreadystatechange;
		}
	}
	return ifr;
}

JSKitLib.overlapSelectsIE = function(target) {
	var container = document.createElement('div');
	container.innerHTML = '<iframe style="position: absolute; z-index: -1; filter: mask(); border: 0; margin: 0; padding: 0; top: 0; left: 0; width: 9999px; height: 9999px; overflow: hidden;"></iframe>';
	target.appendChild(container.firstChild);
}

JSKitLib.openPopup = function(url, extConfig){
	var target = '_blank';
	var config = { 
		'width' : '960',
		'height' : '800',
		'status' : 'no',
		'menubar' : 'no',
		'toolbar' : 'no',
		'resizable' : 'no',
		'location'  : 'yes',
		'scrollbars' : 'yes',
		'directories': 'no'};

	JSKitLib.fmap(extConfig || [], function(value, key){
		if (key == 'target') target = value; else config[key] = value; 
	});

	var calcScreenDimensions = function(){
		if (JSKitLib.isOpera()) {
			var doc = (document.compatMode == "BackCompat") ? document.body : document.documentElement;
			return {'width': doc.clientWidth,
				'height': doc.clientHeight};
		}
		return {'width': screen.width,
			'height': screen.height};
	};

	var calcCorrections = function() {
		if (JSKitLib.isOpera()) return {'height': 35, 'width': 10, 'top' : 0}; 
		if (JSKitLib.isSafari() && !JSKitLib.isGChrome()) return {'height': 150, 'width': 0, 'top' : 100};
		return {'height': 0, 'width': 0, 'top' : 0};
	};

	var screenDimensions = calcScreenDimensions();
	var corrections = calcCorrections();

	if (config.height > screenDimensions.height - corrections.height) config.height = screenDimensions.height - corrections.height;
	if (config.width > screenDimensions.width - corrections.width) config.width = screenDimensions.width - corrections.width;

	if (!(config.left && config.top) && config.width && config.height) {
		config.left = Math.round((screenDimensions.width - config.width)/2);
		config.top = Math.round((screenDimensions.height - corrections.top - config.height)/2);
	}

	var params = JSKitLib.fmap(config, function(value, key) {return key + "=" + value;}).join(", ");
	return window.open(url, target, params);
}





//////////////////// JSRVC
// requestObj
// request: {uri: someuri, param1: val1, param2: val2, ...}
// [transport: ("GET" | "POST")]
// [target: some_DOM_element]
// [variableRequest: [{param1_1: val1_1, param1_2: val1_2, ...},
//			{param2_1: val2_1, param2_2: val2_2,...}, ...]]
// [form: some_form]
// [onreturn: some_callback]
// [randevu : (true | false)]
// [requestId: some request identity]
// [trailer: specifies the name of parameter which should terminate
//						each sub-request of multi-request]

function JSRVC(requestObj) {
	var s = this;
	s.requestId = requestObj.requestId || s.generateRequestId();
	s.requestsInProgress = 0;
	s.requestsQueue = [];
	s.trailer = requestObj.trailer;
	s.processRequest(requestObj);
}

JSRVC.prototype.generateRequestId = function() {
	return ((new Date()).valueOf() + Math.random()).toString();
}

JSRVC.prototype.processRequest = function(requestObj) {
	var s = this;
	s.error = undefined;
	if(s.requestsInProgress) {
		s.requestsQueue.push(requestObj);
		return;
	}
	s.requestObj = requestObj;
	if(s.requestObj.pickup && !s.eventCtx) s.eventCtx = JSKW$Events.registerEventCallback(s.eventCtx, function() {s.eventCallback.apply(s, arguments);}, "randevu_answer");
	var req = s.requestObj;
	s.preProcessRequest();
	if(!req.transport)
		req.transport = req.form ? "POST" : s.getRequestTransport();
	req.target = req.target || document.body;
	var onCompleteCB = req.timeout ? function() {
		s.startTimeoutTimer.call(s);
	} : undefined;
	var handlers = {'onload': s.onLoadRequest, 'onreadystatechange': s.onLoadRequest};
	switch(req.transport) {
	case "GET":
		s.processGETRequest(onCompleteCB, handlers);
		break;
	case "POST":
		s.processPOSTRequest(onCompleteCB, handlers);
		break;
	}
}

JSRVC.prototype.preProcessRequest = function() {
	var req = this.requestObj;
	if(!req.request) req.request = {};
	JSKitLib.fmap(req.epb || {}, function(v, k) { req.request[k] = v; });
	if (req.ref) req.request.ref = req.ref;
	req.request.randevuId = this.requestId;
	if(!req.variableRequest) req.variableRequest = [];
	if(req.pickup) req.request.randevuRnd = Math.random();
}

JSRVC.prototype.calcGetRequest = function() {
	var s = this;
	var req = s.requestObj;
	var reqvar = req.variableRequest;
	var permGETReq = s.serializeRequest(req.request);
	var varGETReq = JSKitLib.fmap(reqvar, function(el, idx){
		return s.serializeRequest(el, '[' + idx + ']');
	});
	return [permGETReq, varGETReq];
}

JSRVC.prototype.getRequestTransport = function() {
	var ser = this.calcGetRequest();
	var permReq = ser[0];
	var varReq = ser[1];
	var firstReqLen = permReq.length +
		(varReq.length>0 ? varReq[0].length : 0);
	var totalReqLen = 0;
	for(var i=0; i<varReq.length; i++)
		totalReqLen += varReq[i].length;
	
	return ((firstReqLen > 1700) || (totalReqLen > 3400) ?
		"POST" : "GET");
}

JSRVC.prototype.startTimeoutTimer = function() {
	var s = this;
	if(s.timeoutTimer) clearTimeout(s.timeoutTimer);
	s.timeoutTimer = setTimeout(function() { s.timeoutExpired(); }, s.requestObj.timeout);
}

JSRVC.prototype.timeoutExpired = function() {
	this.timeoutTimer = undefined;
	this.error = "timeout";
	this.returnAnswer();
}

JSRVC.prototype.returnAnswer = function(answerData) {
	var s = this;
	answerData = answerData || {};
	if(answerData.script) {
		var script = document.createElement('script');
		script.text = answerData.script;
		this.requestObj.target.appendChild(script);
	}
	if(s.requestObj.onreturn) {
		s.requestObj.onreturn.call(s, s.error || "data", answerData.data);
	}
}

JSRVC.prototype.serializeRequest = function(obj, prefix) {
	var s = this;
	var toString = function(k, v) {
		return encodeURIComponent(k) + (prefix || '') + "=" + encodeURIComponent(v);
	};
	var request = JSKitLib.fmap(obj, function(v, k) {
		if (s.trailer != k) return toString(k, v);
	});
	if (s.trailer && typeof(obj[s.trailer]) != "undefined") {
		request.push(toString(s.trailer, obj[s.trailer]));
	}
	return request.join("&");
}

JSRVC.prototype.setElementAttributes = function(obj, attrs) {
	var s = this;
	if (!obj) return;
	JSKitLib.fmap(attrs, function(v, k) {
		obj[k] = function() { v.call(s, obj) };
	});
}

JSRVC.prototype.runScript = function(src, data, handlers) {
	var script = document.createElement('script');
	this.setElementAttributes(script, handlers);
	script.setAttribute("charset", "utf-8");
	script.setAttribute("src",  src + (data ? '?' + data : ''));
	this.requestsInProgress++;
	this.requestObj.target.appendChild(script);
	this.script = script;
}

JSRVC.prototype.processGETRequest = function(onCompleteCB, handlers) {
	var s = this;
	var ser = s.calcGetRequest();
	var reqperm = ser[0];
	var reqpermlen = reqperm.length;
	var reqvar = ser[1];
	var reqvarlen = reqvar.length;
	var currequest = '';
	for(var i=0; i<reqvarlen; i++) {
		currequest += '&' + reqvar[i];
		if(currequest.length + reqpermlen +
			(i+1<reqvarlen ? reqvar[i+1].length : 0) > 2000) {
			s.runScript(s.requestObj.uri,
				reqperm + currequest, handlers);
			currequest = '';
		}
	}
	if((currequest) || (!reqvarlen))
		s.runScript(s.requestObj.uri,
			reqperm + '&' + currequest, handlers);
	if(onCompleteCB) onCompleteCB();
}

JSRVC.prototype.processPOSTRequest = function(onCompleteCB, handlers) {
	var s = this;
	var req = s.requestObj.request;
	var reqvar = s.requestObj.variableRequest;
	var reqvarlen = s.requestObj.variableRequest.length;
	var createForm = function() {
		var iframe = 'js-ifrm-' + Math.random();
		var ifr = JSKitLib.createHiddenIframe(iframe, s.requestObj.target);
		var doc = ifr.contentDocument ? ifr.contentDocument : ifr.document;
		var f = doc.createElement('FORM');
		f.doc = doc;
		if(JSKitLib.isIE()) doc.charset = "utf-8";
		f.target = iframe;
		JSKitLib.timedRetry({
				timeout: 100,
				maxRetries: 50,
				onSuccess: function() {
						doc.body.appendChild(f); },
				pred: function() { return !!doc.body; }
			});
		return f;
	};
	var getForm = function() {
		return (s.requestObj.form && !reqvarlen) ?
			s.requestObj.form : createForm();
	}
	var fillForm = function(form, obj) {
		form.method  = 'POST';
		form.enctype = "application/x-www-form-urlencoded";
		form.acceptCharset = 'UTF-8';
		form.action  = s.requestObj.uri;
		JSKitLib.fmap(obj, function(v, k) {
			var frmel = (form.doc || document).createElement('INPUT');
			frmel.type = "hidden";
			frmel.name = k;
			frmel.value = v;
			form.appendChild(frmel);
		});
	}
	var postRequest = function(pobj, vobj) {
		var form = getForm();
		fillForm(form, pobj);
		if(vobj) fillForm(form, vobj);
		if (form.target) s.setElementAttributes(document.getElementById(form.target), handlers);
		JSKitLib.fmap(handlers, function(v, k) {
			form[k] = v;
		});
		s.requestsInProgress++;
		JSKitLib.timedRetry({
				timeout: 100,
				maxRetries: 50,
				onSuccess: function() {
						form.submit(); },
				pred: function() {
					return (form.parentNode &&
						form.parentNode.nodeType!=11); }
			});
	}
	JSKitLib.fmap(reqvar, function(v) {
		postRequest(req, v);
	});
	if(!reqvarlen) postRequest(req);
	if(onCompleteCB) onCompleteCB();
}

JSRVC.prototype.onLoadRequest = function(el) {
	var s = this;
	if(el.readyState && el.readyState != 'loaded'
		&& el.readyState != 'complete') return;
	el.onreadystatechange = el.onload = null;
	if(!s.requestObj.pickup) {
		s.requestObj.checked = true;
		s.requestsInProgress--;
	}
	s.postProcessRequest();
}

JSRVC.prototype.postProcessRequest = function(source, data) {
	var s = this;
	if(s.requestObj.pickup && source!="pickup") return;
	if(s.requestObj.randevu && !s.error && s.requestObj.transport == "POST") {
		s.processRequest({
			'uri': '//js-kit.com/api/server-answer.js',
			'ref': s.requestObj.ref,
			'epb': s.requestObj.epb,
			'pickup': true,
			'onreturn': s.requestObj.onreturn,
			'target': s.requestObj.target});
		return;
	}
	s.returnAnswer(data);
	if(!s.requestsInProgress) {
		if(s.timeoutTimer) {
			clearTimeout(s.timeoutTimer);
			s.timeoutTimer = undefined;
		}
		if(s.requestsQueue.length && !s.error)
			s.processRequest(s.requestsQueue.pop());
	}
}

JSRVC.prototype.eventCallback = function(eventName, randevuId, status, data) {
	if(this.requestId != randevuId) return;
	this.requestsInProgress--;
	if(this.script && this.script.parentNode) {
		this.script.parentNode.removeChild(this.script);
		this.script = undefined;
	}
	switch(status) {
	case "ready":
		if(this.eventCtx) {
			JSKW$Events.invalidateContext(this.eventCtx);
			this.eventCtx = undefined;
		}
		this.postProcessRequest("pickup", data);
		break;
	case "timeout":
		if(this.error) {
			this.returnAnswer(data);
		} else {
			this.processRequest(this.requestObj);
		}
		break;
	case "exceeded": 
		this.error = "attempts_number_exceeded";
		this.returnAnswer(); 
		break;
	}
}

JSRVC.prototype.cancelRequest = function() {
	this.error = 'canceled';
}



if(!window.JSK$Form) JSK$Form = { flocks: 0, forms: [] };
JSK$Form.initlock = function(add) { this.flocks += add; return this.flocks; }
JSK$Form.map = function(f) {
	var a = [];
	if(this.length > 0 || this.length === 0)
		for(var i = 0; i < this.length; i++)
			a.push(f(this[i],i));
	else
		for(var i in this)
			if(this.hasOwnProperty(i))
				a.push(f(this[i],i));
	return a;
}
JSK$Form.addcb = function(el, cbname, cb) {
	var oldcb = el[cbname];
	var f = function(ev) {
		ev = ev || window.event;
		if(oldcb) oldcb.apply(this, arguments);
		var value = inputValue(this);
		return cb.call(this, ev, value);
	}
	if(cbname == 'onchange')
		switch(el.type) {
		case "radio": this.addcb(el, 'onclick', cb); break;
		case "checkbox": this.addcb(el, 'onclick', cb); break;
		case "text":
		case "textarea":
		  this.addcb(el, 'onkeydown', cb); break;
                default:
                // Workaround IE problem
                if (JSKitLib.isIE() && JSKitLib.hasClass(el, 'radio-select')) {
                        this.addcb(el, 'onclick', cb); break;
                }
                
		}
	el[cbname] = f;
	return function(){return f.call(el)};
}
JSK$Form.save = function(sname, el, fbase, dataf) {
	var frm = fbase.glb;
	if(frm.onsave) frm.onsave();
	frm.fitem++;
	var params = {
		'ref': frm.site,
		'fidx': frm.fidx,
		'fitem': frm.fitem,
		'rnd': Math.random()
	};
	JSKitLib.fmap(dataf().obj, function(v, k){ params[k] = v; });
	if (frm.params) {
		JSKitLib.fmap(frm.params, function(v, k){ params[k] = v; });
	}
	new JSRVC({uri: "http://js-kit.com" + sname, request: params, target: el, randevu: true});
}
JSK$Form.saved = function(fidx, fitem) {
	var frm = this.forms[fidx];
	if(frm.fitem != fitem) return;
	if(frm.onsaved) frm.onsaved();
}
JSK$Form.autosave = function(fbase, dataf) {
	var o = dataf();
	var frm = fbase.glb;
	if(!frm.hasOwnProperty('fidx')) {
		frm.fidx = this.forms.length;
		frm.fitem = 0;
		this.forms.push(frm);
	}
	var f = function(ev, value) {
		var el = this;
		if(JSK$Form.initlock(0)) return false;
		if(fbase.savetmo) clearTimeout(fbase.savetmo);
		fbase.savetmo = setTimeout(function() {
			fbase.savetmo = null;
			JSK$Form.save(frm.script || "/settings.put", el.parentNode, fbase, dataf);
		}, 300);
	}
	JSK$Form.map.call(o.obj, function(e, i) {
		JSK$Form.addcb(fbase.ctls[i], 'onchange', f) });
}
JSK$Form.savecollect = function(c) {
	return { cgi: JSK$Form.map.call(c, function(cp, p) {
		return p+'='+encodeURIComponent(cp); }).join('&'), obj: c};
}
JSK$Form.sectionswitch = function(value, ctls, map) {
	var prevS = this.prevSection;
	var curS = map[value];
	if(!prevS && !curS && value == "off") prevS = map["on"];
	if(typeof(prevS) == 'string') prevS = { n: prevS };
	if(typeof(curS) == 'string') curS = { n: curS };
	if(prevS) {
		var prevCtl = ctls[prevS.n];
		var d = prevS.d;
		if(d) {
			for(var i = 0; i < d.length; i++)
				ctls[d[i]].disabled = !prevS.r;
			prevCtl.style.display = '';
		} else prevCtl.style.display = prevS.r ? '' : 'none';
	}
	if(curS) {
		var curCtl = ctls[curS.n];
		var d = curS.d;
		if(d) {
			for(var i = 0; i < d.length; i++)
				ctls[d[i]].disabled = !!curS.r;
			// Temporary until #121++
			curCtl.style.display = '';
		} else curCtl.style.display = curS.r ? 'none' : '';
	}
	this.prevSection = curS;
	return true;
}
JSK$Form.phtml = function(hclass, html) {
	var div = document.createElement('div');
	div.innerHTML = html;
	div = div.firstChild;
	if(hclass) div.className = hclass;
	return div;
}
JSK$Form.chtml = function(param) {
	var p = {tag: 'div'};
	switch(typeof param) {
	case 'string': p = {tag: 'div', 'class': param}; break;
	case 'object': p = param; break;
	}
	var cname = p['cname']; delete p['cname'];
	var hclass = p['class']; delete p['class'];
	var el = document.createElement(p.tag);
        if (JSKitLib.isPreIE8()) {
                if (p.tag == "input" && p.type == "radio") {
                        el = document.createElement("<input type='radio' name='"+p.name+"'>");
                }
        }
	for(var i = 1; i < arguments.length; i++) {
		var ch = arguments[i];
		switch(typeof ch) {
		case 'string':
			el.innerHTML = ch;
			continue;
		case 'object':
			if(p.tag == 'select') {
				el.options[el.options.length] = new Option(ch[1], ch[0], ch[2]);
				continue;
			}
		}
		el.appendChild(ch);
	}
	for (var a in p) el[a] = p[a];
	if(p.name) {
		if (!cname) cname = p.name;
		if(!hclass) hclass = p.name;
		if(this.dfl.hasOwnProperty(p.name)) {
			var dflVal = this.dfl[p.name];
			switch(p.tag) {
			case 'input':
				if(p.type == 'checkbox') {
					el.defaultChecked = (dflVal && dflVal != 'off' && dflVal != 'false');
                                        // XXX Workaround IE6 checked
                                        if (JSKitLib.isPreIE7()) {
                                                JSK$Form.addcb(el, 'onclick', function(ev, val) {this.defaultChecked = this.checked;});
                                        }
				} else if (p.type == 'radio') {
                                        // XXX Workaround IE8 "feature"
                                        el.rvalue = p.value;
                                }
				break;
			case 'text':
			case 'textarea':
				el.value = dflVal; break;
			case 'select':
				JSK$Form.map.call(el.options, function(o, i) {
					if(o.value == dflVal)
						o.selected = true;
				});
				break;
			}
		}
	}
	if(cname) this.ctls[cname] = el;
	else if (hclass) this.ctls[hclass] = el;
	el.className = (hclass || '') + ' jskFormParameter';
	return el;
}



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;
	}
}





JSKitLib.addCss = function(cssCode, name, content) {
	var doc = content || document;
	if(name) {
		name = "js-" + name + "-css";
		if (doc.getElementById(name)) return;
	}
	var se = doc.createElement("style");
	se.type = "text/css";
	if(name) se.id = name;
	if (se.styleSheet) se.styleSheet.cssText = cssCode;
	else se.appendChild(doc.createTextNode(cssCode));
	var hd = doc.getElementsByTagName("head");
	if(hd && hd[0]) hd[0].appendChild(se);
	else if (JSKitLib.isGChrome()) {
		doc.body.insertBefore(se, doc.body.firstChild);
	} else doc.write('<style>'+cssCode+'</style>');
}

JSKitLib.getElementsByClass = function(node, searchClass, tag) {
	var classElements = [];
	node = node || document;
	tag = tag || '*';
	var tagElements = node.getElementsByTagName(tag);
	var regex = new RegExp("(^|\\s)" + searchClass + "(\\s|$)");
	for (var i=0, j=0; i < tagElements.length; i++) {
		if (regex.test(tagElements[i].className)) {
			classElements[j] = tagElements[i];
			j++;
		}
	}
	return classElements;
};

JSKitLib.mapClass2Object = function(ctl, e) {
        if(e.className) {
                var arr = String(e.className).split(/[ ]+/);
                JSKitLib.map(function(el) { ctl[el] = e }, arr);
        }
        if(e.name) ctl[e.name] = e;
        try {
                var self = this;
                JSKitLib.map(function(child) {
                        JSKitLib.mapClass2Object(ctl, child);
                }, e.childNodes);
        } catch(e){}
        return ctl;
}

JSKitLib.hasClass = function(element, className) {
	return element.className.match(new RegExp('(\\s|^)' + className + '(\\s|$)'));
}

JSKitLib.addClass = function(element, className) {
	if (!JSKitLib.hasClass(element, className)) {
		element.className += ' ' + className;
	}
}

JSKitLib.removeClass = function(element, className) {
	if (JSKitLib.hasClass(element, className)) {
		var regex = new RegExp('(\\s|^)' + className + '(\\s|$)');
		element.className = element.className.replace(regex, ' ');
	}
}



JSK$Form.moveNodes = function(from, to) {
      while (from.firstChild) {
         var cn = from.firstChild;
         from.removeChild(cn);
         to.appendChild(cn);
      }
}

JSK$Form.disableEnableElement0 = function(el, de, nd) {
	switch (el.type) {
		case "checkbox":
		case "select-one":
		case "radio":
		case "text":
		case "textarea":
                case "submit":
                  el.disabled = de;
                  break;
		default:
		 if (nd) {
                         if (de) {
                             var wrap = el.firstChild;
                             if (!wrap || wrap.className != "disabled") {
                               var wrap = document.createElement("div");
                               wrap.className = "disabled";
                               JSK$Form.moveNodes(el, wrap);
                               el.appendChild(wrap);
                            }
                         } else {
                             var wrap = el.firstChild;
                             if (wrap && wrap.className == "disabled")
                             {
                               JSK$Form.moveNodes(wrap, el);
                               el.removeChild(wrap);
                             }
                         }
		 }
                JSKitLib.fmap(el.childNodes, function (cn) {JSK$Form.disableEnableElement0(cn, de, false);});
	}
}

JSK$Form.disableEnableElement = function(el, de) {
        JSK$Form.disableEnableElement0(el, de, true);
}

JSK$Form.disableElement = function(el) {
	JSK$Form.disableEnableElement(el, true);
}

JSK$Form.enableElement = function(el) {
	JSK$Form.disableEnableElement(el, false);
}

extractSite = function(site) {
	var sm = site.match(/^https?:\/\/([^\/]+)/);
	if (sm)
		return sm[1];
	return site;
}

agpSite = function() {
	/* Disable admin panel till reload */
	var nadp = document.getElementById("n-admin-panel");
	if (nadp) {
		JSKitLib.addClass(nadp, "disabled");
	}

	var ths = location.href.split("#");
	var ths1 = ths.length > 1 ? "#"+ths[1] : "";

	var ahs = ths[0].split("?")[0];
	location.assign(ahs + "?site="+this.options[this.selectedIndex].value + ths1);
}

inputValue = function(ie) {
	switch (ie.type) {
		case "checkbox":
		  return ie.checked ? 'true' : 'false';
		case "text":
		case "textarea":
		  return ie.value;
		case "select-one":
		  return ie.childNodes[ie.selectedIndex].value;
		case "radio":
		  if (ie.checked)
			  return ie.rvalue;
		  break;
		default:
		// radio-select or radio-input
		if (('className' in ie)
		    && (JSKitLib.hasClass(ie, 'radio-select')
			|| JSKitLib.hasClass(ie, 'radio-item')))
		{
			for (var ci = 0; ci < ie.childNodes.length; ci++)
			{
				var val = inputValue(ie.childNodes[ci]);
				if (val) {return val;}
			}
		}
	}
}

location_anchor = function (loc) {
	var hs = loc.split("#");
	if (hs.length > 1)
		return hs[1];
}

link_to_anchor = function (pan, hs) {
	var lsrch = location.href.split("?");
	if (lsrch.length > 1) {
		var hhp = lsrch[1].split("#")[0];
		return pan + "?" + hhp + hs;
	}
	return pan + hs;
}

firstSubsection = function (spd) {
        for (var ci = 0; ci < spd.childNodes.length; ci++)
        {
                var se = spd.childNodes[ci];
                if (JSKitLib.hasClass(se, 'subsection') && se.style.display != 'none') {
                        if (se.childNodes.length > 0) {
                                var ac = se.firstChild;
                                if (ac.tag == 'a' || ac.tag == 'A')
                                        return ac.href;
                        }
                } else if (JSKitLib.hasClass(se, 'section') || JSKitLib.hasClass(se, 'sidebar-sections')) {
                        var ret = firstSubsection(se);
                        if (ret) return ret;
                }
        }
        return false;
}

