
function find(id)
{
	return document.getElementById(id);
}

function evalInternal(val)
{
	if(val == null)
		return null;
	return (typeof val == 'string') ?  find(val) : val;
}

function call(val, func)
{
	if(val == null)
		return;
	if(typeof val == 'string' || val[0] == undefined)
		return func(evalInternal(val));
	else
		for(var i = 0; i < val.length; ++i)
		 call(val[i], func);
}

function hideImpl(val)
{
	if(evalInternal(val) != null)
		evalInternal(val).style.display = 'none';
}

function hide(val)
{
	call(val, hideImpl);
}

function showImpl(val)
{
	if(evalInternal(val) != null)
		evalInternal(val).style.display = '';
}

function show(val)
{
	call(val, showImpl);
}

function disableImpl(val)
{
	if(evalInternal(val) != null)
		evalInternal(val).disabled = true;
}

function disable(val)
{
	call(val, disableImpl);
}

function enableImpl(val)
{
	if(evalInternal(val) != null)
		evalInternal(val).disabled = false;
}

function enable(val)
{
	call(val, enableImpl);
}

function disableButtonImpl(val)
{
	if(evalInternal(val) != null)
	{
	    enable(val);

	    EnableButton(evalInternal(val), false);	    
	}
}

function disableButton(val) {
	call(val, disableButtonImpl);
}

function enableButtonImpl(val)
{
	if(evalInternal(val) != null)
	{
	    enable(val);
	    EnableButton(evalInternal(val), true);	    
	}
}

function enableButton(val)
{
	call(val, enableButtonImpl);
}

function getPosition(element)
{	
	var result = { x:0, y:0 };
	while (element)
	{
		result.x += element.offsetLeft;
		result.y += element.offsetTop;
		if(element.tagName.toLowerCase() == "div")
		{
			result.x -= element.scrollLeft;
			result.y -= element.scrollTop;
		}
		element = element.offsetParent;
	}
	return result;
}

function isEmpty(val)
{
	if(val == null)
		return true;
	if(typeof val == 'string')
		return val.length == 0;
	return false;
}

function isInt(val)
{
	return !isNaN(toInt(val));
}

function toInt(val)
{
	return val - 0;
}

function isPureInt(val)
{
    if (val == null)
        return false;

    return parseInt(val).toString().length == val.length;
}

function toString(val)
{
	return val + '';
}

function inRange(val, min, max)
{
	return min < val && val < max
}

function formatImpl(templ, arg, num)
{
	var result = templ;
	var indx;
	var argTempl = '{'+num+'}';
	while((indx = result.indexOf(argTempl)) >= 0)
		result = 
			result.substring(0, indx) + 
			arg + 
			result.substring(indx + argTempl.length, result.length);
	return result;
}

function format(templ, args)
{
	if(args[0] == undefined)
		return formatImpl(templ, args, 0);
	else
	{
		var result = templ;
		for(var i = 0; i < args.length; ++i)
			result = formatImpl(result, args[i], i);
		return result;
	}
}


function SetFocus(value)
	{
	    var ctrl = evalInternal(value);
                
		if(ctrl != null)
		{		
			if(ctrl.isTextEdit)
			{
				var tr = ctrl.createTextRange();
				tr.moveStart('word');
				tr.collapse();
				tr.moveEnd('character',0);
				tr.select();
            }
			if(!ctrl.disabled)
			    ctrl.focus();			    
		}		
	}


//Resets values of eventargument and eventtarget hidden fields of aspnet server form
function ResetEventArgumentAndEventTargetFields()
{
    //get all form and select ASPNET server from among them
    var allForms=document.forms;
    
    var form=null;
    for(var i=0; i<allForms.length; i++)
    {
        ResetEventFieldsInForm(allForms[i]);        
    }
}

function ResetEventFieldsInForm(form) {
    //This check is required if current post back is AJAX ASYNC postback
    if (form.elements)
    {
        var eventtarget = form.elements["__EVENTTARGET"];
        var eventargument = form.elements["__EVENTARGUMENT"];
        
        //if true, current page is ASPNET page, that contains server form
        if (eventtarget && eventargument) 
        {
            ResetValue(eventargument);
            ResetValue(eventtarget);
        }
    }  
}

//Sets value property to empty string, if such property exists	
function ResetValue(ctrl)
{
    if(ctrl && ctrl.value)
    {
        ctrl.value="";
    }
}

/// <summary>
/// Determines the browser type and version currently executing the site content
/// </summary>
function BrowserInfo() 
{
    this._userAgent = navigator.userAgent;
    this._version = navigator.appVersion;
    this.Version;
    this.IsOpera = this.IsKHTML = this.IsSafari = this.IsKonqueror = this.IsIE = this.IsMozilla = this.IsFirefox = false;

    var Opera = "Opera";
    var Khtml = "KHTML";
    var Konqueror = "Konqueror";
    var AppleWebKit = "AppleWebKit";
    var MsIe = "MSIE";
    var Gecko = "Gecko";
    var Firefox = "Firefox";

    this.IsOpera = this._userAgent.indexOf(Opera) > -1;
    if (this.IsOpera) 
    {
        if (navigator.appName == Opera) 
        {
            this.Version = parseFloat(this._version);
        }
        else 
        {
            var operaVersionRegExp = new RegExp(Opera + " (\\d+\\.\\d+)");
            operaVersionRegExp.test(this._userAgent);
            this.Version = parseFloat(RegExp["$1"]);
        }
    }

    this.IsKHTML = this._userAgent.indexOf(Khtml) > -1 ||
		this._userAgent.indexOf(Konqueror) > -1 ||
		this._userAgent.indexOf(AppleWebKit) > -1;

    if (this.IsKHTML) 
    {
        this.IsSafari = this._userAgent.indexOf(AppleWebKit);
        this.IsKonqueror = this._userAgent.indexOf(Konqueror);

        //ToDo: Determine the versions of KHTML-like browsers if necessary here
    }

    this.IsIE = this._userAgent.indexOf("compatible") > -1 &&
		this._userAgent.indexOf(MsIe) > -1 && !this.IsOpera;
    if (this.IsIE) 
    {
        var ieRegExp = new RegExp(MsIe + " (\\d+\\.\\d+)");
        ieRegExp.test(this._userAgent);
        this.Version = parseFloat(RegExp["$1"]);
    }

    this.IsMozilla = this._userAgent.indexOf(Gecko) > -1 && !this.IsOpera;
    if (this.IsMozilla) 
    {
        this.IsFirefox = this._userAgent.indexOf(Firefox) > -1;

        var ffRegExp = new RegExp(Firefox + "\/(\\d+\\.\\d+(?:\\.\\d+)?)");
        ffRegExp.test(this._userAgent);
        this.Version = parseFloat(RegExp["$1"]);
    }
}

var BrowserIdentity = new BrowserInfo();

function AppendCssClassToControl(control, cssClass) 
{
    var currentClass = control.className;

    if (IsCssClassDefined(currentClass, cssClass)) 
    {
        return;
    }

    var resultClass = AppendCssClassToString(currentClass, cssClass);
    control.className = resultClass;
}

function AppendCssClassToString(currentCssClass, appendingCssClass) 
{
    var result;
    var cssClassSeparator = " ";

    if (IsCssClassDefined(currentCssClass, appendingCssClass)) 
    {
        return currentCssClass;
    }

    if (currentCssClass != null) 
    {
        result = currentCssClass + cssClassSeparator + appendingCssClass;
    }
    else 
    {
        result = appendingCssClass;
    }

    return result;
}

function RemoveCssClassFromControl(control, cssClass) 
{
    if (!IsCssClassDefined(control.className, cssClass)) 
    {
        return;
    }

    control.className = RemoveCssClassFromString(control.className, cssClass);
}

function RemoveCssClassFromString(currentCssClass, removingCssClass) 
{

    var result = "";
    var cssClassSeparator = " ";
    var currentClassArray = currentCssClass.split(cssClassSeparator);

    for (var i = 0; i < currentClassArray.length; i++) 
    {
        if (currentClassArray[i] == removingCssClass) 
        {
            currentClassArray[i] = null;
            break;
        }
    }

    for (var i = 0; i < currentClassArray.length; i++) 
    {
        if (currentClassArray[i] != null) 
        {
            result += currentClassArray[i] + cssClassSeparator;
        }
    }

    return result.substring(0, result.length - 1);
}

function IsCssClassDefined(cssClassToTest, testCssString) 
{

    var cssClassSeparator = " ";
    var currentClassArray = cssClassToTest.split(cssClassSeparator);

    for (var i = 0; i < currentClassArray.length; i++) 
    {
        if (currentClassArray[i] == testCssString) 
        {
            return true;
        }
    }

    return false;
}

/// <summary>
/// Function shall be used to set the width of the html <code>SELECT</code> control to
/// width of the text of some of its options
/// <param name="controlId">Id of control to adjust the width</param>
/// <param name="optionIndex">Id of the option starting from 0 as the first option to use as the etalon</param>
/// </summary>
function ResizeSelectToOptionWidth(controlId, optionIndex)
{
    var control = document.getElementById(controlId);       
    var isIndexOutOfRange = (optionIndex < 0 || control.options.length <= optionIndex);
    if (controlId == null || isIndexOutOfRange)
    {
        return;
    }

    var optionText = control.options[optionIndex].text;

    var testControl = document.createElement("span");
    testControl.style.visibility = "hidden";
    testControl.appendChild(document.createTextNode(optionText));

    document.body.appendChild(testControl);

    if (control.offsetWidth > testControl.offsetWidth)
    {
        // Note: It tightly depends on currently set control styles!!!    
        var dropDownArrowWidth = BrowserIdentity.IsIE ? 23 : 30;
        control.style.width = testControl.offsetWidth + dropDownArrowWidth + "px";

        if (BrowserIdentity.IsFirefox)
        {
            var options = control.getElementsByTagName("option");
            for (var i = 0; i < options.length; i++)
            {
                options[i].style.width = testControl.offsetWidth + 5 + "px";
            }
        }        
    }
    
    document.body.removeChild(testControl);
}

var GetElementsByTagNames = function(regionId)
{
    var result = new Array;

    for (var i = 1; i < arguments.length; i++)
    {
        var data = document.getElementById(regionId).getElementsByTagName(arguments[i]);
        for (var j = 0; j < data.length; j++)
        {
            result.push(data[j]);
        }
    }
    
    return result;    
}

///<summary>
/// Don't use it directly from the client code.
/// Use AssignDefaultSubmitButtons function instead
///</summary>
var AssignDefaultSubmitButtonsImpl = function(regionId)
{
    var elements = GetElementsByTagNames(regionId, "input", "select");
    if (elements.length == 0)
        return;

    var defaultSubmit = null;
    var textboxes = new Array();
    for (var j = 0; j < elements.length; j++)
    {
        if (elements[j].type == "submit" && elements[j].attributes['defaultSubmit'] != undefined)
        {
            defaultSubmit = elements[j];
        }
        else if (elements[j].type == "text" || elements[j].tagName.toLowerCase() == "select")
        {
            textboxes.push(elements[j]);
        }
    }

    if (defaultSubmit != null)
    {
        for (var j = 0; j < textboxes.length; j++)
        {
            textboxes[j].onkeypress = function(e)
            {
                var keycode;
                if (window.event)
                {
                    keycode = window.event.keyCode;
                }
                else if (e)
                {
                    keycode = e.which;
                }
                else
                    return true;

                if (keycode == 13)
                {
                    defaultSubmit.click();
                    return false;
                }
            }
        }
    }
}

///<summary>
/// Sets the buttons of 'submit' type with attribute 'defaultSuibmit=true'
/// as the default submit button for all tag's contents marked with regionId identifier
///</summary>
var AssignDefaultSubmitButtons = function(regionId)
{
    if (window.addEventListener)
    {
        window.addEventListener("load", function() { AssignDefaultSubmitButtonsImpl(regionId); }, false);
    }
    else if (window.attachEvent)
    {
        window.attachEvent("onload", function() { AssignDefaultSubmitButtonsImpl(regionId); });
    }
}

var CheckAllInContainer = function(containerId, value)
{
    var containerIdElement = document.getElementById(containerId);
    if (containerIdElement == null)
        return;

    var checkboxes = containerIdElement.getElementsByTagName("input");
    for (var i = 0; i < checkboxes.length; i++)
    {
        if (checkboxes[i].type == "checkbox" && !checkboxes[i].disabled)
        {
            checkboxes[i].checked = value;
        }
    }
}

var AttachEvent = function(eventName, control, handler)
{
    if (!control || !handler)
        return;

    if (window.addEventListener)
    {
        control.addEventListener(eventName, handler, false);
    }
    else if (window.attachEvent)
    {
        control.attachEvent("on" + eventName, handler);
    }
}