
var fnjs = {
    evtHash: [],
    msg: [],
    msgstr: null,
    browser: { width: 0, height: 0, name: null },
    digits: "0123456789",
    validWorldPhoneChars: "()- +",
    minDigitsInIPhoneNumber: 10,
    tag: null,

    detectbrowser: function() { var b = navigator.userAgent.toLowerCase(); if (b.indexOf('msie') != -1) { this.browser.name = 'IE'; } else if (b.indexOf('chrome') != -1) { this.browser.name = 'CH'; } else if (b.indexOf('firefox') != -1) { this.browser.name = 'FF'; } else if (b.indexOf('safari') != -1) { this.browser.name = 'SF'; } else if (b.indexOf('opera') != -1) { this.browser.name = 'OP'; } this.browser.width = parseInt(screen.width); this.browser.height = parseInt(screen.height); return this.browser; },
    urlquery: function(u, islink) { var pos = u.indexOf("?"); if (pos != -1) { u = u.slice(pos + 1); if (islink) { return u; } else { return u.split("&"); } } else { return null } },
    parseInt: function(e, d) {var i = parseInt(e);if (isNaN(i) && d != undefined) {i = d;} return i;},
    isInteger: function(s) { var i; for (i = 0; i < s.length; i++) { var c = s.charAt(i); if (((c < "0") || (c > "9"))) return false; } return true; },
    nextSibling: function(e) { var eb = e.nextSibling; while (eb.nodeType != 1) { eb = eb.nextSibling; } return eb; },
    findPosY: function(e) { var curtop = 0; if (e.offsetParent) { while (1) { curtop += e.offsetTop; if (!e.offsetParent) break; e = e.offsetParent; } } else if (e.y) { curtop += e.y; } return curtop; },
    trim: function(s) { var i; var returnString = ""; for (i = 0; i < s.length; i++) { var c = s.charAt(i); if (c != " ") returnString += c; } return returnString; },
    stripCharsInBag: function(s, bag) { var i; var returnString = ""; for (i = 0; i < s.length; i++) { var c = s.charAt(i); if (bag.indexOf(c) == -1) returnString += c; } return returnString; },
    currency: function(e) { var i = parseFloat(e); if (isNaN(i)) { i = 0.00; } var minus = ''; if (i < 0) { minus = '-'; } i = Math.abs(i); i = parseInt((i + .005) * 100); i = i / 100; s = new String(i); if (s.indexOf('.') < 0) { s += '.00'; } if (s.indexOf('.') == (s.length - 2)) { s += '0'; } s = minus + s; return this.currencycomma(s); },
    currencycomma: function(e, delimiter) { e = e.toString(); if (delimiter == undefined) { delimiter = ","; } var a = e.split('.', 2); var d = a[1]; var i = parseInt(a[0]); if (isNaN(i)) { return ''; } var minus = ''; if (i < 0) { minus = '-'; } i = Math.abs(i); var n = new String(i); var a = []; while (n.length > 3) { var nn = n.substr(n.length - 3); a.unshift(nn); n = n.substr(0, n.length - 3); } if (n.length > 0) { a.unshift(n); } n = a.join(delimiter); if (d.length < 1) { e = n; } else { e = n + '.' + d; } e = minus + e; return e; },
    checkrange: function(n, hi, lo) { return n > hi ? hi : (n < lo ? lo : n); },
    checkPhone: function(e) { var b = 3; var e = this.trim(e); if (e.indexOf("+") > 1) { return false } if (e.indexOf("-") != -1) { b = b + 1 } if (e.indexOf("(") != -1 && e.indexOf("(") > b) { return false } var bc = e.indexOf("("); if (e.indexOf("(") != -1 && e.charAt(bc + 2) != ")") { return false } if (e.indexOf("(") == -1 && e.indexOf(")") != -1) { return false } var s = this.stripCharsInBag(e, this.validWorldPhoneChars); return (this.isInteger(s) && s.length >= this.minDigitsInIPhoneNumber); },
    changestate: function(e, isSet, pfx) { var a = e.className; var pos = a.lastIndexOf(pfx); if (pos !== -1) { a = a.slice(0, pos); } if (pos !== -1 && !isSet) { e.className = a; } else if (pos == -1 && isSet) { e.className = a + pfx; } },
    toggleview: function(id, mode) { var e = document.getElementById(id); e.style.display = (e.style.display == "none" || mode ? "block" : "none"); },
    appendHtml: function(e, htm) { while (e.firstChild) { e.removeChild(e.firstChild); } var t = document.createElement('div'); t.innerHTML = htm; e.appendChild(t); },
    addEvent: function(_elem, _evtName, _fn, _useCapture) { if (typeof _elem.addEventListener != 'undefined') { if (_evtName == 'mouseenter') { _elem.addEventListener('mouseover', fnjs.mouseEnter(_fn), _useCapture); } else if (_evtName == 'mouseleave') { _elem.addEventListener('mouseout', fnjs.mouseEnter(_fn), _useCapture); } else { _elem.addEventListener(_evtName, _fn, _useCapture); } } else if (typeof _elem.attachEvent != 'undefined') { var key = '{FNKEY::obj_' + fnjs.ieGetUniqueID(_elem) + '::evt_' + _evtName + '::fn_' + _fn + '}'; var f = fnjs.evtHash[key]; if (typeof f != 'undefined') { return; } f = function() { _fn.call(_elem); }; fnjs.evtHash[key] = f; _elem.attachEvent('on' + _evtName, f); window.attachEvent('onunload', function() { _elem.detachEvent('on' + _evtName, f); }); key = null; } else { _elem['on' + _evtName] = _fn; } },
    removeEvent: function(_elem, _evtName, _fn, _useCapture) { if (typeof _elem.removeEventListener != 'undefined') { _elem.removeEventListener(_evtName, _fn, _useCapture); } else if (typeof _elem.detachEvent != 'undefined') { var key = '{FNKEY::obj_' + fnjs.ieGetUniqueID(_elem) + '::evt' + _evtName + '::fn_' + _fn + '}'; var f = fnjs.evtHash[key]; if (typeof f != 'undefined') { _elem.detachEvent('on' + _evtName, f); delete fnjs.evtHash[key]; } key = null; } },
    mouseEnter: function(_pFn) { return function(_evt) { var relTarget = _evt.relatedTarget; if (this == relTarget || fnjs.isAChildOf(this, relTarget)) { return; } _pFn.call(this, _evt); } },
    isAChildOf: function(_parent, _child) { if (_parent == _child) { return false }; while (_child && _child != _parent) { _child = _child.parentNode; } return _child == _parent; },
    ieGetUniqueID: function(_elem) { if (_elem === window) { return 'theWindow'; } else if (_elem === document) { return 'theDocument'; } else { return _elem.uniqueID; } },
    resetform: function(f) { var fm = document.getElementById(f); if (!fm) { return; } var e = fm.getElementsByTagName("table"); var i; for (i = 0; i < e.length; i++) { this.resetinputElements(e[i].getElementsByTagName("input")); this.resetinputElements(e[i].getElementsByTagName("select")); this.resetinputElements(e[i].getElementsByTagName("textarea")); } },
    resetinputElements: function(e) { var i; if (e.length == 0) { return; } for (i = 0; i < e.length; i++) { e[i].value = ""; } },
    displaymsg: function(p) { if (p) { p.fnmst_displaymsg(this.msgstr, true); } else { fnmst_displaymsg(this.msgstr, true); } },
    clearDateErrorAlert: function(e) { this.clearErrorAlert(document.getElementById(e.id)); },
    clearErrorAlert: function(e) { this.errorAlert(e, '', 0); },
    errorAlert: function(e, msg, erridx) { var a = e.className; var t = e.title; var css; if (erridx == 1) { css = "-errr"; msg = this.msg[4].replace(/@0@/, msg.toUpperCase()); } else if (erridx == 2) { css = "-errv"; msg = this.msg[5].replace(/@0@/, msg.toUpperCase()); } else if (erridx == 3) { css = "-errv"; } if (!a) { a = "txt"; } else if (a.length > 15) { a = "txt" }; var p = a.lastIndexOf("-err"); if (Number(p) !== -1) { a = a.slice(0, Number(p)) }; p = t.lastIndexOf(': '); if (Number(p) !== -1) { t = t.slice(Number(p) + 2) }; if (erridx == 0) { e.className = a; e.title = t; } else { e.className = a + css; e.title = msg + t; } },
    appendmsgarray: function(m, hdr, idx, rst, dis) { if (rst) { this.msgstr = ""; } if (this.msgstr.length > 0) { this.msgstr = this.msgstr + "<br/>"; } this.msgstr = this.msgstr + "<h>" + this.msg[idx].replace(/@0@/, hdr) + "</h><br/><br/>"; var i; for (i = 0; i < m.length; i++) { this.msgstr = this.msgstr + "<p>" + (Number(i) + 1) + ") " + m[i] + ".</p>"; } if (dis) { this.displaymsg(); } },
    checkWordcount: function(e, f, msg) { var wordLen = Math.round(Number(e.maxlength) / 6); var len = 0; var rtn = true; if (e.value !== "") { len = e.value.split(/[\s]+/).length; } if (len > wordLen) { if (!!msg) { this.msgstr = this.msg[8].replace(/@0@/, msg).replace(/@1@/, wordLen); this.displaymsg(); } rtn = false; } f.innerHTML = this.msg[9] + ":" + wordLen + " &nbsp|&nbsp " + this.msg[10] + ":" + len; return rtn; },
    submitnfo: function(f, hdr, p, tag) { var fm = document.getElementById(f); if (!fm) { alert('input form not found'); return; } var e = fm.getElementsByTagName("table"); var i; var _r = new Array; var _v = new Array; var _o = new Array; for (i = 0; i < e.length; i++) { if ((e[i].style.display + '') !== 'none') { this.checkinputElements(e[i].getElementsByTagName("input"), _r, _v, _o, tag); this.checkinputElements(e[i].getElementsByTagName("select"), _r, _v, _o, tag); this.checkinputElements(e[i].getElementsByTagName("textarea"), _r, _v, _o, tag); } } if (_r.length > 0 || _v.length > 0) { this.msgstr = ""; var idx = 3; if (_r.length > 0) { this.appendmsgarray(_r, hdr, 2); idx = 11; } if (_v.length > 0) { this.appendmsgarray(_v, hdr, idx); } this.displaymsg(p); return null; } else { return _o; } },
    checkinputElements: function(e, _r, _v, _o, tag) { var i, val, rval, req, fmt, vld, des; if (e.length == 0) { return; } for (i = 0; i < e.length; i++) { if (e[i].type !== "button") { val = e[i].value; des = e[i].attributes.getNamedItem("description").value; vld = true; if (e[i].attributes.getNamedItem("required") == null) { req = false; } else { req = (Number(e[i].attributes.getNamedItem("required").value) > 0 ? true : false); } if (e[i].attributes.getNamedItem("format") == null) { fmt = ""; } else { fmt = e[i].attributes.getNamedItem("format").value; } if (val == "" && req) { _r[_r.length] = this.msg[0].replace(/@0@/, des); this.errorAlert(e[i], '', 1); vld = false; } else if (val !== "" && fmt !== "") { if (!this.validateinput(e[i], fmt, req)) { var a = this.msg[1].replace(/@0@/, des); a = a.replace(/@1@/, fmt); _v[_v.length] = a; vld = false; } else if (fmt == tag) { this.tag = val; } } else { this.clearErrorAlert(e[i]); } if (vld) { if (e[i].type == "checkbox") { rval = (e[i].checked == true ? this.msg[6] : this.msg[7]); } else if (e[i].type.indexOf("select") > -1 && val !== "") { rval = e[i].options[e[i].selectedIndex].text; } else { rval = val; } _o[_o.length] = "<b>" + des + "</b>: " + rval; } } } },
    validateinput: function(e, fmt, req) { var rtn = null, val = e.value, err = "", erridx = 2, sfmt = fmt.toLowerCase(), idx = sfmt.indexOf("-"); if (idx !== -1) { sfmt = sfmt.slice(0, idx); } switch (sfmt) { case "emails": err = "email"; if (val !== "") { var as = val.split(";"); var i; for (i in as) { rtn = as[i].match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/); if (rtn == null) { break; } } } break; case "email": err = "email"; if (val !== "") { rtn = val.match(/^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/); } break; case "phone": err = "phone number"; if (val !== "") { if (this.checkPhone(val)) { rtn = 'valid'; } } break; case "date": err = "date"; if (val !== "") { rtn = "valid"; } break; default: rtn = "valid"; err = fmt; break; } if (val == "") { if (req) { erridx = 1; rtn = null; } else { rtn = 'valid'; } } this.errorAlert(e, err, (rtn == null ? erridx : 0)); return !(rtn == null); },
    selectcomboitem: function(e, p, val) { if (this.browser.name == "IE") { p.childNodes[1].innerText = e.innerText; } else { p.childNodes[2].textContent = e.textContent; } if (p.attributes.getNamedItem("optval") == null) { this.changestate(e, true, "-sl"); p.setAttribute("optval", val); p.setAttribute("optid", e.id); } else { p.attributes.getNamedItem("optval").value = val; var id_pr = p.attributes.getNamedItem("optid").value; if (id_pr !== e.id) { this.changestate(document.getElementById(id_pr), false, "-sl"); this.changestate(e, true, "-sl"); p.attributes.getNamedItem("optid").value = e.id; } } },
    log: function(message) { if (!this.log.window_ || this.log.window_.closed) { var win = window.open("", null, "width=400,height=200," + "scrollbars=yes,resizable=yes,status=no," + "location=no,menubar=no,toolbar=no"); if (!win) return; var doc = win.document; doc.write("<html><head><title>Debug Log</title></head>" + "<body></body></html>"); doc.close(); this.log.window_ = win; } var logLine = this.log.window_.document.createElement("div"); logLine.appendChild(this.log.window_.document.createTextNode(message)); this.log.window_.document.body.appendChild(logLine); }
};

fnjs.detectbrowser();


    var myFx = { expand: null, interval: null, step: null, maxheight: null, _e: null, limit: null, fn: null, _ep: null,
        opacity: function(id, s, e, m, fn) { var speed = Math.round(m / 100); var timer = 0; if (s > e) { var h = -1; for (i = s; i >= e; i--) { if (i == 0) { h = 0 } else { h = -1; } setTimeout("myFx.changeOpac(" + i + ",'" + id + "','" + h + "','" + fn + "')", (timer * speed)); timer++; } } else if (s < e) { for (i = s; i <= e; i++) { if (i == 0) { h = 1 } else { h = -1; } setTimeout("myFx.changeOpac(" + i + ",'" + id + "','" + h + "','" + fn + "')", (timer * speed)); timer++; } } },
        coveropacity: function(id, fadein, fn, e) { var s = 0; var m = 250; if (!e) { e = 70 }; if (fadein) { this.opacity(id, s, e, m, fn); } else { this.opacity(id, e, s, m, fn); } },
        blendimage: function(divid, imageid, imagefile, millisec) { var speed = Math.round(millisec / 100); var timer = 0; document.getElementById(divid).style.backgroundImage = "url(" + document.getElementById(imageid).src + ")"; this.changeOpac(0, imageid, false); document.getElementById(imageid).src = imagefile; for (i = 0; i <= 100; i++) { setTimeout("myFx.changeOpac(" + i + ",'" + imageid + "',false)", (timer * speed)); timer++; } },
        currentOpac: function(id, opacEnd, millisec) { var currentOpac = 100; if (document.getElementById(id).style.opacity < 100) { currentOpac = document.getElementById(id).style.opacity * 100; } opacity(id, currentOpac, opacEnd, millisec) },
        changeOpac: function(v, id, h, fn) { var e = document.getElementById(id); if (e !== null) { var o = e.style; o.opacity = (v / 100); o.MozOpacity = (v / 100); o.KhtmlOpacity = (v / 100); o.filter = "alpha(opacity=" + v + ")"; if (h !== "-1") { o.display = (h == "0" ? "none" : "block"); if (fn !== 'undefined') { setTimeout(fn, 0); } } } },
        slide: function(e, interval, step, expand, limit, fn) { if (this._e !== null) { return null; } if (e.attributes.getNamedItem("expanded") == null) { e.setAttribute("expanded", -1); } if (expand !== Number(e.attributes.getNamedItem("expanded").value)) { this._e = e; this.expand = expand; this.step = step; this.interval = interval; if (limit !== undefined && limit !== null) { this.limit = Number(limit); } else { this.limit = 0; } if (fn !== undefined) { this.fn = fn; } else { this.fn = null; } this.maxheight = (Number(e.offsetHeight) - this.limit); if (this.expand == 1) e.style.display = "block"; var step_height = this.step + (this.expand == 1 ? 0 : -this.maxheight); e.style.height = Math.abs(step_height) + "px"; setTimeout("myFx.slideStatus(" + step_height + ")", this.interval); } return expand; },
        slidepersit: function(e, interval, step, expand, limit, fn) { if (e !== null) { this._ep = e; } if (this.slide(this._ep, interval, step, expand, limit, fn) == null) {setTimeout("myFx.slidepersit(null," + interval + "," + step + "," + expand + "," + limit + "," + fn + ");", 200); } else { this._ep = null; } },
        slideStatus: function(sh) {var sh_abs = Math.abs(sh);if (sh_abs >= this.step && sh_abs <= (this.maxheight - this.step)) {sh += this.step; this._e.style.height = Math.abs(sh) + "px"; this._e.attributes.getNamedItem("expanded").value = 2; setTimeout("myFx.slideStatus(" + sh + ")", this.interval);}else {this._e.attributes.getNamedItem("expanded").value = this.expand;if (this.limit == 0) {if (this.expand == 0) {this._e.style.display = "none";}this._e.style.height = "";}this._e = null;if (this.fn !== null) { setTimeout(this.fn, 0); }}}
    };



