// IE < 6 detection
Prototype.Browser.IE_LT_7 = /msie|MSIE 6/.test(navigator.userAgent);


// Extend Element
Element.addMethods({
	replaceClassName: function(element, name, replace) {
		element.removeClassName(name);
		element.addClassName(replace);
	},
	
	getRelParams: function(element) {
	
		return element.readAttribute('rel').evalJSON();
	
		var s = element.readAttribute('rel');
		if(s == null) {
		
			return {};
		}
		
		var i = s.split(';');
		var params = {};
		
		i.inject(params, (function(p, s) {
			var p = s.split(':');
			return params[p[0]] = p[1];
		}))
		
		return params;
	},
	
	getContents: function(element) {
		var c = '';
		while(element = element.down()) {
			c = element.data;
		}
	},
	
	getBorderH: function(element) {
		var sub = 0;
		var properties = ['border-left-width', 'border-right-width'];

		return properties.inject(0, function(sub, property) {
      var val = element.getStyle(property) || 0;
     	val = parseInt(val, 10) || 0;
      return (val === null) ? sub : sub + parseInt(val, 10);
    });
	},
	
	getBorderV: function(element) {
		var sub = 0;
		var properties = ['border-top-width', 'border-bottom-width'];

		return properties.inject(0, function(sub, property) {
      var val = element.getStyle(property) || 0;
     	val = parseInt(val, 10) || 0;
      return (val === null) ? sub : sub + parseInt(val, 10);
    });
	},
	
	getPaddingH: function(element) {
		var sub = 0;
		var properties = ['border-left-width', 'padding-left', 'padding-right', 'border-right-width'];

		return properties.inject(0, function(sub, property) {
      var val = element.getStyle(property) || 0;
     	val = parseInt(val, 10) || 0;
      return (val === null) ? sub : sub + parseInt(val, 10);
    });
	},
	
	getPaddingV: function(element) {
		var sub = 0;
		var properties = ['border-top-width', 'padding-top', 'padding-bottom', 'border-bottom-width'];

		return properties.inject(0, function(sub, property) {
      var val = element.getStyle(property) || 0;
     	val = parseInt(val, 10) || 0;
      return (val === null) ? sub : sub + parseInt(val, 10);
    });
	}, 
	
	getMarginH: function(element) {
		var sub = 0;
		var properties = ['margin-left', 'margin-right'];

		return properties.inject(0, function(sub, property) {
      var val = element.getStyle(property) || 0;
     	val = parseInt(val, 10) || 0;
      return (val === null) ? sub : sub + parseInt(val, 10);
    });
	}, 
	
	getMarginLeft: function(element) {
		var sub = 0;
		var properties = ['margin-left'];

		return properties.inject(0, function(sub, property) {
      var val = element.getStyle(property) || 0;
     	val = parseInt(val, 10) || 0;
      return (val === null) ? sub : sub + parseInt(val, 10);
    });
	},
	
	getMarginRight: function(element) {
		var sub = 0;
		var properties = ['margin-right'];

		return properties.inject(0, function(sub, property) {
      var val = element.getStyle(property) || 0;
     	val = parseInt(val, 10) || 0;
      return (val === null) ? sub : sub + parseInt(val, 10);
    });
	},
	
	getMarginV: function(element) {
		var sub = 0;
		var properties = ['margin-top', 'margin-bottom'];

		return properties.inject(0, function(sub, property) {
      var val = element.getStyle(property) || 0;
     	val = parseInt(val, 10) || 0;
      return (val === null) ? sub : sub + parseInt(val, 10);
    });
	},
	
	getMarginTop: function(element) {
		var sub = 0;
		var properties = ['margin-top'];

		return properties.inject(0, function(sub, property) {
      var val = element.getStyle(property) || 0;
     	val = parseInt(val, 10) || 0;
      return (val === null) ? sub : sub + parseInt(val, 10);
    });
	},
	
	getMarginBottom: function(element) {
		var sub = 0;
		var properties = ['margin-bottom'];

		return properties.inject(0, function(sub, property) {
      var val = element.getStyle(property) || 0;
     	val = parseInt(val, 10) || 0;
      return (val === null) ? sub : sub + parseInt(val, 10);
    });
	},
	
	center: function(element, visual) {
		var vH = document.viewport.getHeight();
		var vW = document.viewport.getWidth();
		
		var top = Math.floor((vH / 2) - (element.getHeight() / 2));
		
		if(element.getStyle('position') != 'fixed') {
			top = top + document.viewport.getScrollOffsets().top;
		}
		
		if(visual) {
			top = Math.floor(top * 0.85)
		}
		element.setTop((top < 10) ? 10: top);
		element.setLeft(Math.floor(vW / 2) - Math.floor(element.getWidth() / 2));
	},
	
	setHeight: function(element, height) {
		var sub = 0;
		var properties = ['border-top-width', 'padding-top', 'padding-bottom', 'border-bottom-width'];

		if(height == 'auto') {
			element.setStyle({
				height: 'auto'
			});
			return;
		}

		sub = properties.inject(0, function(sub, property) {
      var val = element.getStyle(property) || 0;
     	val = parseInt(val, 10) || 0;
      return (val === null) ? sub : sub + val;
    });
		element.setStyle({
			height: (height - sub) + 'px',
			maxHeight: (height - sub) + 'px'
		});
	},
	
	setWidth: function(element, width) {
		var sub = 0;
		var properties = ['border-left-width', 'padding-left', 'padding-right', 'border-right-width'];

		if(width == 'auto') {
			element.setStyle({
				width: 'auto'
			});
			return;
		} 

    sub = properties.inject(0, function(sub, property) {
      var val = element.getStyle(property) || 0;
     	val = parseInt(val, 10) || 0;
      return (val === null) ? sub : sub + parseInt(val, 10);
    });
		element.setStyle({
			width: (width - sub) + 'px',
			maxWidth: (width - sub) + 'px'
		});
	},
	
	setTop: function(element, pos) {
		if(!pos) { return; }

		element.setStyle({
			top: 0 + 'px',
			bottom: 'auto'
		});

		var m = document.getElementsByTagName('body')[0].getHeight();
		var vH = document.viewport.getHeight();
		var vW = document.viewport.getWidth();
		
		if(pos == 'center') {
			pos = Math.floor(vH / 2.5) - Math.floor(element.getHeight() / 2) + document.viewport.getScrollOffsets().top;
		}
		
		/*pos = (pos + element.getHeight() > (m - 10)) ? (m - 10 - element.getHeight()): pos;
		pos = (pos < 0) ? 10: pos;*/

		if(pos == 'auto') {
			element.setStyle({
				top: 'auto'
			});
		} else {
			element.setStyle({
				top: pos + 'px',
				bottom: 'auto'
			});
		}
	},
	
	setRight: function(element, pos) {
		if(!pos) { return; }

		if(pos == 'auto') {
			element.setStyle({
				right: 'auto'
			});
		} else {
			element.setStyle({
				right: pos + 'px',
				left: 'auto'
			});
		} 
	},
	
	setBottom: function(element, pos) {
		if(!pos) { return; }

		if(pos == 'auto') {
			element.setStyle({
				bottom: 'auto'
			});
		} else {
			element.setStyle({
				top: 'auto',
				bottom: 0 + 'px'
			}); 

			element.setStyle({
				top: 'auto',
				bottom: pos + 'px'
			});
		}
	},
	
	setLeft: function(element, pos) {
		if(!pos) { return; }

		var vH = document.viewport.getHeight();
		var vW = document.viewport.getWidth();

		if(pos == 'center') {
			pos = Math.floor(vW / 2) - Math.floor(element.getWidth() / 2);
		}
		
		if(pos == 'auto') {
			element.setStyle({
				left: 'auto'
			});
		} else {
			element.setStyle({
				right: 'auto',
				left: pos + 'px'
			});
		}
	},
		
	setPosition: function(element, point) {
		element.setTop(point.top);
		element.setLeft(point.left);
		if(point.top != 'center') {
			element.setBottom(point.bottom);
		}
		if(point.left != 'center') {
			element.setRight(point.right);
		}
	}
});


// Extend String
Object.extend(String.prototype, {
	colorToHex: function() {
		if(this.indexOf('rgb') == 0) {
			var m = this.match(/([0-9]{1,3})/g);
			
			return [new Number(m[0]), new Number(m[1]), new Number(m[2])].invoke('toColorPart').join('');
		} else if(this.indexOf('#') == 0) {
			var s = this.substring(1);
			
			return (s.length == 3) ? s + s: s;
		}
	},
	
	sanitize: function() {
		return this.replace(/([^a-z0-9]+)/g, '-').toLowerCase();
	}
});


// Extend Number
Object.extend(Number.prototype, {
	toFileSize: function(retstring) {
		// adapted from code at http://aidanlister.com/repos/v/function.size_readable.php
		var sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
		var size = this;
		
		if (!retstring) {
			retstring = '%01.2f %s';
		}
		
		lastsizestring = sizes.last();

		for(var i = 0; i < sizes.length; i++) {
			var sizestring = sizes[i];

			if (size < 1024) {
				break;
			}
			if (sizes[i] != lastsizestring) {
				size = (size / 1024);
			}
		}
		
		if(sizestring == sizes[0]) {
			retstring = '%01d %s';
		} else if((Math.floor(size) / 2) == (size / 2)) {
			retstring = '%01d %s';
		}

		return sprintf(retstring, size, sizestring);
	}
});


// Extend Ajax
Object.extend(Ajax.Request.prototype, {
	abort: function() {
		if(this.transport) {
			// prevent and state change callbacks from being issued
			this.transport.onreadystatechange = Prototype.emptyFunction;
		
			// abort the XHR
			this.transport.abort();
			// update the request counter
			Ajax.activeRequestCount--;
		}
	}
});


/* KeyCodes */
var KeyCodes = {

	eventHasModifierKey: function(event) {
		if((event.shiftKey) || (event.ctrlKey) || (event.altKey) || (event.metaKey)) {
			return true;
		}
		
		return false;
	},

	isAlpha: function(code) {
		return (this.alphaKeys.indexOf(code) > -1) ? true: false;
	},
	
	eventKeyIsAlpha: function(event) {
		var code = event.which || event.keyCode;
		if(code) {
			
			return this.isAlpha(code);
		}
		
		return false;
	},
	
	isNumber: function(code) {
		return (this.numberKeys.indexOf(code) > -1) ? true: false;
	},
	
	eventKeyIsNumber: function(event) {
		var code = event.which || event.keyCode;
		if(code) {
			
			return this.isNumber(code);
		}
		
		return false;
	},

	KEY_BACKSPACE: 8,
	KEY_TAB: 9,
	KEY_ENTER: 13,
	KEY_SHIFT: 16,
	KEY_CTRL: 17,
	KEY_ALT: 18,
	KEY_PAUSE_BREAK: 19,
	KEY_CAPS_LOCK: 20,
	KEY_ESCAPE: 27,
	KEY_PAGE_UP: 33,
	KEY_PAGE_DOWN: 34,
	KEY_END: 35,
	KEY_HOME: 36,
	KEY_LEFT_ARROW: 37,
	KEY_UP_ARROW: 38,
	KEY_RIGHT_ARROW: 39,
	KEY_DOWN_ARROW: 40,
	KEY_INSERT: 45,
	KEY_DELETE: 46,
	KEY_0: 48,
	KEY_1: 49,
	KEY_2: 50,
	KEY_3: 51,
	KEY_4: 52,
	KEY_5: 53,
	KEY_6: 54,
	KEY_7: 55,
	KEY_8: 56,
	KEY_9: 57,
	KEY_A: 65,
	KEY_B: 66,
	KEY_C: 67,
	KEY_D: 68,
	KEY_E: 69,
	KEY_F: 70,
	KEY_G: 71,
	KEY_H: 72,
	KEY_I: 73,
	KEY_J: 74,
	KEY_K: 75,
	KEY_L: 76,
	KEY_M: 77,
	KEY_N: 78,
	KEY_O: 79,
	KEY_P: 80,
	KEY_Q: 81,
	KEY_R: 82,
	KEY_S: 83,
	KEY_T: 84,
	KEY_U: 85,
	KEY_V: 86,
	KEY_W: 87,
	KEY_X: 88,
	KEY_Y: 89,
	KEY_Z: 90,
	KEY_LEFT_WINDOW_KEY: 91,
	KEY_RIGHT_WINDOW_KEY: 92,
	KEY_SELECT_KEY: 93,
	KEY_NUMPAD_0: 96,
	KEY_NUMPAD_1: 97,
	KEY_NUMPAD_2: 98,
	KEY_NUMPAD_3: 99,
	KEY_NUMPAD_4: 100,
	KEY_NUMPAD_5: 101,
	KEY_NUMPAD_6: 102,
	KEY_NUMPAD_7: 103,
	KEY_NUMPAD_8: 104,
	KEY_NUMPAD_9: 105,
	KEY_MULTIPLY: 106,
	KEY_ADD: 107,
	KEY_SUBTRACT: 109,
	KEY_DECIMAL_POINT: 110,
	KEY_DIVIDE: 111,
	KEY_F1: 112,
	KEY_F2: 113,
	KEY_F3: 114,
	KEY_F4: 115,
	KEY_F5: 116,
	KEY_F6: 117,
	KEY_F7: 118,
	KEY_F8: 119,
	KEY_F9: 120,
	KEY_F10: 121,
	KEY_F11: 122,
	KEY_F12: 123,
	KEY_NUM_LOCK: 144,
	KEY_SCROLL_LOCK: 145,
	KEY_SEMI_COLON: 186,
	KEY_EQUAL_SIGN: 187,
	KEY_COMMA: 188,
	KEY_DASH: 189,
	KEY_PERIOD: 190,
	KEY_FORWARD_SLASH: 191,
	KEY_GRAVE_ACCENT: 192,
	KEY_OPEN_BRACKET: 219,
	KEY_BACK_SLASH: 220,
	KEY_CLOSE_BRAKET: 221,
	KEY_SINGLE_QUOTE:	222
};

KeyCodes.numberKeys = [KeyCodes.KEY_0, KeyCodes.KEY_1, KeyCodes.KEY_2, KeyCodes.KEY_3, KeyCodes.KEY_4, KeyCodes.KEY_5, KeyCodes.KEY_6, KeyCodes.KEY_7, KeyCodes.KEY_8, KeyCodes.KEY_9, KeyCodes.KEY_NUMPAD_0, KeyCodes.KEY_NUMPAD_1, KeyCodes.KEY_NUMPAD_2, KeyCodes.KEY_NUMPAD_3, KeyCodes.KEY_NUMPAD_4, KeyCodes.KEY_NUMPAD_5, KeyCodes.KEY_NUMPAD_6, KeyCodes.KEY_NUMPAD_7, KeyCodes.KEY_NUMPAD_8, KeyCodes.KEY_NUMPAD_9];
KeyCodes.alphaKeys = [KeyCodes.KEY_A, KeyCodes.KEY_B, KeyCodes.KEY_C, KeyCodes.KEY_D, KeyCodes.KEY_E, KeyCodes.KEY_F, KeyCodes.KEY_G, KeyCodes.KEY_H, KeyCodes.KEY_I, KeyCodes.KEY_J, KeyCodes.KEY_K, KeyCodes.KEY_L, KeyCodes.KEY_M, KeyCodes.KEY_N, KeyCodes.KEY_O, KeyCodes.KEY_P, KeyCodes.KEY_Q, KeyCodes.KEY_R, KeyCodes.KEY_S, KeyCodes.KEY_T, KeyCodes.KEY_U, KeyCodes.KEY_V, KeyCodes.KEY_W, KeyCodes.KEY_X, KeyCodes.KEY_Y, KeyCodes.KEY_Z];


/* KeyCodeNames */ 
var KeyCodeNames = {
	8: 'Backspace',
	9: 'Tab',
	13: 'Enter',
	16: 'Shift',
	17: 'Ctrl',
	18: 'Alt',
	19: 'Pause break',
	20: 'Caps lock',
	27: 'Escape',
	33: 'Page up',
	34: 'Page down',
	35: 'End',
	36: 'Home',
	37: 'Left arrow',
	38: 'Up arrow',
	39: 'Right arrow',
	40: 'Down arrow',
	45: 'Insert',
	46: 'Delete',
	48: '0',
	49: '1',
	50: '2',
	51: '3',
	52: '4',
	53: '5',
	54: '6',
	55: '7',
	56: '8',
	57: '9',
	65: 'A',
	66: 'B',
	67: 'C',
	68: 'D',
	69: 'E',
	70: 'F',
	71: 'G',
	72: 'H',
	73: 'I',
	74: 'J',
	75: 'K',
	76: 'L',
	77: 'M',
	78: 'N',
	79: 'O',
	80: 'P',
	81: 'Q',
	82: 'R',
	83: 'S',
	84: 'T',
	85: 'U',
	86: 'V',
	87: 'W',
	88: 'X',
	89: 'Y',
	90: 'Z',
	91: 'Left window key',
	92: 'Right window key',
	93: 'Select key',
	96: 'Numpad 0',
	97: 'Numpad 1',
	98: 'Numpad 2',
	99: 'Numpad 3',
	100: 'Numpad 4',
	101: 'Numpad 5',
	102: 'Numpad 6',
	103: 'Numpad 7',
	104: 'Numpad 8',
	105: 'Numpad 9',
	106: 'Multiply',
	107: 'Add',
	109: 'Subtract',
	110: 'Decimal point',
	111: 'Divide',
	112: 'F1',
	113: 'F2',
	114: 'F3',
	115: 'F4',
	116: 'F5',
	117: 'F6',
	118: 'F7',
	119: 'F8',
	120: 'F9',
	121: 'F10',
	122: 'F11',
	123: 'F12',
	144: 'Num lock',
	145: 'Scroll lock',
	186: 'Semi colon',
	187: 'Equal sign',
	188: 'Comma',
	189: 'Dash',
	190: 'Period',
	191: 'Forward slash',
	192: 'Grave accent',
	219: 'Open bracket',
	220: 'Back slash',
	221: 'Close braket',
	222: 'Key single quote'
};


function createCookie(name,value,days) {
	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=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}


/* randomUUID.js - Version 1.0
 * 
 * Copyright 2008, Robert Kieffer
 * 
 * This software is made available under the terms of the Open Software License
 * v3.0 (available here: http://www.opensource.org/licenses/osl-3.0.php )
 *
 * The latest version of this file can be found at:
 * http://www.broofa.com/Tools/randomUUID.js
 *
 * For more information, or to comment on this, please go to:
 * http://www.broofa.com/blog/?p=151
 */

/**
 * Create and return a "version 4" RFC-4122 UUID string.
 */
function randomUUID() {
  var s = [], itoh = '0123456789ABCDEF';

  // Make array of random hex digits. The UUID only has 32 digits in it, but we
  // allocate an extra items to make room for the '-'s we'll be inserting.
  for (var i = 0; i < 36; i++) s[i] = Math.floor(Math.random()*0x10);

  // Conform to RFC-4122, section 4.4
  s[14] = 4;  // Set 4 high bits of time_high field to version
  s[19] = (s[19] & 0x3) | 0x8;  // Specify 2 high bits of clock sequence

  // Convert to hex chars
  for (var i = 0; i < 36; i++) s[i] = itoh[s[i]];

  // Insert '-'s
  s[8] = s[13] = s[18] = s[23] = '-';

  return s.join('');
}

/*
   Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work
   of Simon Willison (see comments by Simon below).
   License:
    My stuff is BSD licensed. Not sure about Simon's.
   More information:
   	http://ripcord.co.nz/behaviour/
*/
var Behaviour = {
	list : new Array,
	
	register : function(sheet){
		Behaviour.list.push(sheet);
	},
	
	start : function(){
		Behaviour.addLoadEvent(function(){
			Behaviour.apply();
		});
	},
	
	apply : function(){

		for (h=0;sheet=Behaviour.list[h];h++){
			for (selector in sheet){
				list = $$(selector);
				
				if (!list){
					continue;
				}

				for (i=0;element=list[i];i++){
					sheet[selector](element);
				}
			}
		}
	},
	
	applyToElement : function(el){

		for (h=0;sheet=Behaviour.list[h];h++){
			for (selector in sheet){
				list = el.getElementsBySelector(selector);

				if (!list){
					continue;
				}

				for (i=0;element=list[i];i++){
					sheet[selector](element);
				}
			}
		}
	},
	
	addLoadEvent : function(func){
		if((navigator.userAgent.indexOf('Firefox') > -1) && (top != window)) {
			// Firefox: dom:loaded wird in iFrame nicht ausgeloest 
			Event.observe(window, 'load',  func); 
		} else {
			Event.observe(document, 'dom:loaded',  func); 
		}
	}
}

Behaviour.start();
