/**
 * build http query string
 * 
 * @param queries
 * @param numericPrefix
 * @param separator
 * @return
 */
function httpBuildQuery(queries, numericPrefix, separator) {
    var value, key, tmp = [];
    var _httpBuildQueryHelper = function(key, value, separator) {
        var k, tmp = [];
        if (value === true) {
            value = "1";
        } else if (value === false) {
            value = "0";
        }
        if (value !== null && typeof (value) === "object") {
            for (k in value) {
                if (value[k] !== null) {
                    tmp.push(_httpBuildQueryHelper(key + "[" + k + "]", value[k], separator));
                }
            }
            return tmp.join(separator);
        } else if (typeof (value) !== "function") {
            return encodeURIComponent(key) + "=" + encodeURIComponent(value);
        } else {
            throw new Error(
                    'There was an error processing for httpBuildQuery().');
        }
    };
    if (!separator) separator = "&";
    for (key in queries) {
        value = queries[key];
        if (numericPrefix && !isNaN(key)) {
            key = String(numericPrefix) + key;
        }
        tmp.push(_httpBuildQueryHelper(key, value, separator));
    }
    return tmp.join(separator);
}

/*
 * 丸めて三桁
 * 
 * @param price
 * @return price
 */
function formatPrice(price)
{
    var num = new String(Math.floor(price)).replace(/,/g, "");
    while(num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2")));
    return num;
}

/*
 * 価格表示
 * 
 * @param price
 * @return price
 */
function showPrice(price)
{
    if (price == 99999999) return '価格設定中';
    return '&yen;' + formatPrice(price);
}

/**
 * 配列重複値削除
 * 
 * @param array
 * @return array
 */
function unique(array) {
    var storage = {};
    var uniqueArray = [];

    var i, value;
    for (i = 0; i < array.length; i++) {
        value = array[i];
        if (value == '' || value == 'undefined' || value == null) continue;
        if (!(value in storage)) {
            storage[value] = true;
            uniqueArray.push(value);
        }
    }
    return uniqueArray;
}

/**
 * 検索条件の各種パラメータを返却する
 * 
 * @param string className
 * @param boolean unjoin
 * @return array
 */
function getSelectedParams(className, unjoin) {
    var result = $(className).map(function() {
        if ($(this).attr('checked') == true) {
            return $(this).val();
        }
    }).get();
    if (unjoin) return result;
    return result.join(",");
}

/**
 * 配列の中にキーある？
 * 
 * @param array array
 * @param string value
 * @return boolean
 */
function inArrayKey(array, value) { 
    for (key in array) {
        if(key == value) return true;
    }
    return false;
}

/**
 * クエリストリングを配列にして返却する
 * 
 * @return array
 */
function getUrlVars() 
{ 
    var vars = [], hash; 
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&'); 
    for(var i = 0; i < hashes.length; i++) { 
        hash = hashes[i].split('='); 
        vars.push(hash[0]); 
        vars[hash[0]] = hash[1]; 
    } 
    return vars; 
}

/**
 * idsからshopコードとbikeコードを分離して、それぞれの配列に入れるだけ
 * idsの値が{shopCode}_{bikeCode}のフォーマットで格納されてることが前提
 * 
 * @param array ids
 * @param array shopCodes
 * @param array bikeCodes
 */
function convertIdsToBikeAndShopCode(ids, bikeCodes, shopCodes)
{
    if (ids.length == 0) return;
    $.each(ids, function(key, value) {
        var codes = value.split('_');
        if (codes.length == 2) {
            if (shopCodes instanceof Array) shopCodes.push(codes[0]);
            if (bikeCodes instanceof Array) bikeCodes.push(codes[1]);
        }
    });
}

(function($){
    /**
     * cookie
     */
    $.cookie = function(name, value, options){
        if (arguments.length == 0) {
            var pairs = document.cookie.split('; ');
            var ret = {};
            $.each(pairs, function(i, v){
                var pair = v.split('=');
                ret[pair[0]] = pair[1];
            });
            return ret;
        } else if(arguments.length == 1) {
            var match = (['; ', document.cookie, ';'].join('')).match(['; ', name, '=([^;]*)?;'].join(''));
            return match ? decodeURIComponent(match[1]) : '';
        } else {
            options = $.extend({
                expires: (function(){
                    var d = new Date;
                    d.setTime(d.getTime() + 24*60*60*1000 * 365);
                    return d;
                })(),
                path: '/',
                domain: '',
                secure: ''
            }, options);
            var expires = '; expires=' + options.expires.toGMTString(),
                path = options.path ? '; path=' + (options.path) : '',
                domain = options.domain ? '; domain=' + (options.domain) : '',
                secure = options.secure ? '; secure' : '';
            document.cookie = [
                [encodeURIComponent(name), '=', encodeURIComponent(value)].join(''),
                expires,
                path,
                domain,
                secure
            ].join('');
        }
    };
    /**
     * blink
     */
    $.fn.blink = function(times, speed, opacity, callback) {
        var $this = this;
        if (!callback) {
            if (!opacity) {
                if($.isFunction(speed)){
                    callback = speed;
                    speed = 0;
                }
            } else {
                if ($.isFunction(opacity)) {
                    callback = opacity;
                    opacity = 0;
                }
            }
        }
        speed = speed || 'normal';
        opacity = opacity || 1;
        var count = 0;
        (function func_blink(){
            var func = arguments.callee;
            $this.fadeTo(speed, 0, function(){
                $this.fadeTo(speed, opacity, function(){
                    if (++count < times) {
                        func();
                    } else {
                        if (callback && $.isFunction(callback)) callback.apply(this, arguments);
                    }
                });
            });
        })();
        return $this;
    };
})(jQuery);
