/* 
	### JavaScript KSF (KomondorStudio Framework) v1.0, 2010.04.30.

	[EN]
	Author: Ádám Bene - KomondorStudio Ltd.
	To use any part of this code without the written permission of the author is forbidden.

	[HU]
	Szerző: Bene Ádám - KomondorStudio Kft.
	A szerző írásbeli engedélye nélkül tilos a kód bárbely részletét felhasználni.
*/

//###böngésző

//NAV_UNDEFINED=NAV_UNDEF=
NAV_UNKNOWN=0;
NAV_IE=NAV_EXPLORER=1;
NAV_FIREFOX=2; 
NAV_CHROME=3;
NAV_SAFARI=4;
NAV_OPERA=5;
NAV_OTHER=6;

function getNavName(){
    return navigator.appName
}

function getNavVer(){
    var v=navigator.appVersion;
    var p=v.toLowerCase().indexOf('msie');
    if(p==-1)return v;
    v=parseFloat(v.substring(p+4,v.length));
    return v;
}

function getNav(){
    var v=navigator.appVersion;
    if(v.toLowerCase().indexOf('msie')!=-1)return NAV_IE;
    return NAV_UNKNOWN;
}

function isSupported(t) {//##folytatni...
    switch(t){
	case 'fixed':
	    if(getNav()==NAV_IE&&getNavVer()<7)return false;else return true;
	    break;
	default:
	    return -1;
    }
}

function isBrowser(b) {
    var s=navigator.userAgent.toLowerCase();
    if (s.indexOf(b.toLowerCase())!=-1) return true;
    return false;
}

//###ablak
function getWindowHeight() {
    return parseInt(self.innerHeight||document.documentElement.clientHeight);
}

function getWindowWidth() {
    return parseInt(self.innerWidth||document.documentElement.clientWidth);
}

function reload() {
    self.location+=''
}

function getTitle() {
    return document.getElementsByTagName('title')[0].text
}

//###lap

function getPageLeft() {
    if (window.pageXOffset) return parseInt(window.pageXOffset);
    else
    if (document.body&&document.body.scrollLeft)return parseInt(document.body.scrollLeft);
    else
    if (document.documentElement&&document.documentElement.scrollLeft)return parseInt(document.documentElement.scrollLeft);
    return 0;
}

function getPageTop() {
    if (window.pageYOffset) return parseInt(window.pageYOffset);
    else
    if (document.body&&document.body.scrollTop)return parseInt(document.body.scrollTop);
    else
    if (document.documentElement&&document.documentElement.scrollTop)return parseInt(document.documentElement.scrollTop);
    return 0;
}

function getPageHeight() {
    return parseInt(document.body.scrollHeight||document.body.offsetHeight)
}

function getPageWidth() {
    return parseInt(window.screen.availWidth||getWindowWidth())
}

//###elem

function getElementLeft(e) {
    if(!e)return false;
    var r = e.offsetLeft;
    var p = e.offsetParent;
    while (p) {
	r += p.offsetLeft;
	p = p.offsetParent;
    }
    return r;
}

function getElementTop(e) {
    if(!e)return false;
    var r = e.offsetTop;
    var p = e.offsetParent;
    while (p) {
	r += p.offsetTop;
	p = p.offsetParent;
    }
    return r;
}

function getElementWidth(e) {
    if(!e)return false;
    return e.offsetWidth
}

function getElementHeight(e) {
    if(!e)return false;
    return e.offsetHeight
}

function setElementLeft(e,t){
    if(!e)return false;
    e.style.left=t+'px'
}

function setElementTop(e,t){
    if(!e)return false;
    e.style.top=t+'px'
}

function setElementParent(e,p){
    if(!e||!p)return false;
    p.appendChild(e)
}

//###form

function formToArray(form) {
    if (!form) return false;
    var a = new Array();
    var is = form.getElementsByTagName("input");
    var ts = form.getElementsByTagName("textarea");
    var ss = form.getElementsByTagName("select");
    for (var i=0;i<is.length;i++) a[is[i].name]=is[i].value;
    for ( i=0;i<ts.length;i++) a[ts[i].name]=ts[i].value;
    for ( i=0;i<ss.length;i++) a[ss[i].name]=ss[i].value;
    return a;
}

//###kódolás

function urlEncode(s_in) {
    var s=s_in;
    if(!t.s(s)) {
		try {
			s=s.toString();
		} catch(e) {
			s+='';
		}
    }
	try{
		s=encodeURIComponent(s);
	}catch(e){//...
		s = s.replace(/%/g, '%25');
		s = s.replace(/\$/g, '%24');
		s = s.replace(/&/g, '%26');
		s = s.replace(/\+/g, '%2B');
		s = s.replace(/\//g, '%2F');
		s = s.replace(/=/g, '%3D');
		s = s.replace(/%20/g, '+');
		s = s.replace(/\*/g, '%2A');
		s = s.replace(/\?/g, '%3F');
		s = s.replace(/\@/g, '%40');
	}
    return s;
}

function urlDecode(s_in) {
    var s = s_in.replace(/\+/g,' ');
    s = unescape(s);
    return s;
}

function base64Encode(input) {
    var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var output = "";
    var chr1, chr2, chr3;
    var enc1, enc2, enc3, enc4;
    var i=0;
    do {
	chr1 = input.charCodeAt(i++);
	chr2 = input.charCodeAt(i++);
	chr3 = input.charCodeAt(i++);

	enc1 = chr1 >> 2;
	enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
	enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
	enc4 = chr3 & 63;

	if (isNaN(chr2)) {
	    enc3 = enc4 = 64;
	} else if (isNaN(chr3)) {
	    enc4 = 64;
	}

	output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) +
	keyStr.charAt(enc3) + keyStr.charAt(enc4);
    } while (i < input.length);

    return output;
}

//###egyéb

Array.prototype.contains=function(v){for(var i=0;i<this.length;i++)if(v===this[i])return true;return false;}

function isValueInArray(a,x) {
    for(var i in a) if(x==a[i])return true;
    return false;
}

function maxOfArray(a) {
    if(!t.o(a)||a.length==0)return 0;
    var x=-999999;
    for(var i in a)if (a[i]>x)x=a[i];
    return x;
}

/*Array.prototype.isValueIn = function(x){return isValueInArray(x,this)}
Array.prototype.max = function(){return maxOf(this)}*/ //AJJAJ for i in... probléma...

function treshold(f,low,high) {
    return ((f<low)?low:((f>high)?high:f))
}

function roundEx(f,d) {
    if ((typeof d).toLowerCase()!="number") return Math.round(f);
    d*=10;
    return Math.round(f*d)/d;
}

function loadScript(src,callBack){
    if(!src)return;
    try{
		callBack.onStart()
    }catch(e){};
    try{
	var head=this.document.getElementsByTagName('head')[0];
	var script=this.document.createElement('script');
	script.type='text/javascript';
	script.async=true;
	var _callBack=callBack;
	script.onreadystatechange= function(){
	if(this.readyState=='complete'){
		try{
			_callBack.onLoad.apply(_callBack,[src]);
		}catch(e){}
	}
	};
	script.onload= function(){
		try{
			_callBack.onLoad.apply(_callBack,[src]);
		}catch(e){}
	};
	script.src=src;//+'?random='+Math.random();
	head.appendChild(script);
    }catch(e){
	try{
	    callBack.onError(404)
	}catch(e){};
    }
}

function evalResponse(response) {
    var lsc=0;
    var script=function(src,txt){
	this.src=src;
	this.txt=txt;
	this.loaded=false;
    }
    var scripts={
	items:[],
	evalScripts:function(){
	    for(var i=0;i<this.items.length;i++){
		if(this.items[i].txt!=''){
		    window.eval(this.items[i].txt);
		}
	    }
	},
	onLoad:function(src){
	    var all_loaded=true;
	    for(var i=0;i<this.items.length;i++){
		if(this.items[i].src==src)
		    this.items[i].loaded=true;
		if(this.items[i].src!=''&&this.items[i].loaded==false)
		    all_loaded=false;
	    }
	    if(all_loaded)this.evalScripts();
	}
    };

    var sm, sr = /(<\s*\bscript\b.*?>((.|\n|\r|\r\n)*?)<\s*\/\s*script\s*>)/gim;
    var am, ar = /\b(\w*?)\b=["'](.*?)["']/gim;

    while (sm=sr.exec(response)) {
	var src='', js=true;
	//alert(print_r(sm));
	var s=sm[1];//script tag
	var st=sm[2];//script text
//alert(st);
	while(am=ar.exec(s)){
	    //alert(am[1]+','+am[2]);//attr: name,value
	    switch(am[1].toLowerCase()){
		case 'type':
		    if(!(am[2].toLowerCase()=='text/javascript'||am[2]==''))js=true;
		    break;
		case 'src':
		    src=am[2];
		    break;
	    }
	}
	//if(st)eval(st);
	//if(js)alert(src+','+st);
	var _scripts=scripts;
	var _src=src;
	var s=new script(src,st);
	s.onLoad=scripts.onLoad;
	s.onError=function(ec){
	    alert(ec)
	};
	s.onReadyStateChange=function(rs){
	//alert(rs)
	};
	scripts.items.push(s);
	if(js){
	    if(src!='')lsc++;
	    loadScript(src,scripts);
	}
    }
    if(lsc==0)scripts.evalScripts();
}

//###eseménykezelés

function getKey(e){
    e=e||window.event;
    if (!e) return false;
    var c=e.which||e.keyCode;
    return c;
}

function getEventTarget(e) {
    e=e||window.event;
    if (!e) return false;
    var t=e.target||e.srcElement;
    if (t.nodeType==3)t=t.parentNode;//ha 3 akkor textNode (Safariéknál...)
    return t;
}

function mouseX(e) {
    e=e||window.event;
    if (e.pageX) return e.pageX;
    else if (e.clientX)
	return e.clientX + (document.documentElement.scrollLeft ?
	    document.documentElement.scrollLeft :
	    document.body.scrollLeft-document.body.parentElement.clientLeft);
    else return 0;
}
 
function mouseY(e) {
    e=e||window.event;
    //if( typeof( e ) == "undefined" && typeof( window.event ) != "undefined" ) {e = window.event;}
    if (e.pageY) return e.pageY;
    else if (e.clientY)
	return e.clientY + (document.documentElement.scrollTop ?
	    document.documentElement.scrollTop :
	    document.body.scrollTop-document.body.parentElement.clientTop);
    else return 0;
}



function print_r(arr,level) {
    var dumped_text = "";
    if(!level) level = 0;

    //The padding given at the beginning of the line.
    var level_padding = "";
    for(var j=0;j<level+1;j++) level_padding += "    ";

    if(typeof(arr) == 'object') { //Array/Hashes/Objects
	for(var item in arr) {
	    var value = arr[item];

	    if(typeof(value) == 'object') { //If it is an array,
		dumped_text += level_padding + "'" + item + "' ...\n";
		dumped_text += print_r(value,level+1);
	    } else {
		dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
	    }
	}
    } else { //Stings/Chars/Numbers etc.
	dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
    }
    return dumped_text;
}

//###típusellenőrzések

var t=new Object();

t.t=function(o) {
    var s=typeof(o);
    return s.toLowerCase();
}

t.n = function(o) {
    return t.t(o)=="number";
}

t.s = function(o) {
    return t.t(o)=="string";
}

t.u = function(o) {
    return t.t(o)=="undefined";
}

t.o = function(_o) {
    return t.t(_o)=="object";
}

t.f = function(o) {
    return t.t(o)=="function";
}

//###OOP
function createEvent(p){//p:{Object thisArg, Function method, [] arguments, Bool eventArg, Bool origArgs}
	if(!t.o(p))return;
	var a=(t.o(p.arguments)?p.arguments:[]);
	return(function(e){
	e=e||window.event;
	if(p.origArgs===true)a=[].slice.call(arguments).concat(a);else if(p.eventArg===true)a.unshift(e);
	return p.method.apply(p.thisArg,a);
	});
}

function Class(source) {
    var self=function () {
	if (typeof(this.construct)=="function")
	    this.construct.apply(this,arguments);
    }
    for(var i in source) {
	self.prototype[i]=source[i]
    }
    self.Extends=function (parent) {
	if(!this.parent) {
	    for(var i in parent.prototype) {
		if (this.prototype[i]===undefined)
		    this.prototype[i]=parent.prototype[i];
	    }
	    this.prototype.parent=parent.prototype;
	}
	return this;
    }
    return self;
}

//példa:
/*var Osztaly = Class({
	construct: function (x,y,z) {
		this.arguments = arguments;
		this.text=this.arguments[0];//x
	},
	valami: function () {
		alert(this.text);
	}
});
var a=new Osztaly("aa");
var c=new Osztaly("naanaa");
*/

//##THash

function getAncVars() {
    var h=location.hash+'';
    if(h.charAt(0)=='#')h=h.substring(1);
    if(h=='')return new Array();
    var a=new Array();
    var b=new Array();
    var c=new Array();
    a=h.split('&');
    for(var i=0;i<a.length;i+=1){
	c=a[i].split('=');
	b[c[0]]=(t.u(c[1])?'':c[1]);
    }
    return b;
}

function getAncVar(n) {
    if(!t.s(n)&&!t.n(n))return false;
    return getAncVars()[n]
}

function setAncVars(a) {
    if(!t.o(a))return false;
    var s='';
    for(var i in a)s+=i+'='+a[i]+'&';
    s=s.substring(0,s.length-1);
    location.hash=s;
}

function setAncVar(n,v) {
    if((!t.s(n)&&!t.n(n))||(!t.s(v)&&!t.n(v)))return false;
    var a=getAncVars();
    a[n]=v;
    setAncVars(a);
}

function THash() {
    var _t=this;
    this.hash=location.hash;
    this.intv=0;
    this.listen=function(b){
	if(b!=false)this.intv=setInterval(function(){
	    if(this.hash!=location.hash)_t.onChange(getAncVars());
	    this.hash=location.hash;
	},50);
	else {
	    clearInterval(this.intv);
	    this.intv=0
	}
    }
    this.onChange=function(vars){}
    this.listen();
}

//###típusok, konverziók

var TPoint = Class({
    construct: function(x,y) {
	this.x=t.u(x)?0:x;
	this.y=t.u(y)?0:y;
    },
    setPoint: function(x,y) {
	this.x=t.u(x)?0:x;
	this.y=t.u(y)?0:y;
    },
    sub: function(p2) {
	this.x-=p2.x;
	this.y-=p2.y;
	return this;
    }
});

function toHex(x){
    var h=Number(x).toString(16);
    if(h.length<2)h='0'+h;
    return h;
}

function rgbToHex(r,g,b) {
    return '#'+toHex(r)+toHex(g)+toHex(b);
}

//###vektor
var bVML=false;
function setupVML(){
    if(bVML)return false;
    bVML=true;
    document.namespaces.add('v', 'urn:schemas-microsoft-com:vml');
    var s = document.createElement('style');
    document.getElementsByTagName('head')[0].appendChild(s);
    s.styleSheet.addRule('v\\:*', '{behavior:url(#default#VML);display:inline-block;}');
//s.styleSheet.addRule('v\\:shape', 'position:absolute; left:0px; top:0px;  z-index:-1;');
}

//##IE fixek

function fixIEPNGIMG(){
    try{
	var a=document.getElementsByTagName('img');
	for(var i=0;i<a.length;i++)a[i].onload=function(){//az onload miatt előfordulhat hogy nem fixálódik, de gyakorlatilag oké
	    if(this.src.indexOf('spacer.gif')==-1&&this.src.indexOf('.png')!=-1){
		var w=this.offsetWidth;
		var h=this.offsetHeight;
		this.style.filter+="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.src+"', sizingMethod='scale')";
		this.src='_images/spacer.gif';
		this.width=w;
		this.height=h;
	    }
	};
    }catch(e){
	return false
    }
    return true;
}

function fixIEPNGCSS(){
    try {
	//document.write('<pre>'+print_r(document.styleSheets[0].rules)+'</pre>');//return false;
	var s=document.styleSheets;
	for(var i=0;i<s.length;i++) {
	    var r=s[i].rules;
	    for(var j=0;j<r.length;j++) {
		for(var k in r[j].style) {
		    if(k=='backgroundImage'&&r[j].style[k]!='none') {
			var bg=r[j].style[k];
			bg=bg.replace(/url\((.*)\)/i,'$1');
			r[j].style[k]='';
			r[j].style.filter+="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+bg+"', sizingMethod='crop')";
		    }
		}
	    }
	}
    }catch(e){
	return false
    }
    return true;
}

function fixIEPNGByElements(a_in){
    try{
	var a=a_in;
	var bg='';
	for(var i=0;i<a.length;i++){
	    bg=a[i].style.backgroundImage;
	    if(bg.indexOf('.png')!=-1){
		bg=bg.replace(/url\((.*)\)/i,'$1');
		//alert(bg);
		a[i].style.backgroundImage='';
		a[i].style.filter+="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+bg+"', sizingMethod='crop')";
	    }
	}
    }catch(e){
	return false
    }
    return true;
}

function fixIEPNG(a_in){
    if(getNav()===NAV_IE&&getNavVer()<=6){
	if(t.u(a_in)) {
	    fixIEPNGIMG();
	    fixIEPNGCSS();
	} else
	if(t.o(a_in)) {
	    if(a_in.css)fixIEPNGCSS();
	    if(a_in.tagNames){
		if(isValueInArray(a_in.tagNames,'img'))fixIEPNGIMG();
		for(var i=0;i<a_in.tagNames.length;i++)
		    if(a_in.tagNames[i]!='img')fixIEPNGByElements(document.getElementsByTagName(a_in.tagNames[i]));
	    } else fixIEPNGIMG();
	}
	return true;
    } else return false;
}

function shadowIt(prop){//element, color{r,g,b}, x,y,radius, quality(csak IE-nél!), majd nestelni kell, mert így feketés lesz
    //var cl='#'+toHex(prop.r)+toHex(prop.g)+toHex(prop.b);
    var r=prop.radius;
    if(getNav()===NAV_IE){
	var cl='rgb('+prop.color.r+','+prop.color.g+','+prop.color.b+')';
	var w=getElementWidth(prop.element);
	var h=getElementHeight(prop.element);
	var l=getElementLeft(prop.element);
	var t=getElementTop(prop.element);
	var s=document.createElement('div');

	with(s.style){
	    position='absolute';
	    backgroundColor=cl;
	    width=w+'px';
	    height=h+'px';
	    left=(l-r+prop.x)+'px';
	    top=(t-r+prop.y)+'px';
	    zIndex='-999';
	    filter='progid:DXImageTransform.Microsoft.Alpha(Opacity='+Math.round(100*prop.color.a)+',Style=0)';
	    }
	if(prop.quality==0) {
	    s.style.filter+='progid:DXImageTransform.Microsoft.Blur(pixelradius='+r+')';
	} else {
	    var q=prop.quality;
	    for(var i=0;i<q;i++){//itt nestelni kéne!
		s.style.filter+='progid:DXImageTransform.Microsoft.Blur(pixelradius='+Math.round(r/q)+')';
	    }
	}

	s.style.width=w+'px';
	s.style.height=h+'px';
	s.style.left=(l-r+prop.x)+'px';
	s.style.top=(t-r+prop.y)+'px';
	document.body.appendChild(s);
	return s;
    } else {
	var cl='rgba('+prop.color.r+','+prop.color.g+','+prop.color.b+','+prop.color.a+')';
	var s=prop.x+'px '+prop.y+'px '+r+'px '+cl;
	with(prop.element.style){
	    WebkitBoxShadow=s;
	    MozBoxShadow=s;
	    boxShadow=s;
	    }
	return false;
    }
}

function createSimpleTable() {
	var r={};
	r.table=document.createElement('table');
	r.row=r.table.insertRow(-1);
	r.cell=r.row.insertCell(-1);
	return r;
}

function bound(min,max,x){return x<min?min:(x>max?max:x)}

//###stílus,class

function editClass(p){//p:{el,add,remove}
	if(!p||!p.el)return false;
	if(!p.add)p.add=[];
	if(!p.remove)p.remove=[];
	var c=p.el.className;
	var a=c.split(' ');
	var a2=[];
	for(var i=0;i<a.length;i++){
		if(!p.remove.contains(a[i])&&!p.add.contains(a[i])&&!a2.contains(a[i])&&a[i]!=='')a2.push(a[i]);
	}
	for(var i=0;i<p.add.length;i++)
		a2.push(p.add[i]);
	c=a2.join(' ');
	p.el.className=c;
}

function setBackgroundColor(el,cl){//elem,{a,r,g,b}
if(!t.n(cl.a)||!t.n(cl.r)||!t.n(cl.g)||!t.n(cl.b))return false;
a=bound(0,1,cl.a);
r=bound(0,255,cl.r);
g=bound(0,255,cl.g);
b=bound(0,255,cl.b);
try{
	el.style.backgroundColor='rgba('+r+','+g+','+b+','+a+')';
}catch(e){
	var ma=Math.round(255*a).toString(16);
	if(ma.length<2)ma='0'+ma;
	var mr=r.toString(16);
	if(mr.length<2)mr='0'+mr;
	var mg=g.toString(16);
	if(mg.length<2)mg='0'+mg;
	var mb=b.toString(16);
	if(mb.length<2)mb='0'+mb;
	var hcl='#'+ma+mr+mg+mb;
	el.style.filter='progid:DXImageTransform.Microsoft.gradient(startColorstr="'+hcl+'",endColorstr="'+hcl+'")';
}
return true;
}

