/* events */
window.onerror= function (e) {
	alertER (e || event,'error');
}
window.onload= function (e) {
	//checkForParentFrame();
	flipFlopInit();
	systemInfo();
	fFormsInit(); setInterval('fFormsInit()',1000);
	setTimeout('jFrameAutoInit()',1);
}
window.onresize= function (e) {
	fixBlocksOnScreen();
}
document.onclick= function (e) {
	if (!e) e= event;
	switch (e.button) {
		case 0: {
			var tar= ifs (e.target,e.srcElement,document);
			return flipFlop(tar) && openLink(tar);
		} break;
		default: return true;
	}
}
document.ondblclick= function (e) {
	if (!e) e= event;
	switch (e.button) {
		case 0: {
			var tar= ifs (e.target,e.srcElement,document);
			return flipFlopOpenAll (tar);
		} break;
		default: return true;
	}
}
window.onscroll= function (e) {
	fixBlocksOnScreen();
}

/* elements search helpers */
function $ (id, doc) {
	if (!doc) doc= document;
	return doc.getElementById(id);
}
function $t (tag, el) {
	if (!el) el= document;
	return el.getElementsByTagName(tag);
}
function getParentByTag (el, tag) {do if (el.tagName.toLowerCase()==tag) return el; while (el= el.parentNode)}
function selfKill (el) {if (el.parentNode) el.parentNode.removeChild(el);}

/* browsers detection */
var isIE= navigator.appName=='Microsoft Internet Explorer';

/* algorithmics */
function ifs () {
	for (var i=0; i<arguments.length; i++) if (arguments[i]) return arguments[i];
	return '';
}
function _decl ($n, $f, $s, $m)
{ // правильно склоняет существительные после числительных
	if ( (($n>4)&&($n<21)) || (($n%10)>4) || (($n%10)==0) ) return $m;
	if (($n%10)==1) return $f;
	return $s;
}
function isEmail (str) {return str.search(/^[-\w.]+@(?:[-\w]+\.)+[\w]+$/)+1;}
function removeChilds (el) {while (ch= el.firstChild) el.removeChild(ch);}

/* class manipulating*/
function isClass (el, cl) {
	if (!el) return false;
	if (typeof(cl)=='string') cl= [cl];
	return el.className && el.className.search(RegExp('\\b('+cl.join('|')+')\\b'))!=-1;
}
function replaceClass (el,cl1,cl2) {
	if (!el) return false;
	var cname= el.className;
	if (cname) {
		if (typeof(cl1)=='string') cl1= [cl1];
		if (typeof(cl2)=='string') cl2= [cl2];
		el.className= cname.replace (RegExp('\\b('+cl1.join('|')+')\\b'),cl2[0]);
	}
	return el.className!=cname;
}
function swapClass (el,cl1,cl2) {
	var cname= el.className;
	if (cname) {
		if (typeof(cl1)=='string') cl1= [cl1];
		if (typeof(cl2)=='string') cl2= [cl2];
		el.className= cname.replace (RegExp('\\b('+cl1.join('|')+')\\b'),cl2[0]);
		if (el.className!=cname) return true;
		el.className= cname.replace (RegExp('\\b('+cl2.join('|')+')\\b'),cl1[0]);
		if (el.className!=cname) return true;
	}
	return false;
}
function getParentWithClass (el,cl) {
    do if (isClass(el,cl)) return el;
    while (el= el.parentNode);
    return null;
}

/* debug */
function vardump (obj) {
    var a= new Array();
    for (var p in obj) a[a.length]= p;
    a.sort();
    var w= window.open ('','vardumper');
    w.document.write('<dl><dt>'+obj+'</dt>');
    for (var i=0; i<a.length; i++) w.document.write('<dd>'+a[i]+'<i>= '+obj[a[i]]+'</i></dd>');
    w.document.write('</dl>');
}
function systemInfo () {
	var si= $('systeminfo');
	if (si) {
		function addsysinfo (a, b) {
			si.innerHTML+= '<div>'+a.bold()+': '+b.toString().italics()+'</div>';
		}
		addsysinfo ('Render Mode', ifs(document.compatMode) );
		addsysinfo ('Content Type', ifs(document.contentType, document.mimeType) );
		addsysinfo ('Character Set', ifs(document.characterSet, document.defaultCharset) );
		addsysinfo ('Document Location', ifs(document.location) );
		addsysinfo ('User Agent', ifs(navigator.userAgent) );
		//addsysinfo ('hi', (globalStorage[''].xyz += "."));
		/*storage = globalStorage[''];
		storage.setItem('user','dark-demon');
		alert(storage.getItem('user'));
		storage.removeItem('user');*/
	}
}

/* FForms validator */
function fform (el, valid) {
	var cvals= ['j-valid','j-invalid'];
	if (!el) el= this;
	if (!el.onkeyup) el.onkeyup= el.onchange;
	if (!el.onmouseup) el.onmouseup= el.onchange;
	var field= getParentWithClass(el,cvals);
	var form= el.form;
	if (!form.onreset) form.onreset= function () {setTimeout('fFormsInit()',1)};
	if (!form.onsubmit) form.onsubmit= function () {setTimeout('fFormsInit()',1)};
	var changed= replaceClass(field,cvals, valid?'j-valid':'j-invalid' );
	if (!form.fFormBugs) form.fFormBugs= 0;
	if (changed) {
		form.fFormBugs+= valid?-1:1;
		if (!form.submitElement) for (i=0, els=$t('input',form); i<els.length; i++) if (els[i].type=='submit') form.submitElement= els[i];
		form.submitElement.disabled= form.fFormBugs;
	}
}
function fFormsInit() {
	for (var i=0, els=$t('input'); i<els.length; i++) if (els[i].onchange) els[i].onchange();
	for (var i=0, els=$t('textarea'); i<els.length; i++) if (els[i].onchange) els[i].onchange();
	for (var i=0, els=$t('select'); i<els.length; i++) if (els[i].onchange) els[i].onchange();
}


/* FlipFlop*/
function flipFlop (el) {
	while (el) {
		if (isClass(el,'baken')) {
			while (el= el.parentNode) {
				if (isClass(el,'j-onlyopen')) {
					replaceClass(el,['j-off','j-onoff'],'j-on')
				} else {
					if (!swapClass(el,['j-off','j-onoff'],['j-on','j-onoff'])) continue;
				}
				if (isClass(el.parentNode,'j-onlyone')) {
					for (var c=el; c=c.nextSibling;) replaceClass(c,'j-on','j-off');
					for (var c=el; c=c.previousSibling;) replaceClass(c,'j-on','j-off');
				}
				setTimeout('fixBlocksOnScreen()',1);
				return false;
			}
			break;
		}
		el= el.parentNode;
	}
	return true;
}
function flipFlopOpenAll (el) {
	while (el) {
		if (isClass(el,'j-baken')) {
			while (el= el.parentNode) {
				if (!swapClass(el,['j-off','j-on'],'j-onoff')) continue;
				var c= el;
				allopen: while (1) {
					if (c.firstChild&&!isClass(c,'j-allopenend')) {
						replaceClass(c,['j-off','j-onoff'],'j-on');
						c= c.firstChild;
						continue allopen;
					};
					if (c==el) break allopen;
					while (!c.nextSibling) {
						c= c.parentNode;
						if (c==el) break allopen;
					}
					c= c.nextSibling;
				};
				setTimeout('fixBlocksOnScreen()',1);
				return false;
			}
			break;
		}
		el= el.parentNode;
	}
	return true;
}
function flipFlopInit () {
	var els= $t("*");
 	for (var i=0; i<els.length; i++) replaceClass (els[i],'j-onoff','j-off');
}

/* raw html works */
function getSelectedHTML() {
	if (isIE) {
		var sel= document.selection;
		var ran= sel.createRange();
		var html= ran.htmlText;
	} else {
		var sel= window.getSelection();
		var ran= sel.getRangeAt(0);
		var tempel= document.createElement('div');
		tempel.appendChild (ran.cloneContents());
		var html= tempel.innerHTML;
	}
	return html;
}

/* forcEdit */
function forcEdit (el, uri) {
	var frame= document.createElement('iframe');
	el.parentNode.insertBefore(frame,el);
	frame.style.display= 'block';
	frame.style.height= '1px';
	var edoc= frame.contentDocument || frame.contentWindow;
	if (edoc.document) edoc= edoc.document;
	var styles= 'body,html {margin:0;padding:0;border:none;overflow:hidden}';
	var ss= document.styleSheets;
	for (var i=0; i<ss.length; ++i) {
		if (ss[i].cssText) {styles+= ss[i].cssText; continue;}
		var s= ss[i].cssRules;
		for (j=0; j<s.length; ++j) {
			styles+= s[j].cssText;
		}
	}
	edoc.open();
	edoc.write('<html><head><style>'+styles+'</style><script src="forcedit.js"></script></head><body>'+el.innerHTML+'</body></html>');
	edoc.close();
	el.style.display= 'none';
	frame.focus();
	frame.applyEdit= function(html) {
		el.innerHTML= html;
		el.style.display= 'block';
		selfKill(frame);
		var field= alertER ('Идёт передача данных. Пожалуйста, сохраняйте спокойствие.','process');
		function callback (data) {
			selfKill(field);
			if(data) alertER (data, 'error');
		}
		jFrameLoad(callback,uri,html);
	}
}

/* frames */
/*function checkForParentFrame() {
	if (parent==self) for (var i=0, links= $t('link'); i<links.length; i++) if (links[i].rel=='default-frameset') {
		location= links[i].href+'?'+location.href;
		break;
	}
}*/
function jFrameLoad(action, get, post) {
	var frame= document.createElement('iframe');
	switch (typeof(action)) {
		case 'string':
			onload= function (data) {eval(action);};
			break;
		case 'object':
			if (action.onload!=undefined) onload= action.onload;
			else if (action.innerHTML!=undefined) onload= function (data) {action.innerHTML= data;};
			else onload= function (data) {action.data= data;};
			break;
		default:
			var onload= action;
	}
	frame.jonload= function (data) {selfKill(frame); onload(data);};
	setTimeout (function() {
		if (frame.parentNode) {
			onload();
			var field= alertER('Ошибка передачи данных. Можете паниковать.','error');
			frame.jonload= function (data) {selfKill(frame); selfKill(field); onload(data);};
		};
	}, 30000);
	setTimeout (function() {
		if (post) {
			var doc= '<html><body><form method="post" action="'+get+'">';
			if (typeof(post)=='string') post= {'data':post};
			for (i in post) {
				doc+= '<textarea name="'+i+'">'+post[i].replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')+'</textarea>';
			}
			doc+= '<input type="submit" value="ajax" /></form></body></html>';
			var edoc= frame.contentWindow || frame.contentDocument;
			if (edoc.document) edoc= edoc.document;
			edoc.write(doc);
			edoc.close();
			edoc.body.firstChild.submit();
		} else {
			frame.type='text/xml';
			frame.src= get;
		};
	}, 1);
	$t('body')[0].appendChild(frame);
	return frame;
}
function jFrameAutoInit () {
	fs= $t('a');
	function load (el, uri) {
		jFrameLoad(function(data){if(data!=undefined)el.innerHTML=data;},uri);
	}
	for (i=0; i<fs.length; i++) {
		var el= fs[i].parentNode;
		if (isClass(el,'j-frame')) load(el,fs[i].href);
	}
	try {
		window.frameElement.jonload($t('body')[0].innerHTML);
	} catch(e){};
}
function openLink (el) {
	if (isClass(el,'j-openinparent')) el.target='_top';
	else if (isClass(el,'j-openinblank')) el.target='_blank';
	else if (isClass(el,'j-openinself')) el.target='_self';
	else el.target= '_top';
	return true;
}

/* alertER */
function alertER (text, type) {
	alerter= $('j-alerter');
	if (!alerter) return;
	var field= document.createElement('div');
	field.innerHTML= text;
	if (type) field.className= 'j-alerter-'+type;
	field.onclick= function () {selfKill(field);};
	alerter.appendChild(field);
	return field;
}

/* specific */
function fixBlockOnScreen (el) {
	if (el) {
		el.style.positions= 'fixed';
		sp= document.documentElement.scrollTop;
		hh= (head=$('header'))?head.offsetHeight:0;
		fh= (foot=$('footer'))?foot.offsetHeight:0;
		al= (alerter=$('j-alerter'))?alerter.offsetHeight:0;
		h= el.offsetHeight;
		ph= el.parentNode.offsetHeight;
		m= sp-hh+al;
		if (m<0) m=0;
		if ((hh+m+h+fh)>ph) m= ph-hh-fh-h;
		el.style.marginTop= m+'px';
	}
}
function fixBlocksOnScreen () {
	fixBlockOnScreen ($('leftside'));
	fixBlockOnScreen ($('rightside'));
}

/*mousex = 0
mousey = 0
mouseFollower = function() {}
if(isNC4) document.captureEvents(Event.MOUSEMOVE)
if(isMSIE || isOpera7){
 document.onmousemove=function(){
   mousex=event.clientX+document.body.scrollLeft
   mousey=event.clientY+document.body.scrollTop
   mouseFollower()
   return true
 }
}else if(isOpera){
 document.onmousemove=function(){
   mousex=event.clientX
   mousey=event.clientY
   mouseFollower()
   return true
 }
}else if(isNC){
 document.onmousemove=function(e){
   mousex = e.pageX
   mousey = e.pageY
   mouseFollower()
   return true
 }  
}*/