var h;

(function($){


	$(function(){
		h={	// html helpers
			br:'<br/>',hr:'<hr/>',rq:'<span style="color:red;font-weight:bold;">*</span>',
			tag:function(tag,html,options){
				if (typeof(html) == 'object') {
					options = html;
					html = '';
				}
				var r='';			
				for(var i in options) r+=' '+i+'="'+options[i]+'"';
				return '<'+tag+r+'>'+html+'</'+tag+'>';			
			},
	
			a:function(h, o) {
				return this.tag('a', h, o);
			},
			div:function(h, o) {
				return this.tag('div', h, o);
			},
			img:function(h, o) {
				return this.tag('img', h, o);
			},
			li:function(h, o) {
				return this.tag('li', h, o);
			},
			p:function(h, o) {
				return this.tag('p', h, o);
			},
			span:function(h, o) {
				return this.tag('span', h, o);
			},
			table:function(h, o) {
				return this.tag('table', h, o);
			},
			tbody:function(h, o) {
				return this.tag('tbody', h, o);
			},
			td:function(h, o) {
				return this.tag('td', h, o);
			},
			tr:function(h, o) {
				return this.tag('tr', h, o);
			},
			ul:function(h, o) {
				return this.tag('ul', h, o);
			},

			fieldset:function(h, o) {
				return this.tag('fieldset', h, o);
			},
			label:function(h, o) {
				return this.tag('label', h, o);
			},
			input:function(h, o) {
				return this.tag('input', h, o);
			},
			checkbox:function(n, v, c, options) {
				return h.input($.extend({type:"checkbox",name:n,id:n,value:v,checked:c}, options))
			},
			textarea:function(h, o) {
				return this.tag('textarea', h, o);
			},
			hidden:function(name, v, options) {
				return this.input($.extend(options, {type:'hidden',name:name,id:name,value:v}));
			},
		
			field:function(name,v,caption,options){		
				return this.label(caption,{'for':name})+
					this.input($.extend({type:'text',name:name,id:name,value:v},options))+this.div({'class':'form_error',id:'error_for_'+name});
			}, 
			field_textarea:function(name,v,caption, options){
				return this.label(caption,{'for':name})+this.textarea(v,$.extend(options, {name:name,id:name}))+this.div({'class':'form_error',id:'error_for_'+name});
			},
	
			field_row:function(name,v,caption,options){		
				return this.tr(this.td(this.label(caption,{'for':name}))+
					this.td(this.input($.extend({type:'text',name:name,id:name,value:v},options))+this.div({'class':'form_error',id:'error_for_'+name})));
			}, 
			field_row_textarea:function(name,v,caption, options){
				return this.tr(this.td(this.label(caption,{'for':name}))+this.td(this.textarea(v,$.extend(options, {name:name,id:name}))+this.div({'class':'form_error',id:'error_for_'+name})));
			},		
			
			// validators
			isEmail:function(v) {
				return v == '' || v.match(/^[a-zA-Z0-9_\.\-]+\@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9]{2,4})$/);
			},
			isUrl:function(v) {
				return v == '' || v.match(/^(https?|ftp):\/\/(([a-z0-9-_]+\.)+[a-z]{2,6}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(:[0-9]+)?(\/?|\/\S+)$/i);
			},
			isNotEmpty:function(v) {
				return !(v == '')
			},
			// utils
			showMessage:function(title, msg){
				if (!msg) {
					msg = title;
					title = 'Информация';
				}
				if (this.dlg) this.dlg.html(h.p(msg)).dialog('open').dialog('moveToTop');
				else this.dlg = $('<div title="' + title + '"/>').html(h.p(msg)).dialog({bgiframe:true,modal:true,buttons:{Ok:function() {
					$(this).dialog('close');
				}}});
			},
			strongTerm:function(value, term) {
				return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");	
			}
			
		};	
	});


	$.fn.svSerialize = function(){
		var r={};	
		$(this).find('input,textarea,select').each(function(i, e) {
			r[$(e).attr('name')] = $(e).val();
		});
		return r;
	};

	$.fn.svError = function(msg) {
		return $(this).parent().addClass('error');
	};
	$.fn.svErrorClear = function() {
		return $(this).parent().removeClass('error');
	};
	$.fn.svErrorsClear = function() {
		return $(this).find('.error').removeClass('error');
	};
	
	$.fn.svErrorsYml = function(e){
		var d=$(this);
		$.each(e, function(i, ee) {
			d.find('#' + ee[0]).svError(convertStr(ee[1]));
		});
		return $(this);
	};	

	$.fn.validator = function(options){
		if (options.v)options=[options]; 
		return this.blur(function(){			
			var e = $(this);
			e.svErrorClear();
			$.each(options,function(i,vv){				
					var r;					
					if (typeof(vv.v)=='function') r=vv.v(e.val());else eval('var r=h.is'+vv.v+'(e.val());');
					if (!r) e.svError(vv.msg);
			});
		});
	};
	
	$.fn.getTotalWidth = function(){
		
		return $(this).width() + parseInt($(this).css('paddingRight')) + parseInt($(this).css('paddingLeft')) + parseInt($(this).css('borderRightWidth')) + parseInt($(this).css('borderLeftWidth'));
	};
	
	$.fn.getTotalHeight = function(){
		return $(this).height() + parseInt($(this).css('paddingTop')) + parseInt($(this).css('paddingBottom')) + parseInt($(this).css('borderTopWidth')) + parseInt($(this).css('borderBottomWidth'));
	};
	
	$.templateErrors = function(errors) {
		var result = '';
		$.each(errors, function(i, e) {
			result += '<li>' + (isNaN(parseInt(i)) ? '<b>' + i + '</b>: ' : '') + e + '</li>';
		});
		return '<ul class="error_list ui-corner-all">' + result + '</ul>';
	}

	$('form.no-submit').live('submit', function() {
		return false;
	});


})(jQuery);
	
