// fieldeditor.js
// Automatically included into pages hosting the EBlock:AssetFormEdit and EBlock:FieldPanel web controls

/* Handler functions for asset and entity browse popups */

function browseAssetReference(formHiddenFieldId) {
  var field = document.getElementById(formHiddenFieldId);
  
  var popup = window.open("/eblock/newadmin/inline/assetbrowsepopup/browse.aspx?controlid=" + formHiddenFieldId +
    "&guid=" + field.value, "assetbrowsepopup", "width=600,height=300");
}

function browseEntityReference(formHiddenFieldId) {
  var field = document.getElementById(formHiddenFieldId);
  
  var popup = window.open("/eblock/newadmin/inline/entitybrowsepopup/browse.aspx?controlid=" + formHiddenFieldId +
    "&guid=" + field.value, "entitybrowsepopup", "width=600,height=300");
}

/* Client-side rule validation functions */

// this is called by client-side ASP.NET validation
function ebValidateControl(source, arguments) {
  // decode ruleset from validator control expando attribute
  var ruleset = eval(ebGetExpandoProperty(source, "rules"));
  // validate value passed in arguments against ruleset
  var result = ebValidateRules(ruleset, arguments.Value);
  arguments.IsValid = result.isValid || (ebGetExpandoProperty(source, "level") != "enforce");
  
  // comply with ASP.NET client validation model
  if (result.isValid) {
    // clear validation properties
    source.isvalid = result.isValid;
    source.errormessage = "";
    source.innerHTML = "";
    }
  else {
    // set validation properties
    source.isvalid = result.isValid;
    source.errormessage = result.report;
    source.innerHTML = result.report;
    }
    
  // call any extended reporting
  var reportingDelegate = eval(ebGetExpandoProperty(source, "clientreportingfunction"));
  if (reportingDelegate) reportingDelegate(source, result);
  
  return result.isValid;
  }


// validates a value against some rules
function ebValidateRules(rules, value) {
  var result = {value: value, report: "", isValid: true};
  // return valid if no rules
  if (!rules) return result;
  
  // evaluate rules in turn
  for (var i = 0; i < rules.length; i++) {
    var rule = rules[i];
    switch (rule.rule) {
      
      // check value is supplied
      case "required":
        if (value == "") {
          result.isValid = false;
          result.report = rule.report;
          }
        break;
      
      // check value is between given limits
      case "limit":
        if ((rule.lower && value < rule.lower) || (rule.upper && value > rule.upper)) {
          result.isValid = false;
          result.report = rule.report;
        }
        break;
      
      // check value is between given lengths
      case "length":
        if ((rule.min > 0 && value.toString().length < rule.min) || (rule.max > 0 && value.toString().length > rule.max)) {
          result.isValid = false;
          result.report = rule.report;
        }
        break;
      
      // check value matches text or expression
      case "match":
        var hasMatch = false;
        switch (rule.op) {
          case "contains" :
            hasMatch = (String(value).indexOf(rule.text) >= 0);
            break;
          case "equals" :
            hasMatch = (String(value) == rule.text);
            break;
          case "expression" :
            var ex = new RegExp("^" + rule.text + "$", "");
            hasMatch = ex.test(value);
            break;
        }
        if (!hasMatch) {
          result.isValid = false;
          result.report = rule.report;
        }
        break;
      }
    if (!result.isValid) return result;
    }
  return result;
  }


// extended client-side reporting for validation within a FieldPanel
function ebReportValidationResult(source, result) {
  var caption = ebGetCaptionForValidator(source, "caption");
  
  if (result.isValid) {  
    if (caption) {
      // show caption, hide alert
      ebGetElementByClassName(caption, "alertinner").style.display = "none";
      var captionInner = ebGetElementByClassName(caption, "captioninner");
      if (captionInner) {
        captionInner.style.display = "block"; }
      else {
        caption.style.display = "none"; }
      caption.className = "caption";
      }
    else {
      // show title, hide alert
      var title = ebGetCaptionForValidator(source, "title");
      ebGetElementByClassName(title, "alertinner").style.display = "none";
      var titleInner = ebGetElementByClassName(title, "titleinner");
      if (titleInner) {
        titleInner.style.display = "block"; }
      else {
        title.style.display = "none"; }
      title.className = "title";
      }
    }
  else {
    if (caption) {
      // show alert, hide caption
      caption.className = "caption alert";
      caption.style.display = "block";
      var captionInner = ebGetElementByClassName(caption, "captioninner");
      if (captionInner) captionInner.style.display = "none";
      var alertInner = ebGetElementByClassName(caption, "alertinner")
      alertInner.innerHTML = result.report;
      alertInner.style.display = "block";
      }
    else {
      // show alert, hide title
      var title = ebGetCaptionForValidator(source, "title");
      title.className = "title alert";
      title.style.display = "block";
      var titleInner = ebGetElementByClassName(title, "titleinner");
      if (titleInner) titleInner.style.display = "none";
      var alertInner = ebGetElementByClassName(title, "alertinner")
      alertInner.innerHTML = result.report;
      alertInner.style.display = "block";
      }
    }
  }



// returns the rules attribute for a validation control
function ebGetExpandoProperty(element, key) {
  if (element[key]) {
    return element[key]; 
    }
  else {
    for(var i=0;i < element.attributes.length;i++) {
      if(element.attributes[i].nodeName == key) {
        return element.attributes[i].nodeValue;
        }
      }
    return null;
    }
  }

// finds a caption/alert element for a validation control */
function ebGetCaptionForValidator(source, className) {
  // find parent field
  var node = source;
  while (node && node.className != "field") {
    node = node.parentNode;
    }
  if (!node) return;
  
  return ebGetElementByClassName(node, className);
}

// finds the caption container for a field panel
function ebGetElementByClassName(element, className) {
  if (element.className.indexOf(className) == 0 && element.className.indexOf("col") == -1) return element;
  for (var i = 0; i < element.childNodes.length; i++) {
    if (element.childNodes[i].nodeType == 1) { var found = ebGetElementByClassName(element.childNodes[i], className); }
    if (found) return found
  }
  return;
}
