var jbx = jbx || {};
jbx.UNIQUE_ID_COUNTER = 1;
jbx.UNIQUE_ID_PROPERTY = 'jbx_unique_id_prefix';
jbx.zIndex = { TOP: 9000000,MID: 5000000,LOW: 1000000 }
jbx._evalGlobalTest = null;
jbx.isStrictMode = document.compatMode == "CSS1Compat";
jbx.focusedControl = null;
jbx.package = function(namespace) {
var names = namespace.split('.'), curr = window, part = names.shift();
!(names[0] in curr) && curr.execScript && curr.execScript('var ' + name[0]);
while (part) { !jbx.isDefined(curr[part]) && (curr[part] = {}); curr = curr[part]; part = names.shift(); } };
jbx.isDefined = function (value) { return value !== undefined; };
jbx.isNull = function (value) { return value === null || typeof value == 'undefined'; };
jbx.isEmpty = function(value){ return value === '' || value === 0 || !jbx.isDefined(value) || jbx.isNull(value) || (jbx.isArray(value) && value.length == 0); };
jbx.isString = function (value) { return typeof value == "string"; };
jbx.isBoolean = function (value) { return typeof value == "boolean"; };
jbx.isNumber = function (value) { return typeof value == "number"; };
jbx.isDate = function (value) { return goog.isObject(value) && typeof val.getFullYear == 'function'; };
jbx.isFunction = function (value) { return typeof value == "function"; };
jbx.isObject = function (value) { var tof = typeof value; return tof == "object" || tof == "function"; };
jbx.isArray = function (value) { return value instanceof Array || (!(value instanceof Object) && Object.prototype.toString.call(value) == '[object Array]'); };
jbx.eval = function(code) { if (window.execScript) { window.execScript(code, "JavaScript"); } else if (window.eval) { if (jbx._evalGlobalTest === null) { window.eval('var _global_eval_test_ = true'); jbx._evalGlobalTest = typeof window['_global_eval_test_'] != 'undefined'; } if (jbx._evalGlobalTest) { window.eval(code); } else { var node = document.createElement("script"); node.type = "text/javascript"; node.appendChild(document.createTextNode(code)); document.body.appendChild(d); document.body.removeChild(d); } } };
jbx.getUniqueId = function(obj) { var p = jbx.UNIQUE_ID_PROPERTY; if (obj.hasOwnProperty && obj.hasOwnProperty(p)) { return obj[p]; } if (jbx.isEmpty(obj[p])) { var value = jbx.UNIQUE_ID_COUNTER++; obj[p] = value; } return obj[p]; };
jbx.inherits = function(subclass, superclass) { function temp() {}; temp.prototype = superclass.prototype; subclass.prototype = new temp(); subclass.prototype.constructor = subclass; subclass.superClass = superclass.prototype; };

jbx.package('jbx.array');
jbx.array.indexOf = function (arr, value, offset) { var len = arr.length; offset = offset || 0; offset = offset < 0 ? Math.max(0, len + offset) : offset; for (var i=offset; i<len; i++) { if (arr[i] === value) { return i; } } return -1; };
jbx.array.lastIndexOf = function (arr, value, offset) { var len = arr.length; offset = offset == null ? len-1 : offset; offset = offset < 0 ? Math.max(0, len + offset) : offset; for (var i=offset; i>=0; i--) { if (arr[i] === value) { return i; } } return -1; };
jbx.array.filter = function(arr, func, scope) { var result = [], index = 0; scope = scope || this; for (var i=0,l=arr.length; i<l; i++) { if (func.call(scope, arr[i], i, arr)) { result[index++] = arr[i]; } } return result; };
jbx.array.map = function(arr, func, scope) { var result = [], index = 0; scope = scope || this; for (var i=0,l=arr.length; i<l; i++) { result[index++] = func.call(scope, arr[i], i, arr); } return result; };
jbx.array.every = function(arr, func, scope) { scope = scope || this; for (var i=0,l=arr.length; i<l; i++) { if (!func.call(scope, arr[i], i, arr)) { return false; } } return true; };
jbx.array.some = function(arr, func, scope) { scope = scope || this; for (var i=0,l=arr.length; i<l; i++) { if (func.call(scope, arr[i], i, arr)) { return true; } } return false; };
jbx.array.unique = function(arr) { var result = [], nidx = 0; for (var i=0, l=arr.length; i<l; i++) { if (jbx.array.indexOf(result,arr[i]) == -1) { result[nidx] = arr[i]; nidx++; } } return result; };
jbx.array.forEach = function(arr, func, scope) { scope = scope || this; for (var i=0, l=arr.length; i<l; i++) { if (func.call(scope, arr[i], i, arr) === false) { break; } } };

jbx.package('jbx.string');
jbx.string.trim = function(str) { return str.replace(/^[\t\n\r\s\xa0]+|[\t\n\r\s\xa0]+$/g, ''); };
jbx.string.toUcFirst = function(str) { var str = str.toLowerCase(); return str.replace(/^([^a-z]*?[a-z])/g, function(x,l) { return l.toUpperCase(); }); };
jbx.string.toUcWords = function(str) { var str = str.toLowerCase(); return str.replace(/(^[^a-z]*?[a-z]|[^a-z][a-z])/g, function(x,l) { return l.toUpperCase() }); };
jbx.string.toCamel = function(str) { if (str.indexOf('-') > -1) { str = str.toLowerCase(); return str.replace(/-([a-z])/g, function(x,l) { return l.toUpperCase() }); }  return str; };
jbx.string.padLeft = function(str, len, chr) { while (str.length < len) { str = chr + str; } return str; };
jbx.string.padRight = function(str, len, chr) { while (str.length < len) { str += chr; } return str; };
jbx.string.toBreak = function(str) { return str.replace(/(\r\n|\r|\n)/g, "<br />"); }; jbx.string.toLineFeed = function(str) { return str.replace(/<br\s?\/?>/g, "\n"); };
jbx.string.toNbsp = function(str) { return str.replace(/(  )/g, " &nbsp;"); }; jbx.string.toSpace = function(str) { return str.replace(/&(nbsp|#160);/g, " "); };
jbx.string.htmlEntities = function(str) { return str.replace(/&/g,'&amp;') .replace(/</g,'&lt;') .replace(/>/g,'&gt;') .replace(/\"/g,'&quot;'); };
jbx.string.htmlEntitiesDecode = function(str) { var n = 0, ent = {'lt':'<','gt':'>','amp':'&','quot':'"'}; return str.replace(/&([^;]+);/g, function (s, m) { n = parseInt(m.substr(1), 10); return ent[m] ? ent[m] : (isNaN(n) ? s : String.fromCharCode(n)); }); };
jbx.string.truncate = function (str, len) { return str.length > len ? str.substring(0,len-3)+"..." : str; };

jbx.package('jbx.dom');
jbx.dom.NodeType = { ELEMENT: 1, ATTRIBUTE: 2, TEXT: 3, CDATA_SECTION: 4, ENTITY_REFERENCE: 5, ENTITY: 6, PROCESSING_INSTRUCTION: 7, COMMENT: 8, DOCUMENT: 9, DOCUMENT_TYPE: 10, DOCUMENT_FRAGMENT: 11, NOTATION: 12 };
jbx.dom.getElement = function(value, doc) { doc = doc || document; return typeof value == "string" ? doc.getElementById(value) : value; };
jbx.dom.getDocument = function(node) { node = node || document; return node.nodeType == jbx.dom.NodeType.DOCUMENT ? node : node.ownerDocument || node.document || document; };
jbx.dom.getViewport = function(doc) { var doc = jbx.dom.getDocument(doc); return jbx.isStrictMode ? doc.documentElement : doc.body; };
jbx.dom.getWindow = function(node) { var doc = null; if (node && typeof node.opener != 'undefined') { return node; } doc = jbx.dom.getDocument(node); return doc.parentWindow || doc.defaultView || window; };
jbx.dom.resolveNode = function(node, property, test) { test = test || function (n) { return n.nodeType == jbx.dom.NodeType.ELEMENT; }, property = property || 'nextSibling'; while (node) { if (test(node)) { return node; } try { node = node[property]; } catch(e) { return null; } } return node; };
jbx.dom.nextElement = function(node) { return jbx.dom.resolveNode(node.nextSibling); };
jbx.dom.previousElement = function(node) { return jbx.dom.resolveNode(node.previousSibling, 'previousSibling'); };
jbx.dom.firstChild = function(node) { return jbx.dom.resolveNode(node.firstChild, 'nextSibling'); };
jbx.dom.lastChild = function(node) { node = node.lastChild; return jbx.dom.resolveNode(node, 'nextSibling') || jbx.dom.resolveNode(node, 'previousSibling'); };
jbx.dom.firstHiddenParent = function(node) { return jbx.dom.resolveNode(node, 'parentNode', function(n) { return n.nodeType == jbx.dom.NodeType.ELEMENT && jbx.style.getStyle(n, "display") == "none" }); };
jbx.dom.insertBefore = function(node, ref) { ref && ref.parentNode && ref.parentNode.insertBefore(node,ref); };
jbx.dom.insertAfter = function(node, ref) { var next = null; if (ref && ref.parentNode) { next = ref.nextSibling; next ? ref.parentNode.insertBefore(node,next) : ref.parentNode.appendChild(node); } };
jbx.dom.createElement = function(name, attr) { var el = document.createElement(name); el && attr && jbx.dom.setAttributes(el,attr); return el; };
jbx.dom.setAttributes = function(el, attr) { for (var a in attr) { switch (a) { case 'for': el.htmlFor = attr[a]; break; case 'class': el.className = attr[a]; break; case 'style': jbx.dom.style.setStyles(el, attr[a]); break; default: el[a] = attr[a]; } } };
jbx.dom.getScroll = function(el) { return new jbx.geom.Rect(el.scrollTop,    el.scrollLeft,    el.scrollWidth,    el.scrollHeight); };
jbx.dom.getDocumentScroll = function(node) { var doc = jbx.dom.getDocument(node), vpt = jbx.userAgent.WEBKIT ? doc.body : jbx.dom.getViewport(doc); return new jbx.geom.Rect(vpt.scrollTop, vpt.scrollLeft, vpt.scrollWidth, vpt.scrollHeight); };
jbx.dom.contains = function(parent, child, stopat) { if (parent == child) { return true; } else if (parent.contains) { return parent.contains(child); } else if (parent.compareDocumentPosition) { return !!(parent.compareDocumentPosition(child) & 16); } else { stopat = stopat || jbx.dom.getViewport(); while (child && stopat != child && parent != child) { child = child.parentNode; } return child == parent; } };

jbx.package('jbx.style');
jbx.style.Side = { TOP: 1, LEFT: 2, RIGHT: 4, BOTTOM: 8 };
jbx.style.Corner = { TOPLEFT: jbx.style.Side.TOP | jbx.style.Side.LEFT, TOPRIGHT: jbx.style.Side.TOP | jbx.style.Side.RIGHT, BOTTOMLEFT: jbx.style.Side.BOTTOM | jbx.style.Side.LEFT, BOTTOMRIGHT: jbx.style.Side.BOTTOM | jbx.style.Side.RIGHT };
jbx.style.SideName = { 1: 'top', 2: 'left', 4: 'right', 8: 'bottom', 3: 'topleft', 5: 'topright', 10: 'bottomleft', 12: 'bottomright' };
jbx.style._visibilityStates = {};
jbx.style.getStyle = function(el, attr) { if (attr == 'float') {return jbx.style.getFloat(el); } if (attr == 'opacity') { return jbx.style.getOpacity(el); } return jbx.style.getComputedStyle(el,attr); };
jbx.style.getComputedStyle = function(el, attr) { var styles = null, doc = jbx.dom.getDocument(el); if (doc.defaultView && doc.defaultView.getComputedStyle) { styles = doc.defaultView.getComputedStyle(el, ""); if (styles) { return styles[attr]; } } else if (el.currentStyle) { return el.currentStyle[attr]; } return el.style[attr]; };
jbx.style.setStyle = function(el, attr, val) { attr = jbx.string.toCamel(attr); switch (attr) { case 'float': jbx.style.setFloat(el,val); break; case 'opacity': jbx.style.setOpacity(el,val); break; default: el.style[attr] = val; } };
jbx.style.setStyles = function(el, attrs) { var attr, val; attrs = attrs.split(/\s*?;\s*?/); for (var i=0,l=attrs.length; i<l; i++) { attr = attrs[i].split(/\s*?:\s*?/); val = jbx.string.trim(attr[1]); attr = jbx.string.trim(attr[0]); jbx.style.setStyle(el,attr,val); } };
jbx.style.getFloat = function(el, value) { var attr = jbx.userAgent.IE ? 'styleFloat' : 'cssFloat'; return jbx.style.getComputedStyle(el,attr); };
jbx.style.setFloat = function(el, value) { var attr = jbx.userAgent.IE ? 'styleFloat' : 'cssFloat'; el.style[attr] = value; };
jbx.style.getOpacity = function(el) { var result = '', match = null; if ('opacity' in el.style) { result = jbx.style.getComputedStyle(el,'opacity'); } else if ('MozOpacity' in el.style) { result = jbx.style.getComputedStyle(el,'MozOpacity'); } else if ('filter' in el.style) { match = el.style.filter.match(/alpha\(opacity=(.+)\)/); if (match) { result = match[1]/100; } } result = parseFloat(result); return isNaN(result) ? 1 : result; };
jbx.style.setOpacity = function(el, alpha) { if ('opacity' in el.style) { el.style.opacity = alpha; } else if ('MozOpacity' in el.style) { el.style.MozOpacity = alpha; } else if ('filter' in el.style) { el.style.filter = alpha == 1 ? '' : 'alpha(opacity='+(alpha*100)+ ')'; } };
jbx.style.isUnselectable = function(el) { if (jbx.userAgent.GECKO) { return el.style.MozUserSelect == 'none'; } else if (jbx.userAgent.WEBKIT) { return el.style.WebkitUserSelect == 'none'; } else { return el.getAttribute("unselectable"); } };
jbx.style.setUnselectable = function(el, value, recursion) { if (jbx.userAgent.GECKO) { el.style.MozUserSelect = value ? '' : 'none'; } else if (jbx.userAgent.WEBKIT) { el.style.WebkitUserSelect = value ? '' : 'none'; } else { value = value ? '' : 'on'; el.setAttribute("unselectable", value); } if (recursion !== false) { el = jbx.dom.firstChild(el); while (el) { jbx.style.setUnselectable(el, value, recursion); el = jbx.dom.nextElement(el); } } };
jbx.style.getSize = function(el) { return new jbx.geom.Rect(0, 0, el.offsetWidth, el.offsetHeight); };
jbx.style.setSize = function(el, width, height) {el.style.width = Math.round(width)+'px'; el.style.height = Math.round(height)+'px'; };
jbx.style.getBoxSize = function(el, attr, size) { var top = jbx.string.toCamel(attr+'-top'+(size ? '-width' : '')), left = jbx.string.toCamel(attr+'-left'+(size ? '-width' : '')), right = jbx.string.toCamel(attr+'-right'+(size ? '-width' : '')), bottom = jbx.string.toCamel(attr+'-bottom'+(size ? '-width' : '')); top = jbx.style.getStyle(el,top); left = jbx.style.getStyle(el,left); right = jbx.style.getStyle(el,right); bottom = jbx.style.getStyle(el,bottom); return new jbx.geom.Box(jbx.style.toPixel(el,'height',top), jbx.style.toPixel(el,'width',left), jbx.style.toPixel(el,'height',bottom), jbx.style.toPixel(el,'width',right)); };
jbx.style.getPosition = function(el) { return new jbx.geom.Point(el.offsetTop,el.offsetLeft); };
jbx.style.setPosition = function(el, top, left) { el.style.top = Math.round(top)+'px'; el.style.left = Math.round(left)+'px'; };
jbx.style.getGlobalPosition = function(el) { var rect = null, ppos = null, point = null, scroll = null, doc = jbx.dom.getDocument(el), vpt = jbx.dom.getViewport(doc), pos = jbx.style.getStyle(el,'position'); if (el == vpt) { return new jbx.geom.Point(0,0) } if (el.getBoundingClientRect) { rect = el.getBoundingClientRect(); if (jbx.userAgent.IE && jbx.userAgent.VERSION < 8) { rect.top -= vpt.clientTop; rect.left -= vpt.clientLeft; } scroll = jbx.dom.getDocumentScroll(el); return new jbx.geom.Point(Math.round(rect.top+scroll.top), Math.round(rect.left+scroll.left)); } else { point = jbx.style.getPosition(el), parent = el.offsetParent; if (pos == 'fixed') { scroll = jbx.dom.getDocumentScroll(el); point.top += scroll.top; point.left += scroll.left; } while (parent) { ppos = jbx.style.getStyle(parent,'position'); point.top += parent.offsetTop + (parent.clientTop || 0); point.left += parent.offsetLeft + (parent.clientTop || 0); if (ppos == 'fixed') { scroll = jbx.dom.getDocumentScroll(el); point.top += scroll.top; point.left += scroll.left; break; } parent = parent.offsetParent; } parent = el; while (parent && parent != doc.body) { point.top -= parent.scrollTop; point.left -= parent.scrollLeft; parent = parent.parentNode; } return point; } };
jbx.style.setGlobalPosition = function(el, top, left) { var off = el.offsetParent, doc = jbx.dom.getDocument(), vpt = jbx.dom.getViewport(), pt = new jbx.geom.Point(Math.round(top), Math.round(left)); if (off != doc && off != doc.body && off != vpt) { pt = pt.globalToLocal(off), brd = jbx.style.getBoxSize(off,'border',true); pt.top -= brd.top; pt.left -= brd.left; } jbx.style.setPosition(el,pt.top,pt.left); };
jbx.style.getBounds = function(el) { var rec = jbx.style.getSize(el), pos = jbx.style.getGlobalPosition(el); rec.top = pos.top; rec.left = pos.left; return rec; };
jbx.style.setBounds = function(el, top, left, width, height) { jbx.style.setSize(el, width, height); jbx.style.setGlobalPosition(el, top, left); };
jbx.style.getDocumentSize = function(node) { var scr = jbx.dom.getDocumentScroll(node), size = jbx.style.getViewportSize(node); return new jbx.geom.Rect(0, 0, Math.max(scr.width, size.width), Math.max(scr.height, size.height)); };
jbx.style.getViewportSize = function(node) { var win = jbx.dom.getWindow(node), scr = jbx.dom.getDocumentScroll(node), rec = new jbx.geom.Rect(scr.top,scr.left,0,0); if (typeof win.innerWidth != 'undefined') { rec.width = win.innerWidth; rec.height = win.innerHeight; } else { node = jbx.dom.getViewport(node); rec.width = node.clientWidth; rec.height = node.clientHeight; } return rec; };
jbx.style.toPixel = function(el,attr,value) { var re = /^\d+px?$/, pixel = null, oldinline = null, oldruntime = null, names = {thin:2, medium:4, thick:6}; name = name == 'height' ? 'height' : 'width'; if (re.test(value)) { return parseInt(value, 10); } else if (names[value]) { return names[value]; } else if (el.currentStyle && el.runtimeStyle) { oldinline = el.style[attr]; oldruntime = el.runtimeStyle[attr]; el.runtimeStyle[attr] = jbx.style.getStyle(el,attr); el.style[attr] = value; pixel = el.style[jbx.string.toCamel('pixel-'+attr)]; el.style[attr] = oldinline; el.runtimeStyle[attr] = oldruntime; return parseInt(pixel, 10); } else { oldinline = el.style[attr]; el.style[attr] = value; pixel = jbx.style.getStyle(el,attr); el.style[attr] = oldinline; return parseInt(pixel, 10); } };
jbx.style.isVisible = function(el) { return jbx.dom.firstHiddenParent(el) == null; };
jbx.style.ensureVisible = function(el,block) { var parent = el, id = '', state = {}, display = '', visibility = ''; while (parent) { id = jbx.getUniqueId(parent); state = jbx.style._visibilityStates[id]; display = jbx.style.getStyle(parent, 'display'); state = state || {count:0, display:'', visibility:''}; if (display == 'none') { state.display = parent.style.display; state.visibility = parent.style.visibility; parent.style.visbility = 'hidden'; parent.style.display = parent.style.display == display ? '' : block; } state.count++; jbx.style._visibilityStates[id] = state; parent = parent.parentNode; } };
jbx.style.restoreVisible = function(el) { var parent = el, id = '', state = {}; while (parent) { id = jbx.getUniqueId(parent); state = jbx.style._visibilityStates[id]; if (state) { state.count--; if (state.count <= 0) { parent.style.display = state.display; parent.style.visibility = state.visibility; delete jbx.style._visibilityStates[id]; } } parent = parent.parentNode; } };
jbx.style.align = function(source,target,sides,distanceX,distanceY,percentages,onscreen) { var vpts = null, el = source instanceof jbx.geom.Rect ? null : source, off = jbx.userAgent.IE ? 0 : 18; source = source instanceof jbx.geom.Rect ? source.clone() : jbx.style.getSize(source); target = target instanceof jbx.geom.Rect ? target.clone() : jbx.style.getBounds(target); source.setCoordinate(0,0); distanceX = distanceX || 0; distanceY = distanceY || 0; if (percentages) { distanceX = source.width * distanceX / 100; distanceY = source.height * distanceY / 100; } source.left = Math.round(target.left+(target.width/2)-(source.width/2)); source.top = Math.round(target.top+(target.height/2)-(source.height/2)); if (sides & jbx.style.Side.TOP) { source.top = target.top-source.height-distanceY; } if (sides & jbx.style.Side.LEFT) { source.left = target.left-source.width-distanceX; } if (sides & jbx.style.Side.RIGHT) { source.left = target.left+target.width+distanceX; } if (sides & jbx.style.Side.BOTTOM) { source.top = target.top+target.height+distanceY; } if (onscreen !== false) { vpts = jbx.style.getViewportSize(el); if (source.top+source.height+off > vpts.top+vpts.height) { if (source.left+source.width <= target.left+5 || source.left >= target.left+target.width-5 ) { source.top=vpts.top+vpts.height-source.height-off; } else { source.top=target.top-source.height+distanceY; } } if (source.top < vpts.top) { if (source.left+source.width <= target.left+5 || source.left >= target.left+target.width-5 ) { source.top=vpts.top; } else { source.top=target.top+target.height+distanceY; } } if (source.left+source.width+off > vpts.left+vpts.width) { if (source.top+source.height <= target.top+5 || source.top >= target.top+target.height-5 ) { source.left=vpts.left+vpts.width-source.width-off; } else { source.left=target.left-source.width+distanceX; } } if (source.left < vpts.left) { if (source.top+source.height <= target.top+5 || source.top >= target.top+target.height-5 ) { source.left=vpts.left; } else { source.left=target.left+target.width+distanceX; } } } el && jbx.style.setGlobalPosition(el,source.top,source.left); return source; };

jbx.package('jbx.events');
jbx.events._listeners = {};
jbx.events._dropObjectPool = {};
jbx.events.keyCodes = { BACKSPACE: 8, TAB: 9, ENTER: 13, PAUSE: 19, CAPS_LOCK: 20, ESC: 27, SPACE: 32, PAGE_UP: 33, PAGE_DOWN: 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, PRINT_SCREEN: 44, INSERT: 45, DELETE: 46, CONTEXT_MENU: 93, MULTIPLY: 106, PLUS: 107, MINUS: 109, PERIOD: 110, DIVISION: 111, F1: 112, F2: 113, F3: 114, F4: 115, F5: 116, F6: 117, F7: 118, F8: 119, F9: 120, F10: 121,F11: 122,  F12: 123, NUMLOCK: 144 };
jbx.events._getListener = function(src, type, callback, scope, capture) { var listener = null, pool = jbx.events._dropObjectPool; if (pool.Listener && pool.Listener.length) { listener = pool.Listener.pop(); } else { listener = new jbx.events.Listener(); listener.handleBrowserEvent = function(e) { return jbx.events._handleBrowserEvent(listener, e); }; } listener.initialize(src, type, callback, scope, capture); return listener; };
jbx.events._getBrowserEvent = function(e) { var event = null, pool = jbx.events._dropObjectPool; if (pool.BrowserEvent && pool.BrowserEvent.length) { event = pool.BrowserEvent.pop(); } else { event = new jbx.events.BrowserEvent(); } event.initialize(e); return event; };
jbx.events.getEvent = function(type,target) { var event = null, pool = jbx.events._dropObjectPool; if (pool.Event && pool.Event.length) { event = pool.Event.pop(); } else { event = new jbx.events.Event(); } event.initialize(type,target); return event; };
jbx.events.getDragDropEvent = function(type,target,dragger,drop,cx,cy,dx,dy,ox,oy) { var event = null, pool = jbx.events._dropObjectPool; if (pool.DragDropEvent && pool.DragDropEvent.length) { event = pool.DragDropEvent.pop(); } else { event = new jbx.events.DragDropEvent(); } event.initialize(type,target,dragger,drop,cx,cy,dx,dy,ox,oy); return event; };
jbx.events.dropEvent = function(e,type) { var pool = jbx.events._dropObjectPool; e.free(); pool[type] = pool[type] || []; pool[type].push(e); };
jbx.events._fireListeners = function(target, type, capture, event) { var result = true, id = jbx.getUniqueId(target), listeners = jbx.events._listeners; event.currentTarget = target; event.phase = capture ? 'capture' : (event.target == target ? 'target' : 'bubble'); if (listeners[capture] && listeners[capture][type] && listeners[capture][type][id]) { listeners = listeners[capture][type][id]; for (var i=0, l=listeners.length; i < l && !event.killed; i++) { result = listeners[i].handleEvent(event) !== false && result; } } if (target.isDispatcher && target.element && event.fireInline && !event.killed) { if (jbx.isFunction(target.element['on'+type])) { target.element['on'+type](event); } } return result; };
jbx.events._handleBrowserEvent = function(listener, e) { e = e || window.event; var file = null, result = true, target = null, targets = null, event = jbx.events._getBrowserEvent(e); if (listener.capture && !listener.src.addEventListener) { if (e.keyCode < 0 || e.returnValue != undefined) { return true; } file = e.srcElement; file = !!file && file.nodeName == 'input' && file.type == 'file'; if (e.keyCode == 0 && !file) { e.keyCode = -1; } else if (e.returnValue == undefined) { e.returnValue = true; } targets = []; target = listener.src; while (target) { targets.push(target); target = target.parentNode; } for (var i=targets.length-1; i>0 && !event.stopped; i--) { result = jbx.events._fireListeners(targets[i], event.type, true, event) && result; } } else { event.currentTarget = listener.src; event.phase = listener.capture ? 'capture' : (event.target == listener.src ? 'target' : 'bubble'); if (event.phase != 'capture' || event.target != listener.src) { result = listener.handleEvent(event) !== false; } } !result && event.preventDefault(); result = result && !event.canceled; jbx.events.dropEvent(event,'BrowserEvent'); return result; };
jbx.events.listen = function (src, type, callback, scope, capture) { var id = null, list = null, listener = null; if (jbx.isArray(type)) { for (var i=0, l=type.length; i<l; i++) { jbx.events.listen(src, type[i], callback, scope); } } else { scope = scope || src; capture = !!capture; src = jbx.dom.getElement(src); if (!src || !callback) { return; } id = jbx.getUniqueId(src); list = jbx.events._listeners; list[capture] = list[capture] || {}; list[capture][type] = list[capture][type] || {}; list[capture][type][id] = list[capture][type][id] || []; list = list[capture][type][id]; for (var i=0, l=list.length; i<l; i++) { if (list[i].callback == callback && list[i].scope == scope) { return list[i].id; } } listener = jbx.events._getListener(src, type, callback, scope, capture); if (!src.isDispatcher) { if (src.addEventListener) { src.addEventListener(type, listener.handleBrowserEvent, capture); } else  { src.attachEvent("on" + type, listener.handleBrowserEvent); } } list.push(listener); } };
jbx.events.unlisten = function(src, type, callback, scope, capture) { var id = null, list = null, handler = null, listener = null; if (type.length && typeof type.splice != 'undefined') { for (var i=0, l=type.length; i<l; i++) { jbx.events.unlisten(src, type[i], callback, scope, capture); } } else { scope = scope || src; capture = !!capture; src = jbx.dom.getElement(src); if (!src) { return; } id = jbx.getUniqueId(src); list = jbx.events._listeners; list[capture] = list[capture] || {}; list[capture][type] = list[capture][type] || {}; list[capture][type][id] = list[capture][type][id] || []; list = list[capture][type][id]; for (var i=0, l=list.length; i<l; i++) { if (!callback || (list[i].callback == callback && list[i].scope == scope)) { listener = list[i]; src = listener.src; type = listener.type; capture = listener.capture; handler = listener.handleBrowserEvent; list.splice(i, 1); if (!src.isDispatcher) { if (src.removeEventListener) { src.removeEventListener(type, handler, capture); } else  { src.detachEvent("on" + type, handler); } } jbx.events.dropEvent(listener,'Listener'); } } } };
jbx.events.unlistenByType = function(src, type) { src = jbx.dom.getElement(src); for (var phase in jbx.events._listeners) { jbx.events.unlisten(src, type, null, null, phase); } };
jbx.events.unlistenAll = function(src) { src = jbx.dom.getElement(src); for (var phase in jbx.events._listeners) { for (var type in jbx.events._listeners[phase]) { jbx.events.unlisten(src, type, null, null, phase); } } };
jbx.events.dispatch = function (src, e) { var targets = [], result = true, current = null, newevent = jbx.isString(e), fireCapture = true in jbx.events._listeners, fireBubbling = false in jbx.events._listeners; e = newevent ? jbx.events.getEvent(e,src) : e; e.target = !e.target || src.isDispatcher ? src : e.target; if (fireCapture) { current = src; while (current) { targets.push(current); current = current.parent; } for (var i=targets.length-1; i>0 && !e.stopped; i--) { result = jbx.events._fireListeners(targets[i], e.type, true, e) && result; } } if (!e.stopped) { result = jbx.events._fireListeners(src, e.type, false, e) && result; } if (fireBubbling && e.bubble && !e.stopped) { current = src.parent; while (current && !e.stopped) { result = jbx.events._fireListeners(current, e.type, false, e) && result; current = current.parent; } } !result && e.preventDefault(); result = result && !e.canceled; newevent && jbx.events.dropEvent(e,'Event'); return result; };

jbx.package('jbx.classes');
jbx.classes.has = function(el,name) { var re = new RegExp('(^|\\s+)' + name + '(\\s+|$)', 'g'); return re.test(el.className); };
jbx.classes.add = function(el, name) { if (!jbx.classes.has(el,name)) { if (el.className == '') { el.className = name; } else { el.className = [jbx.string.trim(el.className), name].join(' '); } } };
jbx.classes.remove = function(el, name) { var re = new RegExp('(^|\\s+)?' + name + '(\\s+|$)?','g'); el.className = jbx.string.trim(el.className.replace(re,' ')); };
jbx.classes.toggle = function(el, name) { if (jbx.classes.has(el,name)) { jbx.classes.remove(el,name); } else { jbx.classes.add(el,name); } };

jbx.package('jbx.userAgent');
jbx.userAgent.getAgentVersion = function(agent) { var re = null,  result = 0, matches = null; if (jbx.userAgent.OPERA && opera && opera.version) {  result = typeof opera.version == 'function' ? opera.version() : opera.version; } else { re = jbx.userAgent.IE ? /MSIE\s([^;]*)/ : (jbx.userAgent.GECKO ? /rv:([^\s\)]*)/ : (jbx.userAgent.WEBKIT ? /WebKit\/(\S+)/ : null)); matches = re && re.exec(agent); result = matches ? matches[1] : 0; } return parseFloat(result); };
jbx.userAgent.AGENT = navigator ? navigator.userAgent+'' : '';
jbx.userAgent.PLATFORM = navigator.platform;
jbx.userAgent.WEBKIT = jbx.userAgent.AGENT.indexOf('WebKit') != -1;
jbx.userAgent.OPERA = jbx.userAgent.AGENT.indexOf('Opera') == 0;
jbx.userAgent.GECKO = !jbx.userAgent.OPERA && !jbx.userAgent.WEBKIT && jbx.userAgent.AGENT.indexOf('Gecko') != -1;
jbx.userAgent.IE = !jbx.userAgent.OPERA && jbx.userAgent.AGENT.indexOf('MSIE') != -1;
jbx.userAgent.VERSION = jbx.userAgent.getAgentVersion(jbx.userAgent.AGENT);
jbx.userAgent.MAC = jbx.userAgent.PLATFORM.indexOf('Mac') != -1;
jbx.userAgent.WIN = jbx.userAgent.PLATFORM.indexOf('Win') != -1;
jbx.userAgent.LINUX = jbx.userAgent.PLATFORM.indexOf('Linux') != -1;

jbx.package('jbx.geom');
jbx.geom.Point = function (top,left) {  this.top = top || 0;  this.left = left || 0;  };
jbx.geom.Point.prototype.top = 0;
jbx.geom.Point.prototype.left = 0;
jbx.geom.Point.prototype.toString = function() { return "t: "+this.top+"\nl: "+this.left; };
jbx.geom.Point.prototype.clone = function() { return new jbx.geom.Point(this.top,this.left); };
jbx.geom.Point.prototype.equals = function(pt) { return pt && this.top == pt.top && this.left == pt.left; };
jbx.geom.Point.prototype.setCoordinate = function(top,left) { this.top = top || 0; this.left = left || 0; };
jbx.geom.Point.prototype.offset = function(ox, oy) { this.top += oy; this.left += ox; };
jbx.geom.Point.prototype.distance = function(pt) { var dx = this.left-pt.left, dy = this.top-pt.top; return Math.sqrt(dx*dx + dy*dy); };
jbx.geom.Point.prototype.add = function(pt) { var result = this.clone(); result.top = result.top+pt.top; result.left = result.left+pt.left; return result; };
jbx.geom.Point.prototype.subtract = function(pt) { var result = this.clone(); result.top = result.top-pt.top; result.left = result.left-pt.left; return result; };
jbx.geom.Point.prototype.globalToLocal = function(el) {  var pt = this.clone(), pos = jbx.style.getGlobalPosition(el); pt.top = pt.top-pos.top; pt.left = pt.left-pos.left; return pt; };
jbx.geom.Point.prototype.localToGlobal = function(el) { var pt = this.clone(), pos = jbx.style.getGlobalPosition(el); pt.top = this.top+pos.top;pt.left = this.left+pos.left; return pt; };

jbx.package('jbx.geom');
jbx.geom.Rect = function (top,left,width,height) {  jbx.geom.Rect.superClass.constructor.call(this,top,left); this.width = width || 0; this.height = height || 0; }; jbx.inherits(jbx.geom.Rect,jbx.geom.Point);
jbx.geom.Rect.prototype.width = 0;
jbx.geom.Rect.prototype.height = 0;
jbx.geom.Rect.prototype.toString = function() { return jbx.geom.Rect.superClass.toString.call(this)+"\nw: "+this.width+"\nh: "+this.height; };
jbx.geom.Rect.prototype.clone = function() { return new jbx.geom.Rect(this.top, this.left, this.width, this.height); };
jbx.geom.Rect.prototype.toBox = function() { return new jbx.geom.Box(this.top, this.left, this.height-this.top, this.width-this.left); };
jbx.geom.Rect.prototype.copy = function(rec) { this.setBounds(rec.top,rec.left,rec.width,rec.height); };
jbx.geom.Rect.prototype.setBounds = function(top,left,width,height) { this.setCoordinate(top,left); this.width = width || 0; this.height = height || 0; };
jbx.geom.Rect.prototype.equals = function(rect) { return rect && this.width == rect.width && this.heigh == rect.height && jbx.geom.Rect.superClass.equals.call(this,rect); };
jbx.geom.Rect.prototype.inflate = function(dx, dy) { this.top -= dy; this.left -= dx; this.width += dx*2; this.height += dy*2; };
jbx.geom.Rect.prototype.union = function(rect) { var nrect = new jbx.geom.Rect(0,0,0,0); nrect.top = Math.min(this.top, rect.top); nrect.left = Math.min(this.left, rect.left); nrect.width = Math.max(this.left+this.width, rect.left+rect.width) - nrect.left; nrect.height = Math.max(this.top+this.height, rect.top+rect.height) - nrect.top; return nrect; };
jbx.geom.Rect.prototype.intersection = function(rect) { var nrect = new jbx.geom.Rect(0,0,0,0), t = Math.max(this.top, rect.top), l = Math.max(this.left, rect.left), b = Math.min(this.top+this.height, rect.top+rect.height), r = Math.min(this.left+this.width, rect.left+rect.width); if (l<=r && t<=b) { nrect.top = t; nrect.left = t; nrect.width = r-l; nrect.height = b-t; } return nrect; };
jbx.geom.Rect.prototype.intersects = function(rect) { var t = Math.max(this.top, rect.top), l = Math.max(this.left, rect.left), b = Math.min(this.top+this.height, rect.top+rect.height), r = Math.min(this.left+this.width, rect.left+rect.width); return l<=r && t<=b; };
jbx.geom.Rect.contains = function(rect) { return this.left <= rect.left && this.top <= rect.top && this.left+this.width >= rect.left+rect.width && this.top+this.height >= rect.top+rect.height; };

jbx.package('jbx.geom');
jbx.geom.Box = function (top,left,bottom,right) { jbx.geom.Box.superClass.constructor.call(this,top,left); this.right = right || 0; this.bottom = bottom || 0; }; jbx.inherits(jbx.geom.Box,jbx.geom.Point);
jbx.geom.Box.prototype.right = 0;
jbx.geom.Box.prototype.bottom = 0;
jbx.geom.Box.prototype.toString = function() { return jbx.geom.Box.superClass.toString.call(this)+"\nb: "+this.bottom+"\nr: "+this.right; };
jbx.geom.Box.prototype.clone = function() { return new jbx.geom.Box(this.top, this.left, this.bottom, this.right); };
jbx.geom.Box.prototype.toRect = function() { return new jbx.geom.Rect(this.top, this.left, this.left+this.right, this.top+this.bottom); };
jbx.geom.Box.prototype.setBounds = function(top,left,bottom,right) { this.setCoordinate(top,left); this.right = right || 0; this.bottom = bottom || 0; };
jbx.geom.Box.prototype.setTopLeft = function(top,left) { this.setCoordinate(top,left); };
jbx.geom.Box.prototype.setBottomRight = function(top,left) {this.right = right || 0; this.bottom = bottom || 0; };
jbx.geom.Box.prototype.equals = function(box) { return rect && this.right == rect.right && this.bottom == rect.bottom && jbx.geom.Box.superClass.equals.call(this,box); };
jbx.geom.Box.contains = function(point) { return this.left <= point.left && this.top <= point.top && this.right >= point.left && this.bottom >= pont.top; };

jbx.package('jbx.base');
jbx.base.Object = function() { };
jbx.base.Object.superClass = null;
jbx.base.Object.prototype.free = function () { };

jbx.package('jbx.base');
jbx.base.EventDispatcher = function() { jbx.base.EventDispatcher.superClass.constructor.call(this); };
jbx.inherits(jbx.base.EventDispatcher,jbx.base.Object);
jbx.base.EventDispatcher.prototype.isDispatcher = true;
jbx.base.EventDispatcher.prototype.addEventListener = function (type, callback, scope, capture) { jbx.events.listen(this, type, callback, scope || this, capture); };
jbx.base.EventDispatcher.prototype.removeEventListener = function (type, callback, scope, capture) { jbx.events.unlisten(this, type, callback, scope || this, capture); };
jbx.base.EventDispatcher.prototype.dispatch = function (e) { return jbx.events.dispatch(this, e); };
jbx.base.EventDispatcher.prototype.free = function () { jbx.events.unlistenAll(this); jbx.base.EventDispatcher.superClass.free.call(this); };

jbx.package('jbx.events');
jbx.events.Event = function (type, target, bubble) {  this.initialize(type, target, bubble); };
jbx.inherits(jbx.events.Event,jbx.base.Object);
jbx.events.Event.prototype.type = null;
jbx.events.Event.prototype.phase = null;
jbx.events.Event.prototype.target = null;
jbx.events.Event.prototype.bubble = true;
jbx.events.Event.prototype.killed = false;
jbx.events.Event.prototype.stopped = false;
jbx.events.Event.prototype.canceled = false;
jbx.events.Event.prototype.fireInline = true;
jbx.events.Event.prototype.currentTarget = null;
jbx.events.Event.prototype.initialize = function(type, target, bubble) { this.type = type; this.target = target; this.currentTarget = target; this.bubble = bubble !== false ? true : false;  this.phase = null; this.killed = false; this.stopped = false; this.canceled = false; };
jbx.events.Event.prototype.stopPropagation = function() { this.stopped = true; };
jbx.events.Event.prototype.stopImmediatePropagation = function() { this.killed = true; this.stopPropagation(); };
jbx.events.Event.prototype.preventDefault = function() { this.canceled = true; };
jbx.events.Event.prototype.free = function() { this.type = null; this.phase = null; this.target = null; this.currentTarget = null; jbx.events.Event.superClass.free.call(this); };

jbx.package('jbx.events');
jbx.events.BrowserEvent = function (e) { e && this.initialize(e); };
jbx.inherits(jbx.events.BrowserEvent, jbx.events.Event);
jbx.events.BrowserEvent.prototype.event = null;
jbx.events.BrowserEvent.prototype.keyCode = null;
jbx.events.BrowserEvent.prototype.charCode = null;
jbx.events.BrowserEvent.prototype.altKey = false;
jbx.events.BrowserEvent.prototype.ctrlKey = false;
jbx.events.BrowserEvent.prototype.metaKey = false;
jbx.events.BrowserEvent.prototype.shiftKey = false;
jbx.events.BrowserEvent.prototype.screenX = 0;
jbx.events.BrowserEvent.prototype.screenY = 0;
jbx.events.BrowserEvent.prototype.offsetX = 0;
jbx.events.BrowserEvent.prototype.offsetY = 0;
jbx.events.BrowserEvent.prototype.clientX = 0;
jbx.events.BrowserEvent.prototype.clientY = 0;
jbx.events.BrowserEvent.prototype.button = 0;
jbx.events.Event.prototype.fireInline = false;
jbx.events.BrowserEvent.prototype.relatedTarget = null;
jbx.events.BrowserEvent.prototype.buttons = null;
jbx.events.BrowserEvent._buttonMap = jbx.userAgent.IE ? {1:1,4:2,2:3} : {0:1,1:2,2:3};
jbx.events.BrowserEvent.prototype.initialize = function(e) { var target = e.target || e.srcElement;  jbx.events.BrowserEvent.superClass.initialize.call(this, e.type); this.event = e;  this.target = jbx.dom.resolveNode(target, 'parentNode'); this.currentTarget = this.target; this.relatedTarget = e.relatedTarget; if (!this.relatedTarget) { if (this.type == "mouseover") { this.relatedTarget = e.fromElement; } else if (this.type == "mouseout") { this.relatedTarget = e.toElement; } }  this.keyCode = e.keyCode || 0; this.charCode = (this.type != "keyup" && this.type != "keydown" && e.charCode) || (this.type == "keypress" ? e.keyCode : 0); this.altKey = e.altKey; this.ctrlKey = e.ctrlKey; this.metaKey = e.metaKey; this.shiftKey = e.shiftKey; this.screenX = e.screenX || 0; this.screenY = e.screenY || 0; this.offsetX = typeof e.layerX != "undefined" ? e.layerX : (e.offsetX || 0); this.offsetY = typeof e.layerY != "undefined" ? e.layerY : (e.offsetY || 0); this.clientX = typeof e.clientX != "undefined" ? e.clientX : (e.pageX || 0); this.clientY = typeof e.clientY != "undefined" ? e.clientY : (e.pageY || 0); this.button = jbx.events.BrowserEvent._buttonMap[e.button] || e.which || 0; this.buttons = {}; this.buttons.left = this.button == 1; this.buttons.middle = this.button == 2; this.buttons.right = this.button == 3; };
jbx.events.BrowserEvent.prototype.stopPropagation = function () {jbx.events.BrowserEvent.superClass.stopPropagation.call(this); if(this.event.stopPropagation){ this.event.stopPropagation(); }else{ this.event.cancelBubble = true; } };
jbx.events.BrowserEvent.prototype.preventDefault = function () { jbx.events.BrowserEvent.superClass.preventDefault.call(this); if(this.event.preventDefault){ this.event.preventDefault(); }else{ this.event.returnValue = false; } };
jbx.events.BrowserEvent.prototype.free = function() { this.event = null; this.buttons = null; this.relatedTarget = null; jbx.events.BrowserEvent.superClass.free.call(this); };

jbx.package('jbx.events');
jbx.events.DragDropEvent = function (type,target,dragger,drop,cx,cy,dx,dy,ox,oy) { this.initialize(type,target,dragger,drop,cx,cy,dx,dy,ox,oy); };
jbx.inherits(jbx.events.DragDropEvent, jbx.events.Event);
jbx.events.DragDropEvent.prototype.dragElement = null;
jbx.events.DragDropEvent.prototype.dropTarget = null;
jbx.events.DragDropEvent.prototype.clientX = 0;
jbx.events.DragDropEvent.prototype.clientY = 0;
jbx.events.DragDropEvent.prototype.distanceX = 0;
jbx.events.DragDropEvent.prototype.distanceY = 0;
jbx.events.DragDropEvent.prototype.offsetX = 0;
jbx.events.DragDropEvent.prototype.offsetY = 0;
jbx.events.DragDropEvent.prototype.initialize = function(type,target,dragger,drop,cx,cy,dx,dy,ox,oy) { jbx.events.DragDropEvent.superClass.initialize.call(this,type,target,false); this.dragElement = dragger; this.dropTarget = drop; this.clientX = cx || 0; this.clientY = cy || 0; this.offsetX = ox || 0; this.offsetY = oy || 0; this.distanceX = dx || 0; this.distanceY = dy || 0; };
jbx.events.DragDropEvent.prototype.free = function() { this.dropTarget = null; this.dragElement = null; jbx.events.DragDropEvent.superClass.free.call(this); };

jbx.package('jbx.events');
jbx.events.Listener = function (src, type, callback, scope, capture) { this.initialize(src, type, callback, scope, capture); };
jbx.inherits(jbx.events.Listener,jbx.base.Object);
jbx.events.Listener.prototype.src = null;
jbx.events.Listener.prototype.type = '';
jbx.events.Listener.prototype.scope = null;
jbx.events.Listener.prototype.capture = false;
jbx.events.Listener.prototype.callback = null;
jbx.events.Listener.prototype.initialize = function(src, type, callback, scope, capture) { this.src = src; this.type = type; this.scope = scope || src; this.capture = !!capture; this.callback = callback; };
jbx.events.Listener.prototype.handleEvent = function(e) { return this.callback.call(this.scope, e); };
jbx.events.Listener.prototype.handleBrowserEvent = function(e) { return jbx.events._handleBrowserEvent(this, e); };
jbx.events.Listener.prototype.free = function() { this.src = null; this.scope = null; this.callback = null; jbx.events.Listener.superClass.free.call(this); };

jbx.package('jbx.base');
jbx.base.Component = function(id) { jbx.base.Component.superClass.constructor.call(this); this.setId(id); };
jbx.inherits(jbx.base.Component,jbx.base.EventDispatcher);
jbx.base.Component.prototype.id = '';
jbx.base.Component.prototype.className = 'jbx-base-Component';
jbx.base.Component.prototype.free = function () { jbx.manager.componentManager.unregister(this); jbx.base.Component.superClass.free.call(this); };
jbx.base.Component.prototype.setId = function(id) { if (!jbx.isEmpty(this.id)) { jbx.manager.componentManager.unregister(this); } if (jbx.isEmpty(id) || jbx.manager.componentManager.get(id)) { id = jbx.manager.componentManager.getUniqueId(this); } this.id = id; jbx.manager.componentManager.register(this); };

jbx.package('jbx.base');
jbx.base.Control = function(el) { this._initElement(el); jbx.base.Control.superClass.constructor.call(this,this.element.id); this._initControl(); this._initARIA(); this._initClasses(); jbx.base.Control._setListeners && this._initListeners(); };
jbx.inherits(jbx.base.Control,jbx.base.Component);
jbx.base.Control.prototype.free = function () { this.endDrag(); this.setParent(null); this.element.parentNode && this.element.parentNode.removeChild(this.element); this.element = null; this.content = null; this._dragdrop = null; this._dragOffset = null; this._dragPosition = null; jbx.base.Control.superClass.free.call(this); };
jbx.base.Control._setListeners = true;
jbx.base.Control.State = { DOWN: 1, HOVER: 2, MIXED: 4, HIDDEN: 8, OPENED: 16, ACTIVE: 32, CHECKED: 64,PRESSED: 128, FOCUSED: 256, SELECTED: 512, DISABLED: 1024, READONLY: 2048, DRAGGING: 4096, COLLAPSED: 8192, MAXIMIZED: 16384 };
jbx.base.Control._StateClassName = { 1: 'down', 2: 'hover', 4: 'mixed', 8: 'hidden',16: 'opened', 32: 'active', 64: 'checked', 128: 'pressed', 256: 'focused', 512: 'selected', 1024: 'disabled', 2048: 'readonly', 4096: 'dragging', 8192: 'collapsed', 16384: 'maximized' };
jbx.base.Control._ARIAStateName = { 1: ['pressed',true,false], 2: false, 4: ['checked','mixed',false], 8: ['hidden',true,null], 16: ['expanded',true,false], 32: false, 64: ['checked',true,false],128: ['pressed',true,false], 256: false, 512: ['selected',true,false], 1024: ['disabled',true,null], 2048: ['readonly',true,null], 4096: ['grabbed',true,false], 8192: ['expanded',false,true], 16384: false };
jbx.base.Control.prototype.role = 'widget';
jbx.base.Control.prototype.className = 'jbx-base-Control';
jbx.base.Control.prototype.element = null;
jbx.base.Control.prototype.content = null;
jbx.base.Control.prototype.parent = null;
jbx.base.Control.prototype._dragdrop = null;
jbx.base.Control.prototype._dragThreshold = 5;
jbx.base.Control.prototype._dragOffset = null;
jbx.base.Control.prototype._dragPosition = null;
jbx.base.Control.prototype._canSetFocusable = true;
jbx.base.Control.prototype._controlState = 0;
jbx.base.Control.prototype._visibleStyle = '';
jbx.base.Control.prototype._supportedStates = jbx.base.Control.State.HOVER | jbx.base.Control.State.HIDDEN | jbx.base.Control.State.PRESSED | jbx.base.Control.State.DISABLED;
jbx.base.Control.prototype._createElement = function() { return jbx.dom.createElement('DIV'); };
jbx.base.Control.prototype._toggleStateClassName = function(method, name) { name = this.className+'-'+name; jbx.classes[method](this.element, name); this.content && this.content != this.element && jbx.classes[method](this.content, name); };
jbx.base.Control.prototype._initElement = function(el) { this.element = jbx.dom.getElement(el) || this._createElement(); jbx.classes.add(this.element,this.className);  this.content = this.element; this.parent = null; };
jbx.base.Control.prototype._initControl = function() { this._getStructure(this.element); this.setFocusable(true); };
jbx.base.Control.prototype._initARIA = function() { var prop = null, aria = null; this.setARIARole(this.role); for (var state in jbx.base.Control._ARIAStateName) { aria = jbx.base.Control._ARIAStateName[state]; if (aria && this._isSupportedState(state)) { this.setARIAAttribute(aria[0],aria[2]); } } };
jbx.base.Control.prototype._initClasses = function() { var cssn = '', el = this.element, classes = el.className ? el.className.split(' ') : []; for (var i=0, l=classes.length; i<l; i++) { cssn = jbx.string.trim(classes[i]); this._detectClassName(cssn); } };
jbx.base.Control.prototype._initListeners = function() { this._setMouseListeners(true); if (this._canSetFocusable) { this._setKeyListeners(true); this._setFocusListeners(true); }};
jbx.base.Control.prototype._detectElement = function(el) { if (jbx.classes.has(el,this.className+'-(body|wrapper|content|label|caption)')) { this._setContentElement(el); } };
jbx.base.Control.prototype._detectClassName = function(name) { var aria = null, state = null, setter = null, regex = new RegExp(this.className+'-(.+)','i'); if (regex.test(name)) { name = RegExp.$1; setter = 'set'+jbx.string.toUcFirst(name); state = jbx.base.Control.State[name.toUpperCase()]; aria = jbx.base.Control._ARIAStateName[state]; if (jbx.isFunction(this[setter])) { this[setter](aria ? !!aria[1] : true); } } };
jbx.base.Control.prototype._isSupportedState = function(state,value) { var result = !!(this._supportedStates & state); result = result && (jbx.isNull(value) || this._getState(state) != value); return result; };
jbx.base.Control.prototype._getStructure = function(el) { var classes = [], child = jbx.dom.firstChild(el); while (child) { this._detectElement(child); child = jbx.dom.nextElement(child); } };
jbx.base.Control.prototype._getState = function(state) { return !!(this._controlState & state); };
jbx.base.Control.prototype._setContentElement = function(el) { if (this.content) { this.setARIARole('presentation'); } this.content = el; this._getStructure(el); };
jbx.base.Control.prototype._setKeyListeners = function(value) { var method = value ? 'listen' : 'unlisten'; jbx.events[method](this.element, 'keyup', this._onKeyup, this); jbx.events[method](this.element, 'keydown', this._onKeydown, this); jbx.events[method](this.element, 'keypress', this._onKeypress, this); };
jbx.base.Control.prototype._setMouseListeners = function(value) { var method = value ? 'listen' : 'unlisten'; jbx.events[method](this.element, 'mouseup', this._onMouseup, this); jbx.events[method](this.element, 'mouseout', this._onMouseout, this); jbx.events[method](this.element, 'mousedown', this._onMousedown, this); jbx.events[method](this.element, 'mouseover', this._onMouseover, this); };
jbx.base.Control.prototype._setFocusListeners = function(value) { var method = value ? 'listen' : 'unlisten'; jbx.events[method](this.content, 'blur', this._onBlur, this); jbx.events[method](this.content, 'focus', this._onFocus, this); };
jbx.base.Control.prototype._setState = function(state,value) { var cssn = null, aria = null; value = !!value; if (this._isSupportedState(state, value)) { cssn = jbx.base.Control._StateClassName[state]; aria = jbx.base.Control._ARIAStateName[state]; cssn && this._toggleStateClassName(value ? 'add' : 'remove', cssn); aria && this.setARIAAttribute(aria[0],aria[value ? 1 : 2]); this._controlState = value ? this._controlState | state : this._controlState & ~state; } };
jbx.base.Control.prototype._canEnabled = function(value) { return this._isSupportedState(jbx.base.Control.State.DISABLED, !value) && (!value || this.isParentEnabled()); };
jbx.base.Control.prototype._canVisible = function(value) { return this._isSupportedState(jbx.base.Control.State.HIDDEN, !value); };
jbx.base.Control.prototype._canHover = function(value) { return this.isEnabled() && this._isSupportedState(jbx.base.Control.State.HOVER, value); };
jbx.base.Control.prototype._canFocused = function(value) { return (!value || this.isEnabled()) && (!value || this.isVisible()) && this._isSupportedState(jbx.base.Control.State.FOCUSED, value) && this.dispatch(value ? 'focus' : 'blur'); };
jbx.base.Control.prototype._canPressed = function(value) { return this._isSupportedState(jbx.base.Control.State.PRESSED, value); };
jbx.base.Control.prototype._canActive = function(value) { return (!value || this.isEnabled()) && (!value || this.isVisible()) && this._isSupportedState(jbx.base.Control.State.ACTIVE, value); };
jbx.base.Control.prototype._canStartDrag = function() {  var e = null, result = false; if (!this.isDragging()) { e = jbx.events.getDragDropEvent('startdrag',this,null,null,0,0,0,0,this._dragPosition.left,this._dragPosition.top); result = this.dispatch(e); jbx.events.dropEvent(e,'DragDropEvent'); } return result; };
jbx.base.Control.prototype._doEnabled = function(value) { if (!value) { this.setHover(false); this.setPressed(false); this.setActive(false); } this._setState(jbx.base.Control.State.DISABLED, !value); this.setFocusable(value); };
jbx.base.Control.prototype._doVisible = function(value) { this.element.style.display = value ? this._visibleStyle : 'none'; this._setState(jbx.base.Control.State.HIDDEN, !value); !value && this.setActive(false); };
jbx.base.Control.prototype._doHover = function(value) { this._setState(jbx.base.Control.State.HOVER, value); };
jbx.base.Control.prototype._doFocused = function(value) { value ? this.content.focus() : this.content.blur(); this._setState(jbx.base.Control.State.FOCUSED, value); value ? this.setActive(true) : this.setPressed(false); };
jbx.base.Control.prototype._doPressed = function(value) { this._setState(jbx.base.Control.State.PRESSED, value); value && this.setActive(true); };
jbx.base.Control.prototype._doActive = function(value) { this.parent._setActiveControl(this,value); this._setState(jbx.base.Control.State.ACTIVE, value); };
jbx.base.Control.prototype._doKeyEvent = function(e) { var action = e.keyCode == jbx.events.keyCodes.ENTER || e.keyCode == jbx.events.keyCodes.SPACE; if (action) { if (e.type == 'keydown') { this.setPressed(true); } else { e.fireInline = true; this.isPressed() && this._onClick(e); this.setPressed(false); } return true; } if (this.isPressed() && e.keyCode == jbx.events.keyCodes.ESC) { this.setPressed(false); return true; } return false; };
jbx.base.Control.prototype._doStartDrag = function() { };
jbx.base.Control.prototype._doDragMove = function(cx,cy,dx,dy) { var e = jbx.events.getDragDropEvent('dragmove',this,this._dragdrop,null,cx,cy,dx,dy,this._dragOffset.left,this._dragOffset.top); this.dispatch(e); jbx.events.dropEvent(e,'DragDropEvent'); };
jbx.base.Control.prototype._doEndDrag = function() { var e = jbx.events.getDragDropEvent('enddrag',this,this._dragdrop,null,0,0,0,0,this._dragOffset.left,this._dragOffset.top); this.dispatch(e); jbx.events.dropEvent(e,'DragDropEvent'); };
jbx.base.Control.prototype._onFocus = function(e) { this._canFocused(true) ? this._doFocused(true) : e.preventDefault(); };
jbx.base.Control.prototype._onBlur = function(e) { this._canFocused(false); this._doFocused(false); };
jbx.base.Control.prototype._onKeydown = function(e) { if (this.isEnabled()) { this.dispatch(e); !e.canceled && this._doKeyEvent(e) && e.preventDefault(); } };
jbx.base.Control.prototype._onKeyup = function(e) {  if (this.isEnabled()) { this.dispatch(e); !e.canceled && this._doKeyEvent(e) && e.preventDefault(); } };
jbx.base.Control.prototype._onKeypress = function(e) { this.isEnabled() && this.dispatch(e); };
jbx.base.Control.prototype._onClick = function(e) { var type = e.type; if (this.isEnabled()) { e.type = 'click'; this.dispatch(e); e.type = type; } };
jbx.base.Control.prototype._onMouseover = function(e) { if (e.relatedTarget && !jbx.dom.contains(this.element, e.relatedTarget)) { this.dispatch(e); this.isEnabled() && this.setHover(true); } };
jbx.base.Control.prototype._onMouseout = function(e) { var dragtarget = null; if (this.isDraggable() && this.isPressed()) { dragtarget = this.getDragTarget(); if (jbx.dom.contains(dragtarget, e.target, this.element)) { this.startDrag(); e.preventDefault(); } jbx.events.unlisten(dragtarget,'mousemove',this._onMousemove,this); } if (!e.canceled && e.relatedTarget && !jbx.dom.contains(this.element, e.relatedTarget)) { this.dispatch(e); this.setPressed(false); this.setHover(false); } };
jbx.base.Control.prototype._onMousedown = function(e) { var scroll = null, dragtarget = null, clicktarget = e.target; if (this.isEnabled()) { this.dispatch(e); if (!e.canceled && e.buttons.left) { this.setPressed(true); if (this.isDraggable()) { dragtarget = this.getDragTarget(); if (jbx.dom.contains(dragtarget,clicktarget,this.element)) { scroll = jbx.dom.getDocumentScroll(dragtarget); this._dragOffset.setCoordinate(0, 0); this._dragPosition.setCoordinate(e.clientY + scroll.top, e.clientX + scroll.left); jbx.events.listen(dragtarget,'mousemove',this._onMousemove,this); e.preventDefault(); this.focus(); } } } } };
jbx.base.Control.prototype._onMouseup = function(e) { if (this.isDraggable()) { jbx.events.unlisten(this.getDragTarget(),'mousemove',this._onMousemove,this); if (this.isDragging()) { e.preventDefault(); this.endDrag(); } } if (!e.canceled && this.isEnabled()) { this.dispatch(e); if (!e.canceled) { if (this.isPressed() || !this._isSupportedState(jbx.base.Control.PRESSED)) { this._onClick(e); } this.setPressed(false); } } };
jbx.base.Control.prototype._onMousemove = function(e) { var el = this.getDragTarget(), scroll = jbx.dom.getDocumentScroll(el); dy = Math.abs(e.clientY + scroll.top - this._dragPosition.top), dx = Math.abs(e.clientX + scroll.left - this._dragPosition.left); if (dy+dx >= this._dragThreshold) { jbx.events.unlisten(el,'mousemove',this._onMousemove,this); this.startDrag(); this._dragdrop && this._onDragMove(e); } };
jbx.base.Control.prototype._onDragMove = function(e) { var dde = null, el = this._dragdrop, scroll = jbx.dom.getDocumentScroll(el), dy = e.clientY + scroll.top - this._dragPosition.top, dx = e.clientX + scroll.left - this._dragPosition.left, ey = parseInt(el.style.top), ex = parseInt(el.style.left); el.style.top = (ey+dy) + "px"; el.style.left = (ex+dx) + "px"; this._dragOffset.offset(dx, dy); this._dragPosition.setCoordinate(e.clientY + scroll.top, e.clientX + scroll.left); this._doDragMove(e.clientX,e.clientY,dx,dy); e.preventDefault(); };
jbx.base.Control.prototype.startDrag = function() { var doc = null; if (this._canStartDrag()) { this._setState(jbx.base.Control.State.DRAGGING, true); this._dragdrop = this.getDragElement(); doc = jbx.dom.getDocument(this._dragdrop); jbx.events.listen(doc,'mousemove',this._onDragMove,this); jbx.events.listen(doc,'mouseup',this.endDrag,this); this._doStartDrag(); } };
jbx.base.Control.prototype.endDrag = function() { var ey = 0, ex = 0, doc = null; if (this.isDragging()) { this._doEndDrag(); ey = parseInt(this._dragdrop.style.top); ex = parseInt(this._dragdrop.style.left); doc = jbx.dom.getDocument(this._dragdrop); this._setState(jbx.base.Control.State.DRAGGING, false); jbx.events.unlisten(doc,'mousemove',this._onDragMove,this); jbx.events.unlisten(doc,'mouseup',this._onDragEnd,this); this._dragdrop.parentNode.removeChild(this._dragdrop); this._dragdrop = null; this.setPressed(false); this.setHover(false); } };
jbx.base.Control.prototype.getDragTarget = function() { return this.content; };
jbx.base.Control.prototype.getDragElement = function() { var e = null, el = null, doc = jbx.dom.getDocument(this.element), rec = jbx.style.getBounds(this.element);  e = jbx.events.getDragDropEvent('customdragelement',this,null,null,rec.left,rec.top,rec.width,rec.height,this._dragPosition.left,this._dragPosition.top); this.dispatch(e); el = e.dragElement; jbx.events.dropEvent(e,'DragDropEvent');  if (!el) { el = this.element.cloneNode(true); el.style.position = "absolute"; el.style.top = (rec.top) + "px"; el.style.left = (rec.left) + "px"; el.style.width = rec.width + "px"; el.style.height = rec.height + "px"; el.style.zIndex = jbx.zIndex.TOP++; jbx.style.setStyle(el,'opacity',0.65); this.element.visibility = 'hidden'; } doc.body.insertBefore(el,doc.body.firstChild); return el; };
jbx.base.Control.prototype.isParentEnabled = function() { return !this.parent || !this.parent.isEnabled || this.parent.isEnabled(); };
jbx.base.Control.prototype.isParentVisible = function() { return !this.parent || (this.parent.isVisible ? this.parent.isVisible() : jbx.style.isVisible(this.parent)); };
jbx.base.Control.prototype.isDraggable = function() { return this._isSupportedState(jbx.base.Control.State.DRAGGING); };
jbx.base.Control.prototype.isFocusable = function() { return this._isSupportedState(jbx.base.Control.State.FOCUSED); };
jbx.base.Control.prototype.isEnabled = function() { return this.isParentEnabled() && !this._getState(jbx.base.Control.State.DISABLED); };
jbx.base.Control.prototype.isVisible = function() {  return this.isParentVisible() && !this._getState(jbx.base.Control.State.HIDDEN); };
jbx.base.Control.prototype.isHover = function() { return this._getState(jbx.base.Control.State.HOVER); };
jbx.base.Control.prototype.isDragging = function() { return this._getState(jbx.base.Control.State.DRAGGING); };
jbx.base.Control.prototype.isFocused = function() { return this._getState(jbx.base.Control.State.FOCUSED); };
jbx.base.Control.prototype.isPressed = function() { return this._getState(jbx.base.Control.State.PRESSED); };
jbx.base.Control.prototype.isActive = function() { return this._getState(jbx.base.Control.State.ACTIVE); };
jbx.base.Control.prototype.setId = function(id) { jbx.base.Control.superClass.setId.call(this,id); this.element.id = this.id; };
jbx.base.Control.prototype.setARIARole = function(role,el) { el = el || this.content; el.setAttribute('role', role); };
jbx.base.Control.prototype.setARIAAttribute = function(attr,value,el) { el = el || this.content; if (jbx.isNull(value)) { el.removeAttribute('aria-'+attr); } else { el.setAttribute('aria-'+attr,value); } };
jbx.base.Control.prototype.setDraggable = function(value) { var dt = this.getDragTarget(), state = jbx.base.Control.State.DRAGGING, aria = jbx.base.Control._ARIAStateName[state]; if (this.isDraggable() != value) { this._supportedStates = value ? this._supportedStates | state : this._supportedStates & ~state; if (value) { jbx.style.setUnselectable(dt,true); this.setARIAAttribute(aria[0],aria[2]); if (!this._dragPosition) { this._dragPosition = new jbx.geom.Point(0,0); } if (!this._dragOffset) { this._dragOffset = new jbx.geom.Point(0,0); } } else { this.endDrag(); this.setARIAAttribute(aria[0],null); } } };
jbx.base.Control.prototype.setFocusable = function(value) { var state = null; if (this._canSetFocusable && this.isFocusable() != value) { !value && this.blur(); state = jbx.base.Control.State.FOCUSED; value ? this.content.setAttribute('tabIndex', 0) : this.content.removeAttribute('tabIndex'); this._supportedStates = value ? this._supportedStates | state : this._supportedStates & ~state; } };
jbx.base.Control.prototype.setParent = function(value) { if (this.parent != value) { if (jbx.isNull(value) || value instanceof jbx.base.Container) { if (!jbx.isNull(this.parent)) { this.parent.removeChild(this); } if (!jbx.isNull(value)) { this._supportedStates |= jbx.base.Control.State.ACTIVE; value.appendChild(this); } else { this._supportedStates &= ~jbx.base.Control.State.ACTIVE; this.parent = null; } } else { this._supportedStates &= ~jbx.base.Control.State.ACTIVE; this.parent = value; } } };
jbx.base.Control.prototype.setContent = function(value) { this.content.innerHTML = value; };
jbx.base.Control.prototype.setEnabled = function(value) { this._canEnabled(value) && this._doEnabled(value); };
jbx.base.Control.prototype.setVisible = function(value) { this._canVisible(value) && this._doVisible(value); };
jbx.base.Control.prototype.setFocused = function(value) { this._canFocused(value) && this._doFocused(value); };
jbx.base.Control.prototype.setHover = function(value) { this._canHover(value) && this._doHover(value); };
jbx.base.Control.prototype.setPressed = function(value) { this._canPressed(value) && this._doPressed(value); };
jbx.base.Control.prototype.setActive = function(value) { this._canActive(value) && this._doActive(value); if (value) { jbx.focusedControl = this; } };
jbx.base.Control.prototype.setHidden = function(value) { this.setVisible(!value); };
jbx.base.Control.prototype.setDisabled = function(value) { this.setEnabled(!value); };
jbx.base.Control.prototype.show = function() { this.setVisible(true); };
jbx.base.Control.prototype.hide = function() { this.setVisible(false); };
jbx.base.Control.prototype.enable = function() { this.setEnabled(true); };
jbx.base.Control.prototype.disable = function() { this.setEnabled(false); };
jbx.base.Control.prototype.focus = function() { this.setFocused(true); };
jbx.base.Control.prototype.blur = function() { this.setFocused(false); };
jbx.base.Control.prototype.click = function() { this._onClick(new jbx.events.Event('click')); };

jbx.package('jbx.ctrl');
jbx.ctrl.Swf = function(el, source, width, height, attributes, parameters, variables) { jbx.ctrl.Swf.superClass.constructor.call(this,el); this.render(source, width, height, attributes, parameters, variables); };
jbx.inherits(jbx.ctrl.Swf,jbx.base.Control);
jbx.ctrl.Swf.prototype.free = function () { this.content.removeChild(this.content.firstChild); jbx.ctrl.Swf.superClass.free.call(this); };
jbx.ctrl.Swf.prototype.role = 'presentation';   // ?
jbx.ctrl.Swf.prototype.className = 'jbx-ctrl-Swf';
jbx.ctrl.Swf.prototype._canSetFocusable = false;
jbx.ctrl.Swf.prototype.render = function(source, width, height, attributes, parameters, variables) { var attrs = [], params = [], flashvars = []; variables = variables || {}; attributes = attributes || {}; parameters = parameters || {}; attributes['width'] = width+""; attributes['height'] = height+""; parameters['movie'] = source; attributes['id'] = this.id+'-object'; attributes['name'] = this.id+'-object'; attributes['align'] = attributes['align'] || "middle"; parameters['play'] = parameters['play'] || "true"; parameters['loop'] = parameters['loop'] || "true"; parameters['menu'] = parameters['menu'] || "false"; parameters['wmode'] = parameters['wmode'] || "window"; parameters['scale'] = parameters['scale'] || "showall"; parameters['quality'] = parameters['quality'] || "high"; parameters['bgcolor'] = parameters['bgcolor'] || "#ffffff"; parameters['allowscriptaccess'] = parameters['allowscriptaccess'] || "sameDomain"; for (var i in variables) { flashvars.push(i+'='+variables[i]); } if (flashvars.length) { parameters['flashvars'] = flashvars.join('&'); } else { if (parameters['flashvars']) { delete parameters['flashvars']; } } if (jbx.userAgent.IE) { attributes['classid'] = "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"; attributes['codebase'] = "http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0"; if (attributes['data']) { delete attributes['data']; } if (attributes['type']) { delete attributes['type']; } } else { attributes['data'] = source; attributes['type'] = 'application/x-shockwave-flash'; if (attributes['classid']) { delete attributes['classid']; } } for (var i in attributes) { attrs.push(i+'="'+attributes[i]+'"'); } for (var i in parameters) { params.push('<param name="'+i+'" value="'+parameters[i]+'" />'); } this.content.innerHTML = '<object'+(attrs.length ? " "+attrs.join(" ") : "")+'>'+(params.length ? params.join("") : '')+'</object>'; };

jbx.package('jbx.manager.componentManager');
jbx.manager.componentManager._counters = {};
jbx.manager.componentManager._components = {};
jbx.manager.componentManager.getUniqueId = function(obj) { var classname = obj.className.split('-').pop(); count = jbx.manager.componentManager._counters[classname] || 1, name = classname+''+count; while (jbx.manager.componentManager._components[name]) { count++; name = classname+''+count; } jbx.manager.componentManager._counters[classname] = count+1; return name; };
jbx.manager.componentManager.get = function(id) { return jbx.manager.componentManager._components[id]; };
jbx.manager.componentManager.register = function(com) { jbx.manager.componentManager._components[com.id] = com; };
jbx.manager.componentManager.unregister = function(com) { delete jbx.manager.componentManager._components[com.id]; };

/* -------------------------------------------------------------------------- */

jbx.package('jbx.fx');
jbx.fx.Tween = function(from,to,time,easing,paused) { jbx.fx.Tween.superClass.constructor.call(this); this.easing = easing || TEasing.easeNone; this.time = time || 1; this.from = from || 0; this.to = to || 0; paused || this.play(); };
jbx.inherits(jbx.fx.Tween,jbx.base.EventDispatcher);
jbx.fx.Tween.prototype.to = 0;
jbx.fx.Tween.prototype.from = 0;
jbx.fx.Tween.prototype.time = 0;
jbx.fx.Tween.prototype.value = 0;
jbx.fx.Tween.prototype.frames = 0;
jbx.fx.Tween.prototype.position = 0;
jbx.fx.Tween.prototype.easing = null;
jbx.fx.Tween.prototype.callback = null;
jbx.fx.Tween.prototype.play = function() { this.position = 0; this.frames = this.time > 0 ? Math.ceil(this.time * jbx.manager.tweenManager.fps) : 0; jbx.manager.tweenManager.add(this); this.step(1); };
jbx.fx.Tween.prototype.stop = function() { jbx.manager.tweenManager.remove(this); };
jbx.fx.Tween.prototype.step = function(frames) { var value = 0; if (this.position < this.frames || this.frames == 0) { this.position += frames; this.position = this.position >= 0 ? this.position : 0; this.position = this.position <= this.frames ? this.position : this.frames; this.value = this.easing(this.position, this.from, this.to-this.from, this.frames); this.callback(this); } else { this.stop(); } };

TEasing = { easeNone: function(t,b,c,d) { return c*t/d+b; }, easeIn: function (t,b,c,d) { return c*(t/=d)*t+b; }, easeOut: function (t,b,c,d) { return -c*(t/=d)*(t-2)+b; }, easeInOut: function (t,b,c,d) { return (t/=d/2) < 1 ? c/2*t*t+b : -c/2*((--t)*(t-2)-1)+b; } };
TEasing.Cubic = { easeIn: function (t,b,c,d) { return c*(t/=d)*t*t+b; }, easeOut: function (t,b,c,d) { return c*((t=t/d-1)*t*t+1)+b; }, easeInOut: function (t,b,c,d) { return (t/=d/2)<1 ? c/2*t*t*t+b : c/2*((t-=2)*t*t+2)+b; } };
TEasing.Quartic = { easeIn: function (t,b,c,d) { return c*(t/=d)*t*t*t+b; }, easeOut: function (t,b,c,d) { return -c*((t=t/d-1)*t*t*t-1)+b; }, easeInOut: function (t,b,c,d) { return (t/=d/2)<1 ? c/2*t*t*t*t+b : -c/2*((t-=2)*t*t*t-2)+b; } };
TEasing.Elastic = { easeIn: function (t,b,c,d,a,p) { if (t==0) { return b; } if ((t/=d)==1) { return b+c; } if (!p) { p=d*0.3; } if (!a || a < Math.abs(c)) { a = c; var s = p/4; } else { var s = p/(2*Math.PI)*Math.asin(c/a); } return -(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b; }, easeOut:    function (t,b,c,d,a,p) { if (t==0) { return b; } if ((t/=d)==1) { return b+c; } if (!p) { p=d*0.3; } if (!a || a < Math.abs(c)) { a = c; var s = p/4; } else { var s = p/(2*Math.PI)*Math.asin(c/a); } return a*Math.pow(2,-10*t)*Math.sin((t*d-s)*(2*Math.PI)/p)+c+b; }, easeInOut:  function (t,b,c,d,a,p) { if (t==0) { return b; } if ((t/=d/2)==2) { return b+c; } if (!p) { p=d*(0.3*1.5); } if ( !a || a < Math.abs(c) ) { a = c; var s = p/4; } else { var s = p/(2*Math.PI)*Math.asin(c/a); } if (t < 1) { return -0.5*(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b; } return a*Math.pow(2,-10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p)*0.5+c+b; } };
TEasing.Back = {easeIn: function (t,b,c,d,s) {  if (typeof s=='undefined') { s=1.70158; } return c*(t/=d)*t*((s+1)*t-s)+b; }, easeOut:    function (t,b,c,d,s) { if (typeof s=='undefined') { s=1.70158; } return c*((t=t/d-1)*t*((s+1)*t+s)+1)+b; }, easeInOut:  function (t,b,c,d,s) { if (typeof s=='undefined') { s=1.70158; } if ((t/=d/2)<1) { return c/2*(t*t*(((s*=(1.525))+1)*t-s))+b; } return c/2*((t-=2)*t*(((s*=(1.525))+1)*t+s)+2)+b; } };
TEasing.Bounce = { easeIn: function (t,b,c,d) { return c - TEasing.Bounce.easeOut(d-t,0,c,d)+b; }, easeOut: function (t,b,c,d) { if ((t/=d)<(1/2.75)) { return c*(7.5625*t*t)+b; } else if (t<(2/2.75)) { return c*(7.5625*(t-=(1.5/2.75))*t+0.75)+b; } else if (t<(2.5/2.75)) { return c*(7.5625*(t-=(2.25/2.75))*t+0.9375)+b; } return c*(7.5625*(t-=(2.625/2.75))*t+0.984375)+b; }, easeInOut:  function (t,b,c,d) { if (t<d/2) { return TEasing.Bounce.easeIn(t*2,0,c,d)*0.5+b; } return TEasing.Bounce.easeOut(t*2-d,0,c,d)*0.5+c*0.5+b; } };

jbx.package('jbx.manager.tweenManager');
jbx.manager.tweenManager.fps = 25;
jbx.manager.tweenManager.map = {};
jbx.manager.tweenManager.list = [];
jbx.manager.tweenManager.count = 0;
jbx.manager.tweenManager.timer = null;
jbx.manager.tweenManager.getId = function() {var man = jbx.manager.tweenManager; man.count++; return 'tween'+man.count; };
jbx.manager.tweenManager.add = function(tween) { var man = jbx.manager.tweenManager; if (!tween.id) { tween.id = man.getId(); }  man.map[tween.id] = tween; man.list.push(tween.id); man.start(); };
jbx.manager.tweenManager.remove = function(tween) { var man = jbx.manager.tweenManager, index = jbx.array.indexOf(man.list,tween.id); if (man.map[tween.id]) { delete man.map[tween.id]; } if (index >= 0) { man.list.splice(index,1); } man.list.length == 0 && man.stop(); };
jbx.manager.tweenManager.start = function() { var man = jbx.manager.tweenManager; if (!man.timer && man.list.length > 0) { var interval = Math.floor(1000 / man.fps); man.timer = setInterval(man.onTimer, interval); } };
jbx.manager.tweenManager.stop = function() { var man = jbx.manager.tweenManager; if (man.timer) { clearInterval(man.timer); man.timer = null; } };
jbx.manager.tweenManager.onTimer = function() {var man = jbx.manager.tweenManager;  for (var i = 0, c = man.list.length; i < c; i++) { var tween = man.map[man.list[i]]; tween && tween.step(1); } };

