﻿/* ********************************************************************************************** */
/*                              JSA - Framework Validations                                       */
/* ********************************************************************************************** */
var JSA = function () {
    return {

        // ----------------------------------------------------------
        //                      Browser Methods
        // ----------------------------------------------------------
        browser: function () {
            var ua = navigator.userAgent;
            return {
                isMac: function () {
                    return (ua.indexOf('Mac') != -1);
                },
                isLinux: function () {
                    return (ua.indexOf('Linux') != -1);
                },
                isWindows: function () {
                    return (!JSA.browser.isMac() && !JSA.browser.isLinux());
                },

                isIe: function () {
                    if ((ua.indexOf('MSIE')) >= 0)
                        return true;
                    else
                        return false;
                },
                isFirefox: function () {
                    if ((ua.indexOf('Firefox')) >= 0)
                        return true;
                    else
                        return false;
                },
                isOpera: function () {
                    if ((ua.indexOf('Opera')) >= 0)
                        return true;
                    else
                        return false;
                },
                isChrome: function () {
                    if ((ua.indexOf('Chrome')) >= 0)
                        return true;
                    else
                        return false;
                },
                isSafari: function () {
                    if ((ua.indexOf('Safari')) >= 0)
                        return true;
                    else
                        return false;
                },
                isNetscape: function () {
                    if ((ua.indexOf('Netscape')) >= 0)
                        return true;
                    else
                        return false;
                },
                isGecko: function () {
                    if ((ua.indexOf('Gecko')) >= 0)
                        return true;
                    else
                        return false;
                },
                version: function () {
                    var browserVersion = null;
                    if ((ua.indexOf('MSIE')) >= 0) browserVersion = parseFloat(ua.substr(ua.indexOf('MSIE') + 'MSIE'.length));
                    if ((ua.indexOf('Firefox')) >= 0) browserVersion = parseFloat(ua.substr((ua.indexOf('Firefox') + 'Firefox'.length) + 1));
                    if ((ua.indexOf('Opera')) >= 0) {
                        var operaVersion = ua.substr((ua.indexOf('Opera') + 'Opera'.length) + 1);
                        browserVersion = parseFloat(operaVersion.substr(0, operaVersion.indexOf(' ')));
                    }
                    if ((ua.indexOf('Chrome')) >= 0) browserVersion = parseFloat(ua.substr(ua.indexOf('Chrome') + 'Chrome'.length));
                    if ((ua.indexOf('Safari')) >= 0) browserVersion = parseFloat(ua.substr(ua.indexOf('Safari') + 'Safari'.length));
                    if ((ua.indexOf('Netscape')) >= 0) browserVersion = parseFloat(ua.substr((ua.indexOf('Netscape') + 'Netscape'.length) + 1));
                    if ((ua.indexOf('Gecko')) >= 0) browserVersion = 0;
                    return browserVersion;
                }
            };
        } (),

        // ----------------------------------------------------------
        //                      Cards Methods
        // ----------------------------------------------------------
        card: function () {
            return {
                isVisa: function (value) {
                    return JSA.cards.verifyCard(value, 'Visa');
                },

                isMasterCard: function (value) {
                    return this.verifyCard(value, 'MasterCard');
                },

                isAmex: function (value) {
                    return this.verifyCard(value, 'Amex');
                },

                isDiners: function (value) {
                    return this.verifyCard(value, 'Diners');
                },

                isJCBCard: function (value) {
                    return this.verifyCard(value, 'JCBCard');
                },

                verifyCard: function (inNumber, type) {
                    var total = 0;
                    var tmp = 0;
                    var number = '';
                    for (i = 0; i < inNumber.length; i++) {
                        if (inNumber.charAt(i) >= '0' && inNumber.charAt(i) <= '9') {
                            number = number + inNumber.charAt(i);
                        } else return false;
                    }
                    if (number.length < 13) {
                        return false;
                    }
                    first = '' + number.charAt(0);
                    second = '' + number.charAt(1);
                    third = '' + number.charAt(2);
                    firstTwo = first + second;
                    firstFour = firstTwo + third + number.charAt(3);
                    if (type == 'MasterCard') {
                        if (first != '5' || second < '1' || second > '5') return false;
                        if (number.length != 16) return false;
                    } else if (type == 'Visa') {
                        if (first != '4') return false;
                        if (number.length != 13 && number.length != 16) return false;
                    } else if (type == 'Amex') {
                        if (first != '3' || (second != '4' && second != '7')) return false;
                        if (number.length != 15) return false;
                    } else if (type == 'Diners') {
                        if (firstTwo != '36' && firstTwo != '38' && (firstTwo != '30' || (third < '0' || third > '5'))) return false;
                        if (number.length != 14) return false;
                    } else if (type == 'JCBCard') {
                        if (firstFour != '2131' && firstFour != '1800' && (first != '3')) return false;
                        if (number.length != 16 && first == '3') return false;
                        if (number.length != 15 && first != '3') return false;
                    }
                    for (loc = number.length - 2; loc >= 0; loc -= 2) {
                        total += 1 * number.charAt(loc + 1);
                        tmp = number.charAt(loc) * 2;
                        if (tmp > 9) total += 1;
                        total += tmp % 10;
                    }
                    if (number.length % 2 > 0) total += 1 * number.charAt(0);
                    if (total % 10 == 0) return true;
                    else return false;
                }
            };
        } (),

        // ----------------------------------------------------------
        //                      Date Methods
        // ----------------------------------------------------------
        date: function () {
            return {
                checkDateUp: function (dataMax, dataMin) {
                    dataMax = dataMax.split('/').reverse();

                    if (!dataMin)
                        dataMin = [new Date().getFullYear().toString(), (new Date().getMonth().toString().length == 1
		                        ? '0' + (new Date().getMonth() + 1)
		                        : new Date().getMonth() + 1), new Date().getDate().toString()];
                    else
                        dataMin = dataMin.split('/').reverse();
                    // Ano
                    if (dataMax[0] > dataMin[0]) {
                        return true;
                    } else if (dataMax[0] == dataMin[0]) {
                        // Mês
                        if (dataMax[1] > dataMin[1]) {
                            return true;
                        } else if (dataMax[1] == dataMin[1]) {
                            // Dia
                            if (dataMax[2] > dataMin[2]) {
                                return true;
                            }
                        }
                    }
                    return false;
                },

                checkDateDown: function (dataMax, dataMin) {
                    dataMax = dataMax.split('/').reverse();

                    if (!dataMin)
                        dataMin = [new Date().getFullYear().toString(), (new Date().getMonth().toString().length == 1
			                        ? '0' + (new Date().getMonth() + 1)
			                        : new Date().getMonth() + 1), new Date().getDate().toString()];
                    else
                        dataMin = dataMin.split('/').reverse();
                    // Ano
                    if (dataMax[0] < dataMin[0]) {
                        return true;
                    } else if (dataMax[0] == dataMin[0]) {
                        // Mês
                        if (dataMax[1] < dataMin[1]) {
                            return true;
                        } else if (dataMax[1] == dataMin[1]) {
                            // Dia
                            if (dataMax[2] < dataMin[2]) {
                                return true;
                            }
                        }
                    }
                    return false;
                },

                diff: function (stDate, edDate, ret) {
                    switch (ret) {
                        case 'd':
                            return Math.ceil((edDate.getTime() - stDate.getTime()) / (24 * 60 * 60 * 1000));
                        case 'h':
                            return Math.ceil((edDate.getTime() - stDate.getTime()) / (60 * 60 * 1000));
                        case 'mm':
                            return Math.ceil((edDate.getTime() - stDate.getTime()) / (60 * 1000));
                        case 'ss':
                            return Math.ceil((edDate.getTime() - stDate.getTime()) / 1000);
                        default:
                            return Math.ceil(edDate.getTime() - stDate.getTime())
                    }
                },

                isDate: function (year, month, day) {
                    var date = new Date(year, (month - 1), day, 15);
                    if (isNaN(date)) {
                        return false;
                    } else {
                        return (date.getFullYear() == year && date.getMonth() + 1 == month && date.getDate() == day);
                    }
                },

                now: function () {
                    return new Date();
                }
            };
        } (),

        // ----------------------------------------------------------
        //                      Event Methods
        // ----------------------------------------------------------
        event: function () {
            return {
                // Add Event
                add: function (o, e, f, s) {
                    var r = o[r = '_' + (e = 'on' + e)] = o[r] || (o[e] ? [[o[e], o]] : []), a, c, d;
                    r[r.length] = [f, s || o], o[e] = function (e) {
                        try {
                            (e = e || event).preventDefault || (e.preventDefault = function () { e.returnValue = false; });
                            e.stopPropagation || (e.stopPropagation = function () { e.cancelBubble = true; });
                            e.target || (e.target = e.srcElement || null);
                            e.key = (e.which + 1 || e.keyCode + 1) - 1 || 0;
                        } catch (f) { }
                        for (d = 1, f = r.length; f; r[--f] && (a = r[f][0], o = r[f][1], a.call ? c = a.call(o, e) : (o._ = a, c = o._(e), o._ = null), d &= c !== false));
                        return e = null, !!d;
                    }
                },

                // Remove Event
                remove: function (o, e, f, s) {
                    if (o != null && o['_on' + e] != null) {
                        for (var i = (e = o['_on' + e] || []).length; i; ) {
                            if (e[--i] && e[i][0] == f && (s || o) == e[i][1]) {
                                return delete e[i];
                            }
                        }
                    }
                    return false;
                },

                // Método checkEnter
                checkEnter: function (e) {
                    var keyNum;

                    if (window.event) {
                        keyNum = e.keyCode
                    } else if (e.which) {
                        keyNum = e.which
                    }
                    return (keyNum == 13);
                }
            };
        } (),

        // ----------------------------------------------------------
        //                      Request Methods
        // ----------------------------------------------------------
        request: function () {
            return {
                queryString: function (name) {
                    var listNames = location.search.replace(/\x3F/, '').replace(/\x2B/g, ' ').split('&');
                    var auxChar;
                    if (listNames != '') {
                        var qs = new Array();
                        for (var i = 0; i < listNames.length; i++) {
                            auxChar = listNames[i].split('=');
                            qs[auxChar[0]] = unescape(auxChar[1]);
                        }
                        return qs[name];
                    }
                    return null;
                }
            };
        } (),

        // ----------------------------------------------------------
        //                      Text Methods
        // ----------------------------------------------------------
        text: function () {
            return {
                capitalize: function (value) {
                    return value.replace(/[\wàáâãäåæçèéêëìíîïñòóôõöùúûüýÿ]+/gi, function (a) {
                        return a.charAt(0).toUpperCase() + a.substr(1).toLowerCase();
                    });
                },
                clearAccents: function (value) {
                    return value.replace(/[àáâãäåæçèéêëìíîïñòóôõöùúûüýÿ]/gi, function (e) {
                        var res = (e.match(/[àáâãäåæ]/i)
				                         ? 'a'
				                         : e.match(/[èéêë]/i)
				                           ? 'e'
				                           : e.match(/[ìíîï]/i)
						                        ? 'i' : e.match(/[òóôõö]/i) ? 'o'
						                        : e.match(/[ùúûü]/i)
							                        ? 'u'
							                        : e.match(/[ç]/i)
								                        ? 'c'
								                        : e.match(/[ñ]/i)
									                        ? 'n'
									                        : 'y');
                        return (e.charCodeAt(0) >= 224 && e.charCodeAt(0) <= 255) ? res : res.toUpperCase();
                    });
                },
                onlyNumbers: function (event) {
                    var key;
    
                    if (window.event) {
                        key = event.keyCode;
                    } else {
                        key = event.which || event.keyCode;
                    }
                    if (key == 8 || (key >= 48 && key <= 57) || key == 127 || key == 17 || key == 39 || key == 9) {
                        return true;
                    } else {
                        event.cancel = true;
                        event.returnValue = true;
                        event.cancelBubble = true;
                        return false;
                    }
                }
            };
        } (),

        // ----------------------------------------------------------
        //                      Validations Methods
        // ----------------------------------------------------------
        validation: function () {
            return {
                // Método checkMail
                isMail: function (mail) {
                    var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
                    return (filter.test(mail));
                },

                isCPF: function (cpf) {
                    if ((cpf = cpf.replace(/[^\d]/g, '').split('')).length != 11) return false;
                    if (new RegExp('^' + cpf[0] + '{11}$').test(cpf.join(''))) return false;
                    for (var s = 10, n = 0, i = 0; s >= 2; n += cpf[i++] * s--);
                    if (cpf[9] != (((n %= 11) < 2) ? 0 : 11 - n)) return false;
                    for (var s = 11, n = 0, i = 0; s >= 2; n += cpf[i++] * s--);
                    if (cpf[10] != (((n %= 11) < 2) ? 0 : 11 - n)) return false;
                    return true;
                },

                isCNPJ: function (cnpj) {
                    var b = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
                    if ((cnpj = cnpj.replace(/[^\d]/g, '').split('')).length != 14) return false;
                    for (var i = 0, n = 0; i < 12; n += cnpj[i] * b[++i]);
                    if (cnpj[12] != (((n %= 11) < 2) ? 0 : 11 - n)) return false;
                    for (var i = 0, n = 0; i <= 12; n += cnpj[i] * b[i++]);
                    if (cnpj[13] != (((n %= 11) < 2) ? 0 : 11 - n)) return false;
                    return true;
                }
            };
        } (),

        // ----------------------------------------------------------
        //                      Window Methods
        // ----------------------------------------------------------
        window: function () {
            return {
                popup: function (sLink, tamWidth, tamHeight) {
                    // Tamanho Default
                    if (!tamWidth)
                        tamWidth = 400;
                    if (!tamHeight)
                        tamHeight = 400;
                    if (sLink.split('http://').length <= 1)
                        sLink = 'http://' + sLink;
                    if (window.showModalDialog)      //Internet Explorer
                        window.showModalDialog(sLink, new Object(), 'dialogWidth=' + tamWidth + 'px;dialogHeight=' + tamHeight + 'px;resizable=1;scroll=1;status=0;');
                    else
                        window.open(sLink, 'Pop-up:', 'modal,toolbar=false,location=false,directories=false,status=false,menubar=false,scrollbars=no,resizable=no,left=100,top=100,width=' + tamWidth + ',height=' + tamHeight);
                }
            };
        } ()
    };
} ();
