
function findMaxZIndex()
{
   var allElems = document.getElementsByTagName ?
   document.getElementsByTagName("*") :
   document.all;
   // or test for that too
   var maxZIndex = 0;
   for(var i = 0; i < allElems.length; i ++ )
   {
      var elem = allElems[i];
      var cStyle = null;
      if (elem.currentStyle)
      {
         cStyle = elem.currentStyle;
      }
      else if (document.defaultView && document.defaultView.getComputedStyle)
      {
         cStyle = document.defaultView.getComputedStyle(elem, "");
      }
      var sNum;
      if (cStyle)
      {
         sNum = Number(cStyle.zIndex);
      }
      else
      {
         sNum = Number(elem.style.zIndex);
      }
      if ( ! isNaN(sNum))
      {
         maxZIndex = Math.max(maxZIndex, sNum);
      }
   }
   
   return maxZIndex;
}

function getElementsByClassName(oElm, strTagName, strClassName)
{
   var arrElements = (strTagName == "*" && document.all) ? document.all : oElm.getElementsByTagName(strTagName);
   var arrReturnElements = new Array();
   strClassName = strClassName.replace(/\-/g, "\\-");
   var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
   var oElement;
   for(var i = 0; i < arrElements.length; i ++ )
   {
      oElement = arrElements[i];
      if(oRegExp.test(oElement.className))
      {
         arrReturnElements.push(oElement);
      }
   }
   return (arrReturnElements)
}

function findCalendarContainer(parentNode)
{
    var elArray = getElementsByClassName(document, 'div', 'ajax__calendar');
    for(var i = 0; i < elArray.length; i++)
    {
        if(elArray[i].parentNode == parentNode)
            return elArray[i];    
    }
        
    return null;    
}

function findCalendarControlContainer(parentNode)
{
    var elArray = getElementsByClassName(document, 'div', 'ajax__calendar_days');
    var p = null;
    
    for(var i = 0; i < elArray.length; i++)
    {
        p = elArray[i].parentNode;
        while(p != null)
        {
            if(p == parentNode)
                return elArray[i];    
            p = p.parentNode;
        }
    }
        
    return null;    
}

function SetCalendarZIndex(containerID)
{
    var el = findCalendarContainer($get(containerID))
    currentContainer = el;
    
//    var cont = findCalendarControlContainer(el);
//   
//    cont.style.margin = '0px';
//    cont.style.padding = '0px';
//    cont.style.width = '150px';
//    
//    var t = cont.getElementsByTagName("table");
//     alert(t);
//    t[0].style.width = '15px';
//    t[0].style.margin = '0px';
//    t[0].style.padding = '0px';
        
    
    if (el && el.style) el.style.zIndex=findMaxZIndex() + 10;
}

// global variables
var currentContainer;
var currentBehavior;

// Define target element is Container or not
function isTargetCalendarContainer(target)
{
    if(target == currentContainer)
        return true;
    else
    {
        if(target.parentNode != null)
            return isTargetCalendarContainer(target.parentNode);
        else
            return false;
    }
}

// handler for mouseUp event
function mouseUpHandler(ev)
{
    if(!isTargetCalendarContainer(ev.target))
    {
        currentBehavior.hide();
        $removeHandler(document, 'mouseup', this._calendarMouseHandler);
    }
}

// set handler to mouse up event
function setMouseClickHandler(currentBehaviorID)
{
    currentBehavior = $find(currentBehaviorID);
       
     this._calendarMouseHandler = Function.createDelegate(this, mouseUpHandler);
    
    // $removeHandler(document, 'mouseup', this._calendarMouseHandler);
    $addHandler(document, 'mouseup', this._calendarMouseHandler);
}

var accessKeysArray = null;

// add accelerator key to control
function bindAccessKeyToControl(controlID, keyCode)
{
    if(accessKeysArray == null)
    {
        var theBody;

        if (document.documentElement) 
             theBody = document.documentElement;
         else
             theBody = document.getElementsByTagName('BODY')[0];

        this._clickHandler = Function.createDelegate(this, accessKeyDown);

       // $removeHandler(theBody, 'keydown',  this._clickHandler);
        $addHandler(theBody, 'keydown',  this._clickHandler);
        accessKeysArray = new Array(keyCode + '|' + controlID);
    }
    else
    {
        var pair = keyCode + '|' + controlID;
        
        for(var i = 0; i < accessKeysArray.length; i++)
        {
            if(parseInt(getKey(accessKeysArray[i])) == keyCode)
            {
                accessKeysArray[i] = pair;
                return;
            }
        }
        
        Array.add(accessKeysArray, pair);
    }
}

function getKey(s)
{
	return s.split('|')[0];
}

function getValue(s)
{
	return s.split('|')[1];
}


function getControlID(keyCode)
{
    if(accessKeysArray == null)
        return null;
    for(var i = 0; i < accessKeysArray.length; i++)
    {
        var key = getKey(accessKeysArray[i]);
        if(parseInt(key) == keyCode)
            return getValue(accessKeysArray[i]);
    }
    
    return null;
}

function accessKeyDown(ev)
{
    /*if(ev.keyCode == 27 && typeof(this.close) != 'undefined' &&
        typeof(customEscHandler) != 'undefined')
    {
        customEscHandler();
    }
    else*/
    if(ev.keyCode == 27 || (ev.altKey && ev.keyCode != 18))
    {
        var control = getControlID(ev.keyCode);
        if(control != null)
        {
            ev.stopPropagation();
            ev.preventDefault();
            
            if($get(control))
                $get(control).click();
        }
    }
}


var gDblClickFunc = null;
var gOneClickFunc = null;
var gTarget = null;

function startOneClick(ev, func, ignoreCheckingElement)
{
    var target; 
    
    var ignoreCheck = typeof(ignoreCheckingElement) == 'undefined' ? false : ignoreCheckingElement;
    
    window.currentEvent = ev;
    
    if (typeof(window.event) != 'undefined') 
        target = window.event.srcElement; 
    else    
    { 
        target = ev.target; 
        while(!ignoreCheck && target.nodeType != target.ELEMENT_NODE) 
            target = target.parentNode; 
    }
         
    if(!ignoreCheck)             
    {                      
        if(target.tagName.toUpperCase() == 'TD')
        {
            if(typeof(gOneClickFunc) != 'undefined' && gOneClickFunc != null)
                return;
                
            gOneClickFunc = func;
            
           // var futdate = new Date();
            //this.prevInactiveTime = futdate.getTime();
         /*   gTarget = target;
            
            this._dblClickHandler = Function.createDelegate(this, dblClick);
            
            if(Sys.Browser.agent != Sys.Browser.Firefox)
                $addHandler(gTarget, 'mouseup', this._dblClickHandler);
            else
                $addHandler(gTarget, 'mousedown', this._dblClickHandler);*/
            
            iTimeoutId = window.setTimeout('continueOneClick()', 350);
            
            return false;
        }
    }
    else
    {
        if(typeof(gOneClickFunc) != 'undefined' && gOneClickFunc != null)
                return;
                
        gOneClickFunc = func;
        
        iTimeoutId = window.setTimeout('continueOneClick()', 350);
            
        return false;
    }

    return true;
}

function startDblClick(ev, func)
{
    //if(typeof(gDblClickFunc) != 'undefined')
    //    gDblClickFunc = null;
    gOneClickFunc = null;
    
    if(typeof(iTimeoutId) != 'undefined' && iTimeoutId)
        window.clearTimeout(iTimeoutId);
        
    iTimeoutId = null; 
    
    
    
    eval(func);
}
/*
function dblClick()
{
     if(typeof(gDblClickFunc) != 'undefined' && gDblClickFunc != null)
     {
       if(Sys.Browser.agent != Sys.Browser.Firefox)
            $removeHandler(gTarget, 'mouseup',  this._dblClickHandler);
        else
            $removeHandler(gTarget, 'mousedown',  this._dblClickHandler);
        
        window.clearTimeout(iTimeoutId);
        iTimeoutId = null;
        eval(gDblClickFunc);
        gOneClickFunc = null;
        gDblClickFunc = null;
    }
}
*/
function continueOneClick()
{
    if(typeof(iTimeoutId) != 'undefined' && iTimeoutId)
    {
    /*
        var futdate = new Date();
        this.inactiveTime = futdate.getTime() - this.prevInactiveTime;

        if(this.inactiveTime <= 320)
        {
            iTimeoutId = window.setTimeout('continueOneClick()', 100);
            return;
        }
      
        window.clearTimeout(iTimeoutId);
        
        iTimeoutId = null;       

         if(Sys.Browser.agent != Sys.Browser.Firefox)
            $removeHandler(gTarget, 'mouseup',  this._dblClickHandler);
        else
            $removeHandler(gTarget, 'mousedown',  this._dblClickHandler);    
        */
        
        eval(gOneClickFunc);   
        //gDblClickFunc = null;            
        gOneClickFunc = null;
    }
}

function moveNextRow(ev)
{
   if(currentElement == null)
   {
        currentElement = gridItems[0];
        $get(currentElement).onclick(ev);
   }
   else
   {
        var index = Array.indexOf(gridItems, currentElement);
       
        if(index < (gridItems.length - 1))
        {
           $get(gridItems[++index]).onclick(ev);
        }
   }
}

function movePrevRow(ev)
{
   if(currentElement == null)
   {
       currentElement = gridItems[0];
       $get(currentElement).onclick(ev);
   }
   else
   {
      var index = Array.indexOf(gridItems, currentElement); 
      if(index > 0)
        {
            $get(gridItems[--index]).onclick(ev);
        }
   }
}

function cursorKeyDown(ev)
{    
    if(ev.keyCode == 38) // key up
    {
        movePrevRow(ev.rawEvent);
    }
    
    if(ev.keyCode == 40) // key down
    {
        moveNextRow(ev.rawEvent);
    }
    
    if(ev.keyCode == 13) // enter down
    {
        if(typeof(inPopupMode) != 'undefined' 
            && inPopupMode == true && currentElement != null)
                $get(currentElement).ondblclick(ev);
    }
}

var gridItems = null;
var currentElement = null;

function fillGridItemsID(id)
{
    if(gridItems)
        Array.add(gridItems, id);        
    else
    {
        gridItems = new Array(id);
    }
}

function setCurrentElement(id)
{
    currentElement = id;
}

function bindCursorKeysCatcher()
{
    if(typeof(this._clickHandlerCursor) == 'undefined')
    {
         var theBody;

         if (document.documentElement) 
               theBody = document.documentElement;
           else
               theBody = document.getElementsByTagName('BODY')[0];

         this._clickHandlerCursor = Function.createDelegate(this, cursorKeyDown);
         
       //  $removeHandler(theBody, 'keydown',  this._clickHandlerCursor);
         $addHandler(theBody, 'keydown',  this._clickHandlerCursor);
    }
}

// TODO: Divide functional to static classes!

function clearMask(elementId, mask)
{
    var el = $get(elementId);
    if (el && el.value)
    {
        if (el.value == mask) el.value = "";
    }
}

function checkTextBoxFilled(tbId, className)
{
    var tb = $get(tbId);
    if(tb != null && tb.value.length > 0)
        tb.className = className;
}
