/*                                                                CSV
-------------------------------------------------------------------*/
function CSV() {
	this.onLoad;
	
	var _xmlhttp    = undefined;
	var _onLoadFunc = undefined;
	var _parseObj   = undefined;
	var _useObject  = false;
	var _replaces   = [];
	
	var initialize = function() {
		_xmlhttp = createXmlHttp();
		_xmlhttp.onreadystatechange = onStateChangeHandler;
		_onLoadFunc = this.onLoad;
	};

	var onStateChangeHandler = function() {
		
		if (_xmlhttp.readyState == 4) {
			switch (_xmlhttp.status) {
			case 200 :
				var tmp = _xmlhttp.responseText;
				if (tmp=="") {
					_onLoadFunc( null );
					return;
				} else {
					tmp = convertResponseText(tmp);
					if (_replaces.length>0) {
						tmp = replace(tmp);
					}
					if (_parseObj != undefined) {
						if (_useObject) {
							tmp = parseToArrayAndObject(tmp);
						} else {
							tmp = parseToArray(tmp);
						}
					}
					_onLoadFunc( tmp );
				}
				break;
			default:
				_onLoadFunc(null);
			}
		}
	};

	this.load = function(path) {
		_xmlhttp = createXmlHttp();
		_xmlhttp.onreadystatechange = onStateChangeHandler;
		_onLoadFunc = this.onLoad;
	
		_xmlhttp.open("GET", path , true);
		_xmlhttp.send(null);
	};
	
	this.useParse = function(delimiter, CR) {
		_parseObj = {
			delimiter : delimiter,
			CR : CR
		};
	};
	
	this.useObject = function(bool) {
		_useObject = bool;
	};
	
	this.useReplace = function(search, replace) {
		_replaces.push({
			search  : search,
			replace : replace
		});
	};
	
	var createXmlHttp = function(){
		if (window.XMLHttpRequest) {
			return new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			try {
				return new ActiveXObject("Msxml2.XMLHTTP");
	  		} catch(e) {
				return new ActiveXObject("Microsoft.XMLHTTP");
			}
		} else {
			return null;
		}
	};
  
	var convertResponseText = function ( resText ) {
		var text = resText;
		if ( navigator.userAgent.toUpperCase().indexOf( "SAFARI" ) > -1 ) {
			var esc = escape( text );
			if ( esc.indexOf("%u") < 0 && esc.indexOf("%") > -1 ) {
				text = decodeURIComponent( esc );
			}
		}
		return text;
	};
	
	var replace = function(txt) {
		var tmp = txt;
		var size = _replaces.length;
		for (var i=0; i<size; i++) {
			tmp = tmp.split(_replaces[i].search).join(_replaces[i].replace);
		}
		return tmp;
	};
	
	var parseToArray = function(txt) {
		var arr = txt.split(_parseObj.CR);
		var rowsize = arr.length;
		var colsize = arr[0].split(_parseObj.delimiter).length;
		
		var result = [];
		for (var i=0 ; i<rowsize ; i++) {
			if (arr[i].length<1) continue;
			result[i] = [];
			var tmparr = arr[i].split(_parseObj.delimiter);
			for (var j=0 ; j<colsize ; j++) {
				result[i][j] = tmparr[j];
			}
		}
		return result;
	};
	
	var parseToArrayAndObject = function(txt) {
		var arr = txt.split(_parseObj.CR);
		var namelist = arr.shift().split(_parseObj.delimiter);
		var rowsize = arr.length;
		var colsize = namelist.length;
		var result = [];
		for (var i=0 ; i<rowsize ; i++) {
			if (arr[i].length<1) continue;
			var tmparr = arr[i].split(_parseObj.delimiter);
			result[i] = {};
			for (var j=0 ; j<colsize ; j++) {
				result[i][namelist[j]] = tmparr[j];
			}
		}
		return result;
	};
}


/*                                                      BrowseManager
-------------------------------------------------------------------*/
function BrowseManager() {
	var _path = window.location.href;
	var _file = _path.split('#')[0];

	this.permalink = function(params) {
		var href = _file;
		if (params.length>0) {
			href += '#'+params.join('/');
		}
		window.location.href = href;
	};

	this.getParams = function() {
		var path = window.location.href;
		var param = path.split('#')[1];
		return param ? param.split('/') : null;
	};
}

/*                                                           addEvent
-------------------------------------------------------------------*/
var addEvent = function(){
	if (window.attachEvent) {
		return function(element, eventType, func) {
			element.attachEvent('on'+eventType, function(){
				func.call(element, window.event);
			});
		}
	} else if (window.addEventListener) {
		return function(element, eventType, func) {
			element.addEventListener(eventType, func, false);
		};
	} else {
		return function(element, eventType, func) {
			element['on'+eventType] = func;
		};
	}
}();
