/**
 * @ignore
 * quote and unQuote for json
 * @author yiminghe@gmail.com
 */
KISSY.add('json/quote', function (S) {

    var CONTROL_MAP = {
            '\b': '\\b',
            '\f': '\\f',
            '\n': '\\n',
            '\r': '\\r',
            '\t': '\\t',
            '"': '\\"'
        },
        REVERSE_CONTROL_MAP = {},
        QUOTE_REG = /["\b\f\n\r\t\x00-\x1f]/g,
        UN_QUOTE_REG = /\\b|\\f|\\n|\\r|\\t|\\"|\\u[0-9a-zA-Z]{4}/g;

    S.each(CONTROL_MAP, function (original, encoded) {
        REVERSE_CONTROL_MAP[encoded] = original
    });

    REVERSE_CONTROL_MAP['\\/']='/';

    return {
        quote: function (value) {
            return '"' + value.replace(QUOTE_REG, function (m) {
                var v;
                if (!(v = CONTROL_MAP[m])) {
                    v = '\\u' + ('0000' + m.charCodeAt(0).toString(16)).slice(-4);
                }
                return v;
            }) + '"';
        },
        unQuote:function(value){
            return value.slice(1,value.length-1).replace(UN_QUOTE_REG,function(m){
                var v;
                if (!(v = REVERSE_CONTROL_MAP[m])) {
                    v =String.fromCharCode(parseInt(m.slice(2),16));
                }
                return v;
            });
        }
    };
});