// Welcome!
//
// RedCloud Framework is a Statix Framework's Client-part class library
// based on the Prototype library (http://prototype.conio.net/) ver >= 1.5
// Полный комплект файлов содержит:
// - iinetio.js (ядро IncludeINETIO, подключает остальные модули)
//
// Планируется:
//
// Требуемые файлы:
// prototype.js (версии 1.5.0 или выше)

var IncInetio = {
	frameworkVersion: '2.0',
	prototypeConnected: parseFloat(Prototype.Version.split(".")[0] + "." + Prototype.Version.split(".")[1]),
	connectlib: function(libIdentifier) {
		document.write('<script type="text/javascript" src="'+libIdentifier+'"></script>');
	},
	loadinetio: function() {
		if(this.prototypeConnected < 1.5)
		throw("Inetio Design Include Framework 1.0 requires the Prototype framework of version 1.5.0 or higher");

		// scriptaculous brute-force including method ;)
		/*$A(document.getElementsByTagName("script")).findAll( function(s) {
			return (s.src && s.src.match(/iinetio\.js(\?.*)?$/))
		}).each( function(s) {
			var path = s.src.replace(/iinetio\.js(\?.*)?$/,'');
			var includes = s.src.match(/\?.*load=([a-z,]*)/);
			(includes ? includes[1] :
				'').split(',').each(
				function(include) {
					IncInetio.connectlib(path+include+'.js')
				});
		});*/
	}	
}

// Загружаем RedCloud
IncInetio.loadinetio();

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

// Функция для определения статуса DOMReady
Object.extend(Event, {
	_domReady : function() {
		if (arguments.callee.done) return;
		arguments.callee.done = true;

		if (this._timer)  clearInterval(this._timer);
    
		this._readyCallbacks.each(function(f) { f() });
		this._readyCallbacks = null;
	},
	onDOMReady : function(f) {
		if (!this._readyCallbacks) {
			var domReady = this._domReady.bind(this);

			if (document.addEventListener)
				document.addEventListener("DOMContentLoaded", domReady, false);
			
			/*@cc_on @*/
			/*@if (@_win32)
				document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
				document.getElementById("__ie_onload").onreadystatechange = function() {
					if (this.readyState == "complete") domReady(); 
				};
			/*@end @*/
			
			if (/WebKit/i.test(navigator.userAgent)) { 
				this._timer = setInterval(function() {
					if (/loaded|complete/.test(document.readyState)) domReady(); 
				}, 10);
			}
			
			Event.observe(window, 'load', domReady);
			Event._readyCallbacks =  [];
		}
		Event._readyCallbacks.push(f);
	}
});



// Функция для возрашения даты в определенным формате
Date.prototype.getFormat = getDateFormat;
function getDateFormat(format) 
{
	if (format == 'YYYY-MM-DD')
		return this.getFullYear()+'-'+(this.getMonth()+1)+'-'+this.getDate();
}

var ControlsDispatcher = Class.create();
ControlsDispatcher.prototype = {
	initialize: function(setups) {

		this.identifier = null; //Идентификатор диспетчера
		this.parameters = ''; // Строка параметров для отправки
		this.ControlsArray = new Array(); // Массив в элементами управления
		this.setups = setups; // Настройки диспетчера в хеше
		this.error = null; // Сообщение об ошибке

		this.status = 'idle';
		this.error = 'Проверьте поля выделенные красным цветом';

		// Раставляем значения настроек по умолчанию
		
		this.setups['sendMethod'] = this.setups['sendMethod'] != null ? this.setups['sendMethod'] : 'post'; // По умолчанию всегда отправляем данные методом post
		this.setups['statusForm'] = this.setups['statusForm'] != null ? this.setups['statusForm'] : null; // По умолчанию всегда отправляем данные методом post
		this.setups['debug'] = this.setups['debug'] != null ? this.setups['debug'] : 0; // По умолчанию всегда отправляем данные методом post
	},

	// Добавляет эллемент управления диспетчеру
	addControl: function(controlIdent, paramName, defaultValue, validationExpr)
	{
		var controlElement = $(controlIdent);
		this.ControlsArray.push([controlElement, defaultValue, validationExpr, paramName]);
	},

	// Формирует строку запроса
	takingsParameters: function()
	{
		var dispatcher = this;

		this.ControlsArray.each(function(controlItem){
			// controlItem[0] - ссылка на элемент управления
			// controlItem[0].id - идентификатор эллемента, идентификатор данных
			// controlItem[0].value - Значение 
			// controlItem[1] - значение по умолчанию
			// controlItem[2] - выражение для валидации
			// controlItem[3] - имя в параметрах

			var defaultValue = controlItem[1];
			var validationExpr = controlItem[2];

			var CtrlValue = controlItem[0].value != '' ? controlItem[0].value : defaultValue;
			var CtrlIdentifier = controlItem[0].id;
			var CtrlName = controlItem[3];

			// Отправим значение для проверки на валидность.
			if (validationExpr != null)
				if (!dispatcher.checkFidelityValue(CtrlValue, validationExpr))
					{dispatcher.nonValidation(controlItem[0]);} else 
					{dispatcher.okValidation(controlItem[0]);}
			
			dispatcher.parameters += dispatcher.parameters != '' ? '&'+"add["+CtrlName+']='+encodeURIComponent(CtrlValue) : ''+"add["+CtrlName+']='+encodeURIComponent(CtrlValue);
		});

	},

	// Проверяет валидность выражения. Если передано наименование какого-либо типа данных, то функция сама подставляет соотвествующее регулярное выражение
	checkFidelityValue: function(value, ValidationExpr)
	{
		var ValidaterArray = new Hash({
			string: '^(.)+$',
			numeric: '^[1-9]([0-9])*$',
			date: '[0-9]{4}\-[0-9]{2}\-[0-9]{2}',
			float: '^([0-9])+(\.)*([0-9])*$',
			email: 'email',
			notemptytext: '(.)+'
		});

		ValidationExpr = ValidaterArray[ValidationExpr] != null ? ValidaterArray[ValidationExpr] : ValidationExpr; //Если есть готовое выражение для этого типа данным то система подставляет его.

		if (ValidationExpr == 'email') {
			ValidationExpr = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
		}

		if (value.match(ValidationExpr))
			return true;
		return false;
	},
	
	// Устанавливает ошибку и выводит сообщение о не правильном вводе данныхю Подсвечивает поля красным цветом
	nonValidation:function (controlItem)
	{
		controlItem.style.background = "#ffaaaa";
		this.status = 'error';
	},

	// Успешная валидация. Делает все поля нормальными
	okValidation:function (controlItem)
	{
		controlItem.style.background = "#fff";
	},

	send: function(container)
	{
		this.takingsParameters();
		
		this.parameters = 'page='+this.page+'&request='+this.request+'&action['+this.action+']=1&'+this.parameters;

		if (this.status == 'error') {
			alert(this.error);
			this.status = 'idle';
		} else {
			if (this.setups['debug'] == 1)
			{
				alert(this.asyncRequestsPageGlobal+'   '+this.parameters);
				return false;
			}

			if (this.request == "sync") {
				this.ControlsArray.each(function(controlItem){
					controlItem[0].form.submit();
				});
				return;
			}

			var status = 'sending';
			this.myAjax = new Ajax.Request(this.asyncRequestsPageGlobal,
				{	method: this.setups['sendMethod'],
					parameters: this.parameters,
					onSuccess: function(asyncRequest) {
						if (container != null) {
							resultDiv = document.createElement('div');
							resultDiv.className = 'result';
							resultDiv.innerHTML = asyncRequest.responseText;
							container.innerHTML = '';
							container.appendChild(resultDiv);
						}
					},
					onFailure: function(asyncRequest) {
						alert('Не удалось отправить асинхронный запрос в классе ControlDispatcher');
					}
				});
		}
	}
}



Object.extend({

hide: function() {
	if (this.style.display)
		this.style.display = 'none';
},

show: function() {
	if (this.style.display)
		this.style.display = '';
}
});


var DataModel = Class.create();
DataModel.prototype = {
	initialize: function() {
		this.Name = null;
	}
}

// Copyright (c) 2007, O2 Interactive
//
// RedCloud Lightbox (redcloud-lightbox.js)
// Требуемые файлы:
// redcloud.js
// scriptaculous/effects.js

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

// Check it out, brotha
//if(typeof Effect == 'undefined')
//	throw("RedCloud Lightbox2 Library requires including script.aculo.us Effects lib: effects.js");

// Класс Lightbox
/////////////////////////////////////


var photoGallery = new Array();

function showItem(id, photopage, paramname)
{
	if (photopage == null)
		photopage = "photo";

	if (paramname == null)
		paramname = "id";

	// Устанавливаем набор асинхронных параметров
	pars =	"page="+photopage+"/&"+
			"request=async&"+
			paramname+"="+id;

	// Посылаем асинхронный запрос POST на добавление объявления
	var myAjax = new Ajax.Request(asyncRequestsPageGlobal,
	{	method: 'get',
		parameters: pars,
		onSuccess: function(asyncRequest) {
			$('onephoto').innerHTML = asyncRequest.responseText;
		},
		onFailure: function(asyncRequest) {
			$('onephoto').innerHTML = '<p class="asyncfailed">Асинхронный запрос не был обработан!</p>';
		}
	});
	$('onephoto').scrollIntoView(); 
//	Element.setStyle($('lightboxPhotoItem'), {display:''});
}

function closeGallery()
{
	// Выключаем Lightbox
	thelightboxPhotoItem.switchOff();

	Element.setStyle($('lightboxPhotoItem'), {display:'none'});
}



/////////////////////////////////////
// Функция для определения статуса DOMReady
Object.extend(Event, {
	_domReady : function() {
		if (arguments.callee.done) return;
		arguments.callee.done = true;

		if (this._timer)  clearInterval(this._timer);
    
		this._readyCallbacks.each(function(f) { f() });
		this._readyCallbacks = null;
	},
	onDOMReady : function(f) {
		if (!this._readyCallbacks) {
			var domReady = this._domReady.bind(this);

			if (document.addEventListener)
				document.addEventListener("DOMContentLoaded", domReady, false);
			
			/*@cc_on @*/
			/*@if (@_win32)
				document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
				document.getElementById("__ie_onload").onreadystatechange = function() {
					if (this.readyState == "complete") domReady(); 
				};
			/*@end @*/
			
			if (/WebKit/i.test(navigator.userAgent)) { 
				this._timer = setInterval(function() {
					if (/loaded|complete/.test(document.readyState)) domReady(); 
				}, 10);
			}
			
			Event.observe(window, 'load', domReady);
			Event._readyCallbacks =  [];
		}
		Event._readyCallbacks.push(f);
	}
});

var votingController = Class.create();


votingController.prototype = {

	initialize: function(element, settings) {
		this.votingElement = $(element); // voting Contents form
		this.settings = settings;

		this.opinions = new Array();
		this.checkOpinion = new Array();

		this.setup();
	},

	setup: function() {
		// Определяем настройки рубрики //
		this.debug = this.settings['debug'] ? this.settings['debug'] : 0; 

		// Определим настройки контейнера //
		this.votingStatus = this.settings['votingStatus'] ? this.settings['votingStatus'] : 'votingStatus'; 
		this.divContainer = this.settings['container'] ? this.settings['container'] : 'divVoting'; 

		// Определим настройки сохранения //
		this.identifierPage = this.settings['identifierPage'] ? this.settings['identifierPage'] : 'opinionSaves'; 
		this.request = this.settings['request'] ? this.settings['request'] : 'async';
		this.identifierEvent = this.settings['identifierEvent'] ? this.settings['identifierEvent'] : 'action[addVoting]';

		// Определим настройки эллементов голосования//
		this.opinionElement = this.settings['opinionElement'] ? this.settings['opinionElement'] : 'opinion';
		this.opinionTag = this.settings['opinionTag'] ? this.settings['opinionTag'] : 'input';

		// Найдем нужные нам эллементы
	
		this.makeOpinion();
	},
	
	makeOpinion: function ()
	{
		//Выберем все эллементы нужные нам из контейнера
		var temp = this.votingElement.getElementsByTagName(this.opinionTag);
		for (var index = 0;index < temp.length ; index++)
		{
			//Возьмем только те которые имеют подходящее имя.
			if (temp[index].name == this.opinionElement)
				this.opinions.push(temp[index]);
		}
	},
	
	saveOpinion: function()
	{
		
		var params = "page="+this.identifierPage+"&";		// страница куда отсылается запрос
		params += "request="+this.request+"&";		// общая информация #вид запроса
		params += this.identifierEvent+"=1&"; // общая информация #event
		
		var ticker = 0;
		this.opinions.each(function(opinion)
		{
			if (opinion.checked)
			{
				params += "add[id_votinganswer]["+ticker+"]="+opinion.value+"&";
				ticker++
			}
		});

		if (ticker == 0)
		{
			$(this.votingStatus).innerHTML = '<font color="red">Выберите пожалуйста бы хотя один вариант</font>';
			return false;
		}

		if (this.debug == 1)
		{
			alert(params);
			return true;
		}
			
		var container = $(this.divContainer);
		
		// Посылаем асинхронный запрос POST
		var myAjax = new Ajax.Request(asyncRequestsPageGlobal,
		{	method: 'post',
			parameters: params,
			onSuccess: function(asyncRequest) {
				container.innerHTML = asyncRequest.responseText;
			},

			onFailure: function(asyncRequest) {
				$(this.votingStatus).innerHTML = '<font color="red">Асинхронный запрос не был обработан!</font>';
			}
		});

		return true;
	}
}



var MaxID = 2;
var ID_VotingQuest = -1;

function fillOpinions()
{
	elem = $('opinions');
	
	divList = elem.getElementsByTagName('div'); 
	
	var i=0;
	while (i < divList.length)
	{		
		if (divList[i].getAttribute('is_state') == 'del')
		{
			//elem.removeChild(divList[i]);
			divList[i].setAttribute('style', 'display:none;');
			i++;
			continue;
		}		
		spanElem = divList[i].getElementsByTagName('span');
		spanElem[0].innerHTML = 'Ответ ' + (i+1) + ': ';

		i++;
	}
}

//----------------------------	

function addOpinion()
{

	MaxID++;
	NewDiv = document.createElement('div');
	NewDiv.setAttribute('id', 'opinion[' + MaxID + ']');
	NewDiv.setAttribute('id_opinion', '-1');
	NewDiv.setAttribute('is_state', '');
	Element.setStyle(NewDiv, {'margin-bottom': '5px'});
	NewDiv.innerHTML = "<nobr>" +
						"<span  style='wisth:150px;margin-right:20px'></span>" +
						"<input type='text' id='opinionText[" + MaxID + "]' name='opinionText[" + MaxID + "]'/> " +
						"<input type='button' value='-' onClick=\"delOpinion('opinion[" + MaxID + "]');\"/>" +
					"</nobr>";
			
	elem = $('opinions');
	elem.appendChild(NewDiv);
	fillOpinions();
}

//----------------------------	

function delOpinion(elem_id)
{
	divElem = $(elem_id);
	divElem.setAttribute('is_state', 'del');

	fillOpinions();
}

//----------------------------	

function saveForm()
{
	//проверяем данные
	
	
	//формируем строку запроса
	
	prist = '';
	if (ID_VotingQuest == -1) 
	{
		pars ="page=content/addVoting&request=async&action[addVotingQuest]=1";
		prist='add';
	}
	else
	{
		pars ="page=content/editVoting&request=async&action[editVotingQuest]=1&edit[ID_VotingQuest]=" + ID_VotingQuest;
		prist='edit';
	}
	
	alert($('VotingQuestText').value);
	pars = pars + '&' + prist + '[VotingQuest]=' + $('VotingQuestText').value;

	elem = $('opinions');	
	divList = elem.getElementsByTagName('div'); 
	
	stateAnswer= '';
	id_opinion= -1;
	for (var i=0; i<divList.length; i++)
	{
		
		id_opinion= divList[i].getAttribute('id_opinion');
		pars = pars + '&' + prist + '[ID_VotingAnswer][' + i + ']=' + id_opinion;

			//статус ответа
		if (divList[i].getAttribute('is_state') == 'del')
			stateAnswer = 'del';
		else 
			if (id_opinion == -1)
				stateAnswer = 'add';
			else 
				stateAnswer = 'edit';			
		
		pars = pars + '&' + prist + '[StateAnswer][' + i + ']=' + stateAnswer;		
		
		OpinionElem = divList[i].getElementsByTagName('input');		
		pars = pars + '&' + prist + '[VotingAnswer][' + i + ']=' + OpinionElem[0].value;								
	}


	// Посылаем асинхронный запрос POST
	var myAjax = new Ajax.Request(asyncRequestsPageGlobal,
		{
			method: 'post',
			parameters: pars,
			onSuccess: function(asyncRequest) 
			{
				$('lightboxSubmitContainer').innerHTML = asyncRequest.responseText;
			},
			onFailure: function(asyncRequest) 
			{
				alert('Асинхронный запрос не был обработан!');
			}
		}
	);
	
	ligthboxWindow.hideLightbox();
	//location.replace('content/index');
}


//----------------------------	

function resetForm()
{
	ligthboxWindow.hideLightbox();
}

//----------------------------	

function deleteVoting(index)
{
	
	pars ="page=content/delVoting&request=async&action[delVotingQuest]=1&del[ID_VotingQuest]=" + index;

	// Посылаем асинхронный запрос POST
	var myAjax = new Ajax.Request(asyncRequestsPageGlobal,
		{
			method: 'post',
			parameters: pars,
			onSuccess: function(asyncRequest) 
			{
				$('lightboxSubmitContainer').innerHTML = asyncRequest.responseText;
			},
			onFailure: function(asyncRequest) 
			{
				alert('Асинхронный запрос не был обработан!');
			}
		}
	);
	
	ligthboxWindow.hideLightbox();
	//location.replace('content/index');
}


//----------------------------	

var questController = Class.create();


questController.prototype = {

	initialize: function(settings) {
		this.settings = settings;

		this.setup();
	},

	setup: function() {
		// Определяем настройки рубрики //
		this.debug = this.settings['debug'] ? this.settings['debug'] : 0; 

		// Определим настройки контейнера //
		this.questStatus = this.settings['questStatus'] ? this.settings['questStatus'] : 'questStatus'; 

		// Определим настройки сохранения //
		this.identifierPage = this.settings['identifierPage'] ? this.settings['identifierPage'] : 'opinionSaves'; 
		this.request = this.settings['request'] ? this.settings['request'] : 'async';
		this.identifierEvent = this.settings['identifierEvent'] ? this.settings['identifierEvent'] : 'action[addQuest]';

		// Определим настройки эллементов
		this.authorNameField = this.settings['authorName'] ? this.settings['authorName'] : 'questAuthorName';
		this.authorContactField = this.settings['authorContact'] ? this.settings['authorContact'] : 'questAuthorContact';
		this.textField = this.settings['questText'] ? this.settings['questText'] : 'questText';

	},
	
	
	sendQuest: function()
	{
		var params = "page="+this.identifierPage+"&";		// страница куда отсылается запрос
		params += "request=async&";		// общая информация #вид запроса
		params += "action[addQuest]=1&"; // общая информация #event
		params += "add[QuestAuthorName]="+$(this.authorNameField).value+"&"; // общая информация #event
		params += "add[QuestAuthorCoordinate]="+$(this.authorContactField).value+"&"; // общая информация #event
		params += "add[QuestText]="+$(this.textField).value+"&"; // общая информация #event
		
		if ($(this.authorNameField).value == '')
		{
			$(this.questStatus).innerHTML = '<font color="red">Поле "Ваше имя" должно быть заполнено</font>';
			return false;
		}
		if ($(this.authorContactField).value == '')
		{
			$(this.questStatus).innerHTML = '<font color="red">Поле "Координаты" должно быть заполнено</font>';
			return false;
		}
		if ($(this.textField).value == '')
		{
			$(this.questStatus).innerHTML = '<font color="red">Поле "Вопрос" должно быть заполнено</font>';
			return false;
		}

		if (this.debug == 1)
		{
			alert(params);
			return true;
		}
		// Посылаем асинхронный запрос POST
		var myAjax = new Ajax.Request(asyncRequestsPageGlobal,
		{	method: 'post',
			parameters: params,
			onSuccess: function(asyncRequest) {
				asyncRequest.responseText.evalScripts();
			},
			onFailure: function(asyncRequest) {
				$(this.questStatus).innerHTML = '<font color="red">Асинхронный запрос не был обработан!</font>';
			}
		});	
			$(this.textField).value = "";
		return true;
	}
}

var TNewOrgController = Class.create();


TNewOrgController.prototype = {

	initialize: function(option) 
	{
		this.OrgArr = $H({});
		
		this.FullList = new Boolean(option['view']);

		this.LinkControlDiv = option['LinkControlDiv'];
		this.ContainerDiv = option['ContainerDiv'];

		this.rowTemplate = new String(option['rowTemplate']);
				
	},

//-----------------------------------------------------------------------
	
	drowList: function ()
	{
			
		var RezStr = new String();		

		var Template = this.rowTemplate;
		var FullList = this.FullList;

		var i = 1;
		
		this.OrgArr.each(function(elem)
		{
			
			if ((FullList == false) && (i>3)) return;
			
			var TempStr = Template;
			
			//замена
			TempStr = TempStr.replace(/%ID%/gi,elem.key);			
			TempStr = TempStr.replace(/%NAME%/gi,elem.value['name']);
			TempStr = TempStr.replace(/%ACTIVITY%/gi,elem.value['activity']);

			RezStr+= TempStr;
			i++;
		});


		

		$(this.ContainerDiv).innerHTML = RezStr;
		
	},

//-----------------------------------------------------------------------


	controlLinkClick: function ()
	{
				
		if (this.FullList == true)
		{
			this.FullList = false;
			$(this.LinkControlDiv).getElementsByTagName('a')[0].innerHTML = 'посмотреть все новые организации';
		}
		else
		{
			this.FullList = true;
			$(this.LinkControlDiv).getElementsByTagName('a')[0].innerHTML = 'первые три';
		}


		this.drowList();
	}
	
	
};


//===============================================================


var TOrgController = Class.create();


TOrgController.prototype = {

	initialize: function(option) 
	{
		this.RubricArr = $H({});
		this.OrgArr = $H({});
		
		this.useRubric = new Boolean(option['useRubric']);

		this.ContainerDiv = option['ContainerDiv'];

		this.showPage = 1;
		this.countPage = 10;

			//шаблоны
		this.headTemplate = new String(option['headTemplate']);
		this.rowTemplate = new String(option['rowTemplate']);
		this.infoTemplate = new String(option['infoTemplate']);		
		this.otherLinkTemplate = new String(option['otherLinkTemplate']);
				
	},

//-----------------------------------------------------------------------
	
	drowList: function ()
	{		
		
		var RezStr = new String();	

		var headTemplate = this.headTemplate;
		var linkTemplate = this.otherLinkTemplate;

		//вывод с рубриками или без
		
		if (this.useRubric == true)
		{
			//выводим рубрики с организациями
			
			this.RubricArr.each(function(elem)
			{												
				//получаем организ. данной рубрики
				
				var OrgStr = Org.getOrgBySectionID(elem.key,-1,3);
				if (OrgStr == '') return;
				
				//заголовок
				var TempHead = headTemplate;
								
				TempHead = TempHead.replace(/%NAME%/gi,elem.value['name']);			
				TempHead = TempHead.replace(/%COUNT%/gi,elem.value['count']);

				//ссылка
				var TempLink = linkTemplate;								
				TempLink = TempLink.replace(/%ID%/gi,elem.key);	
				TempLink = TempLink.replace(/%NAME%/gi,elem.value['name']);	

				RezStr+= TempHead + OrgStr + TempLink;
			});

		}
		else
		{						
			
			
			var RecordCount = this.OrgArr.keys().length;
			if (RecordCount == 0) return;

			//выводим организации без рубрик
			var fromRec = (this.showPage-1) * this.countPage;

			RezStr= this.getOrgBySectionID(-1, fromRec, this.countPage);

			//создаём панель выбора страниц
			var optionarr = $H({
					showcount: this.countPage,
					count: RecordCount,
					identpage: this.showPage
			});
									
			var PageBar = new TNumPageBar(optionarr);				 

			RezStr+=  "<br />" + PageBar.makePagebar();
		}
						
		$(this.ContainerDiv).innerHTML = RezStr;
		
	},

//-----------------------------------------------------------------------

		//вернёт все организации секции id в количестве limit начиная с from
		//если id = -1 - не учитывать секции. Если limit = -1 - не лимитировать
	getOrgBySectionID: function(id,from, limit)
	{
		
		var RezStr = new String('');		

		var Template = this.rowTemplate;
		var InfoTemplate = this.infoTemplate;
		var fromI = 1;
		var i = 1;
		
		this.OrgArr.each(function(elem)
		{
			if ((id != -1) && (elem.value['section'] != id)) return;  //фильтр по секции			
			
			//сколько записей пропустить
			if ((from != -1) && (fromI <= from))
			{
				fromI++;
				return;
			}
			
			if ((limit != -1) && (i>limit)) return;	//фильтр по лимиту
						
			
			//информация
			var AllInfo = new String('');
			
			var InfoStr = InfoTemplate;
			if (elem.value['ardesrow'] != '')
			{
				InfoStr = InfoTemplate.replace(/%ZAG%/gi,'Адрес:');
				AllInfo+= InfoStr.replace(/%TEXT%/gi,elem.value['ardesrow']);
			}

			if (elem.value['phone'] != '')
			{
				InfoStr = InfoTemplate.replace(/%ZAG%/gi,'Телефон:');
				AllInfo+= InfoStr.replace(/%TEXT%/gi,elem.value['phone']);
			}

			if (elem.value['fax'] != '')
			{
				InfoStr = InfoTemplate.replace(/%ZAG%/gi,'Факс:');
				AllInfo+= InfoStr.replace(/%TEXT%/gi,elem.value['fax']);
			}

			if (elem.value['mail'] != '')
			{
				InfoStr = InfoTemplate.replace(/%ZAG%/gi,'E-mail:');
				AllInfo+= InfoStr.replace(/%TEXT%/gi,'<a href="mailto:' + elem.value['mail'] + '">' + elem.value['mail'] + '</a>');
			}

			if (elem.value['url'] != '')
			{
				InfoStr = InfoTemplate.replace(/%ZAG%/gi,'Сайт:');
				AllInfo+= InfoStr.replace(/%TEXT%/gi,'<a href="' + elem.value['url'] + '">' + elem.value['url'] + '</a>');
			}			

			
			//организация
			var TempStr = Template;
		
			//замена
			TempStr = TempStr.replace(/%ID%/gi,elem.key);			
			TempStr = TempStr.replace(/%NAME%/gi,elem.value['name']);
			TempStr = TempStr.replace(/%ACTIVITY%/gi,elem.value['activity']);
			TempStr = TempStr.replace(/%INFO%/gi, AllInfo);

			





			RezStr+= TempStr;
			i++;
		});


		return RezStr;
	},

//-----------------------------------------------------------------------

	changeCountPage: function(num)
	{	
		this.countPage = num;
		this.drowList();

	},

//-----------------------------------------------------------------------

	changeShowPage: function(num)
	{
		this.showPage = num;
		this.drowList();
	}

//-----------------------------------------------------------------------

};



//===============================================================



var TNumPageBar = Class.create();


TNumPageBar.prototype = {

	initialize: function(option) 
	{
		this.showcount = option['showcount'];
		this.count = option['count'];
		this.identpage = option['identpage'];		
	},

//-----------------------------------------------------------------------

	makePagebar: function()
	{
		
		//количество страниц
		var RezStr = "<form method='post' action='' class='pages'>Выводить по&#160;<select onChange='javascript: Org.changeCountPage(this.value);'>";
		
		for (var i=1; i<=3; i++)
		{
			var tmpval = i*10;
			if (tmpval == this.showcount) RezStr+= "<option selected value='" + tmpval + "'>" + tmpval + "</option>";
			else RezStr+= "<option value='" + tmpval + "'>" + tmpval + "</option>";
		}
		
		RezStr+= "</select></form>";																		


		//номера страниц

		RezStr+= "<div class='pages'>Страницы:&#160;";

				

		var pageCount = Math.ceil(this.count / this.showcount);

		for (var i=1; i <= pageCount; i++)
		{
			if (i == this.identpage)
				RezStr+= "<span>" + i + "</span>&#160;";				
			else
				RezStr+= "<a href='javascript: Org.changeShowPage(" + i + ")'>" + i + "</a>&#160;";
		}
		
		RezStr+="</div>";	
		
		return RezStr;
	}


}


//===============================================================

// BEGIN:Logic work Internet magazine //

function addWare(id_ware)
{
	params = "page=index";
	params += "&request=async";
	params += "&action[putWare]=1";
	params += "&fields[ID_Produce]="+id_ware;
	// Посылаем асинхронный запрос POST			
	var myAjax = new Ajax.Request(asyncRequestsPageGlobal,
		{
			method: 'post',
			parameters: params,
			onSuccess: function(asyncRequest) 
			{
				$('containerQuestAdmin').innerHTML = asyncRequest.responseText;
				asyncRequest.responseText.evalScripts();
			},
			onFailure: function(asyncRequest) 
			{
				alert('Асинхронный запрос не был обработан!');
			}
		}
	);	
}
// END:Logic work Internet magazine //

// script.aculo.us builder.js v1.7.0, Fri Jan 19 19:16:36 CET 2007

// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

var Builder = {
  NODEMAP: {
    AREA: 'map',
    CAPTION: 'table',
    COL: 'table',
    COLGROUP: 'table',
    LEGEND: 'fieldset',
    OPTGROUP: 'select',
    OPTION: 'select',
    PARAM: 'object',
    TBODY: 'table',
    TD: 'table',
    TFOOT: 'table',
    TH: 'table',
    THEAD: 'table',
    TR: 'table'
  },
  // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
  //       due to a Firefox bug
  node: function(elementName) {
    elementName = elementName.toUpperCase();
    
    // try innerHTML approach
    var parentTag = this.NODEMAP[elementName] || 'div';
    var parentElement = document.createElement(parentTag);
    try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
      parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
    } catch(e) {}
    var element = parentElement.firstChild || null;
      
    // see if browser added wrapping tags
    if(element && (element.tagName.toUpperCase() != elementName))
      element = element.getElementsByTagName(elementName)[0];
    
    // fallback to createElement approach
    if(!element) element = document.createElement(elementName);
    
    // abort if nothing could be created
    if(!element) return;

    // attributes (or text)
    if(arguments[1])
      if(this._isStringOrNumber(arguments[1]) ||
        (arguments[1] instanceof Array)) {
          this._children(element, arguments[1]);
        } else {
          var attrs = this._attributes(arguments[1]);
          if(attrs.length) {
            try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
              parentElement.innerHTML = "<" +elementName + " " +
                attrs + "></" + elementName + ">";
            } catch(e) {}
            element = parentElement.firstChild || null;
            // workaround firefox 1.0.X bug
            if(!element) {
              element = document.createElement(elementName);
              for(attr in arguments[1]) 
                element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
            }
            if(element.tagName.toUpperCase() != elementName)
              element = parentElement.getElementsByTagName(elementName)[0];
            }
        } 

    // text, or array of children
    if(arguments[2])
      this._children(element, arguments[2]);

     return element;
  },
  _text: function(text) {
     return document.createTextNode(text);
  },

  ATTR_MAP: {
    'className': 'class',
    'htmlFor': 'for'
  },

  _attributes: function(attributes) {
    var attrs = [];
    for(attribute in attributes)
      attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
          '="' + attributes[attribute].toString().escapeHTML() + '"');
    return attrs.join(" ");
  },
  _children: function(element, children) {
    if(typeof children=='object') { // array can hold nodes and text
      children.flatten().each( function(e) {
        if(typeof e=='object')
          element.appendChild(e)
        else
          if(Builder._isStringOrNumber(e))
            element.appendChild(Builder._text(e));
      });
    } else
      if(Builder._isStringOrNumber(children)) 
         element.appendChild(Builder._text(children));
  },
  _isStringOrNumber: function(param) {
    return(typeof param=='string' || typeof param=='number');
  },
  build: function(html) {
    var element = this.node('div');
    $(element).update(html.strip());
    return element.down();
  },
  dump: function(scope) { 
    if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope 
  
    var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
      "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
      "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
      "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
      "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
      "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
  
    tags.each( function(tag){ 
      scope[tag] = function() { 
        return Builder.node.apply(Builder, [tag].concat($A(arguments)));  
      } 
    });
  }
}

// script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007

// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// Contributors:
//  Justin Palmer (http://encytemedia.com/)
//  Mark Pilgrim (http://diveintomark.org/)
//  Martin Bialasinki
// 
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/ 

// converts rgb() and #xxx to #xxxxxx format,  
// returns self (or first argument) if not convertable  
String.prototype.parseColor = function() {  
  var color = '#';
  if(this.slice(0,4) == 'rgb(') {  
    var cols = this.slice(4,this.length-1).split(',');  
    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);  
  } else {  
    if(this.slice(0,1) == '#') {  
      if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
      if(this.length==7) color = this.toLowerCase();  
    }  
  }  
  return(color.length==7 ? color : (arguments[0] || this));  
}

/*--------------------------------------------------------------------------*/

Element.collectTextNodes = function(element) {  
  return $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue : 
      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
  }).flatten().join('');
}

Element.collectTextNodesIgnoreClass = function(element, className) {  
  return $A($(element).childNodes).collect( function(node) {
    return (node.nodeType==3 ? node.nodeValue : 
      ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
        Element.collectTextNodesIgnoreClass(node, className) : ''));
  }).flatten().join('');
}

Element.setContentZoom = function(element, percent) {
  element = $(element);  
  element.setStyle({fontSize: (percent/100) + 'em'});   
  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
  return element;
}

Element.getOpacity = function(element){
  return $(element).getStyle('opacity');
}

Element.setOpacity = function(element, value){
  return $(element).setStyle({opacity:value});
}

Element.getInlineOpacity = function(element){
  return $(element).style.opacity || '';
}

Element.forceRerendering = function(element) {
  try {
    element = $(element);
    var n = document.createTextNode(' ');
    element.appendChild(n);
    element.removeChild(n);
  } catch(e) { }
};

/*--------------------------------------------------------------------------*/

Array.prototype.call = function() {
  var args = arguments;
  this.each(function(f){ f.apply(this, args) });
}

/*--------------------------------------------------------------------------*/

var Effect = {
  _elementDoesNotExistError: {
    name: 'ElementDoesNotExistError',
    message: 'The specified DOM element does not exist, but is required for this effect to operate'
  },
  tagifyText: function(element) {
    if(typeof Builder == 'undefined')
      throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
      
    var tagifyStyle = 'position:relative';
    if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
    
    element = $(element);
    $A(element.childNodes).each( function(child) {
      if(child.nodeType==3) {
        child.nodeValue.toArray().each( function(character) {
          element.insertBefore(
            Builder.node('span',{style: tagifyStyle},
              character == ' ' ? String.fromCharCode(160) : character), 
              child);
        });
        Element.remove(child);
      }
    });
  },
  multiple: function(element, effect) {
    var elements;
    if(((typeof element == 'object') || 
        (typeof element == 'function')) && 
       (element.length))
      elements = element;
    else
      elements = $(element).childNodes;
      
    var options = Object.extend({
      speed: 0.1,
      delay: 0.0
    }, arguments[2] || {});
    var masterDelay = options.delay;

    $A(elements).each( function(element, index) {
      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
    });
  },
  PAIRS: {
    'slide':  ['SlideDown','SlideUp'],
    'blind':  ['BlindDown','BlindUp'],
    'appear': ['Appear','Fade']
  },
  toggle: function(element, effect) {
    element = $(element);
    effect = (effect || 'appear').toLowerCase();
    var options = Object.extend({
      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
    }, arguments[2] || {});
    Effect[element.visible() ? 
      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
  }
};

var Effect2 = Effect; // deprecated

/* ------------- transitions ------------- */

Effect.Transitions = {
  linear: Prototype.K,
  sinoidal: function(pos) {
    return (-Math.cos(pos*Math.PI)/2) + 0.5;
  },
  reverse: function(pos) {
    return 1-pos;
  },
  flicker: function(pos) {
    return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
  },
  wobble: function(pos) {
    return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
  },
  pulse: function(pos, pulses) { 
    pulses = pulses || 5; 
    return (
      Math.round((pos % (1/pulses)) * pulses) == 0 ? 
            ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
        1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
      );
  },
  none: function(pos) {
    return 0;
  },
  full: function(pos) {
    return 1;
  }
};

/* ------------- core effects ------------- */

Effect.ScopedQueue = Class.create();
Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
  initialize: function() {
    this.effects  = [];
    this.interval = null;
  },
  _each: function(iterator) {
    this.effects._each(iterator);
  },
  add: function(effect) {
    var timestamp = new Date().getTime();
    
    var position = (typeof effect.options.queue == 'string') ? 
      effect.options.queue : effect.options.queue.position;
    
    switch(position) {
      case 'front':
        // move unstarted effects after this effect  
        this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
            e.startOn  += effect.finishOn;
            e.finishOn += effect.finishOn;
          });
        break;
      case 'with-last':
        timestamp = this.effects.pluck('startOn').max() || timestamp;
        break;
      case 'end':
        // start effect after last queued effect has finished
        timestamp = this.effects.pluck('finishOn').max() || timestamp;
        break;
    }
    
    effect.startOn  += timestamp;
    effect.finishOn += timestamp;

    if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
      this.effects.push(effect);
    
    if(!this.interval) 
      this.interval = setInterval(this.loop.bind(this), 15);
  },
  remove: function(effect) {
    this.effects = this.effects.reject(function(e) { return e==effect });
    if(this.effects.length == 0) {
      clearInterval(this.interval);
      this.interval = null;
    }
  },
  loop: function() {
    var timePos = new Date().getTime();
    for(var i=0, len=this.effects.length;i<len;i++) 
      if(this.effects[i]) this.effects[i].loop(timePos);
  }
});

Effect.Queues = {
  instances: $H(),
  get: function(queueName) {
    if(typeof queueName != 'string') return queueName;
    
    if(!this.instances[queueName])
      this.instances[queueName] = new Effect.ScopedQueue();
      
    return this.instances[queueName];
  }
}
Effect.Queue = Effect.Queues.get('global');

Effect.DefaultOptions = {
  transition: Effect.Transitions.sinoidal,
  duration:   1.0,   // seconds
  fps:        60.0,  // max. 60fps due to Effect.Queue implementation
  sync:       false, // true for combining
  from:       0.0,
  to:         1.0,
  delay:      0.0,
  queue:      'parallel'
}

Effect.Base = function() {};
Effect.Base.prototype = {
  position: null,
  start: function(options) {
    this.options      = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
    this.currentFrame = 0;
    this.state        = 'idle';
    this.startOn      = this.options.delay*1000;
    this.finishOn     = this.startOn + (this.options.duration*1000);
    this.event('beforeStart');
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        'global' : this.options.queue.scope).add(this);
  },
  loop: function(timePos) {
    if(timePos >= this.startOn) {
      if(timePos >= this.finishOn) {
        this.render(1.0);
        this.cancel();
        this.event('beforeFinish');
        if(this.finish) this.finish(); 
        this.event('afterFinish');
        return;  
      }
      var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
      var frame = Math.round(pos * this.options.fps * this.options.duration);
      if(frame > this.currentFrame) {
        this.render(pos);
        this.currentFrame = frame;
      }
    }
  },
  render: function(pos) {
    if(this.state == 'idle') {
      this.state = 'running';
      this.event('beforeSetup');
      if(this.setup) this.setup();
      this.event('afterSetup');
    }
    if(this.state == 'running') {
      if(this.options.transition) pos = this.options.transition(pos);
      pos *= (this.options.to-this.options.from);
      pos += this.options.from;
      this.position = pos;
      this.event('beforeUpdate');
      if(this.update) this.update(pos);
      this.event('afterUpdate');
    }
  },
  cancel: function() {
    if(!this.options.sync)
      Effect.Queues.get(typeof this.options.queue == 'string' ? 
        'global' : this.options.queue.scope).remove(this);
    this.state = 'finished';
  },
  event: function(eventName) {
    if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
    if(this.options[eventName]) this.options[eventName](this);
  },
  inspect: function() {
    var data = $H();
    for(property in this)
      if(typeof this[property] != 'function') data[property] = this[property];
    return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
  }
}

Effect.Parallel = Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
  initialize: function(effects) {
    this.effects = effects || [];
    this.start(arguments[1]);
  },
  update: function(position) {
    this.effects.invoke('render', position);
  },
  finish: function(position) {
    this.effects.each( function(effect) {
      effect.render(1.0);
      effect.cancel();
      effect.event('beforeFinish');
      if(effect.finish) effect.finish(position);
      effect.event('afterFinish');
    });
  }
});

Effect.Event = Class.create();
Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
  initialize: function() {
    var options = Object.extend({
      duration: 0
    }, arguments[0] || {});
    this.start(options);
  },
  update: Prototype.emptyFunction
});

Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    // make this work on IE on elements without 'layout'
    if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
      this.element.setStyle({zoom: 1});
    var options = Object.extend({
      from: this.element.getOpacity() || 0.0,
      to:   1.0
    }, arguments[1] || {});
    this.start(options);
  },
  update: function(position) {
    this.element.setOpacity(position);
  }
});

Effect.Move = Class.create();
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      x:    0,
      y:    0,
      mode: 'relative'
    }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
    // Bug in Opera: Opera returns the "real" position of a static element or
    // relative element that does not have top/left explicitly set.
    // ==> Always set top and left for position relative elements in your stylesheets 
    // (to 0 if you do not need them) 
    this.element.makePositioned();
    this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
    this.originalTop  = parseFloat(this.element.getStyle('top')  || '0');
    if(this.options.mode == 'absolute') {
      // absolute movement, so we need to calc deltaX and deltaY
      this.options.x = this.options.x - this.originalLeft;
      this.options.y = this.options.y - this.originalTop;
    }
  },
  update: function(position) {
    this.element.setStyle({
      left: Math.round(this.options.x  * position + this.originalLeft) + 'px',
      top:  Math.round(this.options.y  * position + this.originalTop)  + 'px'
    });
  }
});

// for backwards compatibility
Effect.MoveBy = function(element, toTop, toLeft) {
  return new Effect.Move(element, 
    Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
};

Effect.Scale = Class.create();
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
  initialize: function(element, percent) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      scaleX: true,
      scaleY: true,
      scaleContent: true,
      scaleFromCenter: false,
      scaleMode: 'box',        // 'box' or 'contents' or {} with provided values
      scaleFrom: 100.0,
      scaleTo:   percent
    }, arguments[2] || {});
    this.start(options);
  },
  setup: function() {
    this.restoreAfterFinish = this.options.restoreAfterFinish || false;
    this.elementPositioning = this.element.getStyle('position');
    
    this.originalStyle = {};
    ['top','left','width','height','fontSize'].each( function(k) {
      this.originalStyle[k] = this.element.style[k];
    }.bind(this));
      
    this.originalTop  = this.element.offsetTop;
    this.originalLeft = this.element.offsetLeft;
    
    var fontSize = this.element.getStyle('font-size') || '100%';
    ['em','px','%','pt'].each( function(fontSizeType) {
      if(fontSize.indexOf(fontSizeType)>0) {
        this.fontSize     = parseFloat(fontSize);
        this.fontSizeType = fontSizeType;
      }
    }.bind(this));
    
    this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
    
    this.dims = null;
    if(this.options.scaleMode=='box')
      this.dims = [this.element.offsetHeight, this.element.offsetWidth];
    if(/^content/.test(this.options.scaleMode))
      this.dims = [this.element.scrollHeight, this.element.scrollWidth];
    if(!this.dims)
      this.dims = [this.options.scaleMode.originalHeight,
                   this.options.scaleMode.originalWidth];
  },
  update: function(position) {
    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
    if(this.options.scaleContent && this.fontSize)
      this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
    this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
  },
  finish: function(position) {
    if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
  },
  setDimensions: function(height, width) {
    var d = {};
    if(this.options.scaleX) d.width = Math.round(width) + 'px';
    if(this.options.scaleY) d.height = Math.round(height) + 'px';
    if(this.options.scaleFromCenter) {
      var topd  = (height - this.dims[0])/2;
      var leftd = (width  - this.dims[1])/2;
      if(this.elementPositioning == 'absolute') {
        if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
        if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
      } else {
        if(this.options.scaleY) d.top = -topd + 'px';
        if(this.options.scaleX) d.left = -leftd + 'px';
      }
    }
    this.element.setStyle(d);
  }
});

Effect.Highlight = Class.create();
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
    this.start(options);
  },
  setup: function() {
    // Prevent executing on elements not in the layout flow
    if(this.element.getStyle('display')=='none') { this.cancel(); return; }
    // Disable background image during the effect
    this.oldStyle = {};
    if (!this.options.keepBackgroundImage) {
      this.oldStyle.backgroundImage = this.element.getStyle('background-image');
      this.element.setStyle({backgroundImage: 'none'});
    }
    if(!this.options.endcolor)
      this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
    if(!this.options.restorecolor)
      this.options.restorecolor = this.element.getStyle('background-color');
    // init color calculations
    this._base  = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
    this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
  },
  update: function(position) {
    this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
      return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
  },
  finish: function() {
    this.element.setStyle(Object.extend(this.oldStyle, {
      backgroundColor: this.options.restorecolor
    }));
  }
});

Effect.ScrollTo = Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    this.start(arguments[1] || {});
  },
  setup: function() {
    Position.prepare();
    var offsets = Position.cumulativeOffset(this.element);
    if(this.options.offset) offsets[1] += this.options.offset;
    var max = window.innerHeight ? 
      window.height - window.innerHeight :
      document.body.scrollHeight - 
        (document.documentElement.clientHeight ? 
          document.documentElement.clientHeight : document.body.clientHeight);
    this.scrollStart = Position.deltaY;
    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
  },
  update: function(position) {
    Position.prepare();
    window.scrollTo(Position.deltaX, 
      this.scrollStart + (position*this.delta));
  }
});

/* ------------- combination effects ------------- */

Effect.Fade = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  var options = Object.extend({
  from: element.getOpacity() || 1.0,
  to:   0.0,
  afterFinishInternal: function(effect) { 
    if(effect.options.to!=0) return;
    effect.element.hide().setStyle({opacity: oldOpacity}); 
  }}, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Effect.Appear = function(element) {
  element = $(element);
  var options = Object.extend({
  from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
  to:   1.0,
  // force Safari to render floated elements properly
  afterFinishInternal: function(effect) {
    effect.element.forceRerendering();
  },
  beforeSetup: function(effect) {
    effect.element.setOpacity(effect.options.from).show(); 
  }}, arguments[1] || {});
  return new Effect.Opacity(element,options);
}

Effect.Puff = function(element) {
  element = $(element);
  var oldStyle = { 
    opacity: element.getInlineOpacity(), 
    position: element.getStyle('position'),
    top:  element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height
  };
  return new Effect.Parallel(
   [ new Effect.Scale(element, 200, 
      { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
     new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
     Object.extend({ duration: 1.0, 
      beforeSetupInternal: function(effect) {
        Position.absolutize(effect.effects[0].element)
      },
      afterFinishInternal: function(effect) {
         effect.effects[0].element.hide().setStyle(oldStyle); }
     }, arguments[1] || {})
   );
}

Effect.BlindUp = function(element) {
  element = $(element);
  element.makeClipping();
  return new Effect.Scale(element, 0,
    Object.extend({ scaleContent: false, 
      scaleX: false, 
      restoreAfterFinish: true,
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping();
      } 
    }, arguments[1] || {})
  );
}

Effect.BlindDown = function(element) {
  element = $(element);
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({ 
    scaleContent: false, 
    scaleX: false,
    scaleFrom: 0,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
    },  
    afterFinishInternal: function(effect) {
      effect.element.undoClipping();
    }
  }, arguments[1] || {}));
}

Effect.SwitchOff = function(element) {
  element = $(element);
  var oldOpacity = element.getInlineOpacity();
  return new Effect.Appear(element, Object.extend({
    duration: 0.4,
    from: 0,
    transition: Effect.Transitions.flicker,
    afterFinishInternal: function(effect) {
      new Effect.Scale(effect.element, 1, { 
        duration: 0.3, scaleFromCenter: true,
        scaleX: false, scaleContent: false, restoreAfterFinish: true,
        beforeSetup: function(effect) { 
          effect.element.makePositioned().makeClipping();
        },
        afterFinishInternal: function(effect) {
          effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
        }
      })
    }
  }, arguments[1] || {}));
}

Effect.DropOut = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left'),
    opacity: element.getInlineOpacity() };
  return new Effect.Parallel(
    [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
      new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
    Object.extend(
      { duration: 0.5,
        beforeSetup: function(effect) {
          effect.effects[0].element.makePositioned(); 
        },
        afterFinishInternal: function(effect) {
          effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
        } 
      }, arguments[1] || {}));
}

Effect.Shake = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.getStyle('top'),
    left: element.getStyle('left') };
    return new Effect.Move(element, 
      { x:  20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x:  40, y: 0, duration: 0.1,  afterFinishInternal: function(effect) {
    new Effect.Move(effect.element,
      { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
        effect.element.undoPositioned().setStyle(oldStyle);
  }}) }}) }}) }}) }}) }});
}

Effect.SlideDown = function(element) {
  element = $(element).cleanWhitespace();
  // SlideDown need to have the content of the element wrapped in a container element with fixed height!
  var oldInnerBottom = element.down().getStyle('bottom');
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, Object.extend({ 
    scaleContent: false, 
    scaleX: false, 
    scaleFrom: window.opera ? 0 : 1,
    scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
    restoreAfterFinish: true,
    afterSetup: function(effect) {
      effect.element.makePositioned();
      effect.element.down().makePositioned();
      if(window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping().setStyle({height: '0px'}).show(); 
    },
    afterUpdateInternal: function(effect) {
      effect.element.down().setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
    },
    afterFinishInternal: function(effect) {
      effect.element.undoClipping().undoPositioned();
      effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
    }, arguments[1] || {})
  );
}

Effect.SlideUp = function(element) {
  element = $(element).cleanWhitespace();
  var oldInnerBottom = element.down().getStyle('bottom');
  return new Effect.Scale(element, window.opera ? 0 : 1,
   Object.extend({ scaleContent: false, 
    scaleX: false, 
    scaleMode: 'box',
    scaleFrom: 100,
    restoreAfterFinish: true,
    beforeStartInternal: function(effect) {
      effect.element.makePositioned();
      effect.element.down().makePositioned();
      if(window.opera) effect.element.setStyle({top: ''});
      effect.element.makeClipping().show();
    },  
    afterUpdateInternal: function(effect) {
      effect.element.down().setStyle({bottom:
        (effect.dims[0] - effect.element.clientHeight) + 'px' });
    },
    afterFinishInternal: function(effect) {
      effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
      effect.element.down().undoPositioned();
    }
   }, arguments[1] || {})
  );
}

// Bug in opera makes the TD containing this element expand for a instance after finish 
Effect.Squish = function(element) {
  return new Effect.Scale(element, window.opera ? 1 : 0, { 
    restoreAfterFinish: true,
    beforeSetup: function(effect) {
      effect.element.makeClipping(); 
    },  
    afterFinishInternal: function(effect) {
      effect.element.hide().undoClipping(); 
    }
  });
}

Effect.Grow = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.full
  }, arguments[1] || {});
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: element.getInlineOpacity() };

  var dims = element.getDimensions();    
  var initialMoveX, initialMoveY;
  var moveX, moveY;
  
  switch (options.direction) {
    case 'top-left':
      initialMoveX = initialMoveY = moveX = moveY = 0; 
      break;
    case 'top-right':
      initialMoveX = dims.width;
      initialMoveY = moveY = 0;
      moveX = -dims.width;
      break;
    case 'bottom-left':
      initialMoveX = moveX = 0;
      initialMoveY = dims.height;
      moveY = -dims.height;
      break;
    case 'bottom-right':
      initialMoveX = dims.width;
      initialMoveY = dims.height;
      moveX = -dims.width;
      moveY = -dims.height;
      break;
    case 'center':
      initialMoveX = dims.width / 2;
      initialMoveY = dims.height / 2;
      moveX = -dims.width / 2;
      moveY = -dims.height / 2;
      break;
  }
  
  return new Effect.Move(element, {
    x: initialMoveX,
    y: initialMoveY,
    duration: 0.01, 
    beforeSetup: function(effect) {
      effect.element.hide().makeClipping().makePositioned();
    },
    afterFinishInternal: function(effect) {
      new Effect.Parallel(
        [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
          new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
          new Effect.Scale(effect.element, 100, {
            scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
            sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
        ], Object.extend({
             beforeSetup: function(effect) {
               effect.effects[0].element.setStyle({height: '0px'}).show(); 
             },
             afterFinishInternal: function(effect) {
               effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 
             }
           }, options)
      )
    }
  });
}

Effect.Shrink = function(element) {
  element = $(element);
  var options = Object.extend({
    direction: 'center',
    moveTransition: Effect.Transitions.sinoidal,
    scaleTransition: Effect.Transitions.sinoidal,
    opacityTransition: Effect.Transitions.none
  }, arguments[1] || {});
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    height: element.style.height,
    width: element.style.width,
    opacity: element.getInlineOpacity() };

  var dims = element.getDimensions();
  var moveX, moveY;
  
  switch (options.direction) {
    case 'top-left':
      moveX = moveY = 0;
      break;
    case 'top-right':
      moveX = dims.width;
      moveY = 0;
      break;
    case 'bottom-left':
      moveX = 0;
      moveY = dims.height;
      break;
    case 'bottom-right':
      moveX = dims.width;
      moveY = dims.height;
      break;
    case 'center':  
      moveX = dims.width / 2;
      moveY = dims.height / 2;
      break;
  }
  
  return new Effect.Parallel(
    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
      new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
      new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
    ], Object.extend({            
         beforeStartInternal: function(effect) {
           effect.effects[0].element.makePositioned().makeClipping(); 
         },
         afterFinishInternal: function(effect) {
           effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
       }, options)
  );
}

Effect.Pulsate = function(element) {
  element = $(element);
  var options    = arguments[1] || {};
  var oldOpacity = element.getInlineOpacity();
  var transition = options.transition || Effect.Transitions.sinoidal;
  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
  reverser.bind(transition);
  return new Effect.Opacity(element, 
    Object.extend(Object.extend({  duration: 2.0, from: 0,
      afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
    }, options), {transition: reverser}));
}

Effect.Fold = function(element) {
  element = $(element);
  var oldStyle = {
    top: element.style.top,
    left: element.style.left,
    width: element.style.width,
    height: element.style.height };
  element.makeClipping();
  return new Effect.Scale(element, 5, Object.extend({   
    scaleContent: false,
    scaleX: false,
    afterFinishInternal: function(effect) {
    new Effect.Scale(element, 1, { 
      scaleContent: false, 
      scaleY: false,
      afterFinishInternal: function(effect) {
        effect.element.hide().undoClipping().setStyle(oldStyle);
      } });
  }}, arguments[1] || {}));
};

Effect.Morph = Class.create();
Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
  initialize: function(element) {
    this.element = $(element);
    if(!this.element) throw(Effect._elementDoesNotExistError);
    var options = Object.extend({
      style: {}
    }, arguments[1] || {});
    if (typeof options.style == 'string') {
      if(options.style.indexOf(':') == -1) {
        var cssText = '', selector = '.' + options.style;
        $A(document.styleSheets).reverse().each(function(styleSheet) {
          if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
          else if (styleSheet.rules) cssRules = styleSheet.rules;
          $A(cssRules).reverse().each(function(rule) {
            if (selector == rule.selectorText) {
              cssText = rule.style.cssText;
              throw $break;
            }
          });
          if (cssText) throw $break;
        });
        this.style = cssText.parseStyle();
        options.afterFinishInternal = function(effect){
          effect.element.addClassName(effect.options.style);
          effect.transforms.each(function(transform) {
            if(transform.style != 'opacity')
              effect.element.style[transform.style.camelize()] = '';
          });
        }
      } else this.style = options.style.parseStyle();
    } else this.style = $H(options.style)
    this.start(options);
  },
  setup: function(){
    function parseColor(color){
      if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
      color = color.parseColor();
      return $R(0,2).map(function(i){
        return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
      });
    }
    this.transforms = this.style.map(function(pair){
      var property = pair[0].underscore().dasherize(), value = pair[1], unit = null;

      if(value.parseColor('#zzzzzz') != '#zzzzzz') {
        value = value.parseColor();
        unit  = 'color';
      } else if(property == 'opacity') {
        value = parseFloat(value);
        if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
          this.element.setStyle({zoom: 1});
      } else if(Element.CSS_LENGTH.test(value)) 
        var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/),
          value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null;

      var originalValue = this.element.getStyle(property);
      return $H({ 
        style: property, 
        originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 
        targetValue: unit=='color' ? parseColor(value) : value,
        unit: unit
      });
    }.bind(this)).reject(function(transform){
      return (
        (transform.originalValue == transform.targetValue) ||
        (
          transform.unit != 'color' &&
          (isNaN(transform.originalValue) || isNaN(transform.targetValue))
        )
      )
    });
  },
  update: function(position) {
    var style = $H(), value = null;
    this.transforms.each(function(transform){
      value = transform.unit=='color' ?
        $R(0,2).inject('#',function(m,v,i){
          return m+(Math.round(transform.originalValue[i]+
            (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) : 
        transform.originalValue + Math.round(
          ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
      style[transform.style] = value;
    });
    this.element.setStyle(style);
  }
});

Effect.Transform = Class.create();
Object.extend(Effect.Transform.prototype, {
  initialize: function(tracks){
    this.tracks  = [];
    this.options = arguments[1] || {};
    this.addTracks(tracks);
  },
  addTracks: function(tracks){
    tracks.each(function(track){
      var data = $H(track).values().first();
      this.tracks.push($H({
        ids:     $H(track).keys().first(),
        effect:  Effect.Morph,
        options: { style: data }
      }));
    }.bind(this));
    return this;
  },
  play: function(){
    return new Effect.Parallel(
      this.tracks.map(function(track){
        var elements = [$(track.ids) || $$(track.ids)].flatten();
        return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
      }).flatten(),
      this.options
    );
  }
});

Element.CSS_PROPERTIES = $w(
  'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 
  'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
  'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
  'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
  'fontSize fontWeight height left letterSpacing lineHeight ' +
  'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
  'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
  'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
  'right textIndent top width wordSpacing zIndex');
  
Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;

String.prototype.parseStyle = function(){
  var element = Element.extend(document.createElement('div'));
  element.innerHTML = '<div style="' + this + '"></div>';
  var style = element.down().style, styleRules = $H();
  
  Element.CSS_PROPERTIES.each(function(property){
    if(style[property]) styleRules[property] = style[property]; 
  });
  if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf('opacity') > -1) {
    styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
  }
  return styleRules;
};

Element.morph = function(element, style) {
  new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
  return element;
};

['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( 
  function(f) { Element.Methods[f] = Element[f]; }
);

Element.Methods.visualEffect = function(element, effect, options) {
  s = effect.gsub(/_/, '-').camelize();
  effect_class = s.charAt(0).toUpperCase() + s.substring(1);
  new Effect[effect_class](element, options);
  return $(element);
};

Element.addMethods();

// script.aculo.us dragdrop.js v1.7.0, Fri Jan 19 19:16:36 CET 2007

// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//           (c) 2005, 2006 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
// 
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

if(typeof Effect == 'undefined')
  throw("dragdrop.js requires including script.aculo.us' effects.js library");

var Droppables = {
  drops: [],

  remove: function(element) {
    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
  },

  add: function(element) {
    element = $(element);
    var options = Object.extend({
      greedy:     true,
      hoverclass: null,
      tree:       false
    }, arguments[1] || {});

    // cache containers
    if(options.containment) {
      options._containers = [];
      var containment = options.containment;
      if((typeof containment == 'object') && 
        (containment.constructor == Array)) {
        containment.each( function(c) { options._containers.push($(c)) });
      } else {
        options._containers.push($(containment));
      }
    }
    
    if(options.accept) options.accept = [options.accept].flatten();

    Element.makePositioned(element); // fix IE
    options.element = element;

    this.drops.push(options);
  },
  
  findDeepestChild: function(drops) {
    deepest = drops[0];
      
    for (i = 1; i < drops.length; ++i)
      if (Element.isParent(drops[i].element, deepest.element))
        deepest = drops[i];
    
    return deepest;
  },

  isContained: function(element, drop) {
    var containmentNode;
    if(drop.tree) {
      containmentNode = element.treeNode; 
    } else {
      containmentNode = element.parentNode;
    }
    return drop._containers.detect(function(c) { return containmentNode == c });
  },
  
  isAffected: function(point, element, drop) {
    return (
      (drop.element!=element) &&
      ((!drop._containers) ||
        this.isContained(element, drop)) &&
      ((!drop.accept) ||
        (Element.classNames(element).detect( 
          function(v) { return drop.accept.include(v) } ) )) &&
      Position.within(drop.element, point[0], point[1]) );
  },

  deactivate: function(drop) {
    if(drop.hoverclass)
      Element.removeClassName(drop.element, drop.hoverclass);
    this.last_active = null;
  },

  activate: function(drop) {
    if(drop.hoverclass)
      Element.addClassName(drop.element, drop.hoverclass);
    this.last_active = drop;
  },

  show: function(point, element) {
    if(!this.drops.length) return;
    var affected = [];
    
    if(this.last_active) this.deactivate(this.last_active);
    this.drops.each( function(drop) {
      if(Droppables.isAffected(point, element, drop))
        affected.push(drop);
    });
        
    if(affected.length>0) {
      drop = Droppables.findDeepestChild(affected);
      Position.within(drop.element, point[0], point[1]);
      if(drop.onHover)
        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
      
      Droppables.activate(drop);
    }
  },

  fire: function(event, element) {
    if(!this.last_active) return;
    Position.prepare();

    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
      if (this.last_active.onDrop) 
        this.last_active.onDrop(element, this.last_active.element, event);
  },

  reset: function() {
    if(this.last_active)
      this.deactivate(this.last_active);
  }
}

var Draggables = {
  drags: [],
  observers: [],
  
  register: function(draggable) {
    if(this.drags.length == 0) {
      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
      this.eventKeypress  = this.keyPress.bindAsEventListener(this);
      
      Event.observe(document, "mouseup", this.eventMouseUp);
      Event.observe(document, "mousemove", this.eventMouseMove);
      Event.observe(document, "keypress", this.eventKeypress);
    }
    this.drags.push(draggable);
  },
  
  unregister: function(draggable) {
    this.drags = this.drags.reject(function(d) { return d==draggable });
    if(this.drags.length == 0) {
      Event.stopObserving(document, "mouseup", this.eventMouseUp);
      Event.stopObserving(document, "mousemove", this.eventMouseMove);
      Event.stopObserving(document, "keypress", this.eventKeypress);
    }
  },
  
  activate: function(draggable) {
    if(draggable.options.delay) { 
      this._timeout = setTimeout(function() { 
        Draggables._timeout = null; 
        window.focus(); 
        Draggables.activeDraggable = draggable; 
      }.bind(this), draggable.options.delay); 
    } else {
      window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
      this.activeDraggable = draggable;
    }
  },
  
  deactivate: function() {
    this.activeDraggable = null;
  },
  
  updateDrag: function(event) {
    if(!this.activeDraggable) return;
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    // Mozilla-based browsers fire successive mousemove events with
    // the same coordinates, prevent needless redrawing (moz bug?)
    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
    this._lastPointer = pointer;
    
    this.activeDraggable.updateDrag(event, pointer);
  },
  
  endDrag: function(event) {
    if(this._timeout) { 
      clearTimeout(this._timeout); 
      this._timeout = null; 
    }
    if(!this.activeDraggable) return;
    this._lastPointer = null;
    this.activeDraggable.endDrag(event);
    this.activeDraggable = null;
  },
  
  keyPress: function(event) {
    if(this.activeDraggable)
      this.activeDraggable.keyPress(event);
  },
  
  addObserver: function(observer) {
    this.observers.push(observer);
    this._cacheObserverCallbacks();
  },
  
  removeObserver: function(element) {  // element instead of observer fixes mem leaks
    this.observers = this.observers.reject( function(o) { return o.element==element });
    this._cacheObserverCallbacks();
  },
  
  notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'
    if(this[eventName+'Count'] > 0)
      this.observers.each( function(o) {
        if(o[eventName]) o[eventName](eventName, draggable, event);
      });
    if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
  },
  
  _cacheObserverCallbacks: function() {
    ['onStart','onEnd','onDrag'].each( function(eventName) {
      Draggables[eventName+'Count'] = Draggables.observers.select(
        function(o) { return o[eventName]; }
      ).length;
    });
  }
}

/*--------------------------------------------------------------------------*/

var Draggable = Class.create();
Draggable._dragging    = {};

Draggable.prototype = {
  initialize: function(element) {
    var defaults = {
      handle: false,
      reverteffect: function(element, top_offset, left_offset) {
        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
        new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
          queue: {scope:'_draggable', position:'end'}
        });
      },
      endeffect: function(element) {
        var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;
        new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity, 
          queue: {scope:'_draggable', position:'end'},
          afterFinish: function(){ 
            Draggable._dragging[element] = false 
          }
        }); 
      },
      zindex: 1000,
      revert: false,
      scroll: false,
      scrollSensitivity: 20,
      scrollSpeed: 15,
      snap: false,  // false, or xy or [x,y] or function(x,y){ return [x,y] }
      delay: 0
    };
    
    if(!arguments[1] || typeof arguments[1].endeffect == 'undefined')
      Object.extend(defaults, {
        starteffect: function(element) {
          element._opacity = Element.getOpacity(element);
          Draggable._dragging[element] = true;
          new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7}); 
        }
      });
    
    var options = Object.extend(defaults, arguments[1] || {});

    this.element = $(element);
    
    if(options.handle && (typeof options.handle == 'string'))
      this.handle = this.element.down('.'+options.handle, 0);
    
    if(!this.handle) this.handle = $(options.handle);
    if(!this.handle) this.handle = this.element;
    
    if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
      options.scroll = $(options.scroll);
      this._isScrollChild = Element.childOf(this.element, options.scroll);
    }

    Element.makePositioned(this.element); // fix IE    

    this.delta    = this.currentDelta();
    this.options  = options;
    this.dragging = false;   

    this.eventMouseDown = this.initDrag.bindAsEventListener(this);
    Event.observe(this.handle, "mousedown", this.eventMouseDown);
    
    Draggables.register(this);
  },
  
  destroy: function() {
    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
    Draggables.unregister(this);
  },
  
  currentDelta: function() {
    return([
      parseInt(Element.getStyle(this.element,'left') || '0'),
      parseInt(Element.getStyle(this.element,'top') || '0')]);
  },
  
  initDrag: function(event) {
    if(typeof Draggable._dragging[this.element] != 'undefined' &&
      Draggable._dragging[this.element]) return;
    if(Event.isLeftClick(event)) {    
      // abort on form elements, fixes a Firefox issue
      var src = Event.element(event);
      if((tag_name = src.tagName.toUpperCase()) && (
        tag_name=='INPUT' ||
        tag_name=='SELECT' ||
        tag_name=='OPTION' ||
        tag_name=='BUTTON' ||
        tag_name=='TEXTAREA')) return;
        
      var pointer = [Event.pointerX(event), Event.pointerY(event)];
      var pos     = Position.cumulativeOffset(this.element);
      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
      
      Draggables.activate(this);
      Event.stop(event);
    }
  },
  
  startDrag: function(event) {
    this.dragging = true;
    
    if(this.options.zindex) {
      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
      this.element.style.zIndex = this.options.zindex;
    }
    
    if(this.options.ghosting) {
      this._clone = this.element.cloneNode(true);
      Position.absolutize(this.element);
      this.element.parentNode.insertBefore(this._clone, this.element);
    }
    
    if(this.options.scroll) {
      if (this.options.scroll == window) {
        var where = this._getWindowScroll(this.options.scroll);
        this.originalScrollLeft = where.left;
        this.originalScrollTop = where.top;
      } else {
        this.originalScrollLeft = this.options.scroll.scrollLeft;
        this.originalScrollTop = this.options.scroll.scrollTop;
      }
    }
    
    Draggables.notify('onStart', this, event);
        
    if(this.options.starteffect) this.options.starteffect(this.element);
  },
  
  updateDrag: function(event, pointer) {
    if(!this.dragging) this.startDrag(event);
    Position.prepare();
    Droppables.show(pointer, this.element);
    Draggables.notify('onDrag', this, event);
    
    this.draw(pointer);
    if(this.options.change) this.options.change(this);
    
    if(this.options.scroll) {
      this.stopScrolling();
      
      var p;
      if (this.options.scroll == window) {
        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
      } else {
        p = Position.page(this.options.scroll);
        p[0] += this.options.scroll.scrollLeft + Position.deltaX;
        p[1] += this.options.scroll.scrollTop + Position.deltaY;
        p.push(p[0]+this.options.scroll.offsetWidth);
        p.push(p[1]+this.options.scroll.offsetHeight);
      }
      var speed = [0,0];
      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
      this.startScrolling(speed);
    }
    
    // fix AppleWebKit rendering
    if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
    
    Event.stop(event);
  },
  
  finishDrag: function(event, success) {
    this.dragging = false;

    if(this.options.ghosting) {
      Position.relativize(this.element);
      Element.remove(this._clone);
      this._clone = null;
    }

    if(success) Droppables.fire(event, this.element);
    Draggables.notify('onEnd', this, event);

    var revert = this.options.revert;
    if(revert && typeof revert == 'function') revert = revert(this.element);
    
    var d = this.currentDelta();
    if(revert && this.options.reverteffect) {
      this.options.reverteffect(this.element, 
        d[1]-this.delta[1], d[0]-this.delta[0]);
    } else {
      this.delta = d;
    }

    if(this.options.zindex)
      this.element.style.zIndex = this.originalZ;

    if(this.options.endeffect) 
      this.options.endeffect(this.element);
      
    Draggables.deactivate(this);
    Droppables.reset();
  },
  
  keyPress: function(event) {
    if(event.keyCode!=Event.KEY_ESC) return;
    this.finishDrag(event, false);
    Event.stop(event);
  },
  
  endDrag: function(event) {
    if(!this.dragging) return;
    this.stopScrolling();
    this.finishDrag(event, true);
    Event.stop(event);
  },
  
  draw: function(point) {
    var pos = Position.cumulativeOffset(this.element);
    if(this.options.ghosting) {
      var r   = Position.realOffset(this.element);
      pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
    }
    
    var d = this.currentDelta();
    pos[0] -= d[0]; pos[1] -= d[1];
    
    if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
    }
    
    var p = [0,1].map(function(i){ 
      return (point[i]-pos[i]-this.offset[i]) 
    }.bind(this));
    
    if(this.options.snap) {
      if(typeof this.options.snap == 'function') {
        p = this.options.snap(p[0],p[1],this);
      } else {
      if(this.options.snap instanceof Array) {
        p = p.map( function(v, i) {
          return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
      } else {
        p = p.map( function(v) {
          return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
      }
    }}
    
    var style = this.element.style;
    if((!this.options.constraint) || (this.options.constraint=='horizontal'))
      style.left = p[0] + "px";
    if((!this.options.constraint) || (this.options.constraint=='vertical'))
      style.top  = p[1] + "px";
    
    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
  },
  
  stopScrolling: function() {
    if(this.scrollInterval) {
      clearInterval(this.scrollInterval);
      this.scrollInterval = null;
      Draggables._lastScrollPointer = null;
    }
  },
  
  startScrolling: function(speed) {
    if(!(speed[0] || speed[1])) return;
    this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
    this.lastScrolled = new Date();
    this.scrollInterval = setInterval(this.scroll.bind(this), 10);
  },
  
  scroll: function() {
    var current = new Date();
    var delta = current - this.lastScrolled;
    this.lastScrolled = current;
    if(this.options.scroll == window) {
      with (this._getWindowScroll(this.options.scroll)) {
        if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
          var d = delta / 1000;
          this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
        }
      }
    } else {
      this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
      this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;
    }
    
    Position.prepare();
    Droppables.show(Draggables._lastPointer, this.element);
    Draggables.notify('onDrag', this);
    if (this._isScrollChild) {
      Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
      Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
      Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
      if (Draggables._lastScrollPointer[0] < 0)
        Draggables._lastScrollPointer[0] = 0;
      if (Draggables._lastScrollPointer[1] < 0)
        Draggables._lastScrollPointer[1] = 0;
      this.draw(Draggables._lastScrollPointer);
    }
    
    if(this.options.change) this.options.change(this);
  },
  
  _getWindowScroll: function(w) {
    var T, L, W, H;
    with (w.document) {
      if (w.document.documentElement && documentElement.scrollTop) {
        T = documentElement.scrollTop;
        L = documentElement.scrollLeft;
      } else if (w.document.body) {
        T = body.scrollTop;
        L = body.scrollLeft;
      }
      if (w.innerWidth) {
        W = w.innerWidth;
        H = w.innerHeight;
      } else if (w.document.documentElement && documentElement.clientWidth) {
        W = documentElement.clientWidth;
        H = documentElement.clientHeight;
      } else {
        W = body.offsetWidth;
        H = body.offsetHeight
      }
    }
    return { top: T, left: L, width: W, height: H };
  }
}

/*--------------------------------------------------------------------------*/

var SortableObserver = Class.create();
SortableObserver.prototype = {
  initialize: function(element, observer) {
    this.element   = $(element);
    this.observer  = observer;
    this.lastValue = Sortable.serialize(this.element);
  },
  
  onStart: function() {
    this.lastValue = Sortable.serialize(this.element);
  },
  
  onEnd: function() {
    Sortable.unmark();
    if(this.lastValue != Sortable.serialize(this.element))
      this.observer(this.element)
  }
}

var Sortable = {
  SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
  
  sortables: {},
  
  _findRootElement: function(element) {
    while (element.tagName.toUpperCase() != "BODY") {  
      if(element.id && Sortable.sortables[element.id]) return element;
      element = element.parentNode;
    }
  },

  options: function(element) {
    element = Sortable._findRootElement($(element));
    if(!element) return;
    return Sortable.sortables[element.id];
  },
  
  destroy: function(element){
    var s = Sortable.options(element);
    
    if(s) {
      Draggables.removeObserver(s.element);
      s.droppables.each(function(d){ Droppables.remove(d) });
      s.draggables.invoke('destroy');
      
      delete Sortable.sortables[s.element.id];
    }
  },

  create: function(element) {
    element = $(element);
    var options = Object.extend({ 
      element:     element,
      tag:         'li',       // assumes li children, override with tag: 'tagname'
      dropOnEmpty: false,
      tree:        false,
      treeTag:     'ul',
      overlap:     'vertical', // one of 'vertical', 'horizontal'
      constraint:  'vertical', // one of 'vertical', 'horizontal', false
      containment: element,    // also takes array of elements (or id's); or false
      handle:      false,      // or a CSS class
      only:        false,
      delay:       0,
      hoverclass:  null,
      ghosting:    false,
      scroll:      false,
      scrollSensitivity: 20,
      scrollSpeed: 15,
      format:      this.SERIALIZE_RULE,
      onChange:    Prototype.emptyFunction,
      onUpdate:    Prototype.emptyFunction
    }, arguments[1] || {});

    // clear any old sortable with same element
    this.destroy(element);

    // build options for the draggables
    var options_for_draggable = {
      revert:      true,
      scroll:      options.scroll,
      scrollSpeed: options.scrollSpeed,
      scrollSensitivity: options.scrollSensitivity,
      delay:       options.delay,
      ghosting:    options.ghosting,
      constraint:  options.constraint,
      handle:      options.handle };

    if(options.starteffect)
      options_for_draggable.starteffect = options.starteffect;

    if(options.reverteffect)
      options_for_draggable.reverteffect = options.reverteffect;
    else
      if(options.ghosting) options_for_draggable.reverteffect = function(element) {
        element.style.top  = 0;
        element.style.left = 0;
      };

    if(options.endeffect)
      options_for_draggable.endeffect = options.endeffect;

    if(options.zindex)
      options_for_draggable.zindex = options.zindex;

    // build options for the droppables  
    var options_for_droppable = {
      overlap:     options.overlap,
      containment: options.containment,
      tree:        options.tree,
      hoverclass:  options.hoverclass,
      onHover:     Sortable.onHover
    }
    
    var options_for_tree = {
      onHover:      Sortable.onEmptyHover,
      overlap:      options.overlap,
      containment:  options.containment,
      hoverclass:   options.hoverclass
    }

    // fix for gecko engine
    Element.cleanWhitespace(element); 

    options.draggables = [];
    options.droppables = [];

    // drop on empty handling
    if(options.dropOnEmpty || options.tree) {
      Droppables.add(element, options_for_tree);
      options.droppables.push(element);
    }

    (this.findElements(element, options) || []).each( function(e) {
      // handles are per-draggable
      var handle = options.handle ? 
        $(e).down('.'+options.handle,0) : e;    
      options.draggables.push(
        new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
      Droppables.add(e, options_for_droppable);
      if(options.tree) e.treeNode = element;
      options.droppables.push(e);      
    });
    
    if(options.tree) {
      (Sortable.findTreeElements(element, options) || []).each( function(e) {
        Droppables.add(e, options_for_tree);
        e.treeNode = element;
        options.droppables.push(e);
      });
    }

    // keep reference
    this.sortables[element.id] = options;

    // for onupdate
    Draggables.addObserver(new SortableObserver(element, options.onUpdate));

  },

  // return all suitable-for-sortable elements in a guaranteed order
  findElements: function(element, options) {
    return Element.findChildren(
      element, options.only, options.tree ? true : false, options.tag);
  },
  
  findTreeElements: function(element, options) {
    return Element.findChildren(
      element, options.only, options.tree ? true : false, options.treeTag);
  },

  onHover: function(element, dropon, overlap) {
    if(Element.isParent(dropon, element)) return;

    if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
      return;
    } else if(overlap>0.5) {
      Sortable.mark(dropon, 'before');
      if(dropon.previousSibling != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, dropon);
        if(dropon.parentNode!=oldParentNode) 
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    } else {
      Sortable.mark(dropon, 'after');
      var nextElement = dropon.nextSibling || null;
      if(nextElement != element) {
        var oldParentNode = element.parentNode;
        element.style.visibility = "hidden"; // fix gecko rendering
        dropon.parentNode.insertBefore(element, nextElement);
        if(dropon.parentNode!=oldParentNode) 
          Sortable.options(oldParentNode).onChange(element);
        Sortable.options(dropon.parentNode).onChange(element);
      }
    }
  },
  
  onEmptyHover: function(element, dropon, overlap) {
    var oldParentNode = element.parentNode;
    var droponOptions = Sortable.options(dropon);
        
    if(!Element.isParent(dropon, element)) {
      var index;
      
      var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
      var child = null;
            
      if(children) {
        var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
        
        for (index = 0; index < children.length; index += 1) {
          if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
            offset -= Element.offsetSize (children[index], droponOptions.overlap);
          } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
            child = index + 1 < children.length ? children[index + 1] : null;
            break;
          } else {
            child = children[index];
            break;
          }
        }
      }
      
      dropon.insertBefore(element, child);
      
      Sortable.options(oldParentNode).onChange(element);
      droponOptions.onChange(element);
    }
  },

  unmark: function() {
    if(Sortable._marker) Sortable._marker.hide();
  },

  mark: function(dropon, position) {
    // mark on ghosting only
    var sortable = Sortable.options(dropon.parentNode);
    if(sortable && !sortable.ghosting) return; 

    if(!Sortable._marker) {
      Sortable._marker = 
        ($('dropmarker') || Element.extend(document.createElement('DIV'))).
          hide().addClassName('dropmarker').setStyle({position:'absolute'});
      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
    }    
    var offsets = Position.cumulativeOffset(dropon);
    Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
    
    if(position=='after')
      if(sortable.overlap == 'horizontal') 
        Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
      else
        Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
    
    Sortable._marker.show();
  },
  
  _tree: function(element, options, parent) {
    var children = Sortable.findElements(element, options) || [];
  
    for (var i = 0; i < children.length; ++i) {
      var match = children[i].id.match(options.format);

      if (!match) continue;
      
      var child = {
        id: encodeURIComponent(match ? match[1] : null),
        element: element,
        parent: parent,
        children: [],
        position: parent.children.length,
        container: $(children[i]).down(options.treeTag)
      }
      
      /* Get the element containing the children and recurse over it */
      if (child.container)
        this._tree(child.container, options, child)
      
      parent.children.push (child);
    }

    return parent; 
  },

  tree: function(element) {
    element = $(element);
    var sortableOptions = this.options(element);
    var options = Object.extend({
      tag: sortableOptions.tag,
      treeTag: sortableOptions.treeTag,
      only: sortableOptions.only,
      name: element.id,
      format: sortableOptions.format
    }, arguments[1] || {});
    
    var root = {
      id: null,
      parent: null,
      children: [],
      container: element,
      position: 0
    }
    
    return Sortable._tree(element, options, root);
  },

  /* Construct a [i] index for a particular node */
  _constructIndex: function(node) {
    var index = '';
    do {
      if (node.id) index = '[' + node.position + ']' + index;
    } while ((node = node.parent) != null);
    return index;
  },

  sequence: function(element) {
    element = $(element);
    var options = Object.extend(this.options(element), arguments[1] || {});
    
    return $(this.findElements(element, options) || []).map( function(item) {
      return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
    });
  },

  setSequence: function(element, new_sequence) {
    element = $(element);
    var options = Object.extend(this.options(element), arguments[2] || {});
    
    var nodeMap = {};
    this.findElements(element, options).each( function(n) {
        if (n.id.match(options.format))
            nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
        n.parentNode.removeChild(n);
    });
   
    new_sequence.each(function(ident) {
      var n = nodeMap[ident];
      if (n) {
        n[1].appendChild(n[0]);
        delete nodeMap[ident];
      }
    });
  },
  
  serialize: function(element) {
    element = $(element);
    var options = Object.extend(Sortable.options(element), arguments[1] || {});
    var name = encodeURIComponent(
      (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
    
    if (options.tree) {
      return Sortable.tree(element, arguments[1]).children.map( function (item) {
        return [name + Sortable._constructIndex(item) + "[id]=" + 
                encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
      }).flatten().join('&');
    } else {
      return Sortable.sequence(element, arguments[1]).map( function(item) {
        return name + "[]=" + encodeURIComponent(item);
      }).join('&');
    }
  }
}

// Returns true if child is contained within element
Element.isParent = function(child, element) {
  if (!child.parentNode || child == element) return false;
  if (child.parentNode == element) return true;
  return Element.isParent(child.parentNode, element);
}

Element.findChildren = function(element, only, recursive, tagName) {    
  if(!element.hasChildNodes()) return null;
  tagName = tagName.toUpperCase();
  if(only) only = [only].flatten();
  var elements = [];
  $A(element.childNodes).each( function(e) {
    if(e.tagName && e.tagName.toUpperCase()==tagName &&
      (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
        elements.push(e);
    if(recursive) {
      var grandchildren = Element.findChildren(e, only, recursive, tagName);
      if(grandchildren) elements.push(grandchildren);
    }
  });

  return (elements.length>0 ? elements.flatten() : []);
}

Element.offsetSize = function (element, type) {
  return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
}

// script.aculo.us controls.js v1.7.0, Fri Jan 19 19:16:36 CET 2007

// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
//           (c) 2005, 2006 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
//           (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
// Contributors:
//  Richard Livsey
//  Rahul Bhargava
//  Rob Wills
// 
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

// Autocompleter.Base handles all the autocompletion functionality 
// that's independent of the data source for autocompletion. This
// includes drawing the autocompletion menu, observing keyboard
// and mouse events, and similar.
//
// Specific autocompleters need to provide, at the very least, 
// a getUpdatedChoices function that will be invoked every time
// the text inside the monitored textbox changes. This method 
// should get the text for which to provide autocompletion by
// invoking this.getToken(), NOT by directly accessing
// this.element.value. This is to allow incremental tokenized
// autocompletion. Specific auto-completion logic (AJAX, etc)
// belongs in getUpdatedChoices.
//
// Tokenized incremental autocompletion is enabled automatically
// when an autocompleter is instantiated with the 'tokens' option
// in the options parameter, e.g.:
// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
// will incrementally autocomplete with a comma as the token.
// Additionally, ',' in the above example can be replaced with
// a token array, e.g. { tokens: [',', '\n'] } which
// enables autocompletion on multiple tokens. This is most 
// useful when one of the tokens is \n (a newline), as it 
// allows smart autocompletion after linebreaks.

if(typeof Effect == 'undefined')
  throw("controls.js requires including script.aculo.us' effects.js library");

var Autocompleter = {}
Autocompleter.Base = function() {};
Autocompleter.Base.prototype = {
  baseInitialize: function(element, update, options) {
    this.element     = $(element); 
    this.update      = $(update);  
    this.hasFocus    = false; 
    this.changed     = false; 
    this.active      = false; 
    this.index       = 0;     
    this.entryCount  = 0;

    if(this.setOptions)
      this.setOptions(options);
    else
      this.options = options || {};

    this.options.paramName    = this.options.paramName || this.element.name;
    this.options.tokens       = this.options.tokens || [];
    this.options.frequency    = this.options.frequency || 0.4;
    this.options.minChars     = this.options.minChars || 1;
    this.options.onShow       = this.options.onShow || 
      function(element, update){ 
        if(!update.style.position || update.style.position=='absolute') {
          update.style.position = 'absolute';
          Position.clone(element, update, {
            setHeight: false, 
            offsetTop: element.offsetHeight
          });
        }
        Effect.Appear(update,{duration:0.15});
      };
    this.options.onHide = this.options.onHide || 
      function(element, update){ new Effect.Fade(update,{duration:0.15}) };

    if(typeof(this.options.tokens) == 'string') 
      this.options.tokens = new Array(this.options.tokens);

    this.observer = null;
    
    this.element.setAttribute('autocomplete','off');

    Element.hide(this.update);

    Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
    Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
  },

  show: function() {
    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
    if(!this.iefix && 
      (navigator.appVersion.indexOf('MSIE')>0) &&
      (navigator.userAgent.indexOf('Opera')<0) &&
      (Element.getStyle(this.update, 'position')=='absolute')) {
      new Insertion.After(this.update, 
       '<iframe id="' + this.update.id + '_iefix" '+
       'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
       'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
      this.iefix = $(this.update.id+'_iefix');
    }
    if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
  },
  
  fixIEOverlapping: function() {
    Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
    this.iefix.style.zIndex = 1;
    this.update.style.zIndex = 2;
    Element.show(this.iefix);
  },

  hide: function() {
    this.stopIndicator();
    if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
    if(this.iefix) Element.hide(this.iefix);
  },

  startIndicator: function() {
    if(this.options.indicator) Element.show(this.options.indicator);
  },

  stopIndicator: function() {
    if(this.options.indicator) Element.hide(this.options.indicator);
  },

  onKeyPress: function(event) {
    if(this.active)
      switch(event.keyCode) {
       case Event.KEY_TAB:
       case Event.KEY_RETURN:
         this.selectEntry();
         Event.stop(event);
       case Event.KEY_ESC:
         this.hide();
         this.active = false;
         Event.stop(event);
         return;
       case Event.KEY_LEFT:
       case Event.KEY_RIGHT:
         return;
       case Event.KEY_UP:
         this.markPrevious();
         this.render();
         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
         return;
       case Event.KEY_DOWN:
         this.markNext();
         this.render();
         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
         return;
      }
     else 
       if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN || 
         (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;

    this.changed = true;
    this.hasFocus = true;

    if(this.observer) clearTimeout(this.observer);
      this.observer = 
        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
  },

  activate: function() {
    this.changed = false;
    this.hasFocus = true;
    this.getUpdatedChoices();
  },

  onHover: function(event) {
    var element = Event.findElement(event, 'LI');
    if(this.index != element.autocompleteIndex) 
    {
        this.index = element.autocompleteIndex;
        this.render();
    }
    Event.stop(event);
  },
  
  onClick: function(event) {
    var element = Event.findElement(event, 'LI');
    this.index = element.autocompleteIndex;
    this.selectEntry();
    this.hide();
  },
  
  onBlur: function(event) {
    // needed to make click events working
    setTimeout(this.hide.bind(this), 250);
    this.hasFocus = false;
    this.active = false;     
  }, 
  
  render: function() {
    if(this.entryCount > 0) {
      for (var i = 0; i < this.entryCount; i++)
        this.index==i ? 
          Element.addClassName(this.getEntry(i),"selected") : 
          Element.removeClassName(this.getEntry(i),"selected");
        
      if(this.hasFocus) { 
        this.show();
        this.active = true;
      }
    } else {
      this.active = false;
      this.hide();
    }
  },
  
  markPrevious: function() {
    if(this.index > 0) this.index--
      else this.index = this.entryCount-1;
    this.getEntry(this.index).scrollIntoView(true);
  },
  
  markNext: function() {
    if(this.index < this.entryCount-1) this.index++
      else this.index = 0;
    this.getEntry(this.index).scrollIntoView(false);
  },
  
  getEntry: function(index) {
    return this.update.firstChild.childNodes[index];
  },
  
  getCurrentEntry: function() {
    return this.getEntry(this.index);
  },
  
  selectEntry: function() {
    this.active = false;
    this.updateElement(this.getCurrentEntry());
  },

  updateElement: function(selectedElement) {
    if (this.options.updateElement) {
      this.options.updateElement(selectedElement);
      return;
    }
    var value = '';
    if (this.options.select) {
      var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
      if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
    } else
      value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
    
    var lastTokenPos = this.findLastToken();
    if (lastTokenPos != -1) {
      var newValue = this.element.value.substr(0, lastTokenPos + 1);
      var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
      if (whitespace)
        newValue += whitespace[0];
      this.element.value = newValue + value;
    } else {
      this.element.value = value;
    }
    this.element.focus();
    
    if (this.options.afterUpdateElement)
      this.options.afterUpdateElement(this.element, selectedElement);
  },

  updateChoices: function(choices) {
    if(!this.changed && this.hasFocus) {
      this.update.innerHTML = choices;
      Element.cleanWhitespace(this.update);
      Element.cleanWhitespace(this.update.down());

      if(this.update.firstChild && this.update.down().childNodes) {
        this.entryCount = 
          this.update.down().childNodes.length;
        for (var i = 0; i < this.entryCount; i++) {
          var entry = this.getEntry(i);
          entry.autocompleteIndex = i;
          this.addObservers(entry);
        }
      } else { 
        this.entryCount = 0;
      }

      this.stopIndicator();
      this.index = 0;
      
      if(this.entryCount==1 && this.options.autoSelect) {
        this.selectEntry();
        this.hide();
      } else {
        this.render();
      }
    }
  },

  addObservers: function(element) {
    Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
    Event.observe(element, "click", this.onClick.bindAsEventListener(this));
  },

  onObserverEvent: function() {
    this.changed = false;   
    if(this.getToken().length>=this.options.minChars) {
      this.startIndicator();
      this.getUpdatedChoices();
    } else {
      this.active = false;
      this.hide();
    }
  },

  getToken: function() {
    var tokenPos = this.findLastToken();
    if (tokenPos != -1)
      var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
    else
      var ret = this.element.value;

    return /\n/.test(ret) ? '' : ret;
  },

  findLastToken: function() {
    var lastTokenPos = -1;

    for (var i=0; i<this.options.tokens.length; i++) {
      var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
      if (thisTokenPos > lastTokenPos)
        lastTokenPos = thisTokenPos;
    }
    return lastTokenPos;
  }
}

Ajax.Autocompleter = Class.create();
Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
  initialize: function(element, update, url, options) {
    this.baseInitialize(element, update, options);
    this.options.asynchronous  = true;
    this.options.onComplete    = this.onComplete.bind(this);
    this.options.defaultParams = this.options.parameters || null;
    this.url                   = url;
  },

  getUpdatedChoices: function() {
    entry = encodeURIComponent(this.options.paramName) + '=' + 
      encodeURIComponent(this.getToken());

    this.options.parameters = this.options.callback ?
      this.options.callback(this.element, entry) : entry;

    if(this.options.defaultParams) 
      this.options.parameters += '&' + this.options.defaultParams;

    new Ajax.Request(this.url, this.options);
  },

  onComplete: function(request) {
    this.updateChoices(request.responseText);
  }

});

// The local array autocompleter. Used when you'd prefer to
// inject an array of autocompletion options into the page, rather
// than sending out Ajax queries, which can be quite slow sometimes.
//
// The constructor takes four parameters. The first two are, as usual,
// the id of the monitored textbox, and id of the autocompletion menu.
// The third is the array you want to autocomplete from, and the fourth
// is the options block.
//
// Extra local autocompletion options:
// - choices - How many autocompletion choices to offer
//
// - partialSearch - If false, the autocompleter will match entered
//                    text only at the beginning of strings in the 
//                    autocomplete array. Defaults to true, which will
//                    match text at the beginning of any *word* in the
//                    strings in the autocomplete array. If you want to
//                    search anywhere in the string, additionally set
//                    the option fullSearch to true (default: off).
//
// - fullSsearch - Search anywhere in autocomplete array strings.
//
// - partialChars - How many characters to enter before triggering
//                   a partial match (unlike minChars, which defines
//                   how many characters are required to do any match
//                   at all). Defaults to 2.
//
// - ignoreCase - Whether to ignore case when autocompleting.
//                 Defaults to true.
//
// It's possible to pass in a custom function as the 'selector' 
// option, if you prefer to write your own autocompletion logic.
// In that case, the other options above will not apply unless
// you support them.

Autocompleter.Local = Class.create();
Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
  initialize: function(element, update, array, options) {
    this.baseInitialize(element, update, options);
    this.options.array = array;
  },

  getUpdatedChoices: function() {
    this.updateChoices(this.options.selector(this));
  },

  setOptions: function(options) {
    this.options = Object.extend({
      choices: 10,
      partialSearch: true,
      partialChars: 2,
      ignoreCase: true,
      fullSearch: false,
      selector: function(instance) {
        var ret       = []; // Beginning matches
        var partial   = []; // Inside matches
        var entry     = instance.getToken();
        var count     = 0;

        for (var i = 0; i < instance.options.array.length &&  
          ret.length < instance.options.choices ; i++) { 

          var elem = instance.options.array[i];
          var foundPos = instance.options.ignoreCase ? 
            elem.toLowerCase().indexOf(entry.toLowerCase()) : 
            elem.indexOf(entry);

          while (foundPos != -1) {
            if (foundPos == 0 && elem.length != entry.length) { 
              ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + 
                elem.substr(entry.length) + "</li>");
              break;
            } else if (entry.length >= instance.options.partialChars && 
              instance.options.partialSearch && foundPos != -1) {
              if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
                partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
                  elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
                  foundPos + entry.length) + "</li>");
                break;
              }
            }

            foundPos = instance.options.ignoreCase ? 
              elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : 
              elem.indexOf(entry, foundPos + 1);

          }
        }
        if (partial.length)
          ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
        return "<ul>" + ret.join('') + "</ul>";
      }
    }, options || {});
  }
});

// AJAX in-place editor
//
// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor

// Use this if you notice weird scrolling problems on some browsers,
// the DOM might be a bit confused when this gets called so do this
// waits 1 ms (with setTimeout) until it does the activation
Field.scrollFreeActivate = function(field) {
  setTimeout(function() {
    Field.activate(field);
  }, 1);
}

Ajax.InPlaceEditor = Class.create();
Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
Ajax.InPlaceEditor.prototype = {
  initialize: function(element, url, options) {
    this.url = url;
    this.element = $(element);

    this.options = Object.extend({
      paramName: "value",
      okButton: true,
      okText: "ok",
      cancelLink: true,
      cancelText: "cancel",
      savingText: "Saving...",
      clickToEditText: "Click to edit",
      okText: "ok",
      rows: 1,
      onComplete: function(transport, element) {
        new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
      },
      onFailure: function(transport) {
        alert("Error communicating with the server: " + transport.responseText.stripTags());
      },
      callback: function(form) {
        return Form.serialize(form);
      },
      handleLineBreaks: true,
      loadingText: 'Loading...',
      savingClassName: 'inplaceeditor-saving',
      loadingClassName: 'inplaceeditor-loading',
      formClassName: 'inplaceeditor-form',
      highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
      highlightendcolor: "#FFFFFF",
      externalControl: null,
      submitOnBlur: false,
      ajaxOptions: {},
      evalScripts: false
    }, options || {});

    if(!this.options.formId && this.element.id) {
      this.options.formId = this.element.id + "-inplaceeditor";
      if ($(this.options.formId)) {
        // there's already a form with that name, don't specify an id
        this.options.formId = null;
      }
    }
    
    if (this.options.externalControl) {
      this.options.externalControl = $(this.options.externalControl);
    }
    
    this.originalBackground = Element.getStyle(this.element, 'background-color');
    if (!this.originalBackground) {
      this.originalBackground = "transparent";
    }
    
    this.element.title = this.options.clickToEditText;
    
    this.onclickListener = this.enterEditMode.bindAsEventListener(this);
    this.mouseoverListener = this.enterHover.bindAsEventListener(this);
    this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
    Event.observe(this.element, 'click', this.onclickListener);
    Event.observe(this.element, 'mouseover', this.mouseoverListener);
    Event.observe(this.element, 'mouseout', this.mouseoutListener);
    if (this.options.externalControl) {
      Event.observe(this.options.externalControl, 'click', this.onclickListener);
      Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
      Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
    }
  },
  enterEditMode: function(evt) {
    if (this.saving) return;
    if (this.editing) return;
    this.editing = true;
    this.onEnterEditMode();
    if (this.options.externalControl) {
      Element.hide(this.options.externalControl);
    }
    Element.hide(this.element);
    this.createForm();
    this.element.parentNode.insertBefore(this.form, this.element);
    if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
    // stop the event to avoid a page refresh in Safari
    if (evt) {
      Event.stop(evt);
    }
    return false;
  },
  createForm: function() {
    this.form = document.createElement("form");
    this.form.id = this.options.formId;
    Element.addClassName(this.form, this.options.formClassName)
    this.form.onsubmit = this.onSubmit.bind(this);

    this.createEditField();

    if (this.options.textarea) {
      var br = document.createElement("br");
      this.form.appendChild(br);
    }

    if (this.options.okButton) {
      okButton = document.createElement("input");
      okButton.type = "submit";
      okButton.value = this.options.okText;
      okButton.className = 'editor_ok_button';
      this.form.appendChild(okButton);
    }

    if (this.options.cancelLink) {
      cancelLink = document.createElement("a");
      cancelLink.href = "#";
      cancelLink.appendChild(document.createTextNode(this.options.cancelText));
      cancelLink.onclick = this.onclickCancel.bind(this);
      cancelLink.className = 'editor_cancel';      
      this.form.appendChild(cancelLink);
    }
  },
  hasHTMLLineBreaks: function(string) {
    if (!this.options.handleLineBreaks) return false;
    return string.match(/<br/i) || string.match(/<p>/i);
  },
  convertHTMLLineBreaks: function(string) {
    return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
  },
  createEditField: function() {
    var text;
    if(this.options.loadTextURL) {
      text = this.options.loadingText;
    } else {
      text = this.getText();
    }

    var obj = this;
    
    if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
      this.options.textarea = false;
      var textField = document.createElement("input");
      textField.obj = this;
      textField.type = "text";
      textField.name = this.options.paramName;
      textField.value = text;
      textField.style.backgroundColor = this.options.highlightcolor;
      textField.className = 'editor_field';
      var size = this.options.size || this.options.cols || 0;
      if (size != 0) textField.size = size;
      if (this.options.submitOnBlur)
        textField.onblur = this.onSubmit.bind(this);
      this.editField = textField;
    } else {
      this.options.textarea = true;
      var textArea = document.createElement("textarea");
      textArea.obj = this;
      textArea.name = this.options.paramName;
      textArea.value = this.convertHTMLLineBreaks(text);
      textArea.rows = this.options.rows;
      textArea.cols = this.options.cols || 40;
      textArea.className = 'editor_field';      
      if (this.options.submitOnBlur)
        textArea.onblur = this.onSubmit.bind(this);
      this.editField = textArea;
    }
    
    if(this.options.loadTextURL) {
      this.loadExternalText();
    }
    this.form.appendChild(this.editField);
  },
  getText: function() {
    return this.element.innerHTML;
  },
  loadExternalText: function() {
    Element.addClassName(this.form, this.options.loadingClassName);
    this.editField.disabled = true;
    new Ajax.Request(
      this.options.loadTextURL,
      Object.extend({
        asynchronous: true,
        onComplete: this.onLoadedExternalText.bind(this)
      }, this.options.ajaxOptions)
    );
  },
  onLoadedExternalText: function(transport) {
    Element.removeClassName(this.form, this.options.loadingClassName);
    this.editField.disabled = false;
    this.editField.value = transport.responseText.stripTags();
    Field.scrollFreeActivate(this.editField);
  },
  onclickCancel: function() {
    this.onComplete();
    this.leaveEditMode();
    return false;
  },
  onFailure: function(transport) {
    this.options.onFailure(transport);
    if (this.oldInnerHTML) {
      this.element.innerHTML = this.oldInnerHTML;
      this.oldInnerHTML = null;
    }
    return false;
  },
  onSubmit: function() {
    // onLoading resets these so we need to save them away for the Ajax call
    var form = this.form;
    var value = this.editField.value;
    
    // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
    // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
    // to be displayed indefinitely
    this.onLoading();
    
    if (this.options.evalScripts) {
      new Ajax.Request(
        this.url, Object.extend({
          parameters: this.options.callback(form, value),
          onComplete: this.onComplete.bind(this),
          onFailure: this.onFailure.bind(this),
          asynchronous:true, 
          evalScripts:true
        }, this.options.ajaxOptions));
    } else  {
      new Ajax.Updater(
        { success: this.element,
          // don't update on failure (this could be an option)
          failure: null }, 
        this.url, Object.extend({
          parameters: this.options.callback(form, value),
          onComplete: this.onComplete.bind(this),
          onFailure: this.onFailure.bind(this)
        }, this.options.ajaxOptions));
    }
    // stop the event to avoid a page refresh in Safari
    if (arguments.length > 1) {
      Event.stop(arguments[0]);
    }
    return false;
  },
  onLoading: function() {
    this.saving = true;
    this.removeForm();
    this.leaveHover();
    this.showSaving();
  },
  showSaving: function() {
    this.oldInnerHTML = this.element.innerHTML;
    this.element.innerHTML = this.options.savingText;
    Element.addClassName(this.element, this.options.savingClassName);
    this.element.style.backgroundColor = this.originalBackground;
    Element.show(this.element);
  },
  removeForm: function() {
    if(this.form) {
      if (this.form.parentNode) Element.remove(this.form);
      this.form = null;
    }
  },
  enterHover: function() {
    if (this.saving) return;
    this.element.style.backgroundColor = this.options.highlightcolor;
    if (this.effect) {
      this.effect.cancel();
    }
    Element.addClassName(this.element, this.options.hoverClassName)
  },
  leaveHover: function() {
    if (this.options.backgroundColor) {
      this.element.style.backgroundColor = this.oldBackground;
    }
    Element.removeClassName(this.element, this.options.hoverClassName)
    if (this.saving) return;
    this.effect = new Effect.Highlight(this.element, {
      startcolor: this.options.highlightcolor,
      endcolor: this.options.highlightendcolor,
      restorecolor: this.originalBackground
    });
  },
  leaveEditMode: function() {
    Element.removeClassName(this.element, this.options.savingClassName);
    this.removeForm();
    this.leaveHover();
    this.element.style.backgroundColor = this.originalBackground;
    Element.show(this.element);
    if (this.options.externalControl) {
      Element.show(this.options.externalControl);
    }
    this.editing = false;
    this.saving = false;
    this.oldInnerHTML = null;
    this.onLeaveEditMode();
  },
  onComplete: function(transport) {
    this.leaveEditMode();
    this.options.onComplete.bind(this)(transport, this.element);
  },
  onEnterEditMode: function() {},
  onLeaveEditMode: function() {},
  dispose: function() {
    if (this.oldInnerHTML) {
      this.element.innerHTML = this.oldInnerHTML;
    }
    this.leaveEditMode();
    Event.stopObserving(this.element, 'click', this.onclickListener);
    Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
    Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
    if (this.options.externalControl) {
      Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
      Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
      Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
    }
  }
};

Ajax.InPlaceCollectionEditor = Class.create();
Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
  createEditField: function() {
    if (!this.cached_selectTag) {
      var selectTag = document.createElement("select");
      var collection = this.options.collection || [];
      var optionTag;
      collection.each(function(e,i) {
        optionTag = document.createElement("option");
        optionTag.value = (e instanceof Array) ? e[0] : e;
        if((typeof this.options.value == 'undefined') && 
          ((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
        if(this.options.value==optionTag.value) optionTag.selected = true;
        optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
        selectTag.appendChild(optionTag);
      }.bind(this));
      this.cached_selectTag = selectTag;
    }

    this.editField = this.cached_selectTag;
    if(this.options.loadTextURL) this.loadExternalText();
    this.form.appendChild(this.editField);
    this.options.callback = function(form, value) {
      return "value=" + encodeURIComponent(value);
    }
  }
});

// Delayed observer, like Form.Element.Observer, 
// but waits for delay after last key input
// Ideal for live-search fields

Form.Element.DelayedObserver = Class.create();
Form.Element.DelayedObserver.prototype = {
  initialize: function(element, delay, callback) {
    this.delay     = delay || 0.5;
    this.element   = $(element);
    this.callback  = callback;
    this.timer     = null;
    this.lastValue = $F(this.element); 
    Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
  },
  delayedListener: function(event) {
    if(this.lastValue == $F(this.element)) return;
    if(this.timer) clearTimeout(this.timer);
    this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
    this.lastValue = $F(this.element);
  },
  onTimerEvent: function() {
    this.timer = null;
    this.callback(this.element, $F(this.element));
  }
};
// script.aculo.us slider.js v1.7.0, Fri Jan 19 19:16:36 CET 2007

// Copyright (c) 2005, 2006 Marty Haught, Thomas Fuchs 
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/

if(!Control) var Control = {};
Control.Slider = Class.create();

// options:
//  axis: 'vertical', or 'horizontal' (default)
//
// callbacks:
//  onChange(value)
//  onSlide(value)
Control.Slider.prototype = {
  initialize: function(handle, track, options) {
    var slider = this;
    
    if(handle instanceof Array) {
      this.handles = handle.collect( function(e) { return $(e) });
    } else {
      this.handles = [$(handle)];
    }
    
    this.track   = $(track);
    this.options = options || {};

    this.axis      = this.options.axis || 'horizontal';
    this.increment = this.options.increment || 1;
    this.step      = parseInt(this.options.step || '1');
    this.range     = this.options.range || $R(0,1);
    
    this.value     = 0; // assure backwards compat
    this.values    = this.handles.map( function() { return 0 });
    this.spans     = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
    this.options.startSpan = $(this.options.startSpan || null);
    this.options.endSpan   = $(this.options.endSpan || null);

    this.restricted = this.options.restricted || false;

    this.maximum   = this.options.maximum || this.range.end;
    this.minimum   = this.options.minimum || this.range.start;

    // Will be used to align the handle onto the track, if necessary
    this.alignX = parseInt(this.options.alignX || '0');
    this.alignY = parseInt(this.options.alignY || '0');
    
    this.trackLength = this.maximumOffset() - this.minimumOffset();

    this.handleLength = this.isVertical() ? 
      (this.handles[0].offsetHeight != 0 ? 
        this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) : 
      (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : 
        this.handles[0].style.width.replace(/px$/,""));

    this.active   = false;
    this.dragging = false;
    this.disabled = false;

    if(this.options.disabled) this.setDisabled();

    // Allowed values array
    this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
    if(this.allowedValues) {
      this.minimum = this.allowedValues.min();
      this.maximum = this.allowedValues.max();
    }

    this.eventMouseDown = this.startDrag.bindAsEventListener(this);
    this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
    this.eventMouseMove = this.update.bindAsEventListener(this);

    // Initialize handles in reverse (make sure first handle is active)
    this.handles.each( function(h,i) {
      i = slider.handles.length-1-i;
      slider.setValue(parseFloat(
        (slider.options.sliderValue instanceof Array ? 
          slider.options.sliderValue[i] : slider.options.sliderValue) || 
         slider.range.start), i);
      Element.makePositioned(h); // fix IE
      Event.observe(h, "mousedown", slider.eventMouseDown);
    });
    
    Event.observe(this.track, "mousedown", this.eventMouseDown);
    Event.observe(document, "mouseup", this.eventMouseUp);
    Event.observe(document, "mousemove", this.eventMouseMove);
    
    this.initialized = true;
  },
  dispose: function() {
    var slider = this;    
    Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
    Event.stopObserving(document, "mouseup", this.eventMouseUp);
    Event.stopObserving(document, "mousemove", this.eventMouseMove);
    this.handles.each( function(h) {
      Event.stopObserving(h, "mousedown", slider.eventMouseDown);
    });
  },
  setDisabled: function(){
    this.disabled = true;
  },
  setEnabled: function(){
    this.disabled = false;
  },  
  getNearestValue: function(value){
    if(this.allowedValues){
      if(value >= this.allowedValues.max()) return(this.allowedValues.max());
      if(value <= this.allowedValues.min()) return(this.allowedValues.min());
      
      var offset = Math.abs(this.allowedValues[0] - value);
      var newValue = this.allowedValues[0];
      this.allowedValues.each( function(v) {
        var currentOffset = Math.abs(v - value);
        if(currentOffset <= offset){
          newValue = v;
          offset = currentOffset;
        } 
      });
      return newValue;
    }
    if(value > this.range.end) return this.range.end;
    if(value < this.range.start) return this.range.start;
    return value;
  },
  setValue: function(sliderValue, handleIdx){
    if(!this.active) {
      this.activeHandleIdx = handleIdx || 0;
      this.activeHandle    = this.handles[this.activeHandleIdx];
      this.updateStyles();
    }
    handleIdx = handleIdx || this.activeHandleIdx || 0;
    if(this.initialized && this.restricted) {
      if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
        sliderValue = this.values[handleIdx-1];
      if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
        sliderValue = this.values[handleIdx+1];
    }
    sliderValue = this.getNearestValue(sliderValue);
    this.values[handleIdx] = sliderValue;
    this.value = this.values[0]; // assure backwards compat
    
    this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = 
      this.translateToPx(sliderValue);
    
    this.drawSpans();
    if(!this.dragging || !this.event) this.updateFinished();
  },
  setValueBy: function(delta, handleIdx) {
    this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, 
      handleIdx || this.activeHandleIdx || 0);
  },
  translateToPx: function(value) {
    return Math.round(
      ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * 
      (value - this.range.start)) + "px";
  },
  translateToValue: function(offset) {
    return ((offset/(this.trackLength-this.handleLength) * 
      (this.range.end-this.range.start)) + this.range.start);
  },
  getRange: function(range) {
    var v = this.values.sortBy(Prototype.K); 
    range = range || 0;
    return $R(v[range],v[range+1]);
  },
  minimumOffset: function(){
    return(this.isVertical() ? this.alignY : this.alignX);
  },
  maximumOffset: function(){
    return(this.isVertical() ? 
      (this.track.offsetHeight != 0 ? this.track.offsetHeight :
        this.track.style.height.replace(/px$/,"")) - this.alignY : 
      (this.track.offsetWidth != 0 ? this.track.offsetWidth : 
        this.track.style.width.replace(/px$/,"")) - this.alignY);
  },  
  isVertical:  function(){
    return (this.axis == 'vertical');
  },
  drawSpans: function() {
    var slider = this;
    if(this.spans)
      $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
    if(this.options.startSpan)
      this.setSpan(this.options.startSpan,
        $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
    if(this.options.endSpan)
      this.setSpan(this.options.endSpan, 
        $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
  },
  setSpan: function(span, range) {
    if(this.isVertical()) {
      span.style.top = this.translateToPx(range.start);
      span.style.height = this.translateToPx(range.end - range.start + this.range.start);
    } else {
      span.style.left = this.translateToPx(range.start);
      span.style.width = this.translateToPx(range.end - range.start + this.range.start);
    }
  },
  updateStyles: function() {
    this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
    Element.addClassName(this.activeHandle, 'selected');
  },
  startDrag: function(event) {
    if(Event.isLeftClick(event)) {
      if(!this.disabled){
        this.active = true;
        
        var handle = Event.element(event);
        var pointer  = [Event.pointerX(event), Event.pointerY(event)];
        var track = handle;
        if(track==this.track) {
          var offsets  = Position.cumulativeOffset(this.track); 
          this.event = event;
          this.setValue(this.translateToValue( 
           (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
          ));
          var offsets  = Position.cumulativeOffset(this.activeHandle);
          this.offsetX = (pointer[0] - offsets[0]);
          this.offsetY = (pointer[1] - offsets[1]);
        } else {
          // find the handle (prevents issues with Safari)
          while((this.handles.indexOf(handle) == -1) && handle.parentNode) 
            handle = handle.parentNode;
            
          if(this.handles.indexOf(handle)!=-1) {
            this.activeHandle    = handle;
            this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
            this.updateStyles();
            
            var offsets  = Position.cumulativeOffset(this.activeHandle);
            this.offsetX = (pointer[0] - offsets[0]);
            this.offsetY = (pointer[1] - offsets[1]);
          }
        }
      }
      Event.stop(event);
    }
  },
  update: function(event) {
   if(this.active) {
      if(!this.dragging) this.dragging = true;
      this.draw(event);
      // fix AppleWebKit rendering
      if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
      Event.stop(event);
   }
  },
  draw: function(event) {
    var pointer = [Event.pointerX(event), Event.pointerY(event)];
    var offsets = Position.cumulativeOffset(this.track);
    pointer[0] -= this.offsetX + offsets[0];
    pointer[1] -= this.offsetY + offsets[1];
    this.event = event;
    this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
    if(this.initialized && this.options.onSlide)
      this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
  },
  endDrag: function(event) {
    if(this.active && this.dragging) {
      this.finishDrag(event, true);
      Event.stop(event);
    }
    this.active = false;
    this.dragging = false;
  },  
  finishDrag: function(event, success) {
    this.active = false;
    this.dragging = false;
    this.updateFinished();
  },
  updateFinished: function() {
    if(this.initialized && this.options.onChange) 
      this.options.onChange(this.values.length>1 ? this.values : this.value, this);
    this.event = null;
  }
}

// -----------------------------------------------------------------------------------
//
//	Lightbox v2.02
//	by Lokesh Dhakar - http://www.huddletogether.com
//	3/31/06
//
//	For more information on this script, visit:
//	http://huddletogether.com/projects/lightbox2/
//
//	Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
//	
//	Credit also due to those who have helped, inspired, and made their code available to the public.
//	Including: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.org), Thomas Fuchs(mir.aculo.us), and others.
//
//
// -----------------------------------------------------------------------------------
/*

	Table of Contents
	-----------------
	Configuration
	Global Variables

	Extending Built-in Objects	
	- Object.extend(Element)
	- Array.prototype.removeDuplicates()
	- Array.prototype.empty()

	Lightbox Class Declaration
	- initialize()
	- start()
	- changeImage()
	- resizeImageContainer()
	- showImage()
	- updateDetails()
	- updateNav()
	- enableKeyboardNav()
	- disableKeyboardNav()
	- keyboardAction()
	- preloadNeighborImages()
	- end()
	
	Miscellaneous Functions
	- getPageScroll()
	- getPageSize()
	- getKey()
	- listenKey()
	- showSelectBoxes()
	- hideSelectBoxes()
	- pause()
	- initLightbox()
	
	Function Calls
	- addLoadEvent(initLightbox)
	
*/
// -----------------------------------------------------------------------------------

//
//	Configuration
//
var fileLoadingImage = "images/loading.gif";		
var fileBottomNavCloseImage = "images/closelabel.gif";

var resizeSpeed = 7;	// controls the speed of the image resizing (1=slowest and 10=fastest)

var borderSize = 10;	//if you adjust the padding in the CSS, you will need to update this variable

// -----------------------------------------------------------------------------------

//
//	Global Variables
//
var imageArray = new Array;
var activeImage;

if(resizeSpeed > 10){ resizeSpeed = 10;}
if(resizeSpeed < 1){ resizeSpeed = 1;}
resizeDuration = (11 - resizeSpeed) * 0.15;

// -----------------------------------------------------------------------------------

//
//	Additional methods for Element added by SU, Couloir
//	- further additions by Lokesh Dhakar (huddletogether.com)
//
Object.extend(Element, {
	getWidth: function(element) {
	   	element = $(element);
	   	return element.offsetWidth; 
	},
	setWidth: function(element,w) {
	   	element = $(element);
    	element.style.width = w +"px";
	},
	setHeight: function(element,h) {
   		element = $(element);
    	element.style.height = h +"px";
	},
	setTop: function(element,t) {
	   	element = $(element);
    	element.style.top = t +"px";
	},
	setSrc: function(element,src) {
    	element = $(element);
    	element.src = src; 
	},
	setHref: function(element,href) {
    	element = $(element);
    	element.href = href; 
	},
	setInnerHTML: function(element,content) {
		element = $(element);
		element.innerHTML = content;
	}
});

// -----------------------------------------------------------------------------------

//
//	Extending built-in Array object
//	- array.removeDuplicates()
//	- array.empty()
//
Array.prototype.removeDuplicates = function () {
	for(i = 1; i < this.length; i++){
		if(this[i][0] == this[i-1][0]){
			this.splice(i,1);
		}
	}
}

// -----------------------------------------------------------------------------------

Array.prototype.empty = function () {
	for(i = 0; i <= this.length; i++){
		this.shift();
	}
}

// -----------------------------------------------------------------------------------

//
//	Lightbox Class Declaration
//	- initialize()
//	- start()
//	- changeImage()
//	- resizeImageContainer()
//	- showImage()
//	- updateDetails()
//	- updateNav()
//	- enableKeyboardNav()
//	- disableKeyboardNav()
//	- keyboardNavAction()
//	- preloadNeighborImages()
//	- end()
//
//	Structuring of code inspired by Scott Upton (http://www.uptonic.com/)
//
var Lightbox = Class.create();

Lightbox.prototype = {
	
	// initialize()
	// Constructor runs on completion of the DOM loading. Loops through anchor tags looking for 
	// 'lightbox' references and applies onclick events to appropriate links. The 2nd section of
	// the function inserts html at the bottom of the page which is used to display the shadow 
	// overlay and the image container.
	initialize: function(element) {
		this.element = $(element); // Lightbox Contents div
		this.overlay = null; // Fade overlay div
		this.lightbox = null; // Lightbox substrate div // отвечает за позиционирование
		this.elementInitDims = Element.getDimensions(this.element);
		this.options = Object.extend({
			isModal: false,
			overlayColor: '#000000',
			lightboxColor: 'transparent',
			overlayOpacity: 0.8,
			overlayshoweffect: true,
			overlayhideeffect: true,
			boxshoweffect: true,
			boxhideeffect: true
		}, arguments[1] || {});

		this.setup();

	},

	setup: function() {
		this.createFadeOverlay();
		this.createLightboxSubstrate();
		Element.setStyle(this.element, {display:'none'});

	},

	createFadeOverlay: function() {

		var body = document.getElementsByTagName("body").item(0);

		// создаем непосредственно overlay
		this.overlay = document.createElement("div");
		this.overlay.setAttribute('id','lightbox_overlay');
		Element.setStyle(this.overlay, {display: 'none', backgroundColor:this.options.overlayColor, zIndex: '1100'});
		

		// Если немодальный Lightbox, то устанавливаем на событие click по overlay - отключение Lightbox
		if(!this.options.isModal)
		{
			Event.observe(this.overlay, "click", function(e) { this.switchOff(); return false; }.bindAsEventListener(this), false);
		}
		this.overlay = body.appendChild(this.overlay);

		Position.absolutize(this.overlay);

	},

	createLightboxSubstrate: function() {
		var body = document.getElementsByTagName("body").item(0);
		
		this.lightbox = document.createElement("div");
		this.lightbox.setAttribute('id','lightbox_substrate');
		Element.setStyle(this.lightbox, {display: 'none', zIndex: '1110', backgroundColor: this.options.lightboxColor});
		body.appendChild(this.lightbox);

		// вставляем в lightbox содержимое (указанный элемент)
		this.lightbox.appendChild(this.element);

		Position.absolutize(this.lightbox);

	},

	showLightbox: function() {
		// Настройки Overlay
		// растягиваем overlay, чтобы он заполнил всю страницу
		var arrayPageSize = getPageSize();
		Element.setStyle(this.overlay, {height: arrayPageSize[1]+'px'});
		Element.setStyle(this.overlay, {width: arrayPageSize[0]+'px'});
		
		// Настройки Lightbox-элементов (Lightbox Substrate и this.element)
		// Параметры стилей Lightbox
		var arrayPageSize = getPageSize();
		var arrayPageScroll = getPageScroll();
		var lightboxTop = arrayPageScroll[1] + (arrayPageSize[3] / 10);
		var lightboxLeft = (arrayPageSize[0] / 2) - (this.elementInitDims.width / 2);


		// Стили Lightbox
		Element.setStyle(this.lightbox, {width: this.elementInitDims.width+'px', height: this.elementInitDims.height+'px'});
		Element.setStyle(this.lightbox, {top: lightboxTop+'px', left: lightboxLeft+'px'});
		Element.setStyle(this.lightbox, {zIndex: '1200'});
		
		// Эффекты
		Element.setStyle(this.lightbox, {display:''});
		Element.setStyle(this.element, {display:''});
		Element.setOpacity(this.lightbox, 1);
		new Effect.Appear(this.overlay, { duration: 0.2, from: 0.0, to: 0.8 });	

	},

	hideLightbox: function() {
		// исчезание подложки Lightbox
		Element.setStyle(this.lightbox, {display:'none'});
		Element.setOpacity(this.lightbox, 0);
		new Effect.Fade(this.overlay, { duration: 0.2});
	},

	switchOn: function() {
		// затемняет background и включает Lightbox
		hideSelectBoxes();
		this.showLightbox();
		
	},

	switchOff: function() {
		// выключает Lightbox и приводит background к нормальному состоянию
		var success = this.hideLightbox();
		showSelectBoxes();

	}

}

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

// ---------------------------------------------------
// Для того, чтобы над overlay'ем не было видно SELECT'ов

function showSelectBoxes(){
	selects = document.getElementsByTagName("select");
	for (i = 0; i != selects.length; i++) {
		selects[i].style.visibility = "visible";
	}
}

// ---------------------------------------------------

function hideSelectBoxes(){
	selects = document.getElementsByTagName("select");
	for (i = 0; i != selects.length; i++) {
		selects[i].style.visibility = "hidden";
	}
}

// ---------------------------------------------------


//
// pause(numberMillis)
// Pauses code execution for specified time. Uses busy code, not good.
// Code from http://www.faqts.com/knowledge_base/view.phtml/aid/1602
//
function pause(numberMillis) {
	var now = new Date();
	var exitTime = now.getTime() + numberMillis;
	while (true) {
		now = new Date();
		if (now.getTime() > exitTime)
			return;
	}
}

//
// getPageScroll()
// Returns array with x,y page scroll values.
// Core code from - quirksmode.org
//
function getPageScroll(){

	var yScroll;

	if (self.pageYOffset) {
		yScroll = self.pageYOffset;
	} else if (document.documentElement && document.documentElement.scrollTop){	 // Explorer 6 Strict
		yScroll = document.documentElement.scrollTop;
	} else if (document.body) {// all other Explorers
		yScroll = document.body.scrollTop;
	}

	arrayPageScroll = new Array('',yScroll) 
	return arrayPageScroll;
}

// -----------------------------------------------------------------------------------

//
// getPageSize()
// Returns array with page width, height and window width, height
// Core code from - quirksmode.org
// Edit for Firefox by pHaez
//
function getPageSize(){
	
	var xScroll, yScroll;
	
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	
	var windowWidth, windowHeight;
	if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	} else if (self.innerHeight) {	// all except Explorer
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	}	
	
	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}

	// for small pages with total width less then width of the viewport
	if(xScroll < windowWidth){	
		pageWidth = windowWidth;
	} else {
		pageWidth = xScroll;
	}


	arrayPageSize = new Array(pageWidth,pageHeight+1000,windowWidth,windowHeight); 
	return arrayPageSize;
}


var InetioTinyMCE = Class.create();
InetioTinyMCE.prototype = {
	// initialize()
	// Constructor runs on completion of the DOM loading. Loops through anchor tags looking for 
	// 'lightbox' references and applies onclick events to appropriate links. The 2nd section of
	// the function inserts html at the bottom of the page which is used to display the shadow 
	// overlay and the image container.
	initialize: function(element) {

	}
}

/*****************************************************************

	ActiveWidgets 2.0.2 (evaluation version)
	Copyright (C) 2003-2007 ActiveWidgets Ltd. All Rights Reserved. 
	http://www.activewidgets.com/

	WARNING: This software program is protected by copyright law 
	and international treaties. Unauthorized reproduction or
	distribution of this program, or any portion of it, may result
	in severe civil and criminal penalties, and will be prosecuted
	to the maximum extent possible under the law.

	FOR TESTING AND EVALUATION ONLY:
	This software is not free and is licensed to you for testing 
	and evaluation only. You are not allowed to distribute 
	or use any parts of this software for any other purposes.

*****************************************************************/

 if(!window.AW){var AW=function(a,b){return AW.dispatch(a,b)};AW.version=202;AW.toString=function(){return "ActiveWidgets 2.0.2"}}if(!AW.System){AW.System={}}if(!AW.HTML){AW.HTML={}}if(!AW.Templates){AW.Templates={}}if(!AW.Scroll){AW.Scroll={}}if(!AW.Panels){AW.Panels={}}if(!AW.Formats){AW.Formats={}}if(!AW.HTTP){AW.HTTP={}}if(!AW.CSV){AW.CSV={}}if(!AW.XML){AW.XML={}}if(!AW.UI){AW.UI={}}if(!AW.Grid){AW.Grid={}}if(!AW.Tree){AW.Tree={}}if(!AW.UI.Controllers){AW.UI.Controllers={}}if(!AW.Grid.Controllers){AW.Grid.Controllers={}}
(function(){AW.all={id:0};AW.docs=[document];AW.log=function(level,arg){try{var i,s="";for(i=0;i<arg.length;i++){s+=arg[i]+" "}window.status=s}catch(error){window.status=error.message}};AW.debug=function(){AW.log("debug",arguments)};AW.info=function(){AW.log("info",arguments)};AW.warn=function(){AW.log("warn",arguments)};AW.error=function(){AW.log("error",arguments)};AW.fatal=function(){AW.log("fatal",arguments)};AW.forEach=function(array,handler){var i,custom={};for(i in array){if(!custom[i]){handler(i,array[i])}}};AW.element=function(id){var i,e,docs=AW.docs;for(i=0;i<docs.length;i++){e=docs[i].getElementById(id);if(e){return e}}};AW.object=function(id){var parts=id.split("-");var tag=parts[0];var obj=AW.all[tag];var target=obj;for(var i=1;i<parts.length;i++){if(obj["_"+parts[i]+"Content"]){for(var j=i;j<parts.length;j++){target=target.getContent(parts[j])}break}else if(parts[i+1] && parts[i+1].match(/^(\d+)$/)){if(parts[i+2] && parts[i+2].match(/^(\d+)$/)){if(parts[i+3] && parts[i+3].match(/^(\d+)$/)){obj=obj.getTemplate(parts[i],parts[i+1],parts[i+2],parts[i+3]);i+=3}else{obj=obj.getTemplate(parts[i],parts[i+1],parts[i+2]);i+=2}}else{obj=obj.getTemplate(parts[i],parts[i+1]);i+=1}}else{obj=obj.getTemplate(parts[i])}target=obj}return target};var events={"DOMFocusIn":"focus"};AW.dispatch=function(element,event){var type="_on"+(events[event.type] || event.type)+"Event";var target=AW.object(element.id);var obj=target;while(obj._parent){obj=obj._parent}return target[type].call(obj,event)};AW.paint=function(element){if(element.$paint || !element.offsetWidth){return "inherit"}element.$paint=true;var obj=AW.object(element.id);while(obj && obj._parent){obj=obj._parent}if(obj && obj.raiseEvent){obj.raiseEvent("paint")}window.setTimeout(function(){element.style.removeExpression("visibility");element=null},0);return "inherit"};AW.camelCase=function(){var i,s=arguments[0];for(i=1;i<arguments.length;i++){s+=arguments[i].substr(0,1).toUpperCase()+arguments[i].substr(1)}return s};AW.textPattern=/(\"|&|<|>)/gm;AW.textTable={"\"":"&quot;","&":"&amp;","<":"&lt;",">":"&gt;"};AW.textReplace=function(c){return AW.textTable[c] || ""};AW.htmlPattern=/(&quot;|&amp;|&lt;|&gt;|<[^<>]*>)/gm;AW.htmlTable={"&quot;":"\"","&amp;":"&","&lt;":"<","&gt;":">"};AW.htmlReplace=function(e){return AW.htmlTable[e] || ""};AW.valueToText=function(v){return v?String(v).replace(AW.textPattern,AW.textReplace):""};AW.textToValue=function(t){return t?String(t).replace(AW.htmlPattern,AW.htmlReplace):""}})();
(function(){AW.browser="";if(document.recalc){AW.browser="ie"}else if(window.__defineGetter__){AW.browser="gecko"}else if(window.opera){AW.browser="opera"}else if(navigator.userAgent.match("Safari")){AW.browser="safari"}if(AW.browser){AW[AW.browser]=true}AW.os="";if(!navigator.userAgent.match("Windows")){AW.unix=true}if(navigator.userAgent.match("Mac OS")){AW.os="mac"}if(navigator.userAgent.match("Linux")){AW.os="linux"}AW.strict=(document.compatMode && document.compatMode.match("CSS"))|| AW.browser=="safari";var htmlc=" aw-all";if(AW.strict){htmlc+=" aw-strict"}if(AW.browser){htmlc+=" aw-"+AW.browser}if(AW.unix){htmlc+=" aw-unix"}if(AW.os){htmlc+=" aw-"+AW.os}if(AW.ie){if(typeof(window.XMLHttpRequest)=="object"){AW.ie7=true;htmlc+=" aw-ie7"}else{AW.ie6=true;htmlc+=" aw-ie6"}}if(AW.gecko){if(typeof(document.inputEncoding)=="string"){AW.ff15=true;htmlc+=" aw-ff15"}else{AW.ff1=true;htmlc+=" aw-ff1"}}AW._htmlClasses=htmlc;if(AW.strict){AW.dx=8;AW.dy=4}else{AW.dx=0;AW.dy=0}})();
(function(){if(AW.ie){try{document.execCommand("BackgroundImageCache",false,true)}catch(err){}AW.attachEvent=function(element,name,handler){return element.attachEvent(name,handler)};AW.detachEvent=function(element,name,handler){return element.detachEvent(name,handler)};AW.srcElement=function(event){if(event){return event.srcElement}};AW.toElement=function(event){if(event){return event.toElement}};AW.setReturnValue=function(event,value){if(event){event.returnValue=value}};AW.setCapture=function(element){return element.setCapture()};AW.releaseCapture=function(element){return element.releaseCapture()};AW.addRule=function(stylesheet,selector,rule){return stylesheet.addRule(selector,rule)};AW.getRules=function(stylesheet){return stylesheet.rules};AW.setOuterHTML=function(element,html){element.outerHTML=html};AW.createXMLHttpRequest=function(){try{return new ActiveXObject("MSXML2.XMLHTTP")}catch(err){}try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(err){}try{return new XMLHttpRequest}catch(err){}};AW.getLeft=function(element){return element.getBoundingClientRect().left};AW.getTop=function(element){return element.getBoundingClientRect().top}}})();
(function(){if(AW.gecko){var capture;AW.attachEvent=function(target,name,handler){if(capture){handler[name]=function(event){return handler.call(target,event)};window.addEventListener(name.replace(/^on/,""),handler[name],true)}else{target.addEventListener(name.replace(/^on/,""),handler,false)}};AW.detachEvent=function(target,name,handler){if(capture){window.removeEventListener(name.replace(/^on/,""),handler[name],true);handler[name]=null}else{target.removeEventListener(name.replace(/^on/,""),handler,false)}};AW.srcElement=function(event){try{return(event.target && event.target.nodeType==3)?event.target.parentNode:event.target}catch(e){return event.target}};AW.toElement=function(event){try{return(event.relatedTarget && event.relatedTarget.nodeType==3)?event.relatedTarget.parentNode:event.relatedTarget}catch(e){return event.relatedTarget}};AW.setReturnValue=function(event,value){if(event && event.preventDefault && !value){event.preventDefault()}};AW.setCapture=function(element){capture=element};AW.releaseCapture=function(element){capture=null};AW.addRule=function(stylesheet,selector,rule){var i=stylesheet.cssRules.length;stylesheet.insertRule(selector+"{"+rule+"}",i);stylesheet.cssRules[i].style.cssText=rule};AW.getRules=function(stylesheet){return stylesheet.cssRules};AW.setOuterHTML=function(element,html){var range=element.ownerDocument.createRange();range.setStartBefore(element);var fragment=range.createContextualFragment(html);element.parentNode.replaceChild(fragment,element)};AW.createXMLHttpRequest=function(){return new XMLHttpRequest};AW.getLeft=function(element){var doc=document.getBoxObjectFor(document.body);return document.getBoxObjectFor(element).screenX - doc.screenX+doc.x};AW.getTop=function(element){var doc=document.getBoxObjectFor(document.body);return document.getBoxObjectFor(element).screenY - doc.screenY+doc.y}}})();
 AW.System.Object=function(){};AW.System.Object.subclass=function(){var create=function(cls){cls.created=true;if(cls.superclass && !cls.superclass.created){create(cls.superclass)}cls.create()};var constructor=function(a,b,c){if(constructor.defer){return}if(!constructor.created){create(constructor)}if(this.init){this.init(a,b,c)}};for(var i in this){constructor[i]=this[i]}this.defer=true;constructor.prototype=new this();this.defer=false;constructor.prototype.constructor=constructor;constructor.superclass=this;constructor.created=false;return constructor};AW.System.Object.handle=function(error){throw(error);};AW.System.Object.create=function(){var obj=this.prototype;obj.clone=function(){if(this._clone.prototype!==this){this._clone=function(){this.init()};this._clone.prototype=this}return new this._clone()};obj._clone=function(){};obj.init=function(){};obj.handle=function(error){throw(error);};obj.setTimeout=function(handler,delay){var self=this;var wrapper=function(){handler.call(self)};return window.setTimeout(wrapper,delay?delay:0)};obj.timeout=obj.setTimeout;obj.toString=function(){return ""}};AW.System.Object.create();
 AW.System.Model=AW.System.Object.subclass();AW.System.Model.create=function(){var obj=this.prototype;var join=function(){var i,s=arguments[0];for(i=1;i<arguments.length;i++){s+=arguments[i].substr(0,1).toUpperCase()+arguments[i].substr(1)}return s};obj.defineProperty=function(name,value){var _getProperty=join("get",name);var _setProperty=join("set",name);var _property="_"+name;var getProperty=function(){return this[_property]};this[_setProperty]=function(value){if(typeof value=="function"){this[_getProperty]=value}else{this[_getProperty]=getProperty;this[_property]=value}};this[_setProperty](value)};var get={};var set={};obj.getProperty=function(name,a,b,c){if(!get[name]){get[name]=join("get",name)}return this[get[name]](a,b,c)};obj.setProperty=function(name,value,a,b,c){if(!set[name]){set[name]=join("set",name)}return this[set[name]](value,a,b,c)};obj.isReady=function(){return true}};
 AW.System.Format=AW.System.Object.subclass();AW.System.Format.create=function(){var obj=this.prototype;obj.valueToText=function(value){return value};obj.dataToValue=function(data){return data};obj.dataToText=function(data){var value=this.dataToValue(data);return this.valueToText(value)};obj.setErrorText=function(text){this._textError=text};obj.setErrorValue=function(value){this._valueError=value};obj.setErrorText("#ERR");obj.setErrorValue(NaN);obj.textToValue=function(text){return text};obj.textToData=function(text){return text};obj.valueToData=function(value){return value};obj.comparator=function(values,greater,less,equal,error){return function(i,j){try{var a=values[i];var b=values[j];if(a > b){return greater}if(a < b){return less}return equal(i,j)}catch(e){return error(i,j,e)}}}};
 AW.System.HTML=AW.System.Object.subclass();AW.System.HTML.create=function(){var obj=this.prototype;obj.setTag=function(tag){this._tag=tag;this._outerHTML=""};obj.getTag=function(){return this._tag};obj._tag="span";obj.init=function(){if(this.$owner){return}if(this._parent){return}this._id="aw"+AW.all.id++;AW.all[this._id]=this};obj.getId=function(){return this._id};obj._id="";obj.setId=function(id){this._id=id;AW.all[this._id]=this};obj.element=function(){var i,docs=AW.docs,id=this.getId(),e;for(i=0;i<docs.length;i++){e=docs[i].getElementById(id);if(e){return e}}};obj.getClass=function(name){var param="_"+name+"Class";var value=this[param];return typeof(value)=="function"?value.call(this):value};obj.setClass=function(name,value){var element=this.element();if(element){var v=(typeof(value)=="function")?value.call(this):value;var s=v || v===0 || v===false?" aw-"+name+"-"+v+" ":" ";element.className=element.className.replace(new RegExp("(aw-"+name+"-\\w* *| *$)","g"),"")+s}var param="_"+name+"Class";if(this[param]==null){this._classes+=" "+name}this[param]=value;resetHTMLCache(this)};function resetHTMLCache(obj){obj._outerHTML="";while(obj._parent){obj=obj._parent;obj._innerHTML="";obj._outerHTML=""}if(obj.lock){obj.lock()}}obj.refreshClasses=function(){var element=this.element();if(!element){return}var s="",classes=this._classes.split(" ");for(var i=1;i<classes.length;i++){var name=classes[i];var value=this["_"+name+"Class"];if(typeof(value)=="function"){value=value.call(this)}if(value || value===0 || value===false){s+="aw-"+name+"-"+value+" "}}element.className=s};obj._classes="";obj.getStyle=function(name){var param="_"+name+"Style";var value=this[param];return typeof(value)=="function"?value.call(this):value};obj.setStyle=function(name,value){var element=this.element();if(element){if(!styleNames[name]){styleNames[name]=AW.camelCase.apply(AW,name.split("-"))}var v=(typeof(value)=="function")?value.call(this):value;element.style[styleNames[name]]=v}var param="_"+name+"Style";if(this[param]==null){this._styles+=" "+name}this[param]=value;resetHTMLCache(this)};obj._styles="";var styleNames={};obj.getAttribute=function(name){try{var param="_"+name+"Attribute";var value=this[param];return typeof(value)=="function"?value.call(this):value}catch(error){this.handle(error)}};obj.setAttribute=function(name,value){try{var element=this.element();if(element){var v=(typeof(value)=="function")?value.call(this):value;element[name]=v}var param="_"+name+"Attribute";if(typeof this[param]=="undefined"){this._attributes+=" "+name}if(specialAttributes[name] &&(typeof value=="function")){this[param]=function(){return value.call(this)?true:null}}else{this[param]=value}resetHTMLCache(this)}catch(error){this.handle(error)}};obj._attributes="";var specialAttributes={checked:true,disabled:true,hidefocus:true,readonly:true};obj.getEvent=function(name){try{var param="_"+name+"Event";var value=this[param];return value}catch(error){this.handle(error)}};obj.setEvent=function(name,value){try{var param="_"+name+"Event";if(this[param]==null){this._events+=" "+name}this[param]=value;resetHTMLCache(this)}catch(error){this.handle(error)}};obj._events="";obj.getContent=function(name){try{var split=name.match(/^(\w+)\W(.+)$/);if(split){var ref=this.getContent(split[1]);return ref.getContent(split[2])}else{var param="_"+name+"Content";var value=this[param];if((typeof value=="object")&&(value._parent !=this)){value=value.clone();value._parent=this;this[param]=value}if(value && typeof value=="object" && !value.defineModel){value._id=this._id+"-"+name}return value}}catch(error){this.handle(error)}};obj.setContent=function(name,value){try{if(arguments.length==1){this._content="";if(typeof name=="object"){for(var i in name){if(typeof(i)=="string"){this.setContent(i,name[i])}}}else{this.setContent("html",name)}}else{var split=name.match(/^(\w+)\W(.+)$/);if(split){var ref=this.getContent(split[1]);ref.setContent(split[2],value)}else{var param="_"+name+"Content";if(this[param]==null){this._content+=" "+name}if(value && typeof value=="object"){value._parent=this;if(!value.defineModel){value._id=this._id+"-"+name}}this[param]=value;this._innerHTML="";resetHTMLCache(this)}}}catch(error){this.handle(error)}};obj._content="";var getParamStr=function(i){return "{#"+i+"}"};var getControlFunc=function(v){return function(){return v}};obj.innerHTML=function(){try{if(this._innerHTML){return this._innerHTML}this._innerParamLength=0;var i,j,name,value,param1,param2,html,item,s="";var content=this._content.split(" ");for(i=1;i<content.length;i++){name=content[i];value=this["_"+name+"Content"];if(typeof(value)=="function"){param=getParamStr(this._innerParamLength++);this[param]=value;s+=param}else if(typeof(value)=="object" && value.defineModel){param=getParamStr(this._innerParamLength++);this[param]=getControlFunc(value);s+=param}else if(typeof(value)=="object"){item=value;html=item.outerHTML().replace(/\{id\}/g,"{id}-"+name);for(j=item._outerParamLength-1;j>=0;j--){param1=getParamStr(j);param2=getParamStr(this._innerParamLength+j);if(param1 !=param2){html=html.replace(param1,param2)}this[param2]=item[param1]}this._innerParamLength+=item._outerParamLength;s+=html}else{s+=value}}this._innerHTML=s;return s}catch(error){this.handle(error)}};obj.outerHTML=function(){try{if(this._outerHTML){return this._outerHTML}var innerHTML=this.innerHTML();this._outerParamLength=this._innerParamLength;if(!this._tag){return innerHTML}var i,tmp,name,value,param;var html="<"+this._tag+" id=\"{id}\"";tmp="";var classes=this._classes.split(" ");for(i=1;i<classes.length;i++){name=classes[i];value=this["_"+name+"Class"];if(typeof(value)=="function"){param=getParamStr(this._outerParamLength++);this[param]=value;value=param}if(value || value===0 || value===false){tmp+="aw-"+name+"-"+value+" "}}if(tmp){html+=" class=\""+tmp+"\""}tmp="";var styles=this._styles.split(" ");for(i=1;i<styles.length;i++){name=styles[i];value=this["_"+name+"Style"];if(typeof(value)=="function"){param=getParamStr(this._outerParamLength++);this[param]=value;value=param}tmp+=name+":"+value+";"}if(tmp){html+=" style=\""+tmp+"\""}tmp="";var attributes=this._attributes.split(" ");for(i=1;i<attributes.length;i++){name=attributes[i];value=this["_"+name+"Attribute"];if(typeof(value)=="function"){param=getParamStr(this._outerParamLength++);this[param]=value;value=param}else if(specialAttributes[name] && !value){value=null}if(value !==null){tmp+=" "+name+"=\""+value+"\""}}html+=tmp;tmp="";var events=this._events.split(" ");for(i=1;i<events.length;i++){name=events[i];value=this["_"+name+"Event"];if(typeof(value)=="function"){value="AW(this,event)"}tmp+=" "+name+"=\""+value+"\""}html+=tmp;html+=">"+innerHTML+"</"+this._tag+">";this._outerHTML=html;return html}catch(error){this.handle(error)}};obj.toString=function(){try{var i,s=this._outerHTML;if(!s){s=this.outerHTML()}s=s.replace(id_pattern,this._id);var max=this._outerParamLength;if(param_cache.length < max){for(i=param_cache.length;i<max;i++){param_cache[i]=getParamStr(i)}}for(i=0;i<max;i++){var param=param_cache[i];var value=this[param]();if(value===null){value="";param=specialParams[i];if(!param){param=getSpecialParamStr(i)}}s=s.replace(param,value)}return s}catch(error){this.handle(error)}};var id_pattern=/\{id\}/g;var param_cache=[];var specialParams=[];function getSpecialParamStr(i){return(specialParams[i]=new RegExp("[\\w\\x2D]*=?:?\\x22?\\{#"+i+"\\}[;\\x22]?"))}obj.refresh=function(){try{var element=this.element();if(element){try{var focus=AW.element(AW._focus)}catch(err){}AW.setOuterHTML(element,this.toString());try{if(focus !==AW.element(AW._focus)){AW.element(AW._focus).focus()}}catch(err){}}}catch(error){this.handle(error)}};obj.setSize=function(width,height){if(typeof(width)!="undefined"){this.setStyle("width",width - AW.dx+"px")}if(typeof(height)!="undefined"){this.setStyle("height",height - AW.dy+"px")}};obj.setPosition=function(left,top){this.setStyle("position","absolute");if(typeof(left)!="undefined"){this.setStyle("left",left+"px")}if(typeof(top)!="undefined"){this.setStyle("top",top+"px")}};var errors={101:"non-supported doctype",102:"non-supported browser",103:"non-supported browser"};function hte(i){return function(){return "AW Error:<a href=\"http:\/\/www.activewidgets.com/error."+i+"/\">"+errors[i]+"</a>"}}if(AW.safari){obj.toString=hte(102)}if(AW.opera){obj.toString=hte(103)}};
 AW.System.Template=AW.System.HTML.subclass();AW.System.Template.create=function(){var obj=this.prototype;obj.lock=function(){if(!this.$owner){return}this.$owner[AW.camelCase("set",this.$name,"template")](this,this.$0,this.$1,this.$2)};obj.getTemplate=function(name){var i,args=[],get=AW.camelCase("get",name,"template");for(i=1;i<arguments.length;i++){args[i-1]=arguments[i]}return this[get].apply(this,args)};obj.setTemplate=function(name,template,index){var set=AW.camelCase("set",name,"template");this[set](template,index)};obj.raiseEvent=function(name,source,a,b,c){if(typeof source=="undefined"){source=this;a=this.$0;b=this.$1;c=this.$2}var handler=this[name];if(typeof(handler)=="function"){var r=handler.call(this,source,a,b,c);if(r){return r}}if(this.$owner && this.$owner.raiseEvent){return this.$owner.raiseEvent(name,source,a,b,c)}};obj.action=function(name,source,a,b,c){this.raiseEvent(AW.camelCase("on",name),source,a,b,c)};obj.mapTemplate=function(source,target){var get=AW.camelCase("get",source,"template");if(typeof(target)=="function"){this[get]=target}else{var u,m=AW.camelCase("get",target,"template");this[get]=function(a,b,c){if(a===u){return this.$owner[m](this.$0,this.$1,this.$2)}if(b===u){return this.$owner[m](a,this.$0,this.$1)}if(c===u){return this.$owner[m](a,b,this.$0)}return this.$owner[m](a,b,c)}}this.lock()};obj.mapModel=function(source,target,target2){var get=AW.camelCase("get",source,"property");var set=AW.camelCase("set",source,"property");if(typeof(target)=="function"){this[get]=target;if(typeof(target2)=="function"){this[set]=target2}else{this[set]=function(){}}}else{var _get=AW.camelCase("get",target,"property");var _set=AW.camelCase("set",target,"property");var u;this[get]=function(p,a,b,c){if(a===u){return this.$owner[_get](p,this.$0,this.$1,this.$2)}if(b===u){return this.$owner[_get](p,a,this.$0,this.$1)}if(c===u){return this.$owner[_get](p,a,b,this.$0)}return this.$owner[_get](p,a,b,c)};this[set]=function(p,v,a,b,c){if(a===u){return this.$owner[_set](p,v,this.$0,this.$1,this.$2)}if(b===u){return this.$owner[_set](p,v,a,this.$0,this.$1)}if(c===u){return this.$owner[_set](p,v,a,b,this.$0)}return this.$owner[_set](p,v,a,b,c)}}this.lock()}};
 AW.System.Control=AW.System.HTML.subclass();AW.System.Control.create=function(){AW.System.Template.create.call(this);var obj=this.prototype;var templates=AW.System.Template.prototype;obj.setTag("span");obj.setClass("system","control");obj.setAttribute("aw","control");obj.setAttribute("tabIndex","-1");obj.setAttribute("hideFocus","true");obj.setEvent("oncontextmenu","return false");obj.setEvent("onselectstart","return false");obj.clear=function(){};obj.mapTemplate=function(){};obj.mapModel=function(){};obj.getModel=function(name){var getModel=AW.camelCase("get",name,"model");return this[getModel]()};obj.setModel=function(name,model){var setModel=AW.camelCase("set",name,"model");return this[setModel](model)};obj.defineModel=function(m,z){var ext="_"+m+"Model";var defineProperty=AW.camelCase("define",m,"property");var getProperty=AW.camelCase("get",m,"property");var setProperty=AW.camelCase("set",m,"property");var getModel=AW.camelCase("get",m,"model");var setModel=AW.camelCase("set",m,"model");var clearModel=AW.camelCase("clear",m,"model");var getInt={};var setInt={};var getExt={};var setExt={};var changing={};var changed={};var error={};var undef;this[defineProperty]=function(p,v,arrayValue){var _p="_"+AW.camelCase(m,p);var _p1=_p+"1";var _p2=_p+"2";var _p3=_p+"3";var _x2=_p+"2x";var get=(getInt[p]=AW.camelCase("get",m,p));var set=(setInt[p]=AW.camelCase("set",m,p));var $get=(getExt[p]=AW.camelCase("get",p));var $set=(setExt[p]=AW.camelCase("set",p));var _changing=(changing[p]=AW.camelCase("on",m,p,"changing"));var _changed=(changed[p]=AW.camelCase("on",m,p,"changed"));var _error=(error[p]=AW.camelCase("on",m,p,"error"));this[get]=function(a,b,c){if(this[ext] && this[ext][$get]){return this[ext][$get](a,b,c)}var r;if(c !==undef && this[_p3] && this[_p3][c] && this[_p3][c][b] && this[_p3][c][b][a] !==undef){r=this[_p3][c][b][a]}else if(b !==undef &&(!this[_x2] || !this[_x2][a] || this[_x2][a][b])&& this[_p2] && this[_p2][b] && this[_p2][b][a] !==undef){r=this[_p2][b][a]}else if(a !==undef && this[_p1] && this[_p1][a] !==undef){r=this[_p1][a]}else{r=this[_p]}return(typeof(r)=="function")?r.call(this,a,b,c):r};function isArray(a){return a && typeof(a)=="object" && !a.constructor.subclass && !arrayValue}var setProp=function(v,a,b,c){var i;if(isArray(v)){for(i in v){if(typeof(v[i])=="function"){continue}if(isArray(v[i])){this[_p2]=v;delete this[_p3];delete this[_x2];return}break}if(a !==undef){if(!this[_p2]){this[_p2]={}}this[_p2][a]=v;delete this[_p3]}else{this[_p1]=v;delete this[_p2];delete this[_p3];delete this[_x2]}return}if(c !==undef){if(!this[_p3]){this[_p3]={}}if(!this[_p3][c]){this[_p3][c]={}}if(!this[_p3][c][b]){this[_p3][c][b]={}}this[_p3][c][b][a]=v}else if(b !==undef){if(!this[_p2]){this[_p2]={}}if(!this[_p2][b]){this[_p2][b]={}}this[_p2][b][a]=v;if(this[_x2] && this[_x2][a]){this[_x2][a][b]=true}}else if(a !==undef){if(!this[_p1]){this[_p1]={$owner:this}}else if(this[_p1].$owner !=this){var r=this[_p1];this[_p1]={};for(i in r){this[_p1][i]=r[i]}this[_p1].$owner=this}this[_p1][a]=v;if(this[_p2]){if(!this[_x2]){this[_x2]={}}this[_x2][a]={}}}else{this[_p]=v;delete this[_p1];delete this[_p2];delete this[_p3];delete this[_x2]}};this[set]=function(v,a,b,c){if(this[ext] && this[ext][$set]){return this[ext][$set](v,a,b,c)}var r=this.raiseEvent(_changing,v,a,b,c);if(r){this.raiseEvent(_error,r,a,b,c);return false}setProp.call(this,v,a,b,c);this.raiseEvent(_changed,v,a,b,c);return true};setProp.call(this,v);var clearPrevious=this[clearModel];this[clearModel]=function(){delete this[_x2];delete this[_p3];delete this[_p2];delete this[_p1];delete this[_p];clearPrevious.call(this);setProp.call(this,v)}};this[getProperty]=function(p,a,b,c){try{if(this[ext] && this[ext][getExt[p]]){return this[ext][getExt[p]](a,b,c)}return this[getInt[p]](a,b,c)}catch(error){return this.handle(error)}};this[setProperty]=function(p,v,a,b,c){try{if(this[ext] && this[ext][setExt[p]]){return this[ext][setExt[p]](v,a,b,c)}return this[setInt[p]](v,a,b,c)}catch(error){return this.handle(error)}};templates[getProperty]=function(p,a,b,c){if(a===undef){return this.$owner[getProperty](p,this.$0,this.$1,this.$2)}if(b===undef){return this.$owner[getProperty](p,a,this.$0,this.$1)}if(c===undef){return this.$owner[getProperty](p,a,b,this.$0)}return this.$owner[getProperty](p,a,b,c)};templates[setProperty]=function(p,v,a,b,c){if(a===undef){return this.$owner[setProperty](p,v,this.$0,this.$1,this.$2)}if(b===undef){return this.$owner[setProperty](p,v,a,this.$0,this.$1)}if(c===undef){return this.$owner[setProperty](p,v,a,b,this.$0)}return this.$owner[setProperty](p,v,a,b,c)};this[getModel]=function(){return this[ext]};this[setModel]=function(model){this[ext]=model;if(model){model.$owner=this}};this[clearModel]=function(){if(this[ext] && this[ext].$owner){delete this[ext].$owner}delete this[ext]};var clear=this.clear;this.clear=function(){clear.call(this);this[clearModel]()};var i,zz={};for(i in z){if(!zz[i]){this[defineProperty](i,z[i])}}};obj.defineTemplate=function(name,template){var ref="_"+name+"Template";var ref1=ref+"1",ref2=ref+"2",ref3=ref+"3";var get=AW.camelCase("get",name,"template");var set=AW.camelCase("set",name,"template");var name1="-"+name;var name2="-"+name+"-";var undef;this[get]=function(a,b,c){if(typeof(this[ref])=="function"){return this[ref](a,b,c)}var r,id,clone;if(a===undef){id=this._id+name1;r=this[ref]}else if(b===undef){id=this._id+name2+a;r=this[ref1] && this[ref1][a];if(!r){r=this[ref];clone=true}}else if(c===undef){id=this._id+name2+a+"-"+b;r=this[ref2] && this[ref2][a] && this[ref2][a][b];if(!r){r=(this[ref1] && this[ref1][a])|| this[ref];clone=true}}else{id=this._id+name2+a+"-"+b+"-"+c;r=this[ref3] && this[ref3][a] && this[ref3][a][b] && this[ref3][a][b][c];if(!r){r=(this[ref2] && this[ref2][a] && this[ref2][a][b])||(this[ref1] && this[ref1][a])|| this[ref];clone=true}}if((this.$clone)&&(clone || r.$owner !=this)){r=r.clone()}r.$owner=this;r.$0=a;r.$1=b;r.$2=c;r._id=id;return r};templates[get]=function(a,b,c){if(a===undef){return this.$owner[get](this.$0,this.$1,this.$2)}if(b===undef){return this.$owner[get](a,this.$0,this.$1)}if(c===undef){return this.$owner[get](a,b,this.$0)}return this.$owner[get](a,b,c)};this[set]=function(template,a,b,c){var previous;if(a===undef){previous=this[ref];this[ref]=template}else if(b===undef){if(!this[ref1]){this[ref1]={}}previous=this[ref1][a];this[ref1][a]=template}else if(c===undef){if(!this[ref2]){this[ref2]={}}if(!this[ref2][a]){this[ref2][a]={}}previous=this[ref2][a][b];this[ref2][a][b]=template}else{if(!this[ref3]){this[ref3]={}}if(!this[ref3][a]){this[ref3][a]={}}if(!this[ref3][a][b]){this[ref3][a][b]={}}previous=this[ref3][a][b][c];this[ref3][a][b][c]=template}if(template){template.$name=name;template.$0=a;template.$1=b;template.$2=c;if(template.$owner !=this && template !=previous){template.$owner=this;this.raiseEvent(AW.camelCase("on",name,"templateChanged"),template,a,b,c)}}};this[set](template)};obj.$clone=true;function controlValue(){var text=this.getControlText();var format=this.getControlFormat();return format?format.textToValue(text):text}obj.defineModel("tab",{index:0});obj.defineModel("control",{text:"",image:"",link:"",value:controlValue,format:"",tooltip:"",state:"",visible:true,disabled:false});obj.setControlSize=obj.setSize;obj.setControlPosition=obj.setPosition;obj.onControlVisibleChanged=function(value){this.setClass("visible",value)};obj.focus=function(){};obj.setController=function(name,controller){var i,n="_"+name+"Controller";this[n]=controller;for(i=0;i<this._controllers.length;i++){if(this._controllers[i]==n){return}}this._controllers=this._controllers.concat();this._controllers.push(n)};obj._controllers=[];obj.raiseEvent=function(name,source,a,b,c){var i,r;var handler=this[name];if(typeof(handler)=="function"){r=handler.call(this,source,a,b,c);if(r){return r}}for(i=0;i<this._controllers.length;i++){handler=this[this._controllers[i]]?this[this._controllers[i]][name]:null;if(typeof(handler)=="function"){r=handler.call(this,source,a,b,c);if(r){return r}}else if(typeof(handler)=="string" && handler !=name){r=this.raiseEvent(handler,source,a,b,c);if(r){return r}}}};obj.action=function(name,source,a,b,c){this.raiseEvent(AW.camelCase("on",name),source,a,b,c)};var keyNames={8:"Backspace",9:"Tab",13:"Enter",27:"Escape",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12"};obj.setEvent("onkeydown",function(event){var key=keyNames[event.keyCode];if(event.keyCode >=48 && event.keyCode <=90){key=String.fromCharCode(event.keyCode)}if(key){if(event.shiftKey){key="Shift"+key}if(event.altKey){key="Alt"+key}if(event.ctrlKey){key="Ctrl"+key}this.raiseEvent("onKey"+key,event)}});obj.setEvent("onkeypress",function(event){if((AW.ie || event.charCode)&& !(event.altKey || event.ctrlKey)){this.raiseEvent("onKeyPress",event)}});var targets={};function raiseControlEvent(name,element,event,attr){if(attr){name=AW.camelCase("on",element.getAttribute(attr),name)}var a=((element.id.match(/-*\d*-*\d*-*\d+$/)|| ["-"])+"").split("-");var target=AW.object(element.id);if(target && target.raiseEvent){return target.raiseEvent(name,event,a[1],a[2],a[3])}}function handleMouse(e,event){try{if(AW.ignoreMouse){return}var i,h,x,y,z,t={};while(e){if(e.getAttribute &&(e.getAttribute("aw")||e.getAttribute("awx"))){t[e.id]=true}e=e.parentNode}for(i in targets){if(!t[i]){e=AW.element(i);if(e && e.getAttribute("aw")){raiseControlEvent("mouseOut",e,event,"aw");if(e.getAttribute("aw")=="row" && e.id.match(/(.+-\d+-)\d+/)){y=RegExp.$1;for(x=0;x<3;x++){z=AW.element(y+x);if(z){z.className=z.className.replace(/ aw-mouse(over|down)-row/g,"")}}}else if(e.getAttribute("aw")!="control"){e.className=e.className.replace(/ aw-mouse(over|down)-\w+/g,"")}}if(e && e.getAttribute("awx")){e.className=e.className.replace(/ aw-mouse(over|down)-\w+/g,"")}}}for(i in t){if(!targets[i]){e=AW.element(i);if(e && e.getAttribute("aw")){raiseControlEvent("mouseOver",e,event,"aw");if(e.getAttribute("aw")=="row" && e.id.match(/(.+-\d+-)\d+/)){y=RegExp.$1;for(x=0;x<3;x++){z=AW.element(y+x);if(z){z.className+=" aw-mouseover-row"}}}else if(e.getAttribute("aw")!="control"){e.className+=" aw-mouseover-"+e.getAttribute("aw").toLowerCase();if(AW.ie){h=e.offsetHeight}}}if(e && e.getAttribute("awx")){e.className+=" aw-mouseover-"+e.getAttribute("awx").toLowerCase()}}}targets=t;e=null}catch(error){}}var mouseDownId="";var handlers={onmousemove:function(event){handleMouse(AW.srcElement(event),event)},onmouseover:function(event){handleMouse(AW.srcElement(event),event)},onmouseout:function(event){handleMouse(AW.toElement(event),event)},onmousedown:function(event){try{var e=AW.srcElement(event);var x=false;var s="MouseDown";if(event.shiftKey){s="Shift"+s}if(event.altKey){s="Alt"+s}if(event.ctrlKey){s="Ctrl"+s}while(e){if(e.getAttribute && e.getAttribute("aw")){raiseControlEvent(s,e,event,"aw");e=AW.element(e.id);x=true;if(e.getAttribute("aw")!="control"){e.className+=" aw-mousedown-"+e.getAttribute("aw").toLowerCase()}}if(e.getAttribute && e.getAttribute("awx")){e.className+=" aw-mousedown-"+e.getAttribute("awx").toLowerCase()}e=e.parentNode}e=null;if(x &&(AW.srcElement(event)!==AW.element(AW.srcElement(event).id))){mouseDownId=AW.srcElement(event).id}}catch(x){}},onmouseup:function(event){try{var e=AW.srcElement(event);var s="MouseUp";if(event.shiftKey){s="Shift"+s}if(event.altKey){s="Alt"+s}if(event.ctrlKey){s="Ctrl"+s}while(e){if(e.getAttribute && e.getAttribute("aw")){raiseControlEvent(s,e,event,"aw");e=AW.element(e.id);if(e.getAttribute("aw")!="control"){e.className=e.className.replace(/ aw-mousedown-\w+/g,"")}}if(e.getAttribute && e.getAttribute("awx")){e.className=e.className.replace(/ aw-mousedown-\w+/g,"")}e=e.parentNode}e=null;var clickEvent;if(mouseDownId &&(mouseDownId==AW.srcElement(event).id)){if(AW.ie){clickEvent=document.createEventObject(event);event.srcElement.fireEvent("onclick",clickEvent)}else{clickEvent=document.createEvent("MouseEvents");clickEvent.initMouseEvent("click",true,true,event.view,1,event.screenX,event.screenY,event.clientX,event.clientY,event.ctrlKey,event.altKey,event.shiftKey,event.metaKey,event.button,null);event.target.dispatchEvent(clickEvent)}}clickEvent=null}catch(x){}},onclick:function(event){try{var e=AW.srcElement(event);var s="Clicked";if(event.shiftKey){s="Shift"+s}if(event.altKey){s="Alt"+s}if(event.ctrlKey){s="Ctrl"+s}while(e){if(e.getAttribute && e.getAttribute("aw")){raiseControlEvent(s,e,event,"aw");e=AW.element(e.id)}e=e.parentNode}e=null}catch(x){}},ondblclick:function(event){try{var e=AW.srcElement(event);var s="DoubleClicked";if(event.shiftKey){s="Shift"+s}if(event.altKey){s="Alt"+s}if(event.ctrlKey){s="Ctrl"+s}while(e){if(e.getAttribute && e.getAttribute("aw")){raiseControlEvent(s,e,event,"aw");e=AW.element(e.id)}e=e.parentNode}e=null}catch(x){}},onbeforeactivate:function(event){try{var e=AW.srcElement(event);while(e){if(e.getAttribute && e.getAttribute("aw")=="control" && !AW.object(e.id).$active){if(raiseControlEvent("onControlActivating",e,event)){AW.setReturnValue(event,false)}e=AW.element(e.id)}e=e.parentNode}e=null}catch(x){}},onbeforedeactivate:function(event){try{var e=AW.srcElement(event);while(e){if(e.getAttribute && e.getAttribute("aw")=="control" && !e.contains(event.toElement)){if(raiseControlEvent("onControlDeactivating",e,event)){AW.setReturnValue(event,false)}e=AW.element(e.id)}e=e.parentNode}e=null}catch(x){}},onactivate:function(event){try{var e=AW.srcElement(event);AW._focus=e.id;while(e){if(e.getAttribute && e.getAttribute("aw")=="control" && !AW.object(e.id).$active){AW.object(e.id).$active=true;raiseControlEvent("onControlActivated",e,event);e=AW.element(e.id)}e=e.parentNode}e=null}catch(x){}},ondeactivate:function(event){try{var e=AW.srcElement(event);while(e){if(e.getAttribute && e.getAttribute("aw")=="control" && !e.contains(event.toElement)){AW.object(e.id).$active=false;raiseControlEvent("onControlDeactivated",e,event);e=AW.element(e.id)}e=e.parentNode}e=null}catch(x){}}};var activeElements={};function focusemu(event){try{if(AW.lockFocus){return}var e=event.target,a={};AW._focus=e.id;while(e){if(e.getAttribute && e.getAttribute("aw")=="control" && !e.getAttribute("disabled")){a[e.id]=true}e=e.parentNode}function raiseEvents(a1,a2,name,state){var i,e,x={};for(i in a1){if(!a2[i] && !x[i]){e=AW.element(i);if(e && e.getAttribute("aw")=="control"){if(state !==undefined){AW.object(i).$active=state}raiseControlEvent(name,e,event);e=AW.element(e.id)}}}}raiseEvents(activeElements,a,"onControlDeactivating");raiseEvents(a,activeElements,"onControlActivating");raiseEvents(activeElements,a,"onControlDeactivated",false);raiseEvents(a,activeElements,"onControlActivated",true);activeElements=a}catch(x){}}function mousewheelemu(event){try{var e=event.target;while(e){if(e.getAttribute && e.getAttribute("onDOMMouseScroll")){return AW(e,event)}e=e.parentNode}e=null}catch(x){}}obj.$active=false;AW.register=function(win){if(win !=window){win.AW=AW;AW.docs.push(win.document)}var target=AW.ie?win.document.getElementsByTagName("html")[0]:win.document;AW.forEach(handlers,function(name,handler){AW.attachEvent(target,name,handler)});if(!AW.ie){target.addEventListener("focus",focusemu,true);target.addEventListener("DOMMouseScroll",mousewheelemu,true)}function unregister(){AW.unregister(win);AW.detachEvent(win,"onunload",unregister);win=null}AW.attachEvent(win,"onunload",unregister)};AW.unregister=function(win){var target=AW.ie?win.document.getElementsByTagName("html")[0]:win.document;AW.forEach(handlers,function(name,handler){AW.detachEvent(target,name,handler)});if(!AW.ie){target.removeEventListener("focus",focusemu,true);target.removeEventListener("DOMMouseScroll",mousewheelemu,true)}if(win !=window){var i,docs=AW.docs;for(i=0;i<docs.length;i++){if(docs[i]==win.document){docs.splice(i,1);return}}win.AW=null}};AW.register(window)};
 AW.Formats.String=AW.System.Format.subclass();AW.Formats.String.create=function(){var obj=this.prototype;obj.valueToText=function(data){return data?String(data).replace(AW.textPattern,AW.textReplace):""};obj.textToValue=function(text){return text?String(text).replace(AW.htmlPattern,AW.htmlReplace):""};obj.dataToText=obj.valueToText;obj.textToData=obj.textToValue;if("".localeCompare){obj.comparator=function(values,greater,less,equal,error){return function(i,j){try{return greater *(""+values[i]).localeCompare(values[j])|| equal(i,j)}catch(e){return error(i,j,e)}}}}};
 AW.Formats.Number=AW.System.Format.subclass();AW.Formats.Number.create=function(){var obj=this.prototype;obj.dataToValue=function(v){return Number((""+v).replace(numPattern,""))};obj.textToValue=function(v){return Number((""+v).replace(numPattern,""))};var numPattern=/[^0-9.\-+]+/gm;var noFormat=function(value){return ""+value};var doFormat=function(value){var abs=(value<0)?-value:value;var rounded=value.toFixed(this._decimals);if(abs<1000){return rounded.replace(this.p1,this.r1)}if(abs<1000000){return rounded.replace(this.p2,this.r2)}if(abs<1000000000){return rounded.replace(this.p3,this.r3)}return rounded.replace(this.p4,this.r4)};obj.setTextFormat=function(format){var pattern=/^([^0#]*)([0#]*)([ .,]?)([0#]|[0#]{3})([.,])([0#]*)([^0#]*)$/;var f=format.replace(/\$/g,"$$$$").match(pattern);if(!f){this.valueToText=function(value){return ""+value};this.dataToText=function(value){return ""+value};return}this.valueToText=doFormat;this.dataToText=function(v){return doFormat.call(this,Number((""+v).replace(numPattern,"")))};var rs=f[1];var rg=f[3];var rd=f[5];var re=f[7];this._decimals=f[6].length;var ps="^(-?\\d+)",pm="(\\d{3})",pe="\\.(\\d{"+this._decimals+"})$";if(!this._decimals){pe="($)";rd=""}this.p1=new RegExp(ps+pe);this.p2=new RegExp(ps+pm+pe);this.p3=new RegExp(ps+pm+pm+pe);this.p4=new RegExp(ps+pm+pm+pm+pe);this.r1=rs+"$1"+rd+"$2"+re;this.r2=rs+"$1"+rg+"$2"+rd+"$3"+re;this.r3=rs+"$1"+rg+"$2"+rg+"$3"+rd+"$4"+re;this.r4=rs+"$1"+rg+"$2"+rg+"$3"+rg+"$4"+rd+"$5"+re};obj.setTextFormat("")};
 AW.Formats.Date=AW.System.Format.subclass();AW.Formats.Date.create=function(){var obj=this.prototype;obj.date=new Date();var shortMonths=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var longMonths=["January","February","March","April","May","June","July","August","September","October","November","December"];var shortWeekdays=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var longWeekdays=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];if(!obj.shortMonths){obj.shortMonths=shortMonths}if(!obj.longMonths){obj.longMonths=longMonths}if(!obj.shortWeekdays){obj.shortWeekdays=shortWeekdays}if(!obj.longWeekdays){obj.longWeekdays=longWeekdays}obj.digits=[];for(var i=0;i<100;i++){obj.digits[i]=i<10?"0"+i:""+i}var tokens={"hh":"this.digits[this.date.getUTCHours()]","h":"this.date.getUTCHours()",":mm":"':'+this.digits[this.date.getUTCMinutes()]","mm:":"this.digits[this.date.getUTCMinutes()]+':'","ss":"this.digits[this.date.getUTCSeconds()]","tt":"(this.date.getUTCHours()>11?'PM':'AM')","dddd":"this.longWeekdays[this.date.getUTCDay()]","ddd":"this.shortWeekdays[this.date.getUTCDay()]","dd":"this.digits[this.date.getUTCDate()]","d":"this.date.getUTCDate()","mmmm":"this.longMonths[this.date.getUTCMonth()]","mmm":"this.shortMonths[this.date.getUTCMonth()]","mm":"this.digits[this.date.getUTCMonth()+1]","m":"(this.date.getUTCMonth()+1)","yyyy":"this.date.getUTCFullYear()","yy":"this.digits[this.date.getUTCFullYear()%100]"};var tokens12={},match="";for(i in tokens){if(typeof(i)=="string"){tokens12[i]=tokens[i];match+="|"+i}}tokens12.hh="this.digits[1+(this.date.getUTCHours()+11)%12]";tokens12.h="(1+(this.date.getUTCHours()+11)%12)";var re=new RegExp(match.replace("|","(")+")","gi");var reverse={"hh":["(\\d{1,2})","a[3]=",";"],"h":["(\\d{1,2})","a[3]=",";"],":mm":[":(\\d{1,2})","a[4]=",";"],"mm:":["(\\d{1,2}):","a[4]=",";"],"ss":["(\\d{1,2})","a[5]=",";"],"tt":["(AM|PM)","a[3]=","=='AM'?a[3]%12:a[3]%12+12;"],"dd":["(\\d{1,2})","a[2]=",";"],"d":["(\\d{1,2})","a[2]=",";"],"mmmm":["([^\\s\\x2c-\\x2f\\x5c;]+)","a[1]=this.rMonths[",".toLowerCase()];"],"mmm":["([^\\s\\x2c-\\x2f\\x5c;]+)","a[1]=this.rMonths[",".toLowerCase()];"],"mm":["(\\d{1,2})","a[1]=Number(",")-1;"],"m":["(\\d{1,2})","a[1]=Number(",")-1;"],"yyyy":["(\\d{1,4})","a[0]=Number(",");if(a[0]<30){a[0]+=2000};"],"yy":["(\\d{1,4})","a[0]=Number(",");if(a[0]<30){a[0]+=2000};"]};var delim=/[\s\x2c-\x2f\x5c;]+/g;obj.setTextFormat=function(format){format=format.replace(/am\/pm/i,"tt");var tok=format.match("tt")?tokens12:tokens;var code=format.replace(re,function(i){return "'+"+tok[i.toLowerCase()]+"+'"});code="if(isNaN(value)||(value===this._valueError))return this._textError;"+"this.date.setTime(value+this._textTimezoneOffset);"+("return '"+code+"'").replace(/(''\+|\+'')/g,"");this.valueToText=new Function("value",code);var num=0;code="var a=[this._year,0,1];if(String(text).match(this._t2v)){\n";function item(i){i=i.toLowerCase();if(reverse[i]){code+=reverse[i][1]+"RegExp.$"+(++num)+reverse[i][2];return reverse[i][0]}else{return "\\w+"}}this._t2v=new RegExp(format.replace(delim,"[\\s\\x2c-\\x2f\\x5c;]+").replace(re,item));code+="\n return Date.UTC.apply(this,a)- this._textTimezoneOffset}else{return this._valueError}";this.textToValue=new Function("text",code);this.rMonths={};for(var m=0;m<12;m++){this.rMonths[m+1]=m;this.rMonths[this.digits[m+1]]=m;this.rMonths[shortMonths[m].toLowerCase()]=m;this.rMonths[longMonths[m].toLowerCase()]=m;this.rMonths[this.shortMonths[m].toLowerCase()]=m;this.rMonths[this.longMonths[m].toLowerCase()]=m}this._year=(new Date).getUTCFullYear()};var xmlExpr=/(\d\d\d\d)-(\d\d)-(\d\d)[T ]?(\d\d)?(:\d\d)?(:\d\d)?(\.\d+)?Z?([+-]\d\d)?:?(\d\d)?/;var xmlOut="$1/$2/$3 $4$5$6 GMT$8$9";var auto=function(data){var value=Date.parse(data+this._dataTimezoneCode);return isNaN(value)?this._valueError:value};var RFC822=function(data){var value=Date.parse(data);return isNaN(value)?this._valueError:value};var ISO8601=function(data){var value=Date.parse(data.replace(xmlExpr,xmlOut));return isNaN(value)?this._valueError:value};obj.setDataFormat=function(format){if(format=="RFC822" || format=="rfc822"){this.dataToValue=RFC822}else if(format=="ISO8601" || format=="iso8601" || format=="ISO8061"){this.dataToValue=ISO8601}else{this.dataToValue=auto}};obj.setTextTimezone=function(value){this._textTimezoneOffset=value};obj.setDataTimezone=function(value){if(!value){this._dataTimezoneCode=" GMT"}else{this._dataTimezoneCode=" GMT"+(value>0?"+":"-")+this.digits[Math.floor(Math.abs(value/3600000))]+this.digits[Math.abs(value/60000)%60]}};var localTimezone=- obj.date.getTimezoneOffset()* 60000;obj.setTextTimezone(localTimezone);obj.setDataTimezone(localTimezone);obj.setTextFormat("m/d/yyyy");obj.setDataFormat("default")};
 AW.Formats.HTML=AW.System.Format.subclass();AW.Formats.HTML.create=function(){var obj=this.prototype;obj.dataToValue=function(data){return data?data.replace(AW.htmlPattern,AW.htmlReplace):""};obj.dataToText=function(data){return data};obj.textToValue=obj.dataToValue;if("".localeCompare){obj.comparator=function(values,greater,less,equal,error){return function(i,j){try{return greater *(""+values[i]).localeCompare(values[j])|| equal(i,j)}catch(e){return error(i,j,e)}}}}};
 AW.HTML.define=function(name,tag,type){if(!tag){tag=name.toLowerCase()}AW.HTML[name]=AW.System.HTML.subclass();AW.HTML[name].create=function(){this.prototype.setTag(tag)}};(function(){var i,tags=["DIV","SPAN","IMG","INPUT","BUTTON","TEXTAREA","TABLE","TR","TD"];for(i=0;i<tags.length;i++){AW.HTML.define(tags[i])}})();
 AW.Templates.ImageText=AW.System.Template.subclass();AW.Templates.ImageText.create=function(){var obj=this.prototype;function _image(){return this.getControlProperty("image")|| "none"}function _text(){return this.getControlProperty("text")}function _tooltip(){return this.getControlProperty("tooltip")}var span=AW.HTML.SPAN;var image=new span;image.setClass("item","image");image.setClass("image",_image);var ruler=new span;ruler.setClass("item","ruler");var text=new span;text.setClass("item","text");text.setContent("html",_text);var box=new span;box.setClass("item","box");box.setContent("sign","");box.setContent("marker","");box.setContent("image",image);box.setContent("ruler",ruler);box.setContent("text",text);obj.setTag("span");obj.setClass("item","template");obj.setClass("templates","imagetext");obj.setAttribute("title",_tooltip);obj.setContent("box",box);if(AW.gecko){obj.setAttribute("tabIndex","-1")}var startEditIE=function(startText){var self=this;var item=self.getAttribute("aw");var originalText=self.getControlProperty("text");var text=originalText;var valid;var e=self.getContent("box/text").element();var x=self.element();if(!e || !x){return}var input=(e.tagName=="input")||(e.tagName=="INPUT");function raiseEvent(name){var text1=self.getControlProperty("text");var fullname=AW.camelCase("on",item,name);var result=self.raiseEvent(fullname,text,self.$0,self.$1,self.$2);var text2=self.getControlProperty("text");if(text2 !=text1){updateText(text2)}return result}if(raiseEvent("editStarting")){e=null;x=null;return}function nobubble(event){event.cancelBubble=true}function updateText(text){if(input){e.value=text}else{e.innerHTML=text}}function onpropertychange(event){var text1=self.getControlProperty("text");var text2=input?e.value:e.innerHTML.replace(/&nbsp;/g," ");if(text2 !=text1){self.setControlProperty("text",text2)}var text3=self.getControlProperty("text");if(text3 !=text2){updateText(text3)}}function onkeydown(event){if(event.keyCode==27){if(input){e.value=originalText}else{e.innerHTML=originalText}event.returnValue=false;if(item=="control"){return}onbeforedeactivate(event);if(valid){ondeactivate(event)}return}if(event.keyCode==13){text=self.getControlProperty("text");if(item=="control"){if(raiseEvent("validating")){return}raiseEvent("validated");return}event.returnValue=false;event.cancelBubble=true;onbeforedeactivate(event);if(valid){ondeactivate(event)}return}var r;if(input){r=e.createTextRange()}else{r=document.body.createTextRange();r.moveToElementText(e)}var s=document.selection.createRange();if((event.keyCode==36 || event.keyCode==37)&& r.compareEndPoints("StartToStart",s)){event.cancelBubble=true;r=null;s=null;return}if((event.keyCode==35 || event.keyCode==39)&& r.compareEndPoints("EndToEnd",s)){event.cancelBubble=true;r=null;s=null;return}}function onbeforedeactivate(event){valid=false;text=self.getControlProperty("text");if(input && text !=e.value){text=e.value;self.setControlProperty("text",text)}if(!input && text !=e.innerHTML.replace(/&nbsp;/g," ")){text=e.innerHTML.replace(/&nbsp;/g," ");self.setControlProperty("text",text)}var text2=self.getControlProperty("text");if(text2 !=text){updateText(text2);text=text2}if(self.element().contains(event.toElement)){event.returnValue=false;return}if(raiseEvent("editEnding")){event.cancelBubble=true;event.returnValue=false;return}if(originalText==text){valid=true;return}if(raiseEvent("validating")){event.cancelBubble=true;event.returnValue=false;return}raiseEvent("validated");valid=true}function ondeactivate(event){text=self.getControlProperty("text");e.removeExpression("aw-value");e.detachEvent("onselectstart",nobubble);e.detachEvent("oncontextmenu",nobubble);x.detachEvent("onmousedown",nobubble);x.detachEvent("onmouseup",nobubble);x.detachEvent("onclick",nobubble);x.detachEvent("ondoubleclick",nobubble);e.detachEvent("onpropertychange",onpropertychange);e.detachEvent("onkeydown",onkeydown);e.detachEvent("onbeforedeactivate",onbeforedeactivate);e.detachEvent("ondeactivate",ondeactivate);document.selection.empty();if(!input){e.contentEditable=false}e.parentNode.scrollLeft=0;x.className=x.className.replace(" aw-edit-"+item,"");if(self.$owner){self.$owner.$edit=false}raiseEvent("editEnded");e=null;x=null}x.className=x.className.replace(/ aw-mousedown-\w+/g,"")+" aw-edit-"+item;if(!input){e.contentEditable=true}e.attachEvent("onselectstart",nobubble);e.attachEvent("oncontextmenu",nobubble);if(input){e.select()}else{if(typeof(startText)=="string"){e.focus()}else{var r=document.body.createTextRange();r.moveToElementText(e);r.select();r=null}}e.setExpression("aw-value",input?"this.value":"this.innerHTML");x.attachEvent("onmousedown",nobubble);x.attachEvent("onmouseup",nobubble);x.attachEvent("onclick",nobubble);x.attachEvent("ondoubleclick",nobubble);e.attachEvent("onpropertychange",onpropertychange);e.attachEvent("onkeydown",onkeydown);e.attachEvent("onbeforedeactivate",onbeforedeactivate);e.attachEvent("ondeactivate",ondeactivate);if(self.$owner){self.$owner.$edit=true}raiseEvent("editStarted");if(typeof(startText)=="string"){e.innerHTML=startText}};var startEditGecko=function(startText){var self=this;var item=self.getAttribute("aw");var originalText=self.getControlProperty("text");var text=originalText;var e=self.getContent("box/text").element();var x=self.element();if(!e || !x){return}var input=(e.tagName=="input")||(e.tagName=="INPUT");var updateText=function(text){if(input){e.value=text}else{e.innerHTML=text}};function raiseEvent(name){var text1=self.getControlProperty("text");var fullname=AW.camelCase("on",item,name);var result=self.raiseEvent(fullname,text,self.$0,self.$1,self.$2);var text2=self.getControlProperty("text");if(text2 !=text1){updateText(text2)}return result}if(raiseEvent("editStarting")){e=null;x=null;return}updateText=function(text){e.value=text};function nobubble(event){event.stopPropagation()}function oninput(event){var text1=self.getControlProperty("text");var text2=e.value;if(text2 !=text1){self.setControlProperty("text",text2)}var text3=self.getControlProperty("text");if(text3 !=text2){updateText(text3)}text=text3}function onkeydown(event){if(event.keyCode==27){e.value=originalText;event.preventDefault();if(item=="control"){return}try{self.$owner.getContent("focus").element().focus();return}catch(err){}onfocus(event);return}if(event.keyCode==13){text=self.getControlProperty("text");if(item=="control"){insideFocus=true;if(raiseEvent("validating")){insideFocus=false;return}raiseEvent("validated");insideFocus=false;return}event.preventDefault();event.stopPropagation();try{self.$owner.getContent("focus").element().focus();return}catch(err){}onfocus(event);return}if((event.keyCode==36 || event.keyCode==37)&& e.selectionStart > 0){event.stopPropagation();return}if((event.keyCode==35 || event.keyCode==39)&& e.selectionStart < e.value.length){event.stopPropagation();return}}function cancelEvent(event){if(event.target !=document){event.preventDefault();event.stopPropagation()}}var insideFocus;function focusBack(event){event.preventDefault();event.stopPropagation();e.focus();window.removeEventListener("blur",cancelEvent,true);insideFocus=false}var inDocFocus;function docFocus(event){if(inDocFocus){return}inDocFocus=true;var e=document.createEvent("HTMLEvents");e.initEvent("focus",false,false);e.deferred=true;window.setTimeout(function(){if(inDocFocus){onfocus(e)}e=null})}function onfocus(event){if(event.type=="focus" && event.target==document && !event.deferred){return docFocus(event)}inDocFocus=false;if(insideFocus ||(event.type=="focus" && event.target==e)){return}insideFocus=true;window.addEventListener("blur",cancelEvent,true);function isInside(parent,child){try{var range=document.createRange();range.selectNode(parent);return child &&(range.compareNode(child)==3)}catch(err){return false}}if(event.type=="focus" &&(isInside(x,event.target)|| isInside(self.$popup,event.target))){return focusBack(event)}oninput(event);if(raiseEvent("editEnding")){return focusBack(event)}if(text !=originalText){if(raiseEvent("validating")){return focusBack(event)}raiseEvent("validated")}window.removeEventListener("blur",cancelEvent,true);insideFocus=false;e.removeEventListener("contextmenu",nobubble,false);x.removeEventListener("mousedown",nobubble,false);x.removeEventListener("mouseup",nobubble,false);x.removeEventListener("click",nobubble,false);x.removeEventListener("doubleclick",nobubble,false);e.removeEventListener("input",oninput,false);e.removeEventListener("keydown",onkeydown,false);window.removeEventListener("focus",onfocus,true);if(!input){node2.innerHTML=self.getControlProperty("text");e.parentNode.replaceChild(node2,e)}x.className=x.className.replace(" aw-edit-"+item,"");AW.lockFocus=false;if(self.$owner){self.$owner.$edit=false}raiseEvent("editEnded");e=null;x=null;node1=null;node2=null;if(event.type=="focus" && event.deferred){document.dispatchEvent(event)}}x.className=x.className.replace(/ aw-mousedown-\w+/g,"")+" aw-edit-"+item;if(input){e.select()}else{var node1=document.createElement("input");node1.setAttribute("id",e.id);node1.setAttribute("type","text");node1.setAttribute("class",e.className);node1.setAttribute("autocomplete","off");node1.setAttribute("value",text);var node2=e.parentNode.replaceChild(node1,e);e=node1;e.select()}e.addEventListener("contextmenu",nobubble,false);x.addEventListener("mousedown",nobubble,false);x.addEventListener("mouseup",nobubble,false);x.addEventListener("click",nobubble,false);x.addEventListener("doubleclick",nobubble,false);e.addEventListener("input",oninput,false);e.addEventListener("keydown",onkeydown,false);window.addEventListener("focus",onfocus,true);AW.lockFocus=true;if(self.$owner){self.$owner.$edit=true}raiseEvent("editStarted");if(typeof(startText)=="string"){e.value=startText;oninput.call(self)}};if(AW.ie){obj.startEdit=startEditIE}if(!AW.ie){obj.startEdit=startEditGecko}};
 AW.Templates.Image=AW.Templates.ImageText.subclass();AW.Templates.Image.create=function(){var obj=this.prototype;obj.setClass("templates","image");var box=obj.getContent("box");if(!AW.gecko){box.setTag("")}box.setContent("text","");obj.startEdit=null};
 AW.Templates.Text=AW.Templates.ImageText.subclass();AW.Templates.Text.create=function(){var obj=this.prototype;obj.setClass("templates","text");var box=obj.getContent("box");if(!AW.gecko){box.setTag("")}box.setContent("image","")};
 AW.Templates.Link=AW.Templates.ImageText.subclass();AW.Templates.Link.create=function(){var obj=this.prototype;obj.setTag("a");obj.setClass("templates","link");obj.setAttribute("tabIndex","-1");obj.setAttribute("href",function(){return this.getControlProperty("link")|| null});var box=obj.getContent("box");if(!AW.gecko){box.setTag("")}obj.startEdit=null};

 AW.Templates.CheckBox=AW.Templates.ImageText.subclass();AW.Templates.CheckBox.create=function(){var obj=this.prototype;obj.setClass("value",function(){return this.getControlProperty("value")|| false});obj.setClass("toggle","checkbox");obj.setClass("templates","checkbox");obj.setAttribute("awx","toggle");var marker=new AW.HTML.SPAN;marker.setClass("item","marker");obj.setContent("box/marker",marker);obj.setEvent("onclick",function(){var value=this.getControlProperty("value");this.setControlProperty("value",!value)});obj.startEdit=null};AW.Templates.Checkbox=AW.Templates.CheckBox;

 AW.Templates.CheckedItem=AW.Templates.CheckBox.subclass();AW.Templates.CheckedItem.create=function(){var obj=this.prototype;obj.setClass("templates","checkeditem");obj.setClass("value",function(){return this.getStateProperty("selected")|| false});obj.setEvent("onclick",function(){var selected=this.getStateProperty("selected");this.setStateProperty("selected",!selected)})};

 AW.Templates.Radio=AW.Templates.CheckedItem.subclass();AW.Templates.Radio.create=function(){var obj=this.prototype;obj.setClass("toggle","radio");obj.setClass("templates","radio");obj.setEvent("onclick","")};
 AW.Templates.Popup=AW.System.Template.subclass();AW.Templates.Popup.create=function(){var obj=this.prototype;obj.setClass("popup","normal");obj.showPopup=function(){var popup=window.createPopup();this.$popup=popup;AW.$popup=this;var doc=popup.document;doc.open();if(AW.strict){doc.write("<!DOCTYPE HTML PUBLIC \"-\/\/W3C\/\/DTD HTML 4.01\/\/EN\" \"http:\/\/www.w3.org/TR/html4/strict.dtd\">")}doc.write("<html class=\"aw-popup-window aw-system-control "+AW._htmlClasses+"\"><head>");AW.register(doc.parentWindow);for(var i=0;i<document.styleSheets.length;i++){doc.write(document.styleSheets[i].owningElement.outerHTML)}doc.write("</head><body onselectstart=\"return false\" oncontextmenu=\"return false\">");doc.write(this.getPopupTemplate().toString());doc.write("</body></html>");doc.close();var ref=this.element();var left=0;var top=ref.offsetHeight;var width=ref.offsetWidth;var height=1;popup.show(left,top,width,height,ref);width=Math.max(doc.body.scrollWidth,width);height=Math.max(doc.body.scrollHeight+1,20);popup.show(left,top,width,height,ref);this.setTimeout(function(){try{width=Math.max(doc.body.scrollWidth,width);height=Math.max(doc.body.scrollHeight+1,20);if(popup.isOpen){popup.show(left,top,width,height,ref)}popup=null;ref=null}catch(err){}},500)};obj.hidePopup=function(){if(this.$popup && this.$popup.isOpen){this.$popup.hide()}if(this.$popup){this.$popup=null}if(AW.$popup){AW.$popup=null}};if(!AW.ie){obj.showPopup=function(){if(this.$popup){document.body.removeChild(this.$popup);this.$popup=null}var ref=this.element()?this.element():document.body;var left=AW.getLeft(ref);var top=AW.getTop(ref)+ref.offsetHeight;var popup=document.createElement("div");this.$popup=popup;AW.$popup=this;document.body.appendChild(popup);popup.className="aw-popup-window aw-system-control";popup.style.left=left+"px";popup.style.top=top+"px";popup.innerHTML=this.getPopupTemplate().toString()};obj.hidePopup=function(){if(this.$popup){this.setTimeout(function(){document.body.removeChild(this.$popup);this.$popup=null;AW.$popup=null})}};obj.onControlDeactivated=function(){this.hidePopup()}}};
 AW.Templates.Frame=AW.System.Template.subclass();AW.Templates.Frame.create=function(){var obj=this.prototype;obj.setClass("frame","template");obj.setClass("flow","vertical");obj.setClass("text","normal");var box=new AW.HTML.SPAN;box.setClass("frame","box");box.setClass("list","box");if(AW.ie && AW.strict){box.setStyle("width","expression(this.parentElement.offsetWidth-4)")}box.setContent("html",function(){return this.getLayoutTemplate()});obj.setContent("box",box)};

 AW.Templates.List=AW.System.Template.subclass();
 AW.Templates.List.create=function()
	{
			var obj=this.prototype;
			obj.setTag("span");
			obj.setClass("templates","list");
			obj.setContent("start","");
			obj.setContent("items",function()
				{
					var i,ii,a=[];
					var count=this.getViewProperty("count");
					var offset=this.getViewProperty("offset");
					var indices=this.getViewProperty("indices");
					var clone=this.$owner.$clone;
					this.$owner.$clone=false;
					for(i=0;i<count;i++)
						{
							ii = indices ? indices[i+offset] : i+offset;
							a[i]=this.getItemTemplate(ii).toString()
						}
					this.$owner.$clone=clone;
					return a.join("")
				});
			obj.setContent("end","")
	};
 
 AW.Templates.Input=AW.Templates.ImageText.subclass();AW.Templates.Input.create=function(){var obj=this.prototype;obj.setClass("templates","input");obj.setClass("input","box")};

 AW.Templates.Combo=AW.Templates.ImageText.subclass();
 AW.Templates.Combo.create=function()
 {
	 AW.Templates.Popup.create.call(this);
	 var obj=this.prototype;
	 obj.setAttribute("awx","combo");
	 obj.setClass("templates","combo");
	 obj.setClass("combo","box");

	 var button=new AW.HTML.TABLE;
	 button.setClass("combo","button");
	 button.setAttribute("cellspacing","0");
	 button.setEvent("onclick",function(event)
		{
			if(!this.$owner && !this.$active)
				{return}
			if(this.$owner && !this.$owner.$active)
				{return}
			if(this.$owner && this.$owner._cellTemplate && !this.$popup)
				{
					this.lock();
					var combo=this;
					this.$owner.setController("popup",
						{
							onCellEditEnding:function()
								{
									try{
										if(AW.gecko && combo.$popup)
											{
												var event=combo.raiseEvent.caller.caller.arguments[0];
												var range=document.createRange();
												range.selectNode(combo.$popup);
												return event.target &&(range.compareNode(event.target)==3)
											}
										}catch(err)
											{}
								},
							onCellEditEnded:function()
								{
										combo.hidePopup();
										combo=null;
										this.setController("popup",{})
								}
						});
					this.raiseEvent("editCurrentCell",event)
				}
			this.showPopup();
			this.getContent("box/text").element().focus();
			this.getContent("box/text").element().parentNode.scrollTop=0
		});
	obj.setContent("box/sign",button);
	obj.setContent("box/sign/html","<tr class=\"aw-cb-1\"><td></td></tr><tr class=\"aw-cb-2\"><td>&nbsp;</td></tr><tr class=\"aw-cb-3\"><td></td></tr>");
};
 
 AW.Templates.Cell=AW.Templates.ImageText.subclass();AW.Templates.Cell.create=function(){var obj=this.prototype;obj.setClass("templates","cell");var box=obj.getContent("box");if(!AW.gecko){box.setTag("")}box.setContent("image","");box.setContent("ruler","");box.getContent("text").setTag("");obj.startEdit=null};AW.Templates.HTML=AW.Templates.Cell;
 AW.Scroll.Bars=AW.System.Template.subclass();AW.Scroll.Bars.create=function(){var obj=this.prototype;obj.setClass("scroll","bars");obj.setClass("scrollbars",function(){return this.getScrollProperty("bars")});var span=AW.HTML.SPAN;var box=new span;var spacer=new span;var content=new span;if(AW.gecko){box.setAttribute("tabIndex","-1");content.setAttribute("tabIndex","-1")}box.setClass("bars","box");spacer.setClass("bars","spacer");content.setClass("bars","content");spacer.setStyle("width",function(){return this.getScrollProperty("width")+"px"});spacer.setStyle("height",function(){return this.getScrollProperty("height")+"px"});obj.setContent("box",box);obj.setContent("box/spacer",spacer);obj.setContent("content",content);obj.setContent("content/html",function(){return this.getContentTemplate()});var serial=0;obj.setEvent("onresize",function(){var s=++serial;this.setTimeout(function(){if(s==serial){this.raiseEvent("adjustScrollBars")}})});box.setEvent("onscroll",function(){var e=this.getContent("box").element();var left=this.getScrollProperty("left");var top=this.getScrollProperty("top");if(e.scrollLeft !=left){this.setScrollProperty("left",e.scrollLeft)}if(e.scrollTop !=top){this.setScrollProperty("top",e.scrollTop)}e=null});function mousewheel(event){var top=this.getScrollProperty("top");top -=AW.ie?event.wheelDelta/2:event.detail *(-10);var e=this.element();if(e){var max=this.getScrollProperty("height")- e.offsetHeight;var bars=this.getScrollProperty("bars");max+=(bars=="horizontal" || bars=="both")?16:0;top=top > max?max:top}top=top < 0?0:top;this.setScrollProperty("top",top);AW.setReturnValue(event,false)}obj.setEvent(AW.ie?"onmousewheel":"onDOMMouseScroll",mousewheel)};
 AW.Panels.Horizontal=AW.System.Template.subclass();AW.Panels.Horizontal.create=function(){var obj=this.prototype;obj.setClass("hpanel","template");var span=AW.HTML.SPAN;var box=new span;var top=new span;var middle=new span;var bottom=new span;box.setClass("hpanel","box");top.setClass("hpanel","top");middle.setClass("hpanel","middle");bottom.setClass("hpanel","bottom");function height(i){return function(){return this.getPanelProperty("height",i)+"px"}}function visibility(i){return function(){return this.getPanelProperty("height",i)?"inherit":"hidden"}}top.setStyle("visibility",visibility(0));top.setStyle("height",height(0));bottom.setStyle("display",function(){return this.getPanelProperty("height",2)?null:"none"});bottom.setStyle("height",height(2));if(AW.ie){box.setStyle("padding-top",height(0));box.setStyle("padding-bottom",height(2))}else{middle.setStyle("top",height(0));middle.setStyle("bottom",height(2))}if(AW.ie && AW.strict){box.setStyle("height","expression(this.parentElement.clientHeight-this.firstChild.offsetHeight-this.lastChild.offsetHeight)")}function panel(i){return function(){return this.getPanelTemplate(i)}}top.setContent("html",panel(0));middle.setContent("html",panel(1));bottom.setContent("html",panel(2));box.setContent("top",top);box.setContent("middle",middle);box.setContent("bottom",bottom);obj.setContent("box",box)};
 AW.Panels.Vertical=AW.System.Template.subclass();AW.Panels.Vertical.create=function(){var obj=this.prototype;obj.setClass("vpanel","template");var span=AW.HTML.SPAN;var box=new span;var left=new span;var center=new span;var right=new span;box.setClass("vpanel","box");left.setClass("vpanel","left");center.setClass("vpanel","center");right.setClass("vpanel","right");left.setContent("html",function(){return this.getPanelTemplate(0)});center.setContent("html",function(){return this.getPanelTemplate(1)});right.setContent("html",function(){return this.getPanelTemplate(2)});box.setContent("left",left);box.setContent("center",center);box.setContent("right",right);obj.setContent("box",box)};
 AW.Panels.Grid=AW.System.Template.subclass();AW.Panels.Grid.create=function(){var obj=this.prototype;obj.setClass("gpanel","template");var span=AW.HTML.SPAN;var box=new span;var top=new span;var middle=new span;var bottom=new span;box.setClass("gpanel","box");top.setClass("gpanel","top");middle.setClass("gpanel","middle");bottom.setClass("gpanel","bottom");function height(i){return function(){return this.getPanelProperty("height",i)+"px"}}function width(i){return function(){return this.getPanelProperty("width",i)+"px"}}function visibility(i){return function(){return this.getPanelProperty("height",i)?"inherit":"hidden"}}top.setStyle("visibility",visibility(0));top.setStyle("height",height(0));bottom.setStyle("display",function(){return this.getPanelProperty("height",2)?null:"none"});bottom.setStyle("height",height(2));if(AW.ie){box.setStyle("padding-top",height(0));box.setStyle("padding-bottom",height(2))}if(!AW.ie){middle.setStyle("top",height(0));middle.setStyle("bottom",height(2))}if(AW.ie && AW.strict){box.setStyle("height","expression(this.parentElement.clientHeight-this.firstChild.offsetHeight-this.lastChild.offsetHeight)")}function panel(i,j){return function(){return this.getPanelTemplate(i,j)}}var i,rows=[top,middle,bottom];for(i=0;i<3;i++){var left=new span;var center=new span;var right=new span;left.setClass("gpanel","left");center.setClass("gpanel","center");right.setClass("gpanel","right");left.setContent("html",panel(i,0));center.setContent("html",panel(i,1));right.setContent("html",panel(i,2));if(AW.ie && AW.strict){rows[i].setStyle("width","expression(this.parentElement.clientWidth-this.firstChild.offsetWidth-this.lastChild.offsetWidth)")}rows[i].setContent("left",left);rows[i].setContent("center",center);rows[i].setContent("right",right)}box.setContent("top",top);box.setContent("middle",middle);box.setContent("bottom",bottom);obj.setContent("box",box)};
 AW.UI.Controllers.List={onItemTemplateChanged:function(item){item.setClass("list","item");item.setClass("items",function(){return this.getControlProperty("state")|| "normal"});item.setAttribute("aw","item");item.mapModel("control","item");item.mapModel("state","item")},onContentTemplateChanged:function(view){view.setClass("list","template")}};
 AW.UI.Controllers.Actions=(function(){function clicked(event,index){return index}function current(){return this.getCurrentItem()}function first(){var p=this.getViewOffset();var a=this.getViewIndices();return a?a[p]:p}function last(){var p=this.getViewOffset()+this.getViewCount()- 1;var a=this.getViewIndices();return a?a[p]:p}function next(){var i=this.getCurrentItem();var p=Math.min(this.getViewPosition(i)+1,this.getViewOffset()+this.getViewCount()- 1);var a=this.getViewIndices();return a?a[p]:p}function previous(){var i=this.getCurrentItem();var p=Math.max(this.getViewPosition(i)- 1,this.getViewOffset());var a=this.getViewIndices();return a?a[p]:p}function go(i){this.setCurrentItem(i)}function select(i){this.setSelectedItems([i]);this.setCurrentItem(i)}function toggle(i){this.setItemSelected(!this.getItemSelected(i),i);if(i !=this.getCurrentItem()){this.setCurrentItem(i)}}function f(action,item){return function(event,index){var i=item.call(this,event,index);AW.setReturnValue(event,false);if(event && event.type=="mousedown"){this.setTimeout(function(){if(this.$active){action.call(this,i)}})}else{if(this.$active){action.call(this,i)}}event=null}}return{gotoClickedItem:f(go,clicked),gotoPreviousItem:f(go,previous),gotoNextItem:f(go,next),gotoFirstItem:f(go,first),gotoLastItem:f(go,last),selectClickedItem:f(select,clicked),selectPreviousItem:f(select,previous),selectNextItem:f(select,next),selectFirstItem:f(select,first),selectLastItem:f(select,last),toggleClickedItem:f(toggle,clicked),toggleCurrentItem:f(toggle,current)}})();
 AW.UI.Controllers.Changes=(function(){function item(v,i){this.getItemTemplate(i).refresh()}function view(indices){var pos=[];for(var i=0;i<indices.length;i++){pos[indices[i]]=i}this.setViewPosition(pos);this.refresh()}function selection(mode){switch(mode){case "single":this.setController("selection",AW.UI.Controllers.Single);break;case "multi":this.setController("selection",AW.UI.Controllers.Multi);break}}return{onItemTextChanged:item,onItemImageChanged:item,onItemValueChanged:item,onItemLinkChanged:item,onItemTooltipChanged:item,onItemStateChanged:item,onViewIndicesChanged:view,onSelectionModeChanged:selection}})();
 AW.UI.Controllers.State=(function(){function itemSelected(value,index){this.calculateItemState(index);var i,a=this.getSelectedItems();for(i=0;i<a.length;i++){if(a[i]==index){if(!value){a=a.concat();a.splice(i,1);this.setSelectedItems(a)}return}}if(value){a=a.concat(index);this.setSelectedItems(a)}}var select=[],unselect=[];function selectedItems1(a){var b=this.getSelectedItems();var i,before={},after={};select=[];unselect=[];for(i=0;i<b.length;i++){before[b[i]]=true}for(i=0;i<a.length;i++){after[a[i]]=true}for(i=0;i<b.length;i++){if(!after[b[i]]){unselect.push(b[i])}}for(i=0;i<a.length;i++){if(!before[a[i]]){select.push(a[i])}}}function selectedItems2(){var i;for(i=0;i<unselect.length;i++){if(this.getItemSelected(unselect[i])){this.setItemSelected(false,unselect[i])}}for(i=0;i<select.length;i++){if(!this.getItemSelected(select[i])){this.setItemSelected(true,select[i])}}}var current;function currentItem1(){current=this.getCurrentItem()}function currentItem2(index){this.calculateItemState(current);var e1=this.getItemTemplate(current).getContent("box/text").element();if(e1 && index !=current){e1.tabIndex=-1}e1=null;this.calculateItemState(index);var e2=this.getItemTemplate(index).getContent("box/text").element();if(e2 && e2.focus){e2.tabIndex=this.getTabIndex();e2.focus()}e2=null}return{onItemSelectedChanged:itemSelected,onCurrentItemChanging:currentItem1,onCurrentItemChanged:currentItem2,onSelectedItemsChanging:selectedItems1,onSelectedItemsChanged:selectedItems2}})();
 AW.UI.Controllers.Single={onKeyHome:"selectFirstItem",onKeyEnd:"selectLastItem",onKeyUp:"selectPreviousItem",onKeyDown:"selectNextItem",onKeyLeft:"selectPreviousItem",onKeyRight:"selectNextItem",onKeyPageUp:"selectPreviousPage",onKeyPageDown:"selectNextPage",onItemClicked:"selectClickedItem"};
 AW.UI.Controllers.Multi={onKeyHome:"selectFirstItem",onKeyEnd:"selectLastItem",onKeyUp:"selectPreviousItem",onKeyDown:"selectNextItem",onKeyPageUp:"selectPreviousPage",onKeyPageDown:"selectNextPage",onKeyCtrlHome:"gotoFirstItem",onKeyCtrlEnd:"gotoLastItem",onKeyCtrlUp:"gotoPreviousItem",onKeyCtrlDown:"gotoNextItem",onKeyCtrlPageUp:"gotoPreviousPage",onKeyCtrlPageDown:"gotoNextPage",onKeyCtrlSpace:"toggleCurrentItem",onKeySpace:"toggleCurrentItem",onItemClicked:"toggleClickedItem"};
 AW.UI.Controllers.Checked={onKeyHome:"gotoFirstItem",onKeyEnd:"gotoLastItem",onKeyUp:"gotoPreviousItem",onKeyDown:"gotoNextItem",onKeySpace:"toggleCurrentItem"};
 AW.UI.ImageText=AW.System.Control.subclass();AW.UI.ImageText.create=function(){AW.Templates.ImageText.create.call(this);var obj=this.prototype;obj.setClass("templates","");obj.setClass("ui","imagetext");obj.setClass("item","control");obj.setClass("text","expand");function _tabIndex(){return this.getTabProperty("index")}obj.getContent("box/text").setAttribute("tabIndex",_tabIndex);var _refresh=function(){this.refresh()};var itemController={onControlTextChanged:_refresh,onControlImageChanged:_refresh,onControlValueChanged:_refresh,onControlLinkChanged:_refresh,onControlTooltipChanged:_refresh,onControlStateChanged:_refresh};obj.setController("item",itemController);obj.setEvent("onactivate",function(event){var e=this.getContent("box/text").element();if(e && event.srcElement !=e){this.setTimeout(function(){if(this.$active){e.setActive()}})}});obj.focus=function(){try{this.getContent("box/text").element().focus()}catch(err){}};obj.onControlDisabledChanged=function(value){this.setClass("disabled",value?"control":null);this.setAttribute("disabled",value?true:null);this.getContent("box/text").setAttribute("disabled",value?true:null)}};
 AW.UI.Label=AW.UI.ImageText.subclass();AW.UI.Label.create=function(){var obj=this.prototype;obj.setClass("ui","label");obj.setTabIndex(-1)};
 AW.UI.Group=AW.UI.ImageText.subclass();AW.UI.Group.create=function(){var obj=this.prototype;obj.setTag("fieldset");obj.setClass("ui","group");obj.setClass("text","normal");obj.setTabIndex(-1);var box=obj.getContent("box");box.setTag("legend");box.setClass("item","legend")};
 AW.UI.Button=AW.UI.ImageText.subclass();AW.UI.Button.create=function(){var obj=this.prototype;obj.setClass("ui","button");obj.setAttribute("awx","button");var _click=function(event){if(!this.getControlDisabled()){this.raiseEvent("onClick",event)}};obj.setController("button",{onControlClicked:_click,onKeySpace:_click,onKeyEnter:_click})};
 AW.UI.Link=AW.UI.ImageText.subclass();AW.UI.Link.create=function(){AW.Templates.Link.create.call(this);var obj=this.prototype;obj.setClass("ui","link")};
 AW.UI.Input=AW.UI.ImageText.subclass();AW.UI.Input.create=function(){var obj=this.prototype;obj.setClass("ui","input");obj.setClass("input","box");obj.setClass("text","");var text=new AW.HTML.INPUT;text.setClass("item","text");text.setAttribute("type","text");text.setAttribute("value",function(){return this.getControlProperty("text")});text.setAttribute("tabIndex",function(){return this.getTabProperty("index")});if(!AW.safari){obj.setContent("box/text",text)}var _edit=function(){this.setTimeout(function(){if(this.$active){this.startEdit()}})};var _refresh=function(){this.refresh()};var _text=function(){var e=this.getContent("box/text").element();var text=this.getControlProperty("text");var input=e &&((e.tagName=="input")||(e.tagName=="INPUT"));if(input){if(e && e.value !=text){e.value=text}}else{if(e && e.innerHTML !=text){e.innerHTML=text}}};var itemController={onControlActivated:_edit,onControlTextChanged:_text,onControlImageChanged:_refresh,onControlValueChanged:_text,onControlLinkChanged:_refresh,onControlTooltipChanged:_refresh,onControlStateChanged:_refresh};obj.setController("item",itemController)};
 AW.UI.Password=AW.UI.Input.subclass();AW.UI.Password.create=function(){var obj=this.prototype;obj.getContent("box/text").setAttribute("type","password")};
 AW.UI.List=AW.System.Control.subclass();AW.UI.List.create=function(){var obj=this.prototype;var _super=this.superclass.prototype;obj.setClass("ui","list");obj.setClass("list","control");obj.setClass("flow","vertical");obj.setClass("text","normal");var box=new AW.HTML.SPAN;box.setClass("list","box");if(AW.gecko){box.setAttribute("tabIndex","-1")}if(AW.ie && AW.strict){box.setStyle("width","expression(this.parentElement.offsetWidth-4)")}box.setContent("html",function(){return this.getLayoutTemplate()});obj.setContent("box",box);var UI=AW.UI.Controllers;obj.setController("list",UI.List);obj.setController("actions",UI.Actions);obj.setController("changes",UI.Changes);obj.setController("selection",UI.Single);obj.setController("state",UI.State);obj.defineTemplate("layout",function(){return this.getScrollTemplate()});obj.defineTemplate("scroll",function(){return this.getContentTemplate()});obj.defineTemplate("content",new AW.Templates.List);obj.defineTemplate("item",new AW.Templates.ImageText);function value(i){var text=this.getItemText(i);var format=this.getItemFormat(i);return format?format.textToValue(text):text}function count(){return this.getItemCount()}function position(i){return Number(i)}var models={item:{count:0,text:"",image:"",link:"",value:value,format:"",tooltip:"",state:"",selected:false},view:{count:count,position:position,offset:0,expanded:false},selection:{mode:"single"},current:{item:0}};obj.defineModel("item",models.item);obj.defineModel("view",models.view);obj.defineModel("current",models.current);obj.defineModel("selected",{});obj.defineModel("selection",models.selection);obj.defineModel("state",{});obj.defineViewProperty("indices","",true);obj.defineSelectedProperty("items",[],true);obj.calculateItemState=function(i){var state="";if(this.getCurrentItem()==i){state="current"}if(this.getItemSelected(i)){state="selected"}if(this.getItemState(i)!=state){this.setItemState(state,i)}};obj.toString=function(){this.setTimeout(function(){try{var i=this.getCurrentItem();var t=this.getTabIndex();this.getItemTemplate(i).getContent("box/text").element().tabIndex=t}catch(err){}});return _super.toString.call(this)};obj.focus=function(){try{var i=this.getCurrentItem();this.getItemTemplate(i).getContent("box/text").element().focus()}catch(err){}};obj.onControlDisabledChanged=function(value){this.setClass("disabled",value?"control":null);this.setAttribute("disabled",value?true:null)}};
 AW.UI.Tabs=AW.UI.List.subclass();AW.UI.Tabs.create=function(){var obj=this.prototype;obj.setClass("ui","tabs");obj.setClass("text","expand");obj.setClass("flow","horizontal")};
 AW.UI.Combo=AW.UI.List.subclass();AW.UI.Combo.create=function(){AW.UI.ImageText.create.call(this);AW.UI.Input.create.call(this);AW.Templates.Combo.create.call(this);var obj=this.prototype;obj.setClass("ui","combo");obj.setClass("input","");obj.defineTemplate("popup",new AW.Templates.Frame);obj.onCurrentItemChanged=function(i){var text=this.getItemText(i);this.setControlText(text);this.hidePopup();var e=this.getContent("box/text").element();if(AW.safari){e.innerHTML=text}else{e.value=text;e.select()}e=null};obj.setController("selection",{onKeyUp:"selectPreviousItem",onKeyDown:"selectNextItem",onItemClicked:"selectClickedItem"})};
 AW.UI.CheckBox=AW.UI.ImageText.subclass();AW.UI.CheckBox.create=function(){AW.Templates.CheckBox.create.call(this);var obj=this.prototype;obj.setClass("ui","checkbox");obj.setControlProperty("value",false);obj.setEvent("onclick","");var _toggle=function(){if(!this.getControlDisabled()){this.setControlValue(!this.getControlValue())}};obj.setController("checkbox",{onKeySpace:_toggle,onControlClicked:_toggle})};AW.UI.Checkbox=AW.UI.CheckBox;
 AW.UI.CheckedList=AW.UI.List.subclass();AW.UI.CheckedList.create=function(){var obj=this.prototype;obj.setClass("ui","checkedlist");obj.setItemTemplate(new AW.Templates.CheckedItem);obj.setController("selection",AW.UI.Controllers.Checked)};
 AW.UI.Radio=AW.UI.CheckedList.subclass();AW.UI.Radio.create=function(){var obj=this.prototype;obj.setClass("ui","radio");obj.setItemTemplate(new AW.Templates.Radio);obj.setSelectionMode("single")};
 AW.Grid.Controllers.Actions=(function(){function arg1(event,i,j){return i}function arg2(event,i,j){return j}function sameColumn(){return this.getCurrentColumn()}function firstColumn(){var p=this.getColumnOffset();var a=this.getColumnIndices();return a?a[p]:p}function lastColumn(){var p=this.getColumnOffset()+this.getColumnCount()- 1;var a=this.getColumnIndices();return a?a[p]:p}function nextColumn(){var i=this.getCurrentColumn();var p=Math.min(this.getColumnPosition(i)+1,this.getColumnOffset()+this.getColumnCount()- 1);var a=this.getColumnIndices();return a?a[p]:p}function previousColumn(){var i=this.getCurrentColumn();var p=Math.max(this.getColumnPosition(i)- 1,this.getColumnOffset());var a=this.getColumnIndices();return a?a[p]:p}function sameRow(){return this.getCurrentRow()}function firstRow(){var p=this.getRowOffset();var a=this.getRowIndices();return a?a[p]:p}function lastRow(){var p=this.getRowOffset()+this.getRowCount()- 1;var a=this.getRowIndices();return a?a[p]:p}function nextRow(){var i=this.getCurrentRow();var p=Math.min(this.getRowPosition(i)+1,this.getRowOffset()+this.getRowCount()- 1);var a=this.getRowIndices();return a?a[p]:p}function previousRow(){var i=this.getCurrentRow();var p=Math.max(this.getRowPosition(i)- 1,this.getRowOffset());var a=this.getRowIndices();return a?a[p]:p}function pageUpRow(){var i=this.getCurrentRow();var p=Math.max(this.getRowPosition(i)- 10,this.getRowOffset());var a=this.getRowIndices();return a?a[p]:p}function pageDownRow(){var i=this.getCurrentRow();var p=Math.min(this.getRowPosition(i)+10,this.getRowOffset()+this.getRowCount()- 1);var a=this.getRowIndices();return a?a[p]:p}function includeCell(c,r){var start,end,i,a;var cc=this.getSelectedColumns();if(!cc.length){this.setSelectedColumns([c])}else{start=this.getColumnPosition(cc[0]);end=this.getColumnPosition(c);a=this.getColumnIndices();cc=[];if(start < end){for(i=start;i <=end;i++){cc.push(a?a[i]:i)}}else{for(i=start;i >=end;i--){cc.push(a?a[i]:i)}}this.setSelectedColumns(cc)}var rr=this.getSelectedRows();if(!rr.length){this.setSelectedRows([r])}else{start=this.getRowPosition(rr[0]);end=this.getRowPosition(r);a=this.getRowIndices();rr=[];if(start < end){for(i=start;i <=end;i++){rr.push(a?a[i]:i)}}else{for(i=start;i >=end;i--){rr.push(a?a[i]:i)}}this.setSelectedRows(rr)}if(c!=this.getCurrentColumn()){this.setCurrentColumn(c)}if(r!=this.getCurrentRow()){this.setCurrentRow(r)}}function selectCell(c,r){var cc=this.getSelectedColumns();if(cc.length !=1 || cc[0] !=c){this.setSelectedColumns([c])}var rr=this.getSelectedRows();if(rr.length !=1 || rr[0] !=r){this.setSelectedRows([r])}if(c!=this.getCurrentColumn()){this.setCurrentColumn(c)}if(r!=this.getCurrentRow()){this.setCurrentRow(r)}}function includeRow(r){var rr=this.getSelectedRows();if(!rr.length){this.setSelectedRows([r])}else{var start=this.getRowPosition(rr[0]);var end=this.getRowPosition(r);var i,a=this.getRowIndices();rr=[];if(start < end){for(i=start;i <=end;i++){rr.push(a?a[i]:i)}}else{for(i=start;i >=end;i--){rr.push(a?a[i]:i)}}this.setSelectedRows(rr)}if(r!=this.getCurrentRow()){this.setCurrentRow(r)}}function selectRow(r){var rr=this.getSelectedRows();if(rr.length !=1 || rr[0] !=r){this.setSelectedRows([r])}if(r!=this.getCurrentRow()){this.setCurrentRow(r)}}function gotoRow(r){this.setCurrentRow(r)}function toggleRow(r){this.setRowSelected(!this.getRowSelected(r),r)}var todo;function deferred(){if(todo){todo.call(this);todo=null}}function f(action,column,row){return function(event,i,j){var undef;var c=column?column.call(this,event,i,j):undef;var r=row?row.call(this,event,i,j):undef;if(event && event.type=="mousedown"){todo=function(){action.call(this,c,r)};this.setTimeout(function(){if(this.$active && !this.$edit && todo){todo.call(this)}todo=null;if(AW.gecko){try{window.getSelection().collapseToEnd()}catch(err){}}})}else{if(this.$edit){try{this.getContent("focus").element().focus()}catch(err){}}if(this.$active && !this.$edit){action.call(this,c,r)}if(AW.gecko){try{window.getSelection().collapseToEnd()}catch(err){}}AW.setReturnValue(event,false)}event=null}}return{toggleClickedRow:f(toggleRow,arg1),gotoClickedRow:f(gotoRow,arg1),gotoPreviousRow:f(gotoRow,previousRow),gotoNextRow:f(gotoRow,nextRow),gotoFirstRow:f(gotoRow,firstRow),gotoLastRow:f(gotoRow,lastRow),gotoPageUpRow:f(gotoRow,pageUpRow),gotoPageDownRow:f(gotoRow,pageDownRow),selectClickedRow:f(selectRow,arg1),selectPreviousRow:f(selectRow,previousRow),selectNextRow:f(selectRow,nextRow),selectFirstRow:f(selectRow,firstRow),selectLastRow:f(selectRow,lastRow),selectPageUpRow:f(selectRow,pageUpRow),selectPageDownRow:f(selectRow,pageDownRow),includeClickedRow:f(includeRow,arg1),includePreviousRow:f(includeRow,previousRow),includeNextRow:f(includeRow,nextRow),includeFirstRow:f(includeRow,firstRow),includeLastRow:f(includeRow,lastRow),includePageUpRow:f(includeRow,pageUpRow),includePageDownRow:f(includeRow,pageDownRow),selectClickedCell:f(selectCell,arg1,arg2),selectLowerCell:f(selectCell,sameColumn,nextRow),selectUpperCell:f(selectCell,sameColumn,previousRow),selectTopCell:f(selectCell,sameColumn,firstRow),selectBottomCell:f(selectCell,sameColumn,lastRow),selectNextCell:f(selectCell,nextColumn,sameRow),selectPreviousCell:f(selectCell,previousColumn,sameRow),selectFirstCell:f(selectCell,firstColumn,sameRow),selectLastCell:f(selectCell,lastColumn,sameRow),selectTopLeftCell:f(selectCell,firstColumn,firstRow),selectBottomRightCell:f(selectCell,lastColumn,lastRow),selectPageUpCell:f(selectCell,sameColumn,pageUpRow),selectPageDownCell:f(selectCell,sameColumn,pageDownRow),includeClickedCell:f(includeCell,arg1,arg2),includeLowerCell:f(includeCell,sameColumn,nextRow),includeUpperCell:f(includeCell,sameColumn,previousRow),includeTopCell:f(includeCell,sameColumn,firstRow),includeBottomCell:f(includeCell,sameColumn,lastRow),includeNextCell:f(includeCell,nextColumn,sameRow),includePreviousCell:f(includeCell,previousColumn,sameRow),includeFirstCell:f(includeCell,firstColumn,sameRow),includeLastCell:f(includeCell,lastColumn,sameRow),includeTopLeftCell:f(includeCell,firstColumn,firstRow),includeBottomRightCell:f(includeCell,lastColumn,lastRow),includePageUpCell:f(includeCell,sameColumn,pageUpRow),includePageDownCell:f(includeCell,sameColumn,pageDownRow),onCellMouseUp:f(deferred)}})();
 AW.Grid.Controllers.Size=(function(){function init(){this._rowHeight=this.getContent("sample").element().offsetHeight;if(!this._columnWidth1){this._columnWidth1=[]}var i,ii,n=this.getColumnCount(),a=this.getColumnIndices();var hrow=this.$extended?0:undefined;for(i=0;i<n;i++){ii=a?a[i]:i;this._columnWidth1[ii]=this.getHeaderTemplate(ii,hrow).element().offsetWidth}var lw=0,lc=this.$extended?this.getFixedLeft():0;var mw=0,c=this.getColumnCount();var rw=0,rc=this.$extended?this.getFixedRight():0;lw=this.getSelectorVisible()?this.getSelectorWidth():lw;if(!this.$extended){mw=lw;lw=0}for(i=0;i<lc;i++){lw+=this.getColumnWidth(a?a[i]:i)}for(i=c-rc;i<c;i++){rw+=this.getColumnWidth(a?a[i]:i)}this.setContentWidth(lw,0);this.setContentWidth(rw,2)}function footer(){var i,h=0,count=this.$extended?this.getFooterCount():1,a=this.getFooterIndices();if(this.getFooterVisible()){for(i=0;i<count;i++){h+=this.getFooterHeight(a?a[i]:i)}}this.setContentHeight(h,2)}function header(){var i,h=0,count=this.$extended?this.getHeaderCount():1,a=this.getHeaderIndices();if(this.getHeaderVisible()){for(i=0;i<count;i++){h+=this.getHeaderHeight(a?a[i]:i)}}this.setContentHeight(h,0)}return{onHeaderVisibleChanged:header,onHeaderHeightChanged:header,onHeaderCountChanged:header,onFooterVisibleChanged:footer,onFooterHeightChanged:footer,onFooterCountChanged:footer,paint:init}})();
 AW.Grid.Controllers.Cell=(function(){function refresh(value,col,row){if(this.$edit && this.$editCol==col && this.$editRow==row){return}this.getCellTemplate(col,row).refresh()}function refreshClasses(value,col,row){this.getCellTemplate(col,row).refreshClasses()}function cellData(val,col,row){function dataToText(i,j){var data=this.getCellData(i,j);var format=this.getCellFormat(i,j);return format?format.dataToText(data):data}function dataToValue(i,j){var data=this.getCellData(i,j);var format=this.getCellFormat(i,j);return format?format.dataToValue(data):data}this.setCellText(dataToText,col,row);this.setCellValue(dataToValue,col,row)}function tooltip(event,col,row){var e=this.getCellTemplate(col,row).element();var s=this.getCellTooltip(col,row);if(e){e.setAttribute("title",s)}e=null}function calcState(v,i,j){this.calculateCellState(i,j)}function startEdit(event){var c=this.getCurrentColumn();var r=this.getCurrentRow();if(!this.getCellEditable(c,r)){return}var t=this.getCellTemplate(c,r);if(t.startEdit && !this.$edit){this.$editCol=c;this.$editRow=r;if(event && event.type=="keypress"){if(event.keyCode !=27){t.startEdit(String.fromCharCode(event.keyCode || event.charCode))}}else{t.startEdit()}AW.setReturnValue(event,false)}}return{onKeyPress:startEdit,editCurrentCell:startEdit,onCellMouseOver:tooltip,onCellSelectedChanged:calcState,onCellDataChanged:cellData,onCellTextChanged:refresh,onCellLinkChanged:refresh,onCellImageChanged:refresh,onCellValueChanged:refresh,onCellStateChanged:refreshClasses}})();
 AW.Grid.Controllers.Row=(function(){function refresh(value,row){this.getRowTemplate(row).refreshClasses()}function addRow(row){var count=this.getRowCount();var a=this.getRowIndices();if(count<2){this.refresh();return}var prev=a[count-2];if(!this.$extended){e=this.getRowTemplate(prev).element();if(e){AW.setOuterHTML(e,this.getRowTemplate(prev).toString()+this.getRowTemplate(row).toString())}e=null}else{for(i=0;i<3;i++){e=this.getRowTemplate(prev,i).element();if(e){AW.setOuterHTML(e,this.getRowTemplate(prev,i).toString()+this.getRowTemplate(row,i).toString())}e=null}}this.raiseEvent("adjustScrollHeight")}function removeRow(row){var i,e;if(!this.$extended){e=this.getRowTemplate(row).element();if(e){AW.setOuterHTML(e,"")}e=null}else{for(i=0;i<3;i++){e=this.getRowTemplate(row,i).element();if(e){AW.setOuterHTML(e,"")}e=null}}this.raiseEvent("adjustScrollHeight")}function calcRowState(v,i){this.calculateRowState(i)}return{onRowAdded:addRow,onRowDeleted:removeRow,onRowSelectedChanged:calcRowState,onRowStateChanged:refresh}})();
 AW.Grid.Controllers.View={onRowIndicesChanged:function(indices){var positions=[];for(var i=0;i<indices.length;i++){positions[indices[i]]=i}this.setRowPosition(positions);this.refresh()},onColumnIndicesChanged:function(indices){var positions=[];for(var i=0;i<indices.length;i++){positions[indices[i]]=i}this.setColumnPosition(positions);this.setColumnCount(indices.length);this.refresh()}};
 AW.Grid.Controllers.Navigation=(function(){var c1=[],r1=[];function sync1(){c1=this.getSelectedColumns().concat();r1=this.getSelectedRows().concat()}function sync2(){var mode=this.getCurrentSelection();var c2=this.getSelectedColumns();var r2=this.getSelectedRows();var i,j,x1={},x2={};if(mode=="cell"){for(i=0;i<c1.length;i++){x1[c1[i]]={};for(j=0;j<r1.length;j++){x1[c1[i]][r1[j]]=true}}for(i=0;i<c2.length;i++){x2[c2[i]]={};for(j=0;j<r2.length;j++){x2[c2[i]][r2[j]]=true}}for(i=0;i<c1.length;i++){for(j=0;j<r1.length;j++){if((!x2[c1[i]] || !x2[c1[i]][r1[j]])&& this.getCellSelected(c1[i],r1[j])){this.setCellSelected(false,c1[i],r1[j])}}}for(i=0;i<c2.length;i++){for(j=0;j<r2.length;j++){if((!x1[c2[i]] || !x1[c2[i]][r2[j]])&& !this.getCellSelected(c2[i],r2[j])){this.setCellSelected(true,c2[i],r2[j])}}}}else if(mode=="row"){for(i=0;i<r1.length;i++){x1[r1[i]]=true}for(i=0;i<r2.length;i++){x2[r2[i]]=true}for(i=0;i<r1.length;i++){if(!x2[r1[i]] && this.getRowSelected(r1[i])){this.setRowSelected(false,r1[i])}}for(i=0;i<r2.length;i++){if(!x1[r2[i]] && !this.getRowSelected(r2[i])){this.setRowSelected(true,r2[i])}}}}function syncRows(value,index){var i,a=this.getSelectedRows();for(i=0;i<a.length;i++){if(a[i]==index){if(!value){a=a.concat();a.splice(i,1);this.setSelectedRows(a)}return}}if(value){a=a.concat(index);this.setSelectedRows(a)}}return{onSelectedColumnsChanging:sync1,onSelectedColumnsChanged:sync2,onSelectedRowsChanging:sync1,onSelectedRowsChanged:sync2,onRowSelectedChanged:syncRows,onSelectionModeChanged:function(mode){switch(mode){case "none":this.setController("selection",{});this.setCurrentSelection("none");break;case "single-cell":this.setController("selection",AW.Grid.Controllers.SingleCell);this.setCurrentSelection("cell");break;case "single-row":this.setController("selection",AW.Grid.Controllers.SingleRow);this.setCurrentSelection("row");break;case "multi-cell":this.setController("selection",AW.Grid.Controllers.MultiCell);this.setCurrentSelection("cell");break;case "multi-row":this.setController("selection",AW.Grid.Controllers.MultiRow);this.setCurrentSelection("row");break;case "multi-row-marker":this.setController("selection",AW.Grid.Controllers.MultiRowMarker);this.setCurrentSelection("row");var checkbox=new AW.Templates.CheckedItem;this.setCellTemplate(checkbox,0);break}}}})();
 AW.Grid.Controllers.Sort={doSort:function(src,index,header){if(this.$edit){return}if(!(header=="0" || typeof(header)=="undefined")){return}var format=this.getCellFormat(index);function compare(values,pos,dir){var greater=1,less=-1;if(dir=="descending"){greater=-1;less=1}var equal=function(i,j){var a=pos[i];var b=pos[j];if(a > b){return 1}if(a < b){return -1}return 0};var error=function(){return 0};var types={"undefined":0,"boolean":1,"number":2,"string":3,"object":4,"function":5};if(format){return format.comparator(values,greater,less,equal,error)}else if("".localeCompare){return function(i,j){try{var a=values[i],b=values[j],x,y;if(typeof(a)!=typeof(b)){x=types[typeof(a)];y=types[typeof(b)];if(x > y){return greater}if(x < y){return less}}else if(typeof(a)=="number"){if(a > b){return greater}if(a < b){return less}return equal(i,j)}else{return(greater *((""+a).localeCompare(b)))|| equal(i,j)}}catch(e){return error(i,j,e)}}}else{return function(i,j){try{var a=values[i],b=values[j],x,y;if(typeof(a)!=typeof(b)){x=types[typeof(a)];y=types[typeof(b)];if(x > y){return greater}if(x < y){return less}}else{if(a > b){return greater}if(a < b){return less}}return equal(i,j)}catch(e){return error(i,j,e)}}}}var direction=this.getSortDirection(index);if(direction !="ascending"){direction="ascending"}else{direction="descending"}if(src=="ascending" || src=="descending"){direction=src}var i,value={},pos={};var offset=this.getRowOffset();var count=this.getRowCount();var rows=this.getRowIndices();if(!rows){rows=[];for(i=0;i<count;i++){rows[i]=i+offset}}else{rows=rows.slice(offset,offset+count)}for(i=0;i<rows.length;i++){value[rows[i]]=this.getCellValue(index,rows[i]);pos[rows[i]]=i}rows.sort(compare(value,pos,direction));var a=[];for(i=0;i<offset;i++){a[i]=i}rows=a.concat(rows);var old=this.getSortColumn();if(old !=-1){this.setSortDirection("",old)}this.setSortColumn(index);this.setSortDirection(direction,index);this.setRowIndices(rows)},onHeaderClicked:function(src,index,header){if(this.$active){AW.Grid.Controllers.Sort.doSort.call(this,src,index,header)}}};
 AW.Grid.Controllers.Overflow={onScrollLeftChanged:function(x){var e=this.getScrollTemplate().element();if(e){e.firstChild.scrollLeft=x}},onScrollTopChanged:function(y){var e=this.getScrollTemplate().element();if(e){e.firstChild.scrollTop=y}},onScrollWidthChanged:function(w){var e=this.getScrollTemplate().element();if(e){e.firstChild.firstChild.style.width=w+"px";if(AW.ie){e.firstChild.className+=""}}},onScrollHeightChanged:function(h){var e=this.getScrollTemplate().element();if(e){e.firstChild.firstChild.style.height=h+"px";if(AW.ie){e.firstChild.className+=""}}},onScrollBarsChanged:function(x){this.getScrollTemplate().refreshClasses()},adjustScrollBars:function(){var e=this.getScrollTemplate().element();if(!e){return}if(AW.gecko){this.setTimeout(function(){try{e.lastChild.style.overflow="auto";e=null}catch(err){}})}var s,x,y;var l=this.getScrollLeft();var t=this.getScrollTop();var w=this.getScrollWidth();var h=this.getScrollHeight();var ww=e.offsetWidth;var hh=e.offsetHeight;if(AW.ie6 && AW.strict){this.setTimeout(function(){try{e.lastChild.style.width=(ww-20)+"px";e.lastChild.style.height=(hh-20)+"px";e=null}catch(err){}})}if(w < ww && h < hh){s="none";x=0;y=0}else if(w < ww - 16){s="vertical";x=20;y=0}else if(h < hh - 16){s="horizontal";x=0;y=20}else{s="both";x=20;y=20}if(this.getScrollBars()!=s){this.setScrollBars(s)}if(w - l < ww - x){var ll=Math.max(0,w - ww+x);if(ll !=l){this.setScrollLeft(ll)}}if(h - t < hh - y){var tt=Math.max(0,h - hh+y);if(tt !=t){this.setScrollTop(tt)}}this.setContentHeight(hh - y - this.getContentHeight(0)- this.getContentHeight(2),1);this.setContentWidth(ww - x - this.getContentWidth(0)- this.getContentWidth(2),1)},onColumnWidthChanged:function(){var i,a=this.getColumnIndices();var lw=0,lc=this.$extended?this.getFixedLeft():0;var mw=0,c=this.getColumnCount();var rw=0,rc=this.$extended?this.getFixedRight():0;lw=this.getSelectorVisible()?this.getSelectorWidth():lw;if(!this.$extended){mw=lw;lw=0}for(i=0;i<lc;i++){lw+=this.getColumnWidth(a?a[i]:i)}for(i=c-rc;i<c;i++){rw+=this.getColumnWidth(a?a[i]:i)}this.setContentWidth(lw,0);this.setContentWidth(rw,2)},paint:function(){this.setTimeout(function(){var e=this.getContent("box/block").element();});var x=this.getScrollLeft();var y=this.getScrollTop();this.raiseEvent("adjustScrollWidth");this.raiseEvent("adjustScrollHeight");if(x){this.raiseEvent("onScrollLeftChanged",x)}if(y){this.raiseEvent("onScrollTopChanged",y)}this.raiseEvent("adjustScrollBars");if(x){this.setTimeout(function(){this.raiseEvent("onScrollLeftChanged",x)})}if(y){this.setTimeout(function(){this.raiseEvent("onScrollTopChanged",y)})}if(AW.ie){var e=this.getScrollTemplate().element();if(e){e.className+="";e=null}}}};
 AW.Grid.Controllers.Scroll={onScrollLeftChanged:function(x){var e1=this.getRowsTemplate().element();var e2=this.getHeadersTemplate().element();var e3=this.getFootersTemplate().element();if(AW.gecko){AW.ignoreMouse=true}if(e1){e1.parentNode.scrollLeft=x}if(e2){e2.parentNode.scrollLeft=x}if(e3){e3.parentNode.scrollLeft=x}if(AW.gecko){this.setTimeout(function(){AW.ignoreMouse=false})}},onScrollTopChanged:function(y){var e=this.getRowsTemplate().element();if(AW.gecko){AW.ignoreMouse=true}if(e){e.parentNode.scrollTop=y}if(AW.gecko){this.setTimeout(function(){AW.ignoreMouse=false})}},adjustScrollWidth:function(){var a=this.getColumnIndices();var c=this.getColumnCount();var w=this.getSelectorVisible()?this.getSelectorWidth():0;for(var i=0;i<c;i++){w+=this.getColumnWidth(a?a[i]:i)}this.setScrollWidth(w+3)},adjustScrollHeight:function(){var h=this.getRowCount()* this.getRowHeight();h+=this.getContentHeight(0);h+=this.getContentHeight(2);this.setScrollHeight(h+3)}};
 AW.Grid.Controllers.Width=(function(){function adjustScrollWidth(){if(this.element()){this.setTimeout(function(){this.raiseEvent("adjustScrollWidth");this.raiseEvent("adjustScrollBars");if(AW.ie && this.getScrollTemplate().element()){this.getScrollTemplate().element().className+=""}})}}function adjustScrollHeight(){if(this.element()){this.setTimeout(function(){this.raiseEvent("adjustScrollHeight");this.raiseEvent("adjustScrollBars")})}}function setStyle(selector,attribute,value){try{var i,ss=document.styleSheets[document.styleSheets.length-1];var rules=AW.getRules(ss);for(i=0;i<rules.length;i++){if(rules[i].selectorText==selector){rules[i].style[attribute]=value;return}}AW.addRule(ss,selector,attribute+":"+value)}catch(err){}}return{onColumnWidthChanged:function(width,column){if(typeof(width)=="object"){if(this.element()){this.element().innerHTML=""}var i,a=[];for(i in width){if(!a[i]){setStyle("#"+this.getId()+" .aw-column-"+i,"width",(width[i] - AW.dx)+"px")}}if(this.element()){this.refresh()}}else if(column===undefined){setStyle("#"+this.getId()+" .aw-grid-cell","width",(width - AW.dx)+"px");setStyle("#"+this.getId()+" .aw-grid-header","width",(width - AW.dx)+"px");setStyle("#"+this.getId()+" .aw-grid-footer","width",(width - AW.dx)+"px")}else{setStyle("#"+this.getId()+" .aw-column-"+column,"width",(width - AW.dx)+"px")}adjustScrollWidth.call(this)},onSelectorWidthChanged:function(width){setStyle("#"+this.getId()+" .aw-row-selector","width",(width - AW.dx)+"px");adjustScrollWidth.call(this)},onRowHeightChanged:function(height){setStyle("#"+this.getId()+" .aw-grid-row","height",(height - AW.dy)+"px");adjustScrollHeight.call(this)}}})();
 AW.Grid.Controllers.Virtual=(function(){var serial=0;function virtual(){var s=++serial;this.setTimeout(function(){var i=0,ii,a=[];var count=this.getRowProperty("count");var offset=this.getRowProperty("offset");var indices=this.getRowProperty("indices");var scroll=this.getScrollProperty("top");var row=this.getRowProperty("height");var top=Math.floor(scroll/row);this.setVirtualTop(top);var client=Math.floor(this.getContentHeight(1)/row);if(!client){client=40}var x1=Math.min(count,Math.max(0,top - 20));var x2=Math.min(count,top);var x3=Math.min(count,top+client);var x4=Math.min(count,top+client+20);var i1=x3;var i2=x2-1;function rr(){if(s !=serial || this.$edit){return}if(i1 < x4){ii=indices?indices[i1+offset]:i1+offset;this.getRowTemplate(ii).refresh();i1++}if(i2 >=x1){ii=indices?indices[i2+offset]:i2+offset;this.getRowTemplate(ii).refresh();i2--}if(i1 < x4 || i2 >=x1){this.setTimeout(rr)}}rr.call(this)})}return{onCurrentRowChanged:function(i){var current=this.getCurrentRow();var scroll=this.getScrollProperty("top");var height=this.getRowProperty("height");var top=(this.getRowPosition(current)-this.getRowOffset())* height;var bottom=top+height;var max=this.getContentHeight(1);if(!max){return}if(top < scroll){this.setScrollTop(top)}if(max+scroll < bottom){this.setScrollTop(bottom - max)}if(AW.ie && this.element()){var h=this.element().offsetHeight}},onCurrentColumnChanged:function(index){var scroll=this.getScrollProperty("left");var col=this.getColumnPosition(index);var i,a=this.getColumnIndices();var lw=0,lc=this.$extended?this.getFixedLeft():0;var mw=0,c=this.getColumnCount();var rw=0,rc=this.$extended?this.getFixedRight():0;lw=this.getSelectorVisible()?this.getSelectorWidth():lw;if(!this.$extended){mw=lw;lw=0}for(i=0;i<lc;i++){lw+=this.getColumnWidth(a?a[i]:i)}for(i=lc;i<Math.min(col,c-rc-1);i++){mw+=this.getColumnWidth(a?a[i]:i)}for(i=c-rc;i<c;i++){rw+=this.getColumnWidth(a?a[i]:i)}if(!col){mw=0}if(mw < scroll){this.setTimeout(function(){this.setScrollLeft(mw)});return}var max=this.getContentWidth(1);var right=mw+this.getColumnWidth(index);if(max+scroll < right){this.setTimeout(function(){this.setScrollLeft(right - max)})}},onScrollTopChanging:function(scroll){if(!this.getVirtualMode()|| this.getScrollTop()==scroll){return}var s=++serial;var row=this.getRowHeight();var top=Math.floor(scroll/row);if(Math.abs(top - this.getVirtualTop())< 6){this.setTimeout(refreshRows,1000);return}function refreshRows(){if(s !=serial || this.$edit){return}this.getRowsTemplate().refresh();virtual.call(this)}this.setTimeout(refreshRows,200)},paint:function(){if(!this.getVirtualMode()){return}virtual.call(this)}}})();
 AW.Grid.Controllers.Grid={onRowsTemplateChanged:function(rows){rows.mapTemplate("item","row");rows.mapModel("view","row")},onRowTemplateChanged:function(row){row.setAttribute("aw","row");row.setClass("grid","row");row.setClass("row",function(){return this.$0});row.setClass("rows",function(){return this.getRowProperty("state")|| "normal"});row.setClass("alternate",function(){return this.getRowProperty("position")% 2?"odd":"even"});row.mapTemplate("item",function(i){return this.$owner.getCellTemplate(i,this.$0)});row.mapTemplate("selector",function(){return this.$owner.getSelectorTemplate(this.$0)});row.mapModel("view","column")},onCellTemplateChanged:function(cell){cell.setAttribute("aw","cell");cell.setAttribute("title","");cell.setClass("grid","cell");cell.setClass("column",function(){return this.$0});cell.setClass("cells",function(){return this.getControlProperty("state")|| "normal"});cell.mapModel("control","cell");cell.getStateProperty=function(p){return this.$owner.getRowProperty(p,this.$1)};cell.setStateProperty=function(p,v){this.$owner.setRowProperty(p,v,this.$1)}},onHeadersTemplateChanged:function(headers){headers.setClass("grid","headers");headers.setClass("header",function(){return this.$0 || "0"});headers.setStyle("height",function(){return this.getHeaderProperty("height")- AW.dy+"px"});headers.getContent("end").setClass("grid","header");headers.mapTemplate("item",function(i){return this.$owner.getHeaderTemplate(i,this.$0)+this.$owner.getSeparatorTemplate(i,this.$0)});headers.mapTemplate("selector",function(){return this.$owner.getTopSelectorTemplate(this.$0)+(this.$owner.getSelectorResizable()&& !this.$0?this.$owner.getSeparatorTemplate():"")});headers.mapModel("view","column")},onFootersTemplateChanged:function(footers){footers.setClass("grid","footers");footers.setClass("footer",function(){return this.$0 || "0"});footers.setStyle("height",function(){return this.getFooterProperty("height")- AW.dy+"px"});footers.mapTemplate("item",function(i){return this.$owner.getFooterTemplate(i,this.$0)});footers.mapTemplate("selector","bottomSelector");footers.mapModel("view","column")},onHeaderTemplateChanged:function(header){if(!header.getAttribute("aw")){header.setAttribute("aw","header")}header.setClass("grid","header");header.setClass("column",function(){return this.$0});header.mapModel("control","header");header.getStateProperty=function(p){return this.$owner.getColumnProperty(p,this.$0)};header.setStateProperty=function(p,v){this.$owner.setColumnProperty(p,v,this.$0)}},onFooterTemplateChanged:function(footer){if(!footer.getAttribute("aw")){footer.setAttribute("aw","footer")}footer.setClass("grid","footer");footer.setClass("column",function(){return this.$0});footer.mapModel("control","footer")},onSelectorTemplateChanged:function(selector){if(!selector.getAttribute("aw")){selector.setAttribute("aw","selector")}selector.setClass("row","selector");selector.mapModel("control","selector");selector.mapModel("state","row")},onTopSelectorTemplateChanged:function(selector){if(!selector.getAttribute("aw")){selector.setAttribute("aw","topSelector")}selector.setClass("grid","header");selector.setClass("row","selector");selector.mapModel("control","top")},onBottomSelectorTemplateChanged:function(selector){if(!selector.getAttribute("aw")){selector.setAttribute("aw","bottomSelector")}selector.setClass("row","selector");selector.mapModel("control","bottom")},onContentTemplateChanged:function(content){content.mapModel("panel","content");content.mapTemplate("panel",function(i){switch(i){case 0:return this.getHeadersTemplate();case 1:return this.getRowsTemplate();case 2:return this.getFootersTemplate()}})},onPopupTemplateChanged:function(popup){popup.onItemClicked=function(event,i){try{var s=this.getItemText(i);this.$owner.setCellText(s,this.$0,this.$1);AW.$popup.hidePopup();var e=this.$owner.getCellTemplate(this.$0,this.$1).getContent("box/text").element();if(AW.ie){e.innerHTML=s}else{e.value=s}e=null}catch(e){}}}};
 AW.Grid.Controllers.Extended={onContentTemplateChanged:function(content){content.mapModel("panel","content");content.mapTemplate("panel",function(i,j){switch(i){case 0:return this.$owner.getTopTemplate(j);case 1:return this.$owner.getRowsTemplate(j);case 2:return this.$owner.getBottomTemplate(j)}})},onTopTemplateChanged:function(top){top.mapTemplate("item","headers");top.mapModel("view","header")},onBottomTemplateChanged:function(bottom){bottom.mapTemplate("item","footers");bottom.mapModel("view","footer")}};
 AW.Grid.Controllers.SingleCell={onKeyUp:"selectUpperCell",onKeyDown:"selectLowerCell",onKeyCtrlUp:"selectTopCell",onKeyCtrlDown:"selectBottomCell",onKeyLeft:"selectPreviousCell",onKeyRight:"selectNextCell",onKeyCtrlLeft:"selectFirstCell",onKeyCtrlRight:"selectLastCell",onKeyHome:"selectFirstCell",onKeyEnd:"selectLastCell",onKeyCtrlHome:"selectTopLeftCell",onKeyCtrlEnd:"selectBottomRightCell",onKeyPageUp:"selectPageUpCell",onKeyPageDown:"selectPageDownCell",onKeyF2:"editCurrentCell",onKeyEnter:"editCurrentCell",onCellMouseDown:"selectClickedCell",onCellDoubleClicked:"editCurrentCell"};
 AW.Grid.Controllers.SingleRow={onKeyUp:"selectPreviousRow",onKeyDown:"selectNextRow",onKeyHome:"selectFirstRow",onKeyEnd:"selectLastRow",onKeyCtrlHome:"selectFirstRow",onKeyCtrlEnd:"selectLastRow",onKeyPageUp:"selectPageUpRow",onKeyPageDown:"selectPageDownRow",onRowMouseDown:"selectClickedRow"};
 AW.Grid.Controllers.MultiCell={onKeyUp:"selectUpperCell",onKeyDown:"selectLowerCell",onKeyCtrlUp:"selectTopCell",onKeyCtrlDown:"selectBottomCell",onKeyLeft:"selectPreviousCell",onKeyRight:"selectNextCell",onKeyCtrlLeft:"selectFirstCell",onKeyCtrlRight:"selectLastCell",onKeyHome:"selectFirstCell",onKeyEnd:"selectLastCell",onKeyCtrlHome:"selectTopLeftCell",onKeyCtrlEnd:"selectBottomRightCell",onKeyPageUp:"selectPageUpCell",onKeyPageDown:"selectPageDownCell",onKeyShiftUp:"includeUpperCell",onKeyShiftDown:"includeLowerCell",onKeyShiftLeft:"includePreviousCell",onKeyShiftRight:"includeNextCell",onKeyShiftPageUp:"includePageUpCell",onKeyShiftPageDown:"includePageDownCell",onKeyF2:"editCurrentCell",onKeyEnter:"editCurrentCell",onCellShiftMouseDown:"includeClickedCell",onCellMouseDown:"selectClickedCell",onCellDoubleClicked:"editCurrentCell"};
 AW.Grid.Controllers.MultiRow={onKeyUp:"selectPreviousRow",onKeyDown:"selectNextRow",onKeyHome:"selectFirstRow",onKeyEnd:"selectLastRow",onKeyCtrlHome:"selectFirstRow",onKeyCtrlEnd:"selectLastRow",onKeyPageUp:"selectPageUpRow",onKeyPageDown:"selectPageDownRow",onKeyShiftUp:"includePreviousRow",onKeyShiftDown:"includeNextRow",onKeyShiftHome:"includeFirstRow",onKeyShiftEnd:"includeLastRow",onKeyCtrlShiftHome:"includeFirstRow",onKeyCtrlShiftEnd:"includeLastRow",onKeyShiftPageUp:"includePageUpRow",onKeyShiftPageDown:"includePageDownRow",onRowClicked:"selectClickedRow",onRowCtrlClicked:"toggleClickedRow",onRowShiftClicked:"includeClickedRow"};
 AW.Grid.Controllers.MultiRowMarker={onKeyUp:"gotoPreviousRow",onKeyDown:"gotoNextRow",onKeyHome:"gotoFirstRow",onKeyEnd:"gotoLastRow",onKeyPageUp:"gotoPageUpRow",onKeyPageDown:"gotoPageDownRow",onRowSelectedChanged:function(v,i){this.getRowTemplate(i).refresh()}};
 AW.Grid.Separator=AW.System.Template.subclass();AW.Grid.Separator.create=function(){var obj=this.prototype;obj.setClass("grid","separator");obj.setClass("resizable",function(){return this.getColumnProperty("resizable")?true:false});obj.setEvent("onmousedown",function(event){if(!this.getColumnProperty("resizable")){return false}var start=event.screenX;var self=this;var width=self.element().previousSibling.offsetWidth;var scroll=self.element().parentNode.parentNode.scrollLeft;function doResize(event){var w=width+event.screenX - start;w=w > 9?w:9;self.element().previousSibling.style.width=(w - AW.dx)+"px"}function endResize(event){var w=width+event.screenX - start;w=w > 9?w:9;var e=self.element();AW.detachEvent(e,"onmousemove",doResize);AW.detachEvent(e,"onmouseup",endResize);AW.detachEvent(e,"onlosecapture",endResize);AW.releaseCapture(e);if(AW.gecko){try{e.parentNode.parentNode.scrollLeft=scroll;e.parentNode.focus()}catch(err){}}var id=e.previousSibling.id;if(id.match("header")){self.$owner.setColumnProperty("width",w,self.$0)}else if(id.match("topSelector")){self.$owner.setSelectorProperty("width",w)}e.previousSibling.style.width="";e=null}var e=AW.srcElement(event);AW.setCapture(e);AW.attachEvent(e,"onmousemove",doResize);AW.attachEvent(e,"onmouseup",endResize);AW.attachEvent(e,"onlosecapture",endResize);e=null;event.cancelBubble=true})};
 AW.Grid.Header=AW.Templates.ImageText.subclass();AW.Grid.Header.create=function(){var obj=this.prototype;var _super=this.superclass.prototype;function _direction(){return this.getSortProperty("direction")|| "none"}obj.setClass("sort",_direction);var sort=new AW.HTML.SPAN;sort.setClass("grid","sort");obj.setContent("box/text/sort",sort);obj.element=function(){if(typeof(this.$1)=="undefined" && this.$owner && this.$owner.$extended){return _super.element.call(this.$owner.getHeaderTemplate(this.$0,0))}else{return _super.element.call(this)}}};
 AW.Grid.Row=AW.Templates.List.subclass();AW.Grid.Row.create=function(){var obj=this.prototype;var _super=this.superclass.prototype;obj.setClass("text","normal");if(AW.gecko){obj.setAttribute("tabIndex","-1")}var span=AW.HTML.SPAN;var space=new span;var box=new span;space.setClass("item","template");space.setClass("grid","cell");space.setClass("column","space");box.setClass("item","box");space.setContent("box",box);obj.setContent("end",space);obj.setContent("start",function(){return this.getSelectorProperty("visible")&& !this.$1?this.getSelectorTemplate():""});var items=obj.getContent("items");obj.setContent("items",function(){return this.$name=="row" && this.$owner._fast?"":items.call(this)});var refresh=obj.refresh;obj.refresh=function(){if(typeof(this.$1)=="undefined" && this.$owner.$extended){for(var i=0;i<3;i++){refresh.call(this.$owner.getRowTemplate(this.$0,i))}}else{refresh.call(this)}};var refreshClasses=obj.refreshClasses;obj.refreshClasses=function(){if(typeof(this.$1)=="undefined" && this.$owner.$extended){for(var i=0;i<3;i++){refreshClasses.call(this.$owner.getRowTemplate(this.$0,i))}}else{refreshClasses.call(this)}}};
 AW.Grid.Rows=AW.Templates.List.subclass();AW.Grid.Rows.create=function(){var obj=this.prototype;var _super=this.superclass.prototype;obj.setClass("grid","view");obj.setContent("items",function(){var i,ii,a=[];var count=this.getViewProperty("count");var offset=this.getViewProperty("offset");var indices=this.getViewProperty("indices");var virtual=this.getVirtualProperty("mode");var clone=this.$owner.$clone;this.$owner.$clone=false;if(!virtual){for(i=0;i<count;i++){ii=indices?indices[i+offset]:i+offset;a[i]=this.getItemTemplate(ii).toString()}}else{var scroll=this.getScrollProperty("top");var height=this.getRowProperty("height");var top=Math.floor(scroll/height);var e=this.$owner.element();var client=0;if(e){client=Math.floor(e.offsetHeight/height)}e=null;if(client < 4){client=40}var x1=Math.min(count,Math.max(0,top - 50));var x2=Math.min(count,top);var x3=Math.min(count,top+client);var x4=Math.min(count,top+client+50);this.$owner._fast=true;for(i=x1;i<x2;i++){ii=indices?indices[i+offset]:i+offset;a[i]=this.getItemTemplate(ii).toString()}this.$owner._fast=false;for(i=x2;i<x3;i++){ii=indices?indices[i+offset]:i+offset;a[i]=this.getItemTemplate(ii).toString()}this.$owner._fast=true;for(i=x3;i<x4;i++){ii=indices?indices[i+offset]:i+offset;a[i]=this.getItemTemplate(ii).toString()}this.$owner._fast=false}this.$owner.$clone=clone;return a.join("")});var span=AW.HTML.SPAN;var top=new span;top.setClass("view","top");top.setStyle("height",function(){var virtual=this.getVirtualProperty("mode");if(!virtual){return 0}var scroll=this.getScrollProperty("top");var height=this.getRowProperty("height");var offset=Math.max(0,Math.floor(scroll/height)-50)* height;return offset+"px"});obj.setContent("start",top);var space=new span;var box=new span;space.setClass("item","template");space.setClass("row","selector");space.setClass("selector","space");box.setClass("item","box");space.setContent("box",box);obj.setContent("end",space);obj.refresh=function(){try{if(this.$owner.$active){var e=this.$owner.getContent("focus").element();if(AW.ie){var r=document.body.createTextRange();r.moveToElementText(e);r.select();r=null}e.focus();e=null}}catch(err){}if(typeof(this.$0)=="undefined" && this.$owner.$extended){for(var i=0;i<3;i++){_super.refresh.call(this.$owner.getRowsTemplate(i))}}else{_super.refresh.call(this)}}};
 AW.Grid.Control=AW.System.Control.subclass();AW.Grid.Control.create=function(){var obj=this.prototype;var _super=this.superclass.prototype;obj.setClass("grid","control");obj.setClass("selectors",function(){return this.getSelectorVisible()?"visible":"hidden"});var sample=new AW.HTML.SPAN;sample.setClass("row","sample");sample.setClass("grid","row");obj.setContent("sample",sample);var box=new AW.HTML.SPAN;box.setClass("grid","box");box.setContent("html",function(){return this.getLayoutTemplate()});obj.setContent("box",box);var Grid=AW.Grid.Controllers;obj.setController("size",Grid.Size);obj.setController("cell",Grid.Cell);obj.setController("row",Grid.Row);obj.setController("view",Grid.View);obj.setController("actions",Grid.Actions);obj.setController("navigation",Grid.Navigation);obj.setController("selection",Grid.SingleCell);obj.setController("sort",Grid.Sort);obj.setController("overflow",Grid.Overflow);obj.setController("scroll",Grid.Scroll);obj.setController("width",Grid.Width);obj.setController("virtual",Grid.Virtual);obj.setController("grid",Grid.Grid);obj.defineTemplate("layout",function(){return this.getScrollTemplate()});obj.defineTemplate("scroll",new AW.Scroll.Bars);obj.defineTemplate("content",new AW.Panels.Horizontal);obj.defineTemplate("panel",function(){return ""});obj.defineTemplate("rows",new AW.Grid.Rows);obj.defineTemplate("row",new AW.Grid.Row);obj.defineTemplate("cell",new AW.Templates.Text);obj.defineTemplate("headers",new AW.Grid.Row);obj.defineTemplate("footers",new AW.Grid.Row);obj.defineTemplate("header",new AW.Grid.Header);obj.defineTemplate("footer",new AW.Templates.ImageText);obj.defineTemplate("separator",new AW.Grid.Separator);obj.defineTemplate("selector",new AW.Templates.ImageText);obj.defineTemplate("topSelector",new AW.Templates.ImageText);obj.defineTemplate("bottomSelector",new AW.Templates.ImageText);obj.defineTemplate("popup",new AW.System.Template);function value(i,j){var text=this.getCellText(i,j);var format=this.getCellFormat(i,j);return format?format.textToValue(text):AW.textToValue(text)}function position(i){return Number(i)}var models={scroll:{left:0,top:0,width:0,height:0,bars:"both"},cell:{text:"",image:"",link:"",value:value,data:"",format:"",tooltip:"",state:"",selected:false,editable:false},header:{text:"",image:"",link:"",value:value,data:"",format:"",tooltip:"",state:"",count:1,offset:0,height:20,visible:true},selector:{text:"",image:"",link:"",value:value,data:"",format:"",tooltip:"",state:"",width:20,resizable:false,visible:false},top:{text:"",image:"",link:"",value:value,data:"",format:"",tooltip:"",state:""},column:{offset:0,count:0,position:position,state:"",selected:false,resizable:true,width:100},row:{offset:0,count:0,position:position,state:"",selected:false,height:18},current:{row:0,column:0,selection:"cell"},selected:{},selection:{mode:"rows",multiple:false},sort:{column:-1,direction:""},fixed:{left:1,right:0},virtual:{mode:true,top:0},content:{width:0,height:0}};obj.defineModel("scroll",models.scroll);obj.defineModel("cell",models.cell);obj.defineModel("header",models.header);obj.defineModel("footer",models.header);obj.defineModel("selector",models.selector);obj.defineModel("top",models.top);obj.defineModel("bottom",models.top);obj.defineModel("column",models.column);obj.defineModel("row",models.row);obj.defineModel("current",models.current);obj.defineModel("selected",models.selected);obj.defineModel("selection",models.selection);obj.defineModel("sort",models.sort);obj.defineModel("virtual",models.virtual);obj.defineModel("content",models.content);obj.defineModel("panel",models.content);obj.defineModel("fixed",models.fixed);obj.defineColumnProperty("indices","",true);obj.defineRowProperty("indices","",true);obj.defineHeaderProperty("indices","",true);obj.defineFooterProperty("indices","",true);obj.defineSelectedProperty("rows",[],true);obj.defineSelectedProperty("columns",[],true);obj.setFooterVisible(false);obj.setContentWidth(100,0);obj.setContentHeight(20,0);obj.calculateRowState=function(i){var state="";if(this.getCurrentRow()==i){state="current"}if(this.getRowSelected(i)){state="selected"}this.setRowState(state,i)};obj.calculateCellState=function(i,j){var state="";if(this.getCurrentColumn()==i && this.getCurrentRow()==j){state="current"}if(this.getCellSelected(i,j)){state="selected"}this.setCellState(state,i,j)};obj.setContent("box/block",new AW.HTML.SPAN);if(AW.gecko){obj.toString=function(){function paint(){if(this.element()&& !this.element().offsetWidth){this.setTimeout(paint,1000)}else{this.raiseEvent("paint")}}this.setTimeout(paint);return _super.toString.call(this)}}var focus=new AW.HTML.SPAN;focus.setTag("a");focus.setClass("grid","focus");focus.setAttribute("tabIndex",function(){return this.getTabProperty("index")});if(AW.ie){focus.setAttribute("hidefocus","true");focus.setStyle("visibility","expression(AW.paint(this))")}obj.setContent("focus",focus);obj.focus=function(){try{this.getContent("focus").element().focus()}catch(err){}};obj.addRow=function(row){if(this.raiseEvent("onRowAdding",row)){return}var i,count=this.getRowCount();var a=this.getRowIndices();if(typeof(row)=="undefined"){row=count}if(this._cellModel && this._cellModel.addRow){this._cellModel.addRow(row)}if(!a){a=[];for(i=0;i<count;i++){a[i]=i}}a.push(row);var refresh=this.refresh;this.refresh=function(){};this.setRowIndices(a);this.setRowCount(count+1);this.setCurrentRow(row);this.setSelectedRows([row]);this.refresh=refresh;this.raiseEvent("onRowAdded",row)};obj.deleteRow=function(row){if(this.raiseEvent("onRowDeleting",row)){return}if(this._cellModel && this._cellModel.deleteRow){this._cellModel.deleteRow(row)}var i,count=this.getRowCount();var a=this.getRowIndices();if(!a){a=[];for(i=0;i<count;i++){a[i]=i}i=row}else{i=this.getRowPosition(row)}a.splice(i,1);var refresh=this.refresh;this.refresh=function(){};this.setRowIndices(a);this.setRowCount(count-1);this.setCurrentRow(i>0?a[i-1]:-1);this.setSelectedRows(i>0?[a[i-1]]:[]);this.refresh=refresh;this.raiseEvent("onRowDeleted",row)};obj.sort=function(column,direction){this.raiseEvent("doSort",direction,column)};var setCellModel=obj.setCellModel;obj.setCellModel=function(model){setCellModel.call(this,model);function dataToText(i,j){var data=this.getCellData(i,j);var format=this.getCellFormat(i,j);return format?format.dataToText(data):data}function dataToValue(i,j){var data=this.getCellData(i,j);var format=this.getCellFormat(i,j);return format?format.dataToValue(data):data}this.setCellText(dataToText);this.setCellValue(dataToValue)};obj.onControlDisabledChanged=function(value){this.setClass("disabled",value?"control":null);this.setAttribute("disabled",value?true:null)}};AW.UI.Grid=AW.Grid.Control;
 AW.Grid.Extended=AW.Grid.Control.subclass();AW.Grid.Extended.create=function(){var obj=this.prototype;obj.$extended=true;obj.setController("extended",AW.Grid.Controllers.Extended);obj.setContentTemplate(new AW.Panels.Grid);obj.defineTemplate("top",new AW.Templates.List);obj.defineTemplate("bottom",new AW.Templates.List);var splitColumns=function(p,j){var left=this.$owner._fixedLeft,right=this.$owner._fixedRight;var i=this.$1;switch(p){case "count":if(i===0){return left}if(i==1){return this.$owner.getColumnProperty("count")- left - right}if(i==2){return right}return 0;case "offset":if(i===0){return 0}if(i==1){return left}if(i==2){return this.$owner.getColumnProperty("count")- right}return 0;default:return this.$owner.getColumnProperty(p,j)}};obj.getHeadersTemplate().mapModel("view",splitColumns);obj.getFootersTemplate().mapModel("view",splitColumns);obj.getRowTemplate().mapModel("view",splitColumns);var scrollController={onScrollLeftChanged:function(x){var e1=this.getRowsTemplate(1).element();var e2=this.getTopTemplate(1).element();var e3=this.getBottomTemplate(1).element();if(e1){e1.parentNode.scrollLeft=x}if(e2){e2.parentNode.scrollLeft=x}if(e3){e3.parentNode.scrollLeft=x}},onScrollTopChanged:function(y){var e1=this.getRowsTemplate(1).element();var e2=this.getRowsTemplate(0).element();var e3=this.getRowsTemplate(2).element();if(e1){e1.parentNode.scrollTop=y}if(e2){e2.parentNode.scrollTop=y}if(e3){e3.parentNode.scrollTop=y}},adjustScrollWidth:function(){var i,a=this.getColumnIndices();var lw=0,lc=this.getFixedLeft();var mw=0,c=this.getColumnCount();var rw=0,rc=this.getFixedRight();lw=this.getSelectorVisible()?this.getSelectorWidth():lw;for(i=0;i<lc;i++){lw+=this.getColumnWidth(a?a[i]:i)}for(i=lc;i<c-rc;i++){mw+=this.getColumnWidth(a?a[i]:i)}for(i=c-rc;i<c;i++){rw+=this.getColumnWidth(a?a[i]:i)}this.setScrollWidth(lw+mw+rw+3);lw=lw+"px";rw=rw+"px";var e1=this.getRowsTemplate(0).element();var e2=this.getTopTemplate(0).element();var e3=this.getBottomTemplate(0).element();if(e1){e1.parentNode.style.width=lw}if(e2){e2.parentNode.style.width=lw}if(e3){e3.parentNode.style.width=lw}if(AW.ie){if(e1){e1.parentNode.parentNode.style.paddingLeft=lw}if(e2){e2.parentNode.parentNode.style.paddingLeft=lw}if(e3){e3.parentNode.parentNode.style.paddingLeft=lw}}if(!AW.ie){if(e1){e1.parentNode.nextSibling.style.left=lw;e1.parentNode.nextSibling.style.right=rw}if(e2){e2.parentNode.nextSibling.style.left=lw;e2.parentNode.nextSibling.style.right=rw}if(e3){e3.parentNode.nextSibling.style.left=lw;e3.parentNode.nextSibling.style.right=rw}}e1=this.getRowsTemplate(2).element();e2=this.getTopTemplate(2).element();e3=this.getBottomTemplate(2).element();if(e1){e1.parentNode.style.width=rw}if(e2){e2.parentNode.style.width=rw}if(e3){e3.parentNode.style.width=rw}if(AW.ie){if(e1){e1.parentNode.parentNode.style.paddingRight=rw}if(e2){e2.parentNode.parentNode.style.paddingRight=rw}if(e3){e3.parentNode.parentNode.style.paddingRight=rw}}},adjustScrollHeight:function(){var h=this.getRowCount()* this.getRowHeight();h+=this.getContentHeight(0);h+=this.getContentHeight(2);this.setScrollHeight(h+3)}};obj.setController("scroll",scrollController)};
 AW.Tree.Item=AW.Templates.ImageText.subclass();AW.Tree.Item.create=function(){var obj=this.prototype;obj.setClass("tree",function(){return this.getViewProperty("count")?"folder":"leaf"});obj.setClass("expanded",function(){return this.getViewProperty("expanded")?"true":"false"});var sign=new AW.HTML.SPAN;sign.setClass("tree","sign");sign.setEvent("onclick",function(){this.raiseEvent("onTreeSignClicked")});obj.setContent("box/sign",sign)};
 AW.Tree.View=AW.System.Template.subclass();AW.Tree.View.create=function(){var obj=this.prototype;obj.setTag("span");obj.setClass("tree","view");obj.setContent("start",function(){return this.$0?this.getItemTemplate():""});obj.setContent("items",function(){if(this.$0 && !this.getViewProperty("expanded")){return ""}var i,ii,a=[];var count=this.getViewProperty("count");var offset=this.getViewProperty("offset");var indices=this.getViewProperty("indices");var clone=this.$owner.$clone;this.$owner.$clone=false;for(i=0;i<count;i++){ii=indices?indices[i+offset]:i+offset;a[i]=this.getContentTemplate(ii).toString()}this.$owner.$clone=clone;return a.join("")});obj.setContent("end","")};
 AW.Tree.Group=AW.System.Template.subclass();AW.Tree.Group.create=function(){var obj=this.prototype;obj.setTag("span");obj.setClass("tree","view");obj.setContent("start",function(){return this.$0?this.getItemTemplate():""});obj.setContent("items",function(){if(this.$0 && !this.getViewProperty("expanded")){return ""}else{return this.getContentTemplate()}});obj.setContent("end","")};
 AW.Tree.Control=AW.UI.List.subclass();AW.Tree.Control.create=function(){var obj=this.prototype;obj.defineTemplate("group",new AW.Tree.Group);obj.setItemTemplate(new AW.Tree.Item);obj.setScrollTemplate(function(){return this.getGroupTemplate(0)});obj.getContentTemplate().mapTemplate("item",function(i){return this.$owner.getGroupTemplate(i)});obj.defineViewProperty("expanded",false);obj.onTreeSignClicked=function(src,i){if(this.getViewIndices(i)){this.setViewExpanded(!this.getViewExpanded(i),i)}};obj.onViewExpandedChanged=function(e,i){this.getGroupTemplate(i).refresh()}};AW.UI.Tree=AW.Tree.Control;
 AW.HTTP.Request=AW.System.Model.subclass();AW.HTTP.Request.create=function(){var obj=this.prototype;obj.defineProperty("URL");obj.defineProperty("async",true);obj.defineProperty("requestMethod","GET");obj.defineProperty("requestData","");obj.defineProperty("responseText",function(){return this._http?this._http.responseText:""});obj.defineProperty("responseXML",function(){return this._http?this._http.responseXML:""});obj.defineProperty("username",null);obj.defineProperty("password",null);obj.setNamespace=function(name,value){this._namespaces+=" xmlns:"+name+"=\""+value+"\""};obj._namespaces="";obj.setParameter=function(name,value){this["_"+name+"Parameter"]=value;if((this._parameters+" ").indexOf(" "+name+" ")< 0){this._parameters+=" "+name}};obj._parameters="";obj.setRequestHeader=function(name,value){this["_"+name+"Header"]=value;if((this._headers+" ").indexOf(" "+name+" ")< 0){this._headers+=" "+name}};obj._headers="";obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");obj.getResponseHeader=function(name){return this._http?this._http.getResponseHeader(name):""};obj.request=function(){var self=this;this._ready=false;var i,j,name,value,data="",params=this._parameters.split(" ");for(i=1;i<params.length;i++){name=params[i];value=this["_"+name+"Parameter"];if(typeof value=="function"){value=value()}if(typeof value=="object" && value.constructor==Array){for(j=0;j<value.length;j++){data+=encodeURIComponent(name)+"="+encodeURIComponent(value[j])+"&"}}else{data+=encodeURIComponent(name)+"="+encodeURIComponent(value)+"&"}}var URL=this._URL;if((this._requestMethod !="POST")&& data){URL+="?"+data;data=null}this._http=AW.createXMLHttpRequest();this._http.open(this._requestMethod,URL,this._async,this._username,this._password);var headers=this._headers.split(" ");for(i=1;i<headers.length;i++){name=headers[i];value=this["_"+name+"Header"];if(typeof value=="function"){value=value()}this._http.setRequestHeader(name,value)}this._http.send(data);if(this._async){this.setTimeout(wait,200)}else{returnResult()}function wait(){if(self._http.readyState==4){self._ready=true;returnResult()}else{self.setTimeout(wait,200)}}function returnResult(){var xml=self._http.responseXML;if(xml && xml.firstChild && xml.hasChildNodes()&& !(xml.firstChild && xml.firstChild.firstChild && xml.firstChild.firstChild.firstChild && xml.firstChild.firstChild.firstChild.nodeName=="parsererror")){self.response(xml);xml=null;return}xml=null;self.response(self._http.responseText)}};obj.response=function(result){if(this.$owner){this.$owner.refresh()}};obj.isReady=function(){return this._ready}};
 AW.CSV.Table=AW.HTTP.Request.subclass();AW.CSV.Table.create=function(){var obj=this.prototype;obj.response=function(text){this._rows=text.split(/\r*\n/);if(!this._rows[this._rows.length-1]){this._rows.pop()}this._data=[];if(this.$owner){this.$owner.clearScrollModel();this.$owner.clearSelectedModel();this.$owner.clearSortModel();this.$owner.clearRowModel();this.$owner.setRowCount(this.getCount());this.$owner.refresh()}};obj._rows=[];obj._data=[];obj.getCount=function(){return this._rows.length};obj.getData=function(c,r){if(!this._data[r]){if(!this._rows[r]){return ""}this._data[r]=this._rows[r].replace(x1,s1).replace(x2,s2).split(s3)}return this._data[r][c] || ""};var x1=/(([^,\t\"]*)|\"(([^\"]|\"\")*)\")(,|\t|$)/g;var x2=/\"\"/g;var s1="$2$3\x01";var s2="\"";var s3="\x01"};
 AW.XML.Table=AW.HTTP.Request.subclass();AW.XML.Table.create=function(){var obj=this.prototype;if(AW.gecko){var xpath=new XPathEvaluator()}obj.response=function(xml){this.setXML(xml);if(this.$owner){this.$owner.clearScrollModel();this.$owner.clearSelectedModel();this.$owner.clearSortModel();this.$owner.clearRowModel();this.$owner.setRowCount(this.getCount());this.$owner.refresh()}};obj.defineProperty("XML");obj.setXML=function(xml){if(!xml.nodeType){var s=""+xml;xml=new ActiveXObject("MSXML2.DOMDocument");xml.loadXML(s)}xml.setProperty("SelectionLanguage","XPath");if(this._namespaces){xml.setProperty("SelectionNamespaces",this._namespaces)}this._xml=xml;this._data=this._xml.selectSingleNode(this._dataPath);this._items=this._data?this._data.selectNodes(this._itemPath):null;this._ready=true};if(AW.gecko){obj.setXML=function(xml){if(!xml.nodeType){var parser=new DOMParser;xml=parser.parseFromString(""+xml,"text/xml")}else if(xml.nodeName=="XML" && xml.ownerDocument==document){var node=xpath.evaluate("*",xml,null,9,null).singleNodeValue;xml=document.implementation.createDocument("","",null);xml.appendChild(node)}namespaces={};var a=this._namespaces.split(" xmlns:");for(var i=1;i<a.length;i++){var s=a[i].split("=");namespaces[s[0]]=s[1].replace(/\"/g,"")}this._ns={lookupNamespaceURI:function(prefix){return namespaces[prefix]}};this._xml=xml;this._data=xpath.evaluate(this._dataPath,this._xml,this._ns,9,null).singleNodeValue;this._items=this._data?xpath.evaluate(this._itemPath,this._data,this._ns,7,null):null;this._ready=true}}obj.getXML=function(){return this._xml};obj._dataPath="*";obj._itemPath="*";obj._valuePath="*";obj._valuesPath=[];obj._formats=[];obj.setColumns=function(array){this._valuesPath=array};obj.setRows=function(xpath){this._itemPath=xpath};obj.setTable=function(xpath){this._dataPath=xpath};obj.getCount=function(){if(!this._items){return 0}return AW.gecko?this._items.snapshotLength:this._items.length};obj.getData=function(i,j){var node=this.getNode(i,j);return node?(AW.ie?node.text:node.textContent):""};obj.getNode=function(j,i){if(!this._items || !this._items[i]){return null}if(this._valuesPath[j]){return this._items[i].selectSingleNode(this._valuesPath[j])}else{return this._items[i].selectNodes(this._valuePath)[j]}};if(AW.gecko){obj.getNode=function(c,r){if(!this._items){return null}var row=this._items.snapshotItem(r);if(!row){return null}if(this._valuesPath[c]){return xpath.evaluate(this._valuesPath[c],row,this._ns,9,null).singleNodeValue}else{return xpath.evaluate(this._valuePath,row,this._ns,7,null).snapshotItem(c)}}}};
 document.documentElement.className+=AW._htmlClasses;

 function showVoitRez(){
	$('opros_rez').style.display = "block";
	$('opros').style.display = "none";
}


