var cpLib = Class.create({
  initialize: function(options) {
    this.options = {     
      sufixPageType:          'Page',
      pagesType:              ['calc[inner:calc]', 'hint[calc]', 'menu[main:inner:calc:map]'],
      prefixFunctionPageType: '_',

      calc:           				true,
      calcId:         				'calc',
      
      menu:           				true,
      menuId:         				'menuMain02',
      
      calendar:               true,
      calendarButtonId:       'calendarButton',
      
      hint:                   true,
      
      dirIMG:                 '/img/',
      imgNULL:                'null.gif',

      msgErrDefault:          'Что-то не так!',
      msgErrGetDefault:       'Ошибка загрузки файла',
      msgErrGetXML:           'Ошибка загрузки XML-файла',
      msgErrFunction:         'Функция не найдена'
    };
    Object.extend(this.options, options || { });
  }
});


var siteBase = Class.create(cpLib, {
  initialize: function($super, options) {
    $super(options);
    Object.extend(this.options, options || { });
    
  },

  load: function() {
    if (navigator) {
      this.IE6 = /MSIE (5\.5|6)/.test(navigator.userAgent) && navigator.platform == 'Win32';
      if (this.IE6) this.updateIE6();
    }
    
    this.page   = $$('body')[0];
    this.pageID = $$('body')[0].readAttribute('id');
    
    this.updateContentOfType(this.pageID);
    this.makeInterface();
    
    this.mail();
  },
  
  mail: function() {
    document.observe('submit', (function(event){

      var el = event.findElement('form[id^=frmMail]');
      if(el){
        event.stop();

        $('cntFORM').setStyle({
          visibility: 'hidden'
        });

        $('frmMail').request({
          onSuccess: function(transport) {
            $("cntAJAX").update(transport.responseText);
          }
        });
      }      
    }));
  },
  
  updateIE6: function() {
    this.updateImagePNG();
  },

  updateImagePNG: function() {
    var elementsIMG = $$('img[src*=.png]');

    if (elementsIMG) {
      for (var i = 0; i < elementsIMG.length; i++) {
        var src = elementsIMG[i].readAttribute('src');
        elementsIMG[i].writeAttribute('src', this.options.dirIMG + this.options.imgNULL);

        var tplFilter = new Template('progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'#{src}\', sizingMethod=\'scale\')');
        elementsIMG[i].runtimeStyle.filter = tplFilter.evaluate({src: src});
      }
    }
    
    var listTags = new Array('div', 'ul', 'li', 'p', 'a');

    if (listTags) {
      for (var i = 0; i < listTags.length; i++) {
        var elements = $$(listTags[i]);

        if (elements) {
          for (var j = 0; j < elements.length; j++) {
            var src = (String($(elements[j]).getStyle('background-image')).match(/url\("(.+)"\)/i));
            (src == null || src == 'null' || !src) ? src = '' : src = src[1];

            if (src.include('.png')) {
              elements[j].runtimeStyle.backgroundImage = 'none';

              var tplFilter = new Template('progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'#{src}\', sizingMethod=\'#{sizingMethod}\')');
              elements[j].runtimeStyle.filter = tplFilter.evaluate({src: src, sizingMethod: ($(elements[j]).getStyle('background-repeat') == 'no-repeat') ? 'crop' : 'scale'});
            }
          }
        }        
      }      
    }
  },
  
  makeInterface: function() {
    var arTblViewer = $$('div.tblViewer');

    if(arTblViewer){
        $A(arTblViewer).each(function(tblElement){
            var arElements = tblElement.down('div.header', 0).select('span');
            
            if(arElements){
                $A(arElements).each(function(element){
                    Event.observe(element, 'click', (function(event){
                        var _el = event.element();
                        
                        var _arElements = _el.up('div.tblViewer', 0).down('div.header', 0).select('span');
                        if(_arElements){
                            $A(_arElements).each(function(_element){
                                if(_element.hasClassName('selected'))
                                    _element.removeClassName('selected');
                            });   
                        }
                        _el.addClassName('selected');
                                       
                        _arElements = _el.up('div.tblViewer', 0).down('div.frame', 0).select('div.tbl');
                        if(_arElements){
                            $A(_arElements).each(function(_element){
                                _element.addClassName('overflow');
                            });   
                        }

                        var _element = $(_el.up('div.tblViewer', 0).down('div.frame', 0).down('div.' + _el.readAttribute('rel')));
                        
						$(_el.up('div.tblViewer', 0).down('div.frame', 0)).id = 'Test OK';
						
                        if(_element)
                            _element.removeClassName('overflow');
                            
                        if($('mapPage')){
                            var _arElements = $('YMapsID').select('div.overlay');
                            if(_arElements){
                                $A(_arElements).each(function(_element){
                                    if(_element.hasClassName('hidden'))
                                        _element.removeClassName('hidden');
                                    else
                                        _element.addClassName('hidden');
                                });
                            }
                        }
                    }));
                });
            }
        });
    }
  },
  
  updateContentOfType: function(pageID) {
    var pageID = pageID || '';
  
    if (pageID && pageID != '') {
      for (var i = 0; i < this.options.pagesType.length; i++) {
        pageID = pageID.replace(eval('/' + this.options.sufixPageType + '/'), '');

        var arPageType = String(this.options.pagesType[i]).match(/(.+)\[(.+)\]/i);
        if (arPageType == null || arPageType == 'null' || !arPageType) {
          if (pageID == this.options.pagesType[i]) {
            this.callUserEvent({functionName: this.options.prefixFunctionPageType + this.options.pagesType[i]});
          }
        } else {
          var pageType    = arPageType[1];
          var arPageType  = String(arPageType[2]).split(':');
          
          for (var j = 0; j < arPageType.length; j++) {
            if (pageID == arPageType[j]) {
              this.callUserEvent({functionName: this.options.prefixFunctionPageType + pageType});
            }
          }
        }

      }
    }
  },
	
  callUserEvent: function(params) {
    var method = Function.methodExists(this, params.functionName);

    (method)? method() : alert(this.options.msgErrFunction +':'+ params.functionName);
  },
  
  _calc: function() {
    if (this.options.calc) calc = new calc();
  },
  
  _menu: function() {
    if (this.options.menu) new menu();
  },
  
  _hint: function() {
    if (this.options.hint) new hint();
  }
});

var menu = Class.create(siteBase, {
  initialize: function($super, options) {
    $super(options);
    Object.extend(this.options, options || { });

    if (navigator) {
      this.IE6 = /MSIE (5\.5|6)/.test(navigator.userAgent) && navigator.platform == 'Win32';
    }

    this.create();
  },
  
  create: function() {
    var elULParent = $(this.options.menuId);

    if (elULParent) {
      var arElLI = $$('#'+ this.options.menuId +' li');
      
      if (arElLI) {
        for (var i = 0; i < arElLI.length; i++) {
          var elULChild = arElLI[i].getElementsByTagName('ul')[0];
          
          if (elULChild) {
            Event.observe(arElLI[i], 'mouseover', (function(event){
              var el = event.element();
              
              if (el.parentNode.getElementsByTagName('ul')[0]){
                var elUL = $$('#'+ this.options.menuId +' li ul#visible')[0];
                if (elUL) {
                  elUL.id = '';
                  elUL.setStyle({visibility: 'hidden'});
                }
              
                el.parentNode.getElementsByTagName('ul')[0].id = 'visible';
                $(el.parentNode.getElementsByTagName('ul')[0]).setStyle({
                  visibility: 'visible',
                  top:        '28px',
                  left:       el.cumulativeScrollOffset().left + 'px'
                });
                
                if(this.IE6) {
                $(el.parentNode.getElementsByTagName('ul')[0]).setStyle({
                  top:        '42px'
                });                
                }
              }
            }).bind(this), true);

          }
        }
      }
    }
  }
  
});

var hint = Class.create(siteBase, {
  initialize: function($super, options) {
    $super(options);
    Object.extend(this.options, options || { });
    
    this.create(); 
  },
  
  create: function() {

  }
  
});

var calc = Class.create(siteBase, {
  initialize: function($super, options) {
    $super(options);
		options = {
			k:	87000
		}
    Object.extend(this.options, options || { });
    
	this.updateResult();
    this.updateEvent();
  },
	
	updateResult: function() {
    var arDayInMonth = new Array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

		var hsElRusult = {
			OTS: $$('#calc tfoot tr.OTS span')[0],
			GRP: $$('#calc tfoot tr.GRP span')[0],
			all: $$('#calc tfoot tr.all span')[0]
		}
		
		var hsVlRusult = {
			OTS: 0, GRP: 0, all: 0
		}
		
		var arElTR = $$('#calc tbody tr');
		for (var i = 0; i < arElTR.length; i++) {
			var hsElTD = new Hash();
			
			var arElTD = arElTR[i].getElementsByTagName('td');
			for (var j = 0; j < arElTD.length; j++) hsElTD.set(arElTD[j].className, arElTD[j]);
			
			hsElTD.get('from').getElementsByTagName('div')[0].id = 'from_' + i;
			hsElTD.get('to').getElementsByTagName('div')[0].id = 'to_' + i;
			Calendar.setup({dateField: 'from_' + i, triggerElement: 'from_' + i});
			Calendar.setup({dateField: 'to_' + i, triggerElement: 'to_' + i});
			
			var arFrom = String(hsElTD.get('from').getElementsByTagName('div')[0].innerHTML).split('.');
			var arTo = String(hsElTD.get('to').getElementsByTagName('div')[0].innerHTML).split('.');
			var from = Date.UTC(arFrom[2], arFrom[1], arFrom[0]) / (1000 * 3600 * 24);
			var to   = Date.UTC(arTo[2], arTo[1], arTo[0]) / (1000 * 3600 * 24);
			
			var countInBlock = Math.round(300 / hsElTD.get('time').getElementsByTagName('select')[0].value);

			//for (var j = 1; j <= countInBlock; j++) html += '<option '+ ((j == hsElTD.get('countInBlock').getElementsByTagName('select')[0].value)?'selected':'') +' value="'+ j +'">'+ j +'</option>';
      var elSelect = new Element('select');
      for (var j = 1; j <= countInBlock; j++) {
        var elOption = new Element('option');
            elOption.value = j;
            
        var elTxtOption = document.createTextNode(j);
        
        elOption.appendChild(elTxtOption);
        
        if (hsElTD.get('countInBlock').getElementsByTagName('select')[0].value == j) {
          elOption.selected = true;
          elSelect.value = j;
        }
        
        elSelect.appendChild(elOption);
      }
      
      hsElTD.get('countInBlock').innerHTML = '';
      hsElTD.get('countInBlock').appendChild(elSelect);
 

      						
			var hsElValue = {
			  time: hsElTD.get('time').getElementsByTagName('select')[0].value,
				countInBlock: hsElTD.get('countInBlock').getElementsByTagName('select')[0].value,
				flag:					hsElTD.get('flag').getElementsByTagName('input')[0].checked
			}
			
			var arDBValue = String(arElTR[i].readAttribute('rel')).split(':');
			hsDBValue = {
				OTSGross: arDBValue[0],
				countDay: arDBValue[1],
				OTSBlock: arDBValue[2],
				GRP:			arDBValue[3],
				price:		Math.round((arDBValue[4]) * (hsElValue.time / 5))
			};
			
			var countDay = (to <= from)? 1 : Math.round(to - from + 1);
			var time = Math.round(hsElValue.time);
			var countAll = Math.round(hsElValue.countInBlock * hsDBValue.countDay * countDay);
			var OTSBlock = Math.round(hsElValue.countInBlock * hsDBValue.OTSBlock);
			var OTSGross = Math.round(hsDBValue.OTSGross * countDay);
			var GRP = Math.round((hsElValue.countInBlock * hsDBValue.OTSBlock / this.options.k) * 10 * countDay) / 10;
			var cost = Math.round(hsElValue.countInBlock * hsDBValue.price  * countDay);
			
			$(hsElTD.get('countAll')).update(countAll);
			$(hsElTD.get('OTSBlock')).update(OTSBlock);
			$(hsElTD.get('OTSGross')).update(OTSGross);
			$(hsElTD.get('GRP')).update(GRP);
			$(hsElTD.get('cost')).update(cost);
			
			if (hsElValue.flag) {
				hsVlRusult.OTS += OTSBlock;
				hsVlRusult.GRP += GRP;
				hsVlRusult.all += cost;
			}
			
			arElTR[i].id = (hsElValue.flag) ? 'selected' : '';
		}
		
		hsElRusult.OTS.update(hsVlRusult.OTS);
		hsElRusult.GRP.update(Math.round(hsVlRusult.GRP * 10) / 10);
		hsElRusult.all.update(hsVlRusult.all);
		
		this.updateEvent();
	},

	updateEvent: function() {
		arEventRule = new Array(
			' tbody tr td.time select:change',
			' tbody tr td.countInBlock select:change',
			' tbody tr td.flag input:click'
		);
		
		for (var i = 0; i < arEventRule.length; i++) {
			var arParams = String(arEventRule[i]).split(':');
			var arEl = $$('#' + this.options.calcId + arParams[0]);
			
			for (var j = 0; j < arEl.length; j++)
			Event.observe(arEl[j], arParams[1], (function(event){this.updateResult();}).bind(this));
		}
		
		var arElements = $$('#' + this.options.calcId + ' tr td sup[rel^=hint]');
		
		if (arElements){
		    $A(arElements).each(function(element){
		        Event.observe(element, 'mouseover', (function(event){
		            var _element = event.element().up('td', 0).down('div.boxHint', 0);
		            
		            if(_element){
		                if(_element.hasClassName('hidden'))
                            _element.removeClassName('hidden');
		            }
		            
		            event.stop();
		        }).bind(this));
		    });
		    
            $A(arElements).each(function(element){
                Event.observe(element, 'mouseout', (function(event){
                    var _element = event.element().up('td', 0).down('div.boxHint', 0);
                    
                    if(_element){
                        if(!_element.hasClassName('hidden'))
                            _element.addClassName('hidden');
                    }
                    
                    event.stop();
                }).bind(this));
            });
		}
    }
});

Object.extend(Function.prototype, {  
  methodExists: function(object, functionName) {
    var __method = null;
    
    for(property in object) {
      if (Object.isFunction(object[property]) && property == functionName) {
        __method = object[property];
        break;
      }
    }

    if(__method) return ((__method).bind(object)).methodize(); else return false;
  }
});

function divAdvantages(obj) {
  var objDiv = obj.parentNode.parentNode.getElementsByTagName('div');
  for (var i = 0; i < objDiv.length; i++) {
    objDiv[i].style.display = 'none';
  }

  var objSpan = obj.parentNode.parentNode.getElementsByTagName('span');
  for (var i = 0; i < objSpan.length; i++) {
    objSpan[i].style.display = '';
  }

  objSpan = obj.parentNode.getElementsByTagName('span');
  objSpan[0].style.display = 'none';

  objDiv = obj.parentNode.getElementsByTagName('div');
  objDiv[0].style.display = 'block';
}

var calc;

document.observe('dom:loaded', function () { var myCPLib = new siteBase(); myCPLib.load(); });
