﻿//+++++++++++++++++++++++++++++++++++++++++++++++++
//	2009, CommonTools
//	Andrey [Kee] Peskov, warhuman[at]mail.ru
//+++++++++++++++++++++++++++++++++++++++++++++++++

if(!kee){ var kee = {}; }
if(!kee.tool) { kee.tool = {}; }

kee.tool.maketag = function(tag){
  var ob = document.createElement(""+tag);
 	document.body.appendChild(ob);
	return ob;
}
kee.tool.bool = function(v) {
    v = (v || "").toString().toLowerCase();
    v = (v == 'true' || v == '1') ? true : (v == 'false' || v == '0') ? false : null;
    return v;
}
kee.tool.dig = function(str, prezero) {
    str = (str || "").toString();
    var n = new Number(str.replace(/[^0-9]/ig, ""));
    if (prezero == true) { n = (n < 10) ? "0" + n : n; }
    return n;
}



kee.tool.position = function(obj) {
    var parent = obj;
    var pose = { x: 0, y: kee.tool.dig(obj.offsetHeight), w: kee.tool.dig(obj.offsetWidth), h: kee.tool.dig(obj.offsetHeight) };
    while (parent.tagName.toUpperCase() != "BODY") {
        pose.x += parent.offsetLeft; pose.y += parent.offsetTop;
        if (parent.style.position.toUpperCase() == "ABSOLUTE") break;
        parent = parent.offsetParent;
    }
    return pose;
}
kee.tool.page = function() {
    var out = { ww: 0, wh: 0, w: 0, h: 0, sx: 0, sy: 0 }; //wind.width, wind.height, doc.width, doc.height, scroll.x, scroll.y
    var de = document.documentElement;
    var body = document.body;
    //window
    if (self.innerHeight) { out.ww = self.innerWidth; out.wh = self.innerHeight; } //expt.IEMac 
    else if (de && de.clientHeight) { out.ww = de.clientWidth; out.wh = de.clientHeight; } //IE6
    else if (body) { out.ww = body.clientWidth; out.wh = body.clientHeight; }
    //document
    if (window.innerHeight && window.scrollMaxY) { out.w = document.body.scrollWidth; out.h = window.innerHeight + window.scrollMaxY; }
    else if (body.scrollHeight > body.offsetHeight) { out.w = body.scrollWidth; out.h = body.scrollHeight; }
    else if (de && de.scrollHeight > de.offsetHeight) { out.w = de.scrollWidth; out.h = de.scrollHeight; }
    else { out.w = body.offsetWidth; out.h = body.offsetHeight; }
    out.w = (out.w < out.ww) ? out.ww : out.w;
    out.h = (out.h < out.wh) ? out.wh : out.h;
    //scroll
    if (window.pageYOffset) { out.sx = window.pageXOffset; out.sy = window.pageYOffset; } //expt.IEMac
    else if (body && (body.scrollLeft || body.scrollTop)) { out.sx = body.scrollLeft; out.sy = body.scrollTop; } //IE6
    else if (de && (de.scrollLeft || de.scrollTop)) { out.sx = de.scrollLeft; out.sy = de.scrollTop; }
    out.point = function(pos) {
        pos = (pos || "").toString().toUpperCase();
        var ps = { x: 0, y: 0 };
        switch (pos) {
            case "C": ps.x = parseInt(this.ww / 2) + this.sx; ps.y = parseInt(this.wh / 2) + this.sy; break;
            case "RT": ps.x = this.ww; ps.y = 0; break;
            case "RB": ps.x = this.ww; ps.y = this.wh; break;
            case "LB": ps.x = 0; ps.y = this.wh; break;
            default: ps.x = 0; ps.y = 0; break; //LT
        }
    }
    return out;
}

kee.tool.mouse = (function() {
    var mpoint = [0, 0];
    var started = false;

    var elm = false;
    var callbacks = [];

    //if (!started) { kee.tool.events.add(elm, 'mousemove', this.handle); this.started = true; }

    function handler(e) {
        e = (e) ? e : ((window.event) ? event : null);
        if (e.pageX) { x = e.pageX; y = e.pageY; }
        else if (e.clientX) {
            x = e.clientX + document.body.scrollLeft - document.body.clientLeft;
            y = e.clientY + document.body.scrollTop - document.body.clientTop;
        }
        this.mpoint = e.mpoint = [x, y];
        for (var i = 0; i < callbacks.length; i++) { eval(callbacks[i])(e); }
    }

    function addToCallback(f, remove) {
        remove = kee.tool.bool(remove || 'false');
        if (typeof f == 'function') {
            callbacks._splice(f);
            if (remove == false) { callbacks.push(f); }
        }

        if (callbacks.length > 0) {
            kee.tool.events.add(document, 'mousemove', handler);
        } else {
        }
    }

    var evt = {};
    evt.handle = function(e) {
    }
    evt.addcallback = function(f) { addToCallback(f); }
    evt.removecallback = function(f) { addToCallback(f, true); }
    return evt;
} ())




kee.tool.events = (function() {
    function fixme(e) {
        return e;
    }
    function handleme(e) {
        e = fixme(e);
    }
    var guid = 0;
    var evt = {};
    evt.add = function(elm, etype, handler) {
        if (elm.nodeType == 3 || elm.nodeType == 8) { return; }
        if (elm.setInterval && (elm != window && !elm.frameElement)) { elm = window; }
        if (!handler.guid) { handler.guid = ++guid; }
        if (!elm.elist) {
            elm.elist = {};
            elm.handle = function(e) { if (typeof (e) !== 'undefined') { return handleme.call(elm, e); } };
            //handle.elm = elm;
        }
        if (!elm.elist[etype]) {
            elm.elist[etype] = {};
            if (elm.addEventListener) { elm.addEventListener(etype, elm.handle, false); }
            else if (elem.attachEvent) { elem.attachEvent("on" + etype, elem.handle); }
        }
        elm.elist[etype][handler.guid] = handler;
    }
    evt.remove = function(elm, etype, handler) {
        var handlers = elm.elist && elm.elist[etype];
        if (!handlers || !handler.guid) { return; }
        delete handlers[handler.guid];
        for (var any in handlers) { return; }
        
    }

    return evt;
} ());




kee.tool.events2 = (function() {
    function fixme(e) {
        e = e || window.event;
        if (e.fixed) { return e; }
        e.fixed = true;
        e.preventDefault = e.preventDefault || function() { this.returnValue = false; }
        e.stopPropagation = e.stopPropagaton || function() { this.cancelBubble = true; }
        if (!e.target) { e.target = e.srcElement; }
        if (!e.relatedTarget && e.fromElement) { e.relatedTarget = e.fromElement == e.target ? e.toElement : e.fromElement; }
        if (e.pageX == null && e.clientX != null) { var p = kee.tool.page(); e.pageX = e.clientX + p.sx - (document.documentElement.clientLeft || 0); e.pageY = e.clientY + p.sy - (document.documentElement.clientTop || 0); }
        // which (IE) mouseButton: 1:left; 2:mid, 3:right
        if (!e.which && e.button) { e.which = (e.button & 1 ? 1 : (e.button & 2 ? 3 : (e.button & 4 ? 2 : 0))); }
        return e;
    }
    function handleme(e) {
        e = fixme(e);
        var handlers = this.eventslist[e.type];
        for (var g in handlers) {
            var handler = handlers[g];
            var ret = handler.call(this, e);
            if (ret === false) { e.preventDefault(); e.stopPropagation(); }
            if (e.enough) { break; } //way to immediate stop event
        }
    }
    var evid = 0;
    var evt = {};
    evt.add = function(elm, evtype, handler) {
        if (elm.nodeType == 3 || elm.nodeType == 8) { return; }
        if (elm.setInterval && (elm != window && !elm.frameElement)) { elm = window; }
        if (!handler.evid) { handler.evid = ++evid; }
        if (!elm.eventslist) { elm.eventslist = {}; }
        elm.handle = function(e) { if (typeof (e) !== 'undefined') { return handleme.call(elm, e); } };


        //handler.elm = elm;

        if (!elm.eventslist) {
            elm.eventslist = {};
            elm.handle = function(e) { if (typeof (e) !== 'undefined') { return handleme.call(elm, e); } };
            //elm.handle = function(e) { if (typeof (kee.tool.events) !== 'undefined') { return handleme.call(elm, e); } }; //typeof?
        }
        if (!elm.eventslist[type]) {
            elm.eventslist[type] = {};
            if (elm.addEventListener) { elm.addEventListener(type, elm.handle, false); }
            else if (elm.attachEvent) { elm.attachEvent("on" + type, elm.handle); }
        }
        elm.eventslist[type][handler.guid] = handler;
    }
    evt.remove = function(elm, type, handler) {
        //var handlers = elm.events && elm.events[type];
        //if (!handlers) return;
        //if (!handler) { for (var handle in handlers) { delete events[type][handle]; } return; }
        //delete handlers[handler.guid];
        //for (var any in handlers) return;
        if (elem.removeEventListener) { elem.removeEventListener(type, elem.handle, false); }
        else if (elem.detachEvent) { elem.detachEvent("on" + type, elem.handle) }
        delete elem.eventslist[type];
        //  for (var any in elem.events) return;
        //  delete elem.handle;
        //  delete elem.events;
    }
    return evt;
} ());



kee.tool.ies = function(){ return ((0/*@cc_on + 1@*/) ? true : false); };


kee.tool.enable_log = true;
kee.tool.inlabel = function(obj, str, isfocus){
var v = obj.value;
if (isfocus) { if (v == str) { obj.value = ''; obj.className = ''; } }
else { if (v == '') { obj.value = str; obj.className = 'shadow'; } } 
};

kee.tool.reimage = function(img, imgsrc){
	if(!img) return;
	if (!kee.tool.swaps) { kee.tool.swaps = 0; }
	if(!img.orig) { img.orig = img.src.toString(); }
	if(!img.count) { img.count = 0; }
	img.setAttribute('src',img.orig +"&rnd=" + img.count);
	img.count++;
};

kee.tool.o = function(nm) {
    var obj = nm;
    if (!!nm && typeof nm == 'string') { obj = document.getElementById("" + nm); }
    return (!obj || obj == 'undefined' || obj == null) ? {} : obj;
};

kee.tool.parents = function(ob,num) {
	num = new Number(num)||1;
	for (var i=0;i<num;i++){ if(ob!=null)ob = ob.parentNode; }
	return ob;
};

kee.tool.addHandler = function(object, event, handler) {
    alert("ATTEVNT: IE " + (typeof (object.attachEvent) != 'undefined'))
    if (typeof (object.addEventListener) != 'undefined') { object.addEventListener(event, handler, false); }
    else if (typeof (object.attachEvent) != 'undefined') {
    object.attachEvent('on' + event, handler);
    } else { throw "Events NOT supported"; }
};

kee.tool.removeHandler = function(object, event, handler){
    if (typeof (object.removeEventListener) != 'undefined') { object.removeEventListener(event, handler, false); }
    else if (typeof(object.detachEvent) != 'undefined') { object.detachEvent('on' + event, handler); }
    else { throw "Events NOT supported"; }
};

kee.tool.clone  = function(obj,withfunc,withsubobj) {    
	withfunc = (!withfunc)?false:true;
	withsubobj = (!withsubobj)?false:true;
	
	if (!obj ||('object' !== typeof(obj)))  { return obj; }
	var clon = ('function' === typeof(obj.pop)) ? [] : {};    
		var prop;
		var subobj;     
		for (prop in obj) { 
			if (typeof(obj[prop]) === 'function') { 
					if(withfunc == true) { clon[prop] = obj[prop]; } 
			}
			else {
			//else if (obj.hasOwnProperty(prop)) { //IE7 WTF??
				subobj = obj[prop];        
				if (subobj && 'object' === typeof(subobj)) { 
					if(withsubobj == true) { clon[prop] = kee.tool.clone(subobj); }
				}         
				else { clon[prop] = subobj; }      
			}
		}
	return clon;  
};

kee.tool.get_style = function(elm) {
	return elm.currentStyle||window.getComputedStyle(elm, null)
};

kee.tool.filterinput = function(obj, mark) {
	if(!obj) { return; }
	//kee.tool.addHandler(obj,"blur",this);
	mark = mark||"";
	mark = mark.toString().toLowerCase();
	var text=obj.value;
	switch (mark) {
		case "iterator": text=text.replace(/[^\d:,]/gi,'');	break;
		default: break;
	}
	obj.value=text;
	
};

kee.tool.DEBUG = function(obj, tab){
	tab = tab||1;
	var counter =0;
	var str="";
	for (a in obj){

		if(a.indexOf("_")>-1) {
			str += a + ": " + obj[a]+"\n";
		}else{
		
			if (typeof(obj[a]) === 'function') {str += "\n<F " + a + ">\n" + obj[a] + ""; counter = 0;} 
			else if (typeof(obj[a].pop) === 'function') {	
					var aa =obj[a]; 
					str += "\n<A " + a +">\n"; 
					for (var i=0;i<aa.length;i++) {	
						if(typeof(aa[i]) === 'object') { str += "[" + i +"] " + kee.tool.DEBUG(aa[i],tab) + ""; }
						else { str += "[" + i +"] " + aa[i]  + "\n"; }
					}
			counter = 0;	
			} 
			else if (typeof(obj[a]) === 'object') { var aa=obj[a];  str += "\n<O " + a + ">\n" + kee.tool.DEBUG(aa,tab) + ""; counter = 0; } 
			else { str += a + ": " + obj[a] + "\t\t"; counter++; }
			if(counter >= tab) { str+="\n"; counter = 0;}
		}

	}
	return str;
};

kee.tool.LOGG = function(lg) {
	if(!kee.tool.enable_log)return;
	var lid = "DEBUGGER_LOGG_STRINGS_INPUT_OBJECT";
	var logger = document.getElementById(lid);
	if(!logger) { 
		var t = document.createElement("textarea");
		t.id = lid;
		document.body.appendChild(t);
		t.style.width = "100%";
		t.style.height = "200px"; 
		kee.tool.LOGG(lg)
	} else{
		logger.value += "\n" + lg;
	}
};


String.prototype.toFirstCase = function(){
	return this.replace(this.charAt(1),this.charAt(1).toUpperCase());
};
String.prototype.toCamelCase = function(){
	return this.replace(/-\D/g, function(match){ return match.charAt(1).toUpperCase();	});
};
String.prototype.toDig = function(padZero){
	var n = new Number(this.replace(/[^0-9]/ig,""));
	if(!!padZero){ n = (n > 0 && n < 10) ? "0" + n : n; }
	return n;
};
String.prototype._style = function(elm,ext) {
	if(!elm) return '';
	if (typeof elm == 'string') elm = document.getElementById(elm);
	var ext = (!ext) ? this : (ext + '-' + this).toCamelCase();
	if (!!elm.style[ext]) return '' + elm.style[ext];	
	else return '';	
};
String.prototype._params = function(elm,ext) {
	if(!elm) return '';
	if (typeof elm == 'string') elm = document.getElementById(elm);
	var ext = (!ext) ? this : (ext + '-' + this).toCamelCase();
	if (!!elm[ext]) return '' + elm[ext];	
	else return '';	
};
String.prototype._scroll = function(elm) {
	return this._params(elm,'scroll').toDig();
};
String.prototype._offset = function(elm) {
	return this._params(elm,'offset').toDig();
};
String.prototype._actAsFunc = function(elm) {
	var f = this._params(elm);
	if (typeof f == 'function') return f;
	f = ("on" + this)._params(elm);
	if (typeof f == 'function') return f;
	return function(){ return false; };
};
String.prototype._trim = function() {
	return this.replace(/^\s+/,'').replace(/\s+$/,'');
};
Array.prototype._spliceid = function(aid){
	aid = kee.tool.dig(aid);
	var targ =[];
	for (var i=0; i<this.length; i++) {	
		if(i != aid) { targ.push(this[i]); } 
	}
	return targ;	
};
Array.prototype._splice = function(obj){
	if (!obj) { return this;  }
	var targ = [];
	for (var i=0; i<this.length; i++) {	
		if(this[i] !== obj) { targ.push(this[i]); } 
	}
	return targ;	
};
Array.prototype._copy = function(){
	var targ = [];
	for (var i=0; i < this.length; i++) {	targ.push(this[i]); }	
	return targ;
};

