//$Id: Utils.js,v 1.40 2005/09/08 14:04:19 gjayakrishnan Exp $

// ------------------- General Object related methods ---------------------- //

if (document.all)
	var browser_ie=true
else if (document.layers)
	var browser_nn4=true
else if (document.layers || (!document.all && document.getElementById))
	var browser_nn6=true

if (window.navigator.userAgent.toUpperCase().indexOf("OPERA") >= 0)	
	var browser_opera=true;
	
/**
 * Retruns the x position of the given object in the window / screen.
 */
function findPosX(obj) {
	var curleft = 0;
	if (document.getElementById || document.all) {
		while (obj.offsetParent) {
			curleft += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	} 
	else if (document.layers) {
		curleft += obj.x;
	}
	return curleft;
}

/**
 * Retruns the x position of the given object in the window / screen.
 */
function findPosY(obj) {
	var curtop = 0;
	if (document.getElementById || document.all) {
		while (obj.offsetParent) {
			curtop += obj.offsetTop;
			obj = obj.offsetParent;
		}
	} else if (document.layers) {
		curtop += obj.y;
	}
	return curtop;
}

function findDocDim() {
	if (browser_ie) {
		return {
    		width : document.body.offsetWidth,
			height : document.body.offsetHeight
		}
	} else if (browser_nn4 || browser_nn6) {
		return {
    		width : window.screen.width - ((scrX - pgeX) + document.body.scrollLeft),
			height : window.screen.height - ((scrY - pgeY) + document.body.scrollTop)
		}
	}
}

var scrollConst = 0;
if (browser_nn4 || browser_nn6) scrollConst = 125;

/**
 * Finding screenTop, screenLeft, pageTop, pageLeft during a particular event (used for Mozilla browser)
 */
var scrX = 0, scrY = 0, pgeX = 0, pgeY = 0, srcElement;
if (browser_ie) {
	document.attachEvent("onclick", popUpListener);
} else if (browser_nn4 || browser_nn6) {
	document.addEventListener("click", popUpListener, true);
}

function popUpListener(e) {
	if (browser_ie) {
		srcElement = window.event.srcElement;
	} else if (browser_nn4 || browser_nn6) {
		srcElement = e.target;
		scrX = e.screenX;
		scrY = e.screenY;
		pgeX = e.pageX;
		pgeY = e.pageY;
	}
}

/**
 * Retruns the object for the given element id and document object.
 */
function getObj(n,d) {
	var p,i,x; 
	if(!d)
		d=document;

	if((p=n.indexOf("?"))>0&&parent.frames.length) {
		d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);
	}

	if(!(x=d[n])&&d.all){
		x=d.all[n];
	}

	for(i=0;!x&&i<d.forms.length;i++){
		x=d.forms[i][n];
	}

	for(i=0;!x&&d.layers&&i<d.layers.length;i++){
		x=getObj(n,d.layers[i].document);
	}

	if(!x && d.getElementById){
		x=d.getElementById(n);
	}
	return x;
}

/**
 * Creating trim() function and added to String object
 */
String.prototype.trim = function() {
  var x=this;
  x=x.replace(/^\s*(.*)/, "$1");
  x=x.replace(/(.*?)\s*$/, "$1");
  return x;
}

function reloadAndCloseWindow(additionalParamsToPass)
{
    if(self.parent.window.opener != null)
    {
     	self.parent.window.opener.addRequestParams(self.parent.window.opener.ROOT_VIEW_ID, additionalParamsToPass);
        self.parent.window.opener.refreshCurrentView();
    }
   self.parent.window.close();
}

function enableCustomization(){
	var previousData = stateData[ROOT_VIEW_ID]["_D_RP"];
	if(previousData != null){
		stateData[ROOT_VIEW_ID]["_D_RP"] = previousData + "PERSONALIZE=TRUE";
	}
	else {
	stateData[ROOT_VIEW_ID]["_D_RP"] = "PERSONALIZE=TRUE";
	}
	refreshCurrentView();
}

function enableViewMode(){
	var previousData = stateData[ROOT_VIEW_ID]["_D_RP"];
	if(previousData != null){
		stateData[ROOT_VIEW_ID]["_D_RP"] = previousData + "PERSONALIZE=FALSE";
	}
	else {
	stateData[ROOT_VIEW_ID]["_D_RP"] = "PERSONALIZE=FALSE";
	}
	refreshCurrentView();
}

function showBorder(elementId){
	element = document.getElementById(elementId + "_Border");
	element.className = 'showDivBorder';
}
function hideBorder(elementId){
	element = document.getElementById(elementId + "_Border");
	element.className = 'divBorder';
}

function searchViews(searchObject){
	document.getElementById('views').className = 'show';
	return updateSearchData('ListViewConfigurations', searchObject);
}

function expandCollapse(elemId, imgID){
	var ids = new Array('rmImg', 'avlImg');
	var tabs = new Array('_RmTab', '_AvlTab');
	if(document.getElementById('_NewTab') != null){
		ids[ids.length] = 'newImg';
		tabs[tabs.length] = '_NewTab';
	}
	if(document.getElementById('_SearchTab') != null){
		ids[ids.length] = 'srcImg';
		tabs[tabs.length] = '_SearchTab';
	}
	for(var i = 0; i < tabs.length; i++){
		currId = tabs[i];
		if(currId == elemId){
			if(document.getElementById(elemId).className == 'show'){
				document.getElementById(elemId).className = 'hide';
				document.getElementById(imgID).className = 'collapse';
				document.getElementById('views').className = 'hide';
			}
			else {
				document.getElementById(elemId).className = 'show';
				document.getElementById(imgID).className = 'expand';
				if(currId == '_SearchTab'){
					document.getElementById('views').className = 'hide';
					document.getElementById('orgTab1').className = 'hide';
					document.getElementById('orgTab2').className = 'hide';
					document.getElementById('dummyTab1').className = 'show';
					document.getElementById('dummyTab2').className = 'show';
				}
				if(currId == '_AvlTab'){
					document.getElementById('views').className = 'show';
					document.getElementById('orgTab1').className = 'show';
					document.getElementById('orgTab2').className = 'show';
					document.getElementById('dummyTab1').className = 'hide';
					document.getElementById('dummyTab2').className = 'hide';
					if(stateData["ListViewConfigurations"]){
						updateSearchData('ListViewConfigurations', document.getElementById('groupSearch'));
					}
				}
				if(currId == '_RmTab'){
					document.getElementById('views').className = 'hide';
					document.getElementById('orgTab1').className = 'show';
					document.getElementById('orgTab2').className = 'show';
					document.getElementById('dummyTab1').className = 'hide';
					document.getElementById('dummyTab2').className = 'hide';

				}
				if(currId == '_NewTab'){
					document.getElementById('views').className = 'hide';
				}
			}
		}
		else {
			document.getElementById(currId).className = 'hide';
			document.getElementById(ids[i]).className = "collapse";
		}
	}
}

function enableForm(formName){
	document.getElementById(formName + "ReadMode").className = 'hide';
	document.getElementById(formName + "EditMode").className = 'show';
}

var customize_uniqueId = null;
/**
 *
 */
function showCustomizeLinks(linksId, id, event,referenceId){
	customize_uniqueId = referenceIds[referenceId];
	linksId = linksId + referenceId;
	getObj(linksId).style.display="block";
	getObj(linksId).style.left=findPosX(getObj(id));
	getObj(linksId).style.top=findPosY(getObj(id))+getObj(id).offsetHeight;
}

/**
 *
 */
function hideCustomizationMenu(ev)
{
	// TODO:
	// This is not the way for healthy coding. The links to be removed have
	// been hardcoded. This is because, hiding takes place on click of the
	// body. Two events cannot be fired from there.Hence  the hardcoding.
	// Something needs to be done.
	if (browser_ie){
		currElement=window.event.srcElement;
	}
	else if (browser_nn4 || browser_nn6){
		currElement=ev.target;
	}
	var id = currElement.id;
	if(id.indexOf("ICM") < 0 && customize_uniqueId != null){
		var refId = stateData[customize_uniqueId]["ID"];
		var element = document.getElementById("GridCustomizationLinks" + refId);
		if(element != null){
			if (getObj("GridCustomizationLinks" + refId).style.display=="block"){
				getObj("GridCustomizationLinks" + refId).style.display="none";
			}
		}
		element = document.getElementById("TabCustomizationLinks" + refId);
		if(element != null){
			if (getObj("TabCustomizationLinks" + refId).style.display=="block"){
				getObj("TabCustomizationLinks" + refId).style.display="none";
			}
		}

	}
}


/*
 *
 */
function openCustomizationWindow(url, params){
	url = url + "&UNIQUEID=" + customize_uniqueId;
	window.open(url, customize_uniqueId, params);
}

function openCW(url, type, refId, reqParams, winParams){
	var uId = referenceIds[refId];
	var vName = stateData[uID]["_VN"];
	url = url + "?VIEWNAME=" + vName + "&UNIQUEID=" + uId;
	if(type != null){
		url = ul + "&TYPE=" + type;
	}
	if(reqParams != null){
		url = url + "&" + reqParams;
	}
	window.open(url, uId, winParams);
}


function popWindow(url,name,x,y,isResizable)
{

 // To pop upa new window with the given url and dimensions
 var posX = (screen.width/2)-(x/2);
 var posY = (screen.height/2)-(y/2);
 var winPref = "width=" + x + ",height=" + y
  + ",innerWidth=" + x + ",innerHeight=" + y
  + ",left=" + posX + ",top=" + posY
  + ",screenX=" + posX + ",screenY=" + posY
  + ",toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=yes,"
  + "resizable="+isResizable;
  
 var newWin = window.open(url,name,winPref);
 
 if (window.focus)
 {
  newWin.focus();
 }
 
}

/**
 * Transfers the content from the source mesage holder to the destination
 * message holder which are represented by the srcMessageDiv and
 * destMessageDiv. Also by default it sets the scroll bars back to their
 * original position of [0,0]. This can de disabled by setting the initScroll
 * to false.
 *
 * @param	srcMessageDiv		the source message div id.
 * @param	destMessageDiv	the destination message div id.
 * @param	initScroll			true to reset scroll position, false to leave is as such.
 */
function addContentToMessageDiv(srcMessageDiv, destMessageDiv, initScroll){
	var srcObj = document.getElementById(srcMessageDiv);
	var destObj = document.getElementById(destMessageDiv);
	if(srcObj != null && destObj != null){
		destObj.innerHTML = srcObj.innerHTML;
	}
	if(initScroll == null || initScroll){
		document.body.scrollTop = 0;
		document.body.scrollLeft = 0;
	}
}


function promptViewTitleIfReq(cusViewName,frm)
{
	var title = prompt("Enter View Title");
	if(title == null)
	{
		return false;
	}
	frm.VIEWNAME.value = title;
	frm.TITLE.value = title;
	return true;
}

function isCookieEnabled(){
	var isCookieEnabled = true;
	if(document.cookie == ""){
		document.cookie = "AcceptsCookiesCheck=yes";
		if(document.cookie.indexOf('AcceptsCookiesCheck=yes') == -1){
			isCookieEnabled = false;
		}
	}
	// This line is not required. Need to confirm this and remove
	document.cookie = "";
	return isCookieEnabled;
}

function isBrowserSupported()
{
	var agt=navigator.userAgent.toLowerCase();
	this.major = parseInt(navigator.appVersion);
	this.minor = parseFloat(navigator.appVersion);

	this.nav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
			&& (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
			&& (agt.indexOf('webtv')==-1));
	this.nav5up = (this.nav && (this.major >= 5));

	this.ie   = (agt.indexOf("msie") != -1);
	this.ie5up  = (this.ie && (this.major == 4) && (agt.indexOf("msie 6.0")> 0) );
	this.opera = (agt.indexOf("opera") != -1);
	if((this.nav5up || this.ie5up) && !this.opera){
		return true;
	}
	else {
		return false;
	}
}

/**
 * Appends either ? or & to the url. Can be used for appending further parameters.
 */ 
function getURLSuffixed(url)
{
    if(url.lastIndexOf('?') == -1)
    {
        url += "?";
    }
    else if(url.indexOf('?') > 0 && url.charAt(url.length-1) != '&')
    {
        url += "&";
    }
    return url;
}


/**
 * Appends the parameter to the url. Takes care of appending ? or & and
 * also escapes the value. In case paramvalue is null, then url is just returned.
 **/
function appendParamToUrl(url,paramname,paramvalue)
{
  if(paramvalue == null) return url;
  return getURLSuffixed(url)+  paramname + "=" + escape(paramvalue);
}


function showMessage(message, result){
	var htmlSnippet = "";
	if(result == "true"){
		htmlSnippet = htmlSnippet.concat("<Input type='button' class='successMessage'>");
	}
	else {
		htmlSnippet = htmlSnippet.concat("<Input type='button' class='failureMessage'>");
	}
	htmlSnippet = htmlSnippet.concat(message);
	var insertObj = document.getElementById("messagediv");
	insertObj.innerHTML = htmlSnippet;
	insertObj.className = "MessageDiv";
}

function getXMLHttpRequest(){
	var xmlhttp=false;
	try {
		xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
	} 
	catch (e) {
		try {
			xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
		} 
		catch (E) {
			xmlhttp = false;
		}
	}
	if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
		xmlhttp = new XMLHttpRequest();
	}
	return xmlhttp;
}


/**
 * Finding immediate parent TD in a row
*/
function findTD(oCheckBox) {
	var oCurrTD;
	var oElement = oCheckBox.parentNode;
	while (oElement) {
		if (oElement.tagName == "TD") {
			oCurrTD = oElement;
			break;
		}
		oElement = oElement.parentNode;
	}
	
	return oCurrTD;
}

/**
 * Finding sibilings of a TD tag
*/
function findOtherTD(oCurrTD) {
	var i = 0;
	var oOtherTD = new Array();
	var oPrevTD = oCurrTD.previousSibling;
	while (oPrevTD) {
		oOtherTD[i] = oPrevTD;
		oPrevTD = oPrevTD.previousSibling;
		i++;
	}
	
	var oNextTD = oCurrTD.nextSibling;
	while (oNextTD) {
		oOtherTD[i] = oNextTD;
		oNextTD = oNextTD.nextSibling;
		i++;
	}
	
	return oOtherTD;
}

/**
 * Hiltes selected row
*/
function rowSelect(oCheckBox) {
	var oCurrTD = "";
	oCurrTD = findTD(oCheckBox);
	
	var oOtherTD = new Array();
	oOtherTD = findOtherTD(oCurrTD);
	
	oCurrTD.className = (oCheckBox.checked) ? oCurrTD.className + " select" : oCurrTD.className.substr(0,oCurrTD.className.indexOf("select"));
	for (var i = 0; i < oOtherTD.length; i++)
		oOtherTD[i].className = (oCheckBox.checked) ? oOtherTD[i].className + " select" : oOtherTD[i].className.substr(0,oOtherTD[i].className.indexOf("select"));
	
	if (oCheckBox.type == 'radio') {
		var currId = oCheckBox.value;
		var oRadio = oCheckBox.form.elements[oCheckBox.name];
		
		for (var i = 0; i < oRadio.length; i++) {
			if (i != oCheckBox.value) {
				oCurrTD = findTD(oCheckBox.form.elements[oCheckBox.name][i]);
				oOtherTD = new Array();
				oOtherTD = findOtherTD(oCurrTD);
				
				if (oCurrTD.className.indexOf("select") >= 0) {
					oCurrTD.className = oCurrTD.className.substr(0,oCurrTD.className.indexOf("select"))
					for (var j = 0; j < oOtherTD.length; j++)
						oOtherTD[j].className = oOtherTD[j].className.substr(0,oOtherTD[j].className.indexOf("select"));
				}
			}
		}
	}		
}


/**
 * Hiltes when row is hovered
*/
function rowHover(oTR, bIsHover) {
	for (var i=0; i<oTR.childNodes.length; i++) {
		if (document.all) oTD = oTR.childNodes[i];
		else oTD = oTR.childNodes.item(i);
		
		if (oTD && oTD.tagName=="TD") {
			if (oTD.className.indexOf("select") < 0)
				oTD.className = (bIsHover) ? oTD.className + " hilite" : oTD.className.substr(0,oTD.className.indexOf("hilite"));
		}
	}
}

/**
 * Clears text selection
 */
function clearTextSelection() {
	if (document.selection) document.selection.empty();
	else if (window.getSelection) window.getSelection().removeAllRanges();	
}

function checkForAD(form){
	var val = form.j_username.value;
	if(val.indexOf("\\") > 0){
		var val1 = val.substring(0, val.indexOf("\\"));
		var val2 = val.substring(val.indexOf("\\") + 1);
		form.j_username.value = val2;
		var obj = document.createElement("input");
		obj.type = "hidden";
		obj.value = val1;
		obj.name = "domainName";
		form.appendChild(obj);
		alert(form.domainName.value);
	}
}
