/*
    Пример передачи параметров:
    params = 
    {
        viewMode: 1,
        allowSorting: true,
        allowPaging: true,
        dataList: [{dataKey:1, image:"image/source", cells:[{colName:"colName1", value:"value1"}, ...]},...],
        imageSize: {width:20, height:20},
        sort:{defaultColName:"DbColumnName", direction:0},
        paging: {pageSize:20, pageCount:10},
        allowEdit: false,
        columns: [{colName:"", name:"", cellClickEvent:'functionName', allowSorting:false (true by default, if params.allowSorting:true)}],
        galleryViewSheme: {text:['colName1',...], title:['colName1',...]},
        allowViewImage: true
    }
*/
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}

$.overflow = function (obj, bRun, isSmall)
{	
	obj = $(obj);
	if(!obj.length) return obj;
	var pos = obj.offset();
    var width = obj.width();
    var height = obj.height();
    var idOvf = obj.get(0).id + '_overflow';
    var idOvfImg = obj.get(0).id + '_overflow_img';
    var div = $('#'+idOvf);//debugger;
    var img = $('#'+idOvfImg);    
    if(!div.length)
    {
        div = $('<div></div>').appendTo($('body')).hide().attr('id', idOvf)
            .css({
                filter:'alpha(opacity=10)',
                opacity: '0.10',
                //top:-height,
                'z-index':300,
                position:'absolute',
                background:'#000000'
                });        
        var src = (!isSmall) ? './images/updateprogress3.gif' : './images/updateprogresssm.gif';
        img = $('<img/>').attr({'src':src, id: idOvfImg}).css({'z-index':301,
            position:'absolute'/*,width:imgWidth, height:imgHeight */}).appendTo($('body')).hide();
    }
    if(!bRun)
        {div.hide();img.hide();}
    else
    {
        div.css({width:width, height:height, top:pos.top, left:pos.left}).show();        
        img.css({top:pos.top + height/2 - img.height()/2, left:pos.left + width/2 - img.width()/2}).show();
    }
    return obj;
};

$.overflow.clear = function(obj)
{	
	obj = $(obj);
	if(!obj.length) return obj;
	var idOvf = obj.get(0).id + '_overflow';
    var idOvfImg = obj.get(0).id + '_overflow_img';
    if(!$('body').length || !$('#'+idOvf).length || !$('#'+idOvfImg).length) return;
    $('body').remove($('#'+idOvf)).remove($('#'+idOvfImg));
}

var catalogServerFile = 'http://www.avtototal.ru/php.inc/catalog.handler.php';

var catDictionaries = null;
function getDic()
{
    return catDictionaries;
}

function initDictionaries()
{
    $.getJSON(catalogServerFile, {mode: 'initDicful'}, function (data)
    {
       // debugger;
        catDictionaries = data;
   });
}
$(function()
{  
 // initDictionaries();
})

function ShowDesc(obj, show)
{
	//debugger;
	obj = $(obj);
	if(show)
	{		
		obj.addClass('active');
		obj.find('.quality').css('display','block');
	}
	else
	{
		obj.removeClass('active');
		obj.find('.quality').css('display','none');
	}
}



function CatalogItemImgListClick(obj)
{
	var model = $('div.model div.foto a.active');
	
}


function GetGridConfigurationMyAdds()
{
    return  {
            viewMode: 1,
            allowSorting: true,
            allowPaging: true,
            allowImageChecker: false,
            dataList:   [
                ],
            imageSize: {width:20, height:20},
            sort:{defaultColName:"TestCol1", direction:0},
            allowEdit: false,
            columns: [
                 /*     
				
				{
				    colName:'All',
				    name:'Все',
					allowSorting:false,
					cellStyle:{'text-align':'center'},
					dataView: 2,
					//FirstChildClass:"foto",
					className:"select all"
				},*/
                /*Колонка ФОТО*/
				{
                    colName:'Image',
                    name:'Фото',
					allowSorting:false,
					cellStyle:{'text-align':'center'},
					dataView: 3,
					headerFirstChildClass:"foto",
					className:"foto"
                },
				/*Колонка Марка*/
                {
                    colName:'Mark',
                    name:"Марка/Модель",
					className:"info mark",
                    dataView: 4                            
                },
                /*Колонка Пробег*/
                {
                	
                	colName:'Run',
                	className:"type info",
                	name:"Пробег"
                	
                },
				/*Колонка тип Т/С*/
				{
                    colName:'Type',
					className:"type info",							
                    name:"Кузов",
                    dataView: 5,
					cellStyle:{'text-align':'center'},
					icon:{type:'reference'}                            
                },
                
				/*Колонка Стоимость*/
				{
					className:"price info",
                    colName:'Cost',
                    name:"Цена",
                    cellStyle:{'text-align':'center'}                            
                },
				/*Колонка цвет*/
				{
					className:"color info",
                    colName:'Color',
                    name:"Цвет",
                    dataView: 6,
					cellStyle:{'text-align':'center'}                            
                },
				/*Колонка год выпуска*/
				{
					className:"age info",
                    colName:'Year',
                    name:"Год вып.",                            
					cellStyle:{'text-align':'center'}                            
                },
				/*Колонка тип КПП */
				{
					className:"kpp info",
                    colName:'GearBox',
                    name:"КПП",
					dataView: 4,
					cellStyle:{'text-align':'center'}                            
                },
                /*Колонка Действительно до */
				{
					className:"available",
                    colName:'DateOpened',
                    name:"Действительно до",
                    headerFirstChildClass:"number",
					allowSorting:false
                }
				],                    
            allowViewImage: true                    
        };
}

		function addToFavorite(sender, userId, catItemId)
		{
		 var params = {};
		 params.mode = 'actionAddFav';
		 params.actionIds = catItemId;
		 params.userId = userId;
		 $.getJSON(catalogServerFile, params, function (data)
		    {
		  $(sender).css('display', 'none');
		 });
		}

function adminChangeSoldFlag(catItemId, valSold)
{
 var params = {};
 params.mode = 'actionChangeSoldFlag';
 params.actionIds = catItemId;
 params.soldFlag = valSold ? 1:0;
 $.getJSON(catalogServerFile, params, function (data) {});
}


function adminUpdateAutoru(catItemId)
{
  $('#up'+catItemId).css('display', 'none');  
  $('#up_loader'+catItemId).show();
  $.ajax({
    url: jsOpt.base_url+"/php.inc/catalog.handler.php?mode=addAutoRuQueue&actionIds="+catItemId,
    cache: false,
    success: function(html){
      if (html == 'success') {
        $('#up_loader'+catItemId).hide();
        alert("Машина добавлена в очередь на выгрузку Auto.ru");
      }
      else if(html == 'inprogress')
      {
        $('#up_loader'+catItemId).hide();
        alert("Машина уже находится очереди(ожидает выгрузки)");
      }
      else {
        $('#up'+catItemId).css('display', 'block'); 
        $('#up_loader'+catItemId).hide();
        alert("Не удалось добавить машину в очередь на выгрузку (если не поможет, сообщите администратору)");
      } 
  },
    statusCode: {
    504: function() {
      $('#up'+catItemId).css('display', 'block'); 
      $('#up_loader'+catItemId).hide();
      alert('Запрос занял слишком много времени, возможно avto.ru перегружен, попробуйте через 5-10 мин.');
    }
  },
  timeout:120000
  

});

}

function adminDeleteFromAutoru(catItemId)
{
  if(!confirm('Удалить позицию?'))
    return;
  var loader = $('#delete_uploader-'+catItemId);
  var deleteLink = $('#delete_td-'+catItemId);
  loader.show();
  deleteLink.hide();
  
  $.ajax({
    url: jsOpt.base_url+"/php.inc/catalog.handler.php?mode=deleteAutoRuQueue&actionIds="+catItemId,
    cache: false,
    success: function(html){
      if (html == 'success') {
        loader.hide();
        deleteLink.show();
        alert("Машина успешно удалена");
        $('#tr-'+catItemId).remove();
      }
      else if(html == 'inprogress')
      {
        loader.hide();
        deleteLink.show();
        alert("Машина уже удалена");
      }
      else {
        deleteLink.show();
        loader.hide();
        alert("Не удалось удалить машину, попробуйде позже (если не поможет, сообщите администратору)");
      } 
    },
    statusCode: {
    504: function() {
      $('#up'+catItemId).css('display', 'block'); 
      $('#up_loader'+catItemId).hide();
      alert('Запрос занял слишком много времени, возможно avtototal.ru перегружен, попробуйте через 5-10 мин.');
    }
  },
  timeout:120000
});

}



function GetGridConfigurationAll()
{
    return  {
            viewMode: 1,
            allowSorting: true,
            allowPaging: false,
            allowImageChecker: false,
            dataList:   [
                ],
            imageSize: {width:20, height:20},
            sort:{defaultColName:"TestCol1", direction:0},
            allowEdit: false,
            appendATotal: true,
            columns: [
                /*Колонка ФОТО*/
				/**{
                    colName:'Image',
                    name:'Фото',
					allowSorting:false,
					cellStyle:{'text-align':'center'},
					dataView: 3,
					headerFirstChildClass:"foto",
					className:"foto"
                },**/
				/*Колонка Марка*/
                {
                    colName:'Mark',
                    name:"Марка/Модель",
					className:"info mark",
                    dataView: 4                            
                },
                /*Колонка Пробег*/
                {
                	
                	colName:'Run',
                	className:"type info",
                	name:"Пробег"
                	
                },
				/*Колонка тип Т/С*/
				{
                    colName:'Type',
					className:"type info",							
                    name:"Кузов",
                    dataView: 5,
					cellStyle:{'text-align':'center'},
					icon:{type:'reference'}                            
                },
                
				/*Колонка Стоимость*/
				{
					className:"price info",
                    colName:'Cost',
                    name:"Цена",
                    cellStyle:{'text-align':'center'}                            
                },
				/*Колонка цвет*/
				{
					className:"color info",
                    colName:'Color',
                    name:"Цвет",
                    dataView: 6,
					cellStyle:{'text-align':'center'}                            
                },
				/*Колонка год выпуска*/
				{
					className:"age info",
                    colName:'Year',
                    name:"Год вып.",                            
					cellStyle:{'text-align':'center'}                            
                },
				/*Колонка стоянка*/
				{
					className:"city info",
                    colName:'Parking',
                    name:"Стоянка",
					dataView: 4,
					cellStyle:{'text-align':'center'}                            
                },
				/*Колонка тип КПП */
				{
					className:"kpp info",
                    colName:'GearBox',
                    name:"КПП",
					dataView: 4,
					cellStyle:{'text-align':'center'}                            
                },
				/*Колонка номер */
				{
					className:"date info",
                    colName:'ItemKey',
                    name:"Артикул/<br/>Дата добавления",
headerFirstChildClass:"number",
					allowSorting:false
                }
				],                    
            allowViewImage: true                    
        };
}

function GetGridConfiguration()
{
    return  {
            viewMode: 1,
            allowSorting: true,
            allowPaging: true,
            allowImageChecker: true,
            dataList:   [
                ],
            imageSize: {width:20, height:20},
            sort:{defaultColName:"TestCol1", direction:0},
            allowEdit: false,
            columns: [
                /*Колонка ФОТО*/
				{
                    colName:'Image',
                    name:'Фото',
					allowSorting:false,
					cellStyle:{'text-align':'center'},
					dataView: 3,
					headerFirstChildClass:"foto",
					className:"foto"
                },
				/*Колонка Марка*/
                {
                    colName:'Mark',
                    name:"Марка/Модель",
					className:"info mark",
                    dataView: 4                            
                },
                /*Колонка Пробег*/
                {
                	
                	colName:'Run',
                	className:"type info",
                	name:"Пробег"
                	
                },
				/*Колонка тип Т/С*/
				{
                    colName:'Type',
					className:"type info",							
                    name:"Кузов",
                    dataView: 5,
					cellStyle:{'text-align':'center'},
					icon:{type:'reference'}                            
                },
				/*Колонка Стоимость*/
				{
					className:"price info",
                    colName:'Cost',
                    name:"Цена",
                    cellStyle:{'text-align':'center'}                            
                },
				/*Колонка цвет*/
				{
					className:"color info",
                    colName:'Color',
                    name:"Цвет",
                    dataView: 6,
					cellStyle:{'text-align':'center'}                            
                },
				/*Колонка год выпуска*/
				{
					className:"age info",
                    colName:'Year',
                    name:"Год",                            
					cellStyle:{'text-align':'center'}                            
                },
				/*Колонка стоянка*/
				{
					className:"city info",
                    colName:'Parking',
                    name:"Стоянка",
					dataView: 4,
					cellStyle:{'text-align':'center'}                            
                },
				/*Колонка тип КПП */
				{
					className:"kpp info",
                    colName:'GearBox',
                    name:"КПП",
					dataView: 4,
					cellStyle:{'text-align':'center'}                            
                },
				/*Колонка номер */
				{
					className:"date info",
                    colName:'ItemKey',
                    name:"Артикул/<br/>Дата добавления",
                    headerFirstChildClass:"number",
					allowSorting:false
                }
				],                    
            allowViewImage: true                    
        };
}

//jQuery.ajaxSetup({cache:false, timeout:30000, error: function(data){alert('Ошибка обращения: полученные данные в некорректном формате.')}});
jQuery.ajaxSetup({cache:false, timeout:30000});
jQEvent = {sender:null};
function jQcomplete()
{
    jQEvent.sender = null;
}

function jQbeforeSend()
{
    if(jQEvent.sender && jQEvent.sender.length)
    {
        $('<div></div>').attr('id', jQEvent.sender.attr('id')+'_hover')
    }
}

function catalog(container, params)
{
    return new catalog.fn.init(container, params);
}

catalog.prototype = catalog.fn = 
{
    viewMode: {gallery: 0, table: 1},
    defaults: {
                imageSize:{width:200, height:200},
                pageSize: 20,
                noDataMessage: 'Нет данных для отображения',
                noPhotoImg: 'images/photo.gif',
                pagesLength: 7
              },
    dataList: {},
    properties: [],
    columns: [],
    dataKeys: [],
    init: function(container, params)
    {
    
        params = params || [];
        if(!container) return null;
        this.$container = container instanceof $ ? container : $(container);
        this.$container = container;
        this.id = this.$container.data("catalogId");
        
        // первая инициализация объекта
        var isFirstInit = !this.id || !this.id.length;
        if(isFirstInit)
        {
            this.id = "catalog" + catalog.fn.getUniqId();
            this.$container.data("catalogId", this.id);
            if(!isNaN(params.viewMode) && 
            (params.viewMode == catalog.prototype.viewMode.gallery || params.viewMode == catalog.prototype.viewMode.table))
                catalog.fn.viewMode[this.id] = params.viewMode;
            else 
                catalog.fn.viewMode[this.id] = catalog.prototype.viewMode.gallery;
            catalog.fn.properties[this.id] = {};
            if(catalog.fn.viewMode[this.id] == catalog.prototype.viewMode.gallery)
                catalog.fn.properties[this.id].allowSorting = false;
            else
                catalog.fn.properties[this.id].allowSorting = !!params.allowSorting;
            catalog.fn.properties[this.id].allowPaging = !!params.allowPaging;
            params.dataList = params.dataList || [];
            catalog.fn.dataList[this.id] = params.dataList;
            params.imageSize = params.imageSize || catalog.prototype.defaults.imageSize;
            catalog.fn.properties[this.id].imageSize = params.imageSize;
            
            catalog.fn.properties[this.id].appendATotal = !!params.appendATotal;
            
            catalog.fn.properties[this.id].sort = {};
            if(params.sort)
            {
                catalog.fn.properties[this.id].sort = {defaults: {}, colName:"", direction:0};
                if(params.sort.defaultColName)
                    catalog.fn.properties[this.id].sort.defaults.colName = params.sort.defaultColName;
                if(params.sort.direction)
                    catalog.fn.properties[this.id].sort.defaults.direction = params.sort.direction;
                else
                    catalog.fn.properties[this.id].sort.defaults.direction = 0;
                
                // установка текущей сортировки
                catalog.fn.properties[this.id].sort.direction = catalog.fn.properties[this.id].sort.defaults.direction;
                catalog.fn.properties[this.id].sort.colName = catalog.fn.properties[this.id].sort.defaults.colName;                
            }
            
            params.pageSize = (params.paging && params.paging.pageSize) ? params.paging.pageSize : catalog.prototype.defaults.pageSize;
var itemsCount = params.itemsCount || 0;            
            var pageCount = catalog.fn.calcPageCount(itemsCount, params.pageSize);
            catalog.fn.properties[this.id].paging = {currentPage:0, pageSize:params.pageSize, pageCount: pageCount, pagesLength: catalog.prototype.defaults.pagesLength, itemsCount:itemsCount};
            
            params.columns = params.columns || [];
            catalog.fn.setColumns(this, params.columns);            
            catalog.fn.dataKeys[this.id] = [];
            catalog.fn.properties[this.id].allowEdit = !!params.allowEdit;
            
            catalog.fn.properties[this.id].galleryViewSheme = params.galleryViewSheme || {text:[], title:[]};            
            catalog.fn.properties[this.id].allowViewImage = !!params.allowViewImage;
            catalog.fn.properties[this.id].allowImageChecker = !!params.allowImageChecker;
            catalog.fn.properties[this.id].photosShowed = true;
            //catalog.fn.properties[this.id].userId = params.userId;
            catalog.fn.properties[this.id].serverInitParams = params.serverInitParams || {}; 
        }
        // режим отображения
        this.viewMode = catalog.fn.viewMode[this.id];
        // разрешена ли сортировка
        this.allowSorting = catalog.fn.properties[this.id].allowSorting;
        // разрешен ли пэйджинг
        this.allowPaging = catalog.fn.properties[this.id].allowPaging;
        // список записей
        this.dataList = dataList(catalog.fn.dataList[this.id]);
        // размер отображаемых картинок
        this.imageSize = catalog.fn.properties[this.id].imageSize;
        // свойство, которое хранит текущие настройки сортировки
        this.sort = catalog.fn.properties[this.id].sort;
        // свойство, которое хранит текущие настройки пэйджинга
        this.paging = catalog.fn.properties[this.id].paging;        
        // доступно редактирование
        this.allowEdit = catalog.fn.properties[this.id].allowEdit;
        // для получение сжатого текста к картинке (содержит поля, которые надо отображать)
        this.galleryViewSheme = catalog.fn.properties[this.id].galleryViewSheme;
        this.appendATotal = catalog.fn.properties[this.id].appendATotal;
        this.allowImageChecker = catalog.fn.properties[this.id].allowImageChecker;
        
        //this.userId = catalog.fn.properties[this.id].userId;
        this.serverInitParams = catalog.fn.properties[this.id].serverInitParams;        
        this.columns = catalog.fn.columns[this.id];
        
        this.photosShowed = catalog.fn.properties[this.id].photosShowed;
        $.extend(this.galleryViewSheme,
        {
            inSheme: function(key, isText)
            {
                var sheme = isText ? this['text'] : this['title'];
                if(!sheme) return false;
                for(var i in sheme)
                {
                    if(sheme[i] == key)
                        return true;
                }
                return false;
            }
        });
        
        // сообщение - нет данных для отображения
        this.noDataMessage = catalog.prototype.defaults.noDataMessage;
        
        // отображать ли картинку в табличном представлении данных
        this.allowViewImage = catalog.fn.properties[this.id].allowViewImage;
        if(isFirstInit)
            this.fill(this.dataList);        
    },
    
    // получает уникальный Id на странице
    getUniqId: function()
    {
        if (typeof this.lastId != "undefined")
            return ++this.lastId;
        this.lastId = 0;
        return 0;
    },
    
    setColumns: function(obj, columns)
    {
        columns = columns || [];
        if(!obj || obj.viewMode == catalog.prototype.viewMode.gallery) return false;
        catalog.fn.columns[obj.id] = catalogColumns(columns);
        obj.columns = catalog.fn.columns[obj.id];
        return true;
    },
    
   checkBoxClick: function(obj, ch, id, flag)
    {
    	
    	
        if(!obj || !ch) return;
        ch = $(ch);
        var isHeader = ch.attr('id') == 'hcheckbox';
        var isChecked = ch.attr('checked') || false;
        var needChecked = typeof(flag) != "undefined";
        if(isHeader)
        {
            var chs = obj.$container.find('#checkbox');
            for(var i =0; i<chs.length;i++)
            {
                catalog.fn.checkBoxClick(obj, chs[i], $(chs[i]).data('key'), isChecked);
            }
        }
        else
        {
            if(needChecked)
            {
                ch.attr('checked', flag);
                isChecked = flag;
            }
            catalog.fn.dataKeyChanged(obj, id, isChecked);
        }
        var e = obj.getKeys();
    },
    
    colClick: function(obj, colName)
    {
        if(!obj) return;
        //изменение текущих настроеек сортировки
        if(colName == obj.sort.colName)
        {
            //sort.defaults.direction
        	 if(obj.sort.direction + 1 > 1)
             {
                 obj.sort.direction = 0;
             }
             else
                 obj.sort.direction += 1;
        }
        else
        {
            obj.sort.direction = 0;
            obj.sort.colName = colName;
        }
        //
        catalog.fn.updateData(obj);
    },
    
    pagingClick: function(obj, index)
    {
    	//debugger;
        if(!obj || obj.paging.currentPage == index) return;
        //{currentPage:0, pageSize:params.pageSize, pageCount:0};
        if(index > obj.paging.pageCount) return;
        obj.paging.currentPage = index;
        catalog.fn.updateData(obj);
    },
    
    updateData: function(obj, prms, successFunction)
    {

        if(!obj) return;
        catalog.fn.overflow(obj, true);
        var params = catalog.fn.getCurrentParams(obj);
        var oldParams = catalog.fn.properties[obj.id].updateParams;
        var issetNew = prms && prms.length;
        var issetOld = oldParams && oldParams.length;
        if(!issetNew && issetOld)
        	prms = oldParams;        
        if(issetNew || issetOld)
        {
        	if(issetNew)
        		catalog.fn.properties[obj.id].updateParams = prms;
        	
        	for(var i in prms)
        		$.extend(params, prms[i]);
        }
        params.mode = 'getList';
        var object = obj;
        jQEvent.sender = obj.$container;        
        $.getJSON(catalogServerFile, params, function (data)
        {       
            //debugger;
            catalog.fn.bindData(object, data);
            if(typeof(successFunction) == 'function')
            	successFunction.call(obj, []);
        });
    },
    
    getCurrentParams: function(obj)
    {
        if(!obj) return {};
        var params = {};
        if(obj.allowSorting)
        {
            params.sortName = obj.sort.colName;
            params.sortDirection = obj.sort.direction;
        }
        if(obj.allowPaging)
        {
            params.pagingCurr = obj.paging.currentPage
            params.pagingSize = obj.paging.pageSize;
        }
        
        /*if(!isNaN(obj.userId))
        	params.userId = obj.userId;
        	*/
        
        if(obj.serverInitParams)
        	$.extend(params, obj.serverInitParams);
        
        /* получение фильтров */
        var get = new String(window.location);
        var x = get.indexOf('?');
        if(x!=-1)
        {
        	var l = get.length;
        	get = get.substr(x+1, l-x);
        	l = get.split('&');
        	x = 0;
        	var _GET_Count  = l.length;
        	var _GET_Keys   = new Array(_GET_Count);
        	var _GET_Values = new Array(_GET_Count);
        	for(i in l)
        	{
        	   get = l[i].split('=');
        	   if(get.length == 2)
        		   params[get[0]] = get[1];        	   
        	}
        	
        }
        
        return params;
    },
    
    overflow: function (obj, bRun)
    {
    	$.overflow(obj.$container.children(), bRun);    	
    },
    
    bindData: function(obj, data)
    {
    	//debugger;
        if(!obj) return;
        obj.paging.itemsCount = data.itemsCount;
        obj.paging.pageCount = catalog.fn.calcPageCount(data.itemsCount, obj.paging.pageSize);
        var dataList = data.dataList || [];
        obj.fill(dataList);
        catalog.fn.overflow(obj, false);
    },
    
    calcPageCount: function(itemsCount, pageSize)
    {
    	return Math.ceil(parseInt(itemsCount) / pageSize);
    },
    
    dataKeyChanged: function(obj, key, add)
    {
        if(!obj) return;
        var isExists = false;
        var freePosition = -1;
        var foundPosition = -1;
        for(var i in catalog.fn.dataKeys[obj.id])
        {
            if(catalog.fn.dataKeys[obj.id][i] == null)
               freePosition = i;
            if(catalog.fn.dataKeys[obj.id][i] == key)
            {
                isExists = true;
                foundPosition = i;
            }
        }
        // если элемент найден, то надо его удалить
        if(isExists && !add)
            catalog.fn.dataKeys[obj.id][foundPosition] = null;            
        // элемент не найден, надо его добавить
        if(!isExists && add)
        {
            freePosition = (freePosition!=-1) ? freePosition : catalog.fn.dataKeys[obj.id].length;
            catalog.fn.dataKeys[obj.id][freePosition] = key;
        }
    },
    
    getDicInfo: function(dicName, dataKey)
    {
        var vval = null;
        if(catDictionaries && catDictionaries[dicName])
        {            
            var dic = catDictionaries[dicName];
            for(var it in dic)
            {
                if(dic[it].dataKey == dataKey)
                    vval = dic[it];
            }
        }
        return vval;
    },
    
    createCell: function(obj, col, rowInfo)
    {

        var cell = col;
        var val = null;
        if(cell.staticText)
            val = cell.name;
        else
            val = rowInfo.getValue(cell.colName);
        if(val == null)
            val = '';        
        var icon = null;
        if(cell.icon)
        {
        
            if(cell.icon.type == 'simple')
            {
                if(cell.icon.value)
                    icon = $('<img/>').attr('src', cell.icon.value);
            }
            //col.icon.type == 'reference'
            else
            {
                var vval = null;
                if(typeof(cell.iconRefTypeName) == 'object')
                {
                    for(var i in cell.iconRefTypeName)
                    {
                        if(cell.iconRefTypeName[i].dataKey == val)
                        {
                            vval = cell.iconRefTypeName[i];
                            break;
                        }
                    }
                }
                else
                    vval = catalog.fn.getDicInfo(cell.iconRefTypeName, val);
                if(vval && vval.value) 
                    icon = $('<img/>').attr('src', vval.value);


            }
        }
        var refText = null;
        var refColor = null;
        if(cell.textRefTypeName)
        {
            try
            {
                var vval = catalog.fn.getDicInfo(cell.textRefTypeName, val);
                if(vval && vval.value)
                    refText = vval.value;
                if(vval && vval.color)
                    refColor = vval.color;
            }
            catch(ex) {}
        }        
        
        var dataView = cell.dataView || 0;
        var dv = $('<div></div>');
        if((dataView == 1 || dataView == 2) && icon)
            dv.append(icon);
        if(dataView == 0 || dataView == 2)
            dv.append($('<span></span>').text(val.toString()));
        if(dataView == 2 && icon)
            icon.css('margin-right', '2px');
        if(dataView == 3)
        {
            var vval = null;
            if(val)
                vval = val;
            else if(catalog.fn.defaults.noPhotoImg)
                vval = catalog.fn.defaults.noPhotoImg;
            if(vval)
                $('<img/>').attr('src', vval).appendTo(dv);
        }
        if(dataView == 4)
            dv.append($('<span></span>').text(refText));
        if(dataView == 5)
        {
            if(refText)
                dv.append($('<span></span>').text(refText));
            if(icon)
                dv.append($('<div></div>').append(icon));
        }
        if(dataView == 6 && refColor)
            dv.append($('<div></div>').css({'width':'20px', height:'20px', background:refColor}));        
        return dv;
    }
}

function catalogColumns(cols)
{
    
    return $.extend(cols,
    {
        getSplitColumns: function(colName, direction)
        {
            var sp = [];
            for(var i=0;i<this.length;i++)
            {
                if(this[i].split && this[i].split.colName == colName && direction == this[i].split.direction)
                sp[sp.length] = this[i];
            }
            return (!sp.length) ? null : sp;
        }
    });
}

function dataList(dataList)
{
    var arrs = [];
    for(var i in dataList)
    {
  /*      var entry = dataList[i];
        
        var image = entry.cells[20]; // ЕБАНЫЙ КОСТЫЛЬ
        var additionals = entry.cells[22];
        
        var url = $(image.value).find("img").attr('src'); // ОЛОЛО
        var aurl = $(additionals.value).find("img").attr('src'); // ОЛОЛО
        
        if(url.indexOf("thumb")<=0) {
            var basename = url.replace(/^.*\//, ''); // ОЛОЛО
            basename = "thumb_" + basename; // ВОВА БЫДЛО
            var path = url.substr(0, url.lastIndexOf('/')+1); // И ХУЙЛО!
            var url2 = path + basename; 
            var html = String(image.value).replace(url,url2);
            entry.cells[20].value=html;
        }
        
        if(aurl.indexOf("thumb")<=0) {
            var basename = aurl.replace(/^.*\//, ''); // ОЛОЛО
            basename = "thumb_" + basename; // ВОВА БЫДЛО
            var path = aurl.substr(0, aurl.lastIndexOf('/')+1); // И ХУЙЛО!
            var url2 = path + basename; 
            var html = String(image.value).replace(aurl,url2);
            entry.cells[22].value=html;
        }
        */
        arrs[arrs.length] = catalogItem(dataList[i]);         

    }
    return arrs;
}

function catalogItem(item)
{
    return $.extend({}, 
    item,
    {
        getValue: function(key)
        {
            for(var i in this.cells)
            {
                if(this.cells[i].colName == key)
                    return this.cells[i].value;
            }
            return null;
        },
                
        getSplitValue: function(sheme, isText)
        {
            var str = '';
            if(!sheme) return str;
            if(!isText) isText = false;
            for(var i in this.cells)
            {                
                if(sheme.inSheme(this.cells[i].colName, isText))
                    str += this.cells[i].value + ' ';
            }
            if(this.cells.length>0)
                str = str.substr(0, str.length-1);
            return str;
        }
    });
}
// расширение прототипа объекта
$.extend(catalog.fn.init.prototype,
{
    css:{
        galImgStyle: "galImgStyle",
        galTextStyle: "galTextStyle",
        tableHeaderRow: "tableHeaderRow",
        tableRow: "tableRow",
        tableAltRow: "tableAltRow",
        tableFooterRow: "tableFooterRow",
        pageNum: "pageNum",
        pageNumCurr: "pageNumCurr",
        checkBoxStyle:"styled",
        sortAsc: "sortUp",
        sortDesc: "sortDown",
        notSorted: "sortingNotActive"
    },
    clear: function()
    {
        this.fill();
    },
    
    // метод заполнения
    fill: function(data)
    {
        if(!this.$container || !this.$container.length) return;
        
        this.dataList = dataList(data || []);
        
        var checkBoxer = 
        {
            add: function(obj, colName, id)
            {
                var ch = $('<input/>').attr('type', 'checkbox').attr('name','foto').attr('id', colName).data('key', id).addClass(obj.css.checkBoxStyle);
                (function (obj, colName, id){
                    ch.bind("onSelect", function() {catalog.fn.checkBoxClick(obj, ch, id);});
                })(obj, colName, id);
                
                return ch;
            }
        };
        var $dataPlace = null;
        // заполнение галлереи
        if(this.viewMode == catalog.prototype.viewMode.gallery)
        {
        	this.$container.empty();
            $dataPlace = this.$container.find('ul').empty();
               if(!$dataPlace.length)
                   $dataPlace = $('<ul></ul>');            
               for(var i in this.dataList)
               {
                   var item = this.dataList[i].getValue('Additionals');
                   if(!item) continue;
                   $('<li></li>').html(item).appendTo($dataPlace);
               }
        }
        // заполнение таблицы
        else
        {
            $dataPlace = this.$container.find('#catalogTableContainer');
            var isAllMode = this.appendATotal;
            var $dataPlaceData = null;
            var pagingPlace1 = $dataPlace.find('thead.paging');
            var pagingPlace2 = $dataPlace.find('tfoot.paging');
            var hasRows = this.dataList.length != 0;
            var cols = 0;
            if(!$dataPlace.length)
        	    $dataPlace = $('<table cellpadding="0" cellspacing="0" border="0"></table>').attr('id','catalogTableContainer');
        	$dataPlace.empty();
            //if(!$dataPlace.length)
            //{        
        	    if(!this.photosShowed)
                	$dataPlace.addClass('no-foto');
                
                //$dataPlace.css({'border-collapse':'collapse', 'width':'100%'});
                pagingPlace1 = $('<thead></thead>').appendTo($dataPlace).addClass('paging');
                $dataPlaceData = $('<tbody></tbody>').appendTo($dataPlace);
                pagingPlace2 = $('<tfoot></tfoot>').appendTo($dataPlace).addClass('paging');
            //}
            //else
            //	$dataPlaceData = $dataPlace.find('table');            
            
            $dataPlaceData.empty();
            pagingPlace1.empty();
            pagingPlace2.empty();
            
            //help
            
            $('<td></td>').append($('<div></div>').addClass('div-notice')
                    .text('Вы  можете сортировать автомобили нажатием на заголовок интересующей вас колонки.'))
                    .appendTo($('<tr></tr>').appendTo(pagingPlace1));
            
            // создание пэйджинга
            var paging = null;
            if(this.allowPaging && hasRows)
            {
            	paging = $('<td></td>');
            	var	pagingInfo = $('<td></td>').appendTo($('<tr></tr>').appendTo($('<table></table>').css({'width':'100%'}).appendTo(paging))).css({'text-align':'left'});
            	var	pagingTotal = $('<td></td>').appendTo(paging.find('tr')[0]).css({'text-align':'right'});
            	var pL = parseInt(this.paging.pageCount);
            	if(this.paging.currentPage > 0)
            	{
            		var p = $('<span></span>').text("« Предыдущая");
	                p.addClass(this.css.pageNum);
	                (function (obj, index){
	                    p.bind("click", function() {catalog.fn.pagingClick(obj, index);});
	                })(this, this.paging.currentPage - 1);
	                p.appendTo(pagingInfo);	
            	}
            	
            	var isAddedFirst = false;           	
            	for(var i=0;i<pL;i++)
                {            		
                	if(isAddedFirst)
                    	pagingInfo.append($('<span></span>').text(" | ").addClass(this.css.pageNum));
                                    	
                    var p = $('<span></span>').text(i+1);
                    if(i != this.paging.currentPage)
                    {
                        p.addClass(this.css.pageNum);
                        (function (obj, index){
                            p.bind("click", function() {catalog.fn.pagingClick(obj, index);});
                        })(this, i);
                    }
                    else
                        p.addClass(this.css.pageNumCurr);
                    
                    p.appendTo(pagingInfo);
                    isAddedFirst = true;
                }
            	
            	if(this.paging.currentPage < pL - 1)
            	{
            		var p = $('<span></span>').text("Следующая »");
	                p.addClass(this.css.pageNum);
	                (function (obj, index){
	                    p.bind("click", function() {catalog.fn.pagingClick(obj, index);});
	                })(this, this.paging.currentPage + 1);
	                p.appendTo(pagingInfo);	
            	}
            	
            	pagingTotal.append($('<span></span>').text("Всего записей: ").addClass('pagingTotals'))
            		.append($('<span></span>').text(this.paging.itemsCount || 0));
            	pagingTotal.append($('<select name="value1" class="cat-select-by" onchange=catalogChangePageSize($(this).val());><option>Выводить по</option><option value="20">20</option><option value="50">50</option><option value="100">100</option></select>'));
        		//.append($('<select></select>').text(this.paging.itemsCount || 0));
            	/*var pLDiff = Math.floor((pL - 1) / 2);
            	var p = $('<span></span>').text("<<");
                p.addClass(this.css.pageNum);
                (function (obj, index){
                    p.bind("click", function() {catalog.fn.pagingClick(obj, index);});
                })(this, 0);
                p.appendTo(paging);
                
                if(this.paging.currentPage + 1 > pLDiff + 1)
                	paging.append($('<span></span>').text("..."));
                
                var start = this.paging.currentPage - pLDiff;
                var end = 0;
                if(start < 0)
                {
                	start = 0;
                	end = pL;
                }
                else
                	end = this.paging.currentPage + pLDiff + 1;
                //debugger;
            	for(var i=start;i<end;i++)
                {
            		if(i >= this.paging.pageCount)
            			break;
            		
                    var p = $('<span></span>').text(i+1);
                    if(i != this.paging.currentPage)
                    {
                        p.addClass(this.css.pageNum);
                        (function (obj, index){
                            p.bind("click", function() {catalog.fn.pagingClick(obj, index);});
                        })(this, i);
                    }
                    else
                        p.addClass(this.css.pageNumCurr);
                    
                    p.appendTo(paging);
                }
            	//debugger;
            	if(pL < this.paging.pageCount && this.paging.currentPage + 1 + pLDiff < this.paging.pageCount)
            		paging.append($('<span></span>').text("..."));
            	var p = $('<span></span>').text(">>");
                p.addClass(this.css.pageNum);
                (function (obj, index){
                    p.bind("click", function() {catalog.fn.pagingClick(obj, index);});
                })(this, this.paging.pageCount - 1);
                p.appendTo(paging);*/
                //debugger;
                pagingPlace1.append($('<tr></tr>').append(paging));
                pagingPlace2.append($('<tr></tr>').append(paging.clone(true)));
            }
            
            /*
            <tr>
               <td class="heading active">
   	               <table class="katalog" border="0" cellpadding="0" cellspacing="0">
            */
            
            //создание заголовков в таблице
            var header = $('<thead></thead>').append($('<tr></tr>').addClass(this.css.tableHeaderRow))
            .appendTo($('<table class="katalog" border="0" cellpadding="0" cellspacing="0"></table>').appendTo($('<td></td>').appendTo($('<tr></tr>').appendTo($dataPlaceData))));
            header = header.find('tr');            
            if(this.allowEdit)
            {            
                var link = $('<div class="foto"></div>');
                var ch = checkBoxer.add(this, 'hcheckbox', null);
                link.append(ch).appendTo($('<th></th>').addClass(this.css.tableHeaderCell).data('key', 'checkbox').appendTo(header).css('width','20px'));
            }
            
            for(var i=0;i<this.columns.length;i++)
            {
                var col = this.columns[i];
                //если колонка будет объединятся, то не добавляем для нее заголовок
                if(!col)
                    continue;
                
                var link = $('<div></div>');
                if(col.headerFirstChildClass)
                	link.addClass(col.headerFirstChildClass);
                if(col.colName == 'Image' && this.allowImageChecker && hasRows)
                {
                	var ch = $('<input/>').attr('type', 'checkbox').attr({id:"", name:"foto"}).addClass(this.css.checkBoxStyle); /*'id', col.colName*/
					
					
                	//debugger;
                	ch[0].checked = this.photosShowed;

                	(function(obj, checkBox)
        			{
                    	checkBox.bind('onSelect', function()
            			{
                    		var bFlag = !!checkBox[0].checked;
                			obj.photosShowed = catalog.fn.properties[obj.id].photosShowed = bFlag;
                			//debugger;
                			var table = obj.$container.find('#catalogTableContainer');
                			if(!obj.photosShowed)
                				table.addClass('no-foto');
                			else
                				table.removeClass('no-foto');
                			//obj.find('td').filter('[col='+colName+']').find('p').css({visibility:(bFlag?'visible':'hidden')});
            			});
        			})(this, ch);           	
        			link.append(ch);
                }
                link.append($('<p></p>')/*.css({'white-space': 'nowrap'})*/.html(col.name));
                var colAllowSort = 'undefined' == typeof(col.allowSorting)? true : !!col.allowSorting;
                var $th = $('<th></th>').addClass(this.css.tableHeaderCell)
                    .append(link).attr('key', col.colName).appendTo(header);
                                    
                if(this.allowSorting && colAllowSort)
                {
                	if(hasRows)
                	{
	                    (function (obj, colName){
	                        link.bind("click", function() {catalog.fn.colClick(obj, colName);});
	                    })(this, col.colName);
                	}
                    var sortImg = $('<a>&nbsp;</a>');
                        link.append(sortImg);
                    if(col.colName != this.sort.colName)
                    {
                        $th.addClass(this.css.sortDesc);
                        //$th.addClass(this.css.notSorted);
                    }
                    else
                    {
                    	//debugger;                        
                    	sortImg.addClass('active');
                        if(this.sort.direction == 0)
                            $th.addClass(this.css.sortAsc);
                        else
                            $th.addClass(this.css.sortDesc);
                    }
                }
            }
            
            // создание записей в таблице
            cols = header.find('th').length;
            if(hasRows)
            {
                for(var r in this.dataList)
                {
                    var ahref="viewitem.php?MODE=VIEW&ID="+this.dataList[r].dataKey+"";
                    var tr = $('<tr></tr>');
                    tr.addClass((r%2==0?this.css.tableRow:this.css.tableAltRow));
                    if(this.allowEdit)
                    {
                    	
                        var ch = checkBoxer.add(this, 'checkbox', this.dataList[r].dataKey);
                        $('<td class="ffirst"></td>').append(ch).appendTo(tr);
                    }
                    
                    var isAdminPosition = !!this.dataList[r].isAdminPosition;
                    
                    var isAA = isAllMode && isAdminPosition;
                    var isAAApended = false;
                    for(var c=0;c<this.columns.length;c++)
                    {
                        var col = this.columns[c];
                        if(!col || col.split) continue;                        
                        var placeHolderTd = $("<td></td>").attr('col', col.colName);
                        var cellValue = this.dataList[r].getValue(col.colName);
                        placeHolderTd.html(cellValue);
                        //debugger;
                        if(isAA && !isAAApended)
                        {
                        	placeHolderTd.prepend($('<img src="http://www.avtototal.ru/images/structure/types/typeA.png">'));
                        	isAAApended = true;
                        }
                        if(col.className)
                            placeHolderTd.addClass(col.className);
                        /*if(r == "0")
                        	placeHolderTd.addClass("pimier");*/
                        
                        if(r == "0" && col.colName == 'Image')
                            placeHolderTd.addClass("foto pimier");
                        tr.append(placeHolderTd);
                    }
                    
                    var isSold = this.dataList[r].getValue("IsSold") == "true";
                    var template = null;
                    if(r != "0")
                    {
                        var tmpTD = $("<td></td>");
                        if(isAdminPosition)
                            tmpTD.addClass("active");
                        template = $('<table border="0" cellpadding="0" cellspacing="0" ></table>').addClass('katalog')
                            .appendTo(tmpTD.appendTo($('<tr></tr>').appendTo($dataPlaceData)));
                        if(isSold)
                            tmpTD.addClass("isSold");
                        if (parseInt(r)%2==0){
                         
                         template.addClass('odd-table');
                        }
                    }
                    else
                    {
                        template = header.parent();
                        template.parent().addClass('odd-table')
                        /*template.parent().parent().not(".tableHeaderRow").click(function() {
                            window.location.href=ahref;
                             });*/
                        if(isAdminPosition)
                            template.parent().parent().addClass("active");
                        if(isSold)
                            template.parent().parent().addClass("isSold");
                    }
                    ///template.hover(function(){$(this).addClass('itemActive');}, function(){$(this).removeClass('itemActive')});
                    if(template!=null)
                        template.append(tr);
                }                
            }
            else
            {            	
                var tr = $('<tr></tr>').append($('<td></td>').attr('colSpan', cols).css({'width':'800px'}).append(
                    $('<span></span>').css({'white-space': 'nowrap'}).text(this.noDataMessage))).appendTo(header.parent());                
            }
        }
        if($dataPlace != null)
            this.$container.append($dataPlace);
        
        //if catalog hidden, taking it visible
        if(this.$container.hasClass('hiddenCatalog'))
        {
        	this.$container.css({"display":"inline"});
        	this.$container.removeClass('hiddenCatalog');
        }
        
        if(typeof(CustomControls)=='function')
        CustomControls();
    },
    
    update: function (params, successFunction)
    {
    	//debugger;
    	catalog.fn.updateData(this, params, successFunction);
    },
    
    setColumns: function(columns)
    {
        if(catalog.fn.setColumns(this, columns))
            this.fill(this.dataList);
    },
    
    getKeys: function()
    {
        var actualKeys = [];
        var a = catalog.fn.dataKeys[this.id] || [];
        for(var i in a) { if(a[i]!=null) actualKeys[actualKeys.length] = a[i]; }        
        catalog.fn.dataKeys[this.id] = actualKeys;
        return catalog.fn.dataKeys[this.id];
    }
});

function animateScrollToEl(id)
{
	var destination = $(id).offset().top;
    $("html").animate({ scrollTop: destination}, 1100);	
}

function catalogAddSearch(params)
{	
	var container = $('#catalogSearch');
    var cat = catalog(container);
     
    cat.update(params);
    $('.search-results').css('display','block');
    animateScrollToEl('#catalogSearch');
}

function catalogAddSearchVals()
{

if(!isFormValid($('#searchForm'))) return;

 var filters = $('#searchForm').search().getValues()|| [];
 var prms = [];
 for(var i in filters)
 {
  var f = filters[i];
  if(f)
  {
   prms[prms.length] = {};
   prms[prms.length-1][f.filter] = f.value;
  }
 }
  
 catalogAddSearch(prms);
}

function catalogAddSearchText()
{
 var filters = [{"filterText": $('#searchText').val()}];
 catalogAddSearch(filters);
}

////////////////////////
// Form Validity
////////////////////////

function validator(name, valid, fieldName)
{
	//debugger;
	var validator = {};
	fieldName = fieldName || "";
	valid = valid || "";
    var types = {
        types:{
                regExp: {
                    valueInt:0, 
                    defaultMessages: ["Поле заполнено некорректно", "Значение не соответсвует шаблону "]
                    },
                range:  {
                    valueInt:1,
                    defaultMessages: ["Значение должно лежать в интервале "]
                    },
                notEmpty:{
                    valueInt:2,
                    defaultMessages: ["Обязательное для заполнения поле"]
                    },
                compare:{
                    valueInt:3,
                    defaultMessages: ["Значение должно быть равно "]
                    },
                userFunction:{
                    valueInt:4,
                    defaultMessages: [""]
                    }
            },
        isTypeValid: function(type)
        {
            if(typeof(type)== 'undefined')
                return false;            
            if(typeof(this.types[type])!= 'undefined')
                return true;
            for(var i in this.types)
            {
                if(this.types[i].valueInt==type)
                    return true;
            }
            return false;
        },
        
        getType: function(type)
        {
            if(typeof(this.types[type])!= 'undefined')
                return this.types[type].valueInt;
            return type;
        },
        
        getMessages: function(type)
        {
            type = this.getType(type);
            for(var i in this.types)
            {
                if(this.types[i].valueInt==type)
                {
                    return this.types[i].defaultMessages;
                }
            }
            return [];
        }
    };
    
    validator.allowTypes = types;
    validator.type = validator.allowTypes.getType(name);
    
    if(!validator.allowTypes.isTypeValid(validator.type))
        return null;
    return $.extend({type:'', valid: valid, message:'', errors:[], fieldName:fieldName},
    validator,
    {
        isValid: function(values, msgs)
        {
            var isValid = true;
            msgs = msgs || [];
            var cValidator = null;
            var ms = this.allowTypes.getMessages(this.type);
            if(this.type == this.allowTypes.types.compare.valueInt)
            {   
                for(var i in values)
                {
                    cValidator = this.getValidator(i);
                    if(cValidator!=null && values[i] != cValidator)
                    {
                        isValid = false;                        
                        msgs[msgs.length] = ms[0] + cValidator;
                        break;
                    }
                }
            }
            else if(this.type == this.allowTypes.types.notEmpty.valueInt)
            {
            	//debugger;
                if(values.toString().trim().length == 0)
                {
                	if(fieldName)
                		ms[0] = fieldName + " " + ms[0];
                    msgs[msgs.length] = ms[0];
                    isValid = false;
                }                    
                else
                {
                    for(var i in values)
                    {
                        if(values[i] == '')
                        {
                            isValid = false;                            
                            msgs[msgs.length] = ms[0];
                            break;
                        }
                    }
                }
            }
            if(this.type == this.allowTypes.types.range.valueInt)
            {                
                for(var i in values)
                {
                    cValidator = this.getValidator(i);
                    if(cValidator == null)
                        continue;
                    if(cValidator.length == 2)
                    {
                        if(values[i] < cValidator[0] || values[i] > cValidator[1])
                        {
                            isValid = false;
                            msgs[msgs.length] = ms[0] + 'от ' + cValidator[0] + ' до' + cValidator[1];
                            break;
                        }
                    }
                    else
                    {
                        isValid = true;
                        break;
                    }
                }
            }
            if(this.type == this.allowTypes.types.regExp.valueInt)
            {
            	if(fieldName)
            	{
            		ms[0] = fieldName + " " + ms[0];
            		ms[1] = fieldName + " " + ms[1];
            	}
                for(var i in values)
                {
                    cValidator = this.getValidator(i);                    
                    if(cValidator!=null)
                    {                    	
                        if(!RegExp(cValidator).test(values[i]))
                        {
                            isValid = false;
                            if(this.message == '')
                                msgs[msgs.length] = ms[0];
                            else
                                msgs[msgs.length] = ms[1] + this.message;                            
                            break;
                        }
                    }
                }
                
            }
            if(this.type == this.allowTypes.types.userFunction.valueInt)
            {
                cValidator = this.getValidator(0);  
                // Очевидно что эта функция никогда не использовалась
                if(typeof(cValidator) == 'function')
                {
                    isValid = cValidator(values);
                }
                else if(typeof(cValidator) == 'string') // Позволяет вызвать пользовательскую функцию по ее имени
	            	isValid = window[cValidator](values);
                else isValid = true;
            }
            //Добавить сообщение, если isValid его содержит
            if(typeof(isValid) == "string") {
            	msgs[msgs.length] = isValid;
            	isValid = false;
            }
            
            return isValid;
        },
        
        getValidator: function(index)
        {
            this.valid = this.valid || '';
            var isValidorArray = typeof(this.valid) == 'object';
            if(isValidorArray)
            {
                if(this.valid.length>index)
                    this.valid[index];
                else
                    return null;
            }
            else
                return this.valid;        
        }
    });
}

function doCatalogAction(catId, action, actionIds, additionalParams)
{
 var container = $('#'+catId);
 var cat = catalog(container);
 if(cat.id && actionIds && actionIds.length)
 {
  var params = {};
  params.mode = action;
  params.actionIds = actionIds.join(",");
  $.extend(params, additionalParams || {});  
        $.getJSON(catalogServerFile, params, function (data)
        {
        	//debugger;
            cat.update();
        });  
 }
}

function doGroupAction(obj)
{

 var sender = $(obj);
 var action = sender.attr('action');
 if(sender.get(0).tagName.toLowerCase()=="select")
  action = sender.val(); 
 var senderKey = sender.attr('dataKey');
 var avaibleActions = 
 {
  actions : [{mode:"actionAddCat", page:"catAdd"} ,
             {mode:"actionEditCat", page:"edititem.php?MODE=EDIT&ID="},
             {mode:"actionDeleteCat", needConfirm:true},
             {mode:"actionProlongCat"},
             {mode:"actionDeleteFav", needConfirm:true}],
  check: function (action)
  {
	 if(!action) return null;
	   for(var i in this.actions)
	   {
	    if(this.actions[i] && this.actions[i].mode == action)
	     return this.actions[i];
	   }
	   return null;
  }
 }
 
 var catNameId = "catalog";
 var act = action;
 if(!act)
  act = $("#groupAction").val();
 act = avaibleActions.check(act);
 if(!act) return;
 
 var cat = catalog($('#'+catNameId));
 var keys = [];
 if(senderKey)
  keys[keys.length] = senderKey;  
 else
  keys = cat.getKeys();
 
 var keysNo = keys.length == 0;
 var keysMoreOne = keys.length > 1;
 
 switch(act.mode)
 {
  case "actionAddCat":
  case "actionEditCat":
  {
   // if edit mode
   if(act.mode == "actionEditCat")
   {
    if(keysNo || keysMoreOne)
    {
     alert("Для редактирования необходимо выбрать одну запись!");
     return;
    }
    act.page += keys[0]; 
   }
   window.location.href = act.page;
   break;
  }
  case "actionDeleteCat":
  case "actionProlongCat":
  case "actionDeleteFav":
  {
	  if(keysNo)
	   {
	    alert("Для данного действия необходимо выбрать хотябы одну запись!");
	    return;
	   }
   var additionalParams = {};
   if(act.mode == "actionProlongCat")
    additionalParams.actionPeriod = sender.attr('prolong');
   if(act.needConfirm)
   {
    var dialog = $("#confirmDelete");
    var inited = dialog.attr('inited');
    if(!inited)
    {
     (function(dialog, act, catNameId, keys, additionalParams)
     {
      dialog.find(".Y").bind('click', function(){
       dialog.hide();
       doCatalogAction(catNameId, act.mode, keys, additionalParams);       
       });
      dialog.find(".N").bind('click', function(){
       dialog.hide();
       });
     })(dialog, act, catNameId, keys, additionalParams);
     dialog.attr('inited', true);
    }
    dialog.show();
    return;
   }
   doCatalogAction(catNameId, act.mode, keys, additionalParams);   
  }  
 }
}

function isFormValid(form)
{
    form = $(form);
    els = form.find('[validator]');
    var errs = [];
    var valid = true;
    var vld = null;
    
    for(var i=0;i<els.length;i++)
    {
        //if(!valid)
        //    break;
        var el = $(els[i]);
        if(!el.length) continue;
        var fieldName = form.find("[for="+el.attr('id')+"]").text();
        var vld = validator(el.attr('validator'), el.attr('valid'), fieldName);
        if(vld == null || el[0].disabled)
            continue;
        valid = vld.isValid([el.val()], errs) && valid;        
    }    
    if(!valid && errs.length)
    {
        var errsStr = "";
        for(var i in errs)
        {
            errsStr += errs[i] + "\n";
        }
        alert(errsStr);
    }
    
    
    
    
    return valid;
}
function catalogChangePageSize(size)
{
 var container = $('#catalog');
 var cat = catalog(container);
 cat.paging.pageSize = parseInt(size);
 catalog.fn.properties[cat.id].paging.pageSize = cat.paging.pageSize;
 cat.paging.currentPage = 0; 
 cat.update();
}

/* Проверка формы /additem.php, задача #1399 */
function validatePrice(value) {
	value[0] = parseInt(value[0]);
	if(typeof(value[0]) == "number" && value[0]>30000)
		return true;
	else
		return "Цена не может быть меньше 30000 рублей";	
}

/*
$(function(){

$("body").click(function() {
	$("button").click();
});

});
*/
