/*Adding String trim functions*/
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}



var GS_months_short = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var GSJSLib = {};
GSJSLib.Misc = {
		parentNode: function (obj, tagName) {
			var o=obj;
			for(o=o.parentNode;;o=o.parentNode){
				if(o.tagName.toLowerCase()==tagName.toLowerCase()){	
					return o;
				}
			}
			return null;
		},
		BookmarkPage: function () {
			var url = window.location.href;
			var title = document.title;
			if (window.sidebar) { // Mozilla Firefox Bookmark
				window.sidebar.addPanel(title, url,"");
			}else if( window.external ) { // IE Favorite
				window.external.AddFavorite( url, title);
			}else if(window.opera && window.print) { // Opera Hotlist
				return true;
			}
		},
		PrintPage: function () {
			window.print();
		},
		CurrentURL: function () {
			return window.location.href;
		},
		today: function () {	// format today's date as <date> <month> <year> ... eg. 24 Jan 2009
			var today = new Date();
			var returnText = today.getDate() + " " + GS_months_short[today.getMonth()] + " " + today.getFullYear();
			return returnText;			
		},
		escapeHTML: function (str) {
			var div = document.createElement('div');
			var text = document.createTextNode(str);
			div.appendChild(text);
			return div.innerHTML;
		},
		unescapeHTML: function (str) {
			var div = document.createElement('div');
			div.innerHTML = str.replace(/<\/?[^>]+>/gi, '');
			return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
		},
		/**
		 * Gets a Date objects from a string given a format.
		 * @param strdate The string with the date.
		 * @param format The date's format.
		 * @return A Date object with the date of string according to the format, or
		 * null if string is empty or non-valid.
		 */
		getDateFromString: function(strdate, format) 
		{
			var aDate = new Date();
			var day, month, year;
			
			if (strdate == "" || format == "") return null;
			strdate = strdate.replace("/", "@").replace("/", "@");
			strdate = strdate.replace("-", "@").replace("-", "@");
			strdate = strdate.replace(".", "@").replace(".", "@");
			// check again
			if (strdate.indexOf("/")>=0 || strdate.indexOf("-")>=0 || strdate.indexOf(".")>=0) return null;
			// validate all other stuff
			var data = strdate.split("@");
			if (data.length != 3) return null;
			for (i=0; i<3; i++){
				data[i] = parseFloat(data[i]);
				if (isNaN(data[i])) return null;
			}
			aDate.setDate(1);
			if (format.substring(0,1).toUpperCase() == "D"){
				aDate.setFullYear(this.yearTwo2Four(data[2]));
				aDate.setMonth(data[1]-1);
				aDate.setDate(data[0]);
			}
			else if (format.substring(0,1).toUpperCase() == "Y"){
				aDate.setFullYear(this.yearTwo2Four(data[0]));
				aDate.setMonth(data[1]-1);
				aDate.setDate(data[2]);
			}
			else if (format.substring(0,1).toUpperCase() == "M"){
				aDate.setFullYear(this.yearTwo2Four(data[2]));
				aDate.setMonth(data[0]-1);
				aDate.setDate(data[1]);
			}
			return aDate;
		},
		/**
		 * Transform a two digits year into a four digits year.
		 * All year from 30 to 99 are trated as 19XX, year before
		 * 30 are trated as 20XX
		 */
		yearTwo2Four: function(year)
		{
			if (year < 99){
				if (year >= 30){
					year += 1900;
				}
				else{
					year += 2000;
				}
			}
			return year;
		}
};
GSJSLib.Effects = {
		/**
		 * Fades the element with the given elementid after time millliseconds
		 */
	Fade: function (elementid, time) {
		setTimeout('Effect.Fade('+elementid+', {duration: 0.5})', time);
	},
	SlideUp: function (elementid, time) {
		setTimeout('Effect.SlideUp('+elementid+', {duration: 0.5})', time);
	},
	Appear: function (elementid, time) {
		setTimeout('Effect.Appear('+elementid+', {duration: 0.5})', time);
	}
};
GSJSLib.Ajax = {
	CreateXMLHttpRequest: function() {
		if( window.XMLHttpRequest ){
			return new XMLHttpRequest();
		}else{
			if(window.ActiveXObject){
				return new ActiveXObject( "Microsoft.XMLHTTP" );
			}
		}
		return null;
	},
	LoadTEXT: function( url ){
		var xmlHttp=this.CreateXMLHttpRequest();
		xmlHttp.open('GET',url,false);
		xmlHttp.send(null);
		return xmlHttp.responseText;
	},
	AjaxRequest: function( url, obj ){					// obj has callback functions for different readyStates
		var xmlHttp=this.CreateXMLHttpRequest();
		xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState == 2)
				obj.requestSent();
			else if (xmlHttp.readyState == 3)
				obj.requestInProcess();
			else if (xmlHttp.readyState == 4)
				obj.requestComplete(xmlHttp.responseText);
		};
		xmlHttp.open('GET',url,true);
		xmlHttp.send(null);
//		return xmlHttp.responseText;
	},
	SubmitForm: function (url, obj) {				// obj has callback functions for different readyStates
		var xmlHttp=this.CreateXMLHttpRequest();
		xmlHttp.onreadystatechange = function() {
			if (xmlHttp.readyState == 2)
				obj.requestSent();
			else if (xmlHttp.readyState == 3)
				obj.requestInProcess();
			else if (xmlHttp.readyState == 4)
				obj.requestComplete(xmlHttp.responseText);
		};
		xmlHttp.open('POST', url, true);
		xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		var params = obj.getParameters();
		xmlHttp.setRequestHeader("Content-length", params.length);
		xmlHttp.setRequestHeader("Connection", "close");
		xmlHttp.send(params);
	}
};

GSJSLib.XML = {
		parseXMLString: function(s) {
			try //Internet Explorer
			{
			  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
			  xmlDoc.async="false";
			  xmlDoc.loadXML(s);
			}
			catch(e)
			{
			  try //Firefox, Mozilla, Opera, etc.
			  {
				  parser=new DOMParser();
				  xmlDoc=parser.parseFromString(s,"text/xml");
			  }
			  catch(e)
			  {
				  alert(e.message);
				  return null;
			  }
			}
			return xmlDoc;
		},
		
		parseXML: function(x) {
			try //Internet Explorer
		    {
			  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
			}
			catch(e)
			{
			  try //Firefox, Mozilla, Opera, etc.
			  {
			    xmlDoc=document.implementation.createDocument("","",null);
			  }
			  catch(e)
			  {
			    alert(e.message);
			    return;
			  }
			}
			xmlDoc.async=false;
			xmlDoc.load("note.xml");
			return xmlDoc;
		}
};

GSJSLib.FormValidation = {
		emailCheck: function(str) {
			var at="@"
			var dot="."
			var lat=str.indexOf(at)
			var lstr=str.length
			var ldot=str.indexOf(dot)
			if (str.indexOf(at)==-1){
			   return false
			}
	
			if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr){
			   return false
			}
	
			if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr){
			    return false
			}
	
			if (str.indexOf(at,(lat+1))!=-1){
			    return false
			}
	
			if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
				return false
			}
			
			if (str.indexOf(dot,(lat+2))==-1){
				return false
			}
			
			if (str.indexOf(" ")!=-1){
				return false
			}
			
			return true					

		},
		ValidateRequiredField: function(field) {
			with (field)
			{
				if (value==null||value.trim()=="") return false;
				else return true;
			}
		},
		NumberFormatCheck: function(field) {
			with (field)
			{
				if (value == null) return false;
				var ValidChars = "0123456789";
				var IsNumber=true;
				var Char;
			 
				for (i = 0; i < value.length && IsNumber == true; i++) 
				{
					Char = value.charAt(i); 
					if (ValidChars.indexOf(Char) == -1) 
					{
						IsNumber = false;
					}
				}
				return IsNumber;
			}
		}
};


