/*

    
 */  
var NorskDesignApplicationform = Class.create({

    pingIntervalHandle: null,

    initialize: function() {
		
		this.dirty = false;

		// Register all form elements
		this.elements = $$('form.ctform').first().getElements();
		
		this.elementValueArray = new Array();
		
		if (Object.isArray(this.elements)) {
			this.elements.each(function(element) {
				
				// Special handling for faktura elements, where address text-elements will show/hide depending on choice
				var elementname = element.readAttribute('name').replace('[]', '');
				
				
				switch (elementname) {
					case 'faktura':
						// Toggle the faktura elements when displaying the page
						checked = element.readAttribute('checked');
						if (checked == 'checked') {
							elementvalue = element.readAttribute('value');
							this.fakturaElementsToggle(elementvalue);
						}
						
						// Toggle the faktura elements at click
						element.observe('change', function(event) {
							elementvalue = event.element().readAttribute('value');
							this.fakturaElementsToggle(elementvalue);
						}.bindAsEventListener(this));
						
						break;
						
					case 'samarbeidspartnere-antall':
						elementvalue = element.getValue();
						this.samarbeidspartnereElementsToggle(elementvalue);
						
						element.observe('click', function(event) {
							elementvalue = event.element().value;
							this.samarbeidspartnereElementsToggle(elementvalue);
							
						}.bindAsEventListener(this));
						
						break;
				}
				
				// Register value of all elements in an array, for use with dirty-check later
				this.elementValueArray[element.identify()] = element.getValue();
				
				
			}.bind(this));
		}
		
		//console.log(this.elementValueArray);
		
		
        // Periodically check for dirty (changed) elements, save the application in the background
        this.dirtyPolling = new PeriodicalExecuter(function(pe) {
        	
        	//console.log("Starting dirty-polling");
        	
        	if (Object.isArray(this.elements)) {
    			this.elements.each(function(element) {
    				//console.log(element.identify() + " - " + element.getValue());
    				
    				if (element.getValue() != this.elementValueArray[element.identify()]) {
    					this.dirty = true;
    					this.elementValueArray[element.identify()] = element.getValue();
    				}
    				
    				
    			}.bind(this));
    			
    			
    			if (this.dirty) {
    				this.dirty = false;
    				
	    			//console.log("Found at least one element to be dirty, saving...");
					// Any element that is dirty, save the page and break out
					this.positionAutosavetext();
	        		$('autosavetext').show();
	        		
	        		serializedParams = $$('form.ctform').first().serialize(true);
	        		new Ajax.Request('/xmlhttprequest.php',
	        				{parameters: serializedParams,
	        				onSuccess: function(transport) {
	        					if (transport.responseText.length > 0) {
	        						$('autosavetext').hide();
			        			}
						    }
					});
				}

			}
        	
        	//console.log("Ending dirty-polling");
        	
        }.bindAsEventListener(this), 240);

        
        // For budget fields, give a subtotal and total
        $$('div.subtotal').each(function(element) {
        	this.sumRow(element);
        }.bind(this));
        
        $$('div.total').each(function(element) {
        	this.sumColumn(element);
        }.bind(this));
        
		this.pingIntervalHandle = new PeriodicalExecuter(function(pingpe) {
			var logoutMessage = "Du har blitt logget ut av systemet. Videre utfylling av skjema vil ikke bli lagret. Vennligst logg inn på nytt.";
			
			// set up an interval to check if user is still logged in
			new Ajax.Request('/xmlhttprequest.php', {
				parameters: {service: "application.login.ping"},
				method: 'get',
				onSuccess: function(transport) {
					var response = transport.responseText;
					if (response) {
						var responseJSON = response.evalJSON();
						if (responseJSON.loggedin != "indeed") {
							alert(logoutMessage);
							pingpe.stop();
							this.dirtyPolling.stop();
						}
					} else {
					    //alert(logoutMessage);
					    //pingpe.stop();
					    //this.dirtyPolling.stop();
					}
				},
				onFailure: function(transport) {
				    //alert(logoutMessage);
				    //pingpe.stop();
				    //this.dirtyPolling.stop();
				}
			});
		}.bind(this), 15);
    },
    
    sumRow: function(element) {
    	
    	elementID = element.identify();
    	
    	elementActualName = elementID.replace('subtotal-', '');
    	elementActualName = elementActualName.substring(0, elementActualName.length-1);
    	
    	//console.log(elementActualName);
    	columns = elementID.substring(elementID.length-1, elementID.length);
    	//console.log(columns);
    	
    	
    	subtotal = 0;
    	for (i=1; i<=columns; i++) {
    		
    		currentElement = elementActualName + i;
    		
    		
    		this.elements.each(function(el) {
    			if (currentElement == el.readAttribute('name')) {
    				if (parseInt(el.getValue()) == Number(el.getValue())) {
    					subtotal = subtotal + parseInt(el.getValue());
    				}
    				
    				
    				el.observe('change', function(event) {
    					this.sumRow(element);
    				}.bindAsEventListener(this));
    				
    			}
    			
    		}.bind(this));
    		
    	}
    	
    	element.update(subtotal);
    	
    },
    
    
    sumColumn: function(element) {
    	
    	total = 0;
    	
    	if (element.identify() == 'grandtotal') {
    		$$('div.subtotal').each(function(el) {
    			if (parseInt(el.innerHTML) == Number(el.innerHTML)) {
    				total = total + parseInt(el.innerHTML);
    			}
    		});
    	} else {
    	
	    	elementID = element.identify().replace('total-', '');
	    	this.elements.each(function(el) {
	    		elementname = el.readAttribute('name');
	    		if (elementname.substring(elementname.length-2, elementname.length) == '-'+elementID) {
	    			if (parseInt(el.getValue()) == Number(el.getValue())) {
	    				total = total + parseInt(el.getValue());
	    			}
	    			
	    			el.observe('change', function(event) {
						this.sumColumn(element);
						this.sumColumn($('grandtotal'));
					}.bindAsEventListener(this));
	    			
	    		}
	    		
	    	}.bind(this));
    	
    	}
    	
    	element.update(total);
    	
    },
    
    
    
    
    
    fakturaElementsToggle: function(elementvalue) {
    	if (elementvalue == 'Annen adresse') {
    		$('ctwebform-element-faktura-navn').show();
			$('ctwebform-element-faktura-firma').show();
			$('ctwebform-element-faktura-adresse').show();
			$('ctwebform-element-faktura-postnr').show();
			$('ctwebform-element-faktura-poststed').show();
    	} else {
    		$('ctwebform-element-faktura-navn').hide();
			$('ctwebform-element-faktura-firma').hide();
			$('ctwebform-element-faktura-adresse').hide();
			$('ctwebform-element-faktura-postnr').hide();
			$('ctwebform-element-faktura-poststed').hide();
    	}
    },   
    
    samarbeidspartnereElementsToggle: function(elementvalue) {
    	for (var j=0; j < 10; j++) {
            if (j > elementvalue) {
                $$("div[id^='ctwebform-element-samarbeidspartnere-" + j + "']").each(function(element) {
                    element.hide();
                });
            } else {
                $$("div[id^='ctwebform-element-samarbeidspartnere-" + j + "']").each(function(element) {
                    element.show();
                });
            }
        }
    },
    
    positionAutosavetext: function() {
		var viewportWidth = document.viewport.getWidth();
		var scrollOffsets = document.viewport.getScrollOffsets();
		var scrollOffsetLeft = scrollOffsets['left'];
		var scrollOffsetTop = scrollOffsets['top'];
		
		var topPosition = scrollOffsetTop;
		var leftPosition = parseInt(viewportWidth / 2) - 100;
		
		$('autosavetext').setStyle({top: topPosition+'px', left: leftPosition+'px'});
    }
    
    
    
    
    
});