/*
* mag.js ver.2.0
*
* writen by Magnum
*
* No dependency on external libraries
*
* Tested browsers
*  Safari 3
*  IE 7
*
* $Date: 2009-04-20$
*/

/*@cc_on 
var doc = document;
eval('var document = doc');
@*/

/*
* CrossBrowserLayer
*/

function maglous(){
 /* ブラウザ判別 */
 this.ie = (navigator.appName.toLowerCase().indexOf('internet explorer')+1 ? true:false); // IE
 this.safari = (navigator.userAgent.toLowerCase().indexOf('safari')+1 ? true:false); // Safari
 this.firefox = (navigator.userAgent.toLowerCase().indexOf('firefox')+1 ? true:false);  // Webkit
 this.webkit = (navigator.userAgent.indexOf('AppleWebKit/') > -1 ? true:false);  // FireFox
 this.opera = (window.opera ? true:false);  // Opera
 /* 正規表現 */
 this.regexp = {
  number : new RegExp('^[0-9]*$','i'), // 数字
  numeric : new RegExp('^[!-~]*$','i'), // 半角英数
  kata : new RegExp('^[ア-ヴｱ-ﾝﾞﾟァィゥェォー　 ]+$','i'), // 半角全角片仮名
  halfkata : new RegExp('^[ｱ-ﾝﾞﾟ　 ]+$','i'), // 半角片仮名
  fullkata : new RegExp('^[ア-ヴァィゥェォー　 ]+$','i'), // 全角片仮名
  hira : new RegExp('^[あ-ゔぁぃぅぇぉー 　]+$','i'), // 平仮名
  mail : new RegExp('^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$|^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$','i'), // メールアドレス
  phone : new RegExp('^[0-9]{11}$|^[0-9]{10}$|^[0-9]{3}-[0-9]{4}-[0-9]{4}$|^[0-9]{2,5}-[0-9]{1,4}-[0-9]{4}$|^[0-9]{3} [0-9]{4} [0-9]{4}$|^[0-9]{2,5} [0-9]{1,4} [0-9]{4}$','i'), // 電話番号
  zip : new RegExp('\[0-9]{3}-[0-9]{4}$|^\[0-9]{3}-[0-9]{2}$|^[0-9]{3}$|^[0-9]{5}$|^[0-9]{7}$','i'), // 郵便番号
  url : new RegExp('(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)','i'), // URL
  sign : new RegExp("^.*[(\\|/|:|\*|?|\"|<|>|\|)].*$",'i'), // 特殊記号
  usr : new RegExp('^[a-zA-Z0-9_~.\/]*$','i') // ユーザ名用文字
 };
 /* 各種サイズ */
 /*this.screenWidth = (window.screen ? screen.availWidth:false); // スクリーン幅*/
 /*this.screenHeight = (window.screen ? screen.availHeight:false);  // スクリーン高さ*/
 this.screenWidth = (!this.safari && !this.opera ? (document.documentElement.clientWidth || document.body.clientWidth || document.body.scrollWidth):window.innerWidth); // スクリーン幅*/
 this.screenHeight = (!this.safari && !this.opera ? (document.documentElement.clientHeight || document.body.clientHeight || document.body.scrollHeight):window.innerHeight);  // スクリーン高さ
 this.windowWidth = function(){ return (document.uniqueID ? document.documentElement.clientWidth:window.innerWidth); }; // ウィンドウ幅
 this.windowHeight = function(){ return (document.uniqueID ? document.documentElement.clientHeight:window.innerHeight); }; // ウィンドウ高さ
 this.documentWidth = function(){ return Math.max(document.documentElement.scrollWidth,document.body.scrollWidth); }; // ドキュメント幅
 this.documentHeight = function(){ return Math.max(document.documentElement.scrollHeight,document.body.scrollHeight); }; // ドキュメント高さ
 this.scrollLeft = function(){ return Math.max(document.body.scrollLeft,document.documentElement.scrollLeft); }; // スクロール幅
 this.scrollTop = function(){ return Math.max(document.body.scrollTop,document.documentElement.scrollTop); }; // スクロール高さ
 /* 演算 */
 this.getFibo = function(nan){ // フィボナッチ数列取得
  var fibo = this;
  fibo.getFibo.num = [0,1,1];
  fibo.getFibo.get = function(nan){
   nan = Number(nan);
   if(nan < 0 || isNaN(nan)){ return false; }
   if(!fibo.getFibo.num[nan]){
    for(var i = 2;i < nan+1;i++){
     fibo.getFibo.num[i] = fibo.getFibo.num[i-1]+fibo.getFibo.num[i-2];
    }
   }
   return fibo.getFibo.num[nan];
  };
  fibo.getFibo.list = function(nan){
   nan = Number(nan);
   if(nan < 0 || isNaN(nan)){ return false; }
   var list = [];
   if(!fibo.getFibo.num[nan]){ fibo.getFibo.get(nan); }
   for(var i = 0;i < nan+1;i++){
    list.push(fibo.getFibo.num[i]);
   }
   return list;
  };
 };
 /* 配列 */
 this.arrayUnique = function(array){ // ユニーク化
  var chk = {};
  var unique = new Array();
  for(var i = 0;i < array.length;i++){
   if(array[i] in chk?false:chk[array[i]] = true){
    unique.push(array[i]);
   }
  }
  return unique;
 };
 /* DOM */
 this.getInnerTxt = function(node){ //テキストノード取得
  var i,obj;
  var str = '';
  if(!node){
   return str;
  }
  if(typeof node.textContent != 'undefined'){
   str = node.textContent;
  }else if(typeof node.innerText != 'undefined'){
   str = node.innerText;
  }else if(node.hasChildNodes()){
   for(i = node.childNodes.length;i--;){
    obj = node.childNodes.item(i);
    obj.nodeType == 3 ? str = obj.nodeValue+str:str = this.getInnerTxt(obj)+str;    
   }
  }
  return str;
 };
 this.getFirstChild = function(node){ //最初の子ノード取得
  return node.firstChild;
 };
 this.getLastChild = function(node){ //最後の子ノード取得
  return node.lastChild;
 };
 this.getChildsNode = function(node){ //全子ノード取得
  var i,inner,str;
  var array = new Array();
  if(!node){
   return array;
  }
  if(!node.hasChildNodes()){
   return array;
  };
  var children = node.childNodes;
  for(i = 0;i < children.length;i++){
   inner = children.item(i);
   if(inner.nodeType == 3){
    str = inner.nodeValue;
    if(!str.match('/[^\s\t\n\r]/')){
     continue;
    }
   }
   array.push(inner);
  }
  array.item = function(num){
   return (array[num] ? array[num]:null);   
  }
  return array;
 };
 this.getPreviousNode = function(node){ //一つ前のノード取得
  var obj,pvs,str;
  if(!node){
   return null;
  }
  obj = node;
  while(pvs = obj.previousSibling){
   if(pvs.nodeType == 3){
    str = pvs.nodeValue;
    if(!str.match('/[^\s\t\n\r]/')){
     obj = pvs;
     continue;
    }
   }
   return pvs;
  }
  return null;
 };
 this.getNextNode = function(node){ //一つ次の子ノード取得
  var obj,nxt,str;
  if(!node){
   return null;
  }
  obj = node;
  while(nxt = obj.nextSibling){
   if(nxt.nodeType == 3){
    str = nxt.nodeValue;
    if(!str.match('/[^\s\t\n\r]/')){
     obj = nxt;
     continue;
    }
   }
   return nxt;
  }
  return null;
 };
 this.getParentNode = function(parent){ //親ノード判定
  return (parent != null ? parent:document);
 };
 this.getElementById = function(label,parent){ //ID取得
  return this.getParentNode(parent).getElementById(label);
 };
 this.getElementsByName = function(label,parent){ //Name取得
  return this.getParentNode(parent).getElementsByName(label);
 };
 this.getElementsByTagName = function(label,parent){ //タグ取得
  return this.getParentNode(parent).getElementsByTagName(label);
 };
 this.getElementsByClassName = function(label,parent){ //Class取得
  var array = new Array();
  var reg = new RegExp('\\b'+label+'\\b');
  var search = this.getParentNode(parent).getElementsByTagName("*");
  for(var i = 0,j = search.length;i < j;i++){
   if(reg.test(search[i].className)){
    array.push(search[i]);
   }
  }
  array.item = function(num){
   return (array[num] ? array[num]:null); 
  }
  return array;
 };
 this.getElementByParentTag = function(elm,label){ //親ノード取得
  if(!elm){
   return false;
  }
  while(elm.tagName.toLowerCase() != label){
   if(elm == null || elm.tagName.toLowerCase() == 'body'){
    return false;
   }
   elm = elm.parentNode;
  }
  return elm;
 };
 this.removeChilds = function(node){ // 全子ノード削除
  while(node.hasChildNodes()){
   node.removeChild(node.lastChild);
  }
 };
 this.replaceNode = function(newelm,oldelm){ //ノード置き換え
  if(oldelm && oldelm != null){
   oldelm.parentNode.replaceChild(newelm,oldelm);
  }
 };
 this.replaceNodes = function(a,b){ // ノード入れ替え
  var clonea = a.cloneNode(true);
  a.parentNode.insertBefore(clonea,a);
  var cloneb = b.cloneNode(true);
  b.parentNode.insertBefore(cloneb,b);
  this.replaceNode(b,clonea);
  this.replaceNode(a,cloneb);
 };
 this.insertFirstChild = function(elm,parent){ // 最初に子ノード追加
  parent && parent != null ? parent.insertBefore(elm,parent.firstChild):document.body.insertBefore(elm,document.body.firstChild);
 };
 this.createElement = function(elmName,id){ // 要素生成
  var elm = document.createElement(elmName);
  if(id){
   elm.id = id;
  }
  return elm;
 };
 this.createText = function(txt){ // テキストノード生成
  return document.createTextNode(txt);
 };
 this.createFragment = function(){ // 空要素生成
  return document.createDocumentFragment();
 };
 /* イベント */
 this.getevt = function(evt){ // イベントレイヤ
  return (!evt ? window.event:evt);
 };
 this.evttarget = function(evt){ // 発生源取得
  evt = this.getevt(evt);
  return (evt && evt.target ? (evt.target.nodeType == 3 ? evt.target.parentNode:evt.target):(evt && evt.srcElement ? evt.srcElement:null));
 };
 this.addListener = function(elm,type,func){ // イベント登録
  return (!elm ? false:(elm.addEventListener ? elm.addEventListener(type,func,false):elm.attachEvent ? elm.attachEvent('on'+type,func):false));
 };
 this.readyListener = function(instance,func){ //レディー登録
  var onready = this;
  if(onready.readyListener.loaded){ return func(); }
  var observers = onready.readyListener.observers;
  if(!observers){ observers = onready.readyListener.observers = []; }
  observers[observers.length] = func; 
  if(onready.readyListener.callback){ return; }
  
  onready.readyListener.callback = function(){
   if(onready.readyListener.loaded){ return; }      
   onready.readyListener.loaded = true;
   if(onready.readyListener.timer){
    clearInterval(onready.readyListener.timer);
    onready.readyListener.timer = null;
   }
   var observers = onready.readyListener.observers;
   for(var i = 0,length = observers.length;i < length;i++){
    var func = observers[i];
    observers[i] = null;
    func();
   }
   onready.readyListener.callback = onready.readyListener.observers = null;
  };
    
  if(document.readyState && onready.webkit){
   onready.readyListener.timer = setInterval(function(){
    var state = document.readyState;
    if(state == 'loaded' || state == 'complete'){
     onready.readyListener.callback();
    }
   },50);
  }else if(document.readyState && onready.ie){      
   var src = (window.location.protocol == 'https:') ? '://0':'javascript:void(0)';
   document.write('<script type="text/javascript" defer="defer" src="'+src+'" '+'onreadystatechange="if (this.readyState == \'complete\') '+instance+'.readyListener.callback();"'+'><\/script>'); 
  }else{
   if(window.addEventListener){
    this.addListener(document,'DOMContentLoaded',onready.readyListener.callback);
    this.addListener(window,'load',onready.readyListener.callback);
   }else if(window.attachEvent){
    this.addListener(window,'load',onready.readyListener.callback);
   }else{
    var fn = window.onload;
     window.onload = function(){
     onready.readyListener.callback();
     if(fn){ func(); }
    }
   }  
  } 
 };
 this.removeListener = function(elm,type,func){ // イベント削除
  return (!elm ? false:(elm.removeEventListener ? elm.removeEventListener(type,func,false):elm.detachEvent ? elm.detachEvent('on'+type,func):false));  
 };
 this.removeReady = function(func){
  if(!func){ return ;}
  if(window.addEventListener){
   this.removeListener(document,'DOMContentLoaded',func);
   this.removeListener(window,'load',func);
  }else if(window.attachEvent){
   this.removeListener(window,'load',func);
  }
 }
 this.fireEvt = function(elm,type){ // イベント発動
  if(elm.dispatchEvent){
   var evt = document.createEvent('MouseEvents');
   evt.initEvent(type,true,true);
   elm.dispatchEvent(evt);
  }else if(window.event){
   var evt = document.createEventObject();
   evt.button = 1;
   elm.fireEvent('on'+type,evt);
  }
 };
 this.preventDefault = function(evt){ // デフォルト抑止
  if(evt && evt.preventDefault){
   evt.preventDefault();
   evt.currentTarget['on'+evt.type] = function(){
    return false;
   };
  }else if(window.event){
   window.event.returnValue = false;
  }
 };
 this.cancelBubble = function(evt){ // 伝播抑止
  evt && evt.stopPropagation ? evt.stopPropagation():window.event ? window.event.cancelBubble = true:false;  
 };
 /* 座標取得 */
 this.getElementLeft = function(elm){ // エレメントX座標
  var pos = elm.offsetLeft;
  while(elm.offsetParent){
   elm = elm.offsetParent;
   pos += elm.offsetLeft;
  }
  return pos;
 };
 this.getElementTop = function(elm){ // エレメントY座標
  var pos = elm.offsetTop;
  while(elm.offsetParent){
   elm = elm.offsetParent;
   pos += elm.offsetTop;
  }
  return pos;
 };
 this.clientX = function(evt){ // ポインタX座標
  evt = this.getevt(evt);
  return (this.opera ? evt.clientX:this.ie ? (this.scrollLeft()+evt.clientX):this.safari ? evt.pageX:evt.pageX);
 };
 this.clientY = function(evt){ // ポインタY座標
  evt = this.getevt(evt);
  return (this.opera ? evt.clientY:this.ie ? (this.scrollTop()+evt.clientY):this.safari ? evt.pageY:evt.pageY);
 };
 this.offsetX = function(evt){
  evt = this.getevt(evt);
  return (this.ie ? (evt.clientX+document.body.scrollLeft)-((evt.clientX+document.body.scrollLeft)-evt.srcElement.offsetLeft):(evt.clientX+document.body.scrollLeft)-((evt.clientX+document.body.scrollLeft)-evt.target.offsetLeft));
 };
 this.offsetY = function(evt){
  evt = this.getevt(evt);
  return (this.ie ? (evt.clientY+document.body.scrollTop)-((evt.clientY+document.body.scrollTop)-evt.srcElement.offsetTop):(evt.clientY+document.body.scrollTop)-((evt.clientY+document.body.scrollTop)-evt.target.offsetTop));
 };
 this.boxOffsetX = function(evt){
  evt = this.getevt(evt);
  return (this.ie || this.safari ? evt.offsetX:evt.layerX);
 };
 this.boxOffsetY = function(evt){
  return (this.ie || this.safari ? evt.offsetY:evt.layerY);
 };
 /* スタイル操作 */
 this.getCssSelector = function(selector){ // CSSセレクタ取得
  var css = document.styleSheets;
  for(var i = 0;i < css.length;i++){
   if(css.item(i).cssRules){
    var rules = css.item(i).cssRules;
   }else if(css.item(i).rules){
    var rules = css.item(i).rules;
   }
   for(var k = 0;k < rules.length;k++){
    var rule = rules.item(k);
    var reg = new RegExp('^'+selector+'$','i');
    if(rule.selectorText && rule.selectorText.match(reg)){
     var style = rule.style;
     return style;
    }
   }
  }
 };
 this.getInlineStyle = function(elm){ // インラインスタイル取得
  return (this.ie ? elm.style.cssText+';':elm.getAttribute('style'));
 };
 this.setInlineStyle = function(elm,style){ // インラインスタイル設定
  this.ie ? elm.style.cssText = style+';':elm.setAttribute('style',style);
 };
 this.insertCssRule = function(selector,value){ // CSSセレクタ追加
  var css = document.styleSheets[0];
  this.ie ? css.addRule(selector,value):css.insertRule(selector+'{'+value+'}',css.cssRules.length);    
 };
 this.deleteCssRule = function(index){ // CSSセレクタ削除
  var css = document.styleSheets[0];
  this.ie ? css.removeRule(index):css.deleteRule(index);
 };
 this.elmCentering = function(elm){ // エレメントセンタリング
  this.scrollLeft() > 0 ? elm.style.left = parseInt(((this.documentWidth()-elm.offsetWidth)/2)+this.scrollLeft())+'px':elm.style.left = parseInt((this.documentWidth()-elm.offsetWidth)/2)+'px';
  this.scrollTop() > 0 ? elm.style.top = parseInt(((this.documentHeight()-elm.offsetHeight)/2)+this.scrollTop())+'px':elm.style.top = parseInt((this.documentHeight()-elm.offsetHeight)/2)+'px';
  elm.style.position = 'absolute';
 };
 this.setOpacity = function(elm,value){ // 透明度設定
  this.ie ? elm.style.filter = 'alpha(opacity='+(value*10)+')':this.safari ? elm.style.opacity = value/10:elm.style.MozOpacity = value/10;
 };
 /* 選択範囲 */
 this.getSelection = function(){ // 選択範囲取得
  return (this.ie ? document.selection.createRange().text:this.safari ? window.getSelection():document.getSelection());
 };
 /* クッキー操作 */
 this.readCookie = function(name){ // クッキー読み込み
  var cookieName = name+'=';
  var cookies = document.cookie+';';
  var cookieStart = cookies.indexOf(cookieName);
  return (cookieStart != 1 ? unescape(cookies.substring(cookieStart+cookieName.length,cookies.indexOf(';',cookieStart))):false);
 };
 this.setCookie = function(name,value){ // クッキー書き込み
  var date = new Date();
  date.setTime(date.getTime()+(day*24*60*60*1000));
  var expires = '; expires='+date.toGMTString();
  document.cookie = name+'='+value+expires+'; path=/';
 };
 this.deleteCookie = function(name){ // クッキー削除
  document.cookie = name+'=; expires=Thu,01-Jan-70 00:00:01 GMT; path=/';
 };
 this.getCharCode = function(evt){ // 入力キーコード検出
  evt = this.getevt(evt);
  return ((evt.charCode) ? Number(evt.charCode):((evt.which) ? Number(evt.which):Number(evt.keyCode)));
 };
 this.cancelEnter = function(evt){ // エンター入力無効
  (this.getCharCode(evt) == 13 || this.getCharCode(evt) == 3) ? this.firefox ? this.preventDefault(evt):evt.returnValue = false: evt.returnValue= true;
 };
 this.cancelChar = function(evt,num){ // 特定文字入力無効
  var regexp = new RegExp(this.getCharCode(evt));
  var num = new String(num);
  num.match(regexp) != null ? this.firefox ? this.preventDefault(evt):evt.returnValue = false: evt.returnValue= true;
 };
 this.cancelInput = function(evt){ // 入力無効
  this.firefox ? this.preventDefault(evt):evt.returnValue = false;
 };
 /* 非同期通信 */
 this.ajaxRequest = function(url,method,$key,func,res){ 
  var req;
  var response;
  try{
   req = new ActiveXObject("Msxml2.XMLHTTP");
  }catch(e){
   try{
    req = new ActiveXObject("Microsoft.XMLHTTP");
   }catch(e){
    req = false;
   }
  }
  if(!req && typeof XMLHttpRequest != "undefined"){
   req = new XMLHttpRequest();
  }
  if(req){
   req.onreadystatechange = function(){
    if(req.readyState == 4 && req.status == 200){
     if(res == 'txt'){
      response = req.responseText;
     }else if(res == 'xml'){
      response = req.responseXML;
     }
     func(response);
    }
   }
   req.open(method,url);
   req.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
   req.send($key);
  }
 };
 /* ポップアップ */
 this.openPop = function(url,x,y){
  var opt = 'resizable=yes,scrollbars=yes,toolbar=no,menubar=no,directories=no,status=no,location=no';
  x ? opt += ',width='+x+',left='+((this.screenWidth/2)-x/2):opt = opt;
  y ? opt += ',height='+y+',top='+((this.screenHeight/2)-y/2):opt = opt;
  var pop = window.open(url,'popup',opt);
  this.blur = function(){
   pop ? pop.close():false;
  }
  this.addListener(window,'focus',this.blur);
  window.blur();
 };
};

/*
* prototype maglous Effectous
*/
/* エフェクト効果 */
maglous.prototype.effectous = {
 dropshadowtxt : function(obj){ // ドロップシャドウテキスト
  if(!obj){ return false;}
  this.dropshadowtxt.attachShadow = function(element){ 
   var span = obj.createElement('span');
   var txt = obj.getInnerTxt(element);
   span.appendChild(obj.createText(txt));
   element.appendChild(span);
   return true;
  }
  var dropshadow = obj.getElementsByClassName('dropshadowtxt');
  if(!dropshadow){ return ;}
  for(var k = 0;k < dropshadow.length;k++){
   this.dropshadowtxt.attachShadow(dropshadow.item(k));
  }
  return (obj.removeReady(obj.effectous.dropshadowtxt) ? true:false);
 }
};

/*
* prototype maglous movelous
*/
maglous.prototype.movelous = {
 
};
