/*
 * PS CLIENT v1
 *
 *
 * TODO move the following back to the cross compiler project:
 * Decorator
 * ImageDecorator
 * Component
 * ComponentEvent
 *
 */

/* xtra stuff for prototype */
Element.addMethods({
  getInnerText: function(element) {
    element = $(element);
    return element.innerText && !window.opera ? element.innerText
      : element.innerHTML.stripScripts().unescapeHTML().replace(/[\n\r\s]+/g, ' ');
  }
});



function set_up_transition(e,x,y)
{
//	e.style.transitionProperty = prop;
//	e.style.transitionDuration = dur;
//	e.style.transitionTimingFunction = f;
//	e.style.webkitTransitionProperty = prop;
//	e.style.webkitTransitionDuration = dur;
//	e.style.webkitTransitionTimingFunction = f;
//	e.style.mozTransitionProperty = prop;
//	e.style.mozTransitionDuration = dur;
//	e.style.mozTransitionTimingFunction = f;
//	e.style.oTransitionProperty = prop;
//	e.style.oTransitionDuration = dur;
//	e.style.oTransitionTimingFunction = f;

	  e.style.webkitTransitionProperty = '-webkit-transform';
      e.style.webkitTransitionTimingFunction = 'cubic-bezier(0,0,0.25,1)';
      e.style.webkitTransitionDuration = '.3s';
      e.style.webkitTransform = "translate3d("+x+"px,"+y+"px,0)";  // PX is real important!
// Logger.log(e+" "+x+","+y)
}


/*
  Entity
  import com_pagesociety_web_amf_AmfLong
*/

var com_pagesociety_persistence_Entity = Class.create(
{
	initialize: function(type, id)
	{
		this._def/*EntityDefinition*/;
		this._type/*String*/;
		this._id/*AmfLong*/;
		this._attributes = {  }/*Object*/;
		this._dirty_attributes = [  ]/*Array*/;
		this._fieldnames = [  ]/*Array*/;
		this._ps_clazz = "Entity";
		type = (type ? type : null);
		id = (id ? id : -1);
		if (type instanceof String)
		{
			this._type = type;
			this._id = id < 1 ? com_pagesociety_persistence_Entity.UNDEFINED : id;
		}
		else
		{
			this._type = type.type;
			this._id = type.id;
			this._attributes = type.attributes;
		}
		this._attributes.id = this.id;

	},
	/*
	  param name String
	  param attr Object
	  returns void
	*/
	setAttribute: function(name, attr)
	{
		if (name == null)
			throw new Error("NULL name?");
		if (this._dirty_attributes.indexOf(name) == -1)
			this._dirty_attributes.push(name);
		this._attributes[name] = attr;
		if (this._fieldnames.indexOf(name) == -1)
			this._fieldnames.push(name);
	},

	/*
	  param e Entity
	  returns Boolean
	*/
	eq: function(e)
	{
		if (e == null)
			return false;
		return this._type == e.getType() && this._id == e.getId();
	},

	/*
	  returns String
	*/
	toString: function()
	{
		return this._type + " ";
	},

	/*
	  param masked_fields Array
	  returns String
	*/
	toStringLong: function(masked_fields)
	{
		masked_fields = (masked_fields ? masked_fields : null);
		var s = "Entity " + this.getType();
		for (var p in this.getAttributes())


		{
		if (masked_fields != null && masked_fields.indexOf(p) != -1)
				continue;
		var o = this.getAttributes()[p];
		s += "  " + p;
		if (o == null)
			{
				p += "null";
			}
			else
				if (o instanceof Date)
				{
					var d = o/* as Date*/;
					if (isNaN(d./*?Date*/fullYear))
							continue;
					s += (d./*?Date*/month + 1) + "-";
				}
				else
					if (o instanceof com_pagesociety_persistence_Entity)
					{
						s += o./*?Object*/type + ":";
					}
					else
						if (o instanceof Array)
						{
							s += "[" + o./*?Object*/length + "]";
						}
						else
						{
							s += o;
						}
		s += "\n";
		}

		return s;
	},

	/*
	  param seen Object
	  returns Entity
	*/
	clone: function(seen)
	{
		seen = (seen ? seen : null);
		if (seen == null)
			seen = new Object();
		var sid = this.getType() + this.getId();
		if (seen[sid] != null)
			return seen[sid];
		var target = new com_pagesociety_persistence_Entity(this.getType(), this.getId().getLongValue());
		seen[sid] = target;
		var p;
		var i;
		for (p in this.getAttributes())


		{
		var v = this.getAttributes()[p];
		if (v instanceof Array && v./*?Object*/length != 0 && v[0] instanceof com_pagesociety_persistence_Entity)
			{
				target.getAttributes()[p] = new Array(v./*?Object*/length);
				for (i = 0; i < v./*?Object*/length; i++)
						target.getAttributes()[p] = (v[i]/* as com_pagesociety_persistence_Entity*/)./*?(*/clone(seen);
			}
			else
				if (v instanceof Array)
				{
					target.getAttributes()[p] = new Array(v./*?Object*/length);
					for (i = 0; i < v./*?Object*/length; i++)
						{
							target.getAttributes()[p] = v[i];
						}
				}
				else
					if (v instanceof com_pagesociety_persistence_Entity)
					{
						target.getAttributes()[p] = (v/* as com_pagesociety_persistence_Entity*/)./*?(*/clone(seen);
					}
					else
					{
						target.getAttributes()[p] = v;
					}
		}

		return target;
	},

	/*
	  returns Entity
	*/
	cloneShallow: function()
	{
		var target = new com_pagesociety_persistence_Entity(this.getType(), this.getId().getLongValue());
		target.setDirtyAttributes(this.setDirtyAttributes);
		var p;
		var i;
		var e0;
		for (p in this.getAttributes())


		{
		var v = this.getAttributes()[p];
		if (v instanceof Array && v./*?Object*/length != 0 && v[0] instanceof com_pagesociety_persistence_Entity)
			{
				target.getAttributes()[p] = new Array(v./*?Object*/length);
				for (i = 0; i < v./*?Object*/length; i++)
					{
						e0 = v[i]/* as com_pagesociety_persistence_Entity*/;
						target.getAttributes()[p] = new com_pagesociety_persistence_Entity(e0.getType(), e0.getId().getLongValue());
					}
			}
			else
				if (v instanceof Array)
				{
					target.getAttributes()[p] = new Array(v./*?Object*/length);
					for (i = 0; i < v./*?Object*/length; i++)
						{
							target.getAttributes()[p] = v[i];
						}
				}
				else
					if (v instanceof com_pagesociety_persistence_Entity)
					{
						e0 = v/* as com_pagesociety_persistence_Entity*/;
						target.getAttributes()[p] = new com_pagesociety_persistence_Entity(e0.getType(), e0.getId().getLongValue());
					}
					else
					{
						target.getAttributes()[p] = v;
					}
		}

		return target;
	},

	/*
	  returns String
	*/
	getType: function()
	{
		return this._type;
	},

	/*
	  returns AmfLong
	*/
	getId: function()
	{
		return this._id;
	},

	/*
	  returns EntityDefinition
	*/
	getDefinition: function()
	{
		return this._def;
	},

	/*
	  returns Object
	*/
	getAttributes: function()
	{
		return this._attributes;
	},

	/*
	  returns Object
	*/
	get$: function()
	{
		return this._attributes;
	},

	/*
	  returns Array
	*/
	getDirtyAttributes: function()
	{
		return this._dirty_attributes;
	},

	/*
	  returns Object
	*/
	getDirtyValues: function()
	{
		var a = {  };
		for (var i = 0; i < this._dirty_attributes.length; i++)
			a[this._dirty_attributes[i]] = this._attributes[this._dirty_attributes[i]];
		return a;
	},

	/*
	  param type String
	  returns void
	*/
	setType: function(type)
	{
		this._type = type;
		if (com_pagesociety_persistence_Entity.DEF_PROVIDER != null)
		{
			this._def = com_pagesociety_persistence_Entity.DEF_PROVIDER.provideEntityDefinition(this._type);
		}
	},

	/*
	  param id AmfLong
	  returns void
	*/
	setId: function(id)
	{
		this._id = id;
		this._attributes.id = id;
	},

	/*
	  param attr Object
	  returns void
	*/
	setAttributes: function(attr)
	{
		this._attributes = attr;
		this._fieldnames = new Array();
		for (var p in this._attributes)
			this._fieldnames.push(p);
	},

	/*
	  param attr Array
	  returns void
	*/
	setDirtyAttributes: function(attr)
	{
		this._dirty_attributes = attr;
	}

});

com_pagesociety_persistence_Entity.UNDEFINED = -1;
com_pagesociety_persistence_Entity.DEF_PROVIDER;
com_pagesociety_persistence_Entity.INDICES;
	/*
	  param defs Array
	  returns void
	*/
com_pagesociety_persistence_Entity.setDefinitions = function(defs)
	{
		com_pagesociety_persistence_Entity.DEF_PROVIDER = new com.pagesociety.persistence.DefaultEntityProvider(defs);
	};
	/*
	  returns Array
	*/
com_pagesociety_persistence_Entity.getDefinitions = function()
	{
		return com_pagesociety_persistence_Entity.DEF_PROVIDER.provideEntityDefinitions();
	};
	/*
	  param type String
	  returns EntityDefinition
	*/
com_pagesociety_persistence_Entity.getDefinition = function(type)
	{
		return com_pagesociety_persistence_Entity.DEF_PROVIDER.provideEntityDefinition(type);
	};
	/*
	  param indices Object
	  returns void
	*/
com_pagesociety_persistence_Entity.setIndices = function(indices)
	{
		com_pagesociety_persistence_Entity.INDICES = indices;
		var defs = com_pagesociety_persistence_Entity.DEF_PROVIDER.provideEntityDefinitions();
		for (var i = 0; i < defs.length; i++)
		{
			var def = defs[i];
			def.setIndices(indices[def.getName()]);
		}
	};
	/*
	  param e Entity
	  param pf String
	  returns void
	*/
com_pagesociety_persistence_Entity.dump = function(e, pf)
	{
		pf = (pf ? pf : "");
		if (pf.length > 10)
			throw new Error("TOO DEEEEP");
		for (var p in e.getAttributes())
		{
		var v = e.getAttributes()[p];
		if (v instanceof Array && v.length != 0 && v[0] instanceof com_pagesociety_persistence_Entity)
			{
				for (var i = 0; i < v.length; i++)
						com_pagesociety_persistence_Entity.dump(v[i], pf + "  ");
			}
			else
				if (v instanceof com_pagesociety_persistence_Entity)
				{
					com_pagesociety_persistence_Entity.dump(v/* as com_pagesociety_persistence_Entity*/, pf + "  ");
				}
				else
				{
					com.pagesociety.persistence.trace(pf + p);
				}
		}

	};
/*
  ModuleConnection
*/

var com_pagesociety_web_ModuleConnection = Class.create(
{
	initialize: function($super)
	{

	}
});

	/*
	  param mm String
	  param a Array
	  param ok Function
	  param err Function
	  param concurrentOk Boolean
	  returns void
	*/
com_pagesociety_web_ModuleConnection.doModule = function(mm, a, ok, err, concurrentOk)
	{
		concurrentOk = (concurrentOk ? concurrentOk : false);
		if (err == null)
			err = function (e)
			{
				throw new Error("ERROR " + com_pagesociety_web_ModuleRequest.SERVICE_URL + " ");
			};
		com_pagesociety_web_ModuleRequest.doModule(mm, a, ok, err, concurrentOk);
	};
/*
  ModuleRequest
  import com_pagesociety_ux_INetworkEventHandler
  import flash_events_AsyncErrorEvent
  import flash_events_Event
  import flash_events_IOErrorEvent
  import flash_events_NetStatusEvent
  import flash_events_SecurityErrorEvent
  import flash_events_TimerEvent
  import flash_net_NetConnection
  import flash_net_Responder
  import flash_utils_Timer
*/

var com_pagesociety_web_ModuleRequest = Class.create(
{
	initialize: function(module_and_method, args)
	{
//		this._connection/*NetConnection*/;
		this._module_name/*String*/;
		this._method_name/*String*/;
		this._arguments/*Array*/;
		this._result_handlers/*Array*/;
		this._error_handlers/*Array*/;
		module_and_method = (module_and_method ? module_and_method : null);
		args = (args ? args : null);
		this._result_handlers = new Array();
		this._error_handlers = new Array();
		this._arguments = (args == null) ? new Array() : args;
		if (module_and_method != null)
		{
			var s = module_and_method.split("/");
			if (s.length == 2)
				{
					this._module_name = s[0];
					this._method_name = s[1];
				}
		}

	},
	/*
	  param f Function
	  returns void
	*/
	addResultHandler: function(f)
	{
		this._result_handlers.push(f);
	},

	/*
	  param f Function
	  returns void
	*/
	addErrorHandler: function(f)
	{
		this._error_handlers.push(f);
	},

	/*
	  returns void
	*/
	execute: function()
	{
		if (com_pagesociety_web_ModuleRequest._concurrent_ok)
			this.do_execute();
		else
			com_pagesociety_web_ModuleRequest.QUEUE_LOAD(this);
	},

	/*
	  returns void
	*/
	do_execute: function()
	{
		Logger.log("MODULE REQUEST: " + this._module_name+"/"+this._method_name);
		if (com_pagesociety_web_ModuleRequest._timer != null)
		{
			com_pagesociety_web_ModuleRequest._timer.reset();
			com_pagesociety_web_ModuleRequest._timer.start();
		}
		this.connect();
	},




	//var base_url = base_url || "";

	connect : function()
		{
			var T = this;
			var module_request_url =   com_pagesociety_web_ModuleRequest.SERVICE_URL +"/"+this._module_name+"/"+this._method_name + "/.json";
			new Ajax[(com_pagesociety_web_ModuleRequest.USE_JSONP ? "JSONRequest" : "Request")](module_request_url,
			{
				method:"post",
				parameters: {
					args: Object.toJSON(this._arguments)
				},
				onSuccess: function(response){
					var ret = response.responseText.evalJSON().value;
					if(ret != null && ret.exception != null )
					{
						Logger.log("1: fail");
						T.on_error(ret);
					}
					else
					{
						if(ret != null)
						{
							ret = com_pagesociety_web_ModuleRequest.expand_entities(ret);
						}
						Logger.log("1: success", response, response.responseJSON);
						T.on_result(ret);
					}

				},
				onFailure: function(response){
					Logger.log("1: fail");

						T.on_error({ exception:{errorCode:-1},
								exceptionType:"ajaxexception",
								stacktrace:"",
								message:"Ajax Error: "+response.responseText});

				}
			});
		},


	/*
	  param o Object
	  returns void
	*/
	on_result: function(o)
	{
		this.close();
		for (var i = 0; i < this._result_handlers.length; i++)
			this._result_handlers[i]
		(o);
		com_pagesociety_web_ModuleRequest.QUEUE_COMPLETE(this, com_pagesociety_web_ModuleRequest.STATUS_OK, o);
	},

	/*
	  param o Object
	  returns void
	*/
	on_error: function(o)
	{
		this.close();
		for (var i = 0; i < this._error_handlers.length; i++)
			this._error_handlers[i]
		(o);
		com_pagesociety_web_ModuleRequest.QUEUE_COMPLETE(this, com_pagesociety_web_ModuleRequest.STATUS_ERR, o);
	},

	/*
	  returns void
	*/
	close: function()
	{
		if (this._connection != null)
		{
			this._connection.close();
			this._connection = null;
		}
	},




	/*
	  returns Boolean
	*/
	getConnected: function()
	{
		return (this._connection != null);
	},

	/*
	  returns String
	*/
	getModule: function()
	{
		return this._module_name;
	},

	/*
	  returns String
	*/
	getMethod: function()
	{
		return this._method_name;
	},

	/*
	  returns Array
	*/
	getArguments: function()
	{
		return this._arguments;
	},

	/*
	  returns Boolean
	*/
	getConcurrentOk: function()
	{
		return com_pagesociety_web_ModuleRequest._concurrent_ok;
	},

	/*
	  param name String
	  returns void
	*/
	setModule: function(name)
	{
		this._module_name = name;
	},

	/*
	  param args Array
	  returns void
	*/
	setArguments: function(args)
	{
		this._arguments = args;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setConcurrentOk: function(b)
	{
		com_pagesociety_web_ModuleRequest._concurrent_ok = b;
	}

});

com_pagesociety_web_ModuleRequest.SERVICE_URL;
com_pagesociety_web_ModuleRequest.USE_JSONP = false;
com_pagesociety_web_ModuleRequest._concurrent_ok;
com_pagesociety_web_ModuleRequest._networking;
com_pagesociety_web_ModuleRequest._net_event_handler;
com_pagesociety_web_ModuleRequest._timeout = 12000;
com_pagesociety_web_ModuleRequest._timer;
com_pagesociety_web_ModuleRequest._last_event = 0;
com_pagesociety_web_ModuleRequest._QUEUE = [  ];
com_pagesociety_web_ModuleRequest._QUEUE_LOAD_COUNT = 0;
com_pagesociety_web_ModuleRequest._QUEUE_MAX_SIMULATANEOUS_LOAD = 1;
com_pagesociety_web_ModuleRequest.STATUS_OK = 0;
com_pagesociety_web_ModuleRequest.STATUS_ERR = 1;
	/*
	  param mm String
	  param a Array
	  param ok Function
	  param err Function
	  param concurrentOk Boolean
	  returns void
	*/
com_pagesociety_web_ModuleRequest.doModule = function(mm, a, ok, err, concurrentOk)
	{
		concurrentOk = (concurrentOk ? concurrentOk : false);
		var m = new com_pagesociety_web_ModuleRequest(mm, a);
		m.setConcurrentOk(concurrentOk);
		m.addErrorHandler(err);
		m.addResultHandler(ok);
		m.execute();
	};
	/*
	  param e Event
	  returns void
	*/
com_pagesociety_web_ModuleRequest.on_timeout = function(e)
	{
		e = (e ? e : null);
		if (com_pagesociety_web_ModuleRequest._net_event_handler == null)
			return
		com_pagesociety_web_ModuleRequest._net_event_handler.timeout();
	};
	/*
	  param r ModuleRequest
	  returns void
	*/
com_pagesociety_web_ModuleRequest.QUEUE_LOAD = function(r)
	{
		com_pagesociety_web_ModuleRequest._QUEUE.push(r);
		com_pagesociety_web_ModuleRequest.QUEUE_DO_LOAD();
	};
	/*
	  returns void
	*/
com_pagesociety_web_ModuleRequest.QUEUE_DO_LOAD = function()
	{
		var s = com_pagesociety_web_ModuleRequest._QUEUE_MAX_SIMULATANEOUS_LOAD - com_pagesociety_web_ModuleRequest._QUEUE_LOAD_COUNT;
		/*	_networking = false;
			if (_net_event_handler!=null)
				_net_event_handler.networking = _networking;
			*/;
		if (com_pagesociety_web_ModuleRequest._QUEUE.length == 0)
		{
			return ;
		}
		/*
		if (!_networking && _QUEUE.length!=0)
		{
			_networking = true;
			if (_net_event_handler!=null)
				_net_event_handler.networking = _networking;
		}
		*/;
		for (var i = 0; i < s && com_pagesociety_web_ModuleRequest._QUEUE.length != 0; i++)
		{
			var r = com_pagesociety_web_ModuleRequest._QUEUE.shift();
			r.do_execute();
			if (com_pagesociety_web_ModuleRequest._net_event_handler != null)
					com_pagesociety_web_ModuleRequest._net_event_handler.beginModuleRequest(r);
			com_pagesociety_web_ModuleRequest._QUEUE_LOAD_COUNT++;
		}
	};
	/*
	  param r ModuleRequest
	  param status uint
	  param arg Object
	  returns void
	*/
com_pagesociety_web_ModuleRequest.QUEUE_COMPLETE = function(r, status, arg)
	{
		status = (status ? status : com_pagesociety_web_ModuleRequest.STATUS_OK);
		arg = (arg ? arg : null);
		if (com_pagesociety_web_ModuleRequest._net_event_handler != null)
			com_pagesociety_web_ModuleRequest._net_event_handler.endModuleRequest(r, status, arg);
		com_pagesociety_web_ModuleRequest._QUEUE_LOAD_COUNT--;
		com_pagesociety_web_ModuleRequest.QUEUE_DO_LOAD();
	};
	/*
	  returns int
	*/
com_pagesociety_web_ModuleRequest.getTimeout = function()
	{
		return com_pagesociety_web_ModuleRequest._timeout;
	};
	/*
	  param n INetworkEventHandler
	  returns void
	*/
com_pagesociety_web_ModuleRequest.setNetworkEventHandler = function(n)
	{
		if (com_pagesociety_web_ModuleRequest._timer == null)
		{
			com_pagesociety_web_ModuleRequest._timer = new Timer(com_pagesociety_web_ModuleRequest._timeout);
			com_pagesociety_web_ModuleRequest._timer.addEventListener(TimerEvent.TIMER, com_pagesociety_web_ModuleRequest.on_timeout);
		}
		com_pagesociety_web_ModuleRequest._timer.reset();
		com_pagesociety_web_ModuleRequest._timer.start();
		com_pagesociety_web_ModuleRequest._net_event_handler = n;
	};
	/*
	  param timeout int
	  returns void
	*/
com_pagesociety_web_ModuleRequest.setTimeout = function(timeout)
	{
		com_pagesociety_web_ModuleRequest._timeout = timeout;
	};






	com_pagesociety_web_ModuleRequest.entity_pool = {}
	com_pagesociety_web_ModuleRequest.expand_entities = function (o)
		{
			var otype = com_pagesociety_web_ModuleRequest.typeOf(o);

			if(otype == 'object')
			{
				if (o._circular_ref)
				{
					var ref = com_pagesociety_web_ModuleRequest.entity_pool[o._object_id];
					if (ref==null)
						throw new Error("com_pagesociety_web_ModuleRequest.expand_entities - no ref to "+o._object_id)
					return ref;
				}
				if(o._ps_clazz == "Entity")
				{
					if(o.attributes == null)
						o.attributes = new Object();
				 	for(k in o.attributes)
				 	{
				 		o.attributes[k] = com_pagesociety_web_ModuleRequest.expand_entities(o.attributes[k]);
				 	}
					var e = new com_pagesociety_persistence_Entity(o);
				 	e.setId(o.id);
				 	e.setType(o.type);
					com_pagesociety_web_ModuleRequest.entity_pool[o._object_id] = e;
					return e;
				}
				else
				{
					com_pagesociety_web_ModuleRequest.entity_pool[o._object_id] = o;
					for(k in o)
				 	{
						o[k] = com_pagesociety_web_ModuleRequest.expand_entities(o[k]);
				 	}
				}
			}
			else if (otype == 'array')
			{
	 			for(var i = 0;i < o.length;i++)
	 			{
	 				o[i] = com_pagesociety_web_ModuleRequest.expand_entities(o[i]);
	 			}

			}
			return o;
		};





com_pagesociety_web_ModuleRequest.typeOf = function(value)
	{
	    var s = typeof value;
	    if (s === 'object')
	    {
	        if (value) {
	            if (typeof value.length === 'number' &&
	                    !(value.propertyIsEnumerable('length')) &&
	                    typeof value.splice === 'function') {
	                s = 'array';
	            }
	        } else {
	            s = 'null';
	        }
		}
		return s;
	};




/* static
 *


doModule: function( module_method, args, callback, error)
	{
		if (callback==null)
			return;
		new Ajax.JSONRequest( this.BASE_URL + module_method + "/.json",
		{
			callbackParamName: "callback",
			parameters: {
				args: Object.toJSON(args)
			},
			onSuccess: function(response){
				console.log("1: success", response, response.responseJSON);
				callback(response.responseJSON);
			},
			onFailure: function(response){
				console.log("1: fail", response, response.responseJSON);
				if (error!=null)
					error(response.responseJSON);
			}
		});
	}

 *
 *
 */




/* JSON-P implementation for Prototype.js somewhat by Dan Dean (http://www.dandean.com)
 *
 * *HEAVILY* based on Tobie Langel's version: http://gist.github.com/145466.
 * Might as well just call this an iteration.
 *
 * This version introduces:
 * - onCreate and onFailure callback options and a full response object.
 * - option to not invoke request upon instantiation.
 *
 * Tested in Firefox 3/3.5, Safari 4
 *
 * Note: while I still think JSON-P is an inherantly flawed technique,
 * there are some valid use cases which this can provide for.
 *
 * See examples in README for usage
 */
Ajax.JSONRequest = Class.create(Ajax.Base, (function() {
  var id = 0, head = document.getElementsByTagName('head')[0];
  return {
    initialize: function($super, url, options) {
      $super(options);
      this.options.url = url;
      this.options.callbackParamName = this.options.callbackParamName || 'callback';
      this.options.timeout = this.options.timeout || 15; // Default timeout: 10 seconds
      this.options.invokeImmediately = (!Object.isUndefined(this.options.invokeImmediately)) ? this.options.invokeImmediately : true ;
      if (this.options.invokeImmediately) {
        this.request();
      }
    },

    /**
     *  Ajax.JSONRequest#_cleanup() -> "undefined"
     *  Cleans up after the request
     **/
    _cleanup: function() {
      if (this.timeout) {
        clearTimeout(this.timeout);
        this.timeout = null;
      }
      if (this.transport && Object.isElement(this.transport)) {
        this.transport.remove();
      }
    },

    /**
     *  Ajax.JSONRequest#request() -> "undefined"
     *  Invokes the JSON-P request lifecycle
     **/
    request: function() {

      // Define local vars
      var response = new Ajax.JSONResponse(this);
      var key = this.options.callbackParamName,
        name = '_prototypeJSONPCallback_' + (id++),
        complete = function() {
          if (Object.isFunction(this.options.onComplete)) {
            this.options.onComplete.call(this, response);
          }
        }.bind(this);

      // Add callback as a parameter and build request URL
      this.options.parameters[key] = name;
      var url = this.options.url + ((this.options.url.include('?') ? '&' : '?') + Object.toQueryString(this.options.parameters));

      // Define callback function
      window[name] = function(json) {
        this._cleanup(); // Garbage collection
        window[name] = undefined;
        if (Object.isFunction(this.options.onSuccess)) {
          response.status = 200;
          response.statusText = "OK";
          response.setResponseContent(json);
          this.options.onSuccess.call(this, response);
        }
        complete();
      }.bind(this);

      this.transport = new Element('script', { type: 'text/javascript', src: url });

      if (Object.isFunction(this.options.onCreate)) {
        this.options.onCreate.call(this, response);
      }

      head.appendChild(this.transport);

      this.timeout = setTimeout(function() {
        this._cleanup();
        window[name] = Prototype.emptyFunction;
        if (Object.isFunction(this.options.onFailure)) {
          response.status = 504;
          response.statusText = "Gateway Timeout";
          this.options.onFailure.call(this, response);
        }
        complete();
      }.bind(this), this.options.timeout * 1000);
    },
    toString: function() { return "[object Ajax.JSONRequest]"; }
  };
})());

Ajax.JSONResponse = Class.create({
  initialize: function(request) {
    this.request = request;
  },
  request: undefined,
  status: 0,
  statusText: '',
  responseJSON: undefined,
  responseText: undefined,
  setResponseContent: function(json) {
    this.responseJSON = json;
    this.responseText = Object.toJSON(json);
  },
  getTransport: function() {
    if (this.request) return this.request.transport;
  },
  toString: function() { return "[object Ajax.JSONResponse]"; }
});
/*
  PathProvider
  import com_pagesociety_persistence_Entity
  import com_pagesociety_util_ObjectUtil
  import com_pagesociety_web_module_Resource
  import flash_system_Security
*/

var com_pagesociety_web_PathProvider = Class.create(
{
	initialize: function(s3_bucket)
	{
		this.base_url/*String*/;
		if (s3_bucket.indexOf("http://") == 0)
		{
			var s = s3_bucket.split("/");
			//flash.system.Security./*?Security*/loadPolicyFile("http://" + s[2]);
			this.base_url = s3_bucket;
		}
		else
		{
			//Security./*?Security*/loadPolicyFile("http://" + s3_bucket);
			this.base_url = "http://" + s3_bucket;
		}
		if (this.base_url.charAt(this.base_url.length - 1) != "/")
			this.base_url += "/";

	},
	/*
	  param resource Entity
	  param width int
	  param height int
	  returns String
	*/
	getPath: function(resource, width, height)
	{
		width = (width ? width : -1);
		height = (height ? height : -1);
		var path_token = resource.get$()[com_pagesociety_web_module_Resource.RESOURCE_FIELD_PATH_TOKEN];
		if (path_token == null)
			return null;
		var preview_name = new String();
		if (width == -1 || height == -1)
		{
			preview_name = path_token;
		}
		else
		{
			var dot_idx = path_token.lastIndexOf('.');
			var ext = "jpg";
			if (dot_idx != -1 && path_token.length - 1 > dot_idx)
				{
					ext = path_token.substring(dot_idx + 1).toLowerCase();
					path_token = path_token.substring(0, dot_idx);
				}
			preview_name += (path_token);
			preview_name += ('_');
			preview_name += (width.toString());
			preview_name += ('x');
			preview_name += (height.toString());
			preview_name += ('.');
			preview_name += ext;
		}
		return this.base_url + preview_name;
	},

	/*
	  param o Object
	  param width int
	  param height int
	  returns void
	*/
	getPreviewUrls: function(o, width, height)
	{
		if (o == null)
		{
			return ;
		}
		var i;
		if (o instanceof Array)
		{
			var results = o/* as Array*/;
			for (i = 0; i < results.length; i++)
					this.fill_e(results[i], width, height);
		}
		else
			if (o instanceof com_pagesociety_persistence_Entity)
			{
				this.fill_e(o/* as com_pagesociety_persistence_Entity*/, width, height);
			}
			else
			{
				throw new Error("Can't fill that kind of thing");
			}
	},

	/*
	  param e Entity
	  param width int
	  param height int
	  returns void
	*/
	fill_e: function(e, width, height)
	{
		if (e == null)
			return
		var i;
		var j;
		if (com_pagesociety_util_ObjectUtil.isResource(e))
		{
			e.get$().url = this.getPath(e, width, height);
		}
		else
		{
			for (var p in e.getAttributes())
			{

				var o = e.get$()[p];
				if (o instanceof com_pagesociety_persistence_Entity)
						this.fill_e(o/* as com_pagesociety_persistence_Entity*/, width, height);
					else
						if (o instanceof Array && o./*?Object*/length != 0 && o[0] instanceof com_pagesociety_persistence_Entity)
							for (j = 0; j < o./*?Object*/length; j++)
								this.fill_e(o[j], width, height);
			}

		}
	}

});

/*
  User
  import com_pagesociety_persistence_Entity
  import com_pagesociety_web_ModuleConnection
  import com_pagesociety_web_amf_AmfLong
*/

var com_pagesociety_web_module_User = Class.create( com_pagesociety_web_ModuleConnection,
{
	initialize: function()
	{

	}
});

com_pagesociety_web_module_User.USER_ENTITY = "User";
com_pagesociety_web_module_User.USER_FIELD_ID = "id";
com_pagesociety_web_module_User.USER_FIELD_CREATOR = "creator";
com_pagesociety_web_module_User.USER_FIELD_DATE_CREATED = "date_created";
com_pagesociety_web_module_User.USER_FIELD_LAST_MODIFIED = "last_modified";
com_pagesociety_web_module_User.USER_FIELD_EMAIL = "email";
com_pagesociety_web_module_User.USER_FIELD_PASSWORD = "password";
com_pagesociety_web_module_User.USER_FIELD_USERNAME = "username";
com_pagesociety_web_module_User.USER_FIELD_ROLES = "roles";
com_pagesociety_web_module_User.USER_FIELD_LAST_LOGIN = "last_login";
com_pagesociety_web_module_User.USER_FIELD_LAST_LOGOUT = "last_logout";
com_pagesociety_web_module_User.USER_FIELD_LOCK = "lock";
com_pagesociety_web_module_User.USER_FIELD_LOCK_CODE = "lock_code";
com_pagesociety_web_module_User.USER_FIELD_LOCK_NOTES = "lock_notes";
com_pagesociety_web_module_User.USER_LOCK_UNLOCKED = 0x10;
com_pagesociety_web_module_User.USER_LOCK_LOCKED = 0x20;
com_pagesociety_web_module_User.USER_LOCK_CODE_UNLOCKED = 0x00;
com_pagesociety_web_module_User.USER_LOCK_CODE_DEFAULT = 0x01;
com_pagesociety_web_module_User.USER_ROLE_WHEEL = 0x1000;
com_pagesociety_web_module_User.USER_ROLE_USER = 0x0001;
com_pagesociety_web_module_User.USER_EVENT_CREATED = 0x1001;
com_pagesociety_web_module_User.USER_EVENT_LOGGED_IN = 0x1002;
com_pagesociety_web_module_User.USER_EVENT_LOGGED_OUT = 0x1004;
com_pagesociety_web_module_User.USER_EVENT_DELETED = 0x1008;
com_pagesociety_web_module_User.METHOD_LOGIN = "User/Login";
com_pagesociety_web_module_User.METHOD_GETUSER = "User/GetUser";
com_pagesociety_web_module_User.METHOD_UPDATEPASSWORD = "User/UpdatePassword";
com_pagesociety_web_module_User.METHOD_LOGOUT = "User/Logout";
com_pagesociety_web_module_User.METHOD_LOCKUSER = "User/LockUser";
com_pagesociety_web_module_User.METHOD_STARTREGISTRATION = "User/StartRegistration";
com_pagesociety_web_module_User.METHOD_CREATEPUBLICUSER = "User/CreatePublicUser";
com_pagesociety_web_module_User.METHOD_REMOVEROLE = "User/RemoveRole";
com_pagesociety_web_module_User.METHOD_ACTIVATEEXPIREDTRIAL = "User/ActivateExpiredTrial";
com_pagesociety_web_module_User.METHOD_CLOSEACCOUNT = "User/CloseAccount";
com_pagesociety_web_module_User.METHOD_ADDROLE = "User/AddRole";
com_pagesociety_web_module_User.METHOD_GETSESSIONID = "User/GetSessionId";
com_pagesociety_web_module_User.METHOD_STARTTRIAL = "User/StartTrial";
com_pagesociety_web_module_User.METHOD_GETUSERSBYROLE = "User/GetUsersByRole";
com_pagesociety_web_module_User.METHOD_CREATEPRIVILEGEDUSER = "User/CreatePrivilegedUser";
com_pagesociety_web_module_User.METHOD_GETLOCKEDUSERSBYLOCKCODE = "User/GetLockedUsersByLockCode";
com_pagesociety_web_module_User.METHOD_DELETEUSER = "User/DeleteUser";
com_pagesociety_web_module_User.METHOD_GETLOCKEDUSERS = "User/GetLockedUsers";
com_pagesociety_web_module_User.METHOD_UPDATEEMAIL = "User/UpdateEmail";
com_pagesociety_web_module_User.METHOD_UNLOCKUSER = "User/UnlockUser";
com_pagesociety_web_module_User.METHOD_ENDREGISTRATION = "User/EndRegistration";
com_pagesociety_web_module_User.METHOD_UPDATEUSERNAME = "User/UpdateUserName";
com_pagesociety_web_module_User.METHOD_EMAILEXISTS = "User/EmailExists";
com_pagesociety_web_module_User.METHOD_FINDBYEMAILORUSERNAME = "User/FindByEmailOrUserName";
com_pagesociety_web_module_User.METHOD_LOGINAS = "User/LogInAs";
com_pagesociety_web_module_User.USER_KEY_USER_IS_DELINQUENT = "is_delinquent_user";
com_pagesociety_web_module_User.USER_KEY_DELINQUENT_USER_IN_GRACE_PERIOD = "in_grace_period";
com_pagesociety_web_module_User.USER_KEY_DELINQUENT_BALANCE = "delinquent_balance";
com_pagesociety_web_module_User.USER_KEY_DELINQUENT_BILLING_FAILED_GENESIS = "billing_failed_genesis";
	/*
	  param email String
	  param password String
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.Login = function(email, password, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_LOGIN, [ email, password ], on_complete, on_error);
	};
	/*
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.GetUser = function(on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_GETUSER, [  ], on_complete, on_error);
	};
	/*
	  param user_entity_id AmfLong
	  param old_password String
	  param new_password String
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.UpdatePassword = function(user_entity_id, old_password, new_password, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_UPDATEPASSWORD, [ user_entity_id, old_password, new_password ], on_complete, on_error);
	};
	/*
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.Logout = function(on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_LOGOUT, [  ], on_complete, on_error);
	};
	/*
	  param user_entity_id AmfLong
	  param lock_code int
	  param notes String
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.LockUser = function(user_entity_id, lock_code, notes, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_LOCKUSER, [ user_entity_id, lock_code, notes ], on_complete, on_error);
	};
	/*
	  param domain String
	  param username String
	  param email String
	  param md5_password1 String
	  param md5_password2 String
	  param promo_code String
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.StartRegistration = function(domain, username, email, md5_password1, md5_password2, promo_code, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_STARTREGISTRATION, [ domain, username, email, md5_password1, md5_password2, promo_code ], on_complete, on_error);
	};
	/*
	  param email String
	  param password String
	  param username String
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.CreatePublicUser = function(email, password, username, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_CREATEPUBLICUSER, [ email, password, username ], on_complete, on_error);
	};
	/*
	  param user_entity_id AmfLong
	  param role int
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.RemoveRole = function(user_entity_id, role, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_REMOVEROLE, [ user_entity_id, role ], on_complete, on_error);
	};
	/*
	  param trial_activation_billing_record Entity
	  param promo_code String
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.ActivateExpiredTrial = function(trial_activation_billing_record, promo_code, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_ACTIVATEEXPIREDTRIAL, [ trial_activation_billing_record, promo_code ], on_complete, on_error);
	};
	/*
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.CloseAccount = function(on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_CLOSEACCOUNT, [  ], on_complete, on_error);
	};
	/*
	  param user_entity_id AmfLong
	  param role int
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.AddRole = function(user_entity_id, role, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_ADDROLE, [ user_entity_id, role ], on_complete, on_error);
	};
	/*
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.GetSessionId = function(on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_GETSESSIONID, [  ], on_complete, on_error);
	};
	/*
	  param domain String
	  param username String
	  param email String
	  param md5_password1 String
	  param md5_password2 String
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.StartTrial = function(domain, username, email, md5_password1, md5_password2, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_STARTTRIAL, [ domain, username, email, md5_password1, md5_password2 ], on_complete, on_error);
	};
	/*
	  param role int
	  param offset int
	  param page_size int
	  param order_by String
	  param direction uint
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.GetUsersByRole = function(role, offset, page_size, order_by, direction, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_GETUSERSBYROLE, [ role, offset, page_size, order_by, direction ], on_complete, on_error);
	};
	/*
	  param email String
	  param password String
	  param username String
	  param role int
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.CreatePrivilegedUser = function(email, password, username, role, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_CREATEPRIVILEGEDUSER, [ email, password, username, role ], on_complete, on_error);
	};
	/*
	  param lock_code int
	  param offset int
	  param page_size int
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.GetLockedUsersByLockCode = function(lock_code, offset, page_size, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_GETLOCKEDUSERSBYLOCKCODE, [ lock_code, offset, page_size ], on_complete, on_error);
	};
	/*
	  param user_id AmfLong
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.DeleteUser = function(user_id, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_DELETEUSER, [ user_id ], on_complete, on_error);
	};
	/*
	  param offset int
	  param page_size int
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.GetLockedUsers = function(offset, page_size, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_GETLOCKEDUSERS, [ offset, page_size ], on_complete, on_error);
	};
	/*
	  param user_entity_id AmfLong
	  param email String
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.UpdateEmail = function(user_entity_id, email, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_UPDATEEMAIL, [ user_entity_id, email ], on_complete, on_error);
	};
	/*
	  param user_entity_id AmfLong
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.UnlockUser = function(user_entity_id, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_UNLOCKUSER, [ user_entity_id ], on_complete, on_error);
	};
	/*
	  param billing_record Entity
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.EndRegistration = function(billing_record, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_ENDREGISTRATION, [ billing_record ], on_complete, on_error);
	};
	/*
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.EndRegistration0 = function(on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_ENDREGISTRATION, [  ], on_complete, on_error);
	};
	/*
	  param user_entity_id AmfLong
	  param username String
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.UpdateUserName = function(user_entity_id, username, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_UPDATEUSERNAME, [ user_entity_id, username ], on_complete, on_error);
	};
	/*
	  param email String
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.EmailExists = function(email, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_EMAILEXISTS, [ email ], on_complete, on_error);
	};
	/*
	  param a1 String
	  param order String
	  param offset uint
	  param pagesize uint
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.FindByEmailOrUserName = function(a1, order, offset, pagesize, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_FINDBYEMAILORUSERNAME, [ a1, order, offset, pagesize ], on_complete, on_error);
	};
	/*
	  param user_id AmfLong
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_User.LogInAs = function(user_id, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_User.METHOD_LOGINAS, [ user_id ], on_complete, on_error);
	};
/*
  Resource
  import com_pagesociety_web_amf_AmfLong
  import com_pagesociety_web_ModuleConnection
*/

var com_pagesociety_web_module_Resource = Class.create( com_pagesociety_web_ModuleConnection,
{
	initialize: function()
	{

	}
});

com_pagesociety_web_module_Resource.MODULE_NAME = "Resource";
com_pagesociety_web_module_Resource.RESOURCE_ENTITY = "Resource";
com_pagesociety_web_module_Resource.RESOURCE_FIELD_ID = "id";
com_pagesociety_web_module_Resource.RESOURCE_FIELD_CREATOR = "creator";
com_pagesociety_web_module_Resource.RESOURCE_FIELD_DATE_CREATED = "date_created";
com_pagesociety_web_module_Resource.RESOURCE_FIELD_LAST_MODIFIED = "last_modified";
com_pagesociety_web_module_Resource.RESOURCE_FIELD_CONTENT_TYPE = "content-type";
com_pagesociety_web_module_Resource.RESOURCE_FIELD_SIMPLE_TYPE = "simple-type";
com_pagesociety_web_module_Resource.RESOURCE_FIELD_FILENAME = "filename";
com_pagesociety_web_module_Resource.RESOURCE_FIELD_EXTENSION = "extension";
com_pagesociety_web_module_Resource.RESOURCE_FIELD_FILESIZE = "filesize";
com_pagesociety_web_module_Resource.RESOURCE_FIELD_PATH_TOKEN = "path-token";
com_pagesociety_web_module_Resource.METHOD_GETRESOURCEPREVIEWURLWITHDIM = com_pagesociety_web_module_Resource.MODULE_NAME + "/GetResourcePreviewURLWithDim";
com_pagesociety_web_module_Resource.METHOD_UPDATERESOURCE = com_pagesociety_web_module_Resource.MODULE_NAME + "/UpdateResource";
com_pagesociety_web_module_Resource.METHOD_GETRESOURCEURLS = com_pagesociety_web_module_Resource.MODULE_NAME + "/GetResourceURLs";
com_pagesociety_web_module_Resource.METHOD_GETRESOURCEURL = com_pagesociety_web_module_Resource.MODULE_NAME + "/GetResourceURL";
com_pagesociety_web_module_Resource.METHOD_GETRESOURCE = com_pagesociety_web_module_Resource.MODULE_NAME + "/GetResource";
com_pagesociety_web_module_Resource.METHOD_GETRESOURCEPREVIEWURLSWITHDIM = com_pagesociety_web_module_Resource.MODULE_NAME + "/GetResourcePreviewURLsWithDim";
com_pagesociety_web_module_Resource.METHOD_CREATERESOURCE = com_pagesociety_web_module_Resource.MODULE_NAME + "/CreateResource";
com_pagesociety_web_module_Resource.METHOD_CANCELUPLOAD = com_pagesociety_web_module_Resource.MODULE_NAME + "/CancelUpload";
com_pagesociety_web_module_Resource.METHOD_GETUPLOADPROGRESS = com_pagesociety_web_module_Resource.MODULE_NAME + "/GetUploadProgress";
com_pagesociety_web_module_Resource.METHOD_DELETERESOURCE = com_pagesociety_web_module_Resource.MODULE_NAME + "/DeleteResource";
com_pagesociety_web_module_Resource.SIMPLE_TYPE_IMAGE = 100;
com_pagesociety_web_module_Resource.SIMPLE_TYPE_AUDIO = 101;
com_pagesociety_web_module_Resource.SIMPLE_TYPE_VIDEO = 102;
com_pagesociety_web_module_Resource.SIMPLE_TYPE_DOCUMENT = 103;
com_pagesociety_web_module_Resource.SIMPLE_TYPE_SWF = 104;
com_pagesociety_web_module_Resource.SIMPLE_TYPE_IMAGE_STRING = "IMAGE";
com_pagesociety_web_module_Resource.SIMPLE_TYPE_AUDIO_STRING = "AUDIO";
com_pagesociety_web_module_Resource.SIMPLE_TYPE_VIDEO_STRING = "VIDEO";
com_pagesociety_web_module_Resource.SIMPLE_TYPE_DOCUMENT_STRING = "DOCUMENT";
com_pagesociety_web_module_Resource.SIMPLE_TYPE_SWF_STRING = "SWF";
	/*
	  param resource_id AmfLong
	  param w int
	  param h int
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_Resource.GetResourcePreviewURLWithDim = function(resource_id, w, h, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_Resource.METHOD_GETRESOURCEPREVIEWURLWITHDIM, [ resource_id, w, h ], on_complete, on_error, true);
	};
	/*
	  param resource_ids Array
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_Resource.GetResourceURLs = function(resource_ids, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_Resource.METHOD_GETRESOURCEURLS, [ resource_ids ], on_complete, on_error, true);
	};
	/*
	  param resource_id AmfLong
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_Resource.GetResourceURL = function(resource_id, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_Resource.METHOD_GETRESOURCEURL, [ resource_id ], on_complete, on_error, true);
	};
	/*
	  param resource_id AmfLong
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_Resource.GetResource = function(resource_id, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_Resource.METHOD_GETRESOURCE, [ resource_id ], on_complete, on_error, true);
	};
	/*
	  param resource_ids Array
	  param w int
	  param h int
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_Resource.GetResourcePreviewURLsWithDim = function(resource_ids, w, h, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_Resource.METHOD_GETRESOURCEPREVIEWURLSWITHDIM, [ resource_ids, w, h ], on_complete, on_error, true);
	};
	/*
	  param channel_name String
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_Resource.CancelUpload = function(channel_name, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_Resource.METHOD_CANCELUPLOAD, [ channel_name ], on_complete, on_error);
	};
	/*
	  param channel_name String
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_Resource.GetUploadProgress = function(channel_name, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_Resource.METHOD_GETUPLOADPROGRESS, [ channel_name ], on_complete, on_error, true);
	};
	/*
	  param resource_id AmfLong
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
com_pagesociety_web_module_Resource.DeleteResource = function(resource_id, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(com_pagesociety_web_module_Resource.METHOD_DELETERESOURCE, [ resource_id ], on_complete, on_error);
	};
/*
  ResourceModuleProvider
  import com_pagesociety_persistence_Entity
  import com_pagesociety_web_amf_AmfLong
  import com_pagesociety_web_module_User
*/

var com_pagesociety_web_ResourceModuleProvider = Class.create(
{
	initialize: function(module_name, type, root_url)
	{
		this._module_name/*String*/;
		this._type/*String*/;
		this._path_provider/*PathProvider*/;
		this._module_name = module_name;
		this._type = type;
		if (root_url != null)
			this._path_provider = new com_pagesociety_web_PathProvider(root_url);

	},
	/*
	  returns String
	*/
	CreateResource: function()
	{
		return this._module_name + "/CreateResource";
	},

	/*
	  returns String
	*/
	DeleteResource: function()
	{
		return this._module_name + "/DeleteResource";
	},

	/*
	  returns String
	*/
	UpdateResource: function()
	{
		return this._module_name + "/UpdateResource";
	},

	/*
	  returns String
	*/
	CancelUpload: function()
	{
		return this._module_name + "/CancelUpload";
	},

	/*
	  returns String
	*/
	GetResourceUrl: function()
	{
		return this._module_name + "/GetResourceURL";
	},

	/*
	  returns String
	*/
	GetResourceUrlWithDim: function()
	{
		return this._module_name + "/GetResourcePreviewURLWithDim";
	},

	/*
	  returns String
	*/
	GetUploadProgress: function()
	{
		return this._module_name + "/GetUploadProgress";
	},

	/*
	  returns String
	*/
	GetSessionId: function()
	{
		return com_pagesociety_web_module_User.METHOD_GETSESSIONID;
	},

	/*
	  param id AmfLong
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
	getResourceUrl: function(id, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(this.GetResourceUrl(), [ id ], on_complete, on_error, true);
	},

	/*
	  param id AmfLong
	  param w Number
	  param h Number
	  param on_complete Function
	  param on_error Function
	  returns void
	*/
	getResourceUrlWithDim: function(id, w, h, on_complete, on_error)
	{
		com_pagesociety_web_ModuleConnection.doModule(this.GetResourceUrlWithDim(), [ id, w, h ], on_complete, on_error, true);
	},

	/*
	  param resource Entity
	  param w Number
	  param h Number
	  returns String
	*/
	getPath: function(resource, w, h)
	{
		if (this._path_provider == null)
			throw new Error("NO PATH PROVIDER DEFINED FOR " + resource);
		return this._path_provider.getPath(resource, w, h);
	}

});

/*
  ResourceUtil
  import com_pagesociety_persistence_Entity
  import com_pagesociety_persistence_FieldDefinition
  import com_pagesociety_ux_system_LoadAndSize
*/

var com_pagesociety_web_ResourceUtil = Class.create(
{
	initialize: function()
	{

	}
});

com_pagesociety_web_ResourceUtil.DEBUG = false;
com_pagesociety_web_ResourceUtil.RESOURCE_MAP;
	/*
	  param data Array
	  returns void
	*/
com_pagesociety_web_ResourceUtil.init = function(data)
	{
		if (com_pagesociety_web_ResourceUtil.RESOURCE_MAP != null)
		{
			Logger.log("Resource Map has already been initialized...");
			return ;
		}
		com_pagesociety_web_ResourceUtil.RESOURCE_MAP = {  };
		for (var i = 0; i < data.length; i++)
		{
			var info = data[i];
			var module_name = info.resource_module_name;
			var entity_type = info.resource_entity_name;
			var base_url = info.resource_base_url;
			if (com_pagesociety_web_ResourceUtil.RESOURCE_MAP[entity_type] != null)
					throw new Error("ResourceUtil.init ERROR: Registering entity " + entity_type);
			com_pagesociety_web_ResourceUtil.RESOURCE_MAP[entity_type] = new com_pagesociety_web_ResourceModuleProvider(module_name, entity_type, base_url);
			Logger.log("Registered ResourceModule " + entity_type);
		}
	};
	/*
	  param field FieldDefinition
	  returns Boolean
	*/
com_pagesociety_web_ResourceUtil.isResource = function(field)
	{
		return com_pagesociety_web_ResourceUtil.RESOURCE_MAP[field.getReferenceType()] != null;
	};
	/*
	  param o Object
	  returns ResourceModuleProvider
	*/
com_pagesociety_web_ResourceUtil.getModuleProvider = function(o)
	{
		var type;
		if (o instanceof String)
			type = o;
		else
			if (o instanceof com_pagesociety_persistence_FieldDefinition)
				type = o.referenceType;
			else
				throw new Error("CANT getModuleProvider for " + o);
		return com_pagesociety_web_ResourceUtil.RESOURCE_MAP[type];
	};
	/*
	  param resource Entity
	  param w Number
	  param h Number
	  returns String
	*/
com_pagesociety_web_ResourceUtil.getPath = function(resource, w, h)
	{
		w = (w ? w : -1);
		h = (h ? h : -1);
		if (com_pagesociety_web_ResourceUtil.RESOURCE_MAP == null)
			throw new Error("ResourceUtil.RESOURCE_MAP is not configured");
		var resource_module = com_pagesociety_web_ResourceUtil.RESOURCE_MAP[resource.getType()];
		if (resource_module == null)
			throw new Error("ResourceUtil.RESOURCE_MAP does not contain " + resource.getType());
		return resource_module.getPath(resource, w, h);
	};
	/*
	  param resource Entity
	  param on_complete Function
	  returns void
	*/
com_pagesociety_web_ResourceUtil.getUrl = function(resource, on_complete)
	{
		if (resource == null)
		{
			on_complete(null);
		}
		else
			if (com_pagesociety_web_ResourceUtil.DEBUG)
			{
				on_complete(resource);
			}
			else
			{
				if (com_pagesociety_web_ResourceUtil.RESOURCE_MAP == null)
						throw new Error("ResourceUtil.RESOURCE_MAP is not configured");
				var resource_module = com_pagesociety_web_ResourceUtil.RESOURCE_MAP[resource.getType()];
				if (resource_module == null)
						throw new Error("ResourceUtil.RESOURCE_MAP does not contain " + resource.getType());
				resource_module.getResourceUrl(resource.getId(), on_complete, function (e)
				{
					Logger.log("ERROR");
				});
			}
	};
	/*
	  param resource Entity
	  param w uint
	  param h uint
	  param on_complete Function
	  returns void
	*/
com_pagesociety_web_ResourceUtil.getPreviewUrl = function(resource, w, h, on_complete)
	{
		if (resource == null)
		{
			on_complete(null);
		}
		else
			if (com_pagesociety_web_ResourceUtil.DEBUG)
			{
				new com_pagesociety_ux_system_LoadAndSize(resource.get$()./*?Object*/resource, w, h, on_complete);
			}
			else
			{
				if (com_pagesociety_web_ResourceUtil.RESOURCE_MAP == null)
						throw new Error("ResourceUtil.RESOURCE_MAP is not configured");
				var resource_module = com_pagesociety_web_ResourceUtil.RESOURCE_MAP[resource.getType()];
				if (resource_module == null)
						throw new Error("ResourceUtil.RESOURCE_MAP does not contain " + resource.getType());
				resource_module.getResourceUrlWithDim(resource.getId(), w, h, on_complete, function (e)
				{
					Logger.log("ERROR");
				});
			}
	};
	/*
	  param type String
	  returns Boolean
	*/
com_pagesociety_web_ResourceUtil.hasResourceModuleProvider = function(type)
	{
		return com_pagesociety_web_ResourceUtil.RESOURCE_MAP[type] != null;
	};
/*
  Locker
*/

var com_pagesociety_util_Locker = Class.create(
{
	initialize: function($super, locked)
	{
		this._func/*Function*/;
		this._locked/*Boolean*/;
		locked = (locked ? locked : false);
		this._locked = locked;

	},
	/*
	  returns void
	*/
	lock: function()
	{
		if (this._locked)
			return
		this._locked = true;
	},

	/*
	  returns void
	*/
	unlock: function()
	{
		if (!this._locked)
			return
		if (this._func != null)
		{
			this._func();
			this._func = null;
		}
		this._locked = false;
	},

	/*
	  param func Function
	  returns void
	*/
	wait: function(func)
	{
		if (!this._locked)
		{
			func();
			return ;
		}
		this._func = func;
	}

});

/*
  ObjectUtil
  import com_pagesociety_persistence_Entity
  import com_pagesociety_persistence_EntityDefinition
  import com_pagesociety_persistence_EntityIndex
  import com_pagesociety_persistence_FieldDefinition
  import com_pagesociety_ux_system_ResourceUtil
  import com_pagesociety_web_ErrorMessage
  import com_pagesociety_web_amf_AmfDouble
  import com_pagesociety_web_amf_AmfFloat
  import com_pagesociety_web_amf_AmfLong
  import com_pagesociety_web_upload_UploadProgressInfo
  import flash_net_registerClassAlias
  import flash_utils_ByteArray
  import flash_utils_describeType
  import flash_utils_getDefinitionByName
  import flash_utils_getQualifiedClassName
*/

var com_pagesociety_util_ObjectUtil = Class.create(
{
	initialize: function()
	{

	}
});

com_pagesociety_util_ObjectUtil._eclass = new Object();
com_pagesociety_util_ObjectUtil.default_entities_registered = false;
	/*
	  param target Object
	  param prop_expr String
	  returns Object
	*/
com_pagesociety_util_ObjectUtil.getProperty = function(target, prop_expr)
	{
		var s = prop_expr.split(".");
		var o = target;
		for (var i = 0; i < s.length - 1; i++)
		{
			o = o[s[i]];
			if (o == null)
				{
					com.pagesociety.util.trace("Style error " + prop_expr);
					return null;
				}
		}
		var lf = s[s.length - 1];
		try
		{
			var lo = o[lf];
			return lo;
		}
		catch (e)
		{
		}
		return null;
	};
	/*
	  param target Object
	  param prop_expr String
	  param val *
	  returns void
	*/
com_pagesociety_util_ObjectUtil.setProperty = function(target, prop_expr, val)
	{
		var s = prop_expr.split(".");
		var o = target;
		for (var i = 0; i < s.length - 1; i++)
		{
			o = o[s[i]];
			if (o == null)
				{
					com.pagesociety.util.trace("Style error " + prop_expr);
					return ;
				}
		}
		var lf = s[s.length - 1];
		try
		{
			o[lf] = val;
		}
		catch (e)
		{
		}
	};
	/*
	  param o *
	  returns *
	*/
com_pagesociety_util_ObjectUtil.replaceEntitiesWithObjects = function(o)
	{
		var no = null;
		var p;
		if (o instanceof com_pagesociety_persistence_Entity)
		{
			var e = o/* as com_pagesociety_persistence_Entity*/;
			no = com_pagesociety_util_ObjectUtil.get_instance(e.getType());
			if (no != null)
				{
					no./*?**/id = e.getId();
					no./*?**/type = e.getType();
					for (p in e.getAttributes())


					try
						{
							no[p] = com_pagesociety_util_ObjectUtil.replaceEntitiesWithObjects(e.getAttributes()[p]);
						}
					catch (e)
						{
						}
				}
		}
		if (no == null)
		{
			no = o;
			for (p in o)


			no[p] = com_pagesociety_util_ObjectUtil.replaceEntitiesWithObjects(o[p]);
		}
		return no;
	};
	/*
	  param name String
	  param clazz Class
	  returns void
	*/
com_pagesociety_util_ObjectUtil.registerEntityClass = function(name, clazz)
	{
		com_pagesociety_util_ObjectUtil._eclass[name] = clazz;
	};
	/*
	  param type String
	  returns *
	*/
com_pagesociety_util_ObjectUtil.get_instance = function(type)
	{
		if (com_pagesociety_util_ObjectUtil._eclass[type] == null)
			return null;
		return new com_pagesociety_util_ObjectUtil._eclass();
	};
	/*
	  returns void
	*/
com_pagesociety_util_ObjectUtil.registerDefaultEntities = function()
	{
		if (com_pagesociety_util_ObjectUtil.default_entities_registered)
			return
		flash.net.registerClassAlias("com.pagesociety.web.ErrorMessage", com_pagesociety_web_ErrorMessage);
		flash.net.registerClassAlias("com.pagesociety.persistence.Entity", com_pagesociety_persistence_Entity);
		flash.net.registerClassAlias("com.pagesociety.persistence.EntityIndex", com_pagesociety_persistence_EntityIndex);
		flash.net.registerClassAlias("com.pagesociety.persistence.EntityDefinition", com_pagesociety_persistence_EntityDefinition);
		flash.net.registerClassAlias("com.pagesociety.persistence.FieldDefinition", com_pagesociety_persistence_FieldDefinition);
		flash.net.registerClassAlias("com.pagesociety.web.upload.UploadProgressInfo", com_pagesociety_web_upload_UploadProgressInfo);
		flash.net.registerClassAlias("com.pagesociety.web.amf.AmfLong", com_pagesociety_web_amf_AmfLong);
		flash.net.registerClassAlias("com.pagesociety.web.amf.AmfDouble", com_pagesociety_web_amf_AmfDouble);
		flash.net.registerClassAlias("com.pagesociety.web.amf.AmfFloat", com_pagesociety_web_amf_AmfFloat);
		com_pagesociety_util_ObjectUtil.default_entities_registered = true;
	};
	/*
	  param e Entity
	  returns Boolean
	*/
com_pagesociety_util_ObjectUtil.isResource = function(e)
	{
		return com_pagesociety_web_ResourceUtil.hasResourceModuleProvider(e.getType());
	};
	/*
	  param source Object
	  returns *
	*/
com_pagesociety_util_ObjectUtil.clone = function(source)
	{
		var copier = new flash.utils.ByteArray();
		copier./*?ByteArray*/writeObject(source);
		copier./*?ByteArray*/position = 0;
		return (copier./*?ByteArray*/readObject());
	};
	/*
	  param sourceObj Object
	  returns *
	*/
com_pagesociety_util_ObjectUtil.newSibling = function(sourceObj)
	{
		if (sourceObj)
		{
			var objSibling;
			try
				{
					var classOfSourceObj = flash.utils.getDefinitionByName(flash.utils.getQualifiedClassName(sourceObj))/* as com.pagesociety.util.Class*/;
					objSibling = new classOfSourceObj();
				}
			catch (e)
				{
				}
			return objSibling;
		}
		return null;
	};
	/*
	  param source Object
	  returns Object
	*/
com_pagesociety_util_ObjectUtil.clone1 = function(source)
	{
		var clone;
		if (source)
		{
			clone = com_pagesociety_util_ObjectUtil.newSibling(source);
			if (clone)
				{
					com_pagesociety_util_ObjectUtil.copyData(source, clone);
				}
		}
		return clone;
	};
	/*
	  param source Object
	  param destination Object
	  returns void
	*/
com_pagesociety_util_ObjectUtil.copyData = function(source, destination)
	{
	throw new Error("UNIMPLEMENTED com_pagesociety_util_ObjectUtil.copyData");
//		if ((source) && (destination))
//		{
//			try
//				{
//					var sourceInfo = flash.utils.describeType(source);
//					var prop;
//					for (prop in sourceInfo./*?XML*/variable)
//						{
//							if (destination./*?Object*/hasOwnProperty(prop./*?XML*/@name))
//								{
//									destination[prop./*?XML*/@name] = source[prop./*?XML*/@name];
//								}
//						}
//					for (prop in sourceInfo./*?XML*/accessor)
//						{
//							if (prop./*?XML*/@access == "readwrite")
//								{
//									if (destination./*?Object*/hasOwnProperty(prop./*?XML*/@name))
//										{
//											destination[prop./*?XML*/@name] = source[prop./*?XML*/@name];
//										}
//								}
//						}
//				}
//			catch (err)
//				{
//
//				}
//		}
	};
	/*
	  param o Object
	  returns String
	*/
com_pagesociety_util_ObjectUtil.print = function(o)
	{
		var s = com_pagesociety_util_ObjectUtil.printo(o, "");
		Logger.log(s);
		return s;
	};
	/*
	  param o Object
	  param pad String
	  returns String
	*/
com_pagesociety_util_ObjectUtil.printo = function(o, pad)
	{
		var s = "";
		if (o instanceof String)
		{
			s += "\"" + o;
		}
		else
			if (o instanceof Number || o instanceof Boolean)
			{
				s += o;
			}
			else
				if (o instanceof Array)
				{
					s += "\n" + pad;
					for (var i = 0; i < o./*?Object*/length; i++)
						{
							s += pad;
							s += com_pagesociety_util_ObjectUtil.printo(o[i], pad + "  ");
							s += ",\n";
						}
					s += pad + "]\n";
				}
				else
					if (o instanceof Object)
					{
						s += "\n" + pad;
						for (var p in o)


													s += pad + p;
							s += com_pagesociety_util_ObjectUtil.printo(o[p], pad + "  ");
							s += ",\n";

						s += pad + "}\n";
					}
		return s;
	};
/*
  Random
*/

var com_pagesociety_util_Random = Class.create(
{
	initialize: function()
	{

	}
});

	/*
	  param max uint
	  returns uint
	*/
com_pagesociety_util_Random.R = function(max)
	{
		return Math.floor(Math.random() * max);
	};
	/*
	  param bottom int
	  param top int
	  returns uint
	*/
com_pagesociety_util_Random.RR = function(bottom, top)
	{
		var r = top - bottom;
		return com_pagesociety_util_Random.R(r) + bottom;
	};
	/*
	  param array Array
	  returns *
	*/
com_pagesociety_util_Random.A = function(array)
	{
		return array[com_pagesociety_util_Random.R(array.length)];
	};

com_pagesociety_util_Random.C = function()
	{
		return com_pagesociety_util_Random.R(2)==0;
	};
/*
  StringBuffer
*/

var com_pagesociety_util_StringBuffer = Class.create(
{
	initialize: function($super, init_val)
	{
		this.s/*String*/;
		init_val = (init_val ? init_val : "");
		this.s = init_val;

	},
	/*
	  param a Object
	  returns void
	*/
	append: function(a)
	{
		this.s += a;
	},

	/*
	  returns String
	*/
	toString: function()
	{
		return this.s;
	}

});

/*
  StringUtil
*/

var com_pagesociety_util_StringUtil = Class.create(
{
	initialize: function()
	{

	}
});

	/*
	  param str String
	  param oldSubStr String
	  param newSubStr String
	  returns String
	*/
com_pagesociety_util_StringUtil.replace = function(str, oldSubStr, newSubStr)
	{
		return str.split(oldSubStr).join(newSubStr);
	};
	/*
	  param str String
	  returns String
	*/
com_pagesociety_util_StringUtil.trim = function(str)
	{
		str = com_pagesociety_util_StringUtil.trimBack(com_pagesociety_util_StringUtil.trimFront(str, " "), " ");
		str = com_pagesociety_util_StringUtil.trimBack(com_pagesociety_util_StringUtil.trimFront(str, "\t"), "\t");
		str = com_pagesociety_util_StringUtil.trimBack(com_pagesociety_util_StringUtil.trimFront(str, "\n"), "\n");
		str = com_pagesociety_util_StringUtil.trimBack(com_pagesociety_util_StringUtil.trimFront(str, "\r"), "\r");
		return str;
	};
	/*
	  param str String
	  param _char String
	  returns String
	*/
com_pagesociety_util_StringUtil.trimFront = function(str, _char)
	{
		if (str == null)
			return "";
		_char = com_pagesociety_util_StringUtil.stringToCharacter(_char);
		if (str.charAt(0) == _char)
		{
			str = com_pagesociety_util_StringUtil.trimFront(str.substring(1), _char);
		}
		return str;
	};
	/*
	  param str String
	  param _char String
	  returns String
	*/
com_pagesociety_util_StringUtil.trimBack = function(str, _char)
	{
		_char = com_pagesociety_util_StringUtil.stringToCharacter(_char);
		if (str.charAt(str.length - 1) == _char)
		{
			str = com_pagesociety_util_StringUtil.trimBack(str.substring(0, str.length - 1), _char);
		}
		return str;
	};
	/*
	  param s String
	  param max_length uint
	  returns String
	*/
com_pagesociety_util_StringUtil.shorten = function(s, max_length)
	{
		if (s == null)
			return "";
		if (s.length <= max_length)
			return s;
		return s.substr(0, max_length) + "...";
	};
	/*
	  param s String
	  returns String
	*/
com_pagesociety_util_StringUtil.stripTags = function(s)
	{
		if (s == null)
			return "";
		var b = new com_pagesociety_util_StringBuffer();
		var open = false;
		for (var i = 0; i < s.length; i++)
		{
			if (s.charAt(i) == '<')
				{
					open = true;
				}
			if (!open)
				{
					b.append(s.charAt(i));
				}
			if (s.charAt(i) == '>')
				{
					open = false;
					b.append(" ");
				}
		}
		return com_pagesociety_util_StringUtil.trim(b.toString());
	};
	/*
	  param str String
	  returns String
	*/
com_pagesociety_util_StringUtil.stringToCharacter = function(str)
	{
		if (str.length == 1)
		{
			return str;
		}
		return str.slice(0, 1);
	};
	/*
	  param i uint
	  returns String
	*/
com_pagesociety_util_StringUtil.twoDigitNumber = function(i)
	{
		if (i < 10)
			return "0" + i;
		else
			return i.toString();
	};
	/*
	  param n Number
	  param add_currency_symbol Boolean
	  returns String
	*/
com_pagesociety_util_StringUtil.formatPrice = function(n, add_currency_symbol)
	{
		add_currency_symbol = (add_currency_symbol ? add_currency_symbol : true);
		var cs = add_currency_symbol ? "$" : "";
		var ni = n;
		var nd = String(Math.floor((n - ni) * 100));
		if (nd.length == 1)
			nd = nd + "0";
		if (ni == 0)
			return cs + ".";
		else
			return cs + ni;
	};
	/*
	  param timeMillis uint
	  returns String
	*/
com_pagesociety_util_StringUtil.formatTime = function(timeMillis)
	{
		var time = Math.floor(timeMillis / 1000);
		var seconds = String(time % 60);
		var minutes = String(Math.floor((time % 3600) / 60));
		var hours = String(Math.floor(time / 3600));
		for (var i = 0; i < 2; i++)
		{
			if (seconds.length < 2)
					seconds = "0" + seconds;
			if (minutes.length < 2)
					minutes = "0" + minutes;
			if (hours.length < 2)
					hours = "0" + hours;
		}
		if (hours == "00")
			return minutes + ":";
		else
			return hours + ":";
	};
	/*
	  param d Date
	  returns String
	*/
com_pagesociety_util_StringUtil.formatDate = function(d)
	{
		if (d == null)
			return "";
		return d./*?Date*/fullYear + ".";
	};
	/*
	  param d Date
	  returns String
	*/
com_pagesociety_util_StringUtil.formatDateNoTime = function(d)
	{
		if (d == null)
			return "";
		return d./*?Date*/fullYear + ".";
	};
	/*
	  param d Date
	  returns String
	*/
com_pagesociety_util_StringUtil.formatTimeNoDate = function(d)
	{
		return com_pagesociety_util_StringUtil.twoDigitNumber(d./*?Date*/hours) + ":";
	};
	/*
	  param input String
	  param prefix String
	  returns Boolean
	*/
com_pagesociety_util_StringUtil.startsWith = function(input, prefix)
	{
		return input.length >= prefix.length && input.substr(0, prefix.length) == prefix;
	};
	/*
	  param input String
	  param prefix String
	  returns Boolean
	*/
com_pagesociety_util_StringUtil.beginsWith = function(input, prefix)
	{
		return com_pagesociety_util_StringUtil.startsWith(input, prefix);
	};
	/*
	  param input String
	  param suffix String
	  returns Boolean
	*/
com_pagesociety_util_StringUtil.endsWith = function(input, suffix)
	{
		return input.indexOf(suffix) == (input.length - suffix.length);
	};
	/*
	  param s String
	  returns String
	*/
com_pagesociety_util_StringUtil.getExtension = function(s)
	{
		var lid = s./*?String*/lastIndexOf(".");
		if (lid == -1)
			return "";
		return s.substr(lid + 1)./*?substr*/toLowerCase();
	};
	/*
	  param s String
	  returns String
	*/
com_pagesociety_util_StringUtil.trimExtension = function(s)
	{
		var lid = s./*?String*/lastIndexOf(".");
		if (lid == -1)
			return s;
		return s.substr(0, lid);
	};
	/*
	  param s String
	  returns String
	*/
com_pagesociety_util_StringUtil.getFileName = function(s)
	{
		var lid = s./*?String*/lastIndexOf(".");
		if (lid == -1)
			return s;
		return s.substr(0, lid);
	};
/*
  Locker
*/

var EventDispatcher = Class.create(
{
	initialize: function($super)
	{
		this._events = [];
	},

	addEventListener: function(type, listener, useCapture, priority, useWeakReference)
	{
		useCapture = (useCapture ? useCapture : false);
		priority = (priority ? priority : 0);
		useWeakReference = (useWeakReference ? useWeakReference : false);
		this._events.push({type:type, listener:listener, useCapture:useCapture, priority:priority, useWeakReference:useWeakReference});
	},

	removeEventListener: function(type, listener)
	{
		for (var i=0; i<this._events.length; i++)
		{
			if (this._events[i].type == type && this._events[i].listener == listener)
			{
				this._events.splice(i, 1);
				break;
			}
		}
	},

	dispatchEvent: function(e)
	{
		for (var i=0; i<this._events.length; i++)
		{
			if (this._events[i].type == e.type)
			{
				this._events[i].listener(e);
			}
		}
	},

	hasEventListener: function(type)
	{
		for (var i=0; i<this._events.length; i++)
			if (this._events[i].type == type)
				return true;
	},

	/*
	  param type String
	  param listener Function
	  param useCapture Boolean
	  param priority int
	  param useWeakReference Boolean
	  returns void
	*/
	addEventListenerIfUnhandled: function(type, listener, useCapture, priority, useWeakReference)
	{
		useCapture = (useCapture ? useCapture : false);
		priority = (priority ? priority : 0);
		useWeakReference = (useWeakReference ? useWeakReference : false);
		if (this.hasEventListener(type))
			return ;
		this.addEventListener(type, listener, useCapture, priority, useWeakReference);
	},

	/*
	  param a Array
	  param useCapture Boolean
	  param priority int
	  param useWeakReference Boolean
	  returns void
	*/
	addEventListeners: function(a, useCapture, priority, useWeakReference)
	{
		useCapture = (useCapture ? useCapture : false);
		priority = (priority ? priority : 0);
		useWeakReference = (useWeakReference ? useWeakReference : false);
		for (var i = 0; i < a.length; i++)
		{
			var type = a[i];
			var listener = a[i];
			if (this.hasEventListener(type))
					throw new Error("Component.addEventListener Error: Event type [" + type);
			this.addEventListener(type, listener, useCapture, priority, useWeakReference);
		}
	},

	/*
	  returns void
	*/
	removeAllEventListeners: function()
	{
		for (var i = 0; i < this._events.length; i++)
		{
			if (this.hasEventListener(this._events[i].type))
					this.removeEventListener(this._events[i].type, this._events[i].listener);
		}
		this._events = [  ];
	},

	/*
	  param type String
	  returns void
	*/
	removeEventListenersByType: function(type)
	{
		for (var i = 0; i < this._events.length; i++)
		{
			if (this._events[i]./*?Array*/type == type)
				{
					this.removeEventListener(this._events[i].type, this._events[i].listener);
					i--;
				}
		}
	},

	/*
	  param type String
	  param listener Function
	  param useCapture Boolean
	  returns void
	*/
	removeEventListener: function(type, listener, useCapture)
	{
		useCapture = (useCapture ? useCapture : false);
		for (var i = 0; i < this._events.length; i++)
		{
			if (this._events[i].type == type && this._events[i].listener == listener)
				{
					this._events.splice(i, 1);
					break;
				}
		}
	}



});

/*
  Component
  import com_pagesociety_ux_Application
  import com_pagesociety_ux_FocusManager
  import com_pagesociety_ux_IComponent
  import com_pagesociety_ux_MovingValue
  import com_pagesociety_ux_Tween
  import com_pagesociety_ux_component_dim_ComponentDimension
  import com_pagesociety_ux_component_dim_ComponentPoint
  import com_pagesociety_ux_decorator_Decorator
  import com_pagesociety_ux_decorator_ScrollingDecorator
  import com_pagesociety_ux_event_ComponentEvent
  import com_pagesociety_ux_event_DragAndDropEvent
  import com_pagesociety_ux_event_FocusEvent
*/

var com_pagesociety_ux_component_Component = Class.create( EventDispatcher,
{
	initialize: function($super, parent, index)
	{
		this._use_button_mode = true/*Boolean*/;
		this._application/*Application*/;
		this._parent/*Container*/;
		this._decorator/*Decorator*/;
		this._id/*String*/;
		this._user_object/*Object*/;
		this._focusable = true/*Boolean*/;
		this._style_name/*String*/;
		this._tooltip/*String*/;
		this._x/*ComponentPoint*/;
		this._y/*ComponentPoint*/;
		this._width/*ComponentDimension*/;
		this._height/*ComponentDimension*/;
		this._tween/*Tween*/;
		this._timers = {  }/*Object*/;
		this._over/*Boolean*/;
		this._alpha = 1/*Number*/;
		this._alpha_to/*MovingValue*/;
		this._blur = 0/*Number*/;
		this._visible = true/*Boolean*/;
		this._backgroundColor = 0/*uint*/;
		this._backgroundVisible = false/*Boolean*/;
		this._backgroundAlpha = 1/*Number*/;
		this._backgroundBorderVisible = false/*Boolean*/;
		this._backgroundBorderAlpha = .5/*Number*/;
		this._backgroundBorderThickness = 1/*Number*/;
		this._backgroundBorderColor = 0/*uint*/;
		this._backgroundShadowSize = 0/*Number*/;
		this._backgroundShadowStrength = 2/*Number*/;
		this._backgroundShadowColor = 0x000000/*Number*/;
		this._backgroundShadowDistance = 0/*Number*/;
		this._cornerRadius = 0/*Number*/;
		this._listeners = [  ]/*Array*/;
		this._time_since_last_click = 0/*uint*/;
		this._mouse_x = 0/*Number*/;
		this._mouse_y = 0/*Number*/;
		this._drag_event/*ComponentEvent*/;
		this._drag_delay = 0/*uint*/;
		index = (index ? index : -1);
		$super();
		this._x = new com_pagesociety_ux_component_dim_ComponentPoint(this, com_pagesociety_ux_component_dim_ComponentPoint.X);
		this._y = new com_pagesociety_ux_component_dim_ComponentPoint(this, com_pagesociety_ux_component_dim_ComponentPoint.Y);
		this._width = new com_pagesociety_ux_component_dim_ComponentDimension(this, com_pagesociety_ux_component_dim_ComponentDimension.WIDTH);
		this._height = new com_pagesociety_ux_component_dim_ComponentDimension(this, com_pagesociety_ux_component_dim_ComponentDimension.HEIGHT);
		this.setup(parent, index);
	},
	/*
	  param parent Container
	  param index int
	  returns void
	*/
	setup: function(parent, index)
	{
		index = (index ? index : -1);
		this._parent = parent;
		if (parent == null)
			throw new Error("NO PARENT?");
		this._application = this._parent.getApplication();
		if (index == -1)
			this._parent.addComponent(this);
		else
			this._parent.addComponentAtIndex(this, index);
		if (this._decorator == null)
			this.setDecorator(new com_pagesociety_ux_decorator_Decorator());

	},

	/*
	  param new_decorator Decorator
	  returns void
	*/
	setDecorator: function(new_decorator)
	{
		if (new_decorator == null)
			return;
		var target = this._parent.getDecorator().mid;
		if (this._decorator != null)
		{
			try
				{
					target.removeChild(this._decorator.element);
				}
			catch (e)
				{
				}
		}
		this._decorator = new_decorator;
		this._decorator.setComponent(this);
		target.insert(this._decorator.element);
		this.setStyleName("Component");
		this.update_decorator_listeners();
//		if (this instanceof com_pagesociety_ux_component_Container)
//		{
//			var c = com_pagesociety_ux_component_Container(this).getChildren();
//			for (var i = 0; i < c.length; i++)
//				{
//					c[i]./*?Array*/bindToSprite(this._decorator.getMidground());
//				}
//		}
	},

	/*
	  param new_parent Container
	  returns void
	*/
	setParent: function(new_parent)
	{
		if (new_parent == this._parent)
			return
//		var s;
//		if (this._parent != null)
//		{
//			s = this._decorator/* as flash.display.Sprite*/;
//			if (s./*?Sprite*/parent != null)
//					s./*?Sprite*/parent./*?Container*/removeChild(s);
//		}
//		throw new Error("Component.setParent... is unimplemented");
//		this.setup(new_parent);
	},

	/*
	  returns void
	*/
	bringToFront: function()
	{
		this.getDecorator().bringToFront();
	},

	/*
	  returns void
	*/
	sendToBack: function()
	{
		this.getDecorator().sendToBack();
	},

	/*
	  param p Sprite
	  returns void
	*/
	bindToSprite: function(p)
	{
		throw new Error("Component.bindToSprite unimplemented");
//		var s = flash.display.Sprite(this._decorator);
//		if (s./*?Sprite*/parent != null)
//			s./*?Sprite*/parent./*?Container*/removeChild(s)
//		p./*?Sprite*/addChild(s);
	},

	/*
	  returns void
	*/
	destroy: function()
	{
		this._decorator.destroy();
		this.removeAllEventListeners();
		this.cancel_execute_laters();
		if (this._tween != null)
			this._tween.destroy();
	},

	/*
	  param c Container
	  returns Boolean
	*/
	hasAncestor: function(c)
	{
		var p = this._parent;
		while (p != null)
		{
			if (p == c)
					return true;
			p = p.getParent();
		}
		return false;
	},

	/*
	  returns void
	*/
	render: function()
	{
		this.crender();
	},
	crender: function()
	{
		if (this._decorator == null)
			return ;
		if (this._alpha_to != null)
		{
			this._alpha = this._alpha_to.getValue();
		}
		if (this._bg_alpha_to != null)
		{
			this._backgroundAlpha = this._bg_alpha_to.getValue();
		}
		this._decorator.setVisible(this._visible);
		if (!this._visible)
		{
			this._decorator.decorate();
			return ;
		}
		this._decorator.setX(this.getX());
		this._decorator.setY(this.getY());
		this._decorator.setWidth(this.getWidth());
		this._decorator.setHeight(this.getHeight());
		this._decorator.alpha = this._alpha;
		this._decorator.blur = this._blur;
		this._decorator.backgroundVisible = this._backgroundVisible;
		this._decorator.backgroundColor = this._backgroundColor;
		this._decorator.backgroundAlpha = this._backgroundAlpha;
//		this._decorator.getBackground()./*?Box*/borderVisible = this._backgroundBorderVisible;
//		this._decorator.getBackground()./*?Box*/borderAlpha = this._backgroundBorderAlpha;
//		this._decorator.getBackground()./*?Box*/borderThickness = this._backgroundBorderThickness;
//		this._decorator.getBackground()./*?Box*/borderColor = this._backgroundBorderColor;
		this._decorator.shadowSize = this._backgroundShadowSize;
		this._decorator.shadowStrength = this._backgroundShadowStrength;
		this._decorator.shadowColor = this._backgroundShadowColor;
		this._decorator.shadowDistance = this._backgroundShadowDistance;
		this._decorator.cornerRadius = this._cornerRadius;
		this._decorator.styleName = this._style_name;
		this._decorator.decorate();
	},

	/*
	  param moving_values Array
	  param ms uint
	  param on_complete Function
	  returns void
	*/
	animate: function(moving_values, ms, on_complete)
	{
		on_complete = (on_complete ? on_complete : null);
		if (ms == 0)
		{
			for (var i = 0; i < moving_values.length; i++)
				{
					moving_values[i].setPercentComplete(1);
					this.render();
				}
			if (on_complete != null)
					on_complete();
			return ;
		}
		if (this._tween == null)
			this._tween = new com_pagesociety_ux_Tween(0);
		this._tween.render(this, moving_values, ms, on_complete);
	},

	/*
	  returns void
	*/
	stop: function()
	{
		if (this._tween != null)
			this._tween.stop();
	},

	/*
	  returns void
	*/
	onStartAnimation: function()
	{
	},

	/*
	  returns void
	*/
	onStopAnimation: function()
	{
	},

	/*
	  param id String
	  param f Function
	  param delay uint
	  param args *
	  returns void
	*/
	execute_later: function(id, f, delay, args)
	{
		args = (args ? args : null);
		var THIS = this;
		var t = this._timers[id];
		if (t == null)
		{
			t = new Timer(delay, 1);
			this._timers[id] = t;
			t.addEventListener(TimerEvent.TIMER, function (e)
			{
				THIS._timers[id] = null;
				if (args == null)
					f();
				else
					f(args);
			});
			t.start();
		}
	},

	/*
	  param id String
	  returns void
	*/
	cancel_execute_late: function(id)
	{
		var t = this._timers[id];
		if (t != null)
			t.stop();
		this._timers[id] = null;
	},

	/*
	  returns void
	*/
	cancel_execute_laters: function()
	{
		for (var p in this._timers)
			this.cancel_execute_late(p);

	},

	/*
	  returns void
	*/
	add_mouse_over_default_behavior: function()
	{
		if (this.hasEventListener(com_pagesociety_ux_event_ComponentEvent.MOUSE_OVER))
			return
		this.addEventListener(com_pagesociety_ux_event_ComponentEvent.MOUSE_OVER, this.on_mouse_over.bind(this));
		this.addEventListener(com_pagesociety_ux_event_ComponentEvent.MOUSE_OUT, this.on_mouse_out.bind(this));
	},

	/*
	  param e ComponentEvent
	  returns void
	*/
	on_mouse_over: function(e)
	{
		this._over = true;
		this.render();
		if (this._tooltip != null)
			this.getApplication().showToolTip(this._tooltip, this);
	},

	/*
	  param e ComponentEvent
	  returns void
	*/
	on_mouse_out: function(e)
	{
		this._over = false;
		this.render();
		if (this._tooltip != null)
			this.getApplication().hideToolTip();
	},

	/*
	  param guide int
	  param offset Number
	  param dim_percent_offset Number
	  returns void
	*/
	alignX: function(guide, offset, dim_percent_offset)
	{
		offset = (offset ? offset : 0);
		dim_percent_offset = (dim_percent_offset ? dim_percent_offset : Number.MAX_VALUE);
		this._x.setAlign(guide, offset, dim_percent_offset, this._parent.getXGuides());
	},

	/*
	  param percent Number
	  param offset Number
	  param dim_percent_offset Number
	  returns void
	*/
	setXRelativeToParent: function(percent, offset, dim_percent_offset)
	{
		offset = (offset ? offset : 0);
		dim_percent_offset = (dim_percent_offset ? dim_percent_offset : 0);
		this._x.setRelativeToParent(percent, offset, dim_percent_offset);
	},

	/*
	  param sibling Component
	  param alignment uint
	  param offset Number
	  param dim_percent_offset Number
	  returns void
	*/
	setXRelativeToSibling: function(sibling, alignment, offset, dim_percent_offset)
	{
		offset = (offset ? offset : 0);
		dim_percent_offset = (dim_percent_offset ? dim_percent_offset : Number.MAX_VALUE);
		this._x.setRelativeToSibling(sibling, alignment, offset, dim_percent_offset);
	},

	/*
	  param guide int
	  param offset Number
	  param dim_percent_offset Number
	  returns void
	*/
	alignY: function(guide, offset, dim_percent_offset)
	{
		offset = (offset ? offset : 0);
		dim_percent_offset = (dim_percent_offset ? dim_percent_offset : Number.MAX_VALUE);
		this._y.setAlign(guide, offset, dim_percent_offset, this._parent.getYGuides());
	},

	/*
	  param percent Number
	  param offset Number
	  param dim_percent_offset Number
	  returns void
	*/
	setYRelativeToParent: function(percent, offset, dim_percent_offset)
	{
		offset = (offset ? offset : 0);
		dim_percent_offset = (dim_percent_offset ? dim_percent_offset : 0);
		this._y.setRelativeToParent(percent, offset, dim_percent_offset);
	},

	/*
	  param sibling Component
	  param alignment uint
	  param offset Number
	  param dim_percent_offset Number
	  returns void
	*/
	setYRelativeToSibling: function(sibling, alignment, offset, dim_percent_offset)
	{
		offset = (offset ? offset : 0);
		dim_percent_offset = (dim_percent_offset ? dim_percent_offset : Number.MAX_VALUE);
		this._y.setRelativeToSibling(sibling, alignment, offset, dim_percent_offset);
	},

	/*
	  param x0 Number
	  param y0 Number
	  returns void
	*/
	updatePosition: function(x0, y0)
	{
		this.setX(x0);
		this.setY(y0);
		if (this.getDecorator() != null)
			this.getDecorator().updatePosition(x0, y0);
	},

	/*
	  returns void
	*/
	widthUnset: function()
	{
		this._width.unset();
	},

	/*
	  param pw Number
	  param delta Number
	  returns void
	*/
	setWidthPercent: function(pw, delta)
	{
		delta = (delta ? delta : 0);
		this._width.setPercent(pw / 100, delta);
	},

	/*
	  returns void
	*/
	heightUnset: function()
	{
		this._height.unset();
	},

	/*
	  param pw Number
	  param delta Number
	  returns void
	*/
	setHeightPercent: function(pw, delta)
	{
		delta = (delta ? delta : 0);
		this._height.setPercent(pw / 100, delta);
	},

	/*
	  returns Point
	*/
	getRootPosition: function()
	{
		var p =  { x: this.getX(), y: this.getY() };
		if (this.getApplication().isTakeover(this))
			return p;
		var pp = this._parent;
		while (pp != null)
		{
			p.x += pp.getX();
			p.y += pp.getY();
			if (this.getApplication().isTakeover(pp))
					return p;
			if (pp.getDecorator() instanceof com_pagesociety_ux_decorator_ScrollingDecorator)
				{
					var sdec = pp.getDecorator()/* as com_pagesociety_ux_decorator_ScrollingDecorator*/;
					p.x -= sdec.getScrollHorizontal();
					p.y -= sdec.getScrollVertical();
				}
			pp = pp.getParent();
		}
		return p;
	},

	/*
	  param a Number
	  param s uint
	  param on_complete Function
	  returns void
	*/
	alphaTo: function(a, s, on_complete)
	{
		s = (s ? s : 400);
		on_complete = (on_complete ? on_complete : null);
		if (this._alpha_to == null)
			this._alpha_to = new com_pagesociety_ux_MovingValue();
		this._alpha_to.reset(this._alpha);
		this._alpha_to.setValue(a);
		this.animate([ this._alpha_to ], s, on_complete);
	},
	backgroundAlphaTo: function(a, s, on_complete)
	{
		s = (s ? s : 400);
		on_complete = (on_complete ? on_complete : null);
		if (this._bg_alpha_to == null)
			this._bg_alpha_to = new com_pagesociety_ux_MovingValue();
		this._bg_alpha_to.reset(this._backgroundAlpha);
		this._bg_alpha_to.setValue(a);
		this.animate([ this._bg_alpha_to ], s, on_complete);
	},

	/*
	  returns Point
	*/
	getToolTipOffset: function()
	{
		return {x:0, y:0};
	},

	/*
	  override
	  returns String
	*/
	toString: function($super)
	{
		if (this._id != null)
			return " {" + this._id;
		return "[Component";
	},

	/*
	  returns String
	*/
	toStringIndented: function()
	{
		var s = "";
		var p = this.getParent();
		while (p != null)
		{
			p = p.getParent();
			s += "  ";
		}
		return s + this.toString();
	},

	/*
	  override
	  param type String
	  param listener Function
	  param useCapture Boolean
	  param priority int
	  param useWeakReference Boolean
	  returns void
	*/
	addEventListener: function($super, type, listener, useCapture, priority, useWeakReference)
	{
		$super(type, listener, useCapture, priority, useWeakReference);
		this.update_decorator_listeners();
	},


	/*
	  override
	  returns void
	*/
	removeAllEventListeners: function($super)
	{
		$super();
		this.update_decorator_listeners();
	},

	/*
	  override
	  param type String
	  returns void
	*/
	removeEventListenersByType: function($super, type)
	{
		$super(type);
		this.update_decorator_listeners();
	},

	/*
	  override
	  param type String
	  param listener Function
	  param useCapture Boolean
	  returns void
	*/
	removeEventListener: function($super, type, listener, useCapture)
	{
		$super(type, listener, useCapture);
		this.update_decorator_listeners();
	},

	/*
	  param type String
	  param component Component
	  param data *
	  returns void
	*/
	dispatchComponentEvent: function(type, component, data)
	{
		component = (component ? component : null);
		data = (data ? data : null);
		if (component == null)
			component = this;
		if (data == null)
			data = this.getUserObject();
		this.dispatchEvent(new com_pagesociety_ux_event_ComponentEvent(type, component, data));
	},

	/*
	  param e ComponentEvent
	  returns void
	*/
	onBubbleEvent: function(e)
	{
		this.dispatchEvent(e.clone());
	},

	/*
	  param e String
	  param data *
	  returns Function
	*/
	translateEvent: function(e, data)
	{
		data = (data ? data : null);
		var event = e;
		var _data = data;
//		var T = this;
//		var f = function ()
//		{
//			T.dispatchComponentEvent(event, T, _data);
//		};
//		return f;
		this.dispatchComponentEvent(event, this, _data);
	},

	/*
	  returns void
	*/
	update_decorator_listeners: function()
	{
		if (this._decorator == null)
			return ;
		var el = this._decorator.element;
		if (this.hasEventListener(com_pagesociety_ux_event_ComponentEvent.CLICK) || this.hasEventListener(com_pagesociety_ux_event_ComponentEvent.DOUBLE_CLICK))
		{
			//this._decorator./*?Decorator*/buttonMode = (com_pagesociety_ux_component_Component.USE_BUTTON_MODE && this._use_button_mode);
			//if (!this._decorator.observes(MouseEvent./*?MouseEvent*/CLICK))
					el.onclick = this.onClick.bind(this);
					el.style.cursor = "pointer";
		}
		else
		{
			//this._decorator./*?Decorator*/buttonMode = false;
		}
		if (this.hasEventListener(com_pagesociety_ux_event_ComponentEvent.MOUSE_OVER))
			el.onmouseover = this.onMouseOver.bind(this);
		if (this.hasEventListener(com_pagesociety_ux_event_ComponentEvent.MOUSE_OUT))
			el.onmouseout = this.onMouseOut.bind(this);
		if (this.hasEventListener(com_pagesociety_ux_event_ComponentEvent.MOUSE_DOWN))
			el.onmousedown = this.onMouseDown.bind(this);
		if (this.hasEventListener(com_pagesociety_ux_event_ComponentEvent.MOUSE_MOVE))
			el.onmousemove = this.onMouseMoveJS.bind(this);

		var THIS = this;
		if (this.hasEventListener(com_pagesociety_ux_event_ComponentEvent.DRAG))
		{
			el.onmousedown = function (e)
			{
				THIS.execute_later("drag", THIS.onStartMouseMove.bind(THIS), THIS._drag_delay, e);
			};
			el.onmouseup = function (e)
			{
				THIS.cancel_execute_late("drag");
			};
		}
		if (this.hasEventListener(com_pagesociety_ux_event_ComponentEvent.ROLL_OVER))
			el.onmouseover = this.onMouseOver.bind(this);
		if (this.hasEventListener(com_pagesociety_ux_event_ComponentEvent.ROLL_OUT))
			el.onmouseout = this.onMouseOut.bind(this);
	},

	/*
	  returns Component
	*/
	clone: function()
	{
		throw new Error("Component.clone?");
	},

	/*
	  param e MouseEvent
	  returns void
	*/
	onClick: function(e)
	{
		if(!e)
			e = window.event;
		var local_coords 	= getPositionedEventCoords(e);
		this._mouse_x 		= local_coords.x;
		this._mouse_y 		= local_coords.y;
		if (this.getFocusManager() != null)
			this.getFocusManager().setFocus(this);
		if (this.hasEventListener(com_pagesociety_ux_event_ComponentEvent.DOUBLE_CLICK) && getTimer() - this._time_since_last_click < com_pagesociety_ux_component_Component.DOUBLE_CLICK_SPEED)
			this.dispatchComponentEvent(com_pagesociety_ux_event_ComponentEvent.DOUBLE_CLICK, this, e);
		else
			this.dispatchComponentEvent(com_pagesociety_ux_event_ComponentEvent.CLICK, this, e);
		this._time_since_last_click = getTimer();
	},

	/*
	  param e MouseEvent
	  returns void
	*/
	onMouseOver: function(e)
	{
		if(!e)
			e = window.event;
		this.dispatchComponentEvent(com_pagesociety_ux_event_ComponentEvent.MOUSE_OVER, this, e);
	},

	/*
	  param e MouseEvent
	  returns void
	*/
	onMouseOut: function(e)
	{
		if(!e)
			e = window.event;
		this.dispatchComponentEvent(com_pagesociety_ux_event_ComponentEvent.MOUSE_OUT, this, e);
	},

	/*
	  param e MouseEvent
	  returns void
	*/
	onRollOver: function(e)
	{
		this.dispatchComponentEvent(com_pagesociety_ux_event_ComponentEvent.ROLL_OVER, this, e);
	},

	/*
	  param e MouseEvent
	  returns void
	*/
	onRollOut: function(e)
	{
		this.dispatchComponentEvent(com_pagesociety_ux_event_ComponentEvent.ROLL_OUT, this, e);
	},

	/*
	  param e MouseEvent
	  returns void
	*/
	onMouseDown: function(e)
	{
		this.dispatchComponentEvent(com_pagesociety_ux_event_ComponentEvent.MOUSE_DOWN, this, e);
	},

	onMouseMoveJS: function(e)
	{
		if (!e) e = window.event;
		this.dispatchComponentEvent(com_pagesociety_ux_event_ComponentEvent.MOUSE_MOVE, this, e);
	},

	/*
	  param e MouseEvent
	  returns void
	*/
	onStartMouseMove: function(e)
	{
		this._application./*?Application*/stage./*?stage*/addEventListener(MouseEvent./*?MouseEvent*/MOUSE_MOVE, this.onMouseMove.bind(this));
		this._application./*?Application*/stage./*?stage*/addEventListener(MouseEvent./*?MouseEvent*/MOUSE_UP, this.onStopMouseMove.bind(this));
		this._mouse_x = e./*?MouseEvent*/stageX;
		this._mouse_y = e./*?MouseEvent*/stageY;
		this.dispatchComponentEvent(com_pagesociety_ux_event_ComponentEvent.DRAG_START, THIS, { x : _mouse_x, y : _mouse_y, dx : 0, dy : 0 });
		this._drag_event = new com_pagesociety_ux_event_ComponentEvent(com_pagesociety_ux_event_ComponentEvent.DRAG, THIS, { x : _mouse_x, y : _mouse_y, dx : 0, dy : 0 });
		this.dispatchEvent(this._drag_event);
	},

	/*
	  param e MouseEvent
	  returns void
	*/
	onMouseMove: function(e)
	{
		var dx = e./*?MouseEvent*/stageX - this._mouse_x;
		var dy = e./*?MouseEvent*/stageY - this._mouse_y;
		this._mouse_x = e./*?MouseEvent*/stageX;
		this._mouse_y = e./*?MouseEvent*/stageY;
		this._drag_event.data./*?**/x = this._mouse_x;
		this._drag_event.data./*?**/y = this._mouse_y;
		this._drag_event.data./*?**/dx = dx;
		this._drag_event.data./*?**/dy = dy;
		this.dispatchEvent(this._drag_event);
	},

	/*
	  param e MouseEvent
	  returns void
	*/
	onStopMouseMove: function(e)
	{
		this._application./*?Application*/stage./*?stage*/removeEventListener(MouseEvent./*?MouseEvent*/MOUSE_MOVE, this.onMouseMove.bind(this));
		this._application./*?Application*/stage./*?stage*/removeEventListener(MouseEvent./*?MouseEvent*/MOUSE_UP, this.onStopMouseMove.bind(this));
		this.dispatchComponentEvent(com_pagesociety_ux_event_ComponentEvent.DRAG_STOP, THIS);
	},

	/*
	  param t Component
	  returns void
	*/
	addDropTarget: function(t)
	{
		this.getDecorator().setDragComponent(THIS);
		this.getDecorator().addDropComponent(t);

	},

	/*
	  param a Array
	  returns void
	*/
	setDropTargets: function(a)
	{
		this.getDecorator().setDragComponent(THIS);
		this.getDecorator().setDropTargets(a);
	},

	/*
	  param t Component
	  returns void
	*/
	removeDropTarget: function(t)
	{
		this.getDecorator().removeDropComponent(t);
	},

	/*
	  returns void
	*/
	removeDropTargets: function()
	{
		this.getDecorator().setDropTargets(new Array());
	},

	/*
	  param c Component
	  returns void
	*/
	onDragStart: function(c)
	{
		this.dispatchEvent(new com_pagesociety_ux_event_DragAndDropEvent(com_pagesociety_ux_event_DragAndDropEvent.DRAG_START, THIS));
	},

	/*
	  param c Component
	  param x Number
	  param y Number
	  returns void
	*/
	onDragOver: function(c, x, y)
	{
		this.dispatchEvent(new com_pagesociety_ux_event_DragAndDropEvent(com_pagesociety_ux_event_DragAndDropEvent.DRAG_OVER, THIS, c, x, y));
	},

	/*
	  param c Component
	  returns void
	*/
	onDragExit: function(c)
	{
		this.dispatchEvent(new com_pagesociety_ux_event_DragAndDropEvent(com_pagesociety_ux_event_DragAndDropEvent.DRAG_EXIT, THIS, c));
	},

	/*
	  param c Component
	  param x Number
	  param y Number
	  returns void
	*/
	onDrop: function(c, x, y)
	{
		this.dispatchEvent(new com_pagesociety_ux_event_DragAndDropEvent(com_pagesociety_ux_event_DragAndDropEvent.DROP, THIS, c, x, y));
	},

	/*
	  param x Number
	  param y Number
	  returns void
	*/
	onDragEnd: function(x, y)
	{
		this.dispatchEvent(new com_pagesociety_ux_event_DragAndDropEvent(com_pagesociety_ux_event_DragAndDropEvent.DRAG_END, THIS, THIS, x, y));
	},

	/*
	  param e FocusEvent
	  returns void
	*/
	onFocus: function(e)
	{
	},

	/*
	  returns Decorator
	*/
	getDecorator: function()
	{
		return this._decorator;
	},

	/*
	  returns Container
	*/
	getParent: function()
	{
		return this._parent;
	},

	/*
	  returns Application
	*/
	getApplication: function()
	{
		return this._application;
	},

	/*
	  returns FocusManager
	*/
	getFocusManager: function()
	{
		return this.getApplication().getFocusManager();
	},

	/*
	  returns *
	*/
	getUserObject: function()
	{
		return this._user_object;
	},

	/*
	  returns Boolean
	*/
	getMoving: function()
	{
		if (this._tween == null)
			return false;
		return this._tween.getMoving();
	},

	/*
	  returns Boolean
	*/
	getOver: function()
	{
		return this._over;
	},

	/*
	  returns Number
	*/
	getX: function()
	{
		return this._x.getValue();
	},

	/*
	  returns ComponentPoint
	*/
	getComponentX: function()
	{
		return this._x;
	},

	/*
	  returns Number
	*/
	getY: function()
	{
		return this._y.getValue();
	},

	/*
	  returns ComponentPoint
	*/
	getComponentY: function()
	{
		return this._y;
	},

	/*
	  returns Number
	*/
	getWidth: function()
	{
		return this._width.getValue();
	},

	/*
	  returns ComponentDimension
	*/
	getComponentWidth: function()
	{
		return this._width;
	},

	/*
	  returns Boolean
	*/
	getIsWidthUnset: function()
	{
		return this._width.getIsUnset();
	},

	/*
	  returns Number
	*/
	getHeight: function()
	{
		return this._height.getValue();
	},

	/*
	  returns Boolean
	*/
	getIsHeightUnset: function()
	{
		return this._height.getIsUnset();
	},

	/*
	  returns ComponentDimension
	*/
	getComponentHeight: function()
	{
		return this._height;
	},

	/*
	  returns String
	*/
	getId: function()
	{
		return this._id;
	},

	/*
	  returns String
	*/
	getStyleName: function()
	{
		return this._style_name;
	},

	/*
	  returns Number
	*/
	getAlpha: function()
	{
		return this._alpha;
	},

	/*
	  returns Number
	*/
	getBlur: function()
	{
		return this._blur;
	},

	/*
	  returns Boolean
	*/
	getVisible: function()
	{
		return this._visible;
	},

	/*
	  returns uint
	*/
	getBackgroundColor: function()
	{
		return this._backgroundColor;
	},

	/*
	  returns Boolean
	*/
	getBackgroundVisible: function()
	{
		return this._backgroundVisible;
	},

	/*
	  returns Number
	*/
	getBackgroundAlpha: function()
	{
		return this._backgroundAlpha;
	},

	/*
	  returns Boolean
	*/
	getBackgroundBorderVisible: function()
	{
		return this._backgroundBorderVisible;
	},

	/*
	  returns Number
	*/
	getBackgroundBorderAlpha: function()
	{
		return this._backgroundBorderAlpha;
	},

	/*
	  returns Number
	*/
	getBackgroundBorderThickness: function()
	{
		return this._backgroundBorderThickness;
	},

	/*
	  returns uint
	*/
	getBackgroundBorderColor: function()
	{
		return this._backgroundBorderColor;
	},

	/*
	  returns Number
	*/
	getBackgroundShadowSize: function()
	{
		return this._backgroundShadowSize;
	},

	/*
	  returns Number
	*/
	getBackgroundShadowStrength: function()
	{
		return this._backgroundShadowStrength;
	},

	/*
	  returns Number
	*/
	getBackgroundShadowColor: function()
	{
		return this._backgroundShadowColor;
	},

	/*
	  returns Number
	*/
	getBackgroundShadowDistance: function()
	{
		return this._backgroundShadowDistance;
	},

	/*
	  returns Number
	*/
	getCornerRadius: function()
	{
		return this._cornerRadius;
	},

	/*
	  returns Boolean
	*/
	getFocusable: function()
	{
		return this._focusable;
	},

	/*
	  returns String
	*/
	getTooltip: function()
	{
		return this._tooltip;
	},

	/*
	  returns Boolean
	*/
	getUseButtonMode: function()
	{
		return this._use_button_mode;
	},

	/*
	  returns Number
	*/
	getMouseX: function()
	{
		return this._mouse_x;
	},

	/*
	  returns Number
	*/
	getMouseY: function()
	{
		return this._mouse_y;
	},

	/*
	  returns uint
	*/
	getDragDelay: function()
	{
		return this._drag_delay;
	},



	/*
	  param c Container
	  returns void
	*/
	setTakeover: function(c)
	{
		this._parent = c;
		c.getChildren().push(c);
	},

	/*
	  param o *
	  returns void
	*/
	setUserObject: function(o)
	{
		this._user_object = o;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setOver: function(b)
	{
		this._over = b;
	},

	/*
	  param x Number
	  returns void
	*/
	setX: function(x)
	{
		this._x.setAbsolute(x);
	},

	/*
	  param pw Number
	  returns void
	*/
	setXPercent: function(pw)
	{
		this._x.setRelativeToParent(pw / 100);
	},

	/*
	  param pw Number
	  returns void
	*/
	setXDelta: function(pw)
	{
		this._x.setRelativeToParent(1, pw);
	},

	/*
	  param y Number
	  returns void
	*/
	setY: function(y)
	{
		this._y.setAbsolute(y);
	},

	/*
	  param pw Number
	  returns void
	*/
	setYPercent: function(pw)
	{
		this._y.setRelativeToParent(pw / 100);
	},

	/*
	  param pw Number
	  returns void
	*/
	setYDelta: function(pw)
	{
		this._y.setRelativeToParent(1, pw);
	},

	/*
	  param w Number
	  returns void
	*/
	setWidth: function(w)
	{
		this._width.setAbsolute(w);
	},

	/*
	  param pw Number
	  returns void
	*/
	setWidthPercent: function(pw)
	{
		this._width.setPercent(pw / 100);
	},

	/*
	  param pw Number
	  returns void
	*/
	setWidthDelta: function(pw)
	{
		this._width.setDelta(pw);
	},

	/*
	  param h Number
	  returns void
	*/
	setHeight: function(h)
	{
		this._height.setAbsolute(h);
	},

	/*
	  param ph Number
	  returns void
	*/
	setHeightPercent: function(ph)
	{
		this._height.setPercent(ph / 100);
	},

	/*
	  param ph Number
	  returns void
	*/
	setHeightDelta: function(ph)
	{
		this._height.setDelta(ph);
	},

	/*
	  param s String
	  returns void
	*/
	setId: function(s)
	{
		this._id = s;
	},

	/*
	  param s String
	  returns void
	*/
	setStyleName: function(s)
	{
		this._style_name = s;
//		if (this.getApplication().getStyle() != null)
//			this.getApplication().getStyle()./*?Style*/apply(THIS, this.getApplication().getStyle()./*?Style*/getStyle(s));
	},

	/*
	  param a Number
	  returns void
	*/
	setAlpha: function(a)
	{
		this._alpha = a;
	},

	/*
	  param b Number
	  returns void
	*/
	setBlur: function(b)
	{
		if (this._blur < 0)
			this._blur = 0;
		this._blur = b;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setVisible: function(b)
	{
		this._visible = b;
	},

	/*
	  param c uint
	  returns void
	*/
	setBackgroundColor: function(c)
	{
		this._backgroundColor = c;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setBackgroundVisible: function(b)
	{
		this._backgroundVisible = b;
	},

	/*
	  param a Number
	  returns void
	*/
	setBackgroundAlpha: function(a)
	{
		this._backgroundAlpha = a;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setBackgroundBorderVisible: function(b)
	{
		this._backgroundBorderVisible = b;
	},

	/*
	  param a Number
	  returns void
	*/
	setBackgroundBorderAlpha: function(a)
	{
		this._backgroundBorderAlpha = a;
	},

	/*
	  param a Number
	  returns void
	*/
	setBackgroundBorderThickness: function(a)
	{
		this._backgroundBorderThickness = a;
	},

	/*
	  param c uint
	  returns void
	*/
	setBackgroundBorderColor: function(c)
	{
		this._backgroundBorderColor = c;
	},

	/*
	  param s Number
	  returns void
	*/
	setBackgroundShadowSize: function(s)
	{
		this._backgroundShadowSize = s;
	},

	/*
	  param s Number
	  returns void
	*/
	setBackgroundShadowStrength: function(s)
	{
		this._backgroundShadowStrength = s;
	},

	/*
	  param s Number
	  returns void
	*/
	setBackgroundShadowColor: function(s)
	{
		this._backgroundShadowColor = s;
	},

	/*
	  param s Number
	  returns void
	*/
	setBackgroundShadowDistance: function(s)
	{
		this._backgroundShadowDistance = s;
	},

	/*
	  param r Number
	  returns void
	*/
	setCornerRadius: function(r)
	{
		this._cornerRadius = r;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setFocusable: function(b)
	{
		this._focusable = b;
	},

	/*
	  param s String
	  returns void
	*/
	setTooltip: function(s)
	{
		this._tooltip = s;
		this.add_mouse_over_default_behavior();
	},

	/*
	  param b Boolean
	  returns void
	*/
	setUseButtonMode: function(b)
	{
		this._use_button_mode = b;
	},

	/*
	  param d uint
	  returns void
	*/
	setDragDelay: function(d)
	{
		this._drag_delay = d;
	}

});

com_pagesociety_ux_component_Component.USE_BUTTON_MODE = true;
com_pagesociety_ux_component_Component.DOUBLE_CLICK_SPEED = 700;
com_pagesociety_ux_component_Component.PIXEL = 0x01;
com_pagesociety_ux_component_Component.PERCENT = 0x02;
/*
  Container
  import com_pagesociety_ux_component_text_Label
  import com_pagesociety_ux_component_text_Link
  import com_pagesociety_ux_decorator_MaskedDecorator
  import com_pagesociety_ux_event_ComponentEvent
  import com_pagesociety_ux_layout_FlowLayout
  import com_pagesociety_ux_layout_GridLayout
  import com_pagesociety_ux_layout_Layout
  import com_pagesociety_ux_layout_TableLayout
  import flash_display_Graphics
  import flash_utils_getTimer
*/

var com_pagesociety_ux_component_Container = Class.create( com_pagesociety_ux_component_Component,
{
	initialize: function($super, parent, index)
	{
		this._children/*Array*/;
		this._layout/*Layout*/;
		this._width_for_unset/*Number*/;
		this._height_for_unset/*Number*/;
		this._x_guides/*Array*/;
		this._y_guides/*Array*/;
		this._stack/*Array*/;
		index = (index ? index : -1);
		this._children = new Array();
		$super(parent, index);

	},
	/*
	  param child Component
	  returns void
	*/
	addComponent: function(child)
	{
		if (child.getParent() != this)
			throw new Error("Cannot reparent Component");
		if (child==this)
			return;
		this._children.push(child);
	},

	/*
	  param child Component
	  param index int
	  returns void
	*/
	addComponentAtIndex: function(child, index)
	{
		if (child.getParent() != this)
			throw new Error("Cannot reparent Component");
		if (index < 0)
			index = 0;
		if (index > this._children.length)
			index = this._children.length;
		this._children.splice(index, 0, child);
	},

	/*
	  param child Component
	  param f Function
	  returns *
	*/
	recreateChild: function(child, f)
	{
		if (child != null)
		{
			this.removeComponent(child);
			child = null;
		}
		return f();
	},

	/*
	  param child Component
	  returns void
	*/
	removeComponent: function(child)
	{
		child.setParent(null);
		this.getChildren().splice(this._children.indexOf(child), 1);
		child.destroy();
	},

	/*
	  param child Component
	  param new_index int
	  returns void
	*/
	reIndexComponent: function(child, new_index)
	{
		if (child.getParent() != THIS)
			throw new Error("Can't re-index a component that is not my child");
		if (new_index < 0)
			new_index = 0;
		this.getChildren().splice(this.indexOf(child), 1);
		this.getChildren().splice(new_index, 0, child);
	},

	/*
	  returns void
	*/
	clear: function()
	{
		while (this._children.length != 0)
		{
			var c = this._children.pop();
			c.destroy();
			c = null;
		}
	},

	/*
	  override
	  returns void
	*/
	destroy: function($super)
	{
		this.clear();
		$super();
	},

	/*
	  returns void
	*/
	hideAll: function()
	{
		for (var i = 0; i < this._children.length; i++)
		{
			var c = com_pagesociety_ux_component_Component(this._children[i]);
			c.setVisible(false);
		}
	},

	/*
	  param c Component
	  returns void
	*/
	showChild: function(c)
	{
		this.hideAll();
		c.setVisible(true);
	},

	/*
	  param c Component
	  returns int
	*/
	indexOf: function(c)
	{
		return this.getChildren().indexOf(c);
	},

	/*
	  param id String
	  returns Component
	*/
	getById: function(id)
	{
		if (this._id == id)
			return this;
		for (var i = 0; i < this._children.length; i++)
		{
			if (this._children[i] instanceof com_pagesociety_ux_component_Container)
				{
					var cc = this._children[i].getById(id);
					if (cc != null)
							return cc;
				}
		}
		return null;
	},

	/*
	  param type String
	  param listener Function
	  param useCapture Boolean
	  param priority int
	  param useWeakReference Boolean
	  returns void
	*/
	addEventListenerToChildren: function(type, listener, useCapture, priority, useWeakReference)
	{
		useCapture = (useCapture ? useCapture : false);
		priority = (priority ? priority : 0);
		useWeakReference = (useWeakReference ? useWeakReference : false);
		for (var i = 0; i < this.getChildren().length; i++)
		{
			var c = com_pagesociety_ux_component_Component(this._children[i]);
			c.addEventListener(type, listener, useCapture, priority, useWeakReference);
			if (c instanceof com_pagesociety_ux_component_Container)
					c.addEventListenerToChildren(type, listener, useCapture, priority, useWeakReference);
		}
	},

	/*
	  override
	  returns void
	*/
	render: function($super)
	{
		if (!this.getVisible())
		{
			$super();
			return ;
		}
//		var t = getTime();
//		var times = new Array();
//		times.push(t);
		if (this.getDecorator() instanceof com_pagesociety_ux_decorator_MaskedDecorator)
		{
			var masked = this.getDecorator()/* as com_pagesociety_ux_decorator_MaskedDecorator*/;
			if (masked.getContentSizeProvider() == null)
				{
					if (this._layout != null)
						{
							masked.setContentHeight(this._layout.calculateHeight());
							masked.setContentWidth(this._layout.calculateWidth());
						}
				}
				else
				{
					var size = masked.getContentSizeProvider()(this);
					masked.setContentHeight(size.height);
					masked.setContentWidth(size.width);
				}
		}
		for (var i = 0; i < this._children.length; i++)
		{
			var c = this._children[i];
			c.render();
//			var tt = getTime() - times[times.length - 1];
//			times.push(getTime());
//			if (tt > 100)
//					Logger.log("That's a really slow component! " + tt);
		}
		if (this._layout != null)
			this._layout.layout();
		$super();
	},

	/*
	  param index uint
	  param x int
	  param type uint
	  returns void
	*/
	setXGuide: function(index, x, type)
	{
		type = (type ? type : com_pagesociety_ux_component_Component.PIXEL);
		if (this._x_guides == null)
			this._x_guides = new Array(16);
		this._x_guides[index] = { 'val' : x, 'type' : type };
	},

	/*
	  param index uint
	  param y int
	  param type uint
	  returns void
	*/
	setYGuide: function(index, y, type)
	{
		type = (type ? type : com_pagesociety_ux_component_Component.PIXEL);
		if (this._y_guides == null)
			this._y_guides = new Array(16);
		this._y_guides[index] = { 'val' : y, 'type' : type };
	},

	/*
	  param c Component
	  returns void
	*/
	ensureVisibility: function(c)
	{
		if (c == null)
			return
	},

	/*
	  returns void
	*/
	calc_size_for_unset_height: function()
	{
		if (this._layout == null)
		{
			this._height_for_unset = this.getHeight();
			return ;
		}
		if (this._layout instanceof com_pagesociety_ux_layout_FlowLayout)
		{
			var flow = this._layout/* as com_pagesociety_ux_layout_FlowLayout*/;
			this._height_for_unset = flow.calculateHeightForUnset();
			return ;
		}
		if (this._layout instanceof com_pagesociety_ux_layout_GridLayout)
		{
			var grid = this._layout/* as com_pagesociety_ux_layout_GridLayout*/;
			this._height_for_unset = grid.getCellHeight() - this._layout.getMargin()./*?Margin*/top - this._layout.getMargin()./*?Margin*/bottom;
			return ;
		}
		if (this._layout instanceof com_pagesociety_ux_layout_TableLayout)
		{
			var tl = this._layout/* as com_pagesociety_ux_layout_TableLayout*/;
			this._height_for_unset = tl.calculateHeightForUnset();
			return ;
		}
	},

	/*
	  returns void
	*/
	calc_size_for_unset_width: function()
	{
		if (this._layout == null)
		{
			this._width_for_unset = this.getWidth();
			return ;
		}
		if (this._layout instanceof com_pagesociety_ux_layout_FlowLayout)
		{
			var flow = this._layout/* as com_pagesociety_ux_layout_FlowLayout*/;
			this._width_for_unset = flow.calculateWidthForUnset();
			return ;
		}
		if (this._layout instanceof com_pagesociety_ux_layout_GridLayout)
		{
			var grid = this._layout/* as com_pagesociety_ux_layout_GridLayout*/;
			this._width_for_unset = grid.getCellWidth() - this._layout.getMargin()./*?Margin*/left - this._layout.getMargin()./*?Margin*/right;
			return ;
		}
		if (this._layout instanceof com_pagesociety_ux_layout_TableLayout)
		{
			var tl = this._layout/* as com_pagesociety_ux_layout_TableLayout*/;
			this._width_for_unset = tl.calculateWidthForUnset();
			return ;
		}
	},

	/*
	  returns Container
	*/
	top: function()
	{
		if (this._stack == null)
		{
			this._stack = new Array();
			this._stack.push(THIS);
		}
		return this._stack[this._stack.length - 1];
	},

	/*
	  param style_props Object
	  returns Container
	*/
	begin_column: function(style_props)
	{
		style_props = (style_props ? style_props : null);
		var c = new com_pagesociety_ux_component_Container(this.top());
		c.setLayout(new com_pagesociety_ux_layout_FlowLayout(com_pagesociety_ux_layout_FlowLayout.TOP_TO_BOTTOM));
		if (style_props != null)
			this.getApplication().getStyle()./*?Style*/apply(c, style_props);
		this._stack.push(c);
		return c;
	},

	/*
	  param parent Container
	  param style_props Object
	  returns Container
	*/
	BC: function(parent, style_props)
	{
		parent = (parent ? parent : null);
		style_props = (style_props ? style_props : null);
		var c = new com_pagesociety_ux_component_Container(parent == null ? this.top() : parent);
		c.setLayout(null);
		if (style_props != null)
			this.getApplication().getStyle()./*?Style*/apply(c, style_props);
		this._stack.push(c);
		return c;
	},

	/*
	  returns void
	*/
	end_column: function()
	{
		this._stack.pop();
	},

	/*
	  returns void
	*/
	EC: function()
	{
		this._stack.pop();
	},

	/*
	  param style_props Object
	  returns Container
	*/
	begin_row: function(style_props)
	{
		style_props = (style_props ? style_props : null);
		var c = new com_pagesociety_ux_component_Container(this.top());
		c.setLayout(new com_pagesociety_ux_layout_FlowLayout(com_pagesociety_ux_layout_FlowLayout.LEFT_TO_RIGHT));
		if (style_props != null)
			this.getApplication().getStyle()./*?Style*/apply(c, style_props);
		this._stack.push(c);
		return c;
	},

	/*
	  returns void
	*/
	end_row: function()
	{
		this._stack.pop();
	},

	/*
	  param text String
	  param style String
	  param multiline Boolean
	  returns Label
	*/
	add_label: function(text, style, multiline)
	{
		style = (style ? style : null);
		multiline = (multiline ? multiline : false);
		if (text.indexOf("<") != -1)
			text = "<span class='" + style +"'>" + text + "</span>";
		var l = new com_pagesociety_ux_component_text_Label(this.top());
		l.setText(text);
		l.setMultiline(multiline);
		if (style != null)
			l.setFontStyle(style);
		return l;
	},

	/*
	  param text String
	  param style String
	  param on_click Function
	  returns Link
	*/
	add_link: function(text, style, on_click)
	{
		style = (style ? style : null);
		on_click = (on_click ? on_click : null);
		var l = new com_pagesociety_ux_component_text_Link(this.top());
		l.setText(text);
		if (style != null)
			l.setStyleName(style);
		if (on_click != null)
			l.addEventListener(com_pagesociety_ux_event_ComponentEvent.CLICK, on_click);
		return l;
	},

	/*
	  param c Component
	  param offset Number
	  returns void
	*/
	center_horz: function(c, offset)
	{
		offset = (offset ? offset : 0);
		if (c == null)
			return
		if (c instanceof com_pagesociety_ux_component_Container)
		{
			var cc = c/* as com_pagesociety_ux_component_Container*/;
			if (cc.getLayout() != null)
				{
					c.setX((this.getWidth() - cc.getLayout().calculateWidth()) / 2 + offset);
					return ;
				}
		}
		c.setX((this.getWidth() - c.getWidth()) / 2 + offset);
	},

	/*
	  param c Component
	  param offset Number
	  returns void
	*/
	center_vert: function(c, offset)
	{
		offset = (offset ? offset : 0);
		if (c == null)
			return
		if (c instanceof com_pagesociety_ux_component_Container)
		{
			var cc = c/* as com_pagesociety_ux_component_Container*/;
			if (cc.getLayout() != null)
				{
					c.setY((this.getHeight() - cc.getLayout().calculateHeight()) / 2 + offset);
					return ;
				}
		}
		c.setY((this.getHeight() - c.getHeight()) / 2 + offset);
	},

	/*
	  param c Component
	  param xoff Number
	  param yoff Number
	  returns void
	*/
	center: function(c, xoff, yoff)
	{
		xoff = (xoff ? xoff : 0);
		yoff = (yoff ? yoff : 0);
		this.center_horz(c, xoff);
		this.center_vert(c, yoff);
	},

	/*
	  returns Array
	*/
	getXGuides: function()
	{
		var g = this._x_guides;
		var p = this.getParent();
		while (g == null && p != null)
		{
			g = p.getXGuides();
			p = p.getParent();
		}
		return g;
	},

	/*
	  returns Array
	*/
	getYGuides: function()
	{
		var g = this._y_guides;
		var p = this.getParent();
		while (g == null && p != null)
		{
			g = p.getYGuides();
			p = p.getParent();
		}
		return g;
	},

	/*
	  returns Layout
	*/
	getLayout: function()
	{
		return this._layout;
	},

	/*
	  returns Array
	*/
	getChildren: function()
	{
		return this._children;
	},

	/*
	  returns Component
	*/
	getLastChild: function()
	{
		if (this._children.length == 0)
			return null;
		return this._children[this._children.length - 1];
	},

	/*
	  returns Component
	*/
	getFirstChild: function()
	{
		if (this._children.length == 0)
			return null;
		return this._children[0];
	},

	/*
	  override
	  returns Number
	*/
	getWidth: function($super)
	{
		return $super();
	},

	/*
	  override
	  returns Number
	*/
	getHeight: function($super)
	{
		return $super();
	},

	/*
	  returns Number
	*/
	getWidthForUnsetChild: function()
	{
		this.calc_size_for_unset_width();
		return this._width_for_unset;
	},

	/*
	  returns Number
	*/
	getHeightForUnsetChild: function()
	{
		this.calc_size_for_unset_height();
		return this._height_for_unset;
	},

	/*
	  param l Layout
	  returns void
	*/
	setLayout: function(l)
	{
		this._layout = l;
		if (this._layout != null)
			this._layout.setContainer(this);
	}

});

/*
  Application
  import com_pagesociety_persistence_Entity
  import com_pagesociety_util_BootstrapImpl
  import com_pagesociety_util_ObjectUtil
  import com_pagesociety_ux_component_Component
  import com_pagesociety_ux_component_Container
  import com_pagesociety_ux_component_ToolTip
  import com_pagesociety_ux_component_container_ApplicationContainer
  import com_pagesociety_ux_component_container_NavigableApplicationContainer
  import com_pagesociety_ux_component_text_Input
  import com_pagesociety_ux_decorator_RootDecorator
  import com_pagesociety_ux_event_ComponentEvent
  import com_pagesociety_ux_style_Style
  import com_pixelbreaker_ui_osx_MacMouseWheel

*/

var com_pagesociety_ux_Application = Class.create( com_pagesociety_ux_component_Container,
{
	initialize: function($super, target)
	{

		//this._focus/*FocusManager*/;
		this._style/*Style*/;
		this._user/*Entity*/;
		this._config/*Object*/;
		this._use_custom_cursor/*Boolean*/;
		this._scroll_x_offset/*Number*/;
		this._scroll_y_offset/*Number*/;
		this._tooltip/*IToolTip*/;
		this._fs/*Boolean*/;
		this._so/*SharedObject*/;
		this._decorator = new com_pagesociety_ux_decorator_Decorator();

		this.cookiejar = new CookieJar({expires:'',path:'/'});

		$super(this);
		this._parent = null;
//		if (bootstrap == null)
//			bootstrap = BOOOOT./*?BootstrapImpl*/instance
//		this._bootstrap = bootstrap;
		$(target).insert(this._decorator.element);
		Event.observe(window, 'resize', this.do_resize.bind(this));
	},

	getApplication: function()
	{
		return this;
	},
	/*
	  param url String
	  param on_complete Function
	  returns void
	*/
	loadText: function(url, on_complete)
	{
		throw new Error("Application.loadText = null");
	},

	/*
	  param url String
	  param on_complete Function
	  returns void
	*/
	loadStyle: function(url, on_complete)
	{
		throw new Error("Application.loadStyle = null");
	},

	/*
	  param s String
	  returns void
	*/
	setStyle: function(s)
	{
		throw new Error("Application.setStyle = null");
	},

	/*
	  param url String
	  param on_complete Function
	  returns void
	*/
	loadJson: function(url, on_complete)
	{
		throw new Error("Application.loadJson = null");
	},

	/*
	  param urls Array
	  param on_complete Function
	  param on_each Function
	  returns void
	*/
	loadFonts: function(urls, on_complete, on_each)
	{
		throw new Error("Application.loadFonts = null");

	},

	/*
	  param params Object
	  returns void
	*/
	init: function(params)
	{
		params = (params ? params : null);
//		try
//		{
//			com_pixelbreaker_ui_osx_MacMouseWheel.setup(stage);
//		}
//		catch (e)
//		{
//		}
//		com_pagesociety_util_ObjectUtil.registerDefaultEntities();
//		this.initRootContainer();
	},

	/*
	  param e *
	  returns void
	*/
	error: function(e)
	{
		Logger.error(e);
	},

	/*
	  returns void
	*/
	initRootContainer: function()
	{
//		if (this._container != null)
//			throw new Error("Application.initRootContainer ERROR cannot be called twice");
//
//		this._container = new com_pagesociety_ux_component_container_ApplicationContainer(THIS);
//		this._decorator = this._container.getDecorator()/* as com_pagesociety_ux_decorator_RootDecorator*/;
//		if (stage != null)
//		{
//			this._focus = new com_pagesociety_ux_FocusManager(stage, this._container);
//		}
//		if (this._bootstrap != null)
//			this._bootstrap.loadComplete()
	},

	/*
	  param address String
	  param args *
	  returns void
	*/
	navigate: function(address, args)
	{
		args = (args ? args : null);
		var n;
		for (var i = 0; i < this._container.getChildren().length; i++)
		{
			if (this._container.getChildren()[i] instanceof com_pagesociety_ux_component_container_NavigableApplicationContainer)
				{
					n = this._container.getChildren()[i];
					break;
				}
		}
		if (n == null)
		{
			Logger.log("Root component must be NavigableApplicationContainer to use application.navigate");
			return ;
		}
		n.navigate(address, args);
	},


	/*
	  param e Event
	  returns void
	*/
	do_resize: function(e)
	{
		this.render();
	},

	render: function($super)
	{
		$super();
		this._decorator.element.setStyle({position:"relative"});
	},

	/*
	  param c Component
	  param callback Function
	  param takeOverColor uint
	  param takeOverAlpha Number
	  param center Boolean
	  returns void
	*/
	pushTakeOver: function(c, callback, takeOverColor, takeOverAlpha, center)
	{
		callback = (callback ? callback : null);
		takeOverColor = (takeOverColor ? takeOverColor : 0xffffff);
		takeOverAlpha = (takeOverAlpha ? takeOverAlpha : .3);
		center = (center ? center : true);
		var T = this;
		if (callback == null)
			callback = function (e)
			{
				T.popTakeOver();
			};
		this._decorator.pushTakeOver(c, callback, takeOverColor, takeOverAlpha, center);
		c.render();
	},

	/*
	  returns void
	*/
	destroyTakeOver: function()
	{
		this.hideTakeOver(true);
	},

	/*
	  param destroy Boolean
	  returns void
	*/
	hideTakeOver: function(destroy)
	{
		destroy = (destroy ? destroy : false);
		if (destroy)
		{
			var c = this._decorator.popTakeOver();
			c.getParent().removeComponent(c);
		}
		else
			this._decorator.popTakeOver();
	},

	/*
	  returns void
	*/
	popTakeOver: function()
	{
		this._decorator.popTakeOver();
	},

	/*
	  param c Component
	  returns Boolean
	*/
	isTakeover: function(c)
	{
		return this._decorator.isTakeover(c);
	},

	/*
	  param s String
	  param c Component
	  returns void
	*/
	showToolTip: function(s, c)
	{
		if (this._tooltip == null)
		{
			var T = this;
			this._tooltip = this.get_tooltip();
			this._tooltip.addEventListener(com_pagesociety_ux_event_ComponentEvent.MOUSE_OVER,
				function (e)
				{
					T._tooltip.setVisible(true);
					T._tooltip.render();
				});
			this._tooltip.addEventListener(com_pagesociety_ux_event_ComponentEvent.MOUSE_OUT,
				function (e)
				{
					T._tooltip.setVisible(false);
					T._tooltip.render();
				});
		}
		this._tooltip.setText(s);
		var p = c.getRootPosition()./*?Point*/add(c.getToolTipOffset());//TODO
		this._tooltip.setX(p./*?Point*/x);
		this._tooltip.setY(p./*?Point*/y);
		this._tooltip.setVisible(true);
		this._tooltip.render();
	},

	/*
	  param e MouseEvent
	  returns void
	*/
	hideToolTip: function(e)
	{
		e = (e ? e : null);
		this._tooltip.setVisible(false);
		this._tooltip.render();
	},

	/*
	  returns IToolTip
	*/
	get_tooltip: function()
	{
		return new com_pagesociety_ux_component_ToolTip(this.getContainer());
	},

	/*
	  param c Component
	  returns Point
	*/
	getLocation: function(c)
	{
		return c.getRootPosition();
	},

	/*
	  param event MouseEvent
	  returns void
	*/
	mouseMoveHandler: function(event)
	{
//		this._decorator.getCursor()./*?Sprite*/x = event./*?MouseEvent*/stageX;
//		this._decorator.getCursor()./*?Sprite*/y = event./*?MouseEvent*/stageY;
//		event./*?MouseEvent*/updateAfterEvent();
	},

	/*
	  param event Event
	  returns void
	*/
	mouseLeaveHandler: function(event)
	{
	},

	/*
	  param x Number
	  param y Number
	  param w Number
	  param h Number
	  returns void
	*/
	goFullScreen: function(x, y, w, h)
	{
//		this._fs = true;
//		stage./*?stage*/fullScreenSourceRect = new flash.geom.Rectangle(x, y, w, h);
//		stage./*?stage*/displayState = flash.display.StageDisplayState./*?StageDisplayState*/FULL_SCREEN;
	},

	/*
	  param e FullScreenEvent
	  returns void
	*/
	on_fs: function(e)
	{
//		this._fs = e./*?FullScreenEvent*/fullScreen;
	},

	/*
	  param application_name String
	  returns void
	*/
	initSharedObject: function(application_name)
	{
//		this._so = flash.net.SharedObject./*?SharedObject*/getLocal(application_name);
		// TODO cookie
		throw new Error("initSharedObject");
	},

	/*
	  param name String
	  returns *
	*/
	getSharedObject: function(name)
	{
		return this.cookiejar.get(name);
	},

	/*
	  param name String
	  returns Boolean
	*/
	hasSharedObject: function(name)
	{
		this.cookiejar.get(name)!=null;
	},

	/*
	  param name String
	  returns String
	*/
	getSharedString: function(name)
	{
		return this.cookiejar.get(name);
	},
	/*
	  param name String
	  returns void
	*/
	removeSharedObject: function(name)
	{
		this.cookiejar.remove(name);
	},

	/*
	  param name String
	  param value *
	  param flush Boolean
	  returns void
	*/
	setSharedObject: function(name, value, flush)
	{
		this.cookiejar.put(name,value);
	},

	/*
	  param event NetStatusEvent
	  returns void
	*/
	on_flush_status: function(event)
	{
		throw new Error("on_flush_status");
	},

	/*
	  param msg String
	  returns void
	*/
	alert: function(msg)
	{
		alert(msg);
	},

	/*
	  returns BootstrapImpl
	*/
	getBootstrap: function()
	{
		//return this._bootstrap;
	},

	/*
	  override
	  returns String
	*/
	getName: function($super)
	{
		//return flash.utils.getQualifiedClassName(THIS);
	},

	/*
	  returns Entity
	*/
	getUser: function()
	{
		return this._user;
	},

	/*
	  returns Object
	*/
	getConfig: function()
	{
		return this._config;
	},

	/*
	  returns Style
	*/
	getStyle: function()
	{
		return this._style;
	},

	/*
	  returns RootDecorator
	*/
	getDecorator: function()
	{
		return this._decorator;
	},

	/*
	  returns FocusManager
	*/
	getFocusManager: function()
	{
		return this._focus;
	},

	/*
	  returns Container
	*/
	getContainer: function()
	{
		return this._container;
	},

	/*
	  returns Boolean
	*/
	getIsHidingTakeover: function()
	{
		return this._decorator.getPopping();
	},

	/*
	  override
	  returns Number
	*/
	getHeight: function($super)
	{
		if (this.getIsHeightUnset())
			return document.viewport.getDimensions().height;
		else
			return $super();
	},

	/*
	  override
	  returns Number
	*/
	getWidth: function($super)
	{
		if (this.getIsWidthUnset())
			return document.viewport.getDimensions().width;
		else
			return $super();
	},

	/*
	  returns Object
	*/
	getScrollOffset: function()
	{
		return this._decorator.scrollOffset;
	},

	/*
	  returns Object
	*/
	getWindowSize: function()
	{
		return this._decorator.windowSize;
	},

	/*
	  returns Boolean
	*/
	getUseCustomCursor: function()
	{
		return this._use_custom_cursor;
	},

	/*
	  returns Sprite
	*/
	getCursor: function()
	{
		return this._decorator.getCursor();
	},

	/*
	  param e Entity
	  returns void
	*/
	setUser: function(e)
	{
		this._user = e;
	},

	/*
	  param c Object
	  returns void
	*/
	setConfig: function(c)
	{
		this._config = c;
	},

	/*
	  param s Style
	  returns void
	*/
	setStyle: function(s)
	{
		this._style = s;
	},

	/*
	  param o Object
	  returns void
	*/
	setScrollOffset: function(o)
	{
		this._decorator.scrollOffset = o;
	},

	/*
	  param o Object
	  returns void
	*/
	setWindowSize: function(o)
	{
		this._decorator.windowSize = o;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setUseCustomCursor: function(b)
	{

	}

});

/*
  PageContainer
  import com_pagesociety_ux_MovingValue
  import com_pagesociety_ux_component_Component
  import com_pagesociety_ux_component_Container
  import com_pagesociety_ux_component_Image
  import com_pagesociety_ux_decorator_ImageDecorator
  import com_pagesociety_ux_decorator_MaskedDecorator
  import com_pagesociety_ux_event_ResourceEvent
  import com_pagesociety_ux_layout_Layout
*/

var com_pagesociety_ux_component_container_PageContainer = Class.create( com_pagesociety_ux_component_Container,
{
	initialize: function($super, parent)
	{
		this._visible_page/*int*/;
		this._last_visible/*int*/;
		this._type = com_pagesociety_ux_component_container_PageContainer.TYPE_SIMPLE/*uint*/;
		this._alphaoff = new com_pagesociety_ux_MovingValue(0)/*MovingValue*/;
		this._xoff = new com_pagesociety_ux_MovingValue(0)/*MovingValue*/;
		this._xoffset = 0/*Number*/;
		this._yoff = new com_pagesociety_ux_MovingValue(0)/*MovingValue*/;
		this._speed = 700/*uint*/;
		this._looping = true/*Boolean*/;
		this._after_render_callback/*Function*/;
		this._gap = 5/*Number*/;
		this._last_width = 0/*Number*/;
		$super(parent);
		//this.setDecorator(new com_pagesociety_ux_decorator_MaskedDecorator());
		this._visible_page = -1;
		this._last_visible = -1;

	},
	/*
	  override
	  returns void
	*/
	clear: function($super)
	{
		$super();
		this._visible_page = -1;
		this._last_visible = -1;
		this._xoff.reset(0);
	},

	/*
	  override
	  returns void
	*/
	render: function($super)
	{
		switch (this._type)
		{
			case com_pagesociety_ux_component_container_PageContainer.TYPE_SIMPLE:
				this.render_simple();
				break;
			case com_pagesociety_ux_component_container_PageContainer.TYPE_SIMPLE_FADE:
				this.render_simple_fade();
				break;
			case com_pagesociety_ux_component_container_PageContainer.TYPE_HORIZONTAL:
				this.render_horizontal();
				break;
			case com_pagesociety_ux_component_container_PageContainer.TYPE_HORIZONTAL_A:
				this.render_horizontal_a();
				break;
			case com_pagesociety_ux_component_container_PageContainer.TYPE_VERTICAL:
				this.render_vertical();
				break;
		};
		$super();
		if (this._after_render_callback != null)
			this._after_render_callback();
	},

	/*
	  returns void
	*/
	render_simple: function()
	{
		for (var i = 0; i < this.getChildren().length; i++)
		{
			var c = this.getChildren()[i];
			c.setX(0);
			if (i != this._visible_page)
				{
					c.setVisible(false);
				}
				else
				{
					c.setVisible(true);
					c.setAlpha(1);
				}
		}
	},

	/*
	  returns void
	*/
	render_simple_fade: function()
	{
		for (var i = 0; i < this.getChildren().length; i++)
		{
			var c = this.getChildren()[i];
			c.setX(0 + this.getXoffset());
			if (i == this._visible_page)
				{
					c.setAlpha(this._alphaoff.getValue());
					c.setVisible(true);
				}
				else
					if (i == this._last_visible)
					{
						c.setAlpha(1 - this._alphaoff.getValue());
						c.setVisible(true);
					}
					else
					{
						c.setAlpha(0);
						c.setVisible(false);
					}
		}
	},

	/*
	  returns void
	*/
	render_horizontal: function()
	{
		if (this.getWidth() != this._last_width)
		{
			this.crender();
			this._xoff.reset(this.get_xoff());
			this._last_width = this.getWidth();
		}
		var cx = 0;
		for (var i = 0; i < this.getChildren().length; i++)
		{
			var c = this.getChildren()[i];
			var w = this.get_width(c);
			c.setVisible(true);
			c.setAlpha(1);
			c.setX(cx + this._xoff.getValue() + this._xoffset);
//			if (c.getX() + w < 0 || c.getX() > this.getWidth())
//					c.setVisible(false);
			cx += w + this._gap;
		}
	},

	/*
	  returns void
	*/
	render_horizontal_a: function()
	{
		if (this.getWidth() != this._last_width)
		{
			//this.render();
			this._xoff.reset(-this.get_xoff());
			this._last_width = this.getWidth();
		}
		var cx = 0;
		for (var i = 0; i < this.getChildren().length; i++)
		{
			var c = this.getChildren()[i];
			var w = this.get_width(c);
			c.setVisible(true);
			c.setAlpha(1);
			c.setX(cx + this._xoff.getValue() + this._xoffset);
			if (c.getX() + w < 0 || c.getX() > this.getWidth())
					c.setVisible(false);
			cx -= w + this._gap;
		}
	},

	/*
	  returns Number
	*/
	get_horizontal_width: function()
	{
		var cx = 0;
		for (var i = 0; i < this.getChildren().length; i++)
			cx += this.get_width(this.getChildren()[i]) + this._gap;
		return cx;
	},

	/*
	  param c Component
	  returns Number
	*/
	get_width: function(c)
	{
		if (c._image_scaling_type == com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_FIT_HEIGHT)
		{
			var i = c/* as com_pagesociety_ux_component_Image*/;
			i.render();
			var w = i.getImageWidth();
			if (w == 0)
					w = c.getWidth();
			return w + this._gap;
		}
		else
			return c.getWidth() + this._gap;
	},

	/*
	  param c Component
	  returns Number
	*/
	get_height: function(c)
	{
		if (c instanceof com_pagesociety_ux_component_Image)
		{
			var i = c/* as com_pagesociety_ux_component_Image*/;
			i.render();
			var h = i.getImageHeight();
			if (h == 0)
					h = c.getHeight();
			return h + this._gap;
		}
		else
			return c.getHeight() + this._gap;
	},

	/*
	  returns void
	*/
	render_vertical: function()
	{
		var yoff = 0;
		for (var i = 0; i < this.getChildren().length; i++)
		{
			var c = this.getChildren()[i];
			c.setVisible(true);
			c.setAlpha(1);
			c.setY(yoff + this._yoff.getValue());
			if (c.getY() + c.getHeight() < 0 || c.getY() > this.getHeight())
					c.setVisible(false);
			yoff += c.getHeight() + this._gap;
			c.setX(this.setXoffset);
		}
	},

	/*
	  returns Number
	*/
	get_vertical_width: function()
	{
		var cy = 0;
		for (var i = 0; i < this.getChildren().length; i++)
			cy += this.getChildren()[i].getHeight() + this._gap;
		return cy;
	},

	/*
	  param i uint
	  param on_complete Function
	  returns void
	*/
	showPage: function(i, on_complete)
	{
		on_complete = (on_complete ? on_complete : null);
		if (i == this._visible_page)
			return
		this._last_visible = this._visible_page;
		this._visible_page = i;
		switch (this._type)
		{
			case com_pagesociety_ux_component_container_PageContainer.TYPE_SIMPLE:
				if (on_complete != null)
						on_complete();
				break;
			case com_pagesociety_ux_component_container_PageContainer.TYPE_SIMPLE_FADE:
				this._alphaoff.reset(0);
				this._alphaoff.setValue(1);
				this.animate([ this._alphaoff ], this._speed, on_complete);
				break;
			case com_pagesociety_ux_component_container_PageContainer.TYPE_HORIZONTAL:
				if (IS_WEBKIT)
				{
					set_up_transition(this._decorator.mid, this.get_xoff(), 0);
				}
				else
				{
					this._xoff.setValue(this.get_xoff());
					this.animate([ this._xoff ], this._speed, on_complete);
				}
				break;
			case com_pagesociety_ux_component_container_PageContainer.TYPE_HORIZONTAL_A:
				this._xoff.setValue(-this.get_xoff());
				this.animate([ this._xoff ], this._speed, on_complete);
				break;
			case com_pagesociety_ux_component_container_PageContainer.TYPE_VERTICAL:
				this._yoff.setValue(this.get_yoff());
				this.animate([ this._yoff ], this._speed, on_complete);
				break;
		};
	},

	/*
	  returns Number
	*/
	get_xoff: function()
	{
		var xoff = 0;
		for (var j = 0; j < this.getChildren().length && j < this._visible_page; j++)
			xoff -= this.get_width(this.getChildren()[j]) + this._gap;
		return xoff;
	},

	/*
	  returns Number
	*/
	get_yoff: function()
	{
		var yoff = 0;
		for (var j = 0; j < this.getChildren().length && j < this._visible_page; j++)
			yoff -= this.get_height(this.getChildren()[j]) + this._gap;
		return yoff;
	},

	/*
	  returns void
	*/
	next: function()
	{
		var v = this._visible_page + 1;
		if (v >= this.getChildren().length)
			if (this._looping)
				v = 0
			else
				v = this.getChildren().length - 1;
		this.showPage(v);
	},

	/*
	  returns void
	*/
	prev: function()
	{
		var v = this._visible_page - 1;
		if (v < 0)
			if (this._looping)
				v = this.getChildren().length - 1;
			else
				v = 0
		this.showPage(v);
	},

	/*
	  returns Function
	*/
	getAfterRender: function()
	{
		return this._after_render_callback;
	},

	/*
	  returns Number
	*/
	getGap: function()
	{
		return this._gap;
	},

	/*
	  returns Number
	*/
	getXoffset: function()
	{
		return this._xoffset;
	},

	/*
	  returns Number
	*/
	getLayoutWidth: function()
	{
		switch (this._type)
		{
			case com_pagesociety_ux_component_container_PageContainer.TYPE_SIMPLE:
			case com_pagesociety_ux_component_container_PageContainer.TYPE_SIMPLE_FADE:
				return $super();
			case com_pagesociety_ux_component_container_PageContainer.TYPE_HORIZONTAL:
			case com_pagesociety_ux_component_container_PageContainer.TYPE_HORIZONTAL_A:
				return this.get_horizontal_width();
				break;
			case com_pagesociety_ux_component_container_PageContainer.TYPE_VERTICAL:
				return this.get_vertical_width();
		};
		return $super();
	},

	/*
	  returns uint
	*/
	getSpeed: function()
	{
		return this._speed;
	},

	/*
	  returns Boolean
	*/
	getLooping: function()
	{
		return this._looping;
	},

	/*
	  returns int
	*/
	getPage: function()
	{
		return this._visible_page;
	},

	/*
	  param t uint
	  returns void
	*/
	setType: function(t)
	{
		this._type = t;
	},

	/*
	  param f Function
	  returns void
	*/
	setAfterRender: function(f)
	{
		this._after_render_callback = f;
	},

	/*
	  override
	  param l Layout
	  returns void
	*/
	setLayout: function($super, l)
	{
		throw new Error("PageContainer does not support layouts");
	},

	/*
	  param n Number
	  returns void
	*/
	setGap: function(n)
	{
		this._gap = n;
	},

	/*
	  param n Number
	  returns void
	*/
	setXoffset: function(n)
	{
		this._xoffset = n;
	},

	/*
	  param s uint
	  returns void
	*/
	setSpeed: function(s)
	{
		this._speed = s;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setLooping: function(b)
	{
		this._looping = b;
	},

	/*
	  param p int
	  returns void
	*/
	setPage: function(p)
	{
		if (p < 0)
			p = 0
		if (p >= this.getChildren().length)
			p = this.getChildren().length - 1
		this.showPage(p);
	}

});

com_pagesociety_ux_component_container_PageContainer.TYPE_SIMPLE = 0;
com_pagesociety_ux_component_container_PageContainer.TYPE_SIMPLE_FADE = 1;
com_pagesociety_ux_component_container_PageContainer.TYPE_HORIZONTAL = 2;
com_pagesociety_ux_component_container_PageContainer.TYPE_HORIZONTAL_A = 3;
com_pagesociety_ux_component_container_PageContainer.TYPE_VERTICAL = 4;
/*
  Align
*/

var com_pagesociety_ux_component_dim_Align = Class.create(
{
	initialize: function()
	{

	}
});

com_pagesociety_ux_component_dim_Align.CENTER = -0.5;
com_pagesociety_ux_component_dim_Align.LEFT = -1.0;
com_pagesociety_ux_component_dim_Align.RIGHT = 0;
com_pagesociety_ux_component_dim_Align.TOP = -1.0;
com_pagesociety_ux_component_dim_Align.BOTTOM = 0;
/*
  ComponentDimension
  import com_pagesociety_ux_component_Component
*/

var com_pagesociety_ux_component_dim_ComponentDimension = Class.create(
{
	initialize: function(c, prop)
	{
		this._component/*Component*/;
		this._prop/*String*/;
		this._pf/*Number*/;
		this._o/*Number*/;
		this._type/*uint*/;
		this._component = c;
		this._prop = prop;
		this.unset();

	},
	/*
	  returns void
	*/
	unset: function()
	{
		this._o = 0;
		this._pf = 0;
		this._type = com_pagesociety_ux_component_dim_ComponentDimension.UNSET;
	},

	/*
	  param offset Number
	  returns void
	*/
	setAbsolute: function(offset)
	{
		this._type = com_pagesociety_ux_component_dim_ComponentDimension.ABSOLUTE;
		this._o = offset;
	},

	/*
	  param p Number
	  param d Number
	  returns void
	*/
	setPercent: function(p, d)
	{
		d = (d ? d : 0);
		this._type = com_pagesociety_ux_component_dim_ComponentDimension.PERCENT;
		this._o = d;
		this._pf = p;
	},

	/*
	  param d Number
	  returns void
	*/
	setDelta: function(d)
	{
		this._type = com_pagesociety_ux_component_dim_ComponentDimension.DELTA;
		this._o = d;
	},

	/*
	  returns Number
	*/
	getValue: function()
	{
		var p = this._component.getParent();
		var c = this._component;
		switch (this._type)
		{
			case com_pagesociety_ux_component_dim_ComponentDimension.UNSET:
				if (p == null)
						return this._component.getApplication()[this.get_prop()]();
					else
						return p[this.get_prop() + "ForUnsetChild"]();
			case com_pagesociety_ux_component_dim_ComponentDimension.PERCENT:
				if (p == null)
						return Math.floor(this._pf * this._component.getApplication()[this.get_prop()]() + this._o);
					else
						return Math.floor(this._pf * p[this.get_prop()]() + this._o);
			case com_pagesociety_ux_component_dim_ComponentDimension.DELTA:
				if (p == null)
						return Math.floor(this._o + this._component.getApplication()[this.get_prop()]());
					else
						return Math.floor(this._o + p[this.get_prop()]());
			case com_pagesociety_ux_component_dim_ComponentDimension.ABSOLUTE:
				return this._o;
			default:
				throw new Error("NO SUCH TYPE!");
		};
	},

	get_prop: function()
	{
		return "get"+this._prop.substring(0,1).toUpperCase()+this._prop.substring(1);
	},

	/*
	  returns Boolean
	*/
	getIsUnset: function()
	{
		return this._type == com_pagesociety_ux_component_dim_ComponentDimension.UNSET;
	}

});

com_pagesociety_ux_component_dim_ComponentDimension.WIDTH = "width";
com_pagesociety_ux_component_dim_ComponentDimension.HEIGHT = "height";
com_pagesociety_ux_component_dim_ComponentDimension.UNSET = 0x01;
com_pagesociety_ux_component_dim_ComponentDimension.PERCENT = 0x02;
com_pagesociety_ux_component_dim_ComponentDimension.DELTA = 0x03;
com_pagesociety_ux_component_dim_ComponentDimension.ABSOLUTE = 0x04;
/*
  ComponentPoint
  import com_pagesociety_ux_component_Component
*/

var com_pagesociety_ux_component_dim_ComponentPoint = Class.create(
{
	initialize: function(c, prop)
	{
		this._component/*Component*/;
		this._prop/*String*/;
		this._nr1/*Number*/;
		this._nr2/*Number*/;
		this._nr3/*Number*/;
		this._cr1/*Component*/;
		this._cr2/*Component*/;
		this._or1/*Object*/;
		this._or2/*Object*/;
		this._type/*uint*/;
		this._component = c;
		this._prop = prop;
		this.unset();

	},
	/*
	  returns Boolean
	*/
	isUnset: function()
	{
		return this._type == com_pagesociety_ux_component_dim_ComponentPoint.UNSET;
	},

	/*
	  returns void
	*/
	unset: function()
	{
		this._nr1 = 0;
		this._nr2 = 0;
		this._nr3 = 0;
		this._cr1 = null;
		this._cr2 = null;
		this._type = com_pagesociety_ux_component_dim_ComponentPoint.UNSET;
	},

	/*
	  param guide int
	  param offset Number
	  param dp Number
	  param guides Array
	  returns void
	*/
	setAlign: function(guide, offset, dp, guides)
	{
		offset = (offset ? offset : 0);
		dp = (dp ? dp : Number./*?Number*/MAX_VALUE);
		guides = (guides ? guides : null);
		switch (guide)
		{
			case com_pagesociety_ux_component_dim_Guide.TOP:
			case com_pagesociety_ux_component_dim_Guide.LEFT:
				this.setRelativeToParent(0, offset, dp != Number.MAX_VALUE ? dp : com_pagesociety_ux_component_dim_Align.RIGHT);
				break;
			case com_pagesociety_ux_component_dim_Guide.CENTER:
				this.setRelativeToParent(.5, offset, dp != Number.MAX_VALUE ? dp : com_pagesociety_ux_component_dim_Align.CENTER);
				break;
			case com_pagesociety_ux_component_dim_Guide.BOTTOM:
			case com_pagesociety_ux_component_dim_Guide.RIGHT:
				this.setRelativeToParent(1, offset, dp != Number.MAX_VALUE ? dp : com_pagesociety_ux_component_dim_Align.LEFT);
				break;
			default:
				//com.pagesociety.ux.component.dim./* if it isnt an implicit guide it is a user guide */;
				this.setGuide(guides, guide, offset, dp != Number.MAX_VALUE ? dp : com_pagesociety_ux_component_dim_Align.LEFT);
				break;
		};
	},

	/*
	  param percent Number
	  param offset Number
	  param dim_percent_offset Number
	  returns void
	*/
	setRelativeToParent: function(percent, offset, dim_percent_offset)
	{
		offset = (offset ? offset : 0);
		dim_percent_offset = (dim_percent_offset ? dim_percent_offset : 0);
		this._type = com_pagesociety_ux_component_dim_ComponentPoint.RELATIVE_TO_PARENT;
		this._nr1 = percent;
		this._nr2 = offset;
		this._nr3 = dim_percent_offset;
		this._cr2 = null;
		this._cr1 = null;
	},

	/*
	  param sibling Component
	  param alignment uint
	  param offset Number
	  param dp Number
	  returns void
	*/
	setRelativeToSibling: function(sibling, alignment, offset, dp)
	{
		offset = (offset ? offset : 0);
		dp = (dp ? dp : Number.MAX_VALUE);
		switch (alignment)
		{
			case com_pagesociety_ux_component_dim_Align.TOP:
			case com_pagesociety_ux_component_dim_Align.LEFT:
				this.setRelativeToSiblingA(sibling, offset, dp != Number.MAX_VALUE ? dp : -1, this._component);
				break;
			case com_pagesociety_ux_component_dim_Align.CENTER:
				this.setRelativeToSiblingA(sibling, offset, dp != Number.MAX_VALUE ? dp : 0, sibling);
				break;
			case com_pagesociety_ux_component_dim_Align.BOTTOM:
			case com_pagesociety_ux_component_dim_Align.RIGHT:
				this.setRelativeToSiblingA(sibling, offset, dp != Number.MAX_VALUE ? dp : +1, sibling);
				break;
		};
	},

	/*
	  param sibling Component
	  param offset Number
	  param dim_percent_offset Number
	  param dim_offset_target Component
	  returns void
	*/
	setRelativeToSiblingA: function(sibling, offset, dim_percent_offset, dim_offset_target)
	{
		this._type = com_pagesociety_ux_component_dim_ComponentPoint.RELATIVE_TO_SIBLING;
		this._cr2 = sibling;
		this._nr2 = offset;
		this._nr3 = dim_percent_offset;
		this._cr1 = dim_offset_target;
		this._nr1 = 0;
	},

	/*
	  param val Number
	  param offset Number
	  param dim_percent_offset Number
	  returns void
	*/
	setAbsolute: function(val, offset, dim_percent_offset)
	{
		if (val==null)
			throw new Error("?");
		offset = (offset ? offset : 0);
		dim_percent_offset = (dim_percent_offset ? dim_percent_offset : 0);
		this._type = com_pagesociety_ux_component_dim_ComponentPoint.ABSOLUTE;
		this._nr2 = val;
		this._nr1 = offset;
		this._nr3 = dim_percent_offset;
		this._cr2 = null;
		this._cr1 = null;
	},

	/*
	  param guides Array
	  param idx uint
	  param offset Number
	  param dim_percent_offset Number
	  returns void
	*/
	setGuide: function(guides, idx, offset, dim_percent_offset)
	{
		offset = (offset ? offset : 0);
		dim_percent_offset = (dim_percent_offset ? dim_percent_offset : 0);
		this._type = com_pagesociety_ux_component_dim_ComponentPoint.GUIDE;
		this._nr1 = idx;
		this._nr2 = offset;
		this._nr3 = dim_percent_offset;
		this._or1 = guides;
		this._or2 = null;
	},

	/*
	  returns Number
	*/
	getValue: function()
	{
		var dim = this._prop == com_pagesociety_ux_component_dim_ComponentPoint.X ? com_pagesociety_ux_component_dim_ComponentDimension.WIDTH : com_pagesociety_ux_component_dim_ComponentDimension.HEIGHT;
		var nr3xdim = this._nr3 == 0 ? 0 : this._component[this.get_prop0(dim)]() * this._nr3;
		switch (this._type)
		{
			case com_pagesociety_ux_component_dim_ComponentPoint.UNSET:
				return 0;
			case com_pagesociety_ux_component_dim_ComponentPoint.RELATIVE_TO_PARENT:
				if (this._component.getParent() == null)
						throw new Error("Cannot set application." + this._prop);
				return Math.floor(this._nr1 * this._component.getParent()[this.get_prop0(dim)]() + this._nr2  + nr3xdim);
			case com_pagesociety_ux_component_dim_ComponentPoint.RELATIVE_TO_SIBLING:
				return Math.floor(this._cr2[this.get_prop]() + this._nr2 + this._nr3 * this._cr1[dim]);
			case com_pagesociety_ux_component_dim_ComponentPoint.ABSOLUTE:
				return Math.floor(this._nr1 + this._nr2 + nr3xdim);
			case com_pagesociety_ux_component_dim_ComponentPoint.GUIDE:
				if (this._or1[this._nr1].type == com_pagesociety_ux_component_Component.PERCENT)
						return Math.floor(this._or1[this._nr1].val * this._component.getParent()[this.get_prop0(dim)]() + this._nr2 + nr3xdim);
				return Math.floor(this._or1[this._nr1].val + this._nr2 + nr3xdim);
			default:
				throw new Error("Unhandled Component Point Type " + this._type);
		};
	},


	get_prop: function()
	{
		return this.get_prop0(this._prop);
	},

	get_prop0: function(p)
	{
		var s = "get"+p.substring(0,1).toUpperCase()+p.substring(1);
		return s;
	}

});

com_pagesociety_ux_component_dim_ComponentPoint.X = "x";
com_pagesociety_ux_component_dim_ComponentPoint.Y = "y";
com_pagesociety_ux_component_dim_ComponentPoint.UNSET = 0x01;
com_pagesociety_ux_component_dim_ComponentPoint.RELATIVE_TO_PARENT = 0x02;
com_pagesociety_ux_component_dim_ComponentPoint.RELATIVE_TO_SIBLING = 0x03;
com_pagesociety_ux_component_dim_ComponentPoint.ABSOLUTE = 0x04;
com_pagesociety_ux_component_dim_ComponentPoint.GUIDE = 0x05;
/*
  Guide
*/

var com_pagesociety_ux_component_dim_Guide = Class.create(
{
	initialize: function()
	{

	}
});

com_pagesociety_ux_component_dim_Guide.CENTER = -0x01;
com_pagesociety_ux_component_dim_Guide.LEFT = -0x02;
com_pagesociety_ux_component_dim_Guide.RIGHT = -0x03;
com_pagesociety_ux_component_dim_Guide.TOP = -0x04;
com_pagesociety_ux_component_dim_Guide.BOTTOM = -0x05;
/*
  Image
  import com_pagesociety_ux_decorator_Decorator
  import com_pagesociety_ux_decorator_ImageDecorator
  import com_pagesociety_ux_event_ResourceEvent
*/

var com_pagesociety_ux_component_Image = Class.create( com_pagesociety_ux_component_Component,
{
	initialize: function($super, parent, index)
	{
		this._image_decorator/*ImageDecorator*/;
		this._src/*String*/;
		this._loaded/*Boolean*/;
		index = (index ? index : -1);
		$super(parent, index);
		this.setDecorator(new com_pagesociety_ux_decorator_ImageDecorator());
		this.setStyleName("Image");

	},
	/*
	  override
	  returns void
	*/
	destroy: function($super)
	{
		if (this._image_decorator != null)
		{
			this._image_decorator.removeEventListener(com_pagesociety_ux_event_ResourceEvent.LOAD_RESOURCE, this.on_load_resource_event.bind(this));
			this._image_decorator.removeEventListener(com_pagesociety_ux_event_ResourceEvent.LOAD_ERROR, this.on_load_resource_error.bind(this));
		}
		$super();
	},

	/*
	  param e ResourceEvent
	  returns void
	*/
	on_load_resource_event: function(e)
	{
		this._loaded = true;
		this.dispatchEvent(new com_pagesociety_ux_event_ResourceEvent(com_pagesociety_ux_event_ResourceEvent.LOAD_RESOURCE, this));
	},

	/*
	  param e ResourceEvent
	  returns void
	*/
	on_load_resource_error: function(e)
	{
		e = (e ? e : null);
		this._loaded = true;
		if (this._src != null)
		{
			Logger.error("IMAGE: cant load " + this._src);
			this._src = null;
		}
		this.dispatchEvent(new com_pagesociety_ux_event_ResourceEvent(com_pagesociety_ux_event_ResourceEvent.LOAD_ERROR, this));
	},

	/*
	  returns ImageDecorator
	*/
	getImageDecorator: function()
	{
		return this._image_decorator;
	},

	/*
	  returns Boolean
	*/
	getSmoothing: function()
	{
		return this.getImageDecorator().getSmoothing();
	},

	/*
	  returns String
	*/
	getSrc: function()
	{
		return this._src;
	},

	/*
	  override
	  returns Number
	*/
	getWidth: function($super)
	{
		if (this._image_decorator == null || this._image_decorator.getImageScalingType() != com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_NONE)
			return $super();
		else
		{
			return this.getImageWidth();
		}
	},

	/*
	  override
	  returns Number
	*/
	getHeight: function($super)
	{
		if (this._image_decorator == null || this._image_decorator.getImageScalingType() != com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_NONE)
			return $super();
		else
		{
			return this.getImageHeight();
		}
	},

	/*
	  returns Number
	*/
	getImageWidth: function()
	{
		if (!this._loaded)
			return 0;
		else
			return this._image_decorator.getImageWidth();
	},

	/*
	  returns Number
	*/
	getImageHeight: function()
	{
		if (!this._loaded)
			return 0;
		else
			return this._image_decorator.getImageHeight();
	},

	/*
	  returns Number
	*/
	getImageX: function()
	{
		if (!this._loaded)
			return 0;
		else
			return this._image_decorator.getImageX();
	},

	/*
	  returns Number
	*/
	getImageY: function()
	{
		if (!this._loaded)
			return 0;
		else
			return this._image_decorator.getImageY();
	},

	/*
	  returns uint
	*/
	getImageScalingType: function()
	{
		return this.getImageDecorator().getImageScalingType();
	},

	/*
	  override
	  param d Decorator
	  returns void
	*/
	setDecorator: function($super, d)
	{
		$super(d);
		this._image_decorator = d/* as com_pagesociety_ux_decorator_ImageDecorator*/;
		if (this._image_decorator != null)
		{
			this._image_decorator.addEventListener(com_pagesociety_ux_event_ResourceEvent.LOAD_RESOURCE, this.on_load_resource_event.bind(this));
			this._image_decorator.addEventListener(com_pagesociety_ux_event_ResourceEvent.LOAD_ERROR, this.on_load_resource_error.bind(this));
		}
	},

	/*
	  param s String
	  returns void
	*/
	setSrc: function(s)
	{
		if (s == this._src)
			return
		if (com_pagesociety_ux_component_Image.ROOT_URL != null && s.indexOf("http://") == -1)
			s = com_pagesociety_ux_component_Image.ROOT_URL + s;
		this._src = s;
		this._loaded = false;
		this._image_decorator.setImageSrc(s);
	},

	/*
	  param b Boolean
	  returns void
	*/
	setSmoothing: function(b)
	{
		this.getImageDecorator().setSmoothing(b);
	},

	/*
	  param i uint
	  returns void
	*/
	setImageScalingType: function(i)
	{
		this.getImageDecorator().setImageScalingType(i);
	},

	/*
	  param o Object
	  returns void
	*/
	setImageScalingCue: function(o)
	{
		this.getImageDecorator().setImageScalingCue(o);
	}

});

com_pagesociety_ux_component_Image.ROOT_URL;
/*
  ImageResource
  import com_pagesociety_persistence_Entity
  import com_pagesociety_util_ObjectUtil
  import com_pagesociety_ux_event_ResourceEvent
  import com_pagesociety_ux_system_ResourceUtil
  import com_pagesociety_web_PathProvider
  import com_pagesociety_web_module_Resource
*/

var com_pagesociety_ux_component_ImageResource = Class.create( com_pagesociety_ux_component_Image,
{
	initialize: function($super, parent, index)
	{
		this._resource/*Entity*/;
		this._preview_width = -1/*Number*/;
		this._preview_height = -1/*Number*/;
		this._cant_load_src/*String*/;
		this._tried_server/*Boolean*/;
		index = (index ? index : -1);
		$super(parent, index);

	},
	/*
	  returns void
	*/
	load: function()
	{
		var v = this.getVisible();
		this.setVisible(true);
		this.render();
		this.setVisible(v);
	},

	/*
	  returns void
	*/
	draw_preview_unavailable: function()
	{
		this.setVisible(true);
		this.getImageDecorator().setGeneratingPreview(true);
		this.setBackgroundColor(0x333333);
		this.setBackgroundAlpha(.6);
		this.render();
	},

	/*
	  override
	  param e ResourceEvent
	  returns void
	*/
	on_load_resource_error: function($super, e)
	{
		e = (e ? e : null);
		this._cant_load_src = this._src;
		$super(e);
		this.do_load_resource_error();
	},

	/*
	  returns void
	*/
	do_load_resource_error: function()
	{
		if (this._tried_server)
		{
			Logger.log("IMAGE RESOURCE: cant load " + this._cant_load_src);
			this.dispatchEvent(new com_pagesociety_ux_event_ResourceEvent(com_pagesociety_ux_event_ResourceEvent.LOAD_ERROR, this));
			return ;
		}
		if (this._resource != null)
		{
			this.getImageDecorator().setGeneratingPreview(true);
			var w = 200;
			var h = 200;
			if (this._preview_width > 1 && this._preview_height > 1)
				{
					w = this._preview_width;
					h = this._preview_height;
				}
			Logger.log("IMAGE RESOURCE: GENERATING PREVIEW [" + w);
			this._tried_server = true;
			com_pagesociety_web_ResourceUtil.getPreviewUrl(this._resource, w, h, this.on_get_generated_image.bind(this));
		}
	},

	/*
	  param url String
	  returns void
	*/
	on_get_generated_image: function(url)
	{
		var b = this._cant_load_src == url;
		if (!b)
			Logger.error("ImageResource/S3 ERROR: My S3PathProvider said this: " + this._cant_load_src);
		this.getImageDecorator().setGeneratingPreview(false);
		this.setSrc(url);
		this.render();
	},

	/*
	  returns Entity
	*/
	getResource: function()
	{
		return this._resource;
	},

	/*
	  returns Number
	*/
	getPreviewWidth: function()
	{
		return this._preview_width;
	},

	/*
	  returns Number
	*/
	getPreviewHeight: function()
	{
		return this._preview_height;
	},

	/*
	  returns Number
	*/
	getScale: function()
	{
		return this.setDecorator./*?void*/scaleX;
	},

	/*
	  param w Number
	  returns void
	*/
	setPreviewWidth: function(w)
	{
		this._preview_width = w;
	},

	/*
	  param h Number
	  returns void
	*/
	setPreviewHeight: function(h)
	{
		this._preview_height = h;
	},

	/*
	  param s Number
	  returns void
	*/
	setScale: function(s)
	{
		this.setDecorator./*?void*/scaleX = this.setDecorator./*?void*/scaleY = s;
	},

	/*
	  param resource Entity
	  returns void
	*/
	setResource: function(resource)
	{
		this._resource = resource;
		if (resource == null)
			return
		if (!com_pagesociety_util_ObjectUtil.isResource(resource))
			throw new Error("I don't know how to do anything with " + resource);
		if (resource.get$()[com_pagesociety_web_module_Resource.RESOURCE_FIELD_SIMPLE_TYPE] != com_pagesociety_web_module_Resource.SIMPLE_TYPE_IMAGE_STRING)
		{
			this.draw_preview_unavailable();
			return ;
		}

		if (this._preview_width > 1 && this._preview_height > 1)
			{
				var url = com_pagesociety_web_ResourceUtil.getPath(resource, this._preview_width, this._preview_height);
				if (com_pagesociety_ux_decorator_ImageDecorator.DEBUG)
					Logger.log("Image.setSrc("+url+")");
				this.setSrc(url);
			}
			else
			{
				this.setSrc(com_pagesociety_web_ResourceUtil.getPath(resource, 200, 200));
			}
		if (this.getSrc() == null)
				this.do_load_resource_error();
			else
			{
				this.render();
			}

	}

});

/*
  SlideShow
  import com_pagesociety_persistence_Entity
  import com_pagesociety_util_Random
  import com_pagesociety_ux_component_Component
  import com_pagesociety_ux_component_Container
  import com_pagesociety_ux_component_Image
  import com_pagesociety_ux_component_ImageResource
  import com_pagesociety_ux_component_container_PageContainer
  import com_pagesociety_ux_decorator_ImageDecorator
  import com_pagesociety_ux_event_ComponentEvent
  import com_pagesociety_ux_event_ResourceEvent
  import com_pagesociety_ux_event_SelectionEvent
  import com_pagesociety_web_module_Resource
  import flash_events_TimerEvent
  import flash_utils_Timer
*/

var com_pagesociety_ux_component_media_SlideShow = Class.create( com_pagesociety_ux_component_Container,
{
	initialize: function($super, parent)
	{
		this._slides/*PageContainer*/;
		this._timer/*Timer*/;
		this._slide_data/*Array*/;
		this._image_scaling_type/*int*/;
		this._image_width/*Number*/;
		this._image_height/*Number*/;
		this._play/*Boolean*/;
		this._speed/*uint*/;
		this._controller/*VideoControl*/;
		this._load_index/*uint*/;
		this._loaded/*Array*/;
		this._linear_load/*Boolean*/;
		this._show_next_loaded/*Boolean*/;
		$super(parent);
		this._slides = new com_pagesociety_ux_component_container_PageContainer(this);
		this._slides.setType(com_pagesociety_ux_component_container_PageContainer.TYPE_SIMPLE_FADE);
		this._image_scaling_type = com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_FIT_OR_SHRINK_ALIGN_CENTER;
		this._image_width = 1500;
		this._image_height = 1000;
		this._speed = 2000;

	},
	/*
	  param p Container
	  param data Object
	  returns Component
	*/
	cell_renderer: function(p, data)
	{
		if (com_pagesociety_ux_component_media_SlideShow.is_image(data/* as com_pagesociety_persistence_Entity*/))
		{
			var ir = new com_pagesociety_ux_component_ImageResource(p);
			ir.setUserObject(data);
			ir.setSmoothing(true);
			ir.setPreviewHeight(this._image_height);
			ir.setPreviewWidth(this._image_width);
			ir.setVisible(false);
			if (this.hasEventListener(com_pagesociety_ux_event_SelectionEvent.SELECT))
					ir.addEventListener(com_pagesociety_ux_event_ComponentEvent.CLICK, this.on_click_component.bind(this));
			return ir;
		}
		else
		{
			var m = new com_pagesociety_ux_component_media_Video(p, this._controller);
			m.setUserObject(data);
			return m;
		}
	},

	/*
	  param cell Component
	  param data Object
	  returns void
	*/
	load_cell_handler: function(cell, data)
	{
		var r = data/* as com_pagesociety_persistence_Entity*/;
		if (com_pagesociety_ux_component_media_SlideShow.is_image(r))
		{
			var ir = cell/* as com_pagesociety_ux_component_ImageResource*/;

			ir.addEventListener(com_pagesociety_ux_event_ResourceEvent.LOAD_RESOURCE, this.on_load_slide.bind(this));
			ir.setResource(r);
			ir.load();
		}
		else
		{
			var m = cell/* as com_pagesociety_ux_component_media_Video*/;
			m.setValue(r);
			this.load_image_complete(this._load_index);
		}
	},

	/*
	  override
	  returns void
	*/
	render: function($super)
	{
		for (var i = 0; i < this._slides.getChildren().length; i++)
		{
			if (this._slides.getChildren()[i] instanceof com_pagesociety_ux_component_Image)
				{
					var img = this._slides.getChildren()[i];
					img.setImageScalingType(this._image_scaling_type);
				}
		}
		$super();
	},

	/*
	  returns void
	*/
	load_image: function()
	{
		if (this._slide_data == null || this._slide_data.length == 0 || this._load_index >= this._slides.getChildren().length)
			return
		this._loaded[this._load_index] = com_pagesociety_ux_component_media_SlideShow.LOAD_STARTED;
		this.load_cell_handler(this._slides.getChildren()[this._load_index], this._slide_data[this._load_index]);
	},

	/*
	  param e ComponentEvent
	  returns void
	*/
	on_load_slide: function(e)
	{
		var cidx = this._slides.indexOf(e.component);
		if(cidx == 0)
			this.dispatchComponentEvent("FIRST_SLIDE_LOADED",this);
		this.load_image_complete(cidx);
	},

	/*
	  param index int
	  returns void
	*/
	load_image_complete: function(index)
	{
		this._loaded[index] = com_pagesociety_ux_component_media_SlideShow.LOAD_COMPLETE;
		if (this._show_next_loaded)
		{
			this.on_tick(null);
			this._show_next_loaded = false;
		}
		if (this._play)
			this.start_slide_show_timer();
		this.render();
		this.dispatchComponentEvent(com_pagesociety_ux_event_ResourceEvent.LOAD_RESOURCE, this, this._load_index);
		if (this.all_loaded())
		{
			this.dispatchComponentEvent(com_pagesociety_ux_event_ResourceEvent.LOAD_RESOURCES, this, this._slide_data.length);
			return ;
		}
		if (this._play || this._linear_load)
			this._load_index = this.get_next();
		else
			this._load_index = this.get_random();
		this.load_image();
	},

	/*
	  returns int
	*/
	get_next: function()
	{
		for (var i = 0; i < this._loaded.length; i++)
		{
			if (this._loaded[i] == com_pagesociety_ux_component_media_SlideShow.CONSTRUCTED)
					return i;
		}
		return -1;
	},

	/*
	  returns int
	*/
	get_random: function()
	{
		var l = new Array();
		for (var i = 0; i < this._loaded.length; i++)
		{
			if (this._loaded[i] == com_pagesociety_ux_component_media_SlideShow.CONSTRUCTED)
					l.push(i);
		}
		if (l.length == 0)
			return -1;
		return l[com_pagesociety_util_Random.R(l.length)];
	},

	/*
	  returns Boolean
	*/
	all_loaded: function()
	{
		for (var i = 0; i < this._loaded.length; i++)
		{
			if (this._loaded[i] == com_pagesociety_ux_component_media_SlideShow.CONSTRUCTED)
					return false;
		}
		return true;
	},

	/*
	  returns Boolean
	*/
	is_next_loaded: function()
	{
		var i = this._slides.getPage() + 1;
		if (i >= this._loaded.length)
			i = 0;
		return this._loaded[i] == com_pagesociety_ux_component_media_SlideShow.LOAD_COMPLETE;
	},

	/*
	  param e ComponentEvent
	  returns void
	*/
	on_click_component: function(e)
	{
		var t = e.component.getUserObject();
		var i = this._slides.indexOf(e.component);
		this.dispatchComponentEvent(com_pagesociety_ux_event_SelectionEvent.SELECT, e.component, i);
	},

	/*
	  returns void
	*/
	start_slide_show_timer: function()
	{
		if (this._timer == null)
		{
			this._timer = new Timer(this._speed);
			this._timer.addEventListener(TimerEvent./*?TimerEvent*/TIMER, this.on_tick.bind(this));
		}
		this._timer.reset();
		this._timer.start();
	},

	/*
	  param e TimerEvent
	  returns void
	*/
	on_tick: function(e)
	{
		if (this.is_next_loaded())
		{
			this._slides.next();
			this._slides.render();
		}
		else
			this._show_next_loaded = true;
	},

	/*
	  returns PageContainer
	*/
	getPageContainer: function()
	{
		return this._slides;
	},

	/*
	  returns Array
	*/
	getSlides: function()
	{
		return this._slides.getChildren();
	},

	/*
	  returns Image
	*/
	getCurrentImage: function()
	{
		if (this._slides.getChildren()[this._slides.getPage()] instanceof com_pagesociety_ux_component_Image)
			return this._slides.getChildren()[this._slides.getPage()];
		else
			return null;
	},

	/*
	  returns Component
	*/
	getCurrentComponent: function()
	{
		return this._slides.getChildren()[this._slides.getPage()];
	},

	/*
	  returns uint
	*/
	getCurrentIndex: function()
	{
		return this._slides.getPage();
	},

	/*
	  returns Number
	*/
	getImagesWidth: function()
	{
		return this._slides.getLayoutWidth();
	},

	/*
	  returns Array
	*/
	getValue: function()
	{
		return this._slide_data;
	},

	/*
	  returns int
	*/
	getImageScalingType: function()
	{
		return this._image_scaling_type;
	},

	/*
	  returns Number
	*/
	getImageWidth: function()
	{
		return this._image_width;
	},

	/*
	  returns Number
	*/
	getImageHeight: function()
	{
		return this._image_height;
	},

	/*
	  returns uint
	*/
	getSpeed: function()
	{
		return this._speed;
	},

	/*
	  returns Boolean
	*/
	getLooping: function()
	{
		return this._slides.getLooping();
	},

	/*
	  returns Boolean
	*/
	getPlaying: function()
	{
		return this._play && this._load_index > 0;
	},

	/*
	  returns uint
	*/
	getPage: function()
	{
		return this._slides.getPage();
	},

	/*
	  returns Component
	*/
	getPageComponent: function()
	{
		return this._slides.getChildren()[this._slides.getPage()];
	},

	/*
	  returns VideoControl
	*/
	getController: function()
	{
		return this._controller;
	},

	/*
	  returns Boolean
	*/
	getLinearLoad: function()
	{
		return this._linear_load;
	},

	/*
	  param images Array
	  returns void
	*/
	setValue: function(images)
	{
		this._slide_data = images;
		this._slides.clear();
		this._loaded = new Array();
		if (this._slide_data != null)
			for (var i = 0; i < this._slide_data.length; i++)
			{
				this.cell_renderer(this._slides, this._slide_data[i]);
				this._loaded.push(com_pagesociety_ux_component_media_SlideShow.CONSTRUCTED);
			}
		this.setPage(0);
	},

	/*
	  param t uint
	  returns void
	*/
	setPageContainerType: function(t)
	{
		this._slides.setType(t);
		this._slides.showPage(0);
	},

	/*
	  param u Number
	  returns void
	*/
	setPageContainerGap: function(u)
	{
		this._slides.setGap(u);
	},

	/*
	  param t int
	  returns void
	*/
	setImageScalingType: function(t)
	{
		this._image_scaling_type = t;
	},

	/*
	  param w Number
	  returns void
	*/
	setImageWidth: function(w)
	{
		this._image_width = w;
	},

	/*
	  param h Number
	  returns void
	*/
	setImageHeight: function(h)
	{
		this._image_height = h;
	},

	/*
	  param s uint
	  returns void
	*/
	setSpeed: function(s)
	{
		if (isNaN(s))
			return
		this._speed = s;
		if (this._timer != null)
		{
			this._timer.stop();
			this._timer = null;
		}
		this.setPlaying(this._play);
	},

	/*
	  param b Boolean
	  returns void
	*/
	setLooping: function(b)
	{
		this._slides.setLooping(b);
	},

	/*
	  param b Boolean
	  returns void
	*/
	setPlaying: function(b)
	{
		this._play = b;
		if (b)
			this.start_slide_show_timer();
		else
			if (this._timer != null)
				this._timer.stop();
	},

	/*
	  param i uint
	  returns void
	*/
	setPage: function(i)
	{
		if (this._slides == null)
			return
		this._slides.setPage(i);
		if (this._loaded != null && this._loaded[i] == com_pagesociety_ux_component_media_SlideShow.LOAD_COMPLETE)
			return
		this._load_index = i;
		this.load_image();
	},

	/*
	  param h VideoControl
	  returns void
	*/
	setController: function(h)
	{
		this._controller = h;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setLinearLoad: function(b)
	{
		this._linear_load = b;
	},

	/*
	  override
	  param b Boolean
	  returns void
	*/
	setVisible: function($super, b)
	{
		if (!b && this._timer != null)
			this._timer.stop();
		$super(setVisibleb);
	}

});

com_pagesociety_ux_component_media_SlideShow.CONSTRUCTED = 0;
com_pagesociety_ux_component_media_SlideShow.LOAD_STARTED = 1;
com_pagesociety_ux_component_media_SlideShow.LOAD_COMPLETE = 2;
	/*
	  param r Entity
	  returns Boolean
	*/
com_pagesociety_ux_component_media_SlideShow.is_image = function(r)
	{
		return r.getAttributes()[com_pagesociety_web_module_Resource.RESOURCE_FIELD_SIMPLE_TYPE] == "IMAGE";
	};
/*
  Label
  import com_pagesociety_util_StringUtil
  import com_pagesociety_ux_component_Component
  import com_pagesociety_ux_component_Container
  import com_pagesociety_ux_decorator_LabelDecorator
  import com_pagesociety_ux_event_ComponentEvent
  import flash_events_TextEvent
  import flash_text_TextFieldAutoSize
  import flash_text_TextFormat
*/

var com_pagesociety_ux_component_text_Label = Class.create( com_pagesociety_ux_component_Component,
{
	initialize: function($super, parent, index)
	{
		this._label_value/*String*/;
		this._align = com_pagesociety_ux_component_text_Label.ALIGN_LEFT/*uint*/;
		index = (index ? index : -1);
		$super(parent, index);
		this.setDecorator(new com_pagesociety_ux_decorator_LabelDecorator(this.getApplication().getStyle()));
		//this.getDecorator().addEventListener(TextEvent./*?TextEvent*/LINK, this.on_link.bind(this));
		this.setStyleName("Component Label");
		this._label_value = "";

	},
	/*
	  param e TextEvent
	  returns void
	*/
	on_link: function(e)
	{
		this.dispatchComponentEvent(com_pagesociety_ux_event_ComponentEvent.LINK, THIS, e./*?TextEvent*/text);
	},

	/*
	  param s String
	  param append_too_if_s_not_empty String
	  returns void
	*/
	append: function(s, append_too_if_s_not_empty)
	{
		append_too_if_s_not_empty = (append_too_if_s_not_empty ? append_too_if_s_not_empty : "");
		if (s == null || s == "")
			return
		this.setText( this.getText() + (s + append_too_if_s_not_empty));
	},

	/*
	  override
	  returns void
	*/
	render: function($super)
	{
		if (this.getMultiline())
		{
		}
		else
		{
			var xa = this.getLabelDecorator().getLabelX();
			switch (this._align)
				{
					case com_pagesociety_ux_component_text_Label.ALIGN_LEFT:
						xa = 0;
						break;
					case com_pagesociety_ux_component_text_Label.ALIGN_CENTER:
						xa = Math.floor((this._width.getValue() - this.getLabelDecorator().getWidth()) / 2);
						break;
					case com_pagesociety_ux_component_text_Label.ALIGN_RIGHT:
						xa = this._width.getValue() - this.getLabelDecorator().getWidth();
						break;
				};
			this.getLabelDecorator().setLabelX(xa);
		}
		$super();
	},

	/*
	  returns LabelDecorator
	*/
	getLabelDecorator: function()
	{
		return this.getDecorator()/* as com_pagesociety_ux_decorator_LabelDecorator*/;
	},

	/*
	  returns String
	*/
	getText: function()
	{
		return this._label_value;
	},

	/*
	  override
	  returns Number
	*/
	getWidth: function($super)
	{
		if (!this.getIsWidthUnset())
			return $super();
		return this.getLabelDecorator().getWidth();
	},

	/*
	  override
	  returns Number
	*/
	getHeight: function($super)
	{
		if (!this.getIsHeightUnset())
			return $super();
		if (this.getDecorator() == null)
			return 0;
		//this.getLabelDecorator().setWidth(this.setWidth);
		return this.getLabelDecorator().getHeight();
	},

	/*
	  returns Number
	*/
	getDescent: function()
	{
		if (this.getDecorator() == null)
			return 0;
		return this.getLabelDecorator().getDescent();
	},

	/*
	  returns Number
	*/
	getAscent: function()
	{
		if (this.getDecorator() == null)
			return 0;
		return this.getLabelDecorator().getAscent();
	},

	/*
	  returns Boolean
	*/
	getMultiline: function()
	{
		return this.getLabelDecorator().getLabelIsMultiLine();
	},

	/*
	  returns Boolean
	*/
	getSelectable: function()
	{
		return this.getLabelDecorator().getSelectable();
	},

	/*
	  returns String
	*/
	getFontStyle: function()
	{
		return this.getLabelDecorator().getFontStyle();
	},

	/*
	  param v String
	  returns void
	*/
	setText: function(v)
	{
		if (v == null)
			v = "";
		this._label_value = v;
		this.getLabelDecorator().setLabelText(v);
	},

	/*
	  param d Date
	  returns void
	*/
	setDate: function(d)
	{
		this.setText(com_pagesociety_util_StringUtil.formatDate(d));
	},

	/*
	  param a uint
	  returns void
	*/
	setAlign: function(a)
	{
		this._align = a;
	},

	/*
	  override
	  param w Number
	  returns void
	*/
	setWidth: function($super, w)
	{
		$super(w);
		this.getDecorator().setWidth(w);
	},

	/*
	  override
	  param h Number
	  returns void
	*/
	setHeight: function($super, h)
	{
		$super(h);
	},

	/*
	  param b Boolean
	  returns void
	*/
	setMultiline: function(b)
	{
		this.getLabelDecorator().setLabelIsMultiLine(b);
		if (b && this.getIsWidthUnset())
			this.setWidthPercent(100);
		else
			if (!b)
				this.widthUnset();
	},

	/*
	  param b Boolean
	  returns void
	*/
	setSelectable: function(b)
	{
		this.getLabelDecorator().setSelectable(b);
	},

	/*
	  param tf TextFormat
	  returns void
	*/
	setTextFormat: function(tf)
	{
		this.getLabelDecorator().setLabelTextFormat(tf);

	},

	/*
	  param s String
	  returns void
	*/
	setFontStyle: function(s)
	{
		this.getLabelDecorator().setFontStyle(s);
	}

});

com_pagesociety_ux_component_text_Label.ALIGN_LEFT = 0;
com_pagesociety_ux_component_text_Label.ALIGN_CENTER = 1;
com_pagesociety_ux_component_text_Label.ALIGN_RIGHT = 2;



















//http://www.useragentman.com/blog/2009/11/29/how-to-detect-font-smoothing-using-javascript/

var TypeHelpers = new function(){

	   // I use me instead of this.  For reasons why, please read:
	   // http://w3future.com/html/stories/callbacks.xml
	   var me = this;

	   me.hasSmoothing = function(){

	      // IE has screen.fontSmoothingEnabled - sweet!
	      if (typeof(screen.fontSmoothingEnabled) != "undefined") {
	         return screen.fontSmoothingEnabled;
	      } else {

	         try {

	            // Create a 35x35 Canvas block.
	            var canvasNode = document.createElement('canvas');
	            canvasNode.width = "35";
	            canvasNode.height = "35"

	            // We must put this node into the body, otherwise
	            // Safari Windows does not report correctly.
	            canvasNode.style.display = 'none';
	            document.body.appendChild(canvasNode);
	            var ctx = canvasNode.getContext('2d');

	            // draw a black letter 'O', 32px Arial.
	            ctx.textBaseline = "top";
	            ctx.font = "32px Arial";
	            ctx.fillStyle = "black";
	            ctx.strokeStyle = "black";

	            ctx.fillText("O", 0, 0);

	            // start at (8,1) and search the canvas from left to right,
	            // top to bottom to see if we can find a non-black pixel.  If
	            // so we return true.
	            for (var j = 8; j <= 32; j++) {
	               for (var i = 1; i <= 32; i++) {

	                  var imageData = ctx.getImageData(i, j, 1, 1).data;
	                  var alpha = imageData[3];

	                  if (alpha != 255 && alpha != 0) {
	                     return true; // font-smoothing must be on.
	                  }
	               }

	            }

	            // didn't find any non-black pixels - return false.
	            return false;
	         }
	         catch (ex) {
	            // Something went wrong (for example, Opera cannot use the
	            // canvas fillText() method.  Return null (unknown).
	            return null;
	         }
	      }
	   }

	   me.insertClasses = function(){
	      var result = me.hasSmoothing();
	      var htmlNode = document.getElementsByTagName('html')[0];
	      if (result == true) {
	         htmlNode.className += " hasFontSmoothing-true";
	      } else if (result == false) {
	            htmlNode.className += " hasFontSmoothing-false";
	      } else { // result == null
	            htmlNode.className += " hasFontSmoothing-unknown";
	      }
	   }

	}
/*
  Link
  import com_pagesociety_ux_ISelectable
  import com_pagesociety_ux_component_Container
  import com_pagesociety_ux_decorator_LinkDecorator
*/

var com_pagesociety_ux_component_text_Link = Class.create( com_pagesociety_ux_component_text_Label,
{
	initialize: function($super, parent, index)
	{
		this._link_color_normal/*uint*/;
		this._link_color_over/*uint*/;
		this._link_thickness_normal/*int*/;
		this._link_thickness_over/*int*/;
		this._link_color_selected/*uint*/;
		this._is_selected = false/*Boolean*/;
		index = (index ? index : -1);
		SUPER(parent, index);
		this.setDecorator(new com_pagesociety_ux_decorator_LinkDecorator(this.getApplication().getStyle()));
		this.setStyleName("Link");

	},
	/*
	  returns LinkDecorator
	*/
	getLinkDecorator: function()
	{
		return this.getDecorator()/* as com_pagesociety_ux_decorator_LinkDecorator*/;
	},

	/*
	  returns Boolean
	*/
	getSelected: function()
	{
		return this._is_selected;
	},

	/*
	  returns uint
	*/
	getNormalColor: function()
	{
		return this._link_color_normal;
	},

	/*
	  returns int
	*/
	getNormalThickness: function()
	{
		return this._link_thickness_normal;
	},

	/*
	  returns uint
	*/
	getOverColor: function()
	{
		return this._link_color_over;
	},

	/*
	  returns int
	*/
	getOverThickness: function()
	{
		return this._link_thickness_over;
	},

	/*
	  returns uint
	*/
	getSelectedColor: function()
	{
		return this._link_color_selected;
	},

	/*
	  override
	  returns Number
	*/
	getHeight: function($super)
	{
		if (!this.getIsHeightUnset())
			return $super()
		if (this.getDecorator() == null)
			return 0
		return this.getLinkDecorator().getHeight();
	},

	/*
	  param b Boolean
	  returns void
	*/
	setSelected: function(b)
	{
		this._is_selected = b;
		this.getLinkDecorator().setSelected(b);
	},

	/*
	  param c uint
	  returns void
	*/
	setNormalColor: function(c)
	{
		this._link_color_normal = c;
		this.getLinkDecorator().setNormalColor(c);
	},

	/*
	  param c int
	  returns void
	*/
	setNormalThickness: function(c)
	{
		this._link_thickness_normal = c;
		this.getLinkDecorator().setNormalThickness(c);
	},

	/*
	  param c uint
	  returns void
	*/
	setOverColor: function(c)
	{
		this._link_color_over = c;
		this.getLinkDecorator().setOverColor(c);
	},

	/*
	  param c int
	  returns void
	*/
	setOverThickness: function(c)
	{
		this._link_thickness_over = c;
		this.getLinkDecorator().setOverThickness(c);
	},

	/*
	  param c uint
	  returns void
	*/
	setSelectedColor: function(c)
	{
		this._link_color_selected = c;
		this.getLinkDecorator().setSelectedColor(c);
	}

});

/*
  Decorator
  import com_pagesociety_ux_component_Component
  import com_pagesociety_ux_event_ComponentEvent

*/

var com_pagesociety_ux_decorator_Decorator = Class.create( EventDispatcher,
{
	initialize: function($super)
	{
		$super();
		this.component/*Component*/;
		this.visible = true/*Boolean*/;
		this.x = 0/*Number*/;
		this.y = 0/*Number*/;
		this.width = 0/*Number*/;
		this.height = 0/*Number*/;
		this.scale = 1/*Number*/;
		this.cornerRadius = 0/*Number*/;
		this.backgroundVisible = false;
		this.backgroundColor = 0xffffff;
		this.backgroundAlpha = 1;
		this.blurAmount = 0/*Number*/;
		this.shadowSize = 0/*Number*/;
		this.shadowStrength = .2/*Number*/;
		this.shadowColor = 0x000000/*Number*/;
		this.shadowAlpha = 1/*Number*/;
		this.shadowDistance = 0/*Number*/;
		this.shadowAngle = 45/*Number*/;
		this.zIndex = 0;
		this.element/*Element*/;
		this.bg/*Element*/;
		this.mid/*Element*/;
		//this._drag_area/*Element*/;
		//this._color/*ColorTransform*/;
		//this._shadow/*DropShadowFilter*/;
		//this._blur/*BlurFilter*/;
		//this._raster/*Sprite*/;
		//this._drag_and_drop_class_name/*String*/;
		//this._drag_and_drop/*DragAndDrop*/;
		//this.setDragAndDropClassName("com.pagesociety.ux.decorator.DragAndDrop");
		this.initGraphics();
	},
	/*
	  returns void
	*/
	initGraphics: function()
	{
//		com.pagesociety.ux.decorator.mouseEnabled = false;
//		com.pagesociety.ux.decorator.useHandCursor = false;
		this.element = new Element("DIV");
		this.element.className = "__component";
		this.bg = new Element("DIV");
		this.bg.className = "__bg";
		this.element.insert(this.bg);
		this.mid= new Element("DIV");
		this.mid.className = "__mid";
		this.element.insert(this.mid);
	},

	/*
	  returns void
	*/
	destroy: function()
	{
		if (this.element.parentNode != null)
			this.element.parentNode.removeChild(this.element);
	},

	/*
	  returns void
	*/
	bringToFront: function()
	{
		this.zIndex = com_pagesociety_ux_decorator_Decorator.ZINC++;
	},

	/*
	  returns void
	*/
	sendToBack: function()
	{
		this.zIndex = com_pagesociety_ux_decorator_Decorator.ZDEC--;
	},

	/*
	  returns void
	*/
	decorate: function()
	{
		if (this.visible)
			this.element.show();
		else
			this.element.hide();
		//		this.element.setStyle({ display: this.visible ? "block" : "none"});
		if (!this.visible)
			return;

		var x = Math.floor(this.x);
		var y = Math.floor(this.y)
		var w = Math.floor(this.width);
		var h = Math.floor(this.height);
		this.element.setStyle(
			{
				position		: "absolute",
				left			: x+"px",
				top 			: y+"px",
				width 			: w+"px",
				height 			: h+"px"
//				zIndex			: this.zIndex
			});
		this.bg.setStyle(
			{
				position		: "absolute",
				left			: "0px",
				top 			: "0px",
				width 			: w+"px",
				height 			: h+"px"
//				zIndex			: 0
			});
		this.mid.setStyle(
			{
				position		: "absolute",
//				left			: "0px",
//				top 			: "0px",
				width 			: w+"px",
				height 			: h+"px"
//				zIndex			: 1
			});

		if (!this.backgroundVisible)
			this.bg.setStyle({backgroundColor	: ""});
		else
			this.bg.setStyle({backgroundColor	: this.int_to_color_string(this.backgroundColor)});
		this.bg.setOpacity(this.backgroundAlpha);

		if (this.shadowSize!=0)
		{
			var shadow_params = this.shadowDistance+"px " +
								this.shadowDistance+"px " +
								this.shadowSize+"px " +
								this.int_to_color_string(this.shadowColor);
			this.element.setStyle(
				{
					"-webkit-box-shadow"	 : shadow_params,
					"boxShadow"			 : shadow_params
				});
		}

		this.element.setOpacity(this.alpha);

		if (this.styleName != null)
			this.element.className = this.styleName;

		//color
		//blur


	},


	int_to_color_string: function (c)
	{
		var s = "000000"+c.toString(16)	;
		return "#"+s.substring(s.length-6,s.length);
	},

	/*
	  param x0 Number
	  param y0 Number
	  returns void
	*/
	updatePosition: function(x0, y0)
	{
		this.x = x0;
		this.y = y0;

		this.element.setStyle(
			{
				position		: "absolute",
				left			: this.x+"px",
				top 			: this.y+"px"
			});
	},

	/*
	  param b Boolean
	  returns void
	*/
	updateVisibility: function(b)
	{
		this.visible = b;
		this.element.setStyle({ visibility: this.visible ? "visible" : "hidden"});
	},



	/*
	  param line_style LineStyle
	  param x Number
	  param y Number
	  param width Number
	  param clear Boolean
	  returns void
	*/
	lineH: function(line_style, x, y, width, clear)
	{
		clear = (clear ? clear : true);
		var g = graphics;
		if (clear)
			g./*?Graphics*/clear()
		g./*?Graphics*/lineStyle(line_style.thickness, line_style.color, line_style.alpha);
		g./*?Graphics*/moveTo(x, y);
		g./*?Graphics*/lineTo(x + width, y);
	},

	/*
	  param line_style LineStyle
	  param x Number
	  param y Number
	  param width Number
	  param height Number
	  param clear Boolean
	  returns void
	*/
	lineRect: function(line_style, x, y, width, height, clear)
	{
		clear = (clear ? clear : true);
		var g = graphics;
		if (clear)
			g./*?Graphics*/clear()
		g./*?Graphics*/lineStyle(line_style.thickness, line_style.color, line_style.alpha);
		g./*?Graphics*/drawRect(x, y, width, height);
	},

	/*
	  param color uint
	  param alpha Number
	  param x Number
	  param y Number
	  param width Number
	  param height Number
	  param clear Boolean
	  returns void
	*/
	fillRect: function(color, alpha, x, y, width, height, clear)
	{
		clear = (clear ? clear : true);
		var g = graphics;
		if (clear)
			g./*?Graphics*/clear()
		g./*?Graphics*/beginFill(color, alpha);
		g./*?Graphics*/drawRect(x, y, width, height);
		g./*?Graphics*/endFill();
	},

	/*
	  returns String
	*/
	toStringAllProps: function()
	{
		var s = "Decorator {\n";
		for (var p in this)
		{
		s += "\t" + p;
		}

		s += "}";
		return s;
	},



	/*
	  param s Number
	  returns Bitmap
	*/
	createBitmap: function(s)
	{
		s = (s ? s : 1);
		return this.create_bitmap(THIS, s, this._width, this._height, this.getBackground()./*?Box*/borderThickness, 0, 0, true, 0x00000000);
	},

	/*
	  param s Number
	  param w Number
	  param h Number
	  param xoff Number
	  param yoff Number
	  returns Bitmap
	*/
	createCroppedBitmap: function(s, w, h, xoff, yoff)
	{
		return this.create_bitmap(THIS, 1, w, h, 0, xoff, yoff, true, 0);
	},

	/*
	  param d Decorator
	  param s Number
	  param w Number
	  param h Number
	  param b Number
	  param xoff Number
	  param yoff Number
	  param use_alpha Boolean
	  param matte_color uint
	  returns Bitmap
	*/
	create_bitmap: function(d, s, w, h, b, xoff, yoff, use_alpha, matte_color)
	{
		var m = new flash.geom.Matrix();
		m./*?Matrix*/translate(b / 2 + xoff, b / 2 + yoff);
		m./*?Matrix*/scale(s, s);
		var bmd = new flash.display.BitmapData(w + b, h + b, use_alpha, matte_color);
		bmd./*?BitmapData*/draw(d, m);
		return new flash.display.Bitmap(bmd);
	},

	/*
	  returns Point
	*/
	getRootPosition: function()
	{
		var o = this.element.viewportOffset;
		return { x: o.left, y: o.top };
	},

	/*
	  param c Component
	  returns void
	*/
	setDragComponent: function(c)
	{
		this._drag_and_drop.setDragComponent(c);
	},

	/*
	  param drop_target_component Component
	  returns void
	*/
	addDropComponent: function(drop_target_component)
	{
		this._drag_and_drop.addDropComponent(drop_target_component);
	},

	/*
	  param drop_target_component Component
	  returns void
	*/
	removeDropComponent: function(drop_target_component)
	{
		this._drag_and_drop.removeDropComponent(drop_target_component);
	},

	/*
	  returns Component
	*/
	getComponent: function()
	{
		return this._component;
	},

	/*
	  returns String
	*/
	getDragAndDropClassName: function()
	{
		return this._drag_and_drop_class_name;
	},

	/*
	  returns DisplayObject
	*/
	getDisplayObject: function()
	{
		return this.element;
	},

	/*
	  returns Sprite
	*/
	getDragArea: function()
	{
		if (this._drag_area != null)
			return this._drag_area;
		return THIS;
	},

	/*
	  returns Box
	*/
	getBackground: function()
	{
		return this.bg;
	},

	/*
	  returns Sprite
	*/
	getMidground: function()
	{
		return this.mid;
	},

	/*
	  override
	  returns Boolean
	*/
	getVisible: function()
	{
		return this.visible;
	},

	/*
	  override
	  returns Number
	*/
	getX: function()
	{
		return this.x;
	},

	/*
	  override
	  returns Number
	*/
	getY: function()
	{
		return this.y;
	},

	/*
	  override
	  returns Number
	*/
	getWidth: function()
	{
		return this.width;
	},

	/*
	  override
	  returns Number
	*/
	getHeight: function()
	{
		return this.height;
	},

	/*
	  returns Number
	*/
	getCornerRadius: function()
	{
		return this.cornerRadius;
	},

	/*
	  returns Number
	*/
	getBlur: function()
	{
		return this.blurAmount;
	},

	/*
	  returns Number
	*/
	getShadowSize: function()
	{
		return this.shadowSize;
	},

	/*
	  returns Number
	*/
	getShadowStrength: function()
	{
		return this.shadowStrength;
	},

	/*
	  returns Number
	*/
	getShadowColor: function()
	{
		return this.shadowColor;
	},

	/*
	  returns Number
	*/
	getShadowAlpha: function()
	{
		return this.shadowAlpha;
	},

	/*
	  returns Number
	*/
	getShadowDistance: function()
	{
		return this.shadowDistance;
	},

	/*
	  returns Number
	*/
	getShadowAngle: function()
	{
		return this.shadowAngle;
	},

	/*
	  returns uint
	*/
	getColor: function()
	{
		return this.color;
	},

	/*
	  returns Number
	*/
	getScale: function()
	{
		return this.scale;
	},

	/*
	  returns Boolean
	*/
	getRasterize: function()
	{
		return this.rasterize;
	},

	/*
	  returns Component
	*/
	getDragComponent: function()
	{
		return this._drag_and_drop.getDragComponent();
	},

	/*
	  returns Array
	*/
	getDropTargets: function()
	{
		return this._drag_and_drop.getDropTargets();
	},

	/*
	  param c Component
	  returns void
	*/
	setComponent: function(c)
	{
		this.component = c;
	},

	/*
	  param s String
	  returns void
	*/
	setDragAndDropClassName: function(s)
	{
		this._drag_and_drop_class_name = s;
		var DragAndDropClass = flash.utils.getDefinitionByName(this._drag_and_drop_class_name)/* as com.pagesociety.ux.decorator.Class*/;
		this._drag_and_drop = (new DragAndDropClass(THIS)());
	},

	/*
	  param s Sprite
	  returns void
	*/
	setDragArea: function(s)
	{
		this._drag_area = s;
	},

	/*
	  override
	  param b Boolean
	  returns void
	*/
	setVisible: function(b)
	{
		this.visible = b;
	},

	/*
	  override
	  param x Number
	  returns void
	*/
	setX: function(x)
	{
		this.x = x;
	},

	/*
	  override
	  param y Number
	  returns void
	*/
	setY: function(y)
	{
		this.y = y;
	},

	/*
	  override
	  param w Number
	  returns void
	*/
	setWidth: function(w)
	{
		if (isNaN(w))
			return
		this.width = w;
	},

	/*
	  override
	  param h Number
	  returns void
	*/
	setHeight: function(h)
	{
		if (isNaN(h))
			return
		this.height = h;
	},

	/*
	  param r Number
	  returns void
	*/
	setCornerRadius: function(r)
	{
		this.cornerRadius = r;
	},

	/*
	  param b Number
	  returns void
	*/
	setBlur: function(b)
	{
		this.blurAmount = b;
	},

	/*
	  param s Number
	  returns void
	*/
	setShadowSize: function(s)
	{
		this.shadowSize = s;
	},

	/*
	  param s Number
	  returns void
	*/
	setShadowStrength: function(s)
	{
		this.shadowStrength = s;
	},

	/*
	  param s Number
	  returns void
	*/
	setShadowColor: function(s)
	{
		this.shadowColor = s;
	},

	/*
	  param a Number
	  returns void
	*/
	setShadowAlpha: function(a)
	{
		this.shadowAlpha = a;
	},

	/*
	  param a Number
	  returns void
	*/
	setShadowDistance: function(a)
	{
		this.shadowDistance = a;
	},

	/*
	  param a Number
	  returns void
	*/
	setShadowAngle: function(a)
	{
		this.shadowAngle = a;
	},

	/*
	  param c uint
	  returns void
	*/
	setColor: function(c)
	{
		this.color = c;
	},

	/*
	  param s Number
	  returns void
	*/
	setScale: function(s)
	{
		this.scale = s;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setRasterize: function(b)
	{
		this._rasterize = b;
	},

	/*
	  param c Component
	  returns void
	*/
	setDragComponent: function(c)
	{
		this._drag_and_drop.setDragComponent(c);
	},

	/*
	  param a Array
	  returns void
	*/
	setDropTargets: function(a)
	{
		for (var i = 0; i < a.length; i++)
			if (a[i] == null)
				throw new Error("XXX");
		this._drag_and_drop.setDropTargets(a);
	}

});

com_pagesociety_ux_decorator_Decorator.NOT_RASTERIZED = 0;
com_pagesociety_ux_decorator_Decorator.RASTERIZED = 1;
com_pagesociety_ux_decorator_Decorator.ZINC = 999;
com_pagesociety_ux_decorator_Decorator.ZDEC = -1;
/*
  MaskedDecorator
  import flash_geom_Rectangle
*/

var com_pagesociety_ux_decorator_MaskedDecorator = Class.create( com_pagesociety_ux_decorator_Decorator,
{
	initialize: function($super, maskWidth, maskHeight, contentWidth, contentHeight)
	{
		this._mask_x = 0/*Number*/;
		this._mask_y = 0/*Number*/;
		this._content_width = 0/*Number*/;
		this._content_height = 0/*Number*/;
		this._dirty_rect = false/*Boolean*/;
		this._use_mask = true/*Boolean*/;
//		this._content_size_provider/*Function*/;
//		this._scroll_rect/*Rectangle*/;
		this._inset_x/*int*/;
		this._inset_y/*int*/;
		maskWidth = (maskWidth ? maskWidth : 0);
		maskHeight = (maskHeight ? maskHeight : 0);
		contentWidth = (contentWidth ? contentWidth : 0);
		contentHeight = (contentHeight ? contentHeight : 0);
		$super();
		this._content_width = contentWidth;
		this._content_height = contentHeight;
		this._inset_x = 0;
		this._inset_y = 0;

	},
	/*
	  override
	  returns void
	*/
	initGraphics: function($super)
	{
		$super();
	},

	/*
	  override
	  returns void
	*/
	decorate: function($super)
	{
		$super();
		if (this._dirty_rect)
		{
//			this._scroll_rect./*?Rectangle*/x = this._mask_x;
//			this._scroll_rect./*?Rectangle*/y = this._mask_y;
//			this._scroll_rect./*?Rectangle*/width = this._width + -(this._inset_x * 2);
//			this._scroll_rect./*?Rectangle*/height = this._height + (-this._inset_y * 2);
//			if (this._use_mask)
//				{
//					this.getMidground()./*?Sprite*/x = 0 + this._inset_x;
//					this.getMidground()./*?Sprite*/y = 0 + this._inset_y;
//					this.getMidground()./*?Sprite*/scrollRect = this._scroll_rect;
//				}
//				else
//				{
//					this.getMidground()./*?Sprite*/x = -this._mask_x;
//					this.getMidground()./*?Sprite*/y = -this._mask_y;
//					this.getMidground()./*?Sprite*/scrollRect = null;
//				}
			this._dirty_rect = false;


			this.element.setStyle({ overflow: this._use_mask ? "hidden" : "visible"});
			this.mid.setStyle(
					{
						position		: "absolute",
						left			: this._mask_x+"px",
						top 			: this._mask_y+"px"
						//content height
						//content width
					});

		}
	},

	/*
	  returns Number
	*/
	getMaskX: function()
	{
		return this._mask_x;
	},

	/*
	  returns Number
	*/
	getMaskY: function()
	{
		return this._mask_y;
	},

	/*
	  returns Boolean
	*/
	getUseMask: function()
	{
		return this._use_mask;
	},

	/*
	  returns Number
	*/
	getContentWidth: function()
	{
		return this._content_width;
	},

	/*
	  returns Number
	*/
	getContentHeight: function()
	{
		return this._content_height;
	},

	/*
	  returns Function
	*/
	getContentSizeProvider: function()
	{
		return this._content_size_provider;
	},

	/*
	  param insets Array
	  returns void
	*/
	setInsets: function(insets)
	{
		this._inset_x = insets[0];
		this._inset_y = insets[1];
	},

	/*
	  override
	  param w Number
	  returns void
	*/
	setWidth: function($super, w)
	{
		$super(w);
		this._dirty_rect = true;
	},

	/*
	  override
	  param h Number
	  returns void
	*/
	setHeight: function($super, h)
	{
		$super(h);
		this._dirty_rect = true;
	},

	/*
	  param x Number
	  returns void
	*/
	setMaskX: function(x)
	{
		this._mask_x = x;
		this._dirty_rect = true;
	},

	/*
	  param y Number
	  returns void
	*/
	setMaskY: function(y)
	{
		this._mask_y = y;
		this._dirty_rect = true;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setUseMask: function(b)
	{
		this._use_mask = b;
	},

	/*
	  param w Number
	  returns void
	*/
	setContentWidth: function(w)
	{
		this._content_width = w;
		this._dirty_rect = true;
	},

	/*
	  param h Number
	  returns void
	*/
	setContentHeight: function(h)
	{
		this._content_height = h;
		this._dirty_rect = true;
	},

	/*
	  param f Function
	  returns void
	*/
	setContentSizeProvider: function(f)
	{
		this._content_size_provider = f;
	}

});

/*
  LabelDecorator
  import com_pagesociety_ux_event_ComponentEvent
  import com_pagesociety_ux_style_Style
  import flash_events_TextEvent
  import flash_text_TextFieldAutoSize
  import flash_text_TextFormat
  import flash_text_TextLineMetrics
*/

var com_pagesociety_ux_decorator_LabelDecorator = Class.create( com_pagesociety_ux_decorator_Decorator,
{
	initialize: function($super, style)
	{
		this._style/*Style*/;
		this._label_x = 0/*Number*/;
		this._label_y = 0/*Number*/;
		this._label_width = 0/*Number*/;
		this._label_height = 0/*Number*/;
		this._label_alpha = 1/*Number*/;
//		this._label_text_format = com_pagesociety_ux_decorator_TextFormats.getBLACK_LABEL()/*TextFormat*/;
		this._label_font_style/*String*/;
		this._embedded = false/*Boolean*/;
		this._label_selectable = true/*Boolean*/;
		this._label_max_chars = 8888/*uint*/;
		this._label_text = ""/*String*/;
		this._label_is_multiline = false/*Boolean*/;
//		this._label_align = TextFieldAutoSize./*?TextFieldAutoSize*/NONE/*String*/;
		this._label/*Text*/;
		this._needs_render = true/*Boolean*/;
		$super();
		this._style = style;

	},
	/*
	  override
	  returns void
	*/
	initGraphics: function($super)
	{
		$super();
//		com.pagesociety.ux.decorator.mouseChildren = false;
		this._label = new Element("DIV");
		this.mid.insert(this._label);
	},

	/*
	  override
	  returns void
	*/
	decorate: function($super)
	{
		$super();
		if (!this._needs_render || this._label_text == null)
			return
		this._label.setStyle({
			left: this._label_x+"px",
			top: this._label_y+"px"
		});
//		this._label./*?Text*/width = this._label_width + 5;
//		this._label./*?Text*/height = this._label_height + 5;
//		this._label./*?Text*/maxChars = this._label_max_chars;
//		this._label./*?Text*/alpha = this._label_alpha;
//		if (this._label./*?Text*/autoSize != TextFieldAutoSize./*?TextFieldAutoSize*/CENTER && this._label./*?Text*/autoSize != TextFieldAutoSize./*?TextFieldAutoSize*/RIGHT)
//			this._label./*?Text*/autoSize = this._label_is_multiline ? TextFieldAutoSize./*?TextFieldAutoSize*/LEFT : TextFieldAutoSize./*?TextFieldAutoSize*/NONE
//		this._label./*?Text*/embedFonts = this._embedded;
		if (this._label_selectable)
			this._label.setStyle(
				{
					"-webkit-user-select":"inherit",
					"-moz-user-select":"inherit"
				});
		else
			this._label.setStyle(
				{
					"-webkit-user-select":"none",
					"-moz-user-select":"none"
				});

		if (this.shadowSize!=0)
		{
			var shadow_params = this.int_to_color_string(this.shadowColor) + " " + this.shadowDistance+"px " + this.shadowDistance+"px " + this.shadowSize+"px " ;
			this._label.setStyle(
				{
					"textShadow"	 : shadow_params
				});
		}


		if ( this._label_font_style!=null)//&&this._label.classNames().indexOf ==-1
			this._label.className = ( this._label_font_style);

		this._label.innerHTML = this._label_text;

		this._needs_render = false;
	},

	/*
	  param e TextEvent
	  returns void
	*/
	on_link0: function(e)
	{
	},

	/*
	  returns Text
	*/
	getLabel: function()
	{
		return this._label;
	},

	/*
	  returns Boolean
	*/
	getSelectable: function()
	{
		return this._label_selectable;
	},

	/*
	  override
	  returns Number
	*/
	getWidth: function($super)
	{
		this.decorate();
		return this._label.getWidth();
	},

	/*
	  override
	  returns Number
	*/
	getHeight: function($super)
	{
		this.decorate();
		return this._label.getHeight();
	},

	/*
	  returns Number
	*/
	getDescent: function()
	{
		this.decorate();
		var line_metrics = this._label./*?Text*/getLineMetrics(0);
		return line_metrics./*?TextLineMetrics*/descent;
	},

	/*
	  returns Number
	*/
	getAscent: function()
	{
		this.decorate();
		var line_metrics = this._label./*?Text*/getLineMetrics(0);
		return line_metrics./*?TextLineMetrics*/ascent;
	},

	/*
	  returns String
	*/
	getLabelText: function()
	{
		return this._label_text;
	},

	/*
	  returns Number
	*/
	getLabelX: function()
	{
		return this._label_x;
	},

	/*
	  returns Number
	*/
	getLabelY: function()
	{
		return this._label_y;
	},

	/*
	  returns Boolean
	*/
	getLabelIsMultiLine: function()
	{
		return this._label_is_multiline;
	},

	/*
	  returns String
	*/
	getFontStyle: function()
	{
		return this._label_font_style;
	},

	/*
	  returns Boolean
	*/
	getEmbedded: function()
	{
		return this._embedded;
	},

	/*
	  returns Boolean
	*/
	getNeedsRender: function()
	{
		return this._needs_render;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setSelectable: function(b)
	{
		if (b == this._label_selectable)
			return
		this._label_selectable = b;
		this._needs_render = true;
	},

	/*
	  override
	  param w Number
	  returns void
	*/
	setWidth: function($super, w)
	{
		if (w == this._label_width)
			return
		$super(w);
		this._label_width = w;
		this._needs_render = true;
	},

	/*
	  override
	  param h Number
	  returns void
	*/
	setHeight: function($super, h)
	{
		if (h == this._label_height)
			return
		$super(h);
		this._label_height = h;
		this._needs_render = true;
	},

	/*
	  param s String
	  returns void
	*/
	setLabelText: function(s)
	{
		if (s == this._label_text)
			return
		this._label_text = s;
		this._needs_render = true;
	},

	/*
	  param s Number
	  returns void
	*/
	setLabelX: function(s)
	{
		if (s == this._label_x)
			return
		this._label_x = s;
		this._needs_render = true;
	},

	/*
	  param s Number
	  returns void
	*/
	setLabelY: function(s)
	{
		if (s == this._label_y)
			return
		this._label_y = s;
		this._needs_render = true;
	},

	/*
	  param t TextFormat
	  returns void
	*/
	setLabelTextFormat: function(t)
	{
//		if (t == this._label_text_format)
//			return
//		this._label_text_format = t;
//		this._needs_render = true;
		throw new Error("NO TEXT FORMAT HERE")
	},

	/*
	  param b Boolean
	  returns void
	*/
	setLabelIsMultiLine: function(b)
	{
		if (b == this._label_is_multiline)
			return
		this._label_is_multiline = b;
		this._needs_render = true;
	},

	/*
	  param s String
	  returns void
	*/
	setFontStyle: function(s)
	{
//		if (s.substr(0, 1) == ".")
//			s = s.substring(1);
		if (s == this._label_font_style)
			return
		this._label_font_style = s;
		this._needs_render = true;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setEmbedded: function(b)
	{
		if (b == this._embedded)
			return
		this._embedded = b;
		this._needs_render = true;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setNeedsRender: function(b)
	{
		this._needs_render = b;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setLinkEnabled: function(b)
	{
//		if (b && !this._label./*?Text*/hasEventListener(TextEvent./*?TextEvent*/LINK))
//		{
//			com.pagesociety.ux.decorator.mouseChildren = true;
//			this._label./*?Text*/addEventListener(TextEvent./*?TextEvent*/LINK, this.on_link0.bind(this));
//		}
//		else
//			if (!b && this._label./*?Text*/hasEventListener(TextEvent./*?TextEvent*/LINK))
//			{
//				com.pagesociety.ux.decorator.mouseChildren = false;
//				this._label./*?Text*/removeEventListener(TextEvent./*?TextEvent*/LINK, this.on_link0.bind(this));
//			}
	}

});

/*
  ImageDecorator
  import com_pagesociety_ux_event_ResourceEvent

*/

var com_pagesociety_ux_decorator_ImageDecorator = Class.create( com_pagesociety_ux_decorator_MaskedDecorator,
{
	initialize: function($super)
	{
		this._image_src/*String*/;
		this._image_scaling_type = com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_NONE/*uint*/;
		this._image_scaling_cue = null/*Object*/;
		this._loaded/*Boolean*/;
		this._last_loaded_src/*String*/;
		this._loaded_img_width/*Number*/;
		this._loaded_img_height/*Number*/;
		this._smoothing/*Boolean*/;
		this._img_loader/*Element IMG*/;
		this._loaded_img/*DisplayObject*/;
		//this._loaded_img_bm/*Bitmap*/;
		//this._mask_rect/*Shape*/;
		this._progress_sprite/*Sprite*/;
		this._outline/*Sprite*/;
		//this._sim_bitmap/*Bitmap*/;
		this._bitmap/*Bitmap*/;
		this.tp/*Timer*/;
		this.t0/*Timer*/;
		this._killing = false/*Boolean*/;
		$super();

	},
	/*
	  override
	  returns void
	*/
	initGraphics: function($super)
	{
		$super();

		this._img_loader;
		this._progress_sprite = new Element("DIV");
		this._progress_sprite.setStyle({ visibility	: "hidden" });
		this.element.insert(this._progress_sprite);

		this._img_loader = new Image();
		this._img_loader.onload = this.on_complete.bind(this);
		this._img_loader.onerror = this.on_io_error.bind(this);
		//this._img_loader.onprogress = this.on_progress.bind(this);
		//this._img_loader.onabort = this.on_unload.bind(this);
		this.mid.insert(this._img_loader);

		this._loaded = false;
	},

	/*
	  override
	  returns void
	*/
	decorate: function($super)
	{
		if(!this._img_loader)
			return;
		$super();

		if (this._image_src  && this._image_src != this._last_loaded_src)
		{
			this._img_loader.setStyle({ visibility	: "hidden" });
			this._progress_sprite.setStyle({ visibility	: "visible" });

			this.update_mask_size();
			this._last_loaded_src = this._image_src;
			//
			//com_pagesociety_ux_decorator_ImageDecorator.QUEUE_LOAD(this._img_loader, this._last_loaded_src, this);
			this.on_progress(null);
			this._img_loader.src =  this._image_src
		}
		else
		if (this._image_src == null)
		{
			this.setGeneratingPreview(true);
		}
		else
		{
			this.update_size();
		}
	},



	/*
	  returns void
	*/
	update_size: function()
	{
		if (this._loaded_img == null)
			return
//		this._loaded_img./*?DisplayObject*/x = 0;
//		this._loaded_img./*?DisplayObject*/y = 0;
//		this._loaded_img./*?DisplayObject*/width = this._loaded_img_width;
//		this._loaded_img./*?DisplayObject*/height = this._loaded_img_height;
//		this._loaded_img./*?DisplayObject*/scaleX = 1;
//		this._loaded_img./*?DisplayObject*/scaleY = 1;

		//this.getMidground()./*?Sprite*/graphics./*?graphics*/clear();

		var w = this.width;
		var h = this.height;
		var iw = this._loaded_img_width;
		var ih = this._loaded_img_height;

		if (iw==0 || ih==0)
			return;

		var sx = w/iw;
		var sy = h/ih;

		var sw, sh, xo, yo;

		switch (this._image_scaling_type)
		{
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_NONE:
			sw = iw;
			sh = ih;
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_FIT:
			if ( sx < sy )
			{
				sw = iw*sx;
				sh = ih*sx;
			}
			else
			{
				sw = iw*sy;
				sh = ih*sy;
			}
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_FIT_HEIGHT:
			sw = iw*sy;
			sh = ih*sy;
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_FIT_STRETCH:
			throw new Error("UNHANDLED - ImageDecorator.IMAGE_SCALING_VALUE_FIT_STRETCH ");
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK:
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_ALIGN_CENTER:
			throw new Error("UNHANDLED - ImageScalingType.IMAGE_SCALING_VALUE_MASK_ALIGN_CENTER ");
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_ALIGN_TOP_LEFT:
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FIT_WIDTH_ALIGN_TOP:
			throw new Error("UNHANDLED - ImageScalingType.IMAGE_SCALING_VALUE_MASK_FIT_WIDTH_ALIGN_TOP ");
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FIT_WIDTH_ALIGN_CENTER:
			throw new Error("UNHANDLED - ImageScalingType.IMAGE_SCALING_VALUE_MASK_FIT_WIDTH_ALIGN_CENTER ");
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FIT_WIDTH_ALIGN_BOTTOM:
			throw new Error("UNHANDLED - ImageScalingType.IMAGE_SCALING_VALUE_MASK_FIT_WIDTH_ALIGN_BOTTOM ");
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FIT_HEIGHT_ALIGN_LEFT:
			throw new Error("UNHANDLED - ImageScalingType.IMAGE_SCALING_VALUE_MASK_FIT_HEIGHT_ALIGN_LEFT ");
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FIT_HEIGHT_ALIGN_CENTER:
			throw new Error("UNHANDLED - ImageScalingType.IMAGE_SCALING_VALUE_MASK_FIT_HEIGHT_ALIGN_CENTER ");
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FIT_HEIGHT_ALIGN_RIGHT:
			throw new Error("UNHANDLED - ImageScalingType.IMAGE_SCALING_VALUE_MASK_FIT_HEIGHT_ALIGN_CENTER ");
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_REPEAT_VALUE_XY:
			throw new Error("UNHANDLED - ImageScalingType.IMAGE_REPEAT_VALUE_XY ");
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_REPEAT_VALUE_X:
			throw new Error("UNHANDLED - ImageScalingType.IMAGE_REPEAT_VALUE_X ");
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_REPEAT_VALUE_Y:
			throw new Error("UNHANDLED - ImageScalingType.IMAGE_REPEAT_VALUE_Y ");
			break;
		case com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FULL_BLEED:
			if ( sx > sy )
			{
				sw = iw*sx;
				sh = ih*sx;
			}
			else
			{
				sw = iw*sy;
				sh = ih*sy;
			}
			break;
		}
		this.xo = 0;
		this.yo = 0;
		if (this._image_scaling_type >= com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK)
		{
			this.xo = Math.floor((w-sw)/2);
			this.yo = Math.floor((h-sh)/2);
		}
		this.imageWidth = sw;
		this.imageHeight = sh;

		this._loaded_img.setStyle(
		{
			position		: "absolute",
			top 			: this.yo+"px",
			left			: this.xo+"px",
			width 			: this.imageWidth+"px",
			height 			: this.imageHeight+"px"
		});

		this.update_mask_size();
		this.update_outline();
	},




	/*
	  returns void
	*/
	full_bleed: function()
	{
		if (this._image_scaling_cue == null)
		{
			this._loaded_img./*?DisplayObject*/y = (this.getHeight() - this._loaded_img./*?DisplayObject*/height) / 2;
		}
		else
		if (this._image_scaling_cue./*?Object*/indexOf("crop bottom") != -1 || this._image_scaling_cue./*?Object*/indexOf("show top") != -1)
		{
			this._loaded_img./*?DisplayObject*/y = 0;
		}
		else
		if (this._image_scaling_cue./*?Object*/indexOf("crop top") != -1 || this._image_scaling_cue./*?Object*/indexOf("show bottom") != -1)
		{
			this._loaded_img./*?DisplayObject*/y = this.getHeight() - this._loaded_img./*?DisplayObject*/height;
		}
		else
		if (this._image_scaling_cue./*?Object*/indexOf("crop left") != -1 || this._image_scaling_cue./*?Object*/indexOf("show right") != -1)
		{
			this._loaded_img./*?DisplayObject*/x = this.getWidth() - this._loaded_img./*?DisplayObject*/width;
		}
		else
		if (this._image_scaling_cue./*?Object*/indexOf("crop right") != -1 || this._image_scaling_cue./*?Object*/indexOf("show left") != -1)
		{
			this._loaded_img./*?DisplayObject*/x = 0;
		}
		else
		{
			this._loaded_img./*?DisplayObject*/y = (this.getHeight() - this._loaded_img./*?DisplayObject*/height) / 2;
		}
	},

	/*
	  returns void
	*/
	update_mask_size: function()
	{
		this._use_mask = (this._image_scaling_type >= com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK);
	},

	/*
	  returns void
	*/
	update_outline: function()
	{
//		var g = this._outline./*?Sprite*/graphics;
//		g./*?Graphics*/clear();
//		if (this._bg./*?Box*/borderVisible)
//		{
//			g./*?Graphics*/lineStyle(this._bg./*?Box*/borderThickness, this._bg./*?Box*/borderColor, this._bg./*?Box*/borderAlpha, false, flash.display.LineScaleMode./*?LineScaleMode*/NORMAL, flash.display.CapsStyle./*?CapsStyle*/SQUARE, flash.display.JointStyle./*?JointStyle*/MITER, 3);
//			g./*?Graphics*/drawRect(this.getImageX(), this.getImageY(), this.getImageWidth(), this.getImageHeight());
//		}
	},

	/*
	  returns void
	*/
	setup_repeat: function()
	{
//		if (this.getHas_repeat())
//			return
//		var bmd = new flash.display.BitmapData(this._loaded_img./*?DisplayObject*/width, this._loaded_img./*?DisplayObject*/height);
//		bmd./*?BitmapData*/draw(this._loaded_img);
//		this._loaded_img_bm = new flash.display.Bitmap(bmd);
//		this.getMidground()./*?Sprite*/removeChild(this._loaded_img);
	},

	/*
	  returns void
	*/
	destroy_repeat: function()
	{
//		if (!this.getHas_repeat())
//			return
//		this.getMidground()./*?Sprite*/graphics./*?graphics*/clear();
//		this._loaded_img_bm./*?Bitmap*/bitmapData./*?bitmapData*/dispose();
//		this._loaded_img_bm = null;
//		this.getMidground()./*?Sprite*/addChild(this._loaded_img);
	},

	/*
	  override
	  returns void
	*/
	destroy: function($super)
	{
		if (com_pagesociety_ux_decorator_ImageDecorator.DEBUG)
			Logger.log("DESTROY " + this);
//		com_pagesociety_ux_decorator_ImageDecorator.QUEUE_REMOVE(this);
		this._last_loaded_src = null;
		if (this._img_loader)
		{
			this.kill_image_loader();
		}


		$super();
	},

	/*
	  param b Bitmap
	  returns void
	*/
	load_bitmap: function(b)
	{
//		this.tp = new Timer(20);
//		var p = 0;
//		this.tp./*?Timer*/addEventListener(TimerEvent./*?TimerEvent*/TIMER, function (e)
//	{
//						this.setProgress(p);
//						p += .1;
//	});
//		this.tp./*?Timer*/start();
//		this.t0 = new Timer(200, 1);
//		this.t0./*?Timer*/addEventListener(TimerEvent./*?TimerEvent*/TIMER, function (e)
//	{
//						this._loaded_img_width = b./*?Bitmap*/width;
//						this._loaded_img_height = b./*?Bitmap*/height;
//						this.getMidground()./*?Sprite*/addChild(b);
//						this.getMidground()./*?Sprite*/visible = true;
//						this._progress_sprite./*?Sprite*/visible = false;
//						this._loaded_img = com.pagesociety.ux.decorator.midground;
//						this._loaded = true;
//						this.update_size();
//						this.tp./*?Timer*/stop();
//						com.pagesociety.ux.decorator.dispatchEvent(new com_pagesociety_ux_event_ResourceEvent(com_pagesociety_ux_event_ResourceEvent.LOAD_RESOURCE, null));
//	});
//		this.t0./*?Timer*/start();
		throw new Error("Bitmap not supported");
	},

	/*
	  param event Event
	  returns void
	*/
	on_complete: function(event)
	{
		if (this._img_loader == null)
			return;

		this._img_loader.setStyle({ visibility	: "visible" });
		this._progress_sprite.setStyle({ visibility	: "hidden" });

		this._loaded_img_width = this._img_loader.getWidth();
		this._loaded_img_height = this._img_loader.getHeight();
		if (this._loaded_img_width==0)
		{
//			alert("!");
//			Logger.log("IMAGE WIDTH = 0!!")
//			com_pagesociety_ux_decorator_ImageDecorator.QUEUE_COMPLETE(this);
//			this._last_loaded_src = null;
//			this.decorate();
//			return;
			setTimeout(this.on_complete.bind(this),100);
			return;
		}

		if (com_pagesociety_ux_decorator_ImageDecorator.DEBUG)
		{
			Logger.log("ImageDecorator.on_complete ");
			Logger.log(this._img_loader);
		}

		this._loaded_img = this._img_loader;
		this._loaded = true;
		this.component.render();
		//com_pagesociety_ux_decorator_ImageDecorator.QUEUE_COMPLETE(this);
		this.dispatchEvent(new com_pagesociety_ux_event_ResourceEvent(com_pagesociety_ux_event_ResourceEvent.LOAD_RESOURCE, null));
	},

	/*
	  param event HTTPStatusEvent
	  returns void
	*/
	on_http_status: function(event)
	{
	},

	/*
	  param event Event
	  returns void
	*/
	on_init: function(event)
	{
	},

	/*
	  param event IOErrorEvent
	  returns void
	*/
	on_io_error: function(event)
	{
		this._last_loaded_src = null;
		this._image_src = null;
		this.dispatchEvent(new com_pagesociety_ux_event_ResourceEvent(com_pagesociety_ux_event_ResourceEvent.LOAD_ERROR, null));
		//com_pagesociety_ux_decorator_ImageDecorator.QUEUE_COMPLETE(this);
	},

	/*
	  param event Event
	  returns void
	*/
	on_open: function(event)
	{
	},

	/*
	  param event ProgressEvent
	  returns void
	*/
	on_progress: function(event)
	{
		var p = (event == null || event./*?ProgressEvent*/bytesTotal == 0) ? 0 : (event./*?ProgressEvent*/bytesLoaded / event./*?ProgressEvent*/bytesTotal);
		this.setProgress(p);
	},

	/*
	  param event Event
	  returns void
	*/
	on_unload: function(event)
	{
		//com_pagesociety_ux_decorator_ImageDecorator.QUEUE_REMOVE(this);
		this.kill_image_loader();
	},

	/*
	  returns void
	*/
	kill_image_loader: function()
	{
		if (this._killing)
			return
		this._killing = true;
		this._img_loader.src = null;
//		this._img_loader./*?Loader*/contentLoaderInfo./*?contentLoaderInfo*/removeEventListener(Event./*?Event*/COMPLETE, this.on_complete.bind(this));
//		this._img_loader./*?Loader*/contentLoaderInfo./*?contentLoaderInfo*/removeEventListener(ProgressEvent./*?ProgressEvent*/PROGRESS, this.on_progress.bind(this));
//		this._img_loader./*?Loader*/contentLoaderInfo./*?contentLoaderInfo*/removeEventListener(IOErrorEvent./*?IOErrorEvent*/IO_ERROR, this.on_io_error.bind(this));
//		this._img_loader./*?Loader*/contentLoaderInfo./*?contentLoaderInfo*/removeEventListener(Event./*?Event*/UNLOAD, this.on_unload.bind(this));
//		try
//		{
//			this._img_loader./*?Loader*/close();
//		}
//		catch (e)
//		{
//		}
//		try
//		{
//			this._img_loader./*?Loader*/unload();
//		}
//		catch (e)
//		{
//		}
//		var b = flash.display.Bitmap(this._img_loader./*?Loader*/content);
//		if (b != null)
//			b./*?Bitmap*/bitmapData./*?bitmapData*/dispose()
//		while (this._mid./*?Sprite*/numChildren != 0)
//			this._mid./*?Sprite*/removeChildAt(0)
		this._img_loader = null;
	},

	/*
	  override
	  returns DisplayObject
	*/
	getDisplayObject: function($super)
	{
		return this._loaded_img;
	},

	/*
	  returns Bitmap
	*/
	getBitmap: function()
	{
		return this._bitmap;
	},

	/*
	  returns Boolean
	*/
	getHas_repeat: function()
	{
		return this._loaded_img_bm != null;
	},

	/*
	  returns String
	*/
	getImageSrc: function()
	{
		return this._image_src;
	},

	/*
	  returns uint
	*/
	getImageScalingType: function()
	{
		return this._image_scaling_type;
	},

	/*
	  returns Number
	*/
	getImageX: function()
	{
		if (this._loaded_img != null)
			return this.xo;
		else
			return 0
	},

	/*
	  returns Number
	*/
	getImageY: function()
	{
		if (this._loaded_img != null)
			return this.yo;
		else
			return 0
	},

	/*
	  returns Number
	*/
	getImageWidth: function()
	{

			if (this._loaded_img != null)
				return this.imageWidth;
			else
				return 0
	},

	/*
	  returns Number
	*/
	getImageHeight: function()
	{
			if (this._loaded_img != null)
				return this.imageHeight;
			else
				return 0
	},

	/*
	  returns Boolean
	*/
	getSmoothing: function()
	{
		return this._smoothing;
	},

	/*
	  param s String
	  returns void
	*/
	setImageSrc: function(s)
	{
		if (this._img_loader != null)
			$(this._img_loader).setStyle({ visibility	: "hidden" });
		if (this._progress_sprite != null)
			this._progress_sprite.setStyle({ visibility	: "hidden" });
		this._image_src = s;
		this.setProgress(0);
		this._loaded_img = null;
		this.destroy_repeat();
	},

	/*
	  param t uint
	  returns void
	*/
	setImageScalingType: function(t)
	{
		this.destroy_repeat();
		this._image_scaling_type = t;
	},

	/*
	  param o Object
	  returns void
	*/
	setImageScalingCue: function(o)
	{
		this._image_scaling_cue = o;
	},

	/*
	  param b Boolean
	  returns void
	*/
	setSmoothing: function(b)
	{
		this._smoothing = b;
	},

	/*
	  param b Bitmap
	  returns void
	*/
	setBitmap: function(b)
	{
		this._sim_bitmap = b;
	},

	/*
	  param p Number
	  returns void
	*/
	setProgress: function(p)
	{
//		var g = this._progress_sprite./*?Sprite*/graphics;
//		g./*?Graphics*/clear();
//		g./*?Graphics*/beginFill(0x777777, .1);
//		g./*?Graphics*/drawRect(0, 0, this.getWidth(), this.getHeight());
//		g./*?Graphics*/endFill();
//		g./*?Graphics*/beginFill(0xffffff, .3);
//		g./*?Graphics*/drawRect(0, 0, this.getWidth() * p, this.getHeight());
//		g./*?Graphics*/endFill();
	},

	/*
	  param b Boolean
	  returns void
	*/
	setGeneratingPreview: function(b)
	{
		if (this.getWidth() == 0 || this.getHeight() == 0)
			return ;
//		this._progress_sprite./*?Sprite*/visible = true;
//		var g = this._progress_sprite./*?Sprite*/graphics;
//		g./*?Graphics*/clear();
//		g./*?Graphics*/beginFill(0x777777, .15);
//		g./*?Graphics*/drawRect(0, 0, this.getWidth(), this.getHeight());
//		g./*?Graphics*/endFill();
//		g./*?Graphics*/lineStyle(4, 0x444444, .35, true, LineScaleMode./*?LineScaleMode*/NORMAL, CapsStyle./*?CapsStyle*/ROUND);
//		var x;
//		for (x = 0; x < this.getWidth() / 2 && x < this.getHeight() / 2; x += 10)
//		{
//			g./*?Graphics*/drawRect(x, x, this.getWidth() - x * 2, this.getHeight() - x * 2);
//		}
	}

});

com_pagesociety_ux_decorator_ImageDecorator.DEBUG = false;
com_pagesociety_ux_decorator_ImageDecorator.CHECK_POLICY_FILE = true;
com_pagesociety_ux_decorator_ImageDecorator._QUEUE = [  ];
com_pagesociety_ux_decorator_ImageDecorator._QUEUE_LOAD_COUNT = 0;
com_pagesociety_ux_decorator_ImageDecorator._QINIT = 0;
com_pagesociety_ux_decorator_ImageDecorator._QLOADING = 1;
com_pagesociety_ux_decorator_ImageDecorator._QUEUE_MAX_SIMULATANEOUS_LOAD = 4;
com_pagesociety_ux_decorator_ImageDecorator._QUEUE_TIMER;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_NONE = 0;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_FIT = 1;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_FIT_STRETCH = 2;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_FIT_OR_SHRINK = 3;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_FIT_OR_SHRINK_ALIGN_CENTER = 4;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_FIT_OR_SHRINK_ALIGN_LEFT_CENTER = 5;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_FIT_HEIGHT = 6;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_REPEAT_VALUE_XY = 910;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_REPEAT_VALUE_X = 911;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_REPEAT_VALUE_Y = 912;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK = 802;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_ALIGN_CENTER = 803;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_ALIGN_TOP_LEFT = 804;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FIT_WIDTH_ALIGN_TOP = 805;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FIT_WIDTH_ALIGN_CENTER = 806;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FIT_WIDTH_ALIGN_BOTTOM = 807;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FIT_HEIGHT_ALIGN_LEFT = 808;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FIT_HEIGHT_ALIGN_CENTER = 809;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FIT_HEIGHT_ALIGN_RIGHT = 810;
com_pagesociety_ux_decorator_ImageDecorator.IMAGE_SCALING_VALUE_MASK_FULL_BLEED = 811;
	/*
	  param loader Loader
	  param url_req URLRequest
	  param image_decorator ImageDecorator
	  returns void
	*/
com_pagesociety_ux_decorator_ImageDecorator.QUEUE_LOAD = function(loader, url_req, image_decorator)
	{
		com_pagesociety_ux_decorator_ImageDecorator._QUEUE.push({ loader : loader, url : url_req, decorator : image_decorator, state : com_pagesociety_ux_decorator_ImageDecorator._QINIT });
		com_pagesociety_ux_decorator_ImageDecorator.START_QUEUE();
	};
	/*
	  returns void
	*/
com_pagesociety_ux_decorator_ImageDecorator.START_QUEUE = function()
	{
		if (com_pagesociety_ux_decorator_ImageDecorator._QUEUE_TIMER == null)
		{
			com_pagesociety_ux_decorator_ImageDecorator._QUEUE_TIMER = new Timer(100);
			com_pagesociety_ux_decorator_ImageDecorator._QUEUE_TIMER.addEventListener(TimerEvent.TIMER, com_pagesociety_ux_decorator_ImageDecorator.ON_QUEUE_TIMER);
		}
		com_pagesociety_ux_decorator_ImageDecorator._QUEUE_TIMER.start();
	};
	/*
	  returns void
	*/
com_pagesociety_ux_decorator_ImageDecorator.STOP_QUEUE = function()
	{
		com_pagesociety_ux_decorator_ImageDecorator._QUEUE_TIMER.stop();
	};
	/*
	  param e TimerEvent
	  returns void
	*/
com_pagesociety_ux_decorator_ImageDecorator.ON_QUEUE_TIMER = function(e)
	{
		com_pagesociety_ux_decorator_ImageDecorator.QUEUE_DO_LOAD();
	};
	/*
	  returns void
	*/
com_pagesociety_ux_decorator_ImageDecorator.QUEUE_DO_LOAD = function()
	{
		var i;
		var n;
		if (com_pagesociety_ux_decorator_ImageDecorator.DEBUG)
		{
			//Logger.log("QUEUE LENGTH= " + com_pagesociety_ux_decorator_ImageDecorator._QUEUE.length);
			for (i = 0; i < com_pagesociety_ux_decorator_ImageDecorator._QUEUE.length; i++)
				{
					n = com_pagesociety_ux_decorator_ImageDecorator._QUEUE[i];
					var ss = (n.state == 0) ? "init" : "load";
					//Logger.log(i + ". "+ss);
				}
		}
		var s = com_pagesociety_ux_decorator_ImageDecorator._QUEUE_MAX_SIMULATANEOUS_LOAD - com_pagesociety_ux_decorator_ImageDecorator._QUEUE_LOAD_COUNT;
		if (s == 0 || com_pagesociety_ux_decorator_ImageDecorator._QUEUE.length == 0)
		{
			com_pagesociety_ux_decorator_ImageDecorator.STOP_QUEUE();
			return ;
		}
		for (i = 0; i < s && i < com_pagesociety_ux_decorator_ImageDecorator._QUEUE.length; i++)
		{
			n = com_pagesociety_ux_decorator_ImageDecorator._QUEUE[i];
			if (n.state != com_pagesociety_ux_decorator_ImageDecorator._QINIT)
					continue;
			n.state = com_pagesociety_ux_decorator_ImageDecorator._QLOADING;

			//var lc = new LoaderContext();
			//lc.checkPolicyFile = com_pagesociety_ux_decorator_ImageDecorator.CHECK_POLICY_FILE;
			//n.loader.load(n.url, lc);
			//n.loader.src = "";
			//n.loader.removeAttribute("width");
			//n.loader.removeAttribute("height");
			//n.loader.setStyle({width:"auto",height:"auto"});
			n.loader.src = n.url;//+"?q="+Math.random();
			if (com_pagesociety_ux_decorator_ImageDecorator.DEBUG)
			{
				Logger.log("ImageDecorator.QUEUE DO LOAD ");
				Logger.log(n.loader+" "+n.loader.src);
			}

			com_pagesociety_ux_decorator_ImageDecorator._QUEUE_LOAD_COUNT++;
			s--;
		}
	};
	/*
	  param dec ImageDecorator
	  returns void
	*/
com_pagesociety_ux_decorator_ImageDecorator.QUEUE_COMPLETE = function(dec)
	{
		if (com_pagesociety_ux_decorator_ImageDecorator.DEBUG)
		{
			Logger.log("ImageDecorator.QUEUE COMPLETE ");
			Logger.log(dec);
		}
		com_pagesociety_ux_decorator_ImageDecorator.QUEUE_REMOVE(dec);
		com_pagesociety_ux_decorator_ImageDecorator.START_QUEUE();
	};
	/*
	  param dec ImageDecorator
	  returns void
	*/
com_pagesociety_ux_decorator_ImageDecorator.QUEUE_REMOVE = function(dec)
	{
		for (var i = 0; i < com_pagesociety_ux_decorator_ImageDecorator._QUEUE.length; i++)
		{
			if (com_pagesociety_ux_decorator_ImageDecorator._QUEUE[i].decorator == dec)
				{
					com_pagesociety_ux_decorator_ImageDecorator._QUEUE.splice(i, 1);
					com_pagesociety_ux_decorator_ImageDecorator._QUEUE_LOAD_COUNT--;
					if (com_pagesociety_ux_decorator_ImageDecorator.DEBUG)
							Logger.log("QUEUE REMOVED 1");
					return ;
				}
		}
		if (com_pagesociety_ux_decorator_ImageDecorator.DEBUG)
			Logger.log("NOT IN QUEUE ");
	};
/*
  ScrollingDecorator
  import flash_display_DisplayObject
  import flash_display_Sprite
  import flash_events_MouseEvent
*/

var com_pagesociety_ux_decorator_ScrollingDecorator = Class.create( com_pagesociety_ux_decorator_MaskedDecorator,
{
	initialize: function($super, scroll_type)
	{
		this._scroll_type/*String*/;
		scroll_type = (scroll_type ? scroll_type : null);
		SUPER();
		this._scroll_type = scroll_type == null ? com_pagesociety_ux_decorator_ScrollingDecorator.SCROLL_TYPE_VALUE_VERTICAL : scroll_type;

	},
	/*
	  returns Boolean
	*/
	scrollsHorizontally: function()
	{
		return this._scroll_type == com_pagesociety_ux_decorator_ScrollingDecorator.SCROLL_TYPE_VALUE_HORIZONTAL || this._scroll_type == com_pagesociety_ux_decorator_ScrollingDecorator.SCROLL_TYPE_VALUE_BOTH;
	},

	/*
	  returns Boolean
	*/
	scrollsVertically: function()
	{
		return this._scroll_type == com_pagesociety_ux_decorator_ScrollingDecorator.SCROLL_TYPE_VALUE_VERTICAL || this._scroll_type == com_pagesociety_ux_decorator_ScrollingDecorator.SCROLL_TYPE_VALUE_BOTH;
	},

	/*
	  param h Number
	  param v Number
	  returns void
	*/
	setScrollOffset: function(h, v)
	{
		this.scroll_vertical(v);
		this.scroll_horizontal(h);
	},

	/*
	  param y Number
	  returns void
	*/
	scroll_vertical: function(y)
	{
		this.setMaskY(y);
	},

	/*
	  param y Number
	  returns void
	*/
	setScrollVertical: function(y)
	{
		this.scroll_vertical(y);
		this.decorate();
	},

	/*
	  returns Number
	*/
	getScrollVertical: function()
	{
		return this._mask_y;
	},

	/*
	  param y Number
	  returns Boolean
	*/
	isDisplayingVertical: function(y)
	{
		if (y < this.getScrollVertical())
			return false
		if (y > this.getScrollVertical() + this._height)
			return false
		return true;
	},

	/*
	  param x Number
	  returns void
	*/
	scroll_horizontal: function(x)
	{
		this.setMaskX(x);
	},

	/*
	  param x Number
	  returns void
	*/
	setScrollHorizontal: function(x)
	{
		this.scroll_horizontal(x);
		this.decorate();
	},

	/*
	  returns Number
	*/
	getScrollHorizontal: function()
	{
		return this._mask_x;
	},

	/*
	  param x Number
	  returns Boolean
	*/
	isDisplayingHorizontal: function(x)
	{
		if (x < this.getScrollHorizontal())
			return false
		if (x > this.getScrollHorizontal() + this._width)
			return false
		return true;
	}

});

com_pagesociety_ux_decorator_ScrollingDecorator.SCROLL_TYPE_VALUE_VERTICAL = "vertical";
com_pagesociety_ux_decorator_ScrollingDecorator.SCROLL_TYPE_VALUE_HORIZONTAL = "horizontal";
com_pagesociety_ux_decorator_ScrollingDecorator.SCROLL_TYPE_VALUE_BOTH = "both";
/*
  ComponentEvent
  import com_pagesociety_ux_component_Component
  import flash_events_Event
*/

var com_pagesociety_ux_event_ComponentEvent = Class.create(
{
	initialize: function(type, component, data, bubbles, cancelable)
	{
		this.component/*Component*/;
		this.data/***/;
		component = (component ? component : null);
		data = (data ? data : null);
		bubbles = (bubbles ? bubbles : true);
		cancelable = (cancelable ? cancelable : false);
		this.type = type;
		this.component = component;
		this.data = data;
		this.bubbles = bubbles;
		this.cancelable = cancelable;

	},
	/*
	  override
	  returns Event
	*/
	clone: function($super)
	{
		return new com_pagesociety_ux_event_ComponentEvent(this.type, this.component, this.data, this.bubbles, this.cancelable);
	}

});

com_pagesociety_ux_event_ComponentEvent.CHANGE_VALUE = "change_value";
com_pagesociety_ux_event_ComponentEvent.CHANGE_SIZE = "change_size";
com_pagesociety_ux_event_ComponentEvent.OK = "ok";
com_pagesociety_ux_event_ComponentEvent.READY = "ready";
com_pagesociety_ux_event_ComponentEvent.CANCEL = "cancel";
com_pagesociety_ux_event_ComponentEvent.BACK = "back";
com_pagesociety_ux_event_ComponentEvent.PREVIOUS = "previous";
com_pagesociety_ux_event_ComponentEvent.NEXT = "next";
com_pagesociety_ux_event_ComponentEvent.LINK = "link";
com_pagesociety_ux_event_ComponentEvent.CLICK = "click";
com_pagesociety_ux_event_ComponentEvent.DOUBLE_CLICK = "double_click";
com_pagesociety_ux_event_ComponentEvent.MOUSE_OVER = "mouse_over";
com_pagesociety_ux_event_ComponentEvent.MOUSE_OUT = "mouse_out";
com_pagesociety_ux_event_ComponentEvent.MOUSE_MOVE = "mouse_move";
com_pagesociety_ux_event_ComponentEvent.ROLL_OVER = "roll_over";
com_pagesociety_ux_event_ComponentEvent.ROLL_OUT = "roll_out";
com_pagesociety_ux_event_ComponentEvent.MOUSE_DOWN = "mouse_down";
com_pagesociety_ux_event_ComponentEvent.MOUSE_RELEASE = "mouse_release";
com_pagesociety_ux_event_ComponentEvent.DRAG = "drag";
com_pagesociety_ux_event_ComponentEvent.DRAG_START = "drag_start";
com_pagesociety_ux_event_ComponentEvent.DRAG_STOP = "drag_stop";
/*
  ResourceEvent
  import com_pagesociety_ux_component_Component
*/

var com_pagesociety_ux_event_ResourceEvent = Class.create( com_pagesociety_ux_event_ComponentEvent,
{
	initialize: function($super, type, component, bubbles, cancelable)
	{
		bubbles = (bubbles ? bubbles : false);
		cancelable = (cancelable ? cancelable : false);
		$super(type, component, bubbles, cancelable);
	}
});

com_pagesociety_ux_event_ResourceEvent.LOAD_RESOURCES = "load_resources";
com_pagesociety_ux_event_ResourceEvent.LOAD_RESOURCE = "load_resource";
com_pagesociety_ux_event_ResourceEvent.LOAD_ERROR = "load_error";
/*
  SelectionEvent
  import com_pagesociety_ux_component_Component
*/

var com_pagesociety_ux_event_SelectionEvent = Class.create( com_pagesociety_ux_event_ComponentEvent,
{
	initialize: function($super, type, component, data, bubbles, cancelable)
	{
		this._data/*Object*/;
		bubbles = (bubbles ? bubbles : true);
		cancelable = (cancelable ? cancelable : false);
		$super(type, component, data, bubbles, cancelable);

	}
});

com_pagesociety_ux_event_SelectionEvent.SELECT = "select";
/*
  FlowLayout
  import com_pagesociety_ux_Margin
  import com_pagesociety_ux_component_Component
  import com_pagesociety_ux_component_Container
*/

var com_pagesociety_ux_layout_FlowLayout = Class.create(
{
	initialize: function(type, params)
	{
		this._type/*uint*/;
		this._x = 0/*Number*/;
		this._y = 0/*Number*/;
		this._cell_width = 0/*Number*/;
		this._cell_height = 0/*Number*/;
		this._margin/*Margin*/;
		this._current_container/*Container*/;
		this._invisible_components_in_flow = false/*Boolean*/;
		params = (params ? params : null);
		this._type = type;
		this._margin = new com_pagesociety_ux_Margin(0, 0, 0, 0);
		if (params != null)
		{
			if (params.cellWidth != null)
					this.setCellWidth(params.cellWidth);
			if (params.cellHeight != null)
					this.setCellHeight(params.cellHeight);
			if (params.margin != null)
					this._margin = params.margin;
			if (params.invisibleComponentsInFlow != null)
					this._invisible_components_in_flow = params.invisibleComponentsInFlow;
		}

	},
	/*
	  returns void
	*/
	layout: function()
	{
		if (this._current_container.getChildren().length == 0)
			return
		switch (this._type)
		{
			case com_pagesociety_ux_layout_FlowLayout.LEFT_TO_RIGHT:
			case com_pagesociety_ux_layout_FlowLayout.TOP_TO_BOTTOM:
				this._x = this._margin.left;
				this._y = this._margin.top;
				break;
			case com_pagesociety_ux_layout_FlowLayout.RIGHT_TO_LEFT:
				if (this._cell_width != 0)
						this._x = this._current_container.getWidth() - this._cell_width;
					else
						this._x = this._current_container.getWidth();
				this._y = this._margin.top;
				break;
			case com_pagesociety_ux_layout_FlowLayout.BOTTOM_TO_TOP:
				this._x = this._margin.left;
				if (this._cell_height != 0)
						this._y = this._current_container.getHeight() - this._cell_height;
					else
						this._y = this._current_container.getHeight() - this._current_container.getFirstChild().getHeight() - this._margin.bottom;
				break;
			default:
				throw new Error("Unimplemented " + this._type);
		};
		for (var i = 0; i < this._current_container.getChildren().length; i++)
		{
			var c = this._current_container.getChildren()[i];
			if (!c.getVisible() && !this._invisible_components_in_flow)
					continue;
			this.position(c);
		}
	},

	/*
	  param c Component
	  returns void
	*/
	position: function(c)
	{
		c.updatePosition(this._x, this._y);
		switch (this._type)
		{
			case com_pagesociety_ux_layout_FlowLayout.LEFT_TO_RIGHT:
				if (this._cell_width != 0)
						this._x += this._cell_width + this._margin.right + this._margin.left;
					else
						this._x += c.getWidth() + this._margin.right + this._margin.left;
				break;
			case com_pagesociety_ux_layout_FlowLayout.TOP_TO_BOTTOM:
				if (this._cell_height != 0)
						this._y += this._cell_height + this._margin.top + this._margin.bottom;
					else
						this._y += c.getHeight() + this._margin.top + this._margin.bottom;
				break;
			case com_pagesociety_ux_layout_FlowLayout.RIGHT_TO_LEFT:
				if (this._cell_width != 0)
						this._x -= this._cell_width + this._margin.right + this._margin.left;
					else
						this._x -= c.getWidth() + this._margin.right + this._margin.left;
				c.updatePosition(this._x, this._y);
				break;
			default:
				throw new Error("Unimplemented " + this._type);
		};
	},

	/*
	  returns Number
	*/
	calculateHeight: function()
	{
		var components = this._current_container.getChildren();
		if (this._type == com_pagesociety_ux_layout_FlowLayout.LEFT_TO_RIGHT || this._type == com_pagesociety_ux_layout_FlowLayout.RIGHT_TO_LEFT)
			return this._current_container.getHeight();
		if (this._cell_height != 0)
			return components.length * (this._cell_height + this._margin.top + this._margin.bottom);
		var h = 0;
		for (var i = 0; i < components.length; i++)
		{
			if (!components[i].getVisible() && !this._invisible_components_in_flow)
					continue;
			h += components[i].getHeight() + this._margin.top + this._margin.bottom;
		}
		return h;
	},

	/*
	  returns Number
	*/
	calculateWidth: function()
	{
		var components = this._current_container.getChildren();
		if (this._type == com_pagesociety_ux_layout_FlowLayout.TOP_TO_BOTTOM || this._type == com_pagesociety_ux_layout_FlowLayout.BOTTOM_TO_TOP)
			return this._current_container.getWidth();
		if (this._cell_width != 0)
			return components.length * (this._cell_width + this._margin.right + this._margin.left);
		var w = 0;
		for (var i = 0; i < components.length; i++)
		{
			if (!components[i].getVisible() && !this._invisible_components_in_flow)
					continue;
			w += components[i].getWidth() + this._margin.right + this._margin.left;
		}
		return w;
	},

	/*
	  param x Number
	  param y Number
	  returns uint
	*/
	calculateIndex: function(x, y)
	{
		var components = this._current_container.getChildren();
		var i = 0;
		switch (this._type)
		{
			case com_pagesociety_ux_layout_FlowLayout.TOP_TO_BOTTOM:
				if (this._cell_height != 0)
						return Math.floor(y / (this._cell_height + this._margin.top + this._margin.bottom));
					else
					{
						var h = 0;
						for (i = 0; i < components.length; i++)
							{
								h += components[i].getHeight() + this._margin.top + this._margin.bottom;
								if (h > y)
										return i;
							}
						return components.length;
					}
			case com_pagesociety_ux_layout_FlowLayout.LEFT_TO_RIGHT:
				if (this._cell_width != 0)
						return Math.floor(x / (this._cell_width + this._margin.right + this._margin.left));
					else
					{
						var w = 0;
						for (i = 0; i < components.length; i++)
							{
								w += components[i].getWidth() + this._margin.right + this._margin.left;
								if (w > x)
										return i;
							}
						return components.length;
					}
		};
		return 0;
	},

	/*
	  returns Number
	*/
	calculateHeightForUnset: function()
	{
		if (this.getType() == com_pagesociety_ux_layout_FlowLayout.LEFT_TO_RIGHT || this.getType() == com_pagesociety_ux_layout_FlowLayout.RIGHT_TO_LEFT)
		{
			return this._current_container.getHeight() - this._margin.top - this._margin.bottom;
		}
		var k = 0;
		var c = 0;
		var uc;
		var i;
		var children = this._current_container.getChildren();
		for (i = 0; i < children.length; i++)
		{
			if (!children[i].getIsHeightUnset())
				{
					k += children[i].getHeight();
					c++;
				}
		}
		uc = children.length - c;
		if (uc < 1)
			return 0;
		else
			return  ((this._current_container.getHeight() - k) / uc) - this._margin.top - this._margin.bottom;//Math.floor
	},


	//TODO for both calcs.
	//account for floating point margin, distribute or add to last component



	/*
	  returns Number
	*/
	calculateWidthForUnset: function()
	{
		if (this.getType() == com_pagesociety_ux_layout_FlowLayout.TOP_TO_BOTTOM || this.getType() == com_pagesociety_ux_layout_FlowLayout.BOTTOM_TO_TOP)
		{
			return this._current_container.getWidth() - this._margin.left - this._margin.right;
		}
		else
			if (this.getCellWidth() != 0)
			{
				return this.getCellWidth() - this._margin.left - this._margin.right;
			}
			else
			{
				var k = 0;
				var c = 0;
				var uc;
				var i;
				var children = this._current_container.getChildren();
				for (i = 0; i < children.length; i++)
					{
						if (!children[i].getIsWidthUnset())
							{
								k += children[i].getWidth();
								c++;
							}
					}
				uc = children.length - c;
				if (uc < 1)
						return 0;
					else
						return ((this._current_container.getWidth() - k) / uc) - this._margin.right - this._margin.left;//Math.floor
			}
	},

	/*
	  returns Container
	*/
	getContainer: function()
	{
		return this._current_container;
	},

	/*
	  returns uint
	*/
	getType: function()
	{
		return this._type;
	},

	/*
	  returns Number
	*/
	getX: function()
	{
		return this._x;
	},

	/*
	  returns Number
	*/
	getY: function()
	{
		return this._y;
	},

	/*
	  returns Margin
	*/
	getMargin: function()
	{
		return this._margin;
	},

	/*
	  returns Number
	*/
	getCellWidth: function()
	{
		return this._cell_width;
	},

	/*
	  returns Number
	*/
	getCellHeight: function()
	{
		return this._cell_height;
	},

	/*
	  param c Container
	  returns void
	*/
	setContainer: function(c)
	{
		this._current_container = c;
	},

	/*
	  param t uint
	  returns void
	*/
	setType: function(t)
	{
		this._type = t;
	},

	/*
	  param w Number
	  returns void
	*/
	setCellWidth: function(w)
	{
		this._cell_width = w;
	},

	/*
	  param h Number
	  returns void
	*/
	setCellHeight: function(h)
	{
		this._cell_height = h;
	}

});

com_pagesociety_ux_layout_FlowLayout.LEFT_TO_RIGHT = 1;
com_pagesociety_ux_layout_FlowLayout.RIGHT_TO_LEFT = 2;
com_pagesociety_ux_layout_FlowLayout.TOP_TO_BOTTOM = 3;
com_pagesociety_ux_layout_FlowLayout.BOTTOM_TO_TOP = 4;
/*
  GridLayout
  import com_pagesociety_ux_Margin
  import com_pagesociety_ux_component_Component
  import com_pagesociety_ux_component_Container
*/

var com_pagesociety_ux_layout_GridLayout = Class.create(
{
	initialize: function($super, type, params)
	{
		this._type/*uint*/;
		this._current_container/*Container*/;
		this._x = 0/*Number*/;
		this._y = 0/*Number*/;
		this._cell_width = 100/*Number*/;
		this._cell_height = 100/*Number*/;
		this._columns = 4/*uint*/;
		this._column_count = 0/*uint*/;
		this._rows = 0/*uint*/;
		this._row_count = 0/*uint*/;
		this._margin/*Margin*/;
		params = (params ? params : null);
		this._type = type;
		this._margin = new Margin(0, 0, 0, 0);
		if (params != null)
		{
			if (params.cellWidth == null)
					throw new Error("Missing required parameter 'cellWidth' for Browser grid layout");
			else;
				this.setCellWidth(params.cellWidth);
			if (params.cellHeight == null)
					throw new Error("Missing required parameter 'cellHeight' for Browser grid layout");
			else;
				this.setCellHeight(params.cellHeight);
			if (params.margin != null)
					this._margin = params.margin;
		}

	},
	/*
	  returns void
	*/
	layout: function()
	{
		this.setWidth(this._current_container.getWidth());
		this.setHeight(this._current_container.getHeight());
		this._x = this._margin.left;
		this._y = this._margin.top;
		this._column_count = 0;
		this._row_count = 0;
		for (var i = 0; i < this._current_container.getChildren().length; i++)
			this.position(this._current_container.getChildren()[i]);
	},

	/*
	  param c Component
	  returns void
	*/
	position: function(c)
	{
		c.updatePosition(this._x, this._y);
		switch (this._type)
		{
			case com_pagesociety_ux_layout_GridLayout.GROW_VERTICALLY:
				this._x += this._cell_width + this.getMargin().right + this.getMargin().left;
				this._column_count++;
				if (this._column_count > this._columns)
					{
						this._y += this._cell_height + this.getMargin().top + this.getMargin().bottom;
						this._x = this.getMargin().left;
						this._column_count = 0;
					}
				break;
			case com_pagesociety_ux_layout_GridLayout.GROW_HORIZONTALLY:
				this._y += this._cell_height + this.getMargin().top + this.getMargin().bottom;
				this._row_count++;
				if (this._rows > 0 && this._row_count > this._rows)
					{
						this._x += this._cell_width + this.getMargin().right + this.getMargin().left;
						this._y = this._margin.top;
						this._row_count = 0;
					}
				break;
		};
	},

	/*
	  returns Number
	*/
	calculateHeight: function()
	{
		var components = this._current_container.getChildren();
		if (this._type == com_pagesociety_ux_layout_GridLayout.GROW_VERTICALLY)
		{
			var numChildren = components.length;
			var a = 1 + Math.floor((numChildren - 1) / (this._columns + 1));
			return a * (this._cell_height + this.getMargin().top + this.getMargin().bottom);
		}
		else
			return this._current_container.getHeight();
	},

	/*
	  returns Number
	*/
	calculateWidth: function()
	{
		return this._current_container.getWidth();
	},

	/*
	  param x Number
	  param y Number
	  returns uint
	*/
	calculateIndex: function(x, y)
	{
		switch (this._type)
		{
			case com_pagesociety_ux_layout_GridLayout.GROW_VERTICALLY:
				return Math.floor(x / (this._cell_width + this.getMargin().right + this.getMargin().left)) + Math.floor(y / (this._cell_height + this.getMargin().top + this.getMargin().bottom)) * (this._columns + 1);
			case com_pagesociety_ux_layout_GridLayout.GROW_HORIZONTALLY:
				return Math.floor(x / (this._cell_width + this.getMargin().right + this.getMargin().left)) * (this._rows + 1) + Math.floor(y / (this._cell_height + this.getMargin().top + this.getMargin().bottom));
				break;
		};
		return 0;
	},

	/*
	  returns Container
	*/
	getContainer: function()
	{
		return this._current_container;
	},

	/*
	  returns Number
	*/
	getX: function()
	{
		return this._x;
	},

	/*
	  returns Number
	*/
	getY: function()
	{
		return this._y;
	},

	/*
	  returns Margin
	*/
	getMargin: function()
	{
		return this._margin;
	},

	/*
	  returns Number
	*/
	getCellWidth: function()
	{
		return this._cell_width;
	},

	/*
	  returns Number
	*/
	getCellHeight: function()
	{
		return this._cell_height;
	},

	/*
	  returns Number
	*/
	getHeight: function()
	{
		return this._y;
	},

	/*
	  returns Number
	*/
	getWidth: function()
	{
		return this._columns * this.getCellWidth();
	},

	/*
	  returns Number
	*/
	getColumns: function()
	{
		return this._columns;
	},

	/*
	  param c Container
	  returns void
	*/
	setContainer: function(c)
	{
		this._current_container = c;
	},

	/*
	  param w Number
	  returns void
	*/
	setCellWidth: function(w)
	{
		this._cell_width = w;
	},

	/*
	  param h Number
	  returns void
	*/
	setCellHeight: function(h)
	{
		this._cell_height = h;
	},

	/*
	  param c Number
	  returns void
	*/
	setColumns: function(c)
	{
		this._columns = c - 1;
	},

	/*
	  param w Number
	  returns void
	*/
	setWidth: function(w)
	{
		this._columns = Math.floor(w / (this._cell_width + this.getMargin().right + this.getMargin().left)) - 1;
	},

	/*
	  param h Number
	  returns void
	*/
	setHeight: function(h)
	{
	}

});

com_pagesociety_ux_layout_GridLayout.GROW_VERTICALLY = 0;
com_pagesociety_ux_layout_GridLayout.GROW_HORIZONTALLY = 1;
/*
  Layout
  import com_pagesociety_ux_Margin
  import com_pagesociety_ux_component_Container
*/

var com_pagesociety_ux_layout_Layout = Class.create(
{
	initialize: function()
	{

	},
	/*
	  returns void
	*/
	layout: function() {},

	/*
	  returns Number
	*/
	calculateHeight: function() {},

	/*
	  returns Number
	*/
	calculateWidth: function() {},

	/*
	  param x Number
	  param y Number
	  returns uint
	*/
	calculateIndex: function(x, y) {},

	/*
	  returns Container
	*/
	getContainer: function() {},

	/*
	  returns Margin
	*/
	getMargin: function() {},

	/*
	  returns Number
	*/
	getX: function() {},

	/*
	  returns Number
	*/
	getY: function() {},

	/*
	  param c Container
	  returns void
	*/
	setContainer: function(c) {}

});

/*
  TableLayout
  import com_pagesociety_ux_Margin
  import com_pagesociety_ux_component_Component
  import com_pagesociety_ux_component_Container
*/

var com_pagesociety_ux_layout_TableLayout = Class.create(
{
	initialize: function($super)
	{
		this._columns = 0/*uint*/;
		this._column_widths/*Array*/;
		this._row_height = 22/*Number*/;
		this._x = 0/*Number*/;
		this._y = 0/*Number*/;
		this._margin/*Margin*/;
		this._container/*Container*/;
		this._column_widths = new Array(20);
		this._margin = new Margin(0, 0, 0, 0);

	},
	/*
	  returns void
	*/
	layout: function()
	{
		var c = 0;
		var s = this._container.getChildren().length;
		while (c < s)
		{
			this._x = 0;
			this._y = Math.floor(c / this._columns) * this._row_height;
			for (var i = 0; i < this._columns && c < s; i++)
				{
					var p = this._container.getChildren()[c];
					p.updatePosition(this._x, this._y);
					if (this._column_widths[i] != null)
							this._x += this._column_widths[i]
						else
							this._x += p.getWidth()
					c++;
				}
		}
	},

	/*
	  returns Number
	*/
	calculateHeight: function()
	{
		return Math.ceil(this._container.getChildren().length / this._columns) * this._row_height;
	},

	/*
	  returns Number
	*/
	calculateWidth: function()
	{
		return this._container.getWidth();
	},

	/*
	  param x Number
	  param y Number
	  returns uint
	*/
	calculateIndex: function(x, y)
	{
		return 0;
	},

	/*
	  returns Number
	*/
	calculateWidthForUnset: function()
	{
		var w = 0;
		var c = this._columns;
		for (var i = 0; i < this._columns; i++)
		{
			if (this._column_widths[i] != null)
				{
					w += this._column_widths[i];
					c--;
				}
		}
		return (this._container.getWidth() - w) / c;
	},

	/*
	  returns Number
	*/
	calculateHeightForUnset: function()
	{
		return this._row_height;
	},

	/*
	  returns uint
	*/
	getColumns: function()
	{
		return this._columns;
	},

	/*
	  returns uint
	*/
	getRowHeight: function()
	{
		return this._row_height;
	},

	/*
	  returns Array
	*/
	getColumnWidths: function()
	{
		return this._column_widths;
	},

	/*
	  returns Container
	*/
	getContainer: function()
	{
		return this._container;
	},

	/*
	  returns Margin
	*/
	getMargin: function()
	{
		return this._margin;
	},

	/*
	  returns Number
	*/
	getX: function()
	{
		return this._x;
	},

	/*
	  returns Number
	*/
	getY: function()
	{
		return this._y;
	},

	/*
	  param n uint
	  returns void
	*/
	setColumns: function(n)
	{
		this._columns = n;
	},

	/*
	  param n uint
	  returns void
	*/
	setRowHeight: function(n)
	{
		this._row_height = n;
	},

	/*
	  param c Container
	  returns void
	*/
	setContainer: function(c)
	{
		this._container = c;
	}

});

/*
  Margin
*/

var com_pagesociety_ux_Margin = Class.create(
{
	initialize: function(top, right, bottom, left)
	{
		this.top/*Number*/;
		this.right/*Number*/;
		this.bottom/*Number*/;
		this.left/*Number*/;
		this.top = top;
		this.right = right;
		this.bottom = bottom;
		this.left = left;

	}
});

/*
  MovingValue
*/

var com_pagesociety_ux_MovingValue = Class.create(
{
	initialize: function($super, v)
	{
		this.initialValue/*Number*/;
		this.destination/*Number*/;
		this.currentValue/*Number*/;
		v = (v ? v : 0);
		this.reset(v);

	},
	/*
	  param v Number
	  returns void
	*/
	reset: function(v)
	{
		this.initialValue = v;
		this.destination = v;
		this.currentValue = v;
	},

	/*
	  returns String
	*/
	toString: function()
	{
		return "MovingValue [init=" + this.initialValue;
	},

	/*
	  returns Number
	*/
	getValue: function()
	{
		return this.currentValue;
	},

	/*
	  returns Number
	*/
	getDestinationValue: function()
	{
		return this.destination;
	},

	/*
	  returns Boolean
	*/
	getComplete: function()
	{
		return this.currentValue == this.getDestinationValue();
	},

	/*
	  param d Number
	  returns void
	*/
	setPercentComplete: function(d)
	{
		this.currentValue = this.initialValue + (this.destination - this.initialValue) * d;
	},

	/*
	  param index Number
	  returns void
	*/
	setValue: function(index)
	{
		if (isNaN(index))
			throw new Error("!");
		this.initialValue = this.currentValue;
		this.destination = index;
	}

});




/*
  Tween
  import com_pagesociety_ux_component_Component
  import flash_events_TimerEvent
  import flash_utils_Timer
  import flash_utils_getTimer
  import gs_easing_Quart
*/

var com_pagesociety_ux_Tween = Class.create(
{
	initialize: function($super, init, easingFunction)
	{
		this._easing_function/*Function*/;
		this._duration/*Number*/;
		this._moving/*Boolean*/;
		this._completed/*Boolean*/;
		this._init/*Number*/;
		this._dest/*Number*/;
		this._do_update/*Function*/;
		this._do_complete/*Function*/;
		this._start_time/*Number*/;
		this._moving_vals/*Array*/;
		this._component/*Component*/;
		this._timer/*Timer*/;
		init = (init ? init : 0);
		easingFunction = (easingFunction ? easingFunction : null);
		this.reset(init, easingFunction);

	},
	/*
	  param a Array
	  param duration uint
	  param callback Function
	  param complete Function
	  returns void
	*/
	tween: function(a, duration, callback, complete)
	{
		complete = (complete ? complete : null);
		this._moving_vals = a;
		this.setCallback(callback, complete);
		this.reset(0);
		this._goto(1, duration);
	},

	/*
	  param c Component
	  param a Array
	  param duration uint
	  param on_complete Function
	  returns void
	*/
	render: function(c, a, duration, on_complete)
	{
		on_complete = (on_complete ? on_complete : null);
		this.reset(0);
		this._moving = false;
		this._do_complete = on_complete;
		this._moving_vals = a;
		this._component = c;
		this._goto(1, duration);
	},

	/*
	  param on_update Function
	  param on_complete Function
	  returns void
	*/
	setCallback: function(on_update, on_complete)
	{
		on_complete = (on_complete ? on_complete : null);
		this._do_update = on_update;
		this._do_complete = on_complete;
	},

	/*
	  returns void
	*/
	stop: function()
	{
		this._moving = false;
		this._timer.stop();
	},

	/*
	  param init Number
	  param easingFunction Function
	  returns void
	*/
	reset: function(init, easingFunction)
	{
		easingFunction = (easingFunction ? easingFunction : null);
		this._init = init;
		this._easing_function = easingFunction == null ? (this._easing_function == null ? gs_easing_Quart.easeOut : this._easing_function) : easingFunction;
		this._moving = false;
	},

	/*
	  param x Number
	  param milliseconds Number
	  returns void
	*/
	_goto: function(x, milliseconds)
	{
		if (this._moving)
			this._init = this.getX();
		if (this._component != null)
			this._component.onStartAnimation();
		this._dest = x;
		this._duration = milliseconds;
		this._start_time = getTimer();
		this._moving = true;
		this._completed = false;
		if (this._timer == null)
		{
			this._timer = new Timer(com_pagesociety_ux_Tween.INTERVAL);
			this._timer.addEventListener(TimerEvent.TIMER, this.updateX.bind(this));
			//this._timer.addEventListener(TimerEvent.TIMER_COMPLETE, this.timer_complete.bind(this));
		}
		this._timer.start();
	},

	/*
	  param e TimerEvent
	  returns void
	*/
	updateX: function(e)
	{
		var time = getTimer() - this._start_time;
		var complete = (time >= this._duration);
		var x = complete ? 1 : this.getX();
		if (this._moving_vals != null)
		{
			for (var i = 0; i < this._moving_vals.length; i++)
					this._moving_vals[i].setPercentComplete(x);
		}
		if (this._component != null)
			this._component.render();
		else
			this._do_update(x);
		if (complete)
		{
			this._timer.stop();
			if (this._component != null)
					this._component.onStopAnimation();
		}
	},

	/*
	  param e TimerEvent
	  returns void
	*/
	timer_complete: function(e)
	{
		com.pagesociety.ux.trace("TIMER COMPLETE");
	},

	/*
	  returns Number
	*/
	getX: function()
	{
		var time = getTimer() - this._start_time;
		if (time >= this._duration && !this._completed)
		{
			if (this._do_complete != null)
					this._do_complete();
			this._completed = true;
		}
		if (time >= this._duration)
		{
			this._moving = false;
			this._init = this._easing_function(this._duration, this._init, this._dest - this._init, this._duration);
			return this._init;
		}
		return this._easing_function(time, this._init, this._dest - this._init, this._duration);
	},

	/*
	  returns void
	*/
	destroy: function()
	{
		if (this._timer != null)
		{
			this._timer.stop();
			this._timer.removeAllEventListeners();
		}
	},

	/*
	  returns Boolean
	*/
	getMoving: function()
	{
		return this._moving;
	}

});

com_pagesociety_ux_Tween.INTERVAL = 40;
/*
  Linear
*/

var gs_easing_Linear = Class.create(
{
	initialize: function()
	{

	}
});

	/*
	  param t Number
	  param b Number
	  param c Number
	  param d Number
	  returns Number
	*/
gs_easing_Linear.easeNone = function(t, b, c, d)
	{
		return c * t + b;
	};
	/*
	  param t Number
	  param b Number
	  param c Number
	  param d Number
	  returns Number
	*/
gs_easing_Linear.easeIn = function(t, b, c, d)
	{
		return c * t + b;
	};
	/*
	  param t Number
	  param b Number
	  param c Number
	  param d Number
	  returns Number
	*/
gs_easing_Linear.easeOut = function(t, b, c, d)
	{
		return c * t + b;
	};
	/*
	  param t Number
	  param b Number
	  param c Number
	  param d Number
	  returns Number
	*/
gs_easing_Linear.easeInOut = function(t, b, c, d)
	{
		return c * t + b;
	};
/*
  Quart
*/

var gs_easing_Quart = Class.create(
{
	initialize: function()
	{

	}
});

	/*
	  param t Number
	  param b Number
	  param c Number
	  param d Number
	  returns Number
	*/
gs_easing_Quart.easeIn = function(t, b, c, d)
	{
		return c * (t /= d) + b;
	};
	/*
	  param t Number
	  param b Number
	  param c Number
	  param d Number
	  returns Number
	*/
gs_easing_Quart.easeOut = function(t, b, c, d)
	{
		return -c * ((t = t / d - 1) * t - 1) + b;
	};
	/*
	  param t Number
	  param b Number
	  param c Number
	  param d Number
	  returns Number
	*/
gs_easing_Quart.easeInOut = function(t, b, c, d)
	{
		if ((t /= d / 2) < 1)
			return c / 2 + b;
		return -c / 2 + b;
	};
/*
  Locker
*/

var Timer = Class.create( EventDispatcher,
{
	initialize: function($super,delay,repeat)
	{
		$super();
		this.delay = delay;
		this.repeat = repeat ? repeat : 0;
		this.count = 0;
		this.id = -1;
	},

	start: function()
	{
		if (this.id==-1)
		{
			this.id = setInterval(this.on_tick.bind(this), this.delay);
		}
	},

	on_tick: function()
	{
		this.count++;
		this.dispatchEvent(new com_pagesociety_ux_event_ComponentEvent(TimerEvent.TIMER));
		if (this.repeat != 0 && this.count == this.repeat)
		{
			this.dispatchEvent(new com_pagesociety_ux_event_ComponentEvent(TimerEvent.TIMER_COMPLETE));
			this.stop();
		}
	},

	stop: function()
	{
		this.count = 0;
		if (this.id!=-1)
		{
			clearInterval(this.id);
			this.id = -1;
		}
	},

	reset: function()
	{
		this.stop();
	}



});


var TimerEvent = Class.create(
		{
			initialize: function()
			{
			}

		});

TimerEvent.TIMER = "timer";
TimerEvent.TIMER_COMPLETE = "timer_complete";



getTimer = function()
{
	var d = new Date();
	return d.getTime();
};
/*
  Logger
  import flash_display_Sprite
  import flash_display_Stage
  import flash_events_KeyboardEvent
  import flash_events_MouseEvent
  import flash_text_TextField
  import flash_text_TextFormat
  import flash_ui_Keyboard
*/

var Logger = Class.create(
{
	initialize: function()
	{

	}
});


Logger.log = function(o, clear)
	{
		clear = (clear ? clear : false);
		try { console.log(o);} catch(e){}
	};
	/*
	  param o Object
	  param clear Boolean
	  returns void
	*/
Logger.debug = function(o, clear)
	{
		clear = (clear ? clear : false);
		try { console.log(o);} catch(e){}
	};
	/*
	  param o Object
	  param clear Boolean
	  returns void
	*/
Logger.error = function(o, clear)
	{
		clear = (clear ? clear : false);
		try { console.log("ERROR"); console.log(o); } catch(e){}
	};

function getPositionedEventCoords(evt)
{
	var elem 	= (evt.target) ? evt.target : evt.srcElement;
	var coords 	= {x:0, y:0};
	if (evt.layerX)
	{
		var borders = {left:parseInt($(elem).getStyle("borderLeftWidth")),top:parseInt($(elem).getStyle("borderTopWidth"))};
		coords.x = evt.layerX - borders.left;
		coords.y = evt.layerY - borders.top;
	}
	else if (evt.offsetX)
	{
		coords.x = evt.offsetX;
		coords.y = evt.offsetY;
	}
	//evt.cancelBubble = true;
	return coords;
}

function getElementStyle(elemID, IEStyleAttr, CSSStyleAttr)
{
	var elem = document.getElementById(elemID);
	if (elem.currentStyle)
	{
		return elem.currentStyle[IEStyleAttr];
	}
	else if (window.getComputedStyle)
	{
		var compStyle = window.getComputedStyle(elem, "");
		return compStyle.getPropertyValue(CSSStyleAttr);
	}
	return "";
}




/**
 * Javascript code to store data as JSON strings in cookies.
 * It uses prototype.js 1.5.1 (http://www.prototypejs.org)
 *
 * Author : Lalit Patel
 * Website: http://www.lalit.org/lab/jsoncookies
 * License: Apache Software License 2
 *          http://www.apache.org/licenses/LICENSE-2.0
 * Version: 0.5
 * Updated: Jan 26, 2009
 *
 * Chnage Log:
 *   v 0.5
 *   -  Changed License from CC to Apache 2
 *   v 0.4
 *   -  Removed a extra comma in options (was breaking in IE and Opera). (Thanks Jason)
 *   -  Removed the parameter name from the initialize function
 *   -  Changed the way expires date was being calculated. (Thanks David)
 *   v 0.3
 *   -  Removed dependancy on json.js (http://www.json.org/json.js)
 *   -  empty() function only deletes the cookies set by CookieJar
 */

var CookieJar = Class.create();

CookieJar.prototype = {

	/**
	 * Append before all cookie names to differntiate them.
	 */
	appendString: "__PSCJ_",

	/**
	 * Initializes the cookie jar with the options.
	 */
	initialize: function(options) {
		this.options = {
			expires: 3600,		// seconds (1 hr)
			path: '',			// cookie path
			domain: '',			// cookie domain
			secure: ''			// secure ?
		};
		Object.extend(this.options, options || {});

		if (this.options.expires != '') {
			var date = new Date();
			date = new Date(date.getTime() + (this.options.expires * 1000));
			this.options.expires = '; expires=' + date.toGMTString();
		}
		if (this.options.path != '') {
			this.options.path = '; path=' + escape(this.options.path);
		}
		if (this.options.domain != '') {
			this.options.domain = '; domain=' + escape(this.options.domain);
		}
		if (this.options.secure == 'secure') {
			this.options.secure = '; secure';
		} else {
			this.options.secure = '';
		}
	},

	/**
	 * Adds a name values pair.
	 */
	put: function(name, value) {
		name = this.appendString + name;
		cookie = this.options;
		var type = typeof value;
		switch(type) {
		  case 'undefined':
		  case 'function' :
		  case 'unknown'  : return false;
		  case 'boolean'  :
		  case 'string'   :
		  case 'number'   : value = String(value.toString());
		}
		var cookie_str = name + "=" + escape(Object.toJSON(value));
		try {
			document.cookie = cookie_str + cookie.expires + cookie.path + cookie.domain + cookie.secure;
		} catch (e) {
			return false;
		}
		return true;
	},

	/**
	 * Removes a particular cookie (name value pair) form the Cookie Jar.
	 */
	remove: function(name) {
		name = this.appendString + name;
		cookie = this.options;
		try {
			var date = new Date();
			date.setTime(date.getTime() - (3600 * 1000));
			var expires = '; expires=' + date.toGMTString();
			document.cookie = name + "=" + expires + cookie.path + cookie.domain + cookie.secure;
		} catch (e) {
			return false;
		}
		return true;
	},

	/**
	 * Return a particular cookie by name;
	 */
	get: function(name) {
		name = this.appendString + name;
		var cookies = document.cookie.match(name + '=(.*?)(;|$)');
		if (cookies) {
			return (unescape(cookies[1])).evalJSON();
		} else {
			return null;
		}
	},

	/**
	 * Empties the Cookie Jar. Deletes all the cookies.
	 */
	empty: function() {
		keys = this.getKeys();
		size = keys.size();
		for(i=0; i<size; i++) {
			this.remove(keys[i]);
		}
	},

	/**
	 * Returns all cookies as a single object
	 */
	getPack: function() {
		pack = {};
		keys = this.getKeys();

		size = keys.size();
		for(i=0; i<size; i++) {
			pack[keys[i]] = this.get(keys[i]);
		}
		return pack;
	},

	/**
	 * Returns all keys.
	 */
	getKeys: function() {
		keys = $A();
		keyRe= /[^=; ]+(?=\=)/g;
		str  = document.cookie;
		CJRe = new RegExp("^" + this.appendString);
		while((match = keyRe.exec(str)) != undefined) {
			if (CJRe.test(match[0].strip())) {
				keys.push(match[0].strip().gsub("^" + this.appendString,""));
			}
		}
		return keys;
	}
};

