var pageStarted = false;
var pageStopped = false;

/* Functions */

function evalCode(name) {

	if(typeof(name) == 'function'){
		name();
	} else {
		eval(name);
	}

}

/* Forms */
function getField(name) {

	var elements = document.getElementsByName(name);

	if(elements.length == 0) {
		return null;
	} else if(elements.length == 1) {

		element = elements[0];

		switch(element.type) {

			case 'checkbox' :
				return element.checked;

			default :
				return element.value;

		}

	} else {

		switch(elements[0].type) {

			case 'radio' :
				for(i in elements) {
					if(elements[i].checked) {
						return elements[i].value;
					}
				}
				break;

			default :
				return null;

		}

	}

}

function setField(name, value) {

	var elements = document.getElementsByName(name);

	if(elements.length == 0) {
		return null;
	} else if(elements.length == 1) {

		element = elements[0];

		switch(element.type) {

			case 'checkbox' :
				element.checked = value;

			default :
				element.value = value;

		}

	} else {

		switch(elements[0].type) {

			case 'radio' :
				for(i in elements) {
					if(elements[i].value == value) {
						elements[i].checked = true;
						break;
					}
				}
				break;

		}

	}

}

function getFieldDate(name, field) {

	switch(field) {

		case 'day' :

			var day;
			if($(name +'Day')) {
				var day = $(name +'Day').value;
				day = day.leftPad(2, '0');
			} else {
				day = null;
			}
			return day;

		case 'week' :

			var week;
			if($(name +'Week')) {
				var week = $(name +'Week').value;
				week = week.leftPad(2, '0');
			} else {
				week = null;
			}
			return week;

		case 'month' :

			var month;
			if($(name +'Month')) {
				var month = $(name +'Month').value;
				month = month.leftPad(2, '0');
			} else {
				month = null;
			}
			return month;

		case 'year' :

			var year;
			if($(name +'Year')) {
				var year = $(name +'Year').value;
				year = year.leftPad(4, '0');
			} else {
				year = null;
			}
			return year;

		case 'hour' :

			var hour;
			if($(name +'Hour')) {
				hour = $(name +'Hour').value;
				hour = hour.leftPad(2, '0');
			} else {
				hour = null;
			}
			return hour;

		case 'minute' :

			var minute;
			if($(name +'Minute')) {
				minute = $(name +'Minute').value;
				minute = minute.leftPad(2, '0');
			} else {
				minute = null;
			}
			return minute;

		case 'second' :

			var second;
			if($(name +'Second')) {
				second = $(name +'Second').value;
				second = second.leftPad(2, '0');
			} else {
				second = null;
			}
			return second;

		default :

			var day = getFieldDate(name, 'day');
			var month = getFieldDate(name, 'month');
			var year = getFieldDate(name, 'year');
			
			if(year != null && month != null && day != null) {
				var date = year +'-'+ month +'-'+ day;
			} else {
				return '';
			}
			
			var hour = getFieldDate(name, 'hour');
			var minute = getFieldDate(name, 'minute');
			var second = getFieldDate(name, 'second');
			
			if(hour != null && minute != null && second != null) {
				date += ' '+ hour +':'+ minute +':'+ second;
			}

			return date;

	}

}

function changeCheckBox(form, name, checked) {

	var elements = $(form).getElementsByTagName('input');

	for(var i = 0; i < elements.length; i++) {
		if(elements[i].getAttribute('type') == 'checkbox') {
			if(name == elements[i].getAttribute('name').replace(/\[[0-9]*\]/, '')) {
				elements[i].checked = checked;
			}
		}
	}

}

function delFreeListItem(name, a) {
	var ul = a.parentNode.parentNode;
	ul.removeChild(a.parentNode); 
	saveFreeListAggregate(ul, name);
}

function onFreeListClick(name, event, input, ulId) {

	if(event.keyCode != 13) { // trimmed.
		return ;
	}

	validateFreeList(name, input, ulId);
}

function saveFreeListAggregate(ul, name) {
	$(name).value = "";
	for(var i = 0; i < ul.childNodes.length; i++) {
		n = ul.childNodes.item(i);
		if($(name).value !== '') {
			$(name).value += "\n";
		}
		$(name).value += n.collectTextNodes().trim();
	}

}

function validateFreeList(name, input, ulId) {

	var value = input.value.trim();
	if(value.trim() == '') {
		return;
	}

	// the list item
	var li = document.createElement('li');
	var span = document.createElement('span');
	span.appendChild(document.createTextNode(value));

	// the deletion link
	var a = document.createElement('a');
	a.innerHTML = "&nbsp;";
	a.setAttribute('class', 'delFreeListItem');
	a.onclick = function() { delFreeListItem(name, a); }

	// add the text and the del link
	li.appendChild(a);
	li.appendChild(span);

	// add the list item
	var ul = $(ulId);
	ul.appendChild(li);
	input.value = '';

	saveFreeListAggregate(ul, name);
}


// Field auto-completion

autoCompleteAjax = Class.create();
autoCompleteAjax.prototype = {

	target: null,

	execute: function(object) {
		try {
			var target = $(this.target);
			target.innerHTML = object.html;
		} catch(e) {
			//console.log(e);
		}
	}
}
var autoCompleteAjaxLoaded = false;
// 
function autoCompletePickLi(id, li) {
	$(id).value = li.getAttribute('key');
	li.parentNode.innerHTML='';
}

function autoCompleteField(name, id, event, input, page) {

	if(!autoCompleteAjaxLoaded) {
		Object.extend(autoCompleteAjax.prototype, CommonAjax);
		autoCompleteAjaxLoaded = true;
	}

	if(ajaxCurrentRequests != 0) {
		setTimeout(function() { autoCompleteField(name, id, event, input, page); }, 100);
		return;
	}

	var target = 'hrcAutoComplete' + id;
	if(event.keyCode == 13) { 
		if($(target).childNodes.length == 1) {
			var li = $(target).childNodes[0];
			autoCompletePickLi(id, li, li.getAttribute('key'));
		}
		return ;
	}
	var value = input.value.trim();
	var value = input.value.trim();
	if(input.last == undefined) {
		input.last = '';
	} else if (input.last == value) {
		return;
	}
	input.last = value;

	var aca = new autoCompleteAjax({ params: {
		name: name,
		target: id,
		value: value}});

	aca.target = target;
	aca.page = projectUrl + page;
	aca.input = input;

	Ajax.JSON(aca);
}


function extractIFrameBody(element) {

  var doc = null;

  if (element.contentDocument) { // For NS6
    doc = element.contentDocument;
  } else if (element.contentWindow) { // For IE5.5 and IE6
    doc = element.contentWindow.document;
  } else if (element.document) { // For IE5
    doc = element.document;
  } else {
    return null;
  }

  return doc.body;

}

/* Strings */
String.prototype.encode = function () {

	var value = this;

	var tmp = '';
	for(var i = 0; i < value.length; i++) {

		if(value.charAt(i) == '<') {
			tmp += '&lt;';
		} else if(value.charAt(i) == '>') {
			tmp += '&gt;';
		} else if(value.charAt(i) == '&') {
			tmp += '&amp;';
		} else if(value.charAt(i) == '"') {
			tmp += '&quot;';
		} else if(value.charAt(i) == '\'') {
			tmp += '&#039;';
		} else if(value.charAt(i) == '\\') {
			tmp += '&#092;';
		} else {
			tmp += value.charAt(i);
		}
	}

	return tmp;

}

String.prototype.substitute = function (from, to) {

	var result = this;
	var position = result.indexOf(from, 0);

	while(position != -1) {

		result = result.substr(0, position) + to + result.substr(position + from.length);
		position = result.indexOf(from, position + to.length);

	}

	return result;

};

String.prototype.isTag = function (position) {

	var currentPosition = this.indexOf('<', 0);

	while(currentPosition != -1 && currentPosition <= position) {

		if(this.substr(currentPosition + 1, 1).match(/[a-z\/]/gi)) {

			currentPosition = this.indexOf('>', currentPosition + 2);

			if(currentPosition >= position) {
				return true;
			}

		}

		currentPosition = this.indexOf('<', currentPosition + 1);

	}

	return false;

};

String.prototype.ucFirst = function () {
    return this.substr(0, 1).toUpperCase() + this.substr(1);
};

String.prototype.lcFirst = function () {
    return this.substr(0, 1).toLowerCase() + this.substr(1);
};

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g, '');
};

String.prototype.urlEncode = function () {

	if(encodeURIComponent) {
		return encodeURIComponent(this);
	}
	if(escape) {
		return escape(this);
	}

}

String.prototype.parseUrl = function () {

	var parse = this.split('&');
	var variables = { };

	for(var i = 0; i < parse.length; i++) {
		var data = parse[i].split('=');
		var name = data[0];
		var value = null;
		if(data.length > 1) {
			value = data[1];
		}
		variables[name] = value;
	}

	return variables;

}

String.prototype.leftPad = function(len, char) {

	var output =  this;
	var currentLength = this.length;

	for(currentLength ; currentLength < len ; currentLength++) {

		output = char+output;

	}

	return output;
}

String.prototype.rightPad = function(len, char) {

	var output =  this;
	var currentLength = this.length;

	for(currentLength ; currentLength < len ; currentLength++) {

		output = output+char;

	}

	return output;
}

/* Arrays */
Array.prototype.contains = function (string) {

  for(var i = 0; i < this.length; i++) {
    if(this[i] == string) {
	 	return true;
	 }
  }

  return false;

}

/* Start and stop */
window.addToStart = function (name) {
	if(pageStarted) {
		evalCode(name);
	} else {
		// Recommended by Prototype, see doc and
		// http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-eventgroupings
		Event.observe(window, 'load', name, false);
	}
}

window.addToStop = function (name) {
	Event.observe(window, 'unload', name, false);
}

function start() {
	pageStarted = true;
}
window.addToStart(start);

function stop() {
	pageStopped = true;
}
window.addToStop(stop);

/* Locks */
var locks = { };

function lock(hash, delay) {

	if(delay == null) {
		delay = 1000;
	}

	var object = new Date();
	var now = object.getTime();
	if(locks[hash] == undefined || locks[hash] == null || now - delay > locks[hash]) {
		locks[hash] = now;
		return true;
	}
	return false;

}

function unlock(hash) {
	locks[hash] = null;
}
