var ShowHide = {};
	ShowHide.debug = false;
	ShowHide.bindings = {};
	ShowHide.states = {};
	ShowHide.cache = {};
	ShowHide.cached = {};
	ShowHide.labels = ['showhide','hovering'];
	ShowHide.sequence = 0;
	ShowHide.getUniqId = function(){
		sequence++;
		return 'generated_'+sequence;
	};
	
	ShowHide.initStates =  function(){
		var elements = document.getElementsByClassName('showhide'); 
		elements.each(function(element){
			if (!element.id){
				element.id = 	ShowHide.getUniqId();
			}
			if (Element.getStyle(element,'display')=='none'){
					ShowHide.states[element.id] = true;
			}else{
					ShowHide.states[element.id] = false;
					ShowHide.adjustHovering(element.id);
			}
			
		});
		
	};
	
	ShowHide.collectShowHideLinks = function(){
		var result = [];
		var links = document.getElementsByClassName('showhidelink'); 
		for (var i = 0 ; i < links.length; i++){
			var link = links[i];
			if (!link.id){
				link.id = 	ShowHide.getUniqId();
			}
			var classNames = $(link).classNames();
			classNames.each(function(className) { 
				if (className.indexOf('_sh')===0){
					var shid = className.substring(3);
					var targets = 	ShowHide.collectShowHidePanes(className);

					ShowHide.bindings[link.id] = targets;
					result.push(link);
				}
			}); 
		}
		return result;
	};

	ShowHide.isPane =  function(pane){
			var result = false;
			var classNames = pane.classNames();
			classNames.each(function(className) {
				if (	ShowHide.labels.indexOf(className)>=0){

					result =  true;
				}
			});
			return result;
	};
	ShowHide.collectShowHidePanes=  function(shid){
		var result = [];
		var panes = document.getElementsByClassName(shid); 
		for (var i = 0 ; i < panes.length; i++){
			var pane = panes[i];
			if (	ShowHide.isPane(pane)){
					if (!pane.id){
						pane.id = 	ShowHide.getUniqId();
					}
					result.push(pane.id);
				}
		}
		return result.uniq();
	};

	ShowHide.initEventHandlers = function(){
		var links = 	ShowHide.collectShowHideLinks();
		links = links.uniq();
		for (var i = 0 ; i < links.length; i++){
			var link = links[i];
			Event.observe(link,"click",	ShowHide.eventHandler);
		}

	};	

	ShowHide.eventHandler =  function(event) { 
		
		var target = Event.element(event);
		if (!target.hasClassName('showhidelink'))
			target = target.up('.showhidelink');
		var targets = 	ShowHide.bindings[target.id];
		targets.each(function(t){
			t = Element.extend($(t));
			if (t.hasClassName('showhide')){
					var pairz = 	ShowHide.getPairs(t);
					pairz.each(function(pair){
						if (pair.id!=t.id && ShowHide.states[pair.id]==false){
								ShowHide.showHide(pair.id);
						}
					});
					ShowHide.showHide(t.id);
			}	
		});
		Event.stop(event); 
		
	};

	ShowHide.getPairs = function(id){
		var result = [];
		var el = $(id);
		var classNames = el.classNames();
		classNames.each(function(className){
			if (className.indexOf('_pair')===0){
				var pairs = document.getElementsByClassName(className); 
				pairs.each(function(pair){
					result.push(pair);
				});
			}
		
		});
		return result;	
		
	};
	
	ShowHide.getLinksForPane = function(id){
		var result = [];
		var keys = Object.keys(ShowHide.bindings);
		keys.each(function(key){
			if (	ShowHide.bindings[key].indexOf(id)>=0){
				result.push(key);
			}
		});
		return result.uniq();
	};

	ShowHide.adjustHovering = function(id){
		var el = $(id);
		var symbols  = [];
		var toAdjust = [];
		var classNames = el.classNames();
		classNames.each(function(className){
			if (className.indexOf('_sh')===0){
				var trgts = document.getElementsByClassName(className); 
				trgts.each(function(trgt){
					if (trgt.hasClassName('hovering')){
						toAdjust.push(trgt);
					}
				});
			}
			
		});

		
		toAdjust.each(function(adj){
		var classNames = adj.classNames();
		var open = false;
		classNames.each(function(className){
			if (className.indexOf('_sh')===0){
				var trgts = document.getElementsByClassName(className); 
				trgts.each(function(trgt){
					if (trgt.hasClassName('showhide')){
						if (	ShowHide.states[trgt.id]==false){
							open = true;	
						}
					}
				});
			}
			});									
		if (open){
			if (!adj.hasClassName('_hovered')){
				Hovering.doHover(adj);
			}
			adj.addClassName('hover_disabled');
		}else{
			adj.removeClassName('hover_disabled');
					Hovering.doHover(adj);
		}
		});
	}
			
		
	ShowHide.showHide = function(id){

			if (ShowHide.states[id]==undefined){
				ShowHide.states[id] = true;
			}
	
			if (ShowHide.states[id]==false){
				ShowHide.states[id]=true;
			}else{
				ShowHide.states[id]=false;
			}
			
			
			ShowHide.adjustHovering(id);


			if (ShowHide.states[id]==false){
				    ShowHide.callCM(id);
					var url = Element.readAttribute($(id),'url'); 
	
					if (url && url!=''){
					if (!ShowHide.cached[id]){
						new Ajax.Request(url, { 
						method: 'get', asynchronous:false,
						onSuccess: function(transport) { 
							ShowHide.cache[id]=transport.responseText;
							ShowHide.cached[id] =  true;
						}
					
					});
				}	
				Element.update(id,ShowHide.cache[id]);
				ShowHide.linkFormValues();
				}
				new Effect.BlindDown(id, { queue: { position: 'end', scope: 'global'} });
				ShowHide.getLinksForPane(id).each(function(target){
						var onshow = document.getElementsByClassName('onshow',target)
						var onhide = document.getElementsByClassName('onhide',target)
						if ($(target).hasClassName('onshow')) onshow.push($(target));
						if ($(target).hasClassName('onhide')) onhide.push($(target));
						if (onhide) onhide.each(function(el){if (el)el.hide();});
						if (onshow) onshow.each(function(el){if (el)el.show();});
					});
				}
			if (ShowHide.states[id]==true){
				new Effect.BlindUp(id, { queue: { position: 'end', scope: 'global'} });
                ShowHide.hoverHighlighted(id);
				ShowHide.getLinksForPane(id).each(function(target){
					var onshow = document.getElementsByClassName('onshow',target)
					var onhide = document.getElementsByClassName('onhide',target)
					if ($(target).hasClassName('onshow')) onshow.push($(target));
					if ($(target).hasClassName('onhide')) onhide.push($(target));
					if (onhide) onhide.each(function(el){if (el)el.show();});
					if (onshow) onshow.each(function(el){if(el)el.hide();});
				});
			}
	};

     ShowHide.hoverHighlighted = function(id) {
         var el = $(id);
         var tariffBlock = el.up("div");
         tariffBlock.removeClassName('bb_tariffblock-hover');
     }

     ShowHide.callCM =  function(id){
                var href = location.href;
                //var interval = undefined;
                var productId = undefined;
                var tariffName = undefined;
                if (href.indexOf('tariffs')!=-1){
                    if (href.indexOf('18_months')!=-1){
                         interval = "18 months";
                    }
                    if (href.indexOf('24_months')!=-1){
                         interval = "24 months";
                    }
                    if (href.indexOf('12_months')!=-1){
                         interval = "12 months";
                    }
                    if (href.indexOf('sim_only')!=-1 ||href.indexOf('SIMONLY')!=-1){
                         interval = "SIM Only";
                    }
                    if (href.indexOf('Pay_and_Go')!=-1){
                         interval = "Pay and Go";
                    }
                    if (href.indexOf('pay_and_go/sim_only')!=-1){
                         interval = "Pay and Go Sim Only";
                    }
                } else {
                	return;
                }
                
                var element = $(id);
                
                var form = element.up('form');
          
                try {

                    if (form == null || form == 'undefined') {
                        console.log("undefined form element")
                        var forms = document.forms;
                        for (var j=0 ; j <  forms.length; j++){
                            var f = forms[j];
                            if (f.name != null && f.name.startsWith('tariffForm')){
                               form = f;
                               break;
                            }
                        }
                        
                    	productId = form.productId.value;
                        tariffName = form.tariffName.value;;
                    } else {

                        var textElement = form.down('h4');
                        if (textElement){
                        tariffName = textElement.innerHTML;
                        }
                        var formElements = form.getElements();
                        
                        productId = id.replace(/menu_block/,"")*1;
                        
                        for (var i=0 ; i <  formElements.length; i++){
                            var formElement = formElements[i];
                            if (formElement.name=='productId'){
                               productId =  formElement.getValue();
                            }
                        }
                    }                

                    if (productId && tariffName) {
                    	if (CM_SET_PRODUCT_FLAG) {
    	                	cmSetProduction();
    	                }
                        cmCreateProductviewTag(productId, "Tariff: "+tariffName+" "+TARIFF_INTERVAL, "shop-tariffs");
                    }

                } catch (err) {
                	console.log(err);
                }
                

     }


	ShowHide.changeHandler = function(evt){
			
			var target = Event.element(evt);
			var form = target.up('form');
			var inputs = form['boltonProductId'];
			var value ='';
			for (var i = 0 ; i < inputs.length; i++){
				var input = inputs[i];
				if (input.checked){
					value = input.nextSibling.nodeValue;
				}

			}
			//var value = Form.Element.getValue(input); 
			
			ShowHide.formBindings[form.id].each(function(item){
				$(item).update(value);
			});

			
	}
	
	ShowHide.formBindings= {};
	ShowHide.linkFormValues = function(){
		var linkedItems = document.getElementsByClassName('linktoform');
		var pattern = '_valueOf_(.*)';
		linkedItems.each(function(item){
			if (!item.id){
				item.id = ShowHide.getUniqId();
			}
			var classNames = $(item).classNames();
			classNames.each(function(className){
				className.gsub(pattern, function(match){
				var formName = match[1];
				if (!ShowHide.formBindings[formName]){
					ShowHide.formBindings[formName] = [];
				}
				ShowHide.formBindings[formName].push(item.id);
				
				var form = $(formName);
				var fistElement = form.findFirstElement();
				fistElement.setAttribute('default','true');

				if (!form.id){
					form.id = ShowHide.getUniqId();
				}
				Event.observe(formName,'change',ShowHide.changeHandler);
				});
			});
			
		});
	}
	
	Event.observe(window, 'load', function(ev) { 
		var hoverings = Hovering.collectHovering();
		hoverings.each(function(hovering){
			Hovering.apply(hovering.id,hovering.clsNames);	
		});
		ShowHide.initStates();
		ShowHide.initEventHandlers();	
		ShowHide.linkFormValues();
	});

	


