// JavaScript Document

//emailRe = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*\.(\w{2}|(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum))$/
//phoneRe = /^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,3})|(\(?\d{2,3}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/

var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
}

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

Object.extend(String, {
  interpret: function(value) {
    return value == null ? '' : String(value);
  },
  specialChar: {
    '\b': '\\b',
    '\t': '\\t',
    '\n': '\\n',
    '\f': '\\f',
    '\r': '\\r',
    '\\': '\\\\'
  }
});

Object.extend(String.prototype, {
	trim: function(){ // Trim : Usage => var test3 = test.trim();
		return this.replace(/^\s+|\s+$/g,"");		
	},
	
	ltrim: function(){ // Left Trim : Usage => var test3 = test.ltrim();
		return this.replace(/^\s+/g,"");
	},
	
	rtrim: function(){ // Right Trim : Usage => var test3 = test.rtrim();
		return this.replace(/\s+$/g,"");
	},
	
	prepareReplacement: function(replacement) {
		if (typeof replacement == 'function') return replacement;
		var template = new Template(replacement);
		return function(match) { return template.evaluate(match) };
	},
	
	gsub: function(pattern, replacement) {
		var result = '', source = this, match;
		replacement = arguments.callee.prepareReplacement(replacement);
	
		while (source.length > 0) {
		  if (match = source.match(pattern)) {
			result += source.slice(0, match.index);
			result += String.interpret(replacement(match));
			source  = source.slice(match.index + match[0].length);
		  } else {
			result += source, source = '';
		  }
		}
		return result;
  },

  sub: function(pattern, replacement, count) {
    replacement = this.gsub.prepareReplacement(replacement);
    count = count === undefined ? 1 : count;

    return this.gsub(pattern, function(match) {
      if (--count < 0) return match[0];
      return replacement(match);
    });
  },

  scan: function(pattern, iterator) {
    this.gsub(pattern, iterator);
    return this;
  },

  truncate: function(length, truncation) {
    length = length || 30;
    truncation = truncation === undefined ? '...' : truncation;
    return this.length > length ?
      this.slice(0, length - truncation.length) + truncation : this;
  },
  
	reverseStr: function(s) {
		if(!s) return '';
		var a=(s+'').split('');
		a.reverse();
		return a.join('');
	},

  strip: function() {    
	return this.replace(/^\s+/, '').replace(/\s+$/, '');
  },

  stripTags: function() {
    //var tmp = '<a href="htpp://somespammer.com">Some Link</a>';
	//var safe= tmp.stripTags(); // Returns Some Link;
	return this.replace(/<\/?[^>]+>/gi, '');	
  },

  stripScripts: function() {
    return this.replace(new RegExp(SIPL.Util.ScriptFragment, 'img'), '');
  },

   htmlEntities: function () {
     //var tmp = '<html><head></head>';
	 //var safe= tmp.htmlEntities(); // Returns &lt;html&gt;&lt;head&gt;&lt;/head&gt;
	 return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
   },
   
  toQueryParams: function(separator) {
    var match = this.strip().match(/([^?#]*)(#.*)?$/);
    if (!match) return {};

    return match[1].split(separator || '&').inject({}, function(hash, pair) {
      if ((pair = pair.split('='))[0]) {
        var key = decodeURIComponent(pair.shift());
        var value = pair.length > 1 ? pair.join('=') : pair[0];
        if (value != undefined) value = decodeURIComponent(value);

        if (key in hash) {
          if (hash[key].constructor != Array) hash[key] = [hash[key]];
          hash[key].push(value);
        }
        else hash[key] = value;
      }
      return hash;
    });
  },

  toArray: function(delimeter) {
    return this.split(delimeter);
  },

  succ: function() {
    return this.slice(0, this.length - 1) +
      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
  },

  times: function(count) {
    var result = '';
    for (var i = 0; i < count; i++) result += this;
    return result;
  },

  camelize: function() {
    var parts = this.split('-'), len = parts.length;
    if (len == 1) return parts[0];

    var camelized = this.charAt(0) == '-'? parts[0].charAt(0).toUpperCase() + parts[0].substring(1): parts[0];

    for (var i = 1; i < len; i++)
      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);

    return camelized;
  },

  capitalize: function() {
    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
  },

  underscore: function() {
    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
  },

  dasherize: function() {
    return this.gsub(/_/,'-');
  },

  inspect: function(useDoubleQuotes) {
    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
      var character = String.specialChar[match[0]];
      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
    });
    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
    return "'" + escapedString.replace(/'/g, '\\\'') + "'";
  },

  toJSON: function() {
    return this.inspect(true);
  },

  unfilterJSON: function(filter) {
    return this.sub(filter || SIPL.Util.JSONFilter, '#{1}');
  },

  evalJSON: function(sanitize) {
    var json = this.unfilterJSON();
    try {
      if (!sanitize || (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(json)))
        return eval('(' + json + ')');
    } catch (e) { }
    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
  },

  include: function(pattern) {
    return this.indexOf(pattern) > -1;
  },

  startsWith: function(pattern) {
    return this.indexOf(pattern) === 0;
  },

  endsWith: function(pattern) {
    var d = this.length - pattern.length;
    return d >= 0 && this.lastIndexOf(pattern) === d;
  },

  empty: function() {
    return this == '';
  },

  blank: function() {
    return /^\s*$/.test(this);
  }
});

/*String.prototype.gsub.prepareReplacement = function(replacement) {
  if (typeof replacement == 'function') return replacement;
  var template = new Template(replacement);
  return function(match) { return template.evaluate(match) };
}*/

var Template = Class.create();
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
Template.prototype = {
  initialize: function(template, pattern) {
    this.template = template.toString();
    this.pattern  = pattern || Template.Pattern;
  },

  evaluate: function(object) {
    return this.template.gsub(this.pattern, function(match) {
      var before = match[1];
      if (before == '\\') return match[2];
      return before + String.interpret(object[match[3]]);
    });
  }
}

/* Numeirc Sort : Usage
var tmp = [5,9,12,18,56,1,10,42,30,7,97,53,33,35,27];
tmp=tmp.sortNum(); // returns 1,5,7,9,10,12,18,27,30,33,35,42,53,56,97 
*/
Array.prototype.sortNum = function() {
   return this.sort( function (a,b) { return a-b; } );
}

var SIPL= {};

/*
 ****************************************** DEBUG FUNCTIONS STARTS **********************************************************
*/

SIPL.Debug ={
	isDebug: true,
	
	printStatusMsg: function(msg){
	},
	
	alertMsg: function(msg){
		if(this.isDebug)
			alert(msg);
	},
	
	alertErr: function(err){
		alert(err)
	},
	
	alertException: function(err){
		if(this.isDebug)
			alert(err.message)
	}
}

SIPL.Element = {
	getEl: function(element) {
	  if (arguments.length > 1) {
		for (var i = 0, elements = [], length = arguments.length; i < length; i++)
		  elements.push(SIPL.Element.getEl(arguments[i]));
		return elements;
	  }
	  if (typeof element == 'string')
		element = document.getElementById(element);
	  return element;
	},
	
	remove: function(element) {
		element = SIPL.Element.getEl(element);
		element.parentNode.removeChild(element);
		return element;
	},
	
	getHeight: function(element) {
		return this.getDimensions(element).height;
	},
	
	getWidth: function(element) {
		return this.getDimensions(element).width;
	},
	
	getStyle: function(element, style) {
		element = SIPL.Element.getEl(element);
		style = style == 'float' ? 'cssFloat' : style.camelize();
		var value = element.style[style];
		try{
			if (!value) {
			  var css = document.defaultView.getComputedStyle(element, null);
			  value = css ? css[style] : null;
			}
		}catch(e){}
		if (style == 'opacity') return value ? parseFloat(value) : 1.0;
		return value == 'auto' ? null : value;
	},
	
	setOpacity: function(element, value) {
		element = SIPL.Element.getEl(element);
		element.style.opacity = (value == 1 || value === '') ? '' : (value < 0.00001) ? 0 : value;
		return element;
	},
	
	getDimensions: function(element) {
		element = SIPL.Element.getEl(element);
		var display = this.getStyle(element,'display');
		if (display != 'none' && display != null) // Safari bug
			return {width: element.offsetWidth, height: element.offsetHeight};
		
		// All *Width and *Height properties give 0 on elements with display none,
		// so enable the element temporarily
		var els = element.style;
		var originalVisibility = els.visibility;
		var originalPosition = els.position;
		var originalDisplay = els.display;
		els.visibility = 'hidden';
		els.position = 'absolute';
		els.display = 'block';
		var originalWidth = element.clientWidth;
		var originalHeight = element.clientHeight;
		els.display = originalDisplay;
		els.position = originalPosition;
		els.visibility = originalVisibility;
		return {width: originalWidth, height: originalHeight};
	}
}
/*
 ****************************************** UTILITY FUNCTIONS STARTS **********************************************************
*/
SIPL.Util = {
	BrowserFeatures: {
		XPath: !!document.evaluate,
		ElementExtensions: !!window.HTMLElement,
		SpecificElementExtensions: (document.createElement('div').__proto__ !== document.createElement('form').__proto__)
	},

	ScriptFragment: '<script[^>]*>([\u0001-\uFFFF]*?)</script>',
	
	JSONFilter: /^\/\*-secure-\s*(.*)\s*\*\/\s*$/,
	
	getScreenHeight: function(){
		winHeight = 0;
		if( typeof( window.innerWidth ) == 'number' ){
			winHeight = window.innerHeight;
		}else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight )){
			winHeight = document.documentElement.clientHeight;
		}else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ){
			winHeight = document.body.clientHeight;
		}
		return winHeight;
	},
	
	getScreenWidth: function(){
		var winWidth = 0;
		if( typeof( window.innerWidth ) == 'number' ){
			winWidth = window.innerWidth;
		}else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight )){
			winWidth = document.documentElement.clientWidth;
		}else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ){
			winWidth = document.body.clientWidth;
		}
		return winWidth;
	},
	
	replaceCharacters: function(conversionString,inChar,outChar){
		var strConvertedString = conversionString.split(inChar);
		strConvertedString = strConvertedString.join(outChar);
		return strConvertedString;
	},
	
	removeRepeatedCharacters: function(string, delimiter){
		var returnString = "";
		splitstring = string.split(delimiter);		
		for(i = 0; i < splitstring.length; i++){
			if (splitstring[i]!="") returnString += splitstring[i] + delimiter;
		}
		return returnString;
	},
	
	removeNewLineChar: function(pValue){ // Removes new line char from the provided value
		newline = /\n/g;
		return pValue.toString().replace(newline,'');
	},
	
	toBoolean: function(dt) {
		return (dt=='true'||dt>=1)? true:false;
	},
	
	closeWin: function(){
		window.close();
	},
	
	goBack: function(){
		history.go(-1);
	},
	
	redirect: function(url){
		location.href=url;
	},
	
	showPopUpWin: function(url,winName,wWidth,wHeight){
		// Variables used for centering the popup window
		var iTop = parseInt((screen.height-wHeight)/2);
		var iLeft = parseInt((screen.width-wWidth)/2);
		
		sFeatures="toolbar=no,location=no,status=yes,menubar=no,scrollbars=yes,resizable=no,width="+wWidth+",height="+wHeight + ",left=" + iLeft + ",top=" + iTop;
		window.open(url,winName,sFeatures);
	},
	
	getRandAlphabetChar: function(){
		var aIndex = Math.round(Math.random()*25);
		var alphabet = new Array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
	
		return alphabet[aIndex];
	},
	
	getRandomString: function() {
		var now = new Date();   
		var iRandNum1 = Math.round(Math.random()*10);
		var iRandNum2 = Math.round(Math.random()*100);
		var iRandNum3 = now.getTime();
		var sRandString = iRandNum1 + this.getRandAlphabetChar() + iRandNum3 + this.getRandAlphabetChar() + iRandNum2 + this.getRandAlphabetChar() + iRandNum1 + this.getRandAlphabetChar() + iRandNum2;
	
		return sRandString;
	},
	
	isExist: function(obj){
		return(typeof(obj)=="undefined")?false:true;
	},
	
	printPage: function(divPrintReadyArea){
		var disp_setting="statusbar=yes,resizable=yes,menubar=yes,scrollbars=yes,width=640, height=450,left=240, top=260"; 
		try{
			if (document.getElementById != null){
				var html = '<HTML>\n<HEAD>\n';
				
				if (document.getElementsByTagName != null){
					var headTags = document.getElementsByTagName("head");
					if (headTags.length > 0)
						html += headTags[0].innerHTML;
				}
			
				html += '<script>';
				html += 'function disableMouseClick() {\n if (event.button ==1 || event.button == 2) {\n SIPL.Util.alertMsg("Click' + ' not allowable!")\n return false;\n}\n}';	
				html += 'document.onmouseup= disableMouseClick';
				html += '</script>';
				
				html += '\n</HE' + 'AD>\n<BODY>\n';
				
				var printReadyElem = SIPL.Element.getEl(divPrintReadyArea);
				
				if (printReadyElem != null){
						html += printReadyElem.innerHTML;
				}else{
					fnPrintMsg(PRINT_READY_SECTION_NOT_FOUND);
					return;
				}
					
				html += '\n</BO' + 'DY>\n</HT' + 'ML>';
				
				var printWin = window.open("","printSpecial",disp_setting);
				printWin.document.open();
				printWin.document.write(html);
				printWin.document.close();				
				printWin.print();
			}else{
				SIPL.Util.alertMsg(PRINT_READY_SECTION_NOT_FOUND);
			}
		}catch(e){}
	},
	
	decodeWordDocText: function(pValue,oCtrl){
		var sDescription = pValue;		
		if(sDescription.indexOf("%u201C")!=-1){
			sDescription = this.replaceCharacters(sDescription, '%u201C','%22');
		}
		if(sDescription.indexOf("%u201D")!=-1){
			sDescription = this.replaceCharacters(sDescription, '%u201D','%22');
		}
		if(sDescription.indexOf("%u2018")!=-1){
			sDescription = this.replaceCharacters(sDescription, '%u2018','%27');
		}
		if(sDescription.indexOf("%u2019")!=-1){
			sDescription = this.replaceCharacters(sDescription, '%u2019','%27');
		}
		oCtrl.value=unescape(sDescription);
	},
	
	decodeBatchWordDocText: function(arrPValue,arrObjControl){
		if(arrObjControl.length==arrPValue.length && arrObjControl.length>0){
			for(var i=0;i<arrObjControl.length;i++){
				this.decodeWordDocText(arrPValue[i],arrObjControl[i]);
			}
		}
	}
}

SIPL.Numeric ={
	formatNumber: function(num,prefix){
		//Usage : var test1 = formatNumber('5123456789.25'); // returns 5,123,456,789.25
		//var test2 = formatNumber(1234.15,'$');     // returns $1,234.15
		prefix = prefix || '';
		num += '';
		var splitStr = num.split('.');
		var splitLeft = splitStr[0];
		var splitRight = splitStr.length > 1 ? '.' + splitStr[1] : '';
		var regx = /(\d+)(\d{3})/;
		while (regx.test(splitLeft)) {
		  splitLeft = splitLeft.replace(regx, '$1' + ',' + '$2');
		}
		return prefix + splitLeft + splitRight;
	},
	
	unformatNumber: function(num){
		// Usage var test3 = unformatNumber('$1,234.15');   // returns 1234.15
		return num.replace(/([^0-9\.\-])/g,'')*1;
	},
	
	filterCurrency: function(pValue){ // Removes $ and , from the provided value
		currency = /^\$|\,/g;
		return iValue.toString().replace(currency,'');	
	},
	
	filterPercentage: function(pValue){ // Removes % and , from the provided value
		percentage = /\,|\%$/g;
		return iValue.toString().replace(percentage,'');
	},
	
	truncateFloat: function(pValue,decimal_places) { //This function truncates the float number upto the given decimal places.		
		// eg 999.765 : SIPL.Util.truncateFloat(999.765,2) will give result : 999.76
		var fNum1 = parseFloat(pValue) * Math.pow(10, decimal_places);
		var iNum2 = parseInt(fNum1);
		var fNum3 = iNum2 / Math.pow(10, decimal_places);
		return this.padZeros(fNum3, decimal_places);
	},
	
	roundFloat: function(pValue,decimal_places) { //This function rounds the float number upto the given decimal places.		
		// eg 999.765 : SIPL.Util.roundFloat(999.765,2) will give result : 999.77
		var fNum1 = parseFloat(pValue) * Math.pow(10, decimal_places);
		var iNum2 = Math.round(fNum1);
		var fNum3 = iNum2 / Math.pow(10, decimal_places);
		return this.padZeros(fNum3, decimal_places);
	},
	
	padZeros: function(rounded_value, decimal_places) { //This Function Pads the Zeroes in the Decimal number upto given decimal places.	
		var value_string = rounded_value.toString();
		var decimal_location = value_string.indexOf(".");
	
		// Is there a decimal point?
		if (decimal_location == -1) {
			// If no, then all decimal places will be padded with 0s
			decimal_part_length = 0;
			// If decimal_places is greater than zero, tack on a decimal point
			value_string += decimal_places > 0 ? "." : "";
		}else{
			// If yes, then only the extra decimal places will be padded with 0s
			decimal_part_length = value_string.length - decimal_location - 1;
		}
	
		// Calculate the number of decimal places that need to be padded with 0s
		var pad_total = decimal_places - decimal_part_length;
		
		if (pad_total > 0) {
			// Pad the string with 0s
			for (var counter = 1; counter <= pad_total; counter++) 
				value_string += "0";
		}
		return value_string;
	},
	
	toInteger: function(dt){
		var vl;
		if(!dt) return 0;
		if(isNaN(dt)) vl=parseInt((dt+'').replace(/\,/g,''));
		else vl= parseInt(dt);
		if (isNaN(vl)) vl = 0;
		return vl;
	},
	
	toFloat: function(dt){
		var vl;
		if(!dt) return 0;
		if(isNaN(dt)) vl=parseFloat((dt+'').replace(/\,/g,''));
		else vl = parseFloat(dt);
		if (isNaN(vl)) vl = 0;
		return vl;
	}
}

SIPL.Dates = {
	format: 'mm/dd/yyyy',
	getDtDiffInDays: function(dateFrom, dateTo){ //Function accept 2 dates and returns the difference of them in number of days	
		var dtFrom = new Date();
		var dtTo = new Date();
		var dtDiff  = new Date();
			
		dtFromTemp = new Date(dateFrom);
		dtFrom.setTime(dtFromTemp.getTime());
		
		dtToTemp = new Date(dateTo);
		dtTo.setTime(dtToTemp.getTime());
		
		// sets difference date to difference of first date and second date	
		dtDiff.setTime(Math.abs(dtFrom.getTime() - dtTo.getTime()));	
		var dtTimediff = dtDiff.getTime();
		
		var iNumWeeks = Math.floor(dtTimediff / (1000 * 60 * 60 * 24 * 7));
		dtTimediff -= iNumWeeks * (1000 * 60 * 60 * 24 * 7);	
		iNumWeeks = iNumWeeks*7;
		
		var iNumDays = Math.floor(dtTimediff / (1000 * 60 * 60 * 24)); 
		dtTimediff -= iNumDays * (1000 * 60 * 60 * 24);	
		iNumDays = parseInt(iNumWeeks) + parseInt(iNumDays);
		
		return parseInt(iNumDays);
	},
	
	dateAdd: function(interval,n,dt){
		if(!interval||!n||!dt) return;	
		var s=1,m=1,h=1,dd=1,i=interval;
		if(i=='month'||i=='year'){
			dt=new Date(dt);
			if(i=='month') dt.setMonth(dt.getMonth()+n);
			if(i=='year') dt.setFullYear(dt.getFullYear()+n);		
		}else if (i=='second'||i=='minute'||i=='hour'||i=='day'){
			dt=Date.parse(dt);
			if(isNaN(dt)) return;
			if(i=='second') s=n;
			if(i=='minute'){s=60;m=n}
			if(i=='hour'){s=60;m=60;h=n};
			if(i=='day'){s=60;m=60;h=24;dd=n};
			dt+=((((1000*s)*m)*h)*dd);
			dt=new Date(dt);
		}
		return dt;
	},
	
	formatDate: function(date,format){
		if(!date) return '';
		var dt=new Date(date);
		var mm=dt.getMonth();
		var dd=dt.getDate();
		var day=dt.getDay();
		var yyyy=dt.getFullYear();
		var hh=dt.getHours();
		var nn=dt.getMinutes();
		var ss=dt.getSeconds();
		var ampm;
	
		var days=['Sunday','Monday','Teusday','Wednesday','Thursday','Friday','Saturday'];
		var months=['January','February','March','April','May','June','July','August','September','October','November','December'];
	
		format=(format)? (format+'').toLowerCase():'dddd, mmmm dd, yyyy hh:nn:ss ampm';
		format=format.replace('mmmm',months[mm]);
		format=format.replace('mmm',months[mm].substr(0,3));
		format=format.replace('mm',mm+1);
		format=format.replace('dddd',days[day]);
		format=format.replace('ddd',days[day].substr(0,3));
		format=format.replace('dd',dd);
		format=format.replace('yyyy',yyyy);
		if(format.indexOf('ampm')>0){
			if(hh>12) hh=hh-12;
			if(hh<12) ampm='AM';
			else ampm='PM';
			format=format.replace('ampm',ampm);
		}
		format=format.replace('hh',hh);
		format=format.replace('nn',nn);
		format=format.replace('ss',ss);
	
		return format;
	},
	
	getDayOfYear: function(dt){
		dt = new Date(dt);
		if(isNaN(dt)) dt = new Date();
		var yr = new Date(dt.getFullYear(),0,1);
		yr = yr.getTime() - (yr.getDay()-1)*(24*60*60*1000);
		return(Math.ceil((dt.getTime() - yr)/(24*60*60*1000)));
	}
}
/*
 ****************************************** ALLOWED FUNCTIONS STARTS **********************************************************
*/

SIPL.Allow ={
		onlyFloat: function(pValue,e){
		var isDecimalExist=false;
		var unicode=e.charCode? e.charCode : e.keyCode;
	
		if(unicode==16 || unicode==18) return false;
	
		if (pValue.indexOf(".")!=-1){
			isDecimalExist=true;
		}
		 
		if ((unicode >=48  && unicode <=57) || (unicode >=96  && unicode <=105) || (unicode >=35  && unicode <=37) || unicode ==8 || unicode ==39 || unicode ==46 || unicode ==9  || unicode ==190 || unicode ==110){
			if(isDecimalExist && (unicode ==190 || unicode ==110)){
				return false;
			}else{
				return true;
			}
		}else{
			return false;
		}
	},
	
	onlySignedFloat: function(pValue){
		var isDecimalExist=false;
		if(event.ctrlKey || event.altKey) return false;

		if (pValue.indexOf(".")!=-1){
			isDecimalExist=true;
		}
		if ((event.keyCode >=48  && event.keyCode <=57) || (event.keyCode >=96  && event.keyCode <=105) || (event.keyCode >=35  && event.keyCode <=37) || event.keyCode ==8 || event.keyCode ==39 || event.keyCode ==46 || event.keyCode ==9  || event.keyCode ==190 || event.keyCode ==110 || event.keyCode ==189  || event.keyCode ==109 || event.keyCode ==188){
			if(isDecimalExist && (event.keyCode ==190 || event.keyCode ==110)){
				return false;
			}else{
				return true;
			}
		}else{
			return false;
		}
	},
	
	onlyInteger: function(pValue,e){
	var unicode=e.charCode? e.charCode : e.keyCode;
		if(unicode==16 || unicode==18) return false;
		if ((unicode >=48  && unicode <=57) || (unicode >=96  && unicode <=105) || (unicode >=35  && unicode <=37) || unicode ==8 || unicode ==39 || unicode ==46 || unicode ==9){
			return true
		}else{
			return false
		}
	},
	
	onlyCurrency: function(pValue){
		var isDecimalExist=false; 
		if(event.ctrlKey || event.altKey) return false;
	
		if (pValue.indexOf(".")!=-1){
			isDecimalExist=true;
		}
		if ((event.keyCode >=48  && event.keyCode <=57) || (event.keyCode >=96  && event.keyCode <=105) || (event.keyCode >=35  && event.keyCode <=37) || event.keyCode ==8 || event.keyCode ==39 || event.keyCode ==46 || event.keyCode ==9  || event.keyCode ==190 || event.keyCode ==110 || event.keyCode ==188){
			if(isDecimalExist && (event.keyCode ==190 || event.keyCode ==110)){
				return false;
			}else{
				return true;
			}
		}else{
			return false;
		}
	},
	
	onlyDate: function(pValue){
		if(event.shiftKey || event.ctrlKey || event.altKey) return false;	
		if ((event.keyCode >=48  && event.keyCode <=57) || (event.keyCode >=96  && event.keyCode <=105) || (event.keyCode >=35  && event.keyCode <=37) || event.keyCode ==8 || event.keyCode ==39 || event.keyCode ==46 || event.keyCode ==9 || event.keyCode ==191 || event.keyCode ==111){
			return true
		}else{
			return false
		}
	}
}

/*
 ****************************************** VALIDATIONS FUNCTIONS STARTS **********************************************************
*/

SIPL.Validate = {
	isEmpty: function(str){
		var str=str.trim();				
		if (!(str == null || str.length==0)) return false;		
		return true;
	},
	
	isNumericEmpty: function(val){
		if (!(val == null || val.length==0))return false;
		return true	
	},
	
	isWhiteSpaces: function(str){
		if (str.indexOf(" ")!=-1) return true;
		return false;
	},
	
	textAreaLength: function(str,len,label){
		if (str.trim() != ""){
			var strlen = str.length;
			var st = (strlen > (len - 0))?fnGetMessage(MAXLENGTH_MSG, label , len):"";
			return st;
		}else{
			return (fnGetMessage(BLANK_MSG, label));
		}
	},
	
	isValidEmail: function(val){
		var re = /^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$/;
		//var re = /(^[a-z]([a-z_\.]*)@([a-z_\.]*)([.][a-z]{3})$)|(^[a-z]([a-z_\.]*)@([a-z_\.]*)(\.[a-z]{3})(\.[a-z]{2})*$)/i;
		var st = (!val.match(re))?false:true
		return st;
	},
	
	isDigit: function(val){
		var counter=0;  			
		//removing the leading and trialing spaces
		val = val.trim();
		
		var len = 	val.length;
		for (counter=0;counter < len; counter++){
			var char1 = val.charAt(counter) ;
			if (char1 < "0" || char1 > "9" )
				return false;
		}
		return true;
	},
	
	isNumeric: function(val){
		var re = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
		var st = (!val.match(re))?false:true
		return st;
	},
	
	isInteger: function(val){
        if(val!="")
        {
			var re = /(^-?\d\d*$)/;
			var st = (!val.match(re))?false:true
			return st;
        }

	},
	
	isPositiveInteger: function(sNameArray,sValueArray){
       var sErrs='';		
		for(var i=0;i<sNameArray.length;i++){		
			if(!this.isDigit(sValueArray[i])){
				sErrs = sErrs +VALUE_OF + " \'" +sNameArray[i] + "\' " + NUMERIC_MSG + "\n";
			}	
		}
		return sErrs;

	},
	isFloat: function(oVal, totLength, decLength){
		if(SIPL.Validate.isNumericEmpty(oVal)) return false;
		
		if(SIPL.Validate.isWhiteSpaces(oVal)){
			return false;
		}else{					
			var ctr = 0;
			var seenDecimal = false;
		
			if(oVal.indexOf(" ")!=-1){
				return false;
			}
			//removing the leading and trailing spaces
			oVal = oVal.trim();
			//To check if only decimal entered
			if(oVal=="."){
				return false;
			}
			
			var len = oVal.length;
			for(ctr=0; ctr<len; ctr++){
				var c = oVal.charAt(ctr);
				if(c == "." && !seenDecimal)
					seenDecimal = true;
			   else if(!this.isDigit(c))
					return false;
			 }
			if (arguments.length <= 1){
				return true;
			}
			var isPartsValid = this.checkFloatParts(oVal, totLength, decLength);
			return isPartsValid;
		}
	},
	
	isSignedFloat: function(oVal, totLength, decLength) {
		oVal = oVal.trim();
		var startPos = 0;
		if ( (oVal.charAt(0) == "-" || oVal.charAt(0) == "+") && !(oVal.length==1 && (oVal=='-' || oVal=='+'))){
		  startPos = 1;  
		}
		return (this.isFloat(oVal.substring(startPos, oVal.length), totLength, decLength));
	},
	
	checkFloatParts: function(oVal, totLength, decLength){
		var parts = oVal.split(".");
		var intLength = totLength - decLength;
		if(!this.isDigit(oVal)){
			//implies that the input value is float
			if(parts[0].length > intLength){
				 return false;
			}		
			if (decLength != 0){
				if(parts[1].length > decLength){
					return false;
				}
			}
		}else{
			//implies that the input value is integer 
			if(oVal.length > intLength)
				return false;
		}
		return true;
	},
	
	isDate: function(dt,format){
		//format = SIPL.Dates.format;
		if (!dt) return false;
		var dd,mm,yyyy;
		var isLeapYear,st=true,delim='/';
		dt+='';format=(format)? format+'':'';
		if(dt.indexOf('/')>=0) delim='/';
		else if(dt.indexOf('-')>=0) delim='-';
		else if(dt.indexOf(' ')>=0) delim=' ';
		dt=dt.split(delim);
		if(format) format=format.replace(/\W/g,'/');
		else {
			if (dt[0]>=1000) format='yyyy/mm/dd';
			else if (dt[0]>=12 && dt[1]<=12) format='dd/mm/yyyy';
			else if (dt[0]<=12 && dt[1]>=12) format='mm/dd/yyyy';
		};
		
		if(format=='yyyy/mm/dd'){yyyy=dt[0];mm=dt[1];dd=dt[2];}
		else if(format=='mm/dd/yyyy'){ mm=dt[0];dd=dt[1];yyyy=dt[2];}
		else if(format=='dd/mm/yyyy'){dd=dt[0];mm=dt[1];yyyy=dt[2];}
		if(isNaN(dd)||isNaN(mm)||isNaN(yyyy)) st=false;
		else if(dd<1 || dd>31) st=false;
		else if(yyyy>9999 || yyyy.length <4) st=false;
		else if (mm < 1 || mm > 12) st=false;
		else if((mm==4 || mm==6 || mm==9 || mm==11) && dd==31) st=false;
		else if(mm==2) { // check for leap year and february 29th
			isLeapYear = (yyyy % 4 == 0 && (yyyy % 100 != 0 || yyyy % 400 == 0));
			if (dd > 29 || (dd==29 && !isLeapYear)) st=false;
		}
		return st;
	},
	
	isToDtGreaterThanFromDt: function(fromDt,toDt){
		dtFrom = new Date(fromDt.trim());
		dtTo =   new Date(toDt.trim());
		if (dtFrom != "" && dtTo != "") {
			var st = (dtTo >= dtFrom)?true:false;
			return st;
		}
		return false;
	},
	
	isDateEqual: function(fromDt,toDt){
		dtFrom = new Date(fromDt.trim());
		dtTo =   new Date(toDt.trim());
		if (dtFrom != "" && dtTo != "") {
			var st = (dtTo == dtFrom)?true:false;
			return st;
		}
		return false;
	},
	
	isAlphabetic: function(str){
		var re=new RegExp("[0-9]");
		var st = (!re.test(str))?true:false;
		return st;
	},
	
	batchNull: function(sNameArray,sValueArray){
		var sErrs='';		
		for(var i=0;i<sNameArray.length;i++){		
			if(this.isEmpty(sValueArray[i])){
				sErrs = sErrs +VALUE_OF + " \'" +sNameArray[i] + "\' " + NULL_MSG + "\n";
			}	
		}
		return sErrs;
	},
	 
	batchEmail: function(sNameArray,sValueArray){
		var sErrs='';	
		 
		for(var i=0;i<sNameArray.length;i++){
		    		
			if(this.isValidEmail(sValueArray[i])){
				sErrs = sErrs +VALUE_OF + " \'" +sNameArray[i] + "\' " + NULL_MSG + "\n";
			}
		}
		return sErrs;
	},
	
	batchNumeric: function(sNameArray,sValueArray){
		var sErrs='';		
		for(var i=0;i<sNameArray.length;i++){		
			if(this.isDigit(sValueArray[i])){
				sErrs = sErrs +VALUE_OF + " \'" +sNameArray[i] + "\' " + NULL_MSG + "\n";
			}	
		}
		return sErrs;
	},
	
	batchDate: function(sNameArray,sValueArray){
		var sErrs='';		
		for(var i=0;i<sNameArray.length;i++){		
			if(this.isValidDate(sValueArray[i])){
				sErrs = sErrs +VALUE_OF + " \'" +sNameArray[i] + "\' " + NULL_MSG + "\n";
			}	
		}
		return sErrs;
	},
	batchSelect: function(sNameArray,sValueArray){
		var sErrs='';		
		for(var i=0;i<sNameArray.length;i++){		
			if(sValueArray[i]=='0'){
				sErrs = sErrs +PLEASE_SELECT + " \'" +sNameArray[i] + "\' " + "\n";
			}	
		}
		return sErrs;
	},
	
	isValidFileName: function(fileName){
		for (var i=0;i<INVALID_FILENAME_CHARS.length;i++){
			if(fileName.indexOf(INVALID_FILENAME_CHARS[i])!= -1){
				return false;
			}		
		}
		return true;
	},
	
	isValidExt: function(ext){
		for (var i=0;i<VALID_FILE_EXT.length;i++){
			if(VALID_FILE_EXT[i] == ext){
				return false;
			}		
		}
		return true;
	}	
}

/*
************************************** XML UTILITY FUNCTIONS STARTS ***********************************
*/

SIPL.XML = {
	oXML: "",
	oXSL: "",
	oDiv: "",
	transformXML: function(xmlSourceID, xslSourceID, divContainer){
		var container=SIPL.Element.getEl(divContainer);
		container.innerHTML="";
		if (window.ActiveXObject){
			if(typeof xmlSourceID == "object"){
				container.innerHTML= xmlSourceID.transformNode(xslSourceID);
			}else{
				container.innerHTML= eval(xmlSourceID).transformNode(eval(xslSourceID));
			}
		}else if (window.XSLTProcessor){
			var XSLT = new XSLTProcessor;
			XSLT.importStylesheet(xslSourceID);
			
			var fragment=XSLT.transformToFragment(xmlSourceID, document); 
			container.appendChild(fragment)
		}		
	},
	
	loadXSL: function(arrXSLIsland, arrXSLName){
		for(i=0;i<arrXSLIsland.length;i++){
			eval(arrXSLIsland[i]).loadXML(eval(arrXSLName[i]));
		}
	},
	
	getXML: function(xmlURL, func){
		$.get(xmlURL, function(data){ func(data); });
	},

	getXMLXSLAndTransform: function(xmlURL,xslURL,div,params,func,sortOpt){
		$.get(xmlURL,params,function(data){
			SIPL.XML.oXML = data;
			$.get(xslURL, function(data){
				SIPL.XML.oXSL = data;
				SIPL.XML.transformXML(SIPL.XML.oXML,SIPL.XML.oXSL,div);
				if(sortOpt.isSort && sortOpt.fldName != '')
					SIPL.XML.sortList(sortOpt.fldName,'','','',sortOpt.fldType);
				if(func!='')
					func(SIPL.XML.oXML,SIPL.XML.oXSL);
			});
		});
	},

	sortList: function(fldName,XMLName,XSLName,divName,dataType){
		if(!$.browser.msie) return;
		if(!fldName || fldName == "") return;
		if(XMLName == "") XMLName = SIPL.XML.oXML;
		if(XSLName == "") XSLName = SIPL.XML.oXSL;
		if(divName == "") divName = SIPL.XML.oDiv;
		
		//var node =  XSLName.documentElement.selectNodes("//xsl:sort");
		var node = SIPL.XML.selectNodes(XSLName,"//xsl:sort");
		selectValue = node[0].getAttribute('select');
		orderValue = node[0].getAttribute('order');

		if(selectValue == fldName || selectValue == "substring("+fldName+",7,10)" || selectValue == "substring(substring("+fldName+",7),1,5)"){
			if( orderValue== 'ascending' )
				orderValue='descending';
			else
				orderValue='ascending';
		}else{
			selectValue=fldName;
			orderValue='ascending';
		}
	
		// Show Images
		this.updateSortImgIndicator(fldName,orderValue,XSLName);	
		
		if(dataType == 'number'){
			node[0].setAttribute('data-type',"number");
			node[0].setAttribute('select',fldName);
			node[0].setAttribute('order',orderValue);	
		}
		if(dataType == null){
			if(node.length > 1){
				for(index=0;index<3;index++){
					node[index].setAttribute('data-type',"text");
					node[index].setAttribute('select',fldName);
					node[index].setAttribute('order',orderValue);
				}
			}else{
				node[0].setAttribute('data-type',"text");
				node[0].setAttribute('select',fldName);
				node[0].setAttribute('order',orderValue);				
			}
		}
		else if(dataType == 'date'){			
			//Case: Sorting on Date as well as Time ; Requires 6 <xsl:sort> tags in XSLs
			if (node.length == 6){	
				// year
				var datefilter = "substring(substring("+fldName+",7),1,5)";
				node[0].setAttribute('select',datefilter);
				node[0].setAttribute('order',orderValue);
				node[0].setAttribute('data-type','number');
				// month
				datefilter = "substring(substring("+fldName+",1),1,2)";
				node[1].setAttribute('select',datefilter);
				node[1].setAttribute('order',orderValue);
				node[1].setAttribute('data-type','number');
				// day
				datefilter = "substring(substring("+fldName+",4),1,2)";
				node[2].setAttribute('select',datefilter);
				node[2].setAttribute('order',orderValue);
				node[2].setAttribute('data-type','number');
				// am/pm
				datefilter = "substring(substring("+fldName+",18),1,2)";
				node[3].setAttribute('select',datefilter);
				node[3].setAttribute('order',orderValue);
				node[3].setAttribute('data-type','text');
				// hour
				datefilter = "substring(substring("+fldName+",12),1,2)";
				node[4].setAttribute('select',datefilter);
				node[4].setAttribute('order',orderValue);
				node[4].setAttribute('data-type','number');
				// min
				datefilter = "substring(substring("+fldName+",15),1,2)";
				node[5].setAttribute('select',datefilter);
				node[5].setAttribute('order',orderValue);
				node[5].setAttribute('data-type','number');
			}else{
				var datefilter = "substring("+fldName+",7,10)";
				node[0].setAttribute('select',datefilter);
				node[0].setAttribute('order',orderValue);
				node[0].setAttribute('data-type','number');
	
				datefilter = "substring("+fldName+",1,2)";
				node[1].setAttribute('select',datefilter);
				node[1].setAttribute('order',orderValue);
				node[1].setAttribute('data-type','number');
		
				datefilter = "substring("+fldName+",4,2)";
				node[2].setAttribute('select',datefilter);
				node[2].setAttribute('order',orderValue);
				node[2].setAttribute('data-type','number');
			}
		}else{
			if(node.length > 1){
				for(index=0;index<node.length;index++){
					node[index].setAttribute('data-type',dataType);
					node[index].setAttribute('select',fldName);
					node[index].setAttribute('order',orderValue);
				}
			}else{
				node[0].setAttribute('data-type',dataType);
				node[0].setAttribute('select',fldName);
				node[0].setAttribute('order',orderValue);				
			}
		}		
		this.transformXML(XMLName,XSLName,divName);
	},
	
	updateSortImgIndicator: function(fldName,orderValue,XSLName){
		// Path for sort up and sort down image
		var SORT_UP = "images/icon-sortup.gif";
		var SORT_DOWN = "images/icon-sortdown.gif";
	
		//Remove all the Image Tags from XSL
		var delImageNode = XSLName.documentElement.selectNodes("//img");
		delImageNode.removeAll();
		var hrefNodes =  XSLName.documentElement.selectNodes("//a");	
		var imageNode = XMLSortImage.documentElement.childNodes(0);	
		
		var len = hrefNodes.length;
	
		for(var index = 0;index < len; index++){	
			if (hrefNodes(index).getAttribute("onclick")!=null){
				if(hrefNodes(index).getAttribute("onclick").indexOf(fldName) != -1){
					var newImageNode = imageNode.cloneNode(true);
					switch (orderValue){
						case "ascending": newImageNode.setAttribute("src",SORT_UP);
							newImageNode.setAttribute("title",LBL_ASCENDING);
							break;
						case "descending": newImageNode.setAttribute("src",SORT_DOWN);
							newImageNode.setAttribute("title",LBL_DESCENDING);
							break;
					}
					hrefNodes(index).appendChild(newImageNode);			
				}
			}
		}
	},
	
	removeNodeFromXML: function(nValue,nName,objXML){
		var nFound = false;
		var xNode = eval(objXML).selectNodes("//"+nName);
		try{
			for(var i=0;i<xNode.length;i++){
				if (xNode[i].text==nValue){
					var pNode = xNode[i].parentNode;
					nFound = true;
					break;
				}
			}
			if(nFound){
				eval(objXML).documentElement.removeChild(pNode);
			}
		}catch(e){}
	},
	
	serialize:function(n){
		var v;
		if(typeof XMLSerializer != "undefined"){
			return (new XMLSerializer()).serializeToString(n);
		}else if(typeof n.xml == "string"){
			return n.xml;
		}
	},
	
	getCDATAValue:function(n){
		var c,d="",i=0,e;
		c = n.childNodes;
		for(;i<c.length;i++){
			e=c[i];
			if(e.nodeName=="#cdata-section") d+=e.nodeValue;
		}
		return d;
	},
	
	selectSingleNode:function(d,x,c){
		/* d = XmlDocument, x = xpath, c = context node	*/
		var s,i,n;
		if(typeof d.evaluate != "undefined"){
			c = (c ? c : d.documentElement);
			s = d.evaluate(x,c,null,0,null);

			return s.iterateNext();
		}else if(typeof d.selectNodes != "undefined"){
			return (c ? c : d).selectSingleNode(x);
		}
		return 0;
	},
	
	selectNodes:function(d,x,c){
		/* d = XmlDocument,	x = xpath, c = context node */
		var s,a = [],i,n;
		if(typeof d.evaluate != "undefined"){
			c = (c ? c : d.documentElement);
			s = d.evaluate(x,c,null,0,null);

			n = s.iterateNext();

			while( typeof n == "object" && n != null){
				a[a.length] = n;
				n = s.iterateNext();
			}
			return a;
		}else if(typeof d.selectNodes != "undefined"){
			return (c ? c : d).selectNodes(x);
		}
		return a;	
	},
	
	getInnerText: function(s){
		var r = "",a,i,e;
		if(typeof s == "string") return s;
		if(typeof s=='object' && s.nodeType==3) return s.nodeValue;
		if(s.hasChildNodes()){
			a = s.childNodes;
			for(i=0;i<a.length;i++){
				e = a[i];
				if(e.nodeName=="#cdata-section") r+=e.nodeValue;
				if(e.nodeType==3) r+=e.nodeValue;
				if(e.nodeType==1 && e.hasChildNodes()){
					r+=this.getInnerText(e);
				}
			}
		}
		return r;
	}
}

/*
 ****************************************** CREATE ELEMETS UTILITY FUNCTIONS STARTS **********************************************************
*/

SIPL.CreateElement = {
	createTextBox: function(size,maxLength,id){
		var txtBoxObj = document.createElement("input");			
		txtBoxObj.className="cssTextBox";
		txtBoxObj.setAttribute("type","text");
		txtBoxObj.setAttribute("size",size);	
		txtBoxObj.setAttribute("maxLength",maxLength);	
		txtBoxObj.name = id;
		txtBoxObj.id = id;
		
		return txtBoxObj;
	},
	createTable: function(size,maxLength,id){
		var tbl = document.createElement("table");			
		tbl.setAttribute("type","text");
		tbl.setAttribute("size",size);	
		tbl.setAttribute("maxLength",maxLength);	
		tbl.name = id;
		tbl.id = id;
		
		return tbl;
	},
	createTR: function(alignment,cssClass,id){
		var tr = document.createElement("tr");
		tr.setAttribute("name",id);
		tr.setAttribute("id",id);
		tr.className = cssClass;
		tr.setAttribute("align",alignment);	
		
		return tr;
	},
	createTD: function(alignment,cssClass,id){
		var td = document.createElement("td");
		td.setAttribute("id",id);
		td.className = cssClass;
		td.setAttribute("align",alignment);	
		
		return td;
	}
}
/*
 ****************************************** FORM FUNCTIONS STARTS *****************************************
*/

SIPL.Form = {
	submit: function(frm,target,action){
		frm.target=target;
		frm.action=action;
		frm.submit();
	}
}

/*
 ****************************************** FORM CONTROLS FUNCTIONS STARTS *****************************************
*/

SIPL.FormControls = {
	setFocus: function(oFieldName){
		// SIPL.FormControls.setFocus(document.formname.filedname)
		try{
			oFieldName.focus();
		}catch(e){}
	},
	
	disableTabIndexes: function() {
		if (document.all) {
			var i = 0;
			for (var j = 0; j < gTabbableTags.length; j++) {
				var tagElements = document.getElementsByTagName(gTabbableTags[j]);
				for (var k = 0 ; k < tagElements.length; k++) {
					gTabIndexes[i] = tagElements[k].tabIndex;
					tagElements[k].tabIndex="-1";
					i++;
				}
			}
		}
	},
	
	restoreTabIndexes: function() {
		if (document.all) {
			var i = 0;
			for (var j = 0; j < gTabbableTags.length; j++) {
				var tagElements = document.getElementsByTagName(gTabbableTags[j]);
				for (var k = 0 ; k < tagElements.length; k++) {
					tagElements[k].tabIndex = gTabIndexes[i];
					tagElements[k].tabEnabled = true;
					i++;
				}
			}
		}
	},	
	
	disable: function(oCtrl){
		if(oCtrl == undefined) return;
		if(typeof oCtrl == "object"){
			if(oCtrl.type == INPUT_TYPE.TEXTFIELD || oCtrl.type == INPUT_TYPE.TEXTFIELD.toLowerCase())
				oCtrl.value = "";
			oCtrl.disabled = true;
		}
	},
	
	enable: function(oCtrl){
		if(oCtrl == undefined) return;
		if(typeof oCtrl == "object"){			
			oCtrl.disabled = false;
		}
	},
	
	Radio: {
		getValue: function(rd){
			var selectedVal = "";
			for(var i=0;i<rd.length;i++){
				if(rd[i].checked){
					selectedVal=rd[i].value;
					break;
				}
			}
			return selectedVal;
		}
	},
	
	Checkbox: {
		selectAllCheckBoxes: function(oChkAll,oTargetChk){
			try{
				var status = objChkAll.checked;
				for(var i=0;i<oTargetChk.length;i++){
					if (oTargetChk[i].style.display!='none'){
						if(oTargetChk[i].disabled==false){
							oTargetChk[i].checked=status;
						}
					}
				}
			}catch(e){}
		},
		
		uncheck: function(oChk){
			var obj = "";
			if (oChk && oChk != ""){
				var len = oChk.length;
				for (var i=0; i<len; i++){			
					obj = oChk[i];
					obj.checked = false;
				}
			}		
		},
		
		getValues: function(chkBox){
			var arrSelectedValues = [];
			for(var i=0;i<chkBox.length;i++){
				if(chkBox[i].checked){
					arrSelectedValues.push(chkBox[i].value);
				}
			}	
			return arrSelectedValues;
		}
	},
	
	Select:{
		hasOptions: function(obj) {
			if (obj!=null && obj.options!=null) return true;
			return false;
		},
		
		hideSelectBoxes: function() {
			var d = document.forms;
			try{
				for(var i = 0; i < d.length; i++) {
					for(var e = 0; e < d[i].length; e++){
						if(d[i].elements[e].tagName == INPUT_TYPE.COMBOBOX) {
							d[i].elements[e].style.visibility="hidden";	
							d[i].elements[e].style.display="none";
						}
					}
				}
			}catch(e){}
		},
	
		displaySelectBoxes: function() {
			var d = document.forms;
			try{
				for(var i = 0; i < d.length; i++) {
					for(var e = 0; e < d[i].length; e++){
						if(d[i].elements[e].tagName == INPUT_TYPE.COMBOBOX) {
							d[i].elements[e].style.visibility="visible";
							d[i].elements[e].style.display="inline";
						}
					}
				}
			}catch(e){}
		},
		
		getAllValues: function(objSrcElem){
			var arrValues = new Array();
			if (!SIPL.FormControls.Select.hasOptions(objSrcElem)) { return; }
			for (var i=0;i<objSrcElem.options.length;i++) {
				var o = objSrcElem.options[i];			
					arrValues.push(o.value);
			}
			return arrValues;
		},
		
		getSelectedVal_List: function(objSrcElem){
			var arrValues = new Array();
			if (!SIPL.FormControls.Select.hasOptions(objSrcElem)) { return; }
			for (var i=0;i<objSrcElem.options.length;i++) {
				var o = objSrcElem.options[i];
				if (o.selected) {
					arrValues.push(o.value);
				}
			}
			return arrValues;
		},
		
		getSelectedVal_Combo: function(objSrcElem){
			if (!SIPL.FormControls.Select.hasOptions(objSrcElem)) { return; }
			for (var i=0;i<objSrcElem.options.length;i++) {
				var o = objSrcElem.options[i];
				if (o.selected){
					return o.value;
				}
			}
		},
		
		setValue_Combo: function(oElem,sValue){
			try{
				var iOptionsLength=oElem.options.length;
				if(iOptionsLength>0){
					for (var i=0;i<iOptionsLength;i++){
						if (oElem.options[i].value == sValue){
							oElem.options[i].selected=true;
							break;
						}
					}
				}
			}catch(e){}
		},
		
		setValues_List: function(oElem,sValues){
			try{
				var iOptionsLength=oElem.options.length;
				var iValLength = sValues.length;
				/*if(iOptionsLength>0 && iValLength > 0){
					for (var i=0;i<iOptionsLength;i++){
						if(iValLength == 1)
						if (oElem.options[i].value == sValue){
							oElem.options[i].selected=true;
							break;
						}
					}
				}*/
			}catch(e){}
		}
	},
	
	File: {
		getFileExt: function(fileName){
			var fileExt = "";
			var index = parseInt(fileName.lastIndexOf("."));	
			if(index != -1){
				fileExt = fileName.substring(index+1,fileName.length);
			}
			return fileExt;
		}
	}
}

/*
 ****************************************** PROTOTYPE EVENT FUNCTIONS STARTS **********************************************************
*/

SIPL.Event= {
  element: function(event) {
    return $(event.target || event.srcElement);
  },

  isLeftClick: function(event) {
    return (((event.which) && (event.which == 1)) || ((event.button) && (event.button == 1)));
  },

  pointerX: function(event) {
    return event.pageX || (event.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft));
  },

  pointerY: function(event) {
    return event.pageY || (event.clientY + (document.documentElement.scrollTop || document.body.scrollTop));
  },

  // find the first node with the given tagName, starting from the
  // node the event was triggered on; traverses the DOM upwards
  findElement: function(event, tagName) {
    var element = Event.element(event);
    while (element.parentNode && (!element.tagName ||
        (element.tagName.toUpperCase() != tagName.toUpperCase())))
      element = element.parentNode;
    return element;
  }
}

/*
 ****************************************** POSITIONING FUNCTIONS STARTS **********************************************************
*/

SIPL.Position = {
  // set to true if needed, warning: firefox performance problems
  // NOT neeeded for page scrolling, only if draggable contained in
  // scrollable elements
  includeScrollOffsets: false,

  // must be called before calling withinIncludingScrolloffset, every time the
  // page is scrolled
  prepare: function() {
    this.deltaX =  window.pageXOffset
                || document.documentElement.scrollLeft
                || document.body.scrollLeft
                || 0;
    this.deltaY =  window.pageYOffset
                || document.documentElement.scrollTop
                || document.body.scrollTop
                || 0;
  },

  realOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.scrollTop  || 0;
      valueL += element.scrollLeft || 0;
      element = element.parentNode;
    } while (element);
    return [valueL, valueT];
  },

  cumulativeOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
    } while (element);
    return [valueL, valueT];
  },

  positionedOffset: function(element) {
    var valueT = 0, valueL = 0;
    do {
      valueT += element.offsetTop  || 0;
      valueL += element.offsetLeft || 0;
      element = element.offsetParent;
      if (element) {
        if(element.tagName=='BODY') break;
        var p = SIPL.Element.getStyle(element, 'position');
        if (p == 'relative' || p == 'absolute') break;
      }
    } while (element);
    return [valueL, valueT];
  },

  offsetParent: function(element) {
    if (element.offsetParent) return element.offsetParent;
    if (element == document.body) return element;

    while ((element = element.parentNode) && element != document.body)
      if (SIPL.Element.getStyle(element, 'position') != 'static')
        return element;

    return document.body;
  }
}

//// AJAX PROCESSING REQUEST POP UP BOX STARTS ***********************************************************/
// Popup code
var gTabIndexes = new Array();
// Pre-defined list of tags we want to disable/enable tabbing into
var gTabbableTags = new Array("A","BUTTON","TEXTAREA","INPUT","SELECT","IFRAME");	

SIPL.DlgAjaxProcessing = {
	gPopupMask: null,
	gPopupContainer: null,
	gPopupIsShown: false,
	gHideSelects: false,
	showProcessingRequest: function() {
		this.gPopupMask = SIPL.Element.getEl("PRMask");
		this.gPopupContainer = SIPL.Element.getEl("PRContainer");
		this.gPopupIsShown = true;
		this.gHideSelects = true;
		// Disabling Tabs
		SIPL.FormControls.disableTabIndexes();
		$(this.gPopupMask).show();
		$(this.gPopupContainer).sow();
		// calculate where to place the window on screen
		this.centerProcessingRequestWin();
	
		// Hiding Select Boxes
		if (gHideSelects) SIPL.FormControls.Select.hideSelectBoxes();
	},
	hideProcessingRequest: function() {
		this.gPopupIsShown = false;
		// Restoring Tabs
		FormControls.restoreTabIndexes();
		if (this.gPopupMask == null) return;
		
		$(this.gPopupMask).hide();
		$(this.gPopupContainer).hide();
	
		// display all select boxes
		if (this.gHideSelects == true) SIPL.FormControls.Select.displaySelectBoxes();
	},
	centerProcessingRequestWin: function() {
		if (this.gPopupIsShown == true) {
			width = this.gPopupContainer.offsetWidth;
			height = this.gPopupContainer.offsetHeight;
	
			var fullHeight = SIPL.Element.getHeight();
			var fullWidth = SIPL.Element.getWidth();
			
			var theBody = document.documentElement;
			
			var scTop = parseInt(theBody.scrollTop,10);
			var scLeft = parseInt(theBody.scrollLeft,10);
			
			this.gPopupMask.style.height = fullHeight + "px";
			this.gPopupMask.style.width = fullWidth + "px";
			this.gPopupMask.style.top = scTop + "px";
			this.gPopupMask.style.left = scLeft + "px";
			
			var titleBarHeight = parseInt(SIPL.Element.getEl("PRTitleBar").offsetHeight, 10);
			
			this.gPopupContainer.style.top = (scTop + ((fullHeight - (height+titleBarHeight)) / 2)) + "px";
			this.gPopupContainer.style.left =  (scLeft + ((fullWidth - width) / 2)) + "px";
		}
	}
}
jQuery.event.add(window, "resize", SIPL.DlgAjaxProcessing.centerProcessingRequestWin);
//jQuery.event.add(window, "scroll", SIPL.DlgAjaxProcessing.centerProcessingRequestWin);
window.onscroll = SIPL.DlgAjaxProcessing.centerProcessingRequestWin;
/************************************************************************************************************************
//// AJAX PROCESSING REQUEST POP UP BOX ends
************************************************************************************************************************/

/************************************************************************************************************************
//// COMMON CODE FOR ACTION DROPDOWN MENUS STARTS
************************************************************************************************************************/
var iActionMenuDisappearDelay=250;  //menu disappear speed onMouseout (in miliseconds)
var eHideActionMenu_OnClick="yes"; //hide menu when user clicks within menu?
// Function returns the offset value of action dropdown menus
function fnGetActionMenuPositionOffset(objControl, offsettype){
	var totaloffset=(offsettype=="left")? objControl.offsetLeft : objControl.offsetTop;
	var parentEl=objControl.offsetParent;
	while (parentEl!=null){
		totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
		parentEl=parentEl.offsetParent;
	}
	return totaloffset;
}
// Function generates Action Drop down menus based on supplied parameters
// objControl - Control, actionMenuContents: menu contens, menuwidth: width of dropdown menu
function fnGenerateActionMenus(objControl,actionMenuContents,menuwidth){
	if (window.event) event.cancelBubble=true;
	fnClearHideActionMenu();	
	objActionMenu=$('divActionDropdownMenus');
	//Populate menu items with provided contents
	fnPopulateMenuContents(actionMenuContents);
	//Hide menu on mouse out
	objControl.onmouseout=fnDelayHideActionMenu;
	
	if (isIE4||isNS6){
		fnToggleActionMenuDisplay(objActionMenu.style,menuwidth);
		objActionMenu.x=fnGetActionMenuPositionOffset(objControl, "left");
		objActionMenu.y=fnGetActionMenuPositionOffset(objControl, "top");
		objActionMenu.style.left=objActionMenu.x-fnClearBrowserEdge(objControl, "rightedge")+"px";
		objActionMenu.style.top=objActionMenu.y-fnClearBrowserEdge(objControl, "bottomedge")+objControl.offsetHeight+"px";
	}
}
// Function populates the content of action dropdown menus
function fnPopulateMenuContents(actionMenuContents){
	if (isIE4||isNS6){
		objActionMenu.innerHTML=actionMenuContents.join("");
	}
}
// Function toggles display properties of action menu and position
function fnToggleActionMenuDisplay(objControl,menuwidth){
	if (isIE4||isNS6){
		objActionMenu.style.left=objActionMenu.style.top="-500px";
	}
	if (menuwidth!=""){
		objActionMenu.style.width=menuwidth+"px";
	}else{
		objActionMenu.style.width="150px";
	}
	if (objControl.visibility=="hidden"){
		objControl.visibility="visible";
	}else{
		objControl.visibility="hidden";
	}
}
// Function tests the IE Compatibility test
function fnIECompatibilityTest(){
	return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body;
}
// Function clears the browser edge right and bottom edges
function fnClearBrowserEdge(objControl, whichedge){
	var iEdgeOffset=0;
	if (whichedge=="rightedge"){
		var windowedge=isIE4 && !window.opera? fnIECompatibilityTest().scrollLeft+fnIECompatibilityTest().clientWidth-15 : window.pageXOffset+window.innerWidth-15;
		objActionMenu.contentmeasure=objActionMenu.offsetWidth;
		if (windowedge-objActionMenu.x < objActionMenu.contentmeasure){
			iEdgeOffset=objActionMenu.contentmeasure-objControl.offsetWidth;
		}
	}else{
		var topedge=isIE4 && !window.opera? fnIECompatibilityTest().scrollTop : window.pageYOffset;
		var windowedge=isIE4 && !window.opera? fnIECompatibilityTest().scrollTop+fnIECompatibilityTest().clientHeight-15 : window.pageYOffset+window.innerHeight-18;
		objActionMenu.contentmeasure=objActionMenu.offsetHeight;
		if (windowedge-objActionMenu.y < objActionMenu.contentmeasure){ //move up?
			iEdgeOffset=objActionMenu.contentmeasure+objControl.offsetHeight;
			if ((objActionMenu.y-topedge)<objActionMenu.contentmeasure){ //up no good either?
				iEdgeOffset=objActionMenu.y+objControl.offsetHeight-topedge;
			}
		}
	}
	return iEdgeOffset;
}
// Function called from action menu div defined in header.jsp on mouseout event
function fnDynamicActionMenuHide(e){
	if (isIE4 && !objActionMenu.contains(e.toElement)){
		fnDelayHideActionMenu();
	}
}
//Function hides the action dropdown menus
function fnHideActionMenu(e){
	if (typeof objActionMenu!="undefined"){
		if (isIE4||isNS6){
			objActionMenu.style.visibility="hidden";
		}
	}
}
//Function delays hiding of action dropdown menus
function fnDelayHideActionMenu(){
	if (isIE4||isNS6){
		iActionMenuDelayHide=setTimeout("fnHideActionMenu()",iActionMenuDisappearDelay);
	}
}
// Function clears the timeout parameter of delaying the action dropdown menus
function fnClearHideActionMenu(){
	if (typeof iActionMenuDelayHide!="undefined"){
		clearTimeout(iActionMenuDelayHide);
	}
}
// Function called if clicked on action menus to hide the action dropdown menus
if (eHideActionMenu_OnClick=="yes"){
	document.onclick=fnHideActionMenu;
}
/************************************************************************************************************************
//// COMMON CODE FOR ACTION DROPDOWN MENUS ENDS
************************************************************************************************************************/