Handlebars.registerHelper('and', function () {
  // and  연산하기
  var compareValues = Array.prototype.slice.call(arguments, 0);
  var result = false;

  // 마지막 인자는 options 정보이기 때문에 pop
  var options = compareValues.pop();

  for (var i = 0; i < compareValues.length; i++) {
    result = compareValues[i];
    if (!compareValues[i]) {
      // 같지 않음
      break;
    }
  }

  return result;
});

Handlebars.registerHelper('or', function () {
  // or 연산하기
  var compareValues = Array.prototype.slice.call(arguments, 0);
  var result = false;

  // 마지막 인자는 options 정보이기 때문에 pop
  var options = compareValues.pop();

  for (var i = 0; i < compareValues.length; i++) {
    result = compareValues[i];
    if (result) {
      // 같지 않음
      break;
    }
  }

  return result;
});

Handlebars.registerHelper('ifEquals', function (arg1) {
  // 첫번째 인자와 그다음 인자들이 "모두 같은지" 체크
  var compareValues = Array.prototype.slice.call(arguments, 1);
  var result = false;
  // 마지막 인자는 options 정보이기 때문에 pop
  var options = compareValues.pop();

  for (var i = 0; i < compareValues.length; i++) {
    if (compareValues[i] == arg1) {
      // 같지 않음
      result = true;
      break;
    }
  }

  return result ? options.fn(this) : options.inverse(this);
});

Handlebars.registerHelper('ifEqualsNot', function (arg1) {
  // 첫번째 인자와 그다음 인자들이 "모두 같지 않은지" 체크
  var compareValues = Array.prototype.slice.call(arguments, 1);
  var result = false;
  // 마지막 인자는 options 정보이기 때문에 pop
  var options = compareValues.pop();

  for (var i=0; i<compareValues.length; i++) {
    if (compareValues[i] != arg1) {
      // 같지 않음
      result = true;
      break;
    }
  }


  return result ? options.fn(this) : options.inverse(this);
});

Handlebars.registerHelper('ifEqualsOR', function () {
  if (arguments.length % 2 == 0) {
    console.error("error] ifEqualsOR arguments ", arguments);
    return;
  }

  var options = arguments[arguments.length - 1];
  var flag = false;
  for (var i = 0; i < arguments.length; i+=2) {
    flag = flag || (arguments[i] == arguments[i + 1]);
  }

  return flag ? options.fn(this) : options.inverse(this);
});


Handlebars.registerHelper('ifLte', function (arg1, arg2, options) {
  return (arg1 <= arg2) ? options.fn(this) : options.inverse(this);
});

Handlebars.registerHelper('printFilesize', function (size, options) {
  if (size < 1024) {
    return size + "<small>kb</small>";
  } else {
    size = Math.floor((size/1024)*100) /100;
    return size + "<small>mb</small>";
  }
});

Handlebars.registerHelper('floor', function (number, precision, options) {
  precision = precision ? Math.pow(10,precision) : 1;
  return Math.floor(number * precision) / precision;
});

Handlebars.registerHelper('splittxt', function (arg1, arg2) {
  return arg1.split(arg2);
});

Handlebars.registerHelper('comma', function (arg1) {
  return arg1 ? setComma(arg1) : "" ;
});

Handlebars.registerHelper('get', function (arg1, idx) {
  var value = [];
  if (arg1) {
    if (typeof idx == "string" || typeof idx == "number") {
      value = arg1[idx];
    } else {
      value = arg1;
      for (var i=0; i<idx.length; i++) {
        if (typeof value === "undefined") break;
        value = value[idx[i]];
      }
    }
  }
  
  return value;
});

Handlebars.registerHelper("array", function () {
  return Array.prototype.slice.call(arguments, 0, -1)
})

Handlebars.registerHelper('assign', function (varName, varValue, options) {
  if (!options.data.root) {
      options.data.root = {};
  }
  options.data.root[varName] = varValue;
});

Handlebars.registerHelper('replaceAll', function (str, c1, c2) {
  var exp = new RegExp(c1, "g");
  return str && str.replace(exp, c2);
});

Handlebars.registerHelper("math", function (lvalue, operator, rvalue, options) {
  lvalue = parseFloat(lvalue);
  rvalue = parseFloat(rvalue);

  return {
    "+": lvalue + rvalue,
    "-": lvalue - rvalue,
    "*": lvalue * rvalue,
    "/": lvalue / rvalue,
    "%": lvalue % rvalue
  }[operator];
});

Handlebars.registerHelper('has', function (arr, val, options) {
  return arr.indexOf(val) >= 0 ? options.fn(this) : options.inverse(this);
});

Handlebars.registerHelper('nl2br', function (val) {
  return val.replace(/\n/g, "<br />");
});

// val 값이 없다면, 기본값(d) return
Handlebars.registerHelper('set', function (val, d) {
  return val ? val : d;
});

// 인자로 들어온 문자 붙여서 한 문자로 만들기
Handlebars.registerHelper( 'concat', function() {
  var arg = Array.prototype.slice.call(arguments,0);
  // 마지막 인자는 arguments 정보이기 때문에 pop
  arg.pop();
  return arg.join('');
});

Handlebars.registerHelper('join', function (arr, delimiter) {
  delimiter = delimiter ? delimiter : ',';
  return (Array.isArray(arr) && arr.join(delimiter)) || arr;
});