(function($){
	
	$.jQueryUI = function(el) {
		if (!el) el = 'body:first';
		var $cont = $(el);
		
		$cont.find('.zebra').zebra();
	}
	
	$.fn.jQueryUI = function(){
		return this.each(function(){
			$.jQueryUI(this);
		});
	}

	/**
	 * The function adds EVEN and ODD classes to row or list item elements.
	 */
	$.fn.zebra = function(){
		return this.each(function(){
			var $this = $(this);
			var ch = '*';
			switch (this.tagName){
				case 'UL':
				case 'OL':
					ch = '> li';
				break;
				case 'TABLE':
					ch = '> tbody > tr';
				break;
				case 'THEAD':
				case 'TBODY':
				case 'TFOOT':
					ch = '> tr';
				break;
			}
			$this.find(ch).removeClass('even odd');
			$this.find(ch+':even').addClass('even');
			$this.find(ch+':odd').addClass('odd');
		});
	}
	
	/**
	 * The function returns object with all fields values in current container.
	 */
	$.fn.getFields = function(obj){
		var result = obj || {};
		this.each(function(){
			var $this = $(this);
			if (this.tagName=='LI') result['li-value-id'] = $this.attr('value');
			
			$this.find('input:text,input:password,input:radio:checked,input[type="hidden"],textarea,select').each(function(){
				result[ $(this).attr('name') ] = $(this).val();
			});
			$this.find('input:checkbox:checked').each(function(){
				var size = $this.find('input[name="'+$(this).attr('name')+'"]').size();
				if (!result[ $(this).attr('name') ]){
					result[ $(this).attr('name') ] = size > 1 ? [ $(this).val() ] : $(this).val();
				} else {
					if (size > 1){
						if (typeof result[ $(this).attr('name') ] != 'object')
							result[ $(this).attr('name') ] = [];
						result[ $(this).attr('name') ].push($(this).val());
					} else
						result[ $(this).attr('name') ] = $(this).val();
				}
			});
		});
		return result;
	}
	
	/**
	 * The function fills all fields in current container with values from passed object.
	 */
	$.fn.fillFields = function(obj){
		if (!obj) obj = {};
		return this.each(function(){
			var $this = $(this);
			
			function _fill(obj, name){
				for (key in obj){
					var str = name == '' ? key : (name+'['+key+']');
					if (typeof obj[key] == 'object'){
						_fill(obj[key], str);
					} else {
						$this.find(':input[name="'+str+'"]').val(obj[key]).change();
					}
				}
			}
			_fill(obj, '');
		});
	}
	
	/**
	 * The function prevents fill text in non first case text transformation.
	 */
	$.fn.firstCase = function(o){
		var defaults = {
			behavior : null
		};
		var options = $.extend(defaults, o || {});
		return this.each(function(){
			var $this = $(this);
			
			var firstCase = {
				convert	: function(str){
					if (typeof options.behavior == 'function'){
						return options.behavior.call(this, str);
					} else {
						return this.firstCase(str);
					}
				},
				firstCase : function(str){
					var arr = str.split(' '), r = '';
					for (var i=0;i<arr.length;i++){
						if (r.length) r += ' ';
						r += arr[i].substring(0,1).toUpperCase()+arr[i].substring(1).toLowerCase();
					}
					return r;
				}
			}
			
			/*
			function convert(str){
				if (typeof options.behavior == 'function'){
					return options.behavior.call(this, str);
				} else {
					return _firstCase(str);
				}
			}
			
			function _firstCase(str){
				var arr = str.split(' '), r = '';
				for (var i=0;i<arr.length;i++){
					if (r.length) r += ' ';
					r += arr[i].substring(0,1).toUpperCase()+arr[i].substring(1).toLowerCase();
				}
				return r;
			}
			*/
			
			$this.keyup(function(event){
				$(this).val(firstCase.convert($(this).val()));
			});
			
			$this.blur(function(){
				$(this).val(firstCase.convert($(this).val()));
			});

			$(this).val(firstCase.convert($(this).val()));
		});
	}
	
	/**
	 * Dialog box plugin
	 */
	$.fn.dialogBox = function(opt){
		var settings = $.extend({
			'text'		: '',
			'overlay'	: true,
			'btnCancel'	: false,
			'btnClose'	: true,
			'btnOk'		: false,
			'txtCancel'	: 'Cancel',
			'txtClose'	: 'Close',
			'txtOk'		: 'OK',
			'onCancel'	: null,
			'onClose'	: null,
			'onOk'		: null,
			'onSubmit'	: null,
			'onInit'	: null,
			'className'	: null,
			'closeClick': false,
			'left'		: null,
			'top'		: null,
			'toolbar'	: false,
			'toolbarClose' : true,
			'dialogType'	: 'msg'
		},opt);
		
		return this.each(function(){
			var $box = $(this).find('> div.js-dialog-box');
			if (!$box.size()){
				var html = '<div class="js-dialog-box"><div class="mask"></div><div class="box-wrapper">';
				if (settings.toolbar) html += '<div class="toolbar"></div>';
				var success = '';
				html += '<div class="box dialog-'+settings.dialogType+'"></div></div></div>';
				$(this).prepend(html);
				$box = $(this).find('> div.js-dialog-box');
			}
			if (settings.toolbar){
				var $bar = $box.find('div.toolbar');
				if (settings.toolbarClose) $bar.append('<a href="#close" class="close" title="'+settings.txtClose+'"></a>');
			}
			if (settings.className) $box.addClass(settings.className);
			if (!settings.overlay) $box.find('> .mask').hide();
			$box.find('div.box').append(settings.text).each(function(){
				if (settings.btnClose) $(this).append('<input type="button" name="close" value="'+settings.txtClose+'" class="close input-button-75" />');
				if (settings.btnCancel) $(this).append('<input type="button" name="cancel" value="'+settings.txtCancel+'" class="cancel input-button-75" />');
				if (settings.btnOk) $(this).append('<input type="button" name="ok" value="'+settings.txtOk+'" class="ok input-button-75" />');
			});
			
			$box.unbind('close').bind('close',function(event){
				$box.remove();
			});
			
			$box.find('div.mask').unbind('click').click(function(){
				if (settings.closeClick) $box.trigger('close');
				return true;
			});
			
			$box.find('div.toolbar a[href$="#close"]').unbind('click').click(function(){
				$box.trigger('close');
				return false;
			})
			
			$box.find('input[name="cancel"]').click(function(){
				$box.trigger('close');
				if (typeof settings.onCancel == 'function') settings.onCancel.call(this);
				if (typeof settings.onSubmit == 'function') settings.onSubmit.call(this,false);
				return false;
			});
			
			$box.find('input[name="close"]').click(function(){
				$box.trigger('close');
				if (typeof settings.onClose == 'function') settings.onClose.call(this);
				if (typeof settings.onSubmit == 'function') settings.onSubmit.call(this,false);
				return false;
			});
			
			$box.find('input[name="ok"]').click(function(){
				$box.trigger('close');
				if (typeof settings.onOk == 'function') settings.onOk.call(this);
				if (typeof settings.onSubmit == 'function') settings.onSubmit.call(this,true);
				return false;
			});
			
			function _resizeBox(){
				$box.height(getWindowSize('height'));
				$box.find('div.box-wrapper').each(function(){
					if (settings.left||settings.top){
						$(this).css({
							'left'	: settings.left+'px',
							'top'	: (settings.top > 10 ? settings.top : 10)+'px'
						});
					} else {
						var top = (getWindowSize('windowHeight')-$(this).height())/2;
						$(this).css({
							'left'	: (getWindowSize('windowWidth')-$(this).width())/2+getWindowScroll('left')+'px',
							'top'	: (top > 10 ? top : 10)+'px'
						});
					}
				});
			};
			
			_resizeBox();
			
			if (typeof settings.onInit == 'function') settings.onInit.call($box.get(0));
			
		});
	}
	
	/**
	 * Toggle input
	 */
	$.fn.toggleInput = function(){
		return this.each(function(){
			var $this = $(this), value = $this.val();
			
			$this.focus(function(){
				if ($this.val()==value) $this.val('');
			});
			
			$this.blur(function(){
				if ($this.val()=='') $this.val(value);
			});
		});
	}
	
	/**
	 * The function sends by POST positions for current list items to server.
	 */
	$.fn.orderPosition = function(url, o){
		var defaults = {
			data : {},
			onStop : null
		};
		var options = $.extend(defaults, o || {});
		return this.each(function(){
			var $ul = $(this), values = new Array();
			
			$ul.find('> li').each(function(){
				values[values.length] = $(this).attr('value');
			});
			
			$ul.sortable({
				'stop' : function(event,ui){
					if (!url) return;
					var items = new Array();
					$ul.find('> li').each(function(){
						items[items.length] = $(this).attr('value');
					});
					// Check if sorting is changed
					if (items.join() == values.join()) return false;
					values = items;
					var postData = $.extend(options.data || {}, {ajax : 1, 'attachMethod' : 'none', 'items':items} );
					$ul.parent().showLoading({'style' : 'new'});
					$.post(url, postData, function(res){
						$ul.parent().hideLoading();
						$ul.parent().jQueryUI();
						if (typeof options.onStop == 'function') options.onStop.call(this);
					}, 'json');
				}
			});
		});
	}
	
	/**
	 * The function translates patterns in the current container.
	 * {#PATTERN-NAME}	-> to application.i18n[PATTERN-NAME]
	 */
	$.fn.translate = function(){

		function _translate(s) {
			var i18n = application.i18n;
			if (!s) return '';

			return i18n[s] || s.replace(/{\#([^}]+)\}/g, function(a, b) {
				return i18n[b] || '{#'+b+'}';
			});
		}

		return this.each(function(){
			$(this).find('label,a,span').each(function(){
				$(this).text(_translate($(this).text()));
			});
			$(this).find('input[type="button"],input[type="submit"]').each(function(){
				$(this).val(_translate($(this).val()));
			});
		});
	}
		
	/**
	 * The function checks for field value in database.
	 */
	$.fn.doesFieldExist = function(url, o){
		var data = o || {};
		
		return this.each(function(){
			var $this = $(this);
			
			$this.change(function(){
				var value = $(this).val(), $span = $(this).parents('tr:first').find('span.js-test');
				if (value.length<3){
					$span.hide();
					return false;
				}
				var post = data;
				post[ $(this).attr('name') ] = value;
				$span.removeClass('free busy error load').addClass('load').text(_T('Loading'));
				$.post(url, post, function(res){
					$span.removeClass('load');
					if (!res || !res.result)
						$span.addClass('error').text(_T('Incorrect field'));
					else if (res.free) 
						$span.addClass('free').text(_T('Free')); 
					else 
						$span.addClass('busy').text(_T('Busy'));
					$span.show();
				}, 'json');
			}).change();
		});
	}

	/**
	 * The function prevents Past action fo current container (text field).
	 */
	$.fn.nocopyField = function(){
		return this.each(function(){
			var $this = $(this);
			
			$this.bind('contextmenu',function(e){
				// disable context menu for field
				return false;
			});
			
			$this.keydown(function(which){
				// disable Ctrl and Insert keys for field
				if (which.ctrlKey || which.keyCode == 45) return false;
				return true;
			});
		});
	}
	
	/**
	 * The function open popup window.
	 */
	$.popupWindow = function(url, o){
		var defaults = {
			align	: "center",
			valign	: "bottom",
			width	: "50%",
			height	: "80%"
		};
		var options = $.extend(defaults, o || {});
		
		var left = 0, top = 0,
			w = options.width, h = options.height, wsz = getWindowSize();
		
		if (w.toString().substr(-1) == '%') w = parseInt(parseInt(w, 10) * wsz[2] / 100, 10);
		if (h.toString().substr(-1) == '%') h = parseInt(parseInt(h, 10) * wsz[3] / 100, 10);
		
		if (options.align == 'center') left = parseInt((wsz[2] - w) / 2, 10);
		else if (options.align == 'right') left = wsz[2] - w;
		else left = 0;
		
		if (options.valign == 'center') top = parseInt((wsz[3] - h) / 2, 10);
		else if (options.valign == 'bottom') top = wsz[3] - h;
		else top = 0;
		
		var opt = 'status=0,scrollbars=1,toolbar=0,width='+w+',height='+h+',left='+left+',top='+top;
		
		var w = window.open(url, 'popupWindow', opt);
		w.focus();
	}
	
	$.preloadImages = function(){
		var imagesToLoad = [];
		for (var i=0; i < arguments.length; i++){
			imagesToLoad.push(arguments[i]);
		}
		$(document).ready(function(){
			var html = '';
			for (var i = 0; i < imagesToLoad.length; i++){
				html += '<div id="preloaded-image-'+i+'" style="background: url('+imagesToLoad[i]+') no-repeat -9999px -9999px; height: 0; border: 0; margin: 0; padding: 0"></div>';
				html += "\n";
			}
			$('body:first').append(html);
		});
	}

})(jQuery);

