function b64(data) { tmp_b64 = zip_deflate(data); zipinfo = base64_encode(tmp_b64); return zipinfo; } var zip_WSIZE = 32768; // Sliding Window size var zip_STORED_BLOCK = 0; var zip_STATIC_TREES = 1; var zip_DYN_TREES = 2; /* for deflate */ var zip_DEFAULT_LEVEL = 6; var zip_FULL_SEARCH = true; var zip_INBUFSIZ = 32768; // Input buffer size var zip_INBUF_EXTRA = 64; // Extra buffer var zip_OUTBUFSIZ = 1024 * 8; var zip_window_size = 2 * zip_WSIZE; var zip_MIN_MATCH = 3; var zip_MAX_MATCH = 258; var zip_BITS = 16; // for SMALL_MEM var zip_LIT_BUFSIZE = 0x2000; var zip_HASH_BITS = 13; // for MEDIUM_MEM // var zip_LIT_BUFSIZE = 0x4000; // var zip_HASH_BITS = 14; // for BIG_MEM // var zip_LIT_BUFSIZE = 0x8000; // var zip_HASH_BITS = 15; if(zip_LIT_BUFSIZE > zip_INBUFSIZ)alert("error: zip_INBUFSIZ is too small"); if((zip_WSIZE << 1) > (1 << zip_BITS)) alert("error: zip_WSIZE is too large"); if(zip_HASH_BITS > zip_BITS - 1)alert("error: zip_HASH_BITS is too large"); if(zip_HASH_BITS < 8 || zip_MAX_MATCH != 258)alert("error: Code too clever"); var zip_DIST_BUFSIZE = zip_LIT_BUFSIZE; var zip_HASH_SIZE = 1 << zip_HASH_BITS; var zip_HASH_MASK = zip_HASH_SIZE - 1; var zip_WMASK = zip_WSIZE - 1; var zip_NIL = 0; // Tail of hash chains var zip_TOO_FAR = 4096; var zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1; var zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD; var zip_SMALLEST = 1; var zip_MAX_BITS = 15; var zip_MAX_BL_BITS = 7; var zip_LENGTH_CODES = 29; var zip_LITERALS = 256; var zip_END_BLOCK = 256; var zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES; var zip_D_CODES = 30; var zip_BL_CODES = 19; var zip_REP_3_6 = 16; var zip_REPZ_3_10 = 17; var zip_REPZ_11_138 = 18; var zip_HEAP_SIZE = 2 * zip_L_CODES + 1; var zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) / zip_MIN_MATCH); /* variables */ var zip_free_queue; var zip_qhead, zip_qtail; var zip_initflag; var zip_outbuf = null; var zip_outcnt, zip_outoff; var zip_complete; var zip_window; var zip_d_buf; var zip_l_buf; var zip_prev; var zip_bi_buf; var zip_bi_valid; var zip_block_start; var zip_ins_h; var zip_hash_head; var zip_prev_match; var zip_match_available; var zip_match_length; var zip_prev_length; var zip_strstart; var zip_match_start; var zip_eofile; var zip_lookahead; var zip_max_chain_length; var zip_max_lazy_match; var zip_compr_level; var zip_good_match; var zip_nice_match; var zip_dyn_ltree; var zip_dyn_dtree; var zip_static_ltree; var zip_static_dtree; var zip_bl_tree; var zip_l_desc; var zip_d_desc; var zip_bl_desc; var zip_bl_count; var zip_heap; var zip_heap_len; var zip_heap_max; var zip_depth; var zip_length_code; var zip_dist_code; var zip_base_length; var zip_base_dist; var zip_flag_buf; var zip_last_lit; var zip_last_dist; var zip_last_flags; var zip_flags; var zip_flag_bit; var zip_opt_len; var zip_static_len; var zip_deflate_data; var zip_deflate_pos; /* constant tables */ var zip_extra_lbits = new Array( 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0); var zip_extra_dbits = new Array( 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13); var zip_extra_blbits = new Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7); var zip_bl_order = new Array( 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15); var zip_configuration_table = new Array( new zip_DeflateConfiguration(0, 0, 0, 0), new zip_DeflateConfiguration(4, 4, 8, 4), new zip_DeflateConfiguration(4, 5, 16, 8), new zip_DeflateConfiguration(4, 6, 32, 32), new zip_DeflateConfiguration(4, 4, 16, 16), new zip_DeflateConfiguration(8, 16, 32, 32), new zip_DeflateConfiguration(8, 16, 128, 128), new zip_DeflateConfiguration(8, 32, 128, 256), new zip_DeflateConfiguration(32, 128, 258, 1024), new zip_DeflateConfiguration(32, 258, 258, 4096)); /* objects(deflate) */ function zip_DeflateCT(){ this.fc = 0; // frequency count or bit string this.dl = 0; // father node in Huffman tree or length of bit string } function zip_DeflateTreeDesc(){ this.dyn_tree = null; // the dynamic tree this.static_tree = null; // corresponding static tree or NULL this.extra_bits = null; // extra bits for each code or NULL this.extra_base = 0; // base index for extra_bits this.elems = 0; // max number of elements in the tree this.max_length = 0; // max bit length for the codes this.max_code = 0; // largest code with non zero frequency } /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level(0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be * found for specific files. */ function zip_DeflateConfiguration(a, b, c, d){ this.good_length = a; // reduce lazy search above this match length this.max_lazy = b; // do not perform lazy search above this match length this.nice_length = c; // quit search above this match length this.max_chain = d; } function zip_DeflateBuffer(){ this.next = null; this.len = 0; this.ptr = new Array(zip_OUTBUFSIZ); this.off = 0; } /* routines(deflate) */ function zip_deflate_start(level){ var i; if(!level) level = zip_DEFAULT_LEVEL; else if(level < 1) level = 1; else if(level > 9) level = 9; zip_compr_level = level; zip_initflag = false; zip_eofile = false; if(zip_outbuf != null) return; zip_free_queue = zip_qhead = zip_qtail = null; zip_outbuf = new Array(zip_OUTBUFSIZ); zip_window = new Array(zip_window_size); zip_d_buf = new Array(zip_DIST_BUFSIZE); zip_l_buf = new Array(zip_INBUFSIZ + zip_INBUF_EXTRA); zip_prev = new Array(1 << zip_BITS); zip_dyn_ltree = new Array(zip_HEAP_SIZE); for(i = 0; i < zip_HEAP_SIZE; i++) zip_dyn_ltree[i] = new zip_DeflateCT(); zip_dyn_dtree = new Array(2 * zip_D_CODES + 1); for(i = 0; i < 2 * zip_D_CODES + 1; i++) zip_dyn_dtree[i] = new zip_DeflateCT(); zip_static_ltree = new Array(zip_L_CODES + 2); for(i = 0; i < zip_L_CODES + 2; i++) zip_static_ltree[i] = new zip_DeflateCT(); zip_static_dtree = new Array(zip_D_CODES); for(i = 0; i < zip_D_CODES; i++) zip_static_dtree[i] = new zip_DeflateCT(); zip_bl_tree = new Array(2 * zip_BL_CODES + 1); for(i = 0; i < 2 * zip_BL_CODES + 1; i++) zip_bl_tree[i] = new zip_DeflateCT(); zip_l_desc = new zip_DeflateTreeDesc(); zip_d_desc = new zip_DeflateTreeDesc(); zip_bl_desc = new zip_DeflateTreeDesc(); zip_bl_count = new Array(zip_MAX_BITS + 1); zip_heap = new Array(2 * zip_L_CODES + 1); zip_depth = new Array(2 * zip_L_CODES + 1); zip_length_code = new Array(zip_MAX_MATCH - zip_MIN_MATCH + 1); zip_dist_code = new Array(512); zip_base_length = new Array(zip_LENGTH_CODES); zip_base_dist = new Array(zip_D_CODES); zip_flag_buf = new Array(parseInt(zip_LIT_BUFSIZE / 8)); } function zip_deflate_end(){ zip_free_queue = zip_qhead = zip_qtail = null; zip_outbuf = null; zip_window = null; zip_d_buf = null; zip_l_buf = null; zip_prev = null; zip_dyn_ltree = null; zip_dyn_dtree = null; zip_static_ltree = null; zip_static_dtree = null; zip_bl_tree = null; zip_l_desc = null; zip_d_desc = null; zip_bl_desc = null; zip_bl_count = null; zip_heap = null; zip_depth = null; zip_length_code = null; zip_dist_code = null; zip_base_length = null; zip_base_dist = null; zip_flag_buf = null; } function zip_reuse_queue(p){ p.next = zip_free_queue; zip_free_queue = p; } function zip_new_queue(){ var p; if(zip_free_queue != null){ p = zip_free_queue; zip_free_queue = zip_free_queue.next; } else p = new zip_DeflateBuffer(); p.next = null; p.len = p.off = 0; return p; } function zip_head1(i){ return zip_prev[zip_WSIZE + i]; } function zip_head2(i, val){ return zip_prev[zip_WSIZE + i] = val; } /* put_byte is used for the compressed output, put_ubyte for the * uncompressed output. However unlzw() uses window for its * suffix table instead of its output buffer, so it does not use put_ubyte * (to be cleaned up). */ function zip_put_byte(c){ zip_outbuf[zip_outoff + zip_outcnt++] = c; if(zip_outoff + zip_outcnt == zip_OUTBUFSIZ)zip_qoutbuf(); } /* Output a 16 bit value, lsb first */ function zip_put_short(w){ w &= 0xffff; if(zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2){ zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff); zip_outbuf[zip_outoff + zip_outcnt++] = (w >>> 8); } else { zip_put_byte(w & 0xff); zip_put_byte(w >>> 8); } } /* ========================================================================== * Insert string s in the dictionary and set match_head to the previous head * of the hash chain(the most recent string with same hash key). Return * the previous length of the hash chain. * IN assertion: all calls to to INSERT_STRING are made with consecutive * input characters and the first MIN_MATCH bytes of s are valid * (except for the last MIN_MATCH-1 bytes of the input file). */ function zip_INSERT_STRING(){ zip_ins_h = ((zip_ins_h << zip_H_SHIFT)^(zip_window[zip_strstart + zip_MIN_MATCH - 1] & 0xff)) & zip_HASH_MASK; zip_hash_head = zip_head1(zip_ins_h); zip_prev[zip_strstart & zip_WMASK] = zip_hash_head; zip_head2(zip_ins_h, zip_strstart); } /* Send a code of the given tree. c and tree must not have side effects */ function zip_SEND_CODE(c, tree){ zip_send_bits(tree[c].fc, tree[c].dl); } /* Mapping from a distance to a distance code. dist is the distance - 1 and * must not have side effects. dist_code[256] and dist_code[257] are never * used. */ function zip_D_CODE(dist){ return(dist < 256 ? zip_dist_code[dist] : zip_dist_code[256 + (dist >> 7)]) & 0xff; } /* ========================================================================== * Compares to subtrees, using the tree depth as tie breaker when * the subtrees have equal frequency. This minimizes the worst case length. */ function zip_SMALLER(tree, n, m){ return tree[n].fc < tree[m].fc ||(tree[n].fc == tree[m].fc && zip_depth[n] <= zip_depth[m]); } /* ========================================================================== * read string data */ function zip_read_buff(buff, offset, n){ var i; for(i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++) buff[offset + i] = zip_deflate_data.charCodeAt(zip_deflate_pos++) & 0xff; return i; } /* ========================================================================== * Initialize the "longest match" routines for a new file */ function zip_lm_init(){ var j; /* Initialize the hash table. */ for(j = 0; j < zip_HASH_SIZE; j++) //zip_head2(j, zip_NIL); zip_prev[zip_WSIZE + j] = 0; /* prev will be initialized on the fly */ /* Set the default configuration parameters: */ zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy; zip_good_match = zip_configuration_table[zip_compr_level].good_length; if(!zip_FULL_SEARCH) zip_nice_match = zip_configuration_table[zip_compr_level].nice_length; zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain; zip_strstart = 0; zip_block_start = 0; zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE); if(zip_lookahead <= 0){ zip_eofile = true; zip_lookahead = 0; return; } zip_eofile = false; /* Make sure that we always have enough lookahead. This is important * if input comes from a device such as a tty. */ while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) zip_fill_window(); /* If lookahead < MIN_MATCH, ins_h is garbage, but this is * not important since only literal bytes will be emitted. */