var ussearch = {
	place:"searchOnForum",
	logTopUserSearcher: null,
	setPlace: function(){
		ussearch.place = $("#searchDirection").val();
		$.cookie("placeSearch", ussearch.place, { expires: 31, path: '/'});
		switch(ussearch.place){
			case "searchOnForum":{
				$("#searchWord").val($("#searchWordUser").val());
				$("#searchWordUser").hide();
				$("#searchWord").show();
				$("#searchWord").focus();
			}break;
			case "searchOnUsers":{
				$("#searchWordUser").val($("#searchWord").val());
				$("#searchWord").hide();				
				$("#searchWordUser").show();
				$("#searchWordUser").focus();
			}break;
		}
	},
	search: function(obj){
		switch(ussearch.place){
			case "searchOnForum":{
				var query = $("#searchWord").val();
				window.location = "/forum/search/?query=" + query;
			}break;
			case "searchOnUsers":{
				ussearch.result(obj);
			}break;
		}
	},
	pressKey: function(event,obj){
		if(event.keyCode == 13){
			ussearch.search(obj);
		}
	},
	setContent: function(){
		$("#hiddenCell").addClass("chiddenCell");
		$("#hiddenCell").css("height","45px");
		$("#hiddenCell").text("Страница результатов поиска");
	},
	parseSearchSelect: function(){
		var val = $.cookie("placeSearch");
		 if(val!=null){
			 ussearch.place = val;
		 }else{
			 ussearch.place = "searchOnForum";
		 }
		 if($("#searchDirection").length > 0 ){
			 $("#searchDirection").val(ussearch.place);
		 }
	},
	result: function(obj){
		obj.doSearchNow();
	}
};
$.extend({
	    parseJSON: function( data ) {
	        if ( typeof data !== "string" || !data ) {
	            return null;
	        }    
	        data = jQuery.trim( data );    
	        if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
	            .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
	            .replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {    
	            return window.JSON && window.JSON.parse ?
	                window.JSON.parse( data ) :
	                (new Function("return " + data))();    
	        } else {
	            jQuery.error( "Invalid JSON: " + data );
	        }
	    }
	});
	
	function MyGruzTransTable () {
	    this.displayas = 0;
	    this.contact = 0;
	    this.defContactFilter = "";
	    this.contact = $('#selectedContact').val();
		
	}
	MyGruzTransTable.prototype.undeleteItems = function(items){
		$('.gtWaitOtherActImg').show();
		$.post('/log/mygruztrans/light/gtactions.jsp?method=undelete&items='+items, function(data) {
			myGruzTrans.reloadCallback(function(){
				myGruzTrans.changeDisplayAs();
				$('.gtWaitOtherActImg').hide();
			});
		});
	};
	
	MyGruzTransTable.prototype.deleteItems = function(){
	
		var sList = "";
		$('input[type=checkbox][name^="trans."],input[type=checkbox][name^="gruz."]').each(function () {
		    if(this.checked){
		    	sList += this.name+",";
		    }
		});
		if(sList.length > 1){
			if(confirm('Вы подтверждаете удаление?')){
				$('.gtWaitOtherActImg').show();
				$.post('/log/mygruztrans/light/gtactions.jsp?method=delete&items='+sList, function(data) {
					var result = $.parseJSON(data);
					myGruzTrans.reloadCallback(function(){
						$('#delres').show();
						$('#delres').html(result.message);
						myGruzTrans.changeDisplayAs();
						$('.gtWaitOtherActImg').hide();
					});
					
					
				});
			}
		}
	};
	MyGruzTransTable.prototype.repeatItems = function(){
		
		var sList = "";
		$('input[type=checkbox][name^="trans."],input[type=checkbox][name^="gruz."]').each(function () {
		    if(this.checked){
		    	sList += this.name+",";
		    }
		});
		if(sList.length > 1){
			$('.gtWaitOtherActImg').show();
			$.post('/log/mygruztrans/light/gtactions.jsp?method=repeat&items='+sList, function(data) {
				myGruzTrans.reload();
				$('.gtWaitOtherActImg').hide();
			});
		}
	};
	MyGruzTransTable.prototype.changeDisplayAs = function() {
		this.displayas = $('#selectedDisplayAs').val();
		
		$.cookie('mygruztrans_displayas',this.displayas);
		if(this.displayas == 1){
			$('#idGruzTable').show();
			$('#gruzContainer').show();
			$('#transContainer').hide();
			
			$('#idTransTable input[type=checkbox]').each(function () {
				$(this).removeAttr("checked");
			});
			
		}
		if(this.displayas == 2){
			$('#idTransTable').show();
			$('#gruzContainer').hide();
			$('#transContainer').show();
			$('#idGruzTable input[type=checkbox]').each(function () {
				$(this).removeAttr("checked");
			});
			
		}
		if(this.displayas == 0){
			$('#idTransTable').show();
			$('#idGruzTable').show();
			$('#gruzContainer').show();
			$('#transContainer').show();
		}
	    $.post('/log/mygruztrans/light/ajax.jsp?displayAs='+this.displayas, function(data) {
		    var result = $.parseJSON(data);
		    $('#selectedContact').remove();
		    $('#contact').html(result.filter);
		});
	};
	MyGruzTransTable.prototype.changeContact = function() {
		$('#idGruzTable input[type=checkbox],#idTransTable input[type=checkbox]').each(function () {
			$(this).removeAttr("checked");
		});
		
		this.contact = $('#selectedContact').val();
		$.cookie('mygruztrans_contact',this.contact);
		
		var value = this.contact;
		$('#idTransTable .sort-tbody tr').each(function() {
			var cid = $(this).attr("contactid");

			if (value == -1) {
				$(this).show();
			} else {
				if (cid != value) {
					$(this).hide();
				} else {
					$(this).show();
				}
			}

		});
		$('#idGruzTable .sort-tbody tr').each(function() {
			var cid = $(this).attr("contactid");
			if (value == -1) {
				$(this).show();
			} else {
				if (cid != value) {
					$(this).hide();
				} else {
					$(this).show();
				}
			}
		});
		
	};
	MyGruzTransTable.prototype.reloadGruz = function(contactid) {
		$.post('/log/mygruztrans/light/ajax.jsp?method=getgruz', function(data) {
			var result = $.parseJSON(data);
			$('#gruztd').html(result.gruztable);
			new TableSorter("#idGruzTable")
			.sort()
			.fromCookie()
			.inspect("country,date,trans,from,to,gruz,stavka,contacts,time");
		});
	};
	MyGruzTransTable.prototype.reloadTrans = function(contactid) {
		$.post('/log/mygruztrans/light/ajax.jsp?method=gettrans', function(data) {
			var result = $.parseJSON(data);
			$('#transtd').html(result.transtable);
			new TableSorter("#idTransTable")
			.sort()
			.fromCookie()
			.inspect("country,date,trans,from,to,info_am,stavka,contacts,time");
		});
	};
	MyGruzTransTable.prototype.reloadCallback = function(callback) {

		$.post('/log/mygruztrans/light/ajax.jsp?method=getgruzandtrans', function(data) {
			var result = $.parseJSON(data);
			$('#transtd').html(result.transtable);
			$('#gruztd').html(result.gruztable);
			var value = $.cookie('mygruztrans_contact');
			if(value != null){
				$('#idTransTable .sort-tbody tr').each(function() {
					var cid = $(this).attr("contactid");
					
					if (value == -1) {
						$(this).show();
					} else {
						if (cid != value) {
							$(this).hide();
						} else {
							$(this).show();
						}
					}
		
				});
				$('#idGruzTable .sort-tbody tr').each(function() {
					var cid = $(this).attr("contactid");
					if (value == -1) {
						$(this).show();
					} else {
						if (cid != value) {
							$(this).hide();
						} else {
							$(this).show();
						}
					}
				});
			}
			new TableSorter("#idGruzTable")
			.sort()
			.fromCookie()
			.inspect("country,date,trans,from,to,gruz,stavka,contacts,time");
			
			new TableSorter("#idTransTable")
			.sort()
			.fromCookie()
			.inspect("country,date,trans,from,to,info_am,stavka,contacts,time");
			if(callback != null){
				callback();
			}
			
		});
	};
	MyGruzTransTable.prototype.reload = function() {

			$.post('/log/mygruztrans/light/ajax.jsp?method=getgruzandtrans', function(data) {
				var result = $.parseJSON(data);
				$('#transtd').html(result.transtable);
				$('#gruztd').html(result.gruztable);
				var value = $.cookie('mygruztrans_contact');
				if(value != null){
					$('#idTransTable .sort-tbody tr').each(function() {
						var cid = $(this).attr("contactid");
						
						if (value == -1) {
							$(this).show();
						} else {
							if (cid != value) {
								$(this).hide();
							} else {
								$(this).show();
							}
						}
			
					});
					$('#idGruzTable .sort-tbody tr').each(function() {
						var cid = $(this).attr("contactid");
						if (value == -1) {
							$(this).show();
						} else {
							if (cid != value) {
								$(this).hide();
							} else {
								$(this).show();
							}
						}
					});
				}
				new TableSorter("#idGruzTable")
				.sort()
				.fromCookie()
				.inspect("country,date,trans,from,to,gruz,stavka,contacts,time");
				
				new TableSorter("#idTransTable")
				.sort()
				.fromCookie()
				.inspect("country,date,trans,from,to,info_am,stavka,contacts,time");
				
			});
	};
	MyGruzTransTable.prototype.hideIfNot = function(contactid) {
		
		var value = contactid;
		if($('#selectedContact').val() == null){
			value = null;
		}
		if(value != null){
			$('#idTransTable .sort-tbody tr').each(function() {
				var cid = $(this).attr("contactid");
				
				if (value == -1) {
					$(this).show();
				} else {
					if (cid != value) {
						$(this).hide();
					} else {
						$(this).show();
					}
				}
	
			});
			$('#idGruzTable .sort-tbody tr').each(function() {
				var cid = $(this).attr("contactid");
				if (value == -1) {
					$(this).show();
				} else {
					if (cid != value) {
						$(this).hide();
					} else {
						$(this).show();
					}
				}
			});
		}
	};
	MyGruzTransTable.prototype.redraw = function() {
		$.post('/log/mygruztrans/light/ajax.jsp', function(data) {
			var result = $.parseJSON(data);
			
			$('#filter').html(result.filter);
			/*$('#idTransTable .sort-tbody').remove();
			$('#idGruzTable .sort-tbody').remove();
			
			$('#idTransTable').append(result.trans_body);
			$('#idGruzTable').append(result.gruz_body);
			*/
			
		});
	};/*
 * author: Andy
 */
function sortTypeToIntValue(sortType) {
	if(sortType == "sort-state-up"){
		return 1;
	}
	if(sortType == "sort-state-down"){
		return 2;
	}
	return 0;
};
function sortByToIntValue(sortby) {
	if(sortby == "country"){
		return 1;
	}
	if(sortby == "date"){
		return 2;
	}
	if(sortby == "trans"){
		return 3;
	}
	if(sortby == "from"){
		return 4;
	}
	if(sortby == "to"){
		return 5;
	}
	if(sortby == "gruz"){
		return 6;
	}
	if(sortby == "info_am"){
		return 6;
	}
	if(sortby == "stavka"){
		return 7;
	}
	if(sortby == "contacts"){
		return 8;
	}
	if(sortby == "time"){
		return 9;
	}
	return 0;
};
function TableSorter (criteria) {
    this.theCriteria = criteria;
    this.upIndicator = '<span class="sortindicator"><img src="/tpl/jsp/images/sort_up.png"/></span>';
    this.downIndicator = '<span class="sortindicator"><img src="/tpl/jsp/images/sort_down.png"/></span>';
}

TableSorter.prototype.arrows = function(up,down) {
	this.upIndicator = '<span class="sortindicator"><img src="'+up+'"/></span>';
    this.downIndicator = '<span class="sortindicator"><img src="'+down+'"/></span>';
	return this;
};

TableSorter.prototype.mode = function(column,mode) {
	if( mode == "sort-state-down" )
	{
		$(this.theCriteria).find(column).click();
		$(this.theCriteria).find(column).click();
	}
	if(mode == "sort-state-up")
	{
		$(this.theCriteria).find(column).click();
	}
	return this;
};
TableSorter.prototype.disable = function() {
	$.cookie(this.theCriteria+'_cookie',"");
	 $.cookie(this.theCriteria.replace('#','')+".sortby", "");
	  $.cookie(this.theCriteria.replace('#','')+".sorttype","");
	  
	return this;
};
TableSorter.prototype.fromCookie = function() {
	var value = $.cookie(this.theCriteria+'_cookie');
	if( value != null)
	{
		var state = value.split(",");
		this.mode('#'+state[0], state[1]);
	}
	return this;
};

TableSorter.prototype.inspect = function(elements) {
	var temp = elements.split(',');
	
	for (var i=0;i<temp.length;i++){
		$(this.theCriteria).find('#'+temp[i]).bind('click',{msg: temp[i],parent: this.theCriteria}, function(event) {
			  var sortState = "sort-state-up";
			  if( $(this.theCriteria).find('#'+event.data.msg).hasClass('sort-state-down') )
			  {
				  sortState = "sort-state-down";
			  }
			  var sortType = sortTypeToIntValue(sortState);
			  var sortBy = sortByToIntValue(event.data.msg);
			  var cookName = event.data.parent;
			  
			  $.cookie(cookName.replace('#','')+".sortby", sortBy,{expires: 7});
			  $.cookie(cookName.replace('#','')+".sorttype",sortType,{expires: 7});
			  $.cookie(event.data.parent+"_cookie", event.data.msg+','+sortState,{expires: 7});
		});
	}
	return this;
};
TableSorter.prototype.sort = function() {
	var theSortUpIndicator = $(this.upIndicator);
	var theSortDnIndicator = $(this.downIndicator);
 	var theInitializer = function(_,inTable){
		inTable = $(inTable);
		var theTBody = inTable.find( 'tbody.sort-body' )[0] || inTable.find( 'tbody' )[0];
		var theSortableTypes = 'text number date'.split(' ');
		inTable.find( 'thead th' ).each(function(inColumnIndex,inTH){
			inTH = $(inTH);
			
			
			
			var theSortType = $.grep( theSortableTypes, function(inType){ return inTH.is('.sort-'+inType) } )[0];
			if (!theSortType) return;

			inTH.originalText = inTH.html();
			var theSortDescendingByDefaultFlag = inTH.is('.sort-descending');
			
			inTH.addClass( 'sortable' );
			inTH.css( { cursor:'pointer'} );
			inTH.click(function(){
				
				var theSortDescendingFlag = inTH.is('.sorted') ? inTH.sortNextDownFlag : theSortDescendingByDefaultFlag;

				
				var theRowsToSort=[],theRowsCount=0;
				var theLastSortable;
				var theRowNodes = theTBody.getElementsByTagName( 'tr' );
				for (var i=0,len=theRowNodes.length;i<len;i++){
					var theRow = theRowNodes[ i ];
					if (theLastSortable && $(theRow).is('.sort-withprevious')){
						if (!theLastSortable.childRows) theLastSortable.childRows = [];
						theLastSortable.childRows[ theLastSortable.childRows.length ] = theRow;
					} else {
						theRowsToSort[ theRowsCount++ ] = theRow;
						theLastSortable = theRow;
					}
				}

				
				theRowsToSort.sort(function(inRowA,inRowB){
					var theRows   = [ inRowA, inRowB ];
					var theValues = [ null,   null   ];
					for ( var i=0; i<=1; ++i ){
						var theRow = theRows[i];
						if (!theRow.sortValueCache) theRow.sortValueCache = [];
						theValues[i] = theRow.sortValueCache[ inColumnIndex ];
						if (theValues[i] == null){
							var theTD = $(theRow).find( '> *:eq('+inColumnIndex+')' );
							theValues[i] = theTD.attr('sortvalue') || theTD.text();
						
							switch(theSortType){
								case 'number': theValues[i] = theValues[i] * 1;           break;
								case 'text'  : theValues[i] = theValues[i].toLowerCase(); break;
								case 'date'  : theValues[i] = new Date( theValues[i] );   break;
							}
							theRow.sortValueCache[ inColumnIndex ] = theValues[i];
						}
					}
					var theResult = theValues[0] < theValues[1] ? -1 : theValues[0] > theValues[1] ? 1 : 0;
					if ( theSortDescendingFlag ) theResult *= -1;
					return theResult;
				});

			
				var theOldTBody = theTBody;
				theTBody = theTBody.cloneNode(false);
				theOldTBody.parentNode.replaceChild( theTBody, theOldTBody );
				for (var i=0;i<theRowsCount;++i){
					var theRow=theRowsToSort[i];
					theTBody.appendChild(theRow);
					if (theRow.childRows){
						for (var j=0,len=theRow.childRows.length;j<len;++j ){
							theTBody.appendChild(theRow.childRows[j]);
						}
					}
				}

			
				var theLastSortedHead = inTable.sortedHead;
				if (theLastSortedHead){
					theLastSortedHead.html(theLastSortedHead.originalText);
					theLastSortedHead.removeClass('sorted');
					delete theLastSortedHead.sortNextDownFlag;
				}
				
				
				inTH.remove('.sortindicator');
				inTH.find('.sortindicator').html(theSortDescendingFlag ? theSortDnIndicator : theSortUpIndicator);
				if(theSortDescendingFlag)
				{
					inTH.removeClass("sort-state-up");
					inTH.addClass("sort-state-down");
				}else{
					inTH.removeClass("sort-state-down");
					inTH.addClass("sort-state-up");
				}
				
				inTH.addClass('sorted');
				inTable.sortedHead = inTH;
				inTH.sortNextDownFlag = !theSortDescendingFlag;
			});
			if (inTH.is('.sort-default')) inTH.click();
		});
	};
	$(this.theCriteria).each( theInitializer );
	$(document).bind('DOMNodeInserted',function(inEvent){
		$(inEvent.target).find(this.theCriteria).andSelf().filter(this.theCriteria).each(theInitializer);
	});
	return this;
};/*
 * author: andy 25.07.11
 * How to:
 
	$(document).ready(function() {
		new Ajax().loadPage("showeditform/", null, "#editForm");
	});

	<div id="editForm_loadError"></div> <!-- this container for errors-->
	<div id="editForm"></div> <!-- this container for page content-->
	
 */
function Ajax (){
	
	this.loadScript = function(link) { //load and execute javascript
		$.getScript(link);
    };
	
	this.loadPage = function(link,params,container) { //without page fragment
		this.loadPage(link,params,container,null);
    };
    
    this.loadPage = function(link,params,container,pageFragment) { //with page fragment
    	var requestLink = link;
    	if(pageFragment != null){
    		requestLink = link + " "+pageFragment;
    	}

		$(container+"_loadError").css('display','none');
		
		$(container).load(requestLink,params, 
			  function(response, status, xhr) {
				if (status == "error") {
					var msg = "Извините, но произошла ошибка: ";
					$(container+"_loadError").attr('class','t uiInformationRed');
					$(container+"_loadError").css('color','#6A6A6A');
					$(container+"_loadError").css('padding-bottom','10px');
					$(container+"_loadError").show();
					$(container+"_loadError").html(msg + xhr.status + " " + xhr.statusText);
				} else {
					$(container).show();
					$(container).html(response);
			}
		});
    };
    
    this.toString = function () {
    	 
    };
    
    return this;
}


	
SmilesBox = (function($) {
	var smilesDir = '/tpl/jsp/images/smiles/';
	var smiles = [
		{
			name: ':)', 
			fileName: '20_smile.gif'
		},
		{
			name: 'B)', 
			fileName: '19_cool.gif'
		},
		{
			name: ':D', 
			fileName: '18_biggrin.gif'
		},
		{
			name: ':o', 
			fileName: '17_ohmy.gif'
		},
		{
			name: ';)', 
			fileName: '16_wink.gif'
		},
		{
			name: ':huh:', 
			fileName: '15_huh.gif'
		},
		{
			name: ':lol:', 
			fileName: '14_laugh.gif'
		},
		{
			name: ':blink:', 
			fileName: '13_blink.gif'
		},
		{
			name: ':skull:', 
			fileName: '12_skull.gif'
		},
		{
			name: ':angry:', 
			fileName: '11_mad.gif'
		},
		{
			name: ':mellow:', 
			fileName: '10_mellow.gif'
		},
		{
			name: ':unsure:', 
			fileName: '9_unsure.gif'
		},
		{
			name: '<_<', 
			fileName: '8_dry.gif'
		},
		{
			name: ':rofl:', 
			fileName: 'rofl.gif'
		}, 
		{
			name: ':rtfm:', 
			fileName: 'rtfm.gif'
		}, 
		{
			name: ':stop:', 
			fileName: 'stop.gif'
		}, 
		{
			name: ':swoon:', 
			fileName: 'swoon.gif'
		}, 
		{
			name: ':victory:', 
			fileName: 'victory.gif'
		}, 
		{
			name: ':taunt:', 
			fileName: 'taunt.gif'
		}, 
		{
			name: ':telephone:', 
			fileName: 'telephone.gif'
		}, 
		{
			name: ':to_become_senile:', 
			fileName: 'to_become_senile.gif'
		}, 
		{
			name: ':pioneer:', 
			fileName: '7_pioneer.gif'
		},
		{
			name: ':triniti:', 
			fileName: '6_triniti.gif'
		},
		{
			name: ':rolleyes:', 
			fileName: '5_rolleyes.gif'
		},
		{
			name: ':tatice_06:', 
			fileName: '4_tatice_06.gif'
		},
		{
			name: ':training1:', 
			fileName: '3_training1.gif'
		},
		{
			name: ':WhiteVoid_1:', 
			fileName: '2_WhiteVoid_1.gif'
		},
		{
			name: ':new_russian:', 
			fileName: '1_new_russian.gif'
		}
	];
	var visibleCount = 13;
	var hideEnabled = true;
	return function (id, containerClass, callback, btnClass) {
		function onClick(e) {
			hideSmiles();
			if (callback instanceof Function) {
				var smileName = this.getAttribute('alt');
				callback(smileName);
			}
		};
		function hideSmiles() {
			if (hideEnabled) {
				$('#' + id).hide();
			}
			hideEnabled = true;
		};
		if ($('#' + id).size() > 0) {
			var btns = $('#' + id + ' img').unbind();
			if (callback instanceof Function) {
				btns.bind('click', onClick);
			}
		} else {
			var code = '<div id="' + id + '" class="' + containerClass + '">';
			var visible = '';
			var inVisible = '';
			var count = 0;
			for (var iSmile in smiles) {
				if (count < visibleCount) {
					visible += '<img src="' + smilesDir + smiles[iSmile].fileName + 
					'" alt="' + smiles[iSmile].name + '" class="' + btnClass + '" />';
				} else {
					inVisible += '<img src="' + smilesDir + smiles[iSmile].fileName + 
					'" alt="' + smiles[iSmile].name + '" class="' + btnClass + 
					'" style="display: none;" />';
				}
				count++;
			}
			code += visible + '<div id="btnShowAllSmiles">Показать все смайлики</div>' + 
				inVisible + '</div>';
			$('body').append(code).bind('click', function() {
				hideSmiles();
			});
			$('#' + id + ' img').bind('click', onClick);
			$('#btnShowAllSmiles').bind('click', function() {
				hideEnabled = false;
				$('#' + id + ' img').show();
				$('#btnShowAllSmiles').hide();
			});
		}
		this.show = function(position) {
			var cont = $('#' + id);
			if (position != null) {
				if (position.left != null) {
					cont.css('left',  position.left);
				}
				if (position.top != null) {
					cont.css('top', position.top);
				}
			}
			cont.show();
		};
	};
})(jQuery);

(function($) {
     $.fn.editor = function(options) {
         return applyEditor(this, options);
     };

	var _editors_count = 0;
	
	var editor_buttons = false;
	
	function applyEditor(em, options){
		var tg = em.val();
		var taClass = em.attr('class');
		if (!taClass) {
			taClass = 'edit_ta';
		}
		var editors_count = _editors_count;
		var tmpEditor = new Editor(editors_count);
		em.replaceWith(
				'<div class=editor id=editor'+editors_count+'>' 
				+ '<table cellspacing=0 cellpadding=0 border=0 class=bb_table><tr>'
				+ getButtonCode('b', 'Выделить жирным')
				+ getButtonCode('i', 'Выделить курсивом')
				+ getButtonCode('s', 'Перечеркнуть')
				+ getButtonCode('u', 'Подчеркнуть')
				+ getButtonCode('j', 'Выровнять по ширине')
				+ getButtonCode('m', 'Выровнять по центру')
				+ getButtonCode('l', 'Выровнять по левому краю')
				+ getButtonCode('r', 'Выровнять по правому краю')
				+ getButtonCode('quote', 'Вставить цитату')
				+ getButtonCode('ul', 'Вставить элемент списка')
				+ getButtonCode('col', 'Выделить цветом', 'colorSelector' + editors_count)
				+ getButtonCode('img', 'Вставить картинку')
				+ getButtonCode('a', 'Вставить ссылку')
				+ (((options!=null) && (options.video=='true')) ? (
					getButtonCode('video', 'Вставить видео')
					) : ('')) 
				+ (((options!=null) && (options.smiles=='true')) ? (
					getButtonCode('smile', 'Вставить смайлик', 'smileButton' + editors_count)
					) : ('')) 
				+ (((options!=null) && (options.cut=='true')) ? (
					getButtonCode('cut', 'Вставить конец предпросмотра')
					) : ('')) 
				+ '<td width=100% align=right style="text-align:right;padding-right:0px;">' 
				+ ((editor_buttons)?(
					'<input type="button" value="Предпросмотр" id="preview_button'+editors_count+'">' 
					+ '<input type="button" value="Ответить" id="send_button'+editors_count+'">' 
					+ '<input type="button" style="margin-left:50px;" value="Отмена" id="cancel_button' 
						+ editors_count+'">')
				:('')) + '</td></tr></table>' 
				+ '<textarea name="edit_ta'+editors_count+'" class="' + taClass + 
				'" id="edit_ta' + editors_count+'">' + tg+'</textarea></div>');
		
		$('.bb_button').bind('click', function() {
			var btnNum = this.getAttribute('tagName');
			if (btnNum != null) {
				tmpEditor.addBbCode(btnNum);
			}
			return false;
		});
		var smilesBox = new SmilesBox('smilesContainer' + editors_count, 'smilesContainer', 
			function(smileName) {
				if (smileName != null) {
					tmpEditor.selectedSmile = smileName;
					tmpEditor.addBbCode('smile');
				}
			}, 'smileButtons');
		$('#smileButton' + editors_count).bind('click', function() {
			var position = $('#smileButton' + editors_count).offset();
			position.top = position.top - 6;
			smilesBox.show(position);
			return false;
		});
		$('#colorSelector' + editors_count).colorPicker(function(color) {
			tmpEditor.selectedColor = color;
			tmpEditor.addBbCode('col');
		}, {
			containerClass: 'colorPickerContainer', 
			colorBtnClass: 'colorPickerSetColBtn', 
			viewValueClass: 'colorPickerValView'
		});
		return _editors_count++;
	};
	

	
	function getButtonCode(tagName, title, id, container, container2) {
		var btnClass = '';
		btnClass += 'post_' + tagName;
		if (id == null) {
			id = '';
			if (btnClass.length > 0) {
				btnClass += ' ';
			}
			btnClass += 'bb_button ';
			tagName = 'tagName="' + tagName + '"';
		} else {
			id = ' id="' + id + '"';
			tagName = '';
		}
		if (container == null) {
			container = '';
		}
		if (container2 == null) {
			container2 = '';
		}
		return '<td>' + container + '<div' + id + ' class="' + btnClass + 
			'" title="' + title + '"' + tagName + '>' + container2 + '</div></td>';
	};	
	
	function Editor(editorNum) {
		
		var obj = this;		
		var bbTags = {
			l: {
				mode: 0, 
				name: 'l'
			}, 
			r: {
				mode: 0, 
				name: 'r'
			}, 
			j: {
				mode: 0, 
				name: 'j'
				}, 
			quote: {
				mode: 0, 
				name: 'quote'
			}, 
			m: {
				mode: 0, 
				name: 'm'
			}, 
			col: {
				mode: 0, 
				name: 'col', 
				action: function(s) {
					var col = obj.selectedColor;
					if (col !== null && col != '') {
						s = "[col rgb='" + col + "']"+s+"[/col]";
					}
					return s;
				}
			}, 
			ul: {
				mode: 0, 
				name: 'ul', 
				action: function(s) {								
					if ((s!="")&&(s!=null)) {
						return "[ul]\n[li]"+s+"[/li]\n[/ul]";
					} else {
						var x = "";
						var y = "1";
						while ((y!="")&&(y!=null)){
							y = prompt("Введите элемент списка или пустую строку для завершения:","");
							if ((y!="")&&(y!=null)) x+="[li]"+y+"[/li]\n";
						}			
						if (x!=""){
							x="[ul]\n"+x;
							x+="[/ul]";
						}
						return x;
					}								
				}
			}, 
			img: {
				mode: 0, 
				name: 'img', 
				action: function(s) {
					var t = prompt("Укажите адрес картинки:","http://"); 
					if (t!=null) {
						return "[img"+((s!="")?(" name='"+s+"'"):"")+"]"+t+"[/img]"; 
					} else  {
						return "";
					}
				}
			}, 
			a: {
				mode: 0, 
				name: 'a', 
				action: function(s) {var u=''; 
		           if (u=='')  {
		        	   u = prompt("Укажите текст ссылки:","http://"); 
		           }
		           if ((u=='')||(u==null)) {
		        	   return "";
		           }
		           var t=s;
		           if ((t=='')||(t==null)) {
		        	   t = prompt("Укажите название ссылки:","");
		           }
		           if ((s!='')&&((t=='')||(t==null))) {
		        	   return "";
		           }
		           if ((u!='')&&(u!=null)) {
			           return (((t!="")&&(t!=null))
				           ?"[a="+u+"]"+t+"[/a]"
				           :"[a]"+u+"[/a]");
		           } else {
		        	   return "";
		           }
	            }
			}, 
			u: {
				mode: 0, 
				name: 'u'
			}, 
			b: {
				mode: 0, 
				name: 'b'
			}, 
			i: {
				mode: 0, 
				name: 'i'
			}, 
			s: {
				mode: 0, 
				name: 's'
			}, 
			video: {
				mode: 0, 
				name: 'video', 
				action: function(s) {
	            	var t = prompt("Укажите адрес видео:","http://" + s); 
	            	if (t != null) {
	            		s = s + "[video]" + t + "[/video]"; 
	            	} 
	            	return s;
				}
			}, 
			smile: {
				mode: 0, 
				action: function(s) {
	            	if (obj.selectedSmile != null) {
	            		s = s + obj.selectedSmile; 
	            	}
	            	return s;
				}
			}, 
			cut: {
				name: 'cut',  
				action: function(s) {
					if (obj.getEditorText().indexOf('[cut]') != -1) {
						alert("Невозможно добавить еще один тег конца предпросмотра!");
						return "";
					}
					return '[cut]' + s;
				}
			}
		};	
	
		this.addBbCode = function(tagName){		
			var item = document.getElementById("edit_ta" + editorNum);
			var textParts = getTextParts(item);
			var res = textParts.beforeSelection + getBbValue(bbTags[tagName], textParts.selection);
			var cursorPos = res.length;
			res += textParts.afterSelection;
			setEditorText(item, res, cursorPos);
		};
		
		this.getEditorText = function() {
			return document.getElementById("edit_ta" + editorNum).value;
		};
		
		function getTextParts(item) {
			var val = item.value;
			var ss;
			var se;
			if (document.selection) {	
				ss = item.value.length;
				se = item.value.length;
			} else {
				ss = item.selectionStart;
				se = item.selectionEnd;
			}
			var beforeSelection;
			if (ss > 0) {
				beforeSelection = val.substring(0, ss);
			} else {
				beforeSelection = '';
			}
			var selection;
			if (se - ss > 0) {
				selection = val.substring(ss, se);
			} else {
				selection = '';
			}
			var afterSelection;
			if (se < val.length) {
				afterSelection = val.substring(se,val.length);
			} else {
				afterSelection = '';
			}
			return {
				beforeSelection: beforeSelection, 
				selection: selection, 
				afterSelection: afterSelection
			};
		}
	
		function getBbValue(tagItem, selText) {
			if (tagItem.action instanceof Function) {
				var s = tagItem.action(selText);
				return (s != '') ? s : selText;
			} else {
				if (tagItem.isSolidTag) {
					return "[" + tagItem.name + "]" + selText;
				} else {
					var res = "";
					if (selText == '') {
						res = "[";
						if (tagItem.mode > 0) {
							res += "/";
						}
						res += tagItem.name + "]";
						tagItem.mode = (tagItem.mode + 1) % 2;
					} else {
						res+="["+tagItem.name+"]";
						res+=selText;
						res+="[/"+tagItem.name+"]";
						tagItem.mode=0;
					}
					return res;
				}
			}
		}	
		
		function setEditorText(item, text, cursorPos) {
			if (item.value != text){
				item.value = text;
			}
			if (!cursorPos) {
				cursorPos = text.length;
			}
			item.selectionStart = cursorPos;
			item.selectionEnd = cursorPos;
			item.focus();
		}
	};

})(jQuery);


/**
 * @author redlaber
 */
function doForumComplaint(messageID) {
	var c_text=prompt("Введите суть жалобы","Нарушение правил форума");
	if (c_text!=null && c_text!="") {
		$.getJSON(
				'/dinamix/forum_complaints',
				{method: "add_complaint", message_id: messageID, text: c_text},
				function(j) {
					if (j['status']!='ok'){
						alert(j['status']);
					} else {
						alert("Жалоба принята");
					}
				}
		);
	}
}
/**
 * 
 * функции для получения ссылок временные файлы
 * @returns
 */

	
	var getMediaFileDirUrl = function() {
		return getSubdomainUrl("media") + "/upload";
	};
	
	var getTmpFileDirUrl = function(uid) {
		return getMediaFileDirUrl() + "/" + uid + "/temp";
	};
	
	var getTmpAvatarFileUrl = function(uid, tmpFileName) {
		return getMediaFileDirUrl() + "/" + uid + "/preview/avatar/"+ tmpFileName;
	};

/**
 * Функции для работы с логотипом
 */
var uid = 0;
function deleteLogo(){
	window.close();
	return false;
}
function cancel(){
	window.close();
}
function tryRefreshLogo(){
	if (window.opener != null) {
		if (typeof window.opener.refreshPageChangeLogo == 'function') 
		{
			window.opener.refreshPageChangeLogo();
		}
		window.close();
	} else {
		window.location.reload(true); 
	}
}



function deletLogo(){
	if (confirm("Вы уверены, что хотите удалить логотип?")) {
		$.ajaxSetup ({ cache: false});
		$.getJSON(
				getSubdomainUrl("upload") + "/ajax/del_logo.json?callback=?",
				function(data) {
					if(data.status == "ok"){
						tryRefreshLogo();
						
					}
					else
						alert(data.errorMsg);
				});
	}
}
function saveLogo(){
	if($("#lardiFileUploaderFileName0").val() == ""){
		alert("Загрузите новый логотип для его сохранения.");
		return;
	}
	$.ajaxSetup ({ cache: false});
	$.getJSON(
			getSubdomainUrl("upload") + "/ajax/set_logo.json?fileName="+$("#lardiFileUploaderFileName0").val()+"&callback=?",
			function(data) {
				if(data.status == "ok"){
					$("#lardiFileUploaderFileName0").val("");
					tryRefreshLogo();
				}
				else
					alert(data.errorMsg);
			});
}

function deletLogoNotModal(){
	if (confirm("Вы уверены, что хотите удалить логотип?")) {
		$.ajaxSetup ({ cache: false});
		$.getJSON(
				getSubdomainUrl("upload") + "/ajax/del_logo.json?callback=?",
				function(data) {
					if(data.status == "ok"){
						window.location.reload(true);
						
					}
					else
						alert(data.errorMsg);
				});
	}
}
function saveLogoNotModal(){
	if($("#lardiFileUploaderFileName0").val() == ""){
		alert("Загрузите новый логотип для его сохранения.");
		return;
	}
	$.ajaxSetup ({ cache: false});
	$.getJSON(
			getSubdomainUrl("upload") + "/ajax/set_logo.json?fileName="+$("#lardiFileUploaderFileName0").val()+"&callback=?",
			function(data) {
				if(data.status == "ok"){
					$("#lardiFileUploaderFileName0").val("");
					window.location.reload(true);
				}
				else
					alert(data.errorMsg);
			});
}

function uploadEndFun(id,fileName){
	$("#logoImage").attr("src", getMediaFileDirUrl() + "/" + uid + "/preview/logo/"+ fileName);
}
function initUpload(userUid){
	uid = userUid;
	$("#updLogo").fileuploader({
			uploadCountLimit:"1",
			fileAccept:"image/jpg,image/jpeg,image/png,image/gif",
			uploadEndFun:uploadEndFun
		});
}


AvatarManager = (function(){
	var acceptFileTypesLine = "image/jpg,image/jpeg,image/png,image/gif";
	var ajaxServerUrl = "/log/fileserver/updateavatar/ajax";
	var uploaderId;
	var avatarImgId;
	var waitPageImgId;
	var waitPageFogId;
	var cancelBtnId;
	var saveBtnId;
	var deleteBtnId;
	var ajaxManager;
	var loadedFileName = null;
	var uid;
	var contId;
	var prevWidth = 100;
	var prevHeight = 100;
	
	var parseOptions = function(options) {
		uploaderId = options.uploaderId;
		avatarImgId = options.avatarImgId;
		waitPageImgId = options.waitPageImgId;
		waitPageFogId = options.waitPageFogId;
		cancelBtnId = options.cancelBtnId;
		saveBtnId = options.saveBtnId;
		deleteBtnId = options.deleteBtnId;
		uid = options.uid;
		contId = options.contId;
	};
	
	var getTmpFileUrlLoc = function(tmpFileName) {
		return getTmpAvatarFileUrl(uid, tmpFileName);
	};
	
	var cancel = function() {
		window.close();
	};
	
	var saveAvatar = function() {
		if(loadedFileName == null) {
			alert("Загрузите новый аватар для его сохранения.");
			return;
		}
		ajaxManager.doOperation("save", {tmpFileName: loadedFileName, contact_id: contId}, 
			function(data) {
				$("#" + deleteBtnId).attr("disabled", null);
				var previewUrl = (data.previewUrl)?data.previewUrl:'';
				tryRefreshPage(previewUrl);
			}, null, '#' + avatarImgId);
	};
	
	var removeAvatar = function() {
		if (confirm("Вы уверены, что хотите удалить аватар?")) {
			ajaxManager.doOperation("remove", {contact_id: contId}, 
				function(data) {
					$("#" + deleteBtnId).attr("disabled", "disabled");
					var previewUrl = (data.previewUrl)?data.previewUrl:'';
					tryRefreshPage(previewUrl);
				}, null, '#' + avatarImgId);
		}
	};
	
	var previewResize = function() {
		var currImg = $(this);
		currImg.css({width: null, height: null});
		var imgw = currImg.width();
		var imgh = currImg.height();
		var sx = prevWidth / imgw;
		var sy = prevHeight / imgh;
		var s = (sx > sy) ? sy : sx;
		currImg.width(imgw * s);
		currImg.height(imgh * s);
	};

	var tryRefreshPage = function(previewUrl){
		if (window.opener != null) {
			if (typeof window.opener.refreshPageChangeAvatar == 'function') 
			{
				window.opener.refreshPageChangeAvatar();
			}
			window.close();
		} else {
			window.location.reload(true); 
		}
	};
	
	var init = function(options) {
		parseOptions(options);
		var waitVisualizer = new WaitVisualizer(waitPageImgId, waitPageFogId);
		ajaxManager = new AjaxManager(ajaxServerUrl, waitVisualizer);
		$('#' + uploaderId).fileuploader({
			uploadCountLimit: 1,
			fileAccept: acceptFileTypesLine,
			uploadEndFun: function(id,fileName) {
				$("#" + saveBtnId).attr("disabled", null);
				loadedFileName = fileName;
				//$('#' + avatarImgId).attr("src", getMediaFileDirUrl() + "/" + uid + "/preview/logo/"+ fileName);
				$('#' + avatarImgId).attr("src", getTmpFileUrlLoc(fileName));
			}
		});
		$("#" + cancelBtnId).click(cancel);
		$("#" + saveBtnId).click(saveAvatar);
		$("#" + deleteBtnId).click(removeAvatar);
		$("#" + avatarImgId).bind('load', previewResize);
	};
	
	return {
		init: init
	};
}());/*
Lardi file uploader v1.0.1
Release Date: 15.12.2010
Copyright (c) 2010 
*/
var lardiFileUploaderIframeCounter = 1,lardiFileUploaderCurFileCount=0;
function getMainDiv(document){
	var mainDivId = "#"+$("#lardiFileUploaderMainDiv",document).val();
	return $(mainDivId,document);
}
var lardiUploadEndFun=undefined;
function startProcessStats(processId) {
	window.setTimeout("chekProcessStatus(" + processId +")",300);
}
function chekProcessStatus(processId){
	$.ajaxSetup ({ cache: false});
	$.getJSON(
			getSubdomainUrl("upload") + "/ajax/upload_status.json?callback=?",
			{"id":processId},
			function(data) {
				if(data.start == "true"){
					$("#lardiFileuploaderFnameSpan"+processId).html(data.uploadFileName);
					$("#lardiFileuploaderStopTd"+processId).show();
				}
				if(data.uploadStatus == "translateError"){
					$("#lardiFileuploaderFnameSpan"+processId).html(data.errorMsg);
					$("#lardiFileuploaderFnameSpan"+processId).css("color","red");
					$("#lardiFileuploaderStopTd"+processId).hide();
					$("#progress-bar-container"+processId).hide();
					return;
				}
				if(data.uploadStatus == "stoped")
					return;
				if(data.uploadStatus == "done"){
					$("#progress-bar-container"+processId).hide();
					var doneUpload = parseInt($("#lardiFileUploaderDoneUploadFileCount").val());
					$("#lardiFileUploaderDoneUploadFileCount").val(doneUpload+1);
					
					//"<input type='hidden' id='lardiFileUploaderFileName'"+i+" name='lardiFileUploaderFileName'"+i+" value=''>"
					for(var i = 0; i < $("#lardiFileUploaderUploadLimit").val();i++)
						if($("#lardiFileUploaderFileName"+i).val()==""){
							$("#lardiFileUploaderFileName"+i).val($("#lardiFileuploaderFnameSpan"+processId).html());
							break;
						}
					
					//$("#lardiFileuploaderFname"+ifId).val(data.uploadFileName);
					$("#lardiFileuploaderStopTd"+processId).html("<span class='fakeurl' style='margin-right:8px;' onclick=\"return deleteUpload('"+processId+"')\">Удалить</span>");
					//вызов функции по ссылке (загрузка успешно окончена)
					if(lardiUploadEndFun!=undefined)
						lardiUploadEndFun(processId,data.uploadFileName);
					return;
				}
				uploadProgress(processId);
				window.setTimeout("chekProcessStatus(" + processId +")", 1000);
			}
		);
}
function uploadProgress(processId) {
	$.ajaxSetup ({ cache: false});
	$.getJSON(
			getSubdomainUrl("upload") + "/ajax/upload_process.json?callback=?",
			{"id":processId},
			function(data) {
				var totSize = data.totalSize;
				if(data.totalSize==0)
					return;
				$("#progress-bar"+processId).css("width",(100*data.uploadSize/data.totalSize)+"%");
				//$("#progress-bar"+ifId).html(Math.floor(data.uploadSize/1024)+"-"+Math.floor(data.totalSize/1024));
			}
		);
}
function clearFileName(clearName){
	for(var i = 0; i < $("#lardiFileUploaderUploadLimit").val();i++)
		if($("#lardiFileUploaderFileName"+i).val()==clearName){
			$("#lardiFileUploaderFileName"+i).val("");
			break;
		}
}
function deleteUpload(id){
	$.ajaxSetup ({ cache: false});
	$.getJSON(
			getSubdomainUrl("upload") + "/ajax/del_file.json?callback=?",
			{"fileName":$("#lardiFileuploaderFnameSpan"+id).html()},
			function(data) {
				if(data.status != "ok"){
					alert("Ошибка удаления : " + data.message);
					return;
				}
				if(data.isdelete == "true"){
					lardiFileUploaderCurFileCount--;
					var mainUploadDiv = window.parent.getMainDiv(window.document);
					mainUploadDiv.addIframeDelOrStop();
					$("#lardiFileuploaderFname"+id).val("");
					$("#lardiFileuploaderStopTd"+id).html("");
					clearFileName($("#lardiFileuploaderFnameSpan"+id).html());
					$("#lardiFileuploaderFnameSpan"+id).html($("#lardiFileuploaderFnameSpan"+id).html()+" - удалён");
					$("#lardiFileuploaderFnameSpan"+id).css("color","red");
					
					return;
				}
				if(data.isdelete == "false")
					alert("Ошибка удаления...");
			});
}
function stopUpload(id){
	$.ajaxSetup ({ cache: false});
	$.getJSON(
			getSubdomainUrl("upload") + "/ajax/stop_upload.json?callback=?",
			{"id":id},
			function(data) {
				if(data.status != "ok")
					alert("Ошибка остановки:" + data.message);
				else{
					clearFileName($("#lardiFileuploaderFnameSpan"+id).html());
					$("#lardiFileuploaderFnameSpan"+id).html($("#lardiFileuploaderFnameSpan"+id).html()+" - передача прервана");
					$("#lardiFileuploaderFnameSpan"+id).css("color","red");
					$("#lardiFileuploaderStopTd"+id).hide();
					$("#progress-bar-container"+id).hide();
					lardiFileUploaderCurFileCount--;
					var mainUploadDiv = window.parent.getMainDiv(window.document);
					mainUploadDiv.addIframeDelOrStop();
				}
					//$("#errors").html();
			}
		);
	return false;
}
//Счетчик iframe
if(jQuery)(
	function(jQuery){
		jQuery.extend(jQuery.fn,{
			fileuploader:function(options) {
				jQuery(this).each(function(){
					var settings = jQuery.extend({
						id              : jQuery(this).attr('id'), // The ID of the object being Uploadified
						uploadCountLimit: jQuery(this).attr('uploadCountLimit'),
						fileAccept		: jQuery(this).attr('fileAccept'),
//						script          : 'uploadify.php', // The path to the uploadify backend upload script
//						cancelImg       : 'cancel.png', // The path to the cancel image for the default file queue item container
//						fileDataName    : 'Filedata', // The name of the file collection object in the backend upload script
//						simUploadLimit  : 1, // The number of simultaneous uploads allowed
//						removeCompleted : true, // Set to true if you want the queue items to be removed when a file is done uploading
						onInit          : function() {}, // Function to run when uploadify is initialized
						onSelect        : function() {}, // Function to run when a file is selected
						uploadEndFun: jQuery(this).attr('uploadEndFun')
					}, options);
					jQuery(this).css("background-color","#F3F3F3");
					jQuery(this).css("padding","8px");
					jQuery(this).data('settings',settings);
					if(jQuery(this).attr("id")==undefined){
						alert("Ошибка Lardi file uploader. Укажите ID для fileuploader!");
						return;
					}
					var maxUploadCountLimit = 20;
					if(settings.uploadCountLimit <= 0 ||settings.uploadCountLimit>maxUploadCountLimit){
						alert("Ошибка Lardi file uploader. Укажите свойство uploadCountLimit(макс. кол-во файлов) больше 0 и меньше "+maxUploadCountLimit+"!");
						return;
					}
					//var fileAccept="image/gif, image/jpeg, image/jpg, image/png";
					var fileAccept;
					if(settings.fileAccept!=undefined)
						fileAccept=settings.fileAccept;
					else
						fileAccept="none";
					var htmlRes = "";
					//Див с именами
					htmlRes += "<div style='display: none;' id='lardiFileUploaderUploadFiles'>";
					for(var i = 0; i < settings.uploadCountLimit; i++)
						htmlRes += "<input type='hidden' id='lardiFileUploaderFileName"+i+"' name='lardiFileUploaderFileName"+i+"' value=''>";
					htmlRes += "</div>";
					//Имя главного div 
					htmlRes += "<input type='hidden' id='lardiFileUploaderMainDiv' name='lardiFileUploaderMainDiv' value='"+jQuery(this).attr("id")+"'>";
					//Тип файлов, получается внутри iframe в момент готовности документа
					htmlRes += "<input type='hidden' id='lardiFileUploaderFileType' name='lardiFileUploaderFileType' value='"+fileAccept+"'>";
					//Количество успешно закаченных файлов
					htmlRes += "<input type='hidden' id='lardiFileUploaderDoneUploadFileCount' name='lardiFileUploaderDoneUploadFileCount' value='0'>";
					// Лимит загрузок
					htmlRes += "<input type='hidden' id='lardiFileUploaderUploadLimit' name='lardiFileUploaderUploadLimit' value='"+settings.uploadCountLimit+"'>";
					//Таблица статистики закачки
					htmlRes += "<div id='lardiFileUploaderUploadProcess' style='text-align:left;'></div>";
					htmlRes += "<div id='lardiFileUploaderButton'><iframe id='lardiFileUploaderIframe1' name='lardiFileUploaderIframe1' height='25' width='120' frameborder='0' style='overflow:hidden;'></iframe></div>";
					jQuery(this).html(htmlRes);
					$("#lardiFileUploaderIframe1").attr("src","/tpl/startUpload.html");
					lardiUploadEndFun = settings.uploadEndFun;
				});
			},
			startUpload:function(processId) {
				lardiFileUploaderCurFileCount++;
				jQuery(this).addIframe();
				jQuery(this).addProcessTr(processId);
				/*if(curFileCount == jQuery(this).data.uploadCountLimit)
					alert("Limit = " + jQuery(this).data.uploadCountLimit);*/
				return;
			},addProcessTr:function(procassId) {
				// = jQuery(this).find("#lardiFileUploaderUploadProcess").html();
				var htmlRes = "<div id=\"uploadStatusLine" + procassId + "\" style='align:left;'><table><tbody>";
				htmlRes += "<td><img id='lardiFileuploaderImg"+procassId+"' style='margin-right:8px;' alt='Загр.' src='/tpl/jsp/images/add-foto.png'></td><td style='text-align:left;'><span id='lardiFileuploaderFnameSpan"+procassId+"' style='margin-right:8px;' class='t'>подготовка к загрузке...</span></td>";
				htmlRes += "<td><div id='progress-bar-container"+procassId+"' class='lardiFileUplProgBar1'><div class='lardiFileUplProgBar2'><div class='lardiFileUplProgBar3' id='progress-bar"+procassId+"'></div></div></div></td><td style='display: none;' id='lardiFileuploaderStopTd"+procassId+"'><span class='fakeurl' style='margin-right:8px;' onclick=\"return stopUpload('"+procassId+"')\">Отмена</span></td>";
				htmlRes += "</tbody></table></div>";
				jQuery(this).find("#lardiFileUploaderUploadProcess").append(htmlRes);
				startProcessStats(procassId);
				return;
			},addIframe:function(){
				jQuery(this).find("#lardiFileUploaderIframe"+lardiFileUploaderIframeCounter).hide();
				if(lardiFileUploaderCurFileCount >= jQuery(this).find("#lardiFileUploaderUploadLimit").val())
					return;
				lardiFileUploaderIframeCounter++;
				var iframeHtml = "<iframe id='lardiFileUploaderIframe"+lardiFileUploaderIframeCounter+"' name='lardiFileUploaderIframe"+lardiFileUploaderIframeCounter+"' height='25' width='120' frameborder='0'></iframe>";
				jQuery(this).find("#lardiFileUploaderButton").append(iframeHtml);
				$("#lardiFileUploaderIframe"+lardiFileUploaderIframeCounter).attr("src","/tpl/startUpload.html");
				return;
			},addIframeDelOrStop:function(){
				if(jQuery(this).find("#lardiFileUploaderIframe"+lardiFileUploaderIframeCounter).css("display")=="none")
					jQuery(this).addIframe();
				return;
			}
		});
		})(jQuery);
			

////////  lihonosov   Подсветка
///////////////////////////////////////////////////////////////////////////////////////

jQuery.fn.highlight = function(hStyle,pat) {
	function innerHighlight(node, pat) {
		var skip = 0;
		if (node.nodeType == 3) {
			var pos = node.data.toUpperCase().indexOf(pat);
			if (pos >= 0) {
				var spannode = document.createElement('span');
				spannode.className = hStyle;
				var middlebit = node.splitText(pos);
				var endbit = middlebit.splitText(pat.length);
				var middleclone = middlebit.cloneNode(true);
				spannode.appendChild(middleclone);
				middlebit.parentNode.replaceChild(spannode, middlebit);
				skip = 1;
			}
		}
		else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
			for (var i = 0; i < node.childNodes.length; ++i) {
				i += innerHighlight(node.childNodes[i], pat);
			}
		}
		return skip;
	}
	return this.each(function() {
		innerHighlight(this, pat.toUpperCase());
	});
};

jQuery.fn.removeHighlight = function(hStyle) {
	return this.find("span."+hStyle).each(function() {
		this.parentNode.firstChild.nodeName;
		with (this.parentNode) {
			replaceChild(this.firstChild, this);
			normalize();
		}
	}).end();
};


/**
 * @author valera
 * компонент выбора цвера, интергированный в jQuery
 */

(function($){
	$.fn.colorPicker = function(callBack, options){  
		return this.each(function(index, value) { 
			var colorPicker = new ColorPicker(callBack, options);
			$(value).bind('click', function(event) {
				colorPicker.showPicker($(this).offset());
				event.stopPropagation();
			});
		}); 
	};
	$.colorPickerSetup = function(options) {
		if (options != null) {
			if (options.colors !=  null) {
				_colors = options.colors;
			} 
			if (options.containerClass !=  null) {
				_containerClass = options.containerClass;
			} 
			if (options.colorBtnClass !=  null) {
				_colorBtnClass = options.colorBtnClass;
			} 
			if (options.viewValueClass !=  null) {
				_viewValueClass = options.viewValueClass;
			}
		}
	};
	  
	$.getUniqueId = function() {
		var defName = 'srvcObj';
		var tmp = Math.floor(Math.random() * 1000000);
		var id = defName + tmp;
		while (document.getElementById(id) != null) {
			tmp = Math.random();
			id = defName + tmp;
		}
		return id;
	};
	
	var rgbConvert = function(str) {
		/*if (str.match(/#[\da-f]+/)) {
			return str;
		} */
		if (str.indexOf('rgb(') != -1) {
			str = str.replace(/rgb\(|\)/g, "").split(",");
			str[0] = parseInt(str[0], 10).toString(16).toLowerCase();
			str[1] = parseInt(str[1], 10).toString(16).toLowerCase();
			str[2] = parseInt(str[2], 10).toString(16).toLowerCase();
			str[0] = (str[0].length == 1) ? '0' + str[0] : str[0];
			str[1] = (str[1].length == 1) ? '0' + str[1] : str[1];
			str[2] = (str[2].length == 1) ? '0' + str[2] : str[2];
			return ('#' + str.join(""));
		}
		return str;
	};
	  
	var _colors = [];
	var _containerClass;
	var _colorBtnClass;
	var _viewValueClass;
	
	var ColorPicker = function(callBack, options) {

		var _pickerId;
		
		var hideColorPicker = function() {
			$('#' + _pickerId).hide();
		};
		
		this.showPicker = function(position) {
			if (position && position.left !== null && position.top !== null) {
				$('#' + _pickerId).css(position).show();
			}
		};
		  
		_pickerId = $.getUniqueId();
		var containerClass = '';
		if (options != null && options.containerClass != null) {
			containerClass = ' class="' + options.containerClass + '"';
		} else if (_containerClass != null && _containerClass != '') {
			containerClass = ' class="' + _containerClass + '"';
		} if (options != null && options.viewValueClass != null) {
			viewValueClass = ' class="' + options.viewValueClass + '"';
		} else if (_containerClass != null && _containerClass != '') {
			viewValueClass = ' class="' + _viewValueClass + '"';
		}
		var colors = _colors;
		if (options != null && options.colors instanceof Array) {
			colors = options.colors;
		}
		var colorBtnClass = '';
		if (options != null && options.colorBtnClass != null 
			&& options.colorBtnClass != '') 
		{
			colorBtnClass = options.colorBtnClass;
		} else if (_colorBtnClass != null && _colorBtnClass != '') {
			colorBtnClass = _colorBtnClass;
		} else {
			colorBtnClass = 'colorPickerSelColBtn';
		}
		var code = '<div id="' + _pickerId + '"' + containerClass + 
			' style="diplay: none; position: absolute;">';
		for (iCol in colors) {
			code += '<div style="background-color: #' + colors[iCol] + 
				'" class="' + colorBtnClass + '"></div>';
		}
		code += '<div id="' + _pickerId + '_value"' + viewValueClass + 
			'></div></div>';
		$('body').append(code).bind('click', hideColorPicker);
		$('.' + colorBtnClass).bind('click', function(e) {
			hideColorPicker();
			if (callBack instanceof Function) {
				callBack(rgbConvert($(this).css('background-color')));
			}
		}).bind('mouseover', function() {
			var val = rgbConvert($(this).css('background-color'));
			$('#' + _pickerId + '_value').text(val);
		}).bind('mouseout', function() {
			$('#' + _pickerId + '_value').text('');
		});
	};
	
	$.colorPickerSetup({colors: [
		'000000', '993300','333300', '000080', '333399', '333333', '800000', 
		'FF6600', '808000', '008000', '008080', '0000FF', '666699', '808080', 
		'FF0000', 'FF9900', '99CC00', '339966', '33CCCC', '3366FF', '800080', 
		'999999', 'FF00FF', 'FFCC00', 'FFFF00', '00FF00', '00FFFF', '00CCFF', 
		'993366', 'C0C0C0', 'FF99CC', 'FFCC99', 'FFFF99' , 'CCFFFF', '99CCFF', 
		'FFFFFF']});
	  
})(jQuery);

/*
(function($){
	$.fn.smilePicker = function(callBack, options){  
		return this.each(function(index, value) { 
			var colorPicker = new ColorPicker(callBack, options);
			$(value).bind('click', function(event) {
				colorPicker.showPicker($(this).offset());
				event.stopPropagation();
			});
		}); 
	};
	
})(jQuery);*/

/*jslint browser: true */ /*global jQuery: true */

/**
 * jQuery Cookie plugin
 *
 * Copyright (c) 2010 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */

// TODO JsDoc

/**
 * Create a cookie with the given key and value and other optional parameters.
 *
 * @example $.cookie('the_cookie', 'the_value');
 * @desc Set the value of a cookie.
 * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
 * @desc Create a cookie with all available options.
 * @example $.cookie('the_cookie', 'the_value');
 * @desc Create a session cookie.
 * @example $.cookie('the_cookie', null);
 * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
 *       used when the cookie was set.
 *
 * @param String key The key of the cookie.
 * @param String value The value of the cookie.
 * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
 * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
 *                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
 *                             If set to null or omitted, the cookie will be a session cookie and will not be retained
 *                             when the the browser exits.
 * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
 * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
 * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
 *                        require a secure protocol (like HTTPS).
 * @type undefined
 *
 * @name $.cookie
 * @cat Plugins/Cookie
 * @author Klaus Hartl/klaus.hartl@stilbuero.de
 */

/**
 * Get the value of a cookie with the given key.
 *
 * @example $.cookie('the_cookie');
 * @desc Get the value of a cookie.
 *
 * @param String key The key of the cookie.
 * @return The value of the cookie.
 * @type String
 *
 * @name $.cookie
 * @cat Plugins/Cookie
 * @author Klaus Hartl/klaus.hartl@stilbuero.de
 */
jQuery.cookie = function (key, value, options) {

    // key and value given, set cookie...
    if (arguments.length > 1 && (value === null || typeof value !== "object")) {
        options = jQuery.extend({}, options);

        if (value === null) {
            options.expires = -1;
        }

        if (typeof options.expires === 'number') {
            var days = options.expires, t = options.expires = new Date();
            t.setDate(t.getDate() + days);
        }

        return (document.cookie = [
            encodeURIComponent(key), '=',
            options.raw ? String(value) : encodeURIComponent(String(value)),
            options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
            options.path ? '; path=' + options.path : '',
            options.domain ? '; domain=' + options.domain : '',
            options.secure ? '; secure' : ''
        ].join(''));
    }

    // key and possibly options given, get cookie...
    options = value || {};
    var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
    return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
};


/*
 * SimpleModal 1.3.5 - jQuery Plugin
 * http://www.ericmmartin.com/projects/simplemodal/
 * Copyright (c) 2010 Eric Martin (http://twitter.com/EricMMartin)
 * Dual licensed under the MIT and GPL licenses
 * Revision: $Id: jquery.simplemodal.js 245 2010-03-25 20:41:15Z emartin24 $
 */

/**
 * SimpleModal is a lightweight jQuery plugin that provides a simple
 * interface to create a modal dialog.
 *
 * The goal of SimpleModal is to provide developers with a cross-browser 
 * overlay and container that will be populated with data provided to
 * SimpleModal.
 *
 * There are two ways to call SimpleModal:
 * 1) As a chained function on a jQuery object, like $('#myDiv').modal();.
 * This call would place the DOM object, #myDiv, inside a modal dialog.
 * Chaining requires a jQuery object. An optional options object can be
 * passed as a parameter.
 *
 * @example $('<div>my data</div>').modal({options});
 * @example $('#myDiv').modal({options});
 * @example jQueryObject.modal({options});
 *
 * 2) As a stand-alone function, like $.modal(data). The data parameter
 * is required and an optional options object can be passed as a second
 * parameter. This method provides more flexibility in the types of data 
 * that are allowed. The data could be a DOM object, a jQuery object, HTML
 * or a string.
 * 
 * @example $.modal('<div>my data</div>', {options});
 * @example $.modal('my data', {options});
 * @example $.modal($('#myDiv'), {options});
 * @example $.modal(jQueryObject, {options});
 * @example $.modal(document.getElementById('myDiv'), {options}); 
 * 
 * A SimpleModal call can contain multiple elements, but only one modal 
 * dialog can be created at a time. Which means that all of the matched
 * elements will be displayed within the modal container.
 * 
 * SimpleModal internally sets the CSS needed to display the modal dialog
 * properly in all browsers, yet provides the developer with the flexibility
 * to easily control the look and feel. The styling for SimpleModal can be 
 * done through external stylesheets, or through SimpleModal, using the
 * overlayCss and/or containerCss options.
 *
 * SimpleModal has been tested in the following browsers:
 * - IE 6, 7, 8
 * - Firefox 2, 3
 * - Opera 9, 10
 * - Safari 3, 4
 * - Chrome 1, 2, 3, 4
 *
 * @name SimpleModal
 * @type jQuery
 * @requires jQuery v1.2.2
 * @cat Plugins/Windows and Overlays
 * @author Eric Martin (http://ericmmartin.com)
 * @version 1.3.5
 */
;(function ($) {
	var ie6 = $.browser.msie && parseInt($.browser.version) == 6 && typeof window['XMLHttpRequest'] != "object",
		ieQuirks = null,
		w = [];

	/*
	 * Stand-alone function to create a modal dialog.
	 * 
	 * @param {string, object} data A string, jQuery object or DOM object
	 * @param {object} [options] An optional object containing options overrides
	 */
	$.modal = function (data, options) {
		return $.modal.impl.init(data, options);
	};

	/*
	 * Stand-alone close function to close the modal dialog
	 */
	$.modal.close = function () {
		$.modal.impl.close();
	};

	/*
	 * Chained function to create a modal dialog.
	 * 
	 * @param {object} [options] An optional object containing options overrides
	 */
	$.fn.modal = function (options) {
		return $.modal.impl.init(this, options);
	};

	/*
	 * SimpleModal default options
	 * 
	 * appendTo:		(String:'body') The jQuery selector to append the elements to. For ASP.NET, use 'form'.
	 * focus:			(Boolean:true) Forces focus to remain on the modal dialog
	 * opacity:			(Number:50) The opacity value for the overlay div, from 0 - 100
	 * overlayId:		(String:'simplemodal-overlay') The DOM element id for the overlay div
	 * overlayCss:		(Object:{}) The CSS styling for the overlay div
	 * containerId:		(String:'simplemodal-container') The DOM element id for the container div
	 * containerCss:	(Object:{}) The CSS styling for the container div
	 * dataId:			(String:'simplemodal-data') The DOM element id for the data div
	 * dataCss:			(Object:{}) The CSS styling for the data div
	 * minHeight:		(Number:null) The minimum height for the container
	 * minWidth:		(Number:null) The minimum width for the container
	 * maxHeight:		(Number:null) The maximum height for the container. If not specified, the window height is used.
	 * maxWidth:		(Number:null) The maximum width for the container. If not specified, the window width is used.
	 * autoResize:		(Boolean:false) Resize container on window resize? Use with caution - this may have undesirable side-effects.
	 * autoPosition:	(Boolean:true) Automatically position container on creation and window resize?
	 * zIndex:			(Number: 1000) Starting z-index value
	 * close:			(Boolean:true) If true, closeHTML, escClose and overClose will be used if set.
	 							If false, none of them will be used.
	 * closeHTML:		(String:'<a class="modalCloseImg" title="Close"></a>') The HTML for the 
							default close link. SimpleModal will automatically add the closeClass to this element.
	 * closeClass:		(String:'simplemodal-close') The CSS class used to bind to the close event
	 * escClose:		(Boolean:true) Allow Esc keypress to close the dialog? 
	 * overlayClose:	(Boolean:false) Allow click on overlay to close the dialog?
	 * position:		(Array:null) Position of container [top, left]. Can be number of pixels or percentage
	 * persist:			(Boolean:false) Persist the data across modal calls? Only used for existing
								DOM elements. If true, the data will be maintained across modal calls, if false,
								the data will be reverted to its original state.
	 * modal:			(Boolean:true) If false, the overlay, iframe, and certain events will be disabled
								allowing the user to interace with the page below the dialog
	 * onOpen:			(Function:null) The callback function used in place of SimpleModal's open
	 * onShow:			(Function:null) The callback function used after the modal dialog has opened
	 * onClose:			(Function:null) The callback function used in place of SimpleModal's close
	 */
	$.modal.defaults = {
		appendTo: 'body',
		focus: true,
		opacity: 50,
		overlayId: 'simplemodal-overlay',
		overlayCss: {},
		containerId: 'simplemodal-container',
		containerCss: {},
		dataId: 'simplemodal-data',
		dataCss: {},
		minHeight: null,
		minWidth: null,
		maxHeight: null,
		maxWidth: null,
		autoResize: false,
		autoPosition: true,
		zIndex: 1000,
		close: true,
		closeHTML: '<a class="modalCloseImg" title="Close"></a>',
		closeClass: 'simplemodal-close',
		escClose: true,
		overlayClose: false,
		position: null,
		persist: false,
		modal: true,
		onOpen: null,
		onShow: null,
		onClose: null
	};

	/*
	 * Main modal object
	 */
	$.modal.impl = {
		/*
		 * Modal dialog options
		 */
		o: null,
		/*
		 * Contains the modal dialog elements and is the object passed 
		 * back to the callback (onOpen, onShow, onClose) functions
		 */
		d: {},
		/*
		 * Initialize the modal dialog
		 */
		init: function (data, options) {
			var s = this;

			// don't allow multiple calls
			if (s.d.data) {
				return false;
			}

			// $.boxModel is undefined if checked earlier
			ieQuirks = $.browser.msie && !$.boxModel;

			// merge defaults and user options
			s.o = $.extend({}, $.modal.defaults, options);

			// keep track of z-index
			s.zIndex = s.o.zIndex;

			// set the onClose callback flag
			s.occb = false;

			// determine how to handle the data based on its type
			if (typeof data == 'object') {
				// convert DOM object to a jQuery object
				data = data instanceof jQuery ? data : $(data);
				s.d.placeholder = false;

				// if the object came from the DOM, keep track of its parent
				if (data.parent().parent().size() > 0) {
					data.before($('<span></span>')
						.attr('id', 'simplemodal-placeholder')
						.css({display: 'none'}));

					s.d.placeholder = true;
					s.display = data.css('display');

					// persist changes? if not, make a clone of the element
					if (!s.o.persist) {
						s.d.orig = data.clone(true);
					}
				}
			}
			else if (typeof data == 'string' || typeof data == 'number') {
				// just insert the data as innerHTML
				data = $('<div></div>').html(data);
			}
			else {
				// unsupported data type!
				alert('SimpleModal Error: Unsupported data type: ' + typeof data);
				return s;
			}

			// create the modal overlay, container and, if necessary, iframe
			s.create(data);
			data = null;

			// display the modal dialog
			s.open();

			// useful for adding events/manipulating data in the modal dialog
			if ($.isFunction(s.o.onShow)) {
				s.o.onShow.apply(s, [s.d]);
			}

			// don't break the chain =)
			return s;
		},
		/*
		 * Create and add the modal overlay and container to the page
		 */
		create: function (data) {
			var s = this;

			// get the window properties
			w = s.getDimensions();

			// add an iframe to prevent select options from bleeding through
			if (s.o.modal && ie6) {
				s.d.iframe = $('<iframe src="javascript:false;"></iframe>')
					.css($.extend(s.o.iframeCss, {
						display: 'none',
						opacity: 0, 
						position: 'fixed',
						height: w[0],
						width: w[1],
						zIndex: s.o.zIndex,
						top: 0,
						left: 0
					}))
					.appendTo(s.o.appendTo);
			}

			// create the overlay
			s.d.overlay = $('<div></div>')
				.attr('id', s.o.overlayId)
				.addClass('simplemodal-overlay')
				.css($.extend(s.o.overlayCss, {
					display: 'none',
					opacity: s.o.opacity / 100,
					height: s.o.modal ? w[0] : 0,
					width: s.o.modal ? w[1] : 0,
					position: 'fixed',
					left: 0,
					top: 0,
					zIndex: s.o.zIndex + 1
				}))
				.appendTo(s.o.appendTo);
		
			// create the container
			s.d.container = $('<div></div>')
				.attr('id', s.o.containerId)
				.addClass('simplemodal-container')
				.css($.extend(s.o.containerCss, {
					display: 'none',
					position: 'fixed', 
					zIndex: s.o.zIndex + 2
				}))
				.append(s.o.close && s.o.closeHTML
					? $(s.o.closeHTML).addClass(s.o.closeClass)
					: '')
				.appendTo(s.o.appendTo);
				
			s.d.wrap = $('<div></div>')
				.attr('tabIndex', -1)
				.addClass('simplemodal-wrap')
				.css({height: '100%', outline: 0, width: '100%'})
				.appendTo(s.d.container);
				
			// add styling and attributes to the data
			// append to body to get correct dimensions, then move to wrap
			s.d.data = data
				.attr('id', data.attr('id') || s.o.dataId)
				.addClass('simplemodal-data')
				.css($.extend(s.o.dataCss, {
						display: 'none'
				}))
				.appendTo('body');
			data = null;

			s.setContainerDimensions();
			s.d.data.appendTo(s.d.wrap);

			// fix issues with IE
			if (ie6 || ieQuirks) {
				s.fixIE();
			}
		},
		/*
		 * Bind events
		 */
		bindEvents: function () {
			var s = this;

			// bind the close event to any element with the closeClass class
			$('.' + s.o.closeClass).bind('click.simplemodal', function (e) {
				e.preventDefault();
				s.close();
			});
			
			// bind the overlay click to the close function, if enabled
			if (s.o.modal && s.o.close && s.o.overlayClose) {
				s.d.overlay.bind('click.simplemodal', function (e) {
					e.preventDefault();
					s.close();
				});
			}
	
			// bind keydown events
			$(document).bind('keydown.simplemodal', function (e) {
				if (s.o.modal && s.o.focus && e.keyCode == 9) { // TAB
					s.watchTab(e);
				}
				else if ((s.o.close && s.o.escClose) && e.keyCode == 27) { // ESC
					e.preventDefault();
					s.close();
				}
			});

			// update window size
			$(window).bind('resize.simplemodal', function () {
				// redetermine the window width/height
				w = s.getDimensions();

				// reposition the dialog
				s.setContainerDimensions(true);
	
				if (ie6 || ieQuirks) {
					s.fixIE();
				}
				else if (s.o.modal) {
					// update the iframe & overlay
					s.d.iframe && s.d.iframe.css({height: w[0], width: w[1]});
					s.d.overlay.css({height: w[0], width: w[1]});
				}
			});
		},
		/*
		 * Unbind events
		 */
		unbindEvents: function () {
			$('.' + this.o.closeClass).unbind('click.simplemodal');
			$(document).unbind('keydown.simplemodal');
			$(window).unbind('resize.simplemodal');
			this.d.overlay.unbind('click.simplemodal');
		},
		/*
		 * Fix issues in IE6 and IE7 in quirks mode
		 */
		fixIE: function () {
			var s = this, p = s.o.position;

			// simulate fixed position - adapted from BlockUI
			$.each([s.d.iframe || null, !s.o.modal ? null : s.d.overlay, s.d.container], function (i, el) {
				if (el) {
					var bch = 'document.body.clientHeight', bcw = 'document.body.clientWidth',
						bsh = 'document.body.scrollHeight', bsl = 'document.body.scrollLeft',
						bst = 'document.body.scrollTop', bsw = 'document.body.scrollWidth',
						ch = 'document.documentElement.clientHeight', cw = 'document.documentElement.clientWidth',
						sl = 'document.documentElement.scrollLeft', st = 'document.documentElement.scrollTop',
						s = el[0].style;

					s.position = 'absolute';
					if (i < 2) {
						s.removeExpression('height');
						s.removeExpression('width');
						s.setExpression('height','' + bsh + ' > ' + bch + ' ? ' + bsh + ' : ' + bch + ' + "px"');
						s.setExpression('width','' + bsw + ' > ' + bcw + ' ? ' + bsw + ' : ' + bcw + ' + "px"');
					}
					else {
						var te, le;
						if (p && p.constructor == Array) {
							var top = p[0] 
								? typeof p[0] == 'number' ? p[0].toString() : p[0].replace(/px/, '')
								: el.css('top').replace(/px/, '');
							te = top.indexOf('%') == -1 
								? top + ' + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"'
								: parseInt(top.replace(/%/, '')) + ' * ((' + ch + ' || ' + bch + ') / 100) + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"';

							if (p[1]) {
								var left = typeof p[1] == 'number' ? p[1].toString() : p[1].replace(/px/, '');
								le = left.indexOf('%') == -1 
									? left + ' + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"'
									: parseInt(left.replace(/%/, '')) + ' * ((' + cw + ' || ' + bcw + ') / 100) + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"';
							}
						}
						else {
							te = '(' + ch + ' || ' + bch + ') / 2 - (this.offsetHeight / 2) + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"';
							le = '(' + cw + ' || ' + bcw + ') / 2 - (this.offsetWidth / 2) + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"';
						}
						s.removeExpression('top');
						s.removeExpression('left');
						s.setExpression('top', te);
						s.setExpression('left', le);
					}
				}
			});
		},
		focus: function (pos) {
			var s = this, p = pos || 'first';

			// focus on dialog or the first visible/enabled input element
			var input = $(':input:enabled:visible:' + p, s.d.wrap);
			input.length > 0 ? input.focus() : s.d.wrap.focus();
		},
		getDimensions: function () {
			var el = $(window);

			// fix a jQuery/Opera bug with determining the window height
			var h = $.browser.opera && $.browser.version > '9.5' && $.fn.jquery <= '1.2.6' ? document.documentElement['clientHeight'] :
				$.browser.opera && $.browser.version < '9.5' && $.fn.jquery > '1.2.6' ? window.innerHeight :
				el.height();

			return [h, el.width()];
		},
		getVal: function (v) {
			return v == 'auto' ? 0 
				: v.indexOf('%') > 0 ? v 
					: parseInt(v.replace(/px/, ''));
		},
		setContainerDimensions: function (resize) {
			var s = this;

			if (!resize || (resize && s.o.autoResize)) {
				// get the dimensions for the container and data
				var ch = $.browser.opera ? s.d.container.height() : s.getVal(s.d.container.css('height')), 
					cw = $.browser.opera ? s.d.container.width() : s.getVal(s.d.container.css('width')),
					dh = s.d.data.outerHeight(true), dw = s.d.data.outerWidth(true);

				var mh = s.o.maxHeight && s.o.maxHeight < w[0] ? s.o.maxHeight : w[0],
					mw = s.o.maxWidth && s.o.maxWidth < w[1] ? s.o.maxWidth : w[1];

				// height
				if (!ch) {
					if (!dh) {ch = s.o.minHeight;}
					else {
						if (dh > mh) {ch = mh;}
						else if (dh < s.o.minHeight) {ch = s.o.minHeight;}
						else {ch = dh;}
					}
				}
				else {
					ch = ch > mh ? mh : ch;
				}

				// width
				if (!cw) {
					if (!dw) {cw = s.o.minWidth;}
					else {
						if (dw > mw) {cw = mw;}
						else if (dw < s.o.minWidth) {cw = s.o.minWidth;}
						else {cw = dw;}
					}
				}
				else {
					cw = cw > mw ? mw : cw;
				}

				s.d.container.css({height: ch, width: cw});
				if (dh > ch || dw > cw) {
					s.d.wrap.css({overflow:'auto'});
				}
			}
			
			if (s.o.autoPosition) {
				s.setPosition();
			}
		},
		setPosition: function () {
			var s = this, top, left,
				hc = (w[0]/2) - (s.d.container.outerHeight(true)/2),
				vc = (w[1]/2) - (s.d.container.outerWidth(true)/2);

			if (s.o.position && Object.prototype.toString.call(s.o.position) === "[object Array]") {
				top = s.o.position[0] || hc;
				left = s.o.position[1] || vc;
			} else {
				top = hc;
				left = vc;
			}
			s.d.container.css({left: left, top: top});
		},
		watchTab: function (e) {
			var s = this;

			if ($(e.target).parents('.simplemodal-container').length > 0) {
				// save the list of inputs
				s.inputs = $(':input:enabled:visible:first, :input:enabled:visible:last', s.d.data[0]);

				// if it's the first or last tabbable element, refocus
				if ((!e.shiftKey && e.target == s.inputs[s.inputs.length -1]) ||
						(e.shiftKey && e.target == s.inputs[0]) ||
						s.inputs.length == 0) {
					e.preventDefault();
					var pos = e.shiftKey ? 'last' : 'first';
					setTimeout(function () {s.focus(pos);}, 10);
				}
			}
			else {
				// might be necessary when custom onShow callback is used
				e.preventDefault();
				setTimeout(function () {s.focus();}, 10);
			}
		},
		/*
		 * Open the modal dialog elements
		 * - Note: If you use the onOpen callback, you must "show" the 
		 *	        overlay and container elements manually 
		 *         (the iframe will be handled by SimpleModal)
		 */
		open: function () {
			var s = this;
			// display the iframe
			s.d.iframe && s.d.iframe.show();

			if ($.isFunction(s.o.onOpen)) {
				// execute the onOpen callback 
				s.o.onOpen.apply(s, [s.d]);
			}
			else {
				// display the remaining elements
				s.d.overlay.show();
				s.d.container.show();
				s.d.data.show();
			}
			
			s.focus();

			// bind default events
			s.bindEvents();
		},
		/*
		 * Close the modal dialog
		 * - Note: If you use an onClose callback, you must remove the 
		 *         overlay, container and iframe elements manually
		 *
		 * @param {boolean} external Indicates whether the call to this
		 *     function was internal or external. If it was external, the
		 *     onClose callback will be ignored
		 */
		close: function () {
			var s = this;

			// prevent close when dialog does not exist
			if (!s.d.data) {
				return false;
			}

			// remove the default events
			s.unbindEvents();

			if ($.isFunction(s.o.onClose) && !s.occb) {
				// set the onClose callback flag
				s.occb = true;

				// execute the onClose callback
				s.o.onClose.apply(s, [s.d]);
			}
			else {
				// if the data came from the DOM, put it back
				if (s.d.placeholder) {
					var ph = $('#simplemodal-placeholder');
					// save changes to the data?
					if (s.o.persist) {
						// insert the (possibly) modified data back into the DOM
						ph.replaceWith(s.d.data.removeClass('simplemodal-data').css('display', s.display));
					}
					else {
						// remove the current and insert the original, 
						// unmodified data back into the DOM
						s.d.data.hide().remove();
						ph.replaceWith(s.d.orig);
					}
				}
				else {
					// otherwise, remove it
					s.d.data.hide().remove();
				}

				// remove the remaining elements
				s.d.container.hide().remove();
				s.d.overlay.hide().remove();
				s.d.iframe && s.d.iframe.hide().remove();

				// reset the dialog object
				s.d = {};
			}
		}
	};
})(jQuery);
/*
 * jQuery treeTable Plugin 2.3.0
 * http://ludo.cubicphuse.nl/jquery-plugins/treeTable/
 *
 * Copyright 2010, Ludo van den Boom
 * Dual licensed under the MIT or GPL Version 2 licenses.
 */
(function($) {
  // Helps to make options available to all functions
  // TODO: This gives problems when there are both expandable and non-expandable
  // trees on a page. The options shouldn't be global to all these instances!
  var options;
  var defaultPaddingLeft;
  
  $.fn.treeTable = function(opts) {
    options = $.extend({}, $.fn.treeTable.defaults, opts);
    
    return this.each(function() {
      $(this).addClass("treeTable").find("tbody tr").each(function() {
        // Initialize root nodes only if possible
        if(!options.expandable || $(this)[0].className.search(options.childPrefix) == -1) {
          // To optimize performance of indentation, I retrieve the padding-left
          // value of the first root node. This way I only have to call +css+ 
          // once.
          if (isNaN(defaultPaddingLeft)) {
            defaultPaddingLeft = parseInt($($(this).children("td")[options.treeColumn]).css('padding-left'), 10);
          }
          
          initialize($(this));
        } else if(options.initialState == "collapsed") {
          this.style.display = "none"; // Performance! $(this).hide() is slow...
        }
      });
    });
  };
  
  $.fn.treeTable.defaults = {
    childPrefix: "child-of-",
    clickableNodeNames: false,
    expandable: true,
    indent: 19,
    initialState: "collapsed",
    treeColumn: 0
  };
  
  // Recursively hide all node's children in a tree
  $.fn.collapse = function() {
    $(this).addClass("collapsed");
    
    childrenOf($(this)).each(function() {
      if(!$(this).hasClass("collapsed")) {
        $(this).collapse();
      }
      this.style.display = "none"; // Performance! $(this).hide() is slow...
    });
    if (options.afterCollapse instanceof Function) {
    	options.afterCollapse(this);
    }
    return this;
  };
  
	// Recursively show all node's children in a tree
	$.fn.expand = function() {
		$(this).removeClass("collapsed").addClass("expanded");		
		this.each(function(){
			childrenOf($(this)).each(function() {
				initialize($(this));				      
				if($(this).is(".expanded.parent")) {
					$(this).expand();
				}				  
				// this.style.display = "table-row"; // Unfortunately this is not possible with IE :-(
				$(this).show();
			});
		});	    
	    if (options.afterExpand instanceof Function) {
	    	options.afterExpand(this);
	    }
		return this;
	};

  // Reveal a node by expanding all ancestors
  $.fn.reveal = function() {
    $(ancestorsOf($(this)).reverse()).each(function() {
      initialize($(this));
      $(this).expand().show();
    });
    
    return this;
  };

  // Add an entire branch to +destination+
  $.fn.appendBranchTo = function(destination) {
    var node = $(this);
    var parent = parentOf(node);
    
    var ancestorNames = $.map(ancestorsOf($(destination)), function(a) { return a.id; });
    
    // Conditions:
    // 1: +node+ should not be inserted in a location in a branch if this would
    //    result in +node+ being an ancestor of itself.
    // 2: +node+ should not have a parent OR the destination should not be the
    //    same as +node+'s current parent (this last condition prevents +node+
    //    from being moved to the same location where it already is).
    // 3: +node+ should not be inserted as a child of +node+ itself.
    if($.inArray(node[0].id, ancestorNames) == -1 && (!parent || (destination.id != parent[0].id)) && destination.id != node[0].id) {
      indent(node, ancestorsOf(node).length * options.indent * -1); // Remove indentation
      
      if(parent) { node.removeClass(options.childPrefix + parent[0].id); }
      
      node.addClass(options.childPrefix + destination.id);
      move(node, destination); // Recursively move nodes to new location
      indent(node, ancestorsOf(node).length * options.indent);
    }
    
    return this;
  };
  
  // Add reverse() function from JS Arrays
  $.fn.reverse = function() {
    return this.pushStack(this.get().reverse(), arguments);
  };
  
  // Toggle an entire branch
  $.fn.toggleBranch = function() {
    if($(this).hasClass("collapsed")) {
      $(this).expand();
    } else {
      $(this).removeClass("expanded").collapse();
    }
    
    return this;
  };
  
  // === Private functions
  
  function ancestorsOf(node) {
    var ancestors = [];
    while(node = parentOf(node)) {
      ancestors[ancestors.length] = node[0];
    }
    return ancestors;
  };
  
  function childrenOf(node) {
    return $("table.treeTable tbody tr." + options.childPrefix + node[0].id);
  };
  
  function getPaddingLeft(node) {
    var paddingLeft = parseInt(node[0].style.paddingLeft, 10);
    return (isNaN(paddingLeft)) ? defaultPaddingLeft : paddingLeft;
  }
  
  function indent(node, value) {
    var cell = $(node.children("td")[options.treeColumn]);
    cell[0].style.paddingLeft = getPaddingLeft(cell) + value + "px";
    
    childrenOf(node).each(function() {
      indent($(this), value);
    });
  };
  
  function initialize(node) {
    if(!node.hasClass("initialized")) {
      node.addClass("initialized");
      
      var childNodes = childrenOf(node);
      
      if(!node.hasClass("parent") && childNodes.length > 0) {
        node.addClass("parent");
      }
      
      if(node.hasClass("parent")) {
        var cell = $(node.children("td")[options.treeColumn]);
        var padding = getPaddingLeft(cell) + options.indent;
        
        childNodes.each(function() {
          $(this).children("td")[options.treeColumn].style.paddingLeft = padding + "px";
        });
        
        if(options.expandable) {
          var cellCont = cell.children("div").children("div:first");
          cellCont.prepend('<span style="margin-left: -' + options.indent + 'px; padding-left: ' + options.indent + 'px" class="expander"></span>');
          $(cell[0].firstChild).click(function() { node.toggleBranch(); });
          
          if(options.clickableNodeNames) {
            //cell[0].style.cursor = "pointer";
            //$(cell)
            cellCont
            //cell
            .css('cursor', 'pointer').click(function(e) {
              // Don't double-toggle if the click is on the existing expander icon
              if (e.target.className != 'expander') {
                node.toggleBranch();
              }
            });
          }
          
          // Check for a class set explicitly by the user, otherwise set the default class
          if(!(node.hasClass("expanded") || node.hasClass("collapsed"))) {
            node.addClass(options.initialState);
          }

          if(node.hasClass("expanded")) {
            node.expand();
          }
        }
      }
    }
  };
  
  function move(node, destination) {
    node.insertAfter(destination);
    childrenOf(node).reverse().each(function() { move($(this), node[0]); });
  };
  
  function parentOf(node) {
    var classNames = node[0].className.split(' ');
    
    for(key in classNames) {
      if(classNames[key].match(options.childPrefix)) {
        return $("#" + classNames[key].substring(9));
      }
    }
  };
})(jQuery);


/*
 * jQuery UI 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI
 */
;jQuery.ui || (function($) {

var _remove = $.fn.remove,
	isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9);

//Helper functions and ui object
$.ui = {
	version: "1.7.2",

	// $.ui.plugin is deprecated.  Use the proxy pattern instead.
	plugin: {
		add: function(module, option, set) {
			var proto = $.ui[module].prototype;
			for(var i in set) {
				proto.plugins[i] = proto.plugins[i] || [];
				proto.plugins[i].push([option, set[i]]);
			}
		},
		call: function(instance, name, args) {
			var set = instance.plugins[name];
			if(!set || !instance.element[0].parentNode) { return; }

			for (var i = 0; i < set.length; i++) {
				if (instance.options[set[i][0]]) {
					set[i][1].apply(instance.element, args);
				}
			}
		}
	},

	contains: function(a, b) {
		return document.compareDocumentPosition
			? a.compareDocumentPosition(b) & 16
			: a !== b && a.contains(b);
	},

	hasScroll: function(el, a) {

		//If overflow is hidden, the element might have extra content, but the user wants to hide it
		if ($(el).css('overflow') == 'hidden') { return false; }

		var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop',
			has = false;

		if (el[scroll] > 0) { return true; }

		// TODO: determine which cases actually cause this to happen
		// if the element doesn't have the scroll set, see if it's possible to
		// set the scroll
		el[scroll] = 1;
		has = (el[scroll] > 0);
		el[scroll] = 0;
		return has;
	},

	isOverAxis: function(x, reference, size) {
		//Determines when x coordinate is over "b" element axis
		return (x > reference) && (x < (reference + size));
	},

	isOver: function(y, x, top, left, height, width) {
		//Determines when x, y coordinates is over "b" element
		return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width);
	},

	keyCode: {
		BACKSPACE: 8,
		CAPS_LOCK: 20,
		COMMA: 188,
		CONTROL: 17,
		DELETE: 46,
		DOWN: 40,
		END: 35,
		ENTER: 13,
		ESCAPE: 27,
		HOME: 36,
		INSERT: 45,
		LEFT: 37,
		NUMPAD_ADD: 107,
		NUMPAD_DECIMAL: 110,
		NUMPAD_DIVIDE: 111,
		NUMPAD_ENTER: 108,
		NUMPAD_MULTIPLY: 106,
		NUMPAD_SUBTRACT: 109,
		PAGE_DOWN: 34,
		PAGE_UP: 33,
		PERIOD: 190,
		RIGHT: 39,
		SHIFT: 16,
		SPACE: 32,
		TAB: 9,
		UP: 38
	}
};

// WAI-ARIA normalization
if (isFF2) {
	var attr = $.attr,
		removeAttr = $.fn.removeAttr,
		ariaNS = "http://www.w3.org/2005/07/aaa",
		ariaState = /^aria-/,
		ariaRole = /^wairole:/;

	$.attr = function(elem, name, value) {
		var set = value !== undefined;

		return (name == 'role'
			? (set
				? attr.call(this, elem, name, "wairole:" + value)
				: (attr.apply(this, arguments) || "").replace(ariaRole, ""))
			: (ariaState.test(name)
				? (set
					? elem.setAttributeNS(ariaNS,
						name.replace(ariaState, "aaa:"), value)
					: attr.call(this, elem, name.replace(ariaState, "aaa:")))
				: attr.apply(this, arguments)));
	};

	$.fn.removeAttr = function(name) {
		return (ariaState.test(name)
			? this.each(function() {
				this.removeAttributeNS(ariaNS, name.replace(ariaState, ""));
			}) : removeAttr.call(this, name));
	};
}

//jQuery plugins
$.fn.extend({
	remove: function() {
		// Safari has a native remove event which actually removes DOM elements,
		// so we have to use triggerHandler instead of trigger (#3037).
		$("*", this).add(this).each(function() {
			$(this).triggerHandler("remove");
		});
		return _remove.apply(this, arguments );
	},

	enableSelection: function() {
		return this
			.attr('unselectable', 'off')
			.css('MozUserSelect', '')
			.unbind('selectstart.ui');
	},

	disableSelection: function() {
		return this
			.attr('unselectable', 'on')
			.css('MozUserSelect', 'none')
			.bind('selectstart.ui', function() { return false; });
	},

	scrollParent: function() {
		var scrollParent;
		if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
			scrollParent = this.parents().filter(function() {
				return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
			}).eq(0);
		} else {
			scrollParent = this.parents().filter(function() {
				return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
			}).eq(0);
		}

		return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
	}
});


//Additional selectors
$.extend($.expr[':'], {
	data: function(elem, i, match) {
		return !!$.data(elem, match[3]);
	},

	focusable: function(element) {
		var nodeName = element.nodeName.toLowerCase(),
			tabIndex = $.attr(element, 'tabindex');
		return (/input|select|textarea|button|object/.test(nodeName)
			? !element.disabled
			: 'a' == nodeName || 'area' == nodeName
				? element.href || !isNaN(tabIndex)
				: !isNaN(tabIndex))
			// the element and all of its ancestors must be visible
			// the browser may report that the area is hidden
			&& !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length;
	},

	tabbable: function(element) {
		var tabIndex = $.attr(element, 'tabindex');
		return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable');
	}
});


// $.widget is a factory to create jQuery plugins
// taking some boilerplate code out of the plugin code
function getter(namespace, plugin, method, args) {
	function getMethods(type) {
		var methods = $[namespace][plugin][type] || [];
		return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods);
	}

	var methods = getMethods('getter');
	if (args.length == 1 && typeof args[0] == 'string') {
		methods = methods.concat(getMethods('getterSetter'));
	}
	return ($.inArray(method, methods) != -1);
}

$.widget = function(name, prototype) {
	var namespace = name.split(".")[0];
	name = name.split(".")[1];

	// create plugin method
	$.fn[name] = function(options) {
		var isMethodCall = (typeof options == 'string'),
			args = Array.prototype.slice.call(arguments, 1);

		// prevent calls to internal methods
		if (isMethodCall && options.substring(0, 1) == '_') {
			return this;
		}

		// handle getter methods
		if (isMethodCall && getter(namespace, name, options, args)) {
			var instance = $.data(this[0], name);
			return (instance ? instance[options].apply(instance, args)
				: undefined);
		}

		// handle initialization and non-getter methods
		return this.each(function() {
			var instance = $.data(this, name);

			// constructor
			(!instance && !isMethodCall &&
				$.data(this, name, new $[namespace][name](this, options))._init());

			// method call
			(instance && isMethodCall && $.isFunction(instance[options]) &&
				instance[options].apply(instance, args));
		});
	};

	// create widget constructor
	$[namespace] = $[namespace] || {};
	$[namespace][name] = function(element, options) {
		var self = this;

		this.namespace = namespace;
		this.widgetName = name;
		this.widgetEventPrefix = $[namespace][name].eventPrefix || name;
		this.widgetBaseClass = namespace + '-' + name;

		this.options = $.extend({},
			$.widget.defaults,
			$[namespace][name].defaults,
			$.metadata && $.metadata.get(element)[name],
			options);

		this.element = $(element)
			.bind('setData.' + name, function(event, key, value) {
				if (event.target == element) {
					return self._setData(key, value);
				}
			})
			.bind('getData.' + name, function(event, key) {
				if (event.target == element) {
					return self._getData(key);
				}
			})
			.bind('remove', function() {
				return self.destroy();
			});
	};

	// add widget prototype
	$[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);

	// TODO: merge getter and getterSetter properties from widget prototype
	// and plugin prototype
	$[namespace][name].getterSetter = 'option';
};

$.widget.prototype = {
	_init: function() {},
	destroy: function() {
		this.element.removeData(this.widgetName)
			.removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled')
			.removeAttr('aria-disabled');
	},

	option: function(key, value) {
		var options = key,
			self = this;

		if (typeof key == "string") {
			if (value === undefined) {
				return this._getData(key);
			}
			options = {};
			options[key] = value;
		}

		$.each(options, function(key, value) {
			self._setData(key, value);
		});
	},
	_getData: function(key) {
		return this.options[key];
	},
	_setData: function(key, value) {
		this.options[key] = value;

		if (key == 'disabled') {
			this.element
				[value ? 'addClass' : 'removeClass'](
					this.widgetBaseClass + '-disabled' + ' ' +
					this.namespace + '-state-disabled')
				.attr("aria-disabled", value);
		}
	},

	enable: function() {
		this._setData('disabled', false);
	},
	disable: function() {
		this._setData('disabled', true);
	},

	_trigger: function(type, event, data) {
		var callback = this.options[type],
			eventName = (type == this.widgetEventPrefix
				? type : this.widgetEventPrefix + type);

		event = $.Event(event);
		event.type = eventName;

		// copy original event properties over to the new event
		// this would happen if we could call $.event.fix instead of $.Event
		// but we don't have a way to force an event to be fixed multiple times
		if (event.originalEvent) {
			for (var i = $.event.props.length, prop; i;) {
				prop = $.event.props[--i];
				event[prop] = event.originalEvent[prop];
			}
		}

		this.element.trigger(event, data);

		return !($.isFunction(callback) && callback.call(this.element[0], event, data) === false
			|| event.isDefaultPrevented());
	}
};

$.widget.defaults = {
	disabled: false
};


/** Mouse Interaction Plugin **/

$.ui.mouse = {
	_mouseInit: function() {
		var self = this;

		this.element
			.bind('mousedown.'+this.widgetName, function(event) {
				return self._mouseDown(event);
			})
			.bind('click.'+this.widgetName, function(event) {
				if(self._preventClickEvent) {
					self._preventClickEvent = false;
					event.stopImmediatePropagation();
					return false;
				}
			});

		// Prevent text selection in IE
		if ($.browser.msie) {
			this._mouseUnselectable = this.element.attr('unselectable');
			this.element.attr('unselectable', 'on');
		}

		this.started = false;
	},

	// TODO: make sure destroying one instance of mouse doesn't mess with
	// other instances of mouse
	_mouseDestroy: function() {
		this.element.unbind('.'+this.widgetName);

		// Restore text selection in IE
		($.browser.msie
			&& this.element.attr('unselectable', this._mouseUnselectable));
	},

	_mouseDown: function(event) {
		// don't let more than one widget handle mouseStart
		// TODO: figure out why we have to use originalEvent
		event.originalEvent = event.originalEvent || {};
		if (event.originalEvent.mouseHandled) { return; }

		// we may have missed mouseup (out of window)
		(this._mouseStarted && this._mouseUp(event));

		this._mouseDownEvent = event;

		var self = this,
			btnIsLeft = (event.which == 1),
			elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
			return true;
		}

		this.mouseDelayMet = !this.options.delay;
		if (!this.mouseDelayMet) {
			this._mouseDelayTimer = setTimeout(function() {
				self.mouseDelayMet = true;
			}, this.options.delay);
		}

		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
			this._mouseStarted = (this._mouseStart(event) !== false);
			if (!this._mouseStarted) {
				event.preventDefault();
				return true;
			}
		}

		// these delegates are required to keep context
		this._mouseMoveDelegate = function(event) {
			return self._mouseMove(event);
		};
		this._mouseUpDelegate = function(event) {
			return self._mouseUp(event);
		};
		$(document)
			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);

		// preventDefault() is used to prevent the selection of text here -
		// however, in Safari, this causes select boxes not to be selectable
		// anymore, so this fix is needed
		($.browser.safari || event.preventDefault());

		event.originalEvent.mouseHandled = true;
		return true;
	},

	_mouseMove: function(event) {
		// IE mouseup check - mouseup happened when mouse was out of window
		if ($.browser.msie && !event.button) {
			return this._mouseUp(event);
		}

		if (this._mouseStarted) {
			this._mouseDrag(event);
			return event.preventDefault();
		}

		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
			this._mouseStarted =
				(this._mouseStart(this._mouseDownEvent, event) !== false);
			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
		}

		return !this._mouseStarted;
	},

	_mouseUp: function(event) {
		$(document)
			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);

		if (this._mouseStarted) {
			this._mouseStarted = false;
			this._preventClickEvent = (event.target == this._mouseDownEvent.target);
			this._mouseStop(event);
		}

		return false;
	},

	_mouseDistanceMet: function(event) {
		return (Math.max(
				Math.abs(this._mouseDownEvent.pageX - event.pageX),
				Math.abs(this._mouseDownEvent.pageY - event.pageY)
			) >= this.options.distance
		);
	},

	_mouseDelayMet: function(event) {
		return this.mouseDelayMet;
	},

	// These are placeholder methods, to be overriden by extending plugin
	_mouseStart: function(event) {},
	_mouseDrag: function(event) {},
	_mouseStop: function(event) {},
	_mouseCapture: function(event) { return true; }
};

$.ui.mouse.defaults = {
	cancel: null,
	distance: 1,
	delay: 0
};

})(jQuery);


/*
 * jQuery UI Datepicker 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Datepicker
 *
 * Depends:
 *	ui.core.js
 */

(function($) { // hide the namespace

$.extend($.ui, { datepicker: { version: "1.7.2" } });

var PROP_NAME = 'datepicker';

/* Date picker manager.
   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
   Settings for (groups of) date pickers are maintained in an instance object,
   allowing multiple different settings on the same page. */

function Datepicker() {
	this.debug = false; // Change this to true to start debugging
	this._curInst = null; // The current instance in use
	this._keyEvent = false; // If the last event was a key event
	this._disabledInputs = []; // List of date picker inputs that have been disabled
	this._datepickerShowing = false; // True if the popup picker is showing , false if not
	this._inDialog = false; // True if showing within a "dialog", false if not
	this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
	this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
	this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
	this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
	this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
	this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
	this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
	this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
	this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
	this.regional = []; // Available regional settings, indexed by language code
	this.regional[''] = { // Default regional settings
		closeText: 'Закрыть', // Display text for close link
		prevText: '&#x3c;След', // Display text for previous month link
		nextText: 'Пред&#x3e;', // Display text for next month link
		currentText: 'Текущий', // Display text for current month link
		clearText: 'Очистить', //Display text for clear button
			monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь',
			'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], // Names of months for drop-down and formatting 
		monthNamesShort: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'], // For formatting
			dayNames: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятницо', 'Суббота'],  // For formatting
			dayNamesShort: ['Вск', 'Пнд', 'Втр', 'Срд', 'Чтв', 'Птн', 'Суб'], // For formatting
		dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'], // Column headings for days starting at Sunday
		dateFormat: 'dd.mm.yy', // See format options on parseDate
		firstDay: 1, // The first day of the week, Sun = 0, Mon = 1, ...
		isRTL: false // True if right-to-left language, false if left-to-right
	};
	this._defaults = { // Global defaults for all the date picker instances
		showOn: 'focus', // 'focus' for popup on focus,
			// 'button' for trigger button, or 'both' for either
		showAnim: 'show', // Name of jQuery animation for popup
		showOptions: {}, // Options for enhanced animations
		defaultDate: null, // Used when field is blank: actual date,
			// +/-number for offset from today, null for today
		appendText: '', // Display text following the input box, e.g. showing the format
		buttonText: '...', // Text for trigger button
		buttonImage: '', // URL for trigger button image
		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
		hideIfNoPrevNext: false, // True to hide next/previous month links
			// if not applicable, false to just disable them
		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
		gotoCurrent: false, // True if today link goes back to current selection instead
		changeMonth: true, // True if month can be selected directly, false if only prev/next
		changeYear: true, // True if year can be selected directly, false if only prev/next
		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
		yearRange: '-10:+10', // Range of years to display in drop-down,
			// either relative to current year (-nn:+nn) or absolute (nnnn:nnnn)
		showOtherMonths: false, // True to show dates in other months, false to leave blank
		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
			// takes a Date and returns the number of the week for it
		shortYearCutoff: '+10', // Short year values < this are in the current century,
			// > this are in the previous century,
			// string value starting with '+' for current year + value
		minDate: null, // The earliest selectable date, or null for no limit
		maxDate: null, // The latest selectable date, or null for no limit
		duration: 'fast', // Duration of display/closure
		beforeShowDay: null, // Function that takes a date and returns an array with
			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
		beforeShow: null, // Function that takes an input field and
			// returns a set of custom settings for the date picker
		onSelect: null, // Define a callback function when a date is selected
		onChangeMonthYear: null, // Define a callback function when the month or year is changed
		onClose: null, // Define a callback function when the datepicker is closed
		numberOfMonths: 1, // Number of months to show at a time
		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
		stepMonths: 1, // Number of months to step back/forward
		stepBigMonths: 12, // Number of months to step back/forward for the big links
		altField: '', // Selector for an alternate field to store selected dates into
		altFormat: '', // The date format to use for the alternate field
		constrainInput: true, // The input is constrained by the current date format
		showButtonPanel: false // True to show button panel, false to not show it
	};
	$.extend(this._defaults, this.regional['']);
	this.dpDiv = $('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>');
}

$.extend(Datepicker.prototype, {
	/* Class name added to elements to indicate already configured with a date picker. */
	markerClassName: 'hasDatepicker',

	/* Debug logging (if enabled). */
	log: function () {
		if (this.debug)
			console.log.apply('', arguments);
	},

	/* Override the default settings for all instances of the date picker.
	   @param  settings  object - the new settings to use as defaults (anonymous object)
	   @return the manager object */
	setDefaults: function(settings) {
		extendRemove(this._defaults, settings || {});
		return this;
	},

	/* Attach the date picker to a jQuery selection.
	   @param  target    element - the target input field or division or span
	   @param  settings  object - the new settings to use for this date picker instance (anonymous) */
	_attachDatepicker: function(target, settings) {
		// check for settings on the control itself - in namespace 'date:'
		var inlineSettings = null;
		for (var attrName in this._defaults) {
			var attrValue = target.getAttribute('date:' + attrName);
			if (attrValue) {
				inlineSettings = inlineSettings || {};
				try {
					inlineSettings[attrName] = eval(attrValue);
				} catch (err) {
					inlineSettings[attrName] = attrValue;
				}
			}
		}
		var nodeName = target.nodeName.toLowerCase();
		var inline = (nodeName == 'div' || nodeName == 'span');
		if (!target.id)
			target.id = 'dp' + (++this.uuid);
		var inst = this._newInst($(target), inline);
		inst.settings = $.extend({}, settings || {}, inlineSettings || {});
		if (nodeName == 'input') {
			this._connectDatepicker(target, inst);
		} else if (inline) {
			this._inlineDatepicker(target, inst);
		}
	},

	/* Create a new instance object. */
	_newInst: function(target, inline) {
		var id = target[0].id.replace(/([:\[\]\.])/g, '\\\\$1'); // escape jQuery meta chars
		return {id: id, input: target, // associated target
			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
			drawMonth: 0, drawYear: 0, // month being drawn
			inline: inline, // is datepicker inline or not
			dpDiv: (!inline ? this.dpDiv : // presentation div
			$('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))};
	},

	/* Attach the date picker to an input field. */
	_connectDatepicker: function(target, inst) {
		var input = $(target);
		inst.append = $([]);
		inst.trigger = $([]);
		if (input.hasClass(this.markerClassName))
			return;
		var appendText = this._get(inst, 'appendText');
		var isRTL = this._get(inst, 'isRTL');
		if (appendText) {
			inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
			input[isRTL ? 'before' : 'after'](inst.append);
		}
		var showOn = this._get(inst, 'showOn');
		if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
			input.focus(this._showDatepicker);
		if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
			var buttonText = this._get(inst, 'buttonText');
			var buttonImage = this._get(inst, 'buttonImage');
			inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
				$('<img/>').addClass(this._triggerClass).
					attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
				$('<button type="button"></button>').addClass(this._triggerClass).
					html(buttonImage == '' ? buttonText : $('<img/>').attr(
					{ src:buttonImage, alt:buttonText, title:buttonText })));
			input[isRTL ? 'before' : 'after'](inst.trigger);
			inst.trigger.click(function() {
				if ($.datepicker._datepickerShowing && $.datepicker._lastInput == target)
					$.datepicker._hideDatepicker();
				else
					$.datepicker._showDatepicker(target);
				return false;
			});
		}
		input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).
			bind("setData.datepicker", function(event, key, value) {
				inst.settings[key] = value;
			}).bind("getData.datepicker", function(event, key) {
				return this._get(inst, key);
			});
		$.data(target, PROP_NAME, inst);
	},

	/* Attach an inline date picker to a div. */
	_inlineDatepicker: function(target, inst) {
		var divSpan = $(target);
		if (divSpan.hasClass(this.markerClassName))
			return;
		divSpan.addClass(this.markerClassName).append(inst.dpDiv).
			bind("setData.datepicker", function(event, key, value){
				inst.settings[key] = value;
			}).bind("getData.datepicker", function(event, key){
				return this._get(inst, key);
			});
		$.data(target, PROP_NAME, inst);
		this._setDate(inst, this._getDefaultDate(inst));
		this._updateDatepicker(inst);
		this._updateAlternate(inst);
	},

	/* Pop-up the date picker in a "dialog" box.
	   @param  input     element - ignored
	   @param  dateText  string - the initial date to display (in the current format)
	   @param  onSelect  function - the function(dateText) to call when a date is selected
	   @param  settings  object - update the dialog date picker instance's settings (anonymous object)
	   @param  pos       int[2] - coordinates for the dialog's position within the screen or
	                     event - with x/y coordinates or
	                     leave empty for default (screen centre)
	   @return the manager object */
	_dialogDatepicker: function(input, dateText, onSelect, settings, pos) {
		var inst = this._dialogInst; // internal instance
		if (!inst) {
			var id = 'dp' + (++this.uuid);
			this._dialogInput = $('<input type="text" id="' + id +
				'" size="1" style="position: absolute; top: -100px;"/>');
			this._dialogInput.keydown(this._doKeyDown);
			$('body').append(this._dialogInput);
			inst = this._dialogInst = this._newInst(this._dialogInput, false);
			inst.settings = {};
			$.data(this._dialogInput[0], PROP_NAME, inst);
		}
		extendRemove(inst.settings, settings || {});
		this._dialogInput.val(dateText);

		this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
		if (!this._pos) {
			var browserWidth = window.innerWidth || document.documentElement.clientWidth ||	document.body.clientWidth;
			var browserHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
			var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
			var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
			this._pos = // should use actual width/height below
				[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
		}

		// move input on screen for focus, but hidden behind dialog
		this._dialogInput.css('left', this._pos[0] + 'px').css('top', this._pos[1] + 'px');
		inst.settings.onSelect = onSelect;
		this._inDialog = true;
		this.dpDiv.addClass(this._dialogClass);
		this._showDatepicker(this._dialogInput[0]);
		if ($.blockUI)
			$.blockUI(this.dpDiv);
		$.data(this._dialogInput[0], PROP_NAME, inst);
		return this;
	},

	/* Detach a datepicker from its control.
	   @param  target    element - the target input field or division or span */
	_destroyDatepicker: function(target) {
		var $target = $(target);
		var inst = $.data(target, PROP_NAME);
		if (!$target.hasClass(this.markerClassName)) {
			return;
		}
		var nodeName = target.nodeName.toLowerCase();
		$.removeData(target, PROP_NAME);
		if (nodeName == 'input') {
			inst.append.remove();
			inst.trigger.remove();
			$target.removeClass(this.markerClassName).
				unbind('focus', this._showDatepicker).
				unbind('keydown', this._doKeyDown).
				unbind('keypress', this._doKeyPress);
		} else if (nodeName == 'div' || nodeName == 'span')
			$target.removeClass(this.markerClassName).empty();
	},

	/* Enable the date picker to a jQuery selection.
	   @param  target    element - the target input field or division or span */
	_enableDatepicker: function(target) {
		var $target = $(target);
		var inst = $.data(target, PROP_NAME);
		if (!$target.hasClass(this.markerClassName)) {
			return;
		}
		var nodeName = target.nodeName.toLowerCase();
		if (nodeName == 'input') {
			target.disabled = false;
			inst.trigger.filter('button').
				each(function() { this.disabled = false; }).end().
				filter('img').css({opacity: '1.0', cursor: ''});
		}
		else if (nodeName == 'div' || nodeName == 'span') {
			var inline = $target.children('.' + this._inlineClass);
			inline.children().removeClass('ui-state-disabled');
		}
		this._disabledInputs = $.map(this._disabledInputs,
			function(value) { return (value == target ? null : value); }); // delete entry
	},

	/* Disable the date picker to a jQuery selection.
	   @param  target    element - the target input field or division or span */
	_disableDatepicker: function(target) {
		var $target = $(target);
		var inst = $.data(target, PROP_NAME);
		if (!$target.hasClass(this.markerClassName)) {
			return;
		}
		var nodeName = target.nodeName.toLowerCase();
		if (nodeName == 'input') {
			target.disabled = true;
			inst.trigger.filter('button').
				each(function() { this.disabled = true; }).end().
				filter('img').css({opacity: '0.5', cursor: 'default'});
		}
		else if (nodeName == 'div' || nodeName == 'span') {
			var inline = $target.children('.' + this._inlineClass);
			inline.children().addClass('ui-state-disabled');
		}
		this._disabledInputs = $.map(this._disabledInputs,
			function(value) { return (value == target ? null : value); }); // delete entry
		this._disabledInputs[this._disabledInputs.length] = target;
	},

	/* Is the first field in a jQuery collection disabled as a datepicker?
	   @param  target    element - the target input field or division or span
	   @return boolean - true if disabled, false if enabled */
	_isDisabledDatepicker: function(target) {
		if (!target) {
			return false;
		}
		for (var i = 0; i < this._disabledInputs.length; i++) {
			if (this._disabledInputs[i] == target)
				return true;
		}
		return false;
	},

	/* Retrieve the instance data for the target control.
	   @param  target  element - the target input field or division or span
	   @return  object - the associated instance data
	   @throws  error if a jQuery problem getting data */
	_getInst: function(target) {
		try {
			return $.data(target, PROP_NAME);
		}
		catch (err) {
			throw 'Missing instance data for this datepicker';
		}
	},

	/* Update or retrieve the settings for a date picker attached to an input field or division.
	   @param  target  element - the target input field or division or span
	   @param  name    object - the new settings to update or
	                   string - the name of the setting to change or retrieve,
	                   when retrieving also 'all' for all instance settings or
	                   'defaults' for all global defaults
	   @param  value   any - the new value for the setting
	                   (omit if above is an object or to retrieve a value) */
	_optionDatepicker: function(target, name, value) {
		var inst = this._getInst(target);
		if (arguments.length == 2 && typeof name == 'string') {
			return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
				(inst ? (name == 'all' ? $.extend({}, inst.settings) :
				this._get(inst, name)) : null));
		}
		var settings = name || {};
		if (typeof name == 'string') {
			settings = {};
			settings[name] = value;
		}
		if (inst) {
			if (this._curInst == inst) {
				this._hideDatepicker(null);
			}
			var date = this._getDateDatepicker(target);
			extendRemove(inst.settings, settings);
			this._setDateDatepicker(target, date);
			this._updateDatepicker(inst);
		}
	},

	// change method deprecated
	_changeDatepicker: function(target, name, value) {
		this._optionDatepicker(target, name, value);
	},

	/* Redraw the date picker attached to an input field or division.
	   @param  target  element - the target input field or division or span */
	_refreshDatepicker: function(target) {
		var inst = this._getInst(target);
		if (inst) {
			this._updateDatepicker(inst);
		}
	},

	/* Set the dates for a jQuery selection.
	   @param  target   element - the target input field or division or span
	   @param  date     Date - the new date
	   @param  endDate  Date - the new end date for a range (optional) */
	_setDateDatepicker: function(target, date, endDate) {
		var inst = this._getInst(target);
		if (inst) {
			this._setDate(inst, date, endDate);
			this._updateDatepicker(inst);
			this._updateAlternate(inst);
		}
	},

	/* Get the date(s) for the first entry in a jQuery selection.
	   @param  target  element - the target input field or division or span
	   @return Date - the current date or
	           Date[2] - the current dates for a range */
	_getDateDatepicker: function(target) {
		var inst = this._getInst(target);
		if (inst && !inst.inline)
			this._setDateFromField(inst);
		return (inst ? this._getDate(inst) : null);
	},

	/* Handle keystrokes. */
	_doKeyDown: function(event) {
		var inst = $.datepicker._getInst(event.target);
		var handled = true;
		var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
		inst._keyEvent = true;
		if ($.datepicker._datepickerShowing)
			switch (event.keyCode) {
				case 9:  $.datepicker._hideDatepicker(null, '');
						break; // hide on tab out
				case 13: var sel = $('td.' + $.datepicker._dayOverClass +
							', td.' + $.datepicker._currentClass, inst.dpDiv);
						if (sel[0])
							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
						else
							$.datepicker._hideDatepicker(null, $.datepicker._get(inst, 'duration'));
						return false; // don't submit the form
						break; // select the value on enter
				case 27: $.datepicker._hideDatepicker(null, $.datepicker._get(inst, 'duration'));
						break; // hide on escape
				case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
							-$.datepicker._get(inst, 'stepBigMonths') :
							-$.datepicker._get(inst, 'stepMonths')), 'M');
						break; // previous month/year on page up/+ ctrl
				case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
							+$.datepicker._get(inst, 'stepBigMonths') :
							+$.datepicker._get(inst, 'stepMonths')), 'M');
						break; // next month/year on page down/+ ctrl
				case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
						handled = event.ctrlKey || event.metaKey;
						break; // clear on ctrl or command +end
				case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
						handled = event.ctrlKey || event.metaKey;
						break; // current on ctrl or command +home
				case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
						handled = event.ctrlKey || event.metaKey;
						// -1 day on ctrl or command +left
						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
									-$.datepicker._get(inst, 'stepBigMonths') :
									-$.datepicker._get(inst, 'stepMonths')), 'M');
						// next month/year on alt +left on Mac
						break;
				case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
						handled = event.ctrlKey || event.metaKey;
						break; // -1 week on ctrl or command +up
				case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
						handled = event.ctrlKey || event.metaKey;
						// +1 day on ctrl or command +right
						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
									+$.datepicker._get(inst, 'stepBigMonths') :
									+$.datepicker._get(inst, 'stepMonths')), 'M');
						// next month/year on alt +right
						break;
				case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
						handled = event.ctrlKey || event.metaKey;
						break; // +1 week on ctrl or command +down
				default: handled = false;
			}
		else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
			$.datepicker._showDatepicker(this);
		else {
			handled = false;
		}
		if (handled) {
			event.preventDefault();
			event.stopPropagation();
		}
	},

	/* Filter entered characters - based on date format. */
	_doKeyPress: function(event) {
		var inst = $.datepicker._getInst(event.target);
		if ($.datepicker._get(inst, 'constrainInput')) {
			var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
			var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
			return event.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
		}
	},

	/* Pop-up the date picker for a given input field.
	   @param  input  element - the input field attached to the date picker or
	                  event - if triggered by focus */
	_showDatepicker: function(input) {
		input = input.target || input;
		if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
			input = $('input', input.parentNode)[0];
		if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
			return;
		var inst = $.datepicker._getInst(input);
		var beforeShow = $.datepicker._get(inst, 'beforeShow');
		extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {}));
		$.datepicker._hideDatepicker(null, '');
		$.datepicker._lastInput = input;
		$.datepicker._setDateFromField(inst);
		if ($.datepicker._inDialog) // hide cursor
			input.value = '';
		if (!$.datepicker._pos) { // position below input
			$.datepicker._pos = $.datepicker._findPos(input);
			$.datepicker._pos[1] += input.offsetHeight; // add the height
		}
		var isFixed = false;
		$(input).parents().each(function() {
			isFixed |= $(this).css('position') == 'fixed';
			return !isFixed;
		});
		if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled
			$.datepicker._pos[0] -= document.documentElement.scrollLeft;
			$.datepicker._pos[1] -= document.documentElement.scrollTop;
		}
		var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
		$.datepicker._pos = null;
		inst.rangeStart = null;
		// determine sizing offscreen
		inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
		$.datepicker._updateDatepicker(inst);
		// fix width for dynamic number of date pickers
		// and adjust position before showing
		offset = $.datepicker._checkOffset(inst, offset, isFixed);
		inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
			'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
			left: offset.left + 'px', top: offset.top + 'px'});
		if (!inst.inline) {
			var showAnim = $.datepicker._get(inst, 'showAnim') || 'show';
			var duration = $.datepicker._get(inst, 'duration');
			var postProcess = function() {
				$.datepicker._datepickerShowing = true;
				if ($.browser.msie && parseInt($.browser.version,10) < 7) // fix IE < 7 select problems
					$('iframe.ui-datepicker-cover').css({width: inst.dpDiv.width() + 4,
						height: inst.dpDiv.height() + 4});
			};
			if ($.effects && $.effects[showAnim])
				inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
			else
				inst.dpDiv[showAnim](duration, postProcess);
			if (duration == '')
				postProcess();
			if (inst.input[0].type != 'hidden')
				inst.input[0].focus();
			$.datepicker._curInst = inst;
		}
	},

	/* Generate the date picker content. */
	_updateDatepicker: function(inst) {
		var dims = {width: inst.dpDiv.width() + 4,
			height: inst.dpDiv.height() + 4};
		var self = this;
		inst.dpDiv.empty().append(this._generateHTML(inst))
			.find('iframe.ui-datepicker-cover').
				css({width: dims.width, height: dims.height})
			.end()
			.find('button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a')
				.bind('mouseout', function(){
					$(this).removeClass('ui-state-hover');
					if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
					if(this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
				})
				.bind('mouseover', function(){
					if (!self._isDisabledDatepicker( inst.inline ? inst.dpDiv.parent()[0] : inst.input[0])) {
						$(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
						$(this).addClass('ui-state-hover');
						if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
						if(this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
					}
				})
			.end()
			.find('.' + this._dayOverClass + ' a')
				.trigger('mouseover')
			.end();
		var numMonths = this._getNumberOfMonths(inst);
		var cols = numMonths[1];
		var width = 17;
		if (cols > 1) {
			inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
		} else {
			inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
		}
		inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
			'Class']('ui-datepicker-multi');
		inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
			'Class']('ui-datepicker-rtl');
		if (inst.input && inst.input[0].type != 'hidden' && inst == $.datepicker._curInst)
			$(inst.input[0]).focus();
	},

	/* Check positioning to remain on screen. */
	_checkOffset: function(inst, offset, isFixed) {
		var dpWidth = inst.dpDiv.outerWidth();
		var dpHeight = inst.dpDiv.outerHeight();
		var inputWidth = inst.input ? inst.input.outerWidth() : 0;
		var inputHeight = inst.input ? inst.input.outerHeight() : 0;
		var viewWidth = (window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth) + $(document).scrollLeft();
		var viewHeight = (window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight) + $(document).scrollTop();

		offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
		offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
		offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;

		// now check if datepicker is showing outside window viewport - move to a better place if so.
		offset.left -= (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? Math.abs(offset.left + dpWidth - viewWidth) : 0;
		offset.top -= (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? Math.abs(offset.top + dpHeight + inputHeight*2 - viewHeight) : 0;

		return offset;
	},

	/* Find an object's position on the screen. */
	_findPos: function(obj) {
        while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
            obj = obj.nextSibling;
        }
        var position = $(obj).offset();
	    return [position.left, position.top];
	},

	/* Hide the date picker from view.
	   @param  input  element - the input field attached to the date picker
	   @param  duration  string - the duration over which to close the date picker */
	_hideDatepicker: function(input, duration) {
		var inst = this._curInst;
		if (!inst || (input && inst != $.data(input, PROP_NAME)))
			return;
		if (inst.stayOpen)
			this._selectDate('#' + inst.id, this._formatDate(inst,
				inst.currentDay, inst.currentMonth, inst.currentYear));
		inst.stayOpen = false;
		if (this._datepickerShowing) {
			duration = (duration != null ? duration : this._get(inst, 'duration'));
			var showAnim = this._get(inst, 'showAnim');
			var postProcess = function() {
				$.datepicker._tidyDialog(inst);
			};
			if (duration != '' && $.effects && $.effects[showAnim])
				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'),
					duration, postProcess);
			else
				inst.dpDiv[(duration == '' ? 'hide' : (showAnim == 'slideDown' ? 'slideUp' :
					(showAnim == 'fadeIn' ? 'fadeOut' : 'hide')))](duration, postProcess);
			if (duration == '')
				this._tidyDialog(inst);
			var onClose = this._get(inst, 'onClose');
			if (onClose)
				onClose.apply((inst.input ? inst.input[0] : null),
					[(inst.input ? inst.input.val() : ''), inst]);  // trigger custom callback
			this._datepickerShowing = false;
			this._lastInput = null;
			if (this._inDialog) {
				this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
				if ($.blockUI) {
					$.unblockUI();
					$('body').append(this.dpDiv);
				}
			}
			this._inDialog = false;
		}
		this._curInst = null;
	},

	/* Tidy up after a dialog display. */
	_tidyDialog: function(inst) {
		inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
	},

	/* Close date picker if clicked elsewhere. */
	_checkExternalClick: function(event) {
		if (!$.datepicker._curInst)
			return;
		var $target = $(event.target);
		if (($target.parents('#' + $.datepicker._mainDivId).length == 0) &&
				!$target.hasClass($.datepicker.markerClassName) &&
				!$target.hasClass($.datepicker._triggerClass) &&
				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
			$.datepicker._hideDatepicker(null, '');
	},

	/* Adjust one of the date sub-fields. */
	_adjustDate: function(id, offset, period) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		if (this._isDisabledDatepicker(target[0])) {
			return;
		}
		this._adjustInstDate(inst, offset +
			(period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
			period);
		this._updateDatepicker(inst);
	},

	/* Action for current link. */
	_gotoToday: function(id) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
			inst.selectedDay = inst.currentDay;
			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
			inst.drawYear = inst.selectedYear = inst.currentYear;
		}
		else {
		var date = new Date();
		inst.selectedDay = date.getDate();
		inst.drawMonth = inst.selectedMonth = date.getMonth();
		inst.drawYear = inst.selectedYear = date.getFullYear();
		}
		this._notifyChange(inst);
		this._adjustDate(target);
		this._selectDate(id, this._formatDate(inst,inst.selectedDay, inst.drawMonth, inst.drawYear));
	},

	/* Action for selecting a new month/year. */
	_selectMonthYear: function(id, select, period) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		inst._selectingMonthYear = false;
		inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
		inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
			parseInt(select.options[select.selectedIndex].value,10);
		this._notifyChange(inst);
		this._adjustDate(target);
	},

	/* Restore input focus after not changing month/year. */
	_clickMonthYear: function(id) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		if (inst.input && inst._selectingMonthYear && !$.browser.msie)
			inst.input[0].focus();
		inst._selectingMonthYear = !inst._selectingMonthYear;
	},

	/* Action for selecting a day. */
	_selectDay: function(id, month, year, td) {
		var target = $(id);
		if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
			return;
		}
		var inst = this._getInst(target[0]);
		inst.selectedDay = inst.currentDay = $('a', td).html();
		inst.selectedMonth = inst.currentMonth = month;
		inst.selectedYear = inst.currentYear = year;
		if (inst.stayOpen) {
			inst.endDay = inst.endMonth = inst.endYear = null;
		}
		this._selectDate(id, this._formatDate(inst,
			inst.currentDay, inst.currentMonth, inst.currentYear));
		if (inst.stayOpen) {
			inst.rangeStart = this._daylightSavingAdjust(
				new Date(inst.currentYear, inst.currentMonth, inst.currentDay));
			this._updateDatepicker(inst);
		}
	},

	/* Erase the input field and hide the date picker. */
	_clearDate: function(id) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		inst.stayOpen = false;
		inst.endDay = inst.endMonth = inst.endYear = inst.rangeStart = null;
		this._selectDate(target, '');
	},

	/* Update the input field with the selected date. */
	_selectDate: function(id, dateStr) {
		var target = $(id);
		var inst = this._getInst(target[0]);
		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
		if (inst.input)
			inst.input.val(dateStr);
		this._updateAlternate(inst);
		var onSelect = this._get(inst, 'onSelect');
		if (onSelect)
			onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
		else if (inst.input)
			inst.input.trigger('change'); // fire the change event
		if (inst.inline)
			this._updateDatepicker(inst);
		else if (!inst.stayOpen) {
			this._hideDatepicker(null, this._get(inst, 'duration'));
			this._lastInput = inst.input[0];
			if (typeof(inst.input[0]) != 'object')
				inst.input[0].focus(); // restore focus
			this._lastInput = null;
		}
	},

	/* Update any alternate field to synchronise with the main field. */
	_updateAlternate: function(inst) {
		var altField = this._get(inst, 'altField');
		if (altField) { // update alternate field too
			var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
			var date = this._getDate(inst);
			dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
			$(altField).each(function() { $(this).val(dateStr); });
		}
	},

	/* Set as beforeShowDay function to prevent selection of weekends.
	   @param  date  Date - the date to customise
	   @return [boolean, string] - is this date selectable?, what is its CSS class? */
	noWeekends: function(date) {
		var day = date.getDay();
		return [(day > 0 && day < 6), ''];
	},

	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
	   @param  date  Date - the date to get the week for
	   @return  number - the number of the week within the year that contains this date */
	iso8601Week: function(date) {
		var checkDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
		var firstMon = new Date(checkDate.getFullYear(), 1 - 1, 4); // First week always contains 4 Jan
		var firstDay = firstMon.getDay() || 7; // Day of week: Mon = 1, ..., Sun = 7
		firstMon.setDate(firstMon.getDate() + 1 - firstDay); // Preceding Monday
		if (firstDay < 4 && checkDate < firstMon) { // Adjust first three days in year if necessary
			checkDate.setDate(checkDate.getDate() - 3); // Generate for previous year
			return $.datepicker.iso8601Week(checkDate);
		} else if (checkDate > new Date(checkDate.getFullYear(), 12 - 1, 28)) { // Check last three days in year
			firstDay = new Date(checkDate.getFullYear() + 1, 1 - 1, 4).getDay() || 7;
			if (firstDay > 4 && (checkDate.getDay() || 7) < firstDay - 3) { // Adjust if necessary
				return 1;
			}
		}
		return Math.floor(((checkDate - firstMon) / 86400000) / 7) + 1; // Weeks to given date
	},

	/* Parse a string value into a date object.
	   See formatDate below for the possible formats.

	   @param  format    string - the expected format of the date
	   @param  value     string - the date in the above format
	   @param  settings  Object - attributes include:
	                     shortYearCutoff  number - the cutoff year for determining the century (optional)
	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
	                     dayNames         string[7] - names of the days from Sunday (optional)
	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
	                     monthNames       string[12] - names of the months (optional)
	   @return  Date - the extracted date value or null if value is blank */
	parseDate: function (format, value, settings) {
		if (format == null || value == null)
			throw 'Invalid arguments';
		value = (typeof value == 'object' ? value.toString() : value + '');
		if (value == '')
			return null;
		var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
		var year = -1;
		var month = -1;
		var day = -1;
		var doy = -1;
		var literal = false;
		// Check whether a format character is doubled
		var lookAhead = function(match) {
			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
			if (matches)
				iFormat++;
			return matches;
		};
		// Extract a number from the string value
		var getNumber = function(match) {
			lookAhead(match);
			var origSize = (match == '@' ? 14 : (match == 'y' ? 4 : (match == 'o' ? 3 : 2)));
			var size = origSize;
			var num = 0;
			while (size > 0 && iValue < value.length &&
					value.charAt(iValue) >= '0' && value.charAt(iValue) <= '9') {
				num = num * 10 + parseInt(value.charAt(iValue++),10);
				size--;
			}
			if (size == origSize)
				throw 'Missing number at position ' + iValue;
			return num;
		};
		// Extract a name from the string value and convert to an index
		var getName = function(match, shortNames, longNames) {
			var names = (lookAhead(match) ? longNames : shortNames);
			var size = 0;
			for (var j = 0; j < names.length; j++)
				size = Math.max(size, names[j].length);
			var name = '';
			var iInit = iValue;
			while (size > 0 && iValue < value.length) {
				name += value.charAt(iValue++);
				for (var i = 0; i < names.length; i++)
					if (name == names[i])
						return i + 1;
				size--;
			}
			throw 'Unknown name at position ' + iInit;
		};
		// Confirm that a literal character matches the string value
		var checkLiteral = function() {
			if (value.charAt(iValue) != format.charAt(iFormat))
				throw 'Unexpected literal at position ' + iValue;
			iValue++;
		};
		var iValue = 0;
		for (var iFormat = 0; iFormat < format.length; iFormat++) {
			if (literal)
				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
					literal = false;
				else
					checkLiteral();
			else
				switch (format.charAt(iFormat)) {
					case 'd':
						day = getNumber('d');
						break;
					case 'D':
						getName('D', dayNamesShort, dayNames);
						break;
					case 'o':
						doy = getNumber('o');
						break;
					case 'm':
						month = getNumber('m');
						break;
					case 'M':
						month = getName('M', monthNamesShort, monthNames);
						break;
					case 'y':
						year = getNumber('y');
						break;
					case '@':
						var date = new Date(getNumber('@'));
						year = date.getFullYear();
						month = date.getMonth() + 1;
						day = date.getDate();
						break;
					case "'":
						if (lookAhead("'"))
							checkLiteral();
						else
							literal = true;
						break;
					default:
						checkLiteral();
				}
		}
		if (year == -1)
			year = new Date().getFullYear();
		else if (year < 100)
			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
				(year <= shortYearCutoff ? 0 : -100);
		if (doy > -1) {
			month = 1;
			day = doy;
			do {
				var dim = this._getDaysInMonth(year, month - 1);
				if (day <= dim)
					break;
				month++;
				day -= dim;
			} while (true);
		}
		var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
		if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
			throw 'Invalid date'; // E.g. 31/02/*
		return date;
	},

	/* Standard date formats. */
	ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
	COOKIE: 'D, dd M yy',
	ISO_8601: 'yy-mm-dd',
	RFC_822: 'D, d M y',
	RFC_850: 'DD, dd-M-y',
	RFC_1036: 'D, d M y',
	RFC_1123: 'D, d M yy',
	RFC_2822: 'D, d M yy',
	RSS: 'D, d M y', // RFC 822
	TIMESTAMP: '@',
	W3C: 'yy-mm-dd', // ISO 8601

	/* Format a date object into a string value.
	   The format can be combinations of the following:
	   d  - day of month (no leading zero)
	   dd - day of month (two digit)
	   o  - day of year (no leading zeros)
	   oo - day of year (three digit)
	   D  - day name short
	   DD - day name long
	   m  - month of year (no leading zero)
	   mm - month of year (two digit)
	   M  - month name short
	   MM - month name long
	   y  - year (two digit)
	   yy - year (four digit)
	   @ - Unix timestamp (ms since 01/01/1970)
	   '...' - literal text
	   '' - single quote

	   @param  format    string - the desired format of the date
	   @param  date      Date - the date value to format
	   @param  settings  Object - attributes include:
	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
	                     dayNames         string[7] - names of the days from Sunday (optional)
	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
	                     monthNames       string[12] - names of the months (optional)
	   @return  string - the date in the above format */
	formatDate: function (format, date, settings) {
		if (!date)
			return '';
		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
		// Check whether a format character is doubled
		var lookAhead = function(match) {
			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
			if (matches)
				iFormat++;
			return matches;
		};
		// Format a number, with leading zero if necessary
		var formatNumber = function(match, value, len) {
			var num = '' + value;
			if (lookAhead(match))
				while (num.length < len)
					num = '0' + num;
			return num;
		};
		// Format a name, short or long as requested
		var formatName = function(match, value, shortNames, longNames) {
			return (lookAhead(match) ? longNames[value] : shortNames[value]);
		};
		var output = '';
		var literal = false;
		if (date)
			for (var iFormat = 0; iFormat < format.length; iFormat++) {
				if (literal)
					if (format.charAt(iFormat) == "'" && !lookAhead("'"))
						literal = false;
					else
						output += format.charAt(iFormat);
				else
					switch (format.charAt(iFormat)) {
						case 'd':
							output += formatNumber('d', date.getDate(), 2);
							break;
						case 'D':
							output += formatName('D', date.getDay(), dayNamesShort, dayNames);
							break;
						case 'o':
							var doy = date.getDate();
							for (var m = date.getMonth() - 1; m >= 0; m--)
								doy += this._getDaysInMonth(date.getFullYear(), m);
							output += formatNumber('o', doy, 3);
							break;
						case 'm':
							output += formatNumber('m', date.getMonth() + 1, 2);
							break;
						case 'M':
							output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
							break;
						case 'y':
							output += (lookAhead('y') ? date.getFullYear() :
								(date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
							break;
						case '@':
							output += date.getTime();
							break;
						case "'":
							if (lookAhead("'"))
								output += "'";
							else
								literal = true;
							break;
						default:
							output += format.charAt(iFormat);
					}
			}
		return output;
	},

	/* Extract all possible characters from the date format. */
	_possibleChars: function (format) {
		var chars = '';
		var literal = false;
		for (var iFormat = 0; iFormat < format.length; iFormat++)
			if (literal)
				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
					literal = false;
				else
					chars += format.charAt(iFormat);
			else
				switch (format.charAt(iFormat)) {
					case 'd': case 'm': case 'y': case '@':
						chars += '0123456789';
						break;
					case 'D': case 'M':
						return null; // Accept anything
					case "'":
						if (lookAhead("'"))
							chars += "'";
						else
							literal = true;
						break;
					default:
						chars += format.charAt(iFormat);
				}
		return chars;
	},

	/* Get a setting value, defaulting if necessary. */
	_get: function(inst, name) {
		return inst.settings[name] !== undefined ?
			inst.settings[name] : this._defaults[name];
	},

	/* Parse existing date and initialise date picker. */
	_setDateFromField: function(inst) {
		var dateFormat = this._get(inst, 'dateFormat');
		var dates = inst.input ? inst.input.val() : null;
		inst.endDay = inst.endMonth = inst.endYear = null;
		var date = defaultDate = this._getDefaultDate(inst);
		var settings = this._getFormatConfig(inst);
		try {
			date = this.parseDate(dateFormat, dates, settings) || defaultDate;
		} catch (event) {
			this.log(event);
			date = defaultDate;
		}
		inst.selectedDay = date.getDate();
		inst.drawMonth = inst.selectedMonth = date.getMonth();
		inst.drawYear = inst.selectedYear = date.getFullYear();
		inst.currentDay = (dates ? date.getDate() : 0);
		inst.currentMonth = (dates ? date.getMonth() : 0);
		inst.currentYear = (dates ? date.getFullYear() : 0);
		this._adjustInstDate(inst);
	},

	/* Retrieve the default date shown on opening. */
	_getDefaultDate: function(inst) {
		var date = this._determineDate(this._get(inst, 'defaultDate'), new Date());
		var minDate = this._getMinMaxDate(inst, 'min', true);
		var maxDate = this._getMinMaxDate(inst, 'max');
		date = (minDate && date < minDate ? minDate : date);
		date = (maxDate && date > maxDate ? maxDate : date);
		return date;
	},

	/* A date may be specified as an exact value or a relative one. */
	_determineDate: function(date, defaultDate) {
		var offsetNumeric = function(offset) {
			var date = new Date();
			date.setDate(date.getDate() + offset);
			return date;
		};
		var offsetString = function(offset, getDaysInMonth) {
			var date = new Date();
			var year = date.getFullYear();
			var month = date.getMonth();
			var day = date.getDate();
			var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
			var matches = pattern.exec(offset);
			while (matches) {
				switch (matches[2] || 'd') {
					case 'd' : case 'D' :
						day += parseInt(matches[1],10); break;
					case 'w' : case 'W' :
						day += parseInt(matches[1],10) * 7; break;
					case 'm' : case 'M' :
						month += parseInt(matches[1],10);
						day = Math.min(day, getDaysInMonth(year, month));
						break;
					case 'y': case 'Y' :
						year += parseInt(matches[1],10);
						day = Math.min(day, getDaysInMonth(year, month));
						break;
				}
				matches = pattern.exec(offset);
			}
			return new Date(year, month, day);
		};
		date = (date == null ? defaultDate :
			(typeof date == 'string' ? offsetString(date, this._getDaysInMonth) :
			(typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : date)));
		date = (date && date.toString() == 'Invalid Date' ? defaultDate : date);
		if (date) {
			date.setHours(0);
			date.setMinutes(0);
			date.setSeconds(0);
			date.setMilliseconds(0);
		}
		return this._daylightSavingAdjust(date);
	},

	/* Handle switch to/from daylight saving.
	   Hours may be non-zero on daylight saving cut-over:
	   > 12 when midnight changeover, but then cannot generate
	   midnight datetime, so jump to 1AM, otherwise reset.
	   @param  date  (Date) the date to check
	   @return  (Date) the corrected date */
	_daylightSavingAdjust: function(date) {
		if (!date) return null;
		date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
		return date;
	},

	/* Set the date(s) directly. */
	_setDate: function(inst, date, endDate) {
		var clear = !(date);
		var origMonth = inst.selectedMonth;
		var origYear = inst.selectedYear;
		date = this._determineDate(date, new Date());
		inst.selectedDay = inst.currentDay = date.getDate();
		inst.drawMonth = inst.selectedMonth = inst.currentMonth = date.getMonth();
		inst.drawYear = inst.selectedYear = inst.currentYear = date.getFullYear();
		if (origMonth != inst.selectedMonth || origYear != inst.selectedYear)
			this._notifyChange(inst);
		this._adjustInstDate(inst);
		if (inst.input) {
			inst.input.val(clear ? '' : this._formatDate(inst));
		}
	},

	/* Retrieve the date(s) directly. */
	_getDate: function(inst) {
		var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
			this._daylightSavingAdjust(new Date(
			inst.currentYear, inst.currentMonth, inst.currentDay)));
			return startDate;
	},

	/* Generate the HTML for the current state of the date picker. */
	_generateHTML: function(inst) {
		var today = new Date();
		today = this._daylightSavingAdjust(
			new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
		var isRTL = this._get(inst, 'isRTL');
		var showButtonPanel = this._get(inst, 'showButtonPanel');
		var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
		var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
		var numMonths = this._getNumberOfMonths(inst);
		var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
		var stepMonths = this._get(inst, 'stepMonths');
		var stepBigMonths = this._get(inst, 'stepBigMonths');
		var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
		var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
			new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
		var minDate = this._getMinMaxDate(inst, 'min', true);
		var maxDate = this._getMinMaxDate(inst, 'max');
		var drawMonth = inst.drawMonth - showCurrentAtPos;
		var drawYear = inst.drawYear;
		if (drawMonth < 0) {
			drawMonth += 12;
			drawYear--;
		}
		if (maxDate) {
			var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
				maxDate.getMonth() - numMonths[1] + 1, maxDate.getDate()));
			maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
			while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
				drawMonth--;
				if (drawMonth < 0) {
					drawMonth = 11;
					drawYear--;
				}
			}
		}
		inst.drawMonth = drawMonth;
		inst.drawYear = drawYear;
		var prevText = this._get(inst, 'prevText');
		prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
			this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
			this._getFormatConfig(inst)));
		var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
			'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
			' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
		var nextText = this._get(inst, 'nextText');
		nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
			this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
			this._getFormatConfig(inst)));
		var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
			'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
			' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
		var currentText = this._get(inst, 'currentText');
		var clearText = this._get(inst, 'clearText');
		var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
		currentText = (!navigationAsDateFormat ? currentText :
			this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
		var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery.datepicker._hideDatepicker();">' + this._get(inst, 'closeText') + '</button>' : '');
		var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
			($('#' + inst.id).val() == '' ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery.datepicker._gotoToday(\'#' + inst.id + '\');"' +
			'>' + currentText + '</button>' : '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery.datepicker._clearDate(\'#' + inst.id + '\');"' +
			'>' + clearText + '</button>') + (isRTL ? '' : controls) + '</div>' : '';
		var firstDay = parseInt(this._get(inst, 'firstDay'),10);
		firstDay = (isNaN(firstDay) ? 0 : firstDay);
		var dayNames = this._get(inst, 'dayNames');
		var dayNamesShort = this._get(inst, 'dayNamesShort');
		var dayNamesMin = this._get(inst, 'dayNamesMin');
		var monthNames = this._get(inst, 'monthNames');
		var monthNamesShort = this._get(inst, 'monthNamesShort');
		var beforeShowDay = this._get(inst, 'beforeShowDay');
		var showOtherMonths = this._get(inst, 'showOtherMonths');
		var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
		var endDate = inst.endDay ? this._daylightSavingAdjust(
			new Date(inst.endYear, inst.endMonth, inst.endDay)) : currentDate;
		var defaultDate = this._getDefaultDate(inst);
		var html = '';
		for (var row = 0; row < numMonths[0]; row++) {
			var group = '';
			for (var col = 0; col < numMonths[1]; col++) {
				var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
				var cornerClass = ' ui-corner-all';
				var calender = '';
				if (isMultiMonth) {
					calender += '<div class="ui-datepicker-group ui-datepicker-group-';
					switch (col) {
						case 0: calender += 'first'; cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
						case numMonths[1]-1: calender += 'last'; cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
						default: calender += 'middle'; cornerClass = ''; break;
					}
					calender += '">';
				}
				calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
					(/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
					(/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
					this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
					selectedDate, row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
					'</div><table class="ui-datepicker-calendar"><thead>' +
					'<tr>';
				var thead = '';
				for (var dow = 0; dow < 7; dow++) { // days of the week
					var day = (dow + firstDay) % 7;
					thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
						'<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
				}
				calender += thead + '</tr></thead><tbody>';
				var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
				if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
					inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
				var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
				var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate
				var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
				for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
					calender += '<tr>';
					var tbody = '';
					for (var dow = 0; dow < 7; dow++) { // create date picker days
						var daySettings = (beforeShowDay ?
							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
						var otherMonth = (printDate.getMonth() != drawMonth);
						var unselectable = otherMonth || !daySettings[0] ||
							(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
						tbody += '<td class="' +
							((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
							(otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
							((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
							(defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
							// or defaultDate is current printedDate and defaultDate is selectedDate
							' ' + this._dayOverClass : '') + // highlight selected day
							(unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') +  // highlight unselectable days
							(otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
							(printDate.getTime() >= currentDate.getTime() && printDate.getTime() <= endDate.getTime() ? // in current range
							' ' + this._currentClass : '') + // highlight selected day
							(printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
							((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
							(unselectable ? '' : ' onclick="DP_jQuery.datepicker._selectDay(\'#' +
							inst.id + '\',' + drawMonth + ',' + drawYear + ', this);return false;"') + '>' + // actions
							(otherMonth ? (showOtherMonths ? printDate.getDate() : '&#xa0;') : // display for other months
							(unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
							(printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
							(printDate.getTime() >= currentDate.getTime() && printDate.getTime() <= endDate.getTime() ? // in current range
							' ui-state-active' : '') + // highlight selected day
							'" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display for this month
						printDate.setDate(printDate.getDate() + 1);
						printDate = this._daylightSavingAdjust(printDate);
					}
					calender += tbody + '</tr>';
				}
				drawMonth++;
				if (drawMonth > 11) {
					drawMonth = 0;
					drawYear++;
				}
				calender += '</tbody></table>' + (isMultiMonth ? '</div>' + 
							((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
				group += calender;
			}
			html += group;
		}
		html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ?
			'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
		inst._keyEvent = false;
		return html;
	},

	/* Generate the month and year header. */
	_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
			selectedDate, secondary, monthNames, monthNamesShort) {
		minDate = (inst.rangeStart && minDate && selectedDate < minDate ? selectedDate : minDate);
		var changeMonth = this._get(inst, 'changeMonth');
		var changeYear = this._get(inst, 'changeYear');
		var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
		var html = '<div class="ui-datepicker-title">';
		var monthHtml = '';
		// month selection
		if (secondary || !changeMonth)
			monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span> ';
		else {
			var inMinYear = (minDate && minDate.getFullYear() == drawYear);
			var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
			monthHtml += '<select class="ui-datepicker-month" ' +
				'onchange="DP_jQuery.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' +
				'onclick="DP_jQuery.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
			 	'>';
			for (var month = 0; month < 12; month++) {
				if ((!inMinYear || month >= minDate.getMonth()) &&
						(!inMaxYear || month <= maxDate.getMonth()))
					monthHtml += '<option value="' + month + '"' +
						(month == drawMonth ? ' selected="selected"' : '') +
						'>' + monthNamesShort[month] + '</option>';
			}
			monthHtml += '</select>';
		}
		if (!showMonthAfterYear)
			html += monthHtml + ((secondary || changeMonth || changeYear) && (!(changeMonth && changeYear)) ? '&#xa0;' : '');
		// year selection
		if (secondary || !changeYear)
			html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
		else {
			// determine range of years to display
			var years = this._get(inst, 'yearRange').split(':');
			var year = 0;
			var endYear = 0;
			if (years.length != 2) {
				year = drawYear - 10;
				endYear = drawYear + 10;
			} else if (years[0].charAt(0) == '+' || years[0].charAt(0) == '-') {
				year = drawYear + parseInt(years[0], 10);
				endYear = drawYear + parseInt(years[1], 10);
			} else {
				year = parseInt(years[0], 10);
				endYear = parseInt(years[1], 10);
			}
			year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
			endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
			html += '<select class="ui-datepicker-year" ' +
				'onchange="DP_jQuery.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' +
				'onclick="DP_jQuery.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
				'>';
			for (; year <= endYear; year++) {
				html += '<option value="' + year + '"' +
					(year == drawYear ? ' selected="selected"' : '') +
					'>' + year + '</option>';
			}
			html += '</select>';
		}
		if (showMonthAfterYear)
			html += (secondary || changeMonth || changeYear ? '&#xa0;' : '') + monthHtml;
		html += '</div>'; // Close datepicker_header
		return html;
	},

	/* Adjust one of the date sub-fields. */
	_adjustInstDate: function(inst, offset, period) {
		var year = inst.drawYear + (period == 'Y' ? offset : 0);
		var month = inst.drawMonth + (period == 'M' ? offset : 0);
		var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
			(period == 'D' ? offset : 0);
		var date = this._daylightSavingAdjust(new Date(year, month, day));
		// ensure it is within the bounds set
		var minDate = this._getMinMaxDate(inst, 'min', true);
		var maxDate = this._getMinMaxDate(inst, 'max');
		date = (minDate && date < minDate ? minDate : date);
		date = (maxDate && date > maxDate ? maxDate : date);
		inst.selectedDay = date.getDate();
		inst.drawMonth = inst.selectedMonth = date.getMonth();
		inst.drawYear = inst.selectedYear = date.getFullYear();
		if (period == 'M' || period == 'Y')
			this._notifyChange(inst);
	},

	/* Notify change of month/year. */
	_notifyChange: function(inst) {
		var onChange = this._get(inst, 'onChangeMonthYear');
		if (onChange)
			onChange.apply((inst.input ? inst.input[0] : null),
				[inst.selectedYear, inst.selectedMonth + 1, inst]);
	},

	/* Determine the number of months to show. */
	_getNumberOfMonths: function(inst) {
		var numMonths = this._get(inst, 'numberOfMonths');
		return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
	},

	/* Determine the current maximum date - ensure no time components are set - may be overridden for a range. */
	_getMinMaxDate: function(inst, minMax, checkRange) {
		var date = this._determineDate(this._get(inst, minMax + 'Date'), null);
		return (!checkRange || !inst.rangeStart ? date :
			(!date || inst.rangeStart > date ? inst.rangeStart : date));
	},

	/* Find the number of days in a given month. */
	_getDaysInMonth: function(year, month) {
		return 32 - new Date(year, month, 32).getDate();
	},

	/* Find the day of the week of the first of a month. */
	_getFirstDayOfMonth: function(year, month) {
		return new Date(year, month, 1).getDay();
	},

	/* Determines if we should allow a "next/prev" month display change. */
	_canAdjustMonth: function(inst, offset, curYear, curMonth) {
		var numMonths = this._getNumberOfMonths(inst);
		var date = this._daylightSavingAdjust(new Date(
			curYear, curMonth + (offset < 0 ? offset : numMonths[1]), 1));
		if (offset < 0)
			date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
		return this._isInRange(inst, date);
	},

	/* Is the given date in the accepted range? */
	_isInRange: function(inst, date) {
		// during range selection, use minimum of selected date and range start
		var newMinDate = (!inst.rangeStart ? null : this._daylightSavingAdjust(
			new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay)));
		newMinDate = (newMinDate && inst.rangeStart < newMinDate ? inst.rangeStart : newMinDate);
		var minDate = newMinDate || this._getMinMaxDate(inst, 'min');
		var maxDate = this._getMinMaxDate(inst, 'max');
		return ((!minDate || date >= minDate) && (!maxDate || date <= maxDate));
	},

	/* Provide the configuration settings for formatting/parsing. */
	_getFormatConfig: function(inst) {
		var shortYearCutoff = this._get(inst, 'shortYearCutoff');
		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
			new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
		return {shortYearCutoff: shortYearCutoff,
			dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
			monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
	},

	/* Format the given date for display. */
	_formatDate: function(inst, day, month, year) {
		if (!day) {
			inst.currentDay = inst.selectedDay;
			inst.currentMonth = inst.selectedMonth;
			inst.currentYear = inst.selectedYear;
		}
		var date = (day ? (typeof day == 'object' ? day :
			this._daylightSavingAdjust(new Date(year, month, day))) :
			this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
		return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
	}
});

/* jQuery extend now ignores nulls! */
function extendRemove(target, props) {
	$.extend(target, props);
	for (var name in props)
		if (props[name] == null || props[name] == undefined)
			target[name] = props[name];
	return target;
};

/* Determine whether an object is an array. */
function isArray(a) {
	return (a && (($.browser.safari && typeof a == 'object' && a.length) ||
		(a.constructor && a.constructor.toString().match(/\Array\(\)/))));
};

/* Invoke the datepicker functionality.
   @param  options  string - a command, optionally followed by additional parameters or
                    Object - settings for attaching new datepicker functionality
   @return  jQuery object */
$.fn.datepicker = function(options){

	/* Initialise the date picker. */
	if (!$.datepicker.initialized) {
		$(document).mousedown($.datepicker._checkExternalClick).
			find('body').append($.datepicker.dpDiv);
		$.datepicker.initialized = true;
	}

	var otherArgs = Array.prototype.slice.call(arguments, 1);
	if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate'))
		return $.datepicker['_' + options + 'Datepicker'].
			apply($.datepicker, [this[0]].concat(otherArgs));
	if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
		return $.datepicker['_' + options + 'Datepicker'].
			apply($.datepicker, [this[0]].concat(otherArgs));
	return this.each(function() {
		typeof options == 'string' ?
			$.datepicker['_' + options + 'Datepicker'].
				apply($.datepicker, [this].concat(otherArgs)) :
			$.datepicker._attachDatepicker(this, options);
	});
};

$.datepicker = new Datepicker(); // singleton instance
$.datepicker.initialized = false;
$.datepicker.uuid = new Date().getTime();
$.datepicker.version = "1.7.2";

// Workaround for #4055
// Add another global to avoid noConflict issues with inline event handlers
window.DP_jQuery = $;

})(jQuery);


/*
Script: JSON.js

JSON encoder / decoder:	
	This object uses good practices to encode/decode quikly and a bit safer(*) every kind of JSON compatible variable.
	
	(*) Please read more about JSON and Ajax JavaScript Hijacking problems, <http://www.fortifysoftware.com/advisory.jsp>
	
	To download last version of this script use this link: <http://www.devpro.it/code/149.html>

Version:
	1.3b - modified toDate method, now compatible with milliseconds time too (time or milliseconds/1000)

Compatibility:
	FireFox - Version 1, 1.5, 2 and 3 (FireFox uses secure code evaluation)
	Internet Explorer - Version 5, 5.5, 6 and 7
	Opera - 8 and 9 (probably 7 too)
	Safari - Version 2 (probably 1 too)
	Konqueror - Version 3 or greater

Dependencies:
	<JSONError.js>

Credits:
	- JSON site for safe RegExp and generic JSON informations, <http://www.json.org/>
	- kenta for safe evaluation idea, <http://mykenta.blogspot.com/>

Author:
	Andrea Giammarchi, <http://www.3site.eu>

License:
	>Copyright (C) 2007 Andrea Giammarchi - www.3site.eu
	>	
	>Permission is hereby granted, free of charge,
	>to any person obtaining a copy of this software and associated
	>documentation files (the "Software"),
	>to deal in the Software without restriction,
	>including without limitation the rights to use, copy, modify, merge,
	>publish, distribute, sublicense, and/or sell copies of the Software,
	>and to permit persons to whom the Software is furnished to do so,
	>subject to the following conditions:
	>
	>The above copyright notice and this permission notice shall be included
	>in all copies or substantial portions of the Software.
	>
	>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
	>INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
	>FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
	>IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
	>DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
	>ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
	>OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

/*
Object: JSON
	Stand alone or prototyped encode, decode or toDate public methods.

Example:
	>alert(JSON.encode([0,1,false,true,null,[2,3],{"some":"value"}]));
	>// [0,1,false,true,null,[2,3],{"some":"value"}]
	>
	>alert(JSON.decode('[0,1,false,true,null,[2,3],{"some":"value"}]'))
	>// 0,1,false,true,,2,3,[object Object]
*/
JSON = new function(){

	/* Section: Methods - Public */
	
	/*
	Method: decode
		decodes a valid JSON encoded string.
	
	Arguments:
		[String / Function] - Optional JSON string to decode or a filter function if method is a String prototype.
		[Function] - Optional filter function if first argument is a JSON string and this method is not a String prototype.
	
	Returns:
		Object - Generic JavaScript variable or undefined
	
	Example [Basic]:
		>var	arr = JSON.decode('[1,2,3]');
		>alert(arr);	// 1,2,3
		>
		>arr = JSON.decode('[1,2,3]', function(key, value){return key * value});
		>alert(arr);	// 0,2,6
	
	Example [Prototype]:
		>String.prototype.parseJSON = JSON.decode;
		>
		>alert('[1,2,3]'.parseJSON());	// 1,2,3
		>
		>try {
		>	alert('[1,2,3]'.parseJSON(function(key, value){return key * value}));
		>	// 0,2,6
		>}
		>catch(e) {
		>	alert(e.message);
		>}
	
	Note:
		Internet Explorer 5 and other old browsers should use a different regular expression to check if a JSON string is valid or not.
		This old browsers dedicated RegExp is not safe as native version is but it required for compatibility.
	*/
	this.decode = function(){
		var	filter, result, self, tmp;
		if($$("toString")) {
			switch(arguments.length){
				case	2:
					self = arguments[0];
					filter = arguments[1];
					break;
				case	1:
					if($[typeof arguments[0]](arguments[0]) === Function) {
						self = this;
						filter = arguments[0];
					}
					else
						self = arguments[0];
					break;
				default:
					self = this;
					break;
			};
			if(rc.test(self)){
				try{
					result = e("(".concat(self, ")"));
					if(filter && result !== null && (tmp = $[typeof result](result)) && (tmp === Array || tmp === Object)){
						for(self in result)
							result[self] = v(self, result) ? filter(self, result[self]) : result[self];
					}
				}
				catch(z){}
			}
			else {
				throw new JSONError("bad data");
			}
		};
		return result;
	};
	
	/*
	Method: encode
		encode a generic JavaScript variable into a valid JSON string.
	
	Arguments:
		[Object] - Optional generic JavaScript variable to encode if method is not an Object prototype.
	
	Returns:
		String - Valid JSON string or undefined
	
	Example [Basic]:
		>var	s = JSON.encode([1,2,3]);
		>alert(s);	// [1,2,3]
	
	Example [Prototype]:
		>Object.prototype.toJSONString = JSON.encode;
		>
		>alert([1,2,3].toJSONString());	// [1,2,3]
	*/
	this.encode = function(){
		var	self = arguments.length ? arguments[0] : this,
			result, tmp;
		if(self === null)
			result = "null";
		else if(self !== undefined && (tmp = $[typeof self](self))) {
			switch(tmp){
				case	Array:
					result = [];
					for(var	i = 0, j = 0, k = self.length; j < k; j++) {
						if(self[j] !== undefined && (tmp = JSON.encode(self[j])))
							result[i++] = tmp;
					};
					result = "[".concat(result.join(","), "]");
					break;
				case	Boolean:
					result = String(self);
					break;
				case	Date:
					result = '"'.concat(self.getFullYear(), '-', d(self.getMonth() + 1), '-', d(self.getDate()), 'T', d(self.getHours()), ':', d(self.getMinutes()), ':', d(self.getSeconds()), '"');
					break;
				case	Function:
					break;
				case	Number:
					result = isFinite(self) ? String(self) : "null";
					break;
				case	String:
					result = '"'.concat(self.replace(rs, s).replace(ru, u), '"');
					break;
				default:
					var	i = 0, key;
					result = [];
					for(key in self) {
						if(self[key] !== undefined && (tmp = JSON.encode(self[key])))
							result[i++] = '"'.concat(key.replace(rs, s).replace(ru, u), '":', tmp);
					};
					result = "{".concat(result.join(","), "}");
					break;
			}
		};
		return result;
	};
	
	/*
	Method: toDate
		transforms a JSON encoded Date string into a native Date object.
	
	Arguments:
		[String/Number] - Optional JSON Date string or server time if this method is not a String prototype. Server time should be an integer, based on seconds since 1970/01/01 or milliseconds / 1000 since 1970/01/01.
	
	Returns:
		Date - Date object or undefined if string is not a valid Date
	
	Example [Basic]:
		>var	serverDate = JSON.toDate("2007-04-05T08:36:46");
		>alert(serverDate.getMonth());	// 3 (months start from 0)
	
	Example [Prototype]:
		>String.prototype.parseDate = JSON.toDate;
		>
		>alert("2007-04-05T08:36:46".parseDate().getDate());	// 5
	
	Example [Server Time]:
		>var	phpServerDate = JSON.toDate(<?php echo time(); ?>);
		>var	csServerDate = JSON.toDate(<%=(DateTime.Now.Ticks/10000-62135596800000)%>/1000);
	
	Example [Server Time Prototype]:
		>Number.prototype.parseDate = JSON.toDate;
		>var	phpServerDate = (<?php echo time(); ?>).parseDate();
		>var	csServerDate = (<%=(DateTime.Now.Ticks/10000-62135596800000)%>/1000).parseDate();
	
	Note:
		This method accepts an integer or numeric string too to mantain compatibility with generic server side time() function.
		You can convert quickly mtime, ctime, time and other time based values.
		With languages that supports milliseconds you can send total milliseconds / 1000 (time is set as time * 1000)
	*/
	this.toDate = function(){
		var	self = arguments.length ? arguments[0] : this,
			result;
		if(rd.test(self)){
			result = new Date;
			result.setHours(i(self, 11, 2));
			result.setMinutes(i(self, 14, 2));
			result.setSeconds(i(self, 17, 2));
			result.setMonth(i(self, 5, 2) - 1);
			result.setDate(i(self, 8, 2));
			result.setFullYear(i(self, 0, 4));
		}
		else if(rt.test(self))
			result = new Date(self * 1000);
		return result;
	};
	
	/* Section: Properties - Private */
	
	/*
	Property: Private
	
	List:
		Object - 'c' - a dictionary with useful keys / values for fast encode convertion
		Function - 'd' - returns decimal string rappresentation of a number ("14", "03", etc)
		Function - 'e' - safe and native code evaulation
		Function - 'i' - returns integer from string ("01" => 1, "15" => 15, etc)
		Array - 'p' - a list with different "0" strings for fast special chars escape convertion
		RegExp - 'rc' - regular expression to check JSON strings (different for IE5 or old browsers and new one)
		RegExp - 'rd' - regular expression to check a JSON Date string
		RegExp - 'rs' - regular expression to check string chars to modify using c (char) values
		RegExp - 'rt' - regular expression to check integer numeric string (for toDate time version evaluation)
		RegExp - 'ru' - regular expression to check string chars to escape using "\u" prefix
		Function - 's' - returns escaped string adding "\\" char as prefix ("\\" => "\\\\", etc.)
		Function - 'u' - returns escaped string, modifyng special chars using "\uNNNN" notation
		Function - 'v' - returns boolean value to skip object methods or prototyped parameters (length, others), used for optional decode filter function
		Function - '$' - returns object constructor if it was not cracked (someVar = {}; someVar.constructor = String <= ignore them)
		Function - '$$' - returns boolean value to check native Array and Object constructors before convertion
	*/
	var	c = {"\b":"b","\t":"t","\n":"n","\f":"f","\r":"r",'"':'"',"\\":"\\","/":"/"},
		d = function(n){return n<10?"0".concat(n):n},
		e = function(c,f,e){e=eval;delete eval;if(typeof eval==="undefined")eval=e;f=eval(""+c);eval=e;return f},
		i = function(e,p,l){return 1*e.substr(p,l)},
		p = ["","000","00","0",""],
		rc = null,
		rd = /^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/,
		rs = /(\x5c|\x2F|\x22|[\x0c-\x0d]|[\x08-\x0a])/g,
		rt = /^([0-9]+|[0-9]+[,\.][0-9]{1,3})$/,
		ru = /([\x00-\x07]|\x0b|[\x0e-\x1f])/g,
		s = function(i,d){return "\\".concat(c[d])},
		u = function(i,d){
			var	n=d.charCodeAt(0).toString(16);
			return "\\u".concat(p[n.length],n)
		},
		v = function(k,v){return $[typeof result](result)!==Function&&(v.hasOwnProperty?v.hasOwnProperty(k):v.constructor.prototype[k]!==v[k])},
		$ = {
			"boolean":function(){return Boolean},
			"function":function(){return Function},
			"number":function(){return Number},
			"object":function(o){return o instanceof o.constructor?o.constructor:null},
			"string":function(){return String},
			"undefined":function(){return null}
		},
		$$ = function(m){
			function $(c,t){t=c[m];delete c[m];try{e(c)}catch(z){c[m]=t;return 1}};
			return $(Array)&&$(Object)
		};
	try{rc=new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}
	catch(z){rc=/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/}
};

/*
Script: JSONError.js

Dedicated JSON Error object:
        

Version:
        1.0 - Too much simple to be unstable ;)

Compatibility:
        FireFox - Version 1, 1.5, 2 and 3 (FireFox uses secure code evaluation)
        Internet Explorer - Version 5, 5.5, 6 and 7
        Opera - 8 and 9 (probably 7 too)
        Safari - Version 2 (probably 1 too)
        Konqueror - Version 3 or greater

Author:
        Andrea Giammarchi, <http://www.3site.eu>

License:
        >Copyright (C) 2007 Andrea Giammarchi - www.3site.eu
        >       
        >Permission is hereby granted, free of charge,
        >to any person obtaining a copy of this software and associated
        >documentation files (the "Software"),
        >to deal in the Software without restriction,
        >including without limitation the rights to use, copy, modify, merge,
        >publish, distribute, sublicense, and/or sell copies of the Software,
        >and to permit persons to whom the Software is furnished to do so,
        >subject to the following conditions:
        >
        >The above copyright notice and this permission notice shall be included
        >in all copies or substantial portions of the Software.
        >
        >THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
        >INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        >FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
        >IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
        >DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
        >ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
        >OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

/*
Object: JSONError
        Extends object Error

Example:
        >try{
        >       throw new JSONError("bad data");
        >}
        >catch(e) {
        >       alert(e);
        >       // JSONError: bad data
        >}
*/
function JSONError(message){

        /* Section: Properties - Public */
        
        /*
        Property: message
                String - Error message or empty string
        */
        this.message = message || "";
        
        /*
        Property: name
                String - object name: JSONError
        */
        this.name = "JSONError";
};
JSONError.prototype = new Error;

/**
 * Объект, обеспечивающий привязку к jQuery-коллекции тултипа с подсказкой
 */
(function($) {
	var inToolTip = false;
	var inLink = false;
	var hideTimer;
	var showTimer;
	var hideTimeout = 100;
	var showTimeout = 300;
	var beginHide = function() {
		window.clearTimeout(showTimer);
		hideTimer = window.setTimeout(function() {
			if (!(inToolTip || inLink)) {
				$('#lardiTooltip').hide();
			}
		}, hideTimeout);
	};
	var beginShow = function() {
		window.clearTimeout(hideTimer);
		showTimer = window.setTimeout(function() {
			if (inToolTip || inLink) {
				$('#lardiTooltip').show();
			}
		}, showTimeout);
	};
	var getLardiTooltip = function() {
		var res = $('#lardiTooltip');
		if (res.size() == 0) {
			$('body').append('<div id="lardiTooltip"></div>');
			res = $('#lardiTooltip').
				bind('mouseover', function(){ 
					inToolTip = true; 
					clearTimeout(hideTimer);
				}).
				bind('mouseout',  function(){ 
					inToolTip = false; 
					beginHide();
				});
		}
		return res;
	};
	$.setLardiTooltipOptions = function(options) {
		if (options instanceof Object) {
			if (options.showTimeout || options.showTimeout === 0) {
				showTimeout = options.showTimeout;
			}
			if (options.hideTimeout || options.hideTimeout === 0) {
				hideTimeout = options.hideTimeout;
			}
		}
	};
	$.fn.lardiTooltip = function(text, options)
	{  
		$.setLardiTooltipOptions(options);
		return this.bind('mouseover', function(e){
			inLink = true; 
			getLardiTooltip().html(text);
			$('#lardiTooltip').positionateToMouse(e);
			beginShow();
		})
		.bind('mouseout', function(){
			inLink = false; 
			beginHide();
		});
//		.bind('mousemove', function(e) {
//			$('#lardiTooltip').positionateToMouse(e);
//		});
	};
})(jQuery);

/**
 * объект для редактирования документов пользователя
 * @author valera
 */

MyDocuments = (function($) {
	var docCmdUrl = "/log/mydocuments/ajax";
	var myDocsListUrl = "/log/mydocuments";
	
	/**
	 * Функция инициализации редактора документа
	 */
	var initDocumentEditor = (function(){
		
		var fileUploaderSelr = null;
		var acceptFileTypesLine = "image/jpg,image/jpeg,image/png,image/gif";
		var _currDocId = null;
		var pageIdAtrrname = null;
		var docPagePrevContId = null;
		var delPageBtnClass = null;
		var inserCodeContId = null;
		var pagePrevContClass = null;
		var socBlockContId = null;
		var socBlockSwitcherId = null;
		var socBlockHeaderId = null;
		var switcherIcons = {};
		var socBlockIsShown = true;	
		var refreshAfterInit = false;
		var ajaxManager = null;
		
		//обновление обработчиков события удаления страницы
		var refreshPageDelButtons = function() {
			$('.' + delPageBtnClass).unbind().click(function(){
				var pageId = $(this).attr(pageIdAtrrname);
				if (pageId) {
					doOperation("deletePage", 
						{ 
							pageId: pageId
						});
				}
			});
		};
		
		//обновление предпросмотра страниц
		var parsePages = function(pagesData) {
			if (pagesData instanceof Array) {
				var pagesHtml = "";
				for (var iPageData in pagesData) {
					var pageData = pagesData[iPageData];
					pagesHtml += 
						'<div class="' + pagePrevContClass + '" style="background-image: url(\'' + pageData.url + '\');">' + 
							'<img ' + pageIdAtrrname + '="' + pageData.id + '"' +
								' class="' + delPageBtnClass + '" title="Удалить"' +
								' src="/tpl/jsp/images/filters_del.png" />' + 
						'</div>';
				}
				pagesHtml += '<div style="float: none; clear: both;"></div>';
				$('#' + docPagePrevContId).html(pagesHtml).show();
				refreshPageDelButtons();
			}
		};
		
		var refreshPages = function() {
			doOperation("refreshPages");
		};
		
		var doOperation = function(operation,  data, callback) {
			if (data == null) {
				data = {};
			}
			data.docId = _currDocId;
			ajaxManager.doOperation(operation, data, 
				function(data) {
					if (callback instanceof Function) {
						callback(data);
					}
					parsePages(data.pagesData);
				}, 
				null, '#' + docPagePrevContId);
		};
		
		var initEdit = function() {
			$(fileUploaderSelr).fileuploader({
				fileAccept: acceptFileTypesLine,
				//инициализируем загрузчик файлов
				uploadEndFun: function(id,fileName) {
					//после загрузки файла создаем из него страницу документа
					doOperation("addPage", 
						{ 
							tmpFileName: fileName
						}, 
						function(data) {
							$('#uploadStatusLine' + id).remove();
						});
				}
			});
			refreshPageDelButtons();
			if (refreshAfterInit) {
				refreshPages();
			}
		};	
		
		var initSocBlock = function() {
			//показ/скрытие социального блока
			if (socBlockSwitcherId) {
				$('#' + socBlockSwitcherId).click(function() {
					if (socBlockIsShown) {
						$('#' + socBlockSwitcherId).attr('src', switcherIcons.show).attr('alt', '+');
						$('#' + socBlockContId).hide();
						$('#' + socBlockHeaderId).css('margin-bottom', '20px');
					} else {
						$('#' + socBlockSwitcherId).attr('src', switcherIcons.hide).attr('alt', '-');
						$('#' + socBlockContId).show();
						$('#' + socBlockHeaderId).css('margin-bottom', '2px');
					}
					socBlockIsShown = !socBlockIsShown;
				});
			}
			//выбор содержимого контейнера с кодом при клике
			if(inserCodeContId) {
				$('#' + inserCodeContId).click(function() {
					$(this).focus().select();
				});
			}
		};
	
		var parseOptions = function (options) {
			if (options != null) {
				if (options.fileUploaderSelr) {
					fileUploaderSelr = options.fileUploaderSelr;
				}
				if (options.docPagePrevContId) {
					docPagePrevContId = options.docPagePrevContId;
				}
				if (options.delPageBtnClass) {
					delPageBtnClass = options.delPageBtnClass;
				}
				if (options.pageIdAtrrname) {
					pageIdAtrrname = options.pageIdAtrrname;
				}
				if (options.pagePrevContClass) {
					pagePrevContClass = options.pagePrevContClass;
				}
				if (options.inserCodeContId) {
					inserCodeContId = options.inserCodeContId;
				}
				if (options.socBlockContId) {
					socBlockContId = options.socBlockContId;
				}
				if (options.socBlockSwitcherId) {
					socBlockSwitcherId = options.socBlockSwitcherId;
				}
				if (options.switcherIconsShow) {
					switcherIcons.show = options.switcherIconsShow;
				}
				if (options.switcherIconsHide) {
					switcherIcons.hide = options.switcherIconsHide;
				}
				if (options.socBlockHeaderId) {
					socBlockHeaderId = options.socBlockHeaderId;
				}
				if (options.refreshAfterInit) {
					refreshAfterInit = options.refreshAfterInit;
				}
			}
		};
		
		return function(currDocId, options) {
			_currDocId = currDocId;
			var waitVisualizer = null;
			if (options != null) {

				if (options.waitPageImgId || options.waitPageFogId) {
					waitVisualizer = new WaitVisualizer(options.waitPageImgId, 
						options.waitPageFogId, true);
				}
			}
			ajaxManager = new AjaxManager(docCmdUrl, waitVisualizer);
			parseOptions(options);
			initEdit();
			initSocBlock();
			return { refreshPages : refreshPages };
		};
	})();
	
	
	
	/**
	 * Функция инициализации обработки списка документов
	 */
	var initDocList = (function(){
	
		var docIdAtrrName = null;
		var documentsContainerId = null;
		var addFoldBtnId = null;
		var confirmBtnId = null;
		var cancelBtnId = null;
		var editorContId = null;
		var editPopup = null;
		var editorTextboxId = null;
		var editShowBtnSelr = null;
		var folderIdAttrName = null;
		var itemNameAttrName = null;
		var foldRowIdPrefix = null;
		var itemNameContainerSubselector = null;
		var itemNameColumnSubselector = null;
		var deleteSelItemsBtnId = null;
		var selDocsCbxClass = null;
		var selFoldersCbxClass = null;
		var noDocsInfoBlockId = null;
		var docEditUrlPrefix = null;
		var ajaxManager = null;
		var OPENED_FOLDERS_COOKIE_NAME = 'mydocs.openedFolders';
		var OPEDED_FOLDERS_COOKIE_EXPIRED_HOURS = 24 * 7;
		
		var parseOptions = function (options) {
			if (options != null) {
				if (options.addFoldBtnId) {
					addFoldBtnId = options.addFoldBtnId;
				}
				if (options.docIdAtrrName) {
					docIdAtrrName = options.docIdAtrrName;
				}
				if (options.docNameAttrName) {
					docNameAttrName = options.docNameAttrName;
				}
				if (options.documentsContainerId) {
					documentsContainerId = options.documentsContainerId;
				}
				if (options.confirmBtnId) {
					confirmBtnId = options.confirmBtnId;
				}
				if (options.cancelBtnId) {
					cancelBtnId = options.cancelBtnId;
				}
				if (options.editorContId) {
					editorContId = options.editorContId;
				}
				if (options.editorTextboxId) {
					editorTextboxId = options.editorTextboxId;
				}
				if (options.editShowBtnSelr) {
					editShowBtnSelr = options.editShowBtnSelr;
				}
				if (options.folderIdAttrName) {
					folderIdAttrName = options.folderIdAttrName;
				}
				if (options.itemNameAttrName) {
					itemNameAttrName = options.itemNameAttrName;
				}
				if (options.foldRowIdPrefix) {
					foldRowIdPrefix = options.foldRowIdPrefix;
				}
				if (options.itemNameColumnSubselector) {
					itemNameColumnSubselector = options.itemNameColumnSubselector;
				}
				if (options.itemNameContainerSubselector) {
					itemNameContainerSubselector = options.itemNameContainerSubselector;
				}
				if (options.deleteSelItemsBtnId) {
					deleteSelItemsBtnId = options.deleteSelItemsBtnId;
				}
				if (options.selDocsCbxClass) {
					selDocsCbxClass = options.selDocsCbxClass;
				}
				if (options.selFoldersCbxClass) {
					selFoldersCbxClass = options.selFoldersCbxClass;
				}
				if (options.noDocsInfoBlockId) {
					noDocsInfoBlockId = options.noDocsInfoBlockId;
				}
				if (options.docEditUrlPrefix) {
					docEditUrlPrefix = options.docEditUrlPrefix;
				}
			}
		};
		
		var getDocItemHtml = function(docId, name, pagesCount, foldId, accessLevel, docViewUrl) {
			var rootFoldClass = '';
			if (foldId) {
				rootFoldClass = ' class="child-of-myDocsFolderItem' + foldId + '"';
			}
			var res = 
				'<tr id="myDocsDocItem' + docId + '"' + rootFoldClass + '>' + 
					'<td class="myDocumentsItemsDeleteCol">' + 
						'<input class="mydocsDocitemDelCbx" type="checkbox" ' + 
							'docid="' + docId + '" ' + itemNameAttrName + '="' + name + '" />	' +
					'</td>' + 
					'<td class="myDocumentsItemsNameCol"><div><div></div><div class="mydocsLablCont"><div>' + 
						'<img src="/tpl/jsp/images/document.png" class="mydocsDocFoldIcoImg" />' + 
						' <a href="' + docEditUrlPrefix + docId + '">' + name + '</a>' + 
					'</div></div></div></td>' + 
					'<td class="myDocumentsItemsCountCol">' + 
						'<a href="' + docViewUrl + '" target="_blank">' + 
							pagesCount + 
						'</a>' + 
					'</td>' + 
					'<td class="myDocumentsAccessLevCol">' + accessLevel + '</td>' + 
				'</tr>';
			return res;
		};
		
		var getFolderItemHtml = function(folderId, name, docsCount) {
			var res = 
				'<tr id="myDocsFolderItem' + folderId + '">' + 
					'<td class="myDocumentsItemsDeleteCol">';
			if (docsCount == 0) {
				res += '<input class="mydocsFolderItemDelCbx" type="checkbox" ' + 
					'foldid="' + folderId + '" ' + itemNameAttrName + '="' + name + '" />	';	
			}
			res += '</td>' + 
					'<td class="myDocumentsItemsNameCol"><div><div></div><div class="mydocsLablCont"><div>' + 
						'<img src="/tpl/jsp/images/folder.png" class="mydocsDocFoldIcoImg" />' + 
						' <span class="myDocsFolderEdit" foldid="' + folderId + '">' + name + '</span>' + 
					'</div></div></div></td>' + 
					'<td class="myDocumentsItemsCountCol">' + 
						'<img class="mydocsFoldEditImg" foldid="' + folderId + '" ' + 
							itemNameAttrName + '="' + name + '"  src="/tpl/jsp/images/edit.png" />' + 
					'</td>' + 
					'<td class="myDocumentsAccessLevCol"></td>' + 
			'</tr>';
			return res;
		};
		
		var parseFolders = function(foldersData) {
			var docsHtml = "";
			if (foldersData instanceof Array) {
				for (var iFold in foldersData) {
					var folderData = foldersData[iFold];
					docsHtml += getFolderItemHtml(folderData.id, folderData.name, folderData.docsCount);
					docsHtml += parseDocuments(folderData.documentsData, folderData.id);
				}
			}
			return docsHtml;
		};
		
		var parseDocuments = function(documentsData, foldId) {
			var foldsHtml = "";
			if (documentsData instanceof Array) {
				for (var iDoc in documentsData) {
					var docData = documentsData[iDoc];
					foldsHtml += getDocItemHtml(docData.id, docData.name, docData.pagesCount, foldId, 
						docData.accessLevel, docData.docViewUrl);
				}
			}
			return foldsHtml;
		};
		
		var parseRoot = function(data) {
			var htmlCode = parseFolders(data.foldersData);
			htmlCode += parseDocuments(data.documentsData);
			$('#' + documentsContainerId + ' tbody').html(htmlCode);
			refreshFolderTreeControls();
			if (htmlCode.length > 0) {
				$('#' + documentsContainerId).show();
				$('#' + deleteSelItemsBtnId).show();
				$('#' + noDocsInfoBlockId).hide();
			} else {
				$('#' + documentsContainerId).hide();
				$('#' + deleteSelItemsBtnId).hide();
				$('#' + noDocsInfoBlockId).show();
			}
		};
		
		var sendListCommand = function(operation, params) {
			ajaxManager.doOperation(operation, params, parseRoot, null, '#' + documentsContainerId);
		};
		
		var refresFolderEditBtns = function() 
		{
			editPopup = new Submenu(editShowBtnSelr, editorContId, null, null, 
				Submenu.POS_LEFTTOP, -247, 0, false, function() {
					var folderId = this.getAttribute(folderIdAttrName);
					$('#' + editorTextboxId)
						.val(this.getAttribute(itemNameAttrName))
						.data(folderIdAttrName, folderId);
					var width = $('#' + foldRowIdPrefix + folderId + 
						itemNameColumnSubselector).width();
					var offset = $('#myDocsFolderItem' + folderId + 
						itemNameContainerSubselector).offset();
					$('#' + editorContId).css({width: width, left: offset.left});
					document.getElementById(editorTextboxId).focus();
				});
		};
		
		var initFolderAddBtn = function() {
			$('#' + addFoldBtnId).click(function() {
				cancelFolderEdit();
				var foldName = prompt("Введите имя создаваемой папки: ");
				if (foldName || foldName == "0") {
					var params = {folderName: foldName};
					sendListCommand('addFolder', params);
				} else {
					if (foldName != null) {
						alert("Вы не можете добавить папку с пустым именем!");
					}
				}
			});
		};
		
		var deleteSelItems = function() {
			var folderIdsLine = "";
			var docIdsLine = "";
			$('.' + selFoldersCbxClass + ':checked').each(function(i) {
				if (folderIdsLine != '') {
					folderIdsLine += ",";
				}
				folderIdsLine += this.getAttribute(folderIdAttrName);
			});
			$('.' + selDocsCbxClass + ':checked').each(function(i) {
				if (docIdsLine != '') {
					docIdsLine += ",";
				}
				docIdsLine += this.getAttribute(docIdAtrrName);
			});
			if (folderIdsLine != "" || docIdsLine != "") {
				var params = {docIds: docIdsLine, foldIds: folderIdsLine};
				sendListCommand('deleteItems', params);
			} else {
				alert("Не выбран ни один элемент (документ или папка)!");
			}
		};
		
		var initDelSelItemsBtn = function() {
			$('#' + deleteSelItemsBtnId).click(function() {
				deleteSelItems();
			});
		};

		var saveFolder = function() {
			editPopup.hide();
			var textBox = $('#' + editorTextboxId);
			var newName = $.trim(textBox.val());
			if (!newName && newName != '0') {
				alert("Папка не может иметь пустое имя!");
				return;
			}
			var params = {
				folderId: textBox.data(folderIdAttrName), 
				folderName: newName
			};
			sendListCommand('editFolder', params);
		};
		
		var cancelFolderEdit = function() {
			editPopup.hide();
		};
		
		var initFolderEditor = function() {
			$('#' + confirmBtnId).click(saveFolder);
			$('#' + cancelBtnId).click(cancelFolderEdit);
			var handlers = {
				13: saveFolder
			};
			handlers[27 + window.KEY_CODE_SHIFT] = cancelFolderEdit;
			$('#' + editorTextboxId).addKeyHandler(handlers);
		};
		
		var checkExpandedFolders = function() {
			var idsLine = $.cookie(OPENED_FOLDERS_COOKIE_NAME);
			if (idsLine) {
				idsLine = '#' + foldRowIdPrefix + idsLine;
				$(idsLine.replace(/\,/g, ',#' + foldRowIdPrefix)).expand();
			}
		};
		
		var findExpandedFolders = function() {
			var expandedFoldersSelr = "";
			$('#' + documentsContainerId + ' tr.expanded').each(function(pos, row) {
				if (expandedFoldersSelr.length > 0) {
					expandedFoldersSelr += ',';
				}
				var rowId = row.getAttribute("id");
				expandedFoldersSelr += rowId.replace(foldRowIdPrefix, '');
			});
			var expired = new Date();
			expired.setTime(expired.getTime() + 
				OPEDED_FOLDERS_COOKIE_EXPIRED_HOURS * 3600 * 1000);
			$.cookie(OPENED_FOLDERS_COOKIE_NAME, expandedFoldersSelr, 
				{ expires: expired, path: '/'});
		};
		
		var refreshFolderTreeControls = function() {
			$('#' + documentsContainerId).treeTable({
				clickableNodeNames: true, 
				afterCollapse: findExpandedFolders,
				afterExpand: findExpandedFolders, 
				treeColumn: 1
			});
			checkExpandedFolders();
			refresFolderEditBtns();
		};
		
		return function(options) {
			var waitVisualizer = null;
			if (options != null && options.waitPageImgId) {
				waitVisualizer = new WaitVisualizerSimple(options.waitPageImgId);
			}			
			ajaxManager = new AjaxManager(docCmdUrl, waitVisualizer);
			parseOptions(options);
			initFolderEditor();
			sendListCommand('refreshFolders');
			initFolderAddBtn();
			initDelSelItemsBtn();
		};
	
	})();
	
	/**
	 * Функция инициализации обработчиков просмотра документа
	 */
	var initDocumentView = (function(options) {

		var previewImgSelr = null;
		var prevImgSizeLine = null;
		var pageViewImgId = null;
		var previeContCurrClass = null;
		var previeContClass = null;
		var _currDocId = null;		
		var ajaxManager = null;		
		var currPageSrcPrev = null;
		var waitPageImgId = null;
		var waitPageFogId = null;
		
		var parseOptions = function (options) {
			if (options != null) {
				if (options.previewImgSelr) {
					previewImgSelr = options.previewImgSelr;
				}
				if (options.prevImgSizeLine) {
					prevImgSizeLine = options.prevImgSizeLine;
				}
				if (options.pageViewImgId) {
					pageViewImgId = options.pageViewImgId;
				}
				if (options.previeContCurrClass) {
					previeContCurrClass = options.previeContCurrClass;
				}
				if (options.previeContClass) {
					previeContClass = options.previeContClass;
				}
				if (options.waitPageImgId) {
					waitPageImgId = options.waitPageImgId;
				}
				if (options.waitPageFogId) {
					waitPageFogId = options.waitPageFogId;
				}
			}
		};
		
		var initCurrDocDeleting = function() {
			MyDocuments.deleteCurrDoc = function() {
				if(confirm('Вы уверены, что хотите удалить данный документ?')) 
				{
					ajaxManager.doOperation('deleteDocument', {docId: _currDocId, notSendDocs: "true"}, 
						function() {
							window.location = myDocsListUrl;
						}, null, window);
				}
			};
		};
		
		var initSelectPageBtns = function() {
			$(previewImgSelr).click(function() {
				//показываем полную картинку страницы
				var src = $(this).attr('src');
				if (src == currPageSrcPrev) {
					return;
				}
				currPageSrcPrev = src;
				srcView = src.replace(prevImgSizeLine, "s800x600");
				srcFull = src.replace(prevImgSizeLine, "");
				$('#' + pageViewImgId).attr('src', srcView);
				$('#' + pageViewImgId).parent().attr('href', srcFull);
				//указываем текущую страницу в предпросмотре
				$('.' + previeContClass).removeClass(previeContCurrClass);
				$(this).parent().addClass(previeContCurrClass);
				$('#' + pageViewImgId).showWait(waitPageImgId, waitPageFogId, 0.5);
			});
			$('#' + pageViewImgId).bind('load', function() {
				$('#' + waitPageImgId).hide();
				$('#' + waitPageFogId).hide();
			});
		};
		
		return function(currDocId, options) {
			_currDocId = currDocId;
			var waitVisualizer = null;
			if (options != null) {

				if (options.waitPageImgId || options.waitPageFogId) {
					waitVisualizer = new WaitVisualizer(options.waitPageImgId, 
						options.waitPageFogId, true);
				}
			}			
			ajaxManager = new AjaxManager(docCmdUrl, waitVisualizer);
			parseOptions(options);
			initSelectPageBtns();
			initCurrDocDeleting();
		};
	})();	
	
	return {
		initEditing: initDocumentEditor, 
		initList: initDocList, 
		initView: initDocumentView
	};
	
})(jQuery);

var globalGTSel=false;

function selectAllGT(){
	if (globalGTSel){
		$("#gtsearch_result_table").find('input').removeAttr('checked');
		globalGTSel=false;
	} else {
	 	$("#gtsearch_result_table").find('input').attr('checked', 'checked');
	 	globalGTSel=true;
	}
	return true;
}

function printSearchGruz() {
	var line = "";
	$('input:checkbox:checked').each(function(i) {
		var s = $(this).attr("name");
		var res = s.substring(6);
		res = res.substring(0,res.indexOf(']'));
		if (line=="") {
			line+=res;
		} else {
			line+=","+res;
		}
		window.open('/gruz/print.jsp?ids='+line,'print_gruz');
	});
	return false;
}

function printSearchTrans() {
	var line = "";
	$('input:checkbox:checked').each(function(i) {
		var s = $(this).attr("name");
		var res = s.substring(6);
		res = res.substring(0,res.indexOf(']'));
		if (line=="") {
			line+=res;
		} else {
			line+=","+res;
		}
		window.open('/trans/print.jsp?ids='+line,'print_trans');
	});
	return false;
}

//===================================\\
//									 \\
//     МОИ ГРУЗЫ И ТРАНСПОРТ         \\
//                                   \\
//===================================\\
//Слайдинг
function slideSetCookie (name, value, expires, path, domain, secure) {
      document.cookie = name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
};
function slideGruz() {
	if ($("#panelGruz").css('display')=="none") {
		slideSetCookie('lardi_slideGruz','false','','/','');
	} else {
		slideSetCookie('lardi_slideGruz','true','','/','');
	}
	$("#panelGruz").slideToggle("normal");
	$("#slideDownG").toggle();
	$("#slideUpG").toggle();
	return false;
};
function slideTrans() {
	if ($("#panelTrans").css('display')=="none") {
		slideSetCookie('lardi_slideTrans','false','','/','');
	} else {
		slideSetCookie('lardi_slideTrans','true','','/','');
	}
	$("#panelTrans").slideToggle("normal");
	$("#slideDownT").toggle();
	$("#slideUpT").toggle();
	return false;
};
function slideFilt() {
	$("#slideUpF").toggle();
	$("#slideDownF").toggle();
	$("#panelFilt").slideToggle("normal");	
	if ($("#slideUpF").css('display')=="none") {
		slideSetCookie('lardi_slideFilt','false','','/','');
	} else {
		slideSetCookie('lardi_slideFilt','true','','/','');
	}
	
	return false;
};
function slideTrash() {
	if ($("#panelTrash").css('display')=="none") {
		slideSetCookie('lardi_slideTrash','false','','/','');
	} else {
		slideSetCookie('lardi_slideTrash','true','','/','');
	}
	$("#panelTrash").slideToggle("normal");
	$("#slideDownTr").toggle();
	$("#slideUpTr").toggle();
	return false;
};
var globalGruz=false;
var globalTrans=false;
//Подбор предложения
function podborPredl() {
    var list = null, res1 = "", res2="", link="";
    list = $(':checkbox:checked');
    if (list.length>0){
	    res1 = list[0].name;
	    var posG=res1.indexOf("gruz");
	    var posT=res1.indexOf("trans");
    	if (posG!=-1) {
			res2=res1.substring(res1.indexOf(".")+1);
			link="/log/filter.php?vid=1&gid="+res2;
		} else if (posT!=-1) {
			res2=res1.substring(res1.indexOf(".")+1);
			link="/log/filter.php?vid=2&gid="+res2;
		}
		var winAtts;
		winAtts = 'scrollbars, menubar, width=1024 height=500';
		newWindow = window.open(link,"_blank",winAtts);
	    return true;
	    }
    return false;
}
//Выбор всех чекбоксов			
function selectAllGruz(){
	if (globalGruz){
		$("#idGruzTable").find('input:visible').removeAttr('checked');
		globalGruz=false;
	} else {
	 	$("#idGruzTable").find('input:visible').attr('checked', 'checked');
		globalGruz=true;
	}
	return true;
}
			
function selectAllTrans(){
	if (globalTrans){
		$("#idTransTable").find('input:visible').removeAttr('checked');
		globalTrans=false;
	} else {
	   	$("#idTransTable").find('input:visible').attr('checked', 'checked');
	  	globalTrans=true;
	}
	return true;
}

function selectAllTransTrash(id){
	if (globalTrans){
		$(id).find('input').removeAttr('checked');
		globalTrans=false;
	} else {
	   	$(id).find('input').attr('checked', true);
	  	globalTrans=true;
	}
	return true;
}

function selectAllGruzTrash(id){
	if (globalTrans){
		$(id).find('input').removeAttr('checked');
		globalTrans=false;
	} else {
	   	$(id).find('input').attr('checked', true);
	  	globalTrans=true;
	}
	return true;
}

//
var numberFilterAvalible = [46, 8, 9, 37, 39, 188, 110, 16, 36, 35, 191, 13];
function numberFilter(event){
	if (!isAvalibleNumberChar(event.keyCode)){
		event.preventDefault();
	}
}
function isAvalibleNumberChar(c){
	for (var i=0; i<numberFilterAvalible.length; i++){
		if (numberFilterAvalible[i]==c){
			return true;
		}
	}
	if (c >= 48 && c <= 57 ) {
		return true;
	}
	if (c >= 96 && c <= 105 ) {
		return true;
	}
	return false;
}
function saveViewContactState(){
	var value = $('#viewContactSel').val();
	$.cookie('mygt_viewContact',value);
}

function saveViewContactStateUserGT(){
	var value = $('#viewContactSel').val();
	$.cookie('gt_viewContact',value);
}

function changeViewContact() {
	var value = $('#viewContactSel').val();
	$('#idTransTable .sort-tbody tr').each(function() {
		var cid = $(this).attr("contactid");

		if (value == -1) {
			$(this).show();
		} else {
			if (cid != value) {
				$(this).hide();
			} else {
				$(this).show();
			}
		}

	});
	$('#idGruzTable .sort-tbody tr').each(function() {
		var cid = $(this).attr("contactid");
		if (value == -1) {
			$(this).show();
		} else {
			if (cid != value) {
				$(this).hide();
			} else {
				$(this).show();
			}
		}
	});
}
function changeViewAjax(url,cid,callback){
	var index = $('#gruztransTypeView').val();
	$.cookie('mygt_viewType',index);
	
	var currentContact = -1;
	
	if(cid != null){
		currentContact = cid;
	}else{
		currentContact = $('#viewContactSel').val();
		if(currentContact == null){
			currentContact = -1;
		}	
	}
	
	if(index==0){
		$('#changeViewContactTD')
		.load(url+currentContact,function(){
			
			if(callback!=null){
				callback();
			}
		});
		$('#transContainer').show();
		$('#gruzContainer').show();
	}
	
	if(index==1){
		$('#changeViewContactTD')
		.load(url+currentContact+'&viewType=1',function(){
			if(callback!=null){
				callback();
			}
			
		});
		$('#transContainer').hide();
		$('#gruzContainer').show();
	}
	
	if(index==2){
		$('#changeViewContactTD')
		.load(url+currentContact+'&viewType=2',function(){
			if(callback!=null){
				callback();
			}
			
		});
		$('#transContainer').show();
		$('#gruzContainer').hide();
	}
}

function changeView(cid,callback){
	changeViewAjax('/log/mygruztrans/light/light_viewbox_ajax.jsp?contactId=',cid,callback);
}
function changeViewUserGruzTrans(uid,cid,callback){
	changeViewAjax('/user2/gt_viewbox_contacts_part.jsp?uid='+uid+'&contactId=',cid,callback);
}
//------------Дополнительные действия------------------
var myGTAdditActions = (function ($) {

		var selGruzes;
		var selTranses;
		var getMonth = function(val) {
			return get2DigVal(val + 1);
		};
		var get2DigVal = function(val) {
			if (val < 10) {
				val = '0' + val;
			}
			return val;
		};
		var today = new Date();
		today = get2DigVal(today.getDate()) + '.' + 
			getMonth(today.getMonth()) + '.' + today.getFullYear();
		var fillGTItems = function(array, src) {
			$.each(src, function(i, el) {
				if (el.hasAttribute('name')) {
					var val = el.getAttribute('name').replace(/\w+\./, '');
					if (parseInt(val) != NaN) {
						array.push(val);
					}
				}
			});
		};
		var setGTs = function() {
			selGruzes = [];
			selTranses = [];
			fillGTItems(selGruzes, $('#idGruzTable tbody tr td input:checkbox[checked]'));
			fillGTItems(selTranses, $('#idTransTable tbody tr td input:checkbox[checked]'));
			if (selGruzes.length + selTranses.length == 0) {
				alert('Не выбран ни один груз и ни один транспорт!');
				return false;
			}
			return true;
		};
		var doOperation = function(target, data, callBack) {
			var _data = {
				gruz: selGruzes, 
				trans: selTranses, 
				//method: 'change_gt', 
				target: target
			};
			for (var iPar in data) {
				_data[iPar] = data[iPar];
			}
			$('.gtWaitOtherActImg').show();
			$.ajax({
				url: '/log/mygruztrans/light/ajax', 
				data: _data, 
				dataType: 'json', 
				success: function(answer) {
					if (answer.status == 'success') {
						if (callBack instanceof Function) {
							callBack(answer); 
						}
						myGruzTrans.reload();
					} else {
						alert(answer.status);
					}
					$('.gtWaitOtherActImg').hide();
				}
			});
		};
		var init = function() {
			
			var actsMenu = new Submenu('.bAdditActs', 'cAdditActs', null, 
				null, Submenu.POS_LEFTBOTTOM, -2, 0, true);
			$('#bChangeGTDate').click(function() {
				if (setGTs()) {
					$('#setDateForm').modal();
					document.getElementById('gtSetDates').focus();
					$('#gt_date_from').datepicker().val(today);
					$('#gt_date_to').datepicker();
				}
			});
			$('#bChangeGTContact').click(function() {
				if (setGTs()) {
					$('#setContactForm').modal({
						maxHeight: 320, 
						minWidth: 330
					});
				}
			});
			$.ajaxSetup({
				error: function() {
					alert('Произошла ошибка! Попробуйте снова.');
					$('.gtWaitOtherActImg').hide();
				}
			});
			$('#gtSetDates').click(function() {
				var dateFrom = $('#gt_date_from').val();
				var dateTo = $('#gt_date_to').val();
				var rightDate = true;
				var dateFromDate = $('#gt_date_from').datepicker("getDate");
				var dateToDate = $('#gt_date_to').datepicker("getDate");
				if (dateFromDate == null) {
					alert('Начальная дата не задана!');
					rightDate = false;
				} else { 
					dateFromDate.setHours(23, 59, 59, 999);
					if (dateFromDate < new Date()) {
						alert('Начальная дата меньше текущей!');
						rightDate = false;
					}
					if (dateToDate != null) {
						dateToDate.setHours(23, 59, 59, 999);
						if (dateToDate && dateToDate < new Date()) {
							alert('Конечная дата меньше текущей!');
							rightDate = false;
						}
						if (dateToDate < dateFromDate) {
							alert('Конечная дата меньше начальной!');
							rightDate = false;
						}
					}
				}
				if (rightDate) {
					doOperation('dates', {
						dateFrom: dateFrom, 
						dateTo: dateTo
					});
					$.modal.close();
				}
			});
			$('#gtCancelDates').click(function() {
				$.modal.close();
			});
			$('.contact_item_button').click(function() {
				doOperation('contact', {
					contactId: this.getAttribute('value')
				});
				$.modal.close();
			});
		};
		return {
			init: init
		};
})(jQuery);


GTTrashLoader = (function() {
	
	var currPage = {};
	var ajaxUrl = "/log/mygruztrans/ajax/trash"; 
	var isLoading = {};
	var buttonsSelectors = {};
	var waitImagesSelectors = {};
	var rowsContainersSelectors = {};
	var gruzTarg = 'gruz';
	var transTarg = 'trans';
	var ajaxManager;
	
	function init(options) {
		buttonsSelectors[gruzTarg] = '#' + options.moreGruzId + " span";
		buttonsSelectors[transTarg] = '#' + options.moreTransId + " span";
		waitImagesSelectors[gruzTarg] = '#' + options.moreGruzId + options.waitContSubselr;
		waitImagesSelectors[transTarg] = '#' + options.moreTransId + options.waitContSubselr;
		rowsContainersSelectors[gruzTarg] = options.gruzContSelr;
		rowsContainersSelectors[transTarg] = options.moreTransSelr;
		initButton(gruzTarg);
		initButton(transTarg);
		var waitVisualizer = null;
		if (options.waitFogId || options.waitIcoId) {
			waitVisualizer = new WaitVisualizer(options.waitIcoId, 
				options.waitFogId, true);
		}
		ajaxManager = new AjaxManager(ajaxUrl, waitVisualizer);	
	}
	
	function initButton(targ) {
		$(buttonsSelectors[targ]).click(function() {
			if (!isLoading[targ]) {
//				$(waitImagesSelectors[targ]).show();
				isLoading[targ] = true;
				load(rowsContainersSelectors[targ], targ, function(showButton) {
					if (!showButton) {
						$(buttonsSelectors[targ]).hide();
					}
					isLoading[targ] = false;
//					$(waitImagesSelectors[targ]).hide();
				});
			}
		});
	}
	
	function load(contSelector, target, callback) {
		if (currPage[target] == null) {
			currPage[target] = 1;
		}
		ajaxManager.doOperation("getPredlRows", {
			page : currPage[target], 
			targ : target
		}, function(data) {
			$(contSelector).append(data.rows);
			if (data.showButton) {
				currPage[target]++;
			}
			if (callback instanceof Function) {
				callback(data.showButton);
			}
		}, 
		null, waitImagesSelectors[target]);
	}
	
	return {
		init: init, 
		reload: function(target, callback) {
			currPage[target] = 0;
			$(buttonsSelectors[target]).show();
			$(rowsContainersSelectors[target]).html('');
			load(rowsContainersSelectors[target], target, callback);
		},
		resetPagesCounter: function(target) { 
			currPage[target] = 1; 
			$(buttonsSelectors[target]).show();
		}, 
		getGruzTarg: function() { return gruzTarg; }, 
		getTransTarg: function() { return transTarg; }
	};
})();(function($) {

	var getAllFirmsFltCode = function(count, forChose) {
		if (count == null) {
			count = '';
		} else {
			count = ' (' + count + ')';
		}
		var res = '<div class="allmynotesfirm"';
		if (!forChose) {
			res += ' firm_uid="0"';
		}
		res += '><div class="allmynotesFFAllHead">Все заметки' + count + '</div>';
		if (forChose) {
			res += '<div class="allmynotesFFAllTip">Нажмите для выбора фирмы</div>';
		}
		return res + '</div>';
	};
	
	var _notesPerPage = 20;
	var _currFirmUid = 0;
	var _waitLoading = false;
	var _paginator;
	var _firmsBlocks = {};
	var _dateFromId = null;
	var _dateToId = null;
	var _currFilter = null;
	var _cleanFilterSelector = '';

	_firmsBlocks[0] = getAllFirmsFltCode(null, true);
	
	window.mynotes = {
		init: function(params) {
			_paginator = new Paginator(_notesPerPage);
			if (params instanceof Object) {
				if (params.dateFromId != null && params.dateFromId != '') {
					_dateFromId = params.dateFromId;
					$('#' + _dateFromId).datepicker().val('');
				}
				if (params.dateToId != null && params.dateToId != '') {
					_dateToId = params.dateToId;
					$('#' + _dateToId).datepicker().val('');
				}
				_paginator.activPgsClass = params.paginActPgClass;
				_paginator.inactPgsClass = params.paginInActPgClass;
				if (params.showDlgBtnSelr != null && params.showDlgBtnSelr != '') {
					window.mynotes.initShowDlgBtn(params.showDlgBtnSelr);
				}
				if (params.filterBtnSelr != null && params.filterBtnSelr != '') {
					window.mynotes.initFilterBtn(params.filterBtnSelr);
				}
				if (params.cleanFiltBtnSelr != null && params.cleanFiltBtnSelr != '') {
					window.mynotes.initCleanFilterBtn(params.cleanFiltBtnSelr);
					_cleanFilterSelector = params.cleanFiltBtnSelr;
				}
				if (params.notesPerPage != null && 
					parseInt(params.notesPerPage) != NaN) 
				{
					_notesPerPage = parseInt(params.notesPerPage);
					_paginator.setItemsPerPage(_notesPerPage);
				}
				if (params.pageLinkHalfCount != null && 
					parseInt(params.pageLinkHalfCount) != NaN) 
				{
					_paginator.pageLinkHalfCount = parseInt(params.pageLinkHalfCount);
				}
				if (params.pagenavExtClass != null && params.pagenavExtClass != '') {
					_paginator.extClass = params.pagenavExtClass;
				}
				if (params.currPageLabelClass != null && params.currPageLabelClass != '') {
					_paginator.currPageLabelClass = params.currPageLabelClass;
				}
			}
			loadNotes();
		}, 
		initShowDlgBtn: function (selector) {
			$(selector).bind('click', showFirmSelDlg);
		}, 
		initFilterBtn: function(selector) {
			$(selector).bind('click', applyFilter);
		}, 
		initCleanFilterBtn: function(selector) {
			$(selector).bind('click', cleanFilter);
		}
	};

	var getNoteCode = function(noteData) {
		if (noteData == null) {
			return '';
		}
		var noteHtml = '<div class="allmynotesnote_cellcont">';
		noteHtml += '<div class="allmynotesnote_infocont">';
		noteHtml += '<div class="allmynotesnote_noteinfo">';
		noteHtml += '<span class="allmynotesnote_creator">';
		noteHtml += noteData.from;
		noteHtml += '</span></div>';
		if (noteData.read_only == 'false') {
			noteHtml += '<img class="allNotesDeleteImg" noteId="';
			noteHtml += noteData.note_id;
			noteHtml += '" firmTo="';
			noteHtml += noteData.firm_uid;
			noteHtml += '" src="/tpl/jsp/images/infopage/cross.png" />';
		}
		noteHtml += '<span class="allmynotesnote_createtime">';
		noteHtml += noteData.enter_date;
		noteHtml += '</span>'; 
		noteHtml += '</div><div class="allmynotesnote_textcont">';
		noteHtml += noteData.text;
		noteHtml += '</div></div>';
		return noteHtml;
	};
	
	var getFirmCode = function(uid, firmData, forChose, forFilter) {
		if (firmData == null) {
			return '';
		}
		var noteHtml = '<div class="allmynotesnote_cellcont"';
		if (forChose) {
			noteHtml += 'style="margin-top: 4px; cursor: pointer" firm_uid="' + uid + '"';
		}
		noteHtml += '><div class="allmynotesfirm_logocont"><div class="table_nobord"><div><div>';
		noteHtml += '<img class="allmynotesfirm_logo" src="';
		noteHtml += firmData.logoUrl;
		noteHtml += '" alt="logo" /></div></div></div></div>';		
		noteHtml += '<div class="allmynotesfirm_info">';
		if (forFilter || forChose) {
			noteHtml += '<span class="firm_notes_link">';
			noteHtml += firmData.name;
			noteHtml += '</span>';
		} else {
			noteHtml += '<a class="firm_notes_link" href="';
			noteHtml += firmData.profileURL;
			noteHtml += '">';
			noteHtml += firmData.name;
			noteHtml += '</a>';
		}
		noteHtml += '<div class="allmynotesfirm_adress">';
		noteHtml += firmData.address;
		noteHtml += '</div>';
		noteHtml += '<div class="allmynotesfirm_notescount">' + 
			'<span class="allmynotesfirm_notescount_line" firmUid="';
		noteHtml += uid;
		noteHtml += '">';
		noteHtml += firmData.notes_count;
		noteHtml += '</span></div></div></div>';
		return noteHtml;
	};
	
	var getNoteRowCode = function(noteData, firmUid, firmData) {
		var noteHtml = '<tr><td class="allmynotesfirm_notecell">';
		var tmp = getFirmCode(firmUid, firmData);
		_firmsBlocks[firmUid] = tmp;
		noteHtml += tmp;
		noteHtml += '</td><td class="allmynotesnote_notecell">';
		noteHtml += getNoteCode(noteData);
		noteHtml += '</td></tr><tr><td colspan="2" class="allmynotesnote_whiterow"></td></tr>';
		return noteHtml;
	};

	var setWaitLoad = function(val) {
		_waitLoading = val;
		var cleanFilterSelector = '';
		if (_cleanFilterSelector != null && _cleanFilterSelector != '') {
			cleanFilterSelector = ', ' + _cleanFilterSelector;
		}
		var pageBtns = $('.allnotesPagesNavOtherPage, .allmynotesfirm_notescount_line' + 
			cleanFilterSelector).removeClass('allnotesInactivTemp');
		if (_waitLoading) {
			pageBtns.addClass('allnotesInactivTemp');
		}
	};
	
	var parseAnswer = function(data){
		$('#allNotesLoadWait').hide();
		setWaitLoad(false);
		if (data != null && data.status == 'ok') {
			var notesHtml = '';
			_paginator.setItemsCount(data.count_full);
			_paginator.createNavigation('.allnotesPageNavigation', function(currPage) {
				loadNotes(currPage);
			});
			if (data.notes instanceof Array) {
				for (var iNote in data.notes) {
					var currNote = data.notes[iNote];
					var currFirmUid = currNote.firm_uid;
					notesHtml += getNoteRowCode(currNote, currFirmUid, 
						data.firms[currFirmUid]);
				}
			}
			$("#mynotesBodyID").html(notesHtml);
			if (notesHtml.length > 0) {
				$('#myNotesTable').show();
				$('#myNotesNoNotesInfo').hide();
			} else {
				$('#myNotesTable').hide();
				$('#myNotesNoNotesInfo').show();
			}
			$(".allNotesDeleteImg").bind('click', function() {
				$('#allNotesLoadWait').show();
				window.firmNotes.deleteNote(this.getAttribute("noteId"), 
					this.getAttribute("firmTo"), function(data) {
						$('#allNotesLoadWait').hide();
						if (data != null && data[0] != null) {
							data = data[0];
							if (data.status == 'success') {
								loadNotes(_paginator.getCurrPage());
							} else if (data.text != null) {
								alert(data.text);
							}
						} else {
							alert('Ошибка! Попробуйте снова.');
						}
				}, true);
			});	
			$('.allmynotesfirm_notescount_line').bind('click', function() {
				if (!_waitLoading) {
					setCurrFirm(this.getAttribute('firmUid'));
					applyFilter();
				}
			});
		} else {
			alert(data.status);
		}
	};
	
	var loadNotes = function(targPage, filter){
		if (_waitLoading) {
			return;
		}
		if (targPage == null) {
			targPage = 0;
		}
		if (filter != null) {
			_currFilter = filter;
		} else if (_currFilter != null) {
			filter = _currFilter;
		}
		$('#allNotesLoadWait').show();
		_paginator.setCurrPage(targPage);
		setWaitLoad(true);
		var currTime = new Date();
		var data = {method: 'getnotes', cur_page: targPage, notes_per_page: _notesPerPage, 
				rnd: currTime.getMilliseconds()};
		if (filter instanceof Object) {
			for (var iFilt in filter) {
				data[iFilt] = filter[iFilt];
			}
		}
		$.ajax({
			'url': '/log/mynotes/ajax.jsp', 
			'data': data, 
			'dataType': 'json', 
			'success': parseAnswer, 
			'error': function(jqXHR, textStatus, errorThrown) {
				$('#allNotesLoadWait').hide();
				setWaitLoad(false);
				alert("Ошибка, попробуйте снова!");
			}, 
			'type': 'GET'
		});
	};

	var setCurrFirm = function(uid){
		_currFirmUid = uid;
		$.modal.close();
		//$('#allnotes_currFirmFilter').html(_firmsBlocks[uid]);
		var cont = $('#allnotes_currFirmFilter').get(0);
		if (cont != null) {
			cont.innerHTML = _firmsBlocks[uid];
		}
		return false;
	};
	
	var showFirmSelDlg = function(){
		if (!_waitLoading) {
			$('#myDiv').modal();
			$('#mynotesfimsloaddata').html('<img src="/tpl/jsp/images/loading_small.gif">');
			var currTime = new Date();
			$.getJSON(
				'/log/mynotes/ajax.jsp',
				{method: 'getallfirms', rnd: currTime.getMilliseconds()},
				function(data){
					if (data.status != 'ok'){
						alert(data.status);
					} else {
						var tmp = getAllFirmsFltCode(data.allnotes_count, false); 
						var o = null;
						_firmsBlocks[0] = getAllFirmsFltCode(data.allnotes_count, true);
						for (var uid in data.firms) {
							_firmsBlocks[uid] = getFirmCode(uid, data.firms[uid], false, true);
							tmp += getFirmCode(uid, data.firms[uid], true);
						}
						//$('#mynotesfimsloaddata').html(tmp);
						var tmpCont = $('#mynotesfimsloaddata').get(0);
						if (tmpCont != null) {
							tmpCont.innerHTML = tmp;
						}
						$('div[firm_uid]').bind('click', function() {
							setCurrFirm(parseInt(this.getAttribute('firm_uid')));
							applyFilter();
						});
					}
				});
		}
	};
	
	var applyFilter = function() {
		var filters = {};
		var tmpDate;
		if (_dateFromId != null) {
			tmpDate = $('#' + _dateFromId).val();
			if (tmpDate != '') {
				filters['date_from'] = tmpDate;
			}
		}
		if (_dateToId != null) {
			tmpDate = $('#' + _dateToId).val();
			if (tmpDate != '') {
				filters['date_to'] = tmpDate;
			}
		}
		filters['firm_to'] = _currFirmUid;
		loadNotes(0, filters);
	};
	
	var cleanFilter = function() {
		if (!_waitLoading) {
			setCurrFirm(0);
			_currFilter = null;
			$('#' + _dateFromId).val('');
			$('#' + _dateToId).val('');
		}
	};

})(jQuery);

var myblocks=new Array();
var mypageAllWidgets=new Array();
var mypagepopup;
var mypageWidgetSelect=0;

function loadWidgetList(){
	$.getJSON('/log/mypage/ajax/', {},
		function(j){
			if (j[0]['status']!='ok'){
				alert("Ошибка при получении данных: "+j[0]['status']);
			} else {
				mypageAllWidgets = j[0]['data'];
				myblocksLoad();
			}
		}
	);
}

function mypageSaveData(){
	$('#idSave1').attr('disabled', 'disabled');
	$('#idSave2').attr('disabled', 'disabled');
	//
	var b = new Array();
	for ( var i = 1; i < 7; i++) {
		var val2="";
		for (var j=0; j<myblocks[i].length; j++){
			val2+=(val2==""?"":",")+myblocks[i][j];
		}
		b.push(val2);
	}
	$.getJSON(
		'/log/mypage/ajax/',
		{'method': 'save', 'b1': b[0], 'b2': b[1], 'b3': b[2], 'b4': b[3], 'b5': b[4], 'b6': b[5]},
		function(j){
			$('#idSave1').removeAttr('disabled');
			$('#idSave2').removeAttr('disabled');
			if (j[0]['status']=='ok'){
				$('#idMyPageApplyOk').show();
			} else {
				alert("Ошибка: "+j[0]['text']);
			}
		}
	);
	return false;
}

function mypageSaveEditingMnemoToCookie(){
	for ( var i = 1; i < 7; i++) {
		var val2="";
		for (var j=0; j<myblocks[i].length; j++){
			val2+=(val2==""?"":",")+myblocks[i][j];
		}
		$.cookie("mypage.editor.exists.widgets."+i, val2);
	}
}
function myblockParse(arrayData, id){
	for ( var i = 0; i < arrayData.length; i++) {
		myblocks[id].push(arrayData[i]['name']);
	}
}
function myblocksLoad(){
	myblocks[1]=new Array();
	myblocks[2]=new Array();
	myblocks[3]=new Array();
	myblocks[4]=new Array();
	myblocks[5]=new Array();
	myblocks[6]=new Array();

	$.getJSON(
		'/log/mypage/ajax/', {'method': 'my'},
		function(j){
			if (j[0]['status']!='ok'){
				alert(j[0]['text']);
			} else {
				myblockParse(j[0]['data'][0]['data'], 1);
				myblockParse(j[0]['data'][1]['data'], 2);
				myblockParse(j[0]['data'][2]['data'], 3);
				myblockParse(j[0]['data'][3]['data'], 4);
				myblockParse(j[0]['data'][4]['data'], 5);
				myblockParse(j[0]['data'][5]['data'], 6);
				mypageSaveEditingMnemoToCookie();
				mypageRender();
			}
		}
	);
}
function getMyPageWidget(name){
	for ( var i = 1; i < mypageAllWidgets.length; i++) {
		if (mypageAllWidgets[i]['name']==name){
			return mypageAllWidgets[i];
		}
	}
	return null;
}
function deleteBlock(block, name){
	for ( var i = 0; i < myblocks[block].length; i++) {
		if (myblocks[block][i]==name){
			myblocks[block].splice(i,1);
		}
	}
	mypageSaveEditingMnemoToCookie();
	mypageRender();
	return false;
}
function getMyPageBlock(widget, block){
	return "<table border='0' cellpadding='0' cellspacing='0' class='mypagewidget'>"
		+"<tr><td id='ca'>"+widget['title']+"</td></tr>"
		+"<Tr><td id='ra'><a onclick='return deleteBlock(\""+block+"\", \""+widget['name']+"\");' href='#'>удалить</a></td></Tr>"
    	+"</table>";
}
function mypageRenderBlock(block){
	var html="";
	for (var i=0; i<myblocks[block].length; i++){
		var w = getMyPageWidget(myblocks[block][i]);
		if (w!=null){
			html+=getMyPageBlock(w, block);
		}
	}
	$('#mypageblock'+block).html(html);
}
function mypageRender(){
	mypageRenderBlock(1);
	mypageRenderBlock(2);
	mypageRenderBlock(3);
	mypageRenderBlock(4);
	mypageRenderBlock(5);
	mypageRenderBlock(6);
}
function mypageAdd(blockID){
	var prefix="small";
	if ((blockID==3)||(blockID==6)){
		prefix="big";
	}
	mypagepopup = window.open("/log/mypage/selectone/?"+prefix,"WidgetAddWindow",
			"resizable=yes,titlebar=no,scrollbars=yes,toolbar=no,menubar=no,location=no,statusbar=no,width=640,height=480");
	mypageWidgetSelect=blockID;
	mypagepopup.focus();
	return false;
}
function setFromPopup(widget){
	myblocks[mypageWidgetSelect].push(widget);
	mypageSaveEditingMnemoToCookie();
	mypageRender();
}

function selectWidget(widgetName){
	opener.setFromPopup(widgetName);
	self.close();
}

function openDescriptionEditor(){
	mypagepopup = window.open("/log/mypage/edit_description.jsp","DescriptionEditorWindow",
		"resizable=no,titlebar=no,scrollbars=yes,toolbar=no,menubar=no,location=no,statusbar=no,width=640,height=270");
	mypagepopup.focus();
	return false;
}

////////////////////////////////////////////////////////////////////////////////////////
//Объект отображения количества новых сообщений пользователя
////////////////////////////////////////////////////////////////////////////////////////

usrNewMsgCnstCheckMessagesUrl = '/dinamix/json/user_mails';
usrNewMsgCnstMsgsBtnIcoUrlHasNewLongClass = 'topHeadCtrlLinkMsgsHasNewLong';
usrNewMsgCnstMsgsBtnIcoUrlHasNewClass = 'topHeadCtrlLinkMsgsHasNew';
usrNewMsgCnstmMsgsBtnIcoUrlHasNotNewClass = 'topHeadCtrlLinkMsgsNoNew';
usrNewMsgCnstNewMsgCntCookieName = 'newMessageCount';
usrNewMsgCnstCookieCashTimeMilis = 2 * 60 * 1000;
usrNewMsgCnstRefreshIntervalMilis	 = 2 * 60 * 1000;

userNewMessagesInit = (function() {

	var checkMessages = function() {
		var msgsCount = $.cookie(usrNewMsgCnstNewMsgCntCookieName);
		if (msgsCount == null) {
			loadMessages();
		} else {
			setNewMessCount(msgsCount);
		}
	};
	
	var setNewMessCount = function(msgsCount) {
		if (msgsCount.length > 0) {
			$("#userMessagesIconNewCount").text(msgsCount);
			if (msgsCount.length < 3) {
				$("#topHeadCtrlLinkMsgs")
					.removeClass(usrNewMsgCnstmMsgsBtnIcoUrlHasNotNewClass)
					.addClass(usrNewMsgCnstMsgsBtnIcoUrlHasNewClass);
			} else {
				$("#topHeadCtrlLinkMsgs")
					.removeClass(usrNewMsgCnstmMsgsBtnIcoUrlHasNotNewClass)
					.addClass(usrNewMsgCnstMsgsBtnIcoUrlHasNewLongClass);
			}
		} else {
			$("#userMessagesIconNewCount").text("");
			$("#topHeadCtrlLinkMsgs")
				.removeClass(usrNewMsgCnstMsgsBtnIcoUrlHasNewClass)
				.addClass(usrNewMsgCnstmMsgsBtnIcoUrlHasNotNewClass);
		}
	};
	
	var saveNewMsgCountToCookie = function(val) {
		var expired = new Date();
		expired.setTime(expired.getTime() + usrNewMsgCnstCookieCashTimeMilis);
		$.cookie(usrNewMsgCnstNewMsgCntCookieName, val, { expires: expired, path: '/'});
	};

	var loadMessages = function() {
		$.getJSON(usrNewMsgCnstCheckMessagesUrl, function(data) {
			if (data instanceof Array && data.length > 0) {
				data = data[0];
				if (data.status == "ok") {
					if (data.data != null) {
						if (data.data.count == null) {
							data.data.count = "";
						}
						saveNewMsgCountToCookie(data.data.count);
						checkMessages();
					}
				} else if (data.status == "error") {
					//checkMessagesError(data.text);
				}
			}
		});
	};
	
	return function(newMsgCount, refresh) {
		if (newMsgCount == null) {
			if (refresh) {
				loadMessages();
				return;
			} else {
				newMsgCount = "";
			}
		}
		if (newMsgCount != null) {
			setNewMessCount(newMsgCount);
		}
		if (refresh) {
			saveNewMsgCountToCookie(newMsgCount);
			setInterval(checkMessages, usrNewMsgCnstRefreshIntervalMilis);
		}
	};;
})();
////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////
//Объект работы с заметками
////////////////////////////////////////////////////////////////////////////////////////
(function () {
	var _firmTo;
	var _lastHash = 0;
	var _lastNoteIds = new Array();
	var _refreshTimer = null;
	var _userAvatar = "";
	var _userContact = "";
	var _userFirm = "";
	var _visible = false;
	//var _newNoteNotSended = '';   
	
	var URL_AJAX = '/dinamix/json/firmnotes';
	var URL_PARAM_PFX_OPERATION = "operation";
	var URL_PARAM_PFX_FIRMTO = "firmto";
	var URL_PARAM_PFX_TEXT = "text";
	var URL_PARAM_PFX_NOTEID = "noteid";
	var URL_PARAM_PFX_SEND_CHANGED = "send_changed";
	var URL_OPNAME_GET = "get";
	var URL_OPNAME_HASH = "hash";
	var URL_OPNAME_ADD = "add";
	var URL_OPNAME_DELETE = "delete";
	var REFRESH_INTERVAL_SEC = 5;
	var AVATAR_WIDTH = 60;
	var AVATAR_HEIGHT = 60;
	//var NOTES_TITLE = "Мои заметки";
	//var NOTES_TITLE_COMMENT = '(В данном блокноте можно записывать заметки о фирмах. \
	//	Заметки для чтения и редактирования будут доступны только Вам)';
	
	
	var getNoteRowCode = function(noteItemId, avatarSrc, contact, owner, created, text, newClass, 
			avatarStyle, delAttr, avatarCeilClass) 
	{
		var delImgCode = '';
		if (delAttr!= null) {
			delImgCode = '<img class="firmNotesDeleteImg"' + delAttr 
				+ ' src="/tpl/jsp/images/infopage/cross.png" />';
		}
		return '<tr class = "firmNotesItemRow"><td class = "' + avatarCeilClass 
			+ 'firmNotesItemAvatarCeil"><div id="firmNotesItemPhotoCont' + noteItemId 
			+ '" class="firmNotesItemAvatarCont"><div class="table_nobord"><div><div>'
			+ '<img id="firmNotesItemPhoto' + noteItemId + '"' + avatarStyle + ' src="' 
			+ avatarSrc + '" class="firmNotesItemAvatar" />'
			+ '</div></div></div></div></td><td class="firmNotesItemInfoCeil">'
			+ '<div id="firmNotesItemContact' + noteItemId 
			+ '" class="header2_bold firmNotesItemContact">' + contact + '</div>' 
			+ '<a id="firmNotesItemOwner' + noteItemId + '" class="firm_notes_link">' + owner + '</a>'
			+ '<div id="firmNotesItemCreated' + noteItemId + '" class="t">' + created 
			+ '</div></td><td><div id="firmNotesItemCont' + noteItemId + '" class="firmNotesItemCont">'
			+ '<div id="firmNotesItemContView' + noteItemId + '" class="' 
			+ newClass + ' firmNotesItemContView t"><div class="firmNotesItemContText">'
			+ text + '</div>' + delImgCode + '</div></div></td></tr>';
	};
	
	var getAddNoteCode = function(avatarSrc, contact, owner, avatarCeilClass) {
		return '<tr class = "firmNotesItemRow"><td class = "' + avatarCeilClass + 'firmNotesItemAvatarCeil">'
			+ '<div id="firmNotesItemPhotoContNew" class="firmNotesItemAvatarCont">'
			+ '<img id="firmNotesItemPhotoNew" src="' + avatarSrc 
			+ '" class="firmNotesItemAvatar" /></div></td><td class="firmNotesItemInfoCeil">'
			+ '<div id="firmNotesItemContactNew" class="header2_bold firmNotesItemContact">' + contact 
			+ '</div><a id="firmNotesItemOwnerNew" class="firm_notes_link">' + owner + '</a></td><td>'
			+ '<div id="firmNotesItemContNew" class="firmNotesItemCont">'
			+ '<textarea id="firmNotesItemContEditNew" class="firmNotesItemContEdit" maxlength="255"></textarea>'
			+ '<input type="button" id="firmNotesItemContAddBtnNew" class="firmNotesItemAddBtn c" value="Оставить заметку" />'
			+ '<a href="/log/mynotes">Все мои заметки</a></div></td></tr>';
	};
	
	var parseNotes = function(notes) {
		var html = "";
		var newNoteIds = new Array();
		$("#lmuiNotesCount").html('(' + notes.length + ')');
		for (var note in notes) {
			var noteItem = notes[note];
			newNoteIds.push(noteItem.id);
			var contactName = "";
			var contactAvatar = "";
			var avatarStyle;
			var avatarCeilClass = '';
			if (noteItem.avatar) {
				contactAvatar = noteItem.avatar;
				avatarStyle = '';
			} else {
				avatarStyle = ' style="display: none;"';
				avatarCeilClass = 'firmNotesItemAvatarCeilHidden ';
			}
			if (noteItem.contact != null) {
				contactName = noteItem.contact;
			}
			var newClass = '';
			if ($.inArray(noteItem.id, _lastNoteIds) == -1 && _lastNoteIds.length > 0) {
				newClass = 'firmNotesItemContViewNew';
			}
			var delAttr = null;
			if (noteItem.read_only == false) {
				delAttr = 'noteId="' + noteItem.id + '"';
			}
			html += getNoteRowCode(noteItem.id, contactAvatar, contactName, 
				noteItem.owner, noteItem.enter_date, noteItem.text, newClass, 
				avatarStyle, delAttr, avatarCeilClass);
		}	
		if (_userAvatar == null || _userAvatar == '') {
			avatarCeilClass = 'firmNotesItemAvatarCeilHidden ';
		} else {
			avatarCeilClass = '';
		}
		html = getAddNoteCode(_userAvatar, _userContact, _userFirm, avatarCeilClass) + html;
		_lastNoteIds = newNoteIds;
		var _newNoteNotSended = $("#firmNotesItemContEditNew").val();
		$("#firmNotesContainerTB").html(html);	
		$("#firmNotesItemContEditNew").val(_newNoteNotSended); 
		$("#firmNotesItemContAddBtnNew").bind('click', function() {
			addNote();
		});	
		//ограничиваем число вводимых символов до 255 
		$("#firmNotesItemContEditNew").keypress(function(e) {
			if ($(this).val().length > 255 && 
				//обрабатываем удаление и перемещение по тексту
				e.which != 8 && e.keyCode != 46 && 
				(e.keyCode < 35 || e.keyCode > 40)) 
			{
				e.preventDefault();
			}
		});
		$("#firmNotesItemContEditNew").bind("paste", function(e) {
			if ($(this).val().length > 255) 
			{
				e.preventDefault();
			}
		});
		$(".firmNotesDeleteImg").bind('click', function() {
			$("#lmuiNotesCountWaitImg").show();
			deleteNote(this.getAttribute("noteId"), _firmTo, parseAnswer);
		});	
		$(".firmNotesItemAvatarCeilHidden").hide().next("td").attr('colspan', '2').children().css('margin-left', '10px');
		$("#firm_notes_title").show();
		$("#firm_notes_title_coment").show();
		$("#firm_notes_error").text("").hide();
		$('#firmNotesItemContEditNew').bind('keypress', function(e) {
			if ((e.which == 10 || e.which == 13) && e.ctrlKey) {
				addNote();
			}
		});
		var noteEditor = $('#firmNotesItemContEditNew');
		noteEditor.scrollTop(noteEditor.get(0).scrollHeight).focus(function(){
			if (_visible) {
				$(this).setCursorPosition(this.value.length);
			}
		}).focus();
	};
	
	var parseAnswer = function(data) {
		$("#lmuiNotesCountWaitImg").hide();
		if (data != null) {
			if (data.status == 'success') {
				parseNotes(data.notes);
				if (data.hash != null) {
					_lastHash = data.hash;
				}			
			} else {
				showError(data.text);
			}
		}
	};
	
	var getOperationUrl = function(operation) {
		return URL_AJAX + '?' + URL_PARAM_PFX_OPERATION + '=' + operation + '&' + 
			URL_PARAM_PFX_FIRMTO + '=' + _firmTo;
	};
	
	var refresh = function() {
		$.getJSON(getOperationUrl(URL_OPNAME_HASH), function(data) {
			if (data != null && data.length > 0) {
				var data = data[0];
				if (data.status == 'success') {
					if (data.hash != null) {
						if (_lastHash != data.hash) {
							loadNotes(_firmTo);
						}
					}	
					$("#firm_notes_title").show();
					$("#firm_notes_title_coment").show();
					$("#firm_notes_error").text('').hide();			
				} else {
					showError(data.text);
				}
			}
		});
	};
	
	var showError = function(text) {
		$("#firm_notes_title").hide();
		$("#firm_notes_title_coment").hide();
		$("#firm_notes_error").text(text).show();
		if (text == 'Вы не авторизированы') {
			$("#firmNotesContainerTB").html('');	
			window.firmNotes.hide();
			window.location.reload();
		}
	};
	
	
	var loadNotes = function() {
		$("#lmuiNotesCountWaitImg").show();
		$.getJSON(getOperationUrl(URL_OPNAME_GET), parseAnswer);	
	};
	
	var addNote = function() {
		var text = $("#firmNotesItemContEditNew").val();
		$("#firmNotesItemContEditNew").val('');
		if (text == null || text == '') {
			alert("Нельзя добавлять пустые заметки!");
			return;
		}
		$("#lmuiNotesCountWaitImg").show();
		var data = {};
		data[URL_PARAM_PFX_OPERATION] = URL_OPNAME_ADD;
		data[URL_PARAM_PFX_FIRMTO] = _firmTo;
		data[URL_PARAM_PFX_TEXT] = text;
		data[URL_PARAM_PFX_SEND_CHANGED] = 'true';
		$.ajax({
			'url': URL_AJAX, 
			'data': data, 
			'dataType': 'json', 
			'success': parseAnswer, 
			'type': 'POST'
		});
	};
	
	var deleteNote = function(id, firmTo, parseAnswer, dontGetNotes) {
		var data = {};
		data[URL_PARAM_PFX_OPERATION] = URL_OPNAME_DELETE;
		data[URL_PARAM_PFX_FIRMTO] = firmTo;
		data[URL_PARAM_PFX_NOTEID] = id;
		if (dontGetNotes == null) {
			dontGetNotes = false;
		}
		if (parseAnswer instanceof Function && dontGetNotes == false) {
			data[URL_PARAM_PFX_SEND_CHANGED] = 'true';
		} else {
			data[URL_PARAM_PFX_SEND_CHANGED] = 'false';
		}
		$.ajax({
			'url': URL_AJAX, 
			'data': data, 
			'dataType': 'json', 
			'success': parseAnswer, 
			'type': 'POST'
		});
	};
	
	
	window.firmNotes = {
		init: function(firmTo, showNotes) {
			_firmTo = firmTo;
			_visible = false;
			loadNotes(_firmTo);
			if (showNotes == 'true') {
				window.firmNotes.show();
			}
			$("#lmuiNotesShowHide").bind('click', function() {
				window.firmNotes.toggleShow();
			});
			$("#firmNotesCloseBtn").bind('click', function() {
				window.firmNotes.hide();
			});
			$("#lmuiNotesCountWaitImg").show();
		}, 
		toggleShow: function() {
			if (_visible) {
				window.firmNotes.hide();	
			} else {
				window.firmNotes.show();			
			}
		}, 
		hide: function() {
			if (_refreshTimer != null) {
				window.clearInterval(_refreshTimer);
			}
			$("#firmNotes").slideUp('slow');
			_visible = false;	
		}, 
		show: function() {
			_refreshTimer = window.setInterval(function() {
				refresh(_firmTo);
			}, REFRESH_INTERVAL_SEC * 1000);
			$("#firmNotes").slideDown('slow');
			_visible = true;		
		}, 
		setUserInfo: function(userInfo) {
			if (userInfo != null) {
				if (userInfo.contact != null) {
					_userContact = userInfo.contact;
				}
				if (userInfo.avatar != null) {
					_userAvatar = userInfo.avatarUrl;
				}
				if (userInfo.firm != null) {
					_userFirm = userInfo.firm;
				}
			}
		}, 
		deleteNote: deleteNote
	};		
	
})();
////////////////////////////////////////////////////////////////////////////////////////
(function($){

})(jQuery);

/**
 * Объект обработки событий на странице "Мои партнеры"
 */
Partners = (function() {
	
	var startload=false;
	var starttimer=false;
	var countclick=-1;
	var timerID;
	var jqeryelement;
	var jqeryoptions;
	
	var  runMultiple=function(){
		//console.log(countclick);
		countclick-=1;
		if (countclick==-1){
			clearTimeout(timerID);
			countclick=-1;
			starttimer=false;
			load(jqeryelement, {filter: $('#filter').val()});
		};
	};
	
	
	
	$.fn.partners = function(options){
		element = this;
		jqeryelement=element;
		jqeryoptions = jQuery.extend({
				  filter: "" 
				}, options);
		//	window.clearTimeout(timerMulti);
		
		$("#filter").keyup(function(event){
			if(event.keyCode != 13 && event.keyCode != 16 && event.keyCode != 17){
				countclick=2;
				if(!starttimer){
					timerID =  window.setInterval("Partners.runMultiple();", 300);
					starttimer=true;
				}
			  }
			});
		
		load(element, options);
		
		
	};
	
	var init= function (){
	
	var noCommentClass = 'mypartners_comment';
	EditPartnerCommentDlg.init(function(uid, comment) {
			var commentCont = $('#' + idAttrPrefix + uid);
			commentCont.removeClass(noCommentClass);
			if (comment == '') {
				//comment = 'Добавить комментарий';
				commentCont.addClass(noCommentClass);
			}
			comment = comment.replace(/\n/g, "<br />");
			$('#' + idAttrPrefix + uid).html(comment);
		});
	var idAttrPrefix = 'mypartners_comment_';
	var getPartUid = function(idAttr) {
		if (idAttr) {
			return idAttr.substring(idAttrPrefix.length);
		}
	};
	$('.mypartners_comment_cell').click(function() {
		var id = $(this).children('div').attr('id');
		id = getPartUid(id);
		EditPartnerCommentDlg.showDialog(id);
	});
	};
	
	var zebra = function(table){
		table.find('tr:odd').attr('class','ui_table_lardi_odd');
		table.find('tr:even').attr('class','ui_table_lardi_even');
	};
 	 
	var load= function (element, options){
			getAllPartners(element, options.filter);
			
	};
	
	var loaddiv="<div id='loading' style='text-align:center;'><img src='/tpl/jsp/images/loading_small.gif'/></div>";
	var loadimg="<img id='loadimg' src='/tpl/jsp/images/loading_small.gif'/>";

	
	var delFromPartn = function(uid) {
		var tmp = confirm("Вы действительно хотите удалить фирму своих партнеров?");
		if (tmp) {
			$.getJSON(
				'/user2/ajax/', { 'method': 'partner.del', 'uid': uid },
				function(j){
					if (j[0]['status']=='ok'){
						window.location.reload();
					} else {
						alert(j[0]['text']);
					}
				}
			);
		}
	};
	
	var delFromPartner = function(uid) {
		var tmp = confirm("Вы действительно хотите удалить фирму своих партнеров?");
		if (tmp) {
			$.ajax({
				url: '/user2/ajax/',
				dataType: "json", 
				data: { 'method': 'partner.del', 'uid': uid } ,
				error: function(jqXHR, textStatus, errorThrown){
					status = textStatus;
					var msg =""; 
					if (jqXHR && jqXHR.responseText) {
						//msg += " "+jqXHR.status + " " + jqXHR.statusText;//+ " " +jqXHR.responseText;
						msg = "Извините, но произошла ошибка  получения данных";
					} else {
						msg = 'Произошла ошибка! Попробуйте снова позже или обратитесь в службу поддержки. ';
					}
					$("#errorblock").html(msg );
					$("#errorblock").show();
			
				}, 
			success: function(data) {
					if (data.status=='ok'){
						var tb=$('#partner'+uid).parent().parent();  
						$('#partner'+uid).remove();
						$("#mypartners_partners_count_lbl").text($("#mypartners_partners_count_lbl").text()-1);
						zebra(tb);
					} else {
						$("#errorblock").html(data.text );
						$("#errorblock").show();
					}
				}, 
			complete: function(jqXHR, textStatus){	}, 
			type: "POST"
			
			});
		}
	};
	
	var delFromPartnDisabled = function() {
		alert("Данная функция доступна только для главного контакта!");
	};
	
	
	var	getAllPartners= function(element, filter) {
		var serverUrl = '/log/partners/jax/index.jsp';
		var params={act:"load", filter: filter};
		
		if (startload) return;
		
		startload=true;
		var getParterUid = function(idAttr) {
			var idTrPrefix = 'partner';
			if (idAttr) {
				return idAttr.substring(idTrPrefix.length);
			}
		};
		 $('#trload').show();
		 element.find('tbody').find("tr:gt(0)").remove();
		 
		$.ajax({
				url: serverUrl,
				dataType: "json", 
				data: params, 
				error: function(jqXHR, textStatus, errorThrown){
						status = textStatus;
						var msg =""; 
						if (jqXHR && jqXHR.responseText) {
							//msg += " "+jqXHR.status + " " + jqXHR.statusText;//+ " " +jqXHR.responseText;
							msg = "Извините, но произошла ошибка  получения данных";
						} else {
							msg = 'Произошла ошибка! Попробуйте снова позже или обратитесь в службу поддержки. ';
						}
						$("#errorblock").html(msg );
						$("#errorblock").show();
				
				}, 
				success: function(data) {
					if (data.status!="ok"){
						$("#errorblock").html(data.status );
						$("#errorblock").show();
						return;
					}
					$("#mypartners_partners_count_lbl").text(data.count);
					$.each(data.partners, function(index, value) { 
						$(element).find('tbody').append(value.tr);
						var id=getParterUid($(value.tr).attr("id"));
						//console.log(id);
						if(window.tooltips!=undefined)
							window.tooltips.tooltipUserInfo.rebindLinks($('a[uid='+id+']'));
						
					});
					init();	
				}, 
				complete: function(jqXHR, textStatus){
					 $('#trload').hide();	
					 startload=false;
					 $("#filter").focus();
				}, 
				type: "POST"
			});
	};
	
		
	return {
		delFromPartn: delFromPartn,
		delFromPartner:delFromPartner,
		delFromPartnDisabled: delFromPartnDisabled,
		runMultiple: runMultiple,
		getAllPartners: getAllPartners
	};
})();


PartnersManager = (function($){
	
	
	var serverUrl = '/log/partners/ajax';
	
	var getComment = function(partnerUid, onSuccess, afterRequestEnd, onError) {
			ajaxManager.doOperation("getPartnerComment", 
				{partnerUid: partnerUid}, onSuccess, onError, null, null, 
				afterRequestEnd);
		};
	
	var setComment = function(partnerUid, comment, onSuccess, afterRequestEnd, onError) {
			ajaxManager.doOperation("setPartnerComment", 
				{partnerUid: partnerUid, comment: comment}, 
				onSuccess, onError, null, null, afterRequestEnd);
		};
		
	var init = function(options) {
		var waitVisualizer = null;
		if (options) {
			waitVisualizer = new WaitVisualizer(options.waitPageImgId, 
				options.waitPageFogId);
			waitVisualizer.setWaitContSelector(options.containerSelr);
		}
		ajaxManager = new AjaxManager(serverUrl, waitVisualizer);
	};
	
	return {
		init: init, 
		getComment: getComment, 
		setComment: setComment
	};
	
}(jQuery));

var EditPartnerCommentDlg = function ($) {
	
	var _partnerUid = 0;
	
	var dlgCode = 
		'<div id="editPartnerCommentDlg">' + 
			'<div id="editPartnerCommentDlgTitle">' + 
				'Редактирование примечания' + 
				'<img src="/tpl/jsp/images/loading_small.gif" id="editPartnerCommentDlgWaitImg" />' + 
			'</div>' + 
			'<textarea  id="editPartnerCommentDlgValue"></textarea>' + 
			'<input type="button" class="c" id="editPartnerCommentDlgSaveBtn" value="Сохранить" />' + 
			'<input type="button" class="c" id="editPartnerCommentDlgCancelBtn" value="Отмена" />' + 
		'</div>';
	
	var addDialog = function() {
		$('body').append(dlgCode);
	};
	
	
	var init = function(onSuccess) {
		PartnersManager.init();
		$('#editPartnerCommentDlgCancelBtn').click(function() {
			$.modal.close();
		});
		$('#editPartnerCommentDlgSaveBtn').click(function() {
			if (_partnerUid != 0) {
				var comment = $('#editPartnerCommentDlgValue').val();
				comment = comment.replace(/^\s+/, '').replace(/\s+$/, '');
				showWait();
				PartnersManager.setComment(_partnerUid, comment, function(data) {
						$('#editPartnerCommentDlgValue').val(data.comment);
						if (onSuccess instanceof Function) {
							onSuccess(data.partnerUid, data.comment);
						}
						$.modal.close();
					}, hideWait);
			} else {
				alert("Не найден партнер для добавления комментария!");
				$.modal.close();
			}
		});
	};
	
	var showDialog = function(partnerUid) {
		$('#editPartnerCommentDlg').modal();
		showWait();
		PartnersManager.getComment(partnerUid, function(data) {
				$('#editPartnerCommentDlgValue').val(data.comment);
				_partnerUid = data.partnerUid;
			}, hideWait);
	};
	
	var hideWait = function(status, data) {
		$('#editPartnerCommentDlgWaitImg').hide();
		lockDlg(false);
		if (status != 'success') {
			$.modal.close();
		}
	};
	
	var showWait = function() {
		$('#editPartnerCommentDlgWaitImg').show();
		lockDlg(true);
	};	
	
	var lockDlg = function(lock) {
		if (lock == null) {
			lock = true;
		}
		if (lock) {
			$('#editPartnerCommentDlgValue').attr('disabled', 'disabled');
			$('#editPartnerCommentDlgSaveBtn').attr('disabled', 'disabled');
			$('#editPartnerCommentDlgCancelBtn').attr('disabled', 'disabled');
		} else {
			$('#editPartnerCommentDlgValue').attr('disabled', null);
			$('#editPartnerCommentDlgSaveBtn').attr('disabled', null);
			$('#editPartnerCommentDlgCancelBtn').attr('disabled', null);
		}
	};
	
	return {
		init: init, 
		showDialog: showDialog,
		addDialog:addDialog
	};
	
}(jQuery);


ChangeName = (function(){
	var init = function(nqfPrefixes) {
		var showQuotesForQN = function(currVal) {
			var isNQFPrefix = false;
			for (var tmpPrefixNo in nqfPrefixes) {
				var tmpPrefix = nqfPrefixes[tmpPrefixNo];
				if (currVal == tmpPrefix) {
					isNQFPrefix = true;
					break;
				}
			}
			if (isNQFPrefix) {
				$(".regisration_quotes").hide();
			} else {
				$(".regisration_quotes").show();
			}
		};
		$(document).ready(function() {
			$('#profile_changename_sokr').change(function () {
				showQuotesForQN($(this).val());
			});
			showQuotesForQN($('#profile_changename_sokr').val());
		});
	};
	return {
		init: init
	};
})();


/**
 * Объект для работы формы регистрации
 */
Registration = (function($){
	var _areas = {};
	var _lastAreaId = 0;
	var _nqfPrefixes = [];
	if (isNaN(_lastAreaId)) {
		_lastAreaId = 0;
	} else {
		_lastAreaId = parseInt(_lastAreaId);
	}
	 var doCheckPassStrong = function(InputID, OutputID){
		var pass=$("#"+InputID).val();
		if ( pass.length<6){
			$("#"+OutputID).html("");
		} else {
			var i=0;
			if (/[0-9]/.test(pass)) i++;
			if (/[a-z]/.test(pass)) i++;
			if (/[A-Z]/.test(pass)) i++;
			if (/[\,\.;\'\[\]\/\\ ]/.test(pass)) i++;
			switch (i){
			case 0:
				$("#"+OutputID).html("слабый");
				$("#"+OutputID).css('color', "#f40000");
				break;
			case 1:
				$("#"+OutputID).html("низкий");
				$("#"+OutputID).css('color', "#d99100");
				break;
			case 2:
				$("#"+OutputID).html("средний");
				$("#"+OutputID).css('color', "#b6c100");
				break;
			case 3:
				$("#"+OutputID).html("высокий");
				$("#"+OutputID).css('color', "#00a000");
				break;
			case 4:
				$("#"+OutputID).html("отлчино");
				$("#"+OutputID).css('color', "#00a000");
				break;
			}
		}
	};
	var changeAreas = function () {
        var areasSelect = $("#areafrom").html('');
        var sel_array1 = _areas[$("#countryfrom").val()];
        if (sel_array1 != null) {
            var htmlOptions = '';
            htmlOptions = '<option';
            if (_lastAreaId == 0) {
            	htmlOptions += ' selected="selected"';
            }
            htmlOptions += '></option>';
            for (var c in sel_array1) {
            	var selected = "";
            	if (_lastAreaId == c) {
            		selected += ' selected="selected"';
            	}
            	htmlOptions += '<option value="' + c + '"' + selected + '>' + 
            		sel_array1 [c] + '</option>';
            }
            areasSelect.html(htmlOptions).get(0).disabled = false;
        } else {
        	areasSelect.html('<option>любая обл.</option>').get(0).disabled = true;
        }
	};
	var checkPassEq = function() {
		var res = false;
		if ($("#passwd").val() === $("#passwd2").val()) {
			res = true;
			$("#errPassesNeq").hide();
		} else {
			$("#errPassesNeq").show();
		}
		return res;
	};
	var checkCountryAndArea = function() {
		var selCountry = $('#countryfrom').val();
		var res = true;
		if (!selCountry) {
			$('#errMsgNoCountrySelected').show();
			res = false;
		} else {
			$('#errMsgNoCountrySelected').hide();
			var selArea = $('#areafrom').val();
			if (_areas[selCountry] != null && 
				_areas[selCountry][selArea] == null) 
			{
				$('#errMsgNoAreaSelected').show();
				res = false;
			} else {
				$('#errMsgNoAreaSelected').hide();
			}
		}
		return res;
	};
	var showQuotesForQN = function(currVal) {
		var isNQFPrefix = false;
		for (var tmpPrefixNo in _nqfPrefixes) {
			var tmpPrefix = _nqfPrefixes[tmpPrefixNo];
			if (currVal == tmpPrefix) {
				isNQFPrefix = true;
				break;
			}
		}
		if (isNQFPrefix) {
			$(".regisration_quotes").hide();
		} else {
			$(".regisration_quotes").show();
		}
	};
	var init = function(areas, lastAreaId, nqfPrefixes) {
		_areas = areas;
		_lastAreaId = lastAreaId;
		_nqfPrefixes = nqfPrefixes;
		$("#countryfrom").bind('change', changeAreas);
		changeAreas();
		$("#passwd").bind('keyup', function() {
			doCheckPassStrong('passwd', 'strongID');
		});
		$("#passwd2").bind('keyup', checkPassEq);
		$("#submit").bind('click', function(e) {
			var cancel = checkCountryAndArea();
			cancel &= checkPassEq();
			if (!cancel) {
				e.preventDefault();
			}
		});
		$('#areafrom').bind('change', checkCountryAndArea);
		$('#countryfrom').bind('change', checkCountryAndArea);
		$('#registration_name_sokr').change(function () {
			showQuotesForQN($(this).val());
		});
		showQuotesForQN($('#registration_name_sokr').val());
	};		
	
	return {
		init: init
	};
})(jQuery);

function isEmailValid(email){
	var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; 
	return emailPattern.test(email);  
};

$(function(){
	$("#email").blur(function(){
		var email = $(this).val();
		if(!isEmailValid(email)){
			$('#emailError').lardiTooltip('Email содержит недопустимые символы').show();
		}else{
			$('#emailError').hide();
		}
	});
});












/**
 * Объект для работы формы регистрации
 */
Registration2 = (function($){
	var _areas = {};
	var _lastAreaId = 0;
	var _nqfPrefixes = [];
	if (isNaN(_lastAreaId)) {
		_lastAreaId = 0;
	} else {
		_lastAreaId = parseInt(_lastAreaId);
	}
	 var doCheckPassStrong = function(InputID, OutputID){
		var pass=$("#"+InputID).val();
		if (pass!=null&&pass.length<6){
			$("#"+OutputID).html("");
			$("#pass_protection").hide();
		} else {
			var i=0;
			if (/[0-9]/.test(pass)) i++;
			if (/[a-z]/.test(pass)) i++;
			if (/[A-Z]/.test(pass)) i++;
			if (/[\,\.;\'\[\]\/\\ ]/.test(pass)) i++;
			switch (i){
			case 0:
				$("#"+OutputID).html("слабый");
				$("#"+OutputID).css('color', "#f40000");
				break;
			case 1:
				$("#"+OutputID).html("низкий");
				$("#"+OutputID).css('color', "#d99100");
				break;
			case 2:
				$("#"+OutputID).html("средний");
				$("#"+OutputID).css('color', "#b6c100");
				break;
			case 3:
				$("#"+OutputID).html("высокий");
				$("#"+OutputID).css('color', "#00a000");
				break;
			case 4:
				$("#"+OutputID).html("отлчино");
				$("#"+OutputID).css('color', "#00a000");
				break;
			}
			$("#pass_protection").show();
		}
	};
	var curlogin="";
	var logerror=false;
	
	var loginFree = function () {
		var login = $("#login").val();
		var templogin = $.trim(login);
		
		if(templogin == null || templogin==''||!isLoginValid(templogin)){
			$("#freelog").removeClass();
			$("#login").removeClass("bordererror");
			$("#freelog").html("");
			logerror=false;
			return;
		 };
		
		if (curlogin!=templogin&&isLoginValid(templogin)){
			$("#login").addClass("loading");
			$.ajax({
				type: "POST",
				 url:"/ajax/index.jsp",
				 data:({"action":"inv_con_use_login", "login":login}),
				 dataType:"json",
				 success: function(data) {
					 $("#login").removeClass("loading");
					 //invContact.loginBuf = login;
					 //$("#strongLogin").css("display","none");
				if(data.jres_status=='ok'){
					logerror=false;
					$("#login").removeClass("bordererror");
					$("#freelog").removeClass();
					$("#freelog").addClass("t_green");
					$("#freelog").html(data.jres_data);
				}else{
					if(data.jres_status=='login_duplicated'){
						$("#login").addClass("bordererror");
						$("#freelog").removeClass();
						$("#freelog").addClass("error");
						$("#freelog").html(data.message);
						logerror=true;
						//$("#error_login").html(data.message);
						//invContact.errLogMess = $("#strongLogin").text(data.message);
					};
				}
				curlogin=templogin;
			},
		error: function(data) {
			$("#login").removeClass("loading");
			$("#freelog").removeClass();
			$("#freelog").addClass("error");
			$("#freelog").html("Ошибка доступа к базе данных");
			}
		});
		} 
		else{
			//$("#error_login").html("");
			//if (login.length>0){
			//	$("#strongLogin").css("color","maroon");
			//	$("#strongLogin").html("Задайте логин");
			//}
			//else{}
		};
	};
	
	
	var  changeStarArea=function() {
		 var sel_array1 = _areas[$("#countrySIGN").val()];
	        if (sel_array1 != null) {
	        	$("#area_errorstar").show();
	        }
	        else{
	        	$("#area_errorstar").hide();
	        }
	};
	
	var fieldCanBee="Заполните поле";
	var emailNotValid="E-mail указан неправильно";
	var loginNotValid="Логин указан неправильно";
	var passNotValid="Введите правильно пароль";
	var agreeNotValid= "Чтобы завершить регистрацию, необходимо принять условия пользовательского соглашения ";
	
	
	var inputFieldCanBee=function(id, checkempty) {
		var val=$("#"+id).val();

		if (checkempty &&( val == null || val=='')){
			$("#error_"+id).html(fieldCanBee);
			$("#"+id).addClass("bordererror");
		return false;
		} else{
			$("#error_"+id).html("");
			$("#"+id).removeClass("bordererror");
			return true;
		};
	};
	
	var inputCaptchaCanBee=function(checkempty) {
		var val=$("#captcha").val();
		if (checkempty &&( val == null || val=='')){
			$("#error_captcha").html(fieldCanBee);
			$("#blockcaptcha").addClass("bordererror");
		return false;
		} else{
			$("#error_captcha").html("");
			$("#blockcaptcha").removeClass("bordererror");
			return true;
		};
	};
	
	var checkPhone=function(id, checkempty) {
		var val=$("#"+id).val();
		//if((checkempty && (val == null || val==''))  || (checkempty&&(val == null || val==''|| !isPhoneValid(val)))){
		if(checkempty &&(val == null || val==''||!isPhoneValid(val))){
			$("#error_"+id).html(fieldCanBee);
			$("#"+id+"countryCode").addClass("bordererror");
			$("#"+id+"townCode").addClass("bordererror");
			$("#"+id+"phoneNumber").addClass("bordererror");
			return false;
		} else{
			$("#error_"+id).html("");
			$("#"+id+"countryCode").removeClass("bordererror");
			$("#"+id+"townCode").removeClass("bordererror");
			$("#"+id+"phoneNumber").removeClass("bordererror");
			return true;
		};
	};
	
	
	 var checkEmail=function(id, checkempty){
		var val=$("#"+id).val();
		
		if(checkempty &&(val == null || val==''||!isEmailValid(val))){
			 $("#error_"+id).html(emailNotValid);
			$("#"+id).addClass("bordererror");
			return false;
		} else{
			$("#error_"+id).html("");
			$("#"+id).removeClass("bordererror");
			return true;
		};
	 };
	
	 var checkAgree=function(checkempty){
		 var id="agree";	
		 if(checkempty &&(!$("#"+id).is(':checked'))){
				 $("#error_"+id).html(agreeNotValid);
				$("#"+id).addClass("bordererror");
				return false;
			} else{
				$("#error_"+id).html("");
				$("#"+id).removeClass("bordererror");
				return true;
			};
		 };
	 
	 
	 var checkLogin=function(id, checkempty){
			var val=$("#"+id).val();
			if(checkempty &&(val == null || val==''||!isLoginValid(val))){
				$("#error_"+id).html(loginNotValid);
				$("#"+id).addClass("bordererror");
				return false;
			} else{
				$("#error_"+id).html("");
				if(!logerror){
					$("#"+id).removeClass("bordererror");
				}
				return true;
			};
		};
		
	var changeAreas = function () {
        var areasSelect = $("#area_id").html('');
        var sel_array1 = _areas[$("#countrySIGN").val()];
        if (sel_array1 != null) {
            var htmlOptions = '';
            htmlOptions = '<option';
            if (_lastAreaId == 0) {
            	htmlOptions += ' selected="selected"';
            }
            htmlOptions += '></option>';
            for (var c in sel_array1) {
            	var selected = "";
            	if (_lastAreaId == c) {
            		selected += ' selected="selected"';
            	}
            	htmlOptions += '<option value="' + c + '"' + selected + '>' + 
            		sel_array1 [c] + '</option>';
            }
            areasSelect.html(htmlOptions).get(0).disabled = false;
            $("#area_errorstar").show();
        } else {
        	areasSelect.html('<option>любая обл.</option>').get(0).disabled = true;
        	$("#area_errorstar").hide();
        }
	};
	var checkPassEq = function(pass, repeatpass, check ) {
		var res = false;
		var outP="";
		var outR="";
		var passval=$("#"+pass).val() ;
		var repeatpassval=$("#"+repeatpass).val() ;
		
		
		if(check &&(passval == null || passval==''||!isPassValid(passval))){
			
			outP=passNotValid;
			outR="";
		} else{
			if (check&&(passval != repeatpassval)) {
				outR="Пароли не совпадают";
				outP="";
			} else {
				res = true;
				outP="";
				outR="";
				
			};
		}
		
		if (res){
			$("#"+pass).removeClass("bordererror");
			$("#"+repeatpass).removeClass("bordererror");
		}
		else{
			$("#"+pass).addClass("bordererror");
			$("#"+repeatpass).addClass("bordererror");
		}
		$("#error_"+pass).html(outP);
		$("#error_"+repeatpass).html(outR);
		
		return res;
	};
	
//	var checkPass=function(id, checkempty){
//		var val=$("#"+id).val();
//		if(checkempty &&(val == null || val==''||!isPassValid(val))){
//			 $("#error_"+id).html(passNotValid);
//			$("#"+id).addClass("bordererror");
//			return false;
//		} else{
//			$("#error_"+id).html("");
//			$("#"+id).removeClass("bordererror");
//			return true;
//		};
//	};
	
	var checkCountry = function(checkempty) {
		var selCountry = $('#countrySIGN').val();
		var outC="";
		var res = true;
		if (checkempty &&(selCountry=="")) {
			res = false;
			outC=fieldCanBee;
		} 
		
		if(res){
			$('#countrySIGN').removeClass("bordererror");
		} else{
			$('#countrySIGN').addClass("bordererror");
		}
		
		$("#error_countrySIGN").html(outC);
		return res;
	};
	
	var checkArea = function(checkempty) {
		var selCountry = $('#countrySIGN').val();
		var outA="";
		var res = true;
		if (selCountry!="") {
			var selArea = $('#area_id').val();
			if (checkempty&&_areas[selCountry] != null && 
				_areas[selCountry][selArea] == null) 
			{
				outA=fieldCanBee;
				res = false;
			} 
		}
		
		if(res){
			$('#area_id').removeClass("bordererror");
		} else{
			$('#area_id').addClass("bordererror");
		}
		
		$("#error_area_id").html(outA);
		
		return res;
	};
	
	
	
	var showQuotesForQN = function(currVal) {
		var isNQFPrefix = false;
		for (var tmpPrefixNo in _nqfPrefixes) {
			var tmpPrefix = _nqfPrefixes[tmpPrefixNo];
			if (currVal == tmpPrefix) {
				isNQFPrefix = true;
				break;
			}
		}
		if (isNQFPrefix) {
			$(".regisration_quotes").hide();
		} else {
			$(".regisration_quotes").show();
		}
	};
	var init = function(areas, lastAreaId, nqfPrefixes) {
		_areas = areas;
		_lastAreaId = lastAreaId;
		_nqfPrefixes = nqfPrefixes;
		$("#countrySIGN").bind('change', changeAreas);
		
		changeStarArea();
		changeAreas();
		
		$('#registration_name_sokr').change(function () {
			showQuotesForQN($(this).val());
		});
		showQuotesForQN($('#registration_name_sokr').val());
		
		if(getUrlVars()["noscript"]==null){
			
			
			
			$("#login").bind('blur', function(e) {
				checkLogin("login",false);
			});
			
			$("#login").bind('blur', function(e) {
				if(checkLogin("login")){
					loginFree();
				};
			});
			
			$("#pass").bind('blur', function(e) {
				checkPassEq("pass","repeatpass", false );
				
			});
			
			$("#pass").bind('keyup', function(e) {
				doCheckPassStrong("pass","strongPass");
			});
			
			$("#repeatpass").bind('blur', function(e) {
				checkPassEq("pass","repeatpass", false );
			});
			
			$("#email").bind('blur', function(e) {
				checkEmail("email");
			});
			
			$("#phone1countryCode").bind('blur', function(e) {
				checkPhone("phone1",false);
			});
			$("#phone1townCode").bind('blur', function(e) {
				checkPhone("phone1",false);
			});
			$("#phone1phoneNumber").bind('blur', function(e) {
				checkPhone("phone1",false);
			});
			
			$("#captcha").bind('blur', function(e) {
				inputCaptchaCanBee(false);
			});
			
			$("#name").bind('blur', function(e) {
				inputFieldCanBee("name",false);
			});
			
			
			$("#face").bind('blur', function(e) {
				inputFieldCanBee("face",false);
			});
			
			$("#agree").bind('blur', function(e) {
				checkAgree();
			});
			
			
			
			$("#countrySIGN").bind('change', function(e) {
				checkCountry();
				checkArea();
			});
			
			$("#area_id").bind('change', function(e) {
				checkArea();
			});
			
			$("#town").bind('blur', function(e) {
				inputFieldCanBee("town",false);
			});
			
		
			$("#submit").bind('click', function(e) {
				$("#submit").focus();
				var error_id="";
				var isError=false;
				if(!checkAgree(true)) {error_id ="agree"; isError=true;};
				if(!inputCaptchaCanBee(true)) {error_id ="captcha"; isError=true;};
				if(!checkPassEq("pass","repeatpass", true )){ error_id ="repeatpass";isError=true;};
				//if(!inputFieldCanBee("repeatpass",true)) {error_id ="repeatpass"; isError=true;};
				//if(!checkPass("pass",true)){ error_id ="pass";isError=true;};
				if(!checkLogin("login",true)){ error_id ="login";isError=true;};
				if(!inputFieldCanBee("face",true))	{ error_id ="face";isError=true;};
				if(!checkEmail("email",true)) {error_id ="email";isError=true;};
				if(!checkPhone("phone1",true)) {error_id ="phone1";isError=true;};
				if(!inputFieldCanBee("town",true)) {error_id ="town";isError=true;};
				if(!checkArea(true))  {error_id ="area_id";isError=true;};
				if(!checkCountry(true)) { error_id ="countrySIGN";  isError=true;};
				if(!inputFieldCanBee("name",true)) {error_id ="name";isError=true;};
				
				
				if(isError){
					if (error_id!=""){	$("#"+error_id).focus();};
					return false;     
				} else{	
					return true;
				};
			});
		};
	};		
	
	return {
		init: init
	};
})(jQuery);

function isEmailValid(str){
	var pattern = /^[A-Za-z0-9._%+\-]+@[A-Za-z0-9_.\-]+\.[A-Za-z]{2,4}$/; 
	return pattern.test(str);  
};
function isPassValid(str){
	var pattern = /^[A-Za-z0-9\._#~@$^&*()\\\/':;<>,?\"|%\+!\-]{5,20}$/; 
	return  pattern.test(str);  
};
function isLoginValid(str){
	var pattern = /^[a-zA-Z\d]{1}[a-zA-Z\d\u002E\u005F\-]{4,20}$/;  
	return pattern.test(str);  
};
function isPhoneValid(str){
	var pattern = /^(\+\d{1,4})(\(\d{1,6}\))(\d{3,12})$/;  
	return pattern.test(str);  
};


function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

//$(function(){
//	$("#email").blur(function(){
//		var email = $(this).val();
//		if(!isEmailValid(email)){
//			$('#emailError').lardiTooltip('Email содержит недопустимые символы').show();
//		}else{
//			$('#emailError').hide();
//		}
//	});
//});



AddRsponseManager = (function() {
	var ajaxUrl = "/reliability_zone/new/add_response/ajax";
	var ajaxManager;
	
	var initAjaxManager = function(options) {
		var waitVisualizer = null;
		if (options.waitFogId || options.waitIcoId) {
			waitVisualizer = new WaitVisualizer(options.waitIcoId, 
				options.waitFogId, true);
		}
		ajaxManager = new AjaxManager(ajaxUrl, waitVisualizer);		
	};
	
	var step1 = (function() {
	
		var foundFirmsContId = "";
		var maxRait = 10;
		var raitImgQuant = 3;
		var firmItemIdPrefix = 'addRespFndFrmCont';
		var addRespStep2Url;
		var rzFidParamName;
		
		var parseOptions = function(options) {
			if (options != null) {
				if (options.foundFirmsContId) {
					foundFirmsContId = options.foundFirmsContId;
				}
				if (options.addRespStep2Url) {
					addRespStep2Url = options.addRespStep2Url;
				}
				if (options.rzFidParamName) {
					rzFidParamName = options.rzFidParamName;
				}
				if (options.uidParamName) {
					uidParamName = options.uidParamName;
				}
			}
		};
		
		var getFirmItemHtml = function(ffItemData) {
			var raitShift = -Math.floor(maxRait - ffItemData.raiting + 0.5) * raitImgQuant ;
			raitShift = Math.ceil(raitShift);
			if (raitShift > 0) {
				raitShift = 0;
			}
			return '<div class="addRespFndFrmCont" id="' + firmItemIdPrefix + ffItemData.rzFid + '">' 
				+ '		<div class="addRespFndFrmLogoCont"><div>' 
				+ '			<img src="' + ffItemData.logoUrl + '" alt="logo" />' 
				+ '		</div></div>' 
				+ '		<div class="addRespFndFrmInfoCont">'
				+ '			<div class="addRespFndFrmNameCont">' 
				+ '				<span class="t_link_fake addRespFndFrmName">' 
				+ 					ffItemData.showName 
				+ '				</span>' 
				+ '				<span class="relbZoneRaitView">' 
				+ '					<img src="/tpl/jsp/images/infopage/zone_green.png" alt=""  ' 
				+ '						title="Балл надёжности: ' + ffItemData.raiting
				+ 						'" style="left: ' + raitShift + 'px;" />' 
				+ '				</span>' 
				+ '			</div>' 
				+ '			<div>' + ffItemData.addressLine + '</div>' 
				+ '			<div>' 
				+ '				Контактное лицо: ' + ffItemData.contactFace 
				+ '			</div>' 
				+ '			<div>тел.: ' + ffItemData.phonesLine + '</div>' 
				+ '		</div>' 
				+ '	</div>' ;
		};
		
		var getOtherItemHtml = function() {
			return '<div class="addRespFndFrmCont" id="' + firmItemIdPrefix + '0">' 
			+ '		<div class="addRespFndFrmLogoCont"><div>' 
			+ '			<img src="' + getSubdomainUrl('media') + '/upload/0/logo/logo67x67_def.jpg" alt="logo" />' 
			+ '		</div></div>' 
			+ '		<div class="addRespFndFrmInfoCont">'
			+ '			<div>Нет в списке</div>' 
			+ '		</div>' 
			+ '	</div>' ;
		};
		
		var parseFirms = function(firmsData) {
			var firmsHtml = '';
			for (var i in firmsData) {
				firmsHtml += getFirmItemHtml(firmsData[i]);
			}
			firmsHtml += getOtherItemHtml();
			$('#' + foundFirmsContId).html(firmsHtml);
			$('.addRespFndFrmCont').click(function() {
				var idStr = $(this).attr('id');
				var re = new RegExp(firmItemIdPrefix + '(\\d+)');
				var fnd = re.exec(idStr);
				if (fnd != null) {
					window.location = addRespStep2Url + '?' + rzFidParamName + '=' + fnd[1];
				} else {
					alert("Ошибка! Не удается найти фирму. Попробуйте перезагрузить страницу.");
				}
			});
		};
		
		var findFirms = function(searchPhrase) {
			ajaxManager.doOperation("findFirms", 
				{
					searchPhrase: searchPhrase
				}, 
				function(data) {
					parseFirms(data.firmsData);
				}, 
				null, '#' + foundFirmsContId);
		};
		
		var findFirmsUI = function(srchPhrase) {
			if (srchPhrase) {
				$('#' + foundFirmsContId).css('min-height', '90px');
				findFirms(srchPhrase);
			} else {
				alert("Введите данные для поиска!");
			}
		};
		
		return function(options) {
			parseOptions(options);
			initAjaxManager(options);
			if (options.edtSrchPhrsId) {
				$('#' + options.edtSrchPhrsId).addKeyHandler({
					13: function() {
						findFirmsUI(this.value);
					}
				});
				if (options.btnSearchId) {
					$('#' + options.btnSearchId).click(function() {
						findFirmsUI($('#' + options.edtSrchPhrsId).val());
					});
				}
			}
		};
	})();
	
	var step2 = (function() {
		
		var docsContId;
		var docId;
		
		var parseOptions = function(options) {
			if (options != null) {
				if (options.docsContId != null) {
					docsContId = options.docsContId;
				}
				if (options.docId != null) {
					docId = options.docId;
				}
			}
		};
	
		var initDocument = function(respFirmName, callback) {
			var data = {
				respFirmName: respFirmName
			};
			if (docId != null) {
				data.docId = docId;
			}
			ajaxManager.doOperation("initTempDocument", data, 
				function(data) {
					docId = data.docId;
					if (callback instanceof Function) {
						callback(docId, data.accLevel);
					}
					initDocEditor(data.docId);
				}, 
				null, '#' + docsContId);
		};
		
		var _docEditorOptions;
		
		var initDocEditor = function(docId) {
			MyDocuments.initEditing(docId, _docEditorOptions);
		};
		
		return function(options, docEditorOptions) {
			_docEditorOptions = docEditorOptions;
			parseOptions(options);
			initAjaxManager(options);
			return {
				initDocument: initDocument
			};
		};
	
	})();
	
	var DocumentEditor = function(containerId, options) {
		
		if (options == null) {
			options = {};
		}
		
		var editorAccTypeSelId = containerId + "AccType";
		var editorPagesContId = containerId + "PagesCont";
		var editorPagesUploaderId = containerId + "PagesUploader";
		var editorCancelBtn = containerId + "CancelBtn";
		var editorSaveBtn = containerId + "SaveBtn";
		var optionsData = new OptionsData(options);
		var docPagesEditor = null;
		var docId = options.docId;
		var responseId = options.responseId;
		var obj = this;
		var SLIDE_SPEED = 10;

		initAjaxManager(options);
		$('#' + containerId).html(getEditorHtml());		
		if (!options.showAfterCreate) {
			$('#' + containerId).hide();
		}
		$('#' + editorSaveBtn).click(function() {
			obj.saveDoc(function(data) {
				obj.hide(function() {
					if (obj.afterSavedClose instanceof Function) {
						obj.afterSavedClose(data);
					}
				});
			});
		});
		$('#' + editorCancelBtn).click(function() {
			obj.hide(function() {
				if (obj.afterCanceledClose instanceof Function) {
					obj.afterCanceledClose();
				}
			});
		});
		
		this.afterSavedClose = null;
		this.afterCanceledClose = null;
		
		this.show = function(callback) {
			$('#' + containerId).slideDown(SLIDE_SPEED, callback);
		};
		
		this.hide = function(callback) {
			$('#' + containerId).slideUp(SLIDE_SPEED, callback);
		};
		
		this.initEditor = function(callback) {
			var operation;
			var data = {};
			if (docId > 0) {
				operation = "getDocument";
			} else if (responseId > 0) {
				operation = "createDocument";
				data.responseId = responseId;
			} else {
				alert("Не удалось инициализировать редактор документа!");
				return;
			}
			doOperation(operation, data, function(data) {
				docId = data.docId;
				updateAccLevels(data.accLevels, data.currAccLevel);
				if (callback instanceof Function) {
					callback(data);
				}
				if (docPagesEditor) {
					docPagesEditor.refreshPages();
				} else {
					docPagesEditor = initDocEditor(data.docId);
				}
			});
		};
		
		this.saveDoc = function(callback) {
			doOperation("saveDocument", {
				accLevel: $('#' + editorAccTypeSelId).val()
			}, function(data) {
				updateAccLevels(data.accLevels, data.currAccLevel);
				if (callback instanceof Function) {
					callback(data);
				}
			});
		};
		
		function getEditorHtml() {
			var res = '	<div' + optionsData.getHtmlClassLine('formTable') + '>' + 
				'		<div>' + 
				'			<div' + optionsData.getHtmlClassLine('formLablelCol') + '>' +
				'				Тип доступа ' + 
				'			</div>' + 
				'			<div' + optionsData.getHtmlClassLine('formEditCol') + '>' + 
				'				<select id="' + editorAccTypeSelId + '"' + 
									optionsData.getHtmlClassLine('accTypeSelect') + '><select>' + 
				'			</div>' + 
				'		</div>' + 
				'	</div>' + 
				'	<div' + optionsData.getHtmlClassLine('pagesLabel') + '>Загруженные страницы:</div>	' + 
				'	<div id="' + editorPagesContId + '"' + optionsData.getHtmlClassLine('pagesCont') + '></div>' + 
				'	<div' + optionsData.getHtmlClassLine('pagesComment') + '>' + 
				'		Допустимые форматы загружемых документов: .jpeg, .jpg, .png, и .gif размером не более 2 МБ. ' + 
				'	</div>' + 
				'	<div id="' + editorPagesUploaderId + '"></div>' + 
				'	<div' + optionsData.getHtmlClassLine('buttonsCont') + '>' + 
				//'		<button id="' + editorCancelBtn + '" class="c" type="button">Отмена</button>' + 
				'		<button id="' + editorSaveBtn + '" class="btnBigGreen" type="button">Сохранить</button>' + 
				'	</div>';
			return res;
		}
		
		function initDocEditor(docId) {
			return MyDocuments.initEditing(docId, {
				fileUploaderSelr: "#" + editorPagesUploaderId, 
				docPagePrevContId: editorPagesContId, 
				pageIdAtrrname: "pageId", 
				waitPageImgId: "respWaitIcoId", 
				pagePrevContClass: "docPagePrewItemCont", 
				delPageBtnClass: "delDocPageImg",  
				refreshAfterInit: true
			});
		}
		
		function doOperation(operation, data, callback) {
			if (data == null) {
				data = {};
			}
			data.docId = docId;
			ajaxManager.doOperation(operation, data, callback, 
				null, '#' + containerId);
		};
		
		function updateAccLevels(accLevels, selectedName) {
			var res = "";
			for (var alNo in accLevels) {
				res += getAccLevelHtml(accLevels[alNo], selectedName);
			}
			$('#' + editorAccTypeSelId).html(res);
		}
		
		function getAccLevelHtml(accLevelInfo, selectedName) {
			var selectedLine = '';
			if (accLevelInfo.name == selectedName) {
				selectedLine = 'selected="selected"';
			}
			return '<option value="' + accLevelInfo.name + '" ' + selectedLine + 
				'>' + accLevelInfo.caption + '</option>';
		}
	}
	
	var DocumentViewer = function(containerId, options) {
		
		var RESP_ACC_OWNER = 'owner';
		var RESP_ACC_VIEW_ALL = 'viewAll';
		var RESP_ACC_DOC_INVISIBLE = 'docsInvisible';
		var SLIDE_SPEED = 10;
		
		if (options == null) {
			options = {};
		}
		
		var viewContainerId = containerId + "ViewCont";
		var editBtnId = containerId + "EditBtn";
		var editorContainerId = containerId + "EditorCont";
		var docSavedInfoIdId = containerId + "DocSavedInfo";
		var docAccLevelInfoId = containerId + "DocAccLevelInfo";
		var optionsData = new OptionsData(options);
		var editor = null;
		var docId = options.docId;
		var contaiPages = options.containPages == 'true';
		var docCtrlAccess = options.docCtrlAccess;
		
		initAjaxManager(options);
		hideEditor();
		hideView();
		$("#" + docSavedInfoIdId).hide();
		if (docId > 0 && (docCtrlAccess == RESP_ACC_OWNER || docCtrlAccess == RESP_ACC_VIEW_ALL)) {
			reloadPages();
		}	
		$('#' + containerId).html(getViewContHtml());
		if (docCtrlAccess == 'owner') {
			$('#' + editBtnId).click(function() {
				getEditor().initEditor(function(data) {
					docId = data.docId;
					var contSh = $('#' + containerId);
					contSh.css('min-height', contSh.height() + 'px');
					$('#' + editBtnId).hide();
					$('#' + docAccLevelInfoId).hide();
					$("#" + docSavedInfoIdId).html('');
					hideView(showEditor);
				});
			});
		}
		
		function getViewContHtml() {
			var editBtnData = getBtnData();
			return '<div class="t_gray_ongray" id="' + docAccLevelInfoId + '">' + 
				optionsData.getString('lardiAdminAccLine') + '</div>' + 
				'<div id="' + docSavedInfoIdId + '"></div>' + 
				'<div id="' + viewContainerId + '"' + optionsData.getHtmlClassLine('viewCont') + '></div>' + 
				'<div id="' + editorContainerId + '"' + optionsData.getHtmlClassLine('editCont') + '></div>' + 
				'<div><span id="' + editBtnId + '"' + editBtnData.classLine + '>' + 
					editBtnData.label + '</span></div>';
		}
		
		function getBtnData() {
			var res = {};
			if (docCtrlAccess == 'owner') {
				if (docId > 0 && contaiPages) {
					res.label = "Редактировать документ";
				} else {
					res.label = "Добавить документ";
				}
				res.classLine = optionsData.getHtmlClassLine('linkCtrl');
			} else if (docCtrlAccess == 'viewAll') {
				if (docId > 0 && contaiPages) {
					res.label = "";
				} else {
					res.label = "Нет документа";
				}
				res.classLine = optionsData.getHtmlClassLine('infoCtrl');
			} else {
				if (docId > 0 && contaiPages) {
					res.label = "Вы не можете просматривать документ";
				} else {
					res.label = "Нет документа";
				}
				res.classLine = optionsData.getHtmlClassLine('infoCtrl');
			}
			return res;
		}
		
		function showEditor(callback) {
			$('#' + editorContainerId).slideDown(SLIDE_SPEED, callback);
		}
		
		function hideEditor(callback) {
			$('#' + editorContainerId).slideUp(SLIDE_SPEED, callback);
		}
		
		function showView(callback) {
			$('#' + viewContainerId).slideDown(SLIDE_SPEED, callback);
		}
		
		function hideView(callback) {
			$('#' + viewContainerId).slideUp(SLIDE_SPEED, callback);
		}
		
		function getEditor() {
			if (editor == null && docCtrlAccess == 'owner') {
				options.showAfterCreate = false;
				editor = new DocumentEditor(editorContainerId, options);
				editor.afterSavedClose = function(data) {
					$("#" + docSavedInfoIdId).html(data.resultInfo);
					reloadPages(function() {
						$('#' + containerId).css('min-height', 0);
						$('#' + editBtnId).show();
						if (contaiPages) {
							$('#' + docAccLevelInfoId).show();
						}
					});
				};
				editor.afterCanceledClose = function() {
					reloadPages(function() {
						$('#' + containerId).css('min-height', 0);
						$('#' + editBtnId).show();
						$('#' + docAccLevelInfoId).show();
					});
				};
			}
			return editor;
		}
		
		function reloadPages(callback) {
			doOperation("getPages", null, function(data) {
				contaiPages = data.pages.length > 0;
				$('#' + editBtnId).text(getBtnData().label);
				parseViewPages(data.pages);
				if (contaiPages) {
					showView(callback);
				} else {
					hideView(callback);
				}
			});
		}
		
		function doOperation(operation, data, callback) {
			if (data == null) {
				data = {};
			}
			data.docId = docId;
			ajaxManager.doOperation(operation, data, callback, 
				null, '#' + viewContainerId);
		};
		
		function parseViewPages(pages) {
			var res = "";
			for (var pageNo in pages) {
				res += getPageItemHtml(pages[pageNo]);
			}
			res += '<div class="floatBreaker"></div>';
			$('#' + viewContainerId).html(res);
		}
		
		function getPageItemHtml(page) {
			return "<div>" + 
					"<a target=\"_blanc\" href=\"" + page.viewUrl + "\">" + 
						"<img src=\"" + page.icoUrl + "\">" + 
					"</a>" + 
				"</div>";
		}
		
		
	};
	
	return {
		initStep1: step1, 
		initStep2: step2, 
		createDocumentEditor: function(containerId, options) {
			new DocumentEditor(containerId, options);
		}, 
		createDocumentViewer: function(containerId, options) {
			new DocumentViewer(containerId, options);
		}
	};
})();

ResponseSearcher = (function(){
	var _options;
	var ajaxManager;	
	var busy = false;
	var lastFilter;
	var bgAnimDurr = 3000;
	var bgAnimStepsCount = 50;
	
	function init(options) {
		_options = options;
		ajaxManager = new AjaxManager('/reliability_zone/new/ajax_responses', null);
		var startRefresher = (options.page == null || options.page == 0);
		lastFilter = options.filterLine;
		refresher.init(lastFilter, options.lastId, startRefresher, options.refreshRate);
		$(options.firmToSearchEditSelr).focus();
		$.datepicker._defaults.showButtonPanel = true; 
		$(options.dateInputsSelr).datepicker({ maxDate: '+0' });
		$(options.firmFromSearchEditSelr).addUserSearch(function(uid, rzFid, userData) {
			if (rzFid == $(options.firmToSelectedValueSelr).val()) {
				alert("Данная комбинация недопустима!");
				return false;
			}
			$(options.firmFromSelectedViewSelr + ' a').html(userData.name).attr('href', userData.pageUrl);
			$(options.firmFromSelectedViewSelr).show();
			$(options.firmFromSearchEditSelr).attr('disabled', 'disabled').hide().val('');
			$(options.firmFromSelectedValueSelr).val(rzFid);
			return true;
		}, {
			loadAdditionData: true, 
			searchInRzFirms: true, 
			useLinksForFirms: true
		});
		$(options.firmToSearchEditSelr).addUserSearch(function(uid, rzFid, userData) {
			if (rzFid == $(options.firmFromSelectedValueSelr).val()) {
				alert("Данная комбинация недопустима!");
				return false;
			}
			$(options.firmToSelectedViewSelr + ' a').html(userData.name).attr('href', userData.pageUrl);
			$(options.firmToSelectedViewSelr).show();
			$(options.firmToSearchEditSelr).attr('disabled', 'disabled').hide().val('');
			$(options.firmToSelectedValueSelr).val(rzFid);
			$(options.firmFromSearchEditSelr).focus();
			return true;
		}, {
			loadAdditionData: true, 
			searchInRzFirms: true, 
			useLinksForFirms: true
		});
		$(options.firmFromSelectedViewSelr + ' img').click(clearFirmFrom);
		$(options.firmToSelectedViewSelr + ' img').click(clearFirmTo);
		$(options.resetBtnSelr).click(function() {
			$(options.dateInputsSelr).val('');
			$(options.rateTypeSelectSelr + ' option[value="ALL"]').attr('selected', 'selected');
			$(options.targTypeSelectSelr + ' option[value="UNDEFINED"]').attr('selected', 'selected');
			clearFirmFrom();
			clearFirmTo();
		});
		$(options.filterFormSelr).submit(function(e) {
			$(options.filterIdValSelr).val('');
			checkDatesIntervals();
		});
	}
	
	function clearFirmFrom() {
		$(_options.firmFromSelectedViewSelr + ' a').text('').attr('href', '#');
		$(_options.firmFromSelectedViewSelr).hide();
		$(_options.firmFromSearchEditSelr).attr('disabled', null).val('').show().focus();
		$(_options.firmFromSelectedValueSelr).val('');
	}
	function clearFirmTo() {
		$(_options.firmToSelectedViewSelr + ' a').text('').attr('href', '#');
		$(_options.firmToSelectedViewSelr).hide();
		$(_options.firmToSearchEditSelr).attr('disabled', null).val('').show().focus();
		$(_options.firmToSelectedValueSelr).val('');
	}
	function checkDatesIntervals() {
		var rdf = $(_options.respDateFromInputSelr).val();
		var rdt = $(_options.respDateToInputSelr).val();
		var sdf = $(_options.shipDateFromInputSelr).val();
		var sdt = $(_options.shipDateToInputSelr).val();
		var rdfD = null;
		var rdtD = null;
		var sdfD = null;
		var sdtD = null;
		if (rdf.length > 0) {
			rdfD = new Date(convDateStr(rdf));
		}
		if (rdt.length > 0) {
			rdtD = new Date(convDateStr(rdt));
		}
		if (sdf.length > 0) {
			sdfD = new Date(convDateStr(sdf));
		}
		if (sdt.length > 0) {
			sdtD = new Date(convDateStr(sdt));
		}
		if (rdfD != null && rdtD != null && rdfD.getTime() > rdtD.getTime()) {
			$(_options.respDateFromInputSelr).val(rdt);
			$(_options.respDateToInputSelr).val(rdf);
		}
		if (sdfD != null && sdtD != null && sdfD.getTime() > sdtD.getTime()) {
			$(_options.shipDateToInputSelr).val(sdf);
			$(_options.shipDateFromInputSelr).val(sdt);
		}
	}
	function convDateStr(src) {
		var res = /^(\d+)\.(\d+)\.(\d+)$/.exec(src);
		return res[2] + "." + res[1] + "." + res[3];
	}
	window.searchResponseGoToPage = function(page) {
		loadResponses(appendParam(page, lastFilter, 'page'));
		event.preventDefault();
		return true;
	};
	function appendParam(val, params, name) {
		if (params == null || params.length == 0) {
			params = name + '=' + val;
		} else {
			params = params + '&' + name + '=' + val;
		}
		return params;
	}
	function loadResponses(filter) {
		if (!busy) {
			lockSearch();
			ajaxManager.doOperation('findResponses', filter, function(data) {
				$(_options.paginatorsContSelr).html(data.paginatorHtml);
				$(_options.responsesContSelr).html(data.responsesHtml);
				if (data.page == 0) {
					refresher.start(lastFilter, data.lastId);
				} else {
					refresher.stop();
				}
			}, null, null, null, function() {
				unlockSearch();
			});
		}
	}
	function lockSearch() {
		busy = true;
		$(_options.searchBtnSelr).attr('disabled', 'disabled');
		$(_options.resetBtnSelr).attr('disabled', 'disabled');
		$(_options.respSearchWaitImgSelr).show();
	}
	function unlockSearch() {
		busy = false;
		$(_options.searchBtnSelr).attr('disabled', null);
		$(_options.resetBtnSelr).attr('disabled', null);
		$(_options.respSearchWaitImgSelr).hide();
	}	
	function animateNewResponses() {
		$('.newRespPreview').animateBgColor(0xFEFBE5, 0xFFFFFF, bgAnimDurr, bgAnimStepsCount)
			.removeClass('newRespPreview');
	}
	
	var refresher = (function(onUpdate){
		var active = false;
		var timer = null;
		var _lastId = null;
		var ajaxManager;
		var _filter = null;
		var _refreshRate;
		
		function init(filter, lastId, startNow, refreshRate) {
			ajaxManager = new AjaxManager('/reliability_zone/new/ajax_responses', null);
			if (!refreshRate) {
				refreshRate = 10000;
			}
			_refreshRate = refreshRate;
			if (startNow) {
				start(filter, lastId);
			}
		}
		function stop() {
			active = false;
			clearInterval(timer);
			timer = null;
		}
		function start(filter, lastId) {
			if (filter == null) {
				filter = "";
			}
			_lastId = lastId;
			_filter = filter;
			active = true;
			if (timer == null) {
				timer = setInterval(checkUpdates, _refreshRate);
			}
		}
		function checkUpdates() {
			ajaxManager.doOperation('checkNewResponses', appendParam(_lastId, _filter, 'lastId'), function(data) {
				if (active) {
					if (data.lastId) {
						_lastId = data.lastId;
					}
					if (onUpdate instanceof Function) {
						onUpdate(data);
					}
				}
			});
		}
		return {
			init: init, 
			stop: stop, 
			start: start, 
			checkNow: checkUpdates
		};
	})(function(data) {
		if (_options.noneFound && data.responsesHtml.length > 0) {
			$(_options.responsesContSelr).html('');
		}
		$(_options.responsesContSelr).prepend(data.responsesHtml);
		animateNewResponses();
	});
	return {
		init: init
	};
})();



////////////////////////////////////////////////////////////////////////////////////////
//Объект вывода tooltip
////////////////////////////////////////////////////////////////////////////////////////
//

(function($){
	var ajaxWaitElSfx = '_ajax_wait';
	var infoViewElSfx = '_user_info';
	var errorMsgElSfx = '_error_msg';

	var View = function(viewId, widthPx, heightPx, waitimgUrl, backImgUrl, 
		infoCode, errorCode, tooltipViewClass) 
	{
		var inView = false;
		
		this.getId = function() {
			return viewId;
		};
		
		this.isInView = function() { 
			return inView; 
		};
		
		this.isVisible = function() {
			return $('#' + viewId).css('display') == 'block';
		};
		
		this.show = function() {
			$('#' + viewId).show();
		};
		
		this.hide = function() {
			$('#' + viewId).hide();
		};
		
		var self = this;
		
		this.checkInited = function(afterInfoCreate, afterMouseOut, afterMouseIn) {
			var viewElement = $('#' + viewId);
			if (viewElement.length == 0) {
				tooltipViewContClasses = 'class="tooltipCont ' + tooltipViewClass + '';
				$('body').append('<div id="' + viewId + 
					'" class="tooltipRoot" style="background-image:url(\'' + backImgUrl + '\'); ' + 
					'width: ' + widthPx + 'px; height: ' + heightPx + 'px;"><div id="' + 
					viewId + ajaxWaitElSfx + '" ' + tooltipViewContClasses + ' tooltipWaitCont"></div><div id="' + 
					viewId + infoViewElSfx + '" ' + tooltipViewContClasses + '"></div><div id="' + 
					viewId + errorMsgElSfx + '" ' + tooltipViewContClasses + '"></div></div>');
				viewElement = $('#' + viewId);
				viewElement.bind('mouseover', function() {
					inView = true;
					if (afterMouseIn instanceof Function) {
						afterMouseIn();
					}
				});
				viewElement.bind('mouseout', function() {
					inView = false;
					if (afterMouseOut instanceof Function) {
						afterMouseOut();
					}
				});
				if (waitimgUrl != null) {
					var imgId = viewId + '_wait_ico';
					var ajaxWaitEl = $('#' + viewId + ajaxWaitElSfx);
					ajaxWaitEl.html('<img alt="" id="' + imgId + '" />');
					$("#" + imgId)
						.bind('load', function(){
								var imgElement = $(this);
								var mt = (heightPx - imgElement.height()) / 2 - 
									parseSize(imgElement.parent().css('margin-top'));
								imgElement.css("margin-top", mt + "px");
							})
						.attr('src', waitimgUrl);
				}
				if (infoCode != null) {
					$('#' + viewId + infoViewElSfx).html(infoCode);
				}
				if (afterInfoCreate instanceof Function) {
					afterInfoCreate(self);
				}
				if (errorCode != null) {
					$('#' + viewId + errorMsgElSfx).html(errorCode);
				}
			}
		};
		
		this.positionateNear = function(pos) {
			if (pos == null || pos.x == null || pos.y == null) {
				return;
			}
			var x = pos.x; 
			var y = pos.y;
			var winHeight = $(window).height();
			var winTop = 0;
			if (window.scrollY) {
				winTop = window.scrollY;
			}
			if (document.documentElement.scrollTop) {
				winTop = document.documentElement.scrollTop;
			}
			if (document.body.scrollTop) {
				winTop = document.body.scrollTop;
			}
			var winLeft = 0;
			if (window.scrollX) {
				winLeft = window.scrollX;
			}
			if (document.documentElement.scrollLeft) {
				winLeft = document.documentElement.scrollLeft;
			}
			if (document.body.scrollLeft) {
				winLeft = document.body.scrollLeft;
			}
			x = x - widthPx;
			if (x < winLeft) {
				x = winLeft;
			}
			if (y + heightPx > winHeight + winTop) {
				y = winHeight + winTop - heightPx;
			}
			if (y < winTop) {
				y = winTop;
			}
			$('#' + viewId).css({left: x + 'px', top: y + 'px'});
		};
		
		this.togleContainers = function(contrToShow, fade) {
			if (fade) {
				$('.' + tooltipViewClass).not("#" + viewId + contrToShow).fadeOut('fast');
				$("#" + viewId + contrToShow).fadeIn('fast');
			} else {
				$('.' + tooltipViewClass).not("#" + viewId + contrToShow).fadeOut(1);
				$("#" + viewId + contrToShow).fadeIn(1);
			}
		};
		
	};
	
	var Tooltip = function (view, showPeriod, showTimeout, dataLoader, postInfoCreate, 
			targAttr, dontCache) 
	{
		var inLink = false;
		var lastLink = null;
		var showTimer = null;
		var lastUID = 0;
		var lastPickedUId = 0;
		var lastResContainerId = '';
		
		if (showPeriod == null) {
			showPeriod = 1000;
		}
		
		if (showTimeout == null) {
			showTimeout = 1000;
		}
		
		this.getLastUId = function() {
			return lastUID;
		};
		
		this.getLastPickedUId = function() {
			return lastPickedUId;
		};
		
		this.getId = function() {
			return view.getId();
		};
		
		var obj = this;
		
		this.show = function(event){
			event.preventDefault();
			inLink = true;
			view.checkInited(function() {
					if (postInfoCreate instanceof Function) {
						postInfoCreate(obj);
					}
				}, beginHide);
			if (lastLink != event.currentTarget || !view.isVisible()) {
				lastLink = event.currentTarget;
				view.positionateNear({x: event.pageX, y: event.pageY});
				lastPickedUId = lastLink.getAttribute(targAttr);
				beginShow(lastPickedUId);
			}
		};
		
		this.hide = function(e){
			inLink = false;
			beginHide();
		};
		
		var togleResultContainer = function() {
			view.togleContainers(lastResContainerId);	
		};
		
		var beginShow = function(uid) {
			if (uid != lastUID || dontCache) {
				view.togleContainers(ajaxWaitElSfx);
				showTimer = window.setTimeout(function() {
					if (inLink || view.isInView()) {
						dataLoader(view.getId(), uid, function() {
								lastResContainerId = infoViewElSfx;	
								togleResultContainer();	
								lastUID = uid;
							}, function() {
								lastResContainerId = errorMsgElSfx;	
								togleResultContainer();	
							}, obj);
						view.show();
						view.togleContainers(ajaxWaitElSfx);
					}
				}, showTimeout);
			} else {
				if (showTimer != null) {
					window.clearTimeout(showTimer);
				}
				window.setTimeout(function() { 
					if (inLink || view.isInView()) {
						view.show();
					}
				}, showTimeout);
				togleResultContainer();	
			}
		};
		
		var beginHide = function() {
			window.setTimeout(function() {
				if (!inLink && !view.isInView()) {
					togleResultContainer();
					view.hide();
				}
			}, showPeriod);
		};
	};
	
	//создание тултипа и привязка его к коллекции jQuery
	$.fn.tooltip = function(viewId, widthPx, heightPx, waitimgUrl, backImgUrl, 
			showPeriod, showTimeout, dataLoader, infoCode, postInfoCreate, errorCode, 
			targAttr, tooltipViewClass, dontCache, appearance)
	{  
		var view = new View (viewId, widthPx, heightPx, waitimgUrl, backImgUrl, 
				infoCode, errorCode, tooltipViewClass);
		var res = new Tooltip(view, showPeriod, showTimeout, dataLoader, postInfoCreate, 
			targAttr, dontCache);
		if (!window.tooltips) {
			window.tooltips = {};
		}
		window.tooltips[viewId] = res;
		var bindLinks = function(collection) {
			if (appearance == 'click') {
				collection.unbind('click').bind('click', res.show);
			} else {
				collection.unbind('mouseover').bind('mouseover', res.show);
			}
			collection.unbind('mouseout').bind('mouseout', res.hide);
		};
		res.rebindLinks = bindLinks;
		res.rebindLinks(this);
		return this; 
	};
})(jQuery);


UserInfoTooltip = (function($){
	var ajaxSrvUrl = "/dinamix/json/userinfo?uid=";
	var sfxIdSendMsg = "_linkSendMsg";
	var sfxIdSendMsgCont = "_linkContSendMsg";
	var sfxIdWriteNote = "_linkWriteNote";
	var sfxIdWriteNoteCont = "__linkContWriteNote";
	var sfxIdAddPartn = "_linkContAddPartn";
	var sfxIdAddPartnCont = "_linkAddPartn";
	var sfxIdAddIgnor = "_linkContAddIgnor";
	var sfxIdAddIgnorCont = "_linkAddIgnor";
	var sfxIdViewDocs = "_linkViewDocs";
	var sfxIdViewDocsCont = "__linkContViewDocs";
	var sfxIdPropos = "_linkPropos";
	var sfxIdNotesCont = "_linkContNotes";
	var sfxIdNotes = "_linkNotes";
	var sfxIdNotesCount = "_notesCount";
	var sfxIdHideThis = "_linkHideThis";
	var sfxIdHideFirm = "_linkHideFirm";
	var sfxIdSendClaim = "_linkSendClaim";
	var sfxIdFirm = "_name";
	var sfxIdRaiting = "_raiting";
	var sfxIdRaitImg = "_raitImg";
	var sfxIdLogo = "_logo";
	var sfxIdLogoCont = "_logoCont";
	var sfxIdInfo = "_info";
	var sfxIdAdress = "_adressData";
	var sfxIdContact = "_contact";
	var sfxIdPhones = "_phones";
	var sfxIdFirmCode = "_firmCode";
	var sfxErrorView = "_errorConsole";
	var sfxOnlineStatux = "_onlineStatus";
	var maxRait = 10;
	var raitImgQuant = 3;
	var dataLoader = function(tooltipPreId, uid, onSucces, onError, obj) {
		var parseData = function(data, textStatus) {
			if (data instanceof Object && (obj.getLastPickedUId() == uid || 
				obj.getLastPickedUId() == 0)) 
			{
				if (data.status == "ok") {
					$("#" + tooltipPreId + sfxIdFirm).html(data.name).attr('href',  data.profileURL);
					$("#" + tooltipPreId + sfxIdRaiting).attr("title", 
						'Балл надёжности: ' + data.raiting);
					var raitShift = -Math.floor(maxRait - data.raiting + 0.5) * raitImgQuant ;
					if (raitShift > 0) {
						raitShift = 0;
					}
					$("#" + tooltipPreId + sfxIdRaitImg).css("left", raitShift + "px");
					var adress = "";
					if (data.country != null) {
						adress = data.country;
					}
					if (data.area != null) {
						if (adress != '') {
							adress += ", ";
						}
						adress += data.area;
					}
					if (data.town != null) {
						if (adress != '') {
							adress += ", ";
						}
						adress += data.town;
					}
					$("#" + tooltipPreId + sfxIdAdress).html(adress);
					var contact = data.contact;
					if (contact != null && contact != "") {
						contact = "Контактное лицо: " + contact;
					}
					$("#" + tooltipPreId + sfxIdContact).html(contact);
					var phones = data.phones;
					if (phones != null && phones != "") {
						phones = "тел.: " + phones;
					} else {
						phones = "";
					}
					if (data.online == 'true') {
						$('#' + tooltipPreId + sfxOnlineStatux)
							.attr('src', '/tpl/jsp/images/on.png')
							.attr('title', 'Пользователь сейчас на сайте');
					} else {
						$('#' + tooltipPreId + sfxOnlineStatux)
							.attr('src', '/tpl/jsp/images/off.png')
							.attr('title', 'Пользователь не на сайте');
					}
					$("#" + tooltipPreId + sfxIdPhones).html(phones);
					var firmCode = data.firmCode;
					if (firmCode != null && firmCode != "") {
						firmCode = "Код предприятия: " + firmCode;
					} else {
						firmCode = "";
					}
					$("#" + tooltipPreId + sfxIdFirmCode).html(firmCode);
					var loloImg = $("#" + tooltipPreId + sfxIdLogo);
					loloImg.unbind('load').bind('load', function() {
								loloImg.css({width: null, height: null});
								$("#" + tooltipPreId + sfxIdLogoCont).show();
								$("#" + tooltipPreId + sfxIdInfo).css('width', '281px');
								if (loloImg.width() <= 1 && loloImg.height() <= 1) {
									$("#" + tooltipPreId + sfxIdLogoCont).hide();
									$("#" + tooltipPreId + sfxIdInfo).css('width', '100%');
								}
							}
						).attr('src', data.logoUrl);
					var raitingCont = $("#" + tooltipPreId + sfxIdRaiting);
					raitingCont.attr("href", data.rzFirmRaitingViewUrl);
					var cancelFollow = function(e) { e.preventDefault(); };
					if (data.rz_fid == null || data.rz_fid == "" || data.rz_fid == "0") {
						raitingCont.bind('click', cancelFollow);
					} else {
						raitingCont.unbind('click');
					}
					$(".userTooltipSrvcLinkContainer").hide();
					if (data.authorized == "true") {
						if (data.showNotes == "true") {
							$("#" + tooltipPreId + sfxIdNotes).attr('href', data.userPageWithNotesUrl);
							if (data.notesCount) {
								$("#" + tooltipPreId + sfxIdNotesCount).text(" (" + data.notesCount + ")");
							}
							$("#" + tooltipPreId + sfxIdNotesCont).show();
						}
						$("#" + tooltipPreId + sfxIdSendMsg).attr('href', data.userSendMessageUrl);
						$("#" + tooltipPreId + sfxIdSendMsgCont).show();
						$("#" + tooltipPreId + sfxIdWriteNote).attr('href', data.rzFirmAddRespPageUrl).show();
						if (data.rz_fid == null || data.rz_fid == "" || data.rz_fid == "0") {
							$("#" + tooltipPreId + sfxIdWriteNoteCont).hide();
						} else {
							$("#" + tooltipPreId + sfxIdWriteNoteCont).show();
						}
						if (data.isMain == "true") {
							if (data.inPartners == "true") {
								$("#" + tooltipPreId + sfxIdAddPartnCont).hide();
							} else {
								$("#" + tooltipPreId + sfxIdAddPartnCont).show();
							}
							if (data.inIgnorlist == "true") {
								$("#" + tooltipPreId + sfxIdAddIgnorCont).hide();
							} else {
								$("#" + tooltipPreId + sfxIdAddIgnorCont).show();
							}
						} else {
							$("#" + tooltipPreId + sfxIdAddPartnCont).hide();
							$("#" + tooltipPreId + sfxIdAddIgnorCont).hide();
						}	
						$("#" + tooltipPreId + sfxIdViewDocs).attr('href', data.rzFirmViewSvidUrl);
						if (data.showSvid == 'true') {
							$("#" + tooltipPreId + sfxIdViewDocsCont).show();
						} else {
							$("#" + tooltipPreId + sfxIdViewDocsCont).hide();
						}		
					}	
					$("#" + tooltipPreId + sfxIdPropos).attr('href', data.proposUrl);
					$("#" + tooltipPreId + sfxIdHideThis).attr('href', data.hideThisUrl);
					$("#" + tooltipPreId + sfxIdHideFirm).attr('href', data.hideFirmUrl);
					$("#" + tooltipPreId + sfxIdSendClaim).attr('href', data.sendClaimUrl);
					if (onSucces instanceof Function) {
						onSucces();
					}
				} else if (data.status == "error") {
					$("#" + tooltipPreId + sfxErrorView).html(data.text);
					if (onError instanceof Function) {
						onError();
					}
				}
			}
		};
		if (uid != null && uid > 0) {
			$.getJSON(ajaxSrvUrl + uid, parseData);
		}
	};
	var getInfoCode = function(id) {
		return ''
		+ '<div style="width: 374px; height: 20px; overflow: hidden;">' 
		+ '		<div style="width: 290; float: left; margin-left: 8px;">' 
		+ '			<img id="' + id + sfxOnlineStatux + '" class="userTooltipOnlineStatus" />'
		+ '			<a target="_blank" id="' + id + sfxIdFirm + '" href="#" class="userTooltipTitle"></a>' 
		+ '		</div>' 
		+ '		<a id="' + id + sfxIdRaiting + '" href="#" target="_blank">' 
		+ '			<img id="' + id + sfxIdRaitImg + '" src="/tpl/jsp/images/infopage/zone_green.png" alt=""  />' 
		+ '		</a>' 
		+ '	</div>' 
		+ '	<div style="width: 374px; height: 80px; overflow: hidden; background-color: #efefef;">' 
		+ '		<div id="' + id + sfxIdLogoCont + '">' 
		+ '			<img id="' + id + sfxIdLogo + '" src="/tpl/jsp/images/1.gif" alt="logo" />' 
		+ '		</div>' 
		+ '		<div id="' + id + sfxIdInfo + '">'
		+ '			<div id="' + id + sfxIdAdress + '" class="userTooltipInfoItem"></div>' 
		+ '			<div id="' + id + sfxIdContact + '" class="userTooltipInfoItem"></div>' 
		+ '			<div id="' + id + sfxIdFirmCode + '" class="userTooltipInfoItem"></div>' 
		+ '			<div id="' + id + sfxIdPhones + '" class="userTooltipInfoItem"></div>' 
		+ '		</div>' 
		+ '	</div>' 
		+ '	<div style="width: 374px; height: 130px; overflow: hidden;">' 
		+ '		<div class="userTooltipLinksColumn" style="border-right: 1px solid #efefef;">' 
		+ '			<div id="' + id + sfxIdSendMsgCont + '" class="userTooltipSrvcLinkContainer">' 
		+ '				<a href="" id="' + id + sfxIdSendMsg + '" target="_blank" class="userTooltipSrvcLink">' 
		+ '				<img src="/tpl/jsp/images/infopage/mail.png" alt="" class="userTooltipSrvcLinkImg" />' 
		+ '				Отправить сообщение</a>' 
		+ '			</div>' 
		+ '			<div id="' + id + sfxIdWriteNoteCont + '" class="userTooltipSrvcLinkContainer">' 
		+ '				<a href="" id="' + id + sfxIdWriteNote + '" target="_blank" class="userTooltipSrvcLink">' 
		+ '				<img src="/tpl/jsp/images/infopage/otziv.png" alt="" class="userTooltipSrvcLinkImg" />' 
		+ '				Написать отзыв</a>' 
		+ '			</div>' 
		+ '			<div id="' + id + sfxIdAddPartnCont + '" class="userTooltipSrvcLinkContainer">' 
		+ '				<a href="" id="' + id + sfxIdAddPartn + '" target="_blank" class="userTooltipSrvcLink">' 
		+ '				<img src="/tpl/jsp/images/infopage/partner.png" alt="" class="userTooltipSrvcLinkImg" />' 
		+ '				Добавить в партнеры</a>' 
		+ '			</div>' 
		+ '			<div id="' + id + sfxIdAddIgnorCont + '" class="userTooltipSrvcLinkContainer">' 
		+ '				<a href="" id="' + id + sfxIdAddIgnor + '" target="_blank" class="userTooltipSrvcLink">' 
		+ '				<img src="/tpl/jsp/images/infopage/ignore.png" alt="" class="userTooltipSrvcLinkImg" />' 
		+ '				Добавить в игнор-лист</a>' 
		+ '			</div>' 
		+ '			<div id="' + id + sfxIdViewDocsCont + '" class="userTooltipSrvcLinkContainer">' 
		+ '				<a href="" id="' + id + sfxIdViewDocs + '" target="_blank" class="userTooltipSrvcLink">' 
		+ '				<img src="/tpl/jsp/images/infopage/view_docs.png" alt="" class="userTooltipSrvcLinkImg" />' 
		+ '				Посмотреть документы</a>' 
		+ '			</div>' 
		+ '		</div>' 
		+ '		<div class="userTooltipLinksColumn">' 
		+ '			<div id="' + id + sfxIdNotesCont + '" class="userTooltipSrvcLinkContainer">' 
		+ '				<a href="" id="' + id + sfxIdNotes + '" target="_blank" class="userTooltipSrvcLink">' 
		+ '				<img src="/tpl/jsp/images/infopage/info_menu.png" alt="" class="userTooltipSrvcLinkImg" />' 
		+ '				Заметки <span id="' + id + sfxIdNotesCount + '"></span></a>' 
		+ '			</div>' 
		+ '			<div class="userTooltipSrvcLinkContainer">' 
		+ '				<a href="" id="' + id + sfxIdPropos + '" target="_blank" class="userTooltipSrvcLink">' 
		+ '				<img src="/tpl/jsp/images/infopage/counteroffer.png" alt="" class="userTooltipSrvcLinkImg" />' 
		+ '				Встерчное предложение</a>' 
		+ '			</div>' 
		+ '			<div class="userTooltipSrvcLinkContainer">' 
		+ '				<a href="" id="' + id + sfxIdHideThis + '" target="_blank" class="userTooltipSrvcLink">' 
		+ '				<img src="/tpl/jsp/images/infopage/hide_one.png" alt="" class="userTooltipSrvcLinkImg" />' 
		+ '				Скрыть эту заявку</a>' 
		+ '			</div>' 
		+ '			<div class="userTooltipSrvcLinkContainer">' 
		+ '				<a href="" id="' + id + sfxIdHideFirm + '" target="_blank" class="userTooltipSrvcLink">' 
		+ '				<img src="/tpl/jsp/images/infopage/hide_all.png" alt="" class="userTooltipSrvcLinkImg" />' 
		+ '				Скрыть все заявки фирмы</a>' 
		+ '			</div>' 
		+ '			<div class="userTooltipSrvcLinkContainer">' 
		+ '				<a href="" id="' + id + sfxIdSendClaim + '" target="_blank" class="userTooltipSrvcLink">' 
		+ '				<img src="/tpl/jsp/images/infopage/complaint.png" alt="" class="userTooltipSrvcLinkImg" />' 
		+ '				Отправить жалобу</a>' 
		+ '			</div>' 
		+ '		</div>' 
		+ '	</div>';
	};
	var postInfoCreate = function(obj) {
		var id = obj.getId();
		$("#" + id + sfxIdAddPartn).bind('click', function(e) {
			e.preventDefault();
			var uid = obj.getLastUId();
			if (uid != 0) {
				addToPartner(uid);
			}
		});
		$("#" + id + sfxIdAddIgnor).bind('click', function(e) {
			e.preventDefault();
			var uid = obj.getLastUId();
			if (uid != 0) {
				addToIgnor(uid);
			}
		});
	};
	var errorCode = function(id) {
		return '<span id="' + id + sfxErrorView + '" class="userTooltipError"></span>';
	};
	
	return {
		init: function(id, appearance, selector, showTimeout) {
			if (selector == null || selector == '') {
				selector = 'a[uid]';
			}
			if (showTimeout == null) {
				showTimeout = 1000;
			}
			$(selector).tooltip(id, 384, 236, '/tpl/jsp/images/loading_small.gif', 
				'/tpl/jsp/images/infopage/user_info_popup.png', 1000, showTimeout, dataLoader, 
				getInfoCode(id), postInfoCreate, errorCode(id), 
				'uid', 'userTooltipViewContainer', false, appearance);
		}
	};
	
})(jQuery);



////////////////////////////////////
function bindKeyEditUserStatus(e){
	if (e.keyCode==27){ cancelEditUserStatus(); }
}
function cancelEditUserStatus(){
	$('#newTextStatus').val($('#textStatusA').html());
	$('#usiMyStatusEdit').hide();
	$('#usiMyStatusView').show();
}
function startEditUserStatus(){
	$('#usiMyStatusView').hide();
	$('#usiMyStatusEdit').show();
	$('#newTextStatus').focus();
	$('#newTextStatus').select();
	$('#newTextStatus').keydown(bindKeyEditUserStatus);
	return false;
}
function saveEditUserStatus(){
	$('#usiMyStatusEdit').hide();
	$('#usiMyStatusWait').show();
	$.getJSON(
		'/log/mypage/ajax',
		{ 'method': 'status.new', 'newstatus': $('#newTextStatus').val() },
		function(j){
			if (j[0]['status']!='ok'){
				alert(j[0]['text']);
				$('#usiMyStatusWait').hide();
				$('#usiMyStatusEdit').show();
			} else {
				$('#usiMyStatusWait').hide();
				$('#usiMyStatusView').show();
				if ($('#newTextStatus').val()==""){
					$('#textStatusA').html("Добавить статус");
				} else {
					$('#textStatusA').html($('#newTextStatus').val());
				}
			}
		}
	);
	return false;
}
///////////////////////////////////

function userInfoSendMessage(uid){
	document.location='/log/messages/'+uid;
	return false;
}
function sendUserInfoMail(key){
	window.open("/sendmail/?key="+key, "SendMessage", 
			"resizable=yes,titlebar=no,scrollbars=yes,toolbar=no,menubar=no,location=no,statusbar=no,width=540,height=680");
	return false;
}
function mlsFlipper(id){
	if ($('#flipper'+id).attr('isflipped')==null){
		$('#imgHide'+id).hide();
		$('#imgShow'+id).show();
		$('#flipper'+id).attr('isflipped', true);
	} else {
		$('#imgShow'+id).hide();
		$('#imgHide'+id).show();
		$('#flipper'+id).removeAttr('isflipped');
	}
	$('#flipper'+id).slideToggle('fast');
}
function openSvid(rz_fid){
	window.open("/reliability_zone/view_svid.php?rz_firm_id="+rz_fid, "RzSvid", 
	"resizable=yes,titlebar=no,scrollbars=yes,toolbar=no,menubar=no,location=no,statusbar=no,width=600,height=800");
	return false;
}



/////////////////////////////////////////////////////////////////////////////////////////////////////////////
function userInfoNewResponse(rzfid){
	document.location='/reliability_zone/add_response.php?step=2&firm='+rzfid;
}
function addToPartner(uid){
	$('#lmuiPAdd').hide();
	$('#lmuiPLoad').show();
	$.getJSON(
		'/user2/ajax/', { 'method': 'partner.add', 'uid': uid },
		function(data){
			if (data.status=='ok'){
				alert('Запрос на партнерство выслан.');
			} else {
				alert(data.text);				
			}
			$('#lmuiPAdd').show();
			$('#lmuiPLoad').hide();
		}
	);
	return false;
}
function delFromPartner(uid){
	var tmp = confirm("Вы действительно хотите удалить фирму своих партнеров?");
	if (tmp){
		$('#lmuiPRem').hide();
		$('#lmuiPLoad').show();
	
		$.getJSON(
			'/user2/ajax/', { 'method': 'partner.del', 'uid': uid },
			function(data){
				if (data.status=='ok'){
					$('#lmuiPLoad').hide();
					$('#lmuiPAdd').show(); 
				} else {
					alert(data.text);
					$('#lmuiPRem').show();
					$('#lmuiPLoad').hide();
				}
			}
		);
	}
	return false;
}
function addToIgnor(uid){
	var tmp=confirm("Вы действительно хотите добавить данную фирму в игнор-лист?");
	if (tmp){
		$('#lmuiIAdd').hide();
		$('#lmuiILoad').show();
		$.getJSON(
			'/user2/ajax/', { 'method': 'ignore.add', 'uid': uid },
			function(data){
				if (data.status=='ok'){
					$('#lmuiILoad').hide();
					$('#lmuiIRem').show();
				} else {
					alert(data.text);
					$('#lmuiIAdd').show();
					$('#lmuiILoad').hide();
				}
			}
		);
	}
	return false;
}
function delFromIgnor(uid){
	$('#lmuiIRem').hide();
	$('#lmuiILoad').show();

	$.getJSON(
		'/user2/ajax/', { 'method': 'ignore.del', 'uid': uid },
		function(data){
			if (data.status=='ok'){
				$('#lmuiILoad').hide();
				$('#lmuiIAdd').show();
			} else {
				alert(data.text);
				$('#lmuiIRem').show();
				$('#lmuiILoad').hide();
			}
		}
	);
	return false;
}






function userInfoSetFlipper(id){
	var text = $('#id'+id).html();
	var html='<table border="0" cellpadding="0" cellspacing="0" class="userinfoflip">';
	html+="<tr onclick='return userInfoFlipHide(\"idb"+id+"\")' id='idb"+id+"M'>";
	html+="<td id='la'>"+text+'</td><td id="ra"><img src="/tpl/jsp/images/-.png"></td>';
	html+="</tr>";
	html+="<tr style='display: none;' onclick='return userInfoFlipShow(\"idb"+id+"\")' id='idb"+id+"P'>";
	html+="<td id='la'>"+text+"</td><td id='ra'><img src='/tpl/jsp/images/+.png'></td>";
	html+="</tr>";
	html+="</table>";
	$('#id'+id).html(html);
}
function userInfoFlipHide(id){
	$('#'+id).hide();
	$('#'+id+"M").hide();
	$('#'+id+"P").show();
}
function userInfoFlipShow(id){
	$('#'+id).show();
	$('#'+id+"P").hide();
	$('#'+id+"M").show();
}



/* различные утилиты */

/**
 * вызов попапа для редактирования логотипы фирмы
 */
function updateLogo(){
		window.open("/log/fileserver/updatelogo.jsp","update_logo", "resizable=yes,titlebar=no,toolbar=no,menubar=no,location=no,statusbar=no,width=420,height=540,left="
				+(screen.width/2-410/2)+",top="+(screen.height/2-500/2));
}

/**
 * вызов попапа для редактирования аватара юзера
 */
function updateAvatar(contactId){
	if (contactId) {
		contactId = '?contact_id=' + contactId;
	} else {
		contactId = '';
	}
	window.open("/log/fileserver/updateavatar/" + contactId, "update_avatar", 
		"resizable=yes,titlebar=no,toolbar=no,menubar=no,location=no,statusbar=no,width=420,height=540,left="
		+(screen.width/2-410/2)+",top="+(screen.height/2-500/2));
}

/**
 * возвращает текущий домен
 */
function getCurrDomain() {
	var domains = ["localhost:8080", "lardi-trans.com", "lardi.com.ua"];
	var domain = window.location.hostname;
	for (var tmp in domains) {
		if (domain.indexOf(domains[tmp]) != -1) {
			return domains[tmp];
		}
	}
	return domain;
}

function getSubdomainUrl(subdomain, port) {
	if (port) {
		port = ":" + port;
	} else if (window.location.port) {
		port = ":" + window.location.port;
	} else {
		port = "";
	}
	if (!subdomain) {
		subdomain = "";
	} else {
		subdomain = subdomain + ".";
	}
	return "http://" + subdomain + getCurrDomain() + port;
}

/**
 * @author valera
 * Объект для создания подменю, выпадающего при нажатии на элемент с указанным id
 */
Submenu = (function($) {
	return function(btnSelector, containerId, subBtnsClass, callBack, anchor, 
		dx, dy, setContWidth, afterPopup) 
	{
		if (!btnSelector || !containerId) {
			return false;
		}
		var styles = {
				position: 'absolute', 
				display: 'none', 
				"z-index": 100
			};
		if (setContWidth) {
			var btn = $(btnSelector);
			styles.width = (btn.width() + 
				parseInt(btn.css('padding-left')) +
				parseInt(btn.css('padding-right')) + 
				parseInt(btn.css('border-left-width')) + 
				parseInt(btn.css('border-right-width'))) + 'px';
		}
		$('#' + containerId).css(styles).click(function(e) {
			e.preventDefault();
			e.stopPropagation();
		});
		var hide = function() {
			if (!_skipOneHide) {
				$('#' + containerId).hide();
			}
			_skipOneHide = false;
		};
		$(window).click(function() {
			hide();
		});
		$(btnSelector).click(function(e) {
			var btn = $(this);
			var position = btn.offset();
			if (dy) {
				position.top += dy;
			}
			if (dx) {
				position.left += dx;
			}
			if (anchor === Submenu.POS_LEFTBOTTOM || 
					anchor === Submenu.POS_RIGHTBOTTOM) 
			{
				position.top += btn.height() + 
					parseSize(btn.css('padding-top')) + 
					parseSize(btn.css('padding-bottom')) + 
					parseSize(btn.css('border-top-width')) + 
					parseSize(btn.css('border-bottom-width'));
			}
			if (anchor === Submenu.POS_RIGHTTOP || 
					anchor === Submenu.POS_RIGHTBOTTOM) 
			{
				position.left += btn.width() + 
					parseSize(btn.css('padding-left')) + 
					parseSize(btn.css('padding-right')) + 
					parseSize(btn.css('border-left-width')) + 
					parseSize(btn.css('border-right-width'));
			}
			$('#' + containerId).css(position).show();
			e.preventDefault();
			e.stopPropagation();
			if (afterPopup instanceof Function) {
				afterPopup.call(this, e);
			}
		});
		if (subBtnsClass) {
			$('.' + subBtnsClass).click(function(e) {
				if (callBack instanceof Function) {
					callBack.call(this, e);
				}
				hide();
				e.preventDefault();
				e.stopPropagation();
			});
		}
		var _skipOneHide = false;
		this.skipOneHide = function(val) {
			_skipOneHide = val === true || val == "true";
		};
		this.hide = hide;
	};
})(jQuery);
Submenu.POS_LEFTTOP = 1;
Submenu.POS_LEFTBOTTOM = 2;
Submenu.POS_RIGHTTOP = 3;
Submenu.POS_RIGHTBOTTOM = 4;


parseSize = function(valStr) {
	var pos = valStr.indexOf('px');
	if (pos > 0) {
		valStr = valStr.substring(0, pos);
	}
	return parseInt(valStr);
};

/**
 * @author valera
 * Объект для создания навигации основанной на событиях
 */
(function($) {
	window.Paginator = function(itemsPerPage, itemsCount, currPage) {
		var _currPage = 0;
		var _pageCount = 0;
		var _itemsCount = 0;
		var _itemsPerPage = 20;
		var obj = this;
		if (currPage != null) {
			_currPage = currPage;
		}
		if (itemsPerPage != null && itemsPerPage != 0) {
			_itemsPerPage = itemsPerPage;
		}
		if (itemsCount != null) {
			_pageCount = Math.ceil(itemsCount / _itemsPerPage);
		}
		this.pageSeparator = ' ';
		this.nextPageLbl = '&gt;&gt;';
		this.prevPageLbl = '&lt;&lt;';
		this.firstPageLbl = 'Первая';
		this.lastPageLbl = 'Последняя';
		this.activPgsClass = 'activePageItem';
		this.inactPgsClass = 'inactivePageItem';
		this.extText = '...';
		this.extClass = '';
		this.currPageLabelClass = '';
		this.pageLinkHalfCount = 3;
		this.setCurrPage = function(val) {
			if (val != null) {
				if (val >= _pageCount && val != 0) {
					val = _pageCount - 1;
				}
				_currPage = val;
			}
		};
		this.getCurrPage = function() {
			return _currPage;
		};
		this.setItemsPerPage = function(val) {
			if (val != null && val > 0) {
				_itemsPerPage = val;
				_pageCount = Math.ceil(_itemsCount / _itemsPerPage);
			}
		};
		this.getItemsPerPage = function() {
			return _itemsPerPage;
		};
		this.setItemsCount = function(val) {
			if (val != null) {
				_itemsCount = val;
				_pageCount = Math.ceil(_itemsCount / _itemsPerPage);
			}
		};
		var getPageItemCode = function(pageNum, label) {
			var navCode = '<span class="'; 
			if (pageNum == _currPage || pageNum < 0 || pageNum >= _pageCount) {
				navCode += obj.inactPgsClass;
			} else {
				navCode += obj.activPgsClass;
			}
			if (label == null) {
				label = pageNum + 1;
			}
			navCode += '" page="' + pageNum + 
				'">' + label + '</span>';
			return navCode;
		};
		var getExtCode = function() {
			return '<span class="' + obj.extClass + '">' + obj.extText + '</span>';
		};
		this.createNavigation = function(containersSelector, callback) {
			if (containersSelector == null || containersSelector == '') {
				return;
			}
			if (_pageCount < 1) {
				$(containersSelector).html("").hide();
				return;
			}
			var navCode = getPageItemCode(_currPage);
			for (var iPage = 1; iPage <= obj.pageLinkHalfCount; iPage++) {
				if (_currPage - iPage >= 0) {
					if (navCode != '') {
						navCode = obj.pageSeparator + navCode;
					}
					navCode = getPageItemCode(_currPage - iPage) + navCode;
				}
				if (_currPage + iPage < _pageCount) {
					if (navCode != '') {
						navCode += obj.pageSeparator;
					}
					navCode += getPageItemCode(_currPage + iPage);
				}
			}
			if (_currPage > 0) {
				if (navCode != '') {
					navCode = obj.pageSeparator + navCode;
				}
				navCode = getPageItemCode(_currPage - 1, obj.prevPageLbl) + 
					obj.pageSeparator + navCode;
			}
			if (_currPage - obj.pageLinkHalfCount > 0) {
				if (navCode != '') {
					navCode = obj.pageSeparator + navCode;
				}
				navCode = getPageItemCode(0, obj.firstPageLbl) + getExtCode() + 
					navCode;
			}
			if (_currPage < _pageCount - 1) {
				if (navCode != '') {
					navCode += obj.pageSeparator;
				}
				navCode += getPageItemCode(_currPage + 1, obj.nextPageLbl);
			}
			if (_currPage + obj.pageLinkHalfCount < _pageCount - 1) {
				if (navCode != '') {
					navCode += obj.pageSeparator;
				}
				navCode +=  getExtCode() + getPageItemCode(_pageCount - 1, 
					obj.lastPageLbl);
			}
			navCode = '<span class="' + obj.currPageLabelClass + '">Страница ' + 
				(_currPage + 1) + ' из ' + _pageCount + ':</span>' + navCode;
			$(containersSelector).html(navCode).show();
			if (callback instanceof Function) {
				$('.' + obj.activPgsClass).bind('click', function() {
						callback(parseInt(this.getAttribute('page')));
				});
			}
		};
	};

})(jQuery);

Key = {
	Backspace: 8, 
	Tab: 9,  
	Enter: 13, 
	Shift: 16, 
	Ctrl: 17, 
	Alt: 18, 
	Pause: 19, 
	CapsLook: 20, 
	Esc: 27,
	Space: 32, 
	PageUp: 33, 
	PageDown: 34,
	End: 35, 
	Home: 36, 
	Left: 37, 
	Up: 38, 
	Right: 39, 
	Down: 40,
	Insert: 45, 
	Delete: 46,
	_0: 48,
	_1: 49,
	_2: 50,
	_3: 51,
	_4: 52,
	_5: 53,
	_6: 54,
	_7: 55,
	_8: 56,
	_9: 57,
	_A: 65,
	_B: 66,
	_C: 67,
	_D: 68,
	_E: 69,
	_F: 70,
	_G: 71,
	_H: 72,
	_I: 73,
	_J: 74,
	_K: 75,
	_L: 76,
	_M: 77,
	_N: 78,
	_O: 79,
	_P: 80,
	_Q: 81,
	_R: 82,
	_S: 83,
	_T: 84,
	_U: 85,
	_V: 86,
	_W: 87,
	_X: 88,
	_Y: 89,
	_Z: 90,
	_a: 97, 
	_b: 98, 
	_c: 99, 
	_d: 100, 
	_e: 101, 
	_f: 102, 
	_g: 103, 
	_h: 104, 
	_i: 105, 
	_j: 106, 
	_k: 107, 
	_l: 108, 
	_m: 109, 
	_n: 110, 
	_o: 111, 
	_p: 112, 
	_q: 113, 
	_r: 114, 
	_s: 115, 
	_t: 116, 
	_u: 117, 
	_v: 118, 
	_w: 119, 
	_x: 120,  
	_y: 121, 
	_z: 122, 
	NUM_0: 96, 
	NUM_1: 97, 
	NUM_2: 98, 
	NUM_3: 99, 
	NUM_4: 100,
	NUM_5: 101,
	NUM_6: 102,
	NUM_7: 103,
	NUM_8: 104,
	NUM_9: 105, 
	NUM_Lock: 144,
	NUM_Dot: 110,
	NUM_Enter: 13,
	NUM_Multiply: 106,
	NUM_Plus: 107,
	NUM_Minus: 109,
	NUM_Divide: 111,
	ScroolLock: 145, 
	Semicolon: 186, 
	Equal: 187, 
	Comma: 188,
	Minus: 189, 
	Period: 190, 
	Slash: 191, 
	Apostrophe: 192, 
	BracketOpen: 219, 
	BackSlash: 220, 
	BracketClose: 221, 
	SingleQuote: 222,
	F1: 112, 
	F2: 113, 
	F3: 114, 
	F4: 115, 
	F5: 116, 
	F6: 117, 
	F7: 118, 
	F8: 119, 
	F9: 120,
	F10: 121, 
	F11: 122, 
	F12: 123 
};

KeyUtils = (function() {
	var isDigit = function(e, useNumpad) {
		return (e.which >= Key._0 && e.which <= Key._9 || useNumpad && e.which >= Key.NUM_0 && e.which <= Key.NUM_9) && 
			!e.ctrlKey && !e.shiftKey && !e.altKey;
	};
	var isControl = function(e) {
		return $.inArray(e.which, [Key.Backspace, Key.Up, Key.Down, Key.Left, Key.Right, Key.Enter, Key.Home, 
			Key.End, Key.Esc, Key.Shift, Key.Ctrl, Key.Alt, Key.Delete, Key.Tab ]) != -1;
	};
	var isShortKeys = function(e, useSmallChars) {
		return e.ctrlKey && ($.inArray(e.which, [Key._X, Key._C, Key._V, Key._A]) != -1 || useSmallChars &&
			$.inArray(e.which, [Key._x, Key._c, Key._v, Key._a]) != -1) || e.shiftKey && e.which == Key.Insert;
	};
	var isLatinLetter = function(e, useSmallChars) {
		return e.which >= Key._A && e.which <= Key._Z || useSmallChars && e.which >= Key._a && e.which <= Key._z;
	};
	return {
		isDigit : isDigit,
		isShortKeys : isShortKeys, 
		isControl : isControl, 
		isLatinLetter: isLatinLetter
	};
})();

(function($) {
	/**
	 * Добавляет к выбранным элементам фильтр ввода, отменяющий действие
	 * по умолчание для неподходящих событий keypress
	 * @param keys - либо массив разрешенных/запрещенных (определяется вторым 
	 * параметром) кодов клавиш; либо callback-функция, принимающая код клавиши
	 * и возвращающая boolean, означающий проходит ли эта клавиша фильтр
	 * @param allowed - если первый параметр - массив, данный параметр указывает 
	 * является ли коды в этом массиве подходящими под филтр (true) или 
	 * неподходящими (false).
	 */
	$.fn.addFilter = function(isAllowedForDown, isAllowedForPress) {
		return this.each(function(index, value) { 
			var input = $(value);
			if ($.isFunction(isAllowedForDown)) {
				input.keydown(function(e) {
					if (!isAllowedForDown(e)) {
						e.preventDefault();
					}
				});
			}
			if ($.isFunction(isAllowedForPress)) {
				input.keypress(function(e) {
					if (!isAllowedForPress(e)) {
						e.preventDefault();
					}
				});
			}
		}); 
	};
	$.fn.addDownFilter = function(keys, allowed) {
		allowed = (allowed != null)?allowed:true;
		return this.each(function(index, value) { 
			$(value).keydown(function(e) {
				if ($.isArray(keys)) {
					if (allowed ^ ($.inArray(e.which, keys) != -1)) {
						e.preventDefault();
					}
				}
			});
		}); 
	}
	window.KEY_CODE_SHIFT = 256;
	/**
	 * Добавляет обработчик нажатия определенной клавиши на клавиатуре.
	 * @param handlers - plain object: ключ - код клавиши (для символьных клавиш)/
	 * код клавиши + KEY_CODE_SHIFT (для управляющих клавиш), 
	 * значение - функция-обработчик.
	 */
	$.fn.addKeyHandler = function(handlers) {
		return this.each(function(index, value) { 
			if (handlers instanceof Object) {
				$(value).keypress(function(e) {
					var keyCode = e.which;
					if (keyCode) {
						if ($.isFunction(handlers[keyCode])) {
							handlers[keyCode].call(value, e);
						}
					}
					keyCode = e.keyCode + KEY_CODE_SHIFT;
					if (keyCode) {
						if ($.isFunction(handlers[keyCode])) {
							handlers[keyCode].call(value, e);
						}
					}
				});
			}
		}); 
	};
	/**
	 * Отображает изображение в центре элементов коллекции. 
	 * @param waitImgId - id отображаемого изображения ожидания;
	 * @param fogElementId - id элемента для приглужения.
	 */
	$.fn.showWait = function(waitImgId, fogElementId, opacity) {
		opacity = (opacity != null)?opacity:0;
		return this.each(function(index, value) { 
			var container = $(value);
			var pos;
			try {
				pos = container.offset();
			} catch (e) {
				pos = {left: 0, top: 0};
			}
			if (value == window) {
				pos.top += $(window).scrollTop();
				pos.left += $(window).scrollLeft();
			}
			var tmpVal = parseInt(container.css('border-left-width'));
			if (!isNaN(tmpVal)) {
				pos.left += tmpVal;
			}
			var tmpVal = parseInt(container.css('border-right-width'));
			if (!isNaN(tmpVal)) {
				pos.top += tmpVal;
			}
			var w = container.width();
			var tmpVal = parseInt(container.css('padding-left'));
			if (!isNaN(tmpVal)) {
				w += tmpVal;
			}
			var tmpVal = parseInt(container.css('padding-right'));
			if (!isNaN(tmpVal)) {
				w += tmpVal;
			}
			var h = container.height();
			var tmpVal = parseInt(container.css('padding-top'));
			if (!isNaN(tmpVal)) {
				h += tmpVal;
			}
			var tmpVal = parseInt(container.css('padding-bottom'));
			if (!isNaN(tmpVal)) {
				h += tmpVal;
			}
			var fogCss = {};
			fogCss.left = pos.left;
			fogCss.top = pos.top;
			var waitImg = $('#' + waitImgId);
			if (waitImg.size() > 0) {
				pos.left += Math.ceil(w / 2) - waitImg.width() / 2;
				pos.top += Math.ceil(h / 2) - waitImg.height() / 2;
				waitImg.css(pos).show();
			}
			fogCss = $.extend(fogCss, {width: w, height: h, opacity: opacity});
			$('#' + fogElementId).css(fogCss).show();
		});
	};
	/**
	 * позиционирует элементы коллекции к указателю мыши
	 * @param event - jQuery-объект события мыши
	 * @param align - строка, определяющая, какой угол элементов коллекции будет 
	 * привязываться к указателю мыши, доступные значения: "left rigth top bottom", 
	 * по умолчанию: "left top"
	 */
	$.fn.positionateToMouse = function(event, align) {
		var x = event.pageX; 
		var y = event.pageY;
		var winWidth = $(window).width();
		var winHeight = $(window).height();
		var winTop = 0;
		if (window.scrollY) {
			winTop = window.scrollY;
		}
		if (document.documentElement.scrollTop) {
			winTop = document.documentElement.scrollTop;
		}
		if (document.body.scrollTop) {
			winTop = document.body.scrollTop;
		}
		var winLeft = 0;
		if (window.scrollX) {
			winLeft = window.scrollX;
		}
		if (document.documentElement.scrollLeft) {
			winLeft = document.documentElement.scrollLeft;
		}
		if (document.body.scrollLeft) {
			winLeft = document.body.scrollLeft;
		}
		var thisHeight = this.height();
		if (align && align.indexOf instanceof Function) {
			if (align.indexOf("right") > -1) {
				x = x - this.width();
			}
			if (align.indexOf("bottom") > -1) {
				y = y - thisHeight;
			}
		}
		if (x < winLeft) {
			x = winLeft;
		}
		if (y + thisHeight > winHeight + winTop) {
			y = winHeight + winTop - thisHeight;
		}
		if (y < winTop) {
			y = winTop;
		}
		return this.css({left: x + 'px', top: y + 'px'});
	};
	
	/**
	 * установка курсора в заданную позицию в первом элементе коллекции
	 */
	$.fn.setCursorPosition = function(pos) {
		if ($(this).get(0).setSelectionRange) {
		  $(this).get(0).setSelectionRange(pos, pos);
		} else if ($(this).get(0).createTextRange) {
		  var range = $(this).get(0).createTextRange();
		  range.collapse(true);
		  range.moveEnd('character', pos);
		  range.moveStart('character', pos);
		  range.select();
		}
	};
})(jQuery);

/**
 * Функция-прототип объекта для отображения ожидания
 */
WaitVisualizer = function(waitPageImgId, waitPageFogId, create, icoUrl) {
	if (create) {
		if (icoUrl == null || icoUrl == '') {
			icoUrl = '/tpl/jsp/images/loading_small.gif';
		}
		var elsHtml = '';
		if (waitPageImgId != null && waitPageImgId != '') {
			elsHtml += '<img id="' + waitPageImgId + 
			'" class="ajaxWaitIco" src="' + icoUrl + '" />';
		}
		if (waitPageFogId != null && waitPageFogId != '') {
			elsHtml += '<div id="' + waitPageFogId + 
			'" class="ajaxWaitFog"></div>';
		}
		$('body').append(elsHtml);
	}	
	var _containerSelr;	
	this.hide = function() {
		$('#' + waitPageImgId).hide();
		$('#' + waitPageFogId).hide();
	};	
	this.show = function(containerSelr) {
		if (containerSelr == null && _containerSelr) {
			containerSelr = _containerSelr;
		}
		if (containerSelr) {
			try {
				$(containerSelr).showWait(waitPageImgId, waitPageFogId, 0.5);
			} catch(e) {}
		}
	};	
	this.setWaitContSelector = function(containerSelr) {
		_containerSelr = containerSelr;
	};	
};

WaitVisualizerSimple = function(waitImgId) {
	this.hide = function() {
		$('#' + waitImgId).hide();
	};	
	this.show = function() {
		$('#' + waitImgId).show();
	};	
};

BgWaitVisualizer = function(inputSelector) {
	this.show = function() {
		$(inputSelector).css({
			'background-image': 'url("http://valera.lardi.com.ua/tpl/jsp/images/loading_small.gif")', 
			'background-repeat': 'no-repeat', 
			'background-position': 'right'
		});
	};	
	this.hide = function() {
		$(inputSelector).css('background-image', 'none');
	};	
};

/**
 * Функция-прототип объекта для выполнения ajax-запросов к серверу
 */
AjaxManager = function(serverUrl, waitVisualizer, dataType) {	
	var hideWait = function() {
		if (waitVisualizer != null && waitVisualizer.hide instanceof Function) {
			waitVisualizer.hide();
		}
	};	
	var showWait = function(waitContainerSelr) {
		if (waitVisualizer != null && waitVisualizer.show instanceof Function) {
			waitVisualizer.show(waitContainerSelr);
		}
	};	
	this.doOperation = function(operation, params, onSuccess, onError, 
		waitContainerSelr, reqType, afterRequestEnd) 
	{
		if (typeof params == 'string') {
			if (params.length == 0) {
				params = 'operation=' + operation;
			} else {
				params = params + '&operation=' + operation;
			}
		} else {
			if (params == null || typeof params == 'number') {
				params = {};
			}
			params.operation = operation;
		}
		showWait(waitContainerSelr);
		if (reqType == null || reqType.toLowerCase() != 'get') {
			reqType = 'post';
		}
		if (dataType == null) {
			dataType = 'json';
		}
		var status;
		var doError = function(msg, textStatus, jqXHR, errorThrown) {
			if (onError instanceof Function) {
				onError(msg, textStatus, jqXHR, errorThrown);
			} else if (typeof onError == "string") {
				alert(onError);
			} else {
				alert(msg);
			}
		};
		$.ajax({
			url: serverUrl,
			dataType: dataType, 
			data: params, 
			error: function(jqXHR, textStatus, errorThrown){
					status = textStatus;
					var msg;
					if (jqXHR && jqXHR.responseText) {
						msg = jqXHR.responseText;
					} else {
						msg = 'Произошла ошибка! Попробуйте снова позже или обратитесь в службу поддержки.';
					}
					doError(msg, textStatus, jqXHR, errorThrown);
				}, 
			success: function(data) {
					if (dataType == 'jsonp' && data.error != null) {
						doError(data.error);
					}
					status = "success";
					if (onSuccess instanceof Function) {
						try {
							onSuccess(data);
						} catch (e) {}
					}
				}, 
			complete: function(jqXHR, textStatus){
				hideWait();
				if (afterRequestEnd instanceof Function) {
					afterRequestEnd(status);
				}				
			}, 
			type: reqType, 
			traditional: true
		});
	};	
};

/**
 * возвращает количество строк в строковой переменной (т.е. с учетом новых строк)
 */
getRowsCount = function(text) {
	var count = 0;
	for (var i = 0; i < text.length; i++) {
		if (text[i] == "\n") {
			count++;
		}
	}
	return count + 1;
};

getInfoBlockHtml = function(text, type) {
	var typeClass = '';
	if (type == 'error') {
		typeClass = ' uiInformationRed';
	} else if (type == 'warning') {
		typeClass = ' uiInformationYellow';
	} else {
		typeClass = ' uiInformationGray';
	}
	return '<div class="uiInformation' + typeClass + '">' + text + '</div>';
};



$.fn.animateBgColor = function(colorFrom, colorTo, durationInMs, stepsCount) {
	if (durationInMs == 0) {
		durationInMs = 20;
	}
	if (stepsCount == 0) {
		stepsCount = Math.ceil(durationInMs / 10);
	}
	var currStep = 0;
	var item = $(this);
	if (!colorFrom) {
		colorFrom = item.css('background-color');
		colroFrom = parseInt(colorFrom.replace('#', ''), 16);
	} else {
		item.css('background-color', '#' + colorFrom.toString(16));
	}
	var iterator = new colorIterator(stepsCount, colorFrom, colorTo);
	var stepDurration = durationInMs / stepsCount;
	var timer = window.setInterval(function() {
		currStep++;
		if (currStep <= stepsCount) {
			var color = iterator.iterate(currStep);
			item.css('background-color', '#' + color.toString(16));
		} else {
			window.clearInterval(timer);
		}
	}, stepDurration);
	return this;
};

var colorIterator = function(count, colorFrom, colorTo) {
	var rIterator = new valueIterator(count, (colorFrom & 0xff0000) >> 16, (colorTo & 0xff0000) >> 16);
	var gIterator = new valueIterator(count, (colorFrom & 0xff00) >> 8, (colorTo & 0xff00) >> 8);
	var bIterator = new valueIterator(count, (colorFrom & 0xff), (colorTo & 0xff));
	this.iterate = function(step) {
		var r = rIterator.iterate(step);
		var g = gIterator.iterate(step);
		var b = bIterator.iterate(step);
		return (r << 16) | (g << 8) | b;
	};
};

var valueIterator = function(count, from, to) {
	this.iterate = function(step) {
		if (step <= 0) {
			return from;
		} else if (step >= count) {
			return to;
		} else {
			return from + (to - from) * step / count;
		}
	};
};


var stopBubble = function(e) {
	if (!e){
		var e = window.event;
	}
	e.cancelBubble = true;
	if (e.stopPropagation){ 
		e.stopPropagation();
	}
};

OptionsData = function(options) {
	if (options == null) {
		options = {};
	}
	function getClasses() {
		if (options.classes != null) {
			return options.classes;
		} else {
			return {};
		}
	}
	this.getHtmlClassLine = function(classKey) {
		if (getClasses()[classKey]) {
			return ' class="' + getClasses()[classKey] + '"';
		} else {
			return "";
		}
	};
	this.getHtmlClassValue = function(classKey) {
		if (getClasses()[classKey]) {
			return getClasses()[classKey];
		} else {
			return "";
		}
	};
	this.getString = function(key) {
		if (options[key]) {
			return options[key];
		} else {
			return "";
		}
	};
};

function getUniqueId() {
	var res = "genId_" +  Math.floor(Math.random() * 10);
	while (document.getElementById(res) != null) {
		res += Math.floor(Math.random() * 10);
	}
	return res;
}
var gui_dropdown_selectors = new Array();
$(function(){
	$('body').click(
			function(e){
				for (var a in gui_dropdown_selectors){
					if ((e.target.id!=a+"Button")&&(e.target.id!=a+"Div")){
						if (gui_dropdown_selectors[a]==true){
							gui_dropdown_button_hide(a);
						}
					}
				}
			}
		);
});
function gui_dropdown_button_hide(id){
	$('#'+id+"Div").hide('fast');
	gui_dropdown_selectors[id]=false;
}
function gui_dropdown_button_show(id){
	$('#'+id+"Div").show('fast');
	gui_dropdown_selectors[id]=true;
}
function gui_dropdown_button_slide(id){
	$('#'+id+"Div").css("left", $('#'+id+"Button").position().left);
	if( ($('#'+id+"Div").width() + $('#'+id+"Button").position().left) > $(window).width()){
		var buttonPadding = parseInt($('#'+id+"Button").css("padding-left")) + parseInt($('#'+id+"Button").css("padding-right"));
		$('#'+id+"Div").css("left",$('#'+id+"Button").position().left - 
				$('#'+id+"Div").width()+$('#'+id+"Button").width()+buttonPadding);
	}
	$('#'+id+"Div").css("top", $('#'+id+"Button").position().top+$('#'+id+"Button").height+1);
	if ($('#'+id+"Div").css("display")=='block'){
		gui_dropdown_button_hide(id);
	} else {
		gui_dropdown_button_show(id);
	}
}
function gui_dropdown_action(id, scriptLine){
	eval(scriptLine);
	$('#'+id+"Div").hide();
	return false;
}

GoUpToolTip = (function(){
	
	var contId = "lardiPageUpTooltip";
	var showBelow = 0;
	var _message = "Вверх страницы";
	
	function initTooltip() {
		if ( $('#' + contId).size() < 1) {
			$('body').append('<div id="' + contId + '" class="t_link_fake lardiGoUpTooltip"><span><span>' + 
				'</span></span></div>');
			$('#' + contId).hide();
			$('#' + contId + '>span').click(function() {
				$(window).scrollTop(0);
			});
		}
	}
	
	var onScroolHandler = function() {
		if ($(window).scrollTop() > showBelow) {
			$('#' + contId).show();
		} else {
			$('#' + contId).hide();
		}
	};
	
	function switchOn(message, x, y, showBelow) {
		initTooltip(message);
		$(window).scroll(onScroolHandler);
		setPosition(x, y);
		setShowBelow(showBelow);
		setLabel(message);
	}
	
	function switchOff() {
		$('#' + contId).hide();
		$(window).unbind('scroll', onScroolHandler);
	}
	
	function setPosition(x, y) {
		var style = {'position': 'fixed'};
		var left = '10px';
		if (x == 'right') {
			style['text-align'] = 'right';
		} else if (x == 'center') {
			style['text-align'] = 'center';
		} else {
			style['text-align'] = 'left';
			x = parseInt(x);
			if (!isNaN(x)) {
				left = x + 'px';
			}
		}
		y = parseInt(y);
		if (!isNaN(y)) {
			style.top = y;
		}
		$('#' + contId).css(style);
		$('#' + contId + '>span').css('margin-left', left);
	}
	
	function setShowBelow(value) {
		if (typeof value == 'string') {
			if (value.indexOf('top ') === 0) {
				value = value.substring('top '.length);
				var el = $(value);
				value = el.offset().top;
			} else if (value.indexOf('bottom ') === 0) { 
				value = value.substring('bottom '.length);
				var el = $(value);
				value = el.offset().top + el.height();
			} else if (value == 'screen') {
				value = $(window).height();
			}
		}
		value = parseInt(value);
		showBelow = value;
	}
	
	function setLabel(value) {
		if (value == null) {
			value = _message;
		}
		$('#' + contId + '>span>span').text(value);
	}
	
	function setBgColor(color) {
		if (color != null && color != '') {
			$('#' + contId + '>span').css('background-color', color);
		}
	}
	
	return {
		switchOn: switchOn, 
		switchOff: switchOff, 
		setPosition: function(left, top) {
			initTooltip();
			setPosition(left, top);
		}, 
		setShowBelow: setShowBelow, 
		setLabel: function(value) {
			initTooltip();
			setLabel(value);
		}, 
		setBgColor: function(color) {
			initTooltip();
			setBgColor(color);
		}
	};
})();
Sender = function(id, callBackFunction, additionData, editId) {
	var close = function(callback) {
		$('#' + btnsContId).slideUp(200);
		$('#' + sliderId).slideUp(200, function() {
			$('#' + headerId).fadeIn(200);
			if (callback != null && typeof callback == 'function') {
				callback();
			}
		});
	};
	var open = function() {		
		$('#' + headerId).fadeOut(100, function() {
			$('#' + sliderId).slideDown(200, function() {
				$('#' + editId).focus();
			});
			$('#' + btnsContId).slideDown(200);
		});
	};
	this.close = close;
	this.open = open;
	this.showWait = function() {
		$('#' + actionBtnId).attr('disabled', 'disabled');
		waitVisualizer.show('#' + rootContId);
	};
	this.hideWait = function() {
		$('#' + actionBtnId).attr('disabled', null);
		waitVisualizer.hide();
	};
	this.setNoEnterdErrMessage = function(val) {
		noEnterdErrMessage = val;
	};
	var noEnterdErrMessage = 'Введите сообщение!';
	var actionBtnId = id + 'ActionBtn';
	if (editId == null) {
		editId = id + 'Edit';
	}
	var headerId = id + 'Header';
	var sliderId = id + 'ColapsableContainer';
	var closeBtnId = id + 'CollapseBtn';
	var btnsContId = id + 'BntsContainer';
	var rootContId = id + 'ContainerRoot';
	var dataType = 'text';
	var waitPageImgId = id + 'WaitImg';
	var waitPageFogId = id + 'WaitFog';
	var waitVisualizer = new WaitVisualizer(waitPageImgId, waitPageFogId, true);
	$('#' + actionBtnId).click(function(e) {
		if (callBackFunction && callBackFunction.apply) {
			var value = $('#' + editId).val();
			if ((value == null || value == "") && noEnterdErrMessage != '') {
				alert(noEnterdErrMessage);
			} else {
				callBackFunction.apply({}, [dataType, value].concat(additionData));
				$('#' + editId).val('');
			}
			e.preventDefault();
		}
	});
	$('#' + headerId).click(open);
	$('#' + closeBtnId).click(close);
	$('#' + editId)
		.focus(function() {
			resizeEdit();
		})
		//especially for Жопера
		.keypress(function(e) {
			if (e.which == 27) {
				close();
				return;
			}
		})
		.keyup(function(e) {
			if (e.which == 27) {
				close();
				return;
			}
			resizeEdit();
		});
	var resizeEdit = function() {
		var editor = $('#' + editId);
		var rowsCount = getRowsCount(editor.val());
		editor.css('height', Math.max((rowsCount + 1) * 16, getEditHeight() + 16));
	};
	$('body').append('<div id="heightCalcTestDiv" class="t senderEdit" style="position: absolute; ' + 
		'visibility: hidden; height: auto; overflow: auto;"></div>');
	var testDiv = $('#heightCalcTestDiv');
	var getEditHeight = function() {
		var editor = $('#' + editId);
		var w = editor.width();
		testDiv.html(editor.val().replace(/\n/g, "<br />")).css({
			width: w, 
			left: -w - 100, 
			display: 'block'
		});
		var res = testDiv.height();
		testDiv.hide();
		return res;
	};
}; 
/**
 * Скрипт для работы сворачивающегося меню
 * @author funymanz
 */
function uiSlideTable(divId,animationDuration) {
	if ($("#" + divId + "Div").css("display") == "none") {
		$("#" + divId + "Div").data('display', "block");
		$("#" + divId + "imgHide").slideDown(0);
		$("#" + divId + "imgShow").slideUp(0);
		
	} else {
		$("#" + divId + "Div").data('display', "none");
		$("#" + divId + "imgHide").slideUp(0);
		$("#" + divId + "imgShow").slideDown(0);
		
	}
	if(animationDuration==undefined)
		$("#" + divId + "Div").slideToggle();
	else
		$("#" + divId + "Div").slideToggle(animationDuration);
}function PhoneInput(contId, resId, required, wrongCharMsg, wrongPhoneMsg, emptyPhone) {
	var countryCode = '';
	var townCode = '';
	var phoneNumber = '';
	var _wrongCharMsg = 'Можно вводить только цифры!';
	var _wrongPhoneMsg = 'Не верный номер телефона!';
	var _emptyPhone = "Это поле обязательно для заполнения!";
	if (wrongCharMsg != null) {
		_wrongCharMsg = wrongCharMsg;
	}
	if (wrongPhoneMsg != null) {
		_wrongPhoneMsg = wrongPhoneMsg;
	}
	if (emptyPhone != null) {
		_emptyPhone = emptyPhone;
	}

	$('#' + contId + ' .phonePartEdt').addFilter(function(e) {
		return isValidChar(e, true);
	}, function(e) {
		return forOperaCostyl(e);
	}).change(function() {
		refreshValues();
		composeResValue();
	});
	$('#' + resId + 'countryCode').keydown(function(e) {
		if (e.which == Key.Enter) {
			$('#' + resId + 'townCode').focus().select();
			e.preventDefault();
		}
	});
	$('#' + resId + 'townCode').keydown(function(e) {
		if (e.which == Key.Enter) {
			$('#' + resId + 'phoneNumber').focus().select();
			e.preventDefault();
		}
	});
	$('#' + resId + 'phoneNumber').keydown(function(e) {
		if (e.which == Key.Enter) {
			$('#' + resId + 'phoneNumber').next('input').focus();
			e.preventDefault();
		}
	}).bind('focusout', function() {
		refreshValues();
		if (isEmpty()) {
			togleWarning(required, _emptyPhone);
		} else {
			togleWarning(!isValidValues(), _wrongPhoneMsg);
		}
		composeResValue();
	});

	var wrongFound = false;

	function isValidChar(e, forDown) {
		var res = KeyUtils.isDigit(e, forDown) || KeyUtils.isControl(e)	|| KeyUtils.isShortKeys(e, !forDown);
		wrongFound = !res;
		togleWarning(!res, _wrongCharMsg);
		return res;
	}
	;

	function forOperaCostyl(e) {
		var res = e.which != '*'.charCodeAt(0);
		if (!wrongFound) {
			togleWarning(!res, _wrongCharMsg);
		}
		wrongFound = false;
		return res;
	}

	function isValidValues() {
		return isInteger(phoneNumber) && isInteger(townCode)
				&& isInteger(countryCode);
	}

	function isEmpty() {
		return phoneNumber == '' && townCode == '' && countryCode == '';
	}

	function isInteger(value) {
		return /^\d+$/.test(value);
	}

	function composeResValue() {
		$('#' + resId).val("+" + countryCode + "(" + townCode + ")" + phoneNumber);
	}

	function refreshValues() {
		countryCode = $('#' + resId + 'countryCode').val();
		townCode = $('#' + resId + 'townCode').val();
		phoneNumber = $('#' + resId + 'phoneNumber').val();
	}

	function togleWarning(show, message) {
		if (show) {
			$('#' + contId + ' .uiPhoneWarning').html(message).show();
		} else {
			$('#' + contId + ' .uiPhoneWarning').html('').hide();
		}
	}

}

UserSelect = function(id) {
	var selColor = '#FCF5D7';
	var selectHandler;
	var currUid = 0;
	var currRzFid = 0;
	var currFirmRow = null;
	var _keyHandleSelector = null;
	var _deleteOnEsc = false;
	$('#' + id + ' tr').click(function() {
		preselectFirmRow($(this));
		select();
	}).mouseover(function() {
		preselectFirmRow($(this));
	});
	$('#' + id + ' a').click(function(e) {
		e.stopPropagation();
	});
	function preselectFirmRow(row, scrollTo) {
		$('#' + id + ' tr').css('background-color', 'white');
		currFirmRow = row;
		if (row != null) {
			row.css('background-color', selColor);
			currUid = row.attr('uid');
			currRzFid = row.attr('rzFid');
			if (scrollTo) {
				var cont = $('#' + id);
				var rowTop = row.position().top;
				var rowHeight = row.height();
				if (rowTop < 0) {
					cont.scrollTop(rowTop + cont.scrollTop());
				} else if (rowTop > cont.height() - rowHeight) {
					cont.scrollTop(rowTop + rowHeight - cont.height() + cont.scrollTop());
				}
			}
		} else {
			currUid = 0;
			currRzFid = 0;
			$('#' + id).scrollTop(0);
		}
	}
	function select(uid) {
		if (typeof selectHandler == 'function') {
			if (selectHandler(currUid, currRzFid)) {
				finalize();
			}
		}
	}
	function keyHandler(e) {
		show();
		if (e.which == Key.Enter) {
			if (currFirmRow != null) { 
				select();
			}
			e.preventDefault();
		} else if (e.which == Key.Up) {
			preselectFirmRow(getPrevFirmRow(), true);
			e.preventDefault();
		} else if (e.which == Key.Down) {
			preselectFirmRow(getNextFirmRow(), true);
			e.preventDefault();
		} else if (e.which == Key.Esc) {
			if (currFirmRow != null) { 
				preselectFirmRow(null, true);
			} else if (_deleteOnEsc){
				if (!finalize()) {
					e.preventDefault();
				}
			}
		}
	}
	function getPrevFirmRow() {
		return iterateFirmRow($.fn.prev);
	}
	function getNextFirmRow() {
		return iterateFirmRow($.fn.next);
	}
	function iterateFirmRow(cb) {
		if (currFirmRow == null) {
			currFirmRow = $($('#' + id + ' tr').get(0));
			return currFirmRow;
		}
		var tmp = cb.call(currFirmRow, 'tr');
		if (tmp.size() > 0) {
			currFirmRow = tmp;
		}
		return currFirmRow;
	}
	function hideOut(e) {
		if(e.target != $(_keyHandleSelector).get(0)) {
			$('#' + id).slideUp('fast');
		}
	}
	function show() {
		$('#' + id).slideDown('fast');
	}
	function finalize() {
		if (_keyHandleSelector) {
			$(_keyHandleSelector).unbind('keydown', keyHandler).unbind('click', show);
			$('body').unbind('click', hideOut);
			$('#' + id).remove();
			return false;
		}
		$('#' + id).remove();
		return true;
	}
	this.setSelectHandler = function(handler) {
		selectHandler = handler;
	};
	this.setCloseOnOutClick = function(close) {
		if (close) {
			$('body').click(hideOut);
		} else {
			$('body').unbind('click', hideOut);
		}
	};
	this.setKeyHandleSelector = function(keyHandleSelector) {
		_keyHandleSelector = keyHandleSelector;
		if (keyHandleSelector) {
			$(keyHandleSelector).keydown(keyHandler).click(show);
		}
	};
	this.setDeleteOnEsc = function(deleteOnEsc) {
		_deleteOnEsc = deleteOnEsc;
	};
	this.finalize = finalize;
	this.unselect = function() {
		preselectFirmRow(null, true);
	};
};

UserSearcher = function(element, selectHandler, options) {
	var ctrlSh = $(element);
	var selectId = getUniqueId();
	var waitTime = 1000;
	if (options == null) {
		options = {};
	}
	var waitTimeout = parseInt(options.waitTimeout);
	if (waitTimeout && !isNaN(waitTimeout)) {
		waitTime = waitTimeout;
	}
	var usersData;
	var lastSearchPhrase = null;
	var keyHandleSelector = element.id ? '#' + element.id : 'body';
	if (document.getElementById(selectId) == null) {
		ctrlSh.after('<div class="userSearchContainer" id="' + selectId + '"></div>');
	}
	var loadLock = (function(){
		var loaded = false;
		return {
			lock : function () {
				loaded = true;
			},
			unlock : function () {
				loaded = false;
			}, 
			isLocked : function() {
				return loaded;
			}
		};
	})();
	var doSearchNow  = function() {
		if (!loadLock.isLocked()) {
			if (_selectorItem != null) {
				_selectorItem.unselect();
			}
			loadLock.lock();
			requestSearch.clear();
			search(ctrlSh.val());
		}
	};
	this.doSearchNow  = doSearchNow;
	var _selectorItem = null;
	ctrlSh.keydown(function(e) {
		if (e.which == Key.Enter) {
			doSearchNow();
			e.preventDefault();
		} else {
			if (e.which != Key.Up && e.which != Key.Down && e.which != Key.Right && 
				e.which != Key.Left &&  e.which != Key.Esc) 
			{
				loadLock.unlock();
				if (_selectorItem != null) {
					_selectorItem.finalize();
				}
			}
			setTimeout(function() {
				var namePatt = ctrlSh.val();
				if (lastSearchPhrase != namePatt && namePatt != null && namePatt.length > 2) {
					lastSearchPhrase = null;
					requestSearch.start(namePatt);
				} else {
					requestSearch.clear();
				}
			}, 10);
		}
	});
	
	function foundHandler(data) {
		loadLock.lock();
		usersData = data.usersData;
		lastSearchPhrase = data.searchPhrase;
		var top = ctrlSh.offset().top + ctrlSh.outerHeight();
		var width;
		if (options.selectWidth) {
			width = options.selectWidth;
		} else {
			width = ctrlSh.outerWidth();
		}
		var style = {
			left: ctrlSh.offset().left, 
			top: top, 
			width: width
		};
		var winWidth = $(window).width();
		if (style.left + style.width > winWidth) {
			style.left = winWidth - style.width;
			if (style.left < 0) {
				style.left = 0;
			}
		}
		$('#' + selectId).html(data.userSelectHtml).css(style).slideDown('fast');
		if (data.initScriptLine) {
			$('body').append("<script type=\"text/javascript\">" + data.initScriptLine + "</script>");
		}
		if  (options.onFoundLoaded instanceof Function) {
			options.onFoundLoaded();
		}
	}
	
	var requestSearch = (function() {
		var timer = null;
		return {
			start: function(namePatt) {
				clearTimeout(timer);
				timer = setTimeout(function() {
					search(namePatt);
				}, waitTime);
			}, 
			clear: function () {
				clearTimeout(timer);
			}
		};
	})();
	
	var search = (function(){
		var ajaxManager = new AjaxManager('/dinamix/search_user', new BgWaitVisualizer(keyHandleSelector));	
		var setterName = null;
		var selectHandlerPrefix = "searchUserSelectHandler";
		setterName = getSelectHandlerUniqueName();
		window[setterName] = function(selectorItem) {
			_selectorItem = selectorItem;
			if (typeof selectHandler == 'function') {
				_selectorItem.setSelectHandler(function (uid, rzFid) {
					requestSearch.clear();
					var hide = true;
					if (options.loadAdditionData && usersData instanceof Array) {
						hide = selectHandler(uid, rzFid, findUserData(uid, rzFid));
					} else {
						hide = selectHandler(uid, rzFid);
					}
					return hide;
				});
			}
			_selectorItem.setCloseOnOutClick(true);
			_selectorItem.setKeyHandleSelector(keyHandleSelector);
			_selectorItem.setDeleteOnEsc(true);
		};
		function searchUsers(namePatt) {
			clearSelector();
			var params = {
				namePattern: namePatt, 
				loadAdditionData: options.loadAdditionData, 
				ownerSetterName: setterName
			};
			if(options.limit){
				params.limit = options.limit;
			}
			if(options.hiddenCellID){
				params.hiddenCellID = options.hiddenCellID;
			}
			if (options.searchInRzFirms == true) {
				params.searchInRzFirms = true;
				if (options.searchInUsers == true) {
					params.searchInUsers = true;
				}
			} else {
				params.searchInUsers = true;
			}
			if (options.useLinksForFirms) {
				params.useLinksForFirms = true;
			}
			ajaxManager.doOperation('searchUsers', params, foundHandler);
		}
		function clearSelector() {
			if (_selectorItem != null) {
				_selectorItem.finalize();
				_selectorItem = null;
			}
		}
		function findUserData(uid, rzFid) {
			for (var i in usersData) {
				var tmpUserData = usersData[i];
				if (tmpUserData.uid == uid && tmpUserData.rzFid == rzFid) {
					return tmpUserData;
				}
			}
		}
		function getSelectHandlerUniqueName() {
			var res = selectHandlerPrefix;
			while (window[res] != null) {
				res += Math.floor(Math.random() * 10);
			}
			return res;
		}
		return function (namePatt) {
			searchUsers(namePatt);
		};
	})();
	
};

$.fn.addUserSearch = function(selectHandler, options) {
	return this.each(function(i, element) {
		new UserSearcher(element, selectHandler, options);
	});
};/*
 Длинна пароля, должна составлять не менее 6 символов.
 При выборе пароля, рекомендуется использовать комбинацию 
 из строчных и прописных букв, цифр, знаков препинания и специальных символов.
 */
var emptyPass = 0;
var shortPass = 1;
var badPass = 2;
var goodPass = 3;
var strongPass = 4;
	
function doCheckPassStrong(InputID, OutputID){
	var pass=$("#"+InputID).val();
	
		var result = passwordStrength(pass);
		
		switch (result){
		case emptyPass:
			$("#"+OutputID).html("");
			break;
		case shortPass:
			$("#"+OutputID).html("Слабая");
			$("#"+OutputID).css('color', "#f40000");
			break;
		case badPass:
			$("#"+OutputID).html("Низкая");
			$("#"+OutputID).css('color', "#d99100");
			break;
		case goodPass:
			$("#"+OutputID).html("Средняя");
			$("#"+OutputID).css('color', "#b6c100");
			break;
		case strongPass:
			$("#"+OutputID).html("Высокая");
			$("#"+OutputID).css('color', "#00a000");
			break;
		}

}
function doCheckPassEquals(pass1,pass2, passEquals)
{
	var password_input=$("#"+pass1).val();
	var password_confirm=$("#"+pass2).val();
	
	if( password_input != password_confirm )
	{
		$("#"+passEquals).html("Пароли не совпадают");
		$("#"+passEquals).css('color', "#f40000");
	}else{
		$("#"+passEquals).html("");
	}
}
function passwordStrength(password)
{
    score = 0; 
    
    if (password.length == 0) { return emptyPass; }
    if (password.length < 6 ) { return shortPass; }

    score += password.length * 4;
    score += ( checkRepetition(1,password).length - password.length ) * 1;
    score += ( checkRepetition(2,password).length - password.length ) * 1;
    score += ( checkRepetition(3,password).length - password.length ) * 1;
    score += ( checkRepetition(4,password).length - password.length ) * 1;

    if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  score += 5;
    
    if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) score += 5;
    
    if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  score += 10; 
    
    if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  score += 15; 
 
    if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  score += 15; 
    
    if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  score += 15; 
    
    if (password.match(/^\w+$/) || password.match(/^\d+$/) )  score -= 10; 
    
    if ( score < 0 )  score = 0;
    if ( score > 100 )  score = 100; 
    
    if (score < 34 )  return badPass; 
    if (score < 68 )  return goodPass;
    return strongPass;
}

function checkRepetition(pLen,str) {
 res = "";
 for ( i=0; i<str.length ; i++ ) {
     repeated=true;
     for (j=0;j < pLen && (j+i+pLen) < str.length;j++)
         repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen));
     if (j<pLen) repeated=false;
     if (repeated) {
         i+=pLen-1;
         repeated=false;
     }
     else {
         res+=str.charAt(i);
     }
 }
 return res
}/**
 * методы для таблицы UiTable для работы с CheckBox'ом
 */
$.fn.ui_table_checkbox_change = function(item){
	var status = $(item).attr('checked');
	var cbs = $(this).find('tbody').find('input:checkbox').attr('checked', status);
};
$.fn.ui_table_checkbox_uncheckmain = function(){
	$(this).find('thead').find('input:checkbox').attr('checked', false);
};/*
 * для главной сайта
 * */
jQuery.autocomplete = function(input, options) {
	// Create a link to self
	var me = this;

	// Create jQuery object for input element
	var $input = $(input).attr("autocomplete", "off");

	// Apply inputClass if necessary
	if (options.inputClass) $input.addClass(options.inputClass);

	// Create results
	var results = document.createElement("div");
	// Create jQuery object for results
	var $results = $(results);
	$results.hide().addClass(options.resultsClass).css("position", "absolute");
	if( options.width > 0 ) $results.css("width", options.width);
	
	// Add to body element
	$("body").append(results);

	input.autocompleter = me;

	var timeout = null;
	var prev = "";
	var active = -1;
	var cache = {};
	var keyb = false;
	var hasFocus = false;
	var lastKeyPressCode = null;

	// flush cache
	function flushCache(){
		cache = {};
		cache.data = {};
		cache.length = 0;
	};

	// flush cache
	flushCache();

	// if there is a data array supplied
	if( options.data != null ){
		var sFirstChar = "", stMatchSets = {}, row = [];

		// no url was specified, we need to adjust the cache length to make sure it fits the local data store
		if( typeof options.url != "string" ) options.cacheLength = 1;

		// loop through the array and create a lookup structure
		for( var i=0; i < options.data.length; i++ ){
			// if row is a string, make an array otherwise just reference the array
			row = ((typeof options.data[i] == "string") ? [options.data[i]] : options.data[i]);

			// if the length is zero, don't add to list
			if( row[0].length > 0 ){
				// get the first character
				sFirstChar = row[0].substring(0, 1).toLowerCase();
				// if no lookup array for this character exists, look it up now
				if( !stMatchSets[sFirstChar] ) stMatchSets[sFirstChar] = [];
				// if the match is a string
				stMatchSets[sFirstChar].push(row);
			}
		}

		// add the data items to the cache
		for( var k in stMatchSets ){
			// increase the cache size
			options.cacheLength++;
			// add to the cache
			addToCache(k, stMatchSets[k]);
		}
	}

	$input
	.keydown(function(e) {
		// track last key pressed
		lastKeyPressCode = e.keyCode;
		switch(e.keyCode) {
			case 38: // up
				e.preventDefault();
				moveSelect(-1);
				break;
			case 40: // down
				e.preventDefault();
				moveSelect(1);
				break;
			case 9:  // tab
			case 13: // return
				if( selectCurrent() ){
					// make sure to blur off the current field
					$input.get(0).blur();
					e.preventDefault();
				}
				break;
			default:
				active = -1;
				if (timeout) clearTimeout(timeout);
				timeout = setTimeout(function(){onChange();}, options.delay);
				break;
		}
	})
	.focus(function(){
		// track whether the field has focus, we shouldn't process any results if the field no longer has focus
		hasFocus = true;
	})
	.blur(function() {
		// track whether the field has focus
		hasFocus = false;
		hideResults();
	});

	hideResultsNow();

	function onChange() {
		// ignore if the following keys are pressed: [del] [shift] [capslock]
		if( lastKeyPressCode == 46 || (lastKeyPressCode > 8 && lastKeyPressCode < 32) ) return $results.hide();
		var v = $input.val();
		if (v == prev) return;
		prev = v;
		if (v.length >= options.minChars) {
			$input.addClass(options.loadingClass);
			requestData(v);
		} else {
			$input.removeClass(options.loadingClass);
			$results.hide();
		}
	};

 	function moveSelect(step) {

		var lis = $("li", results);
		if (!lis) return;

		active += step;

		if (active < 0) {
			active = 0;
		} else if (active >= lis.size()) {
			active = lis.size() - 1;
		}

		lis.removeClass("ac_over");

		$(lis[active]).addClass("ac_over");

		// Weird behaviour in IE
		// if (lis[active] && lis[active].scrollIntoView) {
		// 	lis[active].scrollIntoView(false);
		// }

	};

	function selectCurrent() {
		var li = $("li.ac_over", results)[0];
		if (!li) {
			var $li = $("li", results);
			if (options.selectOnly) {
				if ($li.length == 1) li = $li[0];
			} else if (options.selectFirst) {
				li = $li[0];
			}
		}
		if (li) {
			selectItem(li);
			return true;
		} else {
			return false;
		}
	};

	function selectItem(li) {
		if (!li) {
			li = document.createElement("li");
			li.extra = [];
			li.selectValue = "";
		}
		var v = $.trim(li.selectValue ? li.selectValue : li.innerHTML);
		input.lastSelected = v;
		prev = v;
		$results.html("");
		$input.val(v);
		hideResultsNow();
		if (options.onItemSelect) setTimeout(function() { options.onItemSelect(li) }, 1);
	};

	// selects a portion of the input string
	function createSelection(start, end){
		// get a reference to the input element
		var field = $input.get(0);
		if( field.createTextRange ){
			var selRange = field.createTextRange();
			selRange.collapse(true);
			selRange.moveStart("character", start);
			selRange.moveEnd("character", end);
			selRange.select();
		} else if( field.setSelectionRange ){
			field.setSelectionRange(start, end);
		} else {
			if( field.selectionStart ){
				field.selectionStart = start;
				field.selectionEnd = end;
			}
		}
		field.focus();
	};

	// fills in the input box w/the first match (assumed to be the best match)
	function autoFill(sValue){
		// if the last user key pressed was backspace, don't autofill
		if( lastKeyPressCode != 8 ){
			// fill in the value (keep the case the user has typed)
			$input.val($input.val() + sValue.substring(prev.length));
			// select the portion of the value not typed by the user (so the next character will erase)
			createSelection(prev.length, sValue.length);
		}
	};

	function showResults() {
		// get the position of the input field right now (in case the DOM is shifted)
		var pos = findPos(input);
		// either use the specified width, or autocalculate based on form element
		var iWidth = (options.width > 0) ? options.width : $input.width();
		// reposition
		var rightposition=pos.x+iWidth;
		
		 var  dWidth=$(document).width();
		    if (rightposition>dWidth){
		    	pos.x=pos.x-(rightposition-dWidth)-5;
		    } 
		    //else leftpozition=pos.x;
		
		
		$results.css({
			width: parseInt(iWidth) + "px",
			top: (pos.y + input.offsetHeight) + "px",
			left: pos.x + "px"
		}).show();
	};

	function hideResults() {
		if (timeout) clearTimeout(timeout);
		timeout = setTimeout(hideResultsNow, 200);
	};

	function hideResultsNow() {
		if (timeout) clearTimeout(timeout);
		$input.removeClass(options.loadingClass);
		if ($results.is(":visible")) {
			$results.hide();
		}
		if (options.mustMatch) {
			var v = $input.val();
			if (v != input.lastSelected) {
				selectItem(null);
			}
		}
	};

	function receiveData(q, data) {
		if (data) {
			$input.removeClass(options.loadingClass);
			results.innerHTML = "";

			// if the field no longer has focus or if there are no matches, do not display the drop down
			if( !hasFocus || data.length == 0 ) return hideResultsNow();

			if ($.browser.msie) {
				// we put a styled iframe behind the calendar so HTML SELECT elements don't show through
				$results.append(document.createElement('iframe'));
			}
			results.appendChild(dataToDom(data));
			// autofill in the complete box w/the first match as long as the user hasn't entered in more data
			if( options.autoFill && ($input.val().toLowerCase() == q.toLowerCase()) ) autoFill(data[0][0]);
			showResults();
		} else {
			hideResultsNow();
		}
	};

	function parseData(data) {
		if (!data) return null;
		var parsed = [];
		var rows = data.split(options.lineSeparator);
		for (var i=0; i < rows.length; i++) {
			var row = $.trim(rows[i]);
			if (row) {
				parsed[parsed.length] = row.split(options.cellSeparator);
			}
		}
		return parsed;
	};

	function dataToDom(data) {
		var ul = document.createElement("ul");
		var num = data.length;

		// limited results to a max number
		if( (options.maxItemsToShow > 0) && (options.maxItemsToShow < num) ) num = options.maxItemsToShow;

		for (var i=0; i < num; i++) {
			var row = data[i];
			if (!row) continue;
			var li = document.createElement("li");
			if (options.formatItem) {
				li.innerHTML = options.formatItem(row, i, num);
				li.selectValue = row[0]+(row[1]!=''?"; "+row[1]:"")+(row[2]!=''?"; "+row[2]:"");
				
				
			} else {
				li.innerHTML = row[0];
				li.selectValue = row[0]+(row[1]!=''?"; "+row[1]:"")+(row[2]!=''?"; "+row[2]:"");
				}
			
			
			
			var extra = null;
			if (row.length > 1) {
				extra = [];
				for (var j=1; j < row.length; j++) {
					extra[extra.length] = row[j];
				}
			}
			li.extra = extra;
			ul.appendChild(li);
			$(li).hover(
				function() { $("li", ul).removeClass("ac_over"); $(this).addClass("ac_over"); active = $("li", ul).indexOf($(this).get(0)); },
				function() { $(this).removeClass("ac_over"); }
			).click(function(e) { e.preventDefault(); e.stopPropagation(); selectItem(this) });
		}
		return ul;
	};

	function requestData(q) {
		if (!options.matchCase) q = q.toLowerCase();
		var data = options.cacheLength ? loadFromCache(q) : null;
		// recieve the cached data
		if (data) {
			receiveData(q, data);
		// if an AJAX url has been supplied, try loading the data now
		} else if( (typeof options.url == "string") && (options.url.length > 0) ){
			$.get(makeUrl(q), function(data) {
				data = parseData(data);
				addToCache(q, data);
				receiveData(q, data);
			});
		// if there's been no data found, remove the loading class
		} else {
			$input.removeClass(options.loadingClass);
		}
	};

	function makeUrl(q) {
		var url = options.url + "?q=" + encodeURI(q);
		for (var i in options.extraParams) {
			url += "&" + i + "=" + encodeURI(options.extraParams[i]);
		}
		return url;
	};

	function loadFromCache(q) {
		if (!q) return null;
		if (cache.data[q]) return cache.data[q];
		if (options.matchSubset) {
			for (var i = q.length - 1; i >= options.minChars; i--) {
				var qs = q.substr(0, i);
				var c = cache.data[qs];
				if (c) {
					var csub = [];
					for (var j = 0; j < c.length; j++) {
						var x = c[j];
						var x0 = x[0];
						if (matchSubset(x0, q)) {
							csub[csub.length] = x;
						}
					}
					return csub;
				}
			}
		}
		return null;
	};

	function matchSubset(s, sub) {
		if (!options.matchCase) s = s.toLowerCase();
		var i = s.indexOf(sub);
		if (i == -1) return false;
		return i == 0 || options.matchContains;
	};

	this.flushCache = function() {
		flushCache();
	};

	this.setExtraParams = function(p) {
		options.extraParams = p;
	};

	this.findValue = function(){
		var q = $input.val();

		if (!options.matchCase) q = q.toLowerCase();
		var data = options.cacheLength ? loadFromCache(q) : null;
		if (data) {
			findValueCallback(q, data);
		} else if( (typeof options.url == "string") && (options.url.length > 0) ){
			$.get(makeUrl(q), function(data) {
				data = parseData(data)
				addToCache(q, data);
				findValueCallback(q, data);
			});
		} else {
			// no matches
			findValueCallback(q, null);
		}
	}

	function findValueCallback(q, data){
		if (data) $input.removeClass(options.loadingClass);

		var num = (data) ? data.length : 0;
		var li = null;

		for (var i=0; i < num; i++) {
			var row = data[i];

			if( row[0].toLowerCase() == q.toLowerCase() ){
				li = document.createElement("li");
				if (options.formatItem) {
					li.innerHTML = options.formatItem(row, i, num);
					li.selectValue = row[0];
				} else {
					li.innerHTML = row[0];
					li.selectValue = row[0];
				}
				var extra = null;
				if( row.length > 1 ){
					extra = [];
					for (var j=1; j < row.length; j++) {
						extra[extra.length] = row[j];
					}
				}
				li.extra = extra;
			}
		}

		if( options.onFindValue ) setTimeout(function() { options.onFindValue(li) }, 1);
	}

	function addToCache(q, data) {
		if (!data || !q || !options.cacheLength) return;
		if (!cache.length || cache.length > options.cacheLength) {
			flushCache();
			cache.length++;
		} else if (!cache[q]) {
			cache.length++;
		}
		cache.data[q] = data;
	};

	function findPos(obj) {
		var curleft = obj.offsetLeft || 0;
		var curtop = obj.offsetTop || 0;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
		return {x:curleft,y:curtop};
	}
};

jQuery.fn.autocomplete = function(url, options, data) {
	// Make sure options exists
	options = options || {};
	// Set url as option
	options.url = url;
	// set some bulk local data
	options.data = ((typeof data == "object") && (data.constructor == Array)) ? data : null;

	// Set default values for required options
	options.inputClass = options.inputClass || "ac_input";
	options.resultsClass = options.resultsClass || "ac_results";
	options.lineSeparator = options.lineSeparator || "\n";
	options.cellSeparator = options.cellSeparator || "|";
	options.minChars = options.minChars || 1;
	options.delay = options.delay || 400;
	options.matchCase = options.matchCase || 0;
	options.matchSubset = options.matchSubset || 1;
	options.matchContains = options.matchContains || 0;
	options.cacheLength = options.cacheLength || 1;
	options.mustMatch = options.mustMatch || 0;
	options.extraParams = options.extraParams || {};
	options.loadingClass = options.loadingClass || "ac_loading";
	options.selectFirst = options.selectFirst || false;
	options.selectOnly = options.selectOnly || false;
	options.maxItemsToShow = options.maxItemsToShow || -1;
	options.autoFill = options.autoFill || false;
	options.width = parseInt(options.width, 10) || 0;

	this.each(function() {
		var input = this;
		new jQuery.autocomplete(input, options);
	});

	// Don't break the chain
	return this;
};

jQuery.fn.autocompleteArray = function(data, options) {
	return this.autocomplete(null, options, data);
};

jQuery.fn.indexOf = function(e){
	for( var i=0; i<this.length; i++ ){
		if( this[i] == e ) return i;
	}
	return -1;
};/*
 * для главной сайта
 * */
var town=function(town_id){
var urlGetTown= '/distance/ajax/get_towns.php';
var select_item=-1;
var count_all_item=0;
var object_input_town = $("#"+town_id); 
var object_popup=$("<div> </div> ").insertAfter("#"+town_id).addClass('padding_div').attr('id', town_id+'_padding_div').css("display","none");

function findPos(obj) {
	var curleft = obj.offsetLeft || 0;
	var curtop = obj.offsetTop || 0;
	while (obj = obj.offsetParent) {
		curleft += obj.offsetLeft;
		curtop += obj.offsetTop;
	}
	return {x:curleft,y:curtop};
}
function SetTopAndLeft(){
	var pos = object_input_town.position();
	var iWidth=object_popup.width();
	var rightposition=pos.left+iWidth;
	var  dWidth=$(document).width();
	if (rightposition>dWidth){
	    	pos.left=pos.left-(rightposition-dWidth)-20;
	} 
object_popup.css({ top: pos.top+object_input_town.height()+6 + "px" , left: pos.left + "px" });/*
   var containerPosition;
   containerPosition = parent.position();
   var leftpozition=containerPosition.left; 
   var rightposition=leftpozition+355;
   var toppozition=containerPosition.top; 
   var bottomposition=toppozition+300;
   var  documentwidth=$(document).width();
    if (rightposition>documentwidth){
        leftpozition=leftpozition-(rightposition-documentwidth);
    } 
    element.css({ top: containerPosition.top+20 , left: leftpozition  });
    */
}
var showPopUp=function (parent,element){
	//SetTopAndLeft(parent,element);
	SetTopAndLeft();
	
	select_item=-1;
	//element.children().expire();
	element.css("display","");
};
var hidePopUp=function (element){
	element.empty();	
	element.css("display","none");
};
	
$(document).click(function (event) { 
	      $('.padding_div').css("display","none"); 
});
	
var select_element=function (element){
		$('.div_item').removeClass('active');
		element.addClass('active'); 
};
	




var hidden_town_id=$("<input type='hidden'/>").attr('id',town_id+"-id").insertAfter(object_input_town);


var getInputTownValue= function (){
	var out= object_input_town.attr("value");
	return out;
}; 
		  
var setInputTownValue=function (value){   object_input_town.attr( "value", value);}; 
var setValue=function (element,value){ element.attr( "value", value);};
 

var _mouseout=function (e) {
	$(this).removeClass('active');
	select_item=-1;
};
var _keydown=function (e) {
	
	if(e.keyCode == 38||e.keyCode ==40||e.keyCode ==13){
	   if(e.keyCode == 38){
	      select_item--;
	      if (select_item<0)   select_item=count_all_item-1;
	        select_element($("#"+town_id+"_padding_div_item"+select_item));
	   	}
		if(e.keyCode == 40){
		  	select_item++;
		    if (select_item>=count_all_item)   select_item=0; 
		       select_element($("#"+town_id+"_padding_div_item"+select_item));
		    }
		if(e.keyCode == 13) {
		    if(select_item!=-1){
		       $("#"+town_id+"_padding_div_item"+select_item).click();
		       hidePopUp(object_popup);
	        }
		}  
		return false;  	  
	}    
};

var timer; 
var bizi=false;

var displayTip= function(element){
	 clearTimeout (timer);
	 if(getInputTownValue().length>1){ 
	
	 if(element.attr('id')==town_id) refresh(urlGetTown,getInputTownValue() ); 
	 }
	 else {hidePopUp(object_popup);	}
	 
};

var _keyup=function (e) {
	var element=$(this);
	var text=$(this).attr( "value" ); 
	if(e.keyCode == 37||e.keyCode ==38||e.keyCode ==39||e.keyCode ==40||e.keyCode ==13){}
	 else{
			if (timer) clearTimeout(timer);
			timer = setTimeout(function(){displayTip(element);}, 500);
			//var timer = setTimeout(function(){displayTip(element);}, 500);	
			//displayTip(element);
		};  
		
	 };

	 

	 
var refresh=function(urlGet, town){
	
	object_input_town.addClass("loading");
	//object_popup.append(progress);
	hidePopUp(object_popup);
	
	$.getJSON(urlGet,
		{'town': town, 'hash':Math.random()},
		function(data){
			object_input_town.removeClass("loading");
			var count=0;    	
			$.each(data.countris, function(i,country){
				count++;    
				var p=  $("<p class='div_item' >"+(country.town_name!=null?country.town_name+"; ":"")+(country.country_name!=null?""+country.country_name:"")+
		    	    (country.area_name!=null?"; "+country.area_name:"")+"</p>");
					p.attr('id',  town_id+"_padding_div_item"+i);
					var div_item=$("#"+town_id+"_padding_div_item"+i);	
					
					//var events = div_item.data("events");
					//for (var type in events) {
						//if (type == evt) {
							//div_item.unbind(evt);
							//div_item.expire();
							//alert(type);
						//}
					//}
					
					
					if(div_item!=null)	div_item.expire();
			    	object_popup.append(p); 
			    	div_item.livequery("mouseover",function () {	
			    		$(this).addClass('active'); 
			    		select_item=i;
			    	});  
			    	div_item.livequery("mouseout", _mouseout);
			    	div_item.livequery("click",function () {
		    	    	//alert("");
						if(country.town_name!=null){  setInputTownValue((country.town_name!=null?country.town_name+"; ":"")+(country.country_name!=null?""+country.country_name:"")+
					    	    (country.area_name!=null?"; "+country.area_name:"")); setValue(hidden_town_id,country.town_id);}else setInputTownValue(""); 
							    	});	 
						
			    	});
			    	count_all_item=count;
			    	if (count_all_item>0) showPopUp(object_input_town,object_popup);    
		});
};


	
var _keydown=function (e) {
			if(e.keyCode == 38||e.keyCode ==40||e.keyCode ==13){
			   if(e.keyCode == 38){
			      select_item--;
			      if (select_item<0)   select_item=count_all_item-1;
			        select_element($("#"+town_id+"_padding_div_item"+select_item));
			   	}
				if(e.keyCode == 40){
				  	select_item++;
				    if (select_item>=count_all_item)   select_item=0; 
				       select_element($("#"+town_id+"_padding_div_item"+select_item));
				    }
				if(e.keyCode == 13) {
				    if(select_item!=-1){
				       $("#"+town_id+"_padding_div_item"+select_item).click();
				       hidePopUp(object_popup);
			        }
				}  
				return false;  	  
			}    	
};

object_input_town.bind("keyup",  _keyup);

object_input_town.bind("keydown", _keydown);


};/* Copyright (c) 2007 Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * Version: 1.0.2
 * Requires jQuery 1.1.3+
 * Docs: http://docs.jquery.com/Plugins/livequery
 */

(function($) {
	
$.extend($.fn, {
	livequery: function(type, fn, fn2) {
		var self = this, q;
		
		// Handle different call patterns
		if ($.isFunction(type))
			fn2 = fn, fn = type, type = undefined;
			
		// See if Live Query already exists
		$.each( $.livequery.queries, function(i, query) {
			if ( self.selector == query.selector && self.context == query.context &&
				type == query.type && (!fn || fn.$lqguid == query.fn.$lqguid) && (!fn2 || fn2.$lqguid == query.fn2.$lqguid) )
					// Found the query, exit the each loop
					return (q = query) && false;
		});
		
		// Create new Live Query if it wasn't found
		q = q || new $.livequery(this.selector, this.context, type, fn, fn2);
		
		// Make sure it is running
		q.stopped = false;
		
		// Run it
		$.livequery.run( q.id );
		
		// Contnue the chain
		return this;
	},
	
	expire: function(type, fn, fn2) {
		var self = this;
		
		// Handle different call patterns
		if ($.isFunction(type))
			fn2 = fn, fn = type, type = undefined;
			
		// Find the Live Query based on arguments and stop it
		$.each( $.livequery.queries, function(i, query) {
			if ( self.selector == query.selector && self.context == query.context && 
				(!type || type == query.type) && (!fn || fn.$lqguid == query.fn.$lqguid) && (!fn2 || fn2.$lqguid == query.fn2.$lqguid) && !this.stopped )
					$.livequery.stop(query.id);
		});
		
		// Continue the chain
		return this;
	}
});

$.livequery = function(selector, context, type, fn, fn2) {
	this.selector = selector;
	this.context  = context || document;
	this.type     = type;
	this.fn       = fn;
	this.fn2      = fn2;
	this.elements = [];
	this.stopped  = false;
	
	// The id is the index of the Live Query in $.livequery.queries
	this.id = $.livequery.queries.push(this)-1;
	
	// Mark the functions for matching later on
	fn.$lqguid = fn.$lqguid || $.livequery.guid++;
	if (fn2) fn2.$lqguid = fn2.$lqguid || $.livequery.guid++;
	
	// Return the Live Query
	return this;
};

$.livequery.prototype = {
	stop: function() {
		var query = this;
		
		if ( this.type )
			// Unbind all bound events
			this.elements.unbind(this.type, this.fn);
		else if (this.fn2)
			// Call the second function for all matched elements
			this.elements.each(function(i, el) {
				query.fn2.apply(el);
			});
			
		// Clear out matched elements
		this.elements = [];
		
		// Stop the Live Query from running until restarted
		this.stopped = true;
	},
	
	run: function() {
		// Short-circuit if stopped
		if ( this.stopped ) return;
		var query = this;
		
		var oEls = this.elements,
			els  = $(this.selector, this.context),
			nEls = els.not(oEls);
		
		// Set elements to the latest set of matched elements
		this.elements = els;
		
		if (this.type) {
			// Bind events to newly matched elements
			nEls.bind(this.type, this.fn);
			
			// Unbind events to elements no longer matched
			if (oEls.length > 0)
				$.each(oEls, function(i, el) {
					if ( $.inArray(el, els) < 0 )
						$.event.remove(el, query.type, query.fn);
				});
		}
		else {
			// Call the first function for newly matched elements
			nEls.each(function() {
				query.fn.apply(this);
			});
			
			// Call the second function for elements no longer matched
			if ( this.fn2 && oEls.length > 0 )
				$.each(oEls, function(i, el) {
					if ( $.inArray(el, els) < 0 )
						query.fn2.apply(el);
				});
		}
	}
};

$.extend($.livequery, {
	guid: 0,
	queries: [],
	queue: [],
	running: false,
	timeout: null,
	
	checkQueue: function() {
		if ( $.livequery.running && $.livequery.queue.length ) {
			var length = $.livequery.queue.length;
			// Run each Live Query currently in the queue
			while ( length-- )
				$.livequery.queries[ $.livequery.queue.shift() ].run();
		}
	},
	
	pause: function() {
		// Don't run anymore Live Queries until restarted
		$.livequery.running = false;
	},
	
	play: function() {
		// Restart Live Queries
		$.livequery.running = true;
		// Request a run of the Live Queries
		$.livequery.run();
	},
	
	registerPlugin: function() {
		$.each( arguments, function(i,n) {
			// Short-circuit if the method doesn't exist
			if (!$.fn[n]) return;
			
			// Save a reference to the original method
			var old = $.fn[n];
			
			// Create a new method
			$.fn[n] = function() {
				// Call the original method
				var r = old.apply(this, arguments);
				
				// Request a run of the Live Queries
				$.livequery.run();
				
				// Return the original methods result
				return r;
			}
		});
	},
	
	run: function(id) {
		if (id != undefined) {
			// Put the particular Live Query in the queue if it doesn't already exist
			if ( $.inArray(id, $.livequery.queue) < 0 )
				$.livequery.queue.push( id );
		}
		else
			// Put each Live Query in the queue if it doesn't already exist
			$.each( $.livequery.queries, function(id) {
				if ( $.inArray(id, $.livequery.queue) < 0 )
					$.livequery.queue.push( id );
			});
		
		// Clear timeout if it already exists
		if ($.livequery.timeout) clearTimeout($.livequery.timeout);
		// Create a timeout to check the queue and actually run the Live Queries
		$.livequery.timeout = setTimeout($.livequery.checkQueue, 20);
	},
	
	stop: function(id) {
		if (id != undefined)
			// Stop are particular Live Query
			$.livequery.queries[ id ].stop();
		else
			// Stop all Live Queries
			$.each( $.livequery.queries, function(id) {
				$.livequery.queries[ id ].stop();
			});
	}
});

// Register core DOM manipulation methods
$.livequery.registerPlugin('append', 'prepend', 'after', 'before', 'wrap', 'attr', 'removeAttr', 'addClass', 'removeClass', 'toggleClass', 'empty', 'remove');

// Run Live Queries when the Document is ready
$(function() { $.livequery.play(); });


// Save a reference to the original init method
var init = $.prototype.init;

// Create a new init method that exposes two new properties: selector and context
$.prototype.init = function(a,c) {
	// Call the original init and save the result
	var r = init.apply(this, arguments);
	
	// Copy over properties if they exist already
	if (a && a.selector)
		r.context = a.context, r.selector = a.selector;
		
	// Set properties
	if ( typeof a == 'string' )
		r.context = c || document, r.selector = a;
	
	// Return the result
	return r;
};

// Give the init function the jQuery prototype for later instantiation (needed after Rev 4091)
$.prototype.init.prototype = $.prototype;
	
})(jQuery);
//диалог перехода на страницу
customPageDlg = (function($) {
	var _pageCount;
	var _initialized = false;
	var init = function(pageNoEdtId, gotoPageBtnId, dialogId, showDlgBtnSelr,urlFormat){
		var gotoPageDlg = new Submenu(showDlgBtnSelr, dialogId, null, 
			null, Submenu.POS_LEFTBOTTOM, 0, 0, false, 
			function () {
				document.getElementById(pageNoEdtId).focus();
		});
		$('#' + gotoPageBtnId).click(function() {
			var pageNo = parseInt($('#' + pageNoEdtId).val());
			if (!isNaN(pageNo)) {
				if (pageNo <= _pageCount) {
					window.location.href = urlFormat.replace("%s",pageNo);
				} else {
					alert('Указанная страница не существует! Доступно ' + 
						_pageCount + ' страниц.');
				}
			} else {
				alert('Введите номер страницы для перехода!');
			}
		});
		var handlers = {
				13: function() {
					$('#' + gotoPageBtnId).click();
					gotoPageDlg.hide();
				}, 
				27: function() {
					gotoPageDlg.hide();
				}
			};
		//стрелка вверх
		handlers[38 + window.KEY_CODE_SHIFT] = function() {
			var pageNo = parseInt($('#' + pageNoEdtId).val());
			if (isNaN(pageNo)) {
				pageNo = 0;
			}
			pageNo++;
			parseInt($('#' + pageNoEdtId).val(pageNo));
		};
		//стрелка вниз
		handlers[40 + window.KEY_CODE_SHIFT] = function() {
			var pageNo = parseInt($('#' + pageNoEdtId).val());
			if (!isNaN(pageNo) && pageNo > 1) {
				pageNo--;
				parseInt($('#' + pageNoEdtId).val(pageNo));
			}
		};
		$('#' + pageNoEdtId)
			.addFilter(function(e) {
				return KeyUtils.isDigit(e) || KeyUtils.isControl(e);
			})
			.addKeyHandler(handlers);
	};
	return {
		init: function(pageCount, pageNoEdtId, gotoPageBtnId, dialogId, showDlgBtnSelr,urlFormat) {
			_pageCount = pageCount;						
			if (!_initialized) {
				init(pageNoEdtId, gotoPageBtnId, dialogId, showDlgBtnSelr,urlFormat);
			}
			_initialized = true;
		}
	};
})(jQuery);/** create by lisgray */

var partnerevent = (function(){
	
	var sender = null; 	
	var petId = 'partnEvtsTable';
	
	var more = function (itemid, callback) {
		if (!partnerevent.startload){
			partnerevent.startload=true;
			$('#morepartners').append(partnerevent.loadimg);
			$('#morepartners a').attr('disabled', 'disabled');
			$.ajax({
				type: "POST",
				url: "/log/partners/corner/ajax/index.jsp",
				data: ({act:"more", "event_id": partnerevent.lastevent}),
				dataType: "json",
				
				error: function(jqXHR, textStatus, errorThrown){
					status = textStatus;
					var msg = "Извините, но произошла ошибка: ";
					if (jqXHR && jqXHR.responseText) {
						msg += " "+jqXHR.status + " " + jqXHR.statusText+ " " +jqXHR.responseText;
					} else {
						msg = 'Произошла ошибка! Попробуйте снова позже или обратитесь в службу поддержки. ';
					}
					$("#partnersErrorblock").html(msg );
					$("#partnersErrorblock").show();
			
				}, 
				complete: function(jqXHR, textStatus){
					$('#loadimg').remove(); 
					partnerevent.startload=false;	
				}, 
				success: function(data){
					partnerevent.lastevent=data.lastevent_id;
					if (data.trs!=null&&data.trs!=""){
						$("#"+itemid).append(data.trs);
					}
					else{
						$('#morepartners').remove(); 
					}
					if (callback != null && typeof callback == 'function') {
						callback();
					}
				}
			});
		}
	};

	
	var addEvent = function(type, text) {
		if (sender != null) {
			sender.close(function() {
				sender.showWait();
				$.ajax({
					   type: "POST",
					   url: "/log/partners/corner/ajax/index.jsp",
					   data: ({act:"add", messageText: text}),
					   dataType: "json",
					   error:function(jqXHR, textStatus, errorThrown){
							if (sender != null) {
								sender.hideWait();
							}
						   alert("Не удалось добавить сообщение!");
					   },
					   success: function(data){
							if (sender != null) {
								sender.hideWait();
							}
						   partnerevent.lastevent=0;
//						   $('#' + petId + '>tbody').html('');
						   more(petId, function() {
								$('#' + petId + ' tr.toDelete').remove();
//								$('#' + petId).css({
//									height: 'auto', 
//									display: 'table', 
//									visibility: 'visible'
//								});
						   });
					   }
				});
			});
			$('#' + petId + ' tr').addClass('toDelete');
//			var petTable = $('#' + petId);
//			petTable.css({
//				height: petTable.height(), 
//				display: 'block', 
//				visibility: 'hidden'
//			});
		}
	};

	return {
		loaddiv:"<div id='loading' style='text-align:center;'><img src='/tpl/jsp/images/loading_small.gif'/></div>",
		loadimg:"<img id='loadimg' src='/tpl/jsp/images/loading_small.gif'/>",
		deleteEvent: function (event_id) {
			var eb = $('#eb' + event_id),  etr = $('#etr' + event_id), eimg=$('#eimg' + event_id);
			$.ajax({
				   type: "POST",
				   url: "/log/partners/corner/ajax/index.jsp",
				   data: ({act:"del", "event_id": event_id}),
				   dataType: "html",
				   error: function(jqXHR, textStatus, errorThrown){
						status = textStatus;
						var msg =""; 
						if (jqXHR && jqXHR.responseText) {
							//msg += " "+jqXHR.status + " " + jqXHR.statusText;//+ " " +jqXHR.responseText;
							msg = "Извините, но произошла ошибка  получения данных";
						} else {
							msg = 'Произошла ошибка! Попробуйте снова позже или обратитесь в службу поддержки. ';
						}
						$("#errorblock").html(msg );
						$("#errorblock").show();
						eimg.show();
						$('#loading').remove();
				
					},
				   success: function(html){
					   eb.html(html);
					   etr.addClass("selected_yellow");
					   
				   }
				}
			);
			eimg.hide();
			eb.append(partnerevent.loaddiv);
			
	},
	restoreEvent: function (event_id) {

	var eb = $('#eb' + event_id),  etr = $('#etr' + event_id), eimg=$('#eimg' + event_id);
		$.ajax({
			   type: "POST",
			   url: "/log/partners/corner/ajax/index.jsp",
			   data: ({act:"restore", "event_id": event_id}),
			   dataType: "html",
			   error:function(jqXHR, textStatus, errorThrown){
				   alert("не удалось");
				   eimg.show();
				   $('#loading').remove(); 
			   },
			   success: function(html){
				   eb.html(html);
				   etr.removeClass("selected_yellow");
				   
			   }
			}
		);
		eimg.hide();
		eb.append(partnerevent.loaddiv);
	},
	
	lastevent: 0,
	startload:false,
	
	more: more,
	
	
	getAbsolutePosition: function (el) {
		var r = { x: el.offsetLeft, y: el.offsetTop };
		if (el.offsetParent) {
			var tmp =partnerevent.getAbsolutePosition(el.offsetParent);
			r.x += tmp.x;
			r.y += tmp.y;
		}
		return r;
	}, 

	setSender: function(val) {
		sender = val;	
	}, 
	
	setPetId: function(val) {
		petId = val;
	}, 
		
	addEvent: addEvent

}; 

}());/**
 *  create by lisgray 
 */

var cookiessaver = {
	
//		setCookie: function (name, value, expires, path, domain, secure) {
//		      document.cookie = name + "=" + escape(value) +
//		        ((expires) ? "; expires=" + expires : "") +
//		        ((path) ? "; path=" + path : "") +
//		        ((domain) ? "; domain=" + domain : "") +
//		        ((secure) ? "; secure" : "");
//		},
//		
//		getCookie: function(name) {
//			var cookie = " " + document.cookie;
//			var search = " " + name + "=";
//			var setStr = null;
//			var offset = 0;
//			var end = 0;
//			if (cookie.length > 0) {
//				offset = cookie.indexOf(search);
//				if (offset != -1) {
//					offset += search.length;
//					end = cookie.indexOf(";", offset);
//					if (end == -1) {
//						end = cookie.length;
//					}
//					setStr = unescape(cookie.substring(offset, end));
//				}
//			}
//			return(setStr);
//		},
//		
//		delCookies: function (key) {
//				document.cookie = key +
//				'=; expires=Thu, 01-Jan-70 00:00:01 GMT;';
//				} 
//		},
		
		getKeys: function (group){
			var arr=[];
				if  (group!=null){
				 arr = group.split(",");
			}
			return arr ;	
		},
		
		keysToString: function (arr){
			var out=""; 
			for (var i=0; i<arr.length; i++){
				out+=(out==""?"":",")+arr[i];
			}
			return out;//arr.join(",");
		},
		
		findIndexKey: function (arr, key){
			$.each(arr, function(n, val) { 
				if (key==val){
					return n;
				 }
			});
			return 0;
		},
		
		is_array: function(input){
		    return typeof(input)=='object'&&(input instanceof Array);
		},

		
		deleteItemFromArray: function(array, obj){
			for ( var i = 0; i < array.length; i++) {
				if (array[i]==obj){
					//alert(array[i]+"=="+obj);
					
					array.splice(i,1);
				}
			}
		},
		
		ItemInArray: function(array, obj){
			//alert(array.length);
			for ( var i = 0; i < array.length; i++) {
				//alert(array[i]+"=="+obj);
				if (array[i]==obj){
					//alert(array[i]+"=="+obj);
					return true;
					break;
				}
			}
			return false;
		},
		
		setState: function (group, name, state){
			//console.log("v0: "+group+"@"+name+"="+state);
			var arraykeys=[];
			var cookgroup;
			var stringkeys;
			var tempkeys;
			cookgroup=$.cookie(group);
			
			if 	(cookgroup!=null){
				tempkeys=this.getKeys(cookgroup);
				if (this.is_array(tempkeys)){
					arraykeys=tempkeys;
				}
				else{
					arraykeys[0]=tempkeys;
				}
			}
			//alert(state);
			if (state){
				if (this.ItemInArray(arraykeys,name )) return ;
				arraykeys[arraykeys.length] = name;
			}
			else{
				//alert(arraykeys);
				//alert(name);
				if (this.ItemInArray(arraykeys,name )) {
					//alert("delete");
					this.deleteItemFromArray(arraykeys,name);
				};
				
				
			}
			
			if (arraykeys.length>0){
				stringkeys=this.keysToString(arraykeys);
//				$.cookie(group, stringkeys);
			} else{
				stringkeys=null;
			}
			//console.log("set to cookie: "+stringkeys);
			//this.setCookie(group, stringkeys);
			$.cookie(group, stringkeys,{ expires: 7});
		},
		
		
		storeItemState: function(ItemId, group, name){
			//console.log($("#" + ItemId ).data("display") );
			if ($("#" + ItemId ).data("display") == "none") {
				this.setState(group, name, true);
			} 
			else{
				this.setState(group, name, false);
			}
		}
		
}; /**
 *  create by lisgray 
 */

var widgetguest = {
		blockwidth: 170,
		showGuest: function(containerId,count){
			var width=$("#"+containerId).width(); 
			width=width-2*this.blockwidth;
			//console.log(width);
			for (var i=2; i<count; i++){
				width=width-this.blockwidth;
				if (width>0){
				$("#guestblock"+i).show();
				} else {
					$("#guestblock"+i).hide(); 
				};
			}
		},
	resize: function(containerId,count){
		this.showGuest(containerId,count);
	}
	
};
		function setupSlider_GetDataByAjax(id,filename){
			var sliderOptionsId = id+"_options";
			if(filename.length > 1)
			{
				$("#"+sliderOptionsId).load(filename, function(response, status, xhr) {
					  if (status == "error") {
						$("#"+id+"_error").show();
					    var msg = "Извините, но произошла ошибка: ";
					    $("#"+id+"_error").html(msg + xhr.status + " " + xhr.statusText);
					  }
				});
			}
		}
		
		function setupSlider_ToggleVisible(id){
			$("#"+id+"_options").toggle();
			$("#"+id+"_open").toggle();
			$("#"+id+"_close").toggle();
			$("#"+id+"_defLeftContent").toggle();
			$("#"+id+"_defRightContent").toggle();
			return false;
		}
UICommentBlock = function(options){
	var ajaxUrl = "/tpl/dinamix/comments_block/ajax";
	var commentsContId;
	var sign;
	var ajaxManager;
	var commentItemIdPrefix = 'commentItem';
	var commentDelBtnIdPrefix = 'commentDelBtn';
	var item = this;
	var refreshPeriodInSec;
	var bgAnimDurr = 3000;
	var bgAnimStepsCount = 50;
	var waitFogIdSuffix = 'WaitFog';
	
	var parseOptions = function(options) {
		if (options != null) {
			if (options.commentsContId) {
				commentsContId = options.commentsContId;
			}
			if (options.sign) {
				sign = options.sign;
			}
			if (options.refreshPeriodInSec) {
				refreshPeriodInSec = options.refreshPeriodInSec;
			}
		}
	};
	
	var templateHtml = 
		  '<div id="commentItemTemplate" class="uiComment">'
		+ '	<div class="uiCommentLogo"><div>' 
		+ '		<img id="commentOwnerLogo" src="">' 
		+ '	</div></div>' 
		+ '	<div class="uiCommentInfo">' 
		+ '		<div>' 
		+ '			<a id="commentOwnerName" href=""></a>' 
		+ '			<div class="uiCommentCreated">'
		+ '				<span id="commentCreateDate"></span>'
		+ '				<img id="' + commentDelBtnIdPrefix + '" title="Удалить"'
		+ 					' src="' + getSubdomainUrl() + '/tpl/jsp/images/delete2.png" />' 
		+ '			</div>' 
		+ '		</div>' 
		+ '		<div>' 
		+ '			<div id="commentText" class="t uiCommentContent"></div>' 
		+ '		</div>'
		+ '	</div>' 
		+ '</div>';
	
	var editorHtml = '	<div id="uiCommentEditorCont" class="uiCommentEditorCont"> ' 
		+ '		<input id="uiCommentEditorOpener" value="Оставить комментарий" type="text"> ' 
		+ '		<textarea id="uiCommentEditorEdit"></textarea> ' 
		+ '		<input id="uiCommentEditorBtnAdd" name="bSend" value="Отправить" class="c" type="button"> ' 
		+ '		<input id="uiCommentEditorBtnCancel" name="bCancel" value="Отмена" class="c" type="button"> ' 
		+ '	</div> ';
	
	var noEditorHtml = '<div id="uiCommentNoEditorCont" class="t uiCommentEditorCont"></div>';
	
	var noAuthInfoHtml = 'Чтобы оставить комментарий, вам необходимо ' + 
		'<a href="' + getSubdomainUrl() + '/log?from_p=' + window.location + '">Войти</a> или ' + 
		'<a href="' + getSubdomainUrl() + '/registration">Зарегистрироваться</a>';
	
	var setValues = function(id, commentInfo) {
		$('#' + id + ' #commentOwnerLogo').attr('src', commentInfo.ownerLogoUrl);
		$('#' + id + ' #commentOwnerName').attr('href', commentInfo.profileURL).html(commentInfo.ownerName);
		$('#' + id + ' #commentCreateDate').text(commentInfo.created);
		$('#' + id + ' #commentText').html(commentInfo.commentText);
		if (commentInfo.readOnly) {
			$('#' + id + ' #' + commentDelBtnIdPrefix).remove();				
		} else {
			var newDelBtnId = commentDelBtnIdPrefix + commentInfo.commentId;
			$('#' + id + ' #' + commentDelBtnIdPrefix).attr('id', newDelBtnId);
			$('#' + newDelBtnId).click(function() {
				var id = $(this).attr('id').replace(commentDelBtnIdPrefix, '');
				item.deleteComment(id);
			});;	
		}
	};
	
	var hadLoaded = false;
	
	var addCommentItem = function(commentInfo) {
		var newItem = $('#commentItemTemplate').clone();
		var newId = commentItemIdPrefix + commentInfo.commentId;
		newItem.attr('id', newId);
		$('#uiCommentEditorCont').before(newItem);
		setValues(newId, commentInfo);
		newItem.show();
		if (hadLoaded) {
			newItem.animateBgColor(0xFEFBE5, 0xFFFFFF, bgAnimDurr, bgAnimStepsCount);
		}
	};
	
	var deleteCommentItem = function(commentId) {
		$('#' + commentItemIdPrefix + commentId).remove();
	};
	
	var parseComments = function(commentsDifData) {
		for (var i in commentsDifData.created) {
			addCommentItem(commentsDifData.created[i]);
		}
		for (var i in commentsDifData.deleted) {
			deleteCommentItem(commentsDifData.deleted[i]);
		}
		hadLoaded = true;
	};
	
	this.refreshComments = function(completeHandler, showWaitInContainer, failureHandler) {
		if (!failureHandler) {
			failureHandler = loadFailureHandler;
		}
		doOperation("refreshComments", null, failureHandler, 
			completeHandler, showWaitInContainer);
	};
	
	this.deleteComment = function(commentId, completeHandler) {
		if (confirm('Вы действительно хотите удалить данный коментарий?')) {
			doOperation("deleteComment", {commentId: commentId}, 
				actionFailureHandler, completeHandler);
		}
	};
	
	this.addComment = function(commentText, completeHandler) {
		doOperation("addComment", {commentText: commentText}, 
			actionFailureHandler, completeHandler);
	};
	
	var loadFailureHandler = function(msg) {
		$('#' + commentsContId).html(getInfoBlockHtml(msg, 'error'));
	};
	
	var actionFailureHandler = function(msg) {
		alert(msg);
	};
	
	var doOperation = function(operatName, additParams, errorHanler, 
		completeHandler, showWaitInContainer) 
	{
		if (!(additParams instanceof Object)) {
			additParams = {};
		}
		if (showWaitInContainer == null) {
			showWaitInContainer = true;
		}
		var containerSelr;
		if (showWaitInContainer) {
			containerSelr = window;
		} else {
			containerSelr = null;
		}
		additParams.sign = sign;
		additParams.presentIds = getPresentIds();
		ajaxManager.doOperation(operatName, additParams, 
			function(data) {
				if (data.error == null) {
					if (data.edit_access == 'Permited') {
						$('#uiCommentEditorCont').show();
						$('#uiCommentNoEditorCont').hide();
					} else {
						$('#uiCommentEditorCont').hide();
						if (data.edit_access == 'NotAuthorized') {
							$('#uiCommentNoEditorCont').show();
							$('#uiCommentNoEditorCont').html(noAuthInfoHtml);
						} else {
							$('#uiCommentNoEditorCont').hide();
//							$('#uiCommentNoEditorCont').html(data.accDenInfo);
						}
					}
					parseComments(data.commentsDifData);
				}
			}, 
			function(msg, textStatus, jqXHR, errorThrown) {
				if (errorHanler instanceof Function) {
					$('#uiCommentEditorCont').hide();
					$('#uiCommentNoEditorCont').hide();
					errorHanler(msg, textStatus, jqXHR, errorThrown);
				}
			}, containerSelr, 'post', completeHandler);
	};
	
	var getPresentIds = function() {
		var comments = $('.uiComment');
		var res = [];
		comments.each(function() {
			var id = $(this).attr('id').replace(commentItemIdPrefix, '');
			if (id != 'Template') {
				res.push(id);
			}
		});
		return res;
	};
	
	var showEditor = function() {
		$('#uiCommentEditorOpener').hide();
		$('#uiCommentEditorEdit').show();
		$('#uiCommentEditorEdit').focus();
		$('#uiCommentEditorCont').css('height','115px');
		$('#uiCommentEditorBtnCancel').show();
		$('#uiCommentEditorBtnAdd').show();
	};
	
	var hideEditor = function() {
		$('#uiCommentEditorOpener').show();
		$('#uiCommentEditorEdit').hide();
		$('#uiCommentEditorCont').css('height','30px');
		$('#uiCommentEditorBtnCancel').hide();
		$('#uiCommentEditorBtnAdd').hide();
	};
	
	var initEditor = function() {
		$('#' + commentsContId).append(editorHtml + noEditorHtml);
		$('#uiCommentEditorOpener').focus(showEditor);
		
		var doAddComment = function() {
			var comment = $('#uiCommentEditorEdit').val();
			if (comment != '') {
				item.addComment(comment, hideEditor);
				$('#uiCommentEditorEdit').val('');
			} else {
				alert("Невозможно добавить пустой комментарий!");
			}
		}

		$('#uiCommentEditorBtnAdd').keypress(function(e) {
			if (e.ctrlKey && e.keyCode == 13) {
				doAddComment();
			}
		}).click(doAddComment);
		$('#uiCommentEditorBtnCancel').click(hideEditor);
		hideEditor();
	};
	
	parseOptions(options);
	var waitVisualizer = null;
	waitVisualizer = new WaitVisualizer(commentsContId + waitFogIdSuffix, 
		null, true, "/tpl/jsp/images/loading_big.gif");
	ajaxManager = new AjaxManager(ajaxUrl, waitVisualizer);
	$('#' + commentsContId).html(templateHtml);
	initEditor();
	item.refreshComments();
	if (refreshPeriodInSec > 0) {
		window.setInterval(function() {
			item.refreshComments(null, false, function() {});
		}, refreshPeriodInSec * 1000);
	}
};/**
 * jQuery sound plugin (no flash)
 * 
 * port of script.aculo.us' sound.js (http://script.aculo.us), based on code by Jules Gravinese (http://www.webveteran.com/) 
 * 
 * Copyright (c) 2007 JУЖrn Zaefferer (http://bassistance.de) 
 * 
 * Licensed under the MIT license:
 *   http://www.opensource.org/licenses/mit-license.php
 *   
 * $Id: jquery.sound.js 5854 2008-10-04 10:22:25Z joern.zaefferer $
 */

/**
 * API Documentation
 * 
 * // play a sound from the url
 * $.sound.play(url)
 * 
 * // play a sound from the url, on a track, stopping any sound already running on that track
 * $.sound.play(url, {
 *   track: "track1"
 * });
 * 
 * // increase the timeout to four seconds before removing the sound object from the dom for longer sounds
 * $.sound.play(url, {
 *   timeout: 4000
 * });
 * 
 * // stop a sound by removing the element returned by play
 * var sound = $.sound.play(url);
 * sound.remove();
 * 
 * // disable playing sounds
 * $.sound.enabled = false;
 * 
 * // enable playing sounds
 * $.sound.enabled = true
 */

(function($) {
	
$.sound = {
	tracks: {},
	enabled: true,
	template: function(src) {
		// todo: move bgsound element and browser sniffing in here
		// todo: test wmv on windows: Builder.node('embed', {type:'application/x-mplayer2', pluginspage:'http://microsoft.com/windows/mediaplayer/en/download/',        id:'mediaPlayer', name:'mediaPlayer', displaysize:'4', autosize:'-1', bgcolor:'darkblue', showcontrols:'false', showtracker:'-1', showdisplay:'0', showstatusbar:'-1', videoborder3d:'-1', width:'0', height:'0', src:audioFile, autostart:'true', designtimesp:'5311', loop:'false'});
		// is_win = (agt.indexOf("windows") != -1);
		return '<embed style="height:0px; width:0px; display: none;position:absolute;left: 0;top: 0;" loop="false" src="' + src + '" autostart="true" />';
	},
	play: function(url, options){
		if (!this.enabled)
			return;
		options = $.extend({
			url: url,
			timeout: 2000
		}, options);
		
		if (options.track) {
			if (this.tracks[options.track]) {
				var current = this.tracks[options.track];
				// TODO check when Stop is avaiable, certainly not on a jQuery object
				current[0].Stop && current[0].Stop();
				current.remove();  
			}
		}
		var element = $.browser.msie
		  	? $('<bgsound/>').attr({
		        src: options.url,
				loop: 1,
				autostart: true
		      })
		  	: $(this.template(options.url));
			
		element.appendTo("body");
		
		if (options.track) {
			this.tracks[options.track] = element;
		}
		
		setTimeout(function() {
			element.remove();
		}, options.timeout);
		
		return element;
	}
};

})(jQuery);var chat_refresh_timer = 50;	// каг часто обновлять чат
var chat_scroll_timer = 500;	// с какой скоростью крутить вниз
var focusInMessage = true;
var focusMessageIndex = 0;
var chat_msg_limit=1000;
var chat_msg_buffer = "";

var secLastAction = 0;
var isActiv = false;

var globalRoomID = -1;
var globalRoomKey = -1;
var starRating = 0;
var curSrar = 0;

var last_message_id = 0;
var chat_message_lock = false;
var msg_update_locker = 0;

function titleNewMessage(tmpMsg){
	if(focusInMessage == false) {
		var arr_message = ["Вам", tmpMsg ];
		if(focusMessageIndex<arr_message.length&& focusMessageIndex>=0) 
			focusMessageIndex = focusMessageIndex+1;
		else
			focusMessageIndex = 0;
		$(document).attr('title',arr_message[focusMessageIndex]);
		setTimeout("titleNewMessage('"+tmpMsg+"')",1000);
	}
	return false;
}
function errorMessage(message){
	var html=$('#chat-body').html();
	var curDate = new Date();
	html+="<div class='chat-simple-mess'><div class='error-mess'><span  style='font-weight: bold'>Ошибка</span> " +
	"["+curDate.getHours()+":"+curDate.getMinutes()+":"+curDate.getSeconds()+"] "+
	
	": <div>"+message+"</div></div></div>";
	$('#chat-body').html(html);
	$('#chat-conteiner').animate({scrollTop: $('#chat-conteiner').attr('scrollHeight')}, chat_scroll_timer);
}
function showModal(){
	var mwinH=140;
	var mwinW=450;
	//$('#messageText').html("Редактирование направлений");
	$('#commentModal').modal({minHeight: mwinH, minWidth: mwinW,
		onClose: function (dialog) 
			{
			$.modal.close();
			$("#mess").focus();
			msg_update_locker = 0;
			}});
	$('#commentLoading').hide();
	return false;
}
function sendComments(){
	if( $("#commentText").val() == ""){
		$("#commentText").focus();
		return false;
	}
	$("#sendCommentBtn").attr('disabled', 'disabled');
	$("#commentText").attr('disabled','disabled');
	try{
		    $('#loading').show();
			$.getJSON(
				'/chat/ajax/send_comment.jsp',
				{ id:  globalRoomID, key: globalRoomKey, comment: $("#commentText").val() },
				function(j){
					$("#sendCommentBtn").attr('disabled', '');
					$("#commentText").attr('disabled','');
					$('#loading').hide();
					$.modal.close();
				}
			);
	} catch (err){
		  txt="Ошибка на странице.\n\n";
		  txt+="Описание ошибки: " + err.description + "\n\n";
		  errorMessage(txt);
	}
	$('#loading').hide();
    return false;
}
///////////////////////////////////////////////////
var lockCurrentRating = false; 
function setCurrentStar(star){
	if(starRating == star || lockCurrentRating)
		return false;
	lockCurrentRating = true;
	$.ajax({
		url: '/chat/ajax/write_rating.jsp'+'?id='+globalRoomID+'&key='+globalRoomKey+'&rating='+star,
		dataType: 'json',
		success: function(j){
		lockCurrentRating = false;
		}
	});
	starRating = star;
	starClick(star);
	return false;
}
function starClick(star){
	if(curSrar == star)
		return false;
	curSrar = star;
	switch (star) {
	case 0:
		$("#star1").attr('src','/tpl/jsp/images/chat/star-empty.png');
		$("#star2").attr('src','/tpl/jsp/images/chat/star-empty.png');
		$("#star3").attr('src','/tpl/jsp/images/chat/star-empty.png');
		$("#star4").attr('src','/tpl/jsp/images/chat/star-empty.png');
		$("#star5").attr('src','/tpl/jsp/images/chat/star-empty.png');
		break;
	case 1:
		$("#star1").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star2").attr('src','/tpl/jsp/images/chat/star-empty.png');
		$("#star3").attr('src','/tpl/jsp/images/chat/star-empty.png');
		$("#star4").attr('src','/tpl/jsp/images/chat/star-empty.png');
		$("#star5").attr('src','/tpl/jsp/images/chat/star-empty.png');
		break;
	case 2:
		$("#star1").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star2").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star3").attr('src','/tpl/jsp/images/chat/star-empty.png');
		$("#star4").attr('src','/tpl/jsp/images/chat/star-empty.png');
		$("#star5").attr('src','/tpl/jsp/images/chat/star-empty.png');
		break;
	case 3:
		$("#star1").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star2").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star3").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star4").attr('src','/tpl/jsp/images/chat/star-empty.png');
		$("#star5").attr('src','/tpl/jsp/images/chat/star-empty.png');
		break;
	case 4:
		$("#star1").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star2").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star3").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star4").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star5").attr('src','/tpl/jsp/images/chat/star-empty.png');
		break;
	case 5:
		$("#star1").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star2").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star3").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star4").attr('src','/tpl/jsp/images/chat/star-fill.png');
		$("#star5").attr('src','/tpl/jsp/images/chat/star-fill.png');
		break;
	}
	return false;
}
////////////////////////////////////////////////////
function typing(){
	//flagStartTyping = $("#mess").val().length;
	writeSymbolCount(true); // статус печатает 
	return false;
}
var lockSymbolCount = false;
function writeSymbolCount(status_flag){
	if(lockSymbolCount)
		return false;
	lockSymbolCount = true;
	$.ajax({
		url: '/chat/ajax/count_symbol.jsp'+'?id='+globalRoomID+'&key='+globalRoomKey+'&status_flag='+status_flag,
		dataType: 'json',
		success: function(j){
		lockSymbolCount = false;
		}
	});
	return false;
}
function resize_mess2(){
	$("#chat-conteiner").height($('#sID').height()-2);
}
function resize_mess_on(){
	$("#chat-conteiner").height(80);
	resize_mess2();
}
var lockCloseOrRefreshStatus = false;
function setCloseOrRefreshStatus()
{
	if(lockCloseOrRefreshStatus == true)
		return;
	lockCloseOrRefreshStatus = true;
	$.ajax({
		url: '/chat/ajax/close_or_refresh_status.jsp'+'?id='+globalRoomID+'&key='+globalRoomKey,
		dataType: 'json',
		success: function(j){
		lockCloseOrRefreshStatus = false;
		}
	});
	return;
}
function soundOnOff(){
	playSountIncomingMessage = !playSountIncomingMessage;
	if(playSountIncomingMessage == true){
		$("#sound-img").attr('src','/tpl/jsp/images/chat/sound_on.png');
		$("#sound-img").attr('alt','Выкл. звук');
		$("#sound-img").attr('title','Выключить звук');
	}
	else{
		$("#sound-img").attr('src','/tpl/jsp/images/chat/sound_off.png');
		$("#sound-img").attr('alt','Включить звук');
		$("#sound-img").attr('title','Вкл. звук');
	}
	return false;
}
var sendKeyEnter = true;
function changeKeys(){
	sendKeyEnter = !sendKeyEnter;
	if(sendKeyEnter==false){
		$("#key-img").attr('src','/tpl/jsp/images/chat/enter_off.png');
		$("#key-img").attr('alt','Отправка по Ctrl+Enter');
		$("#key-img").attr('title','Отправка по Enter');
	}
	else{
		$("#key-img").attr('src','/tpl/jsp/images/chat/enter_on.png');
		$("#key-img").attr('alt','Отправка по Enter');
		$("#key-img").attr('title','Отправка по Ctrl+Enter');
	}
	$("#mess").focus();
	return false;
}
function init(rid,rkey){
	$(window).bind("resize",resize_mess_on);
	window.onfocus = function() {
		focusInMessage = true;
		$(document).attr('title',"Lardi-Chat");
	};
	window.onblur = function() {
		focusInMessage = false;
	};
	globalRoomID = rid;
	globalRoomKey = rkey;
	$("#sendBtn").attr('disabled','');
	$("#mess").attr('disabled', '');
	$("#mess").focus();

	//==========================
	window.onbeforeunload = setCloseOrRefreshStatus;
	//==========================
	//Отображение иконок во время загрузки...
	$("#loading").bind("ajaxSend",function(){
		$(this).show(); // показываем элемент
			}).bind("ajaxComplete", function(){
				$(this).hide(); // скрываем элемент
	});
	//==========================
	//Рейтинг
	starClick(starRating);
	$('#star1').mousemove(function(event) {starClick(1);});
	$('#star2').mousemove(function(event) {starClick(2);});
	$('#star3').mousemove(function(event) {starClick(3);});
	$('#star4').mousemove(function(event) {starClick(4);});
	$('#star5').mousemove(function(event) {starClick(5);});
	$('#star1').mouseout(function() {starClick(starRating);});
	$('#star2').mouseout(function() {starClick(starRating);});
	$('#star3').mouseout(function() {starClick(starRating);});
	$('#star4').mouseout(function() {starClick(starRating);});
	$('#star5').mouseout(function() {starClick(starRating);});
	
	$("#mess").bind('keydown',
			function(e){
					if(sendKeyEnter){
						if(e.ctrlKey && e.keyCode == 13){
							$("#mess").val($("#mess").val() + "\n");
						}else if(e.keyCode == 13){
									$("#sendBtn").focus();
							    	sendMsg();
							   }
					}
					else
						if(e.ctrlKey && (e.keyCode == 13)){
							$("#sendBtn").focus();
					    	sendMsg();
						}else if(e.keyCode == 13){
						}
	});
	$("#mess").bind('keyup',
			function(e){
				if(isActiv){
					secLastAction = 5000;
				}
				else {
					isActiv = true;
					secLastAction = 5000;
					typing();
				}
		});
	chatCheckMsg();
	return false;
}
//////////////////////////////////////////////////////////////
var playSountIncomingMessage = true;
function soundIncomingMessage(){
	if(playSountIncomingMessage == true){
		var audioTagSupport = !!(document.createElement('audio').canPlayType);
		if(audioTagSupport){
			document.getElementById('incomingMessage').play();
		}
	}
}

function chatCheckMsg(){
	if (chat_message_lock){ return; }
	if (msg_update_locker>0){
		if(secLastAction>0)
			secLastAction = secLastAction - 100;
		else
			if(isActiv){
				isActiv = false;
				writeSymbolCount(false);
			}
		msg_update_locker--;
		setTimeout("chatCheckMsg()", 100);
		return false;
	}
	msg_update_locker=chat_refresh_timer;
	chat_message_lock=true;
	var cur_date = new Date();
	jQuery.ajax({
	    type: "GET",
	    url: '/chat/ajax/messages.jsp?id='+globalRoomID+'&uni_key='+globalRoomKey+'&last_id='+last_message_id+'&rnd='+cur_date.getMinutes()+cur_date.getSeconds(),
	    dataType: "json",
	    success: function(j){
			try{
				if (j[0]['status']!="ok"){
					errorMessage(j[0]['status']+"( попробуйте обновить страницу )");
					return false;
				} else {
					if(j[0]['oper_status'] == "true")
						$("#oper-status").html("пишет");
					else
						$("#oper-status").html("");
					if(j[0]['is_closed'] == "true"){
						$("#aOpenComment").hide();
						$("#spanOpenComment").show();
					}
					starRating = parseInt(j[0]['oper_rating']);
					starClick(starRating);
					if (j[0]['data'].length>0){
						var sountOneTime = true;
						var tmp=""; 
						$("#cur-info").html("<span>Оператор: </span><span  style='font-weight: bold'>"+j[0]['show_oper_name']+"</span>");
						var html=$('#chat-body').html();
						for (var i=0; i<j[0]['data'].length; i++){
							tmp = j[0]['data'][i];
							/////////////////////////////////////////////////////
							last_message_id=tmp['id'];			
							
							//+++++++++++++Верхняя часть+++++++++++++
							if(tmp['direction']==1){
								html+="<div class='chat-simple-mess'><div class='oper-mess'>Оператор: <span  style='font-weight: bold'>"
									+tmp['message_oper_name']+"</span> ["+tmp['time_create']+"] :</div>";
									//$(document).attr('title',"Новое сообщение...");
									if(sountOneTime&&focusInMessage == false){
										titleNewMessage("Новое сообщение...");
										soundIncomingMessage();
										sountOneTime = false;
									}
							}
							if(tmp['direction']==2){
								html+="<div class='chat-simple-mess'><div class='user-mess'><span  style='font-weight: bold'>"
									+j[0]['show_user_name']+"</span> ["+tmp['time_create']+"] :</div>";
							}
							if(tmp['direction']==3){
								if(sountOneTime&&focusInMessage == false){
									titleNewMessage("Новое сообщение...");
									soundIncomingMessage();
									sountOneTime = false;
								}
								html+="<div class='sys-mess'>";
							}
							
							//Содержимое сообщения
							//==============================
							html+="<div class='contents'><p>";
							html+= tmp['text'];
							html+="</p></div>";
							//==============================
							//++++++++++++++Нижняя часть++++++++++++
							html+="</div>";//Закрытие chat-simple-mess
							/////////////////////////////////////////////////////
						}
						$('#chat-body').html(html);
						$('#chat-conteiner').animate({scrollTop: $('#chat-conteiner').attr('scrollHeight')}, chat_scroll_timer);					
					}
				}
				chat_message_lock=false;
				setTimeout("chatCheckMsg()", 100);
			}
			catch(err){
				$("#cur-info").html("Ошибка: "+err.message);
			}
		},
	    error: function(XMLHttpRequest, textStatus, errorThrown){
			chat_message_lock=false;
			errorMessage("Сервер временно недоступен");
			setTimeout("chatCheckMsg()", 100);
	    }
	});
}
function chatSender(){
	try{
		if (chat_msg_buffer.length>0){
			var buffer = "";
			if (chat_msg_buffer.length>chat_msg_limit){
				buffer = chat_msg_buffer.substring(0, chat_msg_limit);
				chat_msg_buffer = chat_msg_buffer.substring(chat_msg_limit, chat_msg_buffer.length);
			} else {
				buffer = chat_msg_buffer;
				chat_msg_buffer="";
			}
			///
			$.getJSON(
				'/chat/ajax/send_msg.jsp',
				{ id:  globalRoomID, key: globalRoomKey, mess: buffer },
				function(j){
					chatSender();
				}
			);
			///
		} else {
			$("#sendBtn").attr('disabled','');
			$("#mess").attr('disabled', '');
			$("#mess").focus();
			$("#mess").val("");
			msg_update_locker=0;		
		}
	} catch (err){
		  txt="Ошибка на странице.\n\n";
		  txt+="Описание ошибки: " + err.description + "\n\n";
		  errorMessage(txt);
	}
}
function sendMsg(){
	if( $("#mess").val() == ""){
		$("#mess").focus();
		return false;
	}
	chat_msg_buffer = $("#mess").val();
	$("#mess").attr('disabled', 'disabled');
	$("#sendBtn").attr('disabled','disabled');
	chatSender();
	isActiv = false;
    return false;
}/**
 * funyManz
 */
function initAddTenderScript(){
	$("#stavkaType").change(function(){
		$("#paymentType").html($("#stavkaType option:selected").html());
	});
	$("#stavkaType").change();
	changeCountry(true,selAreaFrom,"From");
	changeCountry(true,selAreaTo,"To");
	// Для кнопки заполнения текущей датой
	var _gotoToday = $.datepicker._gotoToday;
	$.datepicker._gotoToday = function(id) {
	     _gotoToday.call( this, id ); 
	     var target = $(id),
	     	 inst = this._getInst(target[0]);
	     this._selectDate(id, this._formatDate(inst,
	         inst.selectedDay, inst.drawMonth, inst.drawYear));
	};

    $('#dateFrom').datepicker({ showButtonPanel: true });
    $('#dateTo').datepicker({ showButtonPanel: true });
    $('#tenderBeginDate').datepicker({ showButtonPanel: true });
    $('#tenderEndDate').datepicker({ showButtonPanel: true });
    
    $('#accepRule').click(function() {
    	if($("rule").attr("checked") == "checked"){
    		$("rule").attr("checked",false);
    	} else {
    		$("rule").attr("checked",true);
    	}
    });
    $("#cityFrom").focusout(function() {
    	searchCityFrom();
    });
    $("#cityTo").focusout(function() {
    	searchCityTo();
    });
}

var lockCheckEditTenderValid = false;
function checkEditTenderValid(){
	if(!lockCheckEditTenderValid){
		lockCheckEditTenderValid = true;
		var ansvert=confirm("Вы уверены что хотите сохранить изменения?");
		if (ansvert==true){
			$("#bEdit").val("true");
			$("#mainForm").submit();
		}
		lockCheckEditTenderValid = false; 
	}
}

var lockCheckAddTenderValid = false;
function checkAddTenderValid(){
	if(!lockCheckAddTenderValid){
		lockCheckAddTenderValid = true;
		$("#bAdd").val("true");
		$("#mainForm").submit();
		lockCheckAddTenderValid = false;
	}
}
var lockCityFrom = false,lastCityFrom="";
function searchCityFrom() {
	if (!lockCityFrom) {
		$("#cityFrom").val(jQuery.trim($("#cityFrom").val()));
		var cityFromVal = $("#cityFrom").val();
		if(lastCityFrom != cityFromVal){
			if(cityFromVal!= "" && cityFromVal.length>=3){
				lockCityFrom=true;
				lastCityFrom = cityFromVal;
				$.getJSON(
						'/log/mygruztrans/ajax/',
						{"method": "search_city", "name": cityFromVal},
						function(data) {
							if(data.status!="ok"){
								alert(data.status);
								$("#cityFrom").focus();
							} else {
								//Если страна найдена
								if(data.data.country!=0){
									//$("#cityFrom").val(data.data.city);
									$("#countryFrom option[value='"+data.data.country+"']").attr('selected', 'selected');
									changeCountry(true,data.data.area,"From");
									$("#cityTo").focus();
								} else {
									$("#cityFrom").focus();
								}
							}
							lockCityFrom=false;
						}
				);
			}
		}
	}
}
var lockCityTo = false,lastCityTo="";
function searchCityTo() {
	if (!lockCityTo) {
		$("#cityTo").val(jQuery.trim($("#cityTo").val()));
		var cityToVal = $("#cityTo").val();
		if(lastCityTo != cityToVal){
			if(cityToVal!= "" && cityToVal.length>=3){
				lockCityTo=true;
				lastCityTo = cityToVal;
				$.getJSON(
						'/log/mygruztrans/ajax/',
						{"method": "search_city", "name": cityToVal},
						function(data) {
							if(data.status!="ok"){
								alert(data.status);
								$("#cityTo").focus();
							} else {
								if(data.data.country!=0){
									//$("#cityTo").val(data.data.city);
									$("#countryTo option[value='"+data.data.country+"']").attr('selected', 'selected');
									changeCountry(true,data.data.area,"To");
									$("#gruz").focus();
								} else {
									$("#cityTo").focus();
								}
							}
							lockCityTo=false;
						}
				);
			}
		}
	}
}
function changeMassType(){
	if($("#massType").val() == "FROM_TO"){
		$("#massTo").attr("disabled",false);
	} else {
		$("#massTo").attr("disabled",true);
		$("#massTo").val("");
	}
}
function changeValueType(){
	if($("#valueType").val() == "FROM_TO"){
		$("#valueTo").attr("disabled",false);
	} else {
		$("#valueTo").attr("disabled",true);
		$("#valueTo").val("");
	}
}
function fillAreaOption(curAreas,curent,init){
	var res = "<option value='0'></option>";
	if(init){
		for(var i = 0;i<curAreas.length;i++){
			if(curent == curAreas[i].id)
				res+="<option selected value=\""+curAreas[i].id +"\">"+curAreas[i].name+"</option>";
			else
				res+="<option value=\""+curAreas[i].id +"\">"+curAreas[i].name+"</option>";
		}
	} else {
		for(var i = 0;i<curAreas.length;i++){
			if(curAreas[i].id)
			res+="<option value=\""+curAreas[i].id +"\">"+curAreas[i].name+"</option>";
		}
	}
	return res;
}
//init устанавливать конкретную область(зависит от selArea)
function changeCountry(init,selArea,direction){
	if($("#country"+direction).val()==0){
		$("#area"+direction).attr("disabled",true);
		$("#area"+direction).html("<option value='0'></option>");
		$("#starArea"+direction).hide();
		return;
	}
	var curAreas = allAreas[$("#country"+direction).val()];	
	if(curAreas.length == 0){
		$("#area"+direction).attr("disabled",true);
		$("#area"+direction).html("<option value='0'></option>");
		$("#starArea"+direction).hide();
	} else {
		$("#starArea"+direction).show();
		$("#area"+direction).attr("disabled",false);
		$("#area"+direction).html(fillAreaOption(curAreas,selArea,init));
	}
}
function changeCountryBySign(init,direction){
	if($("#country"+direction).val()==0){
		$("#area"+direction).attr("disabled",true);
		$("#area"+direction).html("<option value='0'>любая обл.</option>");		
		return;
	}
	var curAreas = allAreas[$("#country"+direction).val()];	
	if(curAreas.length == 0){
		$("#area"+direction).attr("disabled",true);
		$("#area"+direction).html("<option value='0'>любая обл.</option>");
	} else {
		$("#area"+direction).attr("disabled",false);
		$("#area"+direction).html(fillAreaOption(curAreas,0,init));
	}
}
function confirmFilter(){
	$("#tenderUserTableErrorCont").hide();
	$("#tenderActionErrorCont").hide();
	getAllUserTender();
}
//сортировать тендеры
function tenderSort(by){
	$("#sortTendersBy").val(by);
	$("#bFilterSubmit").val("true");
	getAllUserTender();
}
function tenderRateSort(by){
	$("#sortTendersBy").val(by);
	$("#bFilterSubmit").val("true");
	getAllUserRates();
}

function getAjaxActionErrorText(jsonArray){
	var array = jQuery.parseJSON(jsonArray);
	var res = "";
	for(var i = 0;i<array.length;i++){
		res += array[i].tId + " - " + array[i].errorText + "<br />";
	}
	return res;
}


//{"tenderCompaniesState","ALL_COMPANIES", 
//	"filterStatus":["ACTIVE","NEW","COMPLETED","CANCELED"],
//	"sortTendersBy":["STATUS","COMPANIES_COUNT","DATETIME_BEGIN"],
//	"filterDateFrom":"2011-02-20","filterDateTo":"2011-02-20"}
//Получить все тендеры пользователя

//selectedFilterStatus()
var lockGetAllUserTender = false;
function getAllUserTender(){
	if(lockGetAllUserTender==false){
		lockGetAllUserTender = true;
		$("#loadingExAction").css("display","inline-block");
		$.post(
				"/tenders/ajax/actions.jsp",
				{	"action":"getAllUserTenders",
					"tenderCompaniesState":$("#tenderCompaniesState").val(),
					"filterStatus":selectedFilterStatusVal(),
					"sortTendersBy":$("#sortTendersBy").val(),
					"filterDateFrom":$("#filterDateFrom").val(),
					"filterDateTo":$("#filterDateTo").val()},
				function(data) {
					lockGetAllUserTender = false;
					$("#loadingExAction").css("display","none");
					if(data.status=='ok'){
						$("#tenderUserTableErrorCont").hide();
						$("#userTenderTableFromAjax").html(data.userTendersTable);
						if(data.userNoHaveTenders == "true"){
							$("#userNoHaveTendersInfo").show();
						} else {
							$("#userNoHaveTendersInfo").hide();
						}
					} else {
						if(data.type=="multi")
							$("#tenderUserTableErrorText").html(getAjaxActionErrorText(data.text));
						else
							$("#tenderUserTableErrorText").html(data.text);
						$("#tenderUserTableErrorCont").show();
					}
					selectTenderStopPropagation();
				},"json"
			);
	}
}

var lockGetAllUserRates = false;
function getAllUserRates(){
	if(lockGetAllUserRates==false){
		lockGetAllUserRates = true;
		$("#loadingExAction").css("display","inline-block");
		$.post(
				"/tenders/ajax/actions.jsp",
				{	"action":"getAllUserRates",
					"tenderCompaniesState":$("#tenderCompaniesState").val(),
					"filterStatus":selectedFilterStatusVal(),
					"sortTendersBy":$("#sortTendersBy").val(),
					"filterDateFrom":$("#filterDateFrom").val(),
					"filterDateTo":$("#filterDateTo").val()},
				function(data) {
					lockGetAllUserRates = false;
					$("#loadingExAction").css("display","none");
					if(data.status=='ok'){
						$("#tenderUserTableErrorCont").hide();
						$("#userRatesTableFromAjax").html(data.userRatesTable);
					} else {
						if(data.type=="multi")
							$("#tenderUserTableErrorText").html(getAjaxActionErrorText(data.text));
						else
							$("#tenderUserTableErrorText").html(data.text);
						$("#tenderUserTableErrorCont").show();
					}
					selectTenderStopPropagation();
				},"json"
			);
	}
}

var lockTenderUserAjaxAction = false;
function tenderUserAjaxAction(action,confirmMessage){
	if(lockTenderUserAjaxAction==false){
		var tenderIds = getSelTenderIds();
		if (confirmMessage=="none"||confirm(confirmMessage)){
			lockTenderUserAjaxAction = true;
			$("#loadingExAction").css("display","inline-block");
			$.post(
					"/tenders/ajax/actions.jsp",
					{"action":action,"tId":tenderIds},
					function(data) {
						lockTenderUserAjaxAction = false;
						$("#loadingExAction").css("display","none");
						if(data.status=='ok'){
							$("#tenderActionErrorCont").hide();
						} else {
							if(data.type=="multi")
								$("#tenderActionErrorText").html(getAjaxActionErrorText(data.text));
							else
								$("#tenderActionErrorText").html(data.text);
							//if(data.type=="rate")
							$("#tenderActionErrorCont").show();
						}
						getAllUserTender();
					},"json"
				);
		}
	}
}

var lockTenderViewAjaxAction = false;
function tenderViewAjaxAction(action,confirmMessage){
	if(lockTenderViewAjaxAction==false){
		var tenderId = getSelTenderIds();
		if (confirmMessage=="none"||confirm(confirmMessage)){
			lockTenderViewAjaxAction = true;
			$("#loadingExAction").css("display","inline-block");
			$.post(
					"/tenders/ajax/actions.jsp",
					{"action":action,"tId":tenderId},
					function(data) {
						lockTenderViewAjaxAction = false;
						$("#loadingExAction").css("display","none");
						if(data.status=='ok'){
							$("#tenderActionErrorCont").hide();
							if(action == "del"){
								document.location = "/log/tenders";
								return;
							}
						} else {
							if(data.type=="multi")
								$("#tenderActionErrorText").html(getAjaxActionErrorText(data.text));
							else
								$("#tenderActionErrorText").html(data.text);
							$("#tenderActionErrorCont").show();
						}
						userTenderViewInit();
					},"json"
				);
		}
	}
}

var lockTenderRateActions = false;
function tenderRateActions(action,confirmMessage){
	if(lockTenderRateActions==false){
		var tenderId = getSelTenderIds();
		if (confirmMessage=="none"||confirm(confirmMessage)){
			lockTenderRateActions = true;
			$("#loadingUserTenderView").css("display","inline-block");
			$.post(
					"/tenders/ajax/actions.jsp",
					{"action":action,"tId":tenderId,"stavka":$("#stavka").val(),"comment":$("#comment").val()},
					function(data) {
						lockTenderRateActions = false;
						$("#loadingUserTenderView").css("display","none");
						if(data.status=='ok'){
							$("#tenderActionErrorCont").hide();
							userTenderViewInit();
						} else {
							if(data.type=="multi")
								$("#tenderActionErrorText").html(getAjaxActionErrorText(data.text));
							else
								$("#tenderActionErrorText").html(data.text);
							//if(data.type=="rate")
							$("#tenderActionErrorCont").show();
						}
					},"json"
				);
		}
	}
}
var lockTenderWinnerAjaxAction = false;
function tenderWinnerAjaxAction(confirmMessage,tenderId,rateWinnerUid){
	if(lockTenderWinnerAjaxAction==false){
		if (confirm(confirmMessage)){
			lockTenderWinnerAjaxAction = true;
			$("#loadingExAction").css("display","inline-block");
			$.post(
					"/tenders/ajax/actions.jsp",
					{"action":"setWinner","tId":tenderId,"rateWinnerUid":rateWinnerUid},
					function(data) {
						lockTenderWinnerAjaxAction = false;
						$("#loadingExAction").css("display","none");
						if(data.status=='ok'){
							$("#tenderActionErrorCont").hide();
							userTenderViewInit();
						} else {
							$("#tenderActionErrorText").html(data.text);
							$("#tenderActionErrorCont").show();
						}
					},"json"
				);
		}
	}
}

var lockTenderBanRateAjaxAction = false;
function tenderBanRateAjaxAction(confirmMessage,tenderId,rateBannedUid,ban){
	if(lockTenderBanRateAjaxAction==false){
		if (confirmMessage=="none"||confirm(confirmMessage)){
			lockTenderBanRateAjaxAction = true;
			var action;
			if(ban == true){
				action = "banRate";
			} else {
				action = "unBanRate";
			}
			$("#loadingExAction").css("display","inline-block");
			$.post(
					"/tenders/ajax/actions.jsp",
					{"action":action,"tId":tenderId,"rateOwnerUid":rateBannedUid},
					function(data) {
						lockTenderBanRateAjaxAction = false;
						$("#loadingExAction").css("display","none");
						if(data.status=='ok'){
							$("#tenderActionErrorCont").hide();
							userTenderViewInit();
						} else {
							$("#tenderActionErrorText").html(data.text);
							$("#tenderActionErrorCont").show();
						}
					},"json"
				);
		}
	}
}

function tenderTakePart(){
	tenderRateActions("takePart","none");
}
function tenderTenderEdit(){
	tenderRateActions("edit","none");
}
function tenderTenderAbort(warningText){
	tenderRateActions("abort",warningText);
}
var lockTenderMyRateCancel = false;
function tenderMyRateCancel(confirmMessage){
	if(lockTenderMyRateCancel==false){
		var tenderId = getSelTenderIds();
		if (confirmMessage=="none"||confirm(confirmMessage)){
			lockTenderMyRateCancel = true;
			$("#loadingUserTenderView").css("display","inline-block");
			$.post(
					"/tenders/ajax/actions.jsp",
					{"action":"abort","tId":tenderId},
					function(data) {
						lockTenderMyRateCancel = false;
						$("#loadingUserTenderView").css("display","none");
						if(data.status=='ok'){
							$("#tenderActionErrorCont").hide();
							tenderRateInit();
						} else {
							if(data.type=="multi")
								$("#tenderActionErrorText").html(getAjaxActionErrorText(data.text));
							else
								$("#tenderActionErrorText").html(data.text);
							//if(data.type=="rate")
							$("#tenderActionErrorCont").show();
						}
					},"json"
				);
		}
	}
}
function getSelTenderIds(){
	var selTendersIds ="";
	$('input:checkbox[name=selectTender]:checked').each(
			function(){
				if(selTendersIds.length>0)
					selTendersIds+=",";
				selTendersIds += $(this).val();
		});
	//Для страници просмотра тендера
	if(selTendersIds.length==0)
		selTendersIds = $("#tId").val();
	return selTendersIds;
}
function tenderRaitActionInit(){
	//для поиска $("input:checkbox[name^='selectTender_']")
	$("span[id^='winnerStar_']").each(function(event){
		$(this).mousemove(function(event) {
			$(this).addClass("tendeWinnerStar");
			$(this).removeClass("tendeWinnerStarEmpty");
		});
		$(this).mouseout(function() {
			$(this).removeClass("tendeWinnerStar");
			$(this).addClass("tendeWinnerStarEmpty");
		});
	});
}
function selectTenderStopPropagation(){
	$("#selectTender_all").click(function(event){
		event.stopPropagation();
		return true;
	});
	$("input:checkbox[name='selectTender']").each(function(event){
		$(this).click(function(event){
			checkUserTenderAllSelection();
			event.stopPropagation();
			return true;
		});
	});
}
function tendersInit(){
	$('#filterDateFrom').datepicker({ showButtonPanel: true });
	$('#filterDateTo').datepicker({ showButtonPanel: true });
	tenderStatusInit();
	selectTenderStopPropagation();//getAllUserTender();
}
function tenderRateInit(){
	$('#filterDateFrom').datepicker({ showButtonPanel: true });
	$('#filterDateTo').datepicker({ showButtonPanel: true });
	tenderStatusInit();
	getAllUserRates();
}
var lockUserTenderViewInit = false;
function userTenderViewInit(){
	if(lockUserTenderViewInit==false){
		lockUserTenderViewInit = true;
		$("#loadingUserTenderView").css("display","inline-block");
		$.post(
				"/tenders/ajax/actions.jsp",
				{"action":"getTenderView","tenderId":$("#tId").val()},
				function(data) {
					lockUserTenderViewInit = false;
					$("#loadingUserTenderView").css("display","none");
					if(data.status=="ok"){
						$("#tenderUserTableErrorCont").hide();
						$("#userTenderTableFromAjax").html(data.userTendersTable);
						setUserTenderViewData(data);
					} else {
						if(data.type=="multi")
							$("#tenderUserTableErrorText").html(getAjaxActionErrorText(data.text));
						else
							$("#tenderUserTableErrorText").html(data.text);
						$("#tenderUserTableErrorCont").show();
					}
					//===================[ Удачно загрузились все блоки ]======================
					selectTenderStopPropagation();
					tenderRaitActionInit();
				},"json"
			);
	}
}
function setUserTenderViewData(data){
	if(data.blockTenderInfo!=undefined)
		$("#blockTenderInfo").html(data.blockTenderInfo);
	if(data.blockTenderLoad!=undefined)
		$("#blockTenderLoad").html(data.blockTenderLoad);
	if(data.blockTenderManager!=undefined)
		$("#blockTenderManager").html(data.blockTenderManager);
	if(data.blockTenderWinner!=undefined)
		$("#blockTenderWinner").html(data.blockTenderWinner);
	if(data.blockTenderRate!=undefined)
		$("#blockTenderRate").html(data.blockTenderRate);
	if(data.blockTenderRatesBlock!=undefined)
		$("#blockTenderRatesBlock").html(data.blockTenderRatesBlock);
	if(data.blockTenderBannedRatesBlock!=undefined)
		$("#blockTenderBannedRatesBlock").html(data.blockTenderBannedRatesBlock);
	if(data.blockTenderHistory!=undefined)
		$("#blockTenderHistory").html(data.blockTenderHistory);
}
function selectedFilterStatus(){
	var selectSpan = "";
	$("input:checkbox:checked[name='filterStatus']").each(function(){
		if(selectSpan.length>0)
			selectSpan+=",";
		selectSpan += $("#span"+$(this).attr("id")).html();
    });
	return selectSpan;
}
function selectedFilterStatusVal(){
	var selectSpan = "";
	$("input:checkbox:checked[name='filterStatus']").each(function(){
		if(selectSpan.length>0)
			selectSpan+=",";
		selectSpan += $(this).val();
    });
	return selectSpan;
}
function tenderStatusAllCheck(){
	 if($("input:checkbox:checked[name='filterStatus']").length == $("input:checkbox[name='filterStatus']").length ||
			 $("input:checkbox:checked[name='filterStatus']").length == 0){
		 $("#ALL").attr("checked",true);
		 $("input:checkbox[name='filterStatus']").each(function(){
				$(this).attr("checked",true);
			});
		 $("#tenderStatusFilterSpan").html($("#spanALL").html());
	 } else {
		 $("#ALL").attr("checked",false);
		 $("#tenderStatusFilterSpan").html(selectedFilterStatus());
	 }
}
function tenderStatusInit(){
	$('body').click(function() {
		$('#tenderStatusFilterDiv').hide();
		tenderStatusAllCheck();
	});
	
	$('#tenderStatusFilterDiv').click(function(event){
		event.stopPropagation();
	});
	$("#ALL").click(function(){
		$("input:checkbox[name='filterStatus']").each(function(){
			$(this).attr("checked",true);
		});
		tenderStatusAllCheck();
	});
	$("#tenderStatusFilterSpan").click(function(event){
		if($('#tenderStatusFilterDiv').is(":hidden")){
			$('#tenderStatusFilterDiv').css("top",event.pageY);
			$('#tenderStatusFilterDiv').css("left",event.pageX);
			$('#tenderStatusFilterDiv').show();
		}
		else{
			$('#tenderStatusFilterDiv').hide();
		}
		tenderStatusAllCheck();
		event.stopPropagation();
	});
	$("input:checkbox[name='filterStatus']").click(function(){
		tenderStatusAllCheck();
	});
	tenderStatusAllCheck();
}
function toggleUserTenderSelection(id){
	$("#selectTender_"+id).attr('checked', !$("#selectTender_"+id).attr('checked'));
	checkUserTenderAllSelection();
}
//для поиска $("input:checkbox[name^='selectTender_']")
function toggleUserTenderSelectionAll(){
    if($("#selectTender_all").attr("checked"))
        $("input:checkbox[name='selectTender']").each(function (){
            $(this).attr("checked",true);
        });
    else
       $("input:checkbox[name='selectTender']").each(function (){
            $(this).attr("checked",false);
        });
}
function selAllUserTenders(){
	$("#selectTender_all").attr('checked', !$("#selectTender_all").attr('checked'));
	toggleUserTenderSelectionAll();
}
function checkUserTenderAllSelection(){
	if($("input:checkbox[name='selectTender']").length != $("input:checkbox:checked[name='selectTender']").length){
		 $("#selectTender_all").attr("checked",false);
	 }
}/**
 * @author redlaber
 */
var UA = new Array ();
UA [0] = ["любая обл.",""];
UA [1] = ["Винницкая обл.","15"];
UA [2] = ["Волынская обл.","16"];
UA [3] = ["Днепроп. обл.","17"];
UA [4] = ["Донецкая обл.","18"];
UA [5] = ["Житомир. обл.","19"];
UA [6] = ["Закарп. обл.","20"];
UA [7] = ["Запорож. обл.","21"];
UA [8] = ["Ив.Франк. обл.","22"];
UA [9] = ["Киевская обл.","23"];
UA [10] = ["Кировогр. обл.","24"];
UA [11] = ["Крым","25"];
UA [12] = ["Луганская обл.","26"];
UA [13] = ["Львовская обл.","27"];
UA [14] = ["Николаев. обл.","28"];
UA [15] = ["Одесская обл.","29"];
UA [16] = ["Полтавск. обл.","30"];
UA [17] = ["Ровенская обл.","31"];
UA [18] = ["Сумская обл.","32"];
UA [19] = ["Терноп. обл.","33"];
UA [20] = ["Харьков. обл.","34"];
UA [21] = ["Херсон. обл.","35"];
UA [22] = ["Хмельниц. обл.","36"];
UA [23] = ["Черкас. обл.","37"];
UA [24] = ["Чернигов. обл.","38"];
UA [25] = ["Черновиц. обл.","39"];
var RU = new Array ();
RU [0] = ["любая обл.",""];
RU [1] = ["Агинский Бурят. окр.","40"];
RU [2] = ["Адыгея Р.","41"];
RU [3] = ["Алтай Р.","42"];
RU [4] = ["Алтайский край","43"];
RU [5] = ["Амурская обл.","44"];
RU [6] = ["Архангельская обл.","45"];
RU [7] = ["Астраханская обл.","46"];
RU [8] = ["Башкортостан Р.","47"];
RU [9] = ["Белгородская обл.","48"];
RU [10] = ["Брянская обл.","49"];
RU [11] = ["Бурятия Р.","50"];
RU [12] = ["Владимирская обл.","51"];
RU [13] = ["Волгоградская обл.","52"];
RU [14] = ["Вологодская обл.","53"];
RU [15] = ["Воронежская обл.","54"];
RU [16] = ["Дагестан Р.","55"];
RU [17] = ["Еврейская авт. обл.","56"];
RU [18] = ["Ивановская обл.","57"];
RU [19] = ["Ингушская Р.","58"];
RU [20] = ["Иркутская обл.","59"];
RU [21] = ["Кабардино-Балкар. Р.","60"];
RU [22] = ["Калининградская обл.","61"];
RU [23] = ["Калмыкия Р.","62"];
RU [24] = ["Калужская обл.","63"];
RU [25] = ["Камчатская обл.","64"];
RU [26] = ["Карачаево-Черкес. Р.","65"];
RU [27] = ["Карелия Р.","66"];
RU [28] = ["Кемеровская обл.","67"];
RU [29] = ["Кировская обл.","68"];
RU [30] = ["Коми Р.","69"];
RU [31] = ["Коми-Пермяцкий окр.","70"];
RU [32] = ["Корякский окр.","71"];
RU [33] = ["Костромская обл.","72"];
RU [34] = ["Краснодарский край","73"];
RU [35] = ["Красноярский край","74"];
RU [36] = ["Курганская обл.","75"];
RU [37] = ["Курская обл.","76"];
RU [38] = ["Ленинградская обл.","77"];
RU [39] = ["Липецкая обл.","78"];
RU [40] = ["Магаданская обл.","79"];
RU [41] = ["Марий Эл Р.","80"];
RU [42] = ["Мордовия Р.","81"];
RU [43] = ["Московская обл.","82"];
RU [44] = ["Мурманская обл.","83"];
RU [45] = ["Ненецкий окр.","84"];
RU [46] = ["Нижегородская обл.","85"];
RU [47] = ["Новгородская обл.","86"];
RU [48] = ["Новосибирская обл.","87"];
RU [49] = ["Омская обл.","88"];
RU [50] = ["Оренбургская обл.","89"];
RU [51] = ["Орловская обл.","90"];
RU [52] = ["Пензенская обл.","91"];
RU [53] = ["Пермская обл.","92"];
RU [54] = ["Приморский край","93"];
RU [55] = ["Псковская обл.","94"];
RU [56] = ["Ростовская обл.","95"];
RU [57] = ["Рязанская обл.","96"];
RU [58] = ["Самарская обл.","97"];
RU [59] = ["Саратовская обл.","98"];
RU [60] = ["Саха (Якутия) Р.","99"];
RU [61] = ["Сахалинская обл.","100"];
RU [62] = ["Свердловская обл.","101"];
RU [63] = ["Северная Осетия Р.","102"];
RU [64] = ["Смоленская обл.","103"];
RU [65] = ["Ставропольский край","104"];
RU [66] = ["Таймырский окр.","105"];
RU [67] = ["Тамбовская обл.","106"];
RU [68] = ["Татарстан Р.","107"];
RU [69] = ["Тверская обл.","108"];
RU [70] = ["Томская обл.","109"];
RU [71] = ["Тува Р.","110"];
RU [72] = ["Тульская обл.","111"];
RU [73] = ["Тюменская обл.","112"];
RU [74] = ["Удмуртская Р.","113"];
RU [75] = ["Ульяновская обл.","114"];
RU [76] = ["Усть-Ордын. Бурят. окр","115"];
RU [77] = ["Хабаровский край","116"];
RU [78] = ["Хакасия Р.","117"];
RU [79] = ["Ханты-Мансийский окр.","118"];
RU [80] = ["Челябинская обл.","119"];
RU [81] = ["Чеченская Р.","120"];
RU [82] = ["Читинская обл.","121"];
RU [83] = ["Чувашская Р.","122"];
RU [84] = ["Чукотский окр.","123"];
RU [85] = ["Эвенкийский окр.","124"];
RU [86] = ["Ямало-Ненецкий окр.","125"];
RU [87] = ["Ярославская обл.","126"];
var BY = new Array ();
BY [0] = ["любая обл.",""];
BY [1] = ["Брестская обл.","127"];
BY [2] = ["Витебская обл.","128"];
BY [3] = ["Гомельская обл.","129"];
BY [4] = ["Гродненская обл.","130"];
BY [5] = ["Минская обл.","131"];
BY [6] = ["Могилевская обл.","132"];
var KZ = new Array ();
KZ [0] = ["любая обл.",""];
KZ [1] = ["Акмолинская обл.","133"];
KZ [2] = ["Актюбинская обл.","134"];
KZ [3] = ["Алматинская обл.","135"];
KZ [4] = ["Атырауская обл.","136"];
KZ [5] = ["Восточно-Казахстан. обл.","137"];
KZ [6] = ["Джамбульская обл.","138"];
KZ [7] = ["Западно-Казахстан. обл.","139"];
KZ [8] = ["Карагандинская обл.","140"];
KZ [9] = ["Кустанайская обл.","142"];
KZ [10] = ["Кызыл-Ординская обл.","141"];
KZ [11] = ["Мангистауская обл.","143"];
KZ [12] = ["Павлодарская обл.","144"];
KZ [13] = ["Северо-Казахстан. обл.","145"];
KZ [14] = ["Южно-Казахстан. обл.","146"];
function gtsearch_Change_select1()        {        
	$("#id_areafrom").html("<option>любая обл.</option>");
	if (($("#id_countryfrom").val()=='UA')||($("#id_countryfrom").val()=='RU')||($("#id_countryfrom").val()=='BY')||($("#id_countryfrom").val()=='KZ')) {
		$("#id_areafrom").removeAttr('disabled');
		var sel_array1 = eval($("#id_countryfrom").val());
		var html = "";
        for (var c = 0; c < sel_array1.length; c++) {
        	html+="<option value='"+sel_array1[c][1]+"'>"+sel_array1[c][0]+"</option>";
        }
        $("#id_areafrom").html(html);
	} else {
		$("#id_areafrom").attr('disabled', 'disabled');
	}
}


function gtsearch_Change_select2()        {
	$("#id_areato").html("<option>любая обл.</option>");
	if (($("#id_countryto").val()=='UA')||($("#id_countryto").val()=='RU')||($("#id_countryto").val()=='BY')||($("#id_countryto").val()=='KZ')) {
		$("#id_areato").removeAttr('disabled');
		var sel_array1 = eval($("#id_countryto").val());
		var html = "";
		for (var c = 0; c < sel_array1.length; c++) {
			html+="<option value='"+sel_array1[c][1]+"'>"+sel_array1[c][0]+"</option>";
		}
		$("#id_areato").html(html);
	} else {
		$("#id_areato").attr('disabled', 'disabled');
	}
}

//function openWindow(urlVar) {
//var winAtts;
//winAtts = 'menubar, width=600 height=670';
//newWindow = window.open(urlVar,"_blank",winAtts);
//}

//$(document).ready(function() {
//	//Change_select1();
//	//Change_select2();
//	//console.log("areafrom="+getUrlVars()["areafrom"]);
//	});/** create by lisgray */


var guest = {
		loaddiv:"<div id='loading' style='text-align:center;'><img src='/tpl/jsp/images/loading_small.gif'/></div>",
		loadimg:"<img id='loadimg' src='/tpl/jsp/images/loading_small.gif'/>",
		
		lastguest: 0,
		startload:false,
		
		more: function (itemid/*, event_id*/) {
			if (!guest.startload){
			$('#moreguest').append(guest.loadimg);
			 $('#moreguest a').attr('disabled', 'disabled');
				 guest.startload=true;
				//alert( guest.lastguest);
				 var lastDate;
				 $.each($('.vis_date'), function(key, value) {
				   lastDate = value.id;
				 });
				 
				 $.ajax({
					   type: "POST",
					   url: "/log/guest/ajax/index.jsp",
					   data: ({act:"more", "guest_id": guest.lastguest,"lastDate":lastDate}),
					   dataType: "json",
					   error:function(jqXHR, textStatus, errorThrown){
						   $('.inf_block').append('<div class="t uiInformationRed" style="color:#6A6A6A;margin-top:10px;">Ошибка загрузки списка гостей</div>');
						   $('#loadimg').remove(); 
						 //  $('#moreguest_a').attr('disabled', '');
						 //  guest.startload=false;
						   
					   },
					   success: function(data){
						   guest.lastguest=data.lastguest_id;
						  // $('#moreguest_a').attr('disabled', '');
						   $('#loadimg').remove(); 
						  // alert(data.lastguest_id);
						   if (data.trs!=null&&data.trs!=""){
							   $("#"+itemid).append(data.trs);
							   guest.startload=false;
						   }
						   else{
							   $('#moreguest').remove(); 
						   }
						  
					   }
					}
				);
			}
		},
		
		
		
		getAbsolutePosition: function (el) {
			var r = { x: el.offsetLeft, y: el.offsetTop };
			if (el.offsetParent) {
				var tmp =guest.getAbsolutePosition(el.offsetParent);
				r.x += tmp.x;
				r.y += tmp.y;
			}
			return r;
		}
}; // раскрытие блока при клике на ссылку
//(function($) {
//	$.fn.openCloseBlocks = function(blocks, options) {
//		var defaults = {
//			speed: 'normal'
//		},
//		opts 		= $.extend(defaults, options),
//  		togglers 	= $(this),
//  		bls 		= $(blocks); if(!bls) return;
//
//  		togglers.each(function(index) {
//  			$(this).click(function(e) {
//  				e.preventDefault();
//  				$(bls[index]).slideToggle(opts['speed']);
//  			});
//  		});
//	};
//})(jQuery);
//
//$('div > a').openCloseBlocks($('div.blocks'), {
//	speed: 'fast'
//});

// выпадающий список под ссылкой
(function($) {
	$.fn.dropDownBlock = function(block, options) {
		var defaults = {
			speed: 'fast',
			top: $(this).height(),
			left: 0
		},
		opts 	= $.extend(defaults, options),
  		toggler = $(this),
  		block 	= $(block);
  		toggler.css({'outline': 'none'});
  		

  		toggler.click(function(e) {
  			//e.preventDefault();
  			//$(block).fadeOut(opts['speed']);
  			//$(block).hide();
  			
//  			var pos=toggler.offset().left+toggler.width()+opts['left']-(block.width());
//  			if (pos<0)	pos=-pos;
//  			if (pos>$(document).width()){
//  				pos=pos-(pos-$(document).width());
//  			}
  			
//  			$(block).css({
//        		'position' 	: 'absolute',
//        		'top' 		: (toggler.offset().top + opts['top']/*+9*/) + 'px',
//        		'left' 		: (pos ) + 'px'
//      		});
      		if($(block).is(':visible')){ toggler.removeClass("openToggler"); $(block).hide();}// $(block).fadeOut(opts['speed']);
      		else { toggler.addClass("openToggler");  $(block).show(); e.stopPropagation();}// $(block).fadeIn(opts['speed']);
      		//this.focus();
      		

  		});
  		
  		$('body').click(
  				function(e){
  					//$(block).fadeOut(opts['speed']);
  					$(block).hide();
  					toggler.removeClass("openToggler"); 
  				}
  			);
  		
//   		toggler.blur(function() {
//  			$(block).fadeOut(opts['speed']);
//  		});
	};
})(jQuery);(function($) {

	$.fn.extend({

		popupwindow : function(options, callback) {
			var defaults = {
				xorient : true, // Вправо
				yorient : true, // Вниз
				x : 0, // Отступ по Х
				y : 0, // Отступ по Y
				url : "", // Адрес загружаемой страницы
				width : 300, // Ширина содержимого
				height: "100%", // Высота содержимого
				css: "t popupwindow_default", // Класс шаблона
				default_close_action: true
			};

			var opt = $.extend(defaults, options);	
			var id = new Date().getTime();
			jQuery.data($(this), "id", id);
			$(this).css("position","relative");
			var container = $("<div>").attr("id", id);
			$(this).append(container);
			
			container.css("position", "absolute");				
			container.load("/tpl/guide/jsgui/popupwindow/popup_template.html", function(){
				$(this).find("table").attr("class", opt.css);
				var inner_content = $(this).find(".content");			
				inner_content.load(opt.url, function(){
					$(this).css("width", opt.width).css("height", opt.height);
					var orient = popUpWindowNameSpace.getOrientation(container, opt);				
					popUpWindowNameSpace.applyTheStyle(container, orient);				
					orient = popUpWindowNameSpace.getOffsets(container, orient);					
					popUpWindowNameSpace.applyTheStyle(container, orient);
					popUpWindowNameSpace.setCloseAction(container, opt, callback);					
				});					
			});							
		}
	});

})(jQuery);

var popUpWindowNameSpace = new function() {
	this.setCloseAction = function(container, opt, callback){
		container.find(".cross").click(function(){
			if(opt.default_close_action == true){
				if(typeof callback == 'function'){
			        callback.call(container);
				}
				container.remove();
			}else{
				if(typeof callback == 'function'){
			        callback.call($(this));
				}
			}
		});	
	};
	
	this.applyTheStyle = function(elem, orient){		
		elem.css("top", orient.top).css("left", orient.left);
	};
	
	this.getOrientation = function(elem, opt){
		var orient = new Object();
		orient.top = 0;
		orient.left = 0;
		var borderWidth = 2;
		if (opt.xorient == false) {
			orient.left-= elem.width() + borderWidth;
		}
		if (opt.yorient == false) {		
			orient.top = -(elem.height() + borderWidth);
		}
		orient.top += opt.y;
		orient.left -= opt.x;
		return orient;
	};
	
	this.getOffsets = function(elem, orient){
		var leftOffset = elem.offset().left;
		var topOffset = elem.offset().top;
		var windowWidth = $(window).width();
		var marginFromWindow = 10;
		var borderWidth = 2;
		// Проверка чтоб не вылезало влево
		if (leftOffset < 10) {			
			orient.left -= leftOffset - marginFromWindow;
		}
		// Проверка чтоб не вылезало вверх
		if (topOffset < 10) {		
			orient.top -= topOffset - marginFromWindow;
		}		
		// Проверка чтоб не вылезало вправо
		if ((leftOffset + elem.width() + borderWidth) > windowWidth) {			
			orient.left -= leftOffset + elem.width() + borderWidth - windowWidth
					+ marginFromWindow;
		}
		return orient;
	};
};(function(b){var e,d,a=[],c=window;b.fn.tinymce=function(j){var p=this,g,k,h,m,i,l="",n="";if(!p.length){return p}if(!j){return tinyMCE.get(p[0].id)}p.css("visibility","hidden");function o(){var r=[],q=0;if(f){f();f=null}p.each(function(t,u){var s,w=u.id,v=j.oninit;if(!w){u.id=w=tinymce.DOM.uniqueId()}s=new tinymce.Editor(w,j);r.push(s);s.onInit.add(function(){var x,y=v;p.css("visibility","");if(v){if(++q==r.length){if(tinymce.is(y,"string")){x=(y.indexOf(".")===-1)?null:tinymce.resolve(y.replace(/\.\w+$/,""));y=tinymce.resolve(y)}y.apply(x||tinymce,r)}}})});b.each(r,function(t,s){s.render()})}if(!c.tinymce&&!d&&(g=j.script_url)){d=1;h=g.substring(0,g.lastIndexOf("/"));if(/_(src|dev)\.js/g.test(g)){n="_src"}m=g.lastIndexOf("?");if(m!=-1){l=g.substring(m+1)}c.tinyMCEPreInit=c.tinyMCEPreInit||{base:h,suffix:n,query:l};if(g.indexOf("gzip")!=-1){i=j.language||"en";g=g+(/\?/.test(g)?"&":"?")+"js=true&core=true&suffix="+escape(n)+"&themes="+escape(j.theme)+"&plugins="+escape(j.plugins)+"&languages="+i;if(!c.tinyMCE_GZ){tinyMCE_GZ={start:function(){tinymce.suffix=n;function q(r){tinymce.ScriptLoader.markDone(tinyMCE.baseURI.toAbsolute(r))}q("langs/"+i+".js");q("themes/"+j.theme+"/editor_template"+n+".js");q("themes/"+j.theme+"/langs/"+i+".js");b.each(j.plugins.split(","),function(s,r){if(r){q("plugins/"+r+"/editor_plugin"+n+".js");q("plugins/"+r+"/langs/"+i+".js")}})},end:function(){}}}}b.ajax({type:"GET",url:g,dataType:"script",cache:true,success:function(){tinymce.dom.Event.domLoaded=1;d=2;if(j.script_loaded){j.script_loaded()}o();b.each(a,function(q,r){r()})}})}else{if(d===1){a.push(o)}else{o()}}return p};b.extend(b.expr[":"],{tinymce:function(g){return g.id&&!!tinyMCE.get(g.id)}});function f(){function i(l){if(l==="remove"){this.each(function(n,o){var m=h(o);if(m){m.remove()}})}this.find("span.mceEditor,div.mceEditor").each(function(n,o){var m=tinyMCE.get(o.id.replace(/_parent$/,""));if(m){m.remove()}})}function k(n){var m=this,l;if(n!==e){i.call(m);m.each(function(p,q){var o;if(o=tinyMCE.get(q.id)){o.setContent(n)}})}else{if(m.length>0){if(l=tinyMCE.get(m[0].id)){return l.getContent()}}}}function h(m){var l=null;(m)&&(m.id)&&(c.tinymce)&&(l=tinyMCE.get(m.id));return l}function g(l){return !!((l)&&(l.length)&&(c.tinymce)&&(l.is(":tinymce")))}var j={};b.each(["text","html","val"],function(n,l){var o=j[l]=b.fn[l],m=(l==="text");b.fn[l]=function(s){var p=this;if(!g(p)){return o.apply(p,arguments)}if(s!==e){k.call(p.filter(":tinymce"),s);o.apply(p.not(":tinymce"),arguments);return p}else{var r="";var q=arguments;(m?p:p.eq(0)).each(function(u,v){var t=h(v);r+=t?(m?t.getContent().replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g,""):t.getContent()):o.apply(b(v),q)});return r}}});b.each(["append","prepend"],function(n,m){var o=j[m]=b.fn[m],l=(m==="prepend");b.fn[m]=function(q){var p=this;if(!g(p)){return o.apply(p,arguments)}if(q!==e){p.filter(":tinymce").each(function(s,t){var r=h(t);r&&r.setContent(l?q+r.getContent():r.getContent()+q)});o.apply(p.not(":tinymce"),arguments);return p}}});b.each(["remove","replaceWith","replaceAll","empty"],function(m,l){var n=j[l]=b.fn[l];b.fn[l]=function(){i.call(this,l);return n.apply(this,arguments)}});j.attr=b.fn.attr;b.fn.attr=function(n,q,o){var m=this;if((!n)||(n!=="value")||(!g(m))){return j.attr.call(m,n,q,o)}if(q!==e){k.call(m.filter(":tinymce"),q);j.attr.call(m.not(":tinymce"),n,q,o);return m}else{var p=m[0],l=h(p);return l?l.getContent():j.attr.call(b(p),n,q,o)}}}})(jQuery);/**
 * <a href="/log/request/index.jsp?id=${item.id}&action=no">Принять</a><br />
 * <a href="/log/request/index.jsp?id=${item.id}&action=yes">Отклонить</a>
 */
function confCancelDo(message,status,reqId,requestCount){
	if(requestCount>0){
		$("#topHeadCtrlLinksCount").html(requestCount);
		if (requestCount < 100) {
			$("#topHeadCtrlLinkReq")
				.removeClass("topHeadCtrlLinkReqNo")
				.addClass("topHeadCtrlLinkReqHasNew");
		} else {
			$("#topHeadCtrlLinkReq")
				.removeClass("topHeadCtrlLinkReqNo")
				.addClass("topHeadCtrlLinkReqHasNewLong");
		}
	} else {
		$("#topHeadCtrlLinksCount").html("");
		$("#topHeadCtrlLinkReq")
			.removeClass("topHeadCtrlLinkReqHasNew")
			.addClass("topHeadCtrlLinkReqNo");
	}
	$("#reqInfo").removeClass();
	$("#reqInfo").addClass("t");
	if(status == "error"){
		$("#reqInfo").addClass("sysMessageRed");
		$("#reqInfo").html(message);
		$("#reqInfo").show();
		return false;
	}
	$("#reqInfo").addClass("sysMessageYellow");
	$("#reqInfo").html(message);
	$("#reqInfo").show();
	$("#reqLine"+reqId).hide();
	return false;
}
function confirmRequest(reqId){
	$.getJSON("ajax/index.jsp", { id: reqId, action:"confirm" }, function(json){
			confCancelDo(json.message,json.status,reqId,json.request_count);
	    });
	return false;
}
function cancelRequest(reqId){
	$.getJSON("ajax/index.jsp", { id: reqId, action:"cancel" }, function(json){
		confCancelDo(json.message,json.status,reqId,json.request_count);
    });
	return false;
}var messages_np = {
	locks: [],
	loadTableLock: false,
	deleteAllMessagesInDialogLock: false,
	lastMessageId: 0,
	userUid: 0,
	loadDialogLock: false,
	m_timer_run: false,
	sendMessageLock: false,
	sendCapthaLock: false,
	delMessagesLock: [],
	deleteSelectedMessagesLock: false,
	defaultKeySendMessage: 0,
	selectTextFlag: false,
	textSelect: "",
	words: "",
	stopPropagation: function(e) {
		if (!e){
			var e = window.event;
		}
		e.cancelBubble = true;
		if (e.stopPropagation){ 
			e.stopPropagation();
		}
		//e.preventDefault?e.preventDefault():e.returnValue = false;
	},
	setSMkey: function(keySMdef){
		messages_np.defaultKeySendMessage = keySMdef ;
	},
	/** Сделать диалог (не)прочитанным.
	 * @param e
	 * @param type true - сделать прочитанным, false - сделать непрочитанным
	 * @param uid */
	read: function(e,type,uid) {
		messages_np.stopPropagation(e);
		if(messages_np.locks[uid] == undefined || messages_np.locks[uid]==false){
			messages_np.locks[uid] = true;
			$("#i_"+uid).attr("src","/tpl/jsp/images/loading_small.gif");
			$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"read",
						"type":type,
						"uid":uid },
					function(data) {
						$("#loadingExAction").css("display","none");
						if(data.status=='ok'){
							if(type){
								$("#tr_"+uid).attr("class","m_table_border m_tr_read");
								$("#i_"+uid).attr("src","/tpl/jsp/images/messages/readed.png");			
								$("#i_"+uid).attr('title',"Сделать диалог непрочитанным!");
								$("#m_td_"+uid).attr('title',"Сделать диалог непрочитанным!");
								$("#m_td_"+uid).attr("onclick","messages_np.read(event,false,"+uid+")");
							}else{
								$("#tr_"+uid).attr("class","m_table_border m_tr_unread");
								$("#i_"+uid).attr("src","/tpl/jsp/images/messages/unread.png");
								$("#i_"+uid).attr('title',"Сделать прочитанным!");
								$("#m_td_"+uid).attr('title',"Сделать прочитанным!");
								$("#m_td_"+uid).attr("onclick","messages_np.read(event,true,"+uid+")");
							}
							messages_np.insertTopLineMessage(data.count);
						} else {
							alert(data.text);
						}
						messages_np.locks[uid]= false;	
					},"json"
				);
		}
	},
	
	loadMessages: function(type,page) {
		if (messages_np.loadTableLock == false) {
			messages_np.loadTableLock = true;
			$("#loadingExAction").css("display", "inline-block");
			$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"load_table",
						"type":type,
						"page":page},
					function(data) {
						$("#loadingExAction").css("display","none");
						if(data.status=='ok'){
							$("#messageBlock").html(data.table);
							messages_np.insertTopLineMessage(data.count);
						} else {
							alert(data.text);
						}
						messages_np.loadTableLock = false;
					},"json"
				);
		}
	},
	loadResultPage: function() {
		$("#id_div_conteiner_listid_input_toseme").hide();
		if (messages_np.loadTableLock == false) {
			messages_np.loadTableLock = true;
			var q = $("#id_input_toseme").val();
			$("#loadingExAction").css("display", "inline-block");
			$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"load_result_page",
						"q":q},
					function(data) {
						$("#loadingExAction").hide();						
						if(data.status=='ok'){
							$("#messageBlock").html(data.table);		
							messages_np.textSelect = jQuery.parseJSON(data.q);
							var dataArray = "q="+q;
							var i = 0;
							if($.inArray(q, messages_np.textSelect)!=-1){
								messages_np.textSelect.splice(messages_np.textSelect.indexOf(q),1);
							}
							for ( ; i < messages_np.textSelect.length; i++) {
								dataArray = dataArray + "&" +"q=" + messages_np.textSelect[i];
							}
							messages_np.words = dataArray.length > 0 ? "?"+dataArray : "";
							$("#messageBlock").highlight("c_set_item_activ",q);
							if(messages_np.textSelect != null){
								for ( var i = 0; i < messages_np.textSelect.length; i++) {
									$("#messageBlock").highlight("c_set_item_activ",messages_np.textSelect[i]);
								}
							}
						} else {
							alert(data.text);
						}
						messages_np.loadTableLock = false;
					},"json"
				);
		}
	},
	
	archive: function(e,type,uid) {
		if(messages_np.locks[uid] == undefined || messages_np.locks[uid]==false){
			messages_np.locks[uid] = true;
			messages_np.stopPropagation(e);
			$("#m_tr_i_"+uid).attr("src","/tpl/jsp/images/loading_small.gif");
			$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"status",
						"type":type,
						"uid":uid },
					function(data) {
						if(data.status=='ok'){
							$("#tr_"+uid).fadeOut('slow',function() {
								$("#tr_"+uid).remove();
								if(data.table != undefined){
									$("#messageBlock").html(data.table);
								}
							});
							messages_np.insertTopLineMessage(data.count);
						} else {
							if(type){
								$("#m_tr_i_"+uid).attr("src","/tpl/jsp/images/del.png");
							}else{
								$("#m_tr_i_"+uid).attr("src","/tpl/jsp/images/restore.png");
							}
							alert(data.text);
						}
						messages_np.locks[uid] = false;
					},"json"
				);
		}
	},
	
	loadDialog: function(uid) {
		if(messages_np.loadDialogLock==false){
			messages_np.loadDialogLock = true;
			$("#loadingExAction").css("display","inline-block");
			$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"load_dialog",
						"uid":uid },
					function(data) {
						$("#loadingExAction").css("display","none");
						if(data.status=='ok'){
							if(data.b_act != undefined){
								$("#m_b_act").html(data.b_act);
							}
							$("#dialogBlock").html(data.table);
							if(messages_np.selectTextFlag){
								for ( var i = 0; i < messages_np.textSelect.length; i++) {
									$("#dialogBlock").highlight("c_set_item_activ",messages_np.textSelect[i]);
								}
								messages_np.selectTextFlag = false;
							}
							messages_np.lastMessageId = data.lastMessageId;	
							messages_np.userUid = uid;	
							$("#breadcrumbs_top_td").html(data.breadcrumbs);
							$("#m_t_b_return").html(data.m_t_b_return);
							messages_np.m_scroll();
							$("#textMessage").focus();
							if(data.timer == null){
								if(messages_np.m_timer_run == false || messages_np.m_timer_run === undefined){
									messages_np.m_timer_run = true;
									window.setInterval(messages_np.checkMessages, 10000);
								}
							}
							messages_np.insertTopLineMessage(data.count);
						} else {
							alert(data.text);
						}
						messages_np.loadDialogLock = false;		
					},"json"
				);
		}
	},
	checkMessages: function() {
		if(messages_np.loadDialogLock==false && messages_np.sendMessageLock==false && messages_np.userUid > 0){
			$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"check_messages",
						"uid":messages_np.userUid,
						"id":messages_np.lastMessageId},
					function(data) {
						if(data.status=='ok'){
							if(data.newMessages != "" ){
								if(messages_np.lastMessageId != undefined && messages_np.lastMessageId > 0){
									messages_np.resetUnreadMessages();
									$("#m_d_table tr.m_tr:last").after(data.newMessages);								
									messages_np.lastMessageId = data.lastMessageId;								
									messages_np.m_scroll();
									if($("div[class='c_div_del_sel_mess']").css("display")!="none"){
										messages_np.showCheckBoxTable(true);
									}									
								}else{
									messages_np.loadDialog(messages_np.userUid);
								}
							}else if(data.dialog_status == "true"){
								messages_np.resetUnreadMessages();
							}
							messages_np.insertTopLineMessage(data.count);
						} else {
							alert(data.text);
						}
			},"json");
		}
	},
	sendMessage: function(uid) {
		if(messages_np.sendMessageLock==false){
			messages_np.sendMessageLock = true;
			var message = $("#textMessage").val();
			if(message == ""){
				alert("Введите сообщение");
				$("#textMessage").val("");
				$("#textMessage").focus();
				messages_np.sendMessageLock=false;
			}else{
				$("#m_b_load").css("display","inline-block");
				$.post(
						"/log/messages/ajax/index.jsp",
						{	"action":"send_message",
							"uid":uid,
							"text":message,
							"lastMessageId":messages_np.lastMessageId},
						function(data) {
							if(data.status=='ok'){
								if(data.cb != undefined){
									$("#mmi").hide();
									$("#mbs").hide();
									$("#cb").html(data.cb_block);
									$("#cb").show();
									$("#nonbots").focus();
								}else{
									if(messages_np.lastMessageId != undefined && messages_np.lastMessageId > 0){
										$("#m_d_table tr.m_tr:last").after(data.newMessages);
										messages_np.lastMessageId = data.lastMessageId;								
										messages_np.m_scroll();
										if($("div[class='c_div_del_sel_mess']").css("display")!="none"){
											messages_np.showCheckBoxTable(true);
										}
									}else{
										messages_np.loadDialog(uid);
									}
									$("#textMessage").val("");
								}
							} else {
								alert(data.text);
							}
							$("#textMessage").focus();
							$("#m_b_load").css("display","none");
							messages_np.sendMessageLock=false;
						},"json"
					);
			}
			
		}
	},
	sendValueCaptcha: function() {
		if(messages_np.sendCapthaLock==false){
			var reply = $("#nonbots").val();
			var key = $("#nonbots_ex").val();
			messages_np.sendCapthaLock = true;
			$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"check_captha",
						"key":key,
						"reply":reply},
					function(data) {
						if(data.status=='ok'){
							if(data.res=="true"){
								$("#mmi").show();
								$("#mbs").show();
								$("#cb").hide();
								$("#textMessage").focus();
							}else{
								$("#nonbots_ex").attr("value",data.key);
								$("#ci").attr("src","/dinamix/captcha/" + data.key + ".png");
								$("#cer").html(data.msg);		
								$("#nonbots").val("");
								$("#nonbots").focus();
							}
						} else {
							alert(data.text);
						}
						messages_np.sendCapthaLock=false;
					},"json"
				);
			}
	},
	
	m_scroll: function() {
		if($("#m_b_send").offset()!=null){
			$('html, body').scrollTop($("#m_b_send").offset().top);
		}
	},
	delMessage: function(uid,id) {
		if(messages_np.delMessagesLock[id]==undefined || messages_np.delMessagesLock[id]==false){
			messages_np.delMessagesLock[id] = true;
			$("#m_tr_i_"+id).attr("src","/tpl/jsp/images/loading_small.gif");
			$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"del_message",
						"uid":uid,
						"id":id},
					function(data) {
						if(data.status=='ok'){
							$("#m_tr_"+id).fadeOut('slow',function() {
								$("#m_tr_"+id).remove();
								if(data.table != undefined){
									window.location.href = "/log/messages/";
								}
							});
						} else {
							$("#m_tr_i_"+id).attr("src","/tpl/jsp/images/del.png");
							alert(data.text);
						}
						messages_np.stopPropagation(e);
						messages_np.delMessagesLock[id] = false;		
					},"json"
				);
		}
	},
	m_goto: function(uid) {
		window.location.href = "/log/messages/"+uid+messages_np.words;
	},
	moveToStatus: function(type, uid) {
		if(messages_np.locks[uid] === undefined || messages_np.locks[uid]==false){
			messages_np.locks[uid] = true;
			$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"status",
						"type":type,
						"uid":uid },
					function(data) {
						if (data.status=='ok') {
							messages_np.changeLocationHref(type);
						} else {
							alert(data.text);
						}
						messages_np.locks[uid] = false;
					}, "json"
				);
		}
	},
	doRead: function(arch,type,uid) {
		if(messages_np.locks[uid] === undefined || messages_np.locks[uid]==false){
			messages_np.locks[uid] = true;
			$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"read",
						"type":type,
						"uid":uid },
					function(data) {
						if (data.status=='ok') {
							messages_np.changeLocationHref(arch);
						} else {
							alert(data.text);
						}
						messages_np.locks[uid]= false;	
					},"json"
				);
		}
	},
	/** Показывает чекбоксы выбора, какие сообщения удалить
	 * @param type Показать или скрыть */
	showCheckBoxTable: function(type) {
		if (type==true) {
			$("td[id='idTdChek']").css("display","table-cell");
			$("div[class='c_div_del_sel_mess']").css("display","block");
		} else {
			$("td[id='idTdChek']").css("display","none");
			$("div[class='c_div_del_sel_mess']").css("display","none");
		}
	},
	deleteSelectedMessages: function(uid) {
		var checks = $("input[name='m_check']:checked");
		var ids = new Array();
		for(var i = 0 ; i < checks.length ; i++){
			ids[i] = checks[i].value;
		}
		if(ids.length > 0 && confirm("Вы действительно хотите удалить отмеченные сообщения, без возможности их повторного восстановления?")){
			if(messages_np.deleteSelectedMessagesLock==false){
				messages_np.deleteSelectedMessagesLock = true;
				$("#loadingExAction").css("display","inline-block");
				jQuery.ajaxSettings.traditional = true;
				$.post(
						"/log/messages/ajax/index.jsp",					
						{	"action":"del_selected_messages",
							"uid":uid,
							"ids":ids},
						function(data) {
							$("#loadingExAction").css("display","none");
							if(data.status=='ok'){
								if(data.table != undefined){
									window.location.href = "/log/messages/";
								}else{
									for(var i = 0 ; i < ids.length ; i=i+1){
										$("#m_tr_"+ids[i]).remove();
									}
									messages_np.showCheckBoxTable(false);
								}
							} else {
								alert(data.text);
							}
							messages_np.deleteSelectedMessagesLock = false;		
						},"json"					
					);
			}
		}
	},
	deleteAllMessagesInDialog: function(uid) {
		if (confirm("Вы действительно хотите удалить все сообщения, без возможности их повторного восстановления?")){
			if (messages_np.deleteAllMessagesInDialogLock == false) {
				messages_np.deleteAllMessagesInDialogLock = true;
				$("#loadingExAction").css("display","inline-block");
				$.post(
						"/log/messages/ajax/index.jsp",
						{	"action":"del_all_messages",
							"uid":uid},
						function(data) {
							$("#loadingExAction").css("display","none");
							if(data.status=='ok'){
								window.location.href = "/log/messages/";
							} else {
								alert(data.text);
							}
							messages_np.deleteAllMessagesInDialogLock = false;		
						},"json"
					);
			}
		}
		
	},
	/** Проверяет в ajax-запросе, есть ли непрочитанные сообщения в диалоге, затем удаляет все сообщения в диалоге. */
	deleteDialog: function(e,uid) {
		messages_np.stopPropagation(e);
		if(confirm("Вы действительно хотите удалить все сообщения, без возможности их повторного восстановления?")){			
			if (messages_np.deleteAllMessagesInDialogLock==false) {
				messages_np.deleteAllMessagesInDialogLock = true;			
				$("#m_tr_id_"+uid).attr("src","/tpl/jsp/images/loading_small.gif");
				$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"check_dialog",
						"uid":uid},
						function(data) {
							if (data.status=='ok') {
								if (data.dialog_status == "true" || confirm("Внимание в этом диалоге есть непрочитанные сообщения.\nВы действительно хотите удалить все сообщения, без возможности их повторного восстановления?")){
									messages_np.doDeleteDialog(uid);
								} else {
									$("#m_tr_id_"+uid).attr("src","/tpl/jsp/images/del.png");
								}
							}else{
								$("#m_tr_id_"+uid).attr("src","/tpl/jsp/images/del.png");
								alert(data.text);
							}
						},"json"
				 );
			}
			messages_np.deleteAllMessagesInDialogLock = false;
		}
	},
	/** Удаляет все сообщения в диалоге. */
	doDeleteDialog: function(uid) {
		if(messages_np.deleteAllMessagesInDialogLock==false){
			messages_np.deleteAllMessagesInDialogLock = true;			
			$("#m_tr_id_"+uid).attr("src","/tpl/jsp/images/loading_small.gif");
			$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"del_dialog",
						"uid":uid},
					function(data) {
						if(data.status=='ok'){
							$("#tr_"+uid).fadeOut('slow',function() {
								$("#tr_"+uid).remove();
								if(data.table != undefined){
									$("#messageBlock").html(data.table);
								}
							});
						} else {
							$("#m_tr_id_"+uid).attr("src","/tpl/jsp/images/del.png");
							alert(data.text);
						}
						messages_np.deleteAllMessagesInDialogLock = false;		
					},"json"
				);
		}
	},
	ctrlEnter: function(event) {
		if(messages_np.defaultKeySendMessage == 0 && (event.ctrlKey == true) && ((event.keyCode == 0xA)||(event.keyCode == 0xD)) ){
			$("#m_b_send").click();
			return;
		}
		if(messages_np.defaultKeySendMessage == 1 && ((event.keyCode == 0xA)||(event.keyCode == 0xD))){
			if(event.ctrlKey == false){
				$("#m_b_send").focus();
				var message = $("#textMessage").val();
				if(message == ""){
					return;
				}
				$("#m_b_send").click();
			}else{
				messages_np.insertTextcursor();
				//messages_np.stopPropagation(event);
			}
		}
	},
	enterMessageCaptcha: function(event) {
		if((event.keyCode == 0xA)||(event.keyCode == 0xD)){
			$("#bcsend").click();
	    }
	},
	insertTopLineMessage: function(count) {
		$("#userMessagesIconNewCount").text(count);
		if(count > 0 ){
			if (count < 100) {
				$("#topHeadCtrlLinkMsgs")
					.removeClass("topHeadCtrlLinkMsgsNoNew")
					.addClass("topHeadCtrlLinkMsgsHasNew");
			} else {
				$("#topHeadCtrlLinkMsgs")
					.removeClass("topHeadCtrlLinkMsgsNoNew")
					.addClass("topHeadCtrlLinkMsgsHasNewLong");
			}
			$('div.leftmenuitem a[href="/log/messages/"]').text("Сообщения ("+count+")");
		}else{
			$("#topHeadCtrlLinkMsgs")
				.removeClass("topHeadCtrlLinkMsgsHasNew")
				.addClass("topHeadCtrlLinkMsgsNoNew");
			$('div.leftmenuitem a[href="/log/messages/"]').text("Сообщения");
		}
	},
	resetUnreadMessages: function(){
		$("tr.message_unread").removeClass("message_unread");
	},
	setKeyDefaultToMessage: function(keyDefaultSelected){
		$.cookie("sm_key" , keyDefaultSelected , {path: '/log/messages/'} );
		messages_np.defaultKeySendMessage = keyDefaultSelected ;
		$("#textMessage").focus();
	},
	insertTextcursor: function(){
		var _text = "\n";
		var	_obj_name = "textareamess";
		var area=document.getElementsByName(_obj_name).item(0);
		
		var p_start=area.selectionStart;
		var p_end=area.selectionEnd;
		if((area.selectionStart)||(area.selectionStart=='0')){ 
			area.value=area.value.substring(0,p_start)+_text+area.value.substring(p_end,area.value.length);
		}
		if (document.selection){
			area.focus();
			var sel=document.selection.createRange();
			sel.text=_text;
		}
		var ptr = ($.browser.opera) ? 2 : 1 ;
		if (area.setSelectionRange) {
		     area.focus();
		     area.setSelectionRange( (p_end + ptr) , (p_end + ptr) );
		}
		  else if (area.createTextRange) {
			//Специально для тугодума IE
			document.activeElement.focus();             
			var sel2 = document.selection.createRange();
			sel2.moveStart('character', -document.activeElement.value.length);
			var caretPos = sel2.text.length + 1;
		    var range = area.createTextRange();
		    range.collapse(true);
		    range.moveEnd('character', caretPos);
		    range.moveStart('character', caretPos);
		    range.select();
		  }
	},
	/** Изменяет URL окна по типу диалога
	 * @param statusType Строка - тип диалога */
	changeLocationHref: function(statusType) {
		switch (statusType) {
		case "active":  window.location.href = "/log/messages/";
			break;
		case "archive": window.location.href = "/log/messages/archive/";
			break;
		case "spam":    window.location.href = "/log/messages/spam/";
			break;
		}
	},
	showSelectText: function(data){
		if( data != null ){
			messages_np.textSelect = jQuery.parseJSON(data.textArray);
			messages_np.selectTextFlag = true;
		}
	}
};

var newMessageToSearchPartner = {
	textInputSearch: "",
	selectMarker:0,
	pressOnKeyToEnterLock: false,
	delSelectedPartnersLock: false,
	countPartnersFoName: 0,
	uidUser:0,
	lockSendMessage: false,
	goToPostSearchPartners: 0,
	startPostTimer: true,
	lockPartnersSearch: false,
	timerID:0,
	positionScroll: 0,
	stopScrollBack: 0,
	stopScrollTop: 0,
	inputId: "",
	idConteinerList: "",
	intervalTimer:100,
	arraySearchItem:"",
	listItemGlobal:"",
	worker: function(){		
		$("#id_div_conteiner_listid_input_toseme").empty();
		$("#id_input_toseme").val("");
		$("#id_div_conteiner_listid_input_toseme").css("display","none");
		newMessageToSearchPartner.setDefaultAllArguments();
		$("#container_dialog_message").modal({
						overlayCss: {cursor:"default"},
						onClose: function(dialog) {newMessageToSearchPartner.clearConteinerDiv();
												   newMessageToSearchPartner.setDefaultAllArguments();
												   newMessageToSearchPartner.killTimerSearchPartners();
												   $.modal.close();
												   }
		});
		$("#simplemodal-container").css("padding","0px");
		$("#simplemodal-container").css("width","426px");
		$("#simplemodal-container").css("height","295px");
		$("#"+newMessageToSearchPartner.inputId).focus();
	},
	clearConteinerDiv: function() {
		$("#id_div_conteiner_list").empty();
		$("#id_div_conteiner_list").css("display","none");
	},
	closeDialog: function(){
		//$("#container_dialog_message").click( function() { $.modal.close();} );
	},
	sendPressKeyCtrlEnter: function(event){
		if((event.ctrlKey == true || event.ctrlRight == true ||  event.ctrlLeft == true) && ((event.keyCode == 0xA)||(event.keyCode == 0xD))){
				$("#id_buttom_send_message").click();
	    }
	},
	sendMessages: function(event){
		if(newMessageToSearchPartner.isEmptyTextArea()){
			$("#"+newMessageToSearchPartner.inputId).focus();
			return;
		}
		newMessageToSearchPartner.killTimerSearchPartners();
		if(newMessageToSearchPartner.lockSendMessage == false ){
			newMessageToSearchPartner.lockSendMessage = true ;
			var uid = $("#id_span_link_and_del").attr("uid");
			$("#id_span_img_ajax").css("display","inline-block");
			var message = $("#id_text_area_dialog").val();
			$.post(
					"/log/messages/ajax/index.jsp",
					{	"action":"send_message",
						"uid":uid,
						"text":message,
						"lastMessageId": -1
					},function(data) {
						$("#id_span_img_ajax").css("display","none");
						if(data.status=='ok'){
							window.location.href = "/log/messages/"+uid;
						} else {
							alert(data.text);
						}
						$("#id_text_area_dialog").focus();
					},"json"
				);
			newMessageToSearchPartner.lockSendMessage = false;
		}
	},
	search: function(){
		alert("off");
	},
	closeModalSearchPartners: function(){
		newMessageToSearchPartner.killTimerSearchPartners();
		$("#container_dialog_message").click( function() { $.modal.close();} );
	},
	runOnTimer: function() {
		var dataTextPartners = $("#"+newMessageToSearchPartner.inputId).val();
		dataTextPartners = newMessageToSearchPartner.trim(dataTextPartners);
		if(newMessageToSearchPartner.goToPostSearchPartners > 5 && 
										 dataTextPartners != ""){
			newMessageToSearchPartner.textInputSearch = dataTextPartners;
			newMessageToSearchPartner.getPartnersToPost();				
		}
		newMessageToSearchPartner.goToPostSearchPartners++;
	},
	killTimerSearchPartners: function(){
		if(newMessageToSearchPartner.timerID != 0 ){
			newMessageToSearchPartner.startPostTimer = true;
			newMessageToSearchPartner.goToPostSearchPartners=0;
			clearTimeout(newMessageToSearchPartner.timerID);
			newMessageToSearchPartner.timerID = 0;
		}
	},
	setInputId: function(id){
		newMessageToSearchPartner.inputId = id;
		newMessageToSearchPartner.setDefaultAllArguments();
		if(id == "id_input_toseme"){
			newMessageToSearchPartner.selectMarker = -1;
			newMessageToSearchPartner.idConteinerList = id;
			newMessageToSearchPartner.intervalTimer = 200;
		}else{
			newMessageToSearchPartner.idConteinerList = "";
			newMessageToSearchPartner.intervalTimer = 100;
			newMessageToSearchPartner.selectMarker = 0;
		}
	},
	getPartnersToPost: function(){
		
		var index = 0;
		if(newMessageToSearchPartner.inputId == "id_input_toseme"){
			index = 1;
			var stringSearch = $("#id_input_toseme").val();
			if( stringSearch.length < 3 ){
				return;
			}
		}
		
		newMessageToSearchPartner.killTimerSearchPartners();
		if(newMessageToSearchPartner.lockPartnersSearch == false){
			newMessageToSearchPartner.lockPartnersSearch=true;
			$("#"+newMessageToSearchPartner.inputId).css("background-image","url('/tpl/jsp/images/loading_small.gif')");
			
			$.post("/log/messages/ajax/index.jsp",{
					"action":"li_partners_search",
					"searchItem":newMessageToSearchPartner.textInputSearch,
					"index":index
					},
					function(data) {
						if(data.status=='ok'){
							newMessageToSearchPartner.setDefaultAllArguments();
							newMessageToSearchPartner.countPartnersFoName = data.liPartnersCount;
							$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css("display","block");
							var xPosition  = $("#"+newMessageToSearchPartner.inputId).position().left;
							var topPosition  = $("#"+newMessageToSearchPartner.inputId).position().top;
							var yPosition  = topPosition + $("#"+newMessageToSearchPartner.inputId).height() + 8;
							var divWidth = $("#"+newMessageToSearchPartner.inputId).width() + 3;
							$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css('left',xPosition);
							$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css('top',yPosition);
							$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css('width',divWidth);
							$("#"+newMessageToSearchPartner.inputId).css("background-image","url('#')");
													
							if(newMessageToSearchPartner.countPartnersFoName > 0 ){
								if(newMessageToSearchPartner.countPartnersFoName > 4){
									$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css("min-height","240px");
								}else{
									$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css("min-height","inherit");
								}
								$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).html(data.liSearchPartners);
								$("#id_li_item_partners_"+newMessageToSearchPartner.selectMarker).css("background-color","#FCF5D7");
											
								if( data.searchWords != null ){
									$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).highlight("c_set_item_activ",
																												  $("#"+newMessageToSearchPartner.inputId).val());
									var listItem = jQuery.parseJSON(data.searchWords);
									newMessageToSearchPartner.arraySearchItem = listItem;
																
									for ( var i = 0; i < listItem.length; i++) {
										$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).highlight("c_set_item_activ",listItem[i]);
									}
								}
							}else{
								$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css("min-height","inherit");
								$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).html(data.errorsFailSearch);
							}
						} else {
							//$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).html(data.status);
							$("#"+newMessageToSearchPartner.inputId).css("background-image","url('#')");
							$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).html(data.errorsFailSearch);
						}
						
			},"json");
			newMessageToSearchPartner.lockPartnersSearch=false;
			
		}
	},
	clearInput: function(event){
		$("#id_div_search_fail").css("display","none");
		$("#id_div_search_fail").empty();
		$("#id_div_conteiner_listid_input_toseme").empty();
		$("#id_div_conteiner_listid_input_toseme").css("display","none");
		$("#id_input_toseme").val("");
		newMessageToSearchPartner.textInputSearch = "";
	},
	eventEsc: function(event){
		if($("#id_div_search_fail").css("display") != "none" || 
				   newMessageToSearchPartner.inputId == "id_input_toseme" && $("#id_input_toseme").val() != "" ){
			if(newMessageToSearchPartner.selectMarker < 0){
				newMessageToSearchPartner.clearInput(event);
			}else{
				newMessageToSearchPartner.setDefaultAllArguments();
			}
		}
	},
	eventKeyDown: function(event){
		
		if(event.keyCode == 27){
			newMessageToSearchPartner.eventEsc(event);
		}
		if( event.keyCode == 38 && newMessageToSearchPartner.selectMarker == 0 ){
			newMessageToSearchPartner.selectMarker = -1;
		}
	},
	eventKeyUp: function(event){
		
		if( newMessageToSearchPartner.selectMarker < 0 ){
			newMessageToSearchPartner.selectMarker = -1;
		}
		if(newMessageToSearchPartner.isControlKey(event)){
			newMessageToSearchPartner.stopPropagation(event);
			return;
		}
		if( event.keyCode == 0x26 || event.keyCode == 0x28 ){
			newMessageToSearchPartner.stopPropagation(event);
			return;
		}
		if(!newMessageToSearchPartner.startPostTimer){
			newMessageToSearchPartner.goToPostSearchPartners--;
		}
		var dataTextPartners = $("#"+newMessageToSearchPartner.inputId).val();
		dataTextPartners = newMessageToSearchPartner.trim(dataTextPartners);
		if(dataTextPartners != ""){
			if(newMessageToSearchPartner.startPostTimer){
				newMessageToSearchPartner.startPostTimer=false;
				newMessageToSearchPartner.timerID = window.setInterval("newMessageToSearchPartner.runOnTimer()",
																		newMessageToSearchPartner.intervalTimer);
			}
			if(((event.keyCode == 0xA)||(event.keyCode == 0xD)) && 
					dataTextPartners != newMessageToSearchPartner.textInputSearch ){
				newMessageToSearchPartner.startPostTimer = true;
				newMessageToSearchPartner.goToPostSearchPartners = 0;
				newMessageToSearchPartner.textInputSearch = dataTextPartners;
				newMessageToSearchPartner.getPartnersToPost();
			}
		}
		else{
			newMessageToSearchPartner.selectMarker = -1;
			newMessageToSearchPartner.countPartnersFoName = 0;
			$("#"+newMessageToSearchPartner.inputId).val("");
			$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css("display","none");
			$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).html("");
		}
	},
	selectListPartners: function(event){
		if($("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css("display")!="none"){
			if(event.keyCode == 0x26){
	            if(newMessageToSearchPartner.selectMarker != 0){
	            	newMessageToSearchPartner.selectMarker--;
	            	if(newMessageToSearchPartner.stopScrollTop < 4){
	            		if(newMessageToSearchPartner.stopScrollBack > 0){
	            			newMessageToSearchPartner.stopScrollBack--;
	            		}
	            		newMessageToSearchPartner.stopScrollTop++;
	            	}
	            }
	            newMessageToSearchPartner.stopPropagation(event);
		    }
			if(event.keyCode == 0x28){
			    if(newMessageToSearchPartner.selectMarker != newMessageToSearchPartner.countPartnersFoName - 1){
				    newMessageToSearchPartner.selectMarker++;
				    if(newMessageToSearchPartner.stopScrollBack < 4){
				    	if(newMessageToSearchPartner.stopScrollTop > 0){
				    		newMessageToSearchPartner.stopScrollTop--;
	            		}
				    	newMessageToSearchPartner.stopScrollBack++;
				    }
			    }
			    newMessageToSearchPartner.stopPropagation(event);
			}
			if((event.keyCode == 0xA)||(event.keyCode == 0xD)){
				newMessageToSearchPartner.pressEnterKey(event);
			}
			if( newMessageToSearchPartner.stopScrollBack == 4 && 
				newMessageToSearchPartner.countPartnersFoName > newMessageToSearchPartner.selectMarker ){
				newMessageToSearchPartner.positionScroll  = $("#id_li_item_partners_" + 
															 ( newMessageToSearchPartner.selectMarker - 4 ) ).attr("scrollposition");
				newMessageToSearchPartner.scroll();
			}
			if(newMessageToSearchPartner.stopScrollTop == 4 ){
				newMessageToSearchPartner.positionScroll  = $("#id_li_item_partners_" + 
															 ( newMessageToSearchPartner.selectMarker ) ).attr("scrollposition");
				newMessageToSearchPartner.scroll();
				
			}
			$(".c_li_item_partners").css("background-color","#FFFFFF");
			$("#id_li_item_partners_"+newMessageToSearchPartner.selectMarker).css("background-color","#FCF5D7");
		}
    },
    scroll: function() {
    		$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).scrollTop(newMessageToSearchPartner.positionScroll);
  	},
    onmouseoverWorker: function(item){
       newMessageToSearchPartner.selectMarker = item;
       $(".c_li_item_partners").css("background-color","#FFFFFF");
       $("#id_li_item_partners_"+newMessageToSearchPartner.selectMarker).css("background-color","#FCF5D7");
       newMessageToSearchPartner.positionScroll  = $("#id_li_item_partners_"+newMessageToSearchPartner.selectMarker).attr("scrollposition");
    },
    pressEnterKey: function(event){
    	newMessageToSearchPartner.killTimerSearchPartners();
//    	event.preventDefault();
    	newMessageToSearchPartner.stopPropagation(event);
    	if( ( $("#"+newMessageToSearchPartner.inputId).val() != "" ) && 
    		( $("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css("display")!="none") && 
    		( newMessageToSearchPartner.countPartnersFoName > 0 ) ){
			if(newMessageToSearchPartner.pressOnKeyToEnterLock == false){
				newMessageToSearchPartner.pressOnKeyToEnterLock = true;
				var showInput = true;
				if(newMessageToSearchPartner.inputId == "id_input_toseme"){
					var dataArray = "q="+$("#"+newMessageToSearchPartner.inputId).val();
					var i = 0;
					if($.inArray($("#"+newMessageToSearchPartner.inputId).val(), newMessageToSearchPartner.arraySearchItem) != -1){
						newMessageToSearchPartner.arraySearchItem.splice(newMessageToSearchPartner.arraySearchItem.indexOf($("#"+newMessageToSearchPartner.inputId).val()),1);
					}
					for ( ; i < newMessageToSearchPartner.arraySearchItem.length; i++) {
						dataArray = dataArray + "&" +"q=" + newMessageToSearchPartner.arraySearchItem[i];
					}
					var path = "";
					if(newMessageToSearchPartner.selectMarker >= 0){ 
						path = $("#id_li_item_partners_"+newMessageToSearchPartner.selectMarker).attr("uid");
					}
					$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).html("");
					$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css("display","none");
					document.location.replace("/log/messages/" + path +"?"+dataArray);
					showInput = false;
				}
				if(showInput){
					$("#"+newMessageToSearchPartner.inputId).val("");
					$("#"+newMessageToSearchPartner.inputId).css("display","none");
				}
				$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css("display","none");
				$("#id_link_partners_layers").attr("href",$("#id_ahref_to_user_"+newMessageToSearchPartner.selectMarker).attr("href"));
				$("#id_link_partners_layers").html($("#id_ahref_to_user_"+newMessageToSearchPartner.selectMarker).html());
				$("#id_span_link_and_del").attr("uid",$("#id_li_item_partners_"+newMessageToSearchPartner.selectMarker).attr("uid"));
				$("#id_div_top_block_layers").css("display","block");
				$("#id_text_area_dialog").focus();
				newMessageToSearchPartner.pressOnKeyToEnterLock = false;
			}
			//$("#"+newMessageToSearchPartner.inputId).val("");
			newMessageToSearchPartner.setDefaultAllArguments();
			newMessageToSearchPartner.countPartnersFoName = 0;
			//newMessageToSearchPartner.textInputSearch = "";
			$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).html("");
    	}
	},
	delSelectedPartners:function() {
		if(newMessageToSearchPartner.delSelectedPartnersLock == false ){
			newMessageToSearchPartner.delSelectedPartnersLock = true ;
			$("#"+newMessageToSearchPartner.inputId).css("display","block");
			$("#id_div_top_block_layers").css("display","none");
			$("#"+newMessageToSearchPartner.inputId).focus();
			$("#id_span_link_and_del").attr("uid","0");
			newMessageToSearchPartner.delSelectedPartnersLock = false ;
		}
	},
	isEmptyTextArea: function(){
		if(newMessageToSearchPartner.isEmptyPartnersInput()){
			return true;
		}
		var textMessage = $("#id_text_area_dialog").val();
		textMessage = newMessageToSearchPartner.trim(textMessage);
		if(textMessage == ""){
			$("#id_text_area_dialog").val("");
			$("#id_text_area_dialog").focus();
			alert("Введите текст сообщения");
			return true;
		}
		return false;
	},
	isEmptyPartnersInput: function(){
		var uid = $("#id_span_link_and_del").attr("uid");
		if(uid == undefined || uid <= 0 ){
			alert("Выберите партнера");
			$("#"+newMessageToSearchPartner.inputId).focus();
			return true;			
		}
		return false;
	},
	sendMessageAdmin: function(event){
		newMessageToSearchPartner.killTimerSearchPartners();
		$("#"+newMessageToSearchPartner.inputId).val("");
		newMessageToSearchPartner.setDefaultAllArguments();
		newMessageToSearchPartner.countPartnersFoName = 0;
		newMessageToSearchPartner.textInputSearch = "";
		$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).html("");
		if(newMessageToSearchPartner.pressOnKeyToEnterLock == false){
			newMessageToSearchPartner.pressOnKeyToEnterLock = true;
			newMessageToSearchPartner.stopPropagation(event);
			$("#id_div_conteiner_list"+newMessageToSearchPartner.idConteinerList).css("display","none");
			$("#"+newMessageToSearchPartner.inputId).css("display","none");
			$("#id_link_partners_layers").attr("href","/log/messages/8");
			$("#id_link_partners_layers").html("Ларди-Транс ™");
			$("#id_span_link_and_del").attr("uid","8");
			$("#id_div_top_block_layers").css("display","block");
			$("#id_text_area_dialog").focus();
			newMessageToSearchPartner.pressOnKeyToEnterLock = false;
		}
	},
	stopPropagation: function(e) {
//		if (!e){
//			var e = window.event;
//		}
//		e.cancelBubble = true;
//		if (e.stopPropagation){ 
//			e.stopPropagation();
//		}
		e.preventDefault?e.preventDefault():e.returnValue = false;
	},
	trim: function (s){
	  return newMessageToSearchPartner.rtrim(newMessageToSearchPartner.ltrim(s));
	},
	ltrim: function (s){
	  return s.replace(/^\s+/,""); 
	},
	rtrim: function (s){
	  return s.replace(/\s+$/,""); 
	},
	isControlKey: function(event){
		if( event.shiftKey || event.ctrlKey || event.altKey || event.keyCode == 16 || event.keyCode == 45 ||
		  ( event.keyCode >= 33 && event.keyCode <= 40) ){
			return true;
		}
		return false;
	},
	setDefaultAllArguments: function(){
		/**
		 * Временно выключил (возможно не нужное сохранение данных при переходе в новое сообщение и обратно)
		 */
//		newMessageToSearchPartner.textInputSearch = "";
		if(newMessageToSearchPartner.inputId == "id_input_toseme"){
			newMessageToSearchPartner.selectMarker = -1;
		}else{
			newMessageToSearchPartner.selectMarker = 0;
		}
//		newMessageToSearchPartner.pressOnKeyToEnterLock = false;
//		newMessageToSearchPartner.delSelectedPartnersLock = false;
//		newMessageToSearchPartner.countPartnersFoName = 0;
//		newMessageToSearchPartner.uidUser = 0;
//		newMessageToSearchPartner.lockSendMessage = false;
//		newMessageToSearchPartner.goToPostSearchPartners = 0;
//		newMessageToSearchPartner.startPostTimer = true;
//		newMessageToSearchPartner.lockPartnersSearch = false;
//		newMessageToSearchPartner.timerID = 0;
//		newMessageToSearchPartner.positionScroll = 0;
//		newMessageToSearchPartner.stopScrollBack = 0;
//		newMessageToSearchPartner.stopScrollTop = 0;
//		newMessageToSearchPartner.inputId = "";
//		newMessageToSearchPartner.idConteinerList = "";
//		newMessageToSearchPartner.intervalTimer = 100 ;
	}
};var userIgnoreListNameSpace = new function(){
	var deleteFromIgnoresLock = false;
	var changeStatusLock = false;
	
	this.init = function(){		
		$("body").click(function(){
			$(".ignoring_menu").hide();
		});
		
		userIgnoreListNameSpace.setIgnorePartsClickAction();
		
		$("#loadingExAction").bind("ajaxSend", function(){
		   $(this).css("display", "inline-block");
		}).bind("ajaxComplete", function(){
		   $(this).hide();
		});		
	};
	
	this.setIgnorePartsClickAction = function(){
		$(".show_window").click(function(e){
			var id = $(this).attr("id").replace("ignored_link", "");
			userIgnoreListNameSpace.showMenu(e, $(this), id);
			return false;
		});
		
		$(".gruztrans_checkbox").click(function(e){
			var checkbox = $(this);
			userIgnoreListNameSpace.changeStatus(checkbox, "changeGruzTrans");				
			return false;
		});
		
		$(".messages_checkbox").click(function(e){
			var checkbox = $(this);
			userIgnoreListNameSpace.changeStatus(checkbox, "changeMessages");
			return false;
		});
		
		$(".all_checkbox").click(function(e){
			var checkbox = $(this);
			userIgnoreListNameSpace.changeStatus(checkbox, "changeAll");									
			return false;
		});
		
		$(".close").click(function(){
			$(".ignoring_menu").hide();
		});
	};
	
	this.changeCheckboxesChecked = function(elem){
		var isChecked = elem.is(":checked");
		if(isChecked){
			elem.parents("ul").find("input[type=checkbox]").attr("checked", "checked");
		}else{
			elem.parents("ul").find("input[type=checkbox]").attr("checked", false);
		}		
	};
	
	this.changeAllCheckboxStatus = function(checkbox){
		if(userIgnoreListNameSpace.isAllChecked(checkbox)){
			userIgnoreListNameSpace.setAllCheckboxStatus(checkbox);
		}else{
			userIgnoreListNameSpace.unsetAllCheckboxStatus(checkbox);
		}
	};
	
	this.isAllChecked = function(checkbox){
		var uncheckedCount = 0;
		checkbox.parents("ul").find("input[type=checkbox]").each(function(){
			var curCheckbox = $(this);
			if(curCheckbox.attr("class") != "all_checkbox" && !curCheckbox.is(":checked")){
				uncheckedCount++;
				return false;
			}
		});
		if(uncheckedCount > 0){
			return false;
		}
		return true;
	};
	
	this.setAllCheckboxStatus = function(elem){
		elem.parents("ul").find(".all_checkbox").attr("checked", "checked");
	};
	
	this.unsetAllCheckboxStatus = function(elem){
		elem.parents("ul").find(".all_checkbox").attr("checked", false);
	};
	
	this.deleteFromIgnore = function(ignoredUid){
		if(!deleteFromIgnoresLock){
			deleteFromIgnoresLock = true;
			$("#user_ignores").remove();
			$.ajax({
				url: "/dinamix/UserIgnoreServlet", 
				data: {
					"ignoredUid": ignoredUid,
					"action": "delete"
				},	
				type: 'POST',
				dataType: 'json',			
				success: function(data){	
					$("#user_ignores_container").html(data.html);
					userIgnoreListNameSpace.setIgnorePartsClickAction();
				},
				complete : function(){
   					deleteFromIgnoresLock = false;
   				}
			});
		}
	};	
	
	this.showMenu = function(event,link, id){
		this.cancelPreviousAction(event);
		this.addMenu(link, id);
	};
	
	this.addMenu = function(link, id){
		var width = link.width();
		var offset = 10;
		$(".ignoring_menu").hide();
		var menu = $("#ignoring_menu" + id);
		menu.css("left", width + offset).show().click(function(e){
			userIgnoreListNameSpace.cancelPreviousAction(e);
		});
	};	
	
	this.cancelPreviousAction = function(event){
		var agent = jQuery.browser;	
		if(agent.msie){
			event.cancelBubble = true;
		}
		else{
			event.stopPropagation();
		}
	};
	
	this.changeStatus = function(checkbox, action){
		if(!changeStatusLock){
			changeStatusLock = true;	
			var ignoredUid = checkbox.val();
			$.ajax({
				url: "/dinamix/UserIgnoreServlet", 
				data: {
					"ignoredUid": ignoredUid,
					"action": action
				},	
				type: 'POST',
				dataType: 'json',			
				success: function(data){	
					if(data.result == "ok"){
						if(checkbox.is(":checked")){
							checkbox.attr("checked", false);
						}else{
							checkbox.attr("checked", "checked");
						}
						$("#ignoring_menu" + ignoredUid).siblings("a").html(data.linkText);	
						userIgnoreListNameSpace.doAction(checkbox, data, action);
					}else{
						$("div[id^='ui_info_block']").remove();
						$("#user_ignores_container").prepend(data.html);
					}
				},
				complete : function(){
					changeStatusLock = false;
   				}
			});
		};		
	};
	
	this.doAction = function(checkbox, data, action){
		if(action == "changeGruzTrans" || action == "changeMessages"){
			userIgnoreListNameSpace.changeAllCheckboxStatus(checkbox);
		}else{
			userIgnoreListNameSpace.changeCheckboxesChecked(checkbox);
		}		
	};
};/**
 * 
 * @author lisgray
 *
 */
(function($) {
	$.fn.ballontitle = function(options) {
		// значение по умолчанию для опциональных аргументов
        // в виде имя: значение
        var defaults = {
            text: '{text: \'Перекрой меня\'}',
            offset: 25
        };
       // расширяем дефолтные значения опциями
       var opts = $.extend(defaults, options);
     
       var ballontitle=$('<div class="ballontitle">'+opts['text']+'</div>');
       ballontitle.hide();
      
       // они теперь доступны как opts[имя_опции]
       // вот тут сам плагин
       
       this.focus(function() {
    	   var pos = $(this).position();
           var width = $(this).outerWidth();
            ballontitle.css({ position: "absolute",
           	        top: pos.top + "px",
           	        left: (pos.left+width+opts['offset']) + "px"});
    	   ballontitle.insertAfter($(this));
    	   ballontitle.show();
 		});
       this.blur(function() {
    	 ballontitle.hide();
    	 ballontitle.remove();
  		});
           
    };	
})(jQuery); var userTooltipNameSpace = new function() {
	this.MARGIN = 5;
	this.MAX_COUNT_OUT_CHECK = 1; //TIME_OUT_CHECK * MAX_COUNT_OUT_CHECK = 1000 m/sec
	this.TIME_OUT_CHECK = 200;
	this.TIME_SHOW_SLEEP = 500;
	this.startShow = false;
	this.startOut = false;
	this.count = 0;
	
	this.contMouseLeveLock = false;
	this.currentElement = 0;
	this.init = function(selector){
		if(selector == undefined){
			selector = "a";
		}
		$("body").append("<div style='display: none;position:absolute;' id='user_tooltip_cont'></div>");
		$("body").click(function(eventData){
			if(!(userTooltipNameSpace.startOut === undefined)){
				userTooltipNameSpace.count = userTooltipNameSpace.MAX_COUNT_OUT_CHECK;
			}
		});
		$(selector + "[uid]").each(function(){
			$(this).userTooltip();
		});
	};
};

(function($) {
	$.fn.extend({
		userTooltip : function(options) {
			
			$(this).mouseenter(function(eventData) {
				currentElement = $(this);
				userTooltipNameSpace.startShow = true;
				setTimeout(function() { loadTooltipData(); },userTooltipNameSpace.TIME_SHOW_SLEEP);
			});
			
			$(this).mouseleave(function(eventData) {
				startCheckOnHide();
				userTooltipNameSpace.startShow = false;
			});
			
			function startCheckOnHide(){
				userTooltipNameSpace.startOut = true;
				setTimeout(outAutoHide,userTooltipNameSpace.TIME_OUT_CHECK);
			}
			
			function flushMouseOutCheck() {
				userTooltipNameSpace.startOut = false;
				userTooltipNameSpace.count = 0;
			}
			
			function addEvents(){
				var elementsSelector = "#user_tooltip_id,#user_tooltip_action_cont";
				$(elementsSelector).click(function(eventData){
					eventData.stopPropagation();
				});
				
				$(elementsSelector).mouseenter(function(eventData) {
					userTooltipNameSpace.contMouseLeveLock = false;
					flushMouseOutCheck();
				});
				
				$(elementsSelector).mouseleave(function(eventData) {
					if(!userTooltipNameSpace.contMouseLeveLock){
						userTooltipNameSpace.contMouseLeveLock = true;
						startCheckOnHide();
					}
				});
				
				$("#user_info_actions_block").click(function(eventData){
					$("#user_tooltip_action_cont").toggle(); 
				});
			}
			function getScrollTop() {
				return filterResults (
					window.pageYOffset ? window.pageYOffset : 0,
					document.documentElement ? document.documentElement.scrollTop : 0,
					document.body ? document.body.scrollTop : 0
				);
			}
			function filterResults(n_win, n_docel, n_body) {
				var n_result = n_win ? n_win : 0;
				if (n_docel && (!n_result || (n_result > n_docel)))
					n_result = n_docel;
				return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
			}
			function loadTooltipData(){
				if(!userTooltipNameSpace.startShow){
					return;
				}
				userTooltipNameSpace.startShow = false;
				flushMouseOutCheck();
				var curElement = currentElement;
				$("#user_tooltip_cont").load("/user2/tooltip/userTooltip.jsp?uid="+curElement.attr("uid"),function(){
					switch($("#load_result").val()){
						case "ok":{
							
							var offsetTop = curElement.offset().top - $(this).height() - userTooltipNameSpace.MARGIN;
							if(offsetTop < getScrollTop()){
								//распологаем тултип под элементом(если над нет места)
								offsetTop = curElement.offset().top + curElement.height() + userTooltipNameSpace.MARGIN;
							}
							$(this).css("top",offsetTop);
							$(this).css("left",curElement.offset().left);
							addEvents();
							$(this).show();
							curElement.attr("tooltip",$("#firmName").val());
							break;
						}
						case "loading":{
							//curElement.attr("tooltip","Загрузка информации о пользователе");
							$("#user_tooltip_cont").hide();
							break;
						}
						case "userNotFound":{
							curElement.attr("tooltip","Пользователь не найден");
							$("#user_tooltip_cont").hide();
							break;
						}
					}
				});
			}
			
			function outAutoHide(){
				if(!userTooltipNameSpace.startOut) {
					return;
				}
				if(userTooltipNameSpace.count>=userTooltipNameSpace.MAX_COUNT_OUT_CHECK) {
					userTooltipNameSpace.contMouseLeveLock = false;
					$("#user_tooltip_cont").hide();
					$("#user_tooltip_cont").empty();
					return;
				}
				userTooltipNameSpace.count++;
				setTimeout(outAutoHide,userTooltipNameSpace.TIME_OUT_CHECK);
			}
		}
	});
})(jQuery);var notPayedRequestNameSpace = new function(){
	var locker = false;	
	this.init = function(){
		
		$("input[name='email_fax']").change(function(){
			if($("#radioEmail").is(":checked")){
				$("#starEmail").show();
				$("#starFax").hide();
			}else{
				$("#starEmail").hide();
				$("#starFax").show();	
			}
		});		
		
		$("#datePicker").datepicker({ minDate: new Date() });
		
		$("#send").click(function(){
			if(!locker){
				var dateFrom = $("#datePicker").val();
				var period = $("#period").val();
				var sendBy = $("input[name='email_fax']:checked").val();
				var fax = $("#fax").val();
				var email = $("#email").val();
				var note = $("#note").val();
				var payer = $("input[name='payer']:checked").val();
				var tax = $("input[name='taxing']:checked").val();
				locker = true;
				$.ajax({
					url: "/dinamix/NotPayedServlet",
					data: {
						dateFrom: dateFrom,
						period: period,
						sendBy: sendBy,
						fax: fax,
						email: email,
						note: note,
						payer: payer,
						tax: tax
					},
					dataType: "json",
					success: function(data){
						if(data.success == "ok"){						
							window.location.href = "/log/bill/not_payed_request?res=success";
						}else{
							$("div[id^='ui_info_block']").remove();
							$(".not_payed_request h1").after(data.errorText);
						}
					},
					complete: function(){
						locker = false;
					}
				});
			}		
		});
	};
};var userEditHistoryNameSpace = new function(){
	this.init = function(){
		$(".ui_edit_history .updateColumnHeader .close").click(function(e){
			$(this).parents(".ui_edit_history").hide();
		});
		
		var clickElemId = $(".ui_edit_history").find(".hidden").text();
		
		$("#" + clickElemId).click(function(e){
			e.stopPropagation();
			var uid = $(this).attr("id").replace("editImg", "");
			var blockId = "ui_edit_history_block" + uid;
			var offset = $(this).offset();
			var leftPadding = 20;
			var block = $("#" + blockId);
			
			if(block.is(":hidden")){
				block.css("left", offset.left + leftPadding).css("top", offset.top)
				.click(function(e){
					e.stopPropagation();
				}).show();
				$("#ui_edit_history_block" + uid).find(".history").empty();
				loadHistory(uid);				
			}else{
				block.hide();
			}			
		});
		
		$("body").click(function(){
			$(".ui_edit_history").hide();
		});
	};	
	
	var locker = false;
	
	function loadHistory(uid){
		if(!locker){
			$("#loadingExAction").show();
			locker = true;
			$.ajax({
				url: "/dinamix/UpdateColumnsServlet",
				type: "post",
				data: {
					"uid": uid
				},
				dataType: "json",
				success: function(data){
					if(data.error){
						printErrorMess(uid, data);						
					}else{
						printEditHistory(uid, data);
					}
				},
				complete: function(){
					locker = false;
					$("#loadingExAction").hide();
				}
			});
		}		
	}
	
	function printEditHistory(uid, data){
		var columns = data.columns;
		var info = "";
		if(data.emptyText){
			info += data.emptyText;
		}else{
			info += "<ul>";
			for(var i = 0; i < columns.length; i++){
				info += "<li><span class='date'>" + columns[i].date + "</span>: c <span class='old'>" + columns[i].oldName + "</span>" +
				" на <span class='new'>" + columns[i].newName + "</span></li>";
			}
		}		
		$("#ui_edit_history_block" + uid).find(".history").html(info);
	}
	
	function printErrorMess(uid, data){
		$("#ui_edit_history_block" + uid).find(".history").html("<span class='error'>" + data.error + "</span>");
	}
};

