// Browser type
var Browser = new Object();
var ua = navigator.userAgent.toLowerCase();
Browser.isMozilla = (typeof document.implementation != 'undefined')
                    && (typeof document.implementation.createDocument != 'undefined')
                    && (typeof HTMLDocument!='undefined');
Browser.isIE      = window.ActiveXObject ? true : false;
Browser.isIE7     = (Browser.isIE && ua.indexOf('msie 7') != -1) ? true : false;
Browser.isFirefox = (ua.indexOf("firefox") != -1);
Browser.isSafari  = (ua.indexOf("safari") != -1);
Browser.isOpera   = (typeof window.opera != 'undefined');

function dispatchException (e) {
}
if (typeof $ == "undefined") {
  var $ = function (id) {
    return document.getElementById(id);
  }
}

function getXY(el) {
  var x = 0, y = 0;
  while(el) {
    x += el.offsetLeft;
    y += el.offsetTop;
    el = el.offsetParent;
  }
  return Array(x, y);
}

function elem(name, attrs, style, text) {
  var e = document.createElement(name);
  if (attrs) {
    for (key in attrs) {
      if (key == 'class') {
          e.className = attrs[key];
      } else if (key == 'id') {
          e.id = attrs[key];
      } else {
          e.setAttribute(key, attrs[key]);
      }
    }
  }
  if (style) {
    for (key in style) {
        e.style[key] = style[key];
    }
  }
  if (text) {
    e.appendChild(document.createTextNode(text));
  }
  return e;
}

function textNode(text) {
  if (text) {
    return document.createTextNode(text);
  } else {
    return null;
  }
}

var debugLine = 1;
function debug(message) {
  if (!debug_state) {
    return;
  }
  message = message || "";
  message = message ? (debugLine++) + ": " + message : message;
  var blockElement = elem("DIV", false, {
    height: "15px",
    background: "#EFEFEF",
    padding: "0 2px",
    margin: "2px",
    border: "1px solid white"
  });

  blockElement.appendChild(elem("DIV", false, {
    width: "120px",
    fontSize: "9px",
    styleFloat: "right",
    cssFloat: "right",
    border:"1px solid gray",
    background:"silver"
  }, new Date().toTimeString()));

  blockElement.appendChild(document.createTextNode(message));
  $('debug').appendChild(blockElement);
}

function mailTo(oHref,atString) {
  oHref = $(oHref);
  if(atString){
    oHref.oldHref = oHref.href;
    oHref.href = oHref.href.replace(atString,"@");
  }else{
    oHref.href = oHref.oldHref;
  }
    return oHref.href;
}

function parseUrl(sourceUri) {
  sourceUri = sourceUri ? sourceUri : window.location;
  var uriParts = new RegExp("^(?:([^:/?#.]+):)?(?://)?(([^:/?#]*)(?::(\\d*))?)?((/(?:[^?#](?![^?#/]*\\.[^?#/.]+(?:[\\?#]|$)))*/?)?([^?#/]*))?(?:\\?([^#]*))?(?:#(.*))?").exec(sourceUri);
  var uri = {
          url:      sourceUri,
          protocol: RegExp.$1,
          auth:     RegExp.$2,
          domain:   RegExp.$3,
          port:     RegExp.$4,
          path:     RegExp.$5,
          dir:      RegExp.$6,
          file:     RegExp.$7,
          query:    RegExp.$8,
          hash:     RegExp.$9
      }

  if(uri.dir.length > 0) uri.dir = uri.dir.replace(/\/?$/, "/");

  return uri;
}

function getQueryVariable(variable) {
  var query = window.location.search.substring(1);
  var vars  = query.split("&");
  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    if (pair[0] == variable) {
      return pair[1];
    }
  }
  return false;
}

var MyAjaxHandlers = {
  onCreate: function(e) {
    Element.show("ajax-indicator");
  },
  onComplete: function(e) {
    Element.hide("ajax-indicator");
  },
  onSuccess: function(e) {
    Element.hide("ajax-indicator");
  },
  onFailure: function(e) {
    Element.hide("ajax-indicator");
  },
  onLoaded: function(e) {
    Element.hide("ajax-indicator");
  }
}
Ajax.Responders.register(MyAjaxHandlers);

var docWindow; 
function documentWindow(src, width, height, resizable) {
  var scroll='yes';
  var w=(width) ? width : 710; 
  var h=(height) ? height : 560;
  var l=(screen.width-w)/2;
  var t=(screen.height-h)/2;
  var r = (resizable) ? resizable : 'no';

  docWindow=window.open(src, "blankDocWindow", 'status=no,scrollbars='+scroll+',resizable='+r+',top='+t+',left='+l+',width='+w+',height='+h+''); 
  docWindow.focus();
  return false;
}

var oImageWindow; 
function imageWindow(src,width,height,print,title){ 
  var scroll = 'no';
  var w = (print==true) ? 20 : 20;
  var h = (print==true) ? 20 : 0;  

  if( height>640 ) { w = w+width; h=660; scroll='yes'; }
  else              { w=width; h=h+height; scroll='no'; }

  var l=(screen.width-w)/2;
  var t=(screen.height-h)/2;

  title = (!title) ? "Perfect Fit" : title + " : Perfect Fit";

  oImageWindow=window.open("","blankImageWindow", 'status=no,scrollbars='+scroll+',resizable=0,top='+t+',left='+l+',width='+w+',height='+h+''); 
  oImageWindow.document.write("<html><head><title>"+title+"</title><base href='"+base+"'><link rel='stylesheet' type='text/css' href='./_app/css/normal.css'></head>"); 
  oImageWindow.document.write("<body topmargin=0 marginheight=0 leftmargin=0 marginwidth=0 bgcolor=white text=black link=black alink=black vlink=black>"); 
  oImageWindow.document.write("<center>"); 
  oImageWindow.document.write("<table border=0 cellspacing=0 cellpadding=0 bgcolor=#FFFFFF>"); 
  oImageWindow.document.write("<tr><td align=center bgcolor=white>"); 
  oImageWindow.document.write("<a href='javascript:self.close();' title='Закрыть окно'><img src='"+src+"' width="+width+" height="+height+" border=0></a>"); 
  if (print==true)
    oImageWindow.document.write("</td></tr><tr><td align='center'><a class='cat' href='javascript:self.print();'>Распечатать</a></td></tr>"); 
  else
    oImageWindow.document.write("</td></tr>"); 
  oImageWindow.document.write("</table>"); 
  oImageWindow.document.write("</body></html>"); 
  oImageWindow.document.close(); 
  oImageWindow.focus();
}

function onShowHide(element) {
  if($(element).visible()) {
    $(element).hide();
    $('p_' + element).className = 'closed';
  }else{
    $(element).show();
    $('p_' + element).className = 'opened';
  }
  return false;
}

function elementShowHide(element) {
  if($(element).visible()) {
    $(element).hide();
  }else{
    $(element).show();
  }
  return false;
}

function labelOnFocus(event) {
  var elAction = Event.element(event);
  if (event.type=='blur') {
    if(elAction.value.length == 0) {
      elAction.value = elAction.title;
    }
  }
  if (event.type=='focus') {
    if(elAction.value == elAction.title) {
      elAction.value = '';
    }
  }
}

function sendPurr() {
  $('purr').appendChild($('ajax-indicator'));
  $('ajax-indicator').setStyle({
    margin: '-80px 0 0 170px'
  });
  var url = base + 'ajax/?action=sendPurr';
  var pars = $('formPurr').serialize();
  var myAjax = new Ajax.Request(url,
    {
      method: 'post',
      parameters: pars,
      onComplete: function(transport) {
        var hashResponse = transport.responseText.evalJSON();
        if(hashResponse.result == 'success') {
          alert('Сообщение Вашему другу успешно отправлено.');
        }else{
          alert('Не удалось отправить сообщение Вашему другу.');
        }
        $('purr').hide();
    }
  });
  return false;
}

function _exit(){if($('forFloatBlock')){$('forFloatBlock').remove();}return false;}

function getPerfectPart(cid, type) {
  $('forIndicator').appendChild($('ajax-indicator'));
  $('ajax-indicator').setStyle({
    margin: '-30px 0 0 -150px'
  });
  if($('forFloatBlock')) {
    $('forFloatBlock').remove();
  }
  var xy = getXY($('forIndicator'));
  var url = base + 'ajax/?action=getPerfectPart';
  var pars = "cid=" + cid + "&type=" + type;
  var myAjax = new Ajax.Request(url,
    {
      method: 'post',
      parameters: pars,
      onComplete: function(transport) {
        var Response = transport.responseText;
        var blockElement = elem("DIV", {id: "forFloatBlock"});
        $('forIndicator').appendChild(blockElement);
        var exitElement = elem("a", {id: "exitFloatBlock", onclick: "return _exit();", href: "#", title: "Закрыть"}, false, 'x');
        blockElement.appendChild(exitElement);
        blockElement.innerHTML = blockElement.innerHTML + Response;
        //alert(xy[1] + ' : ' + blockElement.offsetHeight + ' : ' + (xy[1] - blockElement.offsetHeight) + ' : ');
        blockElement.style['margin'] = (0 - blockElement.offsetHeight - 30) + "px 0 0 -300px";
    }
  });
  return false;
}

function initFileUploads() {
  var fakeFileUpload = elem('div',{'class':'fakefile'});
  var fakeFileUploadInput = fakeFileUpload.appendChild(elem('input',{'class':'filetext'}));
  $$('input[type="file"]').each(function(input) {
    if (input.parentNode.className != 'fileinputs') {
      throw $continue;
    }
    input.className = 'file hidden';
    var clone = fakeFileUpload.cloneNode(true);
    input.parentNode.appendChild(clone);
    input.relatedElement = clone.getElementsByTagName('input')[0];
    input.onchange = input.onmouseout = function () {
      this.relatedElement.value = this.value.substring(0,30)+((this.value.length<30)?'':'...');
    }
  });
}

function showFavoritesForm(favUrl, favTitle, favType) {
  var objBody = $$('body')[0];
  objBody.appendChild(Builder.node('div',{id:'overlayAll'}));
  objBody.appendChild(Builder.node('div',{id:'favContainer'}, 
    Builder.node('div',{'id':'favForm'}, [
      Builder.node('div',{'id':'titleFav'}, 'Добавить в моё избранное'),
      Builder.node('form',{'action':'#', 'onsubmit':'return false', 'id':'formFav'}, [
        Builder.node('div', {'class':'message'}, 'Путь к странице'),
        Builder.node('div', {'class':'input'}, [
          Builder.node('input', {'type':'text','id':'favUrl','name':'favUrl','value':favUrl,'readonly':true}),
          Builder.node('input', {'type':'hidden','id':'favType','name':'favType','value':favType})
        ]),
        Builder.node('div', {'class':'message'}, 'Заголовок'),
        Builder.node('div', {'class':'input'}, 
          Builder.node('input', {'type':'text','id':'favTitle','name':'favTitle','value':favTitle})
        ),
        Builder.node('div', {'class':'message'}, 'Ваш комментарий'),
        Builder.node('div', {'class':'input'}, 
          Builder.node('textarea', {'id':'favComment','name':'favComment'})
        ),
        Builder.node('div', {'class':'buttons'}, [
          Builder.node('input', {'type':'button','id':'bOk','name':'bOk','value':'OK'}),
          Builder.node('input', {'type':'button','id':'bCancel','name':'bCancel','value':'Отмена'})
        ])
      ])
    ])
  ));
  $('bCancel').observe('click', (function(event){$('favContainer').remove();$('overlayAll').remove();}).bind(this));
  $('bOk').observe('click', (function () {
    var url = base + 'ajax/?action=addFavorite';
    var pars = Form.serializeElements($('formFav').getElements());
    var myAjax = new Ajax.Request(url,
      {
        method: 'post',
        parameters: pars,
        onComplete: function(transport) {
          var hashResponse = transport.responseText.evalJSON();
          switch (hashResponse.result) {
            case 'successfull':
              alert('Закладка добавлена.');
              break;
            case 'error':
              alert('Не удалось добавить закладку.');
              break;
            case 'accessdenied':
              alert('Вы не авторизованы.');
              break;
          }
        }
    });
    $('favContainer').remove();$('overlayAll').remove();
}).bind(this));
  
  var arrayPageScroll = document.viewport.getScrollOffsets();
  var favContainerTop = arrayPageScroll[1] + (document.viewport.getHeight()-$('favContainer').getHeight()) / 2;
  $('favContainer').setStyle({ top: favContainerTop + 'px'});

  $('overlayAll').hide();
  var arrayPageSize = getPageSize();
  $('overlayAll').setStyle({ width: arrayPageSize[0] + 'px', height: arrayPageSize[1] + 'px', backgroundColor: '#000000' });
  new Effect.Appear('overlayAll', { duration: 0.5, from: 0.0, to: 0.7 });
}

function getPageSize() {
          
  var xScroll, yScroll;
  
  if (window.innerHeight && window.scrollMaxY) {  
    xScroll = window.innerWidth + window.scrollMaxX;
    yScroll = window.innerHeight + window.scrollMaxY;
  } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
    xScroll = document.body.scrollWidth;
    yScroll = document.body.scrollHeight;
  } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
    xScroll = document.body.offsetWidth;
    yScroll = document.body.offsetHeight;
  }
  
  var windowWidth, windowHeight;
  
  if (self.innerHeight) { // all except Explorer
    if(document.documentElement.clientWidth){
      windowWidth = document.documentElement.clientWidth; 
    } else {
      windowWidth = self.innerWidth;
    }
    windowHeight = self.innerHeight;
  } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
    windowWidth = document.documentElement.clientWidth;
    windowHeight = document.documentElement.clientHeight;
  } else if (document.body) { // other Explorers
    windowWidth = document.body.clientWidth;
    windowHeight = document.body.clientHeight;
  } 
  
  // for small pages with total height less then height of the viewport
  if(yScroll < windowHeight){
    pageHeight = windowHeight;
  } else { 
    pageHeight = yScroll;
  }

  // for small pages with total width less then width of the viewport
  if(xScroll < windowWidth){  
    pageWidth = xScroll;    
  } else {
    pageWidth = windowWidth;
  }

  return [pageWidth,pageHeight];
}