var Valraiso =
{
	namespace : function(name)
	{
		if ( !name || !name.length )
		{
			return null;
		}

		var current = window;
		var names = name.split(".");
		for ( var i = 0 ; i < names.length ; i++ )
		{
			current[names[i]] = current[names[i]] || {};
			current = current[names[i]];
		}
	},

	extend : function(obj, properties)
	{
		if ( !obj )
		{
			return;
		}
		
		for ( property in properties )
		{
			obj[property] = properties[property];
		}
	}
};

//--------------------------------------------------------------------------->

Valraiso.namespace('Valraiso.images');
Valraiso.images =
{
	toPNG: function(img)
	{
		img = EL(img);
		
		var src = img.getAttribute("source");
		
		var browser = Valraiso.net.Browser.Instance;
		
		if( browser.isMSIE && browser.majorVersion < 7 )
		{
			img.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' + src + ')';
			img.src=Valraiso.contextPath + '/common/img/none.gif';
		}
		else
		{
			img.src = src;
		}
	},
	
	changePNG: function(img, src)
	{
		var browser = Valraiso.net.Browser.Instance;
		
		if( browser.isMSIE && browser.majorVersion < 7 )
		{
			img.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' + src + ')';
		}
		else
		{
			img.src = src;
		}
	},
	
	createPNG : function(url)
	{
		var img = document.createElement('img');
		
		var browser = Valraiso.net.Browser.Instance;
		
		if( browser.isMSIE && browser.majorVersion < 7 )
		{
			img.src=Valraiso.contextPath + '/common/img/none.gif';
			img.style.filter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' + url + ')';
		}	
		else
		{
			img.src=url;
		}
		
		return img;
	},
	
	renderPNG : function(url, parent)
	{
		if( parent != null )
		{
			parent = EL(parent);
			
			var img = Valraiso.images.createPNG(url);
			parent.appendChild(img);
		}
		else
		{
			var s = "<img ";
			
			var browser = Valraiso.net.Browser.Instance;
		
			if( browser.isMSIE && browser.majorVersion < 7 )
			{
				s += ' src="' + Valraiso.contextPath + '/common/img/none.gif"';
				s += 'style="filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' + url + ')"';
			}	
			else
			{
				s += 'src="' + url + '"';
			}
			
			s += ">";
			document.write(s);
		}
	},
	
	mouseOver : function(img, newsrc)
	{
		img.save = img.src;
		img.src = newsrc;
	},
	
	mouseOut : function(img)
	{
		img.src = img.save;
	}
};

//--------------------------------------------------------------------------->

Valraiso.namespace('Valraiso.DOM');
Valraiso.DOM =
{
	toElement : function(e)
	{
		if ( typeof e == "string" )
		{
			return document.getElementById(e);
		}

		return e;
	},

	getClassNames : function(element)
	{
		return EL(element).className.split(/\s+/);
	},

	updateClassName : function(element, classNames)
	{
		EL(element).className = classNames.join(' ');
	},
	
	hasClassName : function(element, className)
	{
		var classes = Valraiso.DOM.getClassNames(element);
		for ( var i = 0 ; i < classes.length ; i++ )
		{
			if ( classes[i] == className )
			{
				return true;
			}
		}

		return false;
	},
	
	addClassName : function(element, className, multiply)
	{
		if ( Valraiso.DOM.hasClassName(element, className) )
		{
			return;
		}
		
		var classes = Valraiso.DOM.getClassNames(element);

		if ( multiply )
		{
			var l = classes.length;
			for ( var i = 0 ; i < l ; i++ )
			{
				classes.push(classes[i] + '-' + className);
			}
		}

		classes.push(className);
		Valraiso.DOM.updateClassName(element, classes);
	},

	removeClassName : function(element, className, multiply)
	{
		var classes = Valraiso.DOM.getClassNames(element);
		var newClasses 	= new Array();
		var reg = new RegExp('-?(' + className + '-|' + className + '$)');

		var i, j;
		for ( i = 0, j = 0; i < classes.length ; i++ )
		{
			if ( !multiply )
			{	
				if ( classes[i]	!= className )
				{
					newClasses[j++] = classes[i];
				}
			}
			else
			{
				if ( !reg.test(classes[i]) )
				{
					newClasses[j++] = classes[i];
				}
			}
		}

		Valraiso.DOM.updateClassName(element, newClasses);
	}
};
var EL = Valraiso.DOM.toElement;

//--------------------------------------------------------------------------->

Valraiso.namespace("Valraiso.util");
Valraiso.util =
{
	trim : function(s)
	{
		if ( typeof s != "string" )
		{
			return s;	
		} 

		return s.replace(/^(\s*)([\W\w]*)(\b\s*$)/, '$2');
	},
	
	checkDate: function(value, format)
	{	
		if( value == null || value.length == 0 || value.split('/').length != 3 )
		{
			return false;
		}
		
		var dayPart;
		var monthPart;
		var yearPart;
		
		if( format == null || format.split('/').length != 3 )
		{
			format = 'dd/mm/yyyy';
		}
		
		format          = format.toLowerCase();		
		var formatParts = format.split('/');
				
		function identifyPart(parts, pattern)
		{
			for(var i = 0; i < parts.length ; i ++ )
			{
				if( formatParts[i].indexOf(pattern) > -1 )
				{
					return {index: i, length: formatParts[i].length};
				}												
			}
			
			return null;
		}
		
		dayPart    = identifyPart(formatParts, 'dd'), 
		monthPart  = identifyPart(formatParts, 'mm');
		yearPart   = identifyPart(formatParts, 'yy');							
		
		var valueParts = value.split('/');			
		var day        = valueParts[dayPart.index];
		var month      = valueParts[monthPart.index];
		var year       = valueParts[yearPart.index];
		
		if( day.length != dayPart.length || month.length != monthPart.length || year.length != yearPart.length )
		{
			return false;
		}
		
		var date        = new Date(year, parseInt(month, 10) - 1, day);	
		var yearCompare = ( year.length == 2 ) ? date.getYear() : date.getFullYear(); 
		
		if( date.getDate() != parseInt(day, 10) || date.getMonth() != (parseInt(month, 10) - 1) || yearCompare != parseInt(year, 10) )
		{
			return false;
		}
		
		return true;
	},
	
	intToString : function(v, nbDigit)
	{
		var s 	= '' + v;
		if ( v < 0 )
		{
			return s;
		}
		
		var l = nbDigit - s.length;
		if ( l <= 0 )
		{
			return s;
		}
		
		// insert '0'
		for ( var i = 0; i < l; i++, s = '0' + s );

		return s;
	},
	
	changeOpacity: function(id, opacity)
	{
		/*
		if( slidePause )
		{
			setTimeout( function() { Valraiso.util.changeOpacity(id, opacity)} , 500);	
			return;
		}
		*/
		
		if( EL(id) == null )
		{
			return;	
		}
		
		var object = EL(id).style; 
		object.opacity = (opacity / 100);
		object.MozOpacity = (opacity / 100);
		object.filter = "alpha(opacity=" + opacity + ")";
	},
	
	fading: function(id,opacStart,opacEnd,millisec)
	{
		if( EL(id) == null )
		{
			return;	
		}
		
		//speed for each frame
		var speed = Math.round(millisec / 100);
		var timer = 0;
		
		//determine the direction for the blending, if start and end are the same nothing happens
		if(opacStart > opacEnd)
		{
			for(i = opacStart; i >= opacEnd; i--)
			{
				//setTimeout("Valraiso.util.changeOpacity('" + id + "'," + i + " )",(timer * speed));
				Valraiso.timer.TaskManager.Instance.addTask( "Valraiso.util.changeOpacity('" + id + "'," + i + " )",(timer * speed), 1);
				timer++;
			}
		}
		else if(opacStart < opacEnd)
		{
			for(i = opacStart; i <= opacEnd; i++)
			{
				//setTimeout("Valraiso.util.changeOpacity('" + id + "'," + i + " )",(timer * speed));
				Valraiso.timer.TaskManager.Instance.addTask( "Valraiso.util.changeOpacity('" + id + "'," + i + " )",(timer * speed), 1 );
				timer++;
			}
		}
	},
	
	checkEmail: function(val)
	{
		var usr = "([a-zA-Z0-9][a-zA-Z0-9_.-]*|\"([^\\\\\x80-\xff\015\012\"]|\\\\[^\x80-\xff])+\")";
		var domain = "([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}";
		var regex = "^"+usr+"\@"+domain+"$";
		var myrxp = new RegExp(regex);
	
		return(myrxp.test(val));
	},
	
	addWindowOnload: function(func)
	{
		var windowonload = window.onload;
		
		window.onload = function()
		{
			if( windowonload != null )
			{
				windowonload();
			}	
			
			func();
		}
	},
	
	addEnterEvent: function(elt, func)
	{
		if( elt == null )
		{
			return null;
		}
		
		elt = EL(elt);
		
		if( document.all )
		{
			elt.onkeydown = function() { if( event.keyCode == 13) func(event); };
		}
		else
		{
			elt.onkeydown = function(e) { if( e.keyCode == 13) func(e); };
		}
	},
	
	launchWhenBWisLoaded: function( bw, func)
	{
		if( typeof bw == 'string' )
		{
			bw = document.getElementById(bw);		
		}
		
		if( !bw.selfclassName )
		{
			setTimeout( function() { Valraiso.util.launchWhenBWisLoaded( bw, func); }, 500);
			return;
		}
		
		func();
	}
};

//--------------------------------------------------------------------------->

Valraiso.namespace('Valraiso.timer');
Valraiso.timer.TaskManager = function()
{
	this.initialize.apply(this, arguments)		
};

Valraiso.timer.TaskManager.prototype =
{
	tasks:[],
	
	time: 0,
	
	initialize: function()
	{
	},
	
	updateTask: function(name, func, interval, nb)
	{
		for(var i = 0; i < this.tasks.length; i ++)
		{
			var t = this.tasks[i]; 
			
			if( t.name == name )
			{
				t.func = func;
				t.interval = interval;
				t.nb = nb;
				t.last = new Date().getTime();
				t.counter = 0;
				
				return;	
			}	
		}	
		
		this.addTask( func, interval, nb, name);

	},
	
	addTask: function(func, interval, nb, name)
	{
		
		var t = {};
		
		t.func 		= func;
		t.interval 	= interval;
		t.nb 		= nb != null ? nb : 0;
		t.last 		= new Date().getTime();
		t.counter 	= 0;
		t.name 		= name;
		
		this.tasks.push(t);
		
	},
	
	pause: function ()
	{
		this.stopped = true;
	},
	
	resume : function()
	{
		this.stopped = false;
		this.startTime = new Date().getTime();
	},
	
	start: function ()
	{
		this.startTime = new Date().getTime();
		
		setInterval( function() {Valraiso.timer.TaskManager.Instance.loop() } , 150 );
		
		this.stopped = false;
	},
	
	loop: function ()
	{
		var time = new Date().getTime();
		
		if( this.stopped )
		{
			return;
		}
		
		var tmp = [];
		
		for(var i = 0; i < this.tasks.length; i ++)
		{
			var t = this.tasks[i]; 
			
			if( t.nb > 0 && t.counter >= t.nb )
			{
				continue;
			}
			
			tmp.push(t);
		}
		
		this.tasks = tmp;
		
		for(var i = 0; i < this.tasks.length; i ++)
		{
			var t = this.tasks[i]; 
			
			if( time - t.last > t.interval )
			{
				if( typeof t.func == 'string' )
				{
					eval(t.func);	
				}
				else
				{
					t.func();
				}
				t.last = time;
				t.counter++;
			}
		}
	}
};

Valraiso.timer.TaskManager.Instance = new Valraiso.timer.TaskManager();

//--------------------------------------------------------------------------->

Valraiso.namespace("Valraiso.net");
Valraiso.net.Browser = function()
{
	this.initialize.apply(this, arguments)		
};

Valraiso.net.Browser.prototype = 
{
	navigator : null, 
	platform : null,
	userAgent : null,

	isWin32	: false,
	isLinux	: false,
	isMac	: false,

	isGecko		: false,
	isFirefox 	: false,
	isNetscape 	: false,
	isMSIE		: false,
	isSafari	: false,
	isOpera		: false,
		
	code : null,
	name : null,

	majorVersion 	: 0,
	minorVersion 	: 0,
	minorVersion2 	: 0,
	version		: "",

	/**
	 * The engine inner object
	 */
	_Engine : function()
	{
		/**
		 * The engine code
		 * (Mozilla, Opera, ...) 
		 */
		this.code = navigator.appCodeName;
			
		/**
		 * The engine version : version + platform + ...
		 */
		this.versionString	= navigator.appVersion;
		this.version 		= parseFloat(this.versionString);

		/**
		 * The name of the client that implements this engine.
		 */
		this.clientName	= navigator.appName;
	},

	//-------------------------------------------->
	
	/**
	 * Creates a new declared Browser
	 */
	initialize : function()
	{
		this.navigator	= window.navigator;
		this.Engine 	= new this._Engine();
		this.platform	= navigator.platform;
		this.userAgent	= navigator.userAgent;

		this.isWin32	= (this.platform.indexOf("Win32") >= 0);
		this.isLinux	= (this.platform.indexOf("Linux") >= 0);
		this.isMac	= (this.platform.indexOf("Mac") >= 0);

		this.isGecko 	= (this.userAgent.indexOf("Gecko/") >= 0);
		this.isFirefox 	= (this.userAgent.indexOf("Firefox/") >= 0);
		this.isNetscape = (this.userAgent.indexOf("Netscape/") >= 0);
		this.isMSIE	= (this.userAgent.indexOf("MSIE") >= 0);
		this.isSafari	= (this.userAgent.indexOf("Safari/") >= 0);
		this.isOpera	= (this.userAgent.indexOf("Opera") >= 0);
		if( this.isOpera )
		{
			this.isMSIE = false;
		}
		
		this.code = this.Engine.code;
		if ( this.isGecko )	this.code = "Gecko";
		if ( this.isFirefox ) 	this.code = "Firefox";
		if ( this.isNetscape ) 	this.code = "Netscape";
		if ( this.isMSIE )	this.code = "MSIE";
		if ( this.isSafari )	this.code = "Safari";
		if ( this.isOpera )	this.code = "Opera";
		
		this.name = this.Engine.clientName;
		if ( this.isFirefox ) 	this.name = "Mozilla Firefox";
		if ( this.isSafari ) 	this.name = "Safari"
		if ( this.isOpera ) 	this.name = "Opera"

		/**
		 * The version of the browser
		 */
		this.version = "" + this.Engine.version;

		//------------------------------------
		// Detect the version of the browser 
		//------------------------------------
		
		if ( this.code )
		{
			var reg = new RegExp(this.code + '/?\\s?;?([\\d.]*)');
			var res = this.userAgent.match(reg);
			
			if ( res.length == 2 )
			{
				this.version = res[1];
				
				res = this.version.match(/\d+/g);
				this.majorVersion	= (res[0] ? parseInt(res[0]) : 0);
				this.minorVersion  	= (res[1] ? parseInt(res[1]) : 0);
				this.minorVersion2	= (res[2] ? parseInt(res[2]) : 0);
			}
		}
	} 
};
Valraiso.net.Browser.Instance = new Valraiso.net.Browser();

//--------------------------------------------------------------------------->

Valraiso.namespace('Valraiso.CSS');
Valraiso.CSS =
{
	appendNavigatorInformations : function ()
	{
		var list = document.getElementsByTagName("html");
		if ( list != null && list.length > 0 )
		{
			// presume that only one html tag has been declared 
			var html = list.item(0);
			
			// get the browser
			var browser = Valraiso.net.Browser.Instance;
			var classNames = Valraiso.DOM.getClassNames(html);

			classNames.push(browser.isGecko 	? "Gecko" 	: "NotGecko");
			classNames.push(browser.isFirefox 	? "Firefox" 	: "NotFirefox");
			classNames.push(browser.isNetscape 	? "Netscape" 	: "NotNetscape");
			classNames.push(browser.isSafari 	? "Safari" 	: "NotSafari");
			classNames.push(browser.isOpera 	? "Opera" 	: "NotOpera");
			classNames.push(browser.isMSIE 		? "MSIE" 	: "NotMSIE");
			
			if( browser.isMSIE )
			{
				classNames.push("MSIE" + browser.majorVersion);
			}

			Valraiso.DOM.updateClassName(html, classNames);
		}
	}
};
Valraiso.CSS.appendNavigatorInformations();

//--------------------------------------------------------------------------->

Valraiso.namespace("Valraiso.CSS.events");
Valraiso.CSS.events = 
{
	overOn : function(element, multiply)
	{
		Valraiso.DOM.addClassName(element, "over", multiply);
	},

	outOf : function(element, multiply)
	{
		Valraiso.DOM.removeClassName(element, "over", multiply);
	},

	clickOn : function(element, multiply, toggleSelect)
	{
		if ( Valraiso.DOM.hasClassName(element, "clicked") )
		{
			Valraiso.DOM.removeClassName(element, "clicked", multiply);
		}
		else
		{
			Valraiso.DOM.addClassName(element, "clicked", multiply);
		}

		if ( toggleSelect )
		{
			Valraiso.CSS.events.toggleSelect();
		}
	},

	toggleSelect : function()
	{
		var selects = document.getElementsByTagName('select');
		
		if( selects.length == 0 )
		{
			return;	
		}
		
		var visibility = (selects[0].style.visibility == 'hidden') ? 'visible' : 'hidden';
		
		for(var i = 0; i < selects.length ; i ++)
		{
			selects.item(i).style.visibility = visibility;	
		}
	},
	
	showSelect : function()
	{
		var selects = document.getElementsByTagName('select');
		
		if( selects.length == 0 )
		{
			return;	
		}
		
		for(var i = 0; i < selects.length ; i ++)
		{
			selects.item(i).style.visibility = 'visible';	
		}
	},
	
	hideSelect : function()
	{
		var selects = document.getElementsByTagName('select');
		
		if( selects.length == 0 )
		{
			return;	
		}
		
		for(var i = 0; i < selects.length ; i ++)
		{
			selects.item(i).style.visibility = 'hidden';	
		}
	}
};

//--------------------------------------------------------------------------->
Valraiso.namespace('Valraiso.form');
Valraiso.form =
{
	isEmpty: function(element)
	{
		var value = Valraiso.form.getFieldValue(element);
		
		if( value == null )
		{
			return true;	
		}
		
		return false;
	},
	
	checkDate: function(element, format)
	{
		var value = Valraiso.form.getFieldValue(element);
		
		if( value == null )
		{
			return false;	
		}
		
		return Valraiso.util.checkDate(value, format);
	},
	
	getFieldValue: function(element)
	{
		element = EL(element);
		
		var value;
		
		if( element == null )
		{
			return null;
		}	
		
		switch(element.type)
		{
			case 'password':
			case 'textarea':
			case 'text':
			{
				value = element.value;
				break;
			}
			case 'select-one':
			{
				value = Valraiso.form.select.getSelectedValue(element);
				break;
			}
			
			case 'radio':
			{
				for(var i = 0; i < element.options.length; i ++)
				{
					if( element.options[i].checked )
					{
						value = element.options[i].value;	
					}	
				}
				
				break;
			}
			
			default:
				if( typeof element == 'object' )
				{
					for(var i = 0; i < element.length ; i ++ )
					{
						if( element[i].checked )
						{
							value = element[i].value;	
						}
					}
				}
				break;
		}
		
		if( value == null || value.length == 0 )
		{
			return null;	
		}
		
		return value;
	}
};

Valraiso.namespace('Valraiso.form.select');
Valraiso.form.select =
{
	getSelectedOption : function (element)
	{
		element = EL(element);
		if ( element.selectedIndex < 0 )
		{
			return null;
		}

		return element.options[element.selectedIndex];
	},
	
	getSelectedValue : function (element)
	{
		return Valraiso.form.select.getSelectedOption(element).value;
	},
	
	getSelectedText : function (element)
	{
		return Valraiso.form.select.getSelectedOption(element).text;
	},
	
	setSelectedValue : function (element, value)
	{
		for(var i = 0; i < EL(element).options.length ; i ++)
		{
			var opt = EL(element).options[i];
			
			if( opt.value == value )
			{
				EL(element).selectedIndex = i;
				break;
			}
		}	
	},

	clear : function(element)
	{
		element = EL(element);
		while ( element.firstChild != null )
		{
			element.removeChild( element.firstChild );
		}
	},

	appendOption : function(element, value, text)
	{
		element = EL(element);

		var o = document.createElement ("option");
		o.setAttribute("value", value);
		o.appendChild( document.createTextNode(text) );

		element.appendChild(o);
	},
	
	appendDisabledOption : function(element, text)
	{
		element = EL(element);

		var o = document.createElement ("optgroup");
		o.setAttribute("label", text);
		o.className = "optdisabled";

		element.appendChild(o);
	},
	
	appendOptions : function (element, data, clear)
	{
		element = EL(element);
		
		if( clear )
		{
			Valraiso.form.select.clear(element);
		}
		
		for(value in data)
		{
			Valraiso.form.select.appendOption(element, value, data[value]);
		}	
	},
	
	
	
	appendDisabledOptions : function (element, data, clear, disabledList)
	{
		element = EL(element);
		
		if( clear )
		{
			Valraiso.form.select.clear(element);
		}
		
		for(value in data)
		{
			if( disabledList[value] )
			{
				Valraiso.form.select.appendDisabledOption(element, data[value]);
			}
			else
			{
				Valraiso.form.select.appendOption(element, value, data[value]);
			}
		}	
	}
};
