Template = {
	SELECT_OPTION  : function(data, id_column, label_column)
	{
		var opt = new Option();
		
		if (typeof(id_column) == "undefined")
		{
			opt.value = data.value;
		}
		else
		{
			opt.value = data[id_column];
		}
		
		if (typeof(label_column) == "undefined")
		{
			opt.innerHTML = data.label;
		}
		else
		{
			opt.innerHTML = data[label_column];
		}
		
		return opt;
	}
};

function Dialog(message, buttons, url, urlParams, width, height)
{
	var button, callback;
	
	this.element = DOM.create('div');
	this.buttons = DOM.create('div');
	
	this.close = (function()
	{
		DOM.disappear(this.element, 50, DOM.remove);
		Dialog.overlay(false);
		DOM.removeEvent(window, 'resize', this.center);
		DOM.removeEvent(document, 'scroll', this.center);
	}).bindAsEventListener(this);
	
	this.center = (function(){
		DOM.setPosition(this.element, (Browser.pageWidth() / 2) - (this.element.clientWidth / 2), Browser.posTop() + (Browser.pageHeight() / 2 - (this.element.clientHeight / 2)));
	}).bind(this);
	
	if (typeof(url) == "undefined")
	{
		// normal text + buttons popup
		
		this.element.className = 'dialog';
		this.element.innerHTML = '<p class="message">' + message + '</p>';
		this.buttons.className = 'buttons';
		
		if (buttons)
		{
			for (var i = 0; i < buttons.length; i++)
			{
				button = DOM.create('button');
				button.innerHTML = buttons[i].label || '';
				button.className = buttons[i]['class'] || '';
				callback = buttons[i].callback;
				if (typeof callback == 'string' && typeof this[callback] == 'function') 
					callback = this[callback];
				else
					callback = callback.bindAsEventListener(this);
				DOM.addEvent(button, 'click', callback);
				this.buttons.appendChild(button);
			}
		}
		
		this.element.appendChild(this.buttons);
		DOM.hide(this.element);
		
		document.body.appendChild(this.element);
		DOM.appear(this.element);
		Dialog.overlay(true);
	
		this.center();
		
		this.buttons.firstChild.focus();
	}
	else
	{
		// ajax popup
		
		this.element.className = 'ajaxDialog ajaxDialogLoading';
		this.element.innerHTML = PHPVars.get('dialog_loading');
		
		this.center();
		document.body.appendChild(this.element);
		DOM.appear(this.element);
		Dialog.overlay(true);
		
		
		
		if (typeof(urlParams) == "undefined")
		{
			urlParams = [];
		}
		
		var req = new AJAX.Request(url, {
			method: "POST",
			asynchronous: false,
			parameters: urlParams
		});
		
		//script simulation
		var response = req.response.responseText;
		
		var all = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'img');
		var one = new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'im');
		
		var scripts = response.match(all);
		
		this.element.innerHTML = response;
		
		if (typeof(width) == "undefined")
		{
			width = DOM.width(this.element);
		}
		else
		{
			this.element.style.width = width + "px";
		}
		
		if (typeof(height) == "undefined")
		{
			height = DOM.height(this.element);
		}
		else
		{
			this.element.style.height = height + "px";
		}
		
		this.center(width, height);
		this.element.className = 'ajaxDialog';
		
		if (scripts)
		{
			for (var i = 0; i < scripts.length; i++)
			{
				response.replace(scripts[i], '');
				eval(scripts[i].match(one)[1]);
			}
		}
	}

	this.element.id = "dia" + uniqid();
	
	DOM.addEvent(window, 'resize', this.center);
	DOM.addEvent(document, 'scroll', this.center);
	
	return this;
};

Dialog.overlay = function(show)
{
	if (!Dialog.overlayElement)
	{
		Dialog.overlayElement = DOM.create('div');
		DOM.addClassName(Dialog.overlayElement, 'overlay');
		document.body.appendChild(Dialog.overlayElement);
	}
		
	if (show)
	{
		DOM.setStyle(Dialog.overlayElement, {width:'100%', heigth:Browser.pageHeight + 'px'});
		document.body.style.overflow = 'hidden';
		DOM.show(Dialog.overlayElement);
		DOM.fade(Dialog.overlayElement, {to:0.7});
	}
	else
	{
		DOM.fade(Dialog.overlayElement, {
			from: 0.7,
			to: 0,
			done : DOM.hide
		});
		document.body.style.overflow = 'auto';
	}
};

File = {
	positionUnder : function(e, elem)
	{
		if (typeof e == 'undefined') e = window.event;
		var file = DOM.eventTarget(e);
		
		if (file.tagName != 'input' || file.type == 'file')
		{
			file = DOM.children(elem)[2];
		}
		
		if (typeof e.pageY == 'undefined' &&  typeof e.clientX == 'number' && document.documentElement)
		{
			e.pageX = e.clientX + document.documentElement.scrollLeft;
			e.pageY = e.clientY + document.documentElement.scrollTop;
		}
		
		var ox = oy = 0;
		if (elem.offsetParent)
		{
			ox = elem.offsetLeft;
			oy = elem.offsetTop;
			while (elem = elem.offsetParent)
			{
				ox += elem.offsetLeft;
				oy += elem.offsetTop;
			};
		};
		
		var x = e.pageX - ox;
		var y = e.pageY - oy;
		var w = file.offsetWidth;
		var h = file.offsetHeight;
		
		file.style.top  = y - (h / 2)  + 'px';
		file.style.left	= x - (w - 30) + 'px';
	},
	
	display : function(elm)
	{
		var value = elm.value.split(/[\/\\]/);
		DOM.previous(elm, 2).innerHTML = value.pop();
	},
	
	create : function(name, validators)
	{
		var label = DOM.create('label', {
			'class' : 'file',
			onmousemove : function(event){File.positionUnder(event, this)}
		});
		
		label.appendChild(DOM.create('span'));
		
		label.appendChild(DOM.create('img', {
			src : Images.basePath + 'btn_browse.gif'
		}));
		
		var fileInp;
		
		label.appendChild(fileInp = DOM.create('input', {
			type : 'file',
			name: name,
			onmouseout : function(){File.display(this)}
		}));
		
		if (typeof validators != 'undefined')
		{
			var registerValidator = function()
			{
				if (fileInp.form)
					Validation.registerField(fileInp, validators);
				else
					setTimeout(registerValidator, 100);
			};
			registerValidator()
		};
		
		return label;
	},
	
	replacePreview : function(container, fieldName, validators)
	{	
		var file = File.create(fieldName, validators);
		container.parentNode.insertBefore(file, container);	
		DOM.remove(container);
		return file;
	}
};


var Wysiwyg = 
{
	defaultOptions : {
		mode : 'exact',
		plugins : ['safari','pagebreak','style','layer','table','save','advhr','advimage','advlink','emotions','iespell','inlinepopups','insertdatetime','preview','media','searchreplace','print','contextmenu','paste','directionality','fullscreen','noneditable','visualchars','nonbreaking','xhtmlxtras','template'],
		theme : 'advanced',
		theme_advanced_toolbar_location : 'top',
		theme_advanced_toolbar_align : 'left',
		theme_advanced_buttons1 : ['bold','italic','underline','strikethrough','|','justifyleft','justifycenter','justifyright','justifyfull','|','styleselect','formatselect','fontselect','fontsizeselect','|','forecolor','backcolor'],
		theme_advanced_buttons2 : ['cut','copy','paste','pastetext','pasteword','|','search','replace','|','bullist','numlist','|','outdent','indent','blockquote','|','undo','redo','|','link','unlink','anchor','image','cleanup|','insertdate','inserttime','preview','|','print','code','fullscreen'],
		theme_advanced_buttons3 : ['tablecontrols','|','hr','removeformat','visualaid','|','sub','sup','|','charmap','iespell','media','advhr','|','ltr','rtl','|','fullscreen'],
		theme_advanced_buttons4 : ['insertlayer','moveforward','movebackward','absolute','|','styleprops','|','cite','abbr','acronym','del','ins','attribs','|','visualchars','nonbreaking','template','pagebreak'],
		theme_advanced_resizing : true,
		theme_advanced_statusbar_location : 'bottom',
		theme_advanced_resize_horizontal : false,
		tab_focus : ':prev,:next',
		dialog_type : 'modal',
		forced_root_block : false
	},
	
	create : function(id, customs)
	{
		var options = Object.clone(Wysiwyg.defaultOptions);
		
		if (customs)
		{
			for (var i in customs)
			{
				if (customs[i] == 'true') customs[i] = true;
				if (customs[i] == 'false') customs[i] = false;
				
				if (typeof options[i] == 'object' && 'join' in options[i])
				{
					options[i].push(customs[i])
				}
				else options[i] = customs[i];
			}
		}
		
		for (var i in options)
		{
			if (typeof options[i] == 'object' && 'join' in options[i])
			{
				options[i] = options[i].join(',');
			}
		}
		
		setTimeout(function(){
			tinyMCE.init(Object.extend(options, {
			elements : id,
			language : CURRENT_LANG,
			setupcontent_callback : Wysiwyg._check
		}))
		}, 50);
	},
	
	_check : function(id)
	{
		var textarea = $(id);
		if (DOM.hasClassName(textarea, 'validation-error'))
		{
			Validation.showError(textarea);
		}
	}
};

var List = function(url, multiple, callback, selected)
{
	var req = new AJAX.Request(url, {
		method : 'POST',
		asynchronous : false,
		json : true
	});
	
	var table = DOM.create('table', {'class' : 'list'}),
		tbody = DOM.create('tbody'),
		thead = DOM.create('thead'),
		filter_box = DOM.create('input', {style:'width:99%'}),
		filter_row = DOM.create('tr');
		filter_cell = DOM.create('th', {colSpan:2});
	
	filter_cell.appendChild(filter_box);
	filter_row.appendChild(filter_cell);
	thead.appendChild(filter_row);
	table.appendChild(thead);
	table.appendChild(tbody);
	
	var filter = (function (event)
	{
		var filter = RegExp.escape(DOM.eventTarget(event).value);
		var regexp = new RegExp('(' + filter + ')', 'i');
		
		var clear_filter = function (row, item)
		{
			DOM.show(row);
			row.cells[0].innerHTML = item.label;
		};
		
		var apply_filter = function (row, item)
		{
			if (regexp.test(item.label))
			{
				DOM.show(row);
				row.cells[0].innerHTML = item.label.replace(regexp, '<span class="list-filter-match">\$1</span>');
			}
			else DOM.hide(row);
		};
		
		var iterator = filter == '' ? clear_filter : apply_filter;

		
		for (var i = 0; i < this.list.length; i++)
		{
			iterator(tbody.rows[i], this.list[i]);
		}
	}).bindAsEventListener(this);
	
	DOM.addEvent(filter_box, 'keyup', filter);
	
	var d = new Dialog('',[
		{
			label : PHPVars.get('select'),
			callback : function(){
				
				if (typeof callback == 'function' )
				{
					callback(List.checkedItems(table, multiple));
				}
				DOM.removeEvent(filter_box, 'keydown', filter);
				this.close();
			}
		},
		{
			label : PHPVars.get('cancel'),
			callback : 'close'
		}
	]);
	
	//Qwirks
	d.center(300, 300);
	d.element.firstChild.innerHTML = '';
	d.element.firstChild.style.padding = "0px";
	d.element.firstChild.appendChild(table); 
	DOM.setStyle(d.element.firstChild, {
		height : '250px',
		'overflow' : 'auto'
	});
	DOM.setDimensions(d.element, 300, 300);
	
	if (req.response.responseJSON.list)
	{
		var list = this.list = req.response.responseJSON.list;
		var name = uniqid();
		
		function checked (value)
		{
			if (typeof selected == 'undefined') return false;
			if (multiple)
			{
				return $A(selected).indexOf(value) != -1;
			}
			else return value == selected;
		}
		
		for (var i = 0; i < list.length; i++)
		{
			var item = DOM.create('tr', {'class' : 'list-item', onclick : List.selectEvent});
			
			var label = DOM.create('th', {'class' : 'list-item-label'});
				label.innerHTML = list[i].label;
			item.appendChild(label);
			
			var value = DOM.create('td', {
				'class' : 'list-item-value'
			});
			var selector = DOM.create('input', {
				type : multiple ? 'checkbox' : 'radio',
				name : 'list_' + name,
				onchange : List.itemChange,
				value : list[i].value
			});
			value.appendChild(selector);
			item.appendChild(value);
			
			if (Number(list[i].selected) || checked(list[i].value)) 
			{
				DOM.addClassName(item, 'list-item-selected');
				selector.checked = true;
			}
			
			tbody.appendChild(item);
		}
	}
	
	filter_box.focus();
	
	return this;
};

List.selectEvent = function (event)
{
	if (DOM.eventTarget(event).tagName.toLowerCase() != 'input')
	{
		var input = this.lastChild.firstChild;
		input.checked = !input.checked;
		List.displayCheck(input);
	}
};

List.itemChange = function (event)
{
	List.displayCheck(this);
};

List.displayCheck = function (input)
{
	var options = input.type == 'checkbox' ? [input] : DOM.up(input, 'table').getElementsByTagName('input');

	for (var i = 0; i < options.length; i++)
	{
		DOM[(options[i].checked ? 'add' : 'remove') + 'ClassName' ](DOM.up(options[i], 'tr'), 'list-item-selected');
	}
};

List.checkedItems = function (source, multiple)
{
	if (multiple) multiple = [];
	var items = source.getElementsByTagName('input');
	
	for (var i = 0; i < items.length; i++)
	{
		if (items[i].checked) 
		{
			var item = {label : items[i].parentNode.parentNode.firstChild.innerHTML, value : items[i].value};
			if (multiple)
				multiple.push(item);
			else return item;
		}
	}
	
	return (multiple ? multiple : null);
};

var Tooltip = function (id)
{
	this._element = DOM.create('div', {
		'class' : 'tooltip',
		id : id || uniqid()
	});
	
	this._element.appendChild(this._textElement = DOM.create('p', {'class' : 'text'}));
	
	this._element.appendChild(this._arrowElement = DOM.create('div', {'class' : 'arrow'}));
	
	this.show = (function(target, message, position){
		
		this._position = Tooltip._positions.indexOf(position) != -1 ? position : 'top';
		
		this._element.className = 'tooltip ' + this._position;
		
		this._target = target;
		
		this._message = message;
		
		DOM.setPosition(this._element, -1000, -1000);
		
		this._element.firstChild.innerHTML = message;
		
		DOM.appear(this._element, {delay:70});
		
		document.body.appendChild(this._element);
		
		this._updatePosition();
		
	}).bind(this);
	
	
	this.hide = (function(){
		
		if (this._element)
		{
			this._target = null;
			DOM.hide(this._element);
		}
		
	}).bind(this);
	
	this._updatePosition = (function(){

		if (this._target)
		{
			var offset = DOM.cumulativeOffset(this._target), x, y;
		
			switch (this._position)
			{
				case 'top':
					x = offset.left;
					y = offset.top - DOM.height(this._element);
					break;
					
				case 'bottom':
					x = offset.left;
					y = offset.top + DOM.height(this._target);
					break;
					
				case 'left':
					x = offset.left - DOM.width(this._element);
					y = offset.top;
					break;
					
				case 'right':
					x = offset.left + DOM.width(this._target);
					y = offset.top;
					break;
			}
			
			DOM.setPosition(this._element, x, y);
		}
		
	}).bind(this);
	
	Tooltip._instances.push(this);
};

Tooltip._instances = [];

Tooltip._positions = ['top', 'bottom', 'left', 'right'];

Tooltip._resizeListener = function ()
{
	for (var i = 0; i < Tooltip._instances.length; i++)
	{
		Tooltip._instances[i]._updatePosition();
	}
};
	
Browser.registerOnLoad(function(){
	
	Tooltip.main = new Tooltip('tooltip');
	
	Tooltip.main._mouseOverListener = function (event)
	{
		var target = DOM.eventTarget(event);
		
		if (target.className == 'tooltip_icon')
		{
			try 
			{
				Tooltip.main.show(target, DOM.children(target)[0].innerHTML);
				DOM.addEvent(target, 'mouseout', Tooltip.main._mouseOutListener);
			}
			catch (e){}
		}
	};
	
	Tooltip.main._mouseOutListener = function (event)
	{
		DOM.removeEvent(Tooltip.main._target, 'mouseout', Tooltip.main._mouseOutListener);
		Tooltip.main.hide();
	};
	
	DOM.addEvent(document.body, 'mouseover', Tooltip.main._mouseOverListener);
	DOM.addEvent(window, 'resize', Tooltip._resizeListener);
	
});

var StatusMessages = {
	
	interval: null, 
	
	queue: [],
	
	initialize: function()
	{
		var messages = API.execute('StatusMessages', 'select');
		
		if (messages.length > 0)
		{
			for(var messageId = 0; messageId < messages.length; messageId++)
			{
				API.execute('StatusMessages', 'delete', [messages[messageId]['status_message_id']]);
				StatusMessages.show(messages[messageId]['status_message']);
			}
		}
	},
	
	hide: function(message_id)
	{
		DOM.remove($(message_id));
		
		var currMessages = $('uiStatusMessages').childNodes;
	
		var currBottom = 10;
		
		for(var messageId = 0; messageId < currMessages.length; messageId++)
		{
			currMessages[messageId].style.bottom = currBottom + 'px';
			
			currBottom += currMessages[messageId].offsetHeight + 10;
		}
	},
	
	show: function(message)
	{
		if (StatusMessages.interval == null)
		{
			StatusMessages._addMessage(message);
		}
		else
		{
			StatusMessages.queue.push(message);
		}
	},
	
	_addMessage: function(message)
	{
		if (!$('uiStatusMessages'))
		{
			var uiMessages = DOM.create('div', {
				'id' : 'uiStatusMessages'
			});
			
			document.body.appendChild(uiMessages);
		}
		
		var popupStatusDiv = DOM.create('div', {
			'style': "width: 200px; position: fixed; z-index: 99; right: 10px; bottom: -400px;",
			'id': 'statusMessageDiv' + Math.floor(10000 * Math.random())
		});
		
		var roundedTableDiv = DOM.create('div', {
			'class': 'roundedTable'
		});
		
		var roundedTable = DOM.create('table', {
			'cellpadding': '0',
			'cellspacing': '0',
			'border':      '0',
			'width':	   '100%'
		});
		
		var tableRow = DOM.create('tr');
		var tableRowColumn = DOM.create('td', {
			'style': 'padding: 5px;'
		});
		
		var textDiv = DOM.create('div', {
			'style': 'text-align: left;'
		}, message);
			
		var buttonDiv = DOM.create('div', {
			'style': 'text-align: center; padding-top: 5px;'
		});
		
		var link = DOM.create('a', {
			'href': 'javascript:StatusMessages.hide("' + popupStatusDiv.id + '");'
		});
		
		var button = DOM.create('img', {
			'src': Request.get('basepath') + '/images/' + CURRENT_LANG + '/btnClose.jpg',
			'style': 'cursor: pointer;'
		});
		
		link.appendChild(button);
		buttonDiv.appendChild(link);
		
		tableRowColumn.appendChild(textDiv);
		tableRowColumn.appendChild(buttonDiv);
		tableRow.appendChild(tableRowColumn);
		
		roundedTable.appendChild(tableRow);
		
		roundedTableDiv.appendChild(roundedTable);
		
		popupStatusDiv.appendChild(roundedTableDiv);
			
		var currMessages = $('uiStatusMessages').childNodes;
	
		if (currMessages.length == 0)
		{
			MAX_BOTTOM = 10;
		}
		else
		{
			MAX_BOTTOM = Number(currMessages[currMessages.length - 1].style.bottom.substring(0, currMessages[currMessages.length - 1].style.bottom.length - 2)) + currMessages[currMessages.length - 1].offsetHeight + 10;
		}
		
		$('uiStatusMessages').appendChild(popupStatusDiv);
		
		roundTables();
		
		popupStatusDiv.style.bottom = -(popupStatusDiv.offsetHeight + 30) + 'px';
		
		StatusMessages.interval = window.setInterval(function(){
			var currBottom = Number(popupStatusDiv.style.bottom.substring(0, popupStatusDiv.style.bottom.length - 2));
			currBottom += 5;
			
			if (currBottom > MAX_BOTTOM)
			{
				currBottom = MAX_BOTTOM;
				window.clearInterval(StatusMessages.interval);
				StatusMessages.interval = null;
				if (StatusMessages.queue.length > 0)
				{
					var nextMsg = StatusMessages.queue.shift();
					StatusMessages._addMessage(nextMsg);
				}
			}
			popupStatusDiv.style.bottom = currBottom + 'px';
		}, 10);
	}	
	
};


