(function($){

	$(document).ready(function(){
		jQuery.bmFormProcessor();
	});
	
	jQuery.extend({
		
		formSent: false,
		errorClass: 'invalid',
		spamKey: '_BMvalideformBM_',
		spamInput: 'D54ghW43tGFD',
		
		ajaxStart: function () {},
		ajaxEnd: function () {},
		
		bmFormProcessor: function () {
			$(':file').change(function() { jQuery.fileUploadOnChange(this); });
		
			if ( jQuery.bmForms.length > 0 ) {
				jQuery.each( jQuery.bmForms, function ( i, val ) {
		
					form = document.forms[val.f];
					jQuery.bmFormCreator( form, val.a );
			
			
					if ( val.e && form && val.e.length > 0 ) {
						jQuery.each( val.e, function( j, val2 ) {
							input = $(form.elements[val2.n]);
							
							if ( val2.lt ) jQuery.bmFormValidatorCreator( input, 'lt', val2.lt );
							if ( val2.gt ) jQuery.bmFormValidatorCreator( input, 'gt', val2.gt );
							if ( val2.pwd ) jQuery.bmFormValidatorCreator( input, 'pwd', val2.pwd );
							
							if ( val2.f != '' ) {
								jQuery.each( val2.f.split(''), function( k, val3 ) {
									jQuery.bmFormValidatorCreator( input, val3 );
								});
							}
						});
					}
		
				});
			}
		},
	
		bmFormCreator: function ( form, ajax ) {
	
			$(form).validate({
	//			onkeyup: false,
	
				submitHandler: function( form ) {
					if ( !jQuery.formSent ) {
						jQuery.formSent = true;
						$(':file').remove();
						$(form.elements[$.spamInput]).attr('value', $.spamKey)
						
						if ( ajax ) {
							$(form).ajaxSubmit({
								success: function( data ) {
									jQuery.formSent = false;
									data = $.evalJSON(data);
	
									if ( data.tpl != '' ) {
	
										$.ajax({
											async: false,
											type: "POST",
											url: document.URL,
											data: { ajaxFromTemplate: data.tpl },
											success: function( text ){ 
												if ( data.div != '' ) {
													$(data.div).html(text);
													jQuery.bmFormProcessor();
												}
											}
										});

										if ( data.clear_form )
											$(form).clearForm();
	
										if ( data.init_tmce )
											initTMCE_sablon();

										if ( data.init_tooltip )
											init_jgrowl_tooltips();
											
										if ( data.init_thickbox ) {
											tb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox
											imgLoader = new Image();// preload image
											imgLoader.src = tb_pathToImage;
										}
									}
									if ( data.alert != '' )
										bmAlert(data.alert);
									if ( data.error != '' )
										bmAlert(data.error, 'error');
								}
							});
						}
						else
							form.submit();
					}
					else {
						bmAlert( $.formMessages.formprocess, 'error' );
					}
					
					// ajaxFormSend --> $(form).ajaxSubmit();
				},
	
				invalidHandler: function(form, validator) {
					var errors = validator.numberOfInvalids();
					if ( errors > 0 ) {
						text = textU = '';
						jQuery.each(validator.errorList, function(i, val) {	
							text += '<li style="margin-left:20px">' + val.element.title + '</li>';
							if ( val.message == 'U' ) textU += '<li style="margin-left:20px">' + val.element.title + '</li>';
						});
						
						errors = '<p style="margin:7px 0;">' + $.formMessages.notvalidform +'<ul style="margin:0">'+ text +'</ul></p>';
						if ( textU ) errors += '<p style="margin:7px 0;">' + $.formMessages.inputunique + '<ul style="margin:0">'+ textU +'</ul></p>';
						
	    	    		bmAlert( errors, 'error' );
	        		}
				},
				errorPlacement: function(error, element) {},
				rules: {},
	
				highlight: function(element, errorClass) { $(element).addClass($.errorClass); },
				unhighlight: function(element, errorClass) { $(element).removeClass($.errorClass); }
			});
	
		},
		
	
	
		// ------ ------ FORM VALIDATOR ------ >
		
		bmFormValidatorCreator: function ( input, filter, value ) {
			switch ( filter ) {
				case '+': input.rules("add", { required: true, messages: { required: filter} } ); break; //case '+': $.actual_bm_form.settings.rules[name] = {required: true}; break;
				case 'E': input.rules("add", { email: true, messages: { email: filter} } ); break;
				case 'N': input.rules("add", { number: true, messages: { number: filter} } ); break;
				case 'W': input.rules("add", { url: true, messages: { url: filter} } ); break;
				case 'U': input.rules("add", { unique: true, messages: { unique: filter} } ); break;
				case 'L': input.rules("add", { loginname: true, messages: { loginname: filter} } ); break;
				case 'pwd': input.rules("add", { password: value, messages: { password: filter} } ); break;
				case 'lt': input.rules("add", { minlength: value, messages: { minlength: filter} } ); break;
				case 'gt': input.rules("add", { maxlength: value, messages: { maxlength: filter} } ); break;
			}
		},
		
		
		
		// ------ ------ FILE UPLOAD ------ >
		
		fileUploadOnChange: function( input ) {
			jQuery.fileUpload(input);
			$(input).replaceWith('<input type="file" name="'+$(input).attr('name')+'" onchange="jQuery.fileUploadOnChange(this);">');
		},
		
		fileUpload: function( input ) {
			ajaxStart();
	
			id    	  = new Date().getTime();
	
			form  	  = $(input.form);
			form_name = form.attr('name');
			frame	  = jQuery.createFileUploadIframe(id, form_name, input.name);
	
			form.attr('target', frame);
			document.forms[form_name].submit();
			form.attr('target', '_self');
		},
		
		createFileUploadIframe: function( id, form, input ) {
			id = 'bmFileUploadIFrame' + id;
			div = document.createElement('DIV');
//			div.innerHTML = '<iframe style="display:none" src="about:blank" id="'+id+'" name="'+id+'" onload="$.updateFileUploadContent(\''+id+'\', \''+form+'\', \''+input+'\')"></iframe>';
			div.innerHTML = '<iframe style="display:none" src="about:blank" id="'+id+'" name="'+id+'"></iframe>';
			document.body.appendChild( div );
			$('#'+id).load( function() { $.updateFileUploadContent(id, form, input) });
			return id;
		},
		
		createFileUploadForm: function( id, i, frame ) {
			var formId = 'bmFileUploadForm' + id;
			var fileId = 'bmFileUploadFile' + id;
			var form  = $('<form style="display:none" target="'+frame+'" action="" method="post" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"><input type="text" name="ajaxFormFunction"></form>');
			var newI  = $(i).clone();
			newI.appendTo(form);
			$(form).appendTo('body');
	
			return form;
		},
		
		updateFileUploadContent: function( frame, form, input ) {
			iname = form + input + 'list';
			var frame = document.getElementById(frame);
			var list  = document.getElementById(form + input + 'list');
			var input = $(document.forms[form].elements[input]);
	
			if ( frame.contentDocument )
	            var content = frame.contentDocument.body;
	        else if ( frame.contentWindow )
	            var content = frame.contentWindow.document.body;
	
			if (content.innerHTML.substr(0,8) == '_|spFn|_') {
				switch ( content.innerHTML.substr(8,1) ) {
					case '0':
						cc = content.innerHTML.substr(9);
						$(list).append(cc);
						bmAlert(jQuery.formMessages.uploadsucces);  
						break;
					case '1': bmAlert(jQuery.formMessages.uploaderror, 'error'); break;
					case '2': bmAlert(jQuery.formMessages.filelimit, 'error'); break;
					case '3': bmAlert(jQuery.formMessages.badfilytype, 'error'); break;
					case '4': bmAlert(jQuery.formMessages.maxfilesize, 'error'); break;
					case '5': bmAlert(jQuery.formMessages.fileexist, 'error'); break;
				}
			}
			else 
				bmAlert(jQuery.formMessages.uploaderror, 'error');
	
			input.attr('value', '');
			ajaxEnd();
		},
		
		deleteUploadFile: function( form, field, count ) {
			if ( confirm(jQuery.formMessages.deleteconfirm) ) {
				ajaxStart();
				$.post(document.URL, {field: field, count: count, ajaxFormFunction: form},
					function( data ) {
						if ( data == '' ) {
							$('#'+field+'-'+count).queue(function () { $(this).fadeOut('slow'); $(this).dequeue(); });
							$('#'+field+'-'+count).queue(function () { $(this).remove(); $(this).dequeue(); });
							bmAlert(jQuery.formMessages.deletecomplete);
						}
						else
							bmAlert(jQuery.formMessages.deleteerror, 'error');
						ajaxEnd();
					}
				);
			}
		},
		
		
		// ------ ------ SELECT UPDATE ------ >
		
		bmDropDownUpdate: function( input, target_name, multi ) {
			selectFirstRow = '-- Kérem válasszon --';
			i = 0;
	
			inputID = $(input).attr('value');
			form 	= $(input.form).attr('name');
	
			if ( multi == true ) {
				target = document.forms[form].elements[target_name+'[]'];
				$(target).empty();
			}
			else {
				target = document.forms[form].elements[target_name];
				$(target).empty();
				target.options[i++] = new Option(selectFirstRow, '');
			}
	
			if ( inputID > 0 ) {
				$.ajax({
					async: false,
					type: "POST",
					url: document.URL,
					data: { ajaxFormSelectUpdate: form, inputName: target_name, sql_where: inputID },
					success: function( data ){ 
						jQuery.each( $.evalJSON(data), function( j, val ) { target.options[i++] = new Option(val, j); });
					}
				});
			}
			$(target).change();
	
		},
		
		// ------ ------ FORM MESSAGES ------ >
		
		formMessages: {
			formprocess: 'Az űrlap feldolgozás alatt! Kérem várjon!',
			notvalidform: '<b>A következő mezők helytelenül vannak kitöltve:</b>',
			inputunique: '<b>A mezők értkei már szerepelnek az adatbázisban:</b>',
			uploadsucces: 'File feltöltése sikerült!',
			uploaderror: 'Váratlan hiba lépett fel a feltöltés során!',
			filelimit: 'Több fájl nem tölthető fel!',
			badfilytype: 'Nem engedélyezett file tipus!',
			maxfilesize: 'A fájl mérete túl nagy!',
			fileexist: 'A fájl már fel lett töltve!',
			deleteconfirm: 'Biztos törölni szeretné?',
			deletecomplete: 'File törlése sikerült!',
			deleteerror: 'Váratlan hiba lépett fel a törlés során!'
		}
	
	});
	
	
	
	
	// Validator - addMethod ---> UNIQUE
	
	jQuery.validator.addMethod("unique", function(value, element) { 
		var form  = $(element.form).attr('name');
		var input = element.name;
		var value = element.value;
		
		$.ajax({
			async: false,
			type: "POST",
			url: document.URL,
			data: { ajaxUniqueValidate: form, validateInput: input, inputValue: value },
			success: function(msg){ $.validatorUnique = msg; }
		});
	
		if ( jQuery.validatorUnique == 'true')
			return true;
		else
			return false;
	});
	
	
	// Validator - addMethod ---> LoginName
	
	jQuery.validator.addMethod("loginname", function(value, element) { 
		return this.optional(element) || /^(\w)+$/.test(value); 
	});
	
	
	// Validator - addMethod ---> Password
	
	jQuery.validator.addMethod("password", function(value, element, param) { 
		var input2 = document.forms[$(element.form).attr('name')].elements[param];
	
		if ( input2.value == '' || value == input2.value ) {
			if ( input2.value != '' )
				$(input2).removeClass($.errorClass);
			return true;
		}
		else
			return false;
	});

})(jQuery);

function rand( min, max ) {
    var argc = arguments.length;
    if (argc === 0) {
        min = 0;
        max = 2147483647;
    } else if (argc === 1) {
        throw new Error('Warning: rand() expects exactly 2 parameters, 1 given');
    }
    return Math.floor(Math.random() * (max - min + 1)) + min;
}