/////////////////////////////////////////////////////
//	NBrowserCapsStaticClass NBrowserCapsStaticClass 
//
var NodeType_MouseCaptureLayer = "mouseCaptureLayer"

/////////////////////////////////////////////////////
//	NBrowserCapsStaticClass object
//
function NBrowserCapsStaticClass()
{
	//	Initialization	
	NBrowserCapsStaticClass.prototype.Initialize = function()
	{
		this.UseRecursiveOffsetForDivs = this.isOffsetRecursiveForDivs();
	}

	//	Operations
	NBrowserCapsStaticClass.prototype.ToPixelLength = function(lengthValue)
	{
		if(typeof(lengthValue) == typeof(""))
			return this.AdjustPixelLengthString(lengthValue);
	
		return this.AdjustPixelLengthString(new String(parseInt(lengthValue)));
	}

	NBrowserCapsStaticClass.prototype.FromPixelLength = function(lengthValue)
	{
		if(typeof(lengthValue) != typeof(""))
			lengthValue = new String(lengthValue);
		return parseInt(NTools.ReplaceString(lengthValue.toLowerCase(), "px", ""));
	}

	NBrowserCapsStaticClass.prototype.AdjustPixelLengthString = function(lengthString)
	{
		var regex = /\W*px\W*$/gi
		if(lengthString.search(regex) != -1)
			return lengthString;
		return lengthString + "px";
	}	

	NBrowserCapsStaticClass.prototype.GetOffset = function(element)
	{
		return this.calcOffsetsRecursive(element, null);
	}

	NBrowserCapsStaticClass.prototype.GetOffsetFromEvent = function(eventObject, eventTarget)
	{
		var result = new Object();
		result.offsetLeft = 0;
		result.offsetTop = 0;

		if(!NReflection.IsInstance(eventObject))
			return result;

		if(NReflection.IsInstance(eventObject.pageX))
		{
			result.offsetLeft = eventObject.pageX;
			result.offsetTop = eventObject.pageY;
		}
		else if(NReflection.IsInstance(eventObject.offsetX))
		{
			result.offsetLeft = eventObject.offsetX;
			result.offsetTop = eventObject.offsetY;

			result = this.calcOffsetsRecursive(eventTarget, result);
		}
		else if(NReflection.IsInstance(eventObject.x))
		{
			result.offsetLeft = eventObject.x;
			result.offsetTop = eventObject.y;
		}
		
		return result;
	}
	
	NBrowserCapsStaticClass.prototype.GetScreenOffsetFromEvent = function(eventObject, eventTarget)
	{
		var result = new Object();
		result.offsetLeft = 100;
		result.offsetTop = 100;

		if(!NReflection.IsInstance(eventObject))
			return result;

		if(NReflection.IsInstance(eventObject.screenX))
		{
			result.offsetLeft = eventObject.screenX;
			result.offsetTop = eventObject.screenY;
		}
		
		return result;
	}
	
	NBrowserCapsStaticClass.prototype.GetEventTargetOfTag = function(eventObject, tagName)
	{
		var prop;
		for(prop in eventObject)
		{
			var propertyValue = eventObject[prop];
			if(!NReflection.IsInstance(propertyValue))
				continue;
			if(!NReflection.IsInstance(propertyValue.tagName))
				continue;
			if(propertyValue.tagName.toLowerCase() == tagName.toLowerCase())
				return propertyValue;
		}
		return null;
	}

	NBrowserCapsStaticClass.prototype.EnableTextSelection = function(allowFlag)
	{
		if(!allowFlag)
		{
			document.onselectstart = function()
			{
				return false;
			}
			return;
		}
		
		document.onselectstart = null;
	}
	
	NBrowserCapsStaticClass.prototype.GetDocumentHeight = function()
	{
		return Math.max(document.documentElement.clientHeight + document.documentElement.scrollTop, document.body.clientHeight + document.documentElement.scrollTop);
	}
	
	NBrowserCapsStaticClass.prototype.GetWindowHeight = function()
	{
		if(NReflection.HasProperty(window, "innerHeight"))
			return window.innerHeight;

		return document.documentElement.clientHeight;
	}
	
	NBrowserCapsStaticClass.prototype.GetWindowWidth = function()
	{
		if(document.documentElement.clientWidth == 0)
			return document.body.clientWidth;
		return Math.min(document.documentElement.clientWidth, document.body.clientWidth);
	}
	
	NBrowserCapsStaticClass.prototype.GetRelevantLengths = function()
	{
		var docElementHeight = document.documentElement.clientHeight;
		var bodyHeight = document.body.clientHeight;
		var scrollHeight = document.documentElement.scrollHeight;
		var documentHeight = NBrowserCaps.GetDocumentHeight();
		
		var lengths = new Array();
		
		this.addRelevantLengthToArray(lengths, docElementHeight);
		this.addRelevantLengthToArray(lengths, bodyHeight);
		this.addRelevantLengthToArray(lengths, scrollHeight);
		this.addRelevantLengthToArray(lengths, documentHeight);
		
		lengths.sort();
		
		return lengths;
	}
	
	NBrowserCapsStaticClass.prototype.addRelevantLengthToArray = function(lengthsArray, len)
	{
		for(var i = 0; i < lengthsArray.length; i++)
			if(lengthsArray[i] == len)
				return;
		lengthsArray.push(len);
	}

	NBrowserCapsStaticClass.prototype.AddBox = function(parentElement, x, y, width, height, className)
	{
		var boxDiv = document.createElement("div");
		
		boxDiv.style.position = "absolute";
		boxDiv.className = className;
		boxDiv.style.left = NBrowserCaps.ToPixelLength(x);
		boxDiv.style.top = NBrowserCaps.ToPixelLength(y);
		boxDiv.style.width = NBrowserCaps.ToPixelLength(width);
		boxDiv.style.height = NBrowserCaps.ToPixelLength(height);
		boxDiv.style.overflow = "hidden";

		parentElement.appendChild(boxDiv);
		
		return boxDiv;
	}
	
	NBrowserCapsStaticClass.prototype.CreateCaptureLayer = function()
	{
		var captureLayer = document.getElementById("mouseCaptureEventTarget");
		if(NReflection.IsInstance(captureLayer))
			return captureLayer;

		var docHeight = NBrowserCaps.GetDocumentHeight();
		var dragDropDiv = document.createElement("div");
		dragDropDiv.id = "mouseCaptureEventTarget";
		dragDropDiv.style.position = "absolute";
		dragDropDiv.style.top = NBrowserCaps.ToPixelLength(0);
		dragDropDiv.style.left = NBrowserCaps.ToPixelLength(0);
		dragDropDiv.style.width = NBrowserCaps.ToPixelLength(document.documentElement.clientWidth);
		dragDropDiv.style.height = NBrowserCaps.ToPixelLength(docHeight);
		dragDropDiv.NodeType = NodeType_MouseCaptureLayer;

		document.body.appendChild(dragDropDiv);

		return dragDropDiv;
	}

	NBrowserCapsStaticClass.prototype.DestroyCaptureLayer = function()
	{
		var captureLayer = document.getElementById("mouseCaptureEventTarget");
		if(!NReflection.IsInstance(captureLayer))
			return;
		document.body.removeChild(captureLayer);
	}

	NBrowserCapsStaticClass.prototype.ExtractPathUrl = function(serverFullUrl)
	{
		var curIndex = 0;
		var slashIndex = 0;
		while((curIndex = serverFullUrl.indexOf("/", slashIndex + 1)) != -1)
			slashIndex = curIndex;

		if(slashIndex == serverFullUrl.length - 1)
			return serverFullUrl.slice(0, slashIndex + 1);
			
		var postSlashText = serverFullUrl.slice(slashIndex, serverFullUrl.length - 1);
		if(postSlashText.indexOf(".asp") != -1 || postSlashText.indexOf(".htm") != -1)
			return serverFullUrl.slice(0, slashIndex + 1);
	
		return serverFullUrl + "/";
	}

	NBrowserCapsStaticClass.prototype.ExtractUrlNoQuery = function(serverFullUrl)
	{
		var qmIndex = serverFullUrl.indexOf("?");
		if(qmIndex == -1)
			return serverFullUrl;
			
		return serverFullUrl.slice(0, qmIndex);
	}

	NBrowserCapsStaticClass.prototype.SetSelection = function(element, selection)
	{
		element.focus();
		if(NReflection.HasProperty(element, "setSelectionRange"))
		{
			element.setSelectionRange(selection.Start, selection.End);
			element.Selection = selection;
			return;
		}
		
		try
		{
			var txt = element.value;
			var recalcStart = NTools.ReverceRecalculateWithSimpleNewLine(txt, selection.Start);
			var recalcEnd = NTools.ReverceRecalculateWithSimpleNewLine(txt, selection.End);
			
			var range = element.createTextRange();
			range.collapse(true);
			range.moveStart("character", recalcStart);
			range.moveEnd("character", recalcEnd - recalcStart);
			range.select();
			element.Selection = selection;
		}
		catch(ex)
		{
		}
	}
	
	NBrowserCapsStaticClass.prototype.GrantSelectionProperty = function(element)
	{
		element.focus();
		
		var selection = new Object();
		selection.Start = 0;
		selection.End = 0;

		if(NReflection.HasProperty(element, "selectionStart"))
		{
			selection.Start = element.selectionStart;
			selection.End = element.selectionEnd;
		}
		else if(NReflection.HasProperty(document, "selection"))
		{
			try
			{
				//	IE SUX BIIIIIIIGTIME
				var txt = element.value;
				var len = txt.length;
				var range_obj = element.createTextRange();
				var range_sel = document.selection.createRange();
				var rangelen = range_sel.text.length;
				var boolkmark = range_sel.getBookmark();
				range_obj.moveStart('character', -2*len);
				range_obj.moveToBookmark(boolkmark);
				var movecount = Math.abs(range_obj.moveStart('character', -2*len));
				if(movecount == 1 && range_obj.text.length > len/2)
					movecount = len;
				else
					movecount = NTools.RecalculateWithSimpleNewLine(txt, movecount);
				
				selection.Start = movecount;
				selection.End = selection.Start + rangelen;
			}
			catch(ex)
			{
			}
		}

		element.Selection = selection;
	} 

	//	Tools
	NBrowserCapsStaticClass.prototype.calcOffsetsRecursive = function(element, result)
	{
		if(!NReflection.IsInstance(element))
			return result;
	
		if(result == null) 
		{
			result = new Object();
			if(!NReflection.IsInstance(element.offsetLeft))
			{
				result.offsetLeft = 0;
				result.offsetTop = 0;
			}
			else
			{
				result.offsetLeft = element.offsetLeft;
				result.offsetTop = element.offsetTop;
			}
			
			var parentTagName = element.offsetParent.tagName.toLowerCase();
			var isParentBlockElement = (parentTagName == "div");
			
			if(element.offsetParent != null && isParentBlockElement && !this.UseRecursiveOffsetForDivs)
				return result;
		}
		else if(NReflection.IsInstance(element.offsetLeft))
		{
			result.offsetLeft += element.offsetLeft;
			result.offsetTop += element.offsetTop;
		}
	
		return this.calcOffsetsRecursive(element.offsetParent, result);
	}

	NBrowserCapsStaticClass.prototype.isOffsetRecursiveForDivs = function()
	{
		var div11 = document.createElement("div");
		var div12 = document.createElement("div");
		var div21 = document.createElement("div");

		div11.style.width = this.ToPixelLength(10);
		div11.style.height = this.ToPixelLength(10);
		div12.style.width = this.ToPixelLength(10);
		div12.style.height = this.ToPixelLength(10);
		div21.style.width = this.ToPixelLength(10);
		div21.style.height = this.ToPixelLength(10);
		
		var testOffset = new Object();

		div12.appendChild(div21);
		document.body.appendChild(div11);
		document.body.appendChild(div12);
		testOffset.offsetLeft = div21.offsetLeft;
		testOffset.offsetTop = div21.offsetTop;
		document.body.removeChild(div11);
		document.body.removeChild(div12);
		div12.removeChild(div21);
		
		return testOffset.offsetLeft == 0 && testOffset.offsetTop == 0;
	}
	
	//	Fields
	this.length += 1;
	this.UseRecursiveOffsetForDivs = null;
	
}
//	Static Instance
var NBrowserCaps = new NBrowserCapsStaticClass();
