//////////////////////////////////////////
// Array
//////////////////////////////////////////

Array.prototype.implode = function(delim){
  var tmp='';

  var d='';
  
  this.each(function(i){
    tmp+=d;
    tmp+=i;
    d=delim;
   });
  return tmp;
}

Array.prototype.insert = function(v){
	if( this.empty() )
	{
		this.push(v);
		return;
	}
	
	var tmp=this.clone();
	this.clear();
	this.push(v);
	for(var i=0;i<tmp.length;i++)
		this.push(tmp[i]);
	}


Array.prototype.getIndex = function(v){
  for(var i=0; i<this.length; i++){
    if(this[i] == v)
      return i;
    }
  return -1;
}


Array.prototype.insertAt = function(v,idx){
	var tmp=this.clone();
	this.clear();
	for(var i=0;i<tmp.length;i++) {
		if( idx==i )
			this.push(v);
		this.push(tmp[i]);
	}
	
	if( idx==tmp.length )
		this.push(v);
		
}



Array.prototype.inArray = function(v){
  for(var i in this){
    if(this[i] == v){
      return true;}
    }
  return false;
}

Array.prototype.remove = function(o) {
	var tmp=this.clone();
	this.clear();
	for(var i=0;i<tmp.length;i++)
		if( tmp[i]!=o )
			this.push(tmp[i]);
}

Array.prototype.empty = function(o) {
	return this.length<1;
}

Array.prototype.shift = function() {
	if( this.empty() )
		return null;
	var tmp=this.clone();
	this.clear();
	
	var el=null;
	for(var i=0;i<tmp.length;i++)
		if( i!=0 )
			this.push(tmp[i]);
		else
			el=tmp[i];
	return el;
}


//////////////////////////////////////////
// String
//////////////////////////////////////////

String.prototype.splitOrg=String.prototype.split;
String.prototype.split=function(delim,howMany)
{
	var str=this;
	if( howMany==0 )
	{
		var c=new Array();
		c[0]=str;
		return c;
	}


	var c=str.splitOrg(delim);

	if( howMany==null )
		return c;

	if( (c.length-1)<=howMany )
		return c;

	var rest="";
	for(var i=howMany;i<c.length;i++)
		rest=rest+c[i]+delim;

	if( rest.length>0 )
		rest=rest.substr(0,rest.length-1);

	while( c.length>howMany )
		c.pop();

	c.push(rest);
	return c;
}


String.prototype.pad=function(len, pad, dir) {

	if (typeof(len) == "undefined") { var len = 0; }
	if (typeof(pad) == "undefined") { var pad = ' '; }
	if (typeof(dir) == "undefined") { var dir = 'r'; }

	var str=this;

	if (len + 1 >= str.length) {

		switch (dir){

			case 'l':
				str = Array(len + 1 - str.length).join(pad) + str;
			break;

			case 'c':
				var right = Math.ceil((padlen = len - str.length) / 2);
				var left = padlen - right;
				str = Array(left+1).join(pad) + str + Array(right+1).join(pad);
			break;

			default:
				str = str + Array(len + 1 - str.length).join(pad);
			break;

		} // switch

	}

	return str;
};

String.prototype.trimNumber=function() {
	var s=this;
	while (s.substr(0,1) == '0' && s.length>1) { s = s.substr(1,9999); }
	return s;
}

String.prototype.ltrim=function(chars)
{
	if( chars==null ) chars="";
	chars = chars || "\\s";
	return this.replace(new RegExp("^[" + chars + "]+", "g"), "");
}

String.prototype.rtrim=function(chars)
{
	if( chars==null ) chars="";
	chars = chars || "\\s";
	return this.replace(new RegExp("[" + chars + "]+$", "g"), "");

}
String.prototype.trim=function(chars)
{
	var str;
	str=this.rtrim(chars);
	str=this.ltrim(chars);
	return str;
}
String.prototype.encodeUrl=function()
{
	var tmp=encodeURIComponent(this);
//	tmp=tmp.replace('#','%23');
//	tmp=tmp.replace('#','%23');
//	
//	var tmp=escape(this);
	return tmp;
}
String.prototype.escapeDoubleQuote=function()
{
	var tmp=this.replace('"','&quot;');
	return tmp;
}
//////////////////////////////////////////
// Element
//////////////////////////////////////////
Object.extend(Element.Methods, {
searchUp: function(el,selection)
{
	while(el!=null )
	{
		if( el.match )
		if( el.match(selection) ) return el;
		if( el.up )
			el=el.up();
		else
			return null;
	}
	return null;
},
searchUpAbsolute: function(el)
{
	while(el!=null )
	{
		if( el.getStyle )
			if( el.getStyle('position')=='absolute' ) return el;
		if( el.up )
			el=el.up();
		else
			return null;
	}
	return null;
},
moveTo: function(el, x,y)
{
	if( el==null )
		return;
	
	if( x!=null )
		el.setStyle({left:x+"px"});
	if( y!=null )
		el.setStyle({top:y+"px"});
},
moveBy: function(el, x,y)
{
	if( el==null )
		return;
	
	var pos=el.cumulativeOffset();
	if( x!=null )
		el.setStyle({left:(pos[0]+x)+"px"});
	if( y!=null )
		el.setStyle({top:(pos[1]+y)+"px"});
},
resizeTo: function(el, w,h)
{
	if( el==null )
		return;
	
	if( w!=null )
		el.setStyle({width:w+"px"});
	if( h!=null )
		el.setStyle({height:h+"px"});
}

}

);


// Akcje roznego typu
function Action(args)
{
	var nextAction=null;
	var interval=null;
	
	var thisObj=this;
	
	
	this.hideCover=function()
	{
		if( args.cover!=null )
			args.cover.destroy();
	}
	this.append=function(action)
	{
		if( nextAction!=null )
			nextAction.append(action);
		else
			nextAction=action;
	}
	
	this.performDelayed=function(delay)
	{
		this.interval=setInterval(this.perform,delay);
	}
	
	this.perform=function()
	{
		if( thisObj.interval!=null )
		{
			clearInterval(thisObj.interval);
			thisObj.interval=null;
		}		
		
		// Chowamy elementy
		if( args.hide!=null )
		{
			if( Object.isArray(args.hide) )
				args.hide.each(function(o){o.hide();});
			else
				args.hide.hide();
		}
		// Pokazujemy elmenety
		if( args.show!=null )
		{
			if( Object.isArray(args.show) )
				args.show.each(function(o){o.show();});
			else
				args.show.show();
		}
		
		// Wyswietlamy komunikat
		if( args.msg!=null && args.msgObject!=null )
		{
			if( args.msgObjectClassRemove!=null )
				args.msgObjectClassRemove.split(' ').each(function(c){args.msgObject.removeClassName(c);});
		
			if( args.msgObjectClassAdd!=null )
				args.msgObjectClassAdd.split(' ').each(function(c){args.msgObject.addClassName(c);});
				
			args.msgObject.update(args.msg);
			args.msgObject.show();
			
		}
		
		// Cover
		if( args.cover )
			args.cover.show();
			
		// Custom expression
		if( args.expression )
			setTimeout(args.expression,(args.expressionTimeout!=null?args.expressionTimeout:1));
		
		// Custom callback
		if( args.callback )
			args.callback(args.callbackArgs);
		
		if( args.url )
			window.location=args.url;
		
		
		if( nextAction!=null )
		{
			nextAction.perform();
		}
	}
}
Element.addMethods();

//////////////////////////////////////////
//Box
//////////////////////////////////////////

var Box=new Object();

Box.Show=function(container,url)
{
	if( container.select('[type=boxContent]')[0].innerHTML.trim().empty() )
	{
		container.show();
		Request.Request3({url:url,dest:container.select('[type=boxContent]')[0]});
	}
	else
		container.show();
		
}

///////////////////////////////////
//CAPTCHA
var Captcha=new Object();
Captcha.CaptchaBufImage=new Array();
Captcha.CaptchaNewKey=function(content,json,args)
{
	if( json==null )
		return;
	var key=json["key"];
	
	if( Captcha.CaptchaBufImage[key]==null )
		Captcha.CaptchaBufImage[key]=new Image();

	if( args.key!=null )
		args.key.value=key;

	Captcha.CaptchaBufImage[key].src=Root+'captcha/img,key,'+key;
	
	new Action({callback:Captcha.CaptchaNewImgLoaded,callbackArgs:{key:key,realImage:args.image}}).performDelayed(500);
}

Captcha.CaptchaNewImgLoaded=function(args)
{
	if( Captcha.CaptchaBufImage[args.key]==null )
		return;
	if( Captcha.CaptchaBufImage[args.key].complete )
	{
		args.realImage.src=Captcha.CaptchaBufImage[args.key].src;
	}
	else
	{
		new Action({callback:Captcha.CaptchaNewImgLoaded,callbackArgs:args}).performDelayed(500);
	}
}

Captcha.ReloadCaptcha=function(link)
{
	var el=Element.extend(link);
	var form=el.searchUp('form');
	if( form==null )
		return;
	
	form.select('[name=captchaCode]')[0].value='';
	form.select('[name=captchaCode]')[0].value='';
	
	var img=form.select('[type=captchaImage]')[0];
	img.src=RootImg+"workbench/spin1.gif";
	Request.Request({url:Root+'captcha/genkey',callback:Captcha.CaptchaNewKey,form:form,key:form.select('[name=captchaKey]')[0],image:img});
}

//CAPTCHA
//////////////////////////////////////////


//////////////////////////////////
// Tooltip
function Tooltip(args)
{
	var thisObj=this;
	if( args.width==null )
		args.width=200;
	if( args.height==null )
		args.height=200;
	
	var pos;

	var vps=Workbench.GetViewportSize();
	
	var loaded=false;
	
	var div=new Element('div');
	document.body.appendChild(div);
	div.hide();
	div.absolutize();
	div.setStyle({zIndex:9999});
	
	var lastPos=null;
	
	var prepare=function() 
	{
		pos=[args.where.cumulativeOffset()[0] + args.where.getWidth(), args.where.cumulativeOffset()[1] + args.where.getHeight() ];
		if( vps[0]>(pos[0]+args.width) && vps[1]>(pos[1]+args.height) )
		{
			// Right Down
			
			if( lastPos==null || lastPos!=1)
			{
				div.update(Tooltip.templates['rightDown']);
				loaded=false;
				lastPos=1;
			}
		}
		else if( 0<(pos[0]-args.width) && vps[1]>(pos[1]+args.height)  )
		{
			// Left Down
			pos[0]-=args.width;
			pos[0]-=args.where.getWidth();

		
			if( lastPos==null || lastPos!=2)
			{
				div.update(Tooltip.templates['leftDown']);
				loaded=false;
				lastPos=2;
			}

		}
		else if( 0<(pos[0]-args.width) && 0<(pos[1]-args.height) )
		{
			// Left Up
			pos[0]-=args.width;
			pos[1]-=args.height;
			pos[0]-=args.where.getWidth();
			pos[1]-=args.where.getHeight();

		
			if( lastPos==null || lastPos!=3)
			{
				div.update(Tooltip.templates['leftUp']);
				loaded=false;
				lastPos=3;
			}
		
		}
		else if( vps[0]>(pos[0]+args.width) && 0<(pos[1]-args.height) )
		{
			// Right Up
			pos[1]-=args.height;
			pos[1]-=args.where.getHeight();

			if( lastPos==null || lastPos!=4)
			{
				div.update(Tooltip.templates['rightUp']);
				loaded=false;
				lastPos=4;
			}
		
		}
		else
		{
			// Tooltip sie nie miesci
			return;
		}
		
		if( !loaded )
		{
			if( args.content ) {
				if( typeof(args.content)=='String' )
					div.select('[type=content]')[0].update(args.content);
				else
					div.select('[type=content]')[0].update(args.content.innerHTML);
				
				loaded=true;
			}
			else {
				if( args.where.next()!=null )
					if( args.where.next().readAttribute('type')!=null )
						if( args.where.next().readAttribute('type')=='tooltipContent' ) {
							div.select('[type=content]')[0].update(args.where.next().innerHTML);
							
							loaded=true;
						}
			}

			div.setStyle({width:args.width+"px",height:args.height+"px"});
			var w=args.width-Tooltip.Correction[0];
			var h=args.height-Tooltip.Correction[1];
			div.select('[type=content]')[0].setStyle({width:w+"px",height:h+"px"});
			
		
		}
		
		div.setStyle({left:pos[0]+'px',top:pos[1]+'px'});
		
	}
	
	var shown=false;
	this.show=function()
	{
		if( shown )
			return;
		
		prepare();
		
		if(Tooltip.Shown!=null)
		{
			Tooltip.Shown.hide();
			Tooltip.Shown=null;
		}
		
		Tooltip.Shown=thisObj;
		
		div.show();

		GMouseTrapEventManager.add({objects:[args.where,div],callbackOut:thisObj.hide,autoremove:true});
		
		if( !loaded )
		{
			Request.Request({url:args.url,callback:thisObj.afterLoaded});
		}
	}
	
	this.hide=function()
	{
		div.hide();
		shown=false;
		
		return true;
	}	
	
	this.afterLoaded=function(content)
	{
		div.select('[type=content]')[0].update(content);
		loaded=true;
	}
	
	args.where.observe('mouseover',this.show);
}
Tooltip.Scan=function(where)
{
	if( where==null )
		where=Element.extend(document.body);
	
	where.select('[type=tooltip]').each(function(o){
		var width=null;
		if( o.readAttribute('tooltipWidth')!=null ) width=parseInt(o.readAttribute('tooltipWidth'));
		var height=null;
		if( o.readAttribute('tooltipHeight')!=null ) height=parseInt(o.readAttribute('tooltipHeight'));
		new Tooltip({where:o,width:width,height:height,url:o.readAttribute('tooltipUrl')})});
}
Tooltip.templates={'rightDown':'<table>\
	<tr><td style="background-image: url(\''+RootImg+'workbench/tooltip/right-down/left-top.png\'); width: 13px; height: 14px;"></td>\
	<td style="background-image: url(\''+RootImg+'workbench/tooltip/right-down/top.png\'); height: 14px;"></td>\
	<td style="background-image: url(\''+RootImg+'workbench/tooltip/right-down/right-top.png\'); width: 7px; height: 14px;"></td></tr>\
	<tr><td style="background-image: url(\''+RootImg+'workbench/tooltip/right-down/left.png\'); width: 13px;"></td>\
	<td style="padding: 4px; background-color: #fafafa; "><div style="overflow: auto;" type="content"><img src="'+RootImg+'workbench/tooltip/wait.gif"/></div></td>\
	<td style="background-image: url(\''+RootImg+'workbench/tooltip/right-down/right.png\'); width: 7px;"></td></tr>\
	<tr><td style="background-image: url(\''+RootImg+'workbench/tooltip/right-down/left-bottom.png\'); width: 13px; height: 7px;"></td>\
	<td style="background-image: url(\''+RootImg+'workbench/tooltip/right-down/bottom.png\'); height: 7px;"></td>\
	<td style="background-image: url(\''+RootImg+'workbench/tooltip/right-down/right-bottom.png\'); width: 7px; height: 7px;"></td></tr></table>',
	
	'rightUp':'<table>\
		<tr><td style="background-image: url(\''+RootImg+'workbench/tooltip/right-up/left-top.png\'); width: 13px; height: 7px;"></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/right-up/top.png\'); height: 7px;"></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/right-up/right-top.png\'); width: 7px; height: 7px;"></td></tr>\
		<tr><td style="background-image: url(\''+RootImg+'workbench/tooltip/right-up/left.png\'); width: 13px;"></td>\
		<td style="padding: 4px; background-color: #e9e9e9; "><div style="overflow: auto;" type="content"><img src="'+RootImg+'workbench/tooltip/wait.gif"/></div></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/right-up/right.png\'); width: 7px;"></td></tr>\
		<tr><td style="background-image: url(\''+RootImg+'workbench/tooltip/right-up/left-bottom.png\'); width: 13px; height: 14px;"></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/right-up/bottom.png\'); height: 14px;"></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/right-up/right-bottom.png\'); width: 7px; height: 14px;"></td></tr></table>',
			
	'leftUp':'<table>\
		<tr><td style="background-image: url(\''+RootImg+'workbench/tooltip/left-up/left-top.png\'); width: 7px; height: 7px;"></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/left-up/top.png\'); height: 7px;"></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/left-up/right-top.png\'); width: 13px; height: 7px;"></td></tr>\
		<tr><td style="background-image: url(\''+RootImg+'workbench/tooltip/left-up/left.png\'); width: 7px;"></td>\
		<td style="padding: 4px; background-color: #e9e9e9; "><div style="overflow: auto;" type="content"><img src="'+RootImg+'workbench/tooltip/wait.gif"/></div></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/left-up/right.png\'); width: 13px;"></td></tr>\
		<tr><td style="background-image: url(\''+RootImg+'workbench/tooltip/left-up/left-bottom.png\'); width: 7px; height: 14px;"></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/left-up/bottom.png\'); height: 14px;"></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/left-up/right-bottom.png\'); width: 13px; height: 14px;"></td></tr></table>',
		
	'leftDown':'<table>\
		<tr><td style="background-image: url(\''+RootImg+'workbench/tooltip/left-down/left-top.png\'); width: 7px; height: 14px;"></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/left-down/top.png\'); height: 14px;"></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/left-down/right-top.png\'); width: 13px; height: 14px;"></td></tr>\
		<tr><td style="background-image: url(\''+RootImg+'workbench/tooltip/left-down/left.png\'); width: 7px;"></td>\
		<td style="padding: 4px; background-color: #e9e9e9; "><div style="overflow: auto;" type="content"><img src="'+RootImg+'workbench/tooltip/wait.gif"/></div></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/left-down/right.png\'); width: 13px;"></td></tr>\
		<tr><td style="background-image: url(\''+RootImg+'workbench/tooltip/left-down/left-bottom.png\'); width: 7px; height: 7px;"></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/left-down/bottom.png\'); height: 7px;"></td>\
		<td style="background-image: url(\''+RootImg+'workbench/tooltip/left-down/right-bottom.png\'); width: 13px; height: 7px;"></td></tr></table>'
		
		
};
Tooltip.Correction=[28,29];

//////////////////////////////////


//////////////////////////////////
//MouseTrapEventManager - to trigger action  when mouse pointer goes out of box
function MouseTrapEventManager() {
	var thisObj=this;
	
	var interval=false;
	
	function Action(args) {
		this.args=args;
	}
	
	this.remove=function(action)
	{
		events.remove(action);
		
		if( events.empty() ) {
			interval=false;
			Event.stopObserving(document.body,"mousemove",this.handler);
		}

	}
	
	this.add=function(args) {
		if( args==null )
			return;
		if( args.objects==null )
			return;
		if( args.objects.empty() )
			return;
		
		var loc={x1:-1,x2:-1,y1:-1,y2:-1};
		
		args.objects.each(function(o){
			var offset=o.cumulativeOffset();
			
			if( loc.x1<0 || loc.x1>offset[0] )
				loc.x1=offset[0];
			if( loc.y1<0 || loc.y1>offset[1] )
				loc.y1=offset[1];
			
			if( loc.x2<0 || loc.x2<(offset[0]+o.getWidth()) )
				loc.x2=offset[0]+o.getWidth();
			if( loc.y2<0 || loc.y2<(offset[1]+o.getHeight()) )
				loc.y2=offset[1]+o.getHeight();
		}  );
		
		if( args.pad!=null ) {
			loc.x1-=args.pad;
			loc.y1-=args.pad;
			loc.x2+=args.pad;
			loc.y2+=args.pad;
		}

		args.loc=loc;
		
		var act=new Action(args);
		
		// Poczatkowa wartosc
		act.mouseIn=args.mouseIn;
		
		events.push(act);
		
		if( interval==false )
		{
			interval=true;
			Event.observe(document.body,"mousemove",thisObj.handler);
		}
		
		return act;
		
	}
	
	this.handler=function(e) {
		
		var loc=[Event.pointerX(e),Event.pointerY(e)];

		events.each(function(a) {
			if( a==null )
				return;
			
			if( a.args==null ) 
				return;
			
			var mouseIn=false;
			if( loc[0]>=a.args.loc.x1 && loc[0]<=a.args.loc.x2 && loc[1]>=a.args.loc.y1 && loc[1]<=a.args.loc.y2 )
				mouseIn=true;

			if( a.mouseIn==null )
				a.mouseIn=mouseIn;
			else {
				if( a.mouseIn!=mouseIn )
					event(a,mouseIn,loc);
					
			}
			a.mouseIn=mouseIn;
		});
	}

	var events=new Array();
	
	
	var event=function(action,mouseIn,loc) {
		
		var r=false;
		if( mouseIn )
		{
			if( action.args.callbackIn!=null  )
				r=action.args.callbackIn(loc,action);
			if( action.args.actionIn!=null  )
			{
				action.args.actionIn.perform();
				r=true;
			}
		}
		else if( !mouseIn )
		{
			if( action.args.callbackOut!=null )
				r=action.args.callbackOut(loc,action);
			if( action.args.actionOut!=null  )
			{
				action.args.actionOut.perform();
				r=true;
			}
		}
		
		if( action.args.autoremove && r==true) {
			events.remove(action);
			
			if( events.empty() ) {
				interval=false;
				Event.stopObserving(document.body,"mousemove",thisObj.handler);
			}
		}
	}
}
GMouseTrapEventManager=new MouseTrapEventManager();

//MouseTrapEventManager
////////////////////////

function getScrollerWidth() {
    var scr = null;
    var inn = null;
    var wNoScroll = 0;
    var wScroll = 0;

    // Outer scrolling div
    scr = document.createElement('div');
    scr.style.position = 'absolute';
    scr.style.top = '-1000px';
    scr.style.left = '-1000px';
    scr.style.width = '100px';
    scr.style.height = '50px';
    // Start with no scrollbar
    scr.style.overflow = 'hidden';

    // Inner content div
    inn = document.createElement('div');
    inn.style.width = '100%';
    inn.style.height = '200px';

    // Put the inner div in the scrolling div
    scr.appendChild(inn);
    // Append the scrolling div to the doc
    document.body.appendChild(scr);

    // Width of the inner div sans scrollbar
    wNoScroll = inn.offsetWidth;
    // Add the scrollbar
    scr.style.overflow = 'auto';
    // Width of the inner div width scrollbar
    wScroll = inn.offsetWidth;

    // Remove the scrolling div from the doc
    document.body.removeChild(
        document.body.lastChild);

    // Pixel width of the scroller
    return (wNoScroll - wScroll);
}


////////////////////////////////////////
var QuickTooltip=function(element)
{
	var thisObj=this;
	var div=new Element('div');
	document.body.appendChild(div);
	div.absolutize();

	div.hide();

	div.addClassName('quickTooltip');
	
	div.update(QuickTooltip.Template);
	
	div.select('[wbType=content]')[0].update(element.readAttribute('quickTooltip'));

	
	var interval=null;
	this.mouseOut=function(e) {
		if( interval!=null ) {
			clearInterval(interval);
			interval=null;
		}
	}

	this.mouseOver=function(e) {
		if( interval!=null )
			return;
		
		interval=setInterval(thisObj.show,600);
	}
	
	this.hide=function()
	{
		if( interval!=null ) {
			clearInterval(interval);
			interval=null;
		}
		div.hide();
	}
	
	this.show=function() {
		if( interval==null )
			return;
		clearInterval(interval);
		interval=null;
		div.show();
		
		div.moveTo(element.cumulativeOffset()[0]+element.getWidth(), element.cumulativeOffset()[1]);
		
		QuickTooltip.ToHide.push(thisObj);		
	}

	element.observe('mouseover',this.mouseOver);
	element.observe('mouseout',this.mouseOut);

}
QuickTooltip.Template='<table class="nowrap"><tr><td wbType="content"></td></tr></table>';
QuickTooltip.ToHide=new Array();
QuickTooltip.HideAll=function()
{
	if( QuickTooltip.ToHide.empty() )
		return;
	
	QuickTooltip.ToHide.each(function(o){o.hide();});
	QuickTooltip.ToHide.clear();
}

QuickTooltip.Scan=function(where) {
	if( where==null )
		where=Element.extend(document.body);
	
	where.select('[quickTooltip]').each(function(o){
		if( o.quickTooltipObj==null )
			o.quickTooltipObj=new QuickTooltip(o);
	});
}



//////////////////////////////////////////
// Request
//////////////////////////////////////////

var Request=new Object();

// Params:
// url
// formName
// form - form object to submit
// iframe - (bool) either to use iframe
// preaction - 
// postaction -
// callback - call after
//  dest - fill dest after finish
// callbackRedirect - called if there is redirect
// callbackException
// callbackNoAccess
Request.Request=function(args)
{
	// Pobieramy url
	// Wyszukujemy formularza
	var url=args.url;
	var form=null;
	if( args.formName!=null )
		form=document.forms[args.formName];
	if( args.form!=null )
		form=args.form;
		
	// Jesli sa preakcje to wykonujmey
	if( args.preAction!=null )
		args.preAction.perform();
		
	// Jezeli jest cover
	if( args.cover!=null )
		args.cover.show();
		


	if( args.iframe && form!=null )
	{
		// Request typu iframe
		var iframeName="ajaxiframe";

		// Podano wlasna nazwe iframe
		if( args!=null )
			if( args.iframe!=null )
				iframeName=args.iframe;

		// Szukanie wolneg iframe
		// Jesli nie znajdziemy to tworzymy kolejny z danyn prefixem
		var prefix=iframeName;
		var suffix='';
		
		iframeName=prefix+suffix;
		while( Request.IFrameBusy[iframeName] )
		{
			if( suffix=='' )
				suffix=0;
			else
				suffix++;
			
			iframeName=prefix+suffix;
			
			// Jezeli nie ma takiego iframe to go tworzymy
			if( $(iframeName)==null )
			{
				var newFrame=new Element('iframe');
				var newFrameDiv=new Element('div');
				document.body.appendChild(newFrameDiv);
				newFrameDiv.hide();
				newFrameDiv.appendChild(newFrame);
				
				newFrame.writeAttribute('id',iframeName);
				newFrame.writeAttribute('name',iframeName);
				newFrame.observe('load',Request.OnFinishIFrame);
			}
		}
		Request.IFrameBusy[iframeName]=true;
		Request.IFrameArgs[iframeName]=args;

		if( url!=null )
			$(iframeName).src=url;
		else
		{
			var target=form.target;
			form.target=iframeName;
			form.submit();
			form.target=target;		
		}
		return true;
	}
	else
	{
		if( url!=null )
		{
			// Dopisujemy do url ?ajax - potrzebne dla redirect
			if( url.indexOf('?ajax')<0 && url.indexOf('&ajax')<0 )
			{
				if( url.indexOf('?')<0 )
					url=url+'?ajax';
				else
					url=url+'&ajax';
			}
				
			var ajax=new Ajax.Request(url,{method:'get',onSuccess:Request.OnFinishAjax});
			ajax.args=args;
			
			
			return true;
		}
		else if( form!=null )
		{
			var url=form.action;
			// Dopisujemy do url ?ajax - potrzebne dla redirect
			if( url.indexOf('?ajax')<0 && url.indexOf('&ajax')<0 )
			{
				if( url.indexOf('?')<0 )
					url=url+'?ajax';
				else
					url=url+'&ajax';
			}

			var postValues=Request.FormVarsToString(form);
			
			var ajax=new Ajax.Request(url,{method:'post',onSuccess:Request.OnFinishAjax,parameters:postValues});
			ajax.args=args;
			
			
			return true;
		}
	}
	
	return false;
}

Request.IFrameArgs=new Array();
Request.IFrameBusy=new Array();
Request.OnFinishIFrame=function(iframeName) {
	if( $(iframeName)==null )
		return;

	var args=Request.IFrameArgs[iframeName];

	var content=$(iframeName).contentWindow.document.body.innerHTML;

	Request.IFrameBusy[iframeName]=false;

	if( !Prototype.Browser.IE && content.trim().startsWith('<pre>') ) {
		content=content.trim();
		content=content.substring(5,content.length-6);
	}
	
	

	Request.OnFinishCommon(content,content.toJSON(),args);
}



Request.OnFinishAjax=function(response) 
{
	// Argumenty klienta
	var args=response.request.args;
	var content=response.responseText;
	
	Request.OnFinishCommon(content,response.responseJSON,args);
}

Request.OnFinishCommon=function(content,json,args) {

	if( args!=null )
	{
		if( args.cover!=null )
			args.cover.destroy();
		
		if( args.toRemove )
			args.toRemove.remove();
	}
	if( json!=null )
	{
		if( json["_redirect"]!=null )
			if( !json["_redirect"].empty() )
			{
				if( args.callbackRedirect!=null )
					args.callbackRedirect=json["_redirect"];
				else
					window.location=json["_redirect"];
				return;
			}

		if( json["_exception"]!=null )
			if( !json["_exception"].empty() )
			{
				// TODO
				return;
			}

		if( json["_noaccess"]!=null )
		{
			if( args.callbackNoAccess!=null )
				args.callbackNoAccess();
			else
				alert('Brak dostepu');
			return;
		}
		
		if( json["_msg"]!=null && args.msgObj!=null )
			Workbench.Message(args.msgObj,json["_msg"],json["_msgType"]);
	}

	if( args!=null ) 
	{
		if( args.dest )
			if( typeof(args.dest.update)=='function' )
				args.dest.update(content);
		if( typeof(args.callback)=='function' )
			args.callback(content,json,args);


		if( args.postAction!=null )
			args.postAction.perform();
			
	}
}

Request.FormVarsToString=function(form)
{
	var i;
	var m=new Hash();
	
	for(i=0;i<form.elements.length;i++)
	{
		var codedValue=null;
		if( form.elements[i].type=='checkbox' )
			codedValue=form.elements[i].checked?'true':'false';
		else if( form.elements[i].type=='radio' ) {
			if( !form.elements[i].checked )
				continue;
			if( codedValue=form.elements[i].value )
				codedValue=form.elements[i].value.encodeUrl();
			else
				codedValue='';
		}
		else 
		{
			if( codedValue=form.elements[i].value )
				codedValue=form.elements[i].value.encodeUrl();
			else
				codedValue='';
		}
	
		if( codedValue!=null )
			m.set(form.elements[i].name,codedValue);
	}

	var url="";

	var keys=m.keys();

	for(var i=0;i<keys.length;i++) {
		if( i>0 )
			url+='&';
		url+=keys[i]+"="+m.get(keys[i]);
	}
	
	return url;
}

Request.AppendPostAction=function(args,action)
{
	if( args.postAction!=null )
		 args.postAction.append(action);
	else
		args.postAction=action;
}

// Przy requescie wyswietla div1 a pozniej wyswietla div2
Request.Request1=function(args,confirmResult)
{
	if( args==null )
		return false;

	if( confirmResult==null && args.confirm!=null)
	{
		Workbench.Question({yesno:true,question:args.confirm,callback:Request.Request1,callbackArgs:args});
		return;
	}
		
	if( confirmResult!=null )
		if( !confirmResult )
			return false;		
		
	if( args.preAction )
		args.preAction.append(new Action({hide:args.div1,show:args.div2}));
	else
		args.preAction=new Action({hide:args.div1,show:args.div2});
	
	if( args.postAction!=null )
		args.postAction.append(new Action({hide:args.div2,show:args.div1}));
	else
		args.postAction=new Action({hide:args.div2,show:args.div1});
	
	if( args.msg!=null && args.divMsg!=null )
		args.postAction.append(new Action({msgObject:args.divMsg,msg:args.msg}));
	
	return Request.Request(args);
}

// Cover na caly ekran tekstem Loading.... lub swoim
Request.Request2=function(args,confirmResult)
{
	if( args==null )
		return false;
		
	if( confirmResult==null && args.confirm!=null)
	{
		Workbench.Question({yesno:true,question:args.confirm,callback:Request.Request2,callbackArgs:args});
		return;
	}
	
	if( confirmResult!=null )
		if( !confirmResult )
			return false;

	if( args.customCoverMessage )
		args.cover=new Cover({template:'bigspin',bg:true,msg:args.customCoverMessage,link:args.link});
	else
		args.cover=new Cover({template:'bigspin',bg:true,msg:'Loading.......',link:args.link});

	if( args.msg!=null )
		Request.AppendPostAction(args,new Action({cover: new Cover({template:'big',bg:true,msg:args.msg,timeout:5000,link:args.link,afterHideUrl:args.afterUrl})}));	
	else if( args.afterUrl!=null )
		Request.AppendPostAction(args,new Action({url:args.afterUrl}));
	
	return Request.Request(args);
}
Request.Request3=function(args,confirmResult)
{
	if( args==null )
		return false;

	if( confirmResult==null && args.confirm!=null)
	{
		Workbench.Question({yesno:true,question:args.confirm,callback:Request.Request3,callbackArgs:args});
		return;
	}
		
	if( confirmResult!=null )
		if( !confirmResult )
			return false;		
		
	if( args.dest!=null ) 
		args.dest.update('<img src="'+RootImg+'wait-2.gif"/>');
	
	return Request.Request(args);
}


Request.RequestWindow=function(args,confirmResult)
{
	if( args==null )
		return false;

	if( confirmResult==null && args.confirm!=null)
	{
		Workbench.Question({yesno:true,question:args.confirm,callback:Request.RequestWindow,callbackArgs:args});
		return;
	}
		
	if( confirmResult!=null )
		if( !confirmResult )
			return false;			

	var win=args.win;
	var winContent=win.select('[wbType=windowContent]')[0];
	
	args.cover=new Cover({template:'winspin',bg:true,dest:winContent,halign:-1,valign:-1});

	args.dest=winContent;

	args.callback=Workbench.PostRequestScanContent;
	
	return Request.Request(args);
}


Request.RequestBg=function(args,confirmResult)
{
	if( args==null )
		return false;

	if( confirmResult==null && args.confirm!=null)
	{
		Workbench.Question({yesno:true,question:args.confirm,callback:Request.RequestBg,callbackArgs:args});
		return;
	}
		
	if( confirmResult!=null )
		if( !confirmResult )
			return false;			

	Workbench.BgSpinStart();
	
	args.callback=Request.RequestBgCallback;
	
	return Request.Request(args);
}
Request.RequestBgCallback=function(content,json,args)
{
	if( json!=null )
	{
		if( json.msg!=null )
		{
			if( json.error )
				Workbench.MessageCorner({msg:json.msg,closeButton:true,className:'red',timeout:0});
			else
				Workbench.MessageCorner({msg:json.msg,closeButton:true});
		}
	}
	
	if( args.customCallback )
		args.customCallback(content,json,args);
	Workbench.BgSpinStop();
}

// W dest wyswietla spin i robi request
Request.RequestSpin=function(args)
{
	if( args==null )
		return false;

	args.dest.update('<img src="'+RootImg+'wait-2.gif"/>');
	
	return Request.Request(args);
}

CountryCitySelector=function(container)
{
	var thisObj=this;
	
	var countryHidden=container.select('[inputType=countries]')[0].select('input')[0];
	var cityHiddenName=container.select('[inputType=cities]')[0].select('input')[0].name;
	var divCities=container.select('[inputType=cities]')[0];
	var anyCity=container.readAttribute('anyCity')=='1';
	
	
	this.citiesLoaded=function()
	{
		Select.Scan(divCities);
	}
	
	this.countryChanged=function(c)
	{
		divCities.update(App.IconWait);
		
		var portal=0;
		if( container.readAttribute('portal')!=null )
			portal=container.readAttribute('portal');
		
		var form=container.searchUp('form');
		if( c==1 )
		{
			form.down().select('[feature=154]').each(function(o){HideWithStack(o);});
			form.down().select('[feature=168]').each(function(o){HideWithStack(o);});
		}
		else
		{
			form.down().select('[feature=168]').each(function(o){ShowWithStack(o);});
			form.down().select('[feature=154]').each(function(o){ShowWithStack(o);});
		}
		
		var url=Root+'city/select/'+portal+'/'+c+'/'+cityHiddenName+'/'+anyCity;
		Request.Request({dest:divCities,callback:thisObj.citiesLoaded,url:url});
	}
	
	countryHidden.changeCallback=this.countryChanged;
}
CountryCitySelector.Scan=function(container)
{
	if( container!=null )
		container.select('[inputType=countryCity]').each(function(o){new CountryCitySelector(o);});
	else
		$$('[inputType=countryCity]').each(function(o){new CountryCitySelector(o);});
}


CitySelector=function(input)
{
	
	var thisObj=this;
	var ESC=Event.KEY_ESC; //27;
	var TAB=Event.KEY_TAB; //9;
	var ENTER=Event.KEY_RETURN; //13;
	var DOWN=Event.KEY_DOWN; //40;
	var UP=Event.KEY_UP; //38;

	// czy wczytane juz miasta
	var loaded=false;

	var values=new Array();
	var selectedPos=null;
	
	var sensitive=true;
	var hide=function()
	{
		cancelSearchQueue=true;
		div.hide();
	}
	var show=function()
	{
		if( values.empty() )
		{
			div.hide();
			return;
		}
		var pos=input.cumulativeOffset();
		div.moveTo(pos[0],pos[1]+input.getHeight()+1);
		div.show();

		var w=div.down().getWidth();
		if( w<100 ) w=100;
		
		div.down().resizeTo(w,null);

		var h=div.down().getHeight();
		if( h>100 ) h=100;
		div.resizeTo(w,h);
		
	}

	
	this.keyPress=function(e)
	{
		// Jezeli ESC to chowamy i juz nie pokazyujemy chyba ze DOWN
		if( e.keyCode==ESC ) {
			sensitive=false;
			hide();
			return;
		}
		if( e.keyCode==DOWN ) {
			sensitive=true;

			if( !loaded )
				search();
			else if( selectedPos==(values.length-1) ) {
				show();
				return;
			}
			else {
				if( div.visible() ) {
					selectedPos++;
					drawCursor();
				}
				show();
			}

			return;
		}
		if( e.keyCode==UP ) {

			if( !loaded )
				search();
			else if( selectedPos==0 ) {
				show();
				return;
			}
			else {
				if( div.visible() ) {
					selectedPos--;
					drawCursor();
				}
				show();
			}
			
			return;
		}
		if( e.keyCode==ENTER ) {
			if( div.visible() && selectedPos!=null ) {
				input.value=values[selectedPos];
			}

			hide();
			
			if( input.readAttribute("search")==null )
				Event.stop(e);
			
			
			return;
		}

		if( e.keyCode==TAB ) 
		{
			sensitive=true;
			hide();
			return;
		}

		queueSearch();
		
	}

	//  Jezeli input stracil focus to chowamy diva i jestesmy juz wrazliwi na klawisze
	this.lostFocus=function(e)
	{
		
		var target = e.explicitOriginalTarget||document.activeElement;
		var el=Element.extend(target);
		
		if( el==div || el.descendantOf(div) || el==input)
			return;
		
		sensitive=true;
		hide.delay(0.2);
	}

	var searchQueued=false;
	var queueSearch=function()
	{
		if( searchQueued )
			return;

		searchQueued=true; 
		search.delay(0.3);
	}

	var cancelSearchQueue=false;
	var search=function() {

		loaded=true;
		searchQueued=false;
		
		
		if( cancelSearchQueue )
		{
			cancelSearchQueue=false;
			return;
		}
		
		var country=0;
		if( input.readAttribute('country')!=null )
			country=input.readAttribute('country');
		var portal=0;
		if( input.readAttribute('portal')!=null )
			portal=input.readAttribute('portal');
		
		Request.Request({url:RootNL+'city/json/'+portal+'/'+country+'/'+input.value.encodeUrl(),callback:thisObj.setValues});
		
	}

	this.setValues=function(html,json,args)
	{
		values.clear();
		selectedPos=null;

		div.down().down().update('');

		if( json!=null )
			if( !json.empty() ) {
				for(var i=0;i<json.length;i++) {
					
					values.push(json[i].name);

					var tr=new Element('tr');
					div.down().down().appendChild(tr);

					var td=new Element('td');
					tr.appendChild(td);
					
					td.addClassName('nowrap');
					td.update(json[i].name);
					
					td.observe('click',thisObj.childClicked);
					
					if( selectedPos==null ) {
						selectedPos=0;
					}

				}				
			} 	

		drawCursor();

		if( sensitive )
			show();
	}

	this.childClicked=function(e) {
		var el=Event.element(e).up();
		var n=0;

		var tmp=el;
		while(tmp.previous()!=null ) {
			n++;
			tmp=tmp.previous();
		}

		selectedPos=n;
		drawCursor();
		hide();
		input.value=values[selectedPos];
		input.focus();
	}

	var drawCursor=function() {
		var children=div.down().down().childElements();
		for(var i=0;i<children.length;i++)
			if( i==selectedPos ) {
				children[i].down().setStyle({backgroundColor:'#e0e0e0'});

				var y=children[i].down().cumulativeOffset()[1]-div.cumulativeOffset()[1];

				if( y<div.scrollTop )
					div.scrollTop=y;
				else if( (y+children[i].down().getHeight()) >(div.scrollTop+div.getHeight()) ) 
					div.scrollTop=y  -div.getHeight()   +children[i].down().getHeight();
				
			}
			else
				children[i].down().setStyle({backgroundColor:'white'});
	}	

	
	input.observe('keydown',this.keyPress);	
	input.observe('blur',this.lostFocus);
	var div=new Element('div');
	document.body.appendChild(div);
	div.addClassName('citySelector');
	div.absolutize();
	div.hide();

	div.appendChild(new Element('table'));
	div.down().appendChild(new Element('tbody'));
	div.observe('blur',this.lostFocus);
	
	
	
	input.handler=this;
	
	this.submit=function()
	{
		var e=input.next();
		
		if( e==null )
			return;
		
		if( e.readAttribute('type')!='hidden' )
			return;
		
		e.value=input.value;
	}
	
	
	
	
}

CitySelector.Submit=function(container)
{
	if( container!=null )
		container.select('[inputType=city]').each(function(o){o.handler.submit();});
	else
		$$('[inputType=city]').each(function(o){o.handler.submit();});
	
}



CitySelector.Scan=function(container)
{

	if( container!=null )
		container.select('[inputType=city]').each(function(o){new CitySelector(o);});
	else
		$$('[inputType=city]').each(function(o){new CitySelector(o);});
}






Textarea=function(textarea)
{
	var thisObj=this;
	if( textarea.readAttribute('maxLength')==null )
		return;
	
	
	var max=parseInt(textarea.readAttribute('maxLength'));
	
	if( max=="NaN" )
		return;


	
	var span1=textarea.next().down();
	var span2=textarea.next().down().next();
	
	if( span2==null )
		return;
	
	span2.update(max);
	
	this.updateQ=function()
	{
		thisObj.update.defer();
	}
	this.update=function()
	{
		var n=textarea.value.length;
		span1.update(n);
		
		if( n>max )
			span1.addClassName('textareaOverTheLimit');
		else
			span1.removeClassName('textareaOverTheLimit');
	}
	
	this.update();

	textarea.observe('keypress',this.updateQ);
}
Textarea.Scan=function(container)
{
	if( container!=null )
		container.select('textarea').each(function(o){new Textarea(o);});
	else
		$$('textarea').each(function(o){new Textarea(o);});
}



CheckboxSwitch=function(e,forceValue)
{
	var el=Element.extend(e);
	
	var container;
	
	if( el.readAttribute('type')=='checkbox')
		container=el;
	else
		container=el.searchUp('[type=checkbox]');
	
	if( container.readAttribute('disabled') )
	{
		if( container.readAttribute('disabled')=='true' )
			return;
	}
	
	// Parent
	var canSelect=true;
	var parent=container.searchUp('[type=enums]');
	if( parent )
	{
		if( parent.readAttribute('max') )
		{
			var selectedAlready=0;
			parent.select('input').each(function(o) { if(o.value==1) selectedAlready++; });
			
			if( parseInt(parent.readAttribute('max')) <= selectedAlready )
				canSelect=false;
		}
	}
	
	
	var hidden=container.select('[type=hidden]')[0];
	
	var newVal=0;
	
	if( hidden.value==0 )
		newVal=1;
	else if( hidden.value==-1 ) {
		if( container.readAttribute('variant')=='2' )
			newVal=1;
		else
			newVal=0;
	}
	else {
		if( container.readAttribute('variant')=='2' )
			newVal=-1;
		else if( container.readAttribute('variant')=='1' )
			newVal=-1;
		else
			newVal=0;
	}
	
	if( forceValue!=null )
		newVal=forceValue;
	
	
	if( newVal==1 && !canSelect )
		return;
	
	hidden.value=newVal;
	
	
	container.select('img')[0].src=RootImg+'cb_'+newVal+'.png';

	
	if( container.callback )
		container.callback(newVal);
	if( container.readAttribute("onchange") )
		setTimeout(container.readAttribute("onchange"),1);
		
	
	
}

CheckboxSwitchList=function(e,containerType,cbType)
{
	var el=Element.extend(e);
	
	var container=el.searchUp('[type=checkbox]');
	var hidden=container.select('[type=hidden]')[0];
	
	var value=hidden.value;
	
	
	var c=el.searchUp('[type='+containerType+']');
	
	if( c==null )
		return;

	

	c.select('[checkboxType='+cbType+']').each(function(o){CheckboxSwitch(o,value);});
		
}



//////////////////////////////////
//Calendar
function Calendar(args)
{
	var thisObj=this;
	var year=null;
	var month=null;
	var selectedDate=null;
	var rows=null;
	var inputElement=null;
	
	

	if( args.link!=null )
		if( args.link.calendar!=null )
		{
			args.link.calendar.show();
			return;
		}
	
	
	
	if( args.link )
	{
		args.link=Element.extend(args.link);
		args.link.calendar=this;
	}
	var div=args.div;
	
	if( div==null )
	{
		div=new Element('div');
		
		document.body.appendChild(div);
		
		div.writeAttribute('id','calendar');
		div.addClassName('calendar');
		
		div.setStyle({width:"180px"});
		
		div.absolutize();
		div.update(Calendar.Template);
	}
	else
		div.update(Calendar.TemplateEmbedded);
	
	
	var startDate=div.readAttribute('date');
	
		
	var mode=div.readAttribute('mode');

	var setCalendarSelectDate=function(currentDate)
	{
		var year=currentDate.getFullYear();
		var month=currentDate.getMonth();
		var dayOfMonth=currentDate.getDate();
	}

	if( args.input!=null )
		inputElement=Element.extend(args.input);

	var setupCalendar=function() {
		if( inputElement!=null ) {
			var sd=Conversion.stringToDate(inputElement.value);

			if( sd!=null )
				selectedDate=sd;
			else
				sd=new Date();

			year=sd.getFullYear();
			month=sd.getMonth();
		}
		else if( startDate ) {
			var sd=Conversion.stringToDate(startDate);

			if( sd!=null )
				selectedDate=sd;
			else
				sd=new Date();

			year=sd.getFullYear();
			month=sd.getMonth();
		}
		else {
			var d=new Date();
			year=d.getFullYear();
			month=d.getMonth();
			selectedDate=null;
		}
	}

	setupCalendar();

	this.selectDate=function(e)
	{
		var el=Event.element(e);
		if( inputElement!=null )
			inputElement.value=year+"-"+((month+1)+"").pad(2,'0','l')+ "-"+el.innerHTML.pad(2,'0','l');

		
		if( args.onSelecting )
			args.onSelecting(parseInt(year),parseInt(month),parseInt(el.innerHTML));
		
		if( args.div==null )
		div.hide();
		
		if( args.onSelect )
			args.onSelect(parseInt(year),parseInt(month),parseInt(el.innerHTML));
		
	}


	this.reset=function()
	{
		if( inputElement!=null )
			inputElement.value='';
		div.hide();
	}

	this.close=function()
	{
		div.hide();
	}


	this.monthNext=function()
	{
		if( month<11 )
			month++;
		else {
			year++;
			month=0;
		}

		generateRows();
		draw();
	}
	this.monthPrev=function()
	{
		if( month>0 )
			month--;
		else {
			year--;
			month=11;
		}

		generateRows();
		draw();
	}
	this.yearNext=function()
	{
		year++;
		generateRows();
		draw();
	}
	this.yearPrev=function()
	{
		year--;
		generateRows();
		draw();
	}

	div.select('[monthNext]')[0].observe('click',thisObj.monthNext);
	div.select('[monthPrev]')[0].observe('click',thisObj.monthPrev);
	div.select('[yearPrev]')[0].observe('click',thisObj.yearPrev);
	div.select('[yearNext]')[0].observe('click',thisObj.yearNext);

	div.select('[close]')[0].observe('click',thisObj.close);
	div.select('[reset]')[0].observe('click',thisObj.reset);


	var generateRows=function()
	{
		var days=findNumDaysInMonth(year,month);

		var d=new Date();
		d.setMinutes(0);
		d.setSeconds(0);
		d.setHours(0);
		d.setMonth(month);
		d.setYear(year);
		d.setDate(1);

		var n=1;
		var shift=d.getDay();
		shift=shift-1;
		if( shift==-1 ) shift=6;
		n=n-shift;

		rows=new Array();
		for(var i=0;n<=days;i++)
		{
			if( rows.length==0 )
				rows.push(new Array());
			else if( rows.last().length==7 )
				rows.push(new Array());

			if( n>0 )
				rows.last().push(n);
			else
				rows.last().push(0);
			n++;
		}


	}

	var IsLeapYear=function(year)
	{
	   if (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0))
	      return (true);
	   else
	      return (false);
	}
	var findNumDaysInMonth=function(Year, Month)
	{
		if(Month == 1){
		if(IsLeapYear(Year)) return 29;
		else return 28;
		}else{
		if(Month >6) Month++;
		if(Month/2 == Math.round(Month/2)) return 31;
		}
		return 30;
	}

	var isSameDay=function(d1,d2)
	{
		if( d1==null || d2==null )
			return false;
		if( d1.getFullYear()==d2.getFullYear() && d1.getMonth()==d2.getMonth() && d1.getDate()==d2.getDate() )
			return true;
		return false;
	}
	
	this.yearChange=function() {
		year=parseInt(div.select('[year]')[0].down().value);
		generateRows();
		draw();
	}
	this.monthChange=function() {
		month=parseInt(div.select('[month]')[0].down().value);
		generateRows();
		draw();
	}
	
	
	var handleSelect=function(parent, from, to, value, callback, captions, asc) {
		if( Prototype.Browser.IE )
		{
			if( parent.down()!=null && parent.select('[value='+value+']').length==0 ) {
				parent.update('');
				if( from>value )
					from=value;
				if( to<value )
					to=value;

			}
		}

		
		if( parent.down()==null ) {
			parent.appendChild(new Element('select'));
			parent.down().observe('change',callback);
			
			
			var i=to;
			if( asc )
				i=from;
			
			while( i>=from && i<=to ) {
				var o=new Element('option');
				o.writeAttribute('value',""+i);
				if( captions!=null )
					o.update(captions[i]);
				else
					o.update(""+i);
				parent.down().appendChild(o);

				
				
				if( asc )
					i++;
				else
					i--;
			}
			
			
		}
		
		if( parent.select('[value='+value+']').length==0 )
		{
			
			
			var selectElement=parent.down();
			var firstOption=selectElement.down();
			
			
			var newOption=new Element('option');
			newOption.writeAttribute('value',value);
			newOption.value=value;
			if( captions!=null )
				newOption.update(captions[i]);
			else
				newOption.update(""+value);
			
			var tail=parseInt(firstOption.readAttribute('value'))<value;
			
			if( asc ) tail=!tail;
			
			if( tail )
				selectElement.insertBefore(newOption,firstOption);
			else
				selectElement.appendChild(newOption);
		}
		parent.down().value=value;
	}

	var draw=function()
	{
		if( args.yearSelect ) {
			var yearFrom=1950;
			if( args.yearSelectFrom!=null && parseInt(args.yearSelectFrom)>0 )
				yearFrom=parseInt(args.yearSelectFrom);
			
			var yearTo=2020;
			if( args.yearSelectTo!=null && parseInt(args.yearSelectTo)>0 )
				yearTo=parseInt(args.yearSelectTo);
			
			var parent=div.select('[year]')[0];
			
			
			handleSelect(parent,yearFrom,yearTo,year,thisObj.yearChange)
			
			
		}
		else
			div.select('[year]')[0].update(year);
		
		if( args.monthSelect ) {
			var monthFrom=0;
			var monthTo=11;
			
			var parent=div.select('[month]')[0];
			
			
			
			handleSelect(parent,monthFrom,monthTo,month,thisObj.monthChange,["1","2","3","4","5","6","7","8","9","10","11","12"],true)
		}
		else
			div.select('[month]')[0].update(month+1);
		
		
		div.select('[rows]')[0].update("");
		for(var i=0;i<rows.length;i++)
		{
			var row=rows[i];
			var tr=new Element('tr');
			for(var j=0;j<row.length;j++)
			{
				var td=new Element('td');
				if( j==6 )
					td.addClassName('sunday');

				if( j==5 )
					td.addClassName('saturday');

				tr.appendChild(td);


				if( row[j]==0 || row[j]==-1 ) {
					td.addClassName('blank');
					td.update('&nbsp;');
				}



				var d=new Date();
				var dc=new Date();

				dc.setMinutes(0);
				dc.setSeconds(0);
				dc.setHours(0);
				dc.setMonth(month);
				dc.setYear(year);
				if( row[j]>0 )
					dc.setDate(row[j]);
				else
					dc.setDate(1);

				if( row[j]>0 ) {
					if( isSameDay(dc,d) && row[j]>0 )
						td.addClassName('today');
					else if( dc.getTime()>d.getTime() )
						td.addClassName('future');
					else
						td.addClassName('past');
				}

				if( isSameDay(dc,selectedDate) && row[j]>0 )
				{
					if( mode=='week')
						tr.addClassName('selected');
					else
						td.addClassName('selected');
				}


				if( row[j]>0 ) {
					var a=new Element('a');
					a.href='javascript:;';
					a.observe('click',thisObj.selectDate);
					a.update(row[j]);
					td.appendChild(a);

				}
				else
					td.update('&nbsp;');
			}

			div.select('[rows]')[0].appendChild(tr);

		}

	}

	this.show=function()
	{
		if( div==null )
			return;
		setupCalendar();
		generateRows();
		draw();
		div.show();
		
		
	}

	generateRows();
	div.show();
	
	if( args.link )
		div.setStyle({zIndex: 99, top: (args.link.cumulativeOffset()[1]+args.link.getHeight())+"px", left: (args.link.cumulativeOffset()[0]+args.link.getWidth())+"px"});
	draw();
	

}
Calendar.Scan=function(container)
{
	var a;
	if( container )
		a=container.select('[type=calendar]');
	else
		a=$$('[type=calendar]');
	
	a.each(function(o){new Calendar({div:o});});
	
}

CalendarEvent=function(container)
{
	var thisObj=this;
	
	this.onSelect=function(year,month,day)
	{
		
		EventForm_Day.search(year+'-'+(month+1)+'-'+day);
	}
	
	var calendar=new Calendar({div:container,onSelect:this.onSelect});
	
	
}
CalendarEvent.Scan=function(container)
{
	var a;
	if( container )
		a=container.select('[type=calendarEvent]');
	else
		a=$$('[type=calendarEvent]');
	
	a.each(function(o){new CalendarEvent(o);});
	
}

//Calendar
//////////////////////////////////



//////////////////////////////////
//Conversion
var Conversion=new Object();
Conversion.stringToDate=function(s) {
if( s==null )
return null;
if( s.empty() )
return null;
var ar=null;

var d=new Date();
d.setMinutes(0);
d.setSeconds(0);
d.setHours(0);

ar=s.split('/');
if( ar.length==3 ) {
d.setYear(parseInt(ar[0]));
d.setMonth(parseInt(ar[1].trimNumber())-1);
d.setDate(parseInt(ar[2].trimNumber()));
return d;
}
ar=s.split('-');
if( ar.length==3 ) {
d.setDate(parseInt(ar[2].trimNumber()));
d.setMonth(parseInt(ar[1].trimNumber())-1);
d.setYear(parseInt(ar[0]));
return d;
}
ar=s.split('.');
if( ar.length==3 ) {
d.setYear(parseInt(ar[0]));
d.setMonth(parseInt(ar[1].trimNumber())-1);
d.setDate(parseInt(ar[2].trimNumber()));
return d;
}
return null;
}
//Conversion
//////////////////////////////////


function MultiLang(container)
{
	
	var prefix='input'+container.readAttribute('multiLang')+'_';
	var key='input'+container.readAttribute('multiLang');
	
	var html=container.select('[name='+key+']')[0].readAttribute('class')=='mceEditor';
	var id=null;
	if( html )
		id=container.select('[name='+key+']')[0].readAttribute('id');
	
	this.change=function(e)
	{
		var el=Event.element(e);
		var lang=el.value;

		
		// Pobranie aktualnego jezyka z hidden: inputX_lang
		var currentLang=container.select('[name='+prefix+'lang]')[0].value;
		
		// Zapisanie do hidden: inputX_currentLang wartosci inputa
		if( html )
			container.select('[name='+prefix+currentLang+']')[0].value=tinyMCE.get(id).getContent();  
		else
			container.select('[name='+prefix+currentLang+']')[0].value=container.select('[name='+key+']')[0].value;
		
		// Zapisanie do hidden: inputX_lang wartosci wybranego jezyka
		container.select('[name='+prefix+'lang]')[0].value=lang;
		
		// Zapisanie do inputa wartosci hidden wybranego langa
		if( html )
			tinyMCE.get(id).setContent( container.select('[name='+prefix+lang+']')[0].value );
		else
			container.select('[name='+key+']')[0].value=container.select('[name='+prefix+lang+']')[0].value;
		
	}
	container.select('select')[0].observe('change',this.change);
	
	container.handler=this;
	
	this.submit=function()
	{
		// Pobranie aktualnego jezyka z hidden: inputX_lang
		var currentLang=container.select('[name='+prefix+'lang]')[0].value;
		// Zapisanie do hidden: inputX_currentLang wartosci inputa
		if( html )
			container.select('[name='+prefix+currentLang+']')[0].value=tinyMCE.get(id).getContent();  
		else
			container.select('[name='+prefix+currentLang+']')[0].value=container.select('[name='+key+']')[0].value;
		
	}
}
MultiLang.Scan=function(container)
{
	if( container!=null )
		container.select('[multiLang]').each(function(o){new MultiLang(o);});
	else
		$$('[multiLang]').each(function(o){new MultiLang(o);});
}
MultiLang.Submit=function(container)
{
	if( container!=null )
		container.select('[multiLang]').each(function(o){o.handler.submit();});
	else
		$$('[multiLang]').each(function(o){o.handler.submit();});
}



EntityFormForward=function(button)
{
	var tmp=Element.extend(button);
	
	var form=tmp.searchUp('form');
	
	var validator=new Validator({containerElement:form.down()});

	var r= validator.validate();

	
	if( r.validAll )
	{
		if( form.elements['ajax'].value=='true' || form.elements['ajax'].value=='1')
		{
			// Obsluga tineMce
			form.down().select('textarea').each(function(o) {
				if( o.readAttribute('class')=="mceEditor" ) {
					var id=o.readAttribute('id');
					var content=tinyMCE.get(id).getContent();
					
					
					o.value=content;
					
				}
			});			
			
			MultiLang.Submit(form.down());
			CitySelector.Submit(form.down());
			

			
			tmp.up().update('<img src="'+RootNL+'assets/img/wait-2.gif"/>');
			
			if( form.callback )
				Request.Request({form:form,callback:form.callback});
			else
				Request.Request({form:form,dest:form.up(),callback:EntityFormAfterAfax});
		}
		else
		{
			MultiLang.Submit(form.down());
			CitySelector.Submit(form.down());
			
			
			form.submit();
		}
	}
}
EntityFormBackward=function(button)
{
	var tmp=Element.extend(button);
	var form=tmp.searchUp('form');
	
	var act=form.action;

	if( act.endsWith('/0') )
		return;
	
	var re=new RegExp(/\d+$/);
	
	var step=re.exec(act);
	if( step )
	{
		step=parseInt(step);
		step--;
		act=act.substring(0,act.length - ('/'+step).length );
		act+='/';
		act+=step;
	}
	else
		return;

	if( form.elements['ajax'].value=='true' || form.elements['ajax'].value=='1')
	{
		tmp.up().update('<img src="'+RootNL+'assets/img/wait-2.gif"/>');
		Request.Request({url:act,dest:form.up(),callback:EntityFormAfterAfax});
	}
	else
		window.location=act;
}


EntityFormUpdate=function(button)
{
	var tmp=Element.extend(button);
	
	var form=tmp.searchUp('form');
	
	var validator=new Validator({containerElement:form.down()});
	
	var r= validator.validate();
	
	
	
	if( r.validAll )
	{
		if( form.elements['ajax'].value=='true' || form.elements['ajax'].value=='1')
		{
			// Obsluga tineMce
			form.down().select('textarea').each(function(o) {
				if( o.readAttribute('class')=="mceEditor" ) {
					var id=o.readAttribute('id');
					var content=tinyMCE.get(id).getContent();
					
					o.value=content;
					
				}
			});
			
			MultiLang.Submit(form.down());
			CitySelector.Submit(form.down());
			
			
			tmp.up().update('<img src="'+RootNL+'assets/img/wait-2.gif"/>');
			if( form.callback )
				Request.Request({form:form,callback:form.callback});
			else
				Request.Request({form:form,dest:form.up(),callback:EntityFormAfterAfax});
		}
		else
		{
			MultiLang.Submit(form.down());
			CitySelector.Submit(form.down());
			

			form.submit();
		}
		
	}
}


EntityFormSearch=function(button)
{
	var tmp=Element.extend(button);
	
	var form=tmp.searchUp('form');
	
	if( form.elements['ajax']!=null )
	{
		CitySelector.Submit(form.down());
		
		
		tmp.up().update('<img src="'+RootNL+'assets/img/wait-2.gif"/>');
		Request.Request({form:form,dest:form.up(),callback:EntityFormAfterAfax});
	}
	else
	{
		CitySelector.Submit(form.down());
		
		form.submit();
	}
}


EntityFormUrl=function(button,url,ajax)
{
	var b=Element.extend(button);
	
	if( ajax=='true' || ajax=='1')
	{
		var tmp=b.up();
		b.up().update('<img src="'+RootNL+'assets/img/wait-2.gif"/>');
		Request.Request({url:url,dest:tmp,callback:EntityFormAfterAfax});
	}
	else
		window.location=url;

		
}


EntityFormAfterAfax=function(content,ajax,args)
{
	if( args.dest!=null )
		Scan(args.dest);
}


/////////////////////////
function Select(container)
{
	var thisObj=this;
	
	var hidden=container.select('input')[0];
	var label=container.select('[type=label]')[0];
	var list=container.select('[type=list]')[0];
	var widget=container.select('[type=widget]')[0];
	
	list.hide();
	
	var positionList=function() {
		var tmp=widget.cumulativeOffset();
		list.moveTo(tmp[0],tmp[1]+widget.getHeight());
	}
	
	this.showList=function() {
		positionList();
		list.show();
		
		GMouseTrapEventManager.add({objects:[list,widget],pad:5,callbackOut:thisObj.mouseOut,autoremove:true});
	}
	
	this.hideList=function() {
		list.hide();
	}
	
	this.toggleList=function() {
		if( list.visible() )
			thisObj.hideList();
		else
			thisObj.showList();
	}
	
	this.mouseOut=function() {
		if( list.visible() )
			thisObj.hideList();
		return true;
	}
	
	this.select=function(e) {
		var el=Event.element(e);
		var prevV=hidden.value;
		hidden.value=el.readAttribute('value');
		label.update(el.innerHTML);
		list.hide();
		
		if( hidden.changeCallback!=null )
			hidden.changeCallback(hidden.value,prevV);
		
		
		if( hidden.readAttribute('onChange') )
		{
			var select=container;
			var value=hidden.value;
			var prevValue=prevV;
			
			eval(hidden.readAttribute('onChange'));
		}
	}
	
	widget.observe('click',this.toggleList);
	
	list.select('[type=entry]').each(function(o){o.observe('click',thisObj.select);});
	
	
	var tmp=null;
	
	list.select('[type=entry]').each(function(o) {
		if( o.readAttribute('value')==hidden.value )
			tmp=o;
	});
	
	if( tmp==null )
		tmp=list.select('[type=entry]')[0];
	
	if( tmp && label.innerHTML.empty() )
	{
		hidden.value=tmp.readAttribute('value');
		label.update(tmp.innerHTML);
	}
	
}
Select.Scan=function(where)
{
	var a;
	if( where )
		a=where.select('[type=select]');
	else
		a=$$('[type=select]');
	
	a.each(function(o){new Select(o);});
}



////////////////////////////////////////


GMaps=function(div,forceLazy)
{
	var thisObj=this;
	
	var defGW=49.420868;
	var defGH=20.391941;
	
	
	if( div.handler )
		return;
	
	
	var tmp=div.readAttribute('gmaps');
	
	if( div.readAttribute('gmapsLazy')==1 )
	{
		if( !forceLazy )
			return;
	}
	
	
	div.handler=this;
	
	if( tmp!=null ) 
	{
		tmp=tmp.split(',');
		if( tmp.length==2 )
		{
			tmp[0]=tmp[0].replace('(','').trim();
			tmp[1]=tmp[1].replace(')','').trim();
			
			tmp[0]=parseFloat(tmp[0]);
			tmp[1]=parseFloat(tmp[1]);
			
			
			defGW=tmp[0];
			defGH=tmp[1];
			
			
			
		}
		else
			tmp=null;
	}
	
	var latlng = new google.maps.LatLng(defGW, defGH);
    var myOptions = {
    	      zoom: 8,
    	      center: latlng,
    	      mapTypeId: google.maps.MapTypeId.ROADMAP
    	    };
    var map = new google.maps.Map(div,
    	        myOptions);
    
    var marker=null;
    if( tmp!=null )
    {
    	var loc = new google.maps.LatLng(tmp[0],tmp[1]);
    	var marker = new google.maps.Marker({
    		position: loc, 
    		map: map
    	});
    }

    this.remove=function()
    {
    	if( marker )
    		marker.setMap(null);
    	marker=null;
    }

	this.clicked=function(event)
	{
		if( div.readAttribute("readonly")==null )
		{
		
			if( marker==null )
			marker = new google.maps.Marker({
			      position: event.latLng, 
			      map: map
			  });
			else
				marker.setPosition(event.latLng);
			
			div.next().value=event.latLng.toString();
		}

	}
	
	if( div.readAttribute("readonly")==null || true )
		google.maps.event.addListener(map, 'click', this.clicked);

		

}
GMaps.Scan=function(container,forceLazy)
{
	var a;
	if( container )
		a=container.select('[gmaps]');
	else
		a=$$('[gmaps]');	
	a.each(function(o){new GMaps(o,forceLazy);});
}

