/**
 * Helper functions for ajax list 
 */
 
function ajaxPagerUrl(url, container)
{
    var params = [];
    if (getSearchParams !== null) {
        params = getSearchParams();
    }
    _jq(container).block({message: '少々お待ちください...'});
    new Ajax.Request(url, {
        method: 'get',
        parameters: params,
        onComplete: function(tr) {
            _jq(container).unblock();
            _jq(container).html(tr.responseText);
        },
        onCreate: function() {
            //_jq(container).block({message: '少々お待ちください...'});
        },
        onException: function () {
            _jq(container).unblock();
        }
    });
}

function addProductToCompare(url)
{
    new Ajax.Request(url, {
        method: 'get',
        onComplete: function(tr) {
            alert('比較リストに追加できました。');
        },
        onException: function () {
            alert('比較リストに追加できませんでした。MoonLabelの管理者に連絡お願いいたいます。');
        }
    });
}

function number_format(number, decimals, dec_point, thousands_sep) {
    var n = !isFinite(+number) ? 0 : +number, 
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        s = '',
        toFixedFix = function (n, prec) {
            var k = Math.pow(10, prec);
            return '' + Math.round(n * k) / k;
        };
    // Fix for IE parseFloat(0.55).toFixed(0) = 0;
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
}
 
function formatPrice(price) { 
    return number_format(price, 0, '.', ',');
}
    
function formatSize(size) {
    return size;
}

ProductLoader = Class.create();
ProductLoader.prototype = {
    initialize: function(url, pageSize, page, container) {
        this.pageSize = pageSize;
        this.page = page;
        this.container = container;
        this.url = url;
        this.completed = false;
    },
    
    load: function(params, callback) {
        var self = this;
//
//        self.page = self.page + 1;
//        params.page_size = this.pageSize;
//        params.page = self.page;
        
        new Ajax.Request(this.url, {
            method: 'get',
            parameters: params,
            onComplete: function(tr) {
                try {
                    if (tr.responseText.isJSON()) {
                        var result = tr.responseText.evalJSON();
                        if (result.completed === true) {
                            self.completed = true;
                        }
                    } else {
                        _jq(self.container).append(tr.responseText);
                    }
                    callback(self);
                } catch (e) {}
            },
            onException: function () {
                self.completed = true;
            }
        });
    },
    
    reset: function(callback) {
        this.page = 0;
        this.completed = false;
        _jq(this.container).html('');
        if (callback != undefined) {
            callback(this);
        }
    }
}

/******************** Attribute Loader ***********************/
var FIX_PARAMS = $H({'pearl_type': ['attribute_set_id'],
                     'size': ['attribute_set_id', 'pearl_type'],
                     'shape': ['attribute_set_id', 'pearl_type', 'size'],
                     'color': ['attribute_set_id', 'pearl_type', 'size', 'shape'],
                     'kizu': ['attribute_set_id', 'pearl_type', 'size', 'shape', 'color'],
                     'teri': ['attribute_set_id', 'pearl_type', 'size', 'shape', 'color', 'kizu']
                    });

AttributeLoader = Class.create();
AttributeLoader.prototype = {
    initialize: function(url, history, rootParam) {
        this.history = history; //should be a Hash object
        this.url = url;
    },
    
    load: function(rootParam, callback) {
        var params = this.getLoadParams();
        params.set('root', rootParam);
        var self = this;
        new Ajax.Request(this.url, {
            method: 'get',
            parameters: params,
            onComplete: function(tr) {
                try {
                    if (tr.responseText.isJSON()) {
                        var result = tr.responseText.evalJSON();
                        self.update(result);
                    }
                    if (callback) {
                        callback(self);
                    }
                } catch (e) {
                    console.log(e);
                }
            }
        });
    },
    
    update: function(data) {
        var hashData = $H(data);
        var self = this;
        FIX_PARAMS.keys().each(function(el) {
            var items = self.getItemData(el, hashData);
            self.updateSelectItem(el, items);
        });
    },
    
    getLoadParams: function() {
        var params = new Hash();
        params.set('attribute_set_id', this.history.get('attribute_set_id'));
        FIX_PARAMS.keys().each(function(el){
            var val = $('select_' + el).value;
            if (val != 0) {
                params.set(el, val);
            }
        });
        
        return params;
    },
    
    updateSelectItem: function(itemId, data) {
        //clear all current items
        var select = $('select_' + itemId);
        select.childElements().each(function(e){
            e.remove();
        });
        data.keys().each(function(key) {
            var selected = '';
            var html = '<option value="' + key + '">' + data.get(key) + '</option>';
            select.insert(html);
        });
        
        select.value = this.history.get(itemId);
    },
    
    getItemData: function(item, data) {
        var keys = [item];
        var depends = FIX_PARAMS.get(item);
        var self = this;
        depends.each(function(df){
            keys.push(self.history.get(df));
        });
        var key = keys.join('_');
        
        return $H(data.get(key));
    }
};
