MW = {
	callbacks: {},
	functions: {},
	classes  : {},
	ref      : {},
	obj      : {},
	i18n     : {},
	settings : {},
	'var'    : {},

	input    : {},
	data     : {},
	page     : {},

	ajax: {
		backend: '/ajax.php?module=77',
		data   : {},
		error_handler: function(error){
			var types = [
				'ERROR',
				'WARNING',
				'NOTICE'
			];

			// Simply alert all error messages
			//
			alert('['+types[error.type]+'][code: '+error.code+']: '+error.desc);

			// If callback is requested, run it
			//
			if(typeof(error.callback) == 'function')
				error.callback();
		},

		_request_id: 0,
		request: function(data, callback){
			MW.ajax._request_id++;

			out.info('['+MW.ajax._request_id+'] Making AJAX request with the following data:');
			out.log(data);
			// Cache the last AJAX request just in case
			//
			MW.ajax.data.last_ajax_request = data;

			//
			// Build the request object
			//
			var opts = {
				method : 'post',
				parameters: Object.extend({host: 'www.m-broker.de', uri: '/ajax.php', module: 77}, data),
				onSuccess : (function(request_id, callback, transport){
					try{
						var data = jsonParse( transport.responseText );
					}catch(e){
						var data = transport.responseText.evalJSON();
					}
			
					out.log('['+request_id+'] Backend returned the following reply:');
					out.log(data);

					// Cache the last AJAX reply just in case
					//
					MW.ajax.data.last_ajax_reply = data;

					if(!!!data.request || !!!data.reply || !!!data.errors)
					{
						out.warn('['+request_id+'] Received malformed AJAX reply.');
						out.log('['+request_id+'] Executing callback with empty data....');

						// Run our callback with the empty data.
						//
						callback && callback({}, {});
					}
					else
					{
						out.log('['+request_id+'] Reply format is valid. Checking for errors....');

						// The 'errors' aray in the reply is not empty
						// Run all errors through the error hander
						//
						if(data.errors.length != 0)
						{
							out.warn('['+request_id+'] Errors found, processing....');
							for(var i=0, cnt=data.errors.length; i<cnt; i++)
								MW.ajax.error_handler(data.errors[i], data.request);

						}
						else
						{
							out.log('['+request_id+'] No errors found, executing callback....');
						}


						// Run our callback with the data from the reply, if a callback was supplied.
						// Supply the request data as the second parameter.
						//
						callback && callback(data.reply, data.request);
					}

				}).bind(this, MW.ajax._request_id, callback)
			};

			new Ajax.Request(MW.ajax.backend, opts);
		}
	}
};

//
//
//
MW.functions.date_get_from_value = function(date, hour, min){
	var reg =  /^([0-9]{1,2})[\.\,]([0-9]{1,2})[\.\,]([0-9]{2}|[0-9]{4})$/;

	if(reg.exec(date))
	{
		var datArr  =  reg.exec(date);
		datArr[3]   =  (datArr[3].length == 2)? '20' + datArr[3] : datArr[3];
		datArr[2]   =  (datArr[2] > 0 )? datArr[2] - 1 : 11;
		actDate     =  new Date(datArr[3], datArr[2], datArr[1], hour, min, 0);

		return actDate.getTime();
	}
	else
	{
		return false;
	}
};

MW.functions.create_hidden_form = function(action){
	var form = $('hidden-form');
	if(form)
	{
		// Clear out the form content
		while(form.firstChild)
			form.removeChild(form.firstChild);

		form.action = action;
	}
	else
	{
		form = document.body.appendChild(new Element('form', {
			id     : 'hidden-form',
			method : 'post',
			action : action
		}));
	}

	return form;
};










Element.addMethods({
	show_loader_overlay: function(elm){
		document.body.appendChild(
			new Element('div', {
				'id'   : elm.identify()+'-loader',
				'class': 'loader'
			}).setStyle({
				textAlign : 'center',
				position  : 'absolute',
				zIndex    : 3,
				top       : elm.cumulativeOffset().top + 'px',
				left      : elm.cumulativeOffset().left + 'px',
				width     : elm.getDimensions().width + 'px',
				height    : elm.getDimensions().height + 'px'
			}).update(
				'<table width="100%" height="100%">' +
				  '<tr>' +
				    '<td style="vertical-align: middle; text-align: center;">' +
				      '<img src="/img/i/loading.gif" />' +
				    '</td>' +
				  '</tr>'+
				'</table>'
			).setOpacity(0.8)//.clonePosition(elm)
		);
		return elm;
	},
	hide_loader_overlay: function(elm){
		if(elm.id)
		{
			var element =  $(elm.id + '-loader');
			element.parentNode.removeChild(element);
		}
		return elm;
	}
});






var Layer = Class.create({
	initialize: function(options){
		this.options = Object.extend({
			className: 'layer',
			close_btn_selector: '.close-btn',
			garbage_collector : '#templates'
		}, options || {});

		this.ref         = this.embed();
		this.content     = null;
		this._reposition = this.reposition.bind(this);
		this._hide       = this.hide.bind(this);
	},

	embed: function(){
		var result = new Element('div', {
			className: this.options.className + ' hidden',
			position : 'absolute',
			left     : 0,
			top      : 0
		});

		var overlay = new Element('div', {
			className: this.options.className + '-overlay'
		}).setStyle({
			position : 'absolute',
			left     : 0,
			top      : 0,
			zIndex   : 1,
			zoom     : 1,
			backgroundColor: '#000'
		}).setOpacity(0.6);

		var content = new Element('div', {
			className: this.options.className + '-content'
		}).setStyle({
			position : 'absolute',
			zIndex   : 2
		});

		result.appendChild(overlay);
		result.appendChild(content);

		return document.body.appendChild(result);
	},


	reposition: function(evt){
		if(!this.content)
			return;

		var content_size   = this.content.getDimensions();
		var screen_size    = document.viewport.getDimensions();
		var scroll_offsets = document.viewport.getScrollOffsets();
        
        

              
		var body_dimensions = $(document.body).getDimensions(); 
		var overlay_width  = body_dimensions.width  > screen_size.width  ? body_dimensions.width  : (scroll_offsets.left + screen_size.width);
		var overlay_height = body_dimensions.height > screen_size.height ? body_dimensions.height : (scroll_offsets.top  + screen_size.height);
        
//		var overlay_width  = screen_size.width + scroll_offsets.left;
		//var overlay_height = screen_size.height + scroll_offsets.top + 100;
        

        
        
        //alert((body_dimensions.height > screen_size.height ? 'body_dimensions.height > screen_size.height\n\n':'body_dimensions.height < screen_size.height\n\n') +
              //'document.viewport.getDimensions(): '+screen_size.width + ', '+screen_size.height+'\n'+
              //'document.viewport.getScrollOffsets(): '+scroll_offsets+'\n'+
              //'$(document.body).getDimensions(): '+body_dimensions.width+', '+body_dimensions.height);

        //if(!Prototype.Browser.IE)
            //overlay_height += 200;

		var content_left = scroll_offsets.left + Math.round((screen_size.width  - content_size.width)  / 2);
		var content_top  = scroll_offsets.top  + Math.round((screen_size.height - content_size.height) / 2);
		
		//alert(screen_size.width + ' x ' + screen_size.height);


		// Overlay
		this.ref.select('.' + this.options.className + '-overlay').first().setStyle({
			width : overlay_width  + 'px',
			height: overlay_height + 'px'
		});

		if(!evt)
		{
			// Content
			this.ref.select('.' + this.options.className + '-content').first().setStyle({
				left: content_left +  'px',
				top : content_top  +  'px',
				width : content_size.width + 'px',
				height: content_size.height + 'px'
			});


		}
		else
		{
			this.effect && this.effect.cancel();

			var obj = this.ref.select('.' + this.options.className + '-content').first();
			this.effect = new Effect.Move(obj, {
				x: content_left,
				y: content_top,
				mode: 'absolute',
				duration: 0.3,
				fps: 100,
				transition: Effect.Transitions.linear
				//Effect.Transitions.spring
			});
		}
	},


	//
	//
	// API
	//
	//
	// show_content
	// hide
	//
	show_content: function(content){
		this.ref.addClassName('invisible').removeClassName('hidden');
		this.content = content;
        var ie8test = '.' + this.options.className + '-content';
		this.ref.select(ie8test).first().update('').appendChild(content);
		this.ref.select(this.options.close_btn_selector).invoke('observe', 'click', this._hide);

		this.reposition();
		Event.observe(window, 'resize', this._reposition);
		Event.observe(window, 'scroll', this._reposition);

		this.ref.removeClassName('invisible');
    
	},

	hide: function(evt){
		evt && evt.stop();

		this.ref.select(this.options.close_btn_selector).invoke('stopObserving', 'click', this._hide);
		this.ref.addClassName('invisible');

		var tmp = $$(this.options.garbage_collector).first();
		tmp && tmp.appendChild(this.content);

		Event.stopObserving(window, 'resize', this._reposition);
		Event.stopObserving(window, 'scroll', this._reposition);
	}
});



function getViewportDimensions() {
    var intH = 0, intW = 0;
    
    if(self.innerHeight) {
       intH = window.innerHeight;
       intW = window.innerWidth;
    } 
    else {
        if(document.documentElement && document.documentElement.clientHeight) {
            intH = document.documentElement.clientHeight;
            intW = document.documentElement.clientWidth;
        }
        else {
            if(document.body) {
                intH = document.body.clientHeight;
                intW = document.body.clientWidth;
            }
        }
    }

    return {
        height: parseInt(intH, 10),
        width: parseInt(intW, 10)
    };
}

