if (!window.gal) window.gal = {};
if (!window.utl) window.utl = {};
(function(){
if (!document.body.insertAdjacentElement){
HTMLElement.prototype.insertAdjacentElement = function(_where,_element){
    if (!_where||!_element) return;
    switch(_where){
        case 'beforeEnd'  : this.appendChild(_element); return;
        case 'beforeBegin': this.parentNode.insertBefore(_element,this); return;
        case 'afterBegin' :
             !this.firstChild
             ?this.appendChild(_element)
             :this.insertBefore(_element,this.firstChild); return;
        case 'afterEnd'   :
             !this.nextSibling 
             ?this.parentNode.appendChild(_element)
             :this.parentNode.insertBefore(_element,this.nextSibling); return;
    }
};
HTMLElement.prototype.insertAdjacentHTML = function(_where,_html){
    if (!_where||!_html) return;
    this.insertAdjacentElement(_where,
         document.createRange().
         createContextualFragment(_html));
};}
/**
 * 获取节点的element子节点，不计算非ELEMENT_NODE的节点
 * @param  {String|Node} _element 节点ID或者对象
 * @param  {String}      _class   筛选节点的样式名称
 * @return {Array} 子节点列表
 */
utl._$getChildElements = function(_element){
    _element = document.getElementById(_element);
    if (!_element) return null;
    var _result = [];
    for(var _node=_element.children||_element.childNodes,i=0,l=_node.length;i<l;i++){
        if (_node[i].nodeType!=1) continue;
        _result.push(_node[i]);
    }
    return _result;
};
/*
 * 清除字符串两端的空格，原字符串内容不变
 * @param  {String} _content 待清除的字符串
 * @return {String}          清除两端空格的字符串
 */
utl._$trim = function(_content){
    return (_content||'').replace(/(?:^\s+)|(?:\s+$)/g,'');
};
/*
 * 阻止事件，包括默认事件和传递事件
 * @param  {Event} _event 要阻止的事件对象
 * @return {Void}
 */
utl._$stop = function(_event){
    utl._$stopBubble(_event);
    utl._$stopDefault(_event);
};
/*
 * 阻止事件的冒泡传递
 * @param  {Event} _event 要阻止的事件对象
 * @return {Void}
 */
utl._$stopBubble = function(_event){
    if (!_event) return;
    !!_event.stopPropagation
    ? _event.stopPropagation()
    : _event.cancelBubble = true;
};
/*
 * 阻止标签的默认事件
 * @param  {Event} _event 要阻止的事件对象
 * @return {Void}
 */
utl._$stopDefault = function(_event) {
    if (!_event) return;
    !!_event.preventDefault
    ? _event.preventDefault()
    : _event.returnValue = false;
};
utl._$indexOf = function(_list,_value){
    for(var i=0,l=_list.length;i<l;i++){
        if (_list[i]==_value) return i;
    }
    return -1;
};
utl.removeElement = function(_element){
    if (!_element) return;
    _element.parentNode.removeChild(_element);
    if(!!_element.outHTML) _element.outHTML = '';
};
/**
 * 反序列化串
 * @param  {String}  _content 待反序列化串
 * @return {Variable}         反序列化后的数据
 */
utl._$deserialize = function(_content){
    try{return !_content?null:eval('('+_content+')');}catch(e){return null;}
};
// form
var __forms = {};
/**
 * 检测数字类型是否合法
 * @param {Object} obj
 */
var __checkNumber = function(obj){
  if (obj == null) return false;
        if (obj == "") return true;
        var exp = new RegExp("^-?\\d+$");
        return exp.test(obj);  
};
/**
 * 检测Date类型是否合法
 */
var __checkDate = function(year,month,day){
    if (month < 1 || month > 12) return false;
        if (day < 1 || day > 31) return false;
        if ((month == 4 || month == 6 || month == 9 || month == 11) &&(day == 31)) 
            return false;
        
        if (month == 2) {
            var leap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
            if (day>29 || (day == 29 && !leap)) return false;
        }
     return true;
};
/**
 * 检测Email格式是否合法
 * @param {Object} emailStr
 */
var __checkEmail = function(emailStr){
      if (emailStr.length == 0) {                                                              
           return true;                                                                          
       }                                                                                         
       var emailPat=/^(.+)@(.+)$/;                                                               
       var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";                                         
       var validChars="\[^\\s" + specialChars + "\]";                                            
       var quotedUser="(\"[^\"]*\")";                                                            
       var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;                        
       var atom=validChars + '+';                                                                
       var word="(" + atom + "|" + quotedUser + ")";                                             
       var userPat=new RegExp("^" + word + "(\\." + word + ")*$");                               
       var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");                             
       var matchArray=emailStr.match(emailPat);                                                  
       if (matchArray == null) {                                                                 
           return false;                                                                         
       }                                                                                         
       var user=matchArray[1];                                                                   
       var domain=matchArray[2];                                                                 
       if (user.match(userPat) == null) {                                                        
           return false;                                                                         
       }                                                                                         
       var IPArray = domain.match(ipDomainPat);                                                  
       if (IPArray != null) {                                                                    
           for (var i = 1; i <= 4; i++) {                                                        
              if (IPArray[i] > 255) {                                                            
                 return false;                                                                   
              }                                                                                  
           }                                                                                     
           return true;                                                                          
       }                                                                                         
       var domainArray=domain.match(domainPat);                                                  
       if (domainArray == null) {                                                                
           return false;                                                                         
       }                                                                                         
       var atomPat=new RegExp(atom,"g");                                                         
       var domArr=domain.match(atomPat);                                                         
       var len=domArr.length;                                                                    
       if ((domArr[domArr.length-1].length < 2) ||                                               
           (domArr[domArr.length-1].length > 3)) {                                               
           return false;                                                                         
       }                                                                                         
       if (len < 2) {                                                                            
           return false;                                                                         
       }                                                                                         
       return true;  
};
/*
 * 提交表单之前验证
 * @param  {String} _fid   表单ID
 * @param  {Object} _event 事件
 */
var __onBeforeSubmit = function(_fid,_event){
    var _pool = __forms[_fid];
    if (!_pool) return;
    var _config = _pool.c,
        _elements = _pool.f.elements;
    _elements[_config.button].disabled = true;
    var i=0,_message;
    for(var l=_elements.length,_info;i<l;i++){
        _info = _config[_elements[i].name];
        if (!_info) continue;
        _message = __checkValue(_info,_elements[i]);
        if (!!_message) break;
    }
    if (!_message&&_config.filter){
        i = -1;
        _message = _config.filter(_pool.f);
    }
    if (!_message) return;
    alert(_message);
    try {_elements[i].focus();}catch(e){}
    _elements[_config.button].disabled = false;
    if (!_event) return true; else utl._$stop(_event);
};
/**
 * 绑定实时验证
 * @param {Object} _info 配置参数
 * @param {Object} _element 元素
 */
var __registerOneItem = function(_info,_element){
    //只添加对输入框的验证
    if(!(_element.tagName=='INPUT'||_element.tagName=='TEXTAREA'))return;
    _element.onblur = function(){
        var _message = __checkValue(_info,_element),
            _id = _element.name+'_tmp',
            _el = document.getElementById(_id),
            _html;
        if(_el){utl.removeElement(_el);}
        _html = '<span id="'+_id+'" class="fc3 js-message" >';
        if(!!_message){
            _html+= '<span class="iblock w-i tip-no">&nbsp;</span>'+_message;
        }else{
            if(_element.value){
                _html+= '<span class="iblock w-i tip-yes">&nbsp;</span>';
            }
        }
        _html+= '</span>';
        //什么时候不去修改
        //不必要字段 没有填值时候
        //如果指定容器
        if(_info.mc){
            var _container = document.getElementById(_info.mc);
            if(_container){
                if(!_info.dm)_info.dm = _container.innerHTML;
                _container.innerHTML = _html;
            }else{
                _element.insertAdjacentHTML('afterEnd',_html);
            }
        }else{
            _element.insertAdjacentHTML('afterEnd',_html);
        }
        if(!_element.value&&_info.f){
            _element.value = _element.defaultValue;
            if(!_info.f.c)return;
            _element.className = _element.className.replace(new RegExp('\\s'+_info.f.c,'g'),'')+' '+_info.f.c;
        }
    }
    _element.onfocus = function(){
       var _id = _element.name+'_tmp',
           _el = document.getElementById(_id);
       if(_el){utl.removeElement(_el);}
       if(_info.mc){
           var _container = document.getElementById(_info.mc);
           if(_container&&_info.dm){
               _container.innerHTML = _info.dm;
           }
       }
        if(_info.f){
            if (_element.value!=_element.defaultValue)return;
            _element.value = '';
            if(!_info.f.c)return;
            _element.className = _element.className.replace(new RegExp('\\s'+_info.f.c,'g'),'');
        }
    }
    
}
/*
 * 验证字段
 * @param  {Object} _info  字段配置信息
 * @param  {Node}   _value 字段节点
 * @return {String}        验证不通过返回错误信息
 */
var __checkValue = function(_info,_element){
    var _value = utl._$trim(_element.value);
    var _default = utl._$trim((_info.d+' ')||(_element.type!='hidden'&&_element.defaultValue)||'');
    //_default = utl._$trim(_element.type!='hidden'&&_element.defaultValue||'');
    //非必须项目
    if(_info.n&&(!_value||(!!_default&&_default==_value))) return '';
    //函数验证
    if (typeof(_info.z)=='function'){
        var _result = _info.z(_value);
        if(_result&&(typeof(_result)=='string'))
        return _result;
    }
    //验证类型
    if(_info.t){
        var _tinfo = _info.t;
        switch(_tinfo.t){
            case 'number':{
                if (!__checkNumber(_value)) {
                    return _tinfo.m||'请输入有效数字！';
                }
                break;
            }
            case 'float' :{
                var intvalue = parseFloat(_value);
                if (isNaN(intvalue)) {
                    return _tinfo.m||'请输入有效数值！';
                }
                break;
            }
            case 'date':{
                var _dates   = _value.split('-'),
                    _message = _tinfo.m||'必须为合法日期。';
                if(_dates.length!=3)return _message;
                if(!__checkDate(_dates[0],_dates[1],_dates[2])){
                    return _message;
                }
                break;
            }
            case 'email':{
                if(!__checkEmail(_value)){
                    return _tinfo.m||'Email格式不正确！';
                }
                break;
            }
        }
    }
    //验证长度及其他
    if(_info.l){
        var _linfo = _info.l;
        switch(_linfo.l){
            case  0: return !_value?(_linfo.m||'字段不能为空！'):'';
            case  1: return !_value||(!!_default&&_default==_value)?(_linfo.m||'字段不能为空！'):'';
            case  2: return _value.length>(_linfo.r||40)?(_linfo.m||'字段长度超过限制！'):'';
            case  3: return !_linfo.r.test(_value)?(_linfo.m||'字段不符合条件！'):'';
            case  4: return !_element.checked?(_linfo.m||'必须选择字段！'):'';
            case  5: return (parseInt(_value)||0)>0?(_linfo.m||'文件上传中请稍侯！'):'';
            case 12: return !_value||(!!_default&&_default==_value)?(_linfo.m||'字段不能为空！'):
                            (_value.length>(_linfo.r||40)?(_linfo.m||'字段长度超过限制！'):'');
        }    
    }
};
/**
 * 注册待处理表单，表单配置信息{'field':{t:{t:'number',m:'必须为数字'},l:{t:1,m:'字段不能为空'}},filter:function(){}}
 *  n 是否必要条件
 *    0   非必要条件（填写了内容，仍然需要验证合法性）
 *  t 类型验证
 *    t   类型(number|float|email|date)
 *    m   类型错误提示
 *  l 长度及其他验证
 *    t 
 *       1 不能为空
 *       2 长度有限制[r]
 *       3 规则不匹配[r]
 *       4 必须选择checkbox或者radio
 *       5 文件上传验证
 *       12 不能为空同时长度有限制
 *    r  验证条件
 *    m  错误信息提示
 *  d 默认值（如果有）
 *  f 验证function 
 *  o 是否绑定到字段提示
 * @param  {String} _fid    表单ID
 * @param  {Object} _config 表单配置信息
 * @return {Void}
 */
gal.registFrom = function(_fid,_config){
    if (!!__forms[_fid]) return;
    var _form = document.getElementById(_fid);
    if (!_form) return;
    var _pool = {f:_form,c:_config||{}};
    __forms[_fid] = _pool;
    var _elements = _form.elements;
    for(var i=0,l=_elements.length,_info;i<l;i++){
        _info = _config[_elements[i].name];
        if (!_info) continue;
        if(!_info.o){
            __registerOneItem(_info,_elements[i]);
        }
    }
    _form.onsubmit = function(_event){__onBeforeSubmit(_fid,window.event||_event);};
};
/**
 * 提交表单
 * @param  {String} _fid 表单ID
 * @return {Void}
 */
gal.submitFrom = function(_fid){
    if (!__forms[_fid]) return;
    if (!__onBeforeSubmit(_fid))
        __forms[_fid].f.submit();
};
gal.mustOneItem = function(_form,_list){
    _form = document.getElementById(_form);
    for(var i=0,l=_list.length,_value;i<l;i++){
        _value = _form[_list[i]].value;
        if (!!_value&&_value!=_form[_list[i]].defaultValue) return true;
    }
    return false;
};
// province and city
var __address = [
    {g:'-直辖市-',l:['北京','天津','上海','重庆']},
    {g:'-省 份-',l:[
     {n:'海南',l:['海口','三亚','儋州','琼山','通什','西沙','南沙岛','文昌']},
     {n:'广东',l:['广州','深圳','汕头','潮州','珠海','肇庆','汕尾','湛江','佛山','河源','韶关','揭阳','梅州','中山','惠州','东莞','清远','江门','茂名','德庆','阳江']},
     {n:'广西',l:['南宁','桂林','北海','百色','柳州','梧州','玉林','桂平','贺州','钦州','贵港','防城港']},
     {n:'云南',l:['昆明','大理','保山','楚雄','德宏','红河','临沧','怒江','曲靖','思茅','文山','玉溪','临沧','迪庆','丽江','西双版纳','德钦','昭通']},
     {n:'西藏',l:['拉萨','昌都','阿里','那曲','日喀则','林芝','山南']},
     {n:'四川',l:['成都','绵阳','泸州','内江','凉山','阿坝','巴中','广元','乐山','绵阳','德阳','攀枝花','雅安','宜宾','自贡','甘孜州','峨眉山','九寨沟','达州']},
     {n:'湖南',l:['长沙','邵阳','常德','郴州','吉首','株洲','娄底','湘潭','益阳','永州','岳阳','株洲','衡阳','衡山','怀化','张家界','韶山']},
     {n:'湖北',l:['武汉','黄冈','宜昌','恩施','荆州','神农架','十堰','咸宁','襄樊','孝感','随州','黄石','荆门','鄂州']},
     {n:'贵州',l:['贵阳','安顺','赤水','遵义','铜仁','六盘水','毕节','凯里','黄果树','都匀']},
     {n:'江西',l:['南昌','井冈山','景德镇','赣州','庐山','萍乡','九江','上饶','抚州','吉安','鹰潭','宜春']},
     {n:'福建',l:['福州','厦门','龙岩','南平','宁德','莆田','泉州','三明','武夷山市','漳州']},
     {n:'浙江',l:['杭州','宁波','湖州','金华','乐清','温州','丽水','绍兴','衢州','嘉兴','台州','乌镇','舟山']},
     {n:'安徽',l:['合肥','巢湖','蚌埠','安庆','六安','滁州','马鞍山','阜阳','宣城','铜陵','淮北','芜湖','亳州','宿州','黄山','九华山','淮南']},
     {n:'江苏',l:['南京','苏州','无锡','扬州','常州','昆山','连云港','南通','太仓','吴县','徐州','宜兴','镇江','淮安','常熟','盐城','泰州']},
     {n:'山东',l:['济南','青岛','烟台','潍坊','淄博','枣庄','威海','聊城','曲阜','济宁','临沂','菏泽','泰安','日照','泰山','东营']},
     {n:'山西',l:['太原','大同','阳泉','晋城','晋中','临汾','运城','长治','朔州','五台山','忻州']},
     {n:'陕西',l:['西安','韩城','安康','汉中','宝鸡','延安','咸阳','榆林','渭南','商洛','华山','铜川']},
     {n:'河北',l:['石家庄','唐山','秦皇岛','张家口','保定','廊坊','邯郸','邢台','沧州','承德','衡水']},
     {n:'河南',l:['郑州','济源','开封','洛阳','安阳','焦作','鹤壁','平顶山','商丘','濮阳','南阳','许昌','信阳','三门峡','驻马店','周口','新乡']},
     {n:'甘肃',l:['兰州','敦煌','白银','庆阳','酒泉','天水','武威','张掖','甘南','临夏','平凉','定西','金昌']},
     {n:'青海',l:['西宁','海北','海南','海西','黄南','果洛','刚察','玉树']},
     {n:'宁夏',l:['银川','固原','中卫']},
     {n:'新疆',l:['乌鲁木齐','阿勒泰','阿克苏','吐鲁番','伊犁','昌吉','哈密','和田','喀什','克拉玛依','石河子','塔城','库尔勒']},
     {n:'内蒙古',l:['呼和浩特','包头','赤峰','海拉尔','锡林浩特','乌海','满洲里','鄂尔多斯']},
     {n:'辽宁',l:['沈阳','大连','葫芦岛','旅顺','本溪','鞍山','朝阳','抚顺','锦州','铁岭','辽阳','营口','丹东','阜新']},
     {n:'吉林',l:['长春','延边','吉林','白山','白城','四平','松原','辽源']},
     {n:'黑龙江',l:['哈尔滨','牡丹江','齐齐哈尔','大庆','伊春','双鸭山','鹤岗','鸡西','佳木斯','七台河','绥化','大兴安岭','黑河']}]},
     {g:'-港澳台-',l:['香港','澳门','台湾']}];
/*
 * 取城市列表
 * @param  {Object} _index 省份索引值
 * @return {Void}
 */
var __getCity = function(_index){
    return _index<4||_index>30?null:__address[1].l[_index-4].l;
};
/*
 * 根据省份名称取索引值
 * @param  {String} _name 省份名称
 * @return {Void}
 */
var __getProvinceIndex = function(_name){
    var _list = __address[0].l,i=0;
    for(var l=_list.length;i<l;i++){
        if (_list[i]==_name) return i;
    }
    _list = __address[1].l,j=0;
    for(var l=_list.length;j<l;j++){
        if (_list[j].n==_name) return j+i;
    }
    _list = __address[2].l,k=0;
    for(var l=_list.length;k<l;k++){
        if (_list[k]==_name) return j+i+k;
    }
    return -1;
};
/*
 * 清空选择器
 * @param  {Node} _select 选择器
 * @return {Void}
 */
var __clearSelect = function(_select){
    if (!_select) return;
    for(var i=_select.options.length-1;i>=0;_select.remove(i),i--);
};
/*
 * 构造选择器
 * @param  {Node}  _select 选择器
 * @param  {Array} _list   数据列表
 * @return {Void}
 */
var __buildSelect = function(_select,_list){
    if (!_list||!_list.length) return;
    var _options = _select.options;
    for(var i=0,l=_list.length;i<l;
        _options[_options.length]=new Option(_list[i],_list[i]),i++);
};
/**
 * 获取省份城市选择代码
 * @param  {String} _fid     表单ID
 * @param  {Object} _names   表单字段名称
 * @param  {Object} _default 默认值
 * @return {String}          代码
 */
gal.getAddressHtml = function(_fid,_names,_hasaddress){
    _names = _names||{};
    var p = _names.province||'province',
        c = _names.city||'city',
        a = _names.address||'address';
    var _arr = ['<select id="'+p+'" name="'+p+'" onchange="gal.changeProvince(\''+_fid+'\',\''+p+'\',\''+c+'\',\''+a+'\','+_hasaddress+');"><option value="">省份</option>'];
    for(var i=0,l=__address.length,_list,_brr;i<l;i++){
        _arr.push('<optgroup label="'+__address[i].g+'">');
        _list = __address[i].l;
        _brr = [];
        for(var j=0,k=_list.length,_text;j<k;j++){
            _text = typeof(_list[j])=='string'?_list[j]:_list[j].n;
            _brr.push('<option value="'+_text+'">'+_text+'</option>');
        }
        _arr.push(_brr.join(''));
        _arr.push('</optgroup>');
    }
    _arr.push('</select>&nbsp;<select id="'+c+'" name="'+c+'"><option value="">市区</option></select>&nbsp;');
    if(_hasaddress){_arr.push('<input name="'+a+'" type="text" class="w-ipt fc3"/>');}
    return _arr.join('');
};
/**
 * 省份变化触发函数
 * @param {Object} _fid
 */
gal.changeProvince = function(_fid,_province,_city,_address,_hasaddress){
    var _form = document.getElementById(_fid);
    if (!_form) return;
    var _select = _form[_province];
    if (!_select) return;
    var _list = __getCity(_select.selectedIndex-1);
    _select = _form[_city];
    __clearSelect(_select);
    __buildSelect(_select,_list);
    _select.style.display = !_list?'none':'';
    if(_hasaddress)_form[_address].value = '';
};
/**
 * 初始化省份值
 * @param {Object} _fid
 * @param {Object} _names
 * @param {Object} _values
 */
gal.initAddress = function(_fid,_names,_values,_hasaddress){
    _names = _names||{};
    var p = _names.province||'province',
        c = _names.city||'city',
        a = _names.address||'address';
    _values = _values||{};
    var pv = _values.province||'',
        cv = _values.city||'',
        av = _values.address||'';
    var _form = document.getElementById(_fid);
    if (!_form) return;
    var _select = _form[p];
    if (!_select) return;
    var _pidx = __getProvinceIndex(pv);
    if (_pidx<0) return;
    _select.selectedIndex = _pidx+1;
    var _list = __getCity(_pidx);
    _select = _form[c];
    __clearSelect(_select);
    __buildSelect(_select,_list);
    if (!_list){
        _select.style.display = 'none';
    }else{
        _select.style.display = '';
        _select.selectedIndex = utl._$indexOf(_list,cv);
    }
    if(_hasaddress){_form[a].value = av;}
};
// date time select
gal.changeDataTime = function(_fid,_name){
    var _form = document.getElementById(_fid);
    if (!_form) return;
    var _year  = _form[_name+'-y'].value,
        _month = _form[_name+'-m'].value,
        _date  = _form[_name+'-d'].value;
    _form[_name].value = !!_year&&!!_month&&!!_date?(_year+'-'+_month+'-'+_date):'';
    _form[_name+'_val'].value = _year+'-'+_month+'-'+_date;
};
// focus and blur
var __focusInput = function(_element,_class,_defaultValue){
    if(!!_defaultValue){
        if (_element.value!=_defaultValue)return;
    }else{
        if (_element.value!=_element.defaultValue)return;
    }
    _element.value = '';
    if (!_class) return;
    _element.className = _element.className.replace(new RegExp('\\s'+_class,'g'),'');
};
var __blurInput = function(_element,_class,_defaultValue){
    if(!!_defaultValue){
        if (!!_element.value&&_element.value!=_defaultValue) return;
    }else{
        if (!!_element.value&&_element.value!=_element.defaultValue) return;
    }
    _element.value = _element.defaultValue;
    if (!_class) return;
    _element.className = _element.className.replace(new RegExp('\\s'+_class,'g'),'')+' '+_class;
};
gal.focusInput = function(_element,_class,_defaultValue){
    _element.onblur = function(){__blurInput(_element,_class,_defaultValue);};
    _element.onfocus = function(){__focusInput(_element,_class,_defaultValue);};
};
// login
gal.login = function(_show,_url){
    var _display = _show?'':'none';
    document.getElementById('login-cover-999').style.display = _display;
    document.getElementById('login-layer-999').style.display = _display;
    if(_url){document.getElementById('lg666_url').value = _url;}
    else{document.getElementById('lg666_url').value = '';}
};
// attach
gal.close = function(){
    window.open('','_parent','');
    window.close();
};
gal.favorite = function(){
    if (document.all){
        window.external.addFavorite(location.href,document.title);
        return;
    }
    if(window.sidebar&&window.sidebar.addPanel){
        window.sidebar.addPanel(document.title,location.href,"");
        return;
    }
    
};
})();