/*------------------------------------------------------------------------
 * EPMS Core JavaScript
 * 기본으로 등록된 function이외것은 common.js에 정의하세요.
 * 
 * @author cheonbo shim
 * @encoding utf-8
 * @date 2009-11-11
 *------------------------------------------------------------------------*/
var Common = function() {
    var toString = Object.prototype.toString;
    var ua = navigator.userAgent.toLowerCase();
    function check(r){
        return r.test(ua);
    }
    
    var DOC = document,
    isStrict = DOC.compatMode == "CSS1Compat",
    isOpera = check(/opera/),
    isChrome = check(/chrome/),
    isWebKit = check(/webkit/),
    isSafari = !isChrome && check(/safari/),
    isSafari2 = isSafari && check(/applewebkit\/4/), // unique to Safari 2
    isSafari3 = isSafari && check(/version\/3/),
    isSafari4 = isSafari && check(/version\/4/),
    isIE = !isOpera && check(/msie/),
    isIE7 = isIE && check(/msie 7/),
    isIE8 = isIE && check(/msie 8/),
    isIE6 = isIE && !isIE7 && !isIE8,
    isGecko = !isWebKit && check(/gecko/),
    isGecko2 = isGecko && check(/rv:1\.8/),
    isGecko3 = isGecko && check(/rv:1\.9/),
    isBorderBox = isIE && !isStrict,
    isWindows = check(/windows|win32/),
    isMac = check(/macintosh|mac os x/),
    isAir = check(/adobeair/),
    isLinux = check(/linux/),
    isSecure = /^https/i.test(window.location.protocol);
    
    return {
        version: '1.0',
        apply: function(o, c, defaults) {
            // no "this" reference for friendly out of scope calls
            if(defaults){
                Common.apply(o, defaults);
            }
            if(o && c && typeof c == 'object'){
                for(var p in c){
                    o[p] = c[p];
                }
            }
            return o;
        },
        /**
         * strict mode여부를 리턴한다.
         * @type Boolean
         */
        isStrict: isStrict,
        
        /**
         * 사용자 브라우저가 opera인지 여부를 리턴한다.
         * @type Boolean
         */
        isOpera: isOpera,
        
        /**
         * 사용자 브라우저가 chrome인지 여부를 리턴한다.
         * @type Boolean
         */
        isChrome: isChrome,
        
        /**
         * 사용자 브라우저가 safari인지 여부를 리턴한다.
         * @type Boolean
         */
        isSafari: isSafari,
        
        /**
         * 사용자 브라우저가 safari 2.x인지 여부를 리턴한다.
         * @type Boolean
         */
        isSafari2: isSafari2,
        
        /**
         * 사용자 브라우저가 safari 3.x인지 여부를 리턴한다.
         * @type Boolean
         */
        isSafari3: isSafari3,
        
        /**
         * 사용자 브라우저가 safari 4.x인지 여부를 리턴한다.
         * @type Boolean
         */
        isSafari4: isSafari4,
        
        /**
         * 사용자 브라우저가 Internet Explorer인지 여부를 리턴한다.
         * @type Booolean
         */
        isIE: isIE,
        
        /**
         * 사용자 브라우저가 Internet Explorer 7.x인지 여부를 리턴한다.
         * @type Boolean
         */
        isIE7: isIE7,
        
        /**
         * 사용자 브라우저가 Internet Explorer 8.x인지 여부를 리턴한다. 
         * @type Boolean
         */
        isIE8: isIE8,
        
        /**
         * 사용자 브라우저가 Internet Explorer 6.x인지 여부를 리턴한다.
         * @type Boolean
         */
        isIE6: isIE6,
        
        /**
         * 사용자 브라우저가 Gecko Layout엔진을 사용하는지 여부를 리턴한다(e.g. Mozilla, Firefox).
         * @type Boolean
         */
        isGecko: isGecko,
        
        /**
         * 사용자 브라우저가 Gecko Layout엔진 2.x을 사용하는지 여부를 리턴한다(e.g. Firefox 2.x).
         * @type Boolean
         */
        isGecko2: isGecko2,
        
        /**
         * 사용자 브라우저가 Gecko Layout엔진 3.x을 사용하는지 여부를 리턴한다(e.g. Firefox 3.x).
         * @type Boolean
         */
        isGecko3: isGecko3,
        
        /**
         * 사용자 OS가 Windows인지 여부를 리턴한다.
         * @type Boolean
         */
        isWindows: isWindows,
        
        /**
         * 사용자 OS가 Mac인지 여부를 리턴한다.
         * @type Boolean
         */
        isMac: isMac,
        
        /**
         * Adobe Air를 통한 호출인지 여부를 리턴한다.
         * @type Boolean
         */
        isAir: isAir,
        
        /**
         * 사용자 OS가 Linux인지 여부를 리턴한다.
         * @type Boolean
         */
        isLinux: isLinux,
        
        /**
         * 사용자의 요청이 https(SSL)기반인지 여부를 리턴한다.
         * @type Boolean
         */
        isSecure: isSecure,
        
        /**
         * 판단대상값이 null이거나 undefained이면 true를 리턴하고 그렇지않은 경우 false를 리턴한다.
         * @param {Mixed} 판단대상값
         * @param {Boolean} allowBlank (optional) true이고 주어진 값이 공백문자열인경우 true를 리턴한다.
         * @return {Boolean}
         */
        isEmpty : function(v, allowBlank){
            return v === null || v === undefined || ((Common.isArray(v) && !v.length)) || (!allowBlank ? v === '' : false);
        },


        /**
         * 판단대상값이 array 타입인 경우true를 리턴하고 그렇지 않은 경우 false를 리턴한다.
         * @param {Mixed} 판단대상값
         * @return {Boolean}
         */
        isArray : function(v){
            return toString.apply(v) === '[object Array]';
        },


        /**
         * 판단대상값이 data타입인경우 true를 리턴하고 그렇지 않은 경우 false를 리턴한다.
         * @param {Object} 판단대상값
         * @return {Boolean}
         */
        isDate : function(v){
            return toString.apply(v) === '[object Date]';
        },


        /**
         * 판단대상값이 object인경우 true를 리턴하고 그렇지 않은 경우 false를 리턴한다.
         * @param {Mixed} 판단대상값
         * @return {Boolean}
         */
        isObject : function(v){
            return v && typeof v == "object";
        },

        /**
         * 판단대상값이 기본타입인 경우 true를 리턴하고 그렇지 않은 경우 false를 리턴한다.
         * @param {Mixed} 판단대상값
         * @return {Boolean}
         */
        isPrimitive : function(v){
            return Common.isString(v) || Common.isNumber(v) || Common.isBoolean(v);
        },

        /**
         * 판단대상값이 function인 경우 true를 리턴하고 그렇지 않은 경우 false를 리턴한다.
         * @param {Mixed} 판단대상값
         * @return {Boolean}
         */
        isFunction : function(v){
            return toString.apply(v) === '[object Function]';
        },

        /**
         * 판단대상값이 number타입인경우 true를 리턴하고 그렇지 않은 경우 false를 리턴한다.
         * @param {Mixed} 판단대상값
         * @return {Boolean}
         */
        isNumber : function(v){
            return typeof v === 'number' && isFinite(v);
        },

        /**
         * 판단대상값이 string타입인 경우 true를 리턴하고 그렇지 않은 경우 false를 리턴한다.
         * @param {Mixed} 판단대상값
         * @return {Boolean}
         */
        isString : function(v){
            return typeof v === 'string';
        },

        /**
         * 판단대상값이 boolean타입인 경우 true를 리턴하고 그렇지 않은 경우 false를 리턴한다.
         * @param {Mixed} 판단대상값
         * @return {Boolean}
         */
        isBoolean : function(v){
            return typeof v === 'boolean';
        },

        /**
         * 판단대상값이 undefined인 경우 true를 리턴하고 그렇지 않은 경우 false를 리턴한다.
         * @param {Mixed} 판단대상값
         * @return {Boolean}
         */
        isDefined : function(v){
            return typeof v !== 'undefined';
        },
        
        /**
         * 주어진값의 앞뒤 공백문자열을 제거하여 리턴한다.
         * @return {String}
         */
        trim: function(v) {
            return v.replace(/^\s*/, "").replace(/\s*$/, "");
        },
        
        /**
         * 판단대상값이 이메일형식인 경우 true를 리턴하고 그렇지 않은 경우 false를 리턴한다.
         * @return {Boolean}
         */
        isEmail: function(v) {
            if (v.length == 0) return true;
            return v.search(/^((\w|[\-\.])+)@((\w|[\-\.])+)\.([A-Za-z]+)$/) != -1;            
        },
        
        /**
         * 주어진 문자열에서 검색문자열을 변경문자열을 모두 치환한 후 리턴한다.
         * @param {String} ov 문자열
         * @param {String} sv 검색문자열
         * @param {String} rv 치환문자열
         * @return {String}
         */
        replaceAll: function(ov, sv, rv) {
            return ov.replace(new RegExp(sv, "g"), rv);
        },
        
        /**
         * 주어진 문자열에서 HTML태그를 제거한 후 리턴한다.
         * 
         */
        removeHTMLTags: function(v) {
            v = v.replace(/&(lt|gt);/g, function (strMatch, p1){
                return (p1 == "lt")? "<" : ">";
            });
            return v.replace(/<\/?[^>]+(>|$)/g, "");
        },
        
        /**
         * 주어진값을 토대로 쿠키를 생성한다.
         * @param {String} n 쿠기명
         * @param {String} v 쿠기값
         * @param {Date} e 만료일자
         * @param {String} p 패스
         * @param {String} d 도메인
         * @param {Boolean} s
         */
        setCookie: function(n, v, e, p, d, s) {
            document.cookie= name + "=" + escape(v) +
                ((e) ? "; expires=" + e.toGMTString() : "") +
                ((p) ? "; path=" + p : "") +
                ((d) ? "; domain=" + d : "") +
                ((s) ? "; secure" : "");
        },
        
        /**
         * 주어진 문자열에 해당하는 쿠키값을 리턴한다.
         * @param {String} v 쿠키명
         * @return {String}
         */
        getCookie: function(v) {
            var dc = document.cookie;
            var prefix = v + "=";
            var begin = dc.indexOf("; " + prefix);
            if (begin == -1) {
                begin = dc.indexOf(prefix);
                if (begin != 0) return null;
            }
            else {
                begin += 2;
            }
            var end = document.cookie.indexOf(";", begin);
            if (end == -1) {
                end = dc.length;
            }
            return unescape(dc.substring(begin + prefix.length, end));
            
        },
        
        /**
         * 주어진 정보에 해당하는 쿠키를 삭제(만료)처리 한다.
         * @param {String} n 쿠키명
         * @param {String} p 패스
         * @param {String} d 도메인
         */
        deleteCookie: function(n, p, d) {
            if (Common.getCookie(n)) {
                document.cookie = n + "=" + 
                    ((p) ? "; path=" + p : "") +
                    ((d) ? "; domain=" + d : "") +
                    "; expires=Thu, 01-Jan-70 00:00:01 GMT";
            }
        }   
    };
}();
