var eJson = Class.create({
	load : function(url,block_id, confirm_question){
		url = url.replace('index.php','json.php');
		if(url.indexOf('_layout/json')<0){
			url = url.replace(/\/$/, '') + '/_layout/json';
		}
		if(confirm_question){
			if(!confirm(confirm_question)){
				return false;
			}
		}
		new Ajax.Request(url,{
			method : 'get',
			onSuccess : function(t){
				var ej = new eJson();
				if(t.responseText.isJSON()){
					var res = t.responseText.evalJSON(true);
					res.each(function(e){
						try{
							ej.parseResponse(e);
						}catch(ex){
							d('Exception ' + ex.message);
						}
					});
				}else{
					ej.excHandle(t.responseText);
				}

			}
		});
	},
	/**
	 * Metoda prezentujaca wyjatki ze strony serwera.
	 */
	excHandle : function(res){
		var main = new Element('div',{className : 'excB'});
		var main_t = new Element('div',{className : 'excT closeMe'});
		main_t.innerHTML = 'closeMe';
		main.appendChild(main_t);
		var main_c = new Element('div',{className : 'excC'});
		main_c.innerHTML = res || "Server Error";
		main.appendChild(main_c);
		document.body.appendChild(main);
	},
	/**
	 * Metoda realizujaca operacje od strony klienta.
	 */
	a : function(url,blur_obj_id,post_params){
		url = url.replace('index.php','json.php');
		if(url.indexOf('_layout/json')<0){
			url = url.replace(/\/$/, '') + '/_layout/json';
		}
		d('jsonAction:'+url);
		new Ajax.Request(url,{
			method : 'post',
			evalJS : false,
			evalJSON : false,
			parameters : post_params,
			onLoading : function(){
				if(blur_obj_id && $(blur_obj_id)){
					var b = new Element('div',{id:blur_obj_id+'_blur',className : 'blurP'})
					b.clonePosition($(blur_obj_id));
					b.setOpacity(0.7);
					document.body.appendChild(b);
				}
			},
			onSuccess : function(t){
				var ej = new eJson();
				d('parsing response from jAction');
				if(t.responseText.isJSON()){
					var res = t.responseText.evalJSON(true);
					res.each(function(e){
						try{
							ej.parseResponse(e);
						}catch(ex){
							d('Exception ' + ex.message);
						}
					});

				}else{
					$(blur_obj_id+'_blur').remove();
					ej.excHandle(t.responseText);
				}
			},
			onComplete : function(){
				if($(blur_obj_id+'_blur')){
					$(blur_obj_id+'_blur').remove();
				}
			}
				
		});	
	},
	parseResponse: function(res){
		if(!res.type && !(res.content || res.cmd)){
			d('Blad operacji parseJSONResponse');
			return null;
		}
		switch(res.type){
			case 'cmd':
				d('CMD ' + res.cmd);
				eval(res.cmd);
				break;
			case 'debug':
				if(res.place && $(res.place)){
					var p = $(res.place);
				}else if($('debug_server')){
					var p = $('debug_server');
				}else{
					break;
				}
				p.innerHTML = res.content + p.innerHTML; 
				break;
			case 'content':
				if(res.place && $(res.place)){
					var p = $(res.place);
					p.innerHTML = res.content; 
				}else{
					var e = new Element('div');
					e.innerHTML = res.content;
					document.body.appendChild(e);	
				}
				break;
			case 'add':
				if(res.place && $(res.place)){
					var p = $(res.place);
					p.innerHTML = p.innerHTML + res.content; 
				}else{
					//nie ma mozliwosci dodania do nieistniejacego obiektu
				}
				break;
			case 'inAfter':
				if(res.place && $(res.place)){
					var p = $(res.place);
					new Insertion.After(p,res.content);
				}
				break;
			case 'inBefore':
				if(res.place && $(res.place)){
					var p = $(res.place);
					new Insertion.Before(p,res.content);
				}
				break;
			case 'form':
				d('eJSON::response::form');
				for(var i =0;i < res.content.length;i = i+1){
					var e = res.content[i];
					d('dla pola: '+ e.id + 'wartosc: ' + e.value);
				 	var f = $(e.id);
				 	if(e.id.substring(0,1) != '_' && f){
					 	if(e.notify && e.id){
					 		//d('HELP for '+e.id);
					 		help.msg(e,'string_length',e.notify);
					 	}
				 		f.value = e.value;
					 	if(e.clear){
					 		f.value = null;
					 	}
				 	}
				}
				break;
		}
	}
});
function handleIFrameForm(fid){
	fid = $(fid);
	if(!fid){
		alert('Nie moge odszukac wlaciwego formularza');
		return false;
	}
	fid._subact.value = 'iframe';
	fid.target = fid.id + '_iframe';
	fid._fid = fid.id;
	fid.action = fid.action.replace('index.php','json.php');
	var parent = findParent(fid,'div','dynamicWindow');
	if(parent){
		fid._parent_id.value = parent.id;
	}
	d('start uploading files');
	var frame = $(fid.id + '_iframe');
	return true;
}
function handleIFrameFormStop(fid,cmd){
	fid = $(fid);
	res = cmd.evalJSON();
	res.each(function(v){
		e.parseResponse(v);
	});
	d('form has stopped');
}
function handleForm(fid){
	fid = $(fid);
	if(!fid){
		alert('Nie moge odszukac wlaciwego formularza');
		return false;
	}
	if(fid.tagName.toUpperCase() != 'FORM'){
		alert('Wskazany element musi byc typu form a jest : ' + fid.localName);
		return false;
	}
		
	//zebranie danych z formularza.
	var url = fid.action.replace('index.php','json.php');
	var transport = new Object();
	if(fid._subact){
		transport._subact = fid.subact;
	}
	transport._fid = fid.id;
	for(var i=0;i< fid.elements.length;i++){
		var item = fid.elements[i];
		if(item.type.toUpperCase() == 'RADIO' || item.type.toUpperCase() == 'CHECKBOX'){
			//radio || checkbox
			if(item.checked == true){
				transport[item.name] = item.value;
			}
		}else{
			transport[item.name] = item.value;
		}
	}
	transport.parent_id = fid.parentNode.parentNode.id;
	var j = new eJson(); 
	d('handleForm url:' + url);
	new Ajax.Request(url,{
		method : 'post',
		idblur : null,
		parameters : transport,//przekazanie parametrow formularza do systemu.
		evalJS : false,
		evalJSON : false,
		onLoading : function(){
			this.idblur = 'blur_' + Math.floor(Math.random() * 1000);
			var b = new Element('div',{
				id:this.idblur,
				className : 'blurP'
			});
			b.clonePosition(fid);
			b.setOpacity(0.7);
			document.body.appendChild(b);
			fid.parentNode
		},
		onSuccess: function (t){
			var ej = new eJson();
			if(!t.responseText.isJSON()){
				$(this.idblur).remove();
				ej.excHandle(t.responseText);
			}else{
				var res = t.responseText.evalJSON(true);
				res.each(function(e){
					j.parseResponse(e);
				});
			}
		},
		onComplete : function (){
			$(this.idblur).remove();
		},
		onError: function (res){
			d('onerror');
			alert('Blad formularza');
			$(this.idblur).remove();
		}
	});
	return false;
}
function layers(mid){
	if(!$(mid)){
		return null;
	}
	var tmp = new Array();
	var t;
	tmp = $$('div.layers');
	for(var i = 0;i < (tmp.length - 1);i++){
		for(var j = i+1;j < tmp.length;j++){
			if(tmp[j].style.zIndex < tmp[i].style.zIndex){
				t = tmp[j];
				tmp[j] = tmp[i];
				tmp[i] = t;
			}
		}
	}
	for(var i=0;i < tmp.length;i++){
		tmp[i].style.zIndex = 20 + i;
	}
	$(mid).style.zIndex = 80;
} 

var myMethods = {
	myUpdate : function(o){
		if(!o || !o.id){
			return false;
		}
		if(o.className.indexOf('dynamicTable') > -1){
			d('For object: ' + o.id + ' exec action: update');
			//wymagam parametru summary
			if(!o.summary){
				d('There is no summary(link) param for object: ' + o.id);
				return false;
			}
			var url = o.summary.replace('index.php','json.php');
//			if(url.indexOf('_json/updateTable') < 0){
//				url = url.replace(/\/$/, '')  + '/_json/updateTable';
//			}
			var p = {
				_json : 'updateTable',
				_parent : o.id
			}
			e.a(url,o.id,p);
		}
	},
	notify : function(o){
		//o.myUpdate(o);
//		alert('ble ble ' + o.id);
	},
	mySetTTL : function(o,time){
		this.ttl = time;
		if(time < 10){
			d('Zbyt maly czas');
			return false;
		}
		//$(o.id).myUpdate();
//		new PeriodicalExecuter(function(e){
//			alert(scopeChain[1]);
//			e.stop();
//		},10);
	},
	myMaximize : function(o){
		if(!o || !o.id || o.className.indexOf('resizeable') < 0){
			return false;
		}
		if(!o.hasClassName('maximized') && !o.hasClassName('minimized')){
			this.myDim = {
				width : o.getStyle('width'),
				height : o.getStyle('height'),
				top : o.getStyle('top'),
				left : o.getStyle('left')
			};
		}
		d('Maximizing window');
		if(o.hasClassName('minimized')){
			o.toggleClassName('minimized');
		}
		if(!o.hasClassName('maximized')){
			o.toggleClassName('maximized');
		}
		o.morph('left: 0px;top : 28px; width: ' + document.viewport.getWidth() + 'px; height: ' + document.viewport.getHeight() + 'px;');
	},
	myMinimize : function(o){
		if(!o || !o.id || o.className.indexOf('resizeable') < 0){
			return false;
		}
		d('Minimizing window');
		if(!o.hasClassName('maximized') && !o.hasClassName('minimized')){
			this.myDim = {
				width : o.getStyle('width'),
				height : o.getStyle('height'),
				top : o.getStyle('top'),
				left : o.getStyle('left')
			};
		}
		var sc = new Element('div',{
			className : 'component',
			id : ('sbid_' + o.id) 
		});
		sc.observe('click',function(e){
			var o = new Event.element(e);
			o.remove();
			var id = o.id.substring(5);
			var o = $(id);
			o.myNormalize();
		}); 
		var title = 'Lista userkow';
		sc.innerHTML = '<div class="component_inside"><span class="Sbutton Bbutton Bdot"></span>' + title + '</div></div>';
		$('sidebar').appendChild(sc);
		o.hide();
		if(!o.hasClassName('minimized')){
			o.toggleClassName('minimized');
		}
	},
	myNormalize : function(o){
		if(!o || !o.id || o.className.indexOf('resizeable') < 0){
			return false;
		}
		o.show();
		if(o.hasClassName('minimized')){
			o.toggleClassName('minimized');
		}
		if(o.hasClassName('maximized')){
			o.toggleClassName('maximized');
		}
		if(this.myDim){
			o.morph(
				'left: '+ this.myDim.left +';top : '+ this.myDim.top +';'+
				'width: ' + this.myDim.width + '; height: ' + this.myDim.height + ';');
		}
	},
	myCenter : function(o){
		if(!o || !o.id){
			return false;
		}
		if(o.hasClassName('minimized')){
			o.toggleClassName('minimized');
			o.setStyle({
				width : this.myDim.width,
				minWidth : this.myDim.width,
				height : this.myDim.height,
				minHeight : this.myDim.height
			});
		}
		moveToCenter(o,25);
	}
};
Element.addMethods(myMethods);


function handleClick(evt){
	//IE fix
	//d('CLICK: ' +  Event.findElement(evt));
	if(Event.findElement(evt) && Event.findElement(evt).type){
		if(
			Event.findElement(evt).type.toLowerCase() == 'file' || 
			Event.findElement(evt).type.toLowerCase() == 'submit'
		){return true;}
	}
	//start 
	var o = Event.findElement(evt,'a.openAsWindow');
	//obsluga otwarc w nowym okienku.
	//@TODO sprawdzic dlaczego brakuje wsparcia
	if(o){
		Event.stop(evt);
		d('openAsWindow url: '+o.href);
		e.a(o.href);
		return false;
	}
	//obsluga warstw
	o = Event.findElement(evt,'div.layers');
	if(o && o.id && o.className.indexOf('layers')>-1){
		layers(o.id);
		d('Layers dla obiektu: '+o.id);
		return false;
	}
	//obsluga klikniecia zamknij 
	o = Event.findElement(evt,'div.closeMe');
	if(o && o.className.indexOf('closeMe')>-1){
		d('Zamykam rodzica dla obiektu ');
		o.parentNode.remove();
		return false;
	}
	//obsluga klikniecia updateParent
	o = Event.element(evt);
	if(o && o.className.indexOf('updateParent') > -1){
		d('Dynamiczna aktualizacja rodzica');
		parent = findParent(o,'table','dynamicTable');
		parent.myUpdate();
		return false;
	}
	return true;
}
if (window.addEventListener) {
	window.addEventListener("click",handleClick,false);
} else if (window.attachEvent) {
	document.attachEvent("onclick",handleClick);
} else {
	window.onclick = function() {handleClick();}
}

var Csidebar = Class.create({
	mclock : new Hash(),
	run : function(){
		new PeriodicalExecuter(Osidebar.deploy,1);
	},
	deploy : function(){
		if($('systray_clock')){
			Osidebar.updateClock();
		}
		if($('topNotify')){
			Osidebar.clearMsg();
		}
	},
	updateClock : function(){
		var ts = new Date();
		var min = ((ts.getMinutes() < 10) ? '0': '') + ts.getMinutes();
		var sec = (ts.getSeconds() < 10 ? '0' : '') + ts.getSeconds();
		var clock = $('systray_clock');
		if(clock){
			clock.innerHTML = ts.getHours() + ':' +  min + ':' + sec;
		}
	},
	notify : function(msg,ttl){
		if(!ttl){ttl = 5};
		var o = $('topNotify');
		if(!o){
			alert(msg);
		}else{
			var genid = 'n' + Math.floor(Math.random() * 1000);
			Osidebar.mclock.set(genid,{tcl : ttl,id : genid});
			var oe = new Element('div',{id : genid,className : 'note'});
			oe.innerHTML = '<div class="noteInside">' + msg + '</div>'; 
			o.appendChild(oe);
		}
	},
	clearMsg : function(){
		d('size ' +  Osidebar.mclock.size());
		Osidebar.mclock.each(function(p){
			var v = p.value;
			v.tcl -=1;
			d('clearing ? ' + v.tcl );
			if(v.tcl < 1){
				$(p.value.id).remove();
				Osidebar.mclock.unset(v.id);		
			}
		});
	}
});
var Osidebar = new Csidebar();
Osidebar.run();

function sTab_init(){
	$$('div.tabs_content').each(function(item){
		var m = 0;
		for(var i =0;i < item.childNodes.length;i++){
			var e = item.childNodes[i];
			if(e.className.indexOf('tabs')>-1){
				var t = e.getDimensions().height;
				if(t > m){
					m = t;
				}
			}
		}
		//uzupelnienie o margines roboczy.
		m+=20;
		for(var i =0;i < item.childNodes.length;i++){
			var e = item.childNodes[i];
			if(e.className.indexOf('tabs')>-1){
				e.style.height = m+'px';
			}
		}
		
	});
}
if (window.addEventListener) {
	window.addEventListener("load",sTab_init,false);
} else if (window.attachEvent) {
	document.attachEvent("onload",sTab_init);
} else {
	window.onload = function() {sTab_init();}
}
/**
 * Funkcja pomocniczna, zastepowanie fotki.
 * @param id
 * @param photo_url
 * @param alt_text
 * @return
 */
function replaceImage(id,photo_url, alt_text){
	//d('Wymiana fotki na obszarze ' + id + ' src: '+ photo_url);
	if(!$(id)){
		//alert('clientAPI:JS:Error - there is no object using this ID: ' + id);  
		return false;
	}
	$(id).src= photo_url;	
	if(alt_text){
		$(id).alt = alt_text;
	}
	return true;
}
/**
 * Funkcja pomocnicza zastepowanie tresci
 * @param id
 * @param content
 * @return
 */
function replaceContent(id,content){
	if(! $(id)) return false;
	$(id).innerHTML = content;
	return true;
}
var e = new eJson();
