(function($){

	$(document).ready(function(){
		if ( jQuery.bmForms ) { jQuery.bmFormProcessor(); }
		if ( jQuery.bmLister ) { jQuery.bmListProcessor(); }
	});	

	jQuery.extend({
	
		// watermark
		bm_watermarks: new Array(),
		bm_watermark_color: '#787878',
		
		// form
		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 ) {
		
					var form = document.forms[val.f];
					jQuery.bmFormCreator( form, val.a );
			
			
					if ( form && val.e && val.e.length > 0 ) {
						jQuery.each( val.e, function( j, val2 ) {
							input = $(form.elements[val2.n]);
							
							if ( val2.w ) input.watermark();
							
							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 ) {
					$.watermark.hide();

					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');
											imgLoader = new 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' );
					}
				},
	
				invalidHandler: function(form, validator) {
					$.watermark.show(); 

					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: {},
				focusInvalid: false,
				focusCleanup: true,
	
				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ő értke már szerepel 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!'
		}
	
	});


	// ------ ------ ------ BM_LISTER ------ ------ >

	jQuery.extend({
	
		bmListProcessor: function () {
			if ( jQuery.bmLister && jQuery.bmLister.length > 0 ) {
				jQuery.each( jQuery.bmLister, function ( i, val ) {
	
					// next, last buttons
					if ( val.n ) {
						$.bm_lister_init_pager1( val.i, val.a, val.c, 1 );
						$.bm_lister_init_pager1( val.i, val.a, val.c, 2 );
					}
	
					// prev, frist buttons
					if ( val.p ) {
						$.bm_lister_init_pager2( val.i, val.a, 1, 1 );
						$.bm_lister_init_pager2( val.i, val.a, 1, 2 );
					}
	
					// search, reset buttons
					if ( val.s ) {
						$('.'+val.i+'_btn_search').click(function(e) {
							form = document.forms[val.i+'_form'];
							form.submit();
						});
						$('.'+val.i+'_btn_reset').click(function(e) {
							form = document.forms[val.i+'_form'];
							$(form).append('<input type="hidden" name="bm_lister_reset" />');
							form.submit();
						});
					}
					
					// orderby
					$('#'+val.i+' thead th').click(function(e) {
						$.ajax({
							async: false,
							type: "POST",
							url: document.URL,
							data: { bm_lister_name: val.t, bm_lister_orderby: this.title },
							success: function( data ) {
								document.location.href = data;
							}
						});
					});
					
					if ( val.m && val.m.length>0 ) {
						jQuery.each( val.m, function ( idx, value ) {
							$('#'+val.i+' .bml_modifier_'+value).click(function(e) {
								item = this;
								if ( confirm('Biztos, hogy szeretné módosítani?') ) {
									$.ajax({
										async: false,
										type: "POST",
										url: document.URL,
										data: { ajaxFromTemplate: val.t, bm_lister_name: val.t, bm_modifier_id: value, bm_lister_item_id: this.title },
										success: function( data ){
											$(item).queue(function () { $(this).fadeOut('fast'); $(this).dequeue(); });
											$(item).queue(function () { $(this).html(data); $(this).dequeue(); });
											$(item).queue(function () { $(this).fadeIn(); $(this).dequeue(); });
										}
									});
								}
							});
						});
					}
	
					if ( val.d ) {
						$('#'+val.i+' .bml_delete').click(function(e) {
							id = $($(this).html()+' span').text();
							item = '#'+val.i+'_id'+id;
							if ( confirm('Biztos, hogy szeretné törölni?') ) {
								$.ajax({
									async: false,
									type: "POST",
									url: document.URL,
									data: { ajaxFromTemplate: val.t, bm_lister_name: val.t, bm_lister_deleting_id: id },
									success: function( data ){
										if ( data == 'OK' ) {
											$(item).queue(function () { $(this).fadeOut('fast'); $(this).dequeue(); });
											$(item).queue(function () { $(this).remove(); $(this).dequeue(); });
										}
									}
								});
							}
						});
					}
					
				});
			}
		},
		
		bm_lister_init_pager1: function( formName, idxAct, idxLast, i ) {
			$('form[name=\''+ formName +'_pager'+ i +'\'] .'+ formName +'_next').click(function(e) {
				form = document.forms[formName + '_pager'+ i];
				form.elements['lister_page'].value = parseInt(idxAct)+1;
				form.submit();
			});

			$('form[name=\''+ formName +'_pager'+ i +'\'] .'+ formName +'_last').click(function(e) {
				form = document.forms[formName + '_pager'+ i];
				form.elements['lister_page'].value = parseInt(idxLast);
				form.submit();
			});
		},

		bm_lister_init_pager2: function( formName, idxAct, idxFirst, i ) {
			$('form[name=\''+ formName +'_pager'+ i +'\'] .'+ formName +'_prev').click(function(e) {
				form = document.forms[formName + '_pager'+ i];
				form.elements['lister_page'].value = parseInt(idxAct)-1;
				form.submit();
			});

			$('form[name=\''+ formName +'_pager'+ i +'\'] .'+ formName +'_first').click(function(e) {
				form = document.forms[formName + '_pager'+ i];
				form.elements['lister_page'].value = parseInt(idxFirst);
				form.submit();
			});
		},
		
		bm_lister_mouseover: function (i) { $(i).addClass('a'); },
		bm_lister_mouseout: function (i) { $(i).removeClass('a'); },
		
		bm_lister_moditem: function (i) { }

	});
	
	// ------ ------ Watermark ------ >

	$.fn.watermark = function() {
		$.bm_watermarks[$.bm_watermarks.length] = this;
		input = $(this);

		if ( input.val() == input.attr('title') || input.val() == '' )
			input.css('color', $.bm_watermark_color);
		if ( input.val() == '' )
			input.val( input.attr('title') );
		
		$(this).focus( function() {
			input = $(this);
			input.data('hasFocus', true);

			if ( input.val() == input.attr('title') )
				input.attr('value', '');
			input.css('color', '');
		});

		$(this).blur( function() {
			input = $(this);
			input.data('hasFocus', false);

			if ( input.val().length ==0 || input.val() == input.attr('title') ){
				input.val( input.attr('title') );
				input.css('color', $.bm_watermark_color);
			}
			else
				input.css('color', '');
		});

	}

	$.watermark = {
		hide: function() {
			for (var i=0; i<$.bm_watermarks.length; i++){
				input = $.bm_watermarks[i];

				if ( input.val() == input.attr('title') )
					input.val('');
			}
		},
		show: function() {
			for (var i=0; i<$.bm_watermarks.length; i++){
				input	 = $.bm_watermarks[i];
				hasFocus = input.data('hasFocus');

				if ( input.val() == '' && !hasFocus ) 
					input.val( input.attr('title') );
				else 
					$(this).css('color', '');
			}
		}
	}


	
	// Validator - addMethod ---> UNIQUE
	try {
		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;
		});
	} catch(e) {}

})(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;
}
