/*
Когда-нибудь монах трудолюбивый 
Найдет мой труд, усердный, безымянный, 
Засветит он, как я, свою лампаду - 
И, пыль веков от хартий отряхнув, 
Правдивые сказанья перепишет...
*/
var timeStart = new Date();
var isDown=false;
var mapLoaded=false;
var posX=0; 
var posY=0;
var cur_tool = "zoomin";
var map_link_pre = 'http://www.topplan.ru';
var points_cnt = 0;
var points = new Array();
var userpnts = new Array();
var orders = new Array();
var races = new Array();
var selected_order = '0';
var selected_race = '0';
var order_sort_type = 'all';
var logist_mode = '';
var limits ={"points":{0:60,1:100,2:200,3:400,4:700},"races":{0:5,1:10,2:15,3:20,4:30}};
var mode = 'map';
var user_profile = {"user_access":0,"email":0,"exp_date":0,"msg":0,"uid":0}

function load_races(){
    var region = $('#db_d').val();
    $.post("/map_usr_pnt.php", 
        { region:region,action : 'races_list'},
        function(data){
            $.each(data, function(i, val) {
                if (val != ''){
                    var j = races.length;
                    races[val.id] =new logist_race(parseInt(val.id));
                    races[val.id].setparams(val.volume, val.gnumber,val.dr_nm,val.color,null);
                    races[val.id].show_full = parseInt(val.sh_f);
                    races[val.id].orders = new Array();    
                    races[val.id].store = parseInt(val.store_id);
                }
            });
            display_logist_races_list();
            //show_frames_by_order();        
        }
        ,"json" 
    );
} 
function save_order(){
    var volume = isNaN(parseInt($('#order_volume').val()))?0:parseInt($('#order_volume').val());
    if (volume < 0) {
        volume = volume *(-1);
    }    
    var point_id = $('#order_points_list').val();
    var work_from = $('#order_work_time_from').val();
    var work_to = $('#order_work_time_to').val();
    var race_id = $('#order_races_list').val();
    if (race_id == -1) {
        race_id = null;
    }
    var id = $('#order_cur_id').val();
    if (id!='') { /* редактирование старого заказа */
        var old_race_id = orders[id].race_id; 
        if (old_race_id != null) {
            var inArr = $.inArray(parseInt(id), races[old_race_id].orders); // находим в списке заказов старого рейса id этого заказа 
            races[old_race_id].orders.splice(inArr, 1); // удаляем его
            calc_race_route(old_race_id); // пересчитаем маршрут для старого рейса            
        }
        if (race_id != null) {      
            races[race_id].orders.push(parseInt(id));  // Добавляем в новый список заказов нового рейса
        }  
        orders[id].setparams(volume,point_id,race_id,work_from,work_to);
    } else {  /* Добавление нового заказа*/
        var i = orders.length;
        var new_id = 0;
        var k = 1;
        var total_points = 1;
        if (i>0) {
            $.each(orders, function(i, val) {  
                if (val != undefined) {
                    if (new_id < val.id) {
                      new_id = val.id;
                    }
                    k=0;
                    total_points++;
                }
            });            
            new_id++; 
            new_id-=k; // вот такая хитрость, лучше ничего не придумал :(
        }
        if (limits["points"][user_profile["user_access"]]<total_points) { // Не тестировалось но должно работать
            alert('Вы можете создать не более ' + limits["points"][user_profile["user_access"]] + ' точек доставки.');
        } else {
            orders[new_id] = new logist_order(new_id);
            orders[new_id].setparams(volume,point_id,race_id,work_from,work_to);
            if (race_id != null) {
                races[race_id].orders.push(new_id); /* Добавляем в список заказов рейса новый заказ*/
            }
        }   
    }
    /* Обновим (перерисуем) точки пользователя на карте */
    $("#points_place").html('');
    $.each(userpnts, function(i, val) {     
        val.put();                           
    });  
    show_frames_by_order();//нарисуем рамки
    if (race_id != null) {
        calc_race_route(race_id); // пересчитаем маршрут для рейса
        if (races[race_id].idroute) {
            $("#idroute").val(races[race_id].idroute);
            redraw_map();
        }                        
    }
    display_logist_races_list();    
    display_logist_orders_list();    
}
function save_race(){
    var number = $('#race_number').val();
    var volume = isNaN(parseInt($('#race_volume').val()))?0:parseInt($('#race_volume').val());
    if (volume < 0) {
        volume = volume *(-1);
    }
    var driver_name = $('#race_driver_name').val();
    var color = $('#race_color').val();
    var id = $('#race_cur_id').val();
    var store = $('#race_store').val();    
    var store_change = false;
    var store_change_id = false;    
    
    if (id!='') {
        store_change = (races[id].store != store);
        races[id].setparams(volume,number,driver_name,color,store);
        var rc = races[id];
        if (store_change) {
            calc_race_route(id); // пересчитаем маршрут для рейса
            if (races[id].idroute) {
                $("#idroute").val(races[id].idroute);
                redraw_map();
            }                                
        }
    } else {
        var i = races.length;
        var new_id = 0;
        var k = 1;
        var total_races=1;
        if (i>0) {
            $.each(races, function(i, val) {  
                if (val != undefined) {
                    if (new_id < val.id) {
                        new_id = val.id;
                    }
                    k=0;
                    total_races++;
                }
            });            
            new_id++; 
            new_id-=k; // вот такая хитрость, лучше ничего не придумал :(
        }
        if (limits["races"][user_profile["user_access"]]<total_races) {
            alert('Вы можете создать не более ' + limits["races"][user_profile["user_access"]] + ' рейсов.');
        } else {
            races[new_id] = new logist_race(new_id);
            races[new_id].setparams(volume,number,driver_name,color,store);
            var rc = races[new_id];      
        }
    } 
    if (rc != undefined) {
        var region = $('#db_d').val();
        $.post("/map_usr_pnt.php",  // Запишем рейс в базу 
            { region:region, action:'save_race',id:rc.id,driver_name:rc.driver_name,volume:rc.volume,gnumber:rc.gnumber,color:rc.color,show_full:rc.show_full,store_id:rc.store},
            function(data){
              //display_logist_races_list(); // ??? Нужно оно здесь?
            }
            ,"html" 
        );
    }
}
function delete_race(id){
    if (id!='') {
        $.each(races[id].orders, function(i, val) { // во всех заказах для этого рейса удаляем номер рейса
            if (val != undefined) {
                orders[val].race_id = null;  
            }
        });      
        races[id] = undefined; // удаляем рейс
        selected_race = 0; 
        
        var region = $('#db_d').val();
        // var rc = races[id];
        $.post("/map_usr_pnt.php", 
            { region:region,action:'delete_race',id:id},
            function(data){
             // nop
            }
            ,"html" 
        );
        
    }  
}
function delete_order(id){
    if (id!='') {
        var race_id = orders[id].race_id; 
        if (race_id != null) {
            var inArr = $.inArray(parseInt(id), races[race_id].orders); // находим в списке заказов рейса id этого заказа 
            races[race_id].orders.splice(inArr, 1); // удаляем его
        }
        orders[id] = undefined; // а потом удаляем заказ
        selected_order= 0; 
    }  
}
function logist_order(id) {
    this.id = id;
    this.volume = '';
    this.point_id = '';
    this.race_id = '';    
    this.work_from = '';
    this.work_to = '';

    this.getdbid = function() {
        return this.dbid;
    }

    this.setparams = function(volume,point_id,race_id,work_from,work_to) {
        this.volume    = volume;
        this.point_id  = point_id;
        this.race_id   = race_id;
        this.work_from = work_from;
        this.work_to   = work_to;
    }
}
function logist_race(id) {
    this.id = id;
    this.volume = '';
    this.gnumber = '';
    this.driver_name = '';
    this.color = '';
    this.show_full = '';
    this.orders = new Array();    
    this.distance = 0;
    this.idroute = 0;
    this.route_text = '';
    this.store = null;
    this.setparams = function(volume,gnumber,driver_name,color,store) {
        this.volume      = volume;
        this.gnumber     = gnumber;
        this.driver_name = driver_name;
        this.color       = color;
        this.store       = store;
    }
}

function show_new_order_dialog(cur_order_id){
    $("#add_order_dialog").show();
    $('select#order_points_list option').remove();
    var arr = new Array(); // массив исключаемых тд
    $.each(orders, function(i, val) {  // исключим повторы точек доставки
        if (val != undefined) {
            if (val.point_id!=null) {
                if (val.id != (cur_order_id)) {  // но не станем исключать тд редакт-го заказа
                    arr.push(parseInt(val.point_id));
                }
            }
        }
    });
    //alert(arr[0]+ ' ' + arr[1] + ' ' + arr[2]);    
    var p_cnt = 0;
    $.each(userpnts, function(i, val) {
        if (val != undefined) {
            var inArrPos = $.inArray(parseInt(val.id),arr);
            if ((val.is_store != 1)&&(inArrPos<0)) {  // добавим, но только не склады и не из списка использованных точек  
                $('#order_points_list').append('<option value=\"'+val.id+'\">'+(val.id*1+1)+') '+val.name+' ['+val.addr+ ']</option>');
                p_cnt++;
            }
        }
    });

    $('select#order_races_list option').remove(); 
    $('#order_races_list').append('<option value=\"-1\"> -- выгрузить -- </option>');
    $.each(races, function(i, val) {  // добавим рейсы
        if (val != undefined) {
            $('#order_races_list').append('<option value=\"'+val.id+'\">'+(val.id*1+1)+' ['+val.gnumber+ '] '+val.driver_name+ ' ' + val.volume+'</option>');
        }
    });
    $('#order_volume').focus();
    if (p_cnt < 1) {
        $("#add_order_dialog").hide();
        alert('Нет свободных точек доставки');   
    }    
}
function show_new_race_dialog(){
    $("#add_race_dialog").show();
    $('select#race_store option').remove();      
    $('#race_store').append('<option value=\"-1\"> -- без склада -- </option>');
    $.each(userpnts, function(i, val) {
        if (val.is_store == 1) {  // добавим только склады
            $('#race_store').append('<option value=\"'+val.id+'\">'+val.name+'</option>');
            $('#race_store').val(val.id);
        }   
    });
}
function calc_race_route(race_number){
    if (race_number!=null) {
        if (races[race_number].orders.length > 0){
            var race_route = '';
            $.each(races[race_number].orders, function(i, val) {
                var p = userpnts[orders[val].point_id];
                //race_route+= p.xdig + ',' + p.ydig + ',';
                race_route =  p.xdig + ',' + p.ydig + ',' + race_route ;
            });
            var last_comma = race_route.lastIndexOf(",");                           // позиция последней запятой
            var pre_last_comma = race_route.lastIndexOf(",",last_comma-1);          // позиция предпоследней запятой
            var pre_pre_last_comma = race_route.lastIndexOf(",",pre_last_comma-1);  // позиция предпредпоследней запятой
            var first_comma = race_route.indexOf(",");                              // позиция первой запятой
            var second_comma = race_route.indexOf(",",first_comma+1);               // позиция второй запятой
            var new_race_route = race_route.substr(second_comma+1,(pre_pre_last_comma-second_comma)); // середина
            var new_race_route_end = race_route.substr(pre_pre_last_comma+1,race_route.length - pre_pre_last_comma); // последняя пара xy
            var new_race_route_begin = race_route.substr(0,second_comma+1);              // первая пара xy
            new_race_route = new_race_route_end + new_race_route + new_race_route_begin; // меняем местами первую и последнюю пары XY
            
            var store_id = races[race_number].store
            if (store_id > -1) { //  если для рейса указан склад 
                var p = userpnts[store_id];
                race_route = p.xdig + ',' + p.ydig + ',' + race_route +  p.xdig + ',' + p.ydig; //добавим складскую точку в начало и в конец
            } else {
                race_route = new_race_route;
            }
            var rt = routeByPnt(race_route);
            races[race_number].distance = (rt.total / 1000).toFixed(2); // переводим в км и оставляем 2 знака мантиссы
            races[race_number].idroute = rt.idroute;
            races[race_number].route_text = rt.text;                
                     
        } else { // если маршрут из одной точки (нулевой)
            races[race_number].distance = 0; // переводим в км и оставляем 2 знака мантиссы
            races[race_number].idroute = 0;
            races[race_number].route_text = '';  
        }
    } 
}
function get_logist_order_html(val){
    if (val != undefined) {
        upnt = userpnts[val.point_id];
        if ((val.work_from!='') || (val.work_to!='')) {
            var wf = val.work_from!='' ? val.work_from + ':00': '&hellip;';
            var wt = val.work_to!='' ? val.work_to + ':00': '&hellip;';
            var wtime = wf + ' &mdash; ' + wt;
            var disp_t = 'inline';
        } else {
            var disp_t = 'none';
            var wtime = '';
        }
        var u_disp = 'none';
        var d_disp = 'none';    
        if (order_sort_type == 'byrace'){
            if (selected_race > 0) {
                var posInArr = $.inArray(parseInt(val.id), races[selected_race-1].orders); 
                if (posInArr != 0) { /* Это не первый заказ, покажем стрелку вверх */
                    var u_disp = '';
                }
                if (posInArr != (races[selected_race-1].orders.length-1)) { /* не последний заказ, покажем стрелку вниз */
                    var d_disp = '';
                }        
            }
        }
        var bc = '#DDDDDD';
        if (val.id == selected_order-1) {
            bc = 'red';
        }
        var race_color = 'white';
        var race_id = '';
        if (val.race_id != null) {
            race_color = races[val.race_id].color;
            race_id = (val.race_id*1)+1;
        } 
        return tmpl("order_tpl", {pnt_id:val.point_id*1+1, id:val.id+1,darr_disp:d_disp,uarr_disp:u_disp, volume:val.volume, race_id:race_id, border_color:bc,race_color:race_color, point_name:upnt.name, address:upnt.addr, disp_time: disp_t, work_time:wtime});
    }
}
function display_logist_orders_list(){
    var itm_txt = '';
    $.each(orders, function(i, val) {
        if (val != 'undefined') {
            switch (order_sort_type){
                case 'byrace': // Сортировка по а/м 
                    /* Вынесем этот кусок за switch т.к. заказы идут в порядке добавления в рейс
                    if (val.race_id == (selected_race-1)) {
                        itm_txt = itm_txt + get_logist_order_html(val);
                    }
                    */
                break;
                case 'byprogr': // Показывать только "не разложенные" заказы
                    if (val.race_id == null) {
                        itm_txt =itm_txt + get_logist_order_html(val);
                    }
                break;
                default: // показывать все заказы
                    itm_txt = itm_txt + get_logist_order_html(val);
                break;
            }        
        }
    });
    
    if (order_sort_type == 'byrace') { // Другой порядок сортировки, по а/м 
        if (selected_race > 0) {
            $.each(races[selected_race-1].orders, function(i, val) {
                itm_txt = itm_txt + get_logist_order_html(orders[val]);
            });
        }
    }
    if (itm_txt!='') {
        $('#orders_list').html(itm_txt);
    } else {
        $('#orders_list').html('Нет заказов');
    }
    $("div.order_item_container").click(function(){
        $("#order_item_id"+selected_order).css('border-color','#DDDDDD');
        if (orders[selected_order-1]!= undefined) {
            $('#u_pnt'+orders[selected_order-1].point_id).removeClass('selected');
        }
        selected_order = $(this).children("span.this_order_id").html();   
        $("#order_item_id"+selected_order).css('border-color','red');

        if (orders[selected_order-1]!= undefined) {
            $('#u_pnt'+orders[selected_order-1].point_id).addClass('selected');
        }

    });       
    $("div.order_item_container").dblclick(function(){
        selected_race = orders[selected_order-1].race_id != null ? orders[selected_order-1].race_id*1 + 1: 0;
        display_logist_races_list();
        display_logist_orders_list();
    });
    $("div.order_item_uarr").click(function(){ //Клик на стрелку вверх
        if (selected_race > 0) {
            order_id = $(this).siblings("span.this_order_id").html();   
            var posInArr = $.inArray(order_id-1, races[selected_race-1].orders); 
            var tmp = races[selected_race-1].orders[posInArr];
            races[selected_race-1].orders[posInArr] = races[selected_race-1].orders[posInArr-1];
            races[selected_race-1].orders[posInArr-1] = tmp;
            show_frames_by_order();
            calc_race_route(selected_race-1);                        
            if (races[selected_race-1].idroute) {
                $("#idroute").val(races[selected_race-1].idroute);
                redraw_map();
                display_logist_races_list();
            }                        
            display_logist_orders_list();
        }
        return false
    });       
    $("div.order_item_darr").click(function(){ //Клик на стрелку вниз
        if (selected_race > 0) {
            order_id = $(this).siblings("span.this_order_id").html();   
            var posInArr = $.inArray(order_id-1, races[selected_race-1].orders); 
            var tmp = races[selected_race-1].orders[posInArr];
            races[selected_race-1].orders[posInArr] = races[selected_race-1].orders[posInArr+1];
            races[selected_race-1].orders[posInArr+1] = tmp;
            show_frames_by_order();
            calc_race_route(selected_race-1);                        
            if (races[selected_race-1].idroute) {
                $("#idroute").val(races[selected_race-1].idroute);
                redraw_map();
                display_logist_races_list();
            }                        
            display_logist_orders_list();
        }
        return false
    });       
} 
function get_logist_race_html(val){
    var disp_info = 'none';
    if (val.show_full) {
        disp_info = '';
    }
    var orders_list = '';          
    var load = 0; 
    if (races[val.id] !== undefined) {
        $.each(races[val.id].orders, function(i, val) {
            orders_list = orders_list + ' ' + (orders[val].point_id*1+1);
            load = load + orders[val].volume;
        });
    }
    var bc = '#DDDDDD';
    if (val.id == selected_race-1) {
        bc = 'red';
    }
    var p_color = '#777';          
    var loadm = val.volume;
    var loadp = (load / loadm)*100;
    var ovl = '';
    var dist = val.distance;
    if (loadp > 100) {
        p_color = 'red';
        loadp = 100;
        ovl = 'перегрузка '+(load - loadm)
    }
    return tmpl("race_tpl", {id:val.id+1, load_percent: loadp,percent_color: p_color,overload:ovl, border_color:bc, gnumber:val.gnumber, color:val.color, disp_info:disp_info, driver: val.driver_name, orders:orders_list,load:load,max_load:loadm, distance:dist});  
}  
function display_logist_races_list(){
    var itm_txt = '';
    var total_dist = 0*1;
    $.each(races, function(i, val) {
        if (i < limits["races"][user_profile["user_access"]]) {
            if (val != undefined) {
                itm_txt+= get_logist_race_html(val);                  
                total_dist+=val.distance*1;
            }
        }   
    });
    
    if (itm_txt!='') {
        $('#races_list').html(itm_txt);
    } else {
        $('#races_list').html('Нет автомобилей (рейсов)');
    }
    $('#total_routs_dist').html(total_dist.toFixed(2));
    $("div.race_item_container").click(function(){
        $("#race_item_id"+selected_race).css('border-color','#DDDDDD');
        selected_race = $(this).children("span.this_race_id").html();   
        $("#race_item_id"+selected_race).css('border-color','red');
        if ($(this).children("div.race_item_addon").css('display') == 'none') {
            $(this).children("div.race_item_addon").show();
            races[selected_race-1].show_full = '1'
        } else {
            $(this).children("div.race_item_addon").hide();
            races[selected_race-1].show_full = ''            
        }
        calc_race_route(selected_race-1);
        if (races[selected_race-1].idroute) {
            $("#idroute").val(races[selected_race-1].idroute);
        } else {
            $("#idroute").val(0);
        }
        redraw_map();        
        display_logist_races_list();
        display_logist_orders_list();
        show_frames_by_order();
    });
    $("a.race_distance").click(function(){ //Клик на длину маршрута
        race_id = $(this).siblings("span.this_race_id").html();   
        $("#race_route_text_content").html(races[race_id-1].route_text);
        $("#race_id_dialog_title").html(race_id);
        $("#race_route_text").show();
        return false
    });      
} 
function show_frames_by_order(){ // TODO: преименовать
    if (logist_mode == 'order'){  
        $.each(orders, function(i, val){
            if (val != undefined) {
                if (selected_race > 0) {
                    var pnt_id = val.point_id; 
                    var b_col = races[selected_race-1].color;
                    if (val.race_id == selected_race-1) {
                        $('#u_pnt'+pnt_id).addClass('colored c' + b_col);
                    } else {
                        var inact = $('#u_pnt'+pnt_id).hasClass('inact')? ' inact' : ' ';
                        var selected = $('#u_pnt'+pnt_id).hasClass('selected')? ' selected' : ' ';
                        var edit = $('#u_pnt'+pnt_id).hasClass('edit')? ' edit' : ' ';
                        var colored = $('#u_pnt'+pnt_id).hasClass('colored')? ' colored' : ' ';
                    }           
                }
            }
        });        
    }   
} 

function show_user_pnt(pnt_id){
    $('#usr_pnt_edit').hide();
    $('#usr_pnt_view').show();
    if ($("#logist_mode_selector").css('display') != 'none') {  // если режим логистики
        $('#pnt_edit_store').show();
    } else {
        $('#pnt_edit_store').hide();
    }    
    
    $('#v_point_name').html(userpnts[pnt_id].name);
    if (userpnts[pnt_id].addr) {
        $('#v_point_addr').html(userpnts[pnt_id].addr);
    } else {
        $('#v_point_addr').html('Ручная привязка');
    }
    $('#v_point_memo').html(userpnts[pnt_id].memo);
    if (userpnts[pnt_id].is_store == 1) {
        $('#v_point_is_store').html('да');
    } else {
        $('#v_point_is_store').html('нет');
    }
    $('#v_point_id').html(pnt_id);
    $('#v_point_id2').html(pnt_id*1+1);    
    obj_xx = userpnts[pnt_id].getX();
    obj_yy = userpnts[pnt_id].getY();
    $("#cx_d").val(parseInt(obj_xx));
    $("#cy_d").val(parseInt(obj_yy));
    setTimeout("redraw_map()", 1);
    $("#serach_result_jacket").animate({ scrollTop: 0}, 1100 );
} 
function edit_user_pnt(pnt_id){
    $('#u_pnt'+pnt_id).removeClass("selected");
    $('#usr_pnt_view').hide();
    $('#usr_pnt_edit').show();
    if ($("#logist_mode_selector").css('display') != 'none') {  // если режим логистики
        $('#usr_pnt_edit_store').show();
    } else {
        $('#usr_pnt_edit_store').hide();
    }    
      
    $('#e_point_name').val(userpnts[pnt_id].name);
    if (userpnts[pnt_id].addr) {
        $('#e_point_addr').html(userpnts[pnt_id].addr);
    } else {
        $('#e_point_addr').html('Ручная привязка');
    }
    $('#e_point_memo').val(userpnts[pnt_id].memo);
    if (userpnts[pnt_id].is_store == 1) {
        $('#e_point_is_store').val(1);
    } else {
        $('#e_point_is_store').val(0);
    }
    $('#e_point_id').html(pnt_id);
    $('#e_point_id2').html(pnt_id*1+1);        
    $('#u_pnt'+pnt_id).addClass("edit");
    $("#serach_result_jacket").animate({ scrollTop: 0}, 1100 );    
} 
function edit_user_pnt_cancel(){

    $('#usr_pnt_view').hide();
    $('#usr_pnt_edit').hide();
    var i = $('#e_point_id').html();
    if (i) {
        $('#u_pnt'+i).remove();
        userpnts[i].restorepointpos();
        userpnts[i].put();
        show_frames_by_order();        
    }
} 
function edit_user_pnt_save(){
    var region = $('#db_d').val();
    var pnt_id = $('#e_point_id').html()
    userpnts[pnt_id].setparams( $('#e_point_name').val(),$('#e_point_addr').html(),$('#e_point_memo').val(),userpnts[pnt_id].dbid,$('#e_point_is_store').val());
    var up = userpnts[pnt_id];

    $('#usr_pnt_view').hide();
    $('#usr_pnt_edit').hide();
    $("#map_addrlist_popup").hide();    

    $('#u_pnt'+pnt_id).removeClass("edit");

    $.post("/map_usr_pnt.php", 
        { region:region, action:'save',name:up.name, addr:up.addr, memo:up.memo, is_store:up.is_store, id:up.dbid,x:up.xdig,y:up.ydig},
        function(data){
            display_usr_pnt_list()
        }
        ,"html" 
    );
} 
function edit_user_pnt_delete(){
    var region = $('#db_d').val();
    var pnt_id = $('#e_point_id').html();
    var up = userpnts[pnt_id];
    $.post("/map_usr_pnt.php", 
        { region:region,action:'delete',id:up.dbid},
        function(data){
            //userpnts.splice(pnt_id,1);
            $('#usr_pnt_view').hide();
            $('#usr_pnt_edit').hide();
            $("#u_pnt"+pnt_id).remove();
            //display_usr_pnt_list()
            userpnts = new Array();
            load_usr_pnt_list()
        }
        ,"html" 
    );
} 
function edit_user_pnt_set_xy(xdig,ydig,addr){
    var i = $('#e_point_id').html();
    if (i) {
        $("#map_addrlist_popup").hide();
        $('#u_pnt'+i).remove();
        userpnts[i].setpointpos(xdig,ydig);
        userpnts[i].setaddr(addr);
        $('#e_point_addr').html(addr);// правда не очень красиво здесь вышло
        //edit_user_pnt(i);
        userpnts[i].put();
        show_frames_by_order();                
        $("#cx_d").val(parseInt(xdig));
        $("#cy_d").val(parseInt(ydig));
        setTimeout("redraw_map()", 1);
    }
} 
function display_usr_pnt_list(){
    $("#usr_pnt_list").show();
    var link_txt = '';
    $.each(userpnts, function(i, val) {
        if (i < limits["points"][user_profile["user_access"]]) {
            if (val.xdig<1) {
                link_txt = link_txt + '<div class=\"map_point_list\" style="color:red;">' + (i+1) + '. <a href=\"javascript:;\"  onclick="show_user_pnt('+i+');">'+val.name+'</a></div>';
            } else {
                link_txt = link_txt + '<div class=\"map_point_list\">' + (i+1) + '. <a href=\"javascript:;\"  onclick="show_user_pnt('+i+');">'+val.name+'</a></div>';
            }
        }
    });
    if (link_txt!='') {
        $('#user_points_list').html('<div id="map_point_list_title">Список точек:<div>'+link_txt);
    } else {
        $('#user_points_list').html('Нет точек');
    }
} 
function load_usr_pnt_list(){
    var region = $('#db_d').val();
    $.post("/map_usr_pnt.php", 
        { region:region,action : 'list'},
        function(data){
            $.each(data, function(i, val) {
                if (val != ''){
                    var j = userpnts.length;
                    userpnts.push(new user_point(val.x,val.y,j));
                    userpnts[j].put();
                    userpnts[j].setparams(val.nm,val.addr,val.memo,val.id,val.is_store);
                }
            });
            show_frames_by_order();        
            display_usr_pnt_list();
        }
        ,"json" 
    );
} 

function set_map_mode() {  // установить режим: просто карта, точки пользователя, режим логистики
    switch (mode){
    case 'map':                             
        $('#region_change_tool').val('');
        $('.hide_in_logist').show();
        $('.hide_in_map').hide();
        $("#mode_logist").css('background-color','#fff');
        $("#my_obj").css('background-color','#fff');
        right_col_hide();
        left_col_hide();
        $('#import_export_buttons').hide();
    break;
    case 'u_obj':
        if ($("#logout_label").css('display')=='none') {
            $('#map_login_popup').show();
        } else {
            $("#result_list_id").html('');
            left_col_show();
            userpnts = [];
            load_usr_pnt_list()
            //$("#my_obj").hide();
            $("#point").css('display','block');
            $("#pnt_add_new_btn").show();
            display_usr_pnt_list();
            //$("#mode_logist").show();
            //set_unload_alert();
            
            $("#my_obj").css('background-color','#aaa');
            
            right_col_hide();
            $("#logist_mode_selector").hide();
            $("#mode_logist").css('background-color','#fff');
            $("#add_order_btn").hide();
            $("#edit_order_btn").hide();      
            //$("#export_excel_holder").hide();   
        }
                            
    break;
    case 'logist':
        if ($("#logout_label").css('display')=='none') {
            $('#map_login_popup').show();
        } else { 

            $('#region_change_tool').val('logist');
            $('#import_export_buttons').show();
            $("#my_obj").css('background-color','#fff');    
            $("#pnt_add_new_btn").hide();
            $("#logist_mode_selector").show();
            $('.hide_in_logist').hide();
            $('.hide_in_map').show();
            $("#mode_logist").css('background-color','#aaa');
            $("#add_order_btn").show(); 
            $("#edit_order_btn").show();
            $("#point").css('display','block');
            if (races.length <1)  {
                load_races();
            }
            userpnts = [];
            load_usr_pnt_list();
            display_usr_pnt_list()
            set_logist_mode('points');
            right_col_show();
            left_col_show();
        }
    break;
    }
}

function do_addr_search() {
    var street = $('#map_addr_edit').val();
    if (street.length > 2) {
        var region = $('#db_d').val();
        var link_txt  = '';
        $.post("/route.php", 
        { region:region, street: street, house:'', block:''},
        function(data){
            $.each(data, function(i, val) {
                if (val.id != 0) {
                    if (data.length == 1) {
                        var xy_arr = val.id.split(',',2)  
                        edit_user_pnt_set_xy(xy_arr[0],xy_arr[1],val.nm);
                    }
                    if (val.dis) {
                        link_txt = link_txt + '<a href=\"javascript:;\" onclick="edit_user_pnt_set_xy('+val.id+',\''+val.nm+'\');">'+val.dis+' '+val.nm+'</a><br>';
                    } else {
                        link_txt = link_txt + '<a href=\"javascript:;\" onclick="edit_user_pnt_set_xy('+val.id+',\''+val.nm+'\');">'+val.nm+'</a><br>';
                    }
                } else {
                    link_txt = 'Искомая комбинация на карте не встречается<br>';
                }
            });
            $('#map_addr_find_result').html('Результаты поиска:<br>' + link_txt);
        }
        ,"json" 
        );
    }
}
function get_user_auth(){
    var region = $('#db_d').val();
    var r = false;
    $.ajax({
        async: false,
        cache: false,
        type: "POST",
        dataType: "json",
        url: "/map_usr_pnt.php",
        data: {region:region,action : 'getauth'},
        success: function(data){
            
            if (data['msg']=='') {
                r = true;
                user_profile = data; 
                if (data['user_access'] == '-1') {
                    user_profile['user_access'] = 0;
                    $('#logist_profile').click();
                }                
            }
        }
    });
    return r
} 
function prepare_route_pnts (pnts) {
  /* Подготовим список координат для передачи
     Порядок точек такой X1,X1, Xn,Yn, Xn-1,Yn-1, .. X2,Y2 
  */
    var route = pnts[1].xdig + ',' + pnts[1].ydig + ',';
    var p_cnt = pnts.length-2;
    for (i=1; i<p_cnt;i++) {
        route = route + pnts[2+(p_cnt-i)].xdig + ',' + pnts[2+(p_cnt-i)].ydig + ',';
    }
    route = route + pnts[2].xdig + ',' + pnts[2].ydig;
    return route
}
function routeByPnt(route) {
    var region = $('#db_d').val();
    var result = new Object();
    result.text = '';
    $.ajax({
        async: false,
        cache: false,
        type: "POST",
        dataType: "json",
        url:"/map_tj.php", 
        data:{ addroute: route, db : region },
        success: function(data){
        $.each(data, function(i, val) {
            if (val.nm !== undefined) {
                if (i == (data.length - 1)) {
                    result.text+='<b>' + val.nm+'</b><br>';
                } else {
                    result.text+=val.nm+'<br>';
                }
            }
        });
        //alert(data[data.length-2].lxdig);
        var map_params = data[data.length-2];
        lxdig = map_params.lxdig;
        bydig = map_params.bydig;
        rxdig = map_params.rxdig;
        tydig = map_params.tydig;
        result.total = map_params.total;
        result.idroute = parseInt(data[data.length-2].routeid4opera);
        //alert(route + ' resp: ' + data[data.length-2].routeid4opera + ' ; ' + result.idroute);        
        result.cx_dig = Math.floor(((rxdig - lxdig)/2) + (1*lxdig));
        result.cy_dig = Math.floor(((tydig - bydig)/2) + (1*bydig));
        result.sc_dig = Math.max( ((tydig - bydig)/400),((rxdig - lxdig)/600) );
        }
    });
    return result
  }
function route_point(x,y,id) {
    this.xdig = x;
    this.ydig = y;
    this.id = id;

    this.setpointpos = function(new_x,new_y) {
        this.xdig = new_x;
        this.ydig = new_y;
    }

    this.put = function() {
        var cxd  = parseInt($("#cx_d").val()); 
        var cyd  = parseInt($("#cy_d").val());
        var scd  = parseFloat($("#sc_d").val());
        var mapw = parseInt($("#map_w").val());
        var maph = parseInt($("#map_h").val());

        var Xpx = parseInt((mapw/2) + (( this.xdig - cxd)/scd))-16; 
        var Ypx = parseInt((maph/2) + (( this.ydig - cyd)/scd))-(-5); 
        var atmpic = '/images/map/map_route_'+this.id+'.gif';
        $('#points_place').append("<img id='r_pnt"+this.id+"' class='routepnt' style='position:absolute; z-index:5; left:"+Xpx+"px;bottom:"+Ypx+"px;' src='" + atmpic + "'>");
        var img_pos_x = findPosX(document.getElementById("im_container"));
        var img_pos_y = findPosY(document.getElementById("im_container"));
        var pnt_n = this.id;
        $('#r_pnt'+pnt_n).bind('drag',function( event ){
            $( this ).css({
                top: event.offsetY-img_pos_y,
                left: event.offsetX-img_pos_x
            });
        })
        .bind('dragend',function( event ){
            var scroll = Math.max(document.documentElement.scrollTop,document.body.scrollTop );  // !!! NB !!! only for G.chrome copatibility
            var posX2 = event.offsetX - img_pos_x + (16*1) ;
            var posY2 = event.offsetY - img_pos_y + (35*1) ;
            var mapw = parseInt($("#map_w").val());
            var maph = parseInt($("#map_h").val());
            var cx_dig = $("#cx_d").val();
            var cy_dig = $("#cy_d").val();
            var sc_dig = $("#sc_d").val();

            var Xdig = parseInt((posX2 - (mapw/2))*sc_dig); 
            var Ydig = parseInt(((maph-posY2) - (maph/2))*sc_dig); 
            Xdig = parseInt(-Xdig - cx_dig)*(-1);
            Ydig = parseInt(-Ydig - cy_dig)*(-1);

            points[pnt_n].setpointpos(Xdig,Ydig);
            if (points_cnt > 1) {
                $('.close_route_btn').show();
                set_cursor('wait');
                var rt = routeByPnt(prepare_route_pnts(points));
                $('#result_list_id').html('Маршрут:<br><br>' + rt.text );
                if($("#idroute").val() === '') {
                    $("#cx_d").val(rt.cx_dig);
                    $("#cy_d").val(rt.cy_dig);
                    $("#sc_d").val(rt.sc_dig);
                }   
                $("#idroute").val(rt.idroute);
                left_col_show();  // !!! ???
                redraw_map();
                //tool_click('move');            
            }
        });
    }
}
function user_point(x,y,id) {
    this.xdig = x;
    this.ydig = y;
    this.id = id;
    this.name = '';
    this.addr = '';
    this.memo = '';
    this.is_store = 0;    
    this.dbid = '';
    this.oldxdig = x;
    this.oldydig = y;
    this.oldaddr = '';

    this.setpointpos = function(new_x,new_y) {
        this.oldxdig = this.xdig;
        this.oldydig = this.ydig;
        this.xdig = new_x;
        this.ydig = new_y;
    }
    this.restorepointpos = function() {
        this.xdig = this.oldxdig;
        this.ydig = this.oldydig;
        this.addr = this.oldaddr;
    }
    this.getdbid = function() {
        return this.dbid;
    }
    this.getX = function() {
        return this.xdig;
    }
    this.getY = function() {
        return this.ydig;
    }
    this.setparams = function(name,addr,memo,dbid,is_store) {
        this.name = name;
        this.addr = addr;
        this.memo = memo;
        this.is_store = is_store;
        this.dbid = dbid;
    }
    this.setaddr = function(addr) {
        this.oldaddr = this.addr;
        this.addr = addr;
    }

    this.put = function() {
        var cxd  = parseInt($("#cx_d").val()); 
        var cyd  = parseInt($("#cy_d").val());
        var scd  = parseFloat($("#sc_d").val());
        var mapw = parseInt($("#map_w").val());
        var maph = parseInt($("#map_h").val());

        var Xpx = parseInt((mapw/2) + (( this.xdig - cxd)/scd))-14; 
        var Ypx = parseInt((maph/2) + (( this.ydig - cyd)/scd))-(-3); 
        if (logist_mode == 'order') { // на экране заказы
            var vol = '';
            var unpt_state_class = '';
            var upid = this.id;
            $.each(orders, function(i, val) {
                if (val != undefined) {
                    if (val.point_id == upid) {
                        vol = val.volume;
                        if (val.race_id != null) {
                            var b_col = races[val.race_id].color;
                            unpt_state_class = 'colored c' + b_col;//'userpnt_act';
                        } else {
                            //unpt_state_class = 'colored inact';//'userpnt_inact';
                            unpt_state_class = 'colored';//'userpnt_inact';
                        }
                    } 
                }
            });
            
            if (this.is_store != 0) {
                    unpt_state_class = 'store';
            }
            
            var is_select = '';
            if (orders[selected_order-1]!= undefined) {
                if (orders[selected_order-1].point_id == this.id) {
                    is_select = ' selected';
                }
            }             
            if (unpt_state_class !='') {
                if (unpt_state_class !='store') {
                    $('#points_place').append("<div style='left:"+Xpx+"px; bottom:"+Ypx+"px;' class='userpnt "+unpt_state_class+is_select +"' id='u_pnt"+upid+"'><div class='userpnt_main'><span class='userpnt_frame'></span><span class='userpnt_body'>"+(upid+1)+"</span><span class='userpnt_body_mass'>"+vol+"</span></div></div>");
                } else {
                    $('#points_place').append("<div style='left:"+Xpx+"px; bottom:"+Ypx+"px;' class='userpnt colored store' id='u_pnt"+upid+"'><div class='userpnt_main store'><span class='userpnt_frame store'></span><span class='userpnt_body'>"+"</span><span class='userpnt_body_mass'> </span></div></div>");
                }                
            }
        } else { // на экране просто точки доставки
            if (this.is_store != 0) { // тут класс store напихан куда попало, можно оставить только рядом с userpnt_main но надо CSS править
                var st = "<div style='left:"+Xpx+"px; bottom:"+Ypx+"px;' class='userpnt colored store' id='u_pnt"+this.id+"'><div class='userpnt_main store'><span class='userpnt_frame store'></span><span class='userpnt_body'>"+(this.id+1)+"</span><span class='userpnt_body_mass'></span></div></div>";
            } else {
                var st = "<div style='left:"+Xpx+"px; bottom:"+Ypx+"px;' class='userpnt colored ' id='u_pnt"+this.id+"'><div class='userpnt_main'><span class='userpnt_frame'></span><span class='userpnt_body'>"+(this.id+1)+"</span><span class='userpnt_body_mass'></span></div></div>";
            }
            $('#points_place').append(st);
        }      
        var img_pos_x = findPosX(document.getElementById("im_container"));
        var img_pos_y = findPosY(document.getElementById("im_container"));
        var pnt_n = this.id;
        
        $('#u_pnt'+pnt_n)
        .bind('click',function( event ){
            if (logist_mode == 'order') { // Добавление т.д. в рейс по клику
                var order_id = 0;   
                $.each(orders, function(i, val) {  //Найдем id заказа по id точки доставки
                    if (val.point_id == pnt_n) {
                        order_id = val.id;   
                    }
                });            
                if (orders[order_id]!= null) { // если такой заказ в самом деле нашелся
                    if (selected_race > 0) {
                        if (orders[order_id].race_id == null) { // и если этому заказу не назначен рейс
                            races[selected_race-1].orders.push(order_id);
                            orders[order_id].race_id = selected_race-1;
                            $("#points_place").html('');
                            $.each(userpnts, function(i, val) { // Обновим (перерисуем) точки пользователя на карте 
                                val.put();                           
                            });                           
                            show_frames_by_order();
                            calc_race_route(selected_race-1);                        
                            if (races[selected_race-1].idroute) {
                                $("#idroute").val(races[selected_race-1].idroute);
                                redraw_map();
                                display_logist_races_list();
                            }                        
                            display_logist_orders_list();
                        }
                    } else {  // а тут клик по заказу выбирает заказ в списке         
                        $("#order_item_id"+selected_order).css('border-color','#DDDDDD');
                        if (orders[selected_order-1]!= undefined) {
                            $('#u_pnt'+orders[selected_order-1].point_id).removeClass('selected');
                        }
                        selected_order = order_id*1+1;   
                        $("#order_item_id"+selected_order).css('border-color','red');
                        if (orders[selected_order-1]!= undefined) {
                            $('#u_pnt'+orders[selected_order-1].point_id).addClass('selected');
                        }                
                    }
                }
            } else { //иначе ред-е по клику
                if($('#usr_pnt_edit').css('display')=='none') {  //если не редактируем
                    show_user_pnt(pnt_n);
                }            
            }
        })
        .bind('dblclick',function( event ){
            if (logist_mode == 'order') { 
                var order_id = 0;   
                $.each(orders, function(i, val) {  //Найдем id заказа по id точки доставки
                    if (val.point_id == pnt_n) {
                        order_id = val.id;   
                    }
                });            
                if (orders[order_id]!= null) { // если такой заказ в самом деле нашелся
                    var race_id = orders[order_id].race_id; 
                    if (race_id != null) { // и если этому заказу назначен рейс
                        
                        var inArr = $.inArray(parseInt(order_id), races[race_id].orders); // находим в списке заказов рейса id этого заказа 
                        races[race_id].orders.splice(inArr, 1); // удаляем его
                        calc_race_route(race_id); // пересчитаем маршрут для рейса            

                        $("#idroute").val(races[race_id].idroute); // установим новый айди маршрута и перерисуем карту
                        redraw_map();
                        display_logist_races_list();
                        
                        orders[order_id].race_id = null;
                        display_logist_orders_list();

                        $("#points_place").html('');
                        $.each(userpnts, function(i, val) { // Обновим (перерисуем) точки пользователя на карте 
                            val.put();                           
                        });                           
                        show_frames_by_order();
                           
                    }
                }
            }
        })
        .bind('drag',function( event ){
            if ((logist_mode == 'points')||(mode == 'u_obj')) {
                if($('#usr_pnt_edit').css('display')!='none') {  // если реж ред. точки
                    if ($('#e_point_id').html() == pnt_n) {  // Только если двинули тек. точку
                        $( this ).css({
                            top: event.offsetY-img_pos_y,
                            left: event.offsetX-img_pos_x
                        });
                    }
                }    
            }
        })
        .bind('dragend',function( event ){
            if ((logist_mode == 'points')||(mode == 'u_obj')) {
                if($('#usr_pnt_edit').css('display')!='none') {    //если редактируем
                    if ($('#e_point_id').html() == pnt_n) {        //эту точку
                        var scroll = Math.max(document.documentElement.scrollTop,document.body.scrollTop );  // !!! NB !!! only for G.chrome copatibility
                        var posX2 = event.offsetX - img_pos_x + (14*1) ;
                        var posY2 = event.offsetY - img_pos_y + (33*1) ;
                        var mapw = parseInt($("#map_w").val());
                        var maph = parseInt($("#map_h").val());
                        var cx_dig = $("#cx_d").val();
                        var cy_dig = $("#cy_d").val();
                        var sc_dig = $("#sc_d").val();

                        var Xdig = parseInt((posX2 - (mapw/2))*sc_dig); 
                        var Ydig = parseInt(((maph-posY2) - (maph/2))*sc_dig); 
                        Xdig = parseInt(-Xdig - cx_dig)*(-1);
                        Ydig = parseInt(-Ydig - cy_dig)*(-1);
                        userpnts[pnt_n].setpointpos(Xdig,Ydig);
                        userpnts[pnt_n].setaddr('');
                    }
                }
            }   
        });
        
        if (logist_mode != 'order') { //на экране просто точки доставки
            if($('#usr_pnt_edit').css('display')!='none') {  //если редактируем 
                if ($('#e_point_id').html() == pnt_n) {        //именно эту точку
                    $('#u_pnt'+pnt_n).addClass("selected");
                }
            }
            if($('#usr_pnt_view').css('display')!='none') {  //если просматриваем инфо 
                if ($('#v_point_id').html() == pnt_n) {        //именно этой точки
                    $('#u_pnt'+pnt_n).addClass("selected");
                }
            }
        }
    }
}
function scroll_to_map(){
    destination = $("#zoomin").offset().top;
    $("body").animate({ scrollTop: destination}, 1100 );
    return false;
}
     
function register_autouser(){
    $.post("/map_usr_pnt.php", 
        { email:'', password:'', action : 'registeruser'},
        function(data){
            $("#map_register_btn").css('background-color','#aaa');
            if (data['msg']=='') {
                user_profile = data;
            }
        }
        ,"json" 
    );
}
     
function autologon(){  // Генерация точек доставки, заказов, рейсов, прокладка маршрута для демо режима
        /*
        Прямо скажу, я не горжусь этой функцией, надо бы конечно сделать все по нормальному и подгружать точки доставки и рейсы из бызы, но...
        */
        
        mode ='logist';
        $('#logout_label').show();
        set_map_mode(); 
        $('#logout_label').hide();
        set_logist_mode('order');
        
        races[0] =new logist_race(0);
        races[0].setparams(2000, 'A782TX78','Петров',"ff7306",null);
        races[0].show_full = 1;
        races[0].orders = new Array(4,5,6);    
        races[0].store = 8;

        races[1] =new logist_race(1);
        races[1].setparams(2000, 'А555МР78','Иванов',"6b2207",null);
        races[1].show_full = 1;
        races[1].orders = new Array(2,1,0,3);    
        races[1].store =  1;
        
        races[2] =new logist_race(2);
        races[2].setparams(2000, 'B123TС78','Иванов',"61d308",null);
        races[2].show_full = 1;
        races[2].orders = new Array();    
        races[2].store = -1;        
        var region_db = $('#db_d').val();
        if ((region_db == 'spb') || (region_db == 'spblo')) {   
            userpnts.push(new user_point(1198000,1376239,0));
            userpnts.push(new user_point(1203437,1403183,1));
            userpnts.push(new user_point(1208158,1383713,2));        
            userpnts.push(new user_point(1206418,1377786,3));        
            userpnts.push(new user_point(1212928,1400132,4));        
            userpnts.push(new user_point(1188816,1371480,5));        
            userpnts.push(new user_point(1192949,1378177,6));        
            userpnts.push(new user_point(1188214,1383879,7));        
            userpnts.push(new user_point(1172841,1363733,8));        
          
          //                      val.nm  ,val.addr     ,val.memo,val.id,val.is_store);
            userpnts[0].setparams('Невский 96','Невский 128',''      ,0     ,0);
            userpnts[1].setparams('Главный склад','Ручная привязка',''  ,1     ,1);
            userpnts[2].setparams('Маг. 3','Ручная привязка',''  ,2     ,0);
            userpnts[3].setparams('Невский 129','пр. Невский 129',''  ,3     ,0);
            userpnts[4].setparams('Апрельская 5','ул. Апрельская 5','' ,4     ,0);
            userpnts[5].setparams('Фонтанка 90','Ручная привязка',''  ,5     ,0);
            userpnts[6].setparams('Некрасова 7','Ручная привязка',''  ,6     ,0);
            userpnts[7].setparams('Аптекарский 3','Ручная привязка',''  ,7     ,0);
            userpnts[8].setparams('Склад №2','Ручная привязка',''  ,8     ,1);
            
        } else if ((region_db == 'moscow') || (region_db == 'moscowmo'))  {    
            userpnts.push(new user_point(1922274,1364787,0));
            userpnts.push(new user_point(1969182,1337980,1));
            userpnts.push(new user_point(1932431,1338048,2));        
            userpnts.push(new user_point(1934826,1355188,3));        
            userpnts.push(new user_point(1903856,1363618,4));        
            userpnts.push(new user_point(1924094,1384410,5));        
            userpnts.push(new user_point(1954510,1375246,6));        
            userpnts.push(new user_point(1954968,1378333,7));        
            userpnts.push(new user_point(1961599,1366311,8));        
          
          //                      val.nm  ,val.addr     ,val.memo,val.id,val.is_store);
            userpnts[0].setparams('Новый Арбат 10','ул. Новый Арбат 10',''      ,0     ,0);
            userpnts[1].setparams('Главный склад','3 Угрешский проезд 9',''  ,1     ,1);
            userpnts[2].setparams('Маг. 3','ул. Шухова 9',''  ,2     ,0);
            userpnts[3].setparams('Пыжевский 7','пер. Пыжевский 7',''  ,3     ,0);
            userpnts[4].setparams('Пресня','Ручная привязка','' ,4     ,0);
            userpnts[5].setparams('Новослободская','Ручная привязка',''  ,5     ,0);
            userpnts[6].setparams('Радио 7','Ручная привязка',''  ,6     ,0);
            userpnts[7].setparams('Аптекарский 7','пер. Аптекарский 7',''  ,7     ,0);
            userpnts[8].setparams('Склад №2','Ручная привязка',''  ,8     ,1);        
        }   
        
        show_frames_by_order();        
        display_usr_pnt_list();
    
        orders[0] = new logist_order(0);
        orders[1] = new logist_order(1);
        orders[2] = new logist_order(2);
        orders[3] = new logist_order(3);
        orders[4] = new logist_order(4);
        orders[5] = new logist_order(5);
        orders[6] = new logist_order(6);
                          //volume,point_id,race_id,work_from,work_to);
        orders[0].setparams(   100,       0,      1,       10,     15);
        orders[1].setparams(    50,       2,      1,       12,     18);
        orders[2].setparams(   150,       3,      1,       10,     19);
        orders[3].setparams(   400,       4,      1,        8,     12);
        orders[4].setparams(   120,       5,      0,       16,     21);
        orders[5].setparams(    10,       6,      0,       18,     22);
        orders[6].setparams(    40,       7,      0,       12,     14);

        /* Обновим (перерисуем) точки пользователя на карте */
        $("#points_place").html('');
        $.each(userpnts, function(i, val) {     
            val.put();                           
        });  
        
        selected_race = 1;
        calc_race_route(selected_race-1);
        if (races[selected_race-1].idroute) {
            $("#idroute").val(races[selected_race-1].idroute);
        } else {
            $("#idroute").val(0);
        }
        
        if ((region_db == 'spb') || (region_db == 'spblo'))  {   
            $("#cx_d").val(1182110);
            $("#cy_d").val(1373193);
            $("#sc_d").val(68);
        } else if ((region_db == 'moscow') || (region_db == 'moscowmo')){
            $("#cx_d").val(1922274);
            $("#cy_d").val(1364787);
            $("#sc_d").val(136);        
        }
        redraw_map();
        
        show_frames_by_order();//нарисуем рамки

        display_logist_races_list();    
        display_logist_orders_list();
        $('#map_login_popup').show();
        $('#logout_label').show();
        tool_click('move');
    
}     
$(document).ready(function() {

    $('#export_excel_link').click(function() {
        $('#excel_form').submit();
    });
    $('#excel_form').submit(function() {
        /* Точки доставки */
        $('#excel_form_div').html('');
        $('#excel_form_div').append('<input type="hidden" name="0point0" value="№">');
        $('#excel_form_div').append('<input type="hidden" name="1point0" value="Название">');
        $('#excel_form_div').append('<input type="hidden" name="2point0" value="Адрес">');
        $('#excel_form_div').append('<input type="hidden" name="3point0" value="Примечание">');
        $('#excel_form_div').append('<input type="hidden" name="4point0" value="склад">');        
        $.each(userpnts, function(i, val) {
            if (i < limits["points"][user_profile["user_access"]]) {
                var j = i*1+1;
                var memo = (val.memo != '1')? memo = val.memo : '';
                var is_store = (val.is_store == '1')? is_store = 'Да': '';                   
                $('#excel_form_div').append('<input type="hidden" name="0point' + j + '" value="' + (val.id*1+1) + '">');
                $('#excel_form_div').append('<input type="hidden" name="1point' + j + '" value="' + val.name + '">');
                $('#excel_form_div').append('<input type="hidden" name="2point' + j + '" value="' + val.addr + '">');
                $('#excel_form_div').append('<input type="hidden" name="3point' + j + '" value="' + memo + '">');
                $('#excel_form_div').append('<input type="hidden" name="4point' + j + '" value="' + is_store + '">');                
            }
        });  
        /* Заказы */
        $('#excel_form_div').append('<input type="hidden" name="0order0" value="№">');
        $('#excel_form_div').append('<input type="hidden" name="1order0" value="Загрузка">');
        $('#excel_form_div').append('<input type="hidden" name="2order0" value="№ точки доставки">');
        $('#excel_form_div').append('<input type="hidden" name="3order0" value="Название">');
        $('#excel_form_div').append('<input type="hidden" name="4order0" value="Адрес">');        
        $('#excel_form_div').append('<input type="hidden" name="5order0" value="№ рейса">');
        $('#excel_form_div').append('<input type="hidden" name="6order0" value="Время доставки С">');
        $('#excel_form_div').append('<input type="hidden" name="7order0" value="До">');

        $.each(orders, function(i, val) {
            if (val != undefined) {
                var j = i*1+1;
                var race_id = (val.race_id != null) ? (val.race_id*1+1) : '';                 
                var work_from = (val.work_from != '') ? val.work_from+':00' : '';
                var work_to = (val.work_to != '') ? val.work_to+':00' : '';
                var p_name = (val.point_id != null) ? userpnts[val.point_id].name : '';
                var p_addr = (val.point_id != null) ? userpnts[val.point_id].addr : '';                
                
                $('#excel_form_div').append('<input type="hidden" name="0order' + j + '" value="' + (val.id*1+1) + '">');
                $('#excel_form_div').append('<input type="hidden" name="1order' + j + '" value="' + val.volume+ '">');
                $('#excel_form_div').append('<input type="hidden" name="2order' + j + '" value="' + (val.point_id*1+1) + '">');
                $('#excel_form_div').append('<input type="hidden" name="3order' + j + '" value="' +  p_name + '">');
                $('#excel_form_div').append('<input type="hidden" name="4order' + j + '" value="' +  p_addr + '">');                
                $('#excel_form_div').append('<input type="hidden" name="5order' + j + '" value="' + race_id + '">');
                $('#excel_form_div').append('<input type="hidden" name="6order' + j + '" value="' + work_from+ '">');
                $('#excel_form_div').append('<input type="hidden" name="7order' + j + '" value="' + work_to+ '">');
            }
        });  
        /* Рейсы */        
        $('#excel_form_div').append('<input type="hidden" name="0race0" value="№">');
        $('#excel_form_div').append('<input type="hidden" name="1race0" value="Загрузка">');
        $('#excel_form_div').append('<input type="hidden" name="2race0" value="гос.№">');
        $('#excel_form_div').append('<input type="hidden" name="3race0" value="Водитель">');
        $('#excel_form_div').append('<input type="hidden" name="4race0" value="Заказы">');                
        $('#excel_form_div').append('<input type="hidden" name="5race0" value="Маршрут">');
        $.each(races, function(i, val) {
            if (i < limits["races"][user_profile["user_access"]]) {
                if (val != undefined) {
                    var j = i*1+1;
                    var orders_list = '';
                    $.each(val.orders, function(i, val) {
                        orders_list = orders_list + ' ' + (orders[val].point_id*1+1);
                    });                                        
                    $('#excel_form_div').append('<input type="hidden" name="0race' + j + '" value="' + (val.id*1+1) + '">');
                    $('#excel_form_div').append('<input type="hidden" name="1race' + j + '" value="' + val.volume + '">');
                    $('#excel_form_div').append('<input type="hidden" name="2race' + j + '" value="' + val.gnumber + '">');
                    $('#excel_form_div').append('<input type="hidden" name="3race' + j + '" value="' + val.driver_name + '">');
                    $('#excel_form_div').append('<input type="hidden" name="5race' + j + '" value="' + val.distance + '">');
                    $('#excel_form_div').append('<input type="hidden" name="4race' + j + '" value="' + orders_list + '">');                    
                }
            }   
        });
        //return false;
    });

    $("#order_sort_all_btn").click(function(){
        order_sort_type = 'all';  
        //display_logist_races_list();//
        $("#order_sort_all_btn").css('background-color','#ccc');
        $("#order_sort_byrace_btn").css('background-color','#eee'); 
        $("#order_sort_byprogr_btn").css('background-color','#eee');    
        display_logist_orders_list(); 
    });
    $("#order_sort_byrace_btn").click(function(){
        order_sort_type = 'byrace';    
        //display_logist_races_list();//
        $("#order_sort_all_btn").css('background-color','#eee');
        $("#order_sort_byrace_btn").css('background-color','#ccc'); 
        $("#order_sort_byprogr_btn").css('background-color','#eee');    
        display_logist_orders_list(); 
    });
    $("#order_sort_byprogr_btn").click(function(){
        order_sort_type = 'byprogr';    
        //display_logist_races_list();//
        $("#order_sort_all_btn").css('background-color','#eee');
        $("#order_sort_byrace_btn").css('background-color','#eee'); 
        $("#order_sort_byprogr_btn").css('background-color','#ccc');    
        display_logist_orders_list(); 
    });

    $("#map_login_btn").click( function(){ // кнопка в окне авторизации
        var um = $("#map_login_u").val();
        var pw = $("#map_login_p").val();
        $("#map_login_btn").css('background-color','#eee');
        $("#idroute").val(0);
        
        $.post("/map_usr_pnt.php", 
            { email:um, password:pw,action : 'logon'},
            function(data){
                $("#map_login_btn").css('background-color','#aaa');
                if (data['msg']=='') {
                    user_profile = data;
                    $("#logout_label").show();
                    $('#map_login_popup').hide();
                    $("#map_login_u").val('');
                    $("#map_login_p").val('');
                               
                    userpnts = []; // *** а это костыль, но чтож делать
                    races = [];
                    orders = [];   
                    display_logist_races_list();    
                    display_logist_orders_list(); // ***
        
                    set_map_mode();
                    if (data['user_access'] == '-1') {
                        user_profile['user_access'] = 0;
                        $('#logist_profile').click();
                    }                
                } else {
                    alert(data['msg']);
                }
            }
         ,"json" 
        );
    });
    $("#map_register_btn").click( function(){ // кнопка в окне регистрации
        var em = $("#map_register_e").val();
        var pw = $("#map_register_p").val();
        $("#map_register_btn").css('background-color','#eee');
        $.post("/map_usr_pnt.php", 
            { email:em, password:pw, action : 'registeruser'},
            function(data){
                $("#map_register_btn").css('background-color','#aaa');
                if (data['msg']=='') {
                    user_profile = data;
                    $("#logout_label").show();
                    $('#map_login_popup').hide();
                    $("#map_register_e").val('');
                    $("#map_register_p").val('');
                    userpnts = []; // *** а это костыль, но чтож делать
                    races = [];
                    orders = [];   
                    display_logist_races_list();    
                    display_logist_orders_list(); // ***
                    set_map_mode();
                    $('#logist_profile').click();
                } else {
                    alert(data['msg']);
                }
            }
            ,"json" 
        );
    });
    $("#map_restore_btn").click( function(){ // кнопка в окне вост. пароля
        var em = $("#map_restore_e").val();
        $("#map_restore_btn").css('background-color','#eee');
        $.post("/map_usr_pnt.php", 
            { email:em, action : 'restore_pass'},
            function(data){
                $("#map_restore_btn").css('background-color','#aaa');
                //$('#map_login_popup').hide();                    
                alert(data);
            }
            ,"html" 
        );
    });    
    $('#order_volume').keypress(function(event) {  // создание заказа по enter-у
        if (event.keyCode == '13') {
            $("#save_order_btn").click();
        }
        //alert('press ' + event.keyCode);
    });
    $('#map_login_p').keypress(function(event) { // Логин по enter из поля "пароль"
        if (event.keyCode == '13') {
            $("#map_login_btn").click();
        }
    });
    $(".login_popup_close_btn").click( function(){
    
        $('#map_login_popup').hide();
    });
    $("#my_obj").click( function(){
        if (mode !='u_obj') {
            mode ='u_obj';
         /*
        } else {
            mode ='map';
            userpnts = [];
         */
        }
        set_map_mode();
    });
    $("#logout_label").click( function(){
        $.post("/map_usr_pnt.php", 
            { action:'logout'},
            function(data){
                $("#idroute").val('');
                $("#logout_label").hide();
                $("#point").css('display','none');
                $("#pnt_add_new_btn").hide();
                $("#add_order_btn").hide();
                $("#edit_order_btn").hide();      
                //$("#export_excel_holder").hide();                 
                $("#logist_mode_selector").hide();                 
                mode = 'map';
                set_map_mode();
                userpnts = [];
                races = [];
                orders = [];                
                $("#orders_list_jacket").hide();
                $("#serach_result_jacket").show();
                $("#result_list_id").show();
                $("#user_points_list").html('');
                //$("#right_result_jacket").html(''); 
                $("#races_list").html(''); 
                user_profile = {"user_access":0,"email":0,"exp_date":0,"msg":0,"uid":0} ;
                //alert(data);
            }
            ,"html" 
        );
    });
    $("#access_request_btn").click( function(){ // кнопка в профиле для выставления счета
        var alvl = $("#access_lvl_s").val();
        var aper = $("#access_period_s").val();
        $("#access_request_btn").css('background-color','#eee');
        $.post("/map_usr_pnt.php", 
            { alvl:alvl, aper:aper, action : 'access_payout_req'},
            function(data){
                $("#access_request_btn").css('background-color','#aaa');
                alert(data);
            }
            ,"html" 
        );
    });
    $("#send_feedback").click( function(){ // кнопка в окне обратной связи
        var subj = $("#feedback_subj").val();
        var msg  = $("#feedback_msg").val();
        $("#send_feedback").css('background-color','#eee');
        $.post("/map_usr_pnt.php", 
            { subj:subj, msg:msg, action : 'feedback'},
            function(data){
                $("#send_feedback").css('background-color','#aaa');
                alert(data);
                $('#feedback_popup').hide();
                $("#feedback_subj").val('');
                $("#feedback_msg").val('');
            }
            ,"html" 
        );
    });     
    $("#map_addrlist_popup_close_btn").click( function(){
        $("#map_addrlist_popup").hide();
    });

    $("#pnt_add_new_btn").click( function(){
        var cx_dig = $("#cx_d").val();
        var cy_dig = $("#cy_d").val();

        if($('#usr_pnt_edit').css('display')!='none') {
            var i = $('#e_point_id').html();
            edit_user_pnt_save();
        }
        var i = userpnts.length;
        userpnts.push(new user_point(cx_dig,cy_dig,i));
        userpnts[i].put();
        userpnts[i].setparams('Новая точка ','','',0,0);
        edit_user_pnt(i);
        display_usr_pnt_list();
        show_frames_by_order();    
        //$("#map_addrlist_popup").show();
    });
    $("#pnt_edit").click( function(){
        edit_user_pnt($('#v_point_id').html());
    });
    $("#pnt_edit_addr_btn").click( function(){
        $("#map_addrlist_popup").show();
        $("#map_addr_edit").val($("#e_point_addr").html());
        var pnt_id = $('#e_point_id').html();
        if (userpnts[pnt_id].xdig < 1) {
             $("#map_addr_find_btn").click();
        }
    });
    $("#pnt_edit_cancel").click( function(){
        edit_user_pnt_cancel();
    });
    $("#pnt_edit_save").click( function(){
        edit_user_pnt_save();
    });
    $("#pnt_edit_delete").click( function(){
        edit_user_pnt($('#v_point_id').html());
        edit_user_pnt_delete();
    });
    $("#map_addr_find_btn").click( function(){
        do_addr_search();
    });    
    $("#find_btn").click( function(){
        $("#point").css('display','block');
        $("#pnt_add_new_btn").hide();
        $("#add_order_btn").hide();
        $("#edit_order_btn").hide();      
        //$("#export_excel_holder").hide();                 
        $("#logist_mode_selector").hide();                 
        mode = 'map';
        set_map_mode();
        userpnts = [];
        //races = [];
        //orders = [];                
        $("#orders_list_jacket").hide();
        $("#serach_result_jacket").show();
        $("#result_list_id").show();
        $("#user_points_list").html('');
        //$("#right_result_jacket").html(''); 
        $("#races_list").html('');         
        
    });    
    $("#region_title").click( function(){
        $("#region_title").hide();
        $("#region_list").show();
    });
    $("#register_link_sw").click( function(){
        $("#login_popup_content").hide();
        $("#register_popup_content").show();
        $("#restore_popup_content").hide();
        $("#register_link_sw").hide();
        $("#login_link_sw").show();
    });
    $("#lost_pass_link_sw").click( function(){
        $("#login_popup_content").hide();
        $("#register_popup_content").hide();
        $("#restore_popup_content").show();
    });
    $("#login_link_sw").click( function(){
        $("#login_popup_content").show();
        $("#register_popup_content").hide();
        $("#restore_popup_content").hide();
        $("#register_link_sw").show();
        $("#login_link_sw").hide();
    });
    $(".close_route_btn").click( function(){
        $(".close_route_btn").hide();
        $("#idroute").val('');
        points_cnt = 0;
        points = new Array();
        $('#result_list_id').html('');
        if (typeof left_col_hide == 'function') {
            left_col_hide();
        }
        redraw_map()
    });
    $('#im_container').mousewheel(function(event, delta) {
        if(mapLoaded == true) {  
            var new_scale = 0;
            var cur_sc = $("#sc_d").val();

            if (delta > 0) { 
                new_scale = cur_sc / 3;
            } else if (delta < 0) {
                new_scale = cur_sc * 3;
            }
            var xy = getEventDigCoord(event);
            $("#cx_d").val(xy['X']);
            $("#cy_d").val(xy['Y']);
            $("#sc_d").val(new_scale);
            redraw_map();
        }
        timeStart = new Date();
        return false; // prevent default
    });
    $(".loading_image").ajaxStart(function(){
        $(this).html('<img src="/atmmap/images/loading.gif" border="0" alt="loading...">');;
    });
    $(".loading_image").ajaxComplete(function(event,request, settings){
        $(this).html("");
    });
    $(".tool_button").click(function () {
        //$(this).removeClass("hover");
        tool_click($(this).attr('id'));
    });    
   
    $('#map_ruler_slider')
        .bind('drag',function( event ){
            rule_top = findPosY(document.getElementById("map_ruler_body"));
            sl_top = event.offsetY-rule_top;
            sl_top  = (sl_top < 86) ? sl_top : 85;
            sl_top  = (sl_top > 0) ? sl_top : 0;
            $( this ).css({top: sl_top });
            /* Далее идет красота, растягиваем или сжимаем картинку карты */
            var minsc = $("#maxs_d").val();
            var cur_sc = $("#sc_d").val();
            var sl_p = 1-(sl_top/85);
            var new_sc =  (maxsc - minsc) * sl_p + minsc*1;            
            
            var mimg_w = $("#map_w").val();
            var mimg_h = $("#map_h").val();
            var new_w = parseInt(mimg_w * (cur_sc/new_sc));
            var new_h = parseInt(mimg_h * (cur_sc/new_sc));
            var left_m = parseInt((mimg_w - new_w)/2);
            var  top_m = parseInt((mimg_h - new_h)/2);

            im_cont = document.getElementById("im_container").style;
            $("#map_img").width(new_w).height(new_h);
            im_cont.marginLeft = parseInt(left_m)+'px';
            im_cont.marginTop  = parseInt(top_m)+'px'; 
            
            $("#points_place").hide();
            //points_place
            
        })
        .bind('dragend',function( event ){
            var minsc = $("#maxs_d").val();
            var cur_sc = $("#sc_d").val();
            
            var slt = parseInt($(this).css('top'));
            var sl_p = 1-(slt/85);
            var new_sc =  (maxsc - minsc) * sl_p + minsc*1;
            set_sc (new_sc);
        })     
        .bind('click', function() { return false; });        
        
    $('#map_ruler_btn_p').click(function() {
        set_sc('i');
    });
    $('#map_ruler_body').bind('click',function( event ){
        //set_sc('o');
        rule_top = findPosY(document.getElementById("map_ruler_body"));
        var slt = event.pageY-rule_top - 3;
        var minsc = $("#maxs_d").val();
        var cur_sc = $("#sc_d").val();
        var sl_p = 1-(slt/85);
        var new_sc =  (maxsc - minsc) * sl_p + minsc*1;
        set_sc (new_sc);        
        
    });    
    $('#map_ruler_btn_m').click(function() {
        set_sc('o');
    });       
    $('.logist_window_close').click(function() { // Универсальный закрыватор окон :)
        $(this).parent().parent().parent().parent().hide();
    });
    $('#logist_profile').click(function() { 
        $('#profile_info_wnd').show();
        $('#profile_login').html(user_profile["email"]);
        $('#profile_access_lvl').html(user_profile["user_access"]);
        $('#profile_access_exp_date').html(user_profile["exp_date"]);
    });    
    $('#logist_feedback').click(function() { 
        $('#feedback_popup').show();
    });       
    $('#import_link').click(function() { 
        $('#map_import_popup').show();
    }); 
    
    $('#r_col_stuff_1').click(function() { 
        alert('Param 001 : ' + Math.random()*100);
    }); 
    $('#import_start_btn').click(function() { 
        ajaxFileUpload();
    });  
    $('#map_free_login_btn').click(function() { 
        autologon(); // тут надо умнее как-то сделать
        $('#map_login_popup').hide();
    });  
        
    
});

function findPosY(obj){
    var curtop = 0;
    while (obj){
        curtop += obj.offsetTop;
        obj = obj.offsetParent;
    }
    return curtop;
}
function findPosX(obj){
    var curleft = 0;
    while (obj){
        curleft += obj.offsetLeft;
        obj = obj.offsetParent;
    }
    return curleft;
}
function getEventDigCoord(ev){
    var xy = new Array();

    var scroll = Math.max(document.documentElement.scrollTop,document.body.scrollTop );  // !!! NB !!! only for G.chrome copatibility
    var img_pos_x = findPosX(document.getElementById("im_container"));
    var img_pos_y = findPosY(document.getElementById("im_container"));
    var posX2 = ev.clientX - img_pos_x ;
    var posY2 = ev.clientY + (scroll*1) - img_pos_y  ;
    var mapw = parseInt($("#map_w").val());
    var maph = parseInt($("#map_h").val());
    var cx_dig = $("#cx_d").val();
    var cy_dig = $("#cy_d").val();
    var sc_dig = $("#sc_d").val();

    var Xdig = parseInt((posX2 - (mapw/2))*sc_dig); 
    var Ydig = parseInt(((maph-posY2) - (maph/2))*sc_dig); 
    Xdig = parseInt(-Xdig - cx_dig)*(-1);
    Ydig = parseInt(-Ydig - cy_dig)*(-1);
    xy['X']=Xdig;
    xy['Y']=Ydig;
    return xy;
}

function down(event){
    if(mapLoaded == true) {
        set_cursor(cur_tool); // это тут зачем? Курсор обратно менять?
        switch (cur_tool){
        case 'zoomin':
            isDown=true;
            var scroll = Math.max(document.documentElement.scrollTop,document.body.scrollTop );
            sel = document.getElementById("sel_area").style;
            sel.pixelTop  = event.clientY+(scroll*1); 
            sel.pixelLeft = event.clientX;            
            if ($.browser.mozilla) {
                $("#sel_area").css("top",event.clientY+(scroll*1));
                $("#sel_area").css("left",event.clientX);
            }
            sel.pixelHeight = 3;
            sel.pixelWidth  = 3;
            sel.display = "block";
        break;
        case 'move':
            posX = event.clientX ;
            posY = event.clientY+(document.body.scrollTop*1); // !!! NB !!! for G.chrome only
            isDown=true;
            set_cursor('move2');
        break;
        case 'zoomout':
            isDown=true;
        break;

        }
        isDown=true;
        posX = event.clientX ;
        posY = event.clientY+(document.body.scrollTop*1); // !!! NB !!! for G.chrome only
        
        
    }
    return false
}

function up(event){
    if(mapLoaded == true) {
        var cx_dig = $("#cx_d").val(); 
        var cy_dig = $("#cy_d").val();
        var sc_dig = $("#sc_d").val();
        var img_w = $("#map_w").val();
        var img_h = $("#map_h").val();
        
        var im_cont = document.getElementById("im_container").style;
        var center_x = parseInt(im_cont.left);
        var center_y = parseInt(im_cont.top);        
        if ((center_x != 0)&&(center_y !=0)) {
            if (isDown==true){
                isDown=false;
                var im_cont = document.getElementById("im_container").style;
                var center_x = - Math.ceil((parseInt(im_cont.left) * sc_dig) - cx_dig);
                var center_y = Math.ceil(cy_dig - (parseInt(im_cont.top) * -sc_dig));
                $("#cx_d").val(center_x);
                $("#cy_d").val(center_y);
                redraw_map();
            }
        } else 

        
        switch (cur_tool){
        case 'point':
            if (isDown==true){
                isDown=false;
                if($('#usr_pnt_edit').css('display')!='none') {
                    var i = $('#e_point_id').html();
                    edit_user_pnt_save();
                }
                var xy = getEventDigCoord(event);
                var i = userpnts.length;
                userpnts.push(new user_point(xy['X'],xy['Y'],i));
                userpnts[i].put();
                userpnts[i].setparams('Новая точка ','','',0,0);
                show_frames_by_order();
                edit_user_pnt(i);
                display_usr_pnt_list();
            }   
        break;
        case 'route':
            if (isDown==true){
                isDown=false;
                
                if (points_cnt < 17) {
                    points_cnt++;
                    var xy = getEventDigCoord(event);
                    points[points_cnt] =  new route_point(xy['X'],xy['Y'],points_cnt);
                    points[points_cnt].put();
                    show_frames_by_order();
                    if (points_cnt > 1) {
                        $('.close_route_btn').show();
                        set_cursor('wait');            
                        var rt = routeByPnt(prepare_route_pnts(points));
                        $('#result_list_id').html('Маршрут:<br><br>' + rt.text);
                    
                        if($("#idroute").val() === '') {
                            $("#cx_d").val(rt.cx_dig);
                            $("#cy_d").val(rt.cy_dig);
                            $("#sc_d").val(rt.sc_dig);
                        }
                        $("#idroute").val(rt.idroute);
                        //alert(rt.idroute);
                        left_col_show();  // !!! ???
                        redraw_map();
                        //tool_click('move');            
                    }
                }
            }    
        break;        
        case 'zoomin':
            if (isDown==true){
                isDown=false;
                var sel = document.getElementById("sel_area").style;
                var img = document.getElementById("im_container");
                var img_pos_x = findPosX(img);
                var img_pos_y = findPosY(img);

                var sel_w = parseInt($("#sel_area").width());
                var sel_h = parseInt($("#sel_area").height());
                
                var sel_x_center =  sel.pixelLeft - img_pos_x + (sel_w / 2);  //
                var center_x = Math.ceil((cx_dig - ((img_w/2) * sc_dig)) + (sel_x_center * sc_dig));
                
                var sel_y_center = img_h - (sel.pixelTop - img_pos_y + (sel_h / 2)); //
                var center_y = Math.ceil((cy_dig - ((img_h/2) * sc_dig)) + (sel_y_center * sc_dig));

                var sc_x = (sel_w / img_w) * sc_dig; //
                var sc_y = (sel_h / img_h) * sc_dig; //

                scale_to = Math.max( sc_x , sc_y );

                //alert('scx' + sc_x + '; scy' +  sc_y + '; spw' +  + '; sph' + + '; scale_to' + scale_to + '; ');
                
                if (sel_w < 4) {
                    if (sel_h < 4) {
                        scale_to = sc_dig  / 3;
                    }
                }

                var minsc = $("#maxs_d").val(); 
                if (scale_to < minsc)
                scale_to = minsc;

                $("#cx_d").val(center_x);
                $("#cy_d").val(center_y);
                $("#sc_d").val(scale_to);
                sel.display = 'none';
                redraw_map();
            }
        break;
        case 'move':
        /*
            if (isDown==true){
                isDown=false;
                var im_cont = document.getElementById("im_container").style;
                var center_x = - Math.ceil((parseInt(im_cont.left) * sc_dig) - cx_dig);
                var center_y = Math.ceil(cy_dig - (parseInt(im_cont.top) * -sc_dig));
                $("#cx_d").val(center_x);
                $("#cy_d").val(center_y);
                redraw_map();
            }
        */
        break;
        case 'zoomout':
            if (isDown==true){
                //alert(event.currentTarget.id);
                isDown=false;
                scale_to = sc_dig * 1.6;
                $("#sc_d").val(scale_to);
                redraw_map();
            }  
        break;
        }
    }
    timeStart = new Date();
}
function redraw_map(){
    set_cursor('wait');
    mapLoaded=false;

    var db_name = $("#db_d").val();
    var cx_dig = $("#cx_d").val();
    var cy_dig = $("#cy_d").val();
    var sc_dig = parseFloat($("#sc_d").val());
    var img_w = $("#map_w").val();
    var img_h = $("#map_h").val();
 
    var minsc = $("#maxs_d").val();

    var mx_dig = $("#mxdig").val();
    var my_dig = $("#mydig").val();
    var mrk  = $("#marker").val();

    var maxx = $("#maxx_d").val();
    var minx = $("#minx_d").val();
    var maxy = $("#maxy_d").val();
    var miny = $("#miny_d").val();

    var idroute = $("#idroute").val();

	maxsc = Math.ceil(Math.min( (maxx - minx) / img_w , (maxy - miny) / img_h ));

	if (sc_dig > maxsc)
	    sc_dig = maxsc;

      	if (sc_dig < minsc)
            sc_dig = minsc;

	maxcxd = maxx - Math.ceil( (img_w/2) * sc_dig);
	mincxd = parseInt(minx) + Math.ceil( (img_w/2) * sc_dig);
	maxcyd = maxy - Math.ceil( (img_h/2) * sc_dig);
	mincyd = parseInt(miny) + Math.ceil( (img_h/2) * sc_dig);	

	if (cx_dig > maxcxd)
	    cx_dig = maxcxd;
	if (cx_dig < mincxd)
	    cx_dig = mincxd;

	if (cy_dig > maxcyd)
	    cy_dig = maxcyd;
	if (cy_dig < mincyd)
	    cy_dig = mincyd;

     //document.getElementById('sc_marker').style.marginLeft = parseInt(322 - parseInt((sc_dig - minsc)/(maxsc - minsc) *320))+'px' ;  // !!! NB !!! conv. to %
    var new_sc_pos = (85-(sc_dig - minsc)/(maxsc - minsc) *85)+'px';  
    $('#map_ruler_slider').css('top',new_sc_pos) ;  

    $("#cx_d").val(cx_dig);
    $("#cy_d").val(cy_dig);
    $("#sc_d").val(sc_dig);
    // Math.random тут только от того, что в хроме не работало
      mapsrc =  '/map_tj.php?db='+db_name+'&sxpix='+img_w+'&sypix='+img_h+'&cxdig='+cx_dig+'&cydig='+cy_dig+'&scaledig='+sc_dig+'&mxdig='+mx_dig+'&mydig='+my_dig+'&marker='+mrk+'&idroute='+idroute+'&imagetype=gif&uid=' + user_profile["uid"] + '&rand=' + Math.random();
    //mapsrc =  '/maps/'+db_name+'/img_'+img_w+'x'+img_h+'_cx'+cx_dig+'cy'+cy_dig+'s'+sc_dig+'.gif';
    //document.getElementById('map_img').src  = mapsrc;
    $("#map_img_cache").attr('src',mapsrc);
    //document.getElementById('map_cache_img').src  = mapsrc;
    //document.getElementById('map_link').href = map_link_pre+'/map/'+db_name+'/m'+mrk+'cx'+cx_dig+'cy'+cy_dig+'sd'+sc_dig+'mx'+mx_dig+'my'+my_dig;
    document.getElementById('map_link').href = '/index.phtml?page=map&db='+db_name+'&cxdig='+cx_dig+'&cydig='+cy_dig+'&scaledig='+sc_dig+'&mxdig='+mx_dig+'&mydig='+my_dig+'&marker='+mrk+'&idroute='+idroute;
    //document.getElementById('map_link2').href = document.getElementById('map_link').href;

    $('#map_img_link_edit').val(map_link_pre+mapsrc);
    $('#map_html_link_edit').val('<a href="'+map_link_pre+'/map/'+db_name+'/m'+mrk+'cx'+cx_dig+'cy'+cy_dig+'sd'+sc_dig+'mx'+mx_dig+'my'+my_dig+'"><img src="'+map_link_pre+mapsrc+'" border=0></a>');
    var full_w = document.body.clientWidth - 40;
    var full_h = document.body.clientHeight - 100;
    document.getElementById('map_full_link').href = '/index.phtml?page=map&db='+db_name+'&widemap=1&cxdig='+cx_dig+'&cydig='+cy_dig+'&scaledig='+sc_dig+'&mxdig='+mx_dig+'&mydig='+my_dig+'&marker='+mrk+'&sxpix='+full_w+'&sypix='+full_h+'&idroute='+idroute;
    document.getElementById('map_full_link2').href = document.getElementById('map_full_link').href;
}
function move(event){
    if(mapLoaded == true) {  
        switch (cur_tool){
        case 'zoomin':
            if (isDown==true){
                var scroll = Math.max(document.documentElement.scrollTop,document.body.scrollTop );  // !!! NB !!! only for G.chrome copatibility
                if ((event.clientX > sel.pixelLeft ) && ((event.clientY+scroll) > sel.pixelTop));
                    $("#sel_area").height((event.clientY+scroll) - sel.pixelTop-2);
                    $("#sel_area").width(event.clientX - sel.pixelLeft-2);
            }
        break;
        case 'move':
            if (isDown==true){
                im_cont = document.getElementById("im_container").style;
                im_cont.left = parseInt(event.clientX - posX)+'px';
                im_cont.top  = parseInt((event.clientY+document.body.scrollTop) - posY)+'px';  // !!! NB !!! doc.sc.top don't work? but dont need
            }
        break;
        default:
            if (isDown==true){
                im_cont = document.getElementById("im_container").style;
                im_cont.left = parseInt(event.clientX - posX)+'px';
                im_cont.top  = parseInt((event.clientY+document.body.scrollTop) - posY)+'px';  // !!! NB !!! doc.sc.top don't work? but dont need
            }
        break;        
        
        }
    }
}

function map_cache_loaded(){
    var img_pos_x = findPosX(document.getElementById("im_frame"));
    var img_pos_y = findPosY(document.getElementById("im_frame"));
    $("#map_img_cache").css('left',img_pos_x*1+1);
    $("#map_img_cache").css('top',img_pos_y*1+1);
    $("#map_img_cache").show();
    $("#map_img").hide();
    $("#map_img").attr('src',$("#map_img_cache").attr('src'));
}
function map_loaded(){
    var mimg_w = $("#map_w").val();
    var mimg_h = $("#map_h").val();
    $("#map_img").width(mimg_w*1).height(mimg_h*1);
    im_cont = document.getElementById("im_container").style;
    im_cont.left=0;
    im_cont.top=0;
    im_cont.marginLeft = parseInt(0)+'px';
    im_cont.marginTop  = parseInt(0)+'px';

    $("#map_img_cache").hide();
    $("#map_img").show();
    
    $("#points_place").html('');
    for (i=0; i<points_cnt;i++) {
        points[i+1].put();      
    }
    //$("#points_place").show();  // зачем это здесь было?
    
    $.each(userpnts, function(i, val) {
        val.put();
    });
    show_frames_by_order();  
    //display_usr_pnt_list();
    mapLoaded=true;
    set_cursor(cur_tool);
    //var timeLoad = new Date();
    //var loadTimeMs = (timeLoad.getTime() - timeStart.getTime());
    //document.getElementById('ltms').innerHTML=loadTimeMs;
}

function tool_click(tool_name){
    $("#"+cur_tool).removeClass("active");
    $("#"+tool_name).addClass("active");    
    cur_tool = tool_name;
    set_cursor(tool_name);
}
function set_cursor(cur_name){ 
    im_frm = document.getElementById("im_frame").style;
    switch (cur_name){
    case 'zoomin':                             
        im_frm.cursor = ($.browser.opera)? 'crosshair' : 'url(/images/map/c_zoomin.cur), crosshair';
    break;
    case 'zoomout':
        im_frm.cursor = ($.browser.opera)? 'default' : 'url(/images/map/c_zoomout.cur), default';
    break;
    case 'move':
        im_frm.cursor = ($.browser.opera)? 'move' : 'url(/images/map/c_hand1.cur), move';
    break;
    case 'move2':
        im_frm.cursor = ($.browser.opera)? 'move' : 'url(/images/map/c_hand2.cur), move';
    break;
    case 'route':
        im_frm.cursor = ($.browser.opera)? 'crosshair' : 'url(/images/map/c_route.cur), move';
    break;
    case 'point':
        im_frm.cursor = ($.browser.opera)? 'crosshair' : 'url(/images/map/c_point.cur), move';
    break;
    case 'wait':
        im_frm.cursor = ($.browser.opera)? 'wait' : 'url(/images/map/c_wait.cur), wait';
    break;
    }
}
function show_obj (obj_xx,obj_yy){
    var min_sc = $("#maxs_d").val();
    $("#cx_d").val(parseInt(obj_xx));
    $("#cy_d").val(parseInt(obj_yy));
    $("#mxdig").val(parseInt(obj_xx));
    $("#mydig").val(parseInt(obj_yy));
    $("#marker").val('1027');
    $("#sc_d").val(min_sc);
    setTimeout("redraw_map()", 1);
}
function set_unload_alert(){
    if ($.browser.mozilla) {
        window.onbeforeunload = function() {
            return "Содержимое было изменено! \n Вы уверены, что хотите покинуть страницу без сохранения?";
        };             
    }
}
function set_sc (sc_to){ 
    var min_sc = $("#maxs_d").val(); 
    var cur_sc = $("#sc_d").val();
    switch (sc_to) {
        case 'i': 
            //new_scale = cur_sc - ((maxsc - min_sc)/14);
            new_scale = 1*min_sc +((cur_sc - min_sc)/3);
            //alert('cur:' +cur_sc+ ' max:' +maxsc+ ' - min:' +min_sc + ' new:' + new_scale + '  min:' + min_sc);
            new_scale = new_scale < min_sc ? min_sc : new_scale;         
        break;
        case 'o': 
            new_scale = (1*cur_sc + ((maxsc - min_sc)/14));
            new_scale = new_scale > maxsc ? maxsc : new_scale;
        break;
        default:
            new_scale = parseFloat(sc_to);
    }

    var mimg_w = $("#map_w").val();
    var mimg_h = $("#map_h").val();
    var new_w = parseInt(mimg_w * (cur_sc/new_scale));
    var new_h = parseInt(mimg_h * (cur_sc/new_scale));
    var left_m = parseInt((mimg_w - new_w)/2);
    var  top_m = parseInt((mimg_h - new_h)/2);

    im_cont = document.getElementById("im_container").style;
    $("#map_img").width(new_w).height(new_h);
    im_cont.marginLeft = parseInt(left_m)+'px';
    im_cont.marginTop  = parseInt(top_m)+'px';

    $("#sc_d").val(new_scale);
    setTimeout("redraw_map()", 5);
}
function getClientWidth() {
    return document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientWidth:document.body.clientWidth;
}
function getClientHeight(){
    return document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight;
}


function ajaxFileUpload(){
    $("#imp_loading")
    .ajaxStart(function(){
        $(this).show();
    })
    .ajaxComplete(function(){
        $(this).hide();
    });

    $.ajaxFileUpload(
        {
            url:'/doajaxfileupload.php',
            secureuri:false,
            fileElementId:'fileToUpload',
            dataType: 'json',
            success: function (data, status){
                
                if(typeof(data.error) != 'undefined'){
                    if(data.error != ''){
                        alert(data.error);
                    }else {
                       // alert('3:' + data.msg);
                    }
                }
                if ($("#import_ch_points").attr('checked')) {
                    userpnts = new Array(); //удалим все точечки пользователя :) 
                    $.each(data.points, function(i, val) {
                        if (val != ''){
                            
                            var j = userpnts.length;
                            userpnts.push(new user_point(val.x,val.y,j));
                            userpnts[j].put();
                            userpnts[j].setparams(val.nm,val.addr,val.memo,val.id,val.is_store);
                        }
                    });
                }
                if ($("#import_ch_orders").attr('checked')) {
                    orders = new Array(); //удалим все заказы пользователя :) 
                    $.each(data.orders, function(i, val) {
                        if (val != ''){
                            var j = orders.length;
                            orders[j] = new logist_order(j);
                            //orders[j].setparams(val.volume,val.point_id,val.race_id,val.work_from,val.work_to);
                            orders[j].setparams(val.volume,val.point_id,null,val.work_from,val.work_to);
                        }
                    });
                }
                
                display_logist_races_list();    
                display_logist_orders_list();  
                
                show_frames_by_order();        
                display_usr_pnt_list();
                $('#map_import_popup').hide();
            },
            error: function (data, status, e){
                //alert('1:' + e); //Тут что-то не так.
            }
        }
    )
    return false;
}
// Simple JavaScript Templating
// John Resig - http://ejohn.org/ - MIT Licensed
(function(){
  var cache = {};
 
    this.tmpl = function tmpl(str, data){
        // Figure out if we're getting a template, or if we need to
        // load the template - and be sure to cache the result.
        var fn = !/\W/.test(str) ?
          cache[str] = cache[str] ||
            tmpl(document.getElementById(str).innerHTML) :
         
          // Generate a reusable function that will serve as a template
          // generator (and which will be cached).
          new Function("obj",
            "var p=[],print=function(){p.push.apply(p,arguments);};" +
           
            // Introduce the data as local variables using with(){}
            "with(obj){p.push('" +
           
            // Convert the template into pure JavaScript
            str
                .replace(/[\r\t\n]/g, " ")
                .split("<%").join("\t")
                .replace(/((^|%>)[^\t]*)'/g, "$1\r")
                .replace(/\t=(.*?)%>/g, "',$1,'")
                .split("\t").join("');")
                .split("%>").join("p.push('")
                .split("\r").join("\\'") + "');}return p.join('');");
       
        // Provide some basic currying to the user
        return data ? fn( data ) : fn;
    };
})();


