﻿
function Range(min, max, minIn, maxIn)
{
     if(typeof(max)!=typeof(min)) throw "Range Type is not same";
     this.Min=min;
     this.Max=max;
     this.MinIn=minIn;
     this.MaxIn=maxIn;
     
     this.IsCover = function(tar){
        if(tar instanceof Range)
          return this.IsCover(tar.Min) && this.IsCover(tar.Max);
        return ((this.MinIn)?(this.Min<=tar):(this.Min<tar)) && ((this.MaxIn)?(this.Max>=tar):(this.Max>tar));
     }
     
     this.IsBefore = function(tar){
        if(tar instanceof Range)
          return this.IsBefore(tar.Min) && this.IsBefore(tar.Max);
        return ((this.MinIn)?(this.Min<=tar):(this.Min<tar)) && ((this.MaxIn)?(this.Max<=tar):(this.Max<tar));
     }

     this.IsStepIn = function(tar){
        if(tar instanceof Range)
          return this.IsCover(tar.Min) && this.IsBefore(tar.Max);
        throw "argument not Range type";
     }

     this.IsStepOut = function(tar){
        if(tar instanceof Range)
          return this.IsAfter(tar.Min) && this.IsCover(tar.Max);
        throw "argument not Range type";
     }
     
     this.IsAfter = function(tar){
        if(tar instanceof Range)
          return this.IsAfter(tar.Min) && this.IsAfter(tar.Max);
        return ((this.MinIn)?(this.Min>=tar):(this.Min>tar)) && ((this.MaxIn)?(this.Max>=tar):(this.Max>tar));
     }
}  


Object.ToArray = function(iterable){
  if (!iterable) return [];
  var results = [];
  for(var i = 0; i < iterable.length; i++)
    results.push(iterable[i]);
  return results;
}

Object.Union  =function(){var args=Object.ToArray(arguments),ret={};for(var i=0; i<args.length;i++)for(n in args[i])ret[n]=(!ret[n]&&typeof(ret[n])!='boolean')?args[i][n]:ret[n];return ret;};

Object.SetProperties = function(){
   var args = Object.ToArray(arguments);
   var obj = args[0];
   var ppts = args.slice(1);
   for(var i=0; i<ppts.length; i++)
   {
     var ppt = ppts[i];
     for(p in ppt)
     {
       try{
         if(p=="style")Object.SetProperties(obj.style, ppt[p]);
         else obj[p] = ppt[p];     
       }
       catch(e){}
     }
   }
}

Object.NewTag = function()
{
  var arr = Object.ToArray(arguments);
  var tag=document.createElement(arr.length>0?arr[0]:"div");
  var ppts = arr.slice(1);
  
  Object.SetProperties.apply({}, [tag].concat(ppts));
  return tag;
}

Object.NewTagInto = function()
{
   var arr = Object.ToArray(arguments);
   var obj = arr[0];
   var tag = Object.NewTag.apply({}, arr.slice(1));
   obj.appendChild(tag);
   return tag;
}

Function.prototype.Bind = function() {  
  var method=this;
  var args=Object.ToArray(arguments);
  var object=args.shift();
  return function() {
    return method.apply(object, args.concat(Object.ToArray(arguments)));
  }
}

String.Format = function(){
    if(arguments.length==0)return null; 
    var str = arguments[0]; 
    for(var i=1;i<arguments.length;i++){
      var re = new RegExp('\\{' + (i-1) + '\\}','gm');
      str = str.replace(re, arguments[i]);
    }
    return str;
}


Date.MonthLabels = ["January","February","March","April","May","June","July","August","September","October","November","December"];
Date.prototype.toEString = function(){
     var mArr = Date.MonthLabels;//new Array("January","February","March","April","May","June","July","August","September","October","November","December");
     return String.Format("{2} {1} {0} {3}:{4} {5}", 
            this.getFullYear(), 
            mArr[this.getMonth()], 
            (this.getDate().toString().length==1?"0":"")+this.getDate(), 
            ((this.getHours()%12==0)?12:this.getHours()%12), 
            (this.getMinutes().toString().length==1?"0":"")+this.getMinutes(), 
            (this.getHours()/12>=1?"PM":"AM")
     );     
}

Array.prototype.Exist = function(match)
{
   for(var i=0; i<this.length; i++)
     if(match(this[i]))
       return true;
   return false;
}

Array.prototype.Foreach = function(action)
{
   for(var i=0; i<this.length; i++)
     action(this[i]);
}

Array.prototype.GetMatches = function(match)
{
   var ret = new Array();
   for(var i=0; i<this.length; i++)
     if(match(this[i]))ret.push(this[i]);
   return ret;
}
