////////////////////////////////////////////////////////////////////////
///
////////////////////////////////////////////////////////////////////////
if ( typeof( IPG ) == 'undefined' ) IPG = {};
if( !IPG.Utility ){
    
    IPG.Utility = {
        
        /**
         * 引数[element]が[string]の場合、それをIDからノードを取得して、
         * [object]の場合、それ自身をノードとして返す。
         * @param {Object} element
         */
        getElement :  function( element ){
            var elm = undefined;
            if( !element ) return elm;
            if( typeof( element ) === "string" ){
                elm = window.document.getElementById( element );
            }else if( typeof( element ) === "object" ){
                elm = element;
            }
            return elm;
        },
        
        /**
         * 座標の単位をトリムします。トリムする必要が有れば。
         * 
         * @param {Object} coordinate
         */
        trimUnit : function( coordinate , unit ){
            if( typeof( coordinate ) === "number" ) return coordinate;
            if( !unit ) unit = "px";
            if( typeof( coordinate ) === "string" ) return ( coordinate.indexOf( unit , 0 ) > -1 ) ? eval( coordinate.replace( unit , "" ) ) : 0;
            return undefined;
        },
        
        isSIDate: function( str ){
            var date_array = str.split("-");
            if( !date_array || date_array.length != 3 ) return undefined;
            if( date_array[0].length != 4 ) return undefined;
            if( date_array[1].length > 2 ) return undefined;
            if( date_array[1].length == 1 ) date_array[1] = "0"+date_array[1];
            if( date_array[2].length > 2 ) return undefined;
            if( date_array[2].length == 1 ) date_array[2] = "0"+date_array[2];
            var date = new Date( date_array[0] , date_array[1]-1 , date_array[2] );
            if( !date || date == 'Invalid Date' ) return undefined;
            return date_array[0] +"-"+ date_array[1] +"-"+ date_array[2];
        },
        
        getHourFromSIDateStr : function( date , delimiter ){
            if( !date ) return;
            var dateObj = undefined;
            if( typeof( date ) == "string" ){
                if( !delimiter ) delimiter = "T";
                var array = date.split( delimiter );
                if( !array || !array[0] ) return;
                var date_array = array[0].split("-");
                if( !date_array || date_array.length != 3 ) return;
                var time_array = "00:00:00".split(":");
                if( array[1] ) time_array = array[1].split(":");
                if( !time_array || time_array.length != 3 ) return;
                dateObj = new Date( date_array[0] , date_array[1]-1 , date_array[2] , time_array[0] , time_array[1] , "00" );
            }else if( typeof( date ) == "number" ){
                dateObj = new Date( date );
            }
            return dateObj.getHours();
        },

        getTimeFromSIDateStr : function( dateStr , delimiter ){
            if( !dateStr || typeof( dateStr ) != "string" ) return;
            if( !delimiter ) delimiter = "T";
            var array = dateStr.split( delimiter );
            if( !array || !array[0] ) return;
            var date_array = array[0].split("-");
            if( !date_array || date_array.length != 3 ) return;
            var time_array = "00:00:00".split(":");
            if( array[1] ) time_array = array[1].split(":");
            if( !time_array || time_array.length != 3 ) return;
            return  new Date( date_array[0] , date_array[1]-1 , date_array[2] , time_array[0] , time_array[1] , "00" ).getTime();
        },
        
        getHHMMFromSIDateStr : function( dateStr , delimiter , separator ){
            if( !dateStr || typeof( dateStr ) != "string" ) return;
            if( !delimiter ) delimiter = "T";
            if( !separator ) separator = ":";
            var array = dateStr.split( delimiter );
            var time_array = undefined;
            if( array[1] ) time_array = array[1].split(":");
            if( !time_array || time_array.length != 3 ) return;
            return  time_array[0] + separator + time_array[1];
        },
        
        getYYYYMMDDHHMMFromSIDateStr : function( dateStr , delimiter ){
            if( !dateStr || typeof( dateStr ) != "string" ) return;
            if( !delimiter ) delimiter = "T";
            var array = dateStr.split( delimiter );
            if( !array || !array[0] ) return;
            var date_array = array[0].split("-");
            if( !date_array || date_array.length != 3 ) return;
            var time_array = "00:00:00".split(":");
            if( array[1] ) time_array = array[1].split(":");
            if( !time_array || time_array.length != 3 ) return;
            return  date_array[0] +"/"+ date_array[1] +"/"+ date_array[2] +" "+ ( (time_array[0].length != 2) ? "0"+time_array[0] : time_array[0] ) +":"+ ( (time_array[1].length != 2) ? "0"+time_array[1] : time_array[1] );
        },
        
        getSIDateYYYYMMDDStrFromMillisec : function( millisecond ){
            if( !millisecond ) return;
            var date = new Date( millisecond );
            var y = date.getFullYear();
            var m = ( date.getMonth()+1 );
            if( m < 10 ) m = "0"+m;
            var d = date.getDate();
            if( d < 10 ) d = "0"+d;
            return y+"-"+m+"-"+d;
        },
        
        getSIDateFullStrFromMillisec : function( millisecond ){
            if( !millisecond ) return;
            var date = new Date( millisecond );
            var y = date.getFullYear();
            var m = ( date.getMonth()+1 );
            if( m < 10 ) m = "0"+m;
            var d = date.getDate();
            if( d < 10 ) d = "0"+d;
            var hour = date.getHours();
            if( hour < 10 ) hour = "0"+hour;
            var min = date.getMinutes();
            if( min < 10 ) min = "0"+min;
            var sec = date.getSeconds();
            if( sec < 10 ) sec = "0"+sec;
            return y+"-"+m+"-"+d+"T"+hour+":"+min+":"+sec;
        },
        
        getLastUpdateStrFromMillisec : function( millisecond ){
            if( !millisecond ) return;
            var date = new Date( millisecond );
            var y = date.getFullYear();
            var m = ( date.getMonth()+1 );
            if( m < 10 ) m = "0"+m;
            var d = date.getDate();
            if( d < 10 ) d = "0"+d;
            var hour = date.getHours();
            if( hour < 10 ) hour = "0"+hour;
            var min = date.getMinutes();
            if( min < 10 ) min = "0"+min;
            var sec = date.getSeconds();
            if( sec < 10 ) sec = "0"+sec;
            return y+"/"+m+"/"+d+" "+hour+":"+min+":"+sec;
        },
        
        comparSIDateStr : function( baseDate , targetDate ){
            if( baseDate == undefined || targetDate == undefined ) return;
            
            var baseTime = undefined;
            if( typeof( baseDate ) == "number" ) baseTime = baseDate;
            if( typeof( baseDate ) == "string" ) baseTime = IPG.Utility.getTimeFromSIDateStr( baseDate );
            if( baseTime == undefined ) return;
            
            var targetTime = undefined;
            if( typeof( targetDate ) == "number" ) targetTime = targetDate;
            if( typeof( targetDate ) == "string" ) targetTime = IPG.Utility.getTimeFromSIDateStr( targetDate );
            if( targetTime == undefined ) return;
            
            if( baseTime == targetTime ) return 0;
            else if( baseTime > targetTime ) return -1;
            else return 1;
        },
        
        getMinuteDistance : function( startDate , endDate ){
            if( startDate == undefined || endDate == undefined ) return;
            
            var startTime = undefined;
            if( typeof( startDate ) == "number" ) startTime = startDate;
            if( typeof( startDate ) == "string" ) startTime = IPG.Utility.getTimeFromSIDateStr( startDate );
            if( startTime == undefined ) return;
            
            var endTime = undefined;
            if( typeof( endDate ) == "number" ) endTime = endDate;
            if( typeof( endDate ) == "string" ) endTime = IPG.Utility.getTimeFromSIDateStr( endDate );
            if( endTime == undefined ) return;
            
            return Math.floor( ( endTime - startTime ) / 1000 / 60 );
        },
        
        getMinuteToNextHour : function( startDate ){
            if( startDate == undefined ) return;
            
            var startTime = undefined;
            if( typeof( startDate ) == "number" ) startTime = startDate;
            if( typeof( startDate ) == "string" ) startTime = IPG.Utility.getTimeFromSIDateStr( startDate );
            if( startTime == undefined ) return;
            
            var start = new Date( startTime );
            start.setSeconds( 0 );
            start.setMilliseconds( 0 );
            
            var next = new Date( startTime );
            next.setHours( next.getHours()+1 );
            next.setMinutes( 0 );
            next.setSeconds( 0 );
            next.setMilliseconds( 0 );
            
            return Math.floor( ( next - start ) / 1000 / 60 );
        },

        /**
         * 引数に渡すエレメントを選択不可エレメントにします。
         * けど、絶対では有りません。
         * 指定エレメント内での選択不可は保障されますが、
         * エレメント外部からの選択状態でのドラッグは防げません。
         * 
         * @param {Object} element
         */
        disableSelection : function( element , pointer ){
            element.onselectstart = function() {
                return false;
            };
            element.unselectable = "on";
            Element.setStyle( element , "-moz-user-focus: normal;" );
            Element.setStyle( element , "-moz-user-select: none;" );
            Element.setStyle( element , "-khtml-user-select: none;" );
            if( !pointer ) pointer = "default";
        },

        /**
         * 選択領域のクリア
         * 引数は取らないので、問答無用でALLクリアする。
         */
        clearTextRange : function(){
            // 現状[FireFox][Safari]ではスタイルによる規制をかけてるので、
            // 明示的なRangeクリアは要らない感じ。
            var s = IPG.Utility.getSelectionObj();
            if( Prototype.Browser.Gecko ){
                if( s.rangeCount > 0 ) s.removeAllRanges();
            }else if( Prototype.Browser.WebKit ){
                s.empty();
            }else if( Prototype.Browser.IE ){
                s.empty();
            }
        },

        /**
         * いらんかも？
         */
        getSelectionObj : function(){
            if( document.selection ){
                return document.selection;
            }else if( window.getSelection ){
                return window.getSelection();
            }else if( document.getSelection ){
                return document.getSelection;
            }
            return null;
        },

        /**
         * Eventオブジェクトをクロスブラウザ的に補正。
         * 
         * @param {Object} evt
         * @param {Object} element
         */
        fixEvent: function( evt , element ){
            if( !evt ){
                if( element && element.document ) evt = element.document.parentWindow.event;
                else evt = window.event;
            }
            Event.extend( evt );
            if( !evt.srcElement ){
                var tmpNode = evt.target;
                while( tmpNode  != null && tmpNode.nodeType != 1 ){
                    tmpNode = tmpNode.parentNode;
                }
                evt.srcElement = tmpNode;
            }
            if( evt.preventDefault == undefined ) evt.preventDefault = function() { this.returnValue = false };
            if( evt.preventDefault == undefined ) evt.preventDefault = function() { this.returnValue = false };
            if( evt.pageX == undefined ) evt.pageX = Event.pointerX( evt );
            if( evt.pageY == undefined ) evt.pageY = Event.pointerY( evt );
            if( evt.offsetX == undefined && evt.layerX != undefined ) evt.offsetX = evt.layerX;
            if( evt.offsetY == undefined && evt.layerY != undefined ) evt.offsetY = evt.layerY;
            if( evt.which == undefined && evt.button != undefined ) evt.which = ( evt.button & 1 ? 1 : ( evt.button & 2 ? 3 : ( evt.button & 4 ? 2 : 0 ) ));
            return evt;
        },

        /**
         * prototype.js の Event.observe() と似たような物。
         * キャプチャ[true]で処理したいのでフラグ[true]でリスナ登録します。
         * 引数の妥当性の考慮とかはせずに、addEventListener/attachEventの分岐だけに留めます。
         * @param {Object} element
         * @param {Object} eventName [on]は要りません。
         * @param {Object} callback
         */
/*
        eventObserve: function( element , eventName , handler ){
            if( element.addEventListener ){
                element.addEventListener( eventName , handler, false );
            }else{
                element.attachEvent( "on"+eventName , handler );
            }
        },
*/
        /**
         * prototype.js の Event.stopObserving() と似たような物。
         * wrapperとかは作ってないので、指定ハンドラの妥当性は関知しません。
         * @param {Object} element
         * @param {Object} eventName [on]は要りません。
         * @param {Object} callback
         */
/*
        stopObserving: function( element , eventName , handler ){
            if( element.removeEventListener ){
                element.removeEventListener( eventName , handler, true );
            }else{
                element.detachEvent( "on"+eventName , handler );
            }
        },
*/

        /**
         * デバッグ用のテキストアウトプット。
         * IDで取得するオブジェクトの[innerHTML]に出力するので、
         * それっぽい対象を指定してください。
         * 重いです。パフォーマンスを気にするときには使わないように。
         * @param {Object} msg
         * @param {Object} target_id
         */
       debugOut : function( msg , target_id , color ){
            if( !target_id ) target_id = "debug";
            var target_obj = $( target_id );
            if( !target_obj ) return;
            var date = new Date();
            var timestamp = "["+date.toTimeString()+"]-["+date.getMilliseconds()+"]";
            var c = ( color ) ? color : "black";
            var s_color = ( c ) ? "<span style=\"color: "+c+";\">" : "<span>";
            var e_color = "</span>"
            target_obj.innerHTML += s_color+timestamp+" "+msg+e_color+"<br>";
        },
        
        /**
         * デバッグ用のテキストアウトプットの出力結果をクリアします。
         * @param {Object} target_id
         */
        debugClear : function( target_id ){
            if( !target_id ) target_id = "debug";
            var target_obj = $( target_id );
            if( target_obj ) target_obj.innerHTML = "";
        }
    };
}
