﻿if(!kee) { kee ={}; }
if(!kee.morph) {
	kee.morph = {
		ids	: {},
		step	: 3,
		delay	: 1, // ms
		timer	: null
	};
}

kee.morph.set_morph = function(elm, dim, val, vector) {
	if (typeof elm == 'string') elm = document.getElementById(elm);
	if (vector < 0) elm.style.overflow = 'hidden';
	elm.style.display = (val <= 1)? 'none' : 'block';
	elm.style[dim] = val + "px";
	//if (val > 1) elm.style.overflow = 'none';
}


kee.morph._do = function(sender, divid, dim, from, to, callback) {
	//if(from == -1){from = dim._scroll(divid)};
	//if(to == -1) { to = dim._scroll(divid)};
}


kee.morph._go_v_collapsar = function(sender, divid, collapsed){
var from = 0; 
var to = 500; 
var duration = 300; 

	if (typeof sender == 'string') sender = document.getElementById(sender);
	if (typeof divid == 'string') divid = document.getElementById(divid);
	if (!sender.state)  sender.state = (collapsed) ? "0" : "1";
	if (sender.state == "0") { 
	  	kee.morph.set_morph(divid, 'height', 2, 1)
			from = 'height'._offset(divid); to = 'height'._scroll(divid); 
	}
	else { from = 'height'._scroll(divid); to = 0;	}
	sender.state = (sender.state == "0") ? "1" : "0";
	
	var start = Math.floor(new Date().getTime());
	var intv = setInterval(function() {
    now = Math.floor((new Date().getTime()) - start); 
    
		var vector = from > to ? -1 : from == to ? 0 : 1;
    var progress = now / duration; 
    var result = (to - from) * kee.morph._fx(progress, "sin", false) + from;
    result = Math.ceil(result);
		if (result < 0) result = 0;

		if ((progress < 1)) {
 	  	kee.morph.set_morph(divid, 'height', result, vector)
		}else{
			clearInterval(intv);
 	  	kee.morph.set_morph(divid, 'height', to, vector)
			if (sender.state == "1") { kee.morph._isexpanded_callback(sender); }
			else { kee.morph._iscollapsed_callback(sender); }
		} 
	}, 1);

return false;
}

kee.morph._fx = function(val, eff_name, revert, param){
	revert = revert||false;
	eff_name = eff_name||"";
	var out = val;
	switch(eff_name){
				case "quad": 	out = Math.pow(out, param); break; 
    		case "sin": 	out = 1 - Math.sin((1 - out) * Math.PI/2); break;
   			case "arch": 	out = Math.pow(out, 2) * ((param + 1) * out - param); break;
				case "circ": 	out = 1 - Math.sin(Math.acos(out)); break; 
				case "bounce":  for(var a = 0, b = 1, out; 1; a += b, b /= 2) { if (out >= (7 - 4 * a) / 11){ out = -Math.pow((11 - 6 * a - 11 * out) / 4, 2) + Math.pow(b, 2); } }; break;
     		case "elastic":  out = Math.pow(2,10 * (out - 1)) * Math.cos(20 * out * Math.PI * param / 3); break;
				default: break; //linear
	}
	return (revert)?1 - out:out;
}

kee.morph._still = function(elm,prop){
	if (typeof elm == 'string') elm = document.getElementById(elm);
	prop = prop || "";
	var onprop = "on" + prop;
	if (typeof elm[prop] == 'function') {	return elm[prop]();	}
	else if (typeof elm["on" + prop] == 'function') {	return elm[onprop]();	}
	else{	return false;	}
}
kee.morph._iscollapsed_callback = function(sender) {
	if(typeof sender.src == 'string') sender.setAttribute("src",sender["bton"].toString()); 
	//sender.state = "0";

}
kee.morph._isexpanded_callback = function(sender) {
	if(typeof sender.src == 'string') sender.setAttribute("src",sender["btoff"].toString()); 
	//sender.state = "1";
	//if(typeof sender.src != 'undefined') sender.src = sender.btoff; 
}















kee.morph._do_old = function(sender, divid, dim, from, to, callback) {
	if(from == -1){from = dim._scroll(divid)};
	if(to == -1) { to = dim._scroll(divid)};
	var vector = from > to ? -1 : from == to ? 0 : 1;
	from = from + this.step * vector;
	if (from < 0) from = 0;
	
	this.set_morph(divid, dim, from, vector);
	clearTimeout(this.timer);
	
	if (vector * from >= vector * to) {
		if(!!callback) eval(callback)(sender);
	} else {
			this.timer = setTimeout( function(){ kee.morph._do(sender, divid, dim, from, to, callback) }, this.delay);
	}
}
kee.morph._go_v_collapsar_ = function(sender, divid, collapsed){
	if (!sender.state) sender.state = (collapsed == true)? "0" : "1";
	//kee.tool.LOGG( sender.state )
	if (sender.state == "0") 	{ 
		document.getElementById(divid).style.display = 'block';
		
		sender.state = "1"; kee.morph._do(sender, divid, 'height', 0, -1, 'kee.morph._isexpanded_callback'); }
	else 											{ sender.state = "0"; kee.morph._do(sender, divid, 'height', -1, 0, 'kee.morph._iscollapsed_callback'); }
	return false;  
}




kee.morph._go_h_collapsar = function(sender, divid, state){
	kee.morph._do(sender, divid, 'height', -1, 0);
	return false;  
}
kee.morph._go_2d_collapsar = function(sender, divid, state){
	kee.morph._do(sender, divid, 'height', -1, 0, kee.morph._do(sender, divid, 'width', -1, 0));
	return false;  
}




