var cpLib = Class.create({
  initialize: function(options) {
    this.options = {
      sufixPageType:          'Page',
      pagesType:              ['animatedList[faq]', 'autocomplete[catalog]', 'catalog[catalog:good:basket]', 'calendar[basket]'],
      prefixFunctionPageType: '_',

      animatedList:           true,
      animatedListId:         'animatedList',

      autocomplete:           true,
      autocompleteId:         'autocomplete',
      autocompleteScriptURL:  '/ajax/autocomplete.php',
      autocompleteDeferBy:    1500,

      calendar:               true,
      calendarButtonId:       'calendarButton',

      catalog:                true,
      catalogId:              'catalog',
      catalogScriptURL:       '/ajax/catalog.php',
      catalogGrpGoodsId:      'code',

      dirIMG:                 '/images/lightBox/',
      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);
  },

  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');

    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'});
            }
          }
        }
      }
    }
  },

  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);
  },

  _animatedList: function() {
    if (this.options.animatedList) new animatedList();
  },

  _catalog: function() {
    if (this.options.animatedList) {
      this.options.catalog = new catalog();
      this.options.catalog.create();
    }
  },

  _calendar: function() {
    if ($(this.options.calendar)) {
	    Calendar.setup({
    	  dateField      : 'date',
	      triggerElement : this.options.calendarButtonId
    	});
    }
  },

  _autocomplete: function() {
    if (this.options.autocomplete) new Autocomplete(
      this.options.autocompleteId, {
        minChars: 2,
        serviceUrl: this.options.autocompleteScriptURL,
        deferRequestBy: this.options.autocompleteDeferBy
    });
  }

});

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

    this.create();
  },

  create: function() {
    var elements = $$('ul#'+ this.options.animatedListId +' li');
    if (elements) {
      for (var i = 0; i < elements.length; i++) {
        var element = elements[i].getElementsByTagName('a')[0];

        if (element) {
          Event.observe(element, 'click', (function(event){
            this.showSection($(event.element()));
            event.stop();

            $(event.element()).blur();
            return false;
          }).bind(this), false);
        }
      }
    }
  },

  showSection: function(element) {
    if (element) {
      var elementParent = $(element.parentNode.parentNode);

      if (elementParent.getElementsByTagName('h1')[0]) var elementHx = $(elementParent.getElementsByTagName('h1')[0]);
      if (elementParent.getElementsByTagName('h2')[0]) var elementHx = $(elementParent.getElementsByTagName('h2')[0]);

      var elementDIV  = $(elementParent.getElementsByTagName('div')[0]);
      var elementP    = $(elementParent.getElementsByTagName('p')[0]);

      if (elementParent.className != 'selected') {
        var tweenHide = new Tween(elementParent.style, 'height', Tween.regularEaseInOut, elementParent.getHeight(), 0, 0.3, 'px');
		var tweenShow = new Tween(elementParent.style, 'height', Tween.regularEaseInOut, 0, elementHx.getHeight() + elementDIV.getHeight(), 0.6, 'px');
        tweenHide.start();

        tweenHide.onMotionFinished = (function(){
          elementParent.className = 'selected';

          //var tweenShow = new Tween(elementParent.style, 'height', Tween.regularEaseInOut, 0, elementHx.getHeight() + elementP.getHeight(), 0.6, 'px');
		/************* new **************/
		var tweenShow = new Tween(elementParent.style, 'height', Tween.regularEaseInOut, 0, elementHx.getHeight() + elementDIV.getHeight(), 0.6, 'px');
          tweenShow.start();
        }).bind(this);
      } else {
        var tweenHide = new Tween(elementParent.style, 'height', Tween.regularEaseInOut, elementParent.getHeight(), 0, 0.3, 'px');
        tweenHide.start();

        tweenHide.onMotionFinished = (function(){
          elementParent.className = '';
          
          var tweenShow = new Tween(elementParent.style, 'height', Tween.regularEaseInOut, 0, elementHx.getHeight(), 0.3, 'px');
          tweenShow.start();
        }).bind(this);
      }
    }
  }

});


var catalog = Class.create(siteBase, {
  initialize: function($super, options) {
    $super(options);

    options = {
      filter:       true,
      filterId:     'filter',

      goods:        true,
      goodsId:      'catalog',

      pagesList:    true,
      pagesListId:  'pagesList',

      menu:         true,
      menuId:       'menuCatalog'

    };
    Object.extend(this.options, options || { });

  },

  create: function() {
    if (this.options.menu && $(this.options.menuId)) {
      var myMenu = new menu();
          myMenu.create();
    }

    if (this.options.pagesList && $(this.options.pagesListId)) {
      var myPager = new pagesList();
          myPager.create();
    }

    if (this.options.filter && $(this.options.filterId)) {
      var myFilter = new filter();
          myFilter.setEvents();
    }
  },

  updateContent: function() {
    var myFilter  = new filter();
    var myMenu    = new menu();
    var params    = new menu().getParams() + new filter().getParams() + new pagesList().getParams();
    
    if ($("autocomplete")) {
      params += "&airport_id=" + encodeURIComponent($("airport_id").value) + "&query=" + encodeURIComponent($("autocomplete").value);
    }

    $$('body')[0].scrollTo();
        
    /************* new **************/
    $$("#" + this.options.goodsId + " > *").invoke('hide');
    $(this.options.goodsId).insert({top: "<div id=\"catalog_loading\" style=\"width:" + $(this.options.goodsId).getWidth() + "px; height: " + $(this.options.goodsId).getHeight() + "px\"><img src=\"/images/loading.gif\" /></div>"});
    
    new Ajax.Request(this.options.catalogScriptURL +'?'+ params, {
      method: 'get',
      onSuccess: (function(transport) {
        if ($(this.options.goodsId)) {
          $(this.options.goodsId).update(transport.responseText);
          
          /************* new **************/
          $("filter").show();
          if (this.options.pagesList && $(this.options.pagesListId)) {
          	var myPager = new pagesList();
          	myPager.setEvents();
          }

          if ($("category_text_new")) {
            $("category_text").update($("category_text_new").innerHTML)
            $("category_text_new").remove();
          }
        }
      }).bind(this),
      onFailure: (function() {
        $("filter").hide();
        $(this.options.goodsId).update("")
      }).bind(this)
    });
  }
});


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

  getParams: function() {
    var elementsLI  = $$('ul#'+ this.options.filterId +' li.selected');
    var queryParams = '';

    if (elementsLI) {
      for (var i = 0; i < elementsLI.length; i++) {
        var element = elementsLI[i].getElementsByTagName('span')[0];

        if (element)
		{
			queryParams += '&' + element.className;
		    var sFilters  = $(element.parentNode).getElementsBySelector('input');
			if (sFilters.length)
			{
				for (var j = 0; j < sFilters.length; j++) queryParams += '&' + sFilters[j].name + '=' + sFilters[j].value;
			}
		}
      }
    }
    return queryParams;
  },

  setEvents: function() {
    var elementsLI = $$('ul#'+ this.options.filterId +' li');
    if (elementsLI) {
      for (var i = 0; i < elementsLI.length; i++) {
        var elementSPAN = elementsLI[i].getElementsByTagName('span')[0];

        if (elementSPAN) {
          Event.observe(elementSPAN, 'click', (function(event){
            var elementSPAN = $(event.element());
            var elementLI   = $(elementSPAN.parentNode.parentNode);
            
if (elementSPAN.className == "alphabet") {
	var elementLI2 = $$('ul#'+ this.options.filterId +' li span.price')[0].up("li");
} else {
	var elementLI2 = $$('ul#'+ this.options.filterId +' li span.alphabet')[0].up("li");
}

            elementLI.className  = 'selected';
            elementLI2.className = '';

            new catalog().updateContent();

          }).bind(this));
        }
      }
    }
  }

});

var goods = Class.create(catalog, {
  initialize: function($super, options) {
    $super(options);

    this.options = {

    };
    Object.extend(this.options, options || { });
  }
});

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

  create: function() {
	this.setEvents();
  },

  getParams: function() {
    var element = $$('ul#'+ this.options.pagesListId +' li.selected a')[0];

    var queryParams = '';
    if (element) {
      var value = String(element.href).match(/.+\?(.+)/i);

      if (value[1]) {
        value = value[1].split('&');

        for (var i = 0; i < value.length; i++) {
          if (value[i].split('=')[0] == "page") queryParams += '&page=' + value[i].split('=')[1];
        }
      }
    }

    return queryParams;
  },

  setEvents: function() {
    var elementsA = $$('ul#'+ this.options.pagesListId +' li a');
    
    if (elementsA) {
      for (var i = 0; i < elementsA.length; i++) {
        if (elementsA[i]) {
          Event.observe(elementsA[i], 'click', (function(event){
			this.setSelected(event);
            event.stop();
            return false;
          }).bind(this));
        }
      }
	}
  },

  setSelected: function(event) {
    var elementsLI = $$('ul#'+ this.options.pagesListId +' li.selected');
    for (var i = 0; i < elementsLI.length; i++) elementsLI[i].removeClassName("selected")

	var element = event.element();
	if ($(element.parentNode).hasClassName("back") || $(element.parentNode).hasClassName("next")) {
	    var elementsA = $$('ul#'+ this.options.pagesListId +' li a');
	    for (var i = 0; i < elementsA.length; i++) {
			if (element !== elementsA[i] && elementsA[i].href == element.href) {
				element = elementsA[i];
				break;
			}
		}
	}
	$(element.parentNode).addClassName("selected")

	new catalog().updateContent();

	event.stop();
	element.blur();
  }

});

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

  create: function() {
    this.elementMenu = $(this.options.menuId);

    if (this.elementMenu) {
      this.subMenuHide();
      this.elementToElement({tag: 'p', toTag: 'a'}, {attribute: 'rel', toAttribute: 'href'});
      this.setEvents();
    }
  },

/************* new **************/
  getParams: function() {
    var element = $$('ul#'+ this.options.menuId +' a.selected')[0];

    var queryParams = '';
    if (element) {
		var value = String(element.href).match(/(.+)\?(.+)/i);

		queryParams += '&url=' + value[1];

		if (value[2]) {
			value = value[2].split('&');
			for (var i = 0; i < value.length; i++) queryParams += '&' + value[i].split('=')[0] + '=' + value[i].split('=')[1];
		}
    }

    return queryParams;
  },
/*
  getParams: function() {
    var element = $$('ul#'+ this.options.menuId +' a.selected')[0];

    var queryParams = '';
    if (element) {
      var value = String(element.href).match(/.+\?(.+)/i);

      if (value[1]) {
        value = value[1].split('&');

        for (var i = 0; i < value.length; i++) {
          if (value[i].split('=')[0] == this.options.catalogGrpGoodsId) queryParams += '&' + this.options.catalogGrpGoodsId + '=' + value[i].split('=')[1];
        }
      }
    }

    return queryParams;
  },
*/

  subMenuHide: function() {
    var elementsUL = this.elementMenu.getElementsByTagName('ul');

    if (elementsUL) {
      for (var i = 0; i < elementsUL.length; i++) {
        var elementDIV = new Element('div');

        elementDIV.setStyle({
          overflow: 'hidden',
          height:   0
        });

        $(elementsUL[i]).wrap(elementDIV);
      }
    }
  },

  showSection: function(element) {
    if (element) {
      var elementUL   = element.getElementsByTagName('ul')[0];
      var elementDIV  = element.getElementsByTagName('div')[0];

      if (elementUL && elementDIV) {
        var marginTop = 0;
        if (elementUL.getStyle('margin-top')) {
          marginTop = (elementUL.getStyle('margin-top')).replace(/px|pn/, '') * 1;
        }

        var tween = new Tween(elementDIV.style, 'height', Tween.regularEaseInOut, 0, elementUL.getHeight() + marginTop, 1, 'px');
        tween.onMotionFinished = function(){
          elementDIV.setStyle({
            height: 'auto'
          });
        };

        tween.start();
      }
    }
  },

  hideSection: function(element) {
    if (element) {
      var elementUL   = element.getElementsByTagName('ul')[0];
      var elementDIV  = element.getElementsByTagName('div')[0];

      if (elementUL && elementDIV) {
        var tween = new Tween(elementDIV.style, 'height', Tween.regularEaseInOut, elementUL.getHeight(), 0, 1, 'px');
        tween.start();
      }
    }

  },

	sectionAnimation: function(event){
		var element     = $(event.element());
		var elementLI   = $(element.parentNode);
		var elementUL   = $(elementLI.parentNode);
		var elemtntDIV	= $(elementLI.getElementsByTagName('div')[0]);


	    if (element.className != 'selected' && element.className != 'subSelected') {
	    	for (var j = 0; j < this.elementMenu.getElementsByClassName('selected').length; j++) {
    		  	this.elementMenu.getElementsByClassName('selected')[j].className = 'subSelected';
			}

			  for (var j = 0; j < elementUL.childElements().length; j++) {
				if (elementUL.childElements()[j].getElementsByTagName('a')[0]) {
					elementUL.childElements()[j].getElementsByTagName('a')[0].className = '';
				}
			  }

		    for (var j = 0; j < elementUL.getElementsByTagName('li').length; j++) {
      			if (elementUL.getElementsByTagName('li')[j].getElementsByTagName('ul')[0]) {
	        	elementUL.getElementsByTagName('li')[j].getElementsByTagName('a')[0].className = '';

    			if (elementUL.getElementsByTagName('li')[j].getElementsByTagName('div')[0].getHeight() > 0) {
		          	var tween = new Tween(elementUL.getElementsByTagName('li')[j].getElementsByTagName('div')[0].style, 'height', Tween.regularEaseInOut, elementUL.getElementsByTagName('li')[j].getElementsByTagName('ul')[0].getHeight(), 0, 1, 'px');
						tween.start();
					}
				}
			}

			element.className = 'selected';

			this.showSection(elementLI);

			if ($("pagesList")) {
//				$("pagesList").down("li.selected").removeClassName("selected");
				$("pagesList").down("li", 1).addClassName("selected");
			}
			
			this.updateContent();
		} else {
			element.className = '';
			this.hideSection(elementLI);
		}

		event.stop();
		element.blur();
	},

  setEvents: function() {
    var elementsLI = this.elementMenu.getElementsByTagName('li');

    if (elementsLI) {
      for (var i = 0; i < elementsLI.length; i++) {
        var elementA = elementsLI[i].getElementsByTagName('a')[0];

        if (elementA) {
          Event.observe(elementA, 'click', (function(event){
			this.sectionAnimation(event);
            return false;
          }).bind(this));
        }
      }
    }
  },

  elementToElement: function(tags, attributes) {
    if (tags && attributes) {
      var elementsLI = this.elementMenu.getElementsByTagName('li');

      if (elementsLI) {
        for (var i = 0; i < elementsLI.length; i++) {
        if (elementsLI[i].className == "basket") continue;

        var element = elementsLI[i].getElementsByTagName(tags.tag)[0];

          if (element) {
            var innerHTML = element.innerHTML;
            var attribute = element.getAttribute(attributes.attribute);


            var toElement = new Element(tags.toTag);
            toElement.writeAttribute(attributes.toAttribute, attribute);
            $(element).wrap(toElement);

            toElement.innerHTML = innerHTML;

          }
        }
      }
    }
  }
});

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;
  }
});

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

function scheme_show_hide(a) {
	var img = $(a).up().getElementsByTagName("img")[0];
	var div = $(img).up();
	
	if ($(img).style.display === "none") {
		$(img).show();
		var tween = new Tween(div.style, 'height', Tween.regularEaseInOut, 0, $(img).getHeight(), 0.3, 'px');
		tween.start();
	} else {
		var tween = new Tween(div.style, 'height', Tween.regularEaseInOut, $(img).getHeight(), 0, 0.6, 'px');
		tween.start();
        tween.onMotionFinished = (function(){
			$(img).hide();
        });
	}

	return false;
}

