out = function() {
    try {
        var args = new Array();
        args[args.length] = (new Date()).toLocaleTimeString();
        args[args.length] = ':';
        for(var i=0; i<arguments.length;i++) {
            args[args.length] = arguments[i];
            args[args.length] = ',';
        }
        console.log.apply(this, args);
    }
    catch(e) {}
};

function Humanize(price) {

    var rprice = "";
    
    var prices = (new String(price)).split(/\.|\,/);
    var price = prices[0];

    while(price.length > 3) {
        rprice = '&nbsp;' + price.substr(price.length-3, 3) + rprice;
        price = price.substr(0, price.length - 3);
    }
    
    return (price + rprice + (prices[1] ? '.' + prices[1] : '') );
}

    
    
function isValidSSN(expression) {
    if ((expression == undefined) || (expression == '') || (expression == null)) return false;
    
    expression = '' + expression;
    
    // Фильтруем, оставляя только цифры
    var filtered = '';
    for (var i = 0; i < expression.length; i ++)
        if (!isNaN(parseInt(expression.charAt(i))))
            filtered += expression.charAt(i);
    
    // ИНН должен быть десяти- или двенадцатизначным 
    if ((filtered.length != 10) && (filtered.length != 12)) return false;
    
    // Первые две цифры находятся в диапазоне 01-89, 99 включительно 
    var firstDigitsValid = false;
    var first = parseInt(filtered.substr(0, 2));
    firstDigitsValid = ((first >= 1) && (first <= 89)) || (first == 99);
    if (!firstDigitsValid) return false;
    
    // Он должен быть проверен (!)
    
    if (filtered.length == 10) {
        // Вычисляется контрольная сумма со следующими весовыми коэффициентами: (2,4,10,3,5,9,4,6,8,0)
        var c = [2, 4, 10, 3, 5, 9, 4, 6, 8, 0];
        var sum =  0;
        for (var i = 0; i < c.length; i ++) 
            sum += parseInt(filtered.charAt(i)) * c[i];
        
        // Вычисляется контрольное число как остаток от деления контрольной суммы на 11
        var cc = sum % 11;
        
        // Если контрольное число больше 9, то контрольное число вычисляется как остаток от деления контрольного числа на 10
        if (cc > 9)
            cc = cc % 10;
        
        // Контрольное число проверяется с десятым знаком ИНН. В случае их равенства ИНН считается правильным.
        var isValid = ((cc + '') == filtered.charAt(9));
        
        return isValid;
        
    }
    
    if (filtered.length == 12) {
        // Вычисляется контрольная сумма по 11-ти знакам со следующими весовыми коэффициентами: (7,2,4,10,3,5,9,4,6,8,0)
        var c1 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0];
        var sum1 = 0;
        for (var i = 0; i < c1.length; i ++) 
            sum1 += parseInt(filtered.charAt(i)) * c1[i];
        
        // Вычисляется контрольное число(1) как остаток от деления контрольной суммы на 11
        var cc1 = sum1 % 11;
        // Если контрольное число(1) больше 9, то контрольное число(1) вычисляется как остаток от деления контрольного числа(1) на 10
        if (cc1 > 9)
            cc1 = cc1 % 10;
        
        // Вычисляется контрольная сумма по 12-ти знакам со следующими весовыми коэффициентами: (3,7,2,4,10,3,5,9,4,6,8,0).
        var c2 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8, 0];
        var sum2 = 0;
        for (var i = 0; i < c2.length; i ++) 
            sum2 += parseInt(filtered.charAt(i)) * c2[i];
        
        // Вычисляется контрольное число(2) как остаток от деления контрольной суммы на 11
        var cc2 = sum2 % 11;
        
        // Если контрольное число(2) больше 9, то контрольное число(2) вычисляется как остаток от деления контрольного числа(2) на 10
        if (cc2 > 9)
            cc2 = cc2 % 10;
        
        // Контрольное число(1) проверяется с одиннадцатым знаком ИНН и контрольное число(2) проверяется с двенадцатым знаком ИНН. В случае их равенства ИНН считается правильным. 
        var isValid = ((cc1 + '') == filtered.charAt(10)) && ((cc2 + '') == filtered.charAt(11));
        
        return isValid;
        
    }
    
}

function changeUrl(o) {
    window.open($(o).attr('href') + '&filter=' + escape(window.filter)+'&order='+escape(window.order)+'&ismy='+window.ismy+(window.ctrlKey ? '&itsme=true' : ''));
}

function calcTotals() {
    
    AjaxRequest('CMemberOrder.CalcTotals',  { }, function(data) {
        if(data == 'error') {
            alert('Ошибка в запросе');
            return;
        }
        
        $('#orderLegend').html(data);
        
        
        if(window.ismodel) {
            var totalPrice = 0;
            var totalWeight = 0;
            var totalVolume = 0;

            $o = $('#order-table :input[value!=\'\']');
            $o.each(function() {

                $this = $(this);
                $row = $this.parent().parent();
                var row = $row.get(0);
                
                totalPrice += parseFloat($row.find('.sum').html());
                if($row.find('.weight').html() != '')
                    totalWeight += parseFloat($row.find('.weight').html()) * $this.val();
                if($row.find('.volume').html() != '')
                    totalVolume += parseFloat($row.find('.volume').html()) * $this.val();
                
            })
            
            $('#weight').html(Humanize(round2(totalWeight, 2)));
            $('#volume').html(Humanize(round2(totalVolume, 2)));
            $('#price').html(Humanize(totalPrice));
        }
        else {
            $('#weight').html(round2($('#orderWeight').html(), 2));
            $('#volume').html(round2($('#orderVolume').html(), 2));
            $('#price').html($('#orderSum').html());
        }
        
    }, true, false);
    
}

function calcRowPrice($this) {
    
    if($this.val() != '' && isNaN(parseInt($this.val()))) {
        alert('Пожалуйста ведите число в поле количество');
        $this.val('');
        return false;
    }
    
    $row = $this.parent().parent();
    
    var rest = parseInt($row.find('.rest').attr('rest'));
    
    if($this.val() > rest) {
        alert('Введенное количество товара отсутствует на складе. Максимальное количество, которое возможно заказать на данный момент: ' + rest);
        $this.val(rest);
    }
    
    if($this.val() == '0') 
        $this.val('');
    
    var price = parseInt($row.find('.price').html());
    price = (price * $this.val());
        
    if(price > 0)
        $row.find('.sum').html(price + ' р');
    else
        $row.find('.sum').html('');
        
    sendDataToServer($row.attr('id'), $this.val());
        
}

function sendDataToServer(id, count) {
    
    AjaxRequest('CMemberOrder.SaveOrderItem',  { product: id, count: count}, function(data) {
        if(data == 'error')
            alert(data);
    }, true, false);
    
}

window.page = 1;
window.filter = '';
window.order = ''; 
window.ismy = false; 
window.striped = false;
window.ismodel = false;
window.ctrlKey = false;
        
function fillOrderTable(data) {

    $('#orderContainer .tta').html(data);
    
    var count = $('#order-table').get(0).rows.length - 1;
    var affected = $('#order-table #affected').html();
    
    drawPager(count, affected, window.page);
    
    $('#total-count').html(affected);
    if(count > 1) {
        calcTotals();
    }
    else {
        $('#order-table').height(100);
    }
    calcTotals();
    setHeaderEvents();
    
    if(window.ismy || window.ismodel)  {
        var hh = $('.tta').height();
        if(hh < 630) hh = 630;
        var h = $('#order-table').height();
        if(h < hh)
            $('.tta').height(h);
    }

}

function doFilter() {
    doDownloadTable(window.page, window.filter, window.order, window.ismy, window.striped)
}

function drawPager(count, affected, page) {
    
    $('.bigcattable .jpager').html('');
    
    var maxpages = affected/100;
    if(maxpages != parseInt(maxpages)) maxpages += 1; 
    maxpages = parseInt(maxpages);
    
    //alert(window.page);
    if(window.page > 1) {
        $('<a href="#" id="prev">&laquo; предыдущая</a>').appendTo($('.bigcattable .jpager')).click(function() {
            if(window.page > 1)  {
                window.page --;
                doFilter();
            }
            return false;
        });
    }
    
    $('.bigcattable .jpager').append('<span>Страница <strong>' + page + '</strong> из <strong>' + maxpages + '</strong></span>');
    
    if(window.page <= maxpages-1) {
        $('<a href="#" id="next">следующая &raquo;</a>').appendTo($('.bigcattable .jpager')).click(function () {
            if(window.page <= maxpages-1) {
                window.page ++;
                doFilter();            
            }
            return false;
        });
    }
    
    
}

function checkOrder() {
    if(parseInt($('#orderCount').html()) > 0) {
        return true;
    }
    else {
        alert('Ваш заказ пуст');
        location='/order/';
        return false;
    }
}

function clearOrder(loc) {
    AjaxRequest('CMemberOrder.ClearOrder',  {}, function() { if(!loc) { doFilter(); } else { location=loc; } },true, true);
}

function doDownloadTable(page, filter, order, ismy, striped) {
    
    $('#orderContainer .tta').html('<center>Загрузка списка - пожалуйста, подождите...</center><center><img src="/resources/images/layout/loading.gif" /></center>');
    
    AjaxRequest('CMemberOrder.LoadFullPrice',  
                {
                    page: page,
                    filter: filter,
                    order: order,
                    ismy: ismy,
                    striped: striped
                }, 
                fillOrderTable, 
                true, true);
}

function setHeaderEvents() {    
    
    $('#order-header div a').live('click', function() {
        $t = $(this).parent();
        $ordering = 'asc';
        if($t.hasClass('asc')) {
            window.order = $t.attr('id');
            $ordering = 'desc';
            $t.removeClass('asc');
            $t.addClass('desc');
            window.order += ' '+$ordering;
        }
        else if($t.hasClass('desc')) {
            window.order = '';
            $ordering = '';
            $t.removeClass('desc');
        }
        else { 
            // удалить старый класс
            $t.parent().children('.asc,.desc').removeClass('asc');
            $t.parent().children('.asc,.desc').removeClass('desc');

            $t.addClass('asc');
            $ordering = 'asc';
            window.order = $t.attr('id');
            window.order += ' '+$ordering;    
        }
            
        
        

        doFilter('0');
        return false;
    });
    
    $('#order-table').find('.count').live('change', function() {
        calcRowPrice($(this));
        calcTotals();
    });

    // var w = $('#order-table').width();
    $('#order-header').width('100%');
    
    var l = $('#order-header div').length;
    $('#order-header div').each(function(i, o) {
        if($('#order-table tr:eq(0) td').length > 0) {
            $oo = $($('#order-table tr:eq(0) td').get(i));
            
            oow = $oo.width();
            $o = $(o);
            $o.width(oow + (i == l-1 && ($.browser.opera || $.browser.msie || $.browser.safari) ? -1 : 0) + (i == 0 && ($.browser.opera || $.browser.safari) ? 1 : 0));
        }
            
    });
    
    $.ImageBox.init({
        loaderSRC : '/resources/images/layout/loading.gif',
        closeHTML : '<img src="/resources/images/layout/close.gif" />',
        border: 20
    });      
    
    
    
}

function round2($number, $pres) {
    
    if($pres == undefined)
        $pres = 2;
    
    $num = roundNumber($number, $pres);
    if(parseInt($num) != $num) {
        $parts = (new String($num)).split('\.');
        return $parts[0] + '.' + $parts[1] + ($pres-$parts[1].length > 0 ? '0'.repeat($pres-$parts[1].length) : '');
    }
    else {
        return ($num + '.' + '0'.repeat($pres));
    }
    
}

String.prototype.repeat = function(l){
    return new Array(l+1).join(this);
};

function roundNumber(rnum, rlength) { // Arguments: number to round, number of decimal places
    return Math.round(rnum*Math.pow(10,rlength))/Math.pow(10,rlength);
}

function openInfo(src, id) {
    window.open(src, 'info'+id, 'scrollbars=yes,toolbar=yes,statusbar=no,width='+800 + ',height=' + 600);
    return false;
}
