diff options
author | wei <> | 2007-02-13 00:39:17 +0000 |
---|---|---|
committer | wei <> | 2007-02-13 00:39:17 +0000 |
commit | c662da1a887f852e08bd34d643111239ea82a961 (patch) | |
tree | 03d18c61514dfe1c4480defa6f5b4283e74991af /framework/Web | |
parent | ecdb360eb1f34bdeb8d7d25160ba8ce4941bf66b (diff) |
Fix TImageButton bug in trunk http://www.pradosoft.com/forum/index.php/topic,6938.new.html for
Diffstat (limited to 'framework/Web')
-rw-r--r-- | framework/Web/Javascripts/js/compressed/prado.js | 3 | ||||
-rw-r--r-- | framework/Web/Javascripts/js/debug/prado.js | 3347 | ||||
-rw-r--r-- | framework/Web/Javascripts/prado/controls.js | 8 | ||||
-rw-r--r-- | framework/Web/UI/WebControls/TImageButton.php | 3 |
4 files changed, 1681 insertions, 1680 deletions
diff --git a/framework/Web/Javascripts/js/compressed/prado.js b/framework/Web/Javascripts/js/compressed/prado.js index 74e19278..a095c52d 100644 --- a/framework/Web/Javascripts/js/compressed/prado.js +++ b/framework/Web/Javascripts/js/compressed/prado.js @@ -358,7 +358,8 @@ doPostBack=onclicked;} if(doPostBack) this.onPostBack(event,options);if(typeof(onclicked)=="boolean"&&!onclicked) Event.stop(event);},onPostBack:function(event,options) -{Prado.PostBack(event,options);}};Prado.WebUI.TButton=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TLinkButton=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TCheckBox=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TBulletedList=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TImageMap=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TImageButton=Class.extend(Prado.WebUI.PostBackControl);Object.extend(Prado.WebUI.TImageButton.prototype,{hasXYInput:false,onPostBack:function(event,options) +{Prado.PostBack(event,options);}};Prado.WebUI.TButton=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TLinkButton=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TCheckBox=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TBulletedList=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TImageMap=Class.extend(Prado.WebUI.PostBackControl);Prado.WebUI.TImageButton=Class.extend(Prado.WebUI.PostBackControl);Object.extend(Prado.WebUI.TImageButton.prototype,{onInit:function(options) +{this.hasXYInput=false;},onPostBack:function(event,options) {if(!this.hasXYInput) {this.addXYInput(event,options);this.hasXYInput=true;} Prado.PostBack(event,options);},addXYInput:function(event,options) diff --git a/framework/Web/Javascripts/js/debug/prado.js b/framework/Web/Javascripts/js/debug/prado.js index 4e8fb26d..aa319e02 100644 --- a/framework/Web/Javascripts/js/debug/prado.js +++ b/framework/Web/Javascripts/js/debug/prado.js @@ -127,339 +127,340 @@ PeriodicalExecuter.prototype = { } - -/** - * Similar to bindAsEventLister, but takes additional arguments. - */ -Function.prototype.bindEvent = function() -{ - var __method = this, args = $A(arguments), object = args.shift(); - return function(event) - { - return __method.apply(object, [event || window.event].concat(args)); - } -} - -/** - * Creates a new function by copying function definition from - * the <tt>base</tt> and optional <tt>definition</tt>. - * @param function a base function to copy from. - * @param array additional definition - * @param function return a new function with definition from both - * <tt>base</tt> and <tt>definition</tt>. - */ -Class.extend = function(base, definition) -{ - var component = Class.create(); - Object.extend(component.prototype, base.prototype); - if(definition) - Object.extend(component.prototype, definition); - return component; -} - -/* - Base, version 1.0.2 - Copyright 2006, Dean Edwards - License: http://creativecommons.org/licenses/LGPL/2.1/ -*/ - -var Base = function() { - if (arguments.length) { - if (this == window) { // cast an object to this class - Base.prototype.extend.call(arguments[0], arguments.callee.prototype); - } else { - this.extend(arguments[0]); - } - } -}; - -Base.version = "1.0.2"; - -Base.prototype = { - extend: function(source, value) { - var extend = Base.prototype.extend; - if (arguments.length == 2) { - var ancestor = this[source]; - // overriding? - if ((ancestor instanceof Function) && (value instanceof Function) && - ancestor.valueOf() != value.valueOf() && /\bbase\b/.test(value)) { - var method = value; - // var _prototype = this.constructor.prototype; - // var fromPrototype = !Base._prototyping && _prototype[source] == ancestor; - value = function() { - var previous = this.base; - // this.base = fromPrototype ? _prototype[source] : ancestor; - this.base = ancestor; - var returnValue = method.apply(this, arguments); - this.base = previous; - return returnValue; - }; - // point to the underlying method - value.valueOf = function() { - return method; - }; - value.toString = function() { - return String(method); - }; - } - return this[source] = value; - } else if (source) { - var _prototype = {toSource: null}; - // do the "toString" and other methods manually - var _protected = ["toString", "valueOf"]; - // if we are prototyping then include the constructor - if (Base._prototyping) _protected[2] = "constructor"; - for (var i = 0; (name = _protected[i]); i++) { - if (source[name] != _prototype[name]) { - extend.call(this, name, source[name]); - } - } - // copy each of the source object's properties to this object - for (var name in source) { - if (!_prototype[name]) { - extend.call(this, name, source[name]); - } - } - } - return this; - }, - - base: function() { - // call this method from any other method to invoke that method's ancestor - } -}; - -Base.extend = function(_instance, _static) { - var extend = Base.prototype.extend; - if (!_instance) _instance = {}; - // build the prototype - Base._prototyping = true; - var _prototype = new this; - extend.call(_prototype, _instance); - var constructor = _prototype.constructor; - _prototype.constructor = this; - delete Base._prototyping; - // create the wrapper for the constructor function - var klass = function() { - if (!Base._prototyping) constructor.apply(this, arguments); - this.constructor = klass; - }; - klass.prototype = _prototype; - // build the class interface - klass.extend = this.extend; - klass.implement = this.implement; - klass.toString = function() { - return String(constructor); - }; - extend.call(klass, _static); - // single instance - var object = constructor ? klass : _prototype; - // class initialisation - if (object.init instanceof Function) object.init(); - return object; -}; - -Base.implement = function(_interface) { - if (_interface instanceof Function) _interface = _interface.prototype; - this.prototype.extend(_interface); -}; - -/* - * Signals and Slots for Prototype: Easy custom javascript events - * http://tetlaw.id.au/view/blog/signals-and-slots-for-prototype-easy-custom-javascript-events - * Andrew Tetlaw - * Version 1.2 (2006-06-19) - * - * http://creativecommons.org/licenses/by-sa/2.5/ - * -Signal = { - throwErrors : true, - MT : function(){ return true }, - connect : function(obj1, func1, obj2, func2, options) { - var options = Object.extend({ - connectOnce : false, - before : false, - mutate : function() {return arguments;} - }, options || {}); - if(typeof func1 != 'string' || typeof func2 != 'string') return; - - var sigObj = obj1 || window; - var slotObj = obj2 || window; - var signame = func1+'__signal_'; - var slotsname = func1+'__slots_'; - if(!sigObj[signame]) { - // having the slotFunc in a var and setting it by using an anonymous function in this way - // is apparently a good way to prevent memory leaks in IE if the objects are DOM nodes. - var slotFunc = function() { - var args = []; - for(var x = 0; x < arguments.length; x++){ - args.push(arguments[x]); - } - args = options.mutate.apply(null,args) - var result; - if(!options.before) result = sigObj[signame].apply(sigObj,arguments); //default: call sign before slot - sigObj[slotsname].each(function(slot){ - try { - if(slot && slot[0]) { // testing for null, a disconnect may have nulled this slot - slot[0][slot[1]].apply(slot[0],args); //[0] = obj, [1] = func name - } - } catch(e) { - if(Signal.throwErrors) throw e; - } - }); - if(options.before) result = sigObj[signame].apply(sigObj,arguments); //call slot before sig - return result; //return sig result - }; - (function() { - sigObj[slotsname] = $A([]); - sigObj[signame] = sigObj[func1] || Signal.MT; - sigObj[func1] = slotFunc; - })(); - } - var con = (sigObj[slotsname].length > 0) ? - (options.connectOnce ? !sigObj[slotsname].any(function(slot) { return (slot[0] == slotObj && slot[1] == func2) }) : true) : - true; - if(con) { - sigObj[slotsname].push([slotObj,func2]); - } - }, - connectOnce : function(obj1, func1, obj2, func2, options) { - Signal.connect(obj1, func1, obj2, func2, Object.extend(options || {}, {connectOnce : true})) - }, - disconnect : function(obj1, func1, obj2, func2, options) { - var options = Object.extend({ - disconnectAll : false - }, options || {}); - if(typeof func1 != 'string' || typeof func2 != 'string') return; - - var sigObj = obj1 || window; - var slotObj = obj2 || window; - var signame = func1+'__signal_'; - var slotsname = func1+'__slots_'; - - // I null them in this way so that any currectly active signal will read a null slot, - // otherwise the slot will be applied even though it's been disconnected - if(sigObj[slotsname]) { - if(options.disconnectAll) { - sigObj[slotsname] = sigObj[slotsname].collect(function(slot) { - if(slot[0] == slotObj && slot[1] == func2) { - slot[0] = null; - return null; - } else { - return slot; - } - }).compact(); - } else { - var idx = -1; - sigObj[slotsname] = sigObj[slotsname].collect(function(slot, index) { - if(slot[0] == slotObj && slot[1] == func2 && idx < 0) { //disconnect first match - idx = index; - slot[0] = null; - return null; - } else { - return slot; - } - }).compact(); - } - } - }, - disconnectAll : function(obj1, func1, obj2, func2, options) { - Signal.disconnect(obj1, func1, obj2, func2, Object.extend(options || {}, {disconnectAll : true})) - } -} -*/ - -/* - Tests - -// 1. Simple Test 1 "hello Fred" should trigger "Fred is a stupid head" - - - sayHello = function(n) { - alert("Hello! " + n); - } - moron = function(n) { - alert(n + " is a stupid head"); - } - Signal.connect(null,'sayHello',null,'moron'); - - onclick="sayHello('Fred')" - - -// 2. Simple Test 2 repeated insults about Fred - - - Signal.connect(null,'sayHello2',null,'moron2'); - Signal.connect(null,'sayHello2',null,'moron2'); - Signal.connect(null,'sayHello2',null,'moron2'); - - -// 3. Simple Test 3 multiple insults about Fred - - - Signal.connect(null,'sayHello3',null,'moron3'); - Signal.connect(null,'sayHello3',null,'bonehead3'); - Signal.connect(null,'sayHello3',null,'idiot3'); - - -// 4. Simple Test 4 3 insults about Fred first - 3 then none - - - Signal.connect(null,'sayHello4',null,'moron4'); - Signal.connect(null,'sayHello4',null,'moron4'); - Signal.connect(null,'sayHello4',null,'moron4'); - Signal.disconnect(null,'sayHello4',null,'moron4'); - Signal.disconnect(null,'sayHello4',null,'moron4'); - Signal.disconnect(null,'sayHello4',null,'moron4'); +
+/**
+ * Similar to bindAsEventLister, but takes additional arguments.
+ */
+Function.prototype.bindEvent = function()
+{
+ var __method = this, args = $A(arguments), object = args.shift();
+ return function(event)
+ {
+ return __method.apply(object, [event || window.event].concat(args));
+ }
+}
+
+/**
+ * Creates a new function by copying function definition from
+ * the <tt>base</tt> and optional <tt>definition</tt>.
+ * @param function a base function to copy from.
+ * @param array additional definition
+ * @param function return a new function with definition from both
+ * <tt>base</tt> and <tt>definition</tt>.
+ */
+Class.extend = function(base, definition)
+{
+ var component = Class.create();
+ Object.extend(component.prototype, base.prototype);
+ if(definition)
+ Object.extend(component.prototype, definition);
+ return component;
+}
+
+/*
+ Base, version 1.0.2
+ Copyright 2006, Dean Edwards
+ License: http://creativecommons.org/licenses/LGPL/2.1/
+*/
+
+var Base = function() {
+ if (arguments.length) {
+ if (this == window) { // cast an object to this class
+ Base.prototype.extend.call(arguments[0], arguments.callee.prototype);
+ } else {
+ this.extend(arguments[0]);
+ }
+ }
+};
+
+Base.version = "1.0.2";
+
+Base.prototype = {
+ extend: function(source, value) {
+ var extend = Base.prototype.extend;
+ if (arguments.length == 2) {
+ var ancestor = this[source];
+ // overriding?
+ if ((ancestor instanceof Function) && (value instanceof Function) &&
+ ancestor.valueOf() != value.valueOf() && /\bbase\b/.test(value)) {
+ var method = value;
+ // var _prototype = this.constructor.prototype;
+ // var fromPrototype = !Base._prototyping && _prototype[source] == ancestor;
+ value = function() {
+ var previous = this.base;
+ // this.base = fromPrototype ? _prototype[source] : ancestor;
+ this.base = ancestor;
+ var returnValue = method.apply(this, arguments);
+ this.base = previous;
+ return returnValue;
+ };
+ // point to the underlying method
+ value.valueOf = function() {
+ return method;
+ };
+ value.toString = function() {
+ return String(method);
+ };
+ }
+ return this[source] = value;
+ } else if (source) {
+ var _prototype = {toSource: null};
+ // do the "toString" and other methods manually
+ var _protected = ["toString", "valueOf"];
+ // if we are prototyping then include the constructor
+ if (Base._prototyping) _protected[2] = "constructor";
+ for (var i = 0; (name = _protected[i]); i++) {
+ if (source[name] != _prototype[name]) {
+ extend.call(this, name, source[name]);
+ }
+ }
+ // copy each of the source object's properties to this object
+ for (var name in source) {
+ if (!_prototype[name]) {
+ extend.call(this, name, source[name]);
+ }
+ }
+ }
+ return this;
+ },
+
+ base: function() {
+ // call this method from any other method to invoke that method's ancestor
+ }
+};
+
+Base.extend = function(_instance, _static) {
+ var extend = Base.prototype.extend;
+ if (!_instance) _instance = {};
+ // build the prototype
+ Base._prototyping = true;
+ var _prototype = new this;
+ extend.call(_prototype, _instance);
+ var constructor = _prototype.constructor;
+ _prototype.constructor = this;
+ delete Base._prototyping;
+ // create the wrapper for the constructor function
+ var klass = function() {
+ if (!Base._prototyping) constructor.apply(this, arguments);
+ this.constructor = klass;
+ };
+ klass.prototype = _prototype;
+ // build the class interface
+ klass.extend = this.extend;
+ klass.implement = this.implement;
+ klass.toString = function() {
+ return String(constructor);
+ };
+ extend.call(klass, _static);
+ // single instance
+ var object = constructor ? klass : _prototype;
+ // class initialisation
+ if (object.init instanceof Function) object.init();
+ return object;
+};
+
+Base.implement = function(_interface) {
+ if (_interface instanceof Function) _interface = _interface.prototype;
+ this.prototype.extend(_interface);
+};
+
+/*
+ * Signals and Slots for Prototype: Easy custom javascript events
+ * http://tetlaw.id.au/view/blog/signals-and-slots-for-prototype-easy-custom-javascript-events
+ * Andrew Tetlaw
+ * Version 1.2 (2006-06-19)
+ *
+ * http://creativecommons.org/licenses/by-sa/2.5/
+ *
+Signal = {
+ throwErrors : true,
+ MT : function(){ return true },
+ connect : function(obj1, func1, obj2, func2, options) {
+ var options = Object.extend({
+ connectOnce : false,
+ before : false,
+ mutate : function() {return arguments;}
+ }, options || {});
+ if(typeof func1 != 'string' || typeof func2 != 'string') return;
+
+ var sigObj = obj1 || window;
+ var slotObj = obj2 || window;
+ var signame = func1+'__signal_';
+ var slotsname = func1+'__slots_';
+ if(!sigObj[signame]) {
+ // having the slotFunc in a var and setting it by using an anonymous function in this way
+ // is apparently a good way to prevent memory leaks in IE if the objects are DOM nodes.
+ var slotFunc = function() {
+ var args = [];
+ for(var x = 0; x < arguments.length; x++){
+ args.push(arguments[x]);
+ }
+ args = options.mutate.apply(null,args)
+ var result;
+ if(!options.before) result = sigObj[signame].apply(sigObj,arguments); //default: call sign before slot
+ sigObj[slotsname].each(function(slot){
+ try {
+ if(slot && slot[0]) { // testing for null, a disconnect may have nulled this slot
+ slot[0][slot[1]].apply(slot[0],args); //[0] = obj, [1] = func name
+ }
+ } catch(e) {
+ if(Signal.throwErrors) throw e;
+ }
+ });
+ if(options.before) result = sigObj[signame].apply(sigObj,arguments); //call slot before sig
+ return result; //return sig result
+ };
+ (function() {
+ sigObj[slotsname] = $A([]);
+ sigObj[signame] = sigObj[func1] || Signal.MT;
+ sigObj[func1] = slotFunc;
+ })();
+ }
+ var con = (sigObj[slotsname].length > 0) ?
+ (options.connectOnce ? !sigObj[slotsname].any(function(slot) { return (slot[0] == slotObj && slot[1] == func2) }) : true) :
+ true;
+ if(con) {
+ sigObj[slotsname].push([slotObj,func2]);
+ }
+ },
+ connectOnce : function(obj1, func1, obj2, func2, options) {
+ Signal.connect(obj1, func1, obj2, func2, Object.extend(options || {}, {connectOnce : true}))
+ },
+ disconnect : function(obj1, func1, obj2, func2, options) {
+ var options = Object.extend({
+ disconnectAll : false
+ }, options || {});
+ if(typeof func1 != 'string' || typeof func2 != 'string') return;
+
+ var sigObj = obj1 || window;
+ var slotObj = obj2 || window;
+ var signame = func1+'__signal_';
+ var slotsname = func1+'__slots_';
+
+ // I null them in this way so that any currectly active signal will read a null slot,
+ // otherwise the slot will be applied even though it's been disconnected
+ if(sigObj[slotsname]) {
+ if(options.disconnectAll) {
+ sigObj[slotsname] = sigObj[slotsname].collect(function(slot) {
+ if(slot[0] == slotObj && slot[1] == func2) {
+ slot[0] = null;
+ return null;
+ } else {
+ return slot;
+ }
+ }).compact();
+ } else {
+ var idx = -1;
+ sigObj[slotsname] = sigObj[slotsname].collect(function(slot, index) {
+ if(slot[0] == slotObj && slot[1] == func2 && idx < 0) { //disconnect first match
+ idx = index;
+ slot[0] = null;
+ return null;
+ } else {
+ return slot;
+ }
+ }).compact();
+ }
+ }
+ },
+ disconnectAll : function(obj1, func1, obj2, func2, options) {
+ Signal.disconnect(obj1, func1, obj2, func2, Object.extend(options || {}, {disconnectAll : true}))
+ }
+}
+*/
+
+/*
+ Tests
+
+// 1. Simple Test 1 "hello Fred" should trigger "Fred is a stupid head"
+
+
+ sayHello = function(n) {
+ alert("Hello! " + n);
+ }
+ moron = function(n) {
+ alert(n + " is a stupid head");
+ }
+ Signal.connect(null,'sayHello',null,'moron');
+
+ onclick="sayHello('Fred')"
+
+
+// 2. Simple Test 2 repeated insults about Fred
+
+
+ Signal.connect(null,'sayHello2',null,'moron2');
+ Signal.connect(null,'sayHello2',null,'moron2');
+ Signal.connect(null,'sayHello2',null,'moron2');
+
+
+// 3. Simple Test 3 multiple insults about Fred
+
+
+ Signal.connect(null,'sayHello3',null,'moron3');
+ Signal.connect(null,'sayHello3',null,'bonehead3');
+ Signal.connect(null,'sayHello3',null,'idiot3');
+
+
+// 4. Simple Test 4 3 insults about Fred first - 3 then none
+
+
+ Signal.connect(null,'sayHello4',null,'moron4');
+ Signal.connect(null,'sayHello4',null,'moron4');
+ Signal.connect(null,'sayHello4',null,'moron4');
+ Signal.disconnect(null,'sayHello4',null,'moron4');
+ Signal.disconnect(null,'sayHello4',null,'moron4');
+ Signal.disconnect(null,'sayHello4',null,'moron4');
+
+
+// 5. Simple Test 5 connect 3 insults about Fred first - only one, then none
+
+
+ Signal.connect(null,'sayHello5',null,'moron5');
+ Signal.connect(null,'sayHello5',null,'moron5');
+ Signal.connect(null,'sayHello5',null,'moron5');
+ Signal.disconnectAll(null,'sayHello5',null,'moron5');
+
+
+// 6. Simple Test 6 connect 3 insults but only one comes out
+
+
+ Signal.connectOnce(null,'sayHello6',null,'moron6');
+ Signal.connectOnce(null,'sayHello6',null,'moron6');
+ Signal.connectOnce(null,'sayHello6',null,'moron6');
+
+
+// 7. Simple Test 7 connect via objects
+
+
+ var o = {};
+ o.sayHello = function(n) {
+ alert("Hello! " + n + " (from object o)");
+ }
+ var m = {};
+ m.moron = function(n) {
+ alert(n + " is a stupid head (from object m)");
+ }
+
+ Signal.connect(o,'sayHello',m,'moron');
+
+ onclick="o.sayHello('Fred')"
+
+
+// 8. Simple Test 8 connect but the insult comes first using {before:true}
+
+
+ Signal.connect(null,'sayHello8',null,'moron8', {before:true});
+
+
+// 9. Simple Test 9 connect but the insult is mutated
+
+
+ Signal.connect(null,'sayHello9',null,'moron9', {mutate:function() { return ['smelly ' + arguments[0]] }});
+
+ */
-// 5. Simple Test 5 connect 3 insults about Fred first - only one, then none - - - Signal.connect(null,'sayHello5',null,'moron5'); - Signal.connect(null,'sayHello5',null,'moron5'); - Signal.connect(null,'sayHello5',null,'moron5'); - Signal.disconnectAll(null,'sayHello5',null,'moron5'); - - -// 6. Simple Test 6 connect 3 insults but only one comes out - - - Signal.connectOnce(null,'sayHello6',null,'moron6'); - Signal.connectOnce(null,'sayHello6',null,'moron6'); - Signal.connectOnce(null,'sayHello6',null,'moron6'); - - -// 7. Simple Test 7 connect via objects - - - var o = {}; - o.sayHello = function(n) { - alert("Hello! " + n + " (from object o)"); - } - var m = {}; - m.moron = function(n) { - alert(n + " is a stupid head (from object m)"); - } - - Signal.connect(o,'sayHello',m,'moron'); - - onclick="o.sayHello('Fred')" - - -// 8. Simple Test 8 connect but the insult comes first using {before:true} - - - Signal.connect(null,'sayHello8',null,'moron8', {before:true}); - - -// 9. Simple Test 9 connect but the insult is mutated - - - Signal.connect(null,'sayHello9',null,'moron9', {mutate:function() { return ['smelly ' + arguments[0]] }}); - - */ - Object.extend(String.prototype, { gsub: function(pattern, replacement) { var result = '', source = this, match; @@ -596,177 +597,177 @@ Template.prototype = { } -/** - * @class String extensions - */ -Object.extend(String.prototype, -{ - /** - * @param {String} "left" to pad the string on the left, "right" to pad right. - * @param {Number} minimum string length. - * @param {String} character(s) to pad - * @return {String} padded character(s) on the left or right to satisfy minimum string length - */ - - pad : function(side, len, chr) { - if (!chr) chr = ' '; - var s = this; - var left = side.toLowerCase()=='left'; - while (s.length<len) s = left? chr + s : s + chr; - return s; - }, - - /** - * @param {Number} minimum string length. - * @param {String} character(s) to pad - * @return {String} padded character(s) on the left to satisfy minimum string length - */ - padLeft : function(len, chr) { - return this.pad('left',len,chr); - }, - - /** - * @param {Number} minimum string length. - * @param {String} character(s) to pad - * @return {String} padded character(s) on the right to satisfy minimum string length - */ - padRight : function(len, chr) { - return this.pad('right',len,chr); - }, - - /** - * @param {Number} minimum string length. - * @return {String} append zeros to the left to satisfy minimum string length. - */ - zerofill : function(len) { - return this.padLeft(len,'0'); - }, - - /** - * @return {String} removed white spaces from both ends. - */ - trim : function() { - return this.replace(/^\s+|\s+$/g,''); - }, - - /** - * @return {String} removed white spaces from the left end. - */ - trimLeft : function() { - return this.replace(/^\s+/,''); - }, - - /** - * @return {String} removed white spaces from the right end. - */ - trimRight : function() { - return this.replace(/\s+$/,''); - }, - - /** - * Convert period separated function names into a function reference. - * e.g. "Prado.AJAX.Callback.Action.setValue".toFunction() will return - * the actual function Prado.AJAX.Callback.Action.setValue() - * @return {Function} the corresponding function represented by the string. - */ - toFunction : function() - { - var commands = this.split(/\./); - var command = window; - commands.each(function(action) - { - if(command[new String(action)]) - command=command[new String(action)]; - }); - if(typeof(command) == "function") - return command; - else - { - if(typeof Logger != "undefined") - Logger.error("Missing function", this); - - throw new Error ("Missing function '"+this+"'"); - } - }, - - /** - * Convert a string into integer, returns null if not integer. - * @return {Number} null if string does not represent an integer. - */ - toInteger : function() - { - var exp = /^\s*[-\+]?\d+\s*$/; - if (this.match(exp) == null) - return null; - var num = parseInt(this, 10); - return (isNaN(num) ? null : num); - }, - - /** - * Convert a string into a double/float value. <b>Internationalization - * is not supported</b> - * @param {String} the decimal character - * @return {Double} null if string does not represent a float value - */ - toDouble : function(decimalchar) - { - if(this.length <= 0) return null; - decimalchar = decimalchar || "."; - var exp = new RegExp("^\\s*([-\\+])?(\\d+)?(\\" + decimalchar + "(\\d+))?\\s*$"); - var m = this.match(exp); - - if (m == null) - return null; - m[1] = m[1] || ""; - m[2] = m[2] || "0"; - m[4] = m[4] || "0"; - - var cleanInput = m[1] + (m[2].length>0 ? m[2] : "0") + "." + m[4]; - var num = parseFloat(cleanInput); - return (isNaN(num) ? null : num); - }, - - /** - * Convert strings that represent a currency value (e.g. a float with grouping - * characters) to float. E.g. "10,000.50" will become "10000.50". The number - * of dicimal digits, grouping and decimal characters can be specified. - * <i>The currency input format is <b>very</b> strict, null will be returned if - * the pattern does not match</i>. - * @param {String} the grouping character, default is "," - * @param {Number} number of decimal digits - * @param {String} the decimal character, default is "." - * @type {Double} the currency value as float. - */ - toCurrency : function(groupchar, digits, decimalchar) - { - groupchar = groupchar || ","; - decimalchar = decimalchar || "."; - digits = typeof(digits) == "undefined" ? 2 : digits; - - var exp = new RegExp("^\\s*([-\\+])?(((\\d+)\\" + groupchar + ")*)(\\d+)" - + ((digits > 0) ? "(\\" + decimalchar + "(\\d{1," + digits + "}))?" : "") - + "\\s*$"); - var m = this.match(exp); - if (m == null) - return null; - var intermed = m[2] + m[5] ; - var cleanInput = m[1] + intermed.replace( - new RegExp("(\\" + groupchar + ")", "g"), "") - + ((digits > 0) ? "." + m[7] : ""); - var num = parseFloat(cleanInput); - return (isNaN(num) ? null : num); - }, - - /** - * Converts the string to a date by finding values that matches the - * date format pattern. - * @param string date format pattern, e.g. MM-dd-yyyy - * @return {Date} the date extracted from the string - */ - toDate : function(format) - { - return Date.SimpleParse(this, format); - } +/**
+ * @class String extensions
+ */
+Object.extend(String.prototype,
+{
+ /**
+ * @param {String} "left" to pad the string on the left, "right" to pad right.
+ * @param {Number} minimum string length.
+ * @param {String} character(s) to pad
+ * @return {String} padded character(s) on the left or right to satisfy minimum string length
+ */
+
+ pad : function(side, len, chr) {
+ if (!chr) chr = ' ';
+ var s = this;
+ var left = side.toLowerCase()=='left';
+ while (s.length<len) s = left? chr + s : s + chr;
+ return s;
+ },
+
+ /**
+ * @param {Number} minimum string length.
+ * @param {String} character(s) to pad
+ * @return {String} padded character(s) on the left to satisfy minimum string length
+ */
+ padLeft : function(len, chr) {
+ return this.pad('left',len,chr);
+ },
+
+ /**
+ * @param {Number} minimum string length.
+ * @param {String} character(s) to pad
+ * @return {String} padded character(s) on the right to satisfy minimum string length
+ */
+ padRight : function(len, chr) {
+ return this.pad('right',len,chr);
+ },
+
+ /**
+ * @param {Number} minimum string length.
+ * @return {String} append zeros to the left to satisfy minimum string length.
+ */
+ zerofill : function(len) {
+ return this.padLeft(len,'0');
+ },
+
+ /**
+ * @return {String} removed white spaces from both ends.
+ */
+ trim : function() {
+ return this.replace(/^\s+|\s+$/g,'');
+ },
+
+ /**
+ * @return {String} removed white spaces from the left end.
+ */
+ trimLeft : function() {
+ return this.replace(/^\s+/,'');
+ },
+
+ /**
+ * @return {String} removed white spaces from the right end.
+ */
+ trimRight : function() {
+ return this.replace(/\s+$/,'');
+ },
+
+ /**
+ * Convert period separated function names into a function reference.
+ * e.g. "Prado.AJAX.Callback.Action.setValue".toFunction() will return
+ * the actual function Prado.AJAX.Callback.Action.setValue()
+ * @return {Function} the corresponding function represented by the string.
+ */
+ toFunction : function()
+ {
+ var commands = this.split(/\./);
+ var command = window;
+ commands.each(function(action)
+ {
+ if(command[new String(action)])
+ command=command[new String(action)];
+ });
+ if(typeof(command) == "function")
+ return command;
+ else
+ {
+ if(typeof Logger != "undefined")
+ Logger.error("Missing function", this);
+
+ throw new Error ("Missing function '"+this+"'");
+ }
+ },
+
+ /**
+ * Convert a string into integer, returns null if not integer.
+ * @return {Number} null if string does not represent an integer.
+ */
+ toInteger : function()
+ {
+ var exp = /^\s*[-\+]?\d+\s*$/;
+ if (this.match(exp) == null)
+ return null;
+ var num = parseInt(this, 10);
+ return (isNaN(num) ? null : num);
+ },
+
+ /**
+ * Convert a string into a double/float value. <b>Internationalization
+ * is not supported</b>
+ * @param {String} the decimal character
+ * @return {Double} null if string does not represent a float value
+ */
+ toDouble : function(decimalchar)
+ {
+ if(this.length <= 0) return null;
+ decimalchar = decimalchar || ".";
+ var exp = new RegExp("^\\s*([-\\+])?(\\d+)?(\\" + decimalchar + "(\\d+))?\\s*$");
+ var m = this.match(exp);
+
+ if (m == null)
+ return null;
+ m[1] = m[1] || "";
+ m[2] = m[2] || "0";
+ m[4] = m[4] || "0";
+
+ var cleanInput = m[1] + (m[2].length>0 ? m[2] : "0") + "." + m[4];
+ var num = parseFloat(cleanInput);
+ return (isNaN(num) ? null : num);
+ },
+
+ /**
+ * Convert strings that represent a currency value (e.g. a float with grouping
+ * characters) to float. E.g. "10,000.50" will become "10000.50". The number
+ * of dicimal digits, grouping and decimal characters can be specified.
+ * <i>The currency input format is <b>very</b> strict, null will be returned if
+ * the pattern does not match</i>.
+ * @param {String} the grouping character, default is ","
+ * @param {Number} number of decimal digits
+ * @param {String} the decimal character, default is "."
+ * @type {Double} the currency value as float.
+ */
+ toCurrency : function(groupchar, digits, decimalchar)
+ {
+ groupchar = groupchar || ",";
+ decimalchar = decimalchar || ".";
+ digits = typeof(digits) == "undefined" ? 2 : digits;
+
+ var exp = new RegExp("^\\s*([-\\+])?(((\\d+)\\" + groupchar + ")*)(\\d+)"
+ + ((digits > 0) ? "(\\" + decimalchar + "(\\d{1," + digits + "}))?" : "")
+ + "\\s*$");
+ var m = this.match(exp);
+ if (m == null)
+ return null;
+ var intermed = m[2] + m[5] ;
+ var cleanInput = m[1] + intermed.replace(
+ new RegExp("(\\" + groupchar + ")", "g"), "")
+ + ((digits > 0) ? "." + m[7] : "");
+ var num = parseFloat(cleanInput);
+ return (isNaN(num) ? null : num);
+ },
+
+ /**
+ * Converts the string to a date by finding values that matches the
+ * date format pattern.
+ * @param string date format pattern, e.g. MM-dd-yyyy
+ * @return {Date} the date extracted from the string
+ */
+ toDate : function(format)
+ {
+ return Date.SimpleParse(this, format);
+ }
}); var $break = new Object(); @@ -1061,8 +1062,8 @@ var Hash = { { return $A(pair[1]).collect(function(value) { - return encodeURIComponent(pair[0])+'='+encodeURIComponent(value); - }).join('&'); + return encodeURIComponent(pair[0])+'='+encodeURIComponent(value);
+ }).join('&');
} else return pair.map(encodeURIComponent).join('='); @@ -1921,115 +1922,115 @@ if (navigator.appVersion.match(/\bMSIE\b/)) Event.observe(window, 'unload', Event.unloadCache, false); -/** - * @class Event extensions. - */ -Object.extend(Event, -{ - /** - * Register a function to be executed when the page is loaded. - * Note that the page is only loaded if all resources (e.g. images) - * are loaded. - * - * Example: Show an alert box with message "Page Loaded!" when the - * page finished loading. - * <code> - * Event.OnLoad(function(){ alert("Page Loaded!"); }); - * </code> - * - * @param {Function} function to execute when page is loaded. - */ - OnLoad : function (fn) - { - // opera onload is in document, not window - var w = document.addEventListener && - !window.addEventListener ? document : window; - Event.observe(w,'load',fn); - }, - - /** - * @param {Event} a keyboard event - * @return {Number} the Unicode character code generated by the key - * that was struck. - */ - keyCode : function(e) - { - return e.keyCode != null ? e.keyCode : e.charCode - }, - - /** - * @param {String} event type or event name. - * @return {Boolean} true if event type is of HTMLEvent, false - * otherwise - */ - isHTMLEvent : function(type) - { - var events = ['abort', 'blur', 'change', 'error', 'focus', - 'load', 'reset', 'resize', 'scroll', 'select', - 'submit', 'unload']; - return events.include(type); - }, - - /** - * @param {String} event type or event name - * @return {Boolean} true if event type is of MouseEvent, - * false otherwise - */ - isMouseEvent : function(type) - { - var events = ['click', 'mousedown', 'mousemove', 'mouseout', - 'mouseover', 'mouseup']; - return events.include(type); - }, - - /** - * Dispatch the DOM event of a given <tt>type</tt> on a DOM - * <tt>element</tt>. Only HTMLEvent and MouseEvent can be - * dispatched, keyboard events or UIEvent can not be dispatch - * via javascript consistently. - * For the "submit" event the submit() method is called. - * @param {Object} element id string or a DOM element. - * @param {String} event type to dispatch. - */ - fireEvent : function(element,type,canBubble) - { - canBubble = (typeof(canBubble) == undefined) ? true : canBubble; - element = $(element); - if(type == "submit") - return element.submit(); - if(document.createEvent) - { - if(Event.isHTMLEvent(type)) - { - var event = document.createEvent('HTMLEvents'); - event.initEvent(type, canBubble, true); - } - else if(Event.isMouseEvent(type)) - { - var event = document.createEvent('MouseEvents'); - if (event.initMouseEvent) - { - event.initMouseEvent(type,canBubble,true, - document.defaultView, 1, 0, 0, 0, 0, false, - false, false, false, 0, null); - } - else - { - // Safari - // TODO we should be initialising other mouse-event related attributes here - event.initEvent(type, canBubble, true); - } - } - element.dispatchEvent(event); - } - else if(document.createEventObject) - { - var evObj = document.createEventObject(); - element.fireEvent('on'+type, evObj); - } - else if(typeof(element['on'+type]) == "function") - element['on'+type](); - } +/**
+ * @class Event extensions.
+ */
+Object.extend(Event,
+{
+ /**
+ * Register a function to be executed when the page is loaded.
+ * Note that the page is only loaded if all resources (e.g. images)
+ * are loaded.
+ *
+ * Example: Show an alert box with message "Page Loaded!" when the
+ * page finished loading.
+ * <code>
+ * Event.OnLoad(function(){ alert("Page Loaded!"); });
+ * </code>
+ *
+ * @param {Function} function to execute when page is loaded.
+ */
+ OnLoad : function (fn)
+ {
+ // opera onload is in document, not window
+ var w = document.addEventListener &&
+ !window.addEventListener ? document : window;
+ Event.observe(w,'load',fn);
+ },
+
+ /**
+ * @param {Event} a keyboard event
+ * @return {Number} the Unicode character code generated by the key
+ * that was struck.
+ */
+ keyCode : function(e)
+ {
+ return e.keyCode != null ? e.keyCode : e.charCode
+ },
+
+ /**
+ * @param {String} event type or event name.
+ * @return {Boolean} true if event type is of HTMLEvent, false
+ * otherwise
+ */
+ isHTMLEvent : function(type)
+ {
+ var events = ['abort', 'blur', 'change', 'error', 'focus',
+ 'load', 'reset', 'resize', 'scroll', 'select',
+ 'submit', 'unload'];
+ return events.include(type);
+ },
+
+ /**
+ * @param {String} event type or event name
+ * @return {Boolean} true if event type is of MouseEvent,
+ * false otherwise
+ */
+ isMouseEvent : function(type)
+ {
+ var events = ['click', 'mousedown', 'mousemove', 'mouseout',
+ 'mouseover', 'mouseup'];
+ return events.include(type);
+ },
+
+ /**
+ * Dispatch the DOM event of a given <tt>type</tt> on a DOM
+ * <tt>element</tt>. Only HTMLEvent and MouseEvent can be
+ * dispatched, keyboard events or UIEvent can not be dispatch
+ * via javascript consistently.
+ * For the "submit" event the submit() method is called.
+ * @param {Object} element id string or a DOM element.
+ * @param {String} event type to dispatch.
+ */
+ fireEvent : function(element,type,canBubble)
+ {
+ canBubble = (typeof(canBubble) == undefined) ? true : canBubble;
+ element = $(element);
+ if(type == "submit")
+ return element.submit();
+ if(document.createEvent)
+ {
+ if(Event.isHTMLEvent(type))
+ {
+ var event = document.createEvent('HTMLEvents');
+ event.initEvent(type, canBubble, true);
+ }
+ else if(Event.isMouseEvent(type))
+ {
+ var event = document.createEvent('MouseEvents');
+ if (event.initMouseEvent)
+ {
+ event.initMouseEvent(type,canBubble,true,
+ document.defaultView, 1, 0, 0, 0, 0, false,
+ false, false, false, 0, null);
+ }
+ else
+ {
+ // Safari
+ // TODO we should be initialising other mouse-event related attributes here
+ event.initEvent(type, canBubble, true);
+ }
+ }
+ element.dispatchEvent(event);
+ }
+ else if(document.createEventObject)
+ {
+ var evObj = document.createEventObject();
+ element.fireEvent('on'+type, evObj);
+ }
+ else if(typeof(element['on'+type]) == "function")
+ element['on'+type]();
+ }
}); var Position = { @@ -2481,1071 +2482,1071 @@ var Builder = { } } - -Object.extend(Builder, -{ - exportTags:function() - { - var tags=["BUTTON","TT","PRE","H1","H2","H3","BR","CANVAS","HR","LABEL","TEXTAREA","FORM","STRONG","SELECT","OPTION","OPTGROUP","LEGEND","FIELDSET","P","UL","OL","LI","TD","TR","THEAD","TBODY","TFOOT","TABLE","TH","INPUT","SPAN","A","DIV","IMG", "CAPTION"]; - tags.each(function(tag) - { - window[tag]=function() - { - var args=$A(arguments); - if(args.length==0) - return Builder.node(tag,null); - if(args.length==1) - return Builder.node(tag,args[0]); - if(args.length>1) - return Builder.node(tag,args.shift(),args); - - }; - }); - } -}); - -Builder.exportTags(); - - - -Object.extend(Date.prototype, -{ - SimpleFormat: function(format, data) - { - data = data || {}; - var bits = new Array(); - bits['d'] = this.getDate(); - bits['dd'] = String(this.getDate()).zerofill(2); - - bits['M'] = this.getMonth()+1; - bits['MM'] = String(this.getMonth()+1).zerofill(2); - if(data.AbbreviatedMonthNames) - bits['MMM'] = data.AbbreviatedMonthNames[this.getMonth()]; - if(data.MonthNames) - bits['MMMM'] = data.MonthNames[this.getMonth()]; - var yearStr = "" + this.getFullYear(); - yearStr = (yearStr.length == 2) ? '19' + yearStr: yearStr; - bits['yyyy'] = yearStr; - bits['yy'] = bits['yyyy'].toString().substr(2,2); - - // do some funky regexs to replace the format string - // with the real values - var frm = new String(format); - for (var sect in bits) - { - var reg = new RegExp("\\b"+sect+"\\b" ,"g"); - frm = frm.replace(reg, bits[sect]); - } - return frm; - }, - - toISODate : function() - { - var y = this.getFullYear(); - var m = String(this.getMonth() + 1).zerofill(2); - var d = String(this.getDate()).zerofill(2); - return String(y) + String(m) + String(d); - } +
+Object.extend(Builder,
+{
+ exportTags:function()
+ {
+ var tags=["BUTTON","TT","PRE","H1","H2","H3","BR","CANVAS","HR","LABEL","TEXTAREA","FORM","STRONG","SELECT","OPTION","OPTGROUP","LEGEND","FIELDSET","P","UL","OL","LI","TD","TR","THEAD","TBODY","TFOOT","TABLE","TH","INPUT","SPAN","A","DIV","IMG", "CAPTION"];
+ tags.each(function(tag)
+ {
+ window[tag]=function()
+ {
+ var args=$A(arguments);
+ if(args.length==0)
+ return Builder.node(tag,null);
+ if(args.length==1)
+ return Builder.node(tag,args[0]);
+ if(args.length>1)
+ return Builder.node(tag,args.shift(),args);
+
+ };
+ });
+ }
+});
+
+Builder.exportTags();
+ + +
+Object.extend(Date.prototype,
+{
+ SimpleFormat: function(format, data)
+ {
+ data = data || {};
+ var bits = new Array();
+ bits['d'] = this.getDate();
+ bits['dd'] = String(this.getDate()).zerofill(2);
+
+ bits['M'] = this.getMonth()+1;
+ bits['MM'] = String(this.getMonth()+1).zerofill(2);
+ if(data.AbbreviatedMonthNames)
+ bits['MMM'] = data.AbbreviatedMonthNames[this.getMonth()];
+ if(data.MonthNames)
+ bits['MMMM'] = data.MonthNames[this.getMonth()];
+ var yearStr = "" + this.getFullYear();
+ yearStr = (yearStr.length == 2) ? '19' + yearStr: yearStr;
+ bits['yyyy'] = yearStr;
+ bits['yy'] = bits['yyyy'].toString().substr(2,2);
+
+ // do some funky regexs to replace the format string
+ // with the real values
+ var frm = new String(format);
+ for (var sect in bits)
+ {
+ var reg = new RegExp("\\b"+sect+"\\b" ,"g");
+ frm = frm.replace(reg, bits[sect]);
+ }
+ return frm;
+ },
+
+ toISODate : function()
+ {
+ var y = this.getFullYear();
+ var m = String(this.getMonth() + 1).zerofill(2);
+ var d = String(this.getDate()).zerofill(2);
+ return String(y) + String(m) + String(d);
+ }
+});
+
+Object.extend(Date,
+{
+ SimpleParse: function(value, format)
+ {
+ val=String(value);
+ format=String(format);
+
+ if(val.length <= 0) return null;
+
+ if(format.length <= 0) return new Date(value);
+
+ var isInteger = function (val)
+ {
+ var digits="1234567890";
+ for (var i=0; i < val.length; i++)
+ {
+ if (digits.indexOf(val.charAt(i))==-1) { return false; }
+ }
+ return true;
+ };
+
+ var getInt = function(str,i,minlength,maxlength)
+ {
+ for (var x=maxlength; x>=minlength; x--)
+ {
+ var token=str.substring(i,i+x);
+ if (token.length < minlength) { return null; }
+ if (isInteger(token)) { return token; }
+ }
+ return null;
+ };
+
+ var i_val=0;
+ var i_format=0;
+ var c="";
+ var token="";
+ var token2="";
+ var x,y;
+ var now=new Date();
+ var year=now.getFullYear();
+ var month=now.getMonth()+1;
+ var date=1;
+
+ while (i_format < format.length)
+ {
+ // Get next token from format string
+ c=format.charAt(i_format);
+ token="";
+ while ((format.charAt(i_format)==c) && (i_format < format.length))
+ {
+ token += format.charAt(i_format++);
+ }
+
+ // Extract contents of value based on format token
+ if (token=="yyyy" || token=="yy" || token=="y")
+ {
+ if (token=="yyyy") { x=4;y=4; }
+ if (token=="yy") { x=2;y=2; }
+ if (token=="y") { x=2;y=4; }
+ year=getInt(val,i_val,x,y);
+ if (year==null) { return null; }
+ i_val += year.length;
+ if (year.length==2)
+ {
+ if (year > 70) { year=1900+(year-0); }
+ else { year=2000+(year-0); }
+ }
+ }
+
+ else if (token=="MM"||token=="M")
+ {
+ month=getInt(val,i_val,token.length,2);
+ if(month==null||(month<1)||(month>12)){return null;}
+ i_val+=month.length;
+ }
+ else if (token=="dd"||token=="d")
+ {
+ date=getInt(val,i_val,token.length,2);
+ if(date==null||(date<1)||(date>31)){return null;}
+ i_val+=date.length;
+ }
+ else
+ {
+ if (val.substring(i_val,i_val+token.length)!=token) {return null;}
+ else {i_val+=token.length;}
+ }
+ }
+
+ // If there are any trailing characters left in the value, it doesn't match
+ if (i_val != val.length) { return null; }
+
+ // Is date valid for month?
+ if (month==2)
+ {
+ // Check for leap year
+ if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year
+ if (date > 29){ return null; }
+ }
+ else { if (date > 28) { return null; } }
+ }
+
+ if ((month==4)||(month==6)||(month==9)||(month==11))
+ {
+ if (date > 30) { return null; }
+ }
+
+ var newdate=new Date(year,month-1,date, 0, 0, 0);
+ return newdate;
+ }
}); -Object.extend(Date, -{ - SimpleParse: function(value, format) - { - val=String(value); - format=String(format); - - if(val.length <= 0) return null; - - if(format.length <= 0) return new Date(value); - - var isInteger = function (val) - { - var digits="1234567890"; - for (var i=0; i < val.length; i++) - { - if (digits.indexOf(val.charAt(i))==-1) { return false; } - } - return true; - }; - - var getInt = function(str,i,minlength,maxlength) - { - for (var x=maxlength; x>=minlength; x--) - { - var token=str.substring(i,i+x); - if (token.length < minlength) { return null; } - if (isInteger(token)) { return token; } - } - return null; - }; - - var i_val=0; - var i_format=0; - var c=""; - var token=""; - var token2=""; - var x,y; - var now=new Date(); - var year=now.getFullYear(); - var month=now.getMonth()+1; - var date=1; - - while (i_format < format.length) - { - // Get next token from format string - c=format.charAt(i_format); - token=""; - while ((format.charAt(i_format)==c) && (i_format < format.length)) - { - token += format.charAt(i_format++); - } - - // Extract contents of value based on format token - if (token=="yyyy" || token=="yy" || token=="y") - { - if (token=="yyyy") { x=4;y=4; } - if (token=="yy") { x=2;y=2; } - if (token=="y") { x=2;y=4; } - year=getInt(val,i_val,x,y); - if (year==null) { return null; } - i_val += year.length; - if (year.length==2) - { - if (year > 70) { year=1900+(year-0); } - else { year=2000+(year-0); } - } - } - - else if (token=="MM"||token=="M") - { - month=getInt(val,i_val,token.length,2); - if(month==null||(month<1)||(month>12)){return null;} - i_val+=month.length; - } - else if (token=="dd"||token=="d") - { - date=getInt(val,i_val,token.length,2); - if(date==null||(date<1)||(date>31)){return null;} - i_val+=date.length; - } - else - { - if (val.substring(i_val,i_val+token.length)!=token) {return null;} - else {i_val+=token.length;} - } - } - - // If there are any trailing characters left in the value, it doesn't match - if (i_val != val.length) { return null; } - - // Is date valid for month? - if (month==2) - { - // Check for leap year - if ( ( (year%4==0)&&(year%100 != 0) ) || (year%400==0) ) { // leap year - if (date > 29){ return null; } - } - else { if (date > 28) { return null; } } - } - - if ((month==4)||(month==6)||(month==9)||(month==11)) - { - if (date > 30) { return null; } - } - - var newdate=new Date(year,month-1,date, 0, 0, 0); - return newdate; - } -}); - - -var Prado = -{ - Version: '3.1', - - /** - * Returns browser information. Example - * <code> - * var browser = Prado.Browser(); - * alert(browser.ie); //should ouput true if IE, false otherwise - * </code> - * @param ${parameter} - * @return ${return} - */ - Browser : function() - { - var info = { Version : "1.0" }; - var is_major = parseInt( navigator.appVersion ); - info.nver = is_major; - info.ver = navigator.appVersion; - info.agent = navigator.userAgent; - info.dom = document.getElementById ? 1 : 0; - info.opera = window.opera ? 1 : 0; - info.ie5 = ( info.ver.indexOf( "MSIE 5" ) > -1 && info.dom && !info.opera ) ? 1 : 0; - info.ie6 = ( info.ver.indexOf( "MSIE 6" ) > -1 && info.dom && !info.opera ) ? 1 : 0; - info.ie4 = ( document.all && !info.dom && !info.opera ) ? 1 : 0; - info.ie = info.ie4 || info.ie5 || info.ie6; - info.mac = info.agent.indexOf( "Mac" ) > -1; - info.ns6 = ( info.dom && parseInt( info.ver ) >= 5 ) ? 1 : 0; - info.ie3 = ( info.ver.indexOf( "MSIE" ) && ( is_major < 4 ) ); - info.hotjava = ( info.agent.toLowerCase().indexOf( 'hotjava' ) != -1 ) ? 1 : 0; - info.ns4 = ( document.layers && !info.dom && !info.hotjava ) ? 1 : 0; - info.bw = ( info.ie6 || info.ie5 || info.ie4 || info.ns4 || info.ns6 || info.opera ); - info.ver3 = ( info.hotjava || info.ie3 ); - info.opera7 = ( ( info.agent.toLowerCase().indexOf( 'opera 7' ) > -1 ) || ( info.agent.toLowerCase().indexOf( 'opera/7' ) > -1 ) ); - info.operaOld = info.opera && !info.opera7; - return info; - }, - - ImportCss : function(doc, css_file) - { - if (Prado.Browser().ie) - var styleSheet = doc.createStyleSheet(css_file); - else - { - var elm = doc.createElement("link"); - - elm.rel = "stylesheet"; - elm.href = css_file; - - if (headArr = doc.getElementsByTagName("head")) - headArr[0].appendChild(elm); - } - } -}; - - -/*Prado.Focus = Class.create(); - -Prado.Focus.setFocus = function(id) -{ - var target = document.getElementById ? document.getElementById(id) : document.all[id]; - if(target && !Prado.Focus.canFocusOn(target)) - { - target = Prado.Focus.findTarget(target); - } - if(target) - { - try - { - target.focus(); - target.scrollIntoView(false); - if (window.__smartNav) - { - window.__smartNav.ae = target.id; - } - } - catch (e) - { - } - } -} - -Prado.Focus.canFocusOn = function(element) -{ - if(!element || !(element.tagName)) - return false; - var tagName = element.tagName.toLowerCase(); - return !element.disabled && (!element.type || element.type.toLowerCase() != "hidden") && Prado.Focus.isFocusableTag(tagName) && Prado.Focus.isVisible(element); -} - -Prado.Focus.isFocusableTag = function(tagName) -{ - return (tagName == "input" || tagName == "textarea" || tagName == "select" || tagName == "button" || tagName == "a"); -} - - -Prado.Focus.findTarget = function(element) -{ - if(!element || !(element.tagName)) - { - return null; - } - var tagName = element.tagName.toLowerCase(); - if (tagName == "undefined") - { - return null; - } - var children = element.childNodes; - if (children) - { - for(var i=0;i<children.length;i++) - { - try - { - if(Prado.Focus.canFocusOn(children[i])) - { - return children[i]; - } - else - { - var target = Prado.Focus.findTarget(children[i]); - if(target) - { - return target; - } - } - } - catch (e) - { - } - } - } - return null; -} - -Prado.Focus.isVisible = function(element) -{ - var current = element; - while((typeof(current) != "undefined") && (current != null)) - { - if(current.disabled || (typeof(current.style) != "undefined" && ((typeof(current.style.display) != "undefined" && current.style.display == "none") || (typeof(current.style.visibility) != "undefined" && current.style.visibility == "hidden") ))) - { - return false; - } - if(typeof(current.parentNode) != "undefined" && current.parentNode != null && current.parentNode != current && current.parentNode.tagName.toLowerCase() != "body") - { - current = current.parentNode; - } - else - { - return true; - } - } - return true; -} -*/ - - -Prado.PostBack = function(event,options) -{ - var form = $(options['FormID']); - var canSubmit = true; - - if(options['CausesValidation'] && typeof(Prado.Validation) != "undefined") - { - if(!Prado.Validation.validate(options['FormID'], options['ValidationGroup'], $(options['ID']))) - return Event.stop(event); - } - - if(options['PostBackUrl'] && options['PostBackUrl'].length > 0) - form.action = options['PostBackUrl']; - - if(options['TrackFocus']) - { - var lastFocus = $('PRADO_LASTFOCUS'); - if(lastFocus) - { - var active = document.activeElement; //where did this come from - if(active) - lastFocus.value = active.id; - else - lastFocus.value = options['EventTarget']; - } - } - - $('PRADO_POSTBACK_TARGET').value = options['EventTarget']; - $('PRADO_POSTBACK_PARAMETER').value = options['EventParameter']; - /** - * Since google toolbar prevents browser default action, - * we will always disable default client-side browser action - */ - /*if(options['StopEvent']) */ - Event.stop(event); - Event.fireEvent(form,"submit"); -} - -/* - -Prado.doPostBack = function(formID, eventTarget, eventParameter, performValidation, validationGroup, actionUrl, trackFocus, clientSubmit) -{ - if (typeof(performValidation) == 'undefined') - { - var performValidation = false; - var validationGroup = ''; - var actionUrl = null; - var trackFocus = false; - var clientSubmit = true; - } - var theForm = document.getElementById ? document.getElementById(formID) : document.forms[formID]; - var canSubmit = true; - if (performValidation) - { - //canSubmit = Prado.Validation.validate(validationGroup); - * Prado.Validation.ActiveTarget = theForm; - Prado.Validation.CurrentTargetGroup = null; - Prado.Validation.IsGroupValidation = false; - canSubmit = Prado.Validation.IsValid(theForm); - Logger.debug(canSubmit);* - canSubmit = Prado.Validation.IsValid(theForm); - } - if (canSubmit) - { - if (actionUrl != null && (actionUrl.length > 0)) - { - theForm.action = actionUrl; - } - if (trackFocus) - { - var lastFocus = theForm.elements['PRADO_LASTFOCUS']; - if ((typeof(lastFocus) != 'undefined') && (lastFocus != null)) - { - var active = document.activeElement; - if (typeof(active) == 'undefined') - { - lastFocus.value = eventTarget; - } - else - { - if ((active != null) && (typeof(active.id) != 'undefined')) - { - if (active.id.length > 0) - { - lastFocus.value = active.id; - } - else if (typeof(active.name) != 'undefined') - { - lastFocus.value = active.name; - } - } - } - } - } - if (!clientSubmit) - { - canSubmit = false; - } - } - if (canSubmit && (!theForm.onsubmit || theForm.onsubmit())) - { - theForm.PRADO_POSTBACK_TARGET.value = eventTarget; - theForm.PRADO_POSTBACK_PARAMETER.value = eventParameter; - theForm.submit(); - } -} +
+var Prado =
+{
+ Version: '3.1',
+
+ /**
+ * Returns browser information. Example
+ * <code>
+ * var browser = Prado.Browser();
+ * alert(browser.ie); //should ouput true if IE, false otherwise
+ * </code>
+ * @param ${parameter}
+ * @return ${return}
+ */
+ Browser : function()
+ {
+ var info = { Version : "1.0" };
+ var is_major = parseInt( navigator.appVersion );
+ info.nver = is_major;
+ info.ver = navigator.appVersion;
+ info.agent = navigator.userAgent;
+ info.dom = document.getElementById ? 1 : 0;
+ info.opera = window.opera ? 1 : 0;
+ info.ie5 = ( info.ver.indexOf( "MSIE 5" ) > -1 && info.dom && !info.opera ) ? 1 : 0;
+ info.ie6 = ( info.ver.indexOf( "MSIE 6" ) > -1 && info.dom && !info.opera ) ? 1 : 0;
+ info.ie4 = ( document.all && !info.dom && !info.opera ) ? 1 : 0;
+ info.ie = info.ie4 || info.ie5 || info.ie6;
+ info.mac = info.agent.indexOf( "Mac" ) > -1;
+ info.ns6 = ( info.dom && parseInt( info.ver ) >= 5 ) ? 1 : 0;
+ info.ie3 = ( info.ver.indexOf( "MSIE" ) && ( is_major < 4 ) );
+ info.hotjava = ( info.agent.toLowerCase().indexOf( 'hotjava' ) != -1 ) ? 1 : 0;
+ info.ns4 = ( document.layers && !info.dom && !info.hotjava ) ? 1 : 0;
+ info.bw = ( info.ie6 || info.ie5 || info.ie4 || info.ns4 || info.ns6 || info.opera );
+ info.ver3 = ( info.hotjava || info.ie3 );
+ info.opera7 = ( ( info.agent.toLowerCase().indexOf( 'opera 7' ) > -1 ) || ( info.agent.toLowerCase().indexOf( 'opera/7' ) > -1 ) );
+ info.operaOld = info.opera && !info.opera7;
+ return info;
+ },
+
+ ImportCss : function(doc, css_file)
+ {
+ if (Prado.Browser().ie)
+ var styleSheet = doc.createStyleSheet(css_file);
+ else
+ {
+ var elm = doc.createElement("link");
+
+ elm.rel = "stylesheet";
+ elm.href = css_file;
+
+ if (headArr = doc.getElementsByTagName("head"))
+ headArr[0].appendChild(elm);
+ }
+ }
+};
+ + +/*Prado.Focus = Class.create();
+
+Prado.Focus.setFocus = function(id)
+{
+ var target = document.getElementById ? document.getElementById(id) : document.all[id];
+ if(target && !Prado.Focus.canFocusOn(target))
+ {
+ target = Prado.Focus.findTarget(target);
+ }
+ if(target)
+ {
+ try
+ {
+ target.focus();
+ target.scrollIntoView(false);
+ if (window.__smartNav)
+ {
+ window.__smartNav.ae = target.id;
+ }
+ }
+ catch (e)
+ {
+ }
+ }
+}
+
+Prado.Focus.canFocusOn = function(element)
+{
+ if(!element || !(element.tagName))
+ return false;
+ var tagName = element.tagName.toLowerCase();
+ return !element.disabled && (!element.type || element.type.toLowerCase() != "hidden") && Prado.Focus.isFocusableTag(tagName) && Prado.Focus.isVisible(element);
+}
+
+Prado.Focus.isFocusableTag = function(tagName)
+{
+ return (tagName == "input" || tagName == "textarea" || tagName == "select" || tagName == "button" || tagName == "a");
+}
+
+
+Prado.Focus.findTarget = function(element)
+{
+ if(!element || !(element.tagName))
+ {
+ return null;
+ }
+ var tagName = element.tagName.toLowerCase();
+ if (tagName == "undefined")
+ {
+ return null;
+ }
+ var children = element.childNodes;
+ if (children)
+ {
+ for(var i=0;i<children.length;i++)
+ {
+ try
+ {
+ if(Prado.Focus.canFocusOn(children[i]))
+ {
+ return children[i];
+ }
+ else
+ {
+ var target = Prado.Focus.findTarget(children[i]);
+ if(target)
+ {
+ return target;
+ }
+ }
+ }
+ catch (e)
+ {
+ }
+ }
+ }
+ return null;
+}
+
+Prado.Focus.isVisible = function(element)
+{
+ var current = element;
+ while((typeof(current) != "undefined") && (current != null))
+ {
+ if(current.disabled || (typeof(current.style) != "undefined" && ((typeof(current.style.display) != "undefined" && current.style.display == "none") || (typeof(current.style.visibility) != "undefined" && current.style.visibility == "hidden") )))
+ {
+ return false;
+ }
+ if(typeof(current.parentNode) != "undefined" && current.parentNode != null && current.parentNode != current && current.parentNode.tagName.toLowerCase() != "body")
+ {
+ current = current.parentNode;
+ }
+ else
+ {
+ return true;
+ }
+ }
+ return true;
+}
+*/
+
+
+Prado.PostBack = function(event,options)
+{
+ var form = $(options['FormID']);
+ var canSubmit = true;
+
+ if(options['CausesValidation'] && typeof(Prado.Validation) != "undefined")
+ {
+ if(!Prado.Validation.validate(options['FormID'], options['ValidationGroup'], $(options['ID'])))
+ return Event.stop(event);
+ }
+
+ if(options['PostBackUrl'] && options['PostBackUrl'].length > 0)
+ form.action = options['PostBackUrl'];
+
+ if(options['TrackFocus'])
+ {
+ var lastFocus = $('PRADO_LASTFOCUS');
+ if(lastFocus)
+ {
+ var active = document.activeElement; //where did this come from
+ if(active)
+ lastFocus.value = active.id;
+ else
+ lastFocus.value = options['EventTarget'];
+ }
+ }
+
+ $('PRADO_POSTBACK_TARGET').value = options['EventTarget'];
+ $('PRADO_POSTBACK_PARAMETER').value = options['EventParameter'];
+ /**
+ * Since google toolbar prevents browser default action,
+ * we will always disable default client-side browser action
+ */
+ /*if(options['StopEvent']) */
+ Event.stop(event);
+ Event.fireEvent(form,"submit");
+}
+
+/*
+
+Prado.doPostBack = function(formID, eventTarget, eventParameter, performValidation, validationGroup, actionUrl, trackFocus, clientSubmit)
+{
+ if (typeof(performValidation) == 'undefined')
+ {
+ var performValidation = false;
+ var validationGroup = '';
+ var actionUrl = null;
+ var trackFocus = false;
+ var clientSubmit = true;
+ }
+ var theForm = document.getElementById ? document.getElementById(formID) : document.forms[formID];
+ var canSubmit = true;
+ if (performValidation)
+ {
+ //canSubmit = Prado.Validation.validate(validationGroup);
+ * Prado.Validation.ActiveTarget = theForm;
+ Prado.Validation.CurrentTargetGroup = null;
+ Prado.Validation.IsGroupValidation = false;
+ canSubmit = Prado.Validation.IsValid(theForm);
+ Logger.debug(canSubmit);*
+ canSubmit = Prado.Validation.IsValid(theForm);
+ }
+ if (canSubmit)
+ {
+ if (actionUrl != null && (actionUrl.length > 0))
+ {
+ theForm.action = actionUrl;
+ }
+ if (trackFocus)
+ {
+ var lastFocus = theForm.elements['PRADO_LASTFOCUS'];
+ if ((typeof(lastFocus) != 'undefined') && (lastFocus != null))
+ {
+ var active = document.activeElement;
+ if (typeof(active) == 'undefined')
+ {
+ lastFocus.value = eventTarget;
+ }
+ else
+ {
+ if ((active != null) && (typeof(active.id) != 'undefined'))
+ {
+ if (active.id.length > 0)
+ {
+ lastFocus.value = active.id;
+ }
+ else if (typeof(active.name) != 'undefined')
+ {
+ lastFocus.value = active.name;
+ }
+ }
+ }
+ }
+ }
+ if (!clientSubmit)
+ {
+ canSubmit = false;
+ }
+ }
+ if (canSubmit && (!theForm.onsubmit || theForm.onsubmit()))
+ {
+ theForm.PRADO_POSTBACK_TARGET.value = eventTarget;
+ theForm.PRADO_POSTBACK_PARAMETER.value = eventParameter;
+ theForm.submit();
+ }
+}
*/ -Prado.Element = -{ - /** - * Set the value of a particular element. - * @param string element id - * @param string new element value. - */ - setValue : function(element, value) - { - var el = $(element); - if(el && typeof(el.value) != "undefined") - el.value = value; - }, - - select : function(element, method, value, total) - { - var el = $(element); - if(!el) return; - var selection = Prado.Element.Selection; - if(typeof(selection[method]) == "function") - { - control = selection.isSelectable(el) ? [el] : selection.getListElements(element,total); - selection[method](control, value); - } - }, - - click : function(element) - { - var el = $(element); - if(el) - Event.fireEvent(el,'click'); - }, - - setAttribute : function(element, attribute, value) - { - var el = $(element); - if(!el) return; - if((attribute == "disabled" || attribute == "multiple") && value==false) - el.removeAttribute(attribute); - else if(attribute.match(/^on/i)) //event methods - { - try - { - eval("(func = function(event){"+value+"})"); - el[attribute] = func; - } - catch(e) - { - throw "Error in evaluating '"+value+"' for attribute "+attribute+" for element "+element.id; - } - } - else - el.setAttribute(attribute, value); - }, - - setOptions : function(element, options) - { - var el = $(element); - if(!el) return; - if(el && el.tagName.toLowerCase() == "select") - { - el.options.length = options.length; - for(var i = 0; i<options.length; i++) - el.options[i] = new Option(options[i][0],options[i][1]); - } - }, - - /** - * A delayed focus on a particular element - * @param {element} element to apply focus() - */ - focus : function(element) - { - var obj = $(element); - if(typeof(obj) != "undefined" && typeof(obj.focus) != "undefined") - setTimeout(function(){ obj.focus(); }, 100); - return false; - }, - - replace : function(element, method, content, boundary) - { - if(boundary) - { - result = Prado.Element.extractContent(this.transport.responseText, boundary); - if(result != null) - content = result; - } - if(typeof(element) == "string") - { - if($(element)) - method.toFunction().apply(this,[element,""+content]); - } - else - { - method.toFunction().apply(this,[""+content]); - } - }, - - extractContent : function(text, boundary) - { - var f = RegExp('(<!--'+boundary+'-->)([\\s\\S\\w\\W]*)(<!--//'+boundary+'-->)',"m"); - var result = text.match(f); - if(result && result.length >= 2) - return result[2]; - else - return null; - }, - - evaluateScript : function(content) - { - content.evalScripts(); - } +Prado.Element =
+{
+ /**
+ * Set the value of a particular element.
+ * @param string element id
+ * @param string new element value.
+ */
+ setValue : function(element, value)
+ {
+ var el = $(element);
+ if(el && typeof(el.value) != "undefined")
+ el.value = value;
+ },
+
+ select : function(element, method, value, total)
+ {
+ var el = $(element);
+ if(!el) return;
+ var selection = Prado.Element.Selection;
+ if(typeof(selection[method]) == "function")
+ {
+ control = selection.isSelectable(el) ? [el] : selection.getListElements(element,total);
+ selection[method](control, value);
+ }
+ },
+
+ click : function(element)
+ {
+ var el = $(element);
+ if(el)
+ Event.fireEvent(el,'click');
+ },
+
+ setAttribute : function(element, attribute, value)
+ {
+ var el = $(element);
+ if(!el) return;
+ if((attribute == "disabled" || attribute == "multiple") && value==false)
+ el.removeAttribute(attribute);
+ else if(attribute.match(/^on/i)) //event methods
+ {
+ try
+ {
+ eval("(func = function(event){"+value+"})");
+ el[attribute] = func;
+ }
+ catch(e)
+ {
+ throw "Error in evaluating '"+value+"' for attribute "+attribute+" for element "+element.id;
+ }
+ }
+ else
+ el.setAttribute(attribute, value);
+ },
+
+ setOptions : function(element, options)
+ {
+ var el = $(element);
+ if(!el) return;
+ if(el && el.tagName.toLowerCase() == "select")
+ {
+ el.options.length = options.length;
+ for(var i = 0; i<options.length; i++)
+ el.options[i] = new Option(options[i][0],options[i][1]);
+ }
+ },
+
+ /**
+ * A delayed focus on a particular element
+ * @param {element} element to apply focus()
+ */
+ focus : function(element)
+ {
+ var obj = $(element);
+ if(typeof(obj) != "undefined" && typeof(obj.focus) != "undefined")
+ setTimeout(function(){ obj.focus(); }, 100);
+ return false;
+ },
+
+ replace : function(element, method, content, boundary)
+ {
+ if(boundary)
+ {
+ result = Prado.Element.extractContent(this.transport.responseText, boundary);
+ if(result != null)
+ content = result;
+ }
+ if(typeof(element) == "string")
+ {
+ if($(element))
+ method.toFunction().apply(this,[element,""+content]);
+ }
+ else
+ {
+ method.toFunction().apply(this,[""+content]);
+ }
+ },
+
+ extractContent : function(text, boundary)
+ {
+ var f = RegExp('(<!--'+boundary+'-->)([\\s\\S\\w\\W]*)(<!--//'+boundary+'-->)',"m");
+ var result = text.match(f);
+ if(result && result.length >= 2)
+ return result[2];
+ else
+ return null;
+ },
+
+ evaluateScript : function(content)
+ {
+ content.evalScripts();
+ }
+}
+
+Prado.Element.Selection =
+{
+ isSelectable : function(el)
+ {
+ if(el && el.type)
+ {
+ switch(el.type.toLowerCase())
+ {
+ case 'checkbox':
+ case 'radio':
+ case 'select':
+ case 'select-multiple':
+ case 'select-one':
+ return true;
+ }
+ }
+ return false;
+ },
+
+ inputValue : function(el, value)
+ {
+ switch(el.type.toLowerCase())
+ {
+ case 'checkbox':
+ case 'radio':
+ return el.checked = value;
+ }
+ },
+
+ selectValue : function(elements, value)
+ {
+ elements.each(function(el)
+ {
+ $A(el.options).each(function(option)
+ {
+ if(typeof(value) == "boolean")
+ options.selected = value;
+ else if(option.value == value)
+ option.selected = true;
+ });
+ })
+ },
+
+ selectValues : function(elements, values)
+ {
+ selection = this;
+ values.each(function(value)
+ {
+ selection.selectValue(elements,value);
+ })
+ },
+
+ selectIndex : function(elements, index)
+ {
+ elements.each(function(el)
+ {
+ if(el.type.toLowerCase() == 'select-one')
+ el.selectedIndex = index;
+ else
+ {
+ for(var i = 0; i<el.length; i++)
+ {
+ if(i == index)
+ el.options[i].selected = true;
+ }
+ }
+ })
+ },
+
+ selectAll : function(elements)
+ {
+ elements.each(function(el)
+ {
+ if(el.type.toLowerCase() != 'select-one')
+ {
+ $A(el.options).each(function(option)
+ {
+ option.selected = true;
+ })
+ }
+ })
+ },
+
+ selectInvert : function(elements)
+ {
+ elements.each(function(el)
+ {
+ if(el.type.toLowerCase() != 'select-one')
+ {
+ $A(el.options).each(function(option)
+ {
+ option.selected = !options.selected;
+ })
+ }
+ })
+ },
+
+ selectIndices : function(elements, indices)
+ {
+ selection = this;
+ indices.each(function(index)
+ {
+ selection.selectIndex(elements,index);
+ })
+ },
+
+ selectClear : function(elements)
+ {
+ elements.each(function(el)
+ {
+ el.selectedIndex = -1;
+ })
+ },
+
+ getListElements : function(element, total)
+ {
+ elements = new Array();
+ for(i = 0; i < total; i++)
+ {
+ el = $(element+"_c"+i);
+ if(el)
+ elements.push(el);
+ }
+ return elements;
+ },
+
+ checkValue : function(elements, value)
+ {
+ elements.each(function(el)
+ {
+ if(typeof(value) == "boolean")
+ el.checked = value;
+ else if(el.value == value)
+ el.checked = true;
+ });
+ },
+
+ checkValues : function(elements, values)
+ {
+ selection = this;
+ values.each(function(value)
+ {
+ selection.checkValue(elements, value);
+ })
+ },
+
+ checkIndex : function(elements, index)
+ {
+ for(var i = 0; i<elements.length; i++)
+ {
+ if(i == index)
+ elements[i].checked = true;
+ }
+ },
+
+ checkIndices : function(elements, indices)
+ {
+ selection = this;
+ indices.each(function(index)
+ {
+ selection.checkIndex(elements, index);
+ })
+ },
+
+ checkClear : function(elements)
+ {
+ elements.each(function(el)
+ {
+ el.checked = false;
+ });
+ },
+
+ checkAll : function(elements)
+ {
+ elements.each(function(el)
+ {
+ el.checked = true;
+ })
+ },
+
+ checkInvert : function(elements)
+ {
+ elements.each(function(el)
+ {
+ el.checked != el.checked;
+ })
+ }
+};
+
+
+Prado.Element.Insert =
+{
+ append: function(element, content)
+ {
+ new Insertion.Bottom(element, content);
+ },
+
+ prepend: function(element, content)
+ {
+ new Insertion.Top(element, content);
+ },
+
+ after: function(element, content)
+ {
+ new Insertion.After(element, content);
+ },
+
+ before: function(element, content)
+ {
+ new Insertion.Before(element, content);
+ }
} -Prado.Element.Selection = -{ - isSelectable : function(el) - { - if(el && el.type) - { - switch(el.type.toLowerCase()) - { - case 'checkbox': - case 'radio': - case 'select': - case 'select-multiple': - case 'select-one': - return true; - } - } - return false; - }, - - inputValue : function(el, value) - { - switch(el.type.toLowerCase()) - { - case 'checkbox': - case 'radio': - return el.checked = value; - } - }, - - selectValue : function(elements, value) - { - elements.each(function(el) - { - $A(el.options).each(function(option) - { - if(typeof(value) == "boolean") - options.selected = value; - else if(option.value == value) - option.selected = true; - }); - }) - }, - - selectValues : function(elements, values) - { - selection = this; - values.each(function(value) - { - selection.selectValue(elements,value); - }) - }, - - selectIndex : function(elements, index) - { - elements.each(function(el) - { - if(el.type.toLowerCase() == 'select-one') - el.selectedIndex = index; - else - { - for(var i = 0; i<el.length; i++) - { - if(i == index) - el.options[i].selected = true; - } - } - }) - }, - - selectAll : function(elements) - { - elements.each(function(el) - { - if(el.type.toLowerCase() != 'select-one') - { - $A(el.options).each(function(option) - { - option.selected = true; - }) - } - }) - }, - - selectInvert : function(elements) - { - elements.each(function(el) - { - if(el.type.toLowerCase() != 'select-one') - { - $A(el.options).each(function(option) - { - option.selected = !options.selected; - }) - } - }) - }, - - selectIndices : function(elements, indices) - { - selection = this; - indices.each(function(index) - { - selection.selectIndex(elements,index); - }) - }, - - selectClear : function(elements) - { - elements.each(function(el) - { - el.selectedIndex = -1; - }) - }, - - getListElements : function(element, total) - { - elements = new Array(); - for(i = 0; i < total; i++) - { - el = $(element+"_c"+i); - if(el) - elements.push(el); - } - return elements; - }, - - checkValue : function(elements, value) - { - elements.each(function(el) - { - if(typeof(value) == "boolean") - el.checked = value; - else if(el.value == value) - el.checked = true; - }); - }, - - checkValues : function(elements, values) - { - selection = this; - values.each(function(value) - { - selection.checkValue(elements, value); - }) - }, - - checkIndex : function(elements, index) - { - for(var i = 0; i<elements.length; i++) - { - if(i == index) - elements[i].checked = true; - } - }, - - checkIndices : function(elements, indices) - { - selection = this; - indices.each(function(index) - { - selection.checkIndex(elements, index); - }) - }, - - checkClear : function(elements) - { - elements.each(function(el) - { - el.checked = false; - }); - }, - - checkAll : function(elements) - { - elements.each(function(el) - { - el.checked = true; - }) - }, - - checkInvert : function(elements) - { - elements.each(function(el) - { - el.checked != el.checked; - }) - } -}; - - -Prado.Element.Insert = -{ - append: function(element, content) - { - new Insertion.Bottom(element, content); - }, - - prepend: function(element, content) - { - new Insertion.Top(element, content); - }, - - after: function(element, content) - { - new Insertion.After(element, content); - }, - - before: function(element, content) - { - new Insertion.Before(element, content); - } -} - -Prado.WebUI = Class.create(); - -Prado.WebUI.PostBackControl = Class.create(); - -Prado.WebUI.PostBackControl.prototype = -{ - initialize : function(options) - { - this._elementOnClick = null, //capture the element's onclick function - - this.element = $(options.ID); - if(this.element) - { - if(this.onInit) - this.onInit(options); - } - }, - - onInit : function(options) - { - if(typeof(this.element.onclick)=="function") - { - this._elementOnClick = this.element.onclick; - this.element.onclick = null; - } - Event.observe(this.element, "click", this.elementClicked.bindEvent(this,options)); - }, - - elementClicked : function(event, options) - { - var src = Event.element(event); - var doPostBack = true; - var onclicked = null; - - if(this._elementOnClick) - { - var onclicked = this._elementOnClick(event); - if(typeof(onclicked) == "boolean") - doPostBack = onclicked; - } - if(doPostBack) - this.onPostBack(event,options); - if(typeof(onclicked) == "boolean" && !onclicked) - Event.stop(event); - }, - - onPostBack : function(event, options) - { - Prado.PostBack(event,options); - } -}; - -Prado.WebUI.TButton = Class.extend(Prado.WebUI.PostBackControl); -Prado.WebUI.TLinkButton = Class.extend(Prado.WebUI.PostBackControl); -Prado.WebUI.TCheckBox = Class.extend(Prado.WebUI.PostBackControl); -Prado.WebUI.TBulletedList = Class.extend(Prado.WebUI.PostBackControl); -Prado.WebUI.TImageMap = Class.extend(Prado.WebUI.PostBackControl); - -/** - * TImageButton client-side behaviour. With validation, Firefox needs - * to capture the x,y point of the clicked image in hidden form fields. - */ -Prado.WebUI.TImageButton = Class.extend(Prado.WebUI.PostBackControl); -Object.extend(Prado.WebUI.TImageButton.prototype, -{ - /** - * Only add the hidden inputs once. - */ - hasXYInput : false, - - /** - * Override parent onPostBack function, tried to add hidden forms - * inputs to capture x,y clicked point. - */ - onPostBack : function(event, options) - { - if(!this.hasXYInput) - { - this.addXYInput(event,options); - this.hasXYInput = true; - } - Prado.PostBack(event, options); - }, - - /** - * Add hidden inputs to capture the x,y point clicked on the image. - * @param event DOM click event. - * @param array image button options. - */ - addXYInput : function(event,options) - { - imagePos = Position.cumulativeOffset(this.element); - clickedPos = [event.clientX, event.clientY]; - x = clickedPos[0]-imagePos[0]+1; - y = clickedPos[1]-imagePos[1]+1; - x = x < 0 ? 0 : x; - y = y < 0 ? 0 : y; - id = options['EventTarget']; - x_input = $(id+"_x"); - y_input = $(id+"_y"); - if(x_input) - { - x_input.value = x; - } - else - { - x_input = INPUT({type:'hidden',name:id+'_x','id':id+'_x',value:x}); - this.element.parentNode.appendChild(x_input); - } - if(y_input) - { - y_input.value = y; - } - else - { - y_input = INPUT({type:'hidden',name:id+'_y','id':id+'_y',value:y}); - this.element.parentNode.appendChild(y_input); - } - } -}); - - -/** - * Radio button, only initialize if not already checked. - */ -Prado.WebUI.TRadioButton = Class.extend(Prado.WebUI.PostBackControl); -Prado.WebUI.TRadioButton.prototype.onRadioButtonInitialize = Prado.WebUI.TRadioButton.prototype.initialize; -Object.extend(Prado.WebUI.TRadioButton.prototype, -{ - initialize : function(options) - { - this.element = $(options['ID']); - if(this.element) - { - if(!this.element.checked) - this.onRadioButtonInitialize(options); - } - } -}); - - -Prado.WebUI.TTextBox = Class.extend(Prado.WebUI.PostBackControl, -{ - onInit : function(options) - { - this.options=options; - if(options['TextMode'] != 'MultiLine') - Event.observe(this.element, "keydown", this.handleReturnKey.bind(this)); - if(this.options['AutoPostBack']==true) - Event.observe(this.element, "change", Prado.PostBack.bindEvent(this,options)); - }, - - handleReturnKey : function(e) - { - if(Event.keyCode(e) == Event.KEY_RETURN) - { - var target = Event.element(e); - if(target) - { - if(this.options['AutoPostBack']==true) - { - Event.fireEvent(target, "change"); - Event.stop(e); - } - else - { - if(this.options['CausesValidation'] && typeof(Prado.Validation) != "undefined") - { - if(!Prado.Validation.validate(this.options['FormID'], this.options['ValidationGroup'], $(this.options['ID']))) - return Event.stop(e); - } - } - } - } - } -}); - -Prado.WebUI.TListControl = Class.extend(Prado.WebUI.PostBackControl, -{ - onInit : function(options) - { - Event.observe(this.element, "change", Prado.PostBack.bindEvent(this,options)); - } -}); - -Prado.WebUI.TListBox = Class.extend(Prado.WebUI.TListControl); -Prado.WebUI.TDropDownList = Class.extend(Prado.WebUI.TListControl); - -Prado.WebUI.DefaultButton = Class.create(); -Prado.WebUI.DefaultButton.prototype = -{ - initialize : function(options) - { - this.options = options; - this._event = this.triggerEvent.bindEvent(this); - Event.observe(options['Panel'], 'keydown', this._event); - }, - - triggerEvent : function(ev, target) - { - var enterPressed = Event.keyCode(ev) == Event.KEY_RETURN; - var isTextArea = Event.element(ev).tagName.toLowerCase() == "textarea"; - if(enterPressed && !isTextArea) - { - var defaultButton = $(this.options['Target']); - if(defaultButton) - { - this.triggered = true; - $('PRADO_POSTBACK_TARGET').value = this.options.EventTarget; - Event.fireEvent(defaultButton, this.options['Event']); - Event.stop(ev); - } - } - } -}; - -Prado.WebUI.TTextHighlighter=Class.create(); -Prado.WebUI.TTextHighlighter.prototype= -{ - initialize:function(id) - { - if(!window.clipboardData) return; - var options = - { - href : 'javascript:;/'+'/copy code to clipboard', - onclick : 'Prado.WebUI.TTextHighlighter.copy(this)', - onmouseover : 'Prado.WebUI.TTextHighlighter.hover(this)', - onmouseout : 'Prado.WebUI.TTextHighlighter.out(this)' - } - var div = DIV({className:'copycode'}, A(options, 'Copy Code')); - document.write(DIV(null,div).innerHTML); - } -}; - -Object.extend(Prado.WebUI.TTextHighlighter, -{ - copy : function(obj) - { - var parent = obj.parentNode.parentNode.parentNode; - var text = ''; - for(var i = 0; i < parent.childNodes.length; i++) - { - var node = parent.childNodes[i]; - if(node.innerText) - text += node.innerText == 'Copy Code' ? '' : node.innerText; - else - text += node.nodeValue; - } - if(text.length > 0) - window.clipboardData.setData("Text", text); - }, - - hover : function(obj) - { - obj.parentNode.className = "copycode copycode_hover"; - }, - - out : function(obj) - { - obj.parentNode.className = "copycode"; - } -}); - - -Prado.WebUI.TCheckBoxList = Base.extend( -{ - constructor : function(options) - { - for(var i = 0; i<options.ItemCount; i++) - { - var checkBoxOptions = Object.extend( - { - ID : options.ListID+"_c"+i, - EventTarget : options.ListName+"$c"+i - }, options); - new Prado.WebUI.TCheckBox(checkBoxOptions); - } - } -}); - -Prado.WebUI.TRadioButtonList = Base.extend( -{ - constructor : function(options) - { - for(var i = 0; i<options.ItemCount; i++) - { - var radioButtonOptions = Object.extend( - { - ID : options.ListID+"_c"+i, - EventTarget : options.ListName+"$c"+i - }, options); - new Prado.WebUI.TRadioButton(radioButtonOptions); - } - } +Prado.WebUI = Class.create();
+
+Prado.WebUI.PostBackControl = Class.create();
+
+Prado.WebUI.PostBackControl.prototype =
+{
+ initialize : function(options)
+ {
+ this._elementOnClick = null, //capture the element's onclick function
+
+ this.element = $(options.ID);
+ if(this.element)
+ {
+ if(this.onInit)
+ this.onInit(options);
+ }
+ },
+
+ onInit : function(options)
+ {
+ if(typeof(this.element.onclick)=="function")
+ {
+ this._elementOnClick = this.element.onclick;
+ this.element.onclick = null;
+ }
+ Event.observe(this.element, "click", this.elementClicked.bindEvent(this,options));
+ },
+
+ elementClicked : function(event, options)
+ {
+ var src = Event.element(event);
+ var doPostBack = true;
+ var onclicked = null;
+
+ if(this._elementOnClick)
+ {
+ var onclicked = this._elementOnClick(event);
+ if(typeof(onclicked) == "boolean")
+ doPostBack = onclicked;
+ }
+ if(doPostBack)
+ this.onPostBack(event,options);
+ if(typeof(onclicked) == "boolean" && !onclicked)
+ Event.stop(event);
+ },
+
+ onPostBack : function(event, options)
+ {
+ Prado.PostBack(event,options);
+ }
+};
+
+Prado.WebUI.TButton = Class.extend(Prado.WebUI.PostBackControl);
+Prado.WebUI.TLinkButton = Class.extend(Prado.WebUI.PostBackControl);
+Prado.WebUI.TCheckBox = Class.extend(Prado.WebUI.PostBackControl);
+Prado.WebUI.TBulletedList = Class.extend(Prado.WebUI.PostBackControl);
+Prado.WebUI.TImageMap = Class.extend(Prado.WebUI.PostBackControl);
+
+/**
+ * TImageButton client-side behaviour. With validation, Firefox needs
+ * to capture the x,y point of the clicked image in hidden form fields.
+ */
+Prado.WebUI.TImageButton = Class.extend(Prado.WebUI.PostBackControl);
+Object.extend(Prado.WebUI.TImageButton.prototype,
+{
+ onInit : function(options)
+ {
+ this.hasXYInput = false;
+ },
+
+ /**
+ * Override parent onPostBack function, tried to add hidden forms
+ * inputs to capture x,y clicked point.
+ */
+ onPostBack : function(event, options)
+ {
+ if(!this.hasXYInput)
+ {
+ this.addXYInput(event,options);
+ this.hasXYInput = true;
+ }
+ Prado.PostBack(event, options);
+ },
+
+ /**
+ * Add hidden inputs to capture the x,y point clicked on the image.
+ * @param event DOM click event.
+ * @param array image button options.
+ */
+ addXYInput : function(event,options)
+ {
+ imagePos = Position.cumulativeOffset(this.element);
+ clickedPos = [event.clientX, event.clientY];
+ x = clickedPos[0]-imagePos[0]+1;
+ y = clickedPos[1]-imagePos[1]+1;
+ x = x < 0 ? 0 : x;
+ y = y < 0 ? 0 : y;
+ id = options['EventTarget'];
+ x_input = $(id+"_x");
+ y_input = $(id+"_y");
+ if(x_input)
+ {
+ x_input.value = x;
+ }
+ else
+ {
+ x_input = INPUT({type:'hidden',name:id+'_x','id':id+'_x',value:x});
+ this.element.parentNode.appendChild(x_input);
+ }
+ if(y_input)
+ {
+ y_input.value = y;
+ }
+ else
+ {
+ y_input = INPUT({type:'hidden',name:id+'_y','id':id+'_y',value:y});
+ this.element.parentNode.appendChild(y_input);
+ }
+ }
+});
+
+
+/**
+ * Radio button, only initialize if not already checked.
+ */
+Prado.WebUI.TRadioButton = Class.extend(Prado.WebUI.PostBackControl);
+Prado.WebUI.TRadioButton.prototype.onRadioButtonInitialize = Prado.WebUI.TRadioButton.prototype.initialize;
+Object.extend(Prado.WebUI.TRadioButton.prototype,
+{
+ initialize : function(options)
+ {
+ this.element = $(options['ID']);
+ if(this.element)
+ {
+ if(!this.element.checked)
+ this.onRadioButtonInitialize(options);
+ }
+ }
+});
+
+
+Prado.WebUI.TTextBox = Class.extend(Prado.WebUI.PostBackControl,
+{
+ onInit : function(options)
+ {
+ this.options=options;
+ if(options['TextMode'] != 'MultiLine')
+ Event.observe(this.element, "keydown", this.handleReturnKey.bind(this));
+ if(this.options['AutoPostBack']==true)
+ Event.observe(this.element, "change", Prado.PostBack.bindEvent(this,options));
+ },
+
+ handleReturnKey : function(e)
+ {
+ if(Event.keyCode(e) == Event.KEY_RETURN)
+ {
+ var target = Event.element(e);
+ if(target)
+ {
+ if(this.options['AutoPostBack']==true)
+ {
+ Event.fireEvent(target, "change");
+ Event.stop(e);
+ }
+ else
+ {
+ if(this.options['CausesValidation'] && typeof(Prado.Validation) != "undefined")
+ {
+ if(!Prado.Validation.validate(this.options['FormID'], this.options['ValidationGroup'], $(this.options['ID'])))
+ return Event.stop(e);
+ }
+ }
+ }
+ }
+ }
+});
+
+Prado.WebUI.TListControl = Class.extend(Prado.WebUI.PostBackControl,
+{
+ onInit : function(options)
+ {
+ Event.observe(this.element, "change", Prado.PostBack.bindEvent(this,options));
+ }
+});
+
+Prado.WebUI.TListBox = Class.extend(Prado.WebUI.TListControl);
+Prado.WebUI.TDropDownList = Class.extend(Prado.WebUI.TListControl);
+
+Prado.WebUI.DefaultButton = Class.create();
+Prado.WebUI.DefaultButton.prototype =
+{
+ initialize : function(options)
+ {
+ this.options = options;
+ this._event = this.triggerEvent.bindEvent(this);
+ Event.observe(options['Panel'], 'keydown', this._event);
+ },
+
+ triggerEvent : function(ev, target)
+ {
+ var enterPressed = Event.keyCode(ev) == Event.KEY_RETURN;
+ var isTextArea = Event.element(ev).tagName.toLowerCase() == "textarea";
+ if(enterPressed && !isTextArea)
+ {
+ var defaultButton = $(this.options['Target']);
+ if(defaultButton)
+ {
+ this.triggered = true;
+ $('PRADO_POSTBACK_TARGET').value = this.options.EventTarget;
+ Event.fireEvent(defaultButton, this.options['Event']);
+ Event.stop(ev);
+ }
+ }
+ }
+};
+
+Prado.WebUI.TTextHighlighter=Class.create();
+Prado.WebUI.TTextHighlighter.prototype=
+{
+ initialize:function(id)
+ {
+ if(!window.clipboardData) return;
+ var options =
+ {
+ href : 'javascript:;/'+'/copy code to clipboard',
+ onclick : 'Prado.WebUI.TTextHighlighter.copy(this)',
+ onmouseover : 'Prado.WebUI.TTextHighlighter.hover(this)',
+ onmouseout : 'Prado.WebUI.TTextHighlighter.out(this)'
+ }
+ var div = DIV({className:'copycode'}, A(options, 'Copy Code'));
+ document.write(DIV(null,div).innerHTML);
+ }
+};
+
+Object.extend(Prado.WebUI.TTextHighlighter,
+{
+ copy : function(obj)
+ {
+ var parent = obj.parentNode.parentNode.parentNode;
+ var text = '';
+ for(var i = 0; i < parent.childNodes.length; i++)
+ {
+ var node = parent.childNodes[i];
+ if(node.innerText)
+ text += node.innerText == 'Copy Code' ? '' : node.innerText;
+ else
+ text += node.nodeValue;
+ }
+ if(text.length > 0)
+ window.clipboardData.setData("Text", text);
+ },
+
+ hover : function(obj)
+ {
+ obj.parentNode.className = "copycode copycode_hover";
+ },
+
+ out : function(obj)
+ {
+ obj.parentNode.className = "copycode";
+ }
+});
+
+
+Prado.WebUI.TCheckBoxList = Base.extend(
+{
+ constructor : function(options)
+ {
+ for(var i = 0; i<options.ItemCount; i++)
+ {
+ var checkBoxOptions = Object.extend(
+ {
+ ID : options.ListID+"_c"+i,
+ EventTarget : options.ListName+"$c"+i
+ }, options);
+ new Prado.WebUI.TCheckBox(checkBoxOptions);
+ }
+ }
+});
+
+Prado.WebUI.TRadioButtonList = Base.extend(
+{
+ constructor : function(options)
+ {
+ for(var i = 0; i<options.ItemCount; i++)
+ {
+ var radioButtonOptions = Object.extend(
+ {
+ ID : options.ListID+"_c"+i,
+ EventTarget : options.ListName+"$c"+i
+ }, options);
+ new Prado.WebUI.TRadioButton(radioButtonOptions);
+ }
+ }
}); diff --git a/framework/Web/Javascripts/prado/controls.js b/framework/Web/Javascripts/prado/controls.js index 2127732d..890b5e66 100644 --- a/framework/Web/Javascripts/prado/controls.js +++ b/framework/Web/Javascripts/prado/controls.js @@ -63,10 +63,10 @@ Prado.WebUI.TImageMap = Class.extend(Prado.WebUI.PostBackControl); Prado.WebUI.TImageButton = Class.extend(Prado.WebUI.PostBackControl);
Object.extend(Prado.WebUI.TImageButton.prototype,
{
- /**
- * Only add the hidden inputs once.
- */
- hasXYInput : false,
+ onInit : function(options)
+ {
+ this.hasXYInput = false;
+ },
/**
* Override parent onPostBack function, tried to add hidden forms
diff --git a/framework/Web/UI/WebControls/TImageButton.php b/framework/Web/UI/WebControls/TImageButton.php index 8a6f615b..8c1f2190 100644 --- a/framework/Web/UI/WebControls/TImageButton.php +++ b/framework/Web/UI/WebControls/TImageButton.php @@ -105,7 +105,7 @@ class TImageButton extends TImage implements IPostBackDataHandler, IPostBackEven $writer->addAttribute('name',$uniqueID);
if($this->getEnabled(true))
{
- if($this->canCauseValidation() && $this->getEnableClientScript())
+ if($this->getEnableClientScript()) //remove $this->canCauseValidation() ?
$this->renderClientControlScript($writer);
}
else if($this->getEnabled()) // in this case, parent will not render 'disabled'
@@ -176,7 +176,6 @@ class TImageButton extends TImage implements IPostBackDataHandler, IPostBackEven {
$this->_x=intval($values["{$uid}_x"]);
$this->_y=intval($values["{$uid}_y"]);
- $this->getPage()->setPostBackEventTarget($this);
}
return false;
}
|