var defaultDelimiter = '&#xFFFB';

//------------------------
// Utilities
//------
function is(o,type)
{
	if(typeof(o)=='undefined') return false;
	if(typeof(type)=='undefined') return true;
	return(
		(typeof(o)=='object' && o.constructor==type) ||
		o.constructor==type ||
		typeof(o)==type
		);
}
function TrimLeft(s,ch)
{
	if (!ch) ch = ' ';
	for(var i=0; i<s.length; i++) if(s.charAt(i)!=ch) break;
	return s.substring(i,s.length);
}

function TrimRight(s,ch)
{
	if (!ch) ch = ' ';
	for(var i=(s.length-1); i>=0; i--) if(s.charAt(i)!=ch) break;
	return s.substring(0,i+1);
}

function Trim(s,ch){s = TrimLeft(s,ch); return TrimRight(s,ch);}

function parseTemplate(t,capt)
{
    var res = t;
	if ( t.indexOf("$caption") >= 0 ){
       res = t.substring(0,t.indexOf("$caption"));
       res += capt;
       res += t.substring(t.indexOf("$caption")+8,t.length+1);
    }
	return res;
}

//------------------------
// Params object
//------
function Params(delimiter)
{
	this.param = new Array();
	this.length = 0;
	this.delimiter = (delimiter) ? delimiter : defaultDelimiter;
	this.init(arguments);
}
Params.prototype.addParam = function(str)
{with(this){
	var nv = str.split('&#xFFFA');
	if(nv.length<2) return;
	nv[0]=Trim(nv[0]);
	nv[1]=Trim(nv[1]);
	if(typeof(param[nv[0]])=='undefined') param[length++] = nv[0];
	param[nv[0]] = nv[1];

}}
Params.prototype.addParams = function()
{
var ar=0;
var args=arguments;
	for(var a=0; a<args.length; a++)
	{
		ar = args[a].split(this.delimiter);
		for(var i=0; i<ar.length; i++) this.addParam(ar[i]);
	}
}
Params.prototype.setParams = function()
{with(this){
	param = new Array();
	length = 0;
	init(setParams.arguments);
}}
Params.prototype.init = function(args)
{with(this){
	for(var i=0;i<args.length;i++){
		if( typeof(args[i])=='string' ) addParams(args[i]);
		else for(var j=0;j<args[i].length;j++) addParams(args[i][j]);}
}}
Params.prototype.getParamString = function()
{with(this){
	for(var i=0,s='';i<param.length;i++)
		s += (i>0?this.delimiter:'')+param[i] + '=' + param[param[i]];
	return s;
}}
Params.prototype.toString = function()
{with(this){
	return '[Params]';
}}

//----------------------------------------
// Menu style object
//------
function MenuStyle(delimiter)
{
	this.name = 'MenuStyle';
	this.type = 'menustyle';
	this.delimiter = (delimiter) ? delimiter : defaultDelimiter;
	this.param = 0;
	this.init(arguments);
}
MenuStyle.prototype.toString = function()
{ return mm.debug?('[MenuStyle:'+this.getParamString()+']'):'[MenuStyle]'; }

MenuStyle.prototype.size = function() { return this.param.length; }
MenuStyle.prototype.set = function(_n,_v)
{with(this){
	_n = _n.toLowerCase();
	if( typeof(param[_n]) == 'undefined' )
		param[param.length] = _n;
	param[_n] = _v;
}}
MenuStyle.prototype.setParams = function(args) //???
{
	var p = new Params(this.delimiter,args);
	for(var i=0;i<p.length;i++)
		this.set(p.param[i],p.param[p.param[i]]);
	p = null;
}
MenuStyle.prototype.get = function(_n)
{
	var val = this.param[_n.toLowerCase()];
	return (!is(val) || val.length==0)?this.nosuchvalue:val;
}
MenuStyle.prototype.getAt = function(_i)
{
	return this.param[_i];
}
MenuStyle.prototype.getParamString = function()
{with(this){
	var s='';
	for(var i=0;i<param.length;i++)
		s += ((i>0)?this.delimiter:'')+param[i] + '&#xFFFA' + param[param[i]];
	return s;
}}
MenuStyle.prototype.SetStyle = function()
{with(this){
	var p = new Params(this.delimiter,arguments);
	param = null; param = new Array();
	for(var i=0;i<p.length;i++) set(p.param[i],p.param[p.param[i]]);
	p = null;
}}
MenuStyle.prototype.init = function(args)
{with(this){
	for(var i=0;i<args.length;i++)
		if( typeof(args[i])=='string' ) SetStyle(args[i]);
		else for(var j=0;j<args[i].length;j++) SetStyle(args[i][j]);
}}

//----------------------------------------
// Pos
//------
function Pos()
{
	this.x = this.y = this.w = this.h = 0;
	this.toString = function()
	{
		return '['+this.x+','+this.y+','+this.w+','+this.h+']';
	}
}
//------
Pos.prototype.Set = function(_x,_y,_w,_h)
{
	if (is(_x,Pos)) { this.Set(_x.x, _x.y, _x.w, _x.h); return; }
	if (_x) this.x = _x;
	if (_y) this.y = _y;
	if (_w) this.w = _w;
	if (_h) this.h = _h;
/*
	if (is(_x)) this.x = is(_x,Pos) ? _x.x : _x;
	if (is(_y)) this.y = is(_y,Pos) ? _y.y : _y;
	if (is(_w)) this.w = is(_w,Pos) ? _w.w : _w;
	if (is(_h)) this.h = is(_h,Pos) ? _h.h : _h;
*/
/*
	if (!_pos) return;
	this.x = _pos.x; this.y = _pos.y; this.w = _pos.w; this.h = _pos.h;
*/
}

//----------------------------------------
//
//------
