/*----------------------------------------------------------global vars----------------------------------------------------------*/
window.isIE6 = /MSIE (5\.5|6).+Win/.test(navigator.userAgent);
/*----------------------------------------------------------cookie---------------------------------------------------------------*/
function setCookie(c_name,value,expiredays,path,likeCookie){
	if (window.localStorage === undefined || likeCookie == true){
		var exdate=new Date(),
			expiredays = expiredays || 180;
		exdate.setDate(exdate.getDate()+expiredays);
		document.cookie=c_name+"=" +escape(value)+ ";expires="+exdate.toUTCString()+(!path ? "" : ";path="+path);
	} else {
		deleteCookie(c_name,path,true);
		window.localStorage.setItem(c_name,value);
	}
}

function getCookie(c_name,likeCookie){
	if (window.localStorage === undefined ||  likeCookie == true){
		if (document.cookie.length){
			c_start=document.cookie.indexOf(c_name + "=");
			if (c_start!=-1){
				c_start=c_start + c_name.length+1;
				c_end=document.cookie.indexOf(";",c_start);
				if (c_end==-1) c_end=document.cookie.length;
				return unescape(document.cookie.substring(c_start,c_end));
			}
		}
		return '';
	} else {
		var in_cook = getCookie(c_name,true);
		if (in_cook) {
			window.localStorage.setItem(c_name,in_cook);
			deleteCookie(c_name,'/',true);
			return in_cook;
		}
		return window.localStorage.getItem(c_name) || '';
	}
}

function deleteCookie(c_name,path,likeCookie){
	if (window.localStorage === undefined ||  likeCookie == true){
		setCookie(c_name,'',-1,path?path:'',true);
	} else {
		try {
			window.localStorage.removeItem(c_name);
		} catch(e){
			delete localStorage[c_name];
		}
	}
}
/*----------------------------------------------------------jQuery extends--------------------------------------------------------*/
(function($){
	$.extend({
/*----------------------------------------------------------Boolean Extends-------------------------------------------------------*/
		isString: function(txt){
			return !!((typeof txt).toLowerCase() == 'string' && $.trim(txt));
		},
		isDOMElement: function(any){
			return any && (any[0] ? any[0].nodeType == 1 : any.nodeType == 1);
		},
/*----------------------------------------------------------Format Extends--------------------------------------------------------*/
		makeObject: function(key,val){
			key = key || [];
			val = val || [];
			var obj = {};
			$.each(key,function(i,b){
				if (!val[i]) return;
				obj[key[i]+''] = val[i]+'';
			});
			return obj;
		},
/*----------------------------------------------------------Filters Extends-------------------------------------------------------*/
		hasNumberFormat:function(value){
			return $.isString(value) && (/&nbsp;|[\s,+]/ig).test($.trim(value))
		},
		removeNumberFormat:function(value){
			return $.isString(value)? $.trim(value).replace(/&nbsp;|[\s,+'"]/ig,'') : ''
		},
		removeFilterFromValue:function(value){
			return $.isString(value)? $.removeNumberFormat(value).replace(/^([<>!=]|\(|\[|\{)*/,'').replace(/(\)|\]|\})?$/,'') : ''
		},
		removeQueueFromValue:function(value){
			return $.isString(value)? $.removeNumberFormat(value).replace(/[^0-9.\-\;\[\]\(\)\{\}]+/g,'') : ''
		},
		getFilterType:function(value){
			var rVal = $.removeNumberFormat(unescape(value));
			if (rVal.slice(0,1) == '=' && rVal.indexOf(';') == -1) {
				return 'eq';
			} else if (rVal.slice(0,2) == '!=') {
				return 'ne';
			} else if (rVal.slice(0,2) == '>=') {
				return 'ge';
			} else if (rVal.slice(0,2) == '<=') {
				return 'le';
			} else if (rVal.slice(0,1) == '>') {
				return 'gt';
			} else if (rVal.slice(0,1) == '<') {
				return 'lt';
			} else if (/^(\(|\[)[0-9-.]+[^\d]*;[0-9-.]+[^\d]*(\)|\])$/.test(rVal) || /^[0-9-.]+[^\d]*-[0-9-.]+[^\d]*$/.test(rVal)) {
				return 'dn';
			} else if (/[0-9-.]+(.)*;[0-9-.]+(.)*$/.test(rVal) || /\{[0-9-.;]+\}/.test(rVal)){
				return 'ln';
			} else if (/[^;]+;[^;]+$/i.test(value) || /^\[[^;]+\]$/.test(rVal)){
				return 'ls';
			} else {
				var queue = rVal.replace(/[^0-9-.]*$/,'');
				return queue && !isNaN(queue) ? '_ge' : 's';
			}
		},
		getFilterNumber:function(value){
			if ($.isString(value)) {
				value = $.removeNumberFormat(value);
				if (value.indexOf(';') > -1){
					var arr = value.split(';');
					$.each(arr,function(a,b){ arr[a] = $.getFilterNumber(b) });
					return arr.join(';');
				} else {
					return value.replace(/[^0-9-.]+/g,'').replace(/[\.]+$/g,'')*1;
				}
			} else {
				return NaN;
			}
		},
		getFilterQueue:function(value){
			if ($.isString(value)){
				value = $.removeNumberFormat(value);
				if (value.indexOf(';') > -1){
					var arr = value.split(';'),
						first_queue = $.getFilterQueue(arr[0]);
					return first_queue ? first_queue :  $.getFilterQueue(arr[1]);
				} else {
					return isNaN(value.charAt(value.length-1)) ? value.replace(/[0-9.-]+/g,'') : '';
				}
			} else {
				return '';
			}
		},
		parseFilterValue:function(value){
			var type = $.getFilterType(value);
			switch (type){
				case 'ln':  var ln_queue = $.getFilterQueue(value),
								ln_number = $.removeFilterFromValue(value);
							return ln_queue ? [$.removeQueueFromValue(ln_number),ln_queue] : ln_number;
				case 'dn':  value = $.removeFilterFromValue(value);
							var zpt = value.indexOf(';'),
								i = value.indexOf('-'),
								li = value.lastIndexOf('-'),
								mi = value.slice(i+1,li).lastIndexOf('-'),
								l = value.length;
							if (zpt < 0){
								if (i == li) value = value.replace('-',';');
								else if (value.replace(/[^-]+/g,'').length == 3) value = value.slice(0,mi)+';'+value.slice(mi+1,l);
								else if (value.indexOf('--') > -1) value = value.slice(0,i)+';'+value.slice(i+1,l);
								else value = value.slice(0,li)+';'+value.slice(li+1,l);
							}
							var dn_number = $.getFilterNumber(value),
								dn_queue = $.getFilterQueue(value);
							return dn_queue ? [$.removeQueueFromValue(dn_number),dn_queue] : dn_number;
				case 's': return value;
				case 'ls': return value;
				default : var queueNumber = $.removeFilterFromValue(value),
							  number = $.getFilterNumber(queueNumber),
							  queue = queueNumber.replace(number,'');
						  if (queue) return [number,queue];
						  else return number;
			}
		},
/*------------------------------------------------Fabric Extends from Form to Object--------------------------------------------*/
		formSerialize : function(elements){
			var obj = {};
			if (!$.isDOMElement(elements)) elements = $(elements);
			if (!$(elements).is(':input')) elements = $(':text,:checked,select',elements);
			elements.each(function(a,b){
				var el = $(b),
					name = el.attr('filter_name') || b.getAttribute('filter_name') || b.name,
					value = el.attr('filter_value') || b.getAttribute('filter_value') || b.value;
				if (!name || !value) return;
				if (obj[name]) obj[name] += ';'+ $.trim(value);
				else obj[name] = $.trim(value);
			});
			return obj;
		},
		formObjectFabric : function(form){
			var formObj = {};
			if (!$.isDOMElement(form)) form = $(form);
			var elemSelector = ':text,:checked,select',
				filterElem = $('.form-filter',form).add($(form).find('.form-filters').find(elemSelector)).not('.no-fabric'),
				optionsElem = $(elemSelector,form).not(filterElem).not('.no-fabric');
			formObj.options = $.formSerialize(optionsElem);
			formObj.filters = $.formSerialize(filterElem);
			return formObj;
		},
		filtersObjectFabric:function(object){
			var advObj = {};
			if (!$.isPlainObject(object)) return advObj;
			$.each(object,function(k,v){
				var el = $('[name="'+k+'"]').closest('.filter-div').find('.filter-s'),
					type = el[0] ? el[0].getAttribute('filter_type') : null,
					queue = el[0] ? el[0].getAttribute('filter_queue'): null;
				if (type == 's' || type == 'ls' || k == 'fullname'){
					if (k == 'fullname') type = 'ls';
					advObj['f_type_'+k] = type;
					if (type == 'ls' && v.indexOf(';') < 0) v = '['+v+']';
					advObj['f_value_'+k] = v;
				} else {
					var f_v = $.parseFilterValue(v);
					if ($.isArray(f_v)){
						advObj['f_value_'+k] = f_v[0];
						advObj['f_queue_'+k] = f_v[1] || queue;
					} else {
						advObj['f_value_'+k] = f_v;
					}
					var parseType = $.getFilterType(v);
					advObj['f_type_'+k]= parseType != '_ge'? parseType : (type?type:'_ge');
					if (advObj['f_queue_'+k] == '{}') delete advObj['f_queue_'+k];
				}
			}); 
			return advObj;
		}
	});
	$.fn.extend({
/*----------------------------------------------------------Offset Extends--------------------------------------------------------*/
		offsetPosition: function(key){
			if (key && (key == 'top' || key == 'left')) {
				return this.each(function(a,b){
					var el = $(b);
					el.css(key,el.offsetPosition()[key]+'px');
				});
			} else {
				var el = this.eq(0);
				if (!$.isDOMElement(el)) return;
				var offParent = el.offsetParent(),
					parentOffset = offParent.offset(),
					offset = el.offset();
				return {top:offset.top - parentOffset.top,left:offset.left - parentOffset.left,offsetParent:offParent};
			}
		},
		offsetLeft: function(){
			return this.offsetPosition().left;
		},
		offsetRight: function(){
			var el = this.eq(0),
				offset = el.offsetPosition();
			return offset.offsetParent.innerWidth() - offset.left - el.innerWidth();
		},
		offsetTop: function(){
			return this.offsetPosition().top;
		}
	});
})(jQuery);
/*----------------------------------------------------------DOM manipulations----------------------------------------------------*/
$(document).ready(function(){
	if($(".lavaLamp")[0] && $(".lavaLamp").lavaLamp && !$(".lavaLamp").find('.back')[0]) {
		$(function() { $(".lavaLamp").lavaLamp({ fx: "backout", speed: 700 })});
	}
	if(lavaLampSettings && window.location.search) {
		var ls_m = window.location.search.match(/slider=([a-zA-Z0-9_-]*)/i);
		if (ls_m && ls_m[0] && ls_m[1]){
			lavaLampSettings(ls_m[1]);
		}
	}
/*----------------------------------------------------------Functions------------------------------------------------------------*/
	//don't delete urlNoCache, pageContext make bad links in paging
	window.urlNoCache = function (url){
		return (url && url.indexOf('/nocache/') > -1) ? (url.replace(/nocache\/\d+\//g,'') + 'nocache/'+new Date().getTime()+'/'): url ? (url + 'nocache/'+new Date().getTime()+'/') : false;
	};
	
	window.parseHash = function(){
		try {
			var hash = unescape(location.hash.slice(1,location.hash.length)).split('&');
			if (hash[0] != '') $.each(hash,function(a,b){
				var tmpArr = b.split('=');
				if (tmpArr[2]) tmpArr[1] = tmpArr[1]+tmpArr[2];// if we have key==value, double "="
				if (tmpArr[0] == 'callback') {
					try {
						eval(tmpArr[1]+'()');
					} catch(e){}
				} else {
					var byName = $("[name='"+tmpArr[0]+"']"),
						byId = $("#"+tmpArr[0]);
					if (!byName[0] && !byId[0]) return;
					var where = byId[0] ? byId : byName,
						whereNodeName = where[0].nodeName.toLowerCase();
					if (where.is(':text') || where.is(':password')){
						tmpArr[1] = $.removeFilterFromValue(tmpArr[1]);
						if (where.attr('readonly') && where.attr('readonly').length){
							where.removeAttr('readonly').val(tmpArr[1]).attr('readonly',true);
						} else {
							where.val(tmpArr[1]);
						}
					} else if (where.is(':radio')){
						where.attr('checked',true);
					} else if ( where.is(':checkbox')){
						if (tmpArr[1].indexOf(';') > -1)$.each(tmpArr[1].split(';'),function(a,b){ where.filter('#'+b).attr('checked',true) });
						else where.attr('checked',true);
					} else if (whereNodeName == 'select') {
						where.find("option[value='"+tmpArr[1]+"']").attr('selected',true);
					} else if (whereNodeName == 'a') {
						window.scrollTo(0,where.offset().top);
					}
				}
			});
		} catch(e){}
	};
	
	window.investPrintError = function (options){
		/*
			text - "user" text error
			error - error javascript native object (message,lineNumber,fileName)
			id_ajax_content - for getPageContext error
		*/
		var text = options.text || '', e = options.error || null;
		if (e && e.lineNumber && e.fileName){
			text += ': '+e.message + '(line: '+e.lineNumber+', file: '+e.fileName+')';
		}
		if (options.id_ajax_content){
			$(".ajax-dinamic-div[id_ajax_content='"+options.id_ajax_content+"']").addClass('warning').html(text);
		} else if ($("#localErrorDiv")[0]){
			$("#localErrorDiv").html(text).show();
		} else {
			$.alert({
				message: text,
				removeLayouts:false,
				classes:options.classes
			});
		}
	};

	window.investHideError = function(options){
		var o = options || {};
		if (o.id_ajax_content) $(".ajax-dinamic-div[id_ajax_content='"+options.id_ajax_content+"']").removeClass('warning');
		$("#localErrorDiv").html('').hide();
	};

	window.investCallBack = function (callBack, callBackError, callBackOkAlert, showErrorAlert){
		return function(data){
			try {
				if (typeof(data) != 'object' && data){
					data = eval('(' + data + ')');
				}
				var errorText = data.errorMessage !== undefined ? data.errorMessage : data.error;
				showErrorAlert = showErrorAlert == undefined ? true : showErrorAlert;
				if (errorText !== undefined){
					if (errorText == "") errorText = data.errorAlias;
					if (showErrorAlert) investPrintError({
						text:errorText+'<input type="hidden" id="log-info" value="'+data.errorAlias+'">',
						id_ajax_content:data.id_paging_show,
						classes:'ajax-alert-error-message'
					});
					if (callBackError) callBackError(data);
				} else {
					investHideError({
						'id_ajax_content':data.id_paging_show
					});
					if (callBack) callBack(data);
					if (callBackOkAlert) $.alert({title:pamm_locales['pamm_alert_title'],message:callBackOkAlert,removeLayouts:false,classes:'ajax-alert-ok'});
				}
			} catch (e){
				if (callBackError) callBackError(data);
				investPrintError({
					text:pamm_locales['tryError'],
					error:e,
					classes:'ajax-alert-catch'
				});
			}
		}
	};
	//TODO make $.darker
	window.makeLightAJAX = function(time){
		var div = $('<div>').addClass('pamm_ajax_load_ico pamm-pre-loader').attr('time',time);
		$('<span/>',{text:pamm_locales['lightAJAX']}).appendTo(div);
		div.appendTo('body').show();
	};

	window.makeFullAJAX = function(time){
		$('<div>').addClass('fon black-fon pamm-pre-loader').height($('.wrapper').height()).attr('time',time).appendTo('body');
		$('<img height="22" width="126" alt="" src="/static/interface/img/invest_img/full-loader.gif" class="full-loader pamm-pre-loader">').attr('time',time).appendTo('body');
	};

	window.makeInContextAJAX = function(time){
		var el = $('.ajax-incontext');
		if (el[0]) {
			var oHeight = el.outerHeight(),
				height = oHeight < 32 ? 32 : oHeight,
				offPos = el.offsetPosition(),
				div = $('<div/>').addClass('ajax-incontext-fon fon white-fon pamm-pre-loader').css({
					left:offPos.left + 'px',
					top:offPos.top + 'px'
				}).width(el.outerWidth()).height(height).attr('time',time);
			$('<img src="/static/interface/img/pamm-preloader.gif" alt="" class="incontext-loader pamm-pre-loader"/>').attr('time',time).appendTo(div);
			div.appendTo(el.offsetParent());
		}
	};

	window.pamm_ajax_before = function (myAjaxOptions,time){
		$('.helper').trigger('mouseleave');
		investHideError();
		if (!myAjaxOptions || myAjaxOptions == 'no') return;
		if (myAjaxOptions == 'light') {
			makeLightAJAX(time);
		} else if (myAjaxOptions == 'full'){
			makeFullAJAX(time);
		} else if (myAjaxOptions == 'incontext') {
			makeInContextAJAX(time);
		}
	};

	window.pamm_ajax_error = function (xhr){
		if (xhr.status) investPrintError({text:pamm_locales['ajaxErrorTitle']+' ('+xhr.status+')',classes:'ajax-alert-ajax-error'});
	};

	window.pamm_ajax_complete = function (time){
		return function(){
			$('.btn').removeAttr('disabled');
			$('.pamm-pre-loader[time="'+time+'"]').remove();
			$('.label-loader').hide();
		}
	};

	window.investPost = function (url, data, callBack, callBackError, myAjaxOptions, callBackOkAlert, showErrorAlert){
		var time = new Date().getTime();
		try{
			url=urlNoCache(url);
		} catch(e){}
		return $.ajax({
			url:escape(url),
			data:data,
			type:'POST',
			beforeSend:pamm_ajax_before(myAjaxOptions,time),
			error:pamm_ajax_error,
			complete:pamm_ajax_complete(time),
			success:investCallBack(callBack, callBackError, callBackOkAlert, showErrorAlert)
		});
	};

	window.investGet = function (url, data, callBack, callBackError, myAjaxOptions, callBackOkAlert, showErrorAlert){
		var time = new Date().getTime();
		try{
			url=urlNoCache(url);
		} catch(e){}
		return $.ajax({
			url:escape(url),
			data:data,
			type:'GET',
			beforeSend:pamm_ajax_before(myAjaxOptions,time),
			error:pamm_ajax_error,
			complete:pamm_ajax_complete(time),
			success:investCallBack(callBack, callBackError, callBackOkAlert, showErrorAlert)
		});
	};
	
	window.fillByAJAX = function(callback){
		return function(json){
			var id = json.id_paging_show,
				paging = json.paging || '',
				elem = $(".ajax-dinamic-div[id_ajax_content='"+id+"']");
			elem.children(".ajax-content-paging").html($.trim(paging));
			elem.removeClass('ajax-incontext').children(".ajax-content").html($.trim(json.content));
			parseHash();
			try {
				if (callback) callback(json,elem);
			} catch (e){
				investPrintError({
					text:pamm_locales['tryError'],
					error:e,
					id_ajax_content:id,
					classes:'ajax-alert-fillByAJAX-callback-fail'
				});
			}
		}
	};
	
	window.getPageContext = function(options,callback){
		/*
			url - AJAX URL
			id_paging_show - id of context on the page 
			page - what page will be returned (if page equals 0 or false will return all items on one page)
			items_on_page - items on one page
			order_by - server return ordered items
			order_type - asc/desc
			getData - serialized string or object
			data - object for XHR
			ajax_options - PAMM ajax options ('no','light','incontext', 'full')
			alert_message - message in alert window on success AJAX request
			getByUrl - use only url
		*/
		if ((typeof options).toLowerCase() == 'string') options = {url:options};
		var getUrlIDregExp = new RegExp('id_paging_show\/([0-9]+)\/','g'),
			urlID = getUrlIDregExp.exec(options.url),
			id = urlID && urlID[1] ? urlID[1] : 1,
			o = $.extend({
				page:1,
				data:{},
				getByUrl:false,
				ajax_options:'incontext',
				getData:'',
				items_on_page:20,
				id_paging_show:id,
				alert_message:'',
				post:false
			},options),
			el = $('.ajax-dinamic-div[id_ajax_content="'+o.id_paging_show+'"]'),
			newGetUrl = '',
			oldGetUrl  = '';
		if (!el[0]) return;
		var url = unescape(o.url);
		if (!o.getByUrl){
			//let's remove all old options 
			for (var i in o) {
				if (i && i != 'url' && url.indexOf('/'+i+'/') > -1){
					if (url.indexOf('order_by/'+i+'/') > -1){//we have an order by this variable
						o['order_by'] = i;
						o['order_type'] = url.indexOf('order_type/asc/') > -1 ? 'asc' : 'desc';
						url = url.replace(/(order_by|order_type)\/[^\/]+\//ig,'');
					}
					var removeRegExp = new RegExp('\/'+i+'\/[^\/]+','ig');
					url = url.replace(removeRegExp,'');
				}
			}
			//first must be id, for another javascript string parser, don't change
			url += 'id_paging_show/'+o.id_paging_show +'/';
			// page == false || page == 0 ---> server will return all pages
			if (o.page*1) url += 'page/'+o.page+'/items_on_page/'+o.items_on_page +'/';
			if (o.getData) {
				oldGetUrl = el[0]._getURL;
				if (typeof o.getData == 'string') {
					newGetUrl = o.getData.replace(/&/g,'/').replace(/=/g,'/')+'/';
				} else if (typeof o.getData == 'object') {
					newGetUrl = $.param(o.getData).replace(/&/g,'/').replace(/=/g,'/')+'/';
				}
				el[0]._getURL = newGetUrl;
			}
			if (oldGetUrl && oldGetUrl != newGetUrl) url = url.replace(oldGetUrl,'');
			if (newGetUrl) url += newGetUrl;
			if (o.order_by && o.order_type) url += 'order_by/'+o.order_by+'/order_type/'+o.order_type+'/';
		}
		if (o.ajax_options == 'incontext') el.addClass('ajax-incontext');
		el[0]._serverURL = escape(url);
		if (o.post) return investPost(url,o.data,fillByAJAX(callback),null,o.ajax_options,o.alert_message);
		else return investGet(url,o.data,fillByAJAX(callback),null,o.ajax_options,o.alert_message);
	};
/*---------------------------------------------------------Page Context Pattern----------------------------------------------------*/
	window.PageContext = function(opt){
		if (!opt) return;
		var self = this,
			initItem = function(item){
				if (!item) return null;
				if ((typeof item).toLowerCase() == 'string' || $.isDOMElement(item)) {
					return $(item);
				} else if (!isNaN(item)){
					if (!self.form && !self.content) return $('[id_ajax_form='+item+']');
					else if (!self.content) return $('[id_ajax_content='+item+']');
				}
				return null;
			};
		if (!isNaN(opt)) opt = {form:opt,content:opt};
		if ((typeof opt).toLowerCase() == 'string') opt = {form:$('.'+opt),content:$('.'+opt)};
		self.setEssence('formData',{}).setOptions({}).setFilters({}).setEssence('form',initItem(opt.form)).setEssence('content',initItem(opt.content));
		if (!self.hasEssence('form')) self.setEssence('form',$());
	};
	PageContext.prototype.init = function(options,callback){
		var self = this;
		if ($.isFunction(options)){
			callback = options;
			options = self.getOptions();
		}
		self.setEssence('callback',callback).setOptions($.extend({
			page:1,
			ajax_options:'incontext',
			id_paging_show:1,
			alert_message:'',
			formSensitive:true,
			post:true
		},options)).setEssence('items_on_page_key','items_on_page|'+self.getOptions('url')).setOptions('items_on_page',self.getOptions('items_on_page') || getCookie(self.getEssence('items_on_page_key')) || 20);
		//setCookie(self.getEssence('items_on_page_key'),self.getOptions('items_on_page'));
		self.getEssence('content').delegate('.change-items-on-page','change',function(){
			var val = $(this).val(),
				setItemsOnPage = function(val) {
					setCookie(self.getEssence('items_on_page_key'),val);
					self.setOptions('items_on_page',val).setOptions('page',1).getPageContext();
				};
			if (val == 'own') $.prompt({
				message:window.items_on_page_prompt_title,
				callback:function(answer){ setItemsOnPage(answer) }
			},[/^[\d]+$/g,'rule:<=100']); else setItemsOnPage(val);
		}).delegate(".filters-tr","mouseleave",function(e){
			var target = $(e.relatedTarget || e.srcElement);
			if (!target.hasClass('filter-list-item') && !target.hasClass('filter-option')) self.getEssence('content').find('.filter-list-open,.filter-optgroup-open,.filter-select').removeClass('filter-list-open').removeClass('filter-optgroup-open').removeClass('filter-select-open');
		}).delegate(".sort-control", "click", function(){
			var el = $(this);
			self.setOptions('order_by',el.closest('.sort-control-wrapper').find('.sort-server-name').val()).setOptions('order_type',el.hasClass('asc-sort-control') ? 'asc' : 'desc').setOptions('page','1').getPageContext();
		}).delegate(".filter-s", "click", function(){
			var el = $(this),
				t = el.closest('.filter-div').find('.filter-t'),
				v = $.trim(t.val()),
				o = self.getFilters(t[0].name);
			if (!v && !o) return;
			var obj = $.extend({},$.formSerialize(self.getEssence('form').find('.form-filters')),$.formSerialize(el.closest('.filters-tr')))
			self.setFilters(obj).setOptions('page','1').getPageContext();
		}).delegate(".filter-select-open", "click", function(){
			var fDiv = $(this).closest('.filter-div');
			if (fDiv.find('.filter-option-selected')[0]) fDiv.find('.filter-s').click();
		}).delegate(".filter-select,.filter-optgroup:not('.filter-optgroup-open')", "click", function(){
			$(this).closest('.filter-div').find('.filter-optgroup').toggleClass('filter-optgroup-open').end().find('.filter-option').show().end().find('.filter-select').toggleClass('filter-select-open');
		}).delegate(".filter-optgroup-open .filter-option:not('.filter-option-def')", "click", function(e){
			e.preventDefault();
			e.stopPropagation();
			var el = $(this),
				fDiv = el.closest('.filter-div'),
				optgroup = fDiv.find('.filter-optgroup'),
				fInput = fDiv.find('.filter-t'),
				oVal = el.attr('value') || el[0].getAttribute('value'),
				iVal = fInput.val();
			if (e.ctrlKey) {
				if (el.toggleClass('filter-option-selected').hasClass('filter-option-selected')) if (iVal) iVal += ';' + oVal; else iVal = oVal;
				else iVal = $.removeFilterFromValue(iVal).replace(oVal,'').replace(/;$/,'').replace(/^;/,'');
				fInput.val(iVal);
			} else {
				optgroup.removeClass('filter-optgroup-open');
				fInput.val('{'+oVal+'}');
				fDiv.find('.filter-s').click();
			}
		}).delegate('.filter-optgroup-open','mouseleave',function(e){
			var target = e.relatedTarget || e.srcElement;
			if (!$(target).hasClass('filter-select')) $(this).removeClass('filter-optgroup-open').closest('.filter-div').find('.filter-select').removeClass('filter-select-open').end().find('.filter-option').filter('.filter-option-selected').eq(0).prevAll().hide();
		}).delegate('.filter-optgroup-open .filter-option-def','click',function(){
			var fDiv = $(this).closest('.filter-div');
			if (fDiv.find('.filter-option-selected')[0]) fDiv.find('.filter-r').click();
		}).delegate(".filter-r", "click", function(){
			var el = $(this);
			if (!$.trim(el.closest('.filter-div').find('.filter-t').val())) return;
			el.closest('.filter-div').find('.filter-t').val('');
			self.setFilters($.extend(
				$.formObjectFabric(self.getEssence('form')).filters,
				$.formSerialize(el.closest('.filters-tr'))
			)).getPageContext();
		}).delegate(".filter-t", "keyup", function(e){
			var el = $(this);
			if (e.keyCode == 13) self.setFilters($.extend(
				$.formObjectFabric(self.getEssence('form')).filters,
				$.formSerialize(el.closest('.filters-tr'))
			)).setOptions('page','1').getPageContext(function(){ /*make focus on element*/});
		}).delegate(".filter-t", "click", function(){
			$('.filter-list-open').removeClass('filter-list-open');
			var el = $(this),
				list = el.attr('filter_list') || el[0].getAttribute('filter_list');
			if (!list || !list.length) return;
			var fDiv = el.closest('.filter-div'),
				fList = fDiv.find('.filter-list');
			if (fList[0]) {
				fList.addClass('filter-list-open');
			} else {
				var lWrapper = $('<div/>').addClass('filter-list filter-list-open');
				$.each(list.split('|'),function(a,b){ 
					$('<div/>').addClass('filter-list-item').text(b).click(function(){ 
						var el = $(this);
						fDiv.find('.filter-list').removeClass('filter-list-open').end().find('.filter-t').val(el.text());
						var obj = $.extend({},$.formSerialize(self.getEssence('form').find('.form-filters')),$.formSerialize(el.closest('.filters-tr')))
						self.setFilters(obj).setOptions('page','1').getPageContext();
					}).appendTo(lWrapper);
				});
				lWrapper.appendTo(fDiv);
			}
		}).delegate('.filter-list-open','mouseleave',function(){
				$(this).removeClass('filter-list-open');
		}).delegate('.ajax-content-paging a','click',function(){
			self.setOptions('page',$(this).text()).setOptions('ajax_options','incontext').getPageContext();
			return false;
		});
		if (self.hasOptions('formSensitive') && self.hasOptions('form')) self.getEssence('form').delegate(":text,:checkbox,:radio,select,textarea","change",function(){self.getPageContext()});
		return self;
	};
	PageContext.prototype.initLayout = function(options){
		/*
			layout - DOM element, self layout
			boundary - layout boundary for position
			checker - function or static for checking when change layout
			drawOptions - how to draw layout (bgcolor,global positioned)
		*/
		var o = options || {},
			self = this,
			pointer = o.layout || self.getEssence('content'),
			bgcolor = o.drawOptions && o.drawOptions.bgcolor ? o.drawOptions.bgcolor : 'white';
		return self.setEssence('layout',{
			pointer: pointer,
			boundary: pointer.offsetParent(),
			check: function (){
				try {
					return o.checker();
				} catch (e){
					return o.checker;
				}
			},
			stateCallback:o.callback || new Function,
			state: 'close',
			dir: o.dir || 'ltr',
			setState: function(state){
				self.setEssence('layout','state',state);
				return self.getEssence('layout');
			},
			setOpen: function(){
				self.getEssence('layout').remove().pointer.addClass('ajax-dinamic-layout');
				self.getEssence('layout','stateCallback')('open');
				$('body').addClass('open-page-context');
				$.darker({context:self.getEssence('layout','boundary'),color:bgcolor});
				$('<i/>').addClass('layout-close').click(function(){
					self.getEssence('layout').setClose().setState('close');
				}).appendTo(self.getEssence('layout','pointer'));
				return self.getEssence('layout');
			},
			setClose: function(){
				self.getEssence('layout').remove();
				$('body').removeClass('open-page-context');
				var p = self.getEssence('content').find('.ajax-content').addClass('hide-content-div'),
					d = $('<div/>').addClass('hide-content-gradient').height(p.height()),
					i = $('<i/>').addClass('layout-open');
				i.add(d).click(function(){
					self.getEssence('layout').setOpen().positioned().setState('open');
				});
				i.appendTo(d)
				d.appendTo(p);
				i = d = p = null;
				self.getEssence('layout').stateCallback('close');
				return self.getEssence('layout');
			},
			positioned: function(){
				var layoutOffsetParentWidth = self.getEssence('layout','boundary').outerWidth(),
					maxLeft = ($('body').width() - layoutOffsetParentWidth)/2,
					left = (self.getEssence('layout','pointer').outerWidth() - layoutOffsetParentWidth)/2,
				left = left > maxLeft ? maxLeft : left;
				self.getEssence('layout','pointer').css( self.getEssence('layout','dir') == 'rtl' ? 'right' : 'left','-'+left+'px');
				return self.getEssence('layout');
			},
			remove:function(){
				self.getEssence('layout','pointer').removeClass('ajax-dinamic-layout');
				self.getEssence('layout','boundary').removeDarker();
				$('.layout-close').remove();
				self.getEssence('content').find('.ajax-content').removeClass('hide-content-div').find('.hide-content-gradient').remove();
				return self.getEssence('layout');
			},
			unload:function(){
				return self.getEssence('layout').remove().setState('close');
			}
		});
	};
	PageContext.prototype.setEssence = function(essence,key,value){
		var self = this;
		if (!essence) return self;
		if (!self[essence]) self[essence] = {};
		if (value === undefined) self[essence] = key;
		else self[essence][key] = value;
		return self;
	};
	PageContext.prototype.getEssence = function(essence,key){
		var self = this;
		if (!essence) return self;
		if (!self[essence]) return null;
		if (key === undefined) return self[essence];
		else return self[essence][key];
	};
	PageContext.prototype.hasEssence = function(essence,key){
		var self = this;
		if (!essence || !self[essence] || (key && !self[essence][key])) return false;
		else return true;
	};
	PageContext.prototype.removeEssence = function(essence,key){
		var self = this;
		if (!essence || !self[essence]) return self;
		if (key === undefined) delete self[essence]; else delete self[essence][key];
		return self;
	};
	PageContext.prototype.setOptions = function(option,value){
		return this.setEssence('options',option,value);
	};
	PageContext.prototype.getOptions = function(option){
		return this.getEssence('options',option);
	};
	PageContext.prototype.hasOptions = function(option){
		return this.hasEssence('options',option);
	};
	PageContext.prototype.removeOptions = function(option){
		return this.removeEssence('options',option);
	};
	PageContext.prototype.setFilters = function(filter,value){
		return this.setEssence('filters',filter,value);
	};
	PageContext.prototype.getFilters = function(filter){
		return this.getEssence('filters',filter);
	};
	PageContext.prototype.hasFilters = function(filter){
		return this.hasEssence('filters',filter);
	};
	PageContext.prototype.removeFilters = function(filter){
		return this.removeEssence('filters',filter);
	};
	PageContext.prototype.getPageContext = function(customCallback){
		var self = this,
			filters = {};
		if (self.hasEssence('ajax') && self.hasEssence('ajax','abort')) self.getEssence('ajax','abort')();
		self.setEssence('formData',$.formObjectFabric(self.getEssence('form')));
		var selfFilters = self.getFilters();
		if (selfFilters && selfFilters.page) delete selfFilters.page;
		filters = $.filtersObjectFabric($.extend(filters,self.getEssence('formData','filters'),selfFilters));
		$.each(filters,function(a,b){
			if (b == '_ge') filters[a] = 'ge';
			else if (/^\[[^;]+\]$/.test(b)) filters[a]=b.replace(/^\[+|\]+$/g,'')
		});
		self.setOptions('data',$.extend(
			{},
			self.getEssence('formData','options'),
			filters
		)).setOptions('post',self.getOptions('post'));
		self.ajax = getPageContext(self.getOptions(),function(json,elem){
			elem.find('.sort-server-name[value="'+self.getOptions('order_by')+'"]').closest('.sort-control-wrapper').find('.'+self.getOptions('order_type')+'-sort-control').addClass(self.getOptions('order_type')+'-sort-control-cur');
			$.each(elem.find('.filter-t'),function(a,b){
				var $b = $(b),
					fDiv = $b.closest('.filter-div'),
					options = fDiv.find('.filter-option'),
					isSelect = !!fDiv.find('.filter-select')[0],
					fSubmit = fDiv.find('.filter-s');
				if (self.hasFilters() && b.name in self.getFilters()) {
					filter = self.getFilters(b.name);
					b.value = /^\[[^;]+\]$/.test(filter) ? filter.replace(/^\[|\]$/g,'') : filter;
				} else {
					b.value='';
				}
				if (isSelect && b.value) {
					$.each($.removeFilterFromValue(b.value).split(';'),function(c,d){ options.filter('[value="'+d+'"]').addClass('filter-option-selected') });
					options.filter('.filter-option-selected').eq(0).prevAll().hide();
				}
			});
			try {
				if (self.hasEssence('callback')) self.getEssence('callback')(json,elem);
				if (customCallback) customCallback();
			} catch (e){
				investPrintError({
					text:pamm_locales['tryError'],
					error:e,
					id_ajax_content:self.getOptions('id_paging_show')
				});
			};
			if (self.hasEssence('layout'))
				if (self.getEssence('layout').check())
					if (self.getEssence('layout','state') == 'open') self.getEssence('layout').setOpen().positioned();
					else self.getEssence('layout').setClose();
				else self.getEssence('layout').unload();
			var items_on_page_val = self.getOptions('items_on_page') || getCookie(self.getEssence('items_on_page_key'));
			self.removeEssence('ajax').getEssence('content').find('.ajax-content-paging').find('.items-on-page').show().find('select').children().each(function(a,b){
				var sel = $(b.parentNode);
				if (items_on_page_val == b.value) {
					b.selected = 'selected'; 
				} else if (b.value == 'own' &&  sel.children().eq(sel[0].selectedIndex).val() != items_on_page_val) {
					$('<option/>',{
						value:items_on_page_val,
						text:items_on_page_val,
						selected:'selected'
					}).appendTo(sel);
					b = sel = null;
				}
			});
		});
	};
/*----------------------------------------------------------jQuery Handlers--------------------------------------------------------*/
	$('body').delegate(".helper", "mouseenter", function(){
		$('.helper-pop-up').remove();
		var el = $(this),
			children = el.children();
		if (!children [0])return;
		var offset = el.offset(),
			offParent = el.offsetParent(),
			offParentOffset = offParent.offset(),
			content = $('.content'),
			contentOffset = content.offset(),
			t = children.html(), 
			hpp = $('<span/>').addClass('helper-pop-up pop-up-shadow pop-up-radius5 p-ta-l').html(t), 
			pop_up_width = 150;
		if (el.hasClass('max-width-helper')){
			hpp.addClass('max-width-helper-pop-up');
			pop_up_width = 250;
		}
		if (1000 - offset.left + contentOffset.left > pop_up_width && $('html').attr('dir') != 'rtl') hpp.css({left:offset.left - offParentOffset.left});
		else hpp.css({left:offset.left - offParentOffset.left - pop_up_width});
		hpp.appendTo(offParent).hide();
		var helperHeight = hpp.height();
		if (el.hasClass('top-helper') || Math.ceil(content.height()+contentOffset.top - offset.top) < helperHeight+20) hpp.css({top:offset.top - offParentOffset.top - helperHeight});
		else hpp.css({top:offset.top - offParentOffset.top});
		hpp.show();
		//hack for screen.css rule in IE with runtimeStyle expression
		if ($.browser.msie && $.browser.version < 9) hpp.find('.external-link').each(function(a,b){ 
			b.innerHTML = $.trim(b.innerHTML).replace(/<img[^\/]+\/>/)+"<img src='/static/interface/img/external_link.png' alt='' width='15' height='10'/>" 
		});
		el = children = offset = offParent = offParentOffset = content = contentOffset = t = hpp = null;
	}).delegate(".helper", "mouseleave", function(e){
		e.stopPropagation();
		var t = $(e.target);
		if (t[0] && !t.hasClass('helper-pop-up') && !t.hasClass('helper')) $('.helper-pop-up').remove();
		t = null;
	}).delegate(".helper-pop-up", "mouseleave", function(e){
		e.stopPropagation();
		$(this).remove();
	}).delegate(".helper-pop-up", "click", function(e){
		if (e.target && !$(e.target).hasClass('external-link')){
			e.preventDefault();
			e.stopPropagation();
		}
	});
	//TODO refactor by new PageContext()
	$('.ajax-dinamic-div').each(function(a,b){
		var el = $(b);
		if(el.attr('ajax_url') && el.attr('id_ajax_content')){
			var start_page = el.attr('start_page'),
				items_on_page = el.attr('items_on_page'),
				ajax_url = el.attr('ajax_url'),
				id = el.attr('id_ajax_content'),
				ajax_options = el.attr('ajax_options') || 'light',
				getData = el.attr('ajax_getData') || '';
			getPageContext({
				'url':ajax_url,
				'id_paging_show':id,
				'page':start_page,
				'items_on_page':items_on_page,
				'getData':getData,
				'ajax_options':ajax_options
			});
		}
	});
	//TODO refactor by new PageContext()
	$('body').delegate('.ajax-content-paging a','click',function(){
		getPageContext({
			url:$(this).attr('href'),
			getByUrl:true,
			ajax_options:'incontext'
		});
		return false;
	});
/*----------------------------------------------------------Parse Hash when DOM is loaded---------------------------------------------*/
	parseHash();
});
