/* 	
 * 名称：Cookie函数 （大于4K版本）   
 	版本：1.0.3 (Beta)   
 	作者：洪磊   
 	E-mail：[email]honglei@live.com[/email]   
 */   
 var HL = HL || {};   
 HL.Cookie = {   
 /*
 函数名称：HL.Cookie.Get([string name])
 函数功能：得到Cookie
 参数：name 可选项，要取得的Cookie名称
 说明：name为空时将通过数组形式返回全部Cookie，name不为空时返回此Cookie名称的值，没有任何值时返回undefined
 */  
      Get : function(name){   
         var cv = document.cookie.split("; ");//使用"; "分割Cookie   
         var cva = [], cvat = [], cvam = [], temp;   
         /*循环的得到Cookie名称与值*/  
         for(i=0; i<cv.length; i++){   
              temp = cv[i].split("=");//用"="分割Cookie的名称与值   
             if(temp[0].indexOf("_divide_") > 0){   
                  cvam[temp[0]] = temp[1];   
              }else{   
                 if(temp[0] != "") cvat[i] = [temp[0], temp[1]];   
              }   
          }   
         for(i=0; i<cvat.length; i++){   
             if(cvat[i]){   
                 if(cvat[i][1].substr(0,8) != "^divide|"){   
                     /*小于4K的Cookie处理*/  
                      cva[cvat[i][0]] = unescape(cvat[i][1]);   
                  }else{   
                     /*大于4K的Cookie处理*/  
                     var sta = cvat[i][1].indexOf("$"), tot = cvat[i][1].substring(8,sta);   
                      cva[cvat[i][0]] = cvat[i][1].substring(sta+1);   
                     for(j=1; j<tot; j++){   
                          cva[cvat[i][0]] += cvam[cvat[i][0]+"_divide_"+j];   
                      }   
                      cva[cvat[i][0]] = unescape(cva[cvat[i][0]]);   
                  }   
              }   
          }   
         if(name) return cva[name];//如果有name则输出这个name的Cookie值   
         else return cva;//如果没有name则输出以名称为key，值为Value的数组   
      },   
 /*
 函数名称：HL.Cookie.Set(string name, string   value[, int expires[, string path[, string domain[, string secure]]]])
 函数功能：存入Cookie
 参数：name 必要项，要存入的Cookie名称
        value 必要项，要存入的Cookie名称对应的值
        expires 可选项，Cookie的过期时间，可以填入以秒为单位的保存时间，也可以填入日期格式（wdy, DD-Mon-YYYY HH:MM:SS GMT）的到期时间
        path 可选项，Cookie在服务器端的有效路径
        domain 可选项，该Cookie的有效域名
        secure 可选项， 指明Cookie 是否仅通过安全的 HTTPS 连接传送，0或false或空时为假
 说明：保存成功则返回true，保存失败返回false
 */  
      Set : function(name, value, expires, path, domain, secure, divide){   
         if(!divide) var value = escape(value);   
         if(!name || !value) return false;//如果没有name和value则返回false   
         if(name == "" || value == "") return false;//如果name和value为空则返回false   
         /*对于过期时间的处理*/  
         if(expires){   
             /*如果是数字则换算成GMT时间，当前时间加上以秒为单位的expires*/  
             if(/^[0-9]+$/.test(expires)){   
                 var today = new Date();   
                  expires = new Date(today.getTime()+expires*1000).toGMTString();   
             /*判断expires格式是否正确，不正确则赋值为undefined*/  
              }else if(!/^wed, \d{2} \w{3} \d{4} \d{2}\:\d{2}\:\d{2} GMT$/.test(expires)){   
                  expires = undefined;   
              }   
          }   
         if(name.indexOf("_divide_")< 1 && !divide){   
             this.Del(name, path, domain);//删除前一次存入的Cookie   
          }   
         /*合并cookie的相关值*/  
         var cv = name+"="+value+";"  
                 + ((expires) ? " expires="+expires+";" : "")   
                 + ((path) ? "path="+path+";" : "")   
                 + ((domain) ? "domain="+domain+";" : "")   
                 + ((secure && secure != 0) ? "secure" : "");   
         /*判断Cookie总长度是否大于4K*/  
         if(cv.length < 4096){   
              document.cookie = cv;//写入cookie   
          }else{   
             /*对于大于4K的Cookie的操作*/  
             var max = Math.floor(value.length/3800)+1;   
             for(i=0; i<max; i++){   
                 if(i == 0){   
                     this.Set(name, '^divide|'+max+'$'+value.substr(0,3800), expires, path, domain, secure, true);   
                  }else{   
                     this.Set(name+"_divide_"+i, value.substr(i*3800,3800), expires, path, domain, secure, true);   
                  }   
              }   
          }   
         return true;   
      },   
 /*
 函数名称：HL.Cookie.Del(string name[, string path[, string domain]])
 函数功能：删除Cookie
 参数：name 必要项，要删除的Cookie名称
        path 可选项，要删除的Cookie在服务器端的有效路径
        domain 可选项，要删除的Cookie的有效域名
 说明：删除成功返回true，删除失败返回false
 */  
      Del : function(name, path, domain){   
         if(!name) return false;//如果没有name则返回false   
         if(name == "") return false;//如果name为空则返回false   
         if(!this.Get(name)) return false;//如果要删除的name值不存在则返回false   
         /*对于大于4K的Cookie进行处理*/  
         if(escape(this.Get(name)).length > 3800){   
             var max = Math.floor(escape(this.Get(name)).length/3800)+1;   
             for(i=1; i<max; i++){   
                 /*合并Cookie的相关值，并删除*/  
                  document.cookie = name+"_divide_"+i+"=;"  
                                + ((path) ? "path="+path+";" : "")   
                                + ((domain) ? "domain="+domain+";" : "")   
                                + "expires=Thu, 01-Jan-1970 00:00:01 GMT;";   
              }   
          }   
         /*合并Cookie的相关值，并删除*/  
          document.cookie = name+"=;"  
                            + ((path) ? "path="+path+";" : "")   
                            + ((domain) ? "domain="+domain+";" : "")   
                            + "expires=Thu, 01-Jan-1970 00:00:01 GMT;";   
         return true;   
      }   
 }  
