// JScript File

<!--


    function getMDArraySortDef(ord,dim,cmpA,cmpB) {
        ord = ( !(ord==undefined) ? ( ord=="asc" ? -1 : ( ord=="desc" ? 1 : ord ) ) : 0 );
        dim = ( !(dim==undefined) ? dim : 1 );
        var x;
        var y;

        if ( !(ord==0) ) {
            var dstr = "";

            if ( dim>1 ) {
                for (var idx=2;idx<dim+1;idx++) {
                    dstr += "[0]";
                }
            }

            var estr = "x="
                +   ( ord<0 ? "cmpA" : "cmpB" ) 
                +   dstr
                +   ";"
                +   "y="
                +   ( ord<0 ? "cmpB" : "cmpA" ) 
                +   dstr
                +   ";";

            eval(estr);

            return ((x < y) ? -1 : ((x > y) ? 1 : 0));

        } else return 0;
    }

    function sortMDArray(arr,ord,dim) {
        arr = ( !(arr==null) && !(arr==undefined) ? arr : new Array() );
        ord = ( !(ord==undefined) ? ( ord=="asc" ? -1 : ( ord=="desc" ? 1 : ord ) ) : 0 );
        dim = ( !(dim==undefined) ? dim : 1 );

        var fn = function(cmpA,cmpB) {
            var ret = getMDArraySortDef(ord,dim,cmpA,cmpB);
            return ret;
        }

        arr.sort(fn);
    }

    function removeOrderedArrayDupes(arr,ord) {
        arr = ( !(arr==null) && !(arr==undefined) ? arr : new Array() );
        ord = ( !(ord==undefined) ? ( ord=="asc" ? -1 : ( ord=="desc" ? 1 : ord ) ) : 0 );

        if ( !(ord==0) ) sortMDArray(arr,ord,1);

        var idx=1;
        while ( idx<=arr.length ) {
            if ( arr[idx] != arr[idx-1] ) idx++;
            else arr.splice(idx,1);
        }
    }

    function trim(stringToTrim) {
        stringToTrim = ( stringToTrim.toString ? stringToTrim.toString() : String(stringToTrim) );
        
	    return stringToTrim.replace(/^\s+|\s+$/g,"");
    }
    function ltrim(stringToTrim) {
        stringToTrim = ( stringToTrim.toString ? stringToTrim.toString() : String(stringToTrim) );

	    return stringToTrim.replace(/^\s+/,"");
    }
    function rtrim(stringToTrim) {
        stringToTrim = ( stringToTrim.toString ? stringToTrim.toString() : String(stringToTrim) );

	    return stringToTrim.replace(/\s+$/,"");
    }

    function isInteger(s) {
        return (s.toString().search(/^-?[0-9]+$/) == 0);
    }
    
    function isUnsignedInteger(s) {
        return (s.toString().search(/^[0-9]+$/) == 0);
    }

    function isArray(obj) {
        if (obj.constructor.toString().indexOf("Array") == -1)
            return false;
        else
            return true;
    }


////////////////////////////////////////////////////////////////////////////
/// KeyValuePropertyObject ///////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
    function KeyValuePropertyObject() {
        var obj_inst_args = ( ( ( arguments.length>1 ) && ( arguments[0]==APPOBJ_ARGS_TOKEN ) ) ? arguments[1] : arguments );

        if ( !(this instanceof KeyValuePropertyObject) ) {
            return new KeyValuePropertyObject(APPOBJ_ARGS_TOKEN,obj_inst_args);            
        } else {
            this._objbase = AppObjBaseClass;
            this._objbase();
            this._objclass_key = obj_inst_args;
            
            if ( this._objbaseInit ) this._objbaseInit();
        }
        
        this.prop_init_flag = false;
        this.obj_init_flag = false;

        this.MAXITEMSLENGTH = 1;
        this.length = 0;
        this.items = new Array();

        var OBJERRIDX_NIL = 0;
        var OBJERRIDX_ARG = 1;
        var OBJERRIDX_VAL = 2;
        var OBJERRIDX_UND = 3;
        var OBJERRIDX_KEY = 4;
        var OBJERRIDX_PRP = 5;
        
        var obj_volmbr_array = new Array(
            '_objbase',
            '_objclass_key',
            '_objbaseInit',
            'initObj',
            'obj_init_args',
            'obj_init_flag');

        var obj_errmsg_array = new Array(
            "",
            "Error: cannot initialize KeyValuePropertyObject instance\nReason: invalid number of typed arguments were passed.",
            "Error: cannot set KeyValuePropertyObject value\nReason: either 0 or more than 1 arguments were passed.",
            "Error: cannot get or set KeyValuePropertyObject key or value\nReason: object has not been properly initialized.",
            "Error: cannot get or set KeyValuePropertyObject value\nReason: a key and/or value were not supplied.",
            "Error: cannot initialize KeyValuePropertyObject property methods\nReason: unknown." );
        
        this.initProp = function() {        
            var obj_propval_set_fn = "setProperty";
            var obj_propval_get_fn = "getProperty";
            
            this[obj_propval_get_fn] = function(key) {
                if ( this.hasProperty(key) ) return this.items[key].toString();
                else return undefined;
            }
            this[obj_propval_set_fn] = function(key,val) {
                if ( this.hasProperty(key) ) {
                    this.items[key] = ( !(val==undefined) && !(val==null) ? val : undefined );
                    return this.items[key];
                } else return undefined;
            }
            
            if ( this[obj_propval_set_fn] 
                    && !(this[obj_propval_set_fn]==undefined) 
                    && this[obj_propval_get_fn] 
                    && !(this[obj_propval_get_fn]==undefined) ) {
                    
                this.prop_init_flag = true;
                return this.prop_init_flag;
            } else {
                alert(obj_errmsg_array[OBJERRIDX_PRP]);
                return OBJERRIDX_PRP;
            }           
        }

        this.initObj = function() {
            var fn_args = obj_inst_args;
            var fn_err = OBJERRIDX_NIL;
            var fn_val = null;

            if ( fn_err==OBJERRIDX_NIL ) fn_err = this.objErr(OBJERRIDX_ARG,fn_args); 
            
            if ( fn_err==OBJERRIDX_NIL ) this.clearAll();

            if ( fn_err==OBJERRIDX_NIL ) fn_val = this.addProperty(APPOBJ_ARGS_TOKEN,fn_args);

            if ( fn_err==OBJERRIDX_NIL ) {
                fn_val = this;
                if ( !this.obj_init_flag ) this.obj_init_flag = true;
            }
            
            return ( !(fn_val==undefined) ? fn_val : null );
        }
       
        this.objErr = function(test,args) {
            var fn_val = OBJERRIDX_NIL;

            switch ( test ) {
                case OBJERRIDX_ARG :
                    if ( !(args.length%2==0) || args.length>2 ) fn_val = test;
                    break;
            }
            
            return fn_val;
        }
       
        this.hasProperty = function(key) {
            var fn_val = false;
            var fn_err = this.objErr(OBJERRIDX_KEY,key);
            
            if ( !(fn_err==OBJERRIDX_NIL) ) {
                alert(objErrMsg[OBJERRIDX_KEY]);
            } else {
                if ( !(typeof this.items[key]=='undefined') ) {
                    fn_val = true;
                }
            }

            return fn_val;
        }
        
        this.getPropertyName = function() {
            var fn_val = false;
            
            for ( var key in this.items ) {
                if ( !(typeof this.items[key]=='undefined') && !(typeof this[key]=='undefined') ) {
                    fn_val = key;
                }
            }
            
            return fn_val;
        }

        this.addProperty = function(in_args) {
            var fn_args = ( ( ( arguments.length>1 ) && ( arguments[0]==APPOBJ_ARGS_TOKEN ) ) ? arguments[1] : arguments );
            var fn_val = undefined;
            var fn_err = OBJERRIDX_NIL;
           
            var key;
            var val;

            fn_err = this.objErr(OBJERRIDX_ARG,fn_args);
            
            if ( !(fn_err==OBJERRIDX_NIL) ) {
                alert(objErrMsg[fn_err]);
            }

            if ( fn_err==OBJERRIDX_NIL ) {
                for ( var i=0; ( i<fn_args.length ) 
                        && ( fn_err==OBJERRIDX_NIL ) 
                        && ( this.length<( this.MAXITEMSLENGTH > 0 ? this.MAXITEMSLENGTH : eval(this.length+1) ) ); i++ ) {
                        
                    key = undefined;
                    val = undefined;

                    if ( (typeof fn_args[i]=='object') && fn_args[i].getObjectClassName && ( fn_args[i].getObjectClassName()=='KeyValuePropertyObject' ) ) {
                        if ( !(fn_args[i].length==0) ) {
                            key = fn_args[i].getPropertyName();
                            val = fn_args[i].getPropertyValue();
                        }
                    } else {
                        key = ( !(fn_args[i]==undefined) && !(fn_args[i]==null) ? fn_args[i] : undefined );
                        val = ( fn_args.length>eval(i+1) && !(fn_args[i+1]==undefined) && !(fn_args[i+1]==null) ? fn_args[i+1] : undefined );
                        i++;
                    }
                    
                    if ( !(key==undefined) ) {
                        var key_exists = this.hasProperty(key);
                        
                        this.items[key] = val;
                        
                        this.length+= ( key_exists ? 0 : 1 );
                    }
                }
            }

            if ( fn_err==OBJERRIDX_NIL ) fn_val = this;
            
            return fn_val;
        }
        

        this.clearAll = function() {
            for ( var key in this.items ) {
                delete this.items[key];
                
                this.length-= ( !(this.hasProperty(key)) ? 1 : 0 );
            }
        }

        this.initProp();
        this.initObj();
        
        if ( this.obj_init_flag ) {
            for (var i=0; i<obj_volmbr_array.length; i++) {
                delete this[obj_volmbr_array[i]];
            }

            return this;
        } else return null;
    }
    KeyValuePropertyObject.prototype = new AppObjBaseClass();
   

////////////////////////////////////////////////////////////////////////////
/// KeyValuePropertiesObject /////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
    function KeyValuePropertiesObject() {
        var obj_inst_args = ( ( ( arguments.length>1 ) && ( arguments[0]==APPOBJ_ARGS_TOKEN ) ) ? arguments[1] : arguments );

        if ( !(this instanceof KeyValuePropertiesObject) ) {
            return new KeyValuePropertiesObject(APPOBJ_ARGS_TOKEN,obj_inst_args);            
        } else {
            this._objbase = KeyValuePropertyObject;
            this._objbase();
            this._objclass_key = obj_inst_args;
            
            if ( this._objbaseInit ) this._objbaseInit();
        }
        
        this.obj_init_flag = false;

        this.MAXITEMSLENGTH = 0;
        this.length = 0;
        this.items = new Array();

        var OBJERRIDX_NIL = 0;
        var OBJERRIDX_ARG = 1;
        var OBJERRIDX_VAL = 2;
        var OBJERRIDX_UND = 3;
        var OBJERRIDX_KEY = 4;

        var obj_volmbr_array = new Array(
            '_objbase',
            '_objclass_key',
            '_objbaseInit',
            'initObj',
            'obj_init_args',
            'obj_init_flag',
            'getPropertyName');

        var obj_errmsg_array = new Array(
            "",
            "Error: cannot initialize KeyValuePropertiesObject instance\nReason: invalid number of typed arguments were passed.",
            "Error: cannot set KeyValuePropertyObject value\nReason: either 0 or more than 1 arguments were passed.",
            "Error: cannot get or set KeyValuePropertiesObject key or value\nReason: object has not been properly initialized.",
            "Error: cannot get or set KeyValuePropertiesObject value\nReason: a key and/or value were not supplied.");
        
        this.initObj = function() {
            var fn_args = obj_inst_args;
            var fn_err = OBJERRIDX_NIL;
            var fn_val = null;
           
            fn_err = this.objErr(OBJERRIDX_ARG,fn_args); 
            
            if ( fn_err==OBJERRIDX_NIL ) this.clearAll();

            if ( fn_err==OBJERRIDX_NIL ) fn_val = this.addProperties(APPOBJ_ARGS_TOKEN,fn_args);

            if ( fn_err==OBJERRIDX_NIL ) {
                fn_val = this;
                if ( !this.obj_init_flag ) this.obj_init_flag = true;
            }
            
            return ( !(fn_val==undefined) ? fn_val : null );
        }
        
        this.objErr = function(test,args) {
            var fn_val = OBJERRIDX_NIL;

            switch ( test ) {
                case OBJERRIDX_ARG :
                    var keycnt = 0;
                    var valcnt = 0;
                    
                    for ( var i=0; i<args.length; i++ ) {
                        if ( !((typeof args[i]=='object') 
                                && args[i].getObjectClassName 
                                && ( ( args[i].getObjectClassName()=='KeyValuePropertyObject' ) 
                                    || ( args[i].getObjectClassName()=='KeyValuePropertiesObject' ))) ) {
                                    
                            keycnt++;
                            if ( args.length>eval(i+1) ) {
                                valcnt++;
                            }
                            i++;
                        }
                    }

                    if ( !(keycnt==valcnt) ) {
                        fn_val = test;
                    }
                    break;
            }
            
            return fn_val;
        }
       
        this.hasProperty = function(key) {
            var fn_val = false;
            var fn_err = this.objErr(OBJERRIDX_KEY,key);
            
            if ( !(fn_err==OBJERRIDX_NIL) ) {
                alert(objErrMsg[OBJERRIDX_KEY]);
            } else {
                if ( !(typeof this.items[key]=='undefined') ) {
                    fn_val = true;
                }
            }

            return fn_val;
        }
        
        this.addProperties = function() {
            var fn_args = ( ( ( arguments.length>1 ) && ( arguments[0]==APPOBJ_ARGS_TOKEN ) ) ? arguments[1] : arguments );
            var fn_val = undefined;
            var fn_err = OBJERRIDX_NIL;
           
            var key;
            var val;

            fn_err = this.objErr(OBJERRIDX_ARG,fn_args);
            
            if ( !(fn_err==OBJERRIDX_NIL) ) {
                alert(objErrMsg[fn_err]);
            }
            
            if ( fn_err==OBJERRIDX_NIL ) {
                for ( var i=0; ( i<fn_args.length ) 
                        && ( fn_err==OBJERRIDX_NIL ) 
                        && ( this.length<( this.MAXITEMSLENGTH > 0 ? this.MAXITEMSLENGTH : eval(this.length+1) ) ); i++ ) {
                        
                    key = undefined;
                    val = undefined;

                    if ( (typeof fn_args[i]=='object') && fn_args[i].getObjectClassName && ( fn_args[i].getObjectClassName()=='KeyValuePropertiesObject' ) ) {
                        for ( var j in fn_args[i].items ) {
                            key = j;
                            val = fn_args[i][j];

                            if ( !(key==undefined) ) {
                                var key_exists = this.hasProperty(key);
                                
                                this.items[key] = val;
                                
                                this.length+= ( key_exists ? 0 : 1 );
                            }
                        }
                    } else {
                        if ( (typeof fn_args[i]=='object') && fn_args[i].getObjectClassName && ( fn_args[i].getObjectClassName()=='KeyValuePropertyObject' ) ) {
                            if ( !(fn_args[i].length==0) ) {
                                key = fn_args[i].getPropertyName();
                                val = fn_args[i].getPropertyValue();
                            }
                        } else {
                            key = ( fn_args.length>i && !(fn_args[i]==undefined) && !(fn_args[i]==null) ? fn_args[i] : undefined );
                            val = ( fn_args.length>eval(i+1) && !(fn_args[i+1]==undefined) && !(fn_args[i+1]==null) ? fn_args[i+1] : undefined );
                            i++;
                        }
                        
                        if ( !(key==undefined) ) {
                            var key_exists = this.hasProperty(key);
                            
                            this.items[key] = val;
                            
                            this.length+= ( key_exists ? 0 : 1 );
                        }
                    }
                }
            }
            
            if ( fn_err==OBJERRIDX_NIL ) fn_val = this;
            
            return fn_val;
        }
        
        this.removeProperty = function(key) {
            if ( this.hasProperty(key) ) {
                delete this.items[key];
                
                this.length-= ( !(this.hasProperty(key)) ? 1 : 0 );
            }
        }
        
        this.initObj();
        
        if ( this.obj_init_flag ) {
            for (var i=0; i<obj_volmbr_array.length; i++) {
                delete this[obj_volmbr_array[i]];
            }

            return this;
        } else return null;
    }
    KeyValuePropertiesObject.prototype = new KeyValuePropertyObject();

////////////////////////////////////////////////////////////////////////////
/// HashItems //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
    function HashItems() {
        if ( !(this instanceof HashItems) ) {
            var evalstr = 'new HashItems(';
            
            if ( arguments.length != 0 ) {
                var fn_argsarr = new Array();
                var delimstr = "";
                
                for ( i=0; i<arguments.length; i++ ) {
                    delimstr = ( (typeof arguments[i])=='string' ? "\"" : "" );
                    fn_argsarr[fn_argsarr.length] = delimstr + arguments[i].replace(/'/g,"\'") + delimstr; 
                }
                
                evalstr += fn_argsarr.join();
            }
            
            evalstr += ');';
            
            return eval(evalstr);
        }

        this.HashArray = HashArray;
        this.HashArray();
        this._objclass_key = this.obj_init_args;
    }
    HashItems.prototype = new HashArray();


////////////////////////////////////////////////////////////////////////////
/// HashArray //////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
    function HashArray() {
        if ( !(this instanceof HashArray) ) return new HashArray();

        this.AppObjBaseClass = AppObjBaseClass;
        this.AppObjBaseClass();
        this._objclass_key = arguments;

	    this.length = 0;
	    this.items = new Array();

        if ( !(this._objclass_key.length%2==0) ) {
            alert("HashArray:constructor()\ncannot set object because there are an invalid number of arguments.");
        } else {
	        for (var i = 0; i < this._objclass_key.length; i++) {
		        if (typeof(arguments[i]) != 'undefined') {
		            if ( this._objclass_key[i].getObjectClass && ( this._objclass_key[i].getObjectClass()=="KeyValuePropertyObject" ) ) {
			            this.items[this._objclass_key[i].getPropertyName()] = this._objclass_key[i].getPropertyValue();
		            } else {
			            this.items[this._objclass_key[i]] = this._objclass_key[i + 1];
			            this[this._objclass_key[i]] = this.items[this._objclass_key[i]];
			            i++
		            }
		            this.length++;
		        }
	        }
        }
       
	    this.removeItem = function(in_key) {
		    var tmp_previous;
		    if (typeof(this.items[in_key]) != 'undefined') {
			    this.length--;
			    var tmp_previous = this.items[in_key];
			    delete this.items[in_key];
			    delete this[in_key];
		    }
    	   
		    return tmp_previous;
	    }

	    this.getItem = function(in_key) {
		    return this.items[in_key];
	    }

	    this.setItem = function(in_key, in_value) {
            if ( arguments.length==0 || !(arguments.length%2==0) ) {
                alert("HashArray:setItem()\ncannot set item because there are an invalid number of arguments.");
            } else {
		        var tmp_previous;
	            for (var i = 0; i < arguments.length; i += 2) {
	                var in_key=arguments[i];
	                var in_value=arguments[i + 1];

		            if (typeof(this.items[in_key]) == 'undefined') {
			            this.length++;
		            }
		            else {
			            tmp_previous = this.items[in_key];
		            }

		            this[in_key] = in_value;
		            this.items[in_key] = this[in_key];
		        }
            }
    	   
		    return tmp_previous;
	    }

	    this.hasItem = function(in_key) {
		    return typeof(this.items[in_key]) != 'undefined';
	    }

	    this.clear = function() {
		    for (var i in this.items) {
			    delete this.items[i];
			    delete this[i];
		    }

		    this.length = 0;
	    }
    }
    HashArray.prototype = new AppObjBaseClass();

/*
    var tempImage;

    function showDimensions() {
        var imageName = document.forms[0].elements['myFile'].value;
        if (imageName != '') {
            imageName = 'file:///' + escape(imageName.split('\\').join('/'));
            imageName = imageName.split('%3A').join(':');

            tempImage = new Image();
            tempImage.onload = getDimensions;
            tempImage.src = imageName + '?randParam=' + new Date().getTime();
            // append a timestamp to avoid caching issues - which happen if you overwrite any image with one of different dimensions, and try to get the dimensions again
            // even with cache settings to max, in both ff and ie!
        }
    }

    function getimensions() {
        alert(tempImage.width + ' x ' + tempImage.height);
    }
    function iLoad(isrc) {
        var oImg = new Image();
        oImg.src = isrc;
        if (oImg.complete) {
            window.alert(oImg.src + ' ' + oImg.width + ' x ' + oImg.height);
        }
        else {
            window.setTimeout('iLoad(imgsrc)', 1000);
        }
    }

*/

    var ImageDimsInterval = 0;

    function getImageDims(isrc,cbfunc) {
	var ImageDimsObj = null;
	var ImageObj = null;

	if ( !(isrc==undefined) ) {
	    var id = "" + new Date().getTime();

            ImageObj = new Image();
	    ImageObj.onreadystatechange = function() {
		switch ( ImageObj.readyState ) {
			case "complete":
	    			ImageDimsObj = {"width": ImageObj.width, "height": ImageObj.height};

				if ( typeof cbfunc=='function' ) cbfunc(ImageDimsObj);
				break;
		} 
	    }

	    ImageObj.id = id
	    ImageObj.src = isrc;
	}

	return;
    }

//-->