Object.extend(Element.Methods, {
	linkify: function() {
		arguments = $A(arguments);
		var el = arguments[0];
		arguments[0] = 'click';
		el.observe.apply(el, arguments);
		if (el.match('a')) {
			el.href = el.href || '#';
		}
		return el;
	},
	getUoi: function(el) {
		return main.extractUoi(el.id);
	}
});

Object.extend(Form.Methods, {
	augmentWithName: function(el) {
		el.name = el.down('.form-name').innerHTML;
	},
	getName: function(el) {
		if (!el.name) {
			el.augmentWithName();
			if (!el.name) {
				console.error('Form element doesn\'t have a php name set: ');
				console.error(el);
			}
		}
		return el.name;
	},
	getClass: function(el) {
		if (!el.cls) {
			el.cls = $w(el.className).first();
		}
		return el.cls;
	},
	fname: function(el, fname) {
		return el.down('#'+el.getName()+'_'+fname)
	},
	debug: function(el) {
		if (el.__debug) return;
		var observer = function(e) {
			e.stop();
		}
		el.observe('submit', observer);
		el.__debug = true;
	},
	actionize: function() {
		arguments = $A(arguments);
		var el = arguments[0];
		arguments[0] = 'submit';
		el.observe.apply(el, arguments);
		el.action = el.action || '#';
	},
	actionizeWithStop: function(form, f) {
		form.actionize(function(e) {
			e.stop();
			f();
		});
	},
	transferFields: function(form, object) {
		form.augmentWithName();
		form.getElements().each(function(el) {
			if (el.id && el.id.startsWith(form.name+'_')) { 
				var fname = el.id.sub(form.name+'_', '');
				if (fname) {
					el.row = el.up('tr');
					object[fname.dasherize().camelize()] = el;
				}
			}
		}, object);
	},
	isDirty: function(form) {
		return !!form.getElements().detect(function(el) {
			switch (el.type) {
				case 'text':
			  	case 'textarea':
			   	case 'hidden':
				 	if (!/^\s*$/.test(el.value) && el.value != el.defaultValue)
				 		return true;
				 	break;
			   	case 'checkbox':
			   	case 'radio':
				 	if (el.checked != el.defaultChecked)
				 		return true;
				 	break;
			   	case 'select-one':
			   	case 'select-multiple':
		   			var opt, hasDefault = false, j = 0;
				 	while (opt = el.options[j++]) {
						if (opt.defaultSelected) {
							hasDefault = true;
							break;
						}
				 	}
				 	j = hasDefault ? 0 : 1; // If no options have selected="true", then opt.selected != opt.defaultSelected will be true, although it wasn't selected manually
				 	while (opt = el.options[j++]) 
						if (opt.selected != opt.defaultSelected)
							return true;
				 	break;
			}
		});
	},
	activateParanoidBehavior: function(form, formName) {
		form.actionize(form.deactivateParanoidBehavior.bindAsEventListener(form));
		window.onbeforeunload = function() {
			if (form.isDirty()) {
				return 'Вы внесли данные в '+formName+'. Если вы уйдете со страницы, эти данные будут потеряны. Вы уверены, что хотите уйти?';
			}
		}
	},
	deactivateParanoidBehavior: function(form) {
		delete window.onbeforeunload;
	},
	getFooter: function(form) {
		return form.down('tfoot');
	}
});

Object.extend(Form.Element.Methods, {
	getForm: function(el) {
		return el.up('form');
	},
	getRow: function(el) {
		return el.up('tr');
	},
	invokeRow: function(el, func) {
		var args = $A(arguments);
		var tr = this.getRow();
		tr[func].apply(tr, args.slice(2));
	},
	hideRow: function(el) {
		el.invokeRow('hide');
	},
	showRow: function(el) {
		el.invokeRow('show');
	}
});

Element.addMethods();

Element.addMethods('INPUT', {
// setValue: function(el, value) {
// el.value = value;
// }
});

Template.symfonyPattern = '/(^|.|\r|\n)(\%(\w+)\%)/';