123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968 |
- var UI = {};
- UI.Element = function () {};
- UI.Element.prototype = {
- setClass: function ( name ) {
- this.dom.className = name;
- return this;
- },
- setId: function ( name ) {
- this.dom.id = name;
- return this;
- },
- setStyle: function ( style, array ) {
- for ( var i = 0; i < array.length; i ++ ) {
- this.dom.style[ style ] = array[ i ];
- }
- },
- setTextContent: function ( value ) {
- this.dom.textContent = value;
- return this;
- }
- }
- // properties
- var properties = [ 'position', 'left', 'top', 'right', 'bottom', 'width', 'height', 'border', 'borderLeft',
- 'borderTop', 'borderRight', 'borderBottom', 'borderColor', 'display', 'overflow', 'margin', 'marginLeft', 'marginTop', 'marginRight', 'marginBottom', 'padding', 'paddingLeft', 'paddingTop', 'paddingRight', 'paddingBottom', 'color',
- 'backgroundColor', 'opacity', 'fontSize', 'fontWeight', 'textTransform', 'cursor' ];
- properties.forEach( function ( property ) {
- var method = 'set' + property.substr( 0, 1 ).toUpperCase() + property.substr( 1, property.length );
- UI.Element.prototype[ method ] = function () {
- this.setStyle( property, arguments );
- return this;
- };
- } );
- // events
- var events = [ 'KeyUp', 'KeyDown', 'MouseOver', 'MouseOut', 'Click', 'Change' ];
- events.forEach( function ( event ) {
- var method = 'on' + event;
- UI.Element.prototype[ method ] = function ( callback ) {
- this.dom.addEventListener( event.toLowerCase(), callback, false );
- return this;
- };
- } );
- // Panel
- UI.Panel = function () {
- UI.Element.call( this );
- var dom = document.createElement( 'div' );
- dom.className = 'Panel';
- dom.style.userSelect = 'none';
- dom.style.WebkitUserSelect = 'none';
- dom.style.MozUserSelect = 'none';
- this.dom = dom;
- return this;
- };
- UI.Panel.prototype = Object.create( UI.Element.prototype );
- UI.Panel.prototype.add = function () {
- for ( var i = 0; i < arguments.length; i ++ ) {
- this.dom.appendChild( arguments[ i ].dom );
- }
- return this;
- };
- UI.Panel.prototype.remove = function () {
- for ( var i = 0; i < arguments.length; i ++ ) {
- this.dom.removeChild( arguments[ i ].dom );
- }
- return this;
- };
- // Tabbed Panel
- UI.TabbedPanel = function () {
- UI.Panel.call( this );
- var header = new UI.Panel();
- header.setBorderBottom( '1px solid #ccc' );
- this.dom.appendChild( header.dom );
-
- this.header = header.dom;
- this.tabs = [];
- this.contents = [];
- return this;
- };
- UI.TabbedPanel.prototype = Object.create( UI.Panel.prototype );
- UI.TabbedPanel.prototype.add = function () {
- for ( var i = 0; i < arguments.length; i ++ ) {
- var tab = new UI.Text( arguments[ i ].name ).setColor( '#666' );
- tab.setPadding( '5px 10px' );
- tab.setBorder( '1px solid #ccc' );
- tab.setMargin( '0 0 -1px 5px' );
- this.header.appendChild( tab.dom );
- var content = arguments[ i ];
- this.dom.appendChild( content.dom );
- content.setDisplay( 'none' );
- this.tabs.push(tab);
- this.contents.push(content);
- var scope = this;
- tab.onClick( function() {
- for (var j in scope.contents ){
- scope.contents[j].setDisplay( 'none' );
- scope.tabs[j].setBorderBottom( '1px solid #ccc' );
- }
- content.setDisplay( ' block ');
- tab.setBorderBottom( '1px solid #eee' );
- } );
- }
- this.contents[0].setDisplay( 'block' );
- this.tabs[0].setBorderBottom( '1px solid #eee' );
- return this;
- };
- UI.TabbedPanel.prototype.remove = function () {
- return this;
- };
- // Text
- UI.Text = function ( text ) {
- UI.Element.call( this );
- var dom = document.createElement( 'span' );
- dom.className = 'Text';
- dom.style.cursor = 'default';
- dom.style.display = 'inline-block';
- dom.style.verticalAlign = 'top';
- this.dom = dom;
- this.setValue( text );
- return this;
- };
- UI.Text.prototype = Object.create( UI.Element.prototype );
- UI.Text.prototype.setValue = function ( value ) {
- if ( value !== undefined ) {
- this.dom.textContent = value;
- }
- return this;
- };
- // Input
- UI.Input = function () {
- UI.Element.call( this );
- var scope = this;
- var dom = document.createElement( 'input' );
- dom.className = 'Input';
- dom.style.padding = '2px';
- dom.style.marginTop = '-2px';
- dom.style.marginLeft = '-2px';
- dom.style.border = '1px solid #ccc';
- dom.addEventListener( 'keydown', function ( event ) {
- event.stopPropagation();
- }, false );
- this.dom = dom;
- return this;
- };
- UI.Input.prototype = Object.create( UI.Element.prototype );
- UI.Input.prototype.getValue = function () {
- return this.dom.value;
- };
- UI.Input.prototype.setValue = function ( value ) {
- this.dom.value = value;
- return this;
- };
- // TextArea
- UI.TextArea = function () {
- UI.Element.call( this );
- var scope = this;
- var dom = document.createElement( 'textarea' );
- dom.className = 'TextArea';
- dom.style.padding = '2px';
- dom.style.marginTop = '-2px';
- dom.style.marginLeft = '-2px';
- dom.style.border = '1px solid #ccc';
- dom.addEventListener( 'keydown', function ( event ) {
- event.stopPropagation();
- }, false );
- this.dom = dom;
- return this;
- };
- UI.TextArea.prototype = Object.create( UI.Element.prototype );
- UI.TextArea.prototype.getValue = function () {
- return this.dom.value;
- };
- UI.TextArea.prototype.setValue = function ( value ) {
- this.dom.value = value;
- return this;
- };
- // Select
- UI.Select = function () {
- UI.Element.call( this );
- var scope = this;
- var dom = document.createElement( 'select' );
- dom.className = 'Select';
- dom.style.width = '64px';
- dom.style.height = '16px';
- dom.style.border = '0px';
- dom.style.padding = '0px';
- this.dom = dom;
- return this;
- };
- UI.Select.prototype = Object.create( UI.Element.prototype );
- UI.Select.prototype.setMultiple = function ( boolean ) {
- this.dom.multiple = boolean;
- return this;
- };
- UI.Select.prototype.setOptions = function ( options ) {
- var selected = this.dom.value;
- while ( this.dom.children.length > 0 ) {
- this.dom.removeChild( this.dom.firstChild );
- }
- for ( var key in options ) {
- var option = document.createElement( 'option' );
- option.value = key;
- option.innerHTML = options[ key ];
- this.dom.appendChild( option );
- }
- this.dom.value = selected;
- return this;
- };
- UI.Select.prototype.getValue = function () {
- return this.dom.value;
- };
- UI.Select.prototype.setValue = function ( value ) {
- this.dom.value = value;
- return this;
- };
- // FancySelect
- UI.FancySelect = function () {
- UI.Element.call( this );
- var scope = this;
- var dom = document.createElement( 'div' );
- dom.className = 'FancySelect';
- dom.style.background = '#fff';
- dom.style.border = '1px solid #ccc';
- dom.style.padding = '0';
- dom.style.cursor = 'default';
- dom.style.overflow = 'auto';
- this.dom = dom;
- this.options = [];
- this.selectedKeys = null;
- return this;
- };
- UI.FancySelect.prototype = Object.create( UI.Element.prototype );
- UI.FancySelect.prototype.setOptions = function ( options ) {
- var scope = this;
- var changeEvent = document.createEvent( 'HTMLEvents' );
- changeEvent.initEvent( 'change', true, true );
- while ( scope.dom.children.length > 0 ) {
- scope.dom.removeChild( scope.dom.firstChild );
- }
- scope.options = [];
- var generateOptionCallback = function ( element, key ) {
- return function ( event ) {
- scope.selectedKeys = [key];
- scope.dom.dispatchEvent( changeEvent );
- }
- };
- for ( var key in options ) {
- var option = document.createElement( 'div' );
- option.style.padding = '4px';
- option.style.whiteSpace = 'nowrap';
- option.innerHTML = options[ key ];
- option.value = key;
- scope.dom.appendChild( option );
- scope.options.push( option );
- option.addEventListener( 'click', generateOptionCallback( option, key ), false );
- }
- return scope;
- };
- UI.FancySelect.prototype.getValue = function () {
- return this.selectedKeys;
- };
- UI.FancySelect.prototype.setValue = function ( keys ) {
- // must convert raw keys into string for compatibility with UI.Select
- // which uses string keys (initialized from options keys)
- keys = ( keys instanceof Array ) ? keys : [keys];
- for ( var i = 0; i < this.options.length; i ++ ) {
- this.options[ i ].style.backgroundColor = '';
- }
- for ( var i in keys ) {
- var key = keys[ i ] ? keys[ i ].toString() : keys[ i ];
- for ( var j = 0; j < this.options.length; j ++ ) {
- if ( this.options[ j ].value === key ) {
- this.options[ j ].style.backgroundColor = '#f0f0f0';
- }
- }
- }
- this.selectedKeys = keys;
- return this;
- };
- // Checkbox
- UI.Checkbox = function ( boolean ) {
- UI.Element.call( this );
- var scope = this;
- var dom = document.createElement( 'input' );
- dom.className = 'Checkbox';
- dom.type = 'checkbox';
- this.dom = dom;
- this.setValue( boolean );
- return this;
- };
- UI.Checkbox.prototype = Object.create( UI.Element.prototype );
- UI.Checkbox.prototype.getValue = function () {
- return this.dom.checked;
- };
- UI.Checkbox.prototype.setValue = function ( value ) {
- if ( value !== undefined ) {
- this.dom.checked = value;
- }
- return this;
- };
- // Color
- UI.Color = function () {
- UI.Element.call( this );
- var scope = this;
- var dom = document.createElement( 'input' );
- dom.className = 'Color';
- dom.style.width = '64px';
- dom.style.height = '16px';
- dom.style.border = '0px';
- dom.style.padding = '0px';
- dom.style.backgroundColor = 'transparent';
- try { dom.type = 'color'; } catch ( exception ) {}
- this.dom = dom;
- return this;
- };
- UI.Color.prototype = Object.create( UI.Element.prototype );
- UI.Color.prototype.getValue = function () {
- return this.dom.value;
- };
- UI.Color.prototype.getHexValue = function () {
- return parseInt( this.dom.value.substr( 1 ), 16 );
- };
- UI.Color.prototype.setValue = function ( value ) {
- this.dom.value = value;
- return this;
- };
- UI.Color.prototype.setHexValue = function ( hex ) {
- this.dom.value = "#" + ( '000000' + hex.toString( 16 ) ).slice( -6 );
- return this;
- };
- // Number
- UI.Number = function ( number ) {
- UI.Element.call( this );
- var scope = this;
- var dom = document.createElement( 'input' );
- dom.className = 'Number';
- dom.style.color = '#0080f0';
- dom.style.fontSize = '12px';
- dom.style.backgroundColor = 'transparent';
- dom.style.border = '1px solid transparent';
- dom.style.marginTop = '-2px';
- dom.style.marginLegt = '-2px';
- dom.style.padding = '2px';
- dom.style.cursor = 'col-resize';
- dom.value = '0.00';
- dom.addEventListener( 'keydown', function ( event ) {
- event.stopPropagation();
- }, false );
- this.min = - Infinity;
- this.max = Infinity;
- this.precision = 2;
- this.step = 1;
- this.dom = dom;
- this.setValue( number );
- var changeEvent = document.createEvent( 'HTMLEvents' );
- changeEvent.initEvent( 'change', true, true );
- var distance = 0;
- var onMouseDownValue = 0;
- var onMouseDown = function ( event ) {
- event.preventDefault();
- distance = 0;
- onMouseDownValue = parseFloat( dom.value );
- document.addEventListener( 'mousemove', onMouseMove, false );
- document.addEventListener( 'mouseup', onMouseUp, false );
- };
- var onMouseMove = function ( event ) {
- var currentValue = dom.value;
- var movementX = event.movementX || event.webkitMovementX || event.mozMovementX || 0;
- var movementY = event.movementY || event.webkitMovementY || event.mozMovementY || 0;
- distance += movementX - movementY;
- var number = onMouseDownValue + ( distance / ( event.shiftKey ? 5 : 50 ) ) * scope.step;
- dom.value = Math.min( scope.max, Math.max( scope.min, number ) ).toFixed( scope.precision );
- if ( currentValue !== dom.value ) dom.dispatchEvent( changeEvent );
- };
- var onMouseUp = function ( event ) {
- document.removeEventListener( 'mousemove', onMouseMove, false );
- document.removeEventListener( 'mouseup', onMouseUp, false );
- if ( Math.abs( distance ) < 2 ) {
- dom.focus();
- dom.select();
- }
- };
- var onChange = function ( event ) {
- var number = parseFloat( dom.value );
- if ( isNaN( number ) === false ) {
- dom.oldValue = dom.newValue;
- dom.newValue = number;
- dom.value = number;
- }
- };
- var onFocus = function ( event ) {
- dom.style.backgroundColor = '';
- dom.style.borderColor = '#ccc';
- dom.style.cursor = '';
- };
- var onBlur = function ( event ) {
- dom.style.backgroundColor = 'transparent';
- dom.style.borderColor = 'transparent';
- dom.style.cursor = 'col-resize';
- };
- dom.addEventListener( 'mousedown', onMouseDown, false );
- dom.addEventListener( 'change', onChange, false );
- dom.addEventListener( 'focus', onFocus, false );
- dom.addEventListener( 'blur', onBlur, false );
- return this;
- };
- UI.Number.prototype = Object.create( UI.Element.prototype );
- UI.Number.prototype.getValue = function () {
- return parseFloat( this.dom.value );
- };
- UI.Number.prototype.setValue = function ( value ) {
- if ( value !== undefined ) {
- this.dom.value = value.toFixed( this.precision );
- }
- return this;
- };
- UI.Number.prototype.setRange = function ( min, max ) {
- this.min = min;
- this.max = max;
- return this;
- };
- UI.Number.prototype.setPrecision = function ( precision ) {
- this.precision = precision;
- return this;
- };
- // Integer
- UI.Integer = function ( number ) {
- UI.Element.call( this );
- var scope = this;
- var dom = document.createElement( 'input' );
- dom.className = 'Number';
- dom.style.color = '#0080f0';
- dom.style.fontSize = '12px';
- dom.style.backgroundColor = 'transparent';
- dom.style.border = '1px solid transparent';
- dom.style.marginTop = '-2px';
- dom.style.marginLegt = '-2px';
- dom.style.padding = '2px';
- dom.style.cursor = 'col-resize';
- dom.value = '0.00';
- dom.addEventListener( 'keydown', function ( event ) {
- event.stopPropagation();
- }, false );
- this.min = - Infinity;
- this.max = Infinity;
- this.step = 1;
- this.dom = dom;
- this.setValue( number );
- var changeEvent = document.createEvent( 'HTMLEvents' );
- changeEvent.initEvent( 'change', true, true );
- var distance = 0;
- var onMouseDownValue = 0;
- var onMouseDown = function ( event ) {
- event.preventDefault();
- distance = 0;
- onMouseDownValue = parseFloat( dom.value );
- document.addEventListener( 'mousemove', onMouseMove, false );
- document.addEventListener( 'mouseup', onMouseUp, false );
- };
- var onMouseMove = function ( event ) {
- var currentValue = dom.value;
- var movementX = event.movementX || event.webkitMovementX || event.mozMovementX || 0;
- var movementY = event.movementY || event.webkitMovementY || event.mozMovementY || 0;
- distance += movementX - movementY;
- var number = onMouseDownValue + ( distance / ( event.shiftKey ? 5 : 50 ) ) * scope.step;
- dom.value = Math.min( scope.max, Math.max( scope.min, number ) ) | 0;
- if ( currentValue !== dom.value ) dom.dispatchEvent( changeEvent );
- };
- var onMouseUp = function ( event ) {
- document.removeEventListener( 'mousemove', onMouseMove, false );
- document.removeEventListener( 'mouseup', onMouseUp, false );
- if ( Math.abs( distance ) < 2 ) {
- dom.focus();
- dom.select();
- }
- };
- var onChange = function ( event ) {
- var number = parseInt( dom.value );
- if ( isNaN( number ) === false ) {
- dom.value = number;
- }
- };
- var onFocus = function ( event ) {
- dom.style.backgroundColor = '';
- dom.style.borderColor = '#ccc';
- dom.style.cursor = '';
- };
- var onBlur = function ( event ) {
- dom.style.backgroundColor = 'transparent';
- dom.style.borderColor = 'transparent';
- dom.style.cursor = 'col-resize';
- };
- dom.addEventListener( 'mousedown', onMouseDown, false );
- dom.addEventListener( 'change', onChange, false );
- dom.addEventListener( 'focus', onFocus, false );
- dom.addEventListener( 'blur', onBlur, false );
- return this;
- };
- UI.Integer.prototype = Object.create( UI.Element.prototype );
- UI.Integer.prototype.getValue = function () {
- return parseInt( this.dom.value );
- };
- UI.Integer.prototype.setValue = function ( value ) {
- if ( value !== undefined ) {
- this.dom.value = value | 0;
- }
- return this;
- };
- UI.Integer.prototype.setRange = function ( min, max ) {
- this.min = min;
- this.max = max;
- return this;
- };
- // Break
- UI.Break = function () {
- UI.Element.call( this );
- var dom = document.createElement( 'br' );
- dom.className = 'Break';
- this.dom = dom;
- return this;
- };
- UI.Break.prototype = Object.create( UI.Element.prototype );
- // HorizontalRule
- UI.HorizontalRule = function () {
- UI.Element.call( this );
- var dom = document.createElement( 'hr' );
- dom.className = 'HorizontalRule';
- this.dom = dom;
- return this;
- };
- UI.HorizontalRule.prototype = Object.create( UI.Element.prototype );
- // Button
- UI.Button = function ( value ) {
- UI.Element.call( this );
- var scope = this;
- var dom = document.createElement( 'button' );
- dom.className = 'Button';
- this.dom = dom;
- this.dom.textContent = value;
- return this;
- };
- UI.Button.prototype = Object.create( UI.Element.prototype );
- UI.Button.prototype.setLabel = function ( value ) {
- this.dom.textContent = value;
- return this;
- };
|