function getMonthArray() {
  return new Array(
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"
  )
}

function getMonthDays(year) {
  var monthDays = new Array(
    "31",
    "28",
    "31",
    "30",
    "31",
    "30",
    "31",
    "31",
    "30",
    "31",
    "30",
    "31"
  )
  
  if(year%4 == 0) {
    monthDays[1] = "29"
  }
  
  if(year%100 == 0 && year%400 != 0) {
    monthDays[1] = "28"
  }
  
  return monthDays
}

function getGMTTime() {
  var time = new Date()
  var gmtMS = time.getTime() + (time.getTimezoneOffset() * 60000)
  return new Date(gmtMS)
}

function getDateHour(zone) {
  var gmtTime = getGMTTime()
  var dateHour = new Array()
  dateHour["day"] = gmtTime.getDate()
  dateHour["month"] = gmtTime.getMonth()
  dateHour["year"] = gmtTime.getYear()
  dateHour["hour"] = gmtTime.getHours() + zone
  
  var monthDays = getMonthDays(dateHour["year"])

  if(dateHour["year"] < 1000) {
    dateHour["year"] += 1900
  }

  if (dateHour["hour"] >= 24) {
    dateHour["hour"] = dateHour["hour"]-24
    dateHour["day"] -= -1
  }
  
  if (dateHour["hour"] < 0) {
    dateHour["hour"] -= -24
    dateHour["day"] -= 1
  }
  
  if (dateHour["hour"] < 10) {
    dateHour["hour"] = " " + dateHour["hour"]
  }
  
  if (dateHour["day"] <= 0) {
    if (dateHour["month"] == 0) {
	  dateHour["month"] = 11
	  dateHour["year"] -= 1
	} else {
	  dateHour["month"] = dateHour["month"] - 1
	}
    dateHour["day"] = monthDays[dateHour["month"]]
  }

  if(dateHour["day"] > monthDays[dateHour["month"]]) {
    dateHour["day"] = 1
    if(dateHour["month"] == 11) {
      dateHour["month"] = 0
      dateHour["year"] -= -1
	} else {
      dateHour["month"] -= -1
    }
  }
  
  return dateHour
}

function getMinutes() {
  var min = getGMTTime().getMinutes()
  return ( (min < 10) ? "0" : "" ) + min ;
}

function getSeconds() {
  var sec = getGMTTime().getSeconds()
  return ( (sec < 10) ? "0" : "" ) + sec ;
}

function createNewDate(month, hours, date) {
  var newDate = new Date()
  
  newDate.setMonth(month)
  newDate.setHours(hours)
  newDate.setDate(date)
  
  return newDate
}

function createStartDST(region) {
  var startDST = null
  
  if ( region == "NAmerica" ) {
    startDST = createNewDate(3, 2, 1)
    var dayDST = startDST.getDay()
    startDST.setDate( (dayDST != 0) ? 8-dayDST : 1 )
  } else if (region == "Europe") {
    startDST = createNewDate(2, 1, 31)
    var dayDST = startDST.getDay()
    startDST.setDate(31-dayDST)
  } else if (region == "SAmerica") {
    startDST = createNewDate(9, 0, 1)
    var dayDST = startDST.getDay()
    startDST.setDate( (dayDST != 0) ? 22-dayDST : 15 )
  } else if (region == "Cairo") {
    startDST = createNewDate(3, 0, 30)
    var dayDST = startDST.getDay()
    startDST.setDate( (dayDST < 5) ? 28-dayDST: 35-dayDST )
  } else if (region == "Israel") {
    startDST = createNewDate(3, 2, 1)
  } else if (region == "Beirut") {
    startDST = createNewDate(2, 0, 31)
    var dayDST = startDST.getDay()
    startDST.setDate(31-dayDST)
  } else if (region == "Baghdad") {
    startDST = createNewDate(3, 3, 1)
  } else if (region == "Australia") {
    startDST = createNewDate(2, 2, 31)
    var dayDST = startDST.getDay()
    startDST.setDate(31-dayDST)
  }
	
  return startDST
}

function createEndDST(region) {
  var endDST = null
  
  if (region == "NAmerica") {
    endDST = createNewDate(9, 1, 31)
    var dayDST = endDST.getDay()
    endDST.setDate(31-dayDST)
  } else if (region == "Europe") {
    endDST = createNewDate(9, 0, 31)
    var dayDST = endDST.getDay()
    endDST.setDate(31-dayDST)
  } else if (region == "SAmerica") {
    endDST = createNewDate(1, 11, 1)
    var dayDST = endDST.getDay()
    endDST.setDate( (dayDST != 0) ? 21-dayDST : 14 )
  } else if (region == "Cairo") {
    endDST = createNewDate(8, 11, 30)
    var dayDST = endDST.getDay()
    endDST.setDate( (dayDST < 4) ? 27-dayDST : 34-dayDST )
  } else if (region == "Israel") {
    endDST = createNewDate(8, 2, 25)
	var dayDST = endDST.getDay()
    if (dayDST != 0) {
      endDST.setDate(32-dayDST)
    } else {
      endDST.setDate(1)
      endDST.setMonth(9)
    }
  } else if (region == "Beirut") {
    endDST = createNewDate(9, 11, 31)
    var dayDST = endDST.getDay()
    endDST.setDate(30-dayDST)
  } else if (region == "Baghdad") {
    endDST = createNewDate(9, 3, 1)
  } else if (region == "Australia") {
    endDST = createNewDate(2, 2, 31)
	var dayDST = endDST.getDay()
	endDST.setDate(31-dayDST)
  }
  
  return endDST
}

function getDST(region, dateHour) {
  var startDST = createStartDST(region)
  var endDST = createEndDST(region)
  var currentTime = new Date()
  currentTime.setMonth(dateHour["month"])
  currentTime.setYear(dateHour["year"])
  currentTime.setDate(dateHour["day"])
  currentTime.setHours(dateHour["hour"])
  return (currentTime >= startDST && currentTime < endDST) ? 1 : 0 ; 
}

function dateTimeDST(day, month, year, hr, min, sec) {
  var monthDays = getMonthDays(year)
  
  hr -= -1
  
  if (hr >= 24) {
    hr = hr-24
	day -= -1
  }

  if (hr < 10) {
    hr = " " + hr
  }

  if(day > monthDays[month]) {
    day = 1
    if(month == 11) {
      month = 0
      year -= -1
    } else {
      month -= -1
    }
  }
  
  var datetime = new Array()
  datetime["dst"] = 1
  datetime["day"] = day
  datetime["month"] = month
  datetime["year"] = year
  datetime["hour"] = hr
  datetime["min"] = min
  datetime["sec"] = sec
  
  return datetime
}

function dateTimeNonDST(day, month, year, hr, min, sec) {
  var datetime = new Array()
  datetime["dst"] = 0
  datetime["day"] = day
  datetime["month"] = month
  datetime["year"] = year
  datetime["hour"] = hr
  datetime["min"] = min
  datetime["sec"] = sec
  
  return datetime
}

function defaultTemplate(datetime) {
  var monthArray = getMonthArray()
  return monthArray[datetime["month"]] + " " +
    datetime["day"] + ", " + datetime["year"] + "<br/>" +
	datetime["hour"] + ":" + datetime["min"] + ":" +
	datetime["sec"] + ( (datetime["dst"] == 1) ? " DST" : "" )
}

function worldClock(zone, region) {
  var dateHour = getDateHour(zone)
  var day = dateHour["day"]
  var month = dateHour["month"]
  var year = dateHour["year"]
  var hr = dateHour["hour"]
  var min = getMinutes()
  var sec = getSeconds()
  var dst = getDST(region, dateHour)

  var datetime = null;
  if ( dst == 1 ) {
    datetime = dateTimeDST(day, month, year, hr, min, sec)
  } else {
    datetime = dateTimeNonDST(day, month, year, hr, min, sec)
  }
  
  return defaultTemplate(datetime)
}
