function regular(string) {
    if (!string) return "";
    var Chars = "0123456789";
    var news = "";

    for (var i = 0; i < string.length; i++) {
       if (Chars.indexOf(string.charAt(i)) == -1) {
        void(null);
       } else {
        news=news+string.charAt(i);
       }
    }
    return news;
}
function numberFormat(el){
    number = el.value.replace(/\s/gi,"");
    if (number.length > 3) {
        var mod = number.length%3;
        var output = (mod > 0 ? (number.substring(0,mod)) : "");
        for (i=0 ; i < Math.floor(number.length/3) ; i++) {
            if ((mod ==0) && (i ==0))
                output+= number.substring(mod+3*i,mod+3*i+3);
            else
                output+= " " + number.substring(mod+3*i,mod+3*i+3);
        }
        el.value = output;
    }
    else el.value = number;
}


new Image().src = "/images/indicator.gif";

function showProgressIndicator(id){
  if ( el = $(id)){ 
    el.innerHTML = '<img src="/images/indicator.gif"> Подождите, идет обращение к серверу';
  }
}

function hideProgressIndicator(id){
  if ( el = $(id)){ 
    el.innerHTML = '';
  }
}  

var prev_invite = null;
function toggleInviteCite(id){
      if ($(prev_invite) && (prev_invite != id))  $(prev_invite).style.display = "none";
      prev_invite = id;
      if ($(id)){
          if ( $(id).style.display == "none" ){
              $(id).style.display = "block";
          } else {
              $(id).style.display = "none";
          }    
      }     
}


function alignBlockHeights(id_ptr_1, id_ptr_2){
    if(!$(id_ptr_1) || !$(id_ptr_2))
        return;
    var h1, h2, dest, h;
    h1 = $(id_ptr_1).getHeight();
    h2 = $(id_ptr_2).getHeight();
    h = h2;
    dest = id_ptr_1;
    if(h1 > h2){
        h = h1;
        dest = id_ptr_2;
    }
    $(dest).setStyle({
        'height': h + 'px'
        });
}


function formActionAppend(form_id, append)
{
    var f, action;
    if(!$(form_id))
        return;
    f = $(form_id);
    action = f['action'];
    action += append;
    f['action'] = action;
}


function formGetSelectedValue(id)
{
    var c, res, el, e, geo, val, type = null;
    el = $$('#' + id + ' option');
    if(!el)
        return null;
    for(var i = 0 ; i < el.length; i++ ){
        if(!$(el[i]).selected)
            continue;
        e = $(el[i]);
        if(!e['value'])
            break;
        return e['value'];
    }
    return '';
}

var TDom = {
  
  ccApply: function(className, cb){
    if(!cb) return false;
    var i,elements=this.cc(className);
    if(elements){
      for(i=0;i<elements.length;i++)
        cb(elements[i]);
      return true;
    }
    return false;
  },
  /* Returns an array of elements by class*/
  cc: function (className){
    return TDom.ba('class', className);
  },
  
  /* Returns as array of elements by attribute name and attribute value*/
  ba: function(n,v){
    var l, r, i, c, d=document, len=0;
    l=d.getElementsByTagName('*');
    len=l.length;
    r = new Array();
    for(i=0;i<len;i++){
      c=$(l[i]);
      if(c&&c.getAttribute(n)&&c.getAttribute(n)==v)
        r.push(c);
    }
    return r;
  }
}

var CommonUtils = {
  
  
  isOnMobileDevice: function(){
    if(screen.width < 500 
      || navigator.userAgent.match(/Android/i) 
      || navigator.userAgent.match(/webOS/i)
      || navigator.userAgent.match(/iPhone/i)
      || navigator.userAgent.match(/iPod/i)
    ){
      return true;
    }
    return false;
  },
  
  redirectToFullVersion : function(){
    var cookie_name = 'device_tested_cookie2';
    var expires = new Date();
    Tourout.setCookie(cookie_name, 2, {expires : -1, path: '/'});
    window.location = '/';
    return true;
  },
   
  redirectToMobileIfNeed: function(){
    // Tourout.setCookie('device_tested_cookie', null, new Date());
    var cookie_name = 'device_tested_cookie2';
    if(CommonUtils.isOnMobileDevice()){
      is_tested = Tourout.getCookie(cookie_name);
      var expires = new Date();
      var time = expires.getTime() + (60 * 60 * 24 * 7 * 1000);
      expires.setTime(time);
      
      if(!is_tested){
        var ok = confirm("Вы зашли на сайт с мобильного устройства. Перейти на мобильную версию сайта?");
        if(ok){
          is_tested = 1;
          Tourout.setCookie(cookie_name, is_tested, {expires : expires, path: '/'});
          window.location = '/m/';
        }else{
          is_tested = 2;
          Tourout.setCookie(cookie_name, is_tested, {expires : expires, path: '/'});
        }
      }else{
        if(is_tested == 1){
          window.location = '/m/';
        }else if(is_tested == 2){
          // Не редиректим на мобильную версию
        }
      }
    }
  },
  
  ltrim : function(str){
    var ptrn = /\s*((\S+\s*)*)/;
    return str.replace(ptrn, "$1");
  },
  rtrim :function (str){
    var ptrn = /((\s*\S+)*)\s*/;
    return str.replace(ptrn, "$1");
  },
  trim : function (str){
    return this.ltrim(this.rtrim(str));
  },

    
    getViewportPositions: function () {
        var viewportWidth, viewportHeight;
        if (window.innerHeight && window.scrollMaxY) {
            viewportWidth = document.body.scrollWidth;
            viewportHeight = window.innerHeight + window.scrollMaxY;
        } else if (document.body.scrollHeight > document.body.offsetHeight) {
            // all but explorer mac
            viewportWidth = document.body.scrollWidth;
            viewportHeight = document.body.scrollHeight;
        } else {
            // explorer mac...would also work in explorer 6 strict, mozilla and safari
            viewportWidth = document.body.offsetWidth;
            viewportHeight = document.body.offsetHeight;
        };
        
        return {width: viewportWidth, height: viewportHeight};
    },
    
    getViewportOffsets: function () {
        var horizontalOffset, verticalOffset;
        if(self.pageYOffset){
            horizontalOffset = self.pageXOffset;
            verticalOffset = self.pageYOffset;
        }else if (document.documentElement && document.documentElement.scrollTop) {
            // Explorer 6 Strict
            horizontalOffset = document.documentElement.scrollLeft;
            verticalOffset = document.documentElement.scrollTop;
        }else if (document.body){
            // all other Explorers
            horizontalOffset = document.body.scrollLeft;
            verticalOffset = document.body.scrollTop;
        };
        return {horizontal: horizontalOffset, vertical : verticalOffset};
    },
    
    getSelElementValue: function(element)
    {
        var el = $(element);
        var nodes = $(element).childNodes;
        var e;
        for(var i = 0; i < nodes.length; i++){
            e = $(nodes[i]);
            if(e['selected']) return e['value'];
        }
        return null;
    },
    
    showProgressIndicator: function(id, message)
    {
        var el, msg;
        el = $(id);
        if(!el)
            return null;
        if(!message)
            message = '&nbsp;';
        msg = '<b>' + message + '</b>';
        el.innerHTML='<table></tr><td style="text-align: center;"><img src="/images/indicator.gif"></td></tr><tr><td style="text-align: center;">' + msg + '</td></tr></table>';
        return el;
    },

    hideProgressIndicator: function(id)
    {
        var el = $(id);
        if(!el)
            return null;
        el.innerHTML='';
        return el;
    },

    Position : {
        showProgressIndicator: function(id, message, push_away_id, indent_left, indent_top){
            var el, offset;
            el = CommonUtils.showProgressIndicator(id, message);
            if(!el)
                return null;
            if(!$(push_away_id))
                return null;
            offset = Position.positionedOffset($(push_away_id));
            el.style.left = offset[0] + parseInt(indent_left) + 'px';
            el.style.top = offset[1] + parseInt(indent_top) + 'px';
            return el;
        }
    },

    /* Взяли с рестейта. ( original : string regular(string) ) */
    removeStringChars: function(string){
        if (!string) return "";
        var Chars = "0123456789.,/\-";
        var news = "";

        for (var i = 0; i < string.length; i++) {
            if (Chars.indexOf(string.charAt(i)) == -1) {
                void(null);
            } else {
                news=news+string.charAt(i);
            }
        }
        return news;
    },

    /* Взяли с рестейта */
    numberFormat: function(element){
        number = element.value.replace(/\s/gi,"");
        if (number.length > 3) {
            var mod = number.length%3;
            var output = (mod > 0 ? (number.substring(0,mod)) : "");
            for (i=0 ; i < Math.floor(number.length/3) ; i++) {
                if ((mod ==0) && (i ==0))
                    output+= number.substring(mod+3*i,mod+3*i+3);
                else
                    output+= " " + number.substring(mod+3*i,mod+3*i+3);
            }
            element.value = output;
        }
        else element.value = number;
    },
    phoneNumberFormat: function(element){
        var number,val,val2,first_char,chars,i,prev,buff,delim = ' ';
//        number = element.value.replace(/[\s]+/gi,'');
        number = element.value.replace(/[^0-9\-\+\s]+/gi, '');
        if (number.length > 3) {
            var mod = number.length%3;
            var output = (mod > 0 ? (number.substring(0,mod)) : "");
            for (i=0 ; i < Math.floor(number.length/3) ; i++) {
                output+= number.substring(mod+3*i,mod+3*i+3);
            }
            val = output;
        }else{
            val = number;
        }
        if(val.length > 1){
            first_char = val.substring(0,1);
            val2 = val.substring(1);
            if(val2){
                val2 = val2.replace(/[\+]/ig, '');
            }
            val = first_char + val2;
            chars = val.split('');
            len = chars.length;
            prev = buff = '';
            avail_chars = ['-',' '];
            avail_chars_counts = [];
            for(i=0;i<len;i++){
                if(i > 0) prev = chars[i-1];
                if(this.inArray(chars[i], avail_chars) && this.inArray(prev, avail_chars))
                    continue;
                buff += chars[i];
            }
            val = buff;
        }
        element.value = val;
    },
    
    inArray: function(needle,haystack){
        var f=false,i,len;
        if(!haystack) return f;
        len = haystack.length;
        for(i=0;i<len;i++){
            if(needle==haystack[i]){
                f=true;
                break;
            }
        }
        return f;
    }
    
    
}

var EventHistoryManager = {
    
    View:{

        getLastHistoryOffset: function () {
            var val, lhi = $('last_history_item_offset');
            val = lhi.innerHTML;
            return val;
        },

        getLastHistoryItemValue: function (){
            var val, lhi = $('last_history_item').innerHTML;
            if(!lhi)
                return null;
            val = lhi.innerHTML;
            return val;
        },

        getLastHistoryItemValue: function (){
            var val, lhi = EvenHistoryManager.View.getLastHistoryItem();
        },

        filterHistoryItemsList: function (type, update_tag_id, global_event_type, checkbox_el, preload_element_id){
            $(update_tag_id).update('');
            var url = '/feed/setEventsVisibility';
            var this_object = this;
            new Ajax.Request(url, {
                'method' : 'POST',
                'parameters' : {
                    event_type: type
                },
                onLoading: function(response){
                    if(preload_element_id){
                        CommonUtils.showProgressIndicator(preload_element_id);
                    }
                },
                onSuccess: function (response){
                    CommonUtils.hideProgressIndicator(preload_element_id);
                    if(response){
                        $(update_tag_id).update('');
                        EventHistoryManager.View.initParameterTags(update_tag_id, -10);
                        EventHistoryManager.View.updateHistoryItems(10, 0, global_event_type, update_tag_id, 1);
                    }
                }
            });
        },

        updateHistoryItems: function(limit, offset, type, update_tag_id, direction){
            return EventHistoryManager.Request._updateHistoryItems(limit, offset, type, update_tag_id, direction);
        },

        appendHistoryItems: function (items, update_tag_id, last_offset){
            var html , el, h = $(update_tag_id);
            $('last_history_item_offset').remove();
            for(var i = 0; i < items.length; i++ ){
                el = document.createElement('li');
                el.innerHTML = EventHistoryManager.View.buildItemHtml(items[i].title, items[i].target_user_image, items[i].message, items[i].date_diff);
                el.style.display = 'none';
                h.appendChild(el);
                el = $(el);
                el['id'] = 'hi_' + items[i].id;
                Effect.Appear(el);
            }
            EventHistoryManager.View.initParameterTags(update_tag_id, last_offset);
        },

        buildItemHtml: function (title, target_user_image, message, date_diff)
        {
            var result = '', td1 = '', td2 = '';
            td1 = '<span><img src="' + target_user_image + '" width="50" class="avatara"/></span>';
            td2 = '<span><b style="margin:0; padding:0;">' + title + '</b><br/><span>' + message + '</span><br/><span>' + date_diff + '</span></span>';

            td1 = '<td width="50px">' + td1 + '</td>';
            td2 = '<td>' + td2 + '</td>';

            result = '<tr>' + td1 + td2 + '</tr>';
            result = '<table>' + result + '</table>';
            result = '<div class="user">' + result + '</div>';
            return result;
        },

        initParameterTags: function (update_tag_id, last_offset) {
            var h = $(update_tag_id);
            var el = document.createElement('li');
            el.innerHTML = last_offset;
            h.appendChild(el);
            el = $(el);
            el['id'] = 'last_history_item_offset';
            el.setStyle({'display':'none'});
        }
    },

    Request: {

        _updateHistoryItems: function (limit, offset, type, update_tag_id, direction){
            var url, last_offset = EventHistoryManager.View.getLastHistoryOffset();
            limit = parseInt(limit);
            offset = parseInt(offset);
            if(!direction)
                direction = 1;
            if(!last_offset)
                return null;

            last_offset = parseInt(last_offset);

            if(direction >= 1)
                last_offset = last_offset + limit;
            else{
                if(last_offset >= limit )
                    last_offset -= limit;
                else
                    last_offset = 0;
            }
            url = '/feed/retrieveItems';
            new Ajax.Request(url,{
                parameters: {
                    'count' : limit,
                    'offset': last_offset,
                    'type' : type,
                    'output_format' : 'json'
                },
                method: 'POST',
                type: 'json',
                onSuccess: function(response){
                    if(!response || !response.responseText)
                        return false;
                    var result = eval('(' + response.responseText + ')');
                    if(result)
                        EventHistoryManager.View.appendHistoryItems(result, update_tag_id, last_offset);
                }
            });
        }
    }
}




var Tourout = {
  
  /* Tourout.Request Main Object */
  Request: {
    _params: [],
    setParameter: function(key, value){
      Tourout.Request._params[key] = value;
    },
    initialize: function (){
    },
    getModule: function(){
      return Tourout.Request.getParameter('module', null);
    },
    getAction: function(){
      return Tourout.Request.getParameter('action', null);
    },
    getParameter: function(key, def){
      console.info(Tourout.Request._params);
      if(Tourout.Request._params[key])
        return Tourout.Request._params[key];
      return def;
    }
  },
  
  Menu:{
    mainSubmenuState: 0,
    toggleMainUserSubmenu: function (menu_id){
      var menu = $(menu_id);
      if(!menu) return false;
      if(!this.mainSubmenuState){
        this.mainUserSubmenuState = 0;
        $(menu_id).show();
        $('my_menu_show_button').hide();
      }else{
        this.mainSubmenuState = 1;
        $(menu_id).hide();
        $('my_menu_show_button').show();
      }
      new Ajax.Request('/frontend_dev.php/users/toggleMainSubmenu', {});
    },
    
    resetMainUserSubmenu2: function(menu_id){
      Tourout.set_cookie('myMainSubmenu', 1, new Date())
    },
    
    toggleMainUserSubmenu2: function(menu_id){
      var menu = $(menu_id);
      if(menu){
        var date = new Date();
        var expires = new Date();
        expires.setTime(date.getTime() + (60 * 60 * 24 * 14) );
        Tourout.set_cookie('myMainSubmenu', 1, expires);
        $('my_menu_show_button').hide();
        menu.show();
      }
    }
  },
  
  /* Tourout.Window Main object */
  Window:{
    
    
    
    
    getHeaderElement: function (){},
    getRightMenuElement: function (){},
    
    
    /* Tourout.Window.Scroller object */
    Scroller:{

      _headerSourceStyle: null,

      _menuSourceStyle: null,

      _scrollHandlers: new Array(),

      addScrollHandler: function(h){
        Tourout.Window.Scroller._scrollHandlers.push(h);
      },

      clearScrolHandlers: function(){
        Tourout.Window.Scroller._scrollHandlers = [];
      },

      enableAllScrollingStyles: function (header, menu, top_tags, cbody, auto_toptags, header_width_snap){
        if(menu){
          Tourout.Window.Scroller.applyMenuStylesForMove(menu);
        }
        if(header){
          header.setStyle({'top' : '0px'});
          Tourout.Window.Scroller.applyHeaderStylesForMove(header, header_width_snap);
        }
        if(top_tags){
          Tourout.Window.Scroller.applyTopTagsStylesForMove(top_tags)
        }else if(!auto_toptags){
          var m = 0;
          if(header)
            m += parseInt(header.getStyle('height'));
          if(menu)
            m += parseInt(menu.getStyle('height')) - 100;
          m += 'px';
          if(top_tags)
            top_tags.setStyle({'margin-top' : m});
        }
        if(cbody){
          var min_height = 0;
          if(top_tags)
            min_height += parseInt(top_tags.getStyle('height'));
          if(menu)
            min_height += parseInt(menu.getStyle('height'));
          if(header)
            min_height += parseInt(header.getStyle('height'));
          min_height += 'px';
          cbody.setStyle({'margin-top' : '90px', 'min-height' : min_height});
          if(menu){
            if($('fs'))
              cbody.setStyle({'margin-top': '115px'});
            else
              cbody.setStyle({'margin-top': '90px'});
          }
        }
        if($('fs')){
          search=$('fs');
          search.setStyle({'position':'fixed', 'top': '100px'});
//          cbody.setStyle({'padding-top' : '20px'});
        }
      }, 

      disableAllScrollingStyles: function (header, menu, top_tags, cbody, auto_toptags){
        if(header){
          Tourout.Window.Scroller.restoreHeaderElementForMove(header);
        }
        if(auto_toptags && top_tags)
          Tourout.Window.Scroller.restoreTopTagsStylesForMove(top_tags);
        else if(!auto_toptags){
          top_tags.setStyle({'margin-top' : '0px'});
        }
        if(menu)
          Tourout.Window.Scroller.restoreMenuElementForMove(menu);
        if(cbody){
          cbody.setStyle({'margin-top': '0px'});
        }
      },

      applyScrollHandlers: function (){
        var i, h;
        for(i = 0; i < Tourout.Window.Scroller._scrollHandlers.length; i++){
          h = Tourout.Window.Scroller._scrollHandlers[i];
          h();
        }
      },

      // sideBlueBlock, lheader
      waitForHeaderMove: function(auto_toptags, apply_all){
        var cbody,header,menu,top_tags,header_hlim,menu_offset_limit,scroll_handler;
        header = $('lheader');
        
        menu = $('sideBlueBlock');
        top_tags = $('top_tags');
        cbody = $('cbody');
        header_hlim = 0;

        Tourout.Window.Scroller.addScrollHandler(function(){
  //        var vpPos = CommonUtils.getViewportPositions();
  //        var vpOff = CommonUtils.getViewportOffsets() ;
        });
        
        Tourout.Window.Scroller.addScrollHandler(function(){
          var pos = CommonUtils.getViewportPositions();
          var offsets = CommonUtils.getViewportOffsets();
        });

        if(apply_all){
          Tourout.Window.Scroller.enableAllScrollingStyles(header, menu, top_tags, cbody, false, header.getStyle('width'));
        }else{
          
        }
        menu.setStyle({'top' : '120px'});
        menu.setStyle({'z-index' : '50'});
        Event.observe(document, 'scroll', function () {Tourout.Window.Scroller.applyScrollHandlers();});
      },

      disableAllOnPageBottom: function () {

      },

      restoreTopTagsStylesForMove: function(el){
        el.setStyle({'position' : 'relative', 'top' : '0'});
      },

      applyTopTagsStylesForMove: function (el){
        var blueBlockHeight = $('sideBlueBlock').getHeight();
        var offset = 123;
        if($('fs')){
          offset = 113;
        }
        el.setStyle({'position' : 'fixed', 'top' : blueBlockHeight + offset + 'px'});
      },

      restoreMenuElementForMove: function(el){
        el.setStyle({'position' : 'relative'});
        el.setStyle({'top' : '0'});
        return true;
      },

      restoreHeaderElementForMove: function(el){
        el.setStyle({'position' : 'relative'});
        el.setStyle({'top' : '0px'});
        el.setStyle({'border-bottom' : 'none'});
        el.setStyle({'padding-top' : '0px'});
        $('clogo').setStyle({'margin-top' : '-6px'});
        return true;
      },

      applyHeaderStylesForMove: function (el, width_snap){
        if(null == Tourout.Window.Scroller._headerSourceStyle){
          Tourout.Window.Scroller._headerSrc = Object.clone(el);
          el = Tourout.Window.Scroller._headerSrc;
        }
        el.setStyle({
  //        'border-bottom' : '1px solid rgb(200,200,200)', 
          'z-index' : '50', 
          'position' : 'fixed' , 
          'padding-top' : '15px',
          'top' : '0px', 
          'background' : 'white', 
          'width' : width_snap + ''
        });
        $('clogo').setStyle({'margin-top' : '9px'});
      },

      applyMenuStylesForMove: function(el){
        if(null == Tourout.Window.Scroller._menuSrc){
          Tourout.Window.Scroller._menuSrc = Object.clone(el);
        }else{
          el = Tourout.Window.Scroller._menuSrc;
        }
        el.setStyle({'position' : 'fixed'});
        el.setStyle({'top' :  '123px'});
      },

      waitForElementMove: function (id, hlim){
        var el = $(id);
        if(!hlim) hlim = 100;
        var scrollHandler = function (){
          var vpPos = CommonUtils.getViewportPositions();
          var vpOff = CommonUtils.getViewportOffsets() ;

          if(vpOff.vertical > hlim){
            el.setStyle({'position' : 'fixed'});
            el.setStyle({'top' : 20 + 'px'});
          }else{
            el.setStyle({'position' : 'relative'});
            el.setStyle({'top' :  0});
          }
    //      console.info(vpOff.vertical + ' ' + vpOff.horizontal);
        }

        Event.observe(document, 'scroll', scrollHandler);
      }
    }
    
  },
  
  
  setCookie: function (name, value, props){
    props = props || {}
    var exp = props.expires
    if (typeof exp == "number" && exp) {
        var d = new Date()
        d.setTime(d.getTime() + exp*1000)
        exp = props.expires = d
    }
    if(exp && exp.toUTCString) { props.expires = exp.toUTCString() }
    value = encodeURIComponent(value)
    var updatedCookie = name + "=" + value
    for(var propName in props){
        updatedCookie += "; " + propName
        var propValue = props[propName]
        if(propValue !== true){ updatedCookie += "=" + propValue }
    }
    document.cookie = updatedCookie
  },
  
  getCookie: function(name){
	    var matches = document.cookie.match(new RegExp(
      "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
    ))
    return matches ? decodeURIComponent(matches[1]) : undefined
  },
  
  set_cookie: function(name, value, expires)
  {
    if (!expires)
    {
      expires = new Date();
    }
    document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString() +  "; path=/";
  },

  get_cookie: function(name){
    cookie_name = name + "=";
    cookie_length = document.cookie.length;
    cookie_begin = 0;
    while (cookie_begin < cookie_length)
    {
      value_begin = cookie_begin + cookie_name.length;
      if (document.cookie.substring(cookie_begin, value_begin) == cookie_name)
      {
        var value_end = document.cookie.indexOf (";", value_begin);
        if (value_end == -1)
        {
          value_end = cookie_length;
        }
        return unescape(document.cookie.substring(value_begin, value_end));
      }
      cookie_begin = document.cookie.indexOf(" ", cookie_begin) + 1;
      if (cookie_begin == 0)
      {
        break;
      }
    }
    return null;
  }

  
}





