/*
	Loader
*/
var Loader = {
	functions: new Array(),
	
  register: function(args) {
		var size = this.functions.length;
		var fname = arguments[0];
		this.functions.push(args);
  },
	
	run: function() {
    for (var i = 0; i < this.functions.length; i++) {
      var lambda = this.functions[i];
	    try {
        eval(lambda+";");
      } catch (e) {}
    }
	}
}

/* 
	Library Controll
*/
lc = {
	baseURI: '',
	packs: {},

	register: function( pack ){
		for( var _, m, p = this.packs, pack = ( m = pack.split( '.' ) ).pop(); _ = m.shift(); p = p[_] || ( p[_]={} ) );
		( p['%files%'] || ( p['%files%'] = {} ) )[pack] = {included:false,loaded:false};
	},

	findPackage: function( pack ){
		for( var m, p = this.packs, pack = ( m = pack.split( '.' ) ).pop(); m.length && ( p = p[ m.shift() ] ); );
		return !m.length && (p=p['%files%']) ? p[pack] : null;
	},

	isIncluded: function( pack ){
		with( {x:this.findPackage( pack )} ) return x && x.included;
	},

	isLoaded: function( pack ){
		with( {x:this.findPackage( pack )} ) return x && x.loaded;
	},

	include: function( pack ) {
		var p = this.findPackage( pack ), pack = this.baseURI + pack.split( '.' ).join( '/' ) + '.js';
		if( p ){
			if( !document.body )
			{
				document.write( '<script type="text/javascript" src="'+pack+'"><\/script>' );
			}
			else with( {s: document.createElement( 'script' ) } ){
				s.type = 'text/javascript';
				s.src = pack;
				document.body.appendChild( s );
			}
			return p.included = true;
		}
		return false;
	},

	require: function( pack ) {
		var p = this.findPackage( pack );
  		if( p && !p.included )
			return this.include( pack );
		return false;
	}
}

function getElement(id){return document.getElementById(id);}

// viewport width
function winW(){
	if(window.innerWidth)return parseInt(window.innerWidth);
	else if(document.documentElement&&document.documentElement.clientWidth)return parseInt(document.documentElement.clientWidth);
	else if(document.body&&document.body.clientWidth)return parseInt(document.body.clientWidth);
}

// viewport height
function winH(){
	if(window.innerHeight)return parseInt(window.innerHeight);
	else if(document.documentElement&&document.documentElement.clientHeight)return parseInt(document.documentElement.clientHeight);
	else if(document.body&&document.body.clientHeight)return parseInt(document.body.clientHeight);
}

function getViewportSize()
{
 var size = [0, 0];

 if (typeof window.innerWidth != 'undefined')
 {
   size = [
       window.innerWidth,
       window.innerHeight
   ];
 }
 else if (typeof document.documentElement != 'undefined'
     && typeof document.documentElement.clientWidth !=
     'undefined' && document.documentElement.clientWidth != 0)
 {
   size = [
       document.documentElement.clientWidth,
       document.documentElement.clientHeight
   ];
 }
 else
 {
   size = [
       document.getElementsByTagName('body')[0].clientWidth,
       document.getElementsByTagName('body')[0].clientHeight
   ];
 }
 return size;
}

/*
	Image preload and Mouse overs
*/
var imgDefault = /^(.*)_off(\.(gif|jpg|png))$/;
var imgActive = /^(.*)_on(\.(gif|jpg|png))$/;
var imgOut = "_off";
var imgOver = "_on";
var imgFX = new Array();

function preFX(){
	var images = document.getElementsByTagName("img");
  for(var i = 0; i < images.length; i++){
		if(images[i].src.match(imgDefault)){
			imgFX[i] = new Image();
			imgFX[i].src = images[i].src.replace(imgDefault, "$1" + imgOver + "$2");
		}
	}
}

/*
	Apply mouseovers
*/
function applyMO() {
	var elms = document.getElementsByTagName("img");
	for(var i=0;i<elms.length;i++){
		if(/\ ?mouseover\ ?/.test(elms[i].className)){
			elms[i].onmouseover = function(){
         if(this.src.match(imgDefault)){
					 this.src = this.src.replace(imgDefault, "$1" + imgOver + "$2");
         }
			}
			elms[i].onmouseout = function(){
				 if(this.src.match(imgActive)){
            this.src = this.src.replace(imgActive, "$1" + imgOut + "$2");
				 }
			}
		}
	}
}

/*
	Apply styles
*/
function applyStyles() {
	var elmgrp = ['div', 'img']; // elements groups
	for(x=0;x<elmgrp.length;x++){
		var elm = document.getElementsByTagName(elmgrp[x]);
		for(var i=0;i<elm.length;i++){
			var m = elm[i].className.match( /\ ?(\w+)\ ?/ig ) ;
			try {
				eval(m+"(elm[i]);");
			} catch (e) {}
		}
	}
}

/*  responseDispatcher
 *  may be called when xmlhttp response is complete
 *		parses response to function name and data and call the function
*/
function responseDispatcher(response)
{
	var serverResponse = response.responseText.parseJSON();
	var resolver = serverResponse[0];
	var data = serverResponse[1];
	try {
		var ret = eval(resolver+"(data);")
	} catch (e) {}
}

