/*$Id: Utils.js,v 1.34 2008/09/11 03:37:04 balasankar Exp $ */

// ------------------- General Object related methods ---------------------- //

var browser_opera = false;
var browser_ie = false;
var browser_nn6 = false;
var browser_nn4 = false;

if (document.all)
{
  if (window.navigator.appName.toUpperCase=="OPERA")
	browser_opera=true;
  else
	browser_ie=true;
}
else if (document.layers || (!document.all && document.getElementById))
  browser_nn6=true;
else if (document.layers)
  browser_nn4=true;



/**
 * Retruns the x position of the given object in the window / screen.
 */
function findPosX(obj) {
	var curleft = 0;
	if (document.getElementById || document.all) {
		curleft += document.body.offsetLeft;
		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) {
		curtop += document.body.offsetTop;
		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 + document.body.scrollLeft,
			height : document.body.offsetHeight + document.body.scrollTop
		}
	} else if (browser_nn4 || browser_nn6) {
		return {
			width : window.innerWidth + document.body.scrollLeft,
			height : window.innerHeight + document.body.scrollTop
		}
	}
}

function findDocClientDim() {
	if (browser_ie) {
		return {
    		width : document.body.offsetWidth,
			height : document.body.offsetHeight
		}
	} else if (browser_nn4 || browser_nn6) {
		return {
			width : window.innerWidth,
			height : window.innerHeight
		}
	}
}

function getCursorPos(ev) {
	if (browser_ie) {
		var x = window.event.clientX + document.body.scrollLeft;
		var y = window.event.clientY + document.body.scrollTop;
	} else if (browser_nn6) {
		var x = ev.pageX;
		var y = ev.pageY;
	}

	return { x : x, y : y };
}

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 as prototype
 */
String.prototype.trim = function() {
  var x = this;
  x = x.replace(/^\s*(.*)/, "$1");
  x = x.replace(/(.*?)\s*$/, "$1");
  return x;
}

/**
 * Clears text selection
 */
function clearTextSelection() {
	if (window.getSelection) {
		window.getSelection().removeAllRanges();
	} else if (document.getSelection) {
		var s = document.getSelection();
		if (s.collapse) s.collapse(true);
		if (s.removeAllRanges) s.removeAllRanges();
 	} else if (document.selection) {
		document.selection.empty();
	}
}

function docid(id) {
	return document.getElementById(id);
}

function getA(elem, key) {
	return elem.getAttribute(key);
}

function setA(elem, key, value) {
	return elem.setAttribute(key, value);
}

function getBool(bool) {
	if(bool == 'true') {
		return true;
	}
	return false;
}

var celldisp = "block";
var rowdisp = "block";
var tabledisp = "block";
if(!document.all) {
	celldisp = "table-cell";
	rowdisp = "table-row";
	tabledisp = "table";
}

var samplef = null;
function getForm(action, keys, vals) {
	if(samplef == null) {
		samplef = document.createElement('form');
		samplef.method="post";
		document.body.appendChild(samplef);
	}
	var elems = samplef.elements;
	for(var i = elems.length-1; i>=0; i--) {
		samplef.removeChild(elems.item(i));
	}
	samplef.action = action;
	for(var i=0; i<keys.length; i++) {
		samplef.appendChild(getInp(keys[i], vals[i]));
	}
	return samplef;
}

function getInp(key, val) {
	var elem = document.createElement("input");
	elem.type="hidden";
	elem.setAttribute("name", key);
	elem.setAttribute("value", val);
	return elem;
}

if(!document.all) {
   HTMLElement.prototype.outerHTML
     setter =  function(str)
               {
                 var r = this.ownerDocument.createRange();
                 r.setStartBefore(this);
                 var df = r.createContextualFragment(str);
                 this.parentNode.replaceChild(df, this);
                 return str;
               };

   HTMLElement.prototype.outerHTML
     getter =  function ()
               {
                 return getOuterHTML(this)
               };

   function getOuterHTML(node)
   {
         var str = "";
     var empties = ["IMG", "HR", "BR", "INPUT"];

     switch (node.nodeType)
     {
       case 1: // ELEMENT_NODE
         str += "<" + node.nodeName;
         for(var i = 0; i < node.attributes.length; i++)
         {
           if(node.attributes.item(i).nodeValue != null)
           {
             str += " "
             str += node.attributes.item(i).nodeName;
             str += "=\"";
             str += node.attributes.item(i).nodeValue;
             str += "\"";
           }
         }

                 var index = -1;
                 for(var i = 0; i < empties.length; i++)
                 {
                   if(empties[i] == node.nodeName)
                   {
                         index = i;
                         break;
                   }
                 }

                 if(node.childNodes.length == 0 && index > 0)
           str += ">";
         else
         {
           str += ">";
           str += node.innerHTML;
           str += "</" + node.nodeName + ">"
        }
         break;

       case 3:  //TEXT_NODE
         str += node.nodeValue;
         break;

       case 4: // CDATA_SECTION_NODE
         str += "<![CDATA[" + node.nodeValue + "]]>";
         break;

       case 5: // ENTITY_REFERENCE_NODE
         str += "&" + node.nodeName + ";"
         break;

       case 8: // COMMENT_NODE
         str += "<!--" + node.nodeValue + "-->"
         break;
     }

     return str;
   }
 }

 function trimString(str) {
   if(str != null) {
   	str = str.replace( /^\s+/g, "" );// strip leading
   	str = str.replace( /\s+$/g, "" );// strip trailing
   }
   return str;
 }

function makeSelect(field) {
 	if(!field) {
 		return;
 	}
	   if (field.createTextRange) {
	     var range = field.createTextRange();
	     range.collapse(true);
	     range.select();
	   } else if (field.setSelectionRange) {
	     field.focus();
	     field.setSelectionRange(0, 0);
	   }
}



function freezeScriptBackground(type) {
	var iframeIEHack;
	if (!document.getElementById("ScriptFreezeLayer"))
	{
		var oFreezeLayer = document.createElement("DIV");
		oFreezeLayer.id = "ScriptFreezeLayer";
		if(type)
		{
		   if(type=="1")
		   {
		      oFreezeLayer.className = "scriptfreezeLayer";
		   }
		   else if(type=="2")
		   {
		      oFreezeLayer.className = "scriptfreezeLayer2";
		   }
		   else if(type=="3")
		   {
		      oFreezeLayer.className = "scriptfreezeLayer3";
		   }
		}
		else
		{
		   oFreezeLayer.className = "scriptfreezeLayer";
		}
		oFreezeLayer.style.zIndex = "99";
		document.body.appendChild(oFreezeLayer);
	if (browser_ie) {
	      if(type && type =="2")
	      {
	      //alert('not using hack');
	      }
	      else
	      {
		iframeIEHack = document.createElement("IFRAME");
		iframeIEHack.scrolling = "no";
		iframeIEHack.id="ScriptIEHackLayer";
		iframeIEHack.frameBorder = 0;
                if(window["CONTEXT_PATH"] != null)
                {
                   iframeIEHack.src= CONTEXT_PATH + "/framework/html/blank.html";
                }
		iframeIEHack.style.position = "absolute";
		iframeIEHack.style.zIndex = "98";
		iframeIEHack.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';

			iframeIEHack.style.top = "0px";
			iframeIEHack.style.left = "0px";
			iframeIEHack.style.height = "100%";
			iframeIEHack.style.width = "100%";

		document.body.appendChild(iframeIEHack);
	     }
	}

	}
}

function unFreezeScript()
{
	if (document.getElementById("ScriptFreezeLayer") != null)
	{
	    document.body.removeChild(docId("ScriptFreezeLayer"));
		if (browser_ie) {
		      try
		      {
			document.body.removeChild(docId("ScriptIEHackLayer"));
		      }
		      catch(e){}
		}
	}
}


var diffTaskDefLeft = 0;
var diffTaskDefTop = 0;
var TaskDefDialog = null ;

function setCurrentTaskDef(t)
{
 TaskDefDialog=t;
}

function captureTaskDef(ev) {
	TaskDefDialog.style.cursor = "move";

	if (browser_ie) {
		diffTaskDefLeft = window.event.clientX + document.body.scrollLeft - parseInt(findPosX(TaskDefDialog));
		diffTaskDefTop = window.event.clientY + document.body.scrollTop - parseInt(findPosY(TaskDefDialog));
	} else if (browser_nn4 || browser_nn6) {
		diffTaskDefLeft = ev.pageX - parseInt(findPosX(TaskDefDialog));
		diffTaskDefTop = ev.pageY - parseInt(findPosY(TaskDefDialog));
	}

	document.onmousemove = moveTaskDef;
	document.onmouseup = releaseTaskDef;
}

function moveTaskDef(ev) {
	clearTextSelection();
	if (browser_ie) {
		if (document.getElementById("FreezeLayer") != null || browser_opera) {
			TaskDefDialog.style.left = (window.event.clientX + document.body.scrollLeft - diffTaskDefLeft) + "px";
			TaskDefDialog.style.top = (window.event.clientY + document.body.scrollTop - diffTaskDefTop) + "px";
		} else {
			TaskDefDialog.style.left = (window.event.clientX + document.body.scrollLeft - diffTaskDefLeft) + "px";
			TaskDefDialog.style.top = (window.event.clientY + document.body.scrollTop - diffTaskDefTop) + "px";
		}
	} else if (browser_nn4 || browser_nn6) {
		TaskDefDialog.style.left = (ev.pageX - diffTaskDefLeft) + "px";
		TaskDefDialog.style.top = (ev.pageY - diffTaskDefTop) + "px";
	}
}

function releaseTaskDef() {
	TaskDefDialog.style.cursor = "default";
	document.onmousemove = null;
	document.onmouseup = null;
}

function openhtml(theURL)
{
 var x = null;
 if(theURL)
 {
 x = window.open('/help/deluge/index.html?url='+theURL, 'delugedoc');
 }
 else
 {
 x = window.open('/help/deluge/index.html', 'delugedoc');
 }
 x.moveTo(0,0);
 x.resizeTo(screen.width,screen.height);
 x.focus();
}

function openHelpPage(theURL, subURL)
{
 var x = null;
 var url = "/help/index.html";
 if(theURL && theURL != "")
 {
	 url = url +"?url="+theURL;
	 if(subURL && subURL != "")
	 {
		 url = url +"&sub_url="+subURL;
	 }
 }
 x = window.open(url, 'delugedoc');
 x.moveTo(0,0);
 x.resizeTo(screen.width,screen.height);
 x.focus();
}

function positioncenter(dial)
{
	var width = dial.offsetWidth;
	var height = dial.offsetHeight;
	var doc = findDocDim();
	var left = (doc.width / 2 ) - (width / 2) + document.body.scrollLeft;
	var top = (doc.height / 2) - (height / 2) + document.body.scrollTop;
	dial.style.left = parseInt(left) + "px";
	dial.style.top = parseInt(top) + "px";
}

function dialogpositioncenter(dial)
{
	var width = dial.offsetWidth;
	var height = dial.offsetHeight;
	var doc = findDocClientDim();
	var left = (doc.width / 2 ) - (width / 2);
	var top = (doc.height / 2) - (height / 2);
	dial.style.left = parseInt(left) + "px";
	dial.style.top = parseInt(top) + "px";
}

function swapImg(elem,imgpath)
 {
   elem.src = imgpath;
 }

 function reStoreImg(elem,imgpath)
  {
    elem.src = imgpath;
  }

 function removeAllChildNodes(elem) {
	while(elem.hasChildNodes()) {
		elem.removeChild(elem.firstChild);
	}

}

// create Element

function createElem(tag, attributes, value) {
    var el = document.createElement(tag);
    if (attributes) {
        var attrArr = attributes.split(" ");
        for (var i in attrArr) {
            var attribute = attrArr[i];
            var nvPair = attribute.split("=");
            var name = nvPair[0];
            var attrValue = nvPair[1];
            if (name && attrValue) {
                el.setAttribute(name,attrValue);
                if (name == "class") {
                    el.className=attrValue;
                }
            }
            else {
                if(name) {
                    el.setAttribute(name,"");
                }
            }
        }
    }

    if (value) {
        var textNode = null;
        if (typeof value == "string") {
            textNode = document.createTextNode(value);
        }
        else {
            textNode = value;
        }
        el.appendChild(textNode);
    }

    return el;

}

function equalsIgnoreCase(str1, str2){
	if(str2 && str2) {
		if(str1.toLowerCase() == str2.toLowerCase()) {
			return true;
		}
	}
	return false;
}

function validateNumber(str,fieldName)
 {
    var nonums = /^[0-9]*$/;
    var err = "";
    if(str =="" || str == null || !nonums.test(str))
     {
        err ="Please enter a valid number for " +fieldName;
     }

     return err;

 }
