function Form(fields) {
	this.fields = fields;
	this.build = _build;
}


function _build(target,action,method,imgsrc,ajax) {
if(!imgsrc) imgsrc = '/js/form/help.gif';


$('<form/>',{'class':'gen-form','action':action,'novalidate':'novalidate','method':method,submit: function(){return IsFormOk(this,ajax)}}).appendTo($('#'+target));
$('<input name="event" type="hidden" value="order">').appendTo($('#'+target+' .gen-form'));
$('<input name="from" type="hidden" value="0">').appendTo($('#'+target+' .gen-form'));
$('<input name="text" type="hidden" value="">').appendTo($('#'+target+' .gen-form'));
$('<table/>',{'class':'gen-form-table','align':'center'}).appendTo($('#'+target+' .gen-form'));
$.each(this.fields,function(i) {_buildElements(i,target,this.title,this.name,this.tag,this.type,this.required,this.params,this.tip,imgsrc)});
setEvents(target);
}

function _buildElements(i,target,title,name,tag,type,required,params,tip,imgsrc) {
	$('<tr/>').appendTo($('#'+target+' .gen-form-table'));

	if(type=='label') {
		$('<td/>',{'class':'gen-cap','colspan':'2'}).appendTo($('#'+target+' .gen-form-table tr:last'));
		$('<p>'+title+'</p>').appendTo($('#'+target+' .gen-cap:last'));
		$('<input type="hidden" value="'+title+'" label="label">').appendTo($('#'+target+' .gen-cap:last'));
	}
	
	else { 
		$('<td/>',{'class':'gen-title'}).appendTo($('#'+target+' .gen-form-table tr:last'));
		$('<td/>',{'class':'gen-help-td'}).appendTo($('#'+target+' .gen-form-table tr:last'));
		$('<td/>',{'class':'gen-el-td'}).appendTo($('#'+target+' .gen-form-table tr:last'));
		
		if(type != 'submit') if(type != 'reset') {
			if(required == 'true') $('<span class="star">*</span>').appendTo($('#'+target+' .gen-title:last'));
			$('<span>'+title+':</span>').appendTo($('#'+target+' .gen-title:last'));
			if (tip != undefined && tip != '') {
				$('<img/>',{
				  	'class':'help-icon','src':imgsrc,'alt':tip,'title':tip,
					 click: function() { genMakePopupWindow('tip',tip); }
					 }).appendTo($('#'+target+' .gen-help-td:last'));}
			}
	}
	
	if(type == 'checkbox' || type == 'radio') {
		$('<input type="hidden" value="'+title+'" label="checkbox" />').appendTo($('#'+target+' .gen-title:last'));
			$.each(params,function(i) {
				$('<'+tag+' name="'+name+'" type="'+type+'" class="gen-checkbox" value="'+params[i]+'" param="'+type+'" />').appendTo($('#'+target+' .gen-el-td:last'));
				$('<span class="gen-checkbox-title">'+params[i]+'</span><br>').appendTo($('#'+target+' .gen-el-td:last'));
			});
	}
	else if(type == 'submit') {
		$('<input name="'+name+'" type="'+type+'" class="gen-button-submit" id="gen-'+target+'-submit" value="'+title+'" />').appendTo($('#'+target+' .gen-el-td:last'));
		if(params=='clear') $('<input name="reset" type="reset" class="gen-button-clear" id="gen-'+target+'-clear" value="Очистить" />').appendTo($('#'+target+' .gen-el-td:last'));
	}
	else if(type == 'file') {
		$('<input name="'+name+'" type="file" class="gen-input-file" title="'+title+'" ?>').appendTo($('#'+target+' .gen-el-td:last'));
	}

	else {
		$('<'+tag+' name="'+name+'" type="'+type+'" param="'+type+'" title="'+title+'" req="'+required+'" />').appendTo($('#'+target+' .gen-el-td:last'));
		if(type == 'select') {
			$('<option value="Не выбрано">Пожалуйста, выберите...</option>').appendTo($('#'+target+' select:last'));
			$.each(params,function(i) {
				$('<option value="'+params[i]+'">'+params[i]+'</option>').appendTo($('#'+target+' select:last'));
			});
		}
	}
}

function setEvents(target) {
	$('#'+target+' input[type=text], textarea, select').bind({
	focusin: function() {$(this).addClass('active')},
	focusout: function() {$(this).removeClass('active')}
	//keypress: function() {$(this).removeClass('error')},
	//change: function() {if(($(this).val()).length < 1) {$(this).addClass('error')} else {$(this).removeClass('error')}}
	});
}

function genPopupPosition() {$("#gen-help-popup").css({'top':$(window).scrollTop()+20,'right':$(window).scrollLeft()+20});}

$(window).resize(function(){if($("#gen-help-popup").css('display')=="block") genPopupPosition()})
$(window).scroll(function(){if($("#gen-help-popup").css('display')=="block") genPopupPosition()})

function validateEmail(email) {
return /^[^\s]+@([-a-z0-9_]+\.)+[a-z]{2,4}$/i.test(email);
}

function genError(type, el) {
	var text;
	if(type=='text') { text = "Поле \""+el.getAttribute('title')+"\" не заполнено"; el.focus();}
	if(type=='email') { text= "Поле E-mail заполнено не корректно. Используйте запись вида: user@domen.ru"; el.focus();}
	if(type=='checkbox') { text = "Не выбран обязательный пункт"; el.focus();}
	genMakePopupWindow('err',text);
}

function genMakePopupWindow(type,text) {
	var win = document.getElementById('gen-help-popup');
	if(win) $("#gen-help-popup").remove();

	$('<div/>',{'id':'gen-help-popup','class':'gen-help-popup'}).appendTo($('body'));
	$('<div/>',{'id':'gen-help-close','class':'gen-help-close',click: function(){$("#gen-help-popup").remove();}}).appendTo($('#gen-help-popup')); $("#gen-help-close").html('x');
	$('<p/>',{'id':'gen-help-status','class':'gen-help-status'}).appendTo($('#gen-help-popup'));

	if (type!='tip') $("#gen-help-popup").addClass('gen-error-popup');
	genPopupPosition();

	$("#gen-help-status").html(text);
	$("#gen-help-popup").show();						
}




function IsFormOk(f,ajax) {
	 f.from.value = window.location.href;
	 f.text.value = '';
	 for (i=0;i<f.elements.length;i++) {
		 if(f.elements[i].getAttribute('req') == 'true') {
			if(f.elements[i].value=='') {
				if(f.elements[i].name=='email' && !validateEmail(f.email.value)) {genError('email',f.elements[i]); return false;}				 
				genError('text', f.elements[i]); return false;
			}
			else if(f.elements[i].getAttribute('param')=='select' && f.elements[i].value=='Не выбрано') {genError('checkbox', f.elements[i]); return false;}
		 }
		 if(f.elements[i].getAttribute('param') == ('text')) {
			f.text.value += f.elements[i].title + ': ' + f.elements[i].value + '\n';
			 }
		 else if(f.elements[i].getAttribute('param') == ('select')) {
			f.text.value += f.elements[i].title + ': ' + f.elements[i].value + '\n';
			 }
		 else if (f.elements[i].getAttribute('type') == 'hidden' && f.elements[i].getAttribute('label') == 'label') {
 			f.text.value += '\n+++' + f.elements[i].value + '+++\n';
			 }
		 else if (f.elements[i].getAttribute('type') == 'hidden' && f.elements[i].getAttribute('label') == 'checkbox') {
			f.text.value += f.elements[i].value + ': ' + '\n';
			 }

		 else if (f.elements[i].getAttribute('type') == 'hidden' && f.elements[i].getAttribute('name') == 'soloPrice') {
			f.text.value += f.elements[i].title + ': ' + f.elements[i].value + '\n';
			 }
		 else if (f.elements[i].getAttribute('type') == 'hidden' && f.elements[i].getAttribute('name') == 'soloGoodName') {
			f.text.value += '\n' + f.elements[i].title + ': ' + f.elements[i].value + '\n';
			 }
		 else if (f.elements[i].getAttribute('type') == 'hidden' && f.elements[i].getAttribute('name') == 'soloArticle') {
			f.text.value += f.elements[i].title + ': ' + f.elements[i].value + '\n';
			 }



		 else if ((f.elements[i].getAttribute('type') == 'radio' || f.elements[i].getAttribute('type') == 'checkbox') && f.elements[i].checked) {
			f.text.value += '- ' + f.elements[i].value  + '\n';
			 }
	}
//	alert(f.text.value);	
	f.Ok.disabled=true;
	if(!ajax) {return true;}
	else if (ajax) {sendFormAjax(f); return false;}
}

function formValidation(form) {

    $(form).submit(function() {
 
      var valid = true;
      $('div.error_message').remove();
 
      $(form).find(':input:visible:not(input[type=image], input[type=submit])').each(function(j, field) {
        $(field).removeClass('field_error');
 
        if (($(field).attr('required') == 'undefined' || $(field).attr('required') != 'no') && $(field).val() == 0) {
          valid = false;
          $(field).addClass('field_error')
            .before($('<div>')
            .attr('class', 'error_message')
            .html('Обязательное поле'));
        }
      });
 
      if (!valid) {
        return false;
      }
    });

}                         
