var showAllDebugFieldsets;






function adjustFieldsetStyles() {
    var allFieldsets = Ext.query( '.debugFieldset' );

    for( j=0; j<allFieldsets.length;j++) {

        currentSegment = allFieldsets[j];

        children = Ext.get(currentSegment).dom.childNodes;

        for(var i=0;i<children.length;i++) {
            if( Ext.get(children[i]) ) {

                if( Ext.get(children[i]).dom.tagName == 'LEGEND' && Ext.get(children[i+1]) ) {

                    fieldsetStyle = Ext.get(currentSegment).dom.style;

                    for(jj=i+1;jj<children.length;jj++) {
                         if( Ext.get(children[jj]) && Ext.get(children[jj]).dom.tagName=='DIV' ) {
                            relevantItem  = Ext.get(children[jj]);
                         }
                    }

                    //fieldsetStyle.height        = relevantItem.getComputedHeight() + 50 + 'px';
                    if(typeof(relevantItem)!='undefined') {
                        fieldsetStyle.cssFloat      = relevantItem.getStyle('float');
                        fieldsetStyle.styleFloat    = relevantItem.getStyle('float');
                        fieldsetStyle.overflow      = relevantItem.getStyle('overflow');
                    }

                    width = Ext.get(currentSegment).getComputedWidth();
                    span = children[i].childNodes[0];
                    if( span ) {
                        //span.style.width = width - 10 + 'px';
                    }
                }
            }
        }
    }
}


function removeHeights() {
    var allFieldsets = Ext.query( '.debugFieldset' );
    for( j=0; j<allFieldsets.length;j++) {
        currentSegment = Ext.get(allFieldsets[j]);
        if( currentSegment.getStyle('height') ) {
            currentSegment.setStyle( 'height','' );
        }
    }
}


var debugInsertAjaxDiv =''
someFn = function(s1,s2) {
    document.getElementById(debugInsertAjaxDiv).innerHTML = s1.responseText;
}


function debugGetRequest(queryStringx,debugInsertAjaxDivTemp,params) {
    debugInsertAjaxDiv = debugInsertAjaxDivTemp;
    Ext.Ajax.request({
        url: '/artikel/zeigen/'+queryStringx,
        success: someFn,
        params: {'debugMain[explainQuery][query]': params},
        failure: function() { alert('urg')},
        method:'POST'
    });
}





function findPosX(obj) {
    var curleft = 0;
    if(obj.offsetParent)
        while(1)
        {
          curleft += obj.offsetLeft;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.x)
        curleft += obj.x;
    return curleft;
}

function findPosY(obj) {
    var curtop = 0;
    if(obj.offsetParent)
        while(1)
        {
          curtop += obj.offsetTop;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
}

function findPos(obj,isInside) {
    if( isInside ) {
        correctOffsetLeftPage = Math.round( (window.pageWidth-document.getElementById('wrapper').offsetWidth)/2);
        return {left:findPosX(obj)-correctOffsetLeftPage,top:findPosY(obj)};
    }
    return {left:findPosX(obj),top:findPosY(obj)};
}

var cacheTimesShown = false;

function showCacheTimes() {

    allFieldsets = Ext.query('.debugFieldset .recursionLevel_3');

    for(var i=0; i<allFieldsets.length;i++) {
        var overlay = document.createElement("DIV");
        overlay.style.position = 'absolute';
        overlay.style.left = findPosX(allFieldsets[i]) + 'px';
        overlay.style.top = findPosY(allFieldsets[i]) + 'px';
        overlay.style.width = Ext.get(allFieldsets[i]).getComputedWidth() +'px';
        overlay.style.height = Ext.get(allFieldsets[i]).getComputedHeight() +'px';
        overlay.style.zIndex = 7000;
        overlay.style.background    = 'green';
        overlay.style.minHeight = '80px';
        overlay.style.opacity   = 0.5;
        overlay.id              = 'cacheOverlay'+i;
        overlay.className       = 'cacheOverlay';

        var segmentname = allFieldsets[i].id.replace('debugSegment_','');

        lifetime = cacheObjectsJsonArray[segmentname].lifetime;

        if(lifetime<=60) {
            realLifetime = lifetime + ' secs';
        }

        if(lifetime>60 && lifetime <= 3600) {
            realLifetime = lifetime/60;
            realLifetime = realLifetime.toFixed(1) + ' mins';
        }

        if(lifetime>=3600 && lifetime < 86400) {
            realLifetime = lifetime/3600;
            realLifetime = realLifetime.toFixed(1) + ' hrs';
        }

        if(lifetime >= 86400) {
            realLifetime = lifetime/86400;
            realLifetime = realLifetime.toFixed(1) + ' days';
        }

        overlay.innerHTML = '<span style="font:50px verdana;font-weight:bold;opacity:1">' + realLifetime + '</span>';
        document.body.appendChild(overlay);
    }
    cacheTimesShown = true;
}

function hideCacheTimes() {
    cacheOverlay = Ext.query('.cacheOverlay');
    for(var i=0; i<cacheOverlay.length;i++) {
         Ext.get( cacheOverlay[i] ).remove();
    }
    cacheTimesShown = false;
}

function toggleCacheTimes() {
    if(cacheTimesShown) {
        hideCacheTimes();
    } else {
        showCacheTimes();
    }
}


function hideDebugFieldsets() {
    array = Ext.query('.debugFieldset');
    for(i=0;i<array.length;i++) {
        if( array[i].className.indexOf('tidy_error') == -1 ) {
            Ext.get(array[i]).addClass('unobtrusive');
        } else {
            Ext.get(array[i]).addClass('obtrusive');
        }
    }
    removeHeights();
    bgTools.setCookie( 'BG_DEBUG_MODE', 'design', 10, '/');

    Ext.get('site').setWidth(990);
    Ext.get('site_info_bar').setWidth(990);

}

function showDebugFieldsets() {
    array = Ext.query('.debugFieldset');
    for(i=0;i<array.length;i++) {
        Ext.get(array[i]).removeClass('unobtrusive');
    }
    adjustFieldsetStyles();
    bgTools.setCookie( 'BG_DEBUG_MODE', 'coder', 10, '/');

    Ext.get('site').setWidth(Ext.get('site').getWidth()-8);
    Ext.get('site_info_bar').setWidth(Ext.get('site_info_bar').getWidth()-8);
    Ext.get('maincontent').setWidth(Ext.get('maincontent').getWidth()-8);

}

if( typeof(json) != 'undefined' ) {
    setTimeout( 'fixDebugBug()',2000);
}

fixDebugBug = function() {
    Ext.get('site').setWidth(Ext.get('site').getWidth()-8);
    Ext.get('site_info_bar').setWidth(Ext.get('site_info_bar').getWidth()-8);
    Ext.get('site_bar').setWidth(Ext.get('site_bar').getWidth()-8);
    Ext.get('maincontent').setWidth(Ext.get('maincontent').getWidth()-8);
    Ext.get('content').setWidth(Ext.get('maincontent').getWidth()-8);
}


function toggleDebugFieldsets() {
     if( showAllDebugFieldsets ) {
          hideDebugFieldsets();
          Ext.get('debugFieldsetToggle').dom.innerHTML = 'DESIGN MODE';
     } else {
          showDebugFieldsets();
          Ext.get('debugFieldsetToggle').dom.innerHTML = 'DEBUG MODE';
     }
     showAllDebugFieldsets = !showAllDebugFieldsets;
}

function checkElementExists(checkMe) {
  var oElement, oId;
  if (document.getElementById
      && (oElement = document.getElementById(checkMe))
      && (oId = oElement.id)) {
      return true;
  } else {
    return false;
  }
}


function adjustAds() {
    if( document.getElementById('adDeployReal_sky') ) {
      /*document.getElementById('adDeployReal_sky').style.display = "block";*/
      document.getElementById('adDeployReal_sky').style.zIndex  = 999;
    }
    /* Sets background color of body    */
    if( typeof(ads_background_color) == 'string' ) {
      if( ads_background_color.charAt(0) != '#' ) {
        ads_background_color = '#' + ads_background_color;
      }
      document.getElementsByTagName('body')[0].background = '';
      document.getElementsByTagName('body')[0].style.backgroundColor = ads_background_color;

    }

    /* Sets background image of body    */
    if( typeof(ads_background_image) == 'string' ) {
      document.getElementsByTagName('body')[0].background = '';
      document.getElementsByTagName('body')[0].style.backgroundImage = 'url(' + ads_background_image + ')';
      document.getElementsByTagName('body')[0].style.backgroundPosition = '-1000px 0px';
    }

    if( typeof(ads_background_image_norepeat) == 'string' ) {
      document.getElementsByTagName('body')[0].style.backgroundRepeat = ads_background_image_norepeat;
    }




    /* BIGSIZE ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  */
    if( checkElementExists('adDeployReal_bigsize') ) {

      /* Sets Background to BIGSIZE   */
      if( typeof(ads_trackinglink_bigsize) == 'string' ) {
        document.getElementById('adDeployReal_bigsize').onclick = function(){ window.open(ads_trackinglink_bigsize) };
      }

      /* Sets Alignment to BIGSIZE    */
      if( typeof(ads_align_bigsize) == 'string' ) {
        document.getElementById('adDeployReal_bigsize').style.textAlign = ads_align_bigsize;
      }

    }

    /* SKYTAG ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  */
    if( checkElementExists('adDeployReal_sky') ) {

      /* Top margin to SKY    */
      if( typeof(ads_offset_top_sky) == 'string' ) {
        var set_absolute_sky = true;
        document.getElementById('adDeployPH_sky').style.top = ads_offset_top_sky;
      }

      /* Left margin to SKY    */

      if( typeof(ads_offset_left_sky) == 'string' ) {
        //////////document.getElementById('adDeployPH_sky').style.marginLeft  = ads_offset_left_sky;
        //////////document.getElementById('adDeployPH_sky').style.left        = '0px';
      }

      if( set_absolute_sky ) {
        document.getElementById('adDeployPH_sky').style.zIndex = 999;
        document.getElementById('adDeployPH_sky').style.position = 'absolute';
      }

      if( typeof(Prototype) == 'object' ) {

        var divs_a    = $$("#skytag div a");

        if( divs_a.length > 0) {
          //divs_a[0].style.display = 'none';
        }


      }

   }
}

var resizeSkyWorkerInterval;

var cnt = 0;

function resizeSky() {


    /* Resizes the banner DIV on the right side */
    if( window.innerHeight && window.scrollMaxY )  {
      pageWidth   = window.innerWidth;
      pageHeight  = window.innerHeight + window.scrollMaxY;
    }  else if( document.body.scrollHeight > document.body.offsetHeight ) {
      pageWidth   = document.body.offsetWidth;
      pageHeight  = document.body.scrollHeight;
    } else {
      pageWidth   = document.body.offsetWidth;
      pageHeight  = document.body.offsetHeight + document.body.offsetTop;
    }

    if( document.documentElement ) {
        pageHeight  = document.documentElement.clientHeight +  document.documentElement.scrollTop;
    }

    var set_absolute_sky = false;
    restWidth = pageWidth - 850;

    resizeSkyWorker(restWidth,pageHeight-50);

    //resizeSkyWorkerInterval = setInterval( 'resizeSkyWorker(' + restWidth + ',' + pageHeight + ');', 200 );
}

function resizeSkyWorker( restWidth, pageHeight ) {

    if( document.getElementById('adDeployReal_background') ) {

        if( window.innerHeight )  {
            pageWidth   = window.innerWidth;
            pageHeight  = window.clientHeight;
        }   else {
            pageWidth   = document.body.offsetWidth;
            pageHeight  = document.body.offsetHeight;
        }

        pageHeight  = document.body.scrollHeight;

        bback = document.getElementById('banner_background_adition');

        document.getElementById('adDeployReal_background').style.zIndex = -2;
        document.getElementById('adDeployReal_background').style.position = 'absolute';
        document.getElementById('adDeployReal_background').style.left = '0';
        document.getElementById('adDeployReal_background').style.top = '0';

        if( document.getElementById('banner_background_adition') ) {
            document.getElementById('banner_background_adition').style.width          = pageWidth-17 + 'px';
            document.getElementById('banner_background_adition').style.height         = pageHeight + 'px';

            if( typeof(ads_background_color) == 'string' ) {
                document.getElementById('banner_background_adition').style.backgroundColor = ads_background_color;
            } else {
                document.getElementById('banner_background_adition').style.backgroundColor = 'transparent';
            }
            document.getElementById('banner_background_adition').style.zIndex = -1;
        }


    }

    if ( typeof(showMouseMove) != 'undefined' ) {

        if (window.addEventListener) {
            window.addEventListener('DOMMouseScroll', wheel, false);
        }

        window.onmousewheel = document.onmousewheel = wheel;

        document.onmousemove = MouseMoved;
    }

    clearInterval(resizeSkyWorkerInterval);
}

// Mail Encryption

function CryptMailto()
{
    var n = 0;
    var r = "";
    var s = "mailto:"+document.forms[0].emailField.value;
    var e = document.forms[0].emailField.value;

    e = e.replace( /@/, " [at] ");
    e = e.replace( /\./g, " [dot] ");

    for( var i=0; i < s.length; i++ )
    {
        n = s.charCodeAt( i );
        if( n >= 8364 )
        {
            n = 128;
        }
        r += String.fromCharCode(n+1);
    }
    document.forms[0].cyptedEmailField.value = r;
    document.forms[0].HTMLCyptedEmailField.value = "<a href=\"javascript:linkTo_UnCryptMailto('"+ r +"');\">"+ e +"</a>";
}

function UnCryptMailto( s )
{
    var n = 0;
    var r = "";
    for( var i = 0; i < s.length; i++)
    {
        n = s.charCodeAt( i );
        if( n >= 8364 )
        {
            n = 128;
        }
        r += String.fromCharCode( n - 1 );
    }
    return r;
}

function linkTo_UnCryptMailto( s )
{
    location.href=UnCryptMailto( s );
}


// ---- neu

function getOffset(strID){
  var objStart = document.getElementById(strID);
  // Startwert
  var intOffsetLeft = objStart.offsetLeft;
  // Offset-Objekt
  var objOffset = {
    left: objStart.offsetLeft,
    top: objStart.offsetTop
  }

  // Elternelement mit Offset ermitteln
  var objHelpOffset = objStart.offsetParent;

  // Solange OffsetElemente existieren
  while(objHelpOffset){
    // Offsets addieren
    objOffset.left += objHelpOffset.offsetLeft;
    objOffset.top += objHelpOffset.offsetTop;
    // Nächstes OffsetElement
    objHelpOffset = objHelpOffset.offsetParent;
  }

  return objOffset;  // Offset-Objekt zurückgeben; Zugriff über .left und .top
}
//if( typeof(window.onload)=='undefined' ) {


	function adjustLeftRightHelper() {
	        var siteBeginLeft = getOffset( 'site' ).left;
	        var siteEndLeft   = 790 + siteBeginLeft;

	        var windowHeight = document.documentElement.scrollHeight || document.body.scrollHeight ;
	        var windowWidth =  windowWidth = document.documentElement.scrollWidth || document.body.scrollWidth - 19 ;

	        var helpLeft = document.getElementById('helpLeft_8591');
	        helpLeft.style.height=windowHeight+"px";
	        helpLeft.style.width= siteBeginLeft+"px";

	        var helpRight = document.getElementById("helpRight_8591");
	        helpRight.style.height=windowHeight+"px";
	        helpRight.style.width=  (windowWidth - siteEndLeft) + "px";
	        helpRight.style.left= siteEndLeft+"px";
	}


    window.onload= function () {
        var helpLeft = document.createElement("div");
		helpLeft.id="helpLeft_8591";
        helpLeft.style.backgroundColor='transparent';
        helpLeft.style.zIndex= "998";
        helpLeft.style.position="absolute";
        helpLeft.style.top="0";

        var helpRight = document.createElement("div");
		helpRight.id="helpRight_8591";
        helpRight.style.backgroundColor='transparent';
        helpRight.style.zIndex="998";
        helpRight.style.position="absolute";
        helpRight.style.top="0";

        if( document.getElementById('banner_background_adition') ) {
            helpRight.onclick = document.getElementById('banner_background_adition').onclick;
            helpLeft.onclick = document.getElementById('banner_background_adition').onclick;
        }



        document.getElementById('bgo').appendChild( helpLeft );
        document.getElementById('bgo').appendChild( helpRight);
		adjustLeftRightHelper();

		setInterval( "adjustLeftRightHelper();", 1000);

    };


//}

function number_format( number, decimals, dec_point, thousands_sep ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://getsprink.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +     bugfix by: Howard Yeend
    // +    revised by: Luke Smith (http://lucassmith.name)
    // +     bugfix by: Diogo Resende
    // +     bugfix by: Rival
    // %        note 1: For 1000.55 result with precision 1 in FF/Opera is 1,000.5, but in IE is 1,000.6
    // *     example 1: number_format(1234.56);
    // *     returns 1: '1,235'
    // *     example 2: number_format(1234.56, 2, ',', ' ');
    // *     returns 2: '1 234,56'
    // *     example 3: number_format(1234.5678, 2, '.', '');
    // *     returns 3: '1234.57'
    // *     example 4: number_format(67, 2, ',', '.');
    // *     returns 4: '67,00'
    // *     example 5: number_format(1000);
    // *     returns 5: '1,000'
    // *     example 6: number_format(67.311, 2);
    // *     returns 6: '67.31'

    var n = number, prec = decimals;
    n = !isFinite(+n) ? 0 : +n;
    prec = !isFinite(+prec) ? 0 : Math.abs(prec);
    var sep = (typeof thousands_sep == "undefined") ? ',' : thousands_sep;
    var dec = (typeof dec_point == "undefined") ? '.' : dec_point;

    var s = (prec > 0) ? n.toFixed(prec) : Math.round(n).toFixed(prec); //fix for IE parseFloat(0.55).toFixed(0) = 0;

    var abs = Math.abs(n).toFixed(prec);
    var _, i;

    if (abs >= 1000) {
        _ = abs.split(/\D/);
        i = _[0].length % 3 || 3;

        _[0] = s.slice(0,i + (n < 0)) +
              _[0].slice(i).replace(/(\d{3})/g, sep+'$1');

        s = _.join(dec);
    } else {
        s = s.replace('.', dec);
    }

    return s;
}

function date ( format, timestamp ) {
    // Format a local date/time
    //
    // version: 905.3122
    // discuss at: http://phpjs.org/functions/date
    // +   original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
    // +      parts by: Peter-Paul Koch (http://www.quirksmode.org/js/beat.html)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: MeEtc (http://yass.meetcweb.com)
    // +   improved by: Brad Touesnard
    // +   improved by: Tim Wiel
    // +   improved by: Bryan Elliott
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: David Randall
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   derived from: gettimeofday
    // %        note 1: Uses global: php_js to store the default timezone
    // *     example 1: date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400);
    // *     returns 1: '09:09:40 m is month'
    // *     example 2: date('F j, Y, g:i a', 1062462400);
    // *     returns 2: 'September 2, 2003, 2:26 am'
    // *     example 3: date('Y W o', 1062462400);
    // *     returns 3: '2003 36 2003'
    // *     example 4: x = date('Y m d', (new Date()).getTime()/1000); // 2009 01 09
    // *     example 4: (x+'').length == 10
    // *     returns 4: true
    var jsdate=(
        (typeof(timestamp) == 'undefined') ? new Date() : // Not provided
        (typeof(timestamp) == 'number') ? new Date(timestamp*1000) : // UNIX timestamp
        new Date(timestamp) // Javascript Date()
    ); // , tal=[]
    var pad = function(n, c){
        if( (n = n + "").length < c ) {
            return new Array(++c - n.length).join("0") + n;
        } else {
            return n;
        }
    };
    var _dst = function (t) {
        // Calculate Daylight Saving Time (derived from gettimeofday() code)
        var dst=0;
        var jan1 = new Date(t.getFullYear(), 0, 1, 0, 0, 0, 0);  // jan 1st
        var june1 = new Date(t.getFullYear(), 6, 1, 0, 0, 0, 0); // june 1st
        var temp = jan1.toUTCString();
        var jan2 = new Date(temp.slice(0, temp.lastIndexOf(' ')-1));
        temp = june1.toUTCString();
        var june2 = new Date(temp.slice(0, temp.lastIndexOf(' ')-1));
        var std_time_offset = (jan1 - jan2) / (1000 * 60 * 60);
        var daylight_time_offset = (june1 - june2) / (1000 * 60 * 60);

        if (std_time_offset === daylight_time_offset) {
            dst = 0; // daylight savings time is NOT observed
        }
        else {
            // positive is southern, negative is northern hemisphere
            var hemisphere = std_time_offset - daylight_time_offset;
            if (hemisphere >= 0) {
                std_time_offset = daylight_time_offset;
            }
            dst = 1; // daylight savings time is observed
        }
        return dst;
    };
    var ret = '';
    var txt_weekdays = ["Sunday","Monday","Tuesday","Wednesday",
        "Thursday","Friday","Saturday"];
    var txt_ordin = {1:"st",2:"nd",3:"rd",21:"st",22:"nd",23:"rd",31:"st"};
    var txt_months =  ["", "January", "February", "March", "April",
        "May", "June", "July", "August", "September", "October", "November",
        "December"];

    var f = {
        // Day
            d: function(){
                return pad(f.j(), 2);
            },
            D: function(){
                var t = f.l();
                return t.substr(0,3);
            },
            j: function(){
                return jsdate.getDate();
            },
            l: function(){
                return txt_weekdays[f.w()];
            },
            N: function(){
                return f.w() + 1;
            },
            S: function(){
                return txt_ordin[f.j()] ? txt_ordin[f.j()] : 'th';
            },
            w: function(){
                return jsdate.getDay();
            },
            z: function(){
                return (jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5 >> 0;
            },

        // Week
            W: function(){
                var a = f.z(), b = 364 + f.L() - a;
                var nd2, nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;

                if(b <= 2 && ((jsdate.getDay() || 7) - 1) <= 2 - b){
                    return 1;
                }
                if(a <= 2 && nd >= 4 && a >= (6 - nd)){
                    nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
                    return date("W", Math.round(nd2.getTime()/1000));
                }
                return (1 + (nd <= 3 ? ((a + nd) / 7) : (a - (7 - nd)) / 7) >> 0);
            },

        // Month
            F: function(){
                return txt_months[f.n()];
            },
            m: function(){
                return pad(f.n(), 2);
            },
            M: function(){
                var t = f.F();
                return t.substr(0,3);
            },
            n: function(){
                return jsdate.getMonth() + 1;
            },
            t: function(){
                var n;
                if( (n = jsdate.getMonth() + 1) == 2 ){
                    return 28 + f.L();
                }
                if( n & 1 && n < 8 || !(n & 1) && n > 7 ){
                    return 31;
                }
                return 30;
            },

        // Year
            L: function(){
                var y = f.Y();
                return (!(y & 3) && (y % 1e2 || !(y % 4e2))) ? 1 : 0;
            },
            o: function(){
                if (f.n() === 12 && f.W() === 1) {
                    return jsdate.getFullYear()+1;
                }
                if (f.n() === 1 && f.W() >= 52) {
                    return jsdate.getFullYear()-1;
                }
                return jsdate.getFullYear();
            },
            Y: function(){
                return jsdate.getFullYear();
            },
            y: function(){
                return (jsdate.getFullYear() + "").slice(2);
            },

        // Time
            a: function(){
                return jsdate.getHours() > 11 ? "pm" : "am";
            },
            A: function(){
                return f.a().toUpperCase();
            },
            B: function(){
                // peter paul koch:
                var off = (jsdate.getTimezoneOffset() + 60)*60;
                var theSeconds = (jsdate.getHours() * 3600) +
                                 (jsdate.getMinutes() * 60) +
                                  jsdate.getSeconds() + off;
                var beat = Math.floor(theSeconds/86.4);
                if (beat > 1000) {
                    beat -= 1000;
                }
                if (beat < 0) {
                    beat += 1000;
                }
                if ((String(beat)).length == 1) {
                    beat = "00"+beat;
                }
                if ((String(beat)).length == 2) {
                    beat = "0"+beat;
                }
                return beat;
            },
            g: function(){
                return jsdate.getHours() % 12 || 12;
            },
            G: function(){
                return jsdate.getHours();
            },
            h: function(){
                return pad(f.g(), 2);
            },
            H: function(){
                return pad(jsdate.getHours(), 2);
            },
            i: function(){
                return pad(jsdate.getMinutes(), 2);
            },
            s: function(){
                return pad(jsdate.getSeconds(), 2);
            },
            u: function(){
                return pad(jsdate.getMilliseconds()*1000, 6);
            },

        // Timezone
            e: function () {
/*                var abbr='', i=0;
                if (this.php_js && this.php_js.default_timezone) {
                    return this.php_js.default_timezone;
                }
                if (!tal.length) {
                    tal = timezone_abbreviations_list();
                }
                for (abbr in tal) {
                    for (i=0; i < tal[abbr].length; i++) {
                        if (tal[abbr][i].offset === -jsdate.getTimezoneOffset()*60) {
                            return tal[abbr][i].timezone_id;
                        }
                    }
                }
*/
                return 'UTC';
            },
            I: function(){
                return _dst(jsdate);
            },
            O: function(){
               var t = pad(Math.abs(jsdate.getTimezoneOffset()/60*100), 4);
               t = (jsdate.getTimezoneOffset() > 0) ? "-"+t : "+"+t;
               return t;
            },
            P: function(){
                var O = f.O();
                return (O.substr(0, 3) + ":" + O.substr(3, 2));
            },
            T: function () {
/*                var abbr='', i=0;
                if (!tal.length) {
                    tal = timezone_abbreviations_list();
                }
                if (this.php_js && this.php_js.default_timezone) {
                    for (abbr in tal) {
                        for (i=0; i < tal[abbr].length; i++) {
                            if (tal[abbr][i].timezone_id === this.php_js.default_timezone) {
                                return abbr.toUpperCase();
                            }
                        }
                    }
                }
                for (abbr in tal) {
                    for (i=0; i < tal[abbr].length; i++) {
                        if (tal[abbr][i].offset === -jsdate.getTimezoneOffset()*60) {
                            return abbr.toUpperCase();
                        }
                    }
                }
*/
                return 'UTC';
            },
            Z: function(){
               return -jsdate.getTimezoneOffset()*60;
            },

        // Full Date/Time
            c: function(){
                return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P();
            },
            r: function(){
                return f.D()+', '+f.d()+' '+f.M()+' '+f.Y()+' '+f.H()+':'+f.i()+':'+f.s()+' '+f.O();
            },
            U: function(){
                return Math.round(jsdate.getTime()/1000);
            }
    };

    return format.replace(/[\\]?([a-zA-Z])/g, function(t, s){
        if( t!=s ){
            // escaped
            ret = s;
        } else if( f[s] ){
            // a date function exists
            ret = f[s]();
        } else{
            // nothing special
            ret = s;
        }
        return ret;
    });
}



function updateHeadQuotes(event, data) {
   // console.log(event,data);
    var v;
    if(data.fields & EQuoteFields.LAST_LAST) {
        v  = EQuoteFields.LAST_LAST;
        v2 = EQuoteFields.LAST_CHANGE_PERCENT;
        prev_change = EQuoteFields.LAST_PREV_CHANGE;
    } else {
        v  = EQuoteFields.BID_LAST;
        v2 = EQuoteFields.BID_CHANGE_PERCENT;
        prev_change = EQuoteFields.BID_PREV_CHANGE;
    }
    if(data.fields & v) {
        //console.log(data);
        digits = data.exchangeId==27 ? 4 : 2;
        var e = document.getElementById('top_quote_'+data.instrumentId+'_'+data.exchangeId);
        e.innerHTML = number_format( data.values[v], digits, ',', '.' );

        if(!data.first) {
            if( data.values[prev_change] >= 0 ) {
                e.style.backgroundColor = '#339900';
                e.style.color = '#fff';
            } else {
                e.style.backgroundColor = '#dd0000';
                e.style.color = '#fff';
            }
            setTimeout(function() { e.style.backgroundColor = 'transparent'; e.style.color ='#ffffff';}, 500);
        }
        
        if(data.fields & v2) {
            e2 = document.getElementById('top_change_'+data.instrumentId+'_'+data.exchangeId);
            e2.innerHTML = number_format( data.values[v2], 2, ',', '.' ) + '%';
            if(data.values[v2]>=0) {
                e2.className = 'up';
            } else {
                e2.className = 'down';
            }
        }
    }
}




function quoteUpdater( event, data, params ) {
    
    var icon = {    'standard' :'/themes/default/media/content/icon_realtime.gif',
                    'push' : '/themes/default/media/content/icon_push.png'
               };
           
    var separator   = '_';
    
    
    if( typeof params.debug != 'undefined' ) {
        console.log( event, data, params );
    }
    
    
    var rand = Math.floor(Math.random() * 4);  
    
    if(data.fields & EQuoteFields.LAST_LAST) {
        quote           = EQuoteFields.LAST_LAST;
        quoteChange     = EQuoteFields.LAST_CHANGE;
        percentChange   = EQuoteFields.LAST_CHANGE_PERCENT;
        prevChange      = EQuoteFields.LAST_PREV_CHANGE;
        quoteChangeTime = EQuoteFields.LAST_TIME;  
    } else {
        quote           = EQuoteFields.BID_LAST;
        quoteChange     = EQuoteFields.BID_CHANGE;
        percentChange   = EQuoteFields.BID_CHANGE_PERCENT;
        prevChange      = EQuoteFields.BID_PREV_CHANGE;
        quoteChangeTime = EQuoteFields.BID_TIME; 
    }
    
    if(data.fields & quote) {
        
        digits = 2;
        if( data.exchangeId==27 || data.exchangeId==5 || data.exchangeId==11 ) { digits = 4; }
        if( data.exchangeId==22 && data.instrumentId>133964 && data.instrumentId<133962 ) { digits = 3; }

        /* CHANGE QUOTES ~~~~~~~~~~~~~~~~~~ */
        curField = 'quote';
        element = document.getElementById( [ params.prefix, curField, data.instrumentId, data.exchangeId ].join(separator) );
        if( element ) {
            element.innerHTML = number_format( data.values[quote], digits, ',', '.' );
        }
        
        /* CHANGE CLASSES ~~~~~~~~~~~~~~~~~~ */
        if(!data.first) {
            if( data.values[prevChange] >= 0 ) {
                jQuery(element).removeClass('quote_standard').addClass('quote_tendency_up'); 
            } else {
                jQuery(element).removeClass('quote_standard').addClass('quote_tendency_down');
            }
            setTimeout('resetPushElement("'+element.id+'")', 500);
        } else {
            jQuery(element).addClass('quote_standard');
        }
        
        /* CHANGE QUOTE CHANGES~~~~~~~~~~~~ */
        
        curField = 'change';
        element = document.getElementById( [ params.prefix, curField, data.instrumentId, data.exchangeId ].join(separator) );
        if( element ) {
            element.innerHTML = number_format( data.values[quoteChange], digits, ',', '.' );
            if( data.values[percentChange] >= 0 ) {
                jQuery(element).removeClass('quote_standard');
                jQuery(element).removeClass('down');
                jQuery(element).removeClass('quote_tendency_down'); 
                jQuery(element).addClass('quote_tendency_up'); 
            } else {
                jQuery(element).removeClass('quote_standard');
                jQuery(element).removeClass('up');
                jQuery(element).removeClass('quote_tendency_up'); 
                jQuery(element).addClass('quote_tendency_down');
            }
        }

        
        /* CHANGE PUSH ICONS ~~~~~~~~~~~~~~ */
        curField = 'icon';
        element = document.getElementById( [ params.prefix, curField, data.instrumentId, data.exchangeId ].join(separator) );
        if( element ) {
            setTimeout( "jQuery('#"+element.id+"').attr('src','"+icon.standard+"')", 400+200*rand);
            setTimeout( "jQuery('#"+element.id+"').attr('src','"+icon.push+"')", 200*rand);
            //setTimeout( "function() { jQuery('#"+element.id+'").attr("src","'+icon.realtime+'")}', 400);
        }
          
        /* CHANGE PERCENTAGE ~~~~~~~~~~~~~~~ */
        curField = 'percent';
        element = document.getElementById( [ params.prefix, curField, data.instrumentId, data.exchangeId ].join(separator) );
        
        if(data.fields & percentChange && element) {

            element.innerHTML = number_format( data.values[percentChange], 2, ',', '.' ) + '%';
            
            if(data.values[percentChange]>=0) {  
                jQuery(element).removeClass('down').addClass('up');
            } else {
                jQuery(element).removeClass('up').addClass('down');
            }
        }
        
        /* CHANGE TIME ~~~~~~~~~~~~~~~ */
        curField = 'time';
        element = document.getElementById( [ params.prefix, curField, data.instrumentId, data.exchangeId ].join(separator) );
        
        if(data.fields & quoteChangeTime && element) {
            element.innerHTML = strftime(data.values[quoteChangeTime], '%H:%M:%S');
        }
    }
    
}

function resetPushElement(elementId) { 
    if(jQuery('#'+elementId)) {
        jQuery('#'+elementId).removeClass('quote_tendency_up').removeClass('quote_tendency_down').addClass('quote_standard');
    } else {
        console.log( elementId );
    }
}