YAHOO.namespace("formhelp.panel");
YAHOO.namespace("formdate.calendar");

function c13() {
	var compositionId = '13';
	var editorHeight = 0;
	var objTopArr = {'label15':56,'label17':78,'label18':69,'label19':89,'label20':7,'label21':29,'label22':49,'label23':89,'label24':69,'label25':108,'label26':7,'label28':29,'label30':49};
	var sliderArr = Array(); 
	var errorLookup = new Array();
	
	this.resizeElements = function(sourceId, initialHeight) {
		var parent = document.getElementById(compositionId);
	}
	
	var getKeyData = function(e) {
        var key;
        var keychar;

        if (window.event) key = window.event.keyCode;
        else if (e) key = e.which;
        else return true;
        
        return {key: key, keyChar:String.fromCharCode(key)}
	}
	
	var validate = function(e, allowedChars) {
		var keyData = getKeyData(e);
		var key = keyData.key;
		var keyChar = keyData.keyChar;

        if ((key==null) || (key==0) || (key==8) || (key==9) || (key==13) || (key==27) ) return true;
        else if (allowedChars.indexOf(keyChar) > -1) return true;

        return false;		
	}
	        
    this.validLetter = function(e) {
    	return validate(e, this.getLetters());
    }
    
    this.validNumber = function(e, field, decimals, rangeFrom, rangeTo) {
		var keyData = getKeyData(e);
		var key = keyData.key;
		var keyChar = keyData.keyChar;
		var floatPos = field.value.indexOf(this.getFloatingPoint());
		var minusPos = field.value.indexOf('-');
    	var sStart = getSelectionStart(field);
    	var sEnd = getSelectionEnd(field);		
		
		if ((key==null) || (key==0) || (key==8) || (key==9) || (key==13) || (key==27) ) return true;

    	if (keyChar == this.getFloatingPoint()) {   		
    		if (decimals == 0 || floatPos != -1) return false;
    	}
		
		if (keyChar == '-' && sStart == 0 && minusPos == -1) {
			if (rangeFrom == '' || rangeFrom < 0) return true;
		}
		
		if (minusPos != -1 && sStart == 0) return false; 

    	var charAllowed = validate(e, '0123456789'+this.getFloatingPoint());
    	
    	if (charAllowed == true) {	    	
	    	if (sStart == sEnd && floatPos != -1) {
				var decimalCount =  field.value.length - floatPos;
				if (sStart > floatPos && decimalCount > decimals) return false;	    		
	    	}
	    	return true;	
    	}
    	
		return false;
    }
    
    var getSelectionStart = function(o) {
    	if (o.createTextRange) {
    		var r = document.selection.createRange().duplicate()
    		r.moveEnd('character', o.value.length)
    		if (r.text == '') return o.value.length
    		return o.value.lastIndexOf(r.text)
    	} else return o.selectionStart
    }

    var getSelectionEnd = function(o) {
    	if (o.createTextRange) {
    		var r = document.selection.createRange().duplicate()
    		r.moveStart('character', -o.value.length)
    		return r.text.length
    	} else return o.selectionEnd
    }
	
	this.addSlider = function(objId, vertical, size, rangeStart, rangeEnd, increment, startValue) {
		var topConstraint;
		
		var scaleFactor = (rangeEnd - rangeStart) / size;
		var tickSize = increment / scaleFactor;
		var offsetFromStart = 0;

		if (vertical == 1) {
			topConstraint = size;
			bottomConstraint = 0;
		} else {
			topConstraint = 0;
			bottomConstraint = size;
		}
		
		var slider = YAHOO.widget.Slider.getHorizSlider('sliderbg' + objId, 'sliderthumb'+objId, topConstraint, bottomConstraint, tickSize);
		slider.animate = false;
		
        slider.getRealValue = function() { 
            return Math.round((slider.getValue())* 1 * scaleFactor) + rangeStart;
        }			
		
		slider.subscribe("change", function(offsetFromStart) {
			document.getElementById('slider'+objId).value = slider.getRealValue();
		});
		
		document.getElementById('slider'+objId).value = slider.getRealValue();
		slider.setValue((startValue - rangeStart) / scaleFactor, true);
		
		sliderArr['slider'+objId] = {startValue:startValue,
									 rangeStart:rangeStart,
									 rangeEnd:rangeEnd,
									 scaleFactor:scaleFactor,
									 increment:increment,
									 slider:slider};
	}
	
	this.setSliderValue = function(obj, value) {
		var sItem = sliderArr[obj];
		sItem.slider.setValue((value - sItem.rangeStart) / sItem.scaleFactor, true);
	}
	
	this.getSliderValue = function(obj) {
		var sItem = sliderArr[obj];
		return Math.round((sItem.slider.getValue())* 1 * sItem.scaleFactor) + sItem.rangeStart;
	}
	
	this.setSliderOnChange = function(objId, callback) {
		sliderArr['slider'+objId].slider.subscribe("change", function(offsetFromStart) {
			callback();
		});
	}	
    
    this.addFormHelp = function(objId, objCssId, objZindex, activateType) {
    	var helpObj = new YAHOO.widget.Panel('formhelp'+objId+'_container', { width:'320px', visible:false, constraintoviewport:true } );
    	helpObj.beforeShowEvent.subscribe(function(){
    		document.getElementById('obj'+objId).style.zIndex = 9999;   
    	});
    	
    	helpObj.hideEvent.subscribe(function(){
            document.getElementById('obj'+objId).style.zIndex = objZindex;   
        }); 
    	   	
    	helpObj.render();           
		YAHOO.util.Event.addListener(objCssId, activateType, helpObj.show, helpObj, true);
    }
    
    this.addFormDate = function(objId, objCssId, objZindex, dateFormat) {

    	var calendar = new YAHOO.widget.Calendar(objCssId+'_calendar',objCssId+'_container', { title:this.localizeCalendarTitle(), close:true, navigator:true, iframe:true } );
        
        calendar.beforeShowEvent.subscribe(function(){
            document.getElementById('obj'+objId).style.zIndex = 9999;   
        });
        
        YAHOO.util.Event.addListener(objCssId+'_trigger', "click", calendar.show, calendar, true);
        calendar.selectEvent.subscribe(function(type,args,obj) {
            var dates = args[0];
            var date = dates[0];
            var year = date[0], month = date[1], day = date[2];

            var dateInput = document.getElementById(objCssId);
            dateInput.value = YAHOO.util.Date.format(new Date(year, month-1, day), {format: dateFormat});
            document.getElementById('obj'+objId).style.zIndex = objZindex;   
            calendar.hide();
        }, calendar, true);
		
		this.localizeCalendar(calendar);

        calendar.render();
    }
    
    var fireObjHeightChange = function(obj, objId, yVal) {
    	var basisTop = obj.offsetTop;
    	var basisBottom = basisTop + obj.offsetHeight;
		var parent = obj.parentNode;
		var parentOuterHeight = parent.offsetHeight;
		var parentTop = parent.offsetTop;
		var parentBottom = parentOuterHeight;
		var childs = obj.parentNode.childNodes;

		for (var i=0; i < childs.length; i++) {
			var currObj = childs[i];

			if (currObj.nodeType != 1) {
				continue;
			}

			var currObjId = currObj.getAttribute('id');
			if (currObjId == objId) {
				continue;
			}
			
			var currObjPosTop = currObj.offsetTop;
    		//if (currObjPosTop >= basisTop || objTopArr[currObjId] >= basisTop) {
			if (currObjPosTop >= basisTop) {
    			// calculate new top pos
    			var newTop = currObjPosTop + yVal;

    			//if (newTop <= objTopArr[currObjId] && newTop > 0) {
				if (newTop > 0) {
					currObj.style.top = newTop +'px';
				}
    		}

    		// check objects parent height   		
    		var elementBottom = currObj.offsetTop + currObj.offsetHeight;
    		if (elementBottom > parentBottom) {
    			var newMinHeight = elementBottom;
    			var yChange = newMinHeight - parentOuterHeight;
    			
    			// increase parents height
    			parent.style.height = newMinHeight +'px';
    			
    			fireObjHeightChange(parent, parent.getAttribute('id'), yChange);
    		}
		}
    }
    
    var showObject = function(objId) {
		var obj = document.getElementById(objId);
    	if (obj.style.visibility != 'visible') {
    		obj.style.visibility = 'visible';
    		
    		var yChange = obj.offsetHeight;
    		fireObjHeightChange(obj, objId, yChange);
    	}
    }
    
    var hideObject = function(objId) {
    	var obj = document.getElementById(objId);
    	if (obj.style.visibility != 'hidden') {
    		var yChange = -1 * obj.offsetHeight;
    		fireObjHeightChange(obj, objId, yChange);
    		
    		obj.style.visibility = 'hidden';
    	}
    }
    
/*
       var showObject = function(objId) {
		var obj = document.getElementById(objId);
    	if (obj.style.display != 'block') {
    		obj.style.display = 'block';
    		
    		var yChange = obj.offsetHeight;
    		fireObjHeightChange(obj, objId, yChange);
    	}
    }
    
    var hideObject = function(objId) {
    	var obj = document.getElementById(objId);
    	if (obj.style.display != 'none') {
    		var yChange = -1 * obj.offsetHeight;
    		fireObjHeightChange(obj, objId, yChange);
    		
    		obj.style.display = 'none';
    	}
    }
 */    
    
    this.checkObjHeight = function(objId, normHeight) {
		var obj = document.getElementById(objId);

    	if (obj.style.visibility != 'hidden' && obj.offsetHeight > normHeight) {
    		var yChange = obj.offsetHeight - normHeight;

    		fireObjHeightChange(obj, objId, yChange);
    	}
    }
    
    this.hasError = function(objId) {
    	return errorLookup[objId] == 1;
    }
    
    this.setObjError = function(objId) {
    	errorLookup[objId] = 1;
    }
    
    var replaceFloatingPoint = function(val) {
    	//TODO getFloatingPoint nutzen, ABER problem: . muss z.b. im regex escaped werden
    	return val.replace(/,/g, '.');
    }
    
    this.replaceThousandsep = function(objId) {
    	var ref = document.getElementById(objId);
    	var thousandSep = this.getThousandsep();
    	ref.value = ref.value.replace(new RegExp(thousandSep, 'g'), '');
    }
    
    this.addThousandSep = function(val) {
    	var thousandsep = this.getThousandsep();
    	var floatingPoint = this.getFloatingPoint();
    	var arr = val.split(floatingPoint);
    		
    	var number = arr[0];
    	var output = number;
    	if (number.length > 3) {
    		var mod = number.length % 3;
    		output = (mod > 0 ? (number.substring(0,mod)) : '');
    		for (i=0 ; i < Math.floor(number.length / 3); i++) {
	    		if ((mod == 0) && (i == 0)) {
	    			output += number.substring(mod+ 3 * i, mod + 3 * i + 3);
	    		} else {
		    		output += thousandsep + number.substring(mod + 3 * i, mod + 3 * i + 3);
	    		}
    		}
    	}

    	if (arr[1] != "") {
    		return output + floatingPoint + arr[1];
    	} else {
    		return output;
    	}
    }
    
    this.formatTextfield = function(objId, decimals, thousandsep) {
    	var ref = document.getElementById(objId);
    	this.replaceThousandsep(objId);
    	
    	var value = ref.value;
    	value = replaceFloatingPoint(value);
    	
    	var number = parseFloat(value);
    	if (isNaN(number)) {
    		return;
    	}
    	
    	var sValue = number.toFixed(decimals) + "";
    	if (thousandsep == 0) {
    		sValue = this.addThousandSep(sValue);
    	}
    	
    	ref.value = sValue;
    }
	
	    this.localizeCalendarTitle = function() {
		return 'Datum w&auml;hlen';
	}
	
	this.localizeCalendar = function(calendar) {
		calendar.cfg.setProperty("DATE_FIELD_DELIMITER", ".");

        calendar.cfg.setProperty("MDY_DAY_POSITION", 1);
        calendar.cfg.setProperty("MDY_MONTH_POSITION", 2);
        calendar.cfg.setProperty("MDY_YEAR_POSITION", 3);
        
        calendar.cfg.setProperty("MD_DAY_POSITION", 1);
        calendar.cfg.setProperty("MD_MONTH_POSITION", 2);
        
        calendar.cfg.setProperty("MONTHS_SHORT",   ["Jan", "Feb", "M\u00E4r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"]);
        calendar.cfg.setProperty("MONTHS_LONG",    ["Januar", "Februar", "M\u00E4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]);
        calendar.cfg.setProperty("WEEKDAYS_1CHAR", ["S", "M", "D", "M", "D", "F", "S"]);
        calendar.cfg.setProperty("WEEKDAYS_SHORT", ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]);
        calendar.cfg.setProperty("WEEKDAYS_MEDIUM",["Son", "Mon", "Die", "Mit", "Don", "Fre", "Sam"]);
        calendar.cfg.setProperty("WEEKDAYS_LONG",  ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"]);
    }
	
	this.getFloatingPoint = function() {
		return ',';
	}
	
	this.getThousandsep = function() {
		return '.';
	}	
	
	this.getLetters = function() {
		return 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ��������';
	}

	
	   
}

var c13 = new c13();

YAHOO.util.Event.onDOMReady(function() {

});
