﻿//za da rabotqt region/endregion - http://blog.devarchive.net/2008/04/using-region-directive-with-javascript.html

/** Form and Dom basic funcitons ***************************************************/
//#region
var DHTML = (document.getElementById || document.all);

function getFormControl(controlName, formIndexOrName)
{				
	if(formIndexOrName == null) 
		formIndexOrName = 0;
	
	return document.forms[formIndexOrName].elements[controlName];	
}

function getDomControl(controlId)			
{
	if (!DHTML)				
		return null; 
	
	if(document.getElementById)	
	    return document.getElementById(controlId);
	else if(document.all)
		return document.all[controlId];
	else
		return null;	
}

function getElementsByTagNames(list,obj) 
{
	if (!obj) var obj = document;
	var tagNames = list.split(',');
	var resultArray = new Array();
	for (var i=0; i<tagNames.length; i++) {
		var tags = obj.getElementsByTagName(tagNames[i]);
		for (var j=0; j<tags.length; j++) {
			resultArray.push(tags[j]);
		}
	}
	var testNode = resultArray[0];
	if (!testNode) return [];
	if (testNode.sourceIndex) {
		resultArray.sort(function (a,b) {
				return a.sourceIndex - b.sourceIndex;
		});
	}
	else if (testNode.compareDocumentPosition) {
		resultArray.sort(function (a,b) {
				return 3 - (a.compareDocumentPosition(b) & 6);
		});
	}
	return resultArray;
}
	   
//#endregion


/** Popups ***********************************************************************/
//#region

// TODO: this must not be called before the entire page has been loaded
function popupOpen2(popupUrl, popupName, popupWidth, popupHeight)
{
    var content = '<iframe id="frameTiny" src="' + popupUrl + '" width="100%" height="100%" scrolling="yes" frameborder="no" marginwidth="0" marginheight="0"></iframe>';
    TINY.box.show(content, 0, popupWidth, popupHeight, 0, 1);        
}

function popupOpenContent(content, popupWidth, popupHeight)
{    
    TINY.box.show(content, 0, popupWidth, popupHeight, 0, 1);        
}


function popupOpen(popupUrl, popupName, popupParams)
{
    var wndPrintPopup = null;
    wndPrintPopup = window.open(popupUrl, popupName, popupParams);
      
    if(wndPrintPopup == null || typeof(wndPrintPopup) == undefined)
		return false;
	
	try	        { var n = wndPrintPopup.name; wndPrintPopup.focus(); }
	catch(e)    { return false;	}	
	
	return true;	
}

function popupCheckExists(wndPrintPopup)
{
    if(wndPrintPopup == null)
    {
	    alert("Подпрозорец от този сайт беше блокиран от Вашия браузер. Моля, разрешете от настройките в менюто на Вашия браузер покaзване на подпрозорци от този сайт.");	
	    return false;
	}
	else
	{
	    return true;
	}
}

function windowMaximize()
{
    window.moveTo(0,0);

    if (document.all)
    {
      top.window.resizeTo(screen.availWidth,screen.availHeight);
    }

    else if (document.layers||document.getElementById)
    {
      if (top.window.outerHeight<screen.availHeight||top.window.outerWidth<screen.availWidth)
      {
        top.window.outerHeight = screen.availHeight;
        top.window.outerWidth = screen.availWidth;
      }
    }
}

//#endregion


/** attach and release events ***************************************************/
//#region

function attachEventHandler(control, eventHandlerName, domEvent, NSEvent)     
{        
    var str = "(control." + domEvent + ") ? control." + domEvent + ":function(){;}";
    var old = eval(str);
    eval( "control." + domEvent + " = function (event) {old(event); eventHandlerName(event);}");
     if (control.captureEvents)
          eval("control.captureEvents(Event." + NSEvent + ");");
}

// po elegantno ime?!?!?!
function attachEvent_SetFirstExecutingEventHandler(control, eventHandlerName, domEvent, NSEvent)     
{
    var str = "(control." + domEvent + ") ? control." + domEvent + ":function(){;}";
    var old = eval(str);
    eval( "control." + domEvent + " = function (event) {eventHandlerName(event); old(event);}");
     if (control.captureEvents)
          eval("control.captureEvents(Event." + NSEvent + ");");        
}

function releaseEvent(control, domEvent, NSEvent)
{
	eval("control.domEvent = null;");
	if (control.captureEvents) 
		eval("control.releaseEvents(Event." + NSEvent + ");");		
}

//#endregion

/** attach and release specific events ***************************************************/
//#region
function attachClickEvent(control, eventHandlerName)
{				
	attachEventHandler(control, eventHandlerName, "onclick", "CLICK"); 	
}
function releaseClickEvent(control)
{				
	attachEventHandler(control, eventHandlerName, "onclick", "CLICK"); 	
}

function attachLoadEvent(eventHandlerName)
{		
	attachEventHandler(document.body, eventHandlerName, "onload", "LOAD"); 	
}
function releaseLoadEvent()
{
	releaseEvent(document.body, "onload", Event.LOAD); 	
}

function attachUnloadEvent(eventHandlerName)
{				
	attachEventHandler(document.body, eventHandlerName, "onunload", "UNLOAD"); 	
}
function releaseUnloadEvent()
{
	releaseEvent(document.body, "onunload", Event.UNLOAD); 	
}
//#endregion


/** Event manipulation ***************************************************/
//#region

function getEvent(evt)
{
    if( !evt ) evt = window.event;
    return evt;
}
      
function getTarget(evt)
{    
    //evt = getEvent(evt);        
    var target;
    if(evt.srcElement)    
       target = evt.srcElement;    
    else
    {
        target = evt.target;
        while(target.nodeType != target.ELEMENT_NODE)
            target = target.parentNode;
    }
    return target;
}

// Event manipulation
function cancelEvent(evt)
{
    evt = getEvent(evt);
    if(!evt) return false;
    
    evt.cancelBubble = true;
    evt.returnValue = false;
    if (evt.preventDefault) evt.preventDefault();
    if (evt.stopPropagation) evt.stopPropagation();
    return false;
}	

function getKeyCode(evt)
{
    var asc = !evt.keyCode ? (!evt.which ? evt.charCode : evt.which) : evt.keyCode;
    return asc;
}

function getCharacter(asc)
{
    var chr = String.fromCharCode(asc);
    return chr;
}


//#endregion


/** other functions ***************************************************/
//#region

function setFormFocus(controlName, formIndexOrName)
{		
	var formControl = getFormControl(controlName, formIndexOrName);	
	if(formControl != undefined) 
		formControl.focus();				
} 


function limitText(objTextBox, maxLength)
{	
	if(objTextBox.value.length == maxLength) 
	{	
		objTextBox.value = objTextBox.value;		
		return false;			
	}
	else if(objTextBox.value.length > maxLength) 
	{			
		objTextBox.value = objTextBox.value.substring(0, maxLength);
		alert('The max length of text you can type in this field is ' + maxLength + ' symbols. Your text has been cropped.');
		return false;
	}
	else
	{			
		return true;			
	}
}


function uncheckRadioAndCheckControls(controlHolder)
{								
	var tags = getElementsByTagNames("input", controlHolder);
				
	for (var j=0; j<tags.length; j++)
	{									
		if(tags[j].tagName.toLowerCase() == 'input' && (tags[j].type.toLowerCase() == 'checkbox' || tags[j].type.toLowerCase() == 'radio'))
		{										
			tags[j].checked = false;
		}
	}	
}


// Disabled all submitable controls except the one that caused the currect postback
function disableSubmitableControlsOnClick(e)
{
	if (!e) var e = window.event;
			
	var targ;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;								
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	
	disableSubmitableControls(targ, true);
	/*					
	var tags = getElementsByTagNames("a,input");
				
	for (var j=0; j<tags.length; j++)
	{							
		if(tags[j] != targ) // don't disable the current link or it may not work
		{					
			if(	(tags[j].tagName.toLowerCase() == 'a' && tags[j].href.indexOf("__doPostBack") > -1) || 
				(tags[j].tagName.toLowerCase() == 'input' && (tags[j].type.toLowerCase() == 'button' || tags[j].type.toLowerCase() == 'submit' || tags[j].type.toLowerCase() == 'reset' || tags[j].type.toLowerCase() == 'image')))
			{										
				tags[j].disabled = true;								
			}	
		}					
	}
	*/
	
	//window.setTimeout("captureUnloadEvent(); formPosted = false; disableSubmitableControls(null, false)", 5000);
}


function disableSubmitableControls(clickTarget, bDisable)
{								
	var tags = getElementsByTagNames("a,input");
				
	for (var j=0; j<tags.length; j++)
	{							
		if(tags[j] != clickTarget) // don't disable the current link or it may not work
		{					
			if(	(tags[j].tagName.toLowerCase() == 'a' && tags[j].href.indexOf("__doPostBack") > -1) || 
				(tags[j].tagName.toLowerCase() == 'input' && (tags[j].type.toLowerCase() == 'button' || tags[j].type.toLowerCase() == 'submit' || tags[j].type.toLowerCase() == 'reset' || tags[j].type.toLowerCase() == 'image')))
			{										
				tags[j].disabled = bDisable;								
			}	
		}					
	}	
}

function tabToNextFormElement(senderName)
{
    var sender = getFormControl(senderName);
    
    var nextEl, currentEl;
    var formElements = document.forms[0].elements;
    for (var i=0; i < formElements.length; i++)
    {
        currentEl = formElements[i];
        if (sender == currentEl && (nextEl = formElements[i+1]))
        {
            if (nextEl.focus) 
            {
                nextEl.focus();
                if(nextEl.select) nextEl.select();
            }
        }
    }
}

// slaga se na onkeydown na textbox naprimer
function onEnterClickButton(ev, buttonId)
{
    var e = getEvent(ev); 
    var keystroke = getKeyCode(e); 
    if(keystroke == 13)  
    { 
        document.getElementById(buttonId).click(); 
        return false;
    }
    else 
        return true;   
}


//#endregion

//date functions
//#region
function BCL_DaysBetweenTwoDates(date1, date2) 
{    
    var ONE_DAY = 1000 * 60 * 60 * 24 // The number of milliseconds in one day

    var date1_ms = date1.getTime()
    var date2_ms = date2.getTime()
    
    var difference_ms = Math.abs(date1_ms - date2_ms)
        
    return Math.round(difference_ms/ONE_DAY)

}
//#endregion

//formatting date & double
//#region

// TODO: replace functionality and remove 
function BCL_FormatDate(dateSeparator, rawText)
{
    var formatedtext;
    if(rawText.length < 10)
    {
        var date = new Date();
        formatedtext = padLeft(date.getDate(), '0', 2) + dateSeparator + padLeft(date.getMonth() + 1, '0', 2) + dateSeparator + date.getFullYear();
    }
    else
    {
        var preFormattedText = rawText.substr(0, 10);
        formatedtext = preFormattedText.substr(8,2) + dateSeparator + preFormattedText.substr(5,2) + dateSeparator + preFormattedText.substr(0,4);
    }
    return formatedtext;
}


function BCL_FormatDouble(precision, divSymbol, maxInputLength, rawText)
{
    if(rawText == "" || rawText == undefined)
    {
        if(precision > 0)
        {
            var str = divSymbol;
            for(var l = 0; l < precision; l++)
            {
                str += "0";
            }
            return str;
        }
        else
            return "";
    }
    var indexOfDivSymbol = rawText.indexOf(divSymbol);
       
    if((rawText.length - indexOfDivSymbol - 1) == 0) 
    { rawText = rawText.substr(0,rawText.length - 1); }
    
    var indexOfSecondDivSymbol = (rawText.substr(indexOfDivSymbol + 1)).indexOf(divSymbol);
    if( (indexOfSecondDivSymbol != -1) )
    {
        rawText = rawText.substr(0,indexOfSecondDivSymbol + indexOfDivSymbol + 1);
    }
    
    indexOfDivSymbol = rawText.indexOf(divSymbol);
    var currPrecision = 0;
    //alert(indexOfDivSymbol)
    if(indexOfDivSymbol > -1)
    {
        currPrecision = rawText.length - indexOfDivSymbol - 1;
    }
    //alert("currPrecision: " + currPrecision)
    //alert(rawText)    
    
    var formatedtext = rawText;
    if(currPrecision > precision)
    {
        formatedtext = DoubleRound(formatedtext, precision);        
        formatedtext = formatedtext+''; // da stane string
        indexOfDivSymbol = formatedtext.indexOf(divSymbol);
        currPrecision = formatedtext.length - indexOfDivSymbol - 1;        
        //formatedtext = rawText.substring(0,rawText.length -(currPrecision - precision));        
    }
        
    if(currPrecision < precision)
    {
        var padRight = "";
        if(currPrecision == 0)
        {
            padRight = divSymbol;
        }
        for (var i=0;i<precision - currPrecision;i++)
        {
            padRight = padRight + '0';
        }
        formatedtext = formatedtext + padRight;
    }     
    
    if(maxInputLength && maxInputLength < formatedtext.length) 
    {
        formatedtext = formatedtext.substr(formatedtext.length - formatedtext.length, maxInputLength);
    }
    
    return formatedtext;
}

//#endregion

//math
//#region

function DoubleRound(number, decimals)
{    
    if(decimals==0)
    {
        return Math.round(number);
    }
    else
    {
        var i = Math.pow(10, decimals);               
        return Math.round(number*i)/i;    
   }
}

function Floor(number)
{
    return Math.floor(number);
}

function Fabs(number)
{
    return Math.abs(number);
}

function ifNaNReturnZero(valueToCheck)
{
    if (isNaN(valueToCheck))
        return 0;
    return valueToCheck;
} 

//#endregion

//Element positioning
//#region
function getElementLeft(obj) 
{		
	var xPos = obj.offsetLeft;
	var tempEl = obj.offsetParent;
	while (tempEl != null) 
	{
		xPos += tempEl.offsetLeft;
  		tempEl = tempEl.offsetParent;
	}
	return xPos;
}

function getElementTop(obj) 
{	
	var yPos = obj.offsetTop;
	var tempEl = obj.offsetParent;
	while (tempEl != null) 
	{
		yPos += tempEl.offsetTop;
  		tempEl = tempEl.offsetParent;
	}
	return yPos;
}

function getElementHeight(obj) 
{	
	return obj.offsetHeight;
}

function getElementWidth(obj) 
{
	return obj.offsetWidth;
}

function moveXY(obj, x, y)
{
    obj.style.top = y + "px";
    obj.style.left = x +"px";
}
//#endregion

//ToSpeech
//#region
function BCL_ToSpeech(value)
{
    var strRet = new String("");
    value = DoubleRound(value, 2);
    
    var bMinus = new Boolean(false);
    //alert(value);    
    if(value<0.0)
    {
        
        value=Fabs(value);
        bMinus = true;
    }
    
    var str = new String("");
    var bPutAnd = new Boolean(false);
    var whole = Floor(value);
    var reminder = DoubleRound(value-whole, 2);
    
    var d = whole/1000;
    d=DoubleRound(d-Floor(d), 3)*1000;
    if (d <= 100) bPutAnd = true;
    if(Floor(d)%100==0) bPutAnd=true;
    strRet += ToSpeech(Floor(DoubleRound(d, 0)), false);
    
    whole = whole / 1000;
    whole = Floor(whole);
    if (whole == 0) 
    {
         var currencyString = "лева";
            if (Floor(value) == 1)
                currencyString = "лев";
            
            if (reminder > 0)
            {
                
                reminder = reminder * 100.0;
                str = new String(Floor(reminder + 0.00001));
                if (strRet.length>0 && str.length>0)
                    strRet += " " + currencyString + " и " + str + " ст.";
                else strRet = str + " ст.";
            }
            else strRet += " " + currencyString;

            if (value == 0)
                strRet = "0 " + currencyString;
           
            //strRet.TrimStart();
            //strRet.TrimEnd();
            
            //strRet = strRet.replace("  ", " ");
 
            if (bMinus==true) strRet = "минус " + strRet;
            return strRet;
    }
    d = whole / 1000;
    d = DoubleRound(d - Floor(d), 3) * 1000;
    if (Floor(d) == 1)
    {
        if (bPutAnd==true && strRet.length>0)
        {
           strRet = " и " + strRet;
           bPutAnd = false;
        }
        strRet = "хиляда " + strRet;
    }
    else if (Floor(d) != 0)
    {
        if (bPutAnd==true && strRet.length>0)
        {
           strRet = " и " + strRet;
           bPutAnd = false;
        }
        strRet = ToSpeech(Floor(d), true) + " хиляди " + strRet;
    }
    whole = whole / 1000;
    whole = Floor(whole);
    if (whole == 0) 
    {
         var currencyString = "лева";
            if (Floor(value) == 1)
                currencyString = "лев";
            
            if (reminder > 0)
            {
                reminder = reminder * 100.0;
                str = new String(Floor(reminder + 0.00001));
                if (strRet.length>0 && str.length>0)
                    strRet += " " + currencyString + " и " + str + " ст.";
                else strRet = str + " ст.";
            }
            else strRet += " " + currencyString;

            if (value == 0)
                strRet = "0 " + currencyString;
           
            //strRet.TrimStart();
            //strRet.TrimEnd();
            
            //strRet = strRet.replace("  ", " ");
            //alert(bMinus);
            if (bMinus==true) strRet = "минус " + strRet;
            return strRet;
    }
    d = whole / 1000;
    d = DoubleRound(d - Floor(d), 3) * 1000;
     if (Floor(d) == 1)
    {
        if (bPutAnd==true && strRet.length>0)
        {
           strRet = " и " + strRet;
           bPutAnd = false;
        }
        strRet = "един милион " + strRet;
    }
    else if (Floor(d) != 0)
    {
        if (bPutAnd==true && strRet.length>0)
        {
           strRet = " и " + strRet;
           bPutAnd = false;
        }
        strRet = ToSpeech(Floor(d), true) + " милиона " + strRet;
    }
    whole = whole / 1000;
    whole = Floor(whole);
    if (whole == 0)
    {
         var currencyString = "лева";
            if (Floor(value) == 1)
                currencyString = "лев";
            
            if (reminder > 0)
            {
                reminder = reminder * 100.0;
                str = new String(Floor(reminder + 0.00001));
                if (strRet.length>0 && str.length>0)
                    strRet += " " + currencyString + " и " + str + " ст.";
                else strRet = str + " ст.";
            }
            else strRet += " " + currencyString;

            if (value == 0)
                strRet = "0 " + currencyString;
           
            //strRet.TrimStart();
            //strRet.TrimEnd();
            
            //strRet = strRet.replace("  ", " ");
            //alert(bMinus);
            if (bMinus==true) strRet = "минус " + strRet;
            return strRet;
    } 
    d = whole / 1000; 
    d = DoubleRound(d - Floor(d), 3) * 1000; 
    if (Floor(d) == 1) strRet = "един милиард " + strRet;
    else if (Floor(d) != 0) strRet = ToSpeech(Floor(d), false) + " милиарда " + strRet;
     
    //the_end:
    var currencyString = "лева";
            if (Floor(value) == 1)
                currencyString = "лев";
            
            if (reminder > 0)
            {
                reminder = reminder * 100.0;
                str = new String(Floor(reminder + 0.00001));
                if (strRet.length>0 && str.length>0)
                    strRet += " " + currencyString + " и " + str + " ст.";
                else strRet = str + " ст.";
            }
            else strRet += " " + currencyString;

            if (value == 0)
                strRet = "0 " + currencyString;
           
            //strRet.TrimStart();
            //strRet.TrimEnd();
            
            //strRet = strRet.replace("  ", " ");
            //alert(bMinus);
            if (bMinus==true) strRet = "минус " + strRet;
            return strRet;
}

function ToSpeech(value, bFemale)
{
    var reminder, reminder2, reminder3;
    var str = new String("");
    var str2 = new String("");
    
    if(value>=1000) return str;
    
    reminder=value%10;
    
    switch (reminder)
    {
                case 1: str = bFemale ? "една" : "един"; break;
                case 2: str = bFemale ? "две" : "два"; break;
                case 3: str = "три"; break;
                case 4: str = "четири"; break;
                case 5: str = "пет"; break;
                case 6: str = "шест"; break;
                case 7: str = "седем"; break;
                case 8: str = "осем"; break;
                case 9: str = "девет"; break;
    }
    
    value = value / 10;
    value=Floor(value);
    if (value == 0) return str;
    
     reminder2 = value % 10;
     
            switch (reminder2)
            {
                case 1:
                    switch (reminder)
                    {
                        case 0: str2 = "десет"; break;
                        case 1: str2 = "единадесет"; break;
                        case 2: str2 = "дванадесет"; break;
                        case 3: str2 = "тринадесет"; break;
                        case 4: str2 = "четиринадесет"; break;
                        case 5: str2 = "петнадесет"; break;
                        case 6: str2 = "шестнадесет"; break;
                        case 7: str2 = "седемнадесет"; break;
                        case 8: str2 = "осемнадесет"; break;
                        case 9: str2 = "деветнадесет"; break;
                    }
                    break;
                case 2: str2 = "двадесет"; break;
                case 3: str2 = "тридесет"; break;
                case 4: str2 = "четиридесет"; break;
                case 5: str2 = "петдесет"; break;
                case 6: str2 = "шестдесет"; break;
                case 7: str2 = "седемдесет"; break;
                case 8: str2 = "осемдесет"; break;
                case 9: str2 = "деветдесет"; break               
       }

       if (str2.length > 0)
       {
          if (reminder2 > 1 && str.length > 0) str = str2 + " и " + str;
          else str = str2;
       }
       
       value = value / 10;
       value=Floor(value);
       if (value == 0) return str;
       reminder3 = value % 10;
       
       switch (reminder3)
       {
           case 1: str2 = "сто"; break;
           case 2: str2 = "двеста"; break;
           case 3: str2 = "триста"; break;
           case 4: str2 = "четиристотин"; break;
           case 5: str2 = "петстотин"; break;
           case 6: str2 = "шестстотин"; break;
           case 7: str2 = "седемстотин"; break;
           case 8: str2 = "осемстотин"; break;
           case 9: str2 = "деветстотин"; break;
       }

       if (str.length == 0) str = str2;
       else
       {
           //alert('str.Length');
           if (reminder2 > 1 && reminder != 0) str = str2 + " " + str;
           //else str = str2 + " i " + str
           else str = str2 + " и " + str;
       }
       
       return str;
}

//#endregion

