// Basic JS functions
$(document).ready(function(){

    var alert_msg = ({
        delete_confirm: "Do you really want to delete selected rows?",
        update_confirm: "Do you really want to update selected rows?",
        no_parameters : "No selected items!",
        no_value      : "Select value from the list!",
        del_success   : "All selected items deleted successfuly",
        update_success: "All selected items updated successfuly",
        start_alert   : "Do you really want to START alert for order #",
        stop_alert    : "Do you really want to STOP alert for order #",
        check_email   : "Email address is not valid!"
    });
// E.I. Plugin for Filter fields and buttons function and settings
    $.fn.filterSetting = function() {
        var el_field  = $(this).find(':text');
        var el_button = $(this).find(':submit');
        var el_off = $(this).find('.off');
        
        if ( !el_field.val()) {
            el_button.attr('disabled', 'true');
        }

        el_field.bind('keyup blur', function(){
            el_button.attr( 'disabled', ($.trim( $(this).val())) ? false : true );
        })
       
        el_off.click( function() {
            el_field.val('');
        })
    }
// E.I. setinng up on document load event ************************************
// Sotring options. 
    if ( $('#report_type').val() == 'abandoned' ) {
        $('#reports').tablesorter({
            headers: { 0 : {sorter: false},
                       2 : {sorter: 'isoLongDate'},
                       3 : {sorter: false},
                       7 : {sorter: false} }
        });
    } else if ( $('#report_type').val() == 'vendors' ) {
        $('#reports').tablesorter({
            headers: { 0 : {sorter: false},
                        2 : {sorter: false},
                       11 : {sorter: false}
             }
        });
    }
// Start the alerts on Shipment report
    if ( $('#report_type').val() == 'shipment' ) {
        $('.report tr').each( function() {
            var tr_id = $(this).attr('id');
            var alert = $('#set_alert_'+ tr_id).val();
            if (alert > 0){
                $('#alert_'+tr_id+' :first-child').css('color', 'red');
                stop_id = blinkText( $('#alert_'+tr_id), 500);
                $('#time_id_'+tr_id).val(stop_id);
            }
        })
    }
// E.I. Resize table with buttons according to client width, resize textarea elements
    $(window).load( function() {
       $('#controls').width(document.body.clientWidth) ; 
    });

    $(window).resize( function() {
       $('#controls').width(document.body.clientWidth) ; 
    });
// End ***********************************************************************    

// E.I. Filters on "Product Images" page    
    $('#files_filter').filterSetting() ;  
    $('#vendor_filter').filterSetting() ;
// E.I. Check/Uncheck all the checkboxes in list. Now using in Abandoned report
    $('input:#select_all').change( function() {
        var check = $(this).prop('checked') ;
        $('input:checkbox:enabled').each( function() {
            $(this).attr('checked', check) ;
        });
    });

// E.I. Delete abandoned cart records
   $('#delete_ac').click( function() {
        var url = $(this).attr('link') ;
        var parm = '';
        var val ;
        $('td > input:checkbox').each( function() {
            if ($(this).attr('checked')) {
                val = $(this).val();
                parm += val + ',' ;
            }
        });

        if (parm.length == 0) {
            alert(alert_msg['no_parameters']);
            return false;
        }else{
            parm = parm.substr(0, parm.length - 1) ;
        }

        if (confirm(alert_msg['delete_confirm']) == false ) return false;
        // Loading indicator start
        setLoadingIndicator() ;
        //
        $.ajax({
            type: "POST",
            url: url,
            data: {
                'marked_cart_id': parm,
                'mark_option': 'delete_marked'
            },
            success: function(){
                $('input:checkbox').each( function() {
                    if ($(this).attr('checked')) {
                        $('#row_' + $(this).val()).hide();
                        $(this).attr('checked', false);
                    }
                    $('#select_all').attr('checked', false);
                });
                alert(alert_msg['del_success']);
            }
         });
        return false;
    });

// E.I. Update column is_ordered for Order Items report
   $('#ordered').click( function() {
        var url = $(this).attr('link') ;
        var parm = '';
        $('td > input:checkbox').each( function() {
            if ($(this).attr('checked')) {
                parm += $(this).val() + ',' ;
            }
        });

        if (parm.length == 0) {
            alert(alert_msg['no_parameters']);
            return false;
        }else{
            parm = parm.substr(0, parm.length - 1) ;
        }
        
        var ordered = $('select option:selected').val();
        if (ordered.length == 0) {
            alert(alert_msg['no_value']);
            $('select').focus() ;
            return false;    
        }
        
        if (confirm(alert_msg['update_confirm']) == false ) return false;                 
        
        $.ajax({
            type: "POST",
            url: url,
            data: {
                'marked_items': parm,
                'mark_option': 'update_order_items',
                'value': ordered
            },
            success: function(){
                $('td > input:checkbox').each( function() {
                    if ($(this).attr('checked')) { 
                        $('#row_' + $(this).val() + ' td').each( function() { 
                            if ( $(this).html() == 'No' || $(this).html() == 'Yes' ){
                                val = (ordered > 0) ? 'Yes' : 'No' ;
                                $(this).html(val) ; 
                            }
                        });
                        $(this).attr('checked', false);
                        $(':selected').prop('selected', false);
                    }
                    $('#select_all').attr('checked', false);
                });
                alert(alert_msg['update_success']);
            }
         });
        return false;
    });

// E.I. Generate Price report
   $('#generate_report').click( function() {
        var url  = $('#script_link').val() ;
        var redirect  = $('#redirect').val() ;
        var file_path = $('#report_path').val() ;
        var file_link = $('#report_link').val() ;
        // Disable submit button
        $(this).attr('disabled', true);
        // Loading indicator
        setLoadingIndicator() ;
        //
        $.ajax({
            type: "POST",
            url: url,
            data: {
                'report_link': file_link,
                'report_path': file_path
            },
            dataType: 'json',
            success: function(data){
                if (data.retValue) { 
                    document.location.href = redirect ;
                }else{
                    $('#message').html('<span style="color:red">'+data.retText+'</span>');
                }
                $('#generate_report').attr('disabled', false);
           }
        });
        return false;
    });
// E.I. Sending Order Aging Report
// Check email before sending
    $('#send_aging').click( function() {
        return checkEmail($('#email'));
    })

// E.I. Clear form button functionality
    $('#reset').click( function(){
        $('#reports input:text').each( function() {
            $(this).val('');
        });
        $('select option').each( function() {
            $(this).prop('selected',false);
        });
        return false ;
    });

// E.I. Function to show/hide lists of something...
// Now is using for Items list and User IP for ACReport, short description columns
    $('.show_list').hover(
        function() {  
            var el  = $('#list_'+ $(this).attr('id'));
            var td  = $('#td_'+ $(this).attr('id'))
            var top = td.offset().top - el.outerHeight(true) - 2; // -2 is a border width
            var lft = td.position().left + 9; // +9 align to left edge of cell border
            if ( top < window.pageYOffset ) top = td.offset().top + td.outerHeight(true) + 2; // +2 is a border width 
            if ( lft > $(window).width() - el.outerWidth(true) )  lft = $(window).width() + window.pageXOffset - el.outerWidth(true);
            el.show(100);
            el.offset({ top: top, left: lft })
        },
        function() {
            $('#list_'+ $(this).attr('id')).hide();}
    );


// E.I. Filter for ACReport
// FIlter ON
    $('#dbg_navigator_on').click( function() {
        var parm = '';
        var str = $.trim( $('#filter_parm').val() );

        if (str.length > 0){
            $('.to_filter:contains("'+str+'")').each( function() {
                parm += '#' + $(this).attr('id') + ',' ;
            });
            $('.to_filter').not(parm).hide();
        }
    });
// Filter OFF
    $('#dbg_navigator_off').click( function() {
        $('.to_filter:hidden').show() ;
        $('#filter_parm').val('')
    });

// E.I. For sorting column change the color
    $('.col_sorted').click( function() {
        $(this).css('color','white') ;
        $('.col_sorted').not($(this)).css('color','black')
    });

// E.I Set alert functon for Shipment report
    $('tr').click( function(eventObject) {
    // E.I. Start alert by pressing Alt+Click        
        if (eventObject.altKey) {
            var row  = $(this).attr('id');
            var type = $('#report_type').val();
            if (row && type == 'shipment'){
                var el  = '#alert_'+row ;
                var set = $('#set_alert_'+row).val()
                var act = el+' :first-child';
                var url = $('#url').val() ;
        // Stop alert
                if (set > 0) {
                    if ( confirm(alert_msg['stop_alert']+' 0'+row+'?') ){
                        $(act).css('color', 'blue');
                        stop_id = $('#time_id_'+row).val();
                        $('#set_alert_'+row).val('0');
                        $(el).show();
                        clearInterval(stop_id);
                        $.ajax({
                            type: "GET",
                            url: url,
                            data: {
                                'order_id': row,
                                'action': 'unset'
                            }
                         });
                    }
                    return false ;
                }
        // Start alert
                if ( confirm(alert_msg['start_alert']+' 0'+row+'?') ){
                    $(act).css('color', 'red');
                    var time_id = blinkText( $(el), 500 );
                    $('#time_id_'+row).val(time_id);
                    $('#set_alert_'+row).val('1');
                    $.ajax({
                        type: "GET",
                        url: url,
                        data: {
                            'order_id': row,
                            'action': 'set_alert'
                        }
                     });
                }
            }
        }
    });

// E.I. Highlight current (active) row of report
    $('#reports tr').click( function() {
        row_id = $(this).attr('id') ;
        if (row_id){
            $('#' + row_id + ' td').css('background-color', '#FF6');
            $('#reports td:not(#' + row_id + ' td)').css('background-color', '#CCC');
        }
    });    
// E.I. Delete item from cart
    $('.img-delete').click( function() {
        var item   = $(this).attr('id') ;
        var vendor = $(this).attr('vendor') ;
        var price  = Number($(this).attr('price')) ;
        var qty    = Number($(this).attr('qty')) ;
        var url    = $('#url').val() ;
        var i = 1 ;
        
//        $('#cart tr:has(td:has(img[id='+item+']))').hide()  ;
        $(this).closest('tr').hide()  ;
        $('#cart #'+item+'-discount').hide()  ;
        $('.items:visible:odd').css('background-color', '#DDD') ;
        $('.items:visible:even').css('background-color', '#EEE') ;
        
        // Set color to row under item row (discount, if exists)
        $('.item-discount:visible').each( function() {
            var item_disc = $(this).attr('id').substring( 0, $(this).attr('id').lastIndexOf('-') ) ;
            var bg_color  = $('#cart tr:has(td:has(img[id='+item_disc+']))').css('background-color');
            $(this).css('background-color', bg_color) ;  
        })

        $('.items:visible > .cartRecord').each( function() {
            $(this).text(i++) ;
        })
        // Delete record from the database        
        $.ajax({
            type: 'POST',
            url: url,
            data: {
                'item_id': item,
                'action': 'delete_item'
            }
        });
        
        var total_usd = Number($('#usd').text()) - price ;
        var total_qty = Number($('#total_items').text()) - qty ; 
        if (total_usd == 0 ){
            alert('Your shopping cart is empty!') ;
            document.location.href = 'customer/cart.html?page=200' ; 
            return false ;
        }
        $('#usd').html(total_usd.toFixed(2)) ;
        $('#total_usd').html(total_usd.toFixed(2)) ;
        $('#total_items').html(total_qty) ;
        $('#cart_total_usd').html(total_usd.toFixed(2)) ;
        $('#cart_total_items').html(total_qty) ;
        // Set new value for minimum order total
        min_order_sum = Number($('.min-order-'+vendor).text()) - price;
        if (min_order_sum == 0){
            $('#min-order-'+vendor).hide();
        }else{
            $('.min-order-'+vendor).html(min_order_sum.toFixed(2));
        }

        return false ;
    })
// E.I. Before delete all items from cart
    $('#delete_all_items').click( function() {
        return confirm('Do you realy want to delete all the items from your cart?') ;
    })    

// E.I. Check required fields on Update Products page
// May be used for any tables with input, select, checkbox and textarea fields
// The attributes of tag for those fields should look like <... is_required="Y" field_name="Field Name" >
    $('#add-to-dataset').click( function() {
        var val, ret = true;
        $("*[is_required='Y']").each( function() {
            val = $(this).val();
            if ( $.trim(val) == ''){
                alert('Field "'+$(this).attr('field_name')+'" is required!');
                $(this).focus();
                ret = false;
                return ret;
            }
            ret = checkVendorPartNumber(val);
            return ret;
        })
        return ret ;
    })
// E.I. Character counter for Product Update fields
    $('.counter').keyup( function(){
        count = $(this).val().length ;
        color = (count > 254) ? 'red' : 'blue' ;
        $( '.'+ $(this).attr('id') +'_counter_value').text(254 - count).css('color', color) ;
    })
    
// E.I. Check fields before update
// May be used for all reports with checkboxes.
// Just add class "update_button" to any submit button "Update" 
    $('.update_button').click( function() {
        var ret = false;

        $('input:checkbox:enabled').each( function() {
            if ( !$(this).is('#select_all') ){ 
                if ( $(this).prop('checked') == true ){   
                    ret = true ;
                    return false;                
                }
            }
        });

        if (!ret) alert(alert_msg['no_parameters']);
        return ret ;
    })
    
/////////////////////////////
//    Basic functons here
/////////////////////////////
// E.I Check Vendor Part Number for duplicate
// Now is used on ProductUppdate page -> Add new record
    function checkVendorPartNumber(vendor_part_number){
        if ( $('#vendor_part_number').val().indexOf(':'+vendor_part_number+':') != -1 ) {
            alert('Vendor part number "'+vendor_part_number+'" already exists in the dataset!');
            return false;
        }
        return true;
    }
// E.I. Email field validation
// @email - Jquery object
// For future:
// email:   ^([a-z0-9_-]+\.)*[a-z0-9_-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.[a-z]{2,4}$
// http:    ^((https?|ftp)\:\/\/)?([a-z0-9]{1,})([a-z0-9-.]*)\.([a-z]{2,4})$
// phone:   ^\+\d{2}\(\d{3}\)\d{3}-\d{2}-\d{2}$
    function checkEmail(email) {
        var pattern = new RegExp(/^([a-z0-9_-]+\.)*[a-z0-9_-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.[a-z]{2,4}$/);
     	if(!pattern.test(email.prop('value'))){
            alert(alert_msg['check_email']);
            email.focus();
            return false;
        }
        return true;        
    }    

// E.I. blincking text
    function blinkText( el, msec ) {
        var time_id = setInterval(function(){
            $(el).toggle();
        }, msec )
        return time_id ;
    }
// E.I. Show "Wait, please.." message to a user during the process    
    function setLoadingIndicator() {
        $.ajaxSetup({
            beforeSend: function(){
                var loading = $("<div>", {"class" : "ds-loading"});
                $(loading).css("top", ($(window).height()/2)-($(loading).height()/2)).css("left", ($(document).width()/2)-($(loading).width()/2));
                $(loading).html('<p>Wait, please...</p>')
                $("body").append(loading);
                blinkText($(".ds-loading"), 1000);
            },
            complete: function() {
                $(".ds-loading").detach();
            }
        });        
    }

})

// E.I. User function TRIM. Not present in JavaScript.
// ... but present in jQuery as jQuery.trim(string); :-((
function trimStr (s) {
	s = s.replace(/^\s+/, '');
	for (var i = s.length - 1; i >= 0; i--) {
		if (/\S/.test(s.charAt(i))) {
			s = s.substring(0, i + 1);
			break;
		}
	}
	return s;
}
