/* Function chain obj */

if (Object.isUndefined(hwam)) { var hwam = {}; }

hwam.FunctionChain = Class.create({

	log: function(str) {
		//console.debug('FunctionChain['+this.name+']: '+str);
	},

	initialize: function(name,options) {
		this.options = Object.extend({
			defaultPriority:	50
		},options || {});
		this.name = name;
		this._chain = [];
		this.executed = false;
	},
	
	addFunction: function(fn,name,priority) {
		if (this.executed) {
			this.log('Error: addFunction() after chain execution!');
			return false;
		}
		if (undefined===name) {
			name = 'Function #'+this._chain.length;
		}
		if (undefined===priority) {
			priority = this.options.defaultPriority;
		}
		this._chain.push({
			'fn':		fn,
			'name':		name,
			'priority':	priority
		});
	},
	
	executeChain: function() {
		var i=0;
		this.log('Begins');
		this._chain.sortBy(function(item){ return item.priority; }).each((function(item) {
			var identity = item.name+' (Priority '+item.priority+') ';
			var ok = true;
			try {
				item.fn();
			}
			catch (ex) {
				this.log(identity+'Failed: '+ex.message);
				ok = false;
			}
			if (ok) {
				this.log(identity+'Successful');
			}
		}).bind(this));
		this.executed = true;
		this.log('Ends');
	},
	
	hasBeenExecuted: function() {
		return this.executed;
	}
});

/* Chains setup */

var chainDomLoaded = new hwam.FunctionChain('domLoaded');
var chainWindowLoaded = new hwam.FunctionChain('windowLoaded');

document.observe('dom:loaded', chainDomLoaded.executeChain.bind(chainDomLoaded));
Event.observe(window, 'load', chainWindowLoaded.executeChain.bind(chainWindowLoaded));

/*** hover states  ***/

var HoverObserver = Class.create({
	initialize: function(options) {
		this.options = Object.extend({
			'elementSelector':		'.hoverthis',
			'className':			'hover',
			'clickName':			'click',
			'startEvent':			'mouseenter',
			'stopEvent':			'mouseleave',
			'downEvent':			'mousedown',
			'upEvent':				'mouseup'
		},options || {});
		var elements = 0;
		$$(this.options.elementSelector).each(function(element){
			Event.observe(element, this.options.startEvent, this.onStart.bindAsEventListener(this,element));
			Event.observe(element, this.options.stopEvent, this.onStop.bindAsEventListener(this,element));
			Event.observe(element, this.options.downEvent, this.onDown.bindAsEventListener(this,element));
			Event.observe(element, this.options.upEvent, this.onUp.bindAsEventListener(this,element));
			elements++;
		},this);
	},
	onStart: function(event,element) { element.addClassName(this.options.className); },
	onDown: function(event,element) { element.addClassName(this.options.clickName); },
	onUp: function(event,element) { element.removeClassName(this.options.clickName); },
	onStop: function(event,element) { element.removeClassName(this.options.className); }
});

chainWindowLoaded.addFunction(function(){
	// Observe mouse-enter/leave
	function addHover(){
		new HoverObserver();
	};
	addHover.delay(1.5);
},'HoverObserver',999);

/* miscellaneous  */
function createCookie(value)
{

days = 365;
name = "hwam_2011_lang"

	if (days)
	{
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}


// Load any page to target in DOM
var ajaxload = Class.create({
    initialize: function () {
    // set up the class
    },
    load: function (pId, target, pType, place) {
    
    // code to execute - insert content
        var newTarget = $(target);
        Element.extend(newTarget);
        newTarget.addClassName('pending');
        // code to execute - show
        new Ajax.Request(pId, {
            method: pType,
            onSuccess: function (transport) {
                var response = transport.responseText || "Siden svarer ikke - prøv venligst igen!";
                // update status
                if (place =='top'){ newTarget.insert({ top: response }).addClassName('done'); } else { newTarget.insert({ bottom: response }).addClassName('done'); }
                newTarget.removeClassName('pending');
            },
            onFailure: function (transport) {
            	var response = "<div style='display:none;'>This element is currently not available</div>";
            	 if (404 == transport.status) {
                	var response = "<div style='display:none;'>This page ("+pId+") is currently not available</div>";
                } 
                // update status
                newTarget.insert(response).addClassName('fail');
                newTarget.removeClassName('pending');
            }
        });
    }
});

var loadElement = new ajaxload();

// Move Variants
var VariantObserver = Class.create({
	initialize: function(options) {
		var maxnumber = ($$('#varList li').size()*226)-226;
		switch($$('#varList li').size())
        {
        case 1:
          $('varSlideLeft').hide();$('varSlideRight').hide(); 
          break;
        case 0:
          $('variants').hide();
          break;
        default:
          $('vartitle').insert('('+ $$('#varList li').size() + ')');
      		if (maxnumber == 0) { $('varSlideRight').addClassName('off'); }
      		$('varSlideLeft').addClassName('off');
      		$('varSlideRight').observe('click', function (e) {
      			var item = new Element.Layout($('varList'));
      			var itemPos = item.get('left');
      			if (itemPos <= 0 && itemPos > maxnumber*-1 && maxnumber >= 226) { new Effect.Move('varList', { x: -226, mode: 'relative', queue: { position: 'end', scope: 'variantslides', limit: 1 } }); $('varSlideLeft').removeClassName('off'); }	
      			if (itemPos == ((maxnumber-226)*-1)) { $('varSlideRight').addClassName('off'); }
      		},'varslideright', 888);
      		$('varSlideLeft').observe('click', function (e) {
      		var item = new Element.Layout($('varList'));
      			var itemPos = item.get('left');
      			if (itemPos < 0) { new Effect.Move('varList', { x: 226, mode: 'relative', queue: { position: 'end', scope: 'variantslides', limit: 1 } }); $('varSlideRight').removeClassName('off'); }
      			if (itemPos == -226) { $('varSlideLeft').addClassName('off'); }
      		},'varslideleft', 888);
        }
	}
});

// Move Accessories
var AccessObserver = Class.create({
	initialize: function(options) {
		var maxnumber = ($$('#accList li').size()*226)-226;
       switch($$('#accList li').size())
        {
        case 1:
          $('accSlideLeft').hide();$('accSlideRight').hide(); 
          break;
        case 0:
          $('accessories').hide();
          break;
        default:
            $('acctitle').insert('('+ $$('#accList li').size() + ')');
            if (maxnumber == 0) { $('accSlideRight').addClassName('off'); }
            $('accSlideLeft').addClassName('off');
            $('accSlideRight').observe('click', function (e) {
              var item = new Element.Layout($('accList'));
              var itemPos = item.get('left');
              if (itemPos <= 0 && itemPos > maxnumber*-1 && maxnumber >= 226) { new Effect.Move('accList', { x: -226, mode: 'relative', queue: { position: 'end', scope: 'accslides', limit: 1 } }); $('accSlideLeft').removeClassName('off'); }	
              if (itemPos == ((maxnumber-226)*-1)) { $('accSlideRight').addClassName('off'); }
            },'accslideright', 888);
            $('accSlideLeft').observe('click', function (e) {
            var item = new Element.Layout($('accList'));
              var itemPos = item.get('left');
              if (itemPos < 0) { new Effect.Move('accList', { x: 226, mode: 'relative', queue: { position: 'end', scope: 'accslides', limit: 1 } }); $('accSlideRight').removeClassName('off'); }
              if (itemPos == -226) { $('accSlideLeft').addClassName('off'); }
            },'accslideleft', 888);
        }
    }
});

// Facebook link
chainDomLoaded.addFunction(function(){
	$('facebooklink').observe('click', function (e) {
		document.location = 'http://www.facebook.com/pages/HWAM-AS/122105934469366';
	},'facebook', 888);
},'facebooklink',999);

// Overlay
var overlay = Class.create({
    initialize: function (options) {
		// set up the class
		this.options = Object.extend({
			'oOrigin':		'',
			'oName':		'',
			'oWidth':		'',
			'oHeight':		'',
			'oLoad':		'',
			'oPosx':		'',
			'oPosy':		'',
			'pageHeight':	''
		},options || {});
    },
    createNew: function (setOrigin, setName, setWidth, setHeight, setPosx, setPosy, setLoad, setTrigger) {
    // setup overlay
    	if($(setName) == undefined) {
	    	this.options.oOrigin = $(setOrigin);
	    	this.options.oName = setName;
	    	this.options.oWidth = setWidth;
	    	this.options.oHeight = setHeight;
	    	this.options.oLoad = setLoad;
	    	this.options.pageHeight = $('outer').getStyle('height');
	    	(setPosx!='')? this.options.oPosx = setPosx : this.options.oPosx = '';
	    	(setPosy!='')? this.options.oPosy = setPosy : this.options.oPosy = '';
	    	//this.options.oPosy = -1.5*(setPosy/3);

			$(this.options.oOrigin).insert({
				top: new Element('div', {style:'height:'+this.options.pageHeight+';',id:'tone_'+this.options.oName, 'class':'overlaybg'}).update(" ")
			});

			$('tone_'+this.options.oName).insert({
				top: new Element('div', {style:'width:'+this.options.oWidth+'px;min-height:'+this.options.oHeight+'px;', id:this.options.oName, 'class': 'wrapcontent'})
			});

			var div1 = new Element('div', { 'class':'wrapout' });
			var div2 = new Element('div', { 'class':'wrapin' });
			var div3 = new Element('div', { 'class':'overlay',style:'top:'+this.options.oPosy+'px;width:'+(this.options.oWidth+50)+'px;', id:this.options.oName+'_overlay' });
			var div4 = new Element('div', { 'class':'wrapoutright' });
			$(this.options.oName).wrap(div2).wrap(div1).wrap(div4).wrap(div3);

			$(this.options.oName).insert({
				bottom: new Element('div', { 'class':'wrapclose', id: this.options.oName+'_close' })
			});
			// load this page with AJAX
			this.loadTarget();
			$(this.options.oName+'_close').observe('click',this.kill.bind(this));
			
		}
    },
    loadTarget: function () {
		loadElement.load(this.options.oLoad, this.options.oName, 'get', 'top');
    },
    kill: function () {
	    // kill overlay
	    $(this.options.oName+'_overlay').remove();
	    $('tone_'+this.options.oName).remove();
    }
});

var overlays = new overlay();

// Custom google tracking
document.observe("custom:googletrack", function(event) {
	//console.log('tracking: ' + event.memo.eventtype +'/'+ event.memo.url +'/'+ event.memo.btnname +'/'+ event.memo.label);
	switch(event.memo.eventtype)
	{
	case 'click':
		_gaq.push(['_trackEvent', event.memo.btnname, 'clicked', event.memo.label]);
		try{ 
			//console.log('tracked: ' + event.memo.btnname + ' - ' +event.memo.label);
		}
		catch(e){}
	  break;
	case 'page':
		_gaq.push(['_trackPageview', event.memo.url]);
		try{ 
			//console.log('tracked: ' + event.memo.url);
		}
		catch(e){}
	  break;
	}
});

// Cost calculator
hwam.Calculator = Class.create({
    initialize: function (name,house_size,heating_percent,house_insulation,price_energy,energy_wood,price_wood,price_stove,options) {
		// set up the class
		this.options = Object.extend({
			'house_size':		$(house_size),
			'heating_percent':	$(heating_percent),
			'house_insulation':	$(house_insulation),
			'price_energy':		$(price_energy),
			'energy_wood':		$(energy_wood),
			'price_wood':		$(price_wood),
			'price_stove':		$(price_stove),
			'name':				name
		},options || {});
		//console.log('['+this.options.name +'] initialized!');
    },
    Calculate: function () {
    		//console.log('['+this.options.name +'] calculating!');
		storrelse_calc = this.options.house_size.getValue(); // husstørrelse
		isolering_calc = this.options.house_insulation.getValue(); // isoleringsværdi
		forbrug_calc = storrelse_calc*isolering_calc; // varmeforbrug
		varmeform_calc = this.options.price_energy.getValue(); // varmeform-omkostninger pr. enhed
		varmeudgift_calc = varmeform_calc*forbrug_calc; // varmeomkostninger u. ovn
			//console.log(this.options.name +' tracked varmeudgift_calc: ' + varmeudgift_calc);
		procentsats_calc = this.options.heating_percent.getValue(); // procent af varmebehov dækket af ovn
		fyringstype_calc = this.options.energy_wood.getValue(); // brændets fyringsværdi
		enhedspris_input_calc = this.options.price_wood.getValue(); // brændets enhedspris
			//console.log(this.options.name +' tracked varmeudgift_calc: ' + procentsats_calc + '/' + fyringstype_calc+ '/' + enhedspris_input_calc);
		brand_udgift_calc = ((procentsats_calc*forbrug_calc)/fyringstype_calc)*enhedspris_input_calc; // varmeomkostninger for ovnens andel af opvarmningen
			//console.log(this.options.name +' tracked brand_udgift_calc: ' + brand_udgift_calc);
		besparelse_calc = (procentsats_calc*varmeudgift_calc)-(brand_udgift_calc); // pris for andel af opvarmning minus pris for tilsvarende ovn-varme
			//console.log(this.options.name +' tracked: ' + besparelse_calc);
		
		// show results
		var barWidthIndex = varmeudgift_calc.toFixed(0)/671; // org. varmeudgift fordelt på 671 pixels
			//console.log(this.options.name +' barWidthIndex: ' + barWidthIndex);
		
		// Update numbers 
		$('g1_camt').update(varmeudgift_calc.toFixed(0)); // normal udgift
		//$('g2_samt').update((besparelse_calc*0.7).toFixed(0)); // anden ovn besparelse
		$('g3_samt').update(besparelse_calc.toFixed(0)); // hwam besparelse

		//$('g2_camt').update(varmeudgift_calc.toFixed(0)-(besparelse_calc*0.7).toFixed(0)); // anden ovn udgift
		$('g3_camt').update(varmeudgift_calc.toFixed(0)-besparelse_calc.toFixed(0)); // hwam udgift
		
		// update graphs
		
		/* $('g2_cost').setStyle({
		  'width': 671-(((besparelse_calc*0.7)/barWidthIndex).toFixed(0))+'px'
		});  // anden ovn udgift
		$('g2_save').setStyle({
		  'width': ((besparelse_calc*0.7)/barWidthIndex).toFixed(0)+'px'
		});  // anden ovn besparelse */
		if (671-(((besparelse_calc)/barWidthIndex).toFixed(0)) <= 671) {
            $('g3_cost').setStyle({
                'width': 671-(((besparelse_calc)/barWidthIndex).toFixed(0))+'px'
            });  // hwam ovn udgift
		} else {
            $('g3_cost').setStyle({
                'width': '671px'
            });  // hwam ovn udgift
		}
		
		if (((besparelse_calc)/barWidthIndex).toFixed(0) > 0) {
      		$('g3_save').setStyle({
                'width': ((besparelse_calc)/barWidthIndex).toFixed(0)+'px'
      		});
      	} else {
		  $('g3_save').setStyle({
            'width': '0px'
		  });
		}  // hwam ovn besparelse
		
		// update texts
		$$('#price_energy_radio .selected').each(function(element){
				$('heattype1').update(element.innerHTML);
				//$('heattype2').update(element.innerHTML);
				$('heattype3').update(element.innerHTML);
		},this);
    },
    reset: function () {
	    // reset calculation
    }
});

// Wrap images
function wrapImages(selector){
	var itms = $$(selector);
	itms.each(function(element,index) {
	  var dimensions = element.getDimensions();
	  element.wrap('div', { 'class': 'image' }).insert("<div class='w1'><div class='w2'><div class='w3' style='"+'width:'+(dimensions.width+6)+'px;height:'+(dimensions.height+6)+'px;'+"'>&nbsp;</div></div></div>");
	  element.addClassName('vis');
	});
}

// index footer items
chainWindowLoaded.addFunction(function(){
	//wrap images in articles
	wrapImages('.article .alcol>img');
	wrapImages('.article .arcol>p img');
    wrapImages('.article .arcol>img');
	wrapImages('.article .alcol>p img');
	
},'articles',999);


