function dzien_swiateczny()
{
	if(typeof glob_dzien_swiateczny!='undefined')return glob_dzien_swiateczny;
	setTimeout(function(){delete glob_dzien_swiateczny},1000*60*30);
	var weekday,ymd,today = new Date();
	weekday=today.getDay();
	if(weekday==6 || weekday==0){glob_dzien_swiateczny=1;return 1;}
	ymd=today.getFullYear()+'-'+(today.getMonth()+1)+'-'+today.getDate();
	//1.I, pon. wielkanocny (13.IV.2009, 5.IV.20010), 1.V,3.V, boże ciało (11.VI.2009,3.VI.2009), 15.VIII, 1.XI, 11XI, 25.XII, 26.XII
	var holidays=['2009-5-1','2009-5-3','2009-6-11','2009-6-12','2009-8-15','2009-11-11','2009-12-25'];
	for(var i=0;i<holidays.length;i++)if(holidays[i]==ymd){glob_dzien_swiateczny=1;return 1;}
	glob_dzien_swiateczny=0;
	return 0;
}
		
function is_linia(str){
	//var r=/^([A-Z]\-?)?[0-9]+$/i;
	return /^([A-Z]\-?)?[0-9]{1,3}$/i.test(str);
}
		
function load_script(src,body){
	var script = document.createElement("script");
	script.setAttribute("type", "text/javascript");
	script.setAttribute("src", src);
	$((body==true)?'body':'head').append(script);
	//console.log('loading:',src);
}
		
function graybox(options){
	
	var defaults={padding:10,w:400,h:500,backgroundColor:'white',backColor:'black',backOpacity:0.4,closeOnBackClick:true,closeOnClick:true,closingclass:'.closebutton',html:''}
	if(typeof options == 'string')defaults.html = options;
	if(typeof options != 'object')options = {};
	if(options.title)options.title='<h1>'+options.title+'</h1>';else options.title='';
	if(options.description)options.description='<div class="description">'+options.description+'</div>';else options.description='';
	
	var settings=$.extend({},defaults,options);
	var dh=$(document).height();
	var dw=$(document).width();
	var top=Math.round($(window).height()/3-settings.h/2)+$(document).scrollTop();
	if(top<10)top=10;
	var left=Math.round(dw/2-settings.w/2);
		
	var $back = $('#graybox_back_div');
	var $front = $('#graybox_front_div');
	var $shadow = $('#graybox_shadow_div');
	
	var close = function(ev){
		$t=$(ev.target);

		if(
			($t.is(settings.closingclass)) ||
			($t.is('#graybox_back_div') && settings.closeOnBackClick) || 
			($t.is('#graybox_front_div') && settings.closeOnClick)
		){
			$back.hide();
			$front.hide();
			$shadow.hide();
		}
	}
	
	if(!$back.length)$back=$('<div id="graybox_back_div"></div>').css({position:'absolute',width:'100%',top:'0px',left:'0px',zoom:1,'z-index':998,display:'none'}).click(close).appendTo('body');
	$back.css({height:dh,backgroundColor:settings.backColor,opacity:settings.backOpacity}).show();
	
	if(!$shadow.length)
		$shadow=$('<div id="graybox_shadow_div"></div>').css({
			position:'absolute',
			opacity:0.3,
			zoom:1,
			'z-index':999,
			display:'none',
			backgroundColor:'black'
		}).appendTo('body');
		
	$shadow.css({height:settings.h+'px',width:settings.w+'px',top:(top+3)+'px',left:(left+3)+'px',padding:settings.padding+'px'}).show();
	
	if(!$front.length)
		$front=$('<div id="graybox_front_div"></div>').css({
			position:'absolute',
			opacity:1.0,
			zoom:1,
			'z-index':1000,
			display:'none'
		}).click(close).appendTo('body');
	
	
	$front.css({
		height:settings.h+'px',
		width:settings.w+'px',
		top:top+'px',
		left:left+'px',
		backgroundColor:settings.backgroundColor,
		padding:settings.padding+'px',
		overflow:'hidden'
	});
	
	$front.html('<div id="graybox_close" class="closebutton"></div>'+settings.title+settings.description+settings.html).show();

	$('#graybox_close').css({'left':(settings.w+(settings.padding*2)-15-3)+'px'});
	$shadow.show();
	
	//'<br><a class="closebutton">zamknij</a>'
	//tutaj musi byc jakas opcja aby sprawdzac czy 'html' nie jest przypadkiem obiektem typu DOMnode, jezeli jest
	//to go appendujemy
	
}
		
function create_tabs(obj_content,show_id){
	if(show_id==null)show_id=0;
	var menu=createDOM('div.menu'),content=createDOM('div.content');
	var i=0;
	for(var tab_name in obj_content)
	{
		var content_element=createDOM('div',{
			html:(typeof obj_content[tab_name]=="string")?obj_content[tab_name]:'',
			$display:(i==show_id)?'block':'none'
		}).addMe(content);
		
		if((typeof obj_content[tab_name]=="object") && (obj_content[tab_name].appendChild!=null))content_element.appendChild(obj_content[tab_name]);
		if(typeof obj_content[tab_name]=="function")content_element.content_function=obj_content[tab_name];
		
		//menu element
		createDOM('div',{
			var_content_element:content_element,
			var_tab_nr:i,
			classname:(i==show_id)?'tab_on':'tab_off',
			html:tab_name,
			onclick:function(){
						
						$("div",this.parentNode).removeClass().addClass('tab_off');
						$(this).removeClass().addClass('tab_on');
						$("> div.content > div",this.parentNode.parentNode).css("display","none");
						$(this.content_element).css("display","block");
						if((this.content_element.content_function!=undefined) && (this.content_element.content_aquired==undefined))
						{
							this.content_element.content_function(this.content_element);	
						}
				}
		}).addMe(menu);
		content_element=null;
		i++;
	}
	return createDOM('div.tabs',[menu,content]);
}
	
		
$.fn.hovermenu = function(options) {
	var opts=$.extend({},$.fn.hovermenu.defaults,options);
	
	return this.each(function(){
		$(this).data('hovermenu',true);
		$(this).data('calledby',false);
		$(this).data('options',opts);
		
		this.cancel_close=function(){
			if(!this.timeoutid)return;
			clearTimeout(this.timeoutid);
			this.timeoutid=false;
		};
		
		this.delayed_close=function(){
			var self=this;
			this.timeoutid=setTimeout(function(){$.fn.hovermenu.hideanim(self,opts)},opts.close_timeout);
		};
		
		this.close=function(){
			$.fn.hovermenu.hideanim(this,opts);
		}
		
		this.reposition=function(div){
			div=div || $(this).data('calledby');
			var p=$(div).offset();
			$(this).stop().css({
				'opacity':1.0,
				'display':'block',
				'left':p.left+$(div).width()+20,
				'top':p.top
			});
		};
		
		this.show=function(div){
			this.cancel_close();
			$(this).data('calledby',div);
			var beforeshow = $(div).data('options')['beforeshow'] || $(this).data('options')['beforeshow'];
			
			if(typeof beforeshow == 'function'){
				beforeshow(this);//tutaj mozna zwrocic false i anulowac pokazywanie
			}
			this.reposition(div);
		};
		
		$(this).mouseover(this.cancel_close).mouseout(this.delayed_close);
		
	});
};

$.fn.hovermenuAttach = function(box_id,options) {
	options = options || {};
	return this.each(function(){
		if($(box_id).data('hovermenu')){
			$(this).data('options',options);
			$(this).unbind('mouseover.hovermenu').unbind('mouseout.hovermenu');
			$(this).bind('mouseover.hovermenu',function(){$(box_id)[0].show(this);}).bind('mouseout.hovermenu',function(){$(box_id)[0].delayed_close();});
		}
	});
};

$.fn.hovermenu.hideanim = function(elem,opts){
	$(elem).animate({'opacity':0},'fast','linear',function(){$(this).css('display','none')});
	//tutaj wywolanie funkcji ktora moze cos zrobic z boxem po schowaniu (wyczyscic?)
};

$.fn.hovermenu.defaults = {'close_timeout':250};

		
modHtmlBinder = {
	html:{},
	bindHtml:function(){
	
		if(this.container!==undefined){
			this.container=$(this.container);
		}
		
		if(is.obj(this.html)){
			for(var k in this.html)
				if(this.container) this.html[k]=$(this.html[k],this.container);
				else this.html[k]=$(this.html[k]);
		}
	}
}

modSetFromObj  = {
	setFrom:function(obj){
		if(is.obj(obj))copyproperties(obj,this);
	}
}
	