/** 
 | 
 @ Name:layui.cron Cron表达式解析器 
 | 
 @ Author:贝哥哥 
 | 
 @ License:MIT 
 | 
 */ 
 | 
  
 | 
layui.define(['lay', 'element', 'form'], function(exports){ //假如该组件依赖 layui.form 
 | 
  var $ = layui.$ 
 | 
      ,layer = layui.layer 
 | 
      ,lay = layui.lay 
 | 
      ,element = layui.element 
 | 
      ,form = layui.form 
 | 
  
 | 
  
 | 
      //字符常量 
 | 
      ,MOD_NAME = 'cron', ELEM = '.layui-cron', THIS = 'layui-this', SHOW = 'layui-show', HIDE = 'layui-hide' 
 | 
  
 | 
      ,ELEM_STATIC = 'layui-cron-static', ELEM_FOOTER = 'layui-cron-footer', ELEM_CONFIRM = '.cron-btns-confirm', ELEM_HINT = 'layui-cron-hint' 
 | 
  
 | 
      ,ELEM_RUN_HINT = 'layui-cron-run-hint' 
 | 
  
 | 
      //外部接口 
 | 
      ,cron = { 
 | 
        v:'2.0.0' // cron 组件当前版本 
 | 
        ,index: layui.cron ? (layui.cron.index + 10000) : 0 // corn 实例标识 
 | 
  
 | 
        //设置全局项 
 | 
        ,set: function(options){ 
 | 
          var that = this; 
 | 
          that.config = $.extend({}, that.config, options); 
 | 
          return that; 
 | 
        } 
 | 
  
 | 
        //事件监听 
 | 
        ,on: function(events, callback){ 
 | 
          return layui.onevent.call(this, MOD_NAME, events, callback); 
 | 
        } 
 | 
  
 | 
        //主体CSS等待事件 
 | 
        ,ready: function (fn) { 
 | 
          var cssPath = layui.cache.base + "/cron.css?v=" + cron.v; 
 | 
          layui.link(cssPath, fn, "cron"); //此处的“cron”要对应 cron.css 中的样式: html #layuicss-cron{} 
 | 
          return this; 
 | 
        } 
 | 
      } 
 | 
  
 | 
      //操作当前实例 
 | 
      ,thisIns = function(){ 
 | 
        var that = this 
 | 
            ,options = that.config 
 | 
            ,id = options.id || options.index; 
 | 
  
 | 
        return { 
 | 
          //提示框 
 | 
          hint: function(content){ 
 | 
            that.hint.call(that, content); 
 | 
          } 
 | 
          ,config: options 
 | 
        } 
 | 
      } 
 | 
  
 | 
      //构造器,创建实例 
 | 
      ,Class = function(options){ 
 | 
        var that = this; 
 | 
        that.index = ++cron.index; 
 | 
        that.config = $.extend({}, that.config, cron.config, options); 
 | 
        cron.ready(function () { 
 | 
          that.init(); 
 | 
        }); 
 | 
      }; 
 | 
  
 | 
  //默认配置 
 | 
  Class.prototype.config = { 
 | 
    value: null // 当前表达式值,每秒执行一次 
 | 
    ,isInitValue: true //用于控制是否自动向元素填充初始值(需配合 value 参数使用) 
 | 
    ,lang: "cn" //语言,只支持cn/en,即中文和英文 
 | 
    ,tabs:[{key:'seconds',range:'0-59'},{key:'minutes',range:'0-59'},{key:'hours',range:'0-23'},{key:'days',range:'1-31'},{key:'months',range:'1-12'},{key:'weeks',range:'1-7'},{key:'years'}] 
 | 
    ,defaultCron: {seconds:"*",minutes:"*",hours:"*",days:"*", months:"*", weeks:"?", years:""} 
 | 
    ,trigger: "click" //呼出控件的事件 
 | 
    ,btns: ['run', 'confirm'] //右下角显示的按钮,会按照数组顺序排列 
 | 
    ,position: null //控件定位方式定位, 默认absolute,支持:fixed/absolute/static 
 | 
    ,zIndex: null //控件层叠顺序 
 | 
    ,show: false //是否直接显示,如果设置 true,则默认直接显示控件 
 | 
    ,showBottom: true //是否显示底部栏 
 | 
    ,done: null //控件选择完毕后的回调,点击运行/确定也均会触发 
 | 
    ,run: null // 最近运行时间接口 
 | 
  }; 
 | 
  
 | 
  //多语言 
 | 
  Class.prototype.lang = function(){ 
 | 
    var that = this 
 | 
        ,options = that.config 
 | 
        ,text = { 
 | 
      cn: { 
 | 
        tabs: [{title: "秒"} 
 | 
          , {title: "分"} 
 | 
          , {title: "时"} 
 | 
          , {title: "日"} 
 | 
          , {title: "月"} 
 | 
          , {title: "周", rateBegin: "第", rateMid: "周的星期", rateEnd:""} 
 | 
          , {title: "年"}] 
 | 
        , every: "每" 
 | 
        , unspecified: "不指定" 
 | 
        , period: "周期" 
 | 
        , periodFrom: "从" 
 | 
        , rate: "按照" 
 | 
        , rateBegin: "从" 
 | 
        , rateMid: "开始,每" 
 | 
        , rateEnd: "执行一次" 
 | 
        , weekday: "工作日" 
 | 
        , weekdayPrefix: "每月" 
 | 
        , weekdaySuffix: "号最近的那个工作日" 
 | 
        , lastday: "本月最后一日" 
 | 
        , lastweek: "本月最后一个星期" 
 | 
        , custom: "指定" 
 | 
        ,tools: { 
 | 
          confirm: '确定' 
 | 
          ,run: '运行' 
 | 
        } 
 | 
        ,formatError: ['Cron格式不合法', '<br>已为你重置'] 
 | 
      } 
 | 
      ,en: { 
 | 
        tabs: [{title:"Seconds"} 
 | 
          , {title:"Minutes"} 
 | 
          , {title:"Hours"} 
 | 
          , {title:"Days"} 
 | 
          , {title:"Months"} 
 | 
          , {title:"Weeks"} 
 | 
          , {title:"Years"}] 
 | 
        , every:"Every " 
 | 
        , unspecified:"Unspecified" 
 | 
        , period:"Period" 
 | 
        , periodFrom: "From" 
 | 
        , rate: "According to" 
 | 
        , rateBegin: "begin at" 
 | 
        , rateMid: ", every" 
 | 
        , rateEnd: " execute once" 
 | 
        , weekday: "Weekday" 
 | 
        , weekdayPrefix: "Every month at " 
 | 
        , weekdaySuffix: "号最近的那个工作日" 
 | 
        , lastday: "Last day of the month" 
 | 
        , lastweek: "本月最后一个星期" 
 | 
        , custom: "Custom" 
 | 
        ,tools: { 
 | 
          confirm: 'Confirm' 
 | 
          ,run: 'Run' 
 | 
        } 
 | 
        ,formatError: ['The cron format error', '<br>It has been reset'] 
 | 
      } 
 | 
    }; 
 | 
    return text[options.lang] || text['cn']; 
 | 
  }; 
 | 
  
 | 
  //初始准备 
 | 
  Class.prototype.init = function(){ 
 | 
    var that = this 
 | 
        ,options = that.config 
 | 
        ,isStatic = options.position === 'static'; 
 | 
  
 | 
    options.elem = lay(options.elem); 
 | 
  
 | 
    options.eventElem = lay(options.eventElem); 
 | 
  
 | 
    if(!options.elem[0]) return; 
 | 
  
 | 
    //如果不是input|textarea元素,则默认采用click事件 
 | 
    if(!that.isInput(options.elem[0])){ 
 | 
      if(options.trigger === 'focus'){ 
 | 
        options.trigger = 'click'; 
 | 
      } 
 | 
    } 
 | 
  
 | 
    // 设置渲染所绑定元素的唯一KEY 
 | 
    if(!options.elem.attr('lay-key')){ 
 | 
      options.elem.attr('lay-key', that.index); 
 | 
      options.eventElem.attr('lay-key', that.index); 
 | 
    } 
 | 
  
 | 
    // 当前实例主面板ID 
 | 
    that.elemID = 'layui-icon'+ options.elem.attr('lay-key'); 
 | 
  
 | 
    //默认赋值 
 | 
    if(options.value && options.isInitValue){ 
 | 
      that.setValue(options.value); 
 | 
    } 
 | 
    if(!options.value){ 
 | 
      options.value = options.elem[0].value||''; 
 | 
    } 
 | 
    var cronArr = options.value.split(' '); 
 | 
    if(cronArr.length >= 6){ 
 | 
      options.cron = { 
 | 
        seconds:cronArr[0], 
 | 
        minutes:cronArr[1], 
 | 
        hours:cronArr[2], 
 | 
        days:cronArr[3], 
 | 
        months:cronArr[4], 
 | 
        weeks:cronArr[5], 
 | 
        years:"", 
 | 
      }; 
 | 
    }else{ 
 | 
      options.cron = lay.extend({},options.defaultCron); 
 | 
    } 
 | 
  
 | 
  
 | 
    if(options.show || isStatic) that.render(); 
 | 
    isStatic || that.events(); 
 | 
  
 | 
  
 | 
  }; 
 | 
  
 | 
  
 | 
  // 控件主体渲染 
 | 
  Class.prototype.render = function(){ 
 | 
    var that = this 
 | 
        ,options = that.config 
 | 
        ,lang = that.lang() 
 | 
        ,isStatic = options.position === 'static' 
 | 
        ,tabFilter = 'cron-tab' + options.elem.attr('lay-key') 
 | 
        //主面板 
 | 
        ,elem = that.elem = lay.elem('div', { 
 | 
          id: that.elemID 
 | 
          ,'class': [ 
 | 
            'layui-cron' 
 | 
            ,isStatic ? (' '+ ELEM_STATIC) : '' 
 | 
          ].join('') 
 | 
        }) 
 | 
  
 | 
        // tab 内容区域 
 | 
        ,elemTab = that.elemTab = lay.elem('div', { 
 | 
          'class': 'layui-tab layui-tab-card', 
 | 
          'lay-filter':tabFilter 
 | 
        }) 
 | 
        ,tabHead = lay.elem('ul',{ 
 | 
          'class': 'layui-tab-title' 
 | 
        }) 
 | 
        ,tabContent = lay.elem('div',{ 
 | 
          'class': 'layui-tab-content' 
 | 
        }) 
 | 
  
 | 
        //底部区域 
 | 
        ,divFooter = that.footer = lay.elem('div', { 
 | 
          'class': ELEM_FOOTER 
 | 
        }); 
 | 
  
 | 
    if(options.zIndex) elem.style.zIndex = options.zIndex; 
 | 
  
 | 
    // 生成tab 内容区域 
 | 
    elemTab.appendChild(tabHead); 
 | 
    elemTab.appendChild(tabContent); 
 | 
    lay.each(lang.tabs, function(i,item){ 
 | 
      // 表头 
 | 
      var li = lay.elem('li',{ 
 | 
        'class':i===0?THIS:"", 
 | 
        'lay-id':i 
 | 
      }); 
 | 
      li.innerHTML = item.title; 
 | 
      tabHead.appendChild(li); 
 | 
  
 | 
      // 表体 
 | 
      tabContent.appendChild(that.getTabContentChildElem(i)); 
 | 
    }); 
 | 
  
 | 
    // 主区域 
 | 
    elemMain = that.elemMain = lay.elem('div', { 
 | 
      'class': 'layui-cron-main' 
 | 
    }); 
 | 
    elemMain.appendChild(elemTab); 
 | 
  
 | 
    //生成底部栏 
 | 
    lay(divFooter).html(function(){ 
 | 
      var html = [], btns = []; 
 | 
      lay.each(options.btns, function(i, item){ 
 | 
        var title = lang.tools[item] || 'btn'; 
 | 
        btns.push('<span lay-type="'+ item +'" class="cron-btns-'+ item +'">'+ title +'</span>'); 
 | 
      }); 
 | 
      html.push('<div class="cron-footer-btns">'+ btns.join('') +'</div>'); 
 | 
      return html.join(''); 
 | 
    }()); 
 | 
  
 | 
    //插入到主区域 
 | 
    elem.appendChild(elemMain); 
 | 
  
 | 
    options.showBottom && elem.appendChild(divFooter); 
 | 
  
 | 
  
 | 
    //移除上一个控件 
 | 
    that.remove(Class.thisElemCron); 
 | 
  
 | 
    //如果是静态定位,则插入到指定的容器中,否则,插入到body 
 | 
    isStatic ? options.elem.append(elem) : ( 
 | 
        document.body.appendChild(elem) 
 | 
            ,that.position() 
 | 
    ); 
 | 
  
 | 
  
 | 
    that.checkCron(); 
 | 
  
 | 
    that.elemEvent(); // 主面板事件 
 | 
  
 | 
    Class.thisElemCron = that.elemID; 
 | 
  
 | 
    form.render(); 
 | 
  
 | 
  } 
 | 
  
 | 
  // 渲染 tab 子控件 
 | 
  Class.prototype.getTabContentChildElem = function(index){ 
 | 
    var that = this, 
 | 
        options = that.config, 
 | 
        tabItem = options.tabs[index], 
 | 
        tabItemKey = tabItem.key, 
 | 
        lang = that.lang(), 
 | 
        tabItemLang = lang.tabs[index], 
 | 
        cron = options.cron, 
 | 
        formFilter = 'cronForm'+tabItemKey+options.elem.attr('lay-key') 
 | 
        ,data = function(){ 
 | 
          if(cron[tabItemKey].indexOf('-') != -1){ 
 | 
            // 周期数据 
 | 
            var arr = cron[tabItemKey].split('-'); 
 | 
            return { 
 | 
              type:'range', 
 | 
              start:arr[0], 
 | 
              end:arr[1] 
 | 
            }; 
 | 
          } 
 | 
          if(cron[tabItemKey].indexOf('/') != -1){ 
 | 
            // 频率数据 
 | 
            var arr = cron[tabItemKey].split('/'); 
 | 
            return { 
 | 
              type:'rate', 
 | 
              begin:arr[0], 
 | 
              rate:arr[1] 
 | 
            }; 
 | 
          } 
 | 
          if(cron[tabItemKey].indexOf(',') != -1 || /^\+?[0-9][0-9]*$/.test(cron[tabItemKey])){ 
 | 
            // 按照指定执行 
 | 
            var arr = cron[tabItemKey].split(',').map(Number); 
 | 
            return { 
 | 
              type:'custom', 
 | 
              values:arr 
 | 
            }; 
 | 
          } 
 | 
          if(cron[tabItemKey].indexOf('W') != -1){ 
 | 
            // 最近的工作日 
 | 
            var value = cron[tabItemKey].replace('W',''); 
 | 
            return { 
 | 
              type:'weekday', 
 | 
              value: value 
 | 
            }; 
 | 
          } 
 | 
          if(index===3 && cron[tabItemKey] === 'L'){ 
 | 
            // 本月最后一日 
 | 
            return { 
 | 
              type:'lastday', 
 | 
              value: 'L' 
 | 
            }; 
 | 
          } 
 | 
          if(index===5 && cron[tabItemKey].indexOf('L') != -1){ 
 | 
            // 本月最后一个周 value 
 | 
            var value = cron[tabItemKey].replace('L',''); 
 | 
            return { 
 | 
              type:'lastweek', 
 | 
              value: value 
 | 
            }; 
 | 
          } 
 | 
          if(cron[tabItemKey] === '*'){ 
 | 
            // 每次 
 | 
            return { 
 | 
              type:'every', 
 | 
              value:'*' 
 | 
            }; 
 | 
          } 
 | 
          if(cron[tabItemKey] === '?'||cron[tabItemKey]===undefined||cron[tabItemKey]===''){ 
 | 
            // 不指定 
 | 
            return { 
 | 
              type:'unspecified', 
 | 
              value:cron[tabItemKey] 
 | 
            }; 
 | 
          } 
 | 
        }() 
 | 
        , rangeData = function(){ 
 | 
          if(tabItem.range){ 
 | 
            var arr = tabItem.range.split('-'); 
 | 
            return { 
 | 
              min:parseInt(arr[0]), 
 | 
              max:parseInt(arr[1]) 
 | 
            }; 
 | 
          } 
 | 
        }(); 
 | 
    var elem = lay.elem('div', { 
 | 
      'class': 'layui-tab-item layui-form '+(index===0?SHOW:"") 
 | 
      ,'lay-filter': formFilter 
 | 
    }); 
 | 
  
 | 
    // 每次 
 | 
    elem.appendChild(function(){ 
 | 
      var everyRadio = lay.elem('input',{ 
 | 
        'name': tabItemKey+'[type]' 
 | 
        ,'type': 'radio' 
 | 
        ,'value': 'every' 
 | 
        ,'title': lang.every+tabItemLang.title 
 | 
      }); 
 | 
      if(data.type === 'every'){ 
 | 
        lay(everyRadio).attr('checked', true); 
 | 
      } 
 | 
      var everyDiv = lay.elem('div',{ 
 | 
        'class':'cron-row' 
 | 
      }); 
 | 
      everyDiv.appendChild(everyRadio); 
 | 
      return everyDiv; 
 | 
    }()); 
 | 
  
 | 
    // 不指定,从日开始 
 | 
    if(index >= 3){ 
 | 
      elem.appendChild(function(){ 
 | 
        var unspecifiedRadio = lay.elem('input',{ 
 | 
          'name': tabItemKey+'[type]' 
 | 
          ,'type': 'radio' 
 | 
          ,'value': 'unspecified' 
 | 
          ,'title': lang.unspecified 
 | 
        }); 
 | 
        if(data.type==='unspecified'){ 
 | 
          lay(unspecifiedRadio).attr('checked', true); 
 | 
        } 
 | 
        var unspecifiedDiv = lay.elem('div',{ 
 | 
          'class':'cron-row' 
 | 
        }); 
 | 
        unspecifiedDiv.appendChild(unspecifiedRadio); 
 | 
        return unspecifiedDiv; 
 | 
      }()); 
 | 
    } 
 | 
  
 | 
    // 周期 
 | 
    var rangeChild = [function(){ 
 | 
      var rangeRadio = lay.elem('input',{ 
 | 
        'name': tabItemKey+'[type]' 
 | 
        ,'type': 'radio' 
 | 
        ,'value': 'range' 
 | 
        ,'title': lang.period 
 | 
      }); 
 | 
      if(data.type === 'range'){ 
 | 
        lay(rangeRadio).attr('checked', true); 
 | 
      } 
 | 
      return rangeRadio; 
 | 
    }(),function(){ 
 | 
      var elem = lay.elem('div',{ 
 | 
        'class':'cron-input-mid' 
 | 
      }); 
 | 
      elem.innerHTML = lang.periodFrom; 
 | 
      return elem; 
 | 
    }(),function(){ 
 | 
      var elem = lay.elem('input',{ 
 | 
        'class':'cron-input', 
 | 
        'type': 'number', 
 | 
        'name': 'rangeStart', 
 | 
        'value': data.start||'' 
 | 
      }); 
 | 
      return elem; 
 | 
    }(),function(){ 
 | 
      var elem = lay.elem('div',{ 
 | 
        'class':'cron-input-mid' 
 | 
      }); 
 | 
      elem.innerHTML = '-'; 
 | 
      return elem; 
 | 
    }(),function(){ 
 | 
      var elem = lay.elem('input',{ 
 | 
        'class':'cron-input', 
 | 
        'type': 'number', 
 | 
        'name': 'rangeEnd', 
 | 
        'value': data.end||'' 
 | 
      }); 
 | 
      return elem; 
 | 
    }(),function(){ 
 | 
      var elem = lay.elem('div',{ 
 | 
        'class':'cron-input-mid' 
 | 
      }); 
 | 
      elem.innerHTML = tabItemLang.title; 
 | 
      return elem; 
 | 
    }()] 
 | 
  
 | 
        ,rangeDiv = lay.elem('div',{ 
 | 
      'class':'cron-row' 
 | 
    }); 
 | 
    lay.each(rangeChild,function(i,item){ 
 | 
      rangeDiv.appendChild(item); 
 | 
    }); 
 | 
    if(tabItem.range){ 
 | 
      var rangeTip = lay.elem('div',{ 
 | 
        'class':'cron-tips' 
 | 
      }); 
 | 
      rangeTip.innerHTML = ['(',tabItem.range,')'].join(''); 
 | 
      rangeDiv.appendChild(rangeTip); 
 | 
    } 
 | 
    elem.appendChild(rangeDiv); 
 | 
  
 | 
    // 频率,年没有 
 | 
    if(index<6){ 
 | 
      var rateChild = [function(){ 
 | 
        var rateRadio = lay.elem('input',{ 
 | 
          'name': tabItemKey+'[type]' 
 | 
          ,'type': 'radio' 
 | 
          ,'value': 'rate' 
 | 
          ,'title': lang.rate 
 | 
        }); 
 | 
        if(data.type === 'rate'){ 
 | 
          lay(rateRadio).attr('checked', true); 
 | 
        } 
 | 
        return rateRadio; 
 | 
      }(),function(){ 
 | 
        var elem = lay.elem('div',{ 
 | 
          'class':'cron-input-mid' 
 | 
        }); 
 | 
        elem.innerHTML = tabItemLang.rateBegin || lang.rateBegin; 
 | 
        return elem; 
 | 
      }(),function(){ 
 | 
        var elem = lay.elem('input',{ 
 | 
          'class':'cron-input', 
 | 
          'type': 'number', 
 | 
          'name': 'begin', 
 | 
          'value': data.begin||'' 
 | 
        }); 
 | 
        return elem; 
 | 
      }(),function(){ 
 | 
        var elem = lay.elem('div',{ 
 | 
          'class':'cron-input-mid' 
 | 
        }); 
 | 
        elem.innerHTML = tabItemLang.rateMid || (tabItemLang.title+lang.rateMid); 
 | 
        return elem; 
 | 
      }(),function(){ 
 | 
        var elem = lay.elem('input',{ 
 | 
          'class':'cron-input', 
 | 
          'type': 'number', 
 | 
          'name': 'rate', 
 | 
          'value': data.rate||'' 
 | 
        }); 
 | 
        return elem; 
 | 
      }(),function(){ 
 | 
        var elem = lay.elem('div',{ 
 | 
          'class':'cron-input-mid' 
 | 
        }); 
 | 
        elem.innerHTML = undefined!=tabItemLang.rateEnd ? tabItemLang.rateEnd:(tabItemLang.title+lang.rateEnd); 
 | 
        if(undefined!=tabItemLang.rateEnd&&tabItemLang.rateEnd===''){ 
 | 
          lay(elem).addClass(HIDE); 
 | 
        } 
 | 
        return elem; 
 | 
      }()] 
 | 
  
 | 
          ,rateDiv = lay.elem('div',{ 
 | 
        'class':'cron-row' 
 | 
      }); 
 | 
      lay.each(rateChild,function(i,item){ 
 | 
        rateDiv.appendChild(item); 
 | 
      }); 
 | 
      if(tabItem.range){ 
 | 
        var rateTip = lay.elem('div',{ 
 | 
          'class':'cron-tips' 
 | 
        }); 
 | 
        if(index===5){ 
 | 
          // 周 
 | 
          rateTip.innerHTML = '(1-4/1-7)'; 
 | 
        }else{ 
 | 
          rateTip.innerHTML = ['(',rangeData.min,'/',(rangeData.max+(index<=2?1:0)),')'].join(''); 
 | 
        } 
 | 
        rateDiv.appendChild(rateTip); 
 | 
      } 
 | 
      elem.appendChild(rateDiv); 
 | 
    } 
 | 
  
 | 
    // 特殊:日(最近的工作日、最后一日),周(最后一周) 
 | 
    if(index===3){ 
 | 
      // 日 
 | 
      // 最近的工作日 
 | 
      var weekChild = [function(){ 
 | 
        var weekRadio = lay.elem('input',{ 
 | 
          'name': tabItemKey+'[type]' 
 | 
          ,'type': 'radio' 
 | 
          ,'value': 'weekday' 
 | 
          ,'title': lang.weekday 
 | 
        }); 
 | 
        if(data.type === 'weekday'){ 
 | 
          lay(weekRadio).attr('checked', true); 
 | 
        } 
 | 
        return weekRadio; 
 | 
      }(),function(){ 
 | 
        var elem = lay.elem('div',{ 
 | 
          'class':'cron-input-mid' 
 | 
        }); 
 | 
        elem.innerHTML = lang.weekdayPrefix; 
 | 
        return elem; 
 | 
      }(),function(){ 
 | 
        var elem = lay.elem('input',{ 
 | 
          'class':'cron-input', 
 | 
          'type': 'number', 
 | 
          'name': 'weekday', 
 | 
          'value': data.value||'' 
 | 
        }); 
 | 
        return elem; 
 | 
      }(),function(){ 
 | 
        var elem = lay.elem('div',{ 
 | 
          'class':'cron-input-mid' 
 | 
        }); 
 | 
        elem.innerHTML = lang.weekdaySuffix; 
 | 
        return elem; 
 | 
      }(),function(){ 
 | 
        var elem = lay.elem('div',{ 
 | 
          'class':'cron-tips' 
 | 
        }); 
 | 
        elem.innerHTML = ['(',tabItem.range,')'].join(''); 
 | 
        return elem; 
 | 
      }()] 
 | 
  
 | 
          ,weekDiv = lay.elem('div',{ 
 | 
        'class':'cron-row' 
 | 
      }); 
 | 
      lay.each(weekChild,function(i,item){ 
 | 
        weekDiv.appendChild(item); 
 | 
      }); 
 | 
      elem.appendChild(weekDiv); 
 | 
  
 | 
      // 本月最后一日 
 | 
      elem.appendChild(function(){ 
 | 
        var lastRadio = lay.elem('input',{ 
 | 
          'name': tabItemKey+'[type]' 
 | 
          ,'type': 'radio' 
 | 
          ,'value': 'lastday' 
 | 
          ,'title': lang.lastday 
 | 
        }); 
 | 
        if(data.type === 'lastday'){ 
 | 
          lay(lastRadio).attr('checked', true); 
 | 
        } 
 | 
        var lastDiv = lay.elem('div',{ 
 | 
          'class':'cron-row' 
 | 
        }); 
 | 
        lastDiv.appendChild(lastRadio); 
 | 
        return lastDiv; 
 | 
      }()); 
 | 
  
 | 
    } 
 | 
  
 | 
    if(index===5){ 
 | 
      // 本月最后一个周几 
 | 
      var lastWeekChild = [function(){ 
 | 
        var lastWeekRadio = lay.elem('input',{ 
 | 
          'name': tabItemKey+'[type]' 
 | 
          ,'type': 'radio' 
 | 
          ,'value': 'lastweek' 
 | 
          ,'title': lang.lastweek 
 | 
        }); 
 | 
        if(data.type === 'lastweek'){ 
 | 
          lay(lastWeekRadio).attr('checked', true); 
 | 
        } 
 | 
        return lastWeekRadio; 
 | 
      }(),function(){ 
 | 
        var elem = lay.elem('input',{ 
 | 
          'class':'cron-input', 
 | 
          'type': 'number', 
 | 
          'name': 'lastweek', 
 | 
          'value': data.value||'' 
 | 
        }); 
 | 
        return elem; 
 | 
      }(),function(){ 
 | 
        var elem = lay.elem('div',{ 
 | 
          'class':'cron-tips' 
 | 
        }); 
 | 
        elem.innerHTML = ['(',tabItem.range,')'].join(''); 
 | 
        return elem; 
 | 
      }()] 
 | 
  
 | 
          ,lastWeekDiv = lay.elem('div',{ 
 | 
        'class':'cron-row' 
 | 
      }); 
 | 
      lay.each(lastWeekChild,function(i,item){ 
 | 
        lastWeekDiv.appendChild(item); 
 | 
      }); 
 | 
      elem.appendChild(lastWeekDiv); 
 | 
  
 | 
    } 
 | 
  
 | 
    // 指定 
 | 
    if(index <= 5){ 
 | 
      elem.appendChild(function(){ 
 | 
        var customRadio = lay.elem('input',{ 
 | 
          'name': tabItemKey+'[type]' 
 | 
          ,'type': 'radio' 
 | 
          ,'value': 'custom' 
 | 
          ,'title': lang.custom 
 | 
        }); 
 | 
        if(data.type === 'custom'){ 
 | 
          lay(customRadio).attr('checked', true); 
 | 
        } 
 | 
        var customDiv = lay.elem('div',{ 
 | 
          'class':'cron-row' 
 | 
        }); 
 | 
        customDiv.appendChild(customRadio); 
 | 
        return customDiv; 
 | 
      }()); 
 | 
  
 | 
      // 指定数值,时分秒显示两位数,自动补零 
 | 
      elem.appendChild(function(){ 
 | 
        var customGrid = lay.elem('div',{ 
 | 
          'class': 'cron-grid' 
 | 
        }); 
 | 
        var i = rangeData.min; 
 | 
        while(i<=rangeData.max){ 
 | 
          // 时分秒显示两位数,自动补零 
 | 
          var gridItemValue = index<=2 ? lay.digit(i,2) : i; 
 | 
          var gridItem = lay.elem('input',{ 
 | 
            'type': 'checkbox', 
 | 
            'title': gridItemValue, 
 | 
            'lay-skin': 'primary', 
 | 
            'name':tabItemKey+'[custom]', 
 | 
            'value':i 
 | 
          }); 
 | 
          if(data.values && data.values.includes(i)){ 
 | 
            lay(gridItem).attr('checked',true); 
 | 
          } 
 | 
          customGrid.appendChild(gridItem); 
 | 
          i++; 
 | 
        } 
 | 
        return customGrid; 
 | 
      }()); 
 | 
    } 
 | 
  
 | 
  
 | 
    return elem; 
 | 
  } 
 | 
  
 | 
  //是否输入框 
 | 
  Class.prototype.isInput = function(elem){ 
 | 
    return /input|textarea/.test(elem.tagName.toLocaleLowerCase()); 
 | 
  }; 
 | 
  
 | 
  // 绑定的元素事件处理 
 | 
  Class.prototype.events = function(){ 
 | 
    var that = this 
 | 
        ,options = that.config 
 | 
  
 | 
        //绑定呼出控件事件 
 | 
        ,showEvent = function(elem, bind){ 
 | 
          elem.on(options.trigger, function(){ 
 | 
            bind && (that.bindElem = this); 
 | 
            that.render(); 
 | 
          }); 
 | 
        }; 
 | 
  
 | 
    if(!options.elem[0] || options.elem[0].eventHandler) return; 
 | 
  
 | 
    showEvent(options.elem, 'bind'); 
 | 
    showEvent(options.eventElem); 
 | 
  
 | 
    //绑定关闭控件事件 
 | 
    lay(document).on('click', function(e){ 
 | 
      if(e.target === options.elem[0] 
 | 
          || e.target === options.eventElem[0] 
 | 
          || e.target === lay(options.closeStop)[0]){ 
 | 
        return; 
 | 
      } 
 | 
      that.remove(); 
 | 
    }).on('keydown', function(e){ 
 | 
      if(e.keyCode === 13){ 
 | 
        if(lay('#'+ that.elemID)[0] && that.elemID === Class.thisElemDate){ 
 | 
          e.preventDefault(); 
 | 
          lay(that.footer).find(ELEM_CONFIRM)[0].click(); 
 | 
        } 
 | 
      } 
 | 
    }); 
 | 
  
 | 
    //自适应定位 
 | 
    lay(window).on('resize', function(){ 
 | 
      if(!that.elem || !lay(ELEM)[0]){ 
 | 
        return false; 
 | 
      } 
 | 
      that.position(); 
 | 
    }); 
 | 
  
 | 
    options.elem[0].eventHandler = true; 
 | 
  }; 
 | 
  
 | 
  // 主面板事件 
 | 
  Class.prototype.elemEvent = function(){ 
 | 
    var that = this 
 | 
        ,options = that.config 
 | 
        ,tabFilter = 'cron-tab' + options.elem.attr('lay-key'); 
 | 
  
 | 
    // 阻止主面板点击冒泡,避免因触发文档事件而关闭主面 
 | 
    lay(that.elem).on('click', function(e){ 
 | 
      lay.stope(e); 
 | 
    }); 
 | 
  
 | 
    // tab选项卡切换 
 | 
    var lis = lay(that.elemTab).find('li'); 
 | 
    lis.on('click',function(){ 
 | 
      var layid = lay(this).attr('lay-id'); 
 | 
      if(undefined === layid){ 
 | 
        return; 
 | 
      } 
 | 
      element.tabChange(tabFilter, layid); 
 | 
    }); 
 | 
  
 | 
    // cron选项点击 
 | 
    form.on('radio', function(data){ 
 | 
      var $parent = data.othis.parent(); 
 | 
      var formFilter = $parent.parent().attr('lay-filter'); 
 | 
      var formData = form.val(formFilter); 
 | 
      var radioType = data.value; 
 | 
      if('range'===radioType){ 
 | 
        // 范围 
 | 
        form.val(formFilter,{ 
 | 
          rangeStart: formData.rangeStart||0, 
 | 
          rangeEnd: formData.rangeEnd||2 
 | 
        }); 
 | 
      } 
 | 
      if('rate'===radioType){ 
 | 
        // 频率 
 | 
        form.val(formFilter,{ 
 | 
          begin: formData.begin||0, 
 | 
          rate: formData.rate||2 
 | 
        }); 
 | 
      } 
 | 
      if('custom'===radioType){ 
 | 
        // custom 
 | 
        var $grid = $parent.next(); 
 | 
        if($grid.find(':checkbox:checked').length<=0){ 
 | 
          $grid.children(':checkbox:first').next().click() 
 | 
        } 
 | 
      } 
 | 
      if('weekday'===radioType){ 
 | 
        // weekday 
 | 
        form.val(formFilter,{ 
 | 
          weekday: formData.weekday||1 
 | 
        }); 
 | 
      } 
 | 
      if('lastweek'===radioType){ 
 | 
        // lastweek 
 | 
        form.val(formFilter,{ 
 | 
          lastweek: formData.lastweek||1 
 | 
        }); 
 | 
      } 
 | 
  
 | 
    }); 
 | 
  
 | 
    //点击底部按钮 
 | 
    lay(that.footer).find('span').on('click', function(){ 
 | 
      var type = lay(this).attr('lay-type'); 
 | 
      that.tool(this, type); 
 | 
    }); 
 | 
  }; 
 | 
  
 | 
  //底部按钮点击事件 
 | 
  Class.prototype.tool = function(btn, type){ 
 | 
    var that = this 
 | 
        ,options = that.config 
 | 
        ,lang = that.lang() 
 | 
        ,isStatic = options.position === 'static' 
 | 
        ,active = { 
 | 
      //运行 
 | 
      run: function(){ 
 | 
        var value = that.parse(); 
 | 
        var loading = layer.load(); 
 | 
        $.get(options.run,{cron:value},function(res){ 
 | 
          layer.close(loading); 
 | 
          if(res.code !== 0){ 
 | 
            return that.hint(res.msg); 
 | 
          } 
 | 
          that.runHint(res.data); 
 | 
        },'json').fail(function(){ 
 | 
          layer.close(loading); 
 | 
          that.hint('服务器异常!'); 
 | 
        }); 
 | 
      } 
 | 
  
 | 
      //确定 
 | 
      ,confirm: function(){ 
 | 
        var value = that.parse(); 
 | 
        that.done([value]); 
 | 
        that.setValue(value).remove() 
 | 
      } 
 | 
    }; 
 | 
    active[type] && active[type](); 
 | 
  }; 
 | 
  
 | 
  //执行 done/change 回调 
 | 
  Class.prototype.done = function(param, type){ 
 | 
    var that = this 
 | 
        ,options = that.config; 
 | 
  
 | 
    param = param || [that.parse()]; 
 | 
    typeof options[type || 'done'] === 'function' && options[type || 'done'].apply(options, param); 
 | 
  
 | 
    return that; 
 | 
  }; 
 | 
  
 | 
  // 解析cron表达式 
 | 
  Class.prototype.parse = function(){ 
 | 
    var that = this 
 | 
        ,options = that.config 
 | 
        ,valueArr = []; 
 | 
  
 | 
    lay.each(options.tabs, function(index, item){ 
 | 
      var key = item.key; 
 | 
      var formFilter = 'cronForm' + key + options.elem.attr('lay-key'); 
 | 
      var formData = form.val(formFilter); 
 | 
      var radioType = (key+'[type]'); 
 | 
      var current = ""; 
 | 
      if(formData[radioType] === 'every'){ 
 | 
        // 每次 
 | 
        current = "*"; 
 | 
      } 
 | 
      if(formData[radioType] === 'range'){ 
 | 
        // 范围 
 | 
        current = formData.rangeStart + "-" + formData.rangeEnd; 
 | 
      } 
 | 
      if(formData[radioType] === 'rate'){ 
 | 
        // 频率 
 | 
        current = formData.begin + "/" + formData.rate; 
 | 
      } 
 | 
      if(formData[radioType] === 'custom'){ 
 | 
        // 指定 
 | 
        var checkboxName = (item.key+'[custom]'); 
 | 
        var customArr = []; 
 | 
        $('input[name="' + checkboxName + '"]:checked').each(function() { 
 | 
          customArr.push($(this).val()); 
 | 
        }); 
 | 
        current = customArr.join(','); 
 | 
      } 
 | 
      if(formData[radioType] === 'weekday'){ 
 | 
        // 每月 formData.weekday 号最近的那个工作日 
 | 
        current = formData.weekday + "W"; 
 | 
      } 
 | 
      if(formData[radioType] === 'lastday'){ 
 | 
        // 本月最后一日 
 | 
        current = "L"; 
 | 
      } 
 | 
      if(formData[radioType] === 'lastweek'){ 
 | 
        // 本月最后星期 
 | 
        current = formData.lastweek + "L"; 
 | 
      } 
 | 
  
 | 
      if(formData[radioType] === 'unspecified' && index != 6){ 
 | 
        // 不指定 
 | 
        current = "?"; 
 | 
      } 
 | 
      if(current !== ""){ 
 | 
        valueArr.push(current); 
 | 
        options.cron[key] = current; 
 | 
      } 
 | 
    }); 
 | 
    return valueArr.join(' '); 
 | 
  }; 
 | 
  
 | 
  //控件移除 
 | 
  Class.prototype.remove = function(prev){ 
 | 
    var that = this 
 | 
        ,options = that.config 
 | 
        ,elem = lay('#'+ (prev || that.elemID)); 
 | 
    if(!elem[0]) return that; 
 | 
  
 | 
    if(!elem.hasClass(ELEM_STATIC)){ 
 | 
      that.checkCron(function(){ 
 | 
        elem.remove(); 
 | 
      }); 
 | 
    } 
 | 
    return that; 
 | 
  }; 
 | 
  
 | 
  //定位算法 
 | 
  Class.prototype.position = function(){ 
 | 
    var that = this 
 | 
        ,options = that.config; 
 | 
    lay.position(that.bindElem || options.elem[0], that.elem, { 
 | 
      position: options.position 
 | 
    }); 
 | 
    return that; 
 | 
  }; 
 | 
  
 | 
  //提示 
 | 
  Class.prototype.hint = function(content){ 
 | 
    var that = this 
 | 
        ,options = that.config 
 | 
        ,div = lay.elem('div', { 
 | 
      'class': ELEM_HINT 
 | 
    }); 
 | 
  
 | 
    if(!that.elem) return; 
 | 
  
 | 
    div.innerHTML = content || ''; 
 | 
    lay(that.elem).find('.'+ ELEM_HINT).remove(); 
 | 
    that.elem.appendChild(div); 
 | 
  
 | 
    clearTimeout(that.hinTimer); 
 | 
    that.hinTimer = setTimeout(function(){ 
 | 
      lay(that.elem).find('.'+ ELEM_HINT).remove(); 
 | 
    }, 3000); 
 | 
  }; 
 | 
  
 | 
  //运行提示 
 | 
  Class.prototype.runHint = function(runList){ 
 | 
    var that = this 
 | 
        ,options = that.config 
 | 
        ,div = lay.elem('div', { 
 | 
      'class': ELEM_RUN_HINT 
 | 
    }); 
 | 
    // debugger; 
 | 
    if(!that.elem||!runList||!runList.length) return; 
 | 
  
 | 
  
 | 
    lay(div).html(function(){ 
 | 
      var html = []; 
 | 
      lay.each(runList, function(i, item){ 
 | 
        html.push('<div class="cron-run-list">'+ item +'</div>'); 
 | 
      }); 
 | 
      return html.join(''); 
 | 
    }()); 
 | 
  
 | 
    lay(that.elem).find('.'+ ELEM_RUN_HINT).remove(); 
 | 
    that.elem.appendChild(div); 
 | 
  }; 
 | 
  
 | 
  //赋值 
 | 
  Class.prototype.setValue = function(value=''){ 
 | 
    var that = this 
 | 
        ,options = that.config 
 | 
        ,elem = that.bindElem || options.elem[0] 
 | 
        ,valType = that.isInput(elem) ? 'val' : 'html' 
 | 
  
 | 
    options.position === 'static' || lay(elem)[valType](value || ''); 
 | 
    elem.textContent = '生成'; 
 | 
    return this; 
 | 
  }; 
 | 
  
 | 
  //cron校验 
 | 
  Class.prototype.checkCron = function(fn){ 
 | 
    var that = this 
 | 
        ,options = that.config 
 | 
        ,lang = that.lang() 
 | 
        ,elem = that.bindElem || options.elem[0] 
 | 
        ,value = that.isInput(elem) ? elem.value : (options.position === 'static' ? '' : elem.innerHTML) 
 | 
  
 | 
        ,checkValid = function(value=""){ 
 | 
  
 | 
    }; 
 | 
  
 | 
    // cron 值,多个空格替换为一个空格,去掉首尾空格 
 | 
    value = value || options.value; 
 | 
    if(typeof value === 'string'){ 
 | 
      value = value.replace(/\s+/g, ' ').replace(/^\s|\s$/g, ''); 
 | 
    } 
 | 
  
 | 
    if(fn==='init') return checkValid(value),that; 
 | 
  
 | 
    value = that.parse(); 
 | 
    if(value){ 
 | 
      that.setValue(value); 
 | 
    } 
 | 
    fn && fn(); 
 | 
    return that; 
 | 
  }; 
 | 
  
 | 
  //核心入口 
 | 
  cron.render = function(options){ 
 | 
    var ins = new Class(options); 
 | 
    return thisIns.call(ins); 
 | 
  }; 
 | 
  
 | 
  exports('cron', cron); 
 | 
}); 
 |