--- /dev/null
+/* generate fieldmapper javascript classes. This expects a global variable
+ called 'fmclasses' to be fleshed with the classes we need to build */
+
+function Fieldmapper() {}
+
+var errorstr = "Attempt to build fieldmapper object with non-array";
+
+Fieldmapper.prototype.clone = function() {
+ var obj = new this.constructor();
+
+ for( var i in this.a ) {
+ var thing = this.a[i];
+ if(thing == null) continue;
+
+ if( thing._isfieldmapper ) {
+ obj.a[i] = thing.clone();
+ } else {
+
+ if(instanceOf(thing, Array)) {
+ obj.a[i] = new Array();
+
+ for( var j in thing ) {
+
+ if( thing[j]._isfieldmapper )
+ obj.a[i][j] = thing[j].clone();
+ else
+ obj.a[i][j] = thing[j];
+ }
+ } else {
+ obj.a[i] = thing;
+ }
+ }
+ }
+ return obj;
+}
+
+function FMEX(message) { this.message = message; }
+FMEX.toString = function() { return "FieldmapperException: " + this.message + "\n"; }
+
+var string = "";
+for( var cl in fmclasses ) {
+ string += cl + ".prototype = new Fieldmapper(); " +
+ cl + ".prototype.constructor = " + cl + ";" +
+ cl + ".baseClass = Fieldmapper.constructor;" +
+ "function " + cl + "(a) { " +
+ "this.classname = \"" + cl + "\";" +
+ "this._isfieldmapper = true;" +
+ "if(a) { if(a.constructor == Array) this.a = a; else throw new FMEX(errorstr);} else this.a = []}";
+
+ string += cl + "._isfieldmapper=true;";
+
+ fmclasses[cl].push('isnew');
+ fmclasses[cl].push('ischanged');
+ fmclasses[cl].push('isdeleted');
+
+ for( var pos in fmclasses[cl] ) {
+ var p = parseInt(pos);
+ var field = fmclasses[cl][pos];
+ string += cl + ".prototype." + field +
+ "=function(n){if(arguments.length == 1)this.a[" +
+ p + "]=n;return this.a[" + p + "];};";
+ }
+}
+eval(string);
+
+