var JABB = JABB || {}; JABB.version = "0.4.3"; JABB.Ajax = { onStart: null, onStop: null, onError: null, xhrFields: {}, XMLHttpFactories: [ function () {return new XMLHttpRequest()}, function () {return new ActiveXObject("Msxml2.XMLHTTP")}, function () {return new ActiveXObject("Msxml3.XMLHTTP")}, function () {return new ActiveXObject("Microsoft.XMLHTTP")} ], sendRequest: function (url, callback, postData) { var req = this.createXMLHTTPObject(); if (!req) { return; } var method = (postData) ? "POST" : "GET"; var calledOnce = false; req.open(method, url, true); if (this.xhrFields) { for (i in this.xhrFields) { if (this.xhrFields.hasOwnProperty(i)) { req[i] = this.xhrFields[i]; } } } req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); if (postData) { req.setRequestHeader('Content-type','application/x-www-form-urlencoded'); } req.onreadystatechange = function () { switch (req.readyState) { case 1: if (!calledOnce) { JABB.Ajax.onAjaxStart(); calledOnce = true; } break; case 2: return; break; case 3: return; break; case 4: JABB.Ajax.onAjaxStop(); if (req.status == 200) { callback(req); } else { JABB.Ajax.onAjaxError(); } delete req; break; }/* if (req.readyState != 4) { return; } if (req.status != 200 && req.status != 304) { return; } callback(req);*/ }; if (req.readyState == 4) { return; } req.send(postData); }, onAjaxStart: function () { if (typeof this.onStart == 'function') { this.onStart(); } }, onAjaxStop: function () { if (typeof this.onStop == 'function') { this.onStop(); } }, onAjaxError: function () { if (typeof this.onError == 'function') { this.onError(); } }, createXMLHTTPObject: function () { var xmlhttp = false; for (var i = 0; i < this.XMLHttpFactories.length; i++) { try { xmlhttp = this.XMLHttpFactories[i](); } catch (e) { continue; } break; } return xmlhttp; }, getJSON: function (url, callback) { this.sendRequest(url, function (req) { callback(eval("(" + req.responseText + ")")); }); }, postJSON: function (url, callback, postData) { this.sendRequest(url, function (req) { callback(eval("(" + req.responseText + ")")); }, postData); }, get: function (url, container_id) { this.sendRequest(url, function (req) { var el = document.getElementById(container_id); if (el) { el.innerHTML = JABB.Utils.parseScript(req.responseText); } }); }, post: function (url, container_id, postData) { this.sendRequest(url, function (req) { var el = document.getElementById(container_id); if (el) { el.innerHTML = JABB.Utils.parseScript(req.responseText); } }, postData); } }; JABB.Utils = { addClass: function (ele, cls) { if (!this.hasClass(ele, cls)) { ele.className += ele.className.match(/\S/) !== null ? " " + cls : cls; } }, hasClass: function (ele, cls) { return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')); }, removeClass: function (ele, cls) { if (this.hasClass(ele, cls)) { var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)'); ele.className = ele.className.match(/\s/) !== null ? ele.className.replace(reg, '') : ""; } }, importCss: function (cssFile) { if (document.createStyleSheet) { document.createStyleSheet(cssFile); } else { var styles = "@import url(" + cssFile + ");"; var newSS = document.createElement('link'); newSS.rel = 'stylesheet'; newSS.href = 'data:text/css,' + escape(styles); document.getElementsByTagName("head")[0].appendChild(newSS); } }, importJs: function (jsFile) { var d = window.document; if (d.createElement) { var js = d.createElement("script"); js.type = "text/javascript"; js.src = jsFile; if (js) { d.getElementsByTagName("head")[0].appendChild(js); } } }, getElementsByClass: function (searchClass, node, tag) { var classElements = new Array(); if (node == null) { node = document; } if (tag == null) { tag = '*'; } var els = node.getElementsByTagName(tag); var elsLen = els.length; var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"); for (var i = 0, j = 0; i < elsLen; i++) { if (pattern.test(els[i].className)) { classElements[j] = els[i]; j++; } } return classElements; }, addEvent: function (obj, type, fn) { if (obj.addEventListener) { obj.addEventListener(type, fn, false); } else if (obj.attachEvent) { obj["e" + type + fn] = fn; obj[type + fn] = function() { obj["e" + type + fn](window.event); }; obj.attachEvent("on" + type, obj[type + fn]); } else { obj["on" + type] = obj["e" + type + fn]; } }, fireEvent: function (element, event) { if (!element) return false; if (document.createEventObject) { // dispatch for IE var evt = document.createEventObject(); return element.fireEvent('on' + event, evt); } else { // dispatch for firefox + others var evt = document.createEvent("HTMLEvents"); evt.initEvent(event, true, true); // event type,bubbling,cancelable return !element.dispatchEvent(evt); } }, serialize: function (form) { if (!form || form.nodeName !== "FORM") { return undefined; } var i, j, q = []; for (i = form.elements.length - 1; i >= 0; i = i - 1) { if (form.elements[i].name === "") { continue; } switch (form.elements[i].nodeName) { case 'INPUT': switch (form.elements[i].type) { case 'text': case 'hidden': case 'password': case 'button': case 'reset': case 'submit': q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value)); break; case 'checkbox': case 'radio': if (form.elements[i].checked) { q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value)); } break; case 'file': break; } break; case 'TEXTAREA': q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value)); break; case 'SELECT': switch (form.elements[i].type) { case 'select-one': q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].options[form.elements[i].selectedIndex].value)); break; case 'select-multiple': for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) { if (form.elements[i].options[j].selected) { q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].options[j].value)); } } break; } break; case 'BUTTON': switch (form.elements[i].type) { case 'reset': case 'submit': case 'button': q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value)); break; } break; } } return q.join("&"); }, extend: function (obj, args) { var i; for (i in args) { obj[i] = args[i]; } return obj; }, createElement: function (element) { if (typeof document.createElementNS != 'undefined') { return document.createElementNS('http://www.w3.org/1999/xhtml', element); } if (typeof document.createElement != 'undefined') { return document.createElement(element); } return false; }, getEventTarget: function (e) { var targ; if (!e) { e = window.event; } if (e.target) { targ = e.target; } else if (e.srcElement) { targ = e.srcElement; } if (targ.nodeType == 3) { targ = targ.parentNode; } return targ; }, inArray: function (needle, haystack) { var i, len = haystack.length; for (i = 0; i < len; i++) { if (haystack[i] == needle) { return true; } } return false; }, getViewport: function () { var w, h; if (typeof window.innerWidth != 'undefined') { w = window.innerWidth; h = window.innerHeight; } else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0) { w = document.documentElement.clientWidth; h = document.documentElement.clientHeight; } else { w = document.getElementsByTagName('body')[0].clientWidth; h = document.getElementsByTagName('body')[0].clientHeight; } return {width: w, height: h}; }, getScrollXY: function() { var scrOfX = 0, scrOfY = 0; if(typeof(window.pageYOffset) == 'number') { //Netscape compliant scrOfY = window.pageYOffset; scrOfX = window.pageXOffset; } else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) { //DOM compliant scrOfY = document.body.scrollTop; scrOfX = document.body.scrollLeft; } else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) { //IE6 standards compliant mode scrOfY = document.documentElement.scrollTop; scrOfX = document.documentElement.scrollLeft; } return [scrOfX, scrOfY]; }, getPageXY: function() { var PositionXY = {width: 0, height: 0}, db = document.body, dde = document.documentElement; PositionXY.width = Math.max(db.scrollTop, dde.scrollTop, db.offsetWidth, dde.offsetWidth, db.clientWidth, dde.clientWidth); PositionXY.height = Math.max(db.scrollHeight, dde.scrollHeight, db.offsetHeight, dde.offsetHeight, db.clientHeight, dde.clientHeight); return PositionXY; }, getOffset: function(el) { if (el.getBoundingClientRect) { return el.getBoundingClientRect(); } else { var x = 0, y = 0; do { x += el.offsetLeft - el.scrollLeft; y += el.offsetTop - el.scrollTop; } while (el = el.offsetParent); return { "left": x, "top": y }; } }, parseScript: function (_source) { var source = _source, scripts = []; while (source.indexOf(" -1 || source.indexOf(" -1) { var s = source.indexOf("", s); var e = source.indexOf("", e); scripts.push(source.substring(s_e+1, e)); source = source.substring(0, s) + source.substring(e_e+1); } for (var i = 0; i < scripts.length; i++) { try { eval(scripts[i]); } catch(ex) { // do what you want here when a script fails } } return source; }, loadRemote: function (url, id) { var script = document.createElement('script'), s = document.getElementsByTagName('script')[0]; script.type = 'text/javascript'; script.src = url; script.id = id; s.parentNode.insertBefore(script, s); } }; JABB.Cookie = { create: function (name, value, days) { var expires; if (days) { var date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = "; expires=" + date.toGMTString(); } else { expires = ""; } document.cookie = name + "=" + value + expires + "; path=/"; }, read: function (name) { var nameEQ = name + "=", ca = document.cookie.split(';'); for (var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') c = c.substring(1, c.length); if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); } return null; }, erase: function (name) { this.create(name, "", -1); } }; JABB.Date = { format: function (str, format) { var jQuery = ['d', 'dd', 'm', 'mm', 'yy'], dateJs = ['d', 'dd', 'M', 'MM', 'yyyy'], php = ['j', 'd', 'n', 'm', 'Y'], limiters = ['.', '-', '/'], stack = []; switch (format) { case 'jquery': stack = jQuery; break; case 'datejs': stack = dateJs; break; default: return str; } for (var i = 0, len = limiters.length; i < len; i++) { if (str.indexOf(limiters[i]) !== -1) { var iFormat = str.split(limiters[i]); return [ stack[php.indexOf(iFormat[0])], stack[php.indexOf(iFormat[1])], stack[php.indexOf(iFormat[2])] ].join(limiters[i]); } } return str; } }; if (!Array.prototype.indexOf) { Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) { "use strict"; if (this == null) { throw new TypeError(); } var t = Object(this); var len = t.length >>> 0; if (len === 0) { return -1; } var n = 0; if (arguments.length > 0) { n = Number(arguments[1]); if (n != n) { // shortcut for verifying if it's NaN n = 0; } else if (n != 0 && n != Infinity && n != -Infinity) { n = (n > 0 || -1) * Math.floor(Math.abs(n)); } } if (n >= len) { return -1; } var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); for (; k < len; k++) { if (k in t && t[k] === searchElement) { return k; } } return -1; }; } (function (window, undefined) { var d = window.document; JABB.Ajax.xhrFields = { withCredentials: true }; function stivaNSL(options) { if (!(this instanceof stivaNSL)) { return new stivaNSL(options); } this.options = {}; this.error_container = null; this.message_container = null; this.day = null; this.month = null; this.year = null; this.group_id = null; this.btnSubmit = null this.init(options); return this; } stivaNSL.prototype = { resetForm: function() { var self = this, frm = d.forms[self.options.subscribe_form_name], first_name = frm.first_name, last_name = frm.last_name, email = frm.email, phone = frm.phone, website = frm.website, gender = frm.gender, age = frm.age, day = frm.day, month = frm.month, year = frm.year, address = frm.address, city = frm.city, state = frm.state, country = frm.country_id, zip = frm.zip, company_name = frm.company_name, captcha = frm.captcha; captcha.value = ''; if(first_name) { first_name.value = ''; } if(last_name) { last_name.value = ''; } if(email) { email.value = ''; } if(phone) { phone.value = ''; } if(website) { website.value = ''; } if(gender) { gender.value = ''; } if(age) { age.value = ''; } if(day) { day.value = ''; month.value = ''; year.value = ''; self.day = null; self.month = null; self.year = null; } if(address) { address.value = ''; } if(city) { city.value = ''; } if(state) { state.value = ''; } if(country) { country.value = ''; } if(zip) { zip.value = ''; } if(company_name) { company_name.value = ''; } }, submitForm: function(post) { var self = this; self.error_container.style.display = "none"; self.message_container.innerHTML = ''; JABB.Ajax.sendRequest(self.options.subscribe_url, function (req) { var code = req.responseText; if(code == '100') { self.message_container.innerHTML = ''; self.loadCaptcha(); self.resetForm(); }else if(code == '101'){ self.message_container.innerHTML = ''; }else{ self.message_container.innerHTML = ''; } self.btnSubmit.disabled = false; }, post); self.message_container.style.display = "block"; }, checkCaptcha: function() { var self = this, frm = d.forms[self.options.subscribe_form_name], captcha = frm.captcha.value; JABB.Ajax.sendRequest(self.options.check_captcha_url + "&captcha=" + captcha + "&group_id=" + self.group_id, function (req) { var code = req.responseText; if(code == '100') { self.submitForm(JABB.Utils.serialize(frm)); }else{ self.error_container.innerHTML = ''; self.error_container.style.display = "block"; self.btnSubmit.disabled = false; } }); }, checkEmail: function() { var self = this, frm = d.forms[self.options.subscribe_form_name], email = frm.email.value, captcha = frm.captcha.value; JABB.Ajax.sendRequest(self.options.check_email_url + "&email=" + email, function (req) { var code = req.responseText; if(code == '100') { self.checkCaptcha(); }else{ self.error_container.innerHTML = ''; self.error_container.style.display = "block"; self.btnSubmit.disabled = false; } }); }, disableForm: function() { var self = this, frm = d.forms[self.options.subscribe_form_name]; for (var i = 0, len = frm.elements.length; i < len; i++) { frm.elements[i].disabled = true; } }, enableForm: function() { var self = this, frm = d.forms[self.options.subscribe_form_name]; for (var i = 0, len = frm.elements.length; i < len; i++) { frm.elements[i].disabled = false; } }, validateForm: function() { var self = this, re = /([0-9a-zA-Z\.\-\_]+)@([0-9a-zA-Z\.\-\_]+)\.([0-9a-zA-Z\.\-\_]+)/, message = "", frm = d.forms[self.options.subscribe_form_name], day = frm.day, month = frm.month, year = frm.year; for (var i = 0, len = frm.elements.length; i < len; i++) { var cls = frm.elements[i].className; if (cls.indexOf("required") !== -1 && frm.elements[i].disabled === false) { switch (frm.elements[i].nodeName) { case "INPUT": switch (frm.elements[i].type) { case "checkbox": case "radio": if (!frm.elements[i].checked && frm.elements[i].getAttribute("lang")) { message += "
  • " + frm.elements[i].getAttribute("lang") + "
  • "; } break; default: if (frm.elements[i].value.length === 0 && frm.elements[i].getAttribute("lang")) { message += "
  • " + frm.elements[i].getAttribute("lang") + "
  • "; }else{ if(frm.elements[i].getAttribute("name") == 'birthday') { if (self.year == null || self.month == null && self.day == null) { message += '
  • ' + self.options.validation.error_birthday_invalid + '
  • '; } } } break; } break; case "TEXTAREA": if (frm.elements[i].value.length === 0 && frm.elements[i].getAttribute("lang")) { message += "
  • " + frm.elements[i].getAttribute("lang") + "
  • "; } break; case "SELECT": switch (frm.elements[i].type) { case 'select-one': if (frm.elements[i].value.length === 0 && frm.elements[i].getAttribute("lang")) { message += "
  • " + frm.elements[i].getAttribute("lang") + "
  • "; } break; case 'select-multiple': var has = false; for (j = frm.elements[i].options.length - 1; j >= 0; j = j - 1) { if (frm.elements[i].options[j].selected) { has = true; break; } } if (!has && frm.elements[i].getAttribute("lang")) { message += "
  • " + frm.elements[i].getAttribute("lang") + "
  • "; } break; } break; default: break; } } if (cls.indexOf("email") !== -1) { if (frm.elements[i].nodeName === "INPUT" && frm.elements[i].value.length > 0 && frm.elements[i].value.match(re) == null) { message += "
  • " + self.options.validation.error_email_invalid + "
  • "; } } } if (message != '') { self.error_container.innerHTML = ''; self.error_container.style.display = "block"; self.btnSubmit.disabled = false; }else{ self.checkEmail(); } }, bindForm: function() { var self = this, frm = d.forms[self.options.subscribe_form_name], day = frm.day, month = frm.month, year = frm.year, error_container = JABB.Utils.getElementsByClass("nsl-error-container", d.forms[self.options.subscribe_form_name], "DIV"), message_container = JABB.Utils.getElementsByClass("nsl-message-container", d.forms[self.options.subscribe_form_name], "DIV"); self.error_container = error_container[0]; self.message_container = message_container[0]; if (d.forms[self.options.subscribe_form_name] && d.forms[self.options.subscribe_form_name][self.options.subscribe_form_subscribe_name]) { JABB.Utils.addEvent(d.forms[self.options.subscribe_form_name][self.options.subscribe_form_subscribe_name], "click", function (event) { this.disabled = true; self.btnSubmit = this; self.validateForm(); }); } var date_arr = JABB.Utils.getElementsByClass("nsl-birthday", d.forms[self.options.subscribe_form_name], "SELECT"); for (i = 0, len = date_arr.length; i < len; i++) { date_arr[i].onchange = function () { if(this.getAttribute("name") == 'day') { self.day = this.value; } if(this.getAttribute("name") == 'month') { self.month = this.value; } if(this.getAttribute("name") == 'year') { self.year = this.value; } d.forms[self.options.subscribe_form_name]['birthday'].value = self.year + '-' + self.month + '-' + self.day; }; } if (day && day.value != '') { self.day = day.value; } if (month && month.value != '') { self.month = month.value; } if (year && year.value != '') { self.year = year.value; } }, loadFields: function(group_id_ele) { var self = this; self.disableForm(); JABB.Ajax.sendRequest(self.options.load_field_url + "&index="+self.options.index+ (group_id_ele.value != '' ? "&group_id=" + group_id_ele.value : ''), function (req) { var field_container = d.getElementById('nsl_form_field_' + self.options.index); field_container.innerHTML = req.responseText; group_id_ele.disabled = false; self.enableForm(); self.bindForm(); }); }, loadCaptcha: function() { var self = this; captcha_img = d.getElementById('nsl_captcha_image_' + self.options.index); captcha_img.src = self.options.load_captcha_url + Math.floor(Math.random() * (999999 - 1 + 1)) + "&group_id=" + self.group_id ; }, init: function (stivaObj) { var self = this, frm = d.getElementById('nsl_subscribe_form_' + stivaObj.index); self.options = stivaObj; self.group_id = self.options.group_id; if (frm) { if (d.forms[self.options.subscribe_form_name] && d.forms[self.options.subscribe_form_name]["group_id"]) { var group_id_ele = d.forms[self.options.subscribe_form_name]["group_id"]; JABB.Utils.addEvent(group_id_ele, "change", function (event) { self.group_id = group_id_ele.value; self.loadFields(group_id_ele); }); } self.bindForm(); } } } return (window.stivaNSL = stivaNSL); })(window);