if (!Array.indexOf) {
    Array.prototype.indexOf = function(obj) {
        for(var i = 0; i < this.length; i ++) {
            if(this[i] == obj) return i;
        }
        return -1;
    }
}

number_format = function(number, decimals, point) {
    decimals = decimals || 3;
    point = point || ",";
    var as_str = "" + number;
    var formatted = "";

    for (var i = 0; i < as_str.length; i ++) {
        var tmp = as_str.length - (i + 1);
        if(i && i % decimals == 0) {
            formatted = point + formatted;
        }
        formatted = as_str.charAt(tmp) + formatted;
    }
    return formatted;
}

/*
    Namespace: npine
*/
window.npine = {
    vars: {},

    /*
        Function: suggestKeywords
            추천 검색어 박스를 표시합니다.
        Parameters:
            text - 검색 키워드
        Author:
            Heungsub <sub@npine.com>
    */
    lastKeywords: '',
    selectedKeyword: null,

    suggestKeywords: function(e) {
        e = e || window.event;
        if ([9, 13, 16, 17, 18, 19, 20, 27, 33, 34, 35, 36, 37, 38,
             39, 40, 45, 91, 93].indexOf(e.keyCode) != -1) return;
        var query = $('#search-query').val();

        if (e.keyCode && window.npine.lastKeywords == query) return;
        else window.npine.lastKeywords = query;

        npine.selectedKeyword = null;

        if (query) {
            npine.openSuggestedKeywords();
        } else {
            return npine.closeSuggestedKeywords();
        }

        var url = '/ajax/keywordSuggestion';
        var args = {prefix: query};

        var wrap = $(".keyword-suggestion");
        var dialog = wrap.find("> table");

        $.getJSON(url, args, function(result) {
            dialog.html("");
            if (!$(result).length) wrap.hide();
            $.each(result, function(i, keyword) {
                dialog.append($(
                    '<tr><td onmousemove="npine.selectSuggestedKeyword(false, false, $(this));" onclick="npine.selectSuggestedKeyword(false, true, $(this));"><span class="schtxt3">' +
                    keyword.slice(0, query.length) + '</span>' +
                    keyword.slice(query.length) +
                    '</td></tr>'
                ));
            });
        });
    },

    openSuggestedKeywords: function() {
        var area = $('.keyword-suggestion').show().parent();
        var blur = function(e) {
            var pos = area.position();
            var size = {w: area.width(), h: area.height()};

            var inner_w = e.pageX >= pos.left && e.pageX <= pos.left + size.w;
            var inner_h = e.pageY >= pos.top && e.pageY <= pos.top + size.h;

            if (!(inner_w && inner_h)) {
                npine.closeSuggestedKeywords();
            }
        }
        $(document).unbind('click', blur).click(blur);
    },

    closeSuggestedKeywords: function() {
        $('.keyword-suggestion').hide();
    },

    navigateSuggestedKeywords: function(e) {
        e = e || window.event;
        selected = npine.selectedKeyword || [];
        if (e.keyCode == 40) {
            if (selected.length) {
                npine.selectSuggestedKeyword(true, true, selected.next('tr'));
            } else {
                npine.selectSuggestedKeyword(true, true, $('.keyword-suggestion tr:first'));
            }
            return false;
        } else if (e.keyCode == 38) {
            if (selected.length) {
                npine.selectSuggestedKeyword(true, true, selected.prev('tr'));
            } else {
                npine.selectSuggestedKeyword(true, true, $('.keyword-suggestion tr:last'));
            }
            return false;
        }
    },

    selectSuggestedKeyword: function(scroll, input, newEl, oldEl) {
        oldEl = oldEl || $('.keyword-suggestion tr');

        oldEl.removeClass('focused');
        newEl.addClass('focused');

        if (scroll) {
            var scrollbox = $(".keyword-suggestion");
            var pos = newEl.offset();
            if (pos && pos.top) {
                scrollbox.scrollTop(
                    pos.top + scrollbox.scrollTop() - scrollbox.offset().top
                );
            }
        }

        if (input) {
            var text = newEl.text();
            if (text) {
                $('#search-query').val(text);
            } else {
                $('#search-query').val(npine.lastKeywords);
            }
        }
        
        npine.selectedKeyword = newEl;
    },

    /*
        Function: countContents
            컨텐츠 검색결과 수를 업데이트합니다.
        Parameters:
            scopes - 검색 조건들
        Author:
            Heungsub <sub@npine.com>
    */
    count: function(serialized_items, options) {
        var el = $(".number-of-total-images");
        var total = $(".number-of-total-pages");

        var page = options.page;
        var limit = options.limit;
        var order = options.order;

        if (el.hasClass("done")) {
            npine.pager(parseInt(el.text().replace(/,/, "")), page, limit);
        } else {
            (function() {
                $.get("/ajax/count",
                      {serialized_items: serialized_items},
                      function(data) {
                          if (!data) {
                              arguments.callee();
                          } else {
                              el.text(number_format(data)).addClass("done");
                              if (page || limit) {
                                  npine.pager(parseInt(data), page, limit);
                                  if (total.length) {
                                      total.each(function(k, v) {
                                          v.innerHTML = number_format(Math.ceil(
                                              parseInt(data) / limit));
                                      })
                                  }
                              } else if (order + 1 == data) {
                                  $(".next-button").hide();
                              }
                          }
                      });
            })();
        }

        $(["illust", "photo", "clipart", "template"]).each(function(i, type) {
            var el = $(".number-of-" + type + "s");
            if (el.length) {
                $.get("/ajax/count",
                      {serialized_items: serialized_items, imageTypes: [type]},
                      function(data) {
                          el.text(number_format(data)).addClass("done");
                      });
            }
        });
    },

    pager: function(total, page, limit) {
        var last = Math.ceil(total / limit);
        var url = location.href;
        url = url.replace(/[\?&]page(=[^&]*)?/, "").replace(/\#.+$/, "");
        var path = url.replace(/\?.*/, "");
        $.get("/ajax/pager",
              {page: page, last: last},
              function(html) {
                  html = html.replace(/#page=/g, url + "&page=")
                             .replace(/\?/g, "&")
                             .replace(new RegExp(path + "&", "g"), path + "?");
                  $(".pager").html(html);
              });
    },

    /*
        Function: checkMemberId
            회원 아이디 중복 체크
    */
    checkMemberId: function(id, input) {
        $.getJSON('/js/internal.php', {
            method: 'checkMemberId',
            id: id
        }, function(data) {
            if (data) {
                alert('사용 가능한 아이디입니다.');
                if (input) {
                    $(input).css('background-color', '#f2ffe2');
                }
            } else {
                alert('사용할 수 없는 아이디입니다.');
                if (input) {
                    $(input).focus();
                }
            }
        });
    },

    /*
    */
    submit: function(form, callback) {
        callback = callback || function() {};
        return callback(form);
    },

    toggleInnerView: function() {
        if ($(this).data("innerView")) {
            return $.proxy(npine.hideInnerView, this)();
        } else {
            return $.proxy(npine.showInnerView, this)();
        }
    },

    showInnerView: function() {
        npine.hideInnerView();

        var self = $(this);
        var match = self.attr("href").match(/items\/((\d+).*)/i);
        var item_no = match[2];
        var path = match[1];

        self.data("innerView", true);

        var url = "/ajax/innerView/" + path;
        var wrap = $('<div class="item-inner-view"></div>');
        var column = $(".item-thumbnail .item-thumbnail-image").index(self);

        wrap.data("column", column);

        $.get(url, function(html) {
            wrap.html(html).appendTo($(".item-thumbnails"));
            npine.updateInnerViewColumn();
        });

        return false;
    },

    hideInnerView: function() {
        $(".item-inner-view").remove();
        $(".item-thumbnail a:has(img)").data("innerView", false);
        return false;
    },

    updateWidth: function() {
        var thumbnail_width = $(".item-thumbnail").width();
        var wrap_width = $(".item-thumbnails").width();

        width = Math.floor(wrap_width / thumbnail_width);
        npine.vars.items_width = width;

        npine.updateInnerViewColumn();
    },

    updateInnerViewColumn: function() {
        var self = $(".item-inner-view");
        if (!self.length) return;

        var thumbnails = $(".item-thumbnail");

        var column = self.data("column");
        var width = npine.vars.items_width;

        var target_column = (1 + Math.floor(column / width)) * width - 1;
        var target_thumbnail = target_column < thumbnails.length
                             ? thumbnails.eq(target_column)
                             : thumbnails.last();
        self.insertAfter(target_thumbnail);
    },

    formValidate: function(form, rules, messages) {
        form = $(form);

        rules = rules || {};
        messages = messages || {};

        form.submit(function() {
            form.errored = false;
        }).validate({
            errorPlacement: function(error, el) {
                if (form.errored) return;
                alert(error.text());
                el.focus();
                form.errored = true;
            },
            rules: rules,
            messages: messages,
            onfocusout: false,
            onkeyup: false,
            onclick: false
        });
    },

    insertToLightbox: function(item_no) {
        if (/lightbox_popup=1/.exec(document.cookie)) {
            var url = "/mypage/lightbox/add";
            $.get(url, {
                item_no: item_no,
                lightbox: 0
            }, function() {
                alert("라이트박스에 저장되었습니다.");
            });
        } else {
            var url = "/popup/lightbox/?item_no=" + item_no;
            return window.open(url, "kcp_card_receipt", $.param({
                "width": 350, "height": 260,
                "toolbars": "no", "resizable": "no",
                "scrollbars": "no", "status": "no"
            }).replace(/&/g, ","));
        }
    },

    certificate: function() {
        var url = "/popup/certificate";
        return window.open(url, "kcp_cash_receipt", $.param({
            "width": 763, "height": 600,
            "toolbars": "no", "resizable": "no",
            "scrollbars": "yes", "status": "no"
        }).replace(/&/g, ","));
    },

    kcpCardReceipt: function(kcp_tno) {
        var url;
        if (kcp_tno) {
            url = "http://admin.kcp.co.kr/Modules/Sale/Card/"
                + "ADSA_CARD_BILL_Receipt.jsp?c_trade_no=" + kcp_tno;
        } else {
            url = "https://secure.kcp.co.kr/findcard/new_homepage/card_use.asp";
        }
        return window.open(url, "kcp_card_receipt", $.param({
            "width": 420, "height": 685,
            "toolbars": "no", "resizable": "no",
            "scrollbars": "no", "status": "no"
        }).replace(/&/g, ","));
    },

    kcpCashReceipt: function(cash_no) {
        var url = "https://admin8.kcp.co.kr/assist/bill.BillAction.do"
                + "?cmd=cash_bill&CASH_NO=" + cash_no;
        return window.open(url, "kcp_cash_receipt", $.param({
            "width": 380, "height": 600,
            "toolbars": "no", "resizable": "no",
            "scrollbars": "no", "status": "no"
        }).replace(/&/g, ","));
    },

    webtax21TaxReceipt: function(mtsid, buy_regnum) {
        var url = "http://www.webtax21.com/w20/main.InvoiceView.do"
                + "?remoteid=CNPINE&svc_mng_no=" + mtsid
                + "&corp_id=" + buy_regnum;
        return window.open(url, "webtax21_tax_receipt", $.param({
            "width": 960, "height": 570,
            "toolbars": "no", "resizable": "no",
            "scrollbars": "no", "status": "no"
        }).replace(/&/g, ","));
    }
};
