(function(){

var jss = window.jss = {
	version: "0.0.1-2008 by morgan",
	globals: {},
	dom_loaded: false,

	init: function() {
		// bin
		var b2c = new Array(256), c2b = new Object(), i;
		for ( i=0; i<128; i++) {
			b2c[i] = String.fromCharCode(i);
			c2b[b2c[i]] = i;
		}

		var c = "€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ\xa0¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ";
		for ( i=128; i<256; i++) {
			b2c[i] = c.charAt(i-128);
			c2b[b2c[i]] = i;
		}
		jss.b2c = b2c;
		jss.c2b = c2b;

		var rb64 = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"];
		var b64 = new Object();
		for ( i=0; i<64; i++) {
			b64[rb64[i]] = i;
		}
		
		jss.rb64 = rb64;
		jss.b64 = b64;

		jss.b64_regexp = /^[a-z0-9+\/]+={0,2}$/i;

		// browser specific. thanks jquery
		var ua = navigator.userAgent.toLowerCase();
		jss.browser = {
			version: (ua.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
			safari: /webkit/.test(ua),
			opera: /opera/.test(ua),
			ie: /msie/.test(ua) && !/opera/.test(ua),
			mozilla: /mozilla/.test(ua) && !/(compatible|webkit)/.test(ua),
			browser: "other"
		};

		for (var x in jss.browser) {
			if (jss.browser[x]&&(typeof jss.browser[x]!="string")) {
				jss.browser.browser = x;
				break;
			}
		}

		for (var x in jss.browser_specific) {
			eval("jss."+x+"=jss.browser_specific."+x+"."+((typeof jss.browser_specific[x][jss.browser.browser]=="undefined")?"other":jss.browser.browser));
		}

		// go
		jss.onload();
	},

	onload: function () {
		if (!jss.iexists("contentLoaded")) {
			setTimeout("jss.onload()",50);
			return;
		}

		jss.dom_loaded = true;

		// the very first element in every form MUST be hidden one
		// no matter name/disabled - it MUST present just
		for ( var i=0; i<document.forms.length; i++) {
			var el = document.forms[i].elements[0];
			if (el.disabled&&(el.type=="hidden")&&(el.name=="jss")&&(el.value=="1")) {
				document.forms[i].onsubmit = jss.ajax.postform;
			}

			if (el.disabled&&(el.type=="hidden")&&(el.name=="integrity")&&(el.value="0")) {
				continue;
			}
			// auto check post integrity
			jss.maddchild(document.forms[i],"input",{
				"type":"hidden",
				"name":"__integrity_a",
				"value":"1"
			},el);

			jss.maddchild(document.forms[i],"input",{
				"type":"hidden",
				"name":"__integrity_z",
				"value":"1"
			});
			//
		}

		if (jss.iexists("jss_ajax_yes")) {
			jss.i("jss_ajax_yes").onmouseover = function () {
				this.style.display = "none";
			}
		}
	},
	
	obj_length: function ( o) {
		var i = 0;
		for (var x in o) {
			i++;
		}
		return i;
	},

	obj_clone: function ( o) {
		for (var x in o) {
			if (typeof o[x] == "object") {
				this[x] = new jss.clone(o[x]);
			} else {
				this[x] = o[x];
			}
		}
	},

	obj_dump: function ( o, pad) {
		if (typeof pad=="undefined") {
			pad = "";
		}

		var s="", i=0;
		for (var x in o) {
			if (typeof o[x]=="object"){
				s+=pad+x+":{\n"+jss.obj_dump(o[x],pad+"\x09")+pad+"}\n";
			} else {
				s+=pad+x+":"+o[x]+"\n";
			}
		}
		return s;
	},

	// for numeric objects only - each property name must be numeric
	// small objects only. ascending order
	obj_isort: function ( o) {
		var p = [], n=0, t, i, j, x, r={};
		for (x in o) {
			p[n++] = parseInt(x,10);
		}

		for (i=0; i<n; i++) {
			for (j=i+1; j<n; j++) {
				if (p[i]>p[j]) {
					t = p[i]; p[i] = p[j]; p[j] = t;
				}
			}
		}

		for (i=0; i<n; i++) {
			r[p[i]] = o[p[i]];
		}
		return r;
	},

	// literal ascending sort by keys
	obj_sort: function ( o) {
		var p = [], n=0, r={};
		for (x in o) {
			p[n++] = x;
		}
		p.sort();

		for (i=0; i<n; i++) {
			r[p[i]] = o[p[i]];
		}
		return r;
	},

	i: function ( id) {
		return document.getElementById(id);
	},

	iexists: function ( id) {
		return !(jss.i(id)==null);
	},

	iset: function ( id, i, v, q) { if (id) {
		if (q) {
			v = "\""+v.replace(/"/g,"\\\"")+"\"";
		}
		eval("document.getElementById('"+id+"')."+i+"="+v);
	} },

	// to avoid ie bug with table.innerHTML readonly. no spanned cells
	iset_ti: function ( id, v) { if (id) {
		var t = jss.i(id);
		while (t.rows.length>0) {
			t.deleteRow(0);
		}

		var rows = v.slice(4,-5).split("</tr><tr>");
		var nr = rows.length;
		for ( var i=0; i<nr; i++) {
			var tr = t.insertRow(-1);
			var cells = rows[i].slice(4,-5).split("</td><td>");
			var cr = cells.length;
			for ( var j=0; j<cr; j++) {
				tr.insertCell(-1).innerHTML = cells[j];
			}
		}
	} },

	iget: function ( id, i) {
		return eval("document.getElementById(id)."+i);
	},

	iseteach: function ( root, tag, key, val, q, filter_func) {
		if (q) {
			val = "\""+val.replace(/"/g,"\\\"")+"\"";
		}

		var o = root?jss.i(root):document;
		o = o.getElementsByTagName(tag);

		var z = filter_func?true:false;
		for (var i=0; i<o.length; i++) if (!z||filter_func(o[i])) {
			eval("o[i]."+key+"="+val+";");
		}
	},

	maddchild: function ( parent_mixed, tag, props, prev_mixed) {
		var x = document.createElement(tag);
		for (var prop in props) {
			var q = '"';
			if ((props[prop]==true)||(props['prop']==false)) {
				q = '';
			}
			eval('x.'+prop+'='+q+props[prop]+q);
		}
		
		var se = (typeof parent_mixed=="object")?"parent_mixed":"jss.i(parent_mixed)";
		if (typeof prev_mixed=="undefined") {
			se += ".appendChild(x)";
		} else if (typeof prev_mixed=="object") {
			se += ".insertBefore(x,prev_mixed)";
		} else {
			se += ".insertBefore(x,jss.i(prev_mixed))";
		}
		eval(se);
	},

	y: function ( o) {
		var t = 0;
		while (o != null) {
			t += o.offsetTop;
			o = o.offsetParent;
		}
		return t;
	},

	x: function ( o) {
		var t = 0;
		while (o != null) {
			t += o.offsetLeft;
			o = o.offsetParent;
		}
		return t;
	},


browser_specific: {
	base64_encode: {
		opera: function ( s) {
			var k, i = 0, j = 0, n = s.length, rz = new Array(4*Math.ceil(n/3)), c2b = jss.c2b, c = jss.rb64, sa = s.split("");
			while (i < n) {
				k = c2b[sa[i++]]<<16|c2b[sa[i++]]<<8|c2b[sa[i++]];
				rz[j++] = c[k>>18];
				rz[j++] = c[k>>12&0x3f];
				rz[j++] = c[k>>6&0x3f];
				rz[j++] = c[k&0x3f];
			}

			if (i-=n) {
				rz[j-1] = "=";
				if (i>1) {
					rz[j-2] = "=";
				}
			}

			return rz.join("");
		},

		ie: function ( s) {
			var k, i = 0, j = 0, n = s.length, rz = new Array(Math.ceil(n/3)), c2b = jss.c2b, c = jss.rb64;
			while (i < n) {
				k = c2b[s.charAt(i++)]<<16|c2b[s.charAt(i++)]<<8|c2b[s.charAt(i++)];
				rz[j++] = c[k>>18] + c[k>>12&0x3f] + c[k>>6&0x3f] + c[k&0x3f];
			}

			if (i-=n) {
				rz[j-1] = rz[j-1].slice(0,-i) + (i>1?"==":"=");
			}

			return rz.join("");
		},

		other: function ( s) {
			var k, i = 0, n = s.length, rz = "", c2b = jss.c2b, c = jss.rb64;
			while (i < n) {
				k = c2b[s.charAt(i++)]<<16|c2b[s.charAt(i++)]<<8|c2b[s.charAt(i++)];
				rz += c[k>>18] + c[k>>12&0x3f] + c[k>>6&0x3f] + c[k&0x3f];
			}

			if (i-=n) {
				return (rz.slice(0,-i) + (i>1?"==":"="));
			}
			return rz;
		}
	},

	base64_decode: {
		opera: function ( s) {
			if ((s.length&3)||!jss.b64_regexp.test(s)) {
				return "";
			}

			var k, i = 0, j = 0, n = s.length, rz = new Array(3*Math.ceil(n/4)), sa = s.split(""), b2c = jss.b2c, c = jss.b64;
			while (i < n) {
				k = c[sa[i++]]<<18|c[sa[i++]]<<12|c[sa[i++]]<<6|c[sa[i++]];
				rz[j++] = b2c[k>>16];
				rz[j++] = b2c[(k>>8)&0xff];
				rz[j++] = b2c[k&0xff];
			}

			var t = s.slice(s.length-2);
			if (t.charAt(1)=="=") {
				rz[j-1] = "";
			}
			if (t.charAt(0)=="=") {
				rz[j-2] = "";
            }

			return rz.join("");
		},

		ie: function ( s) {
			if ((s.length&3)||!jss.b64_regexp.test(s)) {
				return "";
			}

			var k, i = 0, j = 0, n = s.length, rz = new Array(Math.ceil(n/4)), b2c = jss.b2c, c = jss.b64;
			while (i < n) {
				k = c[s.charAt(i++)]<<18|c[s.charAt(i++)]<<12|c[s.charAt(i++)]<<6|c[s.charAt(i++)];
				rz[j++] = b2c[k>>16] + b2c[(k>>8)&0xff] + b2c[k&0xff];
			}

			var t = s.slice(s.length-2);
			if (t=="=") {
				rz[j-1] = rz[j-1].slice(0,-1);
			} else if (t=="==") {
				rz[j-1] = rz[j-1].slice(0,-2);
			}

			return rz.join("");
		},


		other: function ( s) {
			if ((s.length&3)||!jss.b64_regexp.test(s)) {
				return '';
			}

			var k, i = 0, rz = "", n = s.length, b2c = jss.b2c, c = jss.b64;
			while (i < n) {
				k = c[s.charAt(i++)]<<18|c[s.charAt(i++)]<<12|c[s.charAt(i++)]<<6|c[s.charAt(i++)];
				rz += b2c[k>>16]+b2c[(k>>8)&0xff]+b2c[k&0xff];
			}

			if ((i=s.indexOf("="))>=0) {
				return rz.slice(0,i-n);
			}

			return rz;
		}
	}
},

	adler32: function ( s) {
		var i, w1=1, w2=0, n=s.length, c, c2b = jss.c2b;
		for ( i=0; i<n; i++) {
			c = c2b[s.charAt(i)];
			w1 = (w1 + c)%65521;
			w2 = (w2 + w1)%65521;
		}
		c = w1.toString(16); while(c.length<4){c="0"+c;}
		return w2.toString(16)+c;
	},

	ajax: {
		created: false,
		http: false,
		form: false,
		inget: false,

		create: function() {
			var xmlhttp;
			/*@cc_on
			@if (@_jscript_version >= 5)
				try {
					xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
				} catch (e) {
					try {
						xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
					} catch (e) {
						xmlhttp = false;
					}
				}
			@else
			xmlhttp = false;
			@end @*/
			if (!xmlhttp && typeof XMLHttpRequest != "undefined") {
				try {
					xmlhttp = new XMLHttpRequest();
				} catch (e) {
					xmlhttp = false;
				}
			}

			jss.ajax.created = true;
			return jss.ajax.http=xmlhttp;
		},
	
		xencode: function ( s) {
			if (s.indexOf("~")>=0) {
				s = s.split("~").join("\\~");
			}
			var n = s.length, x, i, c2b = jss.c2b, t = new Array(n);
			for (var i=0; i<n; i++) {
				x = s.charAt(i);
				t[i] = c2b[x]?x:"&#"+s.charCodeAt(i)+";";
			}
			return t.join("");
		},

		postform: function () {
			if (!jss.ajax.created) jss.ajax.create();
			if (jss.ajax.form||!jss.ajax.http) return false;
			
			jss.ajax.form = this;
			var f = this.elements, l = f.length, s = "", el, submit = -1;
			this.xsubmit = false;

			for ( var i=0; i<l; i++) {
				el = f[i];
				
				if (el.disabled) {
					continue;
				}

				if (el.type=="submit") {
					submit = (submit==-1)?i:-2;
				}

				if (!el.name) {
					continue;
				}

				switch (el.type) {
					case "checkbox":
					case "radio":
						if (el.checked) {
							s += jss.ajax.xencode(el.name)+"~"+jss.ajax.xencode(el.value)+"~";
						}
						break;

					case "select-one":
						s += jss.ajax.xencode(el.name)+"~"+jss.ajax.xencode(el.options[el.selectedIndex].value)+"~";
						break;

					case "text":
					case "textarea":
					case "password":
					case "submit":
					case "hidden":
						if (el.name.slice(-4)=="_FCK") { // fck specific
							if (typeof FCKeditorAPI!="undefined") {
								var fck = FCKeditorAPI.GetInstance(el.name);
								el.value = fck.GetXHTML("html");
							}
						}

						if (el.value.length>35000) {
							return true; // no ajax posting, too long to encode
						}
						s += jss.ajax.xencode(el.name)+"~"+jss.ajax.xencode(el.value)+"~";
						break;

					default:
						continue;
				}
			}

			if (submit>=0) {
				f[this.xsubmit=submit].disabled = true;
			}

			jss.ajax.post(this.action+(this.action.indexOf("?")==-1?"?":"&")+Math.random(),s,jss.ajax.postformhandler); // no ie cache
			return false;
		},

		xreset: function() {
			if (jss.iexists("jss_ajax_yes")) jss.iset("jss_ajax_yes","style.display","none",1);
			if (jss.iexists("jss_ajax_no")) jss.iset("jss_ajax_no","style.display","none",1);
		},

		parser: function( s) {
			var x, p, i, n=0, j=0, yes=0, no=0, op, arg;
					
			eval("x="+(typeof s=="string"?s:jss.ajax.http.responseText));
			for (p in x) {
				n++;
				if (p.charAt(0)=="#") {
					jss.iset(p.slice(1,i=p.indexOf(".")),p.slice(i+1),x[p],1);
					j++;
					continue;
				}

				if (p.charAt(0)=="@") {
					op = p.slice(1); arg = false;
					if ((i=op.indexOf("#"))!=-1) {
						arg = op.slice(i+1);
						op = op.slice(0,i);
					}

					switch (op) {
						case "yes":
						case "no":
							if (jss.iexists("jss_ajax_"+op)) {
								eval(op+"=1");
								jss.iset("jss_ajax_"+op,"innerHTML",x[p]+(op=="no"?"<div style=\"text-align:right;margin-top:10px;\"><a href=\"#\" style=\"background-color:#ffffff;color:#ff0000;padding:2px 4px;\" onclick=\"jss.iset('jss_ajax_no','style.display','none',1);return false;\">Çàêðûòü</a></div>":""),1);
								jss.iset("jss_ajax_"+op,"style.display","block",1);

								if ((op=="yes")&&(arg!="-1")) {
									setTimeout("jss.iset('jss_ajax_yes','style.display','none',1)",arg?arg:1000);
								}
							}
							break;

						default:
							n--;
					}
				}
			}

			if (!yes&&jss.iexists("jss_ajax_yes")) jss.iset("jss_ajax_yes","style.display","none",1);
			if (!no&&jss.iexists("jss_ajax_no")) jss.iset("jss_ajax_no","style.display","none",1);

			if ((j<n)&&jss.ajax.form) {
				var f = jss.ajax.form.elements, l = f.length;
				for ( i=0; i<l; i++) {
					if (typeof x[f[i].name] != "undefined") {
						var el = f[i], v = x[el.name];
						switch (el.type) {
							case "checkbox":
								el.checked = v;
								break;

							case "radio":
								el.checked = el.value==v;
								break;

							case "select-one":
								j = el.options.length;
								for ( var k=0; k<j; k++) {
									if (el.options[k].value==v) {
										el.options[k].selected = true;
										break;
									}
								}
								break;

							default:
								el.value = v;
								break;
						}
					}
				}
			}
		},

		postformhandler: function() { if (!jss.ajax.form) return;
			if (jss.ajax.http.readyState == 4) {
				if (jss.ajax.http.status == 200) {
					jss.ajax.parser();
				} else {
					alert("Îøèáêà // ñòàòóñ îòâåòà HTTP: "+jss.ajax.http.status);
				}

				if (typeof(jss.ajax.form.xsubmit)=="number") {
					jss.ajax.form.elements[jss.ajax.form.xsubmit].disabled = false;
				}
				jss.ajax.form = false;
			}
		},

		post: function( url, s, handler) {
			if (!jss.ajax.created) jss.ajax.create();
			if (!jss.ajax.http) return;
			
			jss.ajax.http.open("POST",url,true);
			jss.ajax.http.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			jss.ajax.http.setRequestHeader("Ajax-Query","base64");
			if (typeof(handler) != "undefined") {
				jss.ajax.http.onreadystatechange = handler;
			}
			jss.ajax.http.send("s="+jss.base64_encode(s));
		},

		get: function( url, handler) {
			if (!jss.ajax.created) jss.ajax.create();
			if (!jss.ajax.http) return;
			
			jss.ajax.http.open("GET",url,true);
			jss.ajax.http.setRequestHeader("Ajax-Query","plain");
			if (typeof(handler) != "undefined") {
				jss.ajax.http.onreadystatechange = handler;
			}
			jss.ajax.http.send('');
		},

		ntrim: function() {	if (!jss.ajax.form) return;
			var n=arguments.length, el, j, k;
			var c = {32:1,9:1,0:1,10:1,13:1,11:1};
			for (var i=0; i<n; i++) {
				el = jss.ajax.form.elements[arguments[i]];
				if ((el.type=="text")||(el.type=="textarea")) {
					j = -1;	while (typeof c[el.value.charCodeAt(++j)]=="number");
					k = el.value.length; while (typeof c[el.value.charCodeAt(--k)]=="number");
					if (j||(k<el.value.length)) {
					 	try {
						 	el.value = el.value.slice(j,k+1);
						} catch (e) {
							el.value = "";
						}
					}
				}
			}
		},

		geturlhandler: function() { if (!jss.ajax.inget) return;
			if (jss.ajax.http.readyState == 4) {
				if (jss.ajax.http.status == 200) {
					jss.ajax.parser();
				} else {
					alert("Îøèáêà // ñòàòóñ îòâåòà HTTP: "+jss.ajax.http.status);
				}

				jss.ajax.inget = false;
			}
		},

		geturl: function ( url) {
			if (!jss.ajax.created) jss.ajax.create();
			if (jss.ajax.inget||!jss.ajax.http) return false;

			jss.ajax.inget = true;
			jss.ajax.get(url+((url.indexOf("?")==-1?"?":"&")+Math.random()),jss.ajax.geturlhandler); // no ie cache
			return false;
		}

	}
}

})();

jss.init();
