(function($){

	$(document).ready(function(){
		$.listProcessor();
		$.formProcessor();
		$.uploaderProcessor();
		$.regenerateSession();

		if ( $.BMMessagesAlert ) { bmAlert($.BMMessagesAlert, 'notify', true); }
		if ( $.BMMessagesError ) { bmAlert($.BMMessagesError, 'error', true); }

		$('a[data-popup]').live('click', function(){
			var data = jQuery.parseJSON( $(this).attr('data-popup') );
			bm_popup(data.title, data.href, data, data.width, data.height);
			return false;
		});

		if ( typeof Shadowbox == 'object' ) Shadowbox.init();
	});


	jQuery.extend({

		// watermark
		bm_watermarks: new Array(),
		bm_watermark_color: '#787878',

		// form
		formSent: false,
		errorClass: 'invalid',

		formMessages: {
			formerror: 'Az űrlap helytelenül van kitöltve!',
			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 következő mezők megadott értékei már foglaltak: </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!'
		},

		regenerateSession: function() {
			window.setTimeout(function() {
				$.ajax({
					type: "POST",
					url: document.URL,
					data: { _regenerateSession: true },
					success: function( data ) { $.regenerateSession(); }
				});
			}, 600000);
		},

		// ------ ------ ------ BM_FORM ------ ------ >

		formProcessor: function() {
			$(':file').change(function() { jQuery.fileUploadOnChange(this); });

			jQuery.validator.messages = {
				required:	'A mező kitöltése kötelező!',
				email:		'Kérem adjon meg egy érvényes e-mail címet!',
				number:		'A mező értéke csak szám lehet!',
				date:		'Kérem adjon meg érvényes dátumot!',
				phone:		'Kérem adjon meg érvényes telefonszámot!',
				url:		'Kérem adjon meg érvényes url címet!',
				unique:		'A mező értéke már foglalt!',
				username:	'Csak a-z, A-Z, 0-9 és _',
				minlength:	'Legalább {0} karakter!',
				maxlength:	'Legfeljebb {0} karakter!',
				min: 		'A mező értéke legalább {0}!',
				max: 		'A mező értéke legfeljebb {0}!',
				equal: 		'A két mező értéke nem egyezik meg!',
				eigenfunc:	''
			}

			// set Default Validatot options
			jQuery.validator.setDefaults({
				errorClass: "invalid",
				validClass: "valid",
				success: "valid",
				ignore: ".ignore",

				ignoreTitle: true,
				errorElement: "em",

				onkeyup: false,
				focusInvalid: false,
				focusCleanup: true,
//				onclick: true,

				submitHandler: function( form ) {
					if ( jQuery.formSent === false ) {
						jQuery.formSent = true;

						$.watermark.hide();
						$(':file').remove();

						$(form).find(':hidden[name="D54ghW43tGFD"]').val( '_BMvalideformBM_' );

						form.submit();
					}
					else {
						bmAlert( $.formMessages.formprocess, 'error' );
						return false;
					}
				},

				invalidHandler: function(form, validator) {
					$.watermark.show();
					bmAlert($.formMessages.formerror, 'error');
				},

				highlight: function(element, errorClass) {
					$('label[for='+$(element).attr('id')+']').addClass('invalid-label');
					$(element).addClass(errorClass);
				},

				unhighlight: function(element, errorClass) {
					$('label[for='+$(element).attr('id')+']').removeClass('invalid-label');
					$(element).removeClass(errorClass);
				}

			});

			// set form validators
			jQuery.each( $(':hidden[name="_formName"]'), function(i,val) {
				var form = $(val).attr("form");
				var funct = $(form).find(':hidden[name="_jsValidator"]').val();

				if ( funct ) {
					funct += '(form)';
					try {
						eval(funct);
						return;
					}
					catch( error ) { }
				}
				else
					$(form).validate();
			});

			// datepicker
			$(':input.datepicker').datepicker({
				dateFormat: 'yy-mm-dd',
				changeMonth: true,
				changeYear: true
			});

			// watarmark/ placeholder
			$(':input.placeholder').each(function(){ $(this).watermark(); });
		},

		formCreator: function( form ) {
			$(form).validate({
				submitHandler: function(form) { },
				invalidHandler: function(form, validator) { }
			});
		},


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

		listProcessor: function() {
			if ( $('div.bmlist-wrapper').length > 0 ) {
				/** list - limiter */
				$('div.bmlist-wrapper div.list-limiter-wrapper select.list-limiter-select').bind('change', function(){
					try {
						$.listFromCreator( this, {limit: this.value} );
					} catch(err) { }
				});

				/** list - pager links */
				$('div.bmlist-wrapper div.list-pager-wrapper a').bind('click', function(){
					try {
						if ( $(this).attr('data-page') )
							$.listFromCreator( this, {page: $(this).attr('data-page')} );
					} catch(err) { }
					return false;
				});
				/** list - pager input */
				$('div.bmlist-wrapper div.list-pager-wrapper input.pager-num-input').bind('keypress', function( event ){
					try {
						if (event.keyCode == '13') {
							$.listFromCreator( this, {page: $(this).val()} );
							return false;
						}
					} catch(err) { }
				});

				/** list - orderString */
				$('div.bmlist-wrapper .list-order-string').bind('click', function(){
					try {
						$.listFromCreator( this, {
							order: $(this).attr('data-order'),
							orderby: $(this).attr('data-orderby')
						});
					} catch(err) { }
				});

				/** list - orderBySelect */
				$('div.bmlist-wrapper div.list-order-wrapper select.list-orderby-select').bind('change', function(){
					try {
						$.listFromCreator( this, {
							order: $(this).attr('data-order'),
							orderby: $(this).val()
						});
					} catch(err) { }
				});
				/** list - orderSelect */
				$('div.bmlist-wrapper div.list-order-wrapper select.list-order-select').bind('change', function(){
					try {
						$(this)
							.parents('div.list-order-wrapper')
							.find('select.list-orderby-select')
							.attr('data-order', this.value)
							.change();
					} catch(err) { }
				});
				/** list - orderLinks */
				$('div.bmlist-wrapper div.list-order-wrapper a').bind('click', function(){
					try {
						$(this)
							.parents('div.list-order-wrapper')
							.find('select.list-orderby-select')
							.attr('data-order', $(this).attr('data-order'))
							.change();
					} catch(err) { }
					return false;
				});
			}
		},

		listFromCreator: function( obj, data ) {
			try {

				var $name = $(obj).parents('div.bmlist-wrapper').attr('data-name');
				if ( $name ) {
					var $form = $('<form>', { method: 'post' })
						.css({'display': 'none' })
						.append( $('<input>', { type: 'hidden', name: '_listName', value: $name }) );

					$.each(data, function(key,val){
						$form.append( $('<input>', { type: 'hidden', name: '_listOptions['+key+']', value: val }) );
					});
					$form.appendTo('body').submit();
				}

			} catch(err) { }

			return false;
		},


		// ------ ------ ------ BM_UPLOAD_PROCESSOR ------ ------ >

		uploaderProcessor: function() {
			jQuery.each( $('div.bm-fileuploader'), function(i, val) {

				var options = $(val).metadata({type:'attr',name:'data-option'});
				var template = $(val).html();
				$(val).html('');

				if ( !options.title )
					options.title = 'Upload a file';

				$(val).bmFileUploader({
			        url: document.URL,
			        data: {
			        	_formName: options.form,
			        	_formInput: options.id
			        },

					btnTitle: options.title,

			        extensions: options.ext,
			        sizeLimit: options.size,
			        fileLimit: options.file,
			        numFiles: options.filesize,

					template: template,
					files: options.files,

					showMessage: function( message ) {
						bmAlert(message,'error');
					}
				});

			});
		},

		// ------ ------ 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",
					dataType: 'json',
					url: document.URL,
					data: { ajaxFormSelectUpdate: form, inputName: target_name, sql_where: inputID },
					success: function( data ){
						$.each(data, function(j,val){ target.options[i++] = new Option(val, j); });
					}
				});
			}
			$(target).change();

		}

	});


	/**
	 * BmFileUploadser
	 * ----------------------------------------------------------------------------------- */
	$.fn.bmFileUploader = function( options ) {
		$(this).data('foptions', $.extend({},$.bmFileUpload));
		$(this).data('foptions').init(this,options);
	}

	$.bmFileUpload = {

		element: null,
		handler: null,
		files: {},

		options: {
			url: null,
			data: {},
			template: null,
			listContainer: null,

			extensions: [],
			fileLimit: 0,
			sizeLimit: 0,
			numFiles: 0,

			files: [],
			btnTitle: 'Upload',

			messages: {
				fileLimitError: 'Több fájl nem tölthető fel!',
				sizeLimitError: 'A fájl mérete túl nagy!',
				extensionError: 'Nem engedélyezett kiterjesztés!',
				uploadError: 'A fájl feltöltése nem sikerült!'
			},

			showMessage: function( message ) {
				alert(message);
			}
		},
		classes: {
			button: 'bm-upload-button',

			list: 'bm-upload-list',
			item: 'bm-upload-item',
			image: 'bm-upload-image',
			title: 'bm-upload-title',

			btnTinymce: 'bm-upload-tinymce',
			btnModify: 'bm-upload-modify',
			btnCancel: 'bm-upload-cancel',
			btnDelete: 'bm-upload-delete',
			btnOpen: 'bm-upload-open',
			shadowbox: 'bm-upload-shadowbox',

			load: 'bm-upload-load',
			success: 'bm-upload-success',
			fail: 'bm-upload-fail'
		},

		init: function( div, options ) {
			this.element = div;

			this.options = $.extend({}, $.bmFileUpload.options, options);
			this.button = $.extend({}, $.bmFileUpload.button);
			this.button.create( this );

			this.handler = $.extend({}, $.bmFileUploadHandler);
			this.handler.init(this);

			// generate list form existing items
			if ( this.options.files.length > 0 ) {
				var uploader = this;
				jQuery.each( this.options.files, function(i, v) {
					uploader.item.generate(v.id, v.file, v.large, v.title, uploader);
				});
			}
		},

		onInputChange: function( input ) {
			this.button.reset();
			if ( this.isValid( input ) ) {
				this.options.numFiles++;
				this.handler.uploadFile( input );
			}
		},

		isValid: function( input ) {

			// file limit
			if ( this.options.fileLimit>0 && this.options.numFiles >= this.options.fileLimit ) {
				this.options.showMessage(this.options.messages.fileLimitError);
				return false;
			}

			// allowed extensions
			if ( this.options.extensions.length>0 ) {
				var fileName = input.value;
				var ext = (-1 !== fileName.indexOf('.')) ? fileName.replace(/.*[.]/, '').toLowerCase() : '';

				if ( $.inArray(ext, this.options.extensions) == -1 ) {
					this.options.showMessage(this.options.messages.extensionError);
					return false;
				}
			}

			// file size limit
			if ( this.options.sizeLimit>0 && !this.isValidSize( input ) ) {
				this.options.showMessage(this.options.messages.sizeLimitError);
				return false;
			}

			return true;
		},

		isValidSize: function( input ) {
			if ( typeof File != "undefined" &&
				 typeof (new XMLHttpRequest()).upload != "undefined" &&
				 input.files &&
				 input.files[0].fileSize != null &&
				 input.files[0].fileSize > this.options.sizeLimit )
			{
				return false;
			}
			return true;
		},

		button: {
			uploader: null,
			div: null,
			button: null,
			input: null,

			create: function( object ) {
				this.uploader = object;

				// create button
				this.button = $('<input>')
					.attr({ type: 'button', value: this.uploader.options.btnTitle })
					.addClass( $.bmFileUpload.classes.button )
					.css({ cursor: 'pointer' });

				// create file input
				this.input = this.createInput();

				// create container div and append to parent div
				this.div = $('<div>')
					.append(this.button)
					.append(this.input)
					.appendTo(this.uploader.element)
					.css({ overflow: 'hidden', position: 'relative', direction: 'ltr', width: this.button.outerWidth()+2 });

				// create list container div
				this.uploader.options.listContainer = $("<div/>", { "class": "bm-upload-list" }).appendTo($(this.uploader.element));
			},

			createInput: function() {
				var $self = this.uploader;

				return $('<input>').attr({ type: 'file' }).css({
		            position: 'absolute',
		            right: 0,
		            top: 0,
		            zIndex: 1,
		            fontSize: '500px',
		            opacity: 0,
		            margin: 0,
		            padding: 0,
		            cursor: 'pointer'
		        }).change( function() { $self.onInputChange(this); });
			},

			reset: function( v ) {
				this.input.remove();
				this.input = this.createInput();
				this.div.append( this.input );
			}
		},

		item: {
			uploader: null,

			item: null,
			itemID: null,

			file: null,
			large: null,
			title: null,
			iframe: null,
			form: null,

			generate: function( itemID, file, large, title, uploader ) {
				var item = $(uploader.options.template).clone();
				$(item).data('options', $.extend({},this));
				$(item).data('options').init( itemID, file, large, title, uploader, item );
				$(item).data('options').setupDefault();
				$(item).data('options').appendItem();
				$(item).fadeIn('slow');

				return item;
			},

			generateTemp: function( itemID, file, large, title, iframe, form, uploader ) {
				var item = $(uploader.options.template).clone();

				$(item).addClass($.bmFileUpload.classes.load);
				$(item).data('options', $.extend({},this));
				$(item).data('options').init( itemID, file, large, title, uploader, item );
				$(item).data('options').iframe = iframe;
				$(item).data('options').form = form;

				$(item).data('options').setupTemp();
				$(item).data('options').appendItem();
				$(item).fadeIn('slow');

				return item;
			},

			update: function( itemID, file, large, title ) {
				this.itemID = itemID;
				this.file = file;
				this.large = large;
				this.title = title;

				$(this.item).addClass($.bmFileUpload.classes.success);
				this.setupDefault();
			},

			init: function( itemID, file, large, title, uploader, item ) {
				this.itemID = itemID;
				this.file = file;
				this.large = large;
				this.title = title;
				this.uploader = uploader;
				this.item = item;
			},

			appendItem: function() {
				$(this.uploader.options.listContainer).append(this.item);
			},

			setupDefault: function() {
				var item = this;
				var large = this.large;

				if ( !large )
					large = this.file;

				// unset cancal button
				$(this.item).find("."+$.bmFileUpload.classes.btnCancel).unbind('click').hide();

				// unset loading
				$(this.item).find("."+$.bmFileUpload.classes.load).hide();

				// set image
				$(this.item).find("."+$.bmFileUpload.classes.image).attr({
					src: this.file,
					title: this.title,
					alt: this.title
				}).show();

				// set title
				$(this.item).find("."+$.bmFileUpload.classes.title).html(this.title);

				// set open
				$(this.item).find("."+$.bmFileUpload.classes.btnOpen).attr({
					href: large,
					title: this.title,
					target: '_blank'
				}).show();

				// shadowbox
				if ( typeof Shadowbox == 'object' ) {
					$(this.item).find("."+$.bmFileUpload.classes.shadowbox)
						.attr({ href: large, title: this.title })
						.show()
						.bind('click', function(){ Shadowbox.open(this); return false; });
				}

				// set tinymce
				$(this.item).find("."+$.bmFileUpload.classes.btnTinymce).unbind('click').bind('click', function() {
					if ( $(this).attr('data-tinymce') )
						tinyMCE.get( $(this).attr('data-tinymce') ).execCommand('mceInsertContent', false ,'<img src="' + large + '" title="' + item.title + '" alt="'+ item.title +'" />');
					return false;
				}).show();

				// set modify button
				$(this.item).find("."+$.bmFileUpload.classes.btnModify).unbind('click').bind('click', function() {
					var _title = prompt("Kérem adja meg a file új nevét:", item.title);

					if ( _title ) {
						$.ajax({
							async: false,
							type: "POST",
							dataType: 'json',
							url: document.URL,
							data: {
								_formUpload: item.uploader.options.data._formName,
								_formUploadInput: item.uploader.options.data._formInput,
								_formUploadAction: 'modify',
								itemID: item.itemID,
								title: _title
							},
							success: function( data ){
								if ( data.success == true ) {
									item.title = _title;
									item.setupDefault();
								}
							}
						});
					}
					return false;
				}).show();

				// set delete button
				$(this.item).find("."+$.bmFileUpload.classes.btnDelete).unbind('click').bind('click', function() {
					if ( confirm('Biztos, hogy szeretné törölni a feltöltött file-t?') ) {
						$.ajax({
							async: false,
							type: "POST",
							dataType: 'json',
							url: document.URL,
							data: {
								_formUpload: item.uploader.options.data._formName,
								_formUploadInput: item.uploader.options.data._formInput,
								_formUploadAction: 'delete',
								itemID: item.itemID
							},
							success: function( data ){
								if ( data.success == true ) {
									--item.uploader.options.numFiles;
									$(item.item).fadeOut(300, function(){ $(this).remove() });
								}
							}
						});
					}
					return false;
				}).show();
			},

			setupTemp: function() {
				var item = this;

				// set image
				$(this.item).find("."+$.bmFileUpload.classes.image).hide();

				// set title
				$(this.item).find("."+$.bmFileUpload.classes.title).html(this.title);

				// unset open
				$(this.item).find("."+$.bmFileUpload.classes.btnOpen).unbind('click').hide();

				// unset shadowbox
				$(this.item).find("."+$.bmFileUpload.classes.shadowbox).unbind('click').hide();

				// unset tinymce button
				$(this.item).find("."+$.bmFileUpload.classes.btnTinymce).unbind('click').hide();

				// unset modify button
				$(this.item).find("."+$.bmFileUpload.classes.btnModify).unbind('click').hide();

				// unset delete button
				$(this.item).find("."+$.bmFileUpload.classes.btnDelete).unbind('click').hide();

				// set cancel button
				$(this.item).find("."+$.bmFileUpload.classes.btnCancel).bind('click', function() {
					$(item.item).fadeOut(300, function(){ $(this).remove(); });
					item.uploader.options.numFiles--;

					$(item.form).remove();
					$(item.iframe).attr('src', 'about:blank');
					$(item.iframe).remove();
					return false;
				}).show();

				// set loading
				$(this.item).find("."+$.bmFileUpload.classes.load).show();

			}
		}
	}

	$.bmFileUploadHandler = {
		uploader: null,

		init: function( uploader ) {
			this.uploader = uploader;
		},

		uploadFile: function( input ) {
			var $self = this;
			var $iframe = this.createIframe();
			var $form = this.createForm( input, $iframe.attr('name') );
			var $item = this.uploader.item.generateTemp(null, null, null, input.value, $iframe, $form, this.uploader);

			$iframe.bind('load', function () {
				$self.attachE( this, $item );
			});
			$form.submit();
			$form.remove();
		},

		createIframe: function() {
			var $id = 'bmFormFu' + (new Date().getTime());

			return $('<iframe id="'+$id+'" name="'+$id+'" src="about:blank"></iframe>')
				.css({ position: 'absolute', top: '-1000px', left: '-1000px', display: 'none' })
				.appendTo(document.body);
		},

		createForm: function( input, target ) {
			return $('<form method="POST" enctype="multipart/form-data" action="'+this.uploader.options.url+'" target="'+target+'"></form>')
				.appendTo(document.body)
				.css({ position: 'absolute', top: '-1000px', left: '-1000px', display: 'none' })
				.append( this.createInput(input) )
				.append('<input type="hidden" name="_formUpload" value="'+ this.uploader.options.data._formName +'" />')
				.append('<input type="hidden" name="_formUploadInput" value="'+ this.uploader.options.data._formInput +'" />')
				.append('<input type="hidden" name="_formUploadAction" value="insert" />');
		},

		createInput: function( input ) {
			return $(input).attr('name', this.uploader.options.data._formInput);
		},

		attachE: function( iframe, item ) {
			var data = iframe.contentWindow ? iframe.contentWindow.document : iframe.contentDocument ? iframe.contentDocument : iframe.document;
			data = data.body.innerHTML;
			$(iframe).attr('src', 'about:blank');
			$(iframe).remove();

			data = $.parseJSON(data);

			if ( data.success == true ) {
				item.data('options').update(data.id, data.file, data.large, data.title, null);
			}
			else {
				$(item.data('options').item).fadeOut(300, function(){ $(this).remove() });
				this.uploader.options.numFiles--;

				switch( data.error ) {
					case 3:
						this.uploader.options.showMessage(this.uploader.options.messages.sizeLimitError);
						break;

					case 5:
						this.uploader.options.showMessage(this.uploader.options.messages.fileLimitError);
						break;

					case 9:
						this.uploader.options.showMessage(this.uploader.options.messages.extensionError);
						break;

					default:
						this.uploader.options.showMessage(this.uploader.options.messages.uploadError);
						break;
				}
			}
		}
	}


	/**
	 * 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 ---> username

		jQuery.validator.addMethod("username", function(value, element) {
			return this.optional(element) || /^(\w)+$/.test(value);
		});


		// Validator - addMethod ---> date

		jQuery.validator.addMethod("date", function(value, element) {
			return this.optional(element) || /^[0-9]{4}(\.|\-)[0-9]{1,2}(\.|\-)[0-9]{1,2}$/.test(value);
		});


		// Validator - addMethod ---> equal

		jQuery.validator.addMethod("equal", 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);

/**
 * display status/error message
 *  @param message {string}
 *  @param type {string} notify | error
 *
*/

function bmAlert(message, type, sticky ) {
	// set value if not set, or not valid
	// @todo test in IE
	if (!type) type = "notify";

	// create wrapper if does not exist
	if (!$("#bm_alert").length)
		$("<div/>",{ id: "bm_alert" }).appendTo("body");

	// append message to wrapper
	$close = $("<p/>", { 'class': 'bm_alert_hide', html: 'X' }).click(function(){
		$(this).parent().remove();
	});
	$pic = $("<p/>", { 'class': 'bm_alert_pic' });
	$item = $("<div/>", { "class": type }).append($pic).append(message).append($close);
	$("#bm_alert").append($item)

	if ( sticky == true) {
		$item.fadeIn(600);
	}
	else {
		$item.fadeIn(600).delay(7000).fadeOut(600, function(){ $(this).remove() });
	}
}

// bm popup window from template
function bm_popup( title, template, vars, sizex, sizey ) {
	//enableKeys: false, overlayOpacity: 0.7
	$.ajax({
		async: false,
		type: "POST",
		url: document.URL,
		data: { ajaxFromTemplate: template, vars: vars },
		success: function( data ){
			Shadowbox.open({
				content:    '<div style="background:white;width:'+sizex+'px;height:'+sizey+'px;padding:10px;display:block;overflow:auto">'+data+'</div>',
				player:     "html",
				title:      title,
				height:     sizey+20,
				width:      sizex+20,
				options: 	{
					enableKeys: false,
					overlayOpacity: 0.7,
					onFinish: function() {
						$.formProcessor();
						$.listProcessor();
					}
				}
			});
		}
	});
}

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

function ajaxStart() {
	$('<div>').attr('id', 'bmAjaxLoadingBox')
	.css({
		opacity: 0.3,
		background: '#000',
		width: '100%',
		height: '100%',
		position: 'fixed',
		zIndex: '100',
		top: 0,
		left: 0
	}).appendTo(document.body);
	$('<img>')
		.attr({ src: '/images/icons/loading.gif' })
		.css({ margin: '40% 0 0 40%' })
		.appendTo( $('#bmAjaxLoadingBox') );
}

function ajaxEnd() { $('div#bmAjaxLoadingBox').fadeOut('slow').remove(); }
