if(!Object.keys) Object.keys = function(o){
    if (o !== Object(o))
        throw new TypeError('Object.keys called on non-object');  
    var ret=[],p;
    for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
    return ret;
}  

genio.validation = {};

genio.validation.formValidator = function(object, settings) {
    settings = settings || {};
    settings.fields = settings.fields || {};
    
    var $root = $(object);
    
    var $elements = $root.find('input, select, textarea').not(':submit, :reset, :image, [disabled], :hidden');
    
    var validate = function() {
        var errors = {};
        
        $elements.each(function(index, element) {
            var $el = $(element);
            var $li = $el.closest('li.genio_field');
            var value = $el.val();
            if ($el.attr('type') == 'checkbox' && !$el.attr('checked'))
                value = null;
            var id = element.id;
            var type = '';
            if (settings.fields[element.id] && settings.fields[id].type)
                type = settings.fields[id].type;
            console.log(id + ': ' + value);
            switch (type) {
                default:
                    value = $.trim(value);
                    break;
            }
            if ($li.find('.required').length) {
                if (value.length == 0) {
                    errors[id] = true;
                }
            }
        });
        
        return errors;
    }
    
    var self = this;
    $root.submit(function() {
        $root.find('li').removeClass('error');
        var errors = validate();
        for (var id in errors) {
            $root.find('li.' + id).addClass('error');
        }
        return Object.keys(errors).length == 0;
    });
};

genio.catalogue = {};

genio.catalogue.addToWishlist = function(productId) {
    var baseQuery = "#product_" + productId + " .wishlist ";
    $(baseQuery + ".post").hide();
    $(baseQuery + ".loading").show();
    var item = {"product_id": productId};
    $.ajax({
        url: genio.catalogue_wishlist_rest_post,
        data: item,
        type: "POST",
        success: function() {
            $(baseQuery + ".delete").show();
        },
        error: function() {
            alert(genio.i18n.error);
            $(baseQuery + ".post").show();
        },
        complete: function() {
            $(baseQuery + ".loading").hide();
        }
    });
}

genio.catalogue.removeFromWishlist = function(productId) {
    var baseQuery = "#product_" + productId + " .wishlist ";
    $(baseQuery + ".delete").hide();
    $(baseQuery + ".loading").show();
    $.ajax({
        url: genio.catalogue_wishlist_rest_post + "/" + productId,
        type: "POST",
	data: "sf_method=DELETE",
        success: function() {
            $(baseQuery + ".post").show();
        },
        error: function() {
            alert("Error");
            $(baseQuery + ".delete").show();
        },
        complete: function() {
            $(baseQuery + ".loading").hide();
        }
    });
}

genio.catalogue.updateProductItem = function(versionId, $root) {
    $root.find('.prices').hide();
    $root.find('.version_' + versionId).show();
    $root.find('form [name="id"]').val(versionId);
}

genio.commerce = {};

genio.commerce.hasMiniCart = function() {
    return $('#genio_minicart').length > 0;
}

genio.commerce.getMiniCart = function() {
    return $('#genio_minicart:first');
}

genio.commerce_minicart_working = false;

genio.commerce.minicartExecute = function(url, data, action) {
    if (genio.commerce_minicart_working)
        return false;
    genio.commerce_minicart_working = true;
    if (!genio.commerce.hasMiniCart())
        return true;
    var minicart = genio.commerce.getMiniCart();
    minicart.addClass('loading');
    var classes = minicart.attr('class').split(' ');
    var template = false;
    for (var i in classes)
        if (classes[i].indexOf('template_') === 0){
            template = classes[i].substr(9);
            if (template.length == 0)
                template = false;
            break;
        }

    if (template)
        url += '?template=' + template;
    var loader = $.gritter.add({
        image: '/genio/preloaders/48x48/circular_lines_black.gif',
        title: genio.i18n.loading,
        text: genio.i18n.loading,
        sticky: true
    });
    $.ajax(url, {
        cache: false,
        complete: function() {
            genio.commerce_minicart_working = false;
            minicart.removeClass('loading');
            $.gritter.remove(loader, {fade: false});
        },
        data: data,
        error: function() {
            alert(genio.i18n.error);
        },
        success: function(data) {
            genio.commerce.getMiniCart().replaceWith(data.html);
            $.gritter.add({
              image: data.img,
              title: genio.i18n.commerce.minicart_title,
              text: genio.i18n.commerce.minicart_text[action],
              time: 4000
            });
        },
        type: 'POST'
    });

    return false;
}

genio.commerce.minicartAdd = function(form) {
    if ($(form).children('[name=quantity]').val() > 0)
        return genio.commerce.minicartExecute(genio.commerce_minicart_add, $(form).serializeArray(), 'add');
    else
        return false;
}

genio.commerce.minicartRemove = function(id) {
    return genio.commerce.minicartExecute(genio.commerce_minicart_remove, {id: id}, 'remove');
}


