var cymes = {};

cymes.blender = null;


cymes.__proto = {
	consts: {
		TabStrip: {
			bttCSS_Disabled: 'tabstrDisabled' 
		}
	}
};


cymes.__proto.TabStrip = Class.create({
	
	tabstrip: null,
	tabs: $H(),
	active: '',
	frameHeight: 0,
	Event_onEnterTab: null,
	Event_onExitTab: null,


/** Struktura obiektu tab.
	*/
	tab: function(argv){
		this.key = argv.key;
		this.href = argv.href;
		this.li = argv.li
		this.a = argv.a;
		this.frame = argv.frame;
		this.enabled = !this.li.hasClassName('tabstrDisabled');
		this.active = false;
		this.loaded = false;
		/** fukcja niewykorzystywana teraz
		*/
		this.ChangeState = function(active){
			
		}.bind(this);
		
	},


/**
	*/
	initialize: function(argv) {
		if(this._getDOM(argv.objectId)){
			
			this.Event_onEnterTab = argv.Event_onEnterTab ? argv.Event_onEnterTab : null;
			this.Event_onExitTab = argv.Event_onExitTab ? argv.Event_onExitTab : null;
			
			this._measureFrames();
			
			this.active = this._getSelectedByURL();
			
			this._attachEvents();
			
			this.ChangeTab(this.active);
			
		}else{
			alert('buu');
		}
	},


/** Pobiera obiekty używane w TabStrip.
	*/
	_getDOM: function(objectId){
		this.objectId  = objectId;
		this.tabstrip = $(this.objectId);
		var _btts = $(this.objectId+"_Buttons").getElementsBySelector("LI");
		if(_btts.length>0){
			_btts.each(function(btt){
				var _enabled = !btt.hasClassName('tabstrDisabled');
				var _a = btt.getElementsBySelector("A")[0];
				var _id = _a.readAttribute('href').substr(5);
				var _frame = $("tabframe_"+_id);
				var tab = new this.tab({'key':_id, 'href':_id, 'li':btt, 'a':_a, 'enabled':_enabled, 'frame':_frame});
				this.tabs.set(_id, tab);
			}.bind(this));
		}
		return true;
	},


/** Określa aktywny tab na podstawie URLa.
	*/
	_getSelectedByURL: function(){
		var retval = '';
		if(location.hash!=''){
			retval = location.hash.substr(5);
			if(!(this.tabs.get(retval) && this.tabs.get(retval).enabled)){
				retval = '';
			}
		}
		if(retval==''){
			var akeys = this.tabs.keys();
			for(var i=0; i<akeys.length; i++){
				if(this.tabs.get(akeys[i]).enabled){
					retval = akeys[i];
					break;
				}
			}
		}
		return retval;
	},


/** Określa maksymalną wysokość ramki
	*/
	_measureFrames: function(){
		this.tabs.each(function(pair){
			if(pair.value.frame.getHeight() > this.frameHeight){
				this.frameHeight = pair.value.frame.getHeight();
			}
		}.bind(this));
		this.tabs.each(function(pair){
			pair.value.frame.setStyle({'height': this.frameHeight+'px'});
			pair.value.frame.hide();
		}.bind(this));
	},


/** Dodaje do a > li event.onclick.
	*/
	_attachEvents: function(){
		this.tabs.each(function(pair){
			pair.value.a.observe('click', function(event){
				var element = Event.findElement(event, 'a');
				if(element != document){
					event.stop();
					var key = element.readAttribute('href').substr(5);
					this.ChangeTab(key);
				}
			}.bind(this));
		}.bind(this));
	},


/** Zmienia aktywny tab.
	*/
	ChangeTab: function(key){
		if(this.tabs.get(key).enabled){
			this.tabs.each(function(pair){
				if(key==pair.key){
					pair.value.li.addClassName('tabstrSelected');
					pair.value.frame.show();
					pair.value.active = true;
				}else{
					pair.value.li.removeClassName('tabstrSelected');
					pair.value.frame.hide();
					if(this.Event_onExitTab!==null && pair.value.active) this.Event_onExitTab(pair.value);
					pair.value.active = false;
				}
			}.bind(this));
			//
			location.replace('#tab:'+key);
			this.active = key;
			//
			//this.tabstrip.scrollTo();
			//
			if(this.Event_onEnterTab!==null) this.Event_onEnterTab(this.tabs.get(key));
			//
			this.tabs.get(key).loaded = true;
		}
	}


});



cymes.__proto.cRadioDependentSwitch = Class.create({
	//
	radios: $H(),
	active: '',
	initialize: function(argv) {
		
		this.active = argv.active;
		
		argv.radios.each(function(h){
			this.radios.set(
				h.key, {
				'radio': $(h.value.radio),
				'dependents': h.value.dependents
			});
		}.bind(this));
		
		this.radios.each(function(h){
			if(h.key==this.active) h.value.radio.checked = true;
			h.value.radio.observe('click', function(event){
				var element = Event.element(event);
				this.radio_onClick(h.key);
			}.bind(this));
		}.bind(this));
		
		this.radio_onClick(this.active);
		
	},
	radio_onClick: function(active){
		this.active = active;
		this.radios.each(function(h){
			for(var i=0; i<h.value.dependents.length; i++){
				h.value.dependents[i].setStyle({'display': (h.key==this.active?'block':'none')});
			}
		}.bind(this));
		//alert(this.active);
	}
});





cymes.__proto.Blender = Class.create({
	
	back: null,
	
	initialize: function(argv){
		this.back = $(argv.objectId);
	},
	
	Show: function(){
		
		var doc = $(document.body);
		alert(doc.viewportOffset.height);
		return;
		
		var body = $(doc.body);
		var BlocksWide = body.childElements();
		var h = 0;
		var s = '';
		for(var i=0; i<BlocksWide.length; i++){
			if(this.back!=BlocksWide[i]){
				h+= (BlocksWide[i].getHeight());
				s+= BlocksWide[i].id+" h:"+BlocksWide[i].getHeight()+"; ";
			}
		}
		alert(s);
		this.back.setStyle({'display': "block", 'height': h+"px"});
	},
	
	Hide: function(){
		this.back.setStyle({'display': "none"});
	}
	
});









/** ///////////////////////////////////////////////////////////////////////////////////////////////
 * @class
 * @brief
 *
 *
 */// ---------------------------------------------------------------------------------------------
cymes.__proto.FormValidator = Class.create({
	
	CONST_CSS_ERRORHINT: 'ErrorHint',
	
	
	form: null,
	action: '',
	inputs: $A(),
	css_errorhint: '',
	
/**
	*/
	initialize: function(Action, Inputs, refFunctionErrorHintDisplay, CSSErrorHint){
		
		this.action = Action;
		
		this.ErrorHintDisplay = refFunctionErrorHintDisplay||this.ErrorHintDisplay;
		
		this.css_errorhint = CSSErrorHint||this.CONST_CSS_ERRORHINT;
		
		this.form = this._readInputs(Inputs);
		
		this.form.observe('submit', function(event){
			if(this.CheckForm()>-1){
				event.stop();
			}else{
				this.form.action = this.action;
			}
		}.bind(this));
		
	},


/** Odczytuje inputy
	* @return [object] Obiekt FORM tych formularzy.
	*/
	_readInputs: function(Inputs){
		var form = null;
		this.inputs = new Array();
		if(typeof(Inputs)=='object'){
			for(var key in Inputs){
				
				//alert(typeof(Inputs[key][0])+': '+Inputs[key][0].toString());
				var check = {'inputs': $A(), 'labels': $A(), 'expr':Inputs[key][0], 'msg':Inputs[key][1], 'checkall':true};
				
				if(key.substr(-1)==':'){
					var regexp = new RegExp('^'+key+'(.*)$');
					var missinginputs = ['input', 'textarea', 'select'];
					for(var im=0; im<missinginputs.length; im++){
						var _ainputs = $$(missinginputs[im]);
						for(var i=0; i<_ainputs.length; i++){
							if(regexp.test(_ainputs[i].id)) check.inputs.push($(_ainputs[i]));
						}
					}
				}else{
					//alert(key);
					if($(key)) check.inputs.push($(key));
					//alert(check.inputs[i].id);
				}
				
				if(check.inputs.length==0){
					alert('Input "'+key+'" będzie pominięty.');
					continue;
				}
				
				if(form==null) form = check.inputs[0].form;
				for(var i=0; i<check.inputs.length; i++){
					if(form!=check.inputs[i].form){
						alert('Inputy pochodzą z różnych formularzy.');
						continue;
					}
					var _label = $$('label[for='+check.inputs[i].id+']');
					if($(_label[0])) check.labels.push($(_label[0]));
				}
				
				// label wspólny
				if(key.substr(-1)==':'){
					if($(key+'label')){
						check.labels.push($(key+'label'));
					}
				}
				
				// test
				for(var i=0; i<check.inputs.length; i++){
					//alert(check.inputs[i].id);
					//check.inputs[i].addClassName(this.css_errorhint);
				}
				for(var i=0; i<check.labels.length; i++){
					//alert(check.labels[i].innerHTML);
					//check.labels[i].addClassName(this.css_errorhint);
				}
				
				//alert(typeof(check.expr));
				
				this.inputs.push(check);
				
			}// for(var key in Inputs)
		}// if(typeof(Inputs)=='object')
		
		return form;
		
	},


/** 
	* @return [int] Zwraca -1 jeżeli sukces lub indeks błędnego inputa.
	*/
	CheckForm: function(){
		
		this.ClearHints();
		
		
		
		for(var i=0; i<this.inputs.length; i++){
			
			var _value = this._inputs_value(i);
			var _condition;
			switch(true){
				case typeof(this.inputs[i].expr)=='boolean':
						_condition = this.inputs[i].expr;
					break;
				case 'function' && this.inputs[i].expr.toString().substr(0,8)=="function":
						_condition = this.inputs[i].expr();
					break;
				case 'string' && this.inputs[i].expr.toString().substr(0,4)=="ajax":
						_condition = true;
					break;
				case 'object':
				case 'function' && this.inputs[i].expr.toString().substr(0,1)=="/":
						var regexp = new RegExp(this.inputs[i].expr);
						_condition = regexp.test(_value);
					break;
				default:
					alert('Nieznany typ warunku.');
			}
			//alert(this.inputs[i].expr.toString().substr(0,8));
			//alert(this.inputs[i].inputs[0].type+': '+_value+': '+_condition);
			
			var isValid = _condition;
			//for(var i2=0; i2<this.inputs[i].inputs.length; i2++){
				
				//alert(this.inputs[i].inputs[i2].value);
				//var isValid = i<5;
			//}
			if(!isValid){
				this.ErrorHintDisplay(this.inputs[i].inputs, this.inputs[i].labels, this.inputs[i].msg);
				return i;
			}
		}
		
		return -1;
		
	},


/**
	*/
	ClearHints: function(){
		var msgbox = $$('p.'+this.css_errorhint);
		for(var i=0; i<msgbox.length; i++){
			msgbox[i].remove();
		}
		for(var i=0; i<this.inputs.length; i++){
			this.ErrorHintHide(this.inputs[i].inputs, this.inputs[i].labels);
		}
	},

/**
	*/
	ErrorHintDisplay: function(inputs, labels, message){
		for(var i=0; i<inputs.length; i++){
			inputs[i].addClassName(this.css_errorhint);
		}
		for(var i=0; i<labels.length; i++){
			labels[i].addClassName(this.css_errorhint);
		}
		
		inputs[0].focus();
		
		var msgbox = new Element('p', {'class': this.css_errorhint});
		msgbox.update(message);
		var tdparent = inputs[0].up('td');
		$(tdparent).insert({'bottom': msgbox});
	},


/**
	*/
	ErrorHintHide: function(inputs, labels){
		for(var i=0; i<inputs.length; i++){
			inputs[i].removeClassName(this.css_errorhint);
		}
		for(var i=0; i<labels.length; i++){
			labels[i].removeClassName(this.css_errorhint);
		}
	},


/**
	*/
	_inputs_value: function(index){
		var retval = '';
		switch(this.inputs[index].inputs[0].type){
			case 'radio':
			case 'checkbox':
					for(var i=0; i<this.inputs[index].inputs.length; i++){
						if(this.inputs[index].inputs[i].checked){
							retval = this.inputs[index].inputs[i].value;
							break;
						}
					}
				break;
			default:
				retval = this.inputs[index].inputs[0].value;
		}
		return retval;
	}

});








