﻿//----------------------------
// $ : used everywhere
//----------------------------

var $C = {};
function $(id)
{
	var element = $C[id];
	if (element == null)
	{
		element = document.getElementById(id);
		$C[id] = element;
	}
	return element;
}


// --------------------------------
// String prototype
// --------------------------------
String.prototype.trim = function() { return(this.replace(/^\s+|\s+$/g, "")); };
String.prototype.toDate = function()
{
 if ((!this) || (this.length == 0)) return null;
 var yyyy = this.substr(0, 4);
 var M = Number(this.substr(4, 2)) - 1;
 var dd = this.substr(6, 2);
 if (this.length == 8)
  return new Date(yyyy, M, dd);
 else
 {
  var HH = this.substr(8, 2);
  var mm = this.substr(10, 2);

  return new Date(yyyy, M, dd, HH, mm);
 } 
};

String.prototype.asIntegerFormat = function(strPattern)
{
 // pattern ex : 000
 var pref = strPattern.substring(this.length);
 return(pref + this);
}

// --------------------------------
// Date prototype : used everywhere
// --------------------------------

Date.prototype.formatDateTime = function(pattern)
{
 pattern = this.formatDate(pattern);
 return(this.formatTime(pattern));
}

Date.prototype.formatDate = function(pattern)
{
 var yyyy = String(this.getFullYear()).asIntegerFormat("0000");
 var yy = String(this.getYear()).asIntegerFormat("0000");
 var M = String(this.getMonth() + 1);
 var MM = M.asIntegerFormat("00");
 var d = String(this.getDate());
 var dd = d.asIntegerFormat("00");

 pattern = pattern.replace("yyyy", yyyy);
 pattern = pattern.replace("yy", yy);
 pattern = pattern.replace("MM", MM);
 pattern = pattern.replace("M", M);
 pattern = pattern.replace("dd", dd);
 pattern = pattern.replace("d", d);

 return(pattern);
}

Date.prototype.formatTime = function(pattern)
{
 var h = String(this.getHours());
 var hh = h.asIntegerFormat("00");
 var m = String(this.getMinutes());
 var mm = m.asIntegerFormat("00");
 var s = String(this.getSeconds());
 var ss = s.asIntegerFormat("00");

 pattern = pattern.replace("hh", hh);
 pattern = pattern.replace("h", h);
 pattern = pattern.replace("mm", mm);
 pattern = pattern.replace("m", m);
 pattern = pattern.replace("ss", ss);
 pattern = pattern.replace("s", s);

 return(pattern);
}


Date.prototype.getDeltaDayDate = function(deltaDay)
{
 var date = new Date(this);
 date.setDate(this.getDate() + deltaDay);
 return(date);
}

Date.prototype.quantieme = function()
{
	return Math.round( (this - new Date(this.getFullYear(), 0, 1) )  / 86400000 ) + 1;
}
//----------------------------
// dom used by : jsCalendar
var dom =
{
	"clearChildren": function(element)
	{
	var e = element.lastChild;
	while (e)
	{
	 var z = e.previousSibling;
	 element.removeChild(e);
	 e = z;
	}
	},

	"insertElement": function(parentElement, ename, className)
	{
	 var element = document.createElement(ename);
	 if (className)
		element.className = className;
	 parentElement.appendChild(element);
	 return(element);
	},

	"insertTextNode": function(parentElement, text, className)
	{
	 var element = document.createTextNode(text);
	 if (className)
		element.className = className;
	 parentElement.appendChild(element);
	 return(element);
	},
	"getNextSibling": function(element)
	{
		var nextElement = element.nextSibling;
		if (element.toString() != nextElement.toString())
		{
			nextElement = nextElement.nextSibling;
		}
		return nextElement;
	},
	getPosX: function(element)
	{
		var x = 0;
		do
		{
			x += element.offsetLeft;
		}
		while (element = element.offsetParent);
		
		return x;
	},
	getPosY: function(element)
	{
		var y = 0;
		do
		{
			y += element.offsetTop;
		}
		while (element = element.offsetParent);
		
		return y;
	}
}

//-----------------------
var jsCookie = 
{
 "create" : function(name, value, days)
 {
  var expires = "";
  if (days)
  {
   var date = new Date();
   date.setTime(date.getTime()+(days*24*60*60*1000));
   expires = ";expires="+date.toGMTString();
  }
  document.cookie = name+"="+value+expires+";path=/";
 },

 "read" : function(name)
 {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0; i < ca.length; i++)
  {
   var c = ca[i].trim();
   //while (c.charAt(0)==' ') c = c.substring(1, c.length);
   if (c.indexOf(nameEQ) == 0) return(c.substring(nameEQ.length, c.length));
  }
  return(null);
 },

 "remove" : function(name)
 {
  this.create(name, "", -1);
 }
}

//-----------------------
// Mouse
//-----------------------
var Mouse =
{
	x: 0,
	y: 0,
	callbackMove: null,
	callbackUp: null,
	"initialize": function()
	{
		document.onmousemove = Mouse.onmove;
		document.onmouseup = Mouse.onup;
		document.onselectstart = function() { return false; };
	},
	getMouseXY: function(e)
	{
		if (!e) e = window.event;
		Mouse.x = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		Mouse.y = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;

		return true;
	},
	process: function()
	{
		if (this.callbackMove != null)
			this.callbackMove();
	},

	onmove: function(e)
	{
		// 'this' is not usable, document event inihitate 'this'
		if (Mouse.callbackMove == null)
			return;

		Mouse.getMouseXY(e);
		Mouse.process();
	},
	onup: function()
	{
		if (Mouse.callbackUp != null)
			Mouse.callbackUp();
	}
};
//-----------------------

var my =
{
	isWebkit: navigator.userAgent.toLowerCase().indexOf('webkit') > -1,
	isIE6: navigator.userAgent.toLowerCase().indexOf('msie 6') != -1,
	"browserAAA" : (window.XMLHttpRequest != null),
	"img" : function(img, url)
	{
		if (img.onload != null)
			img.onload=null;
  
		var isPNG = (url.toLowerCase().indexOf('.png') > 0);
		url = myPath.resolveUrl(url);

		if (this.browserAAA)
		{
			img.src = url;
			return;
		}
    
		// check if PNG
		if (isPNG)
		{
			img.src = url.replace('.png', '.gif');
			return;
			if (img.style.filter != null)
			{
				img.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + url + "')";
				img.src = "static/img/blank.gif"; // if there is not this line -> bug on image
				return;
			}
		}
     
		img.src = url;
	},

 //---------------------
 "opacity" : function(element, x)
 {
  if (element.style.opacity != null)
   element.style.opacity = x;
  else
   element.style.filter = "alpha(opacity=" + (x * 100) + ")";
 }
}
//----------------------------
var myDate =
{
	"day2ms": 3600000 * 24,
	//---
	"getMonthDayCount": function(year, month) {
		return (new Date(year, Number(month) + 1, 0).getDate());
	},
	//---
	"getWeeknum": function(year, month, day) {
		var date = new Date(year, month, day);
		var weekday = date.getDay();
		var quantieme = date.quantieme();

		var x = Math.floor((quantieme + 10 - weekday) / 7);

		return (x);
	},
	"getDayCountBetween": function(ds, de) {
		return Math.floor((de - ds) / this.day2ms);
	}
};

//----------------------------

var myEvent =
{
 "add" : function addEvent(obj, type, fn)
  {
   if (obj.attachEvent)
   {
    //obj['e'+type+fn] = fn;
    //obj[type+fn] = function(){obj['e'+type+fn](window.event);}
    obj.attachEvent('on' + type, fn);	
    //obj['on' + type] = fn;
   }
   else
    obj.addEventListener(type, fn, true);
  },
 //--------------------------
 "remove" : function removeEvent(obj, type)
  {
   if ( obj.detachEvent )
   {
    obj.detachEvent('on'+type, obj[type+fn]);
    //obj['e'+type+fn] = null;
    //obj['on' + type] = null;
   }
   else
    obj.removeEventListener(type, fn, true);
  }

}

//----------------------------

var preloader =
{
 // pool > cloneNode > new Image();
 "list" : [],
 "cache" : {},
 pools : {},
 poolouts: {},
 "loadedCount" : 0,
 //-------
 "initialize" : function(callback)
 { 
  this.callback = callback; 
  for (var index in this.list)
  {
   var src = this.list[index];
   src = myPath.resolveUrl(src);
   if (this.cache[src] != null)
    continue;
   
   var img = new Image();
   this.cache[src] = img;
   
   img.onload = this.onload;
   img.onerror = this.onload;
   img.onabort = this.onload;
   
   img.src = myPath.resolveUrl(src);
  }
 },
 //-------
 "add" : function(src)
 {
	if (my.isIE6)
		src = src.replace(".png", ".gif");
		
  this.list.push(src);  
 },
 
 //-------
 "addlist" : function(list)
 {
  for (var i = 0; i < list.length; i++)
	{
		var src = list[i];
		if (my.isIE6)
			src = src.replace(".png", ".gif");

		this.list.push(src);  
	}
 },
 //-------
 "set" : function(type, parentNode, src, title)
 {
	if (my.isIE6)
		src = src.replace(".png", ".gif");

	src = myPath.resolveUrl(src);
  var pool = this.pools[src];
  
  var img;
  
  if ((pool) && (pool.length > 0))
    img = pool.pop();
  else
    img = this.cache[src].cloneNode(false);
  
  if (title != null)
   img.title = title;
   
  parentNode.appendChild(img);
  
  var poolout = this.poolouts[type];
  if (poolout == null)
  {
		poolout = [];
		this.poolouts[type] = poolout;
  }
  
  poolout.push(img);
  
  return img;
 },
 //
 "unset": function(type)
 {
	var poolout = this.poolouts[type];
	while (poolout.length > 0)
	{
		var img = poolout.pop();
		
		var parentNode = img.parentNode;
		parentNode.removeChild(img);
		
		var pool = this.pools[img.src];
		if (pool == null)
		{
			pool = new Array();
			this.pools[img.src] = pool;
		}
		pool.push(img);
	}
 },
 "unsetAll": function()
 {
	for (var type in this.poolouts)
		this.unset(type);
 },
 //-------
 "release" : function(parentNode)
 {
  var img = parentNode.lastChild;
  if (img == null) return;
  var pool;
  while (img)
  {
   var z = img.previousSibling;
   parentNode.removeChild(img);
   
   var src = img.src;
   pool = this.pools[src];
   
   if (pool == null)
   {
    pool = new Array();
    this.pools[src] = pool;
   }
   pool.push(img);
   
   img = z;
  }
 },
 //-------
 "onload" : function()
 {
  //var preloader = this.handler;
  preloader.loadedCount++;
  if (preloader.loadedCount == preloader.list.length)
   if (preloader.callback)
    preloader.callback();
   else
    alert('Preloader completed');
 }
};

//-------------------------
// JSRequest
function JSRequest(url, action, h_params, callbackFnName)
{

 var params = 'action=' + action;
 
 for (var key in h_params)
 {
  params += '&' + key + '=' + encodeURIComponent(String(h_params[key]));
 }
 
 if (callbackFnName) params += '&callback=' + callbackFnName;
 
 var head = document.getElementsByTagName('head')[0];
 var script = document.createElement('script');
 script.setAttribute('type', 'text/javascript');
 script.setAttribute('src', url + '?' + params);
 head.appendChild(script);
};

// -------
// Validator

var myValidator =
{
 email : function(email)
 {
   var re_email = /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$/;
   return re_email.exec(email);
 }
};