/**
 * Utilities library 
 * 
 * @author Angelo Selvini <angelo@exmachina.ch>
 * @author Nicola Rizzo <nicola@exmachina.ch>
 */


if(!ch){
	var ch = {};
}
if(!ch.exmachina){
	ch.exmachina = {};
}
if(!ch.exmachina.bravofly){
	ch.exmachina.bravofly = {};
}
if(!ch.exmachina.bravofly.utils){
	ch.exmachina.bravofly.utils = {};
}


ch.exmachina.bravofly.utils.inherits = function(subClass, baseClass){
	function inheritanceHelper(){}
	inheritanceHelper.prototype = baseClass.prototype;
	subClass.prototype = new inheritanceHelper();
	subClass.prototype.constructor = subClass;

	// references
	subClass.baseConstructor = baseClass;
	subClass.superClass = baseClass.prototype;
};

ch.exmachina.bravofly.utils.delegate = function(ctx, func){
	var args = $A(arguments);
	args.splice(0,2);

	return function(){ 
		var ary = [];
		ary = ary.concat(args);	
		ary = ary.concat($A(arguments));
		func.apply(ctx, ary );
	}; 
};

ch.exmachina.bravofly.utils.normalizeUrl = function(u){
	var l = document.location;
	if (!/^http:\/\//.test(u))
		u = l.protocol+"//"+l.host + ( /^\//.test(u)?'':'/') + u;

	return u;
};

ch.exmachina.bravofly.utils.hasParentNode = function(d){
	return d.parentNode && d.parentNode.nodeType != 11;
};

ch.exmachina.bravofly.utils.formatNumber = function(num,dec,thou,pnt,curr1,curr2,n1,n2) {
	/*
		num: real value
		dec: quantity of decimal numbers
		thou: grouping separator
		pnt: decimal separator
		currX: string value before (1) and after (2) fnum
		nX: string be
	*/
	var x = Math.round(num * Math.pow(10,dec));

	if (x >= 0)
		n1=n2='';

	var y = (''+Math.abs(x)).split('');
	var z = y.length - dec; 

	if (z<0)
		z--;

	for(var i = z; i < 0; i++)
		y.unshift('0');

	if (z<0)
		z = 1;

	if (y.length != z)
		y.splice(z, 0, pnt);

	if(y[0] == pnt)
		y.unshift('0');

	while (z > 3){
		z-=3;
		y.splice(z,0,thou);
	}

	var r = curr1+n1+y.join('')+n2+curr2;
	return r;
};

ch.exmachina.bravofly.utils.getDictionary = function(){
	return (com && com.bravofly && com.bravofly.dictionary)
		? com.bravofly.dictionary
		: {}
	;
};

ch.exmachina.bravofly.utils.parseLocation = function(l){
	var p = {},
		s = /\?(.+)$/.exec(l)
	;

	if (s && s[1])
		p = s[1].toQueryParams();

	return p;
};

ch.exmachina.bravofly.utils.validateOptions = function(/* object */d){
		var i,
			o = d.optsNew,
			c = d.optsOld,
			l = d.rules
		;
		for (i=0;i<l.length;i++){
			var nm = l[i].name;
			if (o.hasOwnProperty(nm)){
				
				switch (l[i].type){
					case "b":
						var v = o[ nm ];
						if (v === true || v === "true") {
							c[ nm ] = true;
						} else {
							c[ nm ] = false;
						}
						break;
					case "n":
						var n = parseInt( o[ nm ], 10 );
						if (!isNaN(n))
							c[ nm ] = n;
						break;
					case "s":
					default:
						c[ nm ] = o[ nm ];
						break;
				}
			}
		}
		return c;
};

ch.exmachina.bravofly.utils.config = function(/* object */o){
	//	summary: quick save/load confs minimally
	//	ref: http://www.quirksmode.org/js/cookies.html
	var cf,
		p      = "; path=/",
		BFCONF = "__bfconf",
		mng    = {
			get: function(k) {
				var i,d,j,C=BFCONF+"=",c=document.cookie.split(";");
	
				for (i=0;i<c.length;i++){
					d=c[i];
					while(d.charAt(0)==' '){d=d.substring(1,d.length)};
					if (d && d.indexOf(C)==0) j = d.substring(C.length,d.length);
				}
	
				try { if(j) j=eval("("+j+")") } catch(err) { j= {err: err} };
				return k ? j[k] : (j || {});
			},
			set: function(k) {
				var t,
					v = this.get(),
					e = "",
					d = new Date()
				;

				if (!k)
					v={};
				else if (v[k.id])
					Object.extend(v[k.id], k.cfg);
				else
					v[k.id]=k.cfg;
	
				if (k && k.days){
					d.setTime(d.getTime()+(o.days*24*60*60*1000));
					e = "; expires="+d.toGMTString();
				}
				document.cookie = BFCONF+"="+Object.toJSON(v)+e+p;
				return v;
			},
			reset: function(){
				var e = new Date(-1).toGMTString();
				document.cookie = BFCONF+"=;"+e+p;
			}
		};

	if (o) {
		if (o.cookie && o.cookie.reset===true) // clean
			mng.reset(o);

		else if (o.id && !o.cfg)	//read
			cf = mng.get(o.id);

		else if (o.id && o.cfg)	//write
			cf = mng.set(o);

	} else {
		cf = mng.get();
	}

	return cf;
};

ch.exmachina.bravofly.utils.buildButton = function(/* object */o){
	var cn = "vg_btn",
		d = $( document.createElement("div") ),
		c = $( document.createElement("div") ),
		t = $( document.createElement("span") )
	;

	c.addClassName("vg_btn_cap_right");
	t.addClassName("vg_btn_text");

	d.appendChild(c);
	d.appendChild(t);

	if (!o){
		return d;
	} else {
		if (o.hasOwnProperty("cname")){
			cn=o.cname;
		}
		if (o.text){
			t.innerHTML = o.text;
		}
		if (o.title){
			d.setAttribute("title",o.title);
		}
	}
	d.addClassName(cn);
	return d;
};

ch.exmachina.bravofly.utils.setInSelect = function( s, v){

	if (!s || s.nodeType != 1 || s.nodeName != "SELECT") return;

	for (var i=0;i<s.length;i++){
		if (s[i].value == v){
			s.selectedIndex = i;
			break;
		}
	}
};

ch.exmachina.bravofly.utils.hasList = function(/* object */ ds){
	/* search for trip and list array */
	var t = ds.trips || null,
		l = t ? t.list : null,
		l = l instanceof Array ? l : null
	;
	return l;
};


ch.exmachina.bravofly.utils.encodeUtf8 = function (s) {
	for(var c, i = -1, l = (s = s.split("")).length, o = String.fromCharCode; ++i < l;
		s[i] = (c = s[i].charCodeAt(0)) >= 127 ? o(0xc0 | (c >>> 6)) + o(0x80 | (c & 0x3f)) : s[i]
	);
	return s.join("");
};
 
ch.exmachina.bravofly.utils.decodeUtf8= function(s){
	for(var a, b, i = -1, l = (s = s.split("")).length, o = String.fromCharCode, c = "charCodeAt"; ++i < l;
		((a = s[i][c](0)) & 0x80) &&
		(s[i] = (a & 0xfc) == 0xc0 && ((b = s[i + 1][c](0)) & 0xc0) == 0x80 ?
		o(((a & 0x03) << 6) + (b & 0x3f)) : o(128), s[++i] = "")
	);
	return s.join("");
};
