
/*
   Myetus Information Description Language
*/



function getInputItemField(name, i, slot_id, slotname, variant_for, referred_id, referred_slot, type, unit, multislot) {
   var panel = "";
   panel += "<input type='hidden' id='" + name + "FieldType_" + i + "_" + slot_id + "' name='" + name + "FieldType_" + i + "_" + slot_id + "' value='" + type + "' />\r\n";
   panel += "<input type='hidden' id='" + name + "FieldReferred_" + i + "_" + slot_id + "' name='" + name + "FieldReferred_" + i + "_" + slot_id + "' value='" + referred_id + "' />\r\n";
   switch (type) {
      case 'Number':
         var onkeyup = "";
         if (referred_id != -1) onkeyup = " onkeyup=\"document.getElementById('" + name + "VariantValue_" + referred_id + "_" + referred_slot + "').innerHTML=this.value==''?'':this.value+(item_data_structure[" + i + "][2]==''?'':'&nbsp;'+item_data_structure[" + i + "][2]);\"";
         panel += "<input type='text' id='" + name + "Field_" + i + "_" + slot_id + "' name='" + name + "Field_" + i + "_" + slot_id + "' size='10'" + onkeyup + " />";
         break;
      case 'Price':
         panel += "<input type='text' id='" + name + "Field_" + i + "_" + slot_id + "' name='" + name + "Field_" + i + "_" + slot_id + "' size='10' />";
         break;
      case 'Phone number':
         panel += getInputPhone(name + "Field_" + i + "_" + slot_id + "_area", name + "Field_" + i + "_" + slot_id + "_first", name + "Field_" + i + "_" + slot_id + "_second");
         break;
      case 'Short text':
         var onkeyup = "";
         if (referred_id != -1) onkeyup = " onkeyup=\"document.getElementById('" + name + "VariantValue_" + referred_id + "_" + referred_slot + "').innerHTML=this.value==''?'':this.value+(item_data_structure[" + i + "][2]==''?'':'&nbsp;'+item_data_structure[" + i + "][2]);\"";
         panel += "<input type='text' id='" + name + "Field_" + i + "_" + slot_id + "' name='" + name + "Field_" + i + "_" + slot_id + "' size='50'" + onkeyup + " />";
         break;
      case 'Text':
         panel += getRichEdit(name + "Field_" + i + "_" + slot_id);
         break;
      case 'Date only':
         var callback = "";
         if (referred_id != -1) callback = "document.getElementById('" + name + "VariantValue_" + referred_id + "_" + referred_slot + "').innerHTML=this.value==''?'':this.value+(item_data_structure[" + i + "][2]==''?'':'&nbsp;'+item_data_structure[" + i + "][2]);";
         panel += getInputDate(name + "Field_" + i + "_" + slot_id + "_month", name + "Field_" + i + "_" + slot_id + "_day", name + "Field_" + i + "_" + slot_id + "_year", callback);
         break;
      case 'Date and time':
         var callback = "";
         if (referred_id != -1) callback = "document.getElementById('" + name + "VariantValue_" + referred_id + "_" + referred_slot + "').innerHTML=this.value==''?'':this.value+(item_data_structure[" + i + "][2]==''?'':'&nbsp;'+item_data_structure[" + i + "][2]);";
         panel += getInputDate(name + "Field_" + i + "_" + slot_id + "_month", name + "Field_" + i + "_" + slot_id + "_day", name + "Field_" + i + "_" + slot_id + "_year", callback);
         panel += "&nbsp;";
         panel += getInputTime(name + "Field_" + i + "_" + slot_id + "_hour", name + "Field_" + i + "_" + slot_id + "_min", callback);
         break;
      case 'Image':
         var callback = "";
         if (referred_id != -1) callback = "document.getElementById('" + name + "VariantValue_" + referred_id + "_" + referred_slot + "').innerHTML=this.value==''?'':this.value+(item_data_structure[" + i + "][2]==''?'':'&nbsp;'+item_data_structure[" + i + "][2]);";
         panel += getMediaManager(name + "Field_" + i + "_" + slot_id, 400, 300, 50, "images/estore", "image", callback);
         break;
   }
   if (unit != "") panel += "&nbsp;" + unit;
   if (variant_for != "") {
      panel += " applies to " + variant_for + " <span id='" + name + "VariantValue_" + i + "_" + slot_id + "'></span>";
   }
   if (multislot) panel += " <span class='small_note'>[&nbsp;<span class='menuitem' onclick=\"removeFieldSlot('EStoreNewItem', " + i + ", " + slot_id + ", true);\">Remove</span>&nbsp;|&nbsp;<span class='menuitem' onclick=\"addItemFieldSlot('EStoreNewItem', " + i + ", " + slot_id + ", '" + slotname + "', '" + type + "', '" + unit + "', true);\">Add another " + slotname + "</span>&nbsp;]</span>";
   return panel;
}






function addItemFieldSlot(prev_name, i, slot_id, slotname, type, unit, multislot) {
   var j, new_slot_id;
   var found = false;
   for (j = 0; j < field_slot_ids.length && !found; j++) {
      if (field_slot_ids[j][0] == slotname) {
         new_slot_id = ++field_slot_ids[j][1];
         found = true;
      }
   }

   var prev = document.getElementById(prev_name + "FieldHost_" + i + "_" + slot_id);
   var referred_id = document.getElementById(prev_name + "FieldReferred_" + i + "_" + slot_id).value;
   var next = document.createElement("div");
   next.setAttribute("id", prev_name + "FieldHost_" + i + "_" + new_slot_id);
   prev.parentNode.insertBefore(next, prev.nextSibling);
   next.innerHTML = getInputItemField(prev_name, i, new_slot_id, slotname, "", referred_id, new_slot_id, type, unit, multislot);

   if (referred_id != -1) {
      prev = document.getElementById(prev_name + "FieldHost_" + referred_id + "_" + slot_id);
      next = document.createElement("div");
      next.setAttribute("id", prev_name + "FieldHost_" + referred_id + "_" + new_slot_id);
      prev.parentNode.insertBefore(next, prev.nextSibling);
      next.innerHTML = getInputItemField(prev_name, referred_id, new_slot_id, slotname, item_data_structure[referred_id][5], -1, 0, item_data_structure[referred_id][1], item_data_structure[referred_id][2], false);
   }

   if (type == "Text") {
      eval("wre" + prev_name + "Field_" + i + "_" + new_slot_id + " = new WebCPMSRichEdit('" + prev_name + "Field_" + i + "_" + new_slot_id + "');");
      eval("wre" + prev_name + "Field_" + i + "_" + new_slot_id + ".setSize(400, 150);");
      eval("wre" + prev_name + "Field_" + i + "_" + new_slot_id + ".setStyle(WRES_TEXTPAD | WRES_HYPERLINK | WRES_IMAGE);");
      eval("wre" + prev_name + "Field_" + i + "_" + new_slot_id + ".start('" + prev_name + "Field_" + i + "_" + new_slot_id + "EditorHost');");
      eval("wre" + prev_name + "Field_" + i + "_" + new_slot_id + ".setUploadDir('images/estore');");
   }
}



function removeFieldSlot(name, i, slot_id, keep_last_one) {
   var remove = true;
   if (keep_last_one) {
      var num_real_slots = 0;
      var j;
      for (j = 0; j < field_slot_ids.length; j++) {
         if (document.getElementById(name + "FieldHost_" + i + "_" + j)) num_real_slots++;
      }
      if (num_real_slots <= 1) remove = false;
   }
   if (remove) {
      var referred_id = document.getElementById(name + "FieldReferred_" + i + "_" + slot_id).value;
      var cell = document.getElementById(name + "FieldCell_" + i);
      var slot = document.getElementById(name + "FieldHost_" + i + "_" + slot_id);
      cell.removeChild(slot);
      if (referred_id != -1) {
         cell = document.getElementById(name + "FieldCell_" + referred_id);
         slot = document.getElementById(name + "FieldHost_" + referred_id + "_" + slot_id);
         cell.removeChild(slot);
      }
   }
}






function getSlotValue(name, idx, slot_id) {
   var input;
   var req_err = "",
       type_err = "";
   var data = "";
   switch (item_data_structure[idx][1]) {
      case 'Number':
         input = document.getElementById(name + "Field_" + idx + "_" + slot_id);
         if (input) {
            data = encodeURIComponent(input.value);
            if (item_data_structure[idx][4] == true && input.value.length == 0) req_err = item_data_structure[idx][0];
            if (input.value.length > 0 && isNaN(input.value)) type_err = item_data_structure[idx][0];
         }
         break;
      case 'Price':
         input = document.getElementById(name + "Field_" + idx + "_" + slot_id);
         if (input) {
            data = encodeURIComponent(input.value);
            if (item_data_structure[idx][4] == true && input.value.length == 0) req_err = item_data_structure[idx][0];
            if (input.value.length > 0 && isNaN(input.value)) type_err = item_data_structure[idx][0];
         }
         break;
      case 'Phone number':
         input = document.getElementById(name + "Field_" + idx + "_" + slot_id + "_area");
         if (input) {
            var area = input.value;
            var first = document.getElementById(name + "Field_" + idx + "_" + slot_id + "_first").value;
            var second = document.getElementById(name + "Field_" + idx + "_" + slot_id + "_second").value;
            data = encodeURIComponent(area + "-" + first + "-" + second);
            if (item_data_structure[idx][4] == true && area.length == 0) req_err = item_data_structure[idx][0];
            if (item_data_structure[idx][4] == true && first.length == 0) req_err = item_data_structure[idx][0];
            if (item_data_structure[idx][4] == true && second.length == 0) req_err = item_data_structure[idx][0];
            if (area.length > 0 && isNaN(area)) type_err = item_data_structure[idx][0];
            if (first.length > 0 && isNaN(first)) type_err = item_data_structure[idx][0];
            if (second.length > 0 && isNaN(second)) type_err = item_data_structure[idx][0];
         }
         break;
      case 'Short text':
         input = document.getElementById(name + "Field_" + idx + "_" + slot_id);
         if (input) {
            data = encodeURIComponent(input.value);
            if (item_data_structure[idx][4] == true && input.value.length == 0) req_err = item_data_structure[idx][0];
         }
         break;
      case 'Text':
         var e = eval("wre" + name + "Field_" + idx + "_" + slot_id);
         if (e) {
            var txt = e.getText();
            data = encodeURIComponent(txt);
            if (item_data_structure[idx][4] == true && txt.length == 0) req_err = item_data_structure[idx][0];
         }
         break;
      case 'Date only':
         input = document.getElementById(name + "Field_" + idx + "_" + slot_id + "_month");
         if (input) {
            var month = makeTwoDigits(input.value);
            var day = makeTwoDigits(document.getElementById(name + "Field_" + idx + "_" + slot_id + "_day").value);
            var year = document.getElementById(name + "Field_" + idx + "_" + slot_id + "_year").value;
            data = encodeURIComponent(year + "-" + month + "-" + day);
         }
         break;
      case 'Date and time':
         input = document.getElementById(name + "Field_" + idx + "_" + slot_id + "_month");
         if (input) {
            var month = makeTwoDigits(input.value);
            var day = makeTwoDigits(document.getElementById(name + "Field_" + idx + "_" + slot_id + "_day").value);
            var year = document.getElementById(name + "Field_" + idx + "_" + slot_id + "_year").value;
            var hour = makeTwoDigits(document.getElementById(name + "Field_" + idx + "_" + slot_id + "_hour").value);
            var min = makeTwoDigits(document.getElementById(name + "Field_" + idx + "_" + slot_id + "_min").value);
            data = encodeURIComponent(year + "-" + month + "-" + day + " " + hour + ":" + min);
         }
         break;
      case 'Image':
         input = document.getElementById("Input_" + name + "Field_" + idx + "_" + slot_id);
         if (input) {
            data = encodeURIComponent(input.value);
            if (item_data_structure[idx][4] == true && input.value.length == 0) req_err = item_data_structure[idx][0];
         }
         break;
   }
   return new Array(data, req_err, type_err);
}




function setSlotValue(name, idx, slot_id, val) {
   switch (item_data_structure[idx][1]) {
      case "Number":
      case "Price":
      case "Short text":
         document.getElementById(name + 'Field_' + idx + '_' + slot_id).value = val ? val : "";
         break;
      case "Image":
         document.getElementById('Input_' + name + 'Field_' + idx + '_' + slot_id).value = val ? val : "";
         break;
      case "Phone number":
         if (val == null) {
            setInputPhone(name + 'Field_' + idx + '_' + slot_id + '_area', name + 'Field_' + idx + '_' + slot_id + '_first', name + 'Field_' + idx + '_' + slot_id + '_second', "", "", "");
         } else {
            var p = val.split("-");
            setInputPhone(name + 'Field_' + idx + '_' + slot_id + '_area', name + 'Field_' + idx + '_' + slot_id + '_first', name + 'Field_' + idx + '_' + slot_id + '_second', p[0], p[1], p[2]);
         }
         break;
      case "Date only":
         if (val == null) {
            setCurrentDate('Host_' + name + 'Field_' + idx + '_' + slot_id + '_year', 'Input_' + name + 'Field_' + idx + '_' + slot_id + '_year', name + 'Field_' + idx + '_' + slot_id + '_year', name+ 'Field_' + idx + '_' + slot_id + '_month', name + 'Field_' + idx + '_' + slot_id + '_day');
         } else {
            var d = val.split("-");
            setDateValue('Input_' + name + 'Field_' + idx + '_' + slot_id + '_year', name + 'Field_' + idx + '_' + slot_id + '_year', name + 'Field_' + idx + '_' + slot_id + '_month', name + 'Field_' + idx + '_' + slot_id + '_day', d[0], d[1], d[2]);
         }
         break;
      case "Date and time":
         if (val == null) {
            setCurrentDate('Host_' + name + 'Field_' + idx + '_' + slot_id + '_year', 'Input_' + name + 'Field_' + idx + '_' + slot_id + '_year', name + 'Field_' + idx + '_' + slot_id + '_year', name + 'Field_' + idx + '_' + slot_id + '_month', name + 'Field_' + idx + '_' + slot_id + '_day');
            setTimeValue(name + 'Field_' + idx + '_' + slot_id + '_hour', name + 'Field_' + idx + '_' + slot_id + '_min');
         } else {
            var dt = val.split(" ");
            var d = dt[0].split("-");
            var t = dt[1].split(":");
            setDateValue('Input_' + name + 'Field_' + idx + '_' + slot_id + '_year', name + 'Field_' + idx + '_' + slot_id + '_year', name + 'Field_' + idx + '_' + slot_id + '_month', name + 'Field_' + idx + '_' + slot_id + '_day', d[0], d[1], d[2]);
            setTimeValue(name + 'Field_' + idx + '_' + slot_id + '_hour', name + 'Field_' + idx + '_' + slot_id + '_min', t[0], t[1]);
         }
         break;
      case "Text":
         enableMIDLItemEditors(name);
         var e = eval('wre' + name + 'Field_' + idx + '_' + slot_id);
         e.setDocument(document.getElementById('lang').value, val);
         e.setText(val);
         break;
   }
}





function enableMIDLItemEditors(name) {
   var i = 0, j;
   var type;
   do {
      j = 0;
      while ( type = document.getElementById(name + 'FieldType_' + i + '_' + j) ) {
         if (type.value == "Text") {
            eval("wre" + name + "Field_" + i + "_" + j + ".enable();");
         }
         j++;
      }
      i++;
   } while (j > 0);
}



function checkMIDLItemEditorContent(name, show_alert) {
   var ok = true;
   var i, j;
   var data = "";
   var req_err = "",
       type_err = "";
   for (i = 0; i < item_data_structure.length && req_err.length == 0 && type_err.length == 0; i++) {
      var maxslots = 0;
      var multislot = item_data_structure[i][3] == true ? true : false;
      if (item_data_structure[i][3] == true || item_data_structure[i][7] > -1) {
         var found = false;
         for (j = 0; j < field_slot_ids.length && !found; j++) {
            if ( (item_data_structure[i][3] == true && field_slot_ids[j][0] == item_data_structure[i][0]) || (item_data_structure[i][7] > -1 && field_slot_ids[j][0] == item_data_structure[item_data_structure[i][7]][0])) {
               maxslots = field_slot_ids[j][1];
               found = true;
            }
         }
      }
      var k = 0;
      for (j = 0; j <= maxslots && req_err.length == 0 && type_err.length == 0; j++) {
         var slotval = getSlotValue(name, i, j);
         data += (multislot ? "&multifield_" + k + "_" : (item_data_structure[i][7] > -1 ? "&ref_" + item_data_structure[item_data_structure[i][7]][0] + "_" + k + "_" : "&field_")) + item_data_structure[i][0] + "=" + slotval[0];
         req_err = slotval[1];
         type_err = slotval[2];
         k++;
      }
   }
   if (req_err.length > 0) {
      var category_name = "";
      if (document.getElementById(name + 'CategorySelector')) {
         if (document.getElementById(name + 'CategorySelector').options) {
            category_name = document.getElementById(name + 'CategorySelector').options[document.getElementById(name + 'CategorySelector').selectedIndex].text;
         } else {
            category_name = document.getElementById(name + 'CategorySelector').value;
         }
      }
      if (show_alert) alert("Field '" + req_err + "' is required, you have to specify " + req_err.toLowerCase() + (category_name.length > 0 ? " for this " + category_name : ""));
      ok = false;
   }
   if (type_err.length > 0) {
      j = 0;
      while (j < field_slot_ids.length && field_slot_ids[j][0] != type_err) j++;
      if (j < field_slot_ids.length) {
         if (show_alert) alert("You have to enter " + item_data_structure[j][1].toLowerCase() + " into field '" + type_err + "'");
         ok = false;
      }
//      if (show_alert) alert("Data type error.");
      ok = false;
   }
   return ok ? data : "";
}





function printMIDLItemEditor(name, printExtra) {
   var have_req = false;
   var i = 0;
   while (i < item_data_structure.length && !item_data_structure[i][4]) i++;
   have_req = i < item_data_structure.length ? true : false;
   var panel = "";
   panel += "<table>";
   for (i = 0; i < item_data_structure.length; i++) {
      panel += "<tr><td class='label'>" + item_data_structure[i][0] + (item_data_structure[i][4] ? "&nbsp;(<span style='color: red;'>*</span>)" : "") + ":</td>";
      panel += "<td id='" + name + "FieldCell_" + i + "'>";
      panel += "<div id='" + name + "FieldHost_" + i + "_0'>";
      panel += getInputItemField(name, i, 0, item_data_structure[i][0], item_data_structure[i][5], item_data_structure[i][6], 0, item_data_structure[i][1], item_data_structure[i][2], item_data_structure[i][3]);
      panel += "</div>";
      panel += "</td>";
      panel += "</tr>";
   }
   if (printExtra != null) {
      panel += printExtra(name);
   }
   panel += "</table>";
   if (have_req) {
      panel += "<p class='note'>Fields marked with an asterisk (<span style='color: red;'>*</span>) are required.</p>";
   }
   document.getElementById(name + 'Host').innerHTML = panel;
   var i = 0;
   var type;
   while ( type = document.getElementById(name + 'FieldType_' + i + "_0") ) {
      if (type.value == "Text") {
         eval("wre" + name + "Field_" + i + "_0 = new WebCPMSRichEdit('" + name + "Field_" + i + "_0');");
         eval("wre" + name + "Field_" + i + "_0.setSize(400, 150);");
         eval("wre" + name + "Field_" + i + "_0.setStyle(WRES_TEXTPAD | WRES_HYPERLINK | WRES_IMAGE);");
         eval("wre" + name + "Field_" + i + "_0.start('" + name + "Field_" + i + "_0EditorHost');");
         eval("wre" + name + "Field_" + i + "_0.setUploadDir('images/estore');");
      }
      i++;
   }
}



function setMIDLItemEditorContent(name, raw_data) {
   var i, j, k;
   for (i = 0; i < item_data_structure.length; i++) {
      if (item_data_structure[i][3] || item_data_structure[i][7] > -1) { // multislot
         j = 0;
         var val;
         while (val = getProperty(item_data_structure[i][0] + "_" + j, raw_data)) {
            if (j > 0 && item_data_structure[i][3]) {
               addItemFieldSlot(name, i, j - 1, item_data_structure[i][0], item_data_structure[i][1], item_data_structure[i][2], item_data_structure[i][3]);
            }
            setSlotValue(name, i, j, val);
            if (item_data_structure[i][6] > -1) {
               document.getElementById(name + 'VariantValue_' + item_data_structure[i][6] + '_' + j).innerHTML = val;
            }
            j++;
         }
      } else {
         var val = getProperty(item_data_structure[i][0], raw_data);
         setSlotValue(name, i, 0, val);
      }
   }
}


function resetMIDLItemEditor(name, printExtra) {
   if (confirm("Are you sure you want to clear the contents of item editor?")) {
      document.getElementById(name).value = 0;
      var i;
      for (i = 0; i < field_slot_ids.length; i++) {
         field_slot_ids[i][1] = 0;
      }
      printMIDLItemEditor(name, printExtra);
   }
}


function isValidType(type) {
   if (data_types == null) return true;
   var found = false;
   var i;
   for (i = 0; i < data_types.length && !found; i++) {
      if (data_types[i][1] == type) found = true;
   }
   return found;
}


function parseDataStructure(field_list, item_data_structure_arr, field_slot_ids_arr) {
   var fields = field_list.split(",");
   var item_to_edit = null;

   var i, j, cnt = 0;
   for (i = 0; i < fields.length; i++) {
      var slot = fields[i].split("|");
      if (slot[0] == "CategoryID" && fields[i + 1]) {
         var item = fields[i + 1].split("|");
         item_to_edit = new Array(slot[1], item[1]);
      } else if (slot[0] != "ItemID") {
         var required = slot[0].lastIndexOf("!") == slot[0].length - 1 ? true : false;
         var slotname = required ? slot[0].substr(0, slot[0].lastIndexOf("!")) : slot[0];
         var multislot = slotname.lastIndexOf("*") == slotname.length - 1 ? true : false;
         slotname = multislot ? slotname.substr(0, slotname.lastIndexOf("*")) : slotname;
         var pos1 = slot[0].indexOf("[");
         var pos2 = slot[0].lastIndexOf("]");
         var variant_for = "";
         if (pos1 > -1 && pos2 > -1) {
            slotname = slot[0].substr(0, pos1);
            variant_for = slot[0].substring(pos1 * 1 + 1, pos2);
         }
         if (field_slot_ids_arr != null) field_slot_ids_arr[field_slot_ids_arr.length] = new Array(slotname, 0);
   //      if (isValidType(slot[1])) {
            item_data_structure_arr[item_data_structure_arr.length] = new Array(slotname, slot[1], slot[2] ? slot[2] : "", multislot, required, variant_for, -1, -1);
            j = 0;
            while (j < item_data_structure_arr.length && item_data_structure_arr[j][0] != variant_for) j++;
            if (j < item_data_structure_arr.length) {
               item_data_structure_arr[j][6] = cnt;
               item_data_structure_arr[cnt][7] = j;
            }
   //      }
         cnt++;
      }
   }
   return item_to_edit;
}


