var intervalId;

if ( typeof EDODESIGN == 'undefined' ) {
    var EDODESIGN = {};
}

var agt = navigator.userAgent.toLowerCase();
var is_escape = (agt.indexOf("escape") != -1);

Function.prototype.method = function(name,fn) {
    this.prototype[name]=fn;
    return this;
};

EDODESIGN.prototype =
{
        Version: '0.5.1'
}

String.prototype.trim=function(len,p)
{
        if (this.length <= len)
                return this.toString();

        var output=[];

        for (var i=0;i<len;i++)
                output.push(this[i]);

        return output.join("")+p;
}

Date.prototype.setISO8601 = function (string) 
{
	var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" + "([T,\ ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" + "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";

	if (string == undefined || string == null)
		return;

	var d = string.match(new RegExp(regexp));

	var offset = 0;
	var date = new Date(d[1], 0, 1);

	if (d[3]) { date.setMonth(d[3] - 1); }
	if (d[5]) { date.setDate(d[5]); }
	if (d[7]) { date.setHours(d[7]); }
	if (d[8]) { date.setMinutes(d[8]); }
	if (d[10]) { date.setSeconds(d[10]); }
	if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
	if (d[14]) 
	{
	    offset = (Number(d[16]) * 60) + Number(d[17]);
	    offset *= ((d[15] == '-') ? 1 : -1);
	}
	
	offset -= date.getTimezoneOffset();
	time = (Number(date) + (offset * 60 * 1000));
	this.setTime(Number(time));
}

Date.prototype.setMysql = function (timestamp)
{
	var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
	var parts=timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');

	this.setTime(new Date(parts[0],Number(parts[1] - 1),parts[2],parts[3],parts[4],parts[5]));
}

Date.prototype.stringify = function () 
{

	var h = parseInt(this.getHours() - 1);
	var m = this.getMinutes();
	if (m < 10) m = '0' + m;

	var d = '';
	d += this.getDate() + "/" + parseInt(this.getMonth() + 1) + '/' + this.getFullYear() + ' ';

	return d;
}

var regExs = {
	quotes: /\x22/g,
	startspace: /^\s+/g,
	endspace: /\s+$/g,
	striptags: /<\/?[^>]+>/gi,
	hasbr: /<br/i,
	hasp: /<p>/i,
	rbr: /<br>/gi,
	rbr2: /<br\/>/gi,
	rendp: /<\/p>/gi,
	rp: /<p>/gi,
	base64: /[^A-Za-z0-9\+\/\=]/g,
	syntaxCheck: /^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/
}

EDODESIGN.Tools = new Object;

EDODESIGN.Tools.sleep = function(milliseconds) 
{
	var start = new Date().getTime();
	for (var i = 0; i < 1e7; i++) 
		if ((new Date().getTime() - start) > milliseconds)
			break;
}

EDODESIGN.Tools.xmlhttp = function(oContainer,fn)
{
	var oSelf = $T.xmlhttp;

	var loading = 
	{
		start: function()
		{
			var l = document.createElement('div');
			l.setAttribute('id','loading');
			l.innerHTML = 'loading';
			oContainer.appendChild(l);
		},
		stop: function()
		{
			oContainer.removeChild(document.getElementById('loading'));
		}
	};

	this.success = function(o)
	{
		if(o.responseText !== undefined)
		{
			if (fn)
				fn(o);
			else
				oContainer.innerHTML += o.responseText;
		}
	};

	this.failure = function()
	{
		throw new Error("Request failed");
	};

	var callback = 
	{ 
		success:this.success,
		failure:this.failure,
		customevents:
		{ 
			onStart:loading.start, 
			onSuccess:loading.stop,
			onFailure:loading.stop
		}
	}; 

	this.request = function (method,url,params)
	{
		if (params == undefined)
			params = null;

		YAHOO.util.Connect.asyncRequest(method, url , callback, params); 
	};

}

EDODESIGN.Tools.link = function(o,fn,obj,e)
{
	var a = document.createElement('a');

	a.href = o.href;

	if (o.innerHTML != undefined)
		a.innerHTML = o.innerHTML;

	if (o.id != undefined)
		a.setAttribute ('id',o.id);
	
	if (o.className != undefined)
		a.setAttribute ('class',o.className);
	
	if (o.title!= undefined)
		a.setAttribute ('title',o.title);
	
	if (o.appendChild!= undefined)
		a.appendChild(o.appendChild);
	
	if (fn != undefined && fn != null)
	{
		if (YAHOO.lang.isFunction(fn))
		{
			if (e != undefined && typeof(e) == 'string')
				var ev = e;
			else
				var ev = 'click';

			$E.addListener(a, ev, fn, obj);
		}
	}
	return a;
};

EDODESIGN.Tools.printError = function(oContainer,msg)
{
	clearInterval(intervalId);

	if ($('message'))
		$T.removeElement($('message'));

	var div = $T.addElement('div',{id:'message',className:'errormsg'});
	var p = $T.addElement('p',{appendChild:document.createTextNode(msg)});
	div.appendChild(p);
	$(oContainer).appendChild(div);

	intervalId = setInterval(function(){$T.removeElement($('message'));clearInterval(intervalId);}, 10000);

	$T.highlightBackground($('message'));
};

EDODESIGN.Tools.printInfo = function(oContainer,msg)
{
	clearInterval(intervalId);

	if ($('message'))
		$T.removeElement($('message'));

	var div = $T.addElement('div',{id:'message',className:'infomsg'});
	var p = $T.addElement('p',{appendChild:document.createTextNode(msg)});
	div.appendChild(p);
	$(oContainer).appendChild(div);

	intervalId = setInterval(function(){$T.removeElement($('message'));clearInterval(intervalId);}, 10000);
	$T.highlightBackground($('message'));
};

EDODESIGN.Tools.addForm = function(fields)
{
	var form = $T.addElement('form',{id:'form'});

	var ul = $T.addElement('ul');
	for (var i in fields)
	{
		if (fields[i].type != 'hidden')
		{
			var rowevents = 
			{
				'click': function() 
					{
						var rows = this.parentNode.getElementsByTagName('li');

						for (var k=0;k<rows.length;k++)
							$(rows[k]).setAttribute('class','');

						this.setAttribute('class','sel');
					}
			};

			var li = $T.addElement('li',{events:rowevents});

			li.appendChild($T.addElement('label',{'for':fields[i].id},fields[i].name));

			if (fields[i].value != '')
				var val = fields[i].value;
			else
				var val = '';

			if (fields[i].type == 'radio')
			{
				for (var j in fields[i].value)
				{
					var v = fields[i].value[j];
					var checked;
					var radio;

					if (v == fields[i].checked)
						radio = $T.addElement('input',{id:fields[i].id,'name':fields[i].name,'type':fields[i].type,'value':v,'checked':true});
					else
						radio = $T.addElement('input',{id:fields[i].id,'name':fields[i].name,'type':fields[i].type,'value':v});

					$T.addElement('p',{appendChild:v});
					li.appendChild($T.addElement('span',{appendChild:[$T.addElement('p',{className:'label',appendChild:v}),radio]}));
				}
			
			}
			else
			{
				var input = $T.addElement('input',{id:fields[i].id,'name':fields[i].name,'type':fields[i].type,'value':val});
				li.appendChild($T.addElement('div',{appendChild:input}));
			}

			ul.appendChild(li);
		}
		else
		{
			val = fields[i].value;
			var input = $T.addElement('input',{id:fields[i].id,'name':fields[i].name,'type':fields[i].type,'value':val});
			form.appendChild(input);
		}

	}

	form.appendChild(ul);

	return form;

};

EDODESIGN.Tools.calendar = function(div,oContainer) 
{
	if (oContainer == undefined)
		return null;

	if ($D.getStyle(oContainer,'display') == 'block')
		$D.setStyle(oContainer, 'display', 'none');

	var cal = new YAHOO.widget.Calendar("cal",oContainer); 

	cal.cfg.setProperty("MONTHS_LONG", ["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settember","Ottobre","Novembre","Dicembre"]); 
	cal.cfg.setProperty("MONTHS_SHORT", ["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"]); 
	cal.cfg.setProperty("WEEKDAYS_1CHAR", ["D","L","M","M","G","V","S"]); 
	cal.cfg.setProperty("WEEKDAYS_SHORT", ["Do","Lu","Ma","Me","Gi","Ve","Sa"]); 
	cal.cfg.setProperty("WEEKDAYS_LONG",  ["Domenica","Lunedi","Martedi","Mercoledi","Giovedi","Venerdi","Sabato"]); 

	var get_date = function(type,args,obj) 
	{ 
		var date = cal._toDate(args[0][0]);
		var d = date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear(); 
		$(div).value = d; 
		cal.hide();
	}; 

	cal.selectEvent.subscribe(get_date, $T.calendar.cal, true);

	this.render = function()
	{
		$D.setStyle(oContainer, 'display', 'block');
		cal.render(); 
	};
	
	this.hide = function()
	{
		$D.setStyle(oContainer, 'display', 'none');
	};

};

EDODESIGN.Tools.addSelect = function(id,options,selected,fn)
{
	var sel = document.createElement("select");
	sel.id = id;
	sel.name = id;

	if (YAHOO.lang.isFunction(fn))
		sel.onchange = function(){fn();};

	for (var i = 0; i < options.length; i++)
	{
		var el = document.createElement('option');

		el.value = options[i].value;
		el.innerHTML = options[i].html;

		if (selected == options[i].html)
			el.setAttribute('selected','selected');
	
		if (options[i].onclick != null && options[i].onclick != undefined)
			el.onclick = options[i].onclick;
	
		sel.appendChild(el);
	}

	return sel;
};

EDODESIGN.Tools.addTable = function(opts,rows)
{
	var table = $T.addElement('table',{className:opts.className,id:opts.id});
	var thead = $T.addElement('thead');
	var tbody = $T.addElement('tbody');
	var tr = $T.addElement('tr');

	var head = opts.head;
	for (i=0;i<head.length;i++)
		tr.appendChild($T.addElement('th',head[i]));

	thead.appendChild(tr);
	table.appendChild(thead);

	function printRow()
	{
		var id = arguments[0];
		var columns = arguments[1];

		var rowevents = 
		{
			'click': function() 
				{
					var rows = this.parentNode.getElementsByTagName('tr');
					for (var k=0;k<rows.length;k++)
						$(rows[k]).setAttribute('class','tablerow');

					this.setAttribute('class','rowsel');
				},
			'mouseover': function()
				{
					if (this.getAttribute('class') == 'tablerow')
						this.setAttribute('class','rowover');
				},
			'mouseout': function()
				{
					if (this.getAttribute('class') != 'rowsel')
						this.setAttribute('class','tablerow');
				}
		};

		var tr = $T.addElement('tr',{id:'row'+id,className:'tablerow',events:rowevents});
		tr.innerHTML = '';

		for(i in columns)
			tr.appendChild($T.addElement('td',{appendChild:columns[i]}));

		return tr;
	}

	for(i in rows)
		tbody.appendChild (printRow(i,rows[i]));

	table.appendChild(tbody);

	return table;
}

EDODESIGN.Tools.getValue = function(form)
{
	var t = $(form).getElementsByTagName('option');
	for (var i=0;i<t.length;i++)
		if (t[i].selected)
			return t[i].value;

	return -1;
}

EDODESIGN.Tools.trim = function(str) 
{
	return str.replace(regExs.startspace, '').replace(regExs.endspace, '');
}

EDODESIGN.Tools.stripTags = function(str) 
{
	return str.replace(regExs.striptags, '');
}

EDODESIGN.Tools.printf = function() 
{
	var num = arguments.length;
	var str = arguments[0];
	    
	for (var i = 1; i < num; i++) 
	{
		var pattern = "\\{" + (i-1) + "\\}";
		var re = new RegExp(pattern, "g");
		str = str.replace(re, arguments[i]);
	}
	return str;
}

EDODESIGN.Tools.setStyleString = function(el, str) 
{

	if (typeof str != 'string')
		return -1;

	var _tmp = str.split(';');

	for (x in _tmp) 
	{
		if (x) 
		{
			__tmp = $T.trim(_tmp[x]);
			__tmp = _tmp[x].split(':');
		
			if (__tmp[0] && __tmp[1]) 
			{
				var _attr = $T.trim(__tmp[0]);
				var _val = $T.trim(__tmp[1]);

				if (_attr && _val) 
				{
					if (_attr.indexOf('-') != -1) 
					{

						function styleToCamel(str) 
						{
							for (var i = 1, _tmp = str.split('-'); i < _tmp.length; i++)
								_tmp[0] += _tmp[i].substring(0, 1).toUpperCase() + _tmp[i].substring(1, _tmp[i].length); 
							
							return _tmp[0];
						}

						_attr = styleToCamel(_attr);
					}

					$D.setStyle(el, _attr, _val);
				}
			}
		}
	}
}

EDODESIGN.Tools.addElement = function(tag) 
{
	var op = false;

	tag = tag.toLowerCase();
	var el = document.createElement(tag);
	
	if (!el) 
		return false;
	    
	for (var i = 1; i < arguments.length; i++) 
	{
		op = arguments[i];		
		if (typeof op == 'string')
			el.innerHTML = op;
		else if (typeof op == 'object') 
		{
			for (var j in op) 
			{
				switch (j.toLowerCase()) 
				{
					case 'id':
						if ($(op[j]))
							return $(op[j]);
						
						el.setAttribute('id',op[j]);
						break;
					case 'appendchild': 
						if (YAHOO.lang.isArray(op[j]))
						{
							for (k in op[j])
								if (typeof(op[j][k]) == 'string')
									el.appendChild(document.createTextNode(op[j][k]));
								else if (typeof(op[j][k]) == 'object')
									el.appendChild(op[j][k]);
						}
						else 
						{
							if (typeof(op[j]) == 'object')
								el.appendChild(op[j]);
							else if (typeof(op[j]) == 'string')
								el.appendChild(document.createTextNode(op[j]));
						}
						break;
					case 'class':
					case 'classname':
						el.className = op[j];
						break;
					case 'style':
						$T.setStyleString(el, op[j]);
						break;
					case 'events':
						for (k in op[j])
							$E.addListener(el, k , op[j][k], null);
						break;
					default:
						el.setAttribute(j,op[j]);
						break;
				}
			}
		}
	}

	return el;
}

EDODESIGN.Tools.removeElement = function(el) 
{
	if (!(el instanceof Object ))
		el = $(el);

	if (el.parentNode)
		el.parentNode.removeChild(el);
}

EDODESIGN.Tools.setCookie = function(name, value, expires, path, domain, secure) 
{
	var argv = arguments;
	var argc = arguments.length;
	var expires = (argc > 2) ? argv[2] : null;
	var path = (argc > 3) ? argv[3] : '/';
	var domain = (argc > 4) ? argv[4] : null;
	var secure = (argc > 5) ? argv[5] : false;

	document.cookie = name + "=" + escape (value) +
		((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
		((path == null) ? "" : ("; path=" + path)) +
		((domain == null) ? "" : ("; domain=" + domain)) +
		((secure == true) ? "; secure" : "");
}

EDODESIGN.Tools.getCookie = function(name) 
{
	var dc = document.cookie;
	var prefix = name + '=';
	var begin = dc.indexOf('; ' + prefix);

	if (begin == -1) 
	{
	    begin = dc.indexOf(prefix);
	    	if (begin != 0) return null;
	} 
	else
	    begin += 2;

	var end = document.cookie.indexOf(';', begin); 
	if (end == -1)
	    end = dc.length;

	return unescape(dc.substring(begin + prefix.length, end));
}

EDODESIGN.Tools.deleteCookie = function(name, path, domain) 
{
	if (getCookie(name))
		document.cookie = name + '=' + ((path) ? '; path=' + path : '') + ((domain) ? '; domain=' + domain : '') + '; expires=Thu, 01-Jan-70 00:00:01 GMT';
}

EDODESIGN.Tools.getBrowserAgent = function() 
{
	var ua = navigator.userAgent.toLowerCase();
	var opera = ((ua.indexOf('opera') != -1) ? true : false);
	var espial = ((ua.indexOf('escape') != -1) ? true : false);
	var safari = ((ua.indexOf('safari') != -1) ? true : false);
	var firefox = ((ua.indexOf('firefox') != -1) ? true : false);
	var msie = ((ua.indexOf('msie') != -1) ? true : false);
	var mac = ((ua.indexOf('mac') != -1) ? true : false);
	var unix = ((ua.indexOf('x11') != -1) ? true : false);
	var win = ((mac || unix) ? false : true);
	var version = false;
	var mozilla = false;
	
	if (!firefox && !safari && (ua.indexOf('gecko') != -1)) {
		mozilla = true;
		var _tmp = ua.split('/');
		version = _tmp[_tmp.length - 1].split(' ')[0];
	}

	if (firefox) 
	{
		var _tmp = ua.split('/');
		version = _tmp[_tmp.length - 1].split(' ')[0];
	}
	if (msie) 
		version = ua.substring((ua.indexOf('msie ') + 5)).split(';')[0];

	if (safari) 
		version = this.getBrowserEngine().version;

	if (opera)
		version = ua.substring((ua.indexOf('opera/') + 6)).split(' ')[0];
	
	var browsers = {
	    ua: navigator.userAgent,
	    opera: opera,
	    espial: espial,
	    safari: safari,
	    firefox: firefox,
	    mozilla: mozilla,
	    msie: msie,
	    mac: mac,
	    win: win,
	    unix: unix,
	    version: version
	}
	return browsers;
}

EDODESIGN.Tools.insertAfter = function(el, curNode) 
{
	if (curNode.nextSibling)
		curNode.parentNode.insertBefore(el, curNode.nextSibling);
	else
		curNode.parentNode.appendChild(el);
}

EDODESIGN.Tools.inArray = function(arr, val) 
{
	if (arr instanceof Array) 
		for (var i = (arr.length -1); i >= 0; i--) 
			if (arr[i] === val) 
				return true;

	return false;
}

EDODESIGN.Tools.checkBoolean = function(str) 
{
	return ((typeof str == 'boolean') ? true : false);
}

EDODESIGN.Tools.checkNumber = function(str) 
{
	return ((isNaN(str)) ? false : true);
}

EDODESIGN.Tools.SHA1 = function (msg) 
{
	function rotate_left(n,s) 
	{
		var t4 = ( n<<s ) | (n>>>(32-s));
		return t4;
	};

	function lsb_hex(val) 
	{
		var str="";
		var i;
		var vh;
		var vl;
		
		for( i=0; i<=6; i+=2 ) 
		{
			vh = (val>>>(i*4+4))&0x0f;
			vl = (val>>>(i*4))&0x0f;
			str += vh.toString(16) + vl.toString(16);
		}
		return str;
	};
	
	function cvt_hex(val) 
	{
		var str="";
		var i;
		var v;
		
		for( i=7; i>=0; i-- ) 
		{
			v = (val>>>(i*4))&0x0f;
			str += v.toString(16);
		}
		return str;
	};
	
	function Utf8Encode(string) 
	{
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
		
		for (var n = 0; n < string.length; n++) 
		{
			var c = string.charCodeAt(n);
			
			if (c < 128)
				utftext += String.fromCharCode(c);
			else if((c > 127) && (c < 2048)) 
			{
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else 
			{
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
	
		}
	
		return utftext;
	};
	
	var blockstart;
	var i, j;
	var W = new Array(80);
	var H0 = 0x67452301;
	var H1 = 0xEFCDAB89;
	var H2 = 0x98BADCFE;
	var H3 = 0x10325476;
	var H4 = 0xC3D2E1F0;
	var A, B, C, D, E;
	var temp;
	
	msg = Utf8Encode(msg);
	
	var msg_len = msg.length;
	
	var word_array = new Array();
	for( i=0; i<msg_len-3; i+=4 ) 
	{
		j = msg.charCodeAt(i)<<24 | msg.charCodeAt(i+1)<<16 |
		msg.charCodeAt(i+2)<<8 | msg.charCodeAt(i+3);
		word_array.push( j );
	}
	
	switch( msg_len % 4 ) 
	{
		case 0:
		i = 0x080000000;
		break;
		case 1:
		i = msg.charCodeAt(msg_len-1)<<24 | 0x0800000;
		break;
		case 2:
		i = msg.charCodeAt(msg_len-2)<<24 | msg.charCodeAt(msg_len-1)<<16 | 0x08000;
		break;
		case 3:
		i = msg.charCodeAt(msg_len-3)<<24 | msg.charCodeAt(msg_len-2)<<16 | msg.charCodeAt(msg_len-1)<<8    | 0x80;
		break;
	}
	
	word_array.push( i );

	while( (word_array.length % 16) != 14 ) word_array.push( 0 );

	word_array.push( msg_len>>>29 );
	word_array.push( (msg_len<<3)&0x0ffffffff );


	for ( blockstart=0; blockstart<word_array.length; blockstart+=16 ) 
	{
		
		for( i=0; i<16; i++ ) W[i] = word_array[blockstart+i];
		for( i=16; i<=79; i++ ) W[i] = rotate_left(W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16], 1);
		
		A = H0;
		B = H1;
		C = H2;
		D = H3;
		E = H4;
		
		for( i= 0; i<=19; i++ ) 
		{
			temp = (rotate_left(A,5) + ((B&C) | (~B&D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}
		
		for( i=20; i<=39; i++ ) 
		{
			temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}
		
		for( i=40; i<=59; i++ ) 
		{
			temp = (rotate_left(A,5) + ((B&C) | (B&D) | (C&D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}
		
		for( i=60; i<=79; i++ ) 
		{
			temp = (rotate_left(A,5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
			E = D;
			D = C;
			C = rotate_left(B,30);
			B = A;
			A = temp;
		}
		
		H0 = (H0 + A) & 0x0ffffffff;
		H1 = (H1 + B) & 0x0ffffffff;
		H2 = (H2 + C) & 0x0ffffffff;
		H3 = (H3 + D) & 0x0ffffffff;
		H4 = (H4 + E) & 0x0ffffffff;

	}

	var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
	
	return temp.toLowerCase();
}

$E = YAHOO.util.Event;
$D = YAHOO.util.Dom;
$T = EDODESIGN.Tools;
$ = $D.get;
$$ = $D.getElementsByClassName;

