function checkTableRow(row_header)
{
    var j_row_header = jQuery(row_header);
    var checkboxes = j_row_header.parent().find("input[type=checkbox]");
    if (j_row_header.data("check_all") != "on") {
        checkboxes.attr("checked", "checked");
        j_row_header.data("check_all", "on");
    } else {
        checkboxes.removeAttr("checked");
        j_row_header.data("check_all", "off");
    }
}

function checkTableColumn(col_header)
{
    var j_col_header = jQuery(col_header);
    var el = col_header;
    var i = 0;
    while (el.previousSibling != null) {
        el = el.previousSibling;
        i = i + 1;
    }
    var table = j_col_header.closest("table");
    var checkboxes = table.find("tr td:nth-child("+(i)+") input[type=checkbox]");
    if (j_col_header.data("check_all") != "on") {
        checkboxes.attr("checked", "checked");
        j_col_header.data("check_all", "on");
    } else {
        checkboxes.removeAttr("checked");
        j_col_header.data("check_all", "off");
    }
}

function checkTableAll(toggle_link)
{
    var j_toggle_link = jQuery(toggle_link);
    var checkboxes = j_toggle_link.closest("table").find("input[type=checkbox]");
    if (j_toggle_link.data("check_all") != "on") {
        checkboxes.attr("checked", "checked");
        j_toggle_link.data("check_all", "on");
    } else {
        checkboxes.removeAttr("checked");
        j_toggle_link.data("check_all", "off");
    }
}

// adds value to the end of comma-separated list if it is not already present
function appendValToCSVList(csv_list_str, val)
{
    if (csv_list_str) {
        var csv_array = csv_list_str.split(";");
        var in_array = false;
        for (var i = 0; i < csv_array.length; i++) {
            if (csv_array[i] == val) {
                in_array = true;
                break;
            }
        }
        if (!in_array) {
            csv_array.push(val);
            return csv_array.join(";");
        } else {
            return csv_list_str;
        }
    } else {
        return val;
    }
}

// removes value from comma-separated list if it is present
function removeValFromCSVList(csv_list_str, val)
{
    if (csv_list_str) {
        var csv_array = csv_list_str.split(";");
        var csv_array_new = [];
        for (var i = 0; i < csv_array.length; i++) {
            if (csv_array[i] != val) {
                csv_array_new.push(csv_array[i]);
            }
        }
        return csv_array_new.join(";");
    } else {
        return csv_list_str;
    }
}

// sanitizes value of link input and opens link in new window
function popupLink(link_button)
{
    var j_link_button = jQuery(link_button);
    var j_link_input = jQuery("#" + j_link_button.attr("rel"));
    var url = j_link_input.val();
    url = url.replace("http://", "");
    j_link_input.val(url);
    if (url) {
        window.open("http://" + url);
    }
    return false;
}

// checks if keyCode is in special eyCodes list
function isSpecialKey(keyCode)
{
    var codes = jQuery.ui.keyCode;
    switch (keyCode) {
        case codes.ENTER:
            return true;
        case codes.TAB:
            return true;
        case codes.TOP:
            return true;
        case codes.RIGHT:
            return true;
        case codes.DOWN:
            return true;
        case codes.LEFT:
            return true;
        default:
            return false;
    }
}

// stores user-level setting using AJAX on server
function storeUserSetting(service_url, name, val)
{
    jQuery.get(service_url + '?name=' + name + '&value=' + val);
}

// converst given associative array {k1: 'v1', k2: 'v2', ...} into GET query string k1=v1&k2=v2& ...
function mapToGetParams(map)
{
    var out = [];
    var val = '';
    for (var k in map) {
        if (map[k].val) {
            val = map[k].val();
        } else {
            val = map[k];
        }
        out.push(k + '=' + val);
    }
    return out.join('&');
}

// post-initialization of displayed clueTip - onmouseout handling
function clueTipPostInit(ct, c) {
    ct.mouseover(function() {jQuery(this).data("underCursor", 1);} );
    ct.mouseout(function() {jQuery(this).data("underCursor", 0);} );
    jQuery(this).mouseout(function () {
        var t;
        t = setTimeout(function() {
            if (!ct.data("underCursor")) {
                ct.hide();
                clearTimeout(t);
            }
        }, 500);
    });

}

// post-initialization of displayed clueTip - onmouseout handling including AJAX dialog init
function clueTipPostInitAjax(ct, c) {
    clueTipPostInit(ct, c);
    initDefaultAjaxDialog();
}


// initialization of clueTip popup
function clueTipInit(selector, opts)
{
    defaults = {
            showTitle:false,
            leftOffset: -150,
            topOffset: 10,
//             local: true,
            dropShadow: false,
            sticky:true,
            mouseOutClose: true,
            clickThrough: true,
            closePosition: 'title',
            width: 1000,
            ajaxCache: false,
            mouseOutClose: true,    // close when clueTip is moused out
            delayedClose: 0,
            tracking: false
//             onShow: clueTipPostInitAjax // utils.js
    };
    if (opts) {
        jQuery.extend(defaults, opts);
    }

    var t;

    $(selector).cluetip(defaults);
    $(selector).mouseout(function(){
        t = setTimeout(function() {
            jQuery("#cluetip").hide();
        }, 500);
    });
    jQuery("#cluetip").mouseover(function(){
        clearTimeout(t);
    });
}

/*
// recount value in one currency to another
function recountValueToCurrency(value, curr1, curr1_rate, curr2, curr2_rate, system_currency) {
    var val;
    if (curr1 == system_currency) {
        val = value * curr2_rate
    } else {
        val = value / curr1_rate * curr2_rate
    }
    return Math.round(val * 100) / 100;
}
*/

// init of JS CurrencySelect
function bindCurrencySelect(select, price_input, url)
{
    function currencyChange() {
        var val = select.val();
        var lastVal = select.data("actualCurrency");
        if (val == lastVal) {
            return;
        }
        if (val && lastVal && price_input.val()) {
            jQuery.getJSON(url, {price: price_input.val(), from_currency: lastVal, to_currency: val}, function(data) {
                if (data["price"]) {
                    price_input.val(data["price"]);
                }
            });
        }
        select.data("actualCurrency", val);
    }
    select.change(currencyChange);
    select.data("actualCurrency", select.val());
}

// init of JS UnitDomainSelect
function bindUnitDomainSelect(select, value_input, url)
{
    function unitDomainChange() {
        var domain = select.val();
        var lastDomain = select.data("actualUnitDomain");
        if (domain == lastDomain) {
            return;
        }
        if (domain && lastDomain && value_input.val()) {
            jQuery.getJSON(url, {value: value_input.val(), unit: select.attr("rel"), from_domain: lastDomain, to_domain: domain}, function(data) {
                if (data["value"]) {
                    value_input.val(data["value"]);
                }
            });
        }
        select.data("actualUnitDomain", domain);
    }
    select.change(unitDomainChange);
    select.data("actualUnitDomain", select.val());
}

// image thumbnail in cluetip init
function initImageThumbClueTip(selector)
{
    var opts = {
        local: true,
        sticky:true,
        onShow:clueTipPostInit,
        width: 160
    };
    clueTipInit(selector, opts);
}



var reEscape = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g');
// function for highliting product status in AJAX autocomplete
function fnFormatResultProduct(value, data, currentValue) {
    var pattern = '(' + currentValue.replace(reEscape, '\\$1') + ')';
    return value.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>').replace(new RegExp('(status: [a-zA-Z]+)', 'gi'), '<br /><strong style="margin-left: 200px; color:grey;">$1<\/strong><br />&nbsp;')
}


/**
 * Init AJAX-loading of tip baloon content on hover on 'handle' element
 */
function initAjaxTip(handle_class, holder_class, container)
{
    if (container) {
        var elements = container.find("." + handle_class);
    } else {
        var elements = jQuery("." + handle_class);
    }
    elements.find("." + holder_class).css({visibility: 'hidden'});
    elements.mouseenter(function() {
        var content = jQuery(this).find("." + holder_class);
        if (!content.data("content-loaded")) {
            content.data("content-loaded", true);
            content.load(jQuery(this).attr("rel"), function() { content.css({visibility: 'visible'}); initDefaultAjaxDialog(); });
        }
    });
}


