/*-------------------------------------------------------------------------
 * Webcrew ec sstag functions
 * (c) Webcrew
 *
 * DEPENDENCIES
 *   none
 *--------------------------------------------------------------------------*/
 
var Ecid;
if (!Ecid) Ecid = {};
if (!Ecid.sstag) {
Ecid.sstag = {};
(function(){

var pre = "ecid_";

var getElementValue = function(element_id) {
  element = getElementById(element_id);
  if (element) {
    var method = element.tagName.toLowerCase();
    if (FormSerializer[method]) {
      return FormSerializer[method](element);
    } else {
      return null;
    }
  } else {
    return null;
  }
}

function isUndefined(object) {
  return typeof object === "undefined";
}

function isArray(object) {
  return _toString.call(object) == "[object Array]";
}
  
var FormSerializer = {
  input: function(element, value) {
    switch (element.type.toLowerCase()) {
      case 'checkbox':
      case 'radio':
        return FormSerializer.inputSelector(element, value);
      default:
        return FormSerializer.textarea(element, value);
    }
  },

  inputSelector: function(element, value) {
    if (isUndefined(value)) return element.checked ? element.value : null;
    else element.checked = !!value;
  },

  textarea: function(element, value) {
    if (isUndefined(value)) return element.value;
    else element.value = value;
  },

  select: function(element, value) {
    if (isUndefined(value))
      return this[element.type == 'select-one' ?
        'selectOne' : 'selectMany'](element);
    else {
      var opt, currentValue, single = !isArray(value);
      for (var i = 0, length = element.length; i < length; i++) {
        opt = element.options[i];
        currentValue = this.optionValue(opt);
        if (single) {
          if (currentValue == value) {
            opt.selected = true;
            return;
          }
        }
        else opt.selected = value.include(currentValue);
      }
    }
  },

  selectOne: function(element) {
    var index = element.selectedIndex;
    return index >= 0 ? this.optionValue(element.options[index]) : null;
  },

  selectMany: function(element) {
    var values, length = element.length;
    if (!length) return null;

    for (var i = 0, values = []; i < length; i++) {
      var opt = element.options[i];
      if (opt.selected) values.push(this.optionValue(opt));
    }
    return values;
  },

  optionValue: function(opt) {
      return hasAttribute(opt , 'value') ? opt.value : opt.text;
  }
};

var hasAttribute = function(element, attribute) {
  if (element.hasAttribute) {
    return element.hasAttribute(attribute);
  }
  var node = element.getAttributeNode(attribute);
  return ( (node) && (node.specified) );
}

function getElementById (element_id) {
  return document.getElementById(element_id);
}


function showError(msg) {
  alert(msg);
}

function addCart(form_id) {

//  if (checkCount(form_id) == false) {
//    showError("数量を入力してください。");
//    return false;
//  }

  var formElm = getElementById(form_id);
  
  // 数値パラメータを取得・生成
  var count = 0;
  var countHidden = formElm.elements.namedItem(pre + 'count');
  if (countHidden == null ) {
    // 直接指定値が無い場合はhtml上から取得
    var countIdHidden = formElm.elements.namedItem(pre + 'count_id');
    if (countIdHidden != null) {
      var countId = countIdHidden.value + "_value";

      var elm = getElementById(countId);
      if ( elm ) {
        if (isOrderForm(form_id)){
          if (! checkMinValue(countId)) {
            if (elm.getMinValue) {
              showError("数量は " + elm.getMinValue() + " 以上の値を入力してください。");
            } else {
              showError("入力された数量が最低限度を下回っています。");
            }
            return false; 
          }

          if (! checkMaxValue(priceId)) {
            if (elm.getMaxValue) {
              showError("数量は " + elm.getMaxValue() + " 以下の値を入力してください。");
            } else {
              showError("入力された数量が最高限度を超えています。");
            }
            return false; 
          }      
        }
      
        count = getElementValue(countId);
      }
    }
    make_hidden(form_id , pre + 'count' , count);
  }

  // バリエーションNを取得・生成
  var v_id_N;
  for (i=1 ; i < 5; i++) {
    v_id_N = pre + "variation_id" + i;
    var variationIdHidden = formElm.elements.namedItem(v_id_N);
    if (variationIdHidden != null) {
      // variation_idNの指定があった場合はhtml上から取得
      var variationId = variationIdHidden.value + "_value";
      if ( getElementById(variationId) ) {
          make_hidden(form_id , pre + 'vt' + i + '_code1' , getElementValue(variationId) );
/*
        if (getElementById(variationId).getVtype()) {
          make_hidden(form_id , pre + 'vtype' + i , getElementById(variationId).getVtype() );
          make_hidden(form_id , pre + 'vt' + i + '_code1' , getElementValue(variationId) );
        }
*/
      }
    }
  } 

  // オプションNを取得・生成
  var op_id_N;
  for (i=1 ; i < 5; i++) {
    op_id_N = pre + "option_id" + i;
    var optionIdHidden = formElm.elements.namedItem(op_id_N);
    if (optionIdHidden != null) {
      // option_idNの指定があった場合はhtml上から取得
      var optionId = optionIdHidden.value + "_value";
      if ( getElementById(optionId) ) {
        make_hidden(form_id , pre + 'option' + i , getElementValue(optionId) );
      }
    }
  } 
  
  // 金額値をhtml上から検索・生成
  var priceIdHidden = formElm.elements.namedItem(pre + 'price_id');
  if (priceIdHidden != null) {
    
    var priceId = priceIdHidden.value + "_value";
    var elm = getElementById(priceId);
    if ( elm ) {

      if (isOrderForm(form_id)){
        if (! checkMinValue(priceId)) {
          if (elm.getMinValue) {
            showError("金額は" + elm.getMinValue() + "以上の値を入力してください。");
          } else {
            showError("入力金額が最低額を下回っています。");
          }
          return false; 
        }

        if (! checkMaxValue(priceId)) {
          if (elm.getMaxValue) {
            showError("金額は" + elm.getMaxValue() + "以下の値を入力してください。");
          } else {
            showError("入力金額が限度額を超えています。");
          }
          return false; 
        }
      }
  
      make_hidden(form_id , pre + 'price' , getElementValue(priceId) );
    }
  }

  formElm.submit();
}

function make_hidden( form_id , name, value  ){
    if (form_id == null) return;
    if (name == null) return;
    if (value == null) return;

    var q = document.createElement('input');
    q.type = 'hidden';
    q.name = name;
    q.value = value;
    if (form_id){ document.getElementById(form_id).appendChild(q); }
}

function getChildElementsByName ( id , name ){
    var elm = getElementById(id);
    if (elm) {
    } else {
      return null;
    }
}




function getSpecifiedCount(form_id) {
  var formElm = getElementById(form_id);
  if (formElm.elements.namedItem(pre + 'count')){
    return formElm.elements.namedItem(pre + 'count').value;
  } else {
    return 0;
  }
}

function getSelectedCount(form_id) {
  var formElm = getElementById(form_id);
  var countIdHidden = formElm.elements.namedItem(pre + 'count_id');
  if (countIdHidden != null) {
    var countId = countIdHidden.value;
    if ( getElementById(countId) ) {
      return getElementValue(countId);
    }
  }

  return 0;

}

function isSpecifiedCount(form_id) {
  var formElm = getElementById(form_id);
  var countHidden = formElm.elements.namedItem(pre + 'count');
  if (countHidden != null ) {
    return true;
  } else {
    return false;
  }
}

function checkCount(form_id) {

  if (! isRequiredCount(form_id)){
    return true;
  }

  if ( getSpecifiedCount(form_id) != 0 ){
    return true;
  }

  if ( getSelectedCount(form_id) != 0 ){
    return true;
  }

  return false;

}

function setRequiredCount (form_id) {
  var form_elm = getElementById(form_id);
  if (form_elm) {
    form_elm.isRequiredCount = function() {return true;}
  }
}

function isRequiredCount (form_id) {
  var form_elm = getElementById(form_id);
  if (form_elm) {
    if (form_elm.isRequiredCount) {
      return form_elm.isRequiredCount();
    }
  }
  return false;
}

function setValueRange(id , min , max) {
  var elm = getElementById(id);
  if (elm) {
    if (! elm.getMinValue) {
      elm.getMinValue = function() {return min;}
    }
    if (! elm.getMaxValue) {
      elm.getMaxValue = function() {return max;}
    }
  }
}

function checkMinValue(id) {
  var elm = getElementById(id);
  if (!elm) return true; //エラーにしないでおく
  
  if (! elm.getMinValue) return true; // 最低値が定義されていない場合はエラーとしない

  var min = elm.getMinValue();
  if (min == null || min == '') {
    min = 1;
  }
  min = parseInt(min);
  if (isNaN(min)) {
    return true;
  }
  if (min < 1) min = 1;
  
  var val = parseInt(getElementValue(id));
  if (isNaN(val)) return true;

  if (val >= min) {
    return true;
  } else {
    return false;
  }
}

function checkMaxValue(id) {
  var elm = getElementById(id);
  if (!elm) return true; //エラーにしないでおく
  
  if (! elm.getMaxValue) return true; // 最低値が定義されていない場合はエラーとしない

  var max = elm.getMaxValue();
  if (max == null || max == '') {
    return true;  // デフォルト=最大値が無限。常にtrue。
  }
  max = parseInt(max);
  if (isNaN(max)) return true;
  
  if(max < 1) return true; // 0はデフォルト=最大値が無限。常にtrue
  
  var val = parseInt(getElementValue(id));
  if (isNaN(val)) return true;
  
  if (val <= max) {
    return true;
  } else {
    return false;
  }
}

function setOrderForm(form_id) {
  var formElm = getElementById(form_id);
  if (formElm) {
    formElm.isOrderForm = function() {return true;}
  }
}

function isOrderForm(form_id) {
  var formElm = getElementById(form_id);
  if (formElm.isOrderForm) {
    return formElm.isOrderForm();
  } else {
    return false;
  }
}


//----廃止メソッド

//互換性のため、メソッド名だけ残しておく
function setVtype (select_id , vtype) {}
function addRequiredVtype(form_id , vtype , vname) {}
function addForbiddenVtype(form_id , vtype , vname) {}
function getRequiredVtypes(form_id) {}
function getForbiddenVtypes(form_id) {}
function getFirstRequiredVariationName (form_id) {}
function getFirstForbiddenVariationName (form_id) {}
function existsSelectedVariationVal(form_id , vtype) {}


//---- 公開メソッド

//互換性のため、廃止メソッドも公開しておく
var pub = Ecid.sstag;
pub.setRequiredCount   = setRequiredCount;
pub.addCart            = addCart;
pub.setValueRange      = setValueRange;
pub.setOrderForm       = setOrderForm;
pub.setVtype           = setVtype;          //廃止
pub.addForbiddenVtype  = addForbiddenVtype; //廃止
pub.addRequiredVtype   = addRequiredVtype;  //廃止
  
})();


}

