var hrefArray;
var brIE = '0';
var useHistory = 0;
var startAJAXPage = 1;
var oldHash = '';

var Base64 = {
 _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
  encode : function (input)
    {
     var output = "";
     var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
     var i = 0;
     input = Base64._utf8_encode(input);
     while (i < input.length)
       {
        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);
        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;
        if(isNaN(chr2)){enc3 = enc4 = 64;}
        else if(isNaN(chr3)){enc4 = 64;}
        output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
       }
     return output;
    },
  decode : function (input)
    {
     var output = "";
     var chr1, chr2, chr3;
     var enc1, enc2, enc3, enc4;
     var i = 0;
     input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
     while (i < input.length)
       {
        enc1 = this._keyStr.indexOf(input.charAt(i++));
        enc2 = this._keyStr.indexOf(input.charAt(i++));
        enc3 = this._keyStr.indexOf(input.charAt(i++));
        enc4 = this._keyStr.indexOf(input.charAt(i++));
        chr1 = (enc1 << 2) | (enc2 >> 4);
        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
        chr3 = ((enc3 & 3) << 6) | enc4;
        output = output + String.fromCharCode(chr1);
        if(enc3 != 64){output = output + String.fromCharCode(chr2);}
        if(enc4 != 64){output = output + String.fromCharCode(chr3);}
       }
     output = Base64._utf8_decode(output);
     return output;
    },
  _utf8_encode : function (string)
    {
     string = string.replace(/\r\n/g,"\n");
     var utftext = "";
     for (var n = 0; n < string.length; n++)
       {
        var c = string.charCodeAt(n);
        if (c < 128){utftext += String.fromCharCode(c);}
	else if((c > 127) && (c < 2048))
               {
	        utftext += String.fromCharCode((c >> 6) | 192);
	        utftext += String.fromCharCode((c & 63) | 128);
	       }
	     else
               {
	        utftext += String.fromCharCode((c >> 12) | 224);
	        utftext += String.fromCharCode(((c >> 6) & 63) | 128);
	        utftext += String.fromCharCode((c & 63) | 128);
	       }
        }
      return utftext;
     },
   _utf8_decode : function (utftext)
     {
      var string = "";
      var i = 0;
      var c = c1 = c2 = 0;
      while ( i < utftext.length )
        {
         c = utftext.charCodeAt(i);
         if(c < 128)
           {
	    string += String.fromCharCode(c);
	    i++;
	   }
         else if((c > 191) && (c < 224))
                {
	         c2 = utftext.charCodeAt(i+1);
	         string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
	         i += 2;
	        }
	      else
                {
	         c2 = utftext.charCodeAt(i+1);
	         c3 = utftext.charCodeAt(i+2);
	         string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
	         i += 3;
	        }
        }
      return string;
      }
}

function buttonOver(){$(this).addClass('ui-state-hover');}
function buttonOverOut(){$(this).removeClass('ui-state-hover');}

function changeHref(el)
{
 var href = el.getAttribute('href');
 if(href != '#')
   {
    hrefArray.push({id: el.id, href: href});
    el.setAttribute('href', '#');
   }
 return href;
}

function initClasses()
{
 if(navigator.appName == 'Microsoft Internet Explorer'){brIE = '1'}
 hrefArray = new Array();
 if(useHistory != 0)
   {
    $.history.init(historyShow);
    if(window.location.toString().indexOf('#') != -1)
      {
       var hash = window.location.toString().
             substr(window.location.toString().indexOf('#')+1,window.location.toString().length);   
       if(hash != '')$('body').css('display','none');
      }
   }
}

function makeSQLString(val)
{
 res = val.replace('&','%26').replace('\'','%27%27');
 return res;
}

function replacer(key, value)
{
 if(typeof value === 'number' && !isFinite(value)){return String(value);}
 return value;
}

function addHistoryArray(el,href,prm,funcResponse,tp,funcBefore,prmBefore)
{
 startAJAXPage = 0;
 var funcNameBefore = funcBefore.toString();
 var nameFunc = '';
 if(funcNameBefore != 'none')
   {
    nameFunc = funcNameBefore.replace('function ','');
    funcNameBefore = nameFunc.substr(0,nameFunc.indexOf('('));
   }
 var funcNameResponse = funcResponse.toString();
 nameFunc = funcNameResponse.replace('function ','');
 funcNameResponse = nameFunc.substr(0,nameFunc.indexOf('('));
 var prmText = '';
 if (prmBefore.toSource)
   {prmText = prmBefore.toSource();}
 else
   {prmText = '('+JSON.stringify(prmBefore, replacer)+')';}
 var hash = Base64.encode('({"href":"'+href+'","prm":"'+prm+'","funcResponse":"'
     +funcNameResponse+'","tp":"'+tp+'","funcBefore":"'+funcNameBefore
     +'","prmBefore":['+prmText+']})');
 if(el.nodeName == 'A'){el.setAttribute('href','#'+hash);}
 else{window.location = window.location.protocol+'//'+window.location.hostname+window.location.pathname+'#'+hash}
}

function historyShow(hash)
{
 if(hash != '')
   {
    oldHash = hash;
    var historyStruct = eval(Base64.decode(hash));
    if(historyStruct.funcBefore != 'none'){eval(historyStruct.funcBefore)(eval(historyStruct.prmBefore)[0]);}
    if(startAJAXPage == 1)
      {
       if(historyStruct.prm == ''){historyStruct.prm='startAJAXPage='+startAJAXPage;}
       else{historyStruct.prm = historyStruct.prm+'&startAJAXPage='+startAJAXPage;}
       startAJAXPage = 0;
      }
    $.post(historyStruct.href,historyStruct.prm,eval(historyStruct.funcResponse),historyStruct.tp);
   }
 else
   {
    if(oldHash != '')
      {
       oldHash = '';
       window.location.reload();
      }
   }
}

function formatCurrency(num)
{
 num = num.toString().replace(/\$|\,/g,'');
 if(isNaN(num))num = "0";
 var sign = (num == (num = Math.abs(num)));
 num = Math.floor(num*100+0.50000000001);
 var cents = num%100;
 num = Math.floor(num/100).toString();
 if(cents<10)cents = "0" + cents;
 for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
   num = num.substring(0,num.length-(4*i+3))+' '+
          num.substring(num.length-(4*i+3));
 return (((sign)?'':'-') + num + ',' + cents);
}

function getOffset(elem)
{
 if (elem.getBoundingClientRect) {return getOffsetRect(elem)}
 else {return getOffsetSum(elem)}
}

function getOffsetSum(elem)
{
 var top=0, left=0;
 while(elem)
   {
    top = top + parseInt(elem.offsetTop);
    left = left + parseInt(elem.offsetLeft);
    elem = elem.offsetParent;
   }
 return {top: top, left: left}
}

function getOffsetRect(elem)
{
 var box = elem.getBoundingClientRect();
 var body = document.body;
 var docElem = document.documentElement;
 var scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop;
 var scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft;
 var clientTop = docElem.clientTop || body.clientTop || 0;
 var clientLeft = docElem.clientLeft || body.clientLeft || 0;
 var top  = box.top +  scrollTop - clientTop;
 var left = box.left + scrollLeft - clientLeft;
 return { top: Math.round(top), left: Math.round(left) }
}
