/*********************************************************************************
 * SugarCRM Community Edition is a customer relationship management program developed by
 * SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc.
 * 
 * This program is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Affero General Public License version 3 as published by the
 * Free Software Foundation with the addition of the following permission added
 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
 * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Affero General Public License along with
 * this program; if not, see http://www.gnu.org/licenses or write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301 USA.
 * 
 * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
 * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
 * 
 * The interactive user interfaces in modified source and object code versions
 * of this program must display Appropriate Legal Notices, as required under
 * Section 5 of the GNU Affero General Public License version 3.
 * 
 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
 * these Appropriate Legal Notices must retain the display of the "Powered by
 * SugarCRM" logo. If the display of the logo is not reasonably feasible for
 * technical reasons, the Appropriate Legal Notices must display the words
 * "Powered by SugarCRM".
 ********************************************************************************/

///////////////////////////////////////////////
// Class SugarClass
// superclass for all Sugar* sub-classes
//
///////////////////////////////////////////////

function SugarClass() {
    this.init();
}

SugarClass.prototype.init = function() {}

// create inheritance for a class
SugarClass.inherit = function(className,parentClassName) {
  var str = className+".prototype = new "+parentClassName+"();";
  str += className+".prototype.constructor = "+className+";";
  str += className+".superclass = "+parentClassName+".prototype;";

  try {
    eval(str);
  } catch (e) {}
}

//Root class of Sugar JS Application:

SugarClass.inherit("SugarContainer", "SugarClass");

function SugarContainer(root_div) {
    GLOBAL_REGISTRY.container = this;
    this.init(root_div);
}

SugarContainer.prototype.init = function(root_div) {
    this.root_div = root_div;
    SugarContainer.superclass.init.call(this);
}

SugarContainer.prototype.start = function(root_widget) {
      this.root_widget = new root_widget();
      this.root_widget.load(this.root_div);
}

if(typeof(global_request_registry) == "undefined") {
    var global_request_registry = new Object();
}
var req_count = 0;

//////////////////////////////////////////////////
// class: SugarDateTime 
// date and time utilities
//
//////////////////////////////////////////////////

SugarClass.inherit("SugarDateTime","SugarClass");

function SugarDateTime() {
    this.init(root_div);
}

SugarDateTime.prototype.init = function(root_div) {
    this.root_div = root_div;
}

// return the javascript Date object
// given the Sugar Meetings date_start/time_start or date_end/time_end
SugarDateTime.mysql2jsDateTime = function(mysql_date, mysql_time) {
    var match = new RegExp(date_reg_format);
    if (((result = match.exec(mysql_date))) == null) {
        return null;
    }

    var match2 = new RegExp(time_reg_format);
    
    if ((result2 = match2.exec(mysql_time)) == null) {
        result2 = [0,0,0,0];
    }

    var match3 = /^0(\d)/;

    if ((result3 = match3.exec(result2[1])) != null) {
        result2[1] = result3[1];
    }

    if (typeof (result2[3]) != 'undefined') {
        if (result2[3] == 'pm' || result2[3] == 'PM') {
            if (parseInt(result2[1]) != 12) {
                result2[1] = parseInt(result2[1]) + 12;
            }
        }
        else if (result2[1] == 12) {
            result2[1] = 0;
        }
    }

    return new Date(result[date_reg_positions['Y']], result[date_reg_positions['m']] - 1, result[date_reg_positions['d']], result2[1], result2[2], 0, 0);
}
// make it a static func

// return the formatted day of the week of the date given a date object
SugarDateTime.prototype.getFormattedDate = function(date_obj) {
    var returnDate = '';
    var userDateFormat = GLOBAL_REGISTRY['current_user']['fields']['date_time_format']['date'];
    var dow = GLOBAL_REGISTRY['calendar_strings']['dom_cal_weekdays_long'][date_obj.getDay()];
    var month = date_obj.getMonth() + 1;
    month = GLOBAL_REGISTRY['calendar_strings']['dom_cal_month_long'][month];

    returnDate = dow;

    for (i = 0; i < 5; i++) {
        switch (userDateFormat.charAt(i)) {
            case "Y":
                returnDate += " " + date_obj.getFullYear();
                break;
            case "m":
                returnDate += " " + month;
                break;
            case "d":
                returnDate += " " + date_obj.getDate();
                break;
            default:
            // cn: use locale's date separator? probably not.
            //returnDate += " " + userDateFormat.charAt(i);
        }
    }

    return returnDate;
}

SugarDateTime.getFormattedDate = SugarDateTime.prototype.getFormattedDate;

// return the formatted day of the week of the date given a date object
SugarDateTime.prototype.getFormattedDOW = function(date_obj) {
    var hour = config.strings.mod_strings.Calendar.dow[date_obj.getDay()];
}
SugarDateTime.getFormattedDOW = SugarDateTime.prototype.getFormattedDOW;

// return the formatted hour of the date given a date object
SugarDateTime.getAMPM = function(date_obj) {
    var hour = date_obj.getHour();
    var am_pm = 'AM';
    if (hour > 12) {
        hour -= 12;
        am_pm = 'PM';
    }
    else if (hour == 12) {
        am_pm = 'PM';
    }
    else if (hour == 0) {
        hour = 12;
    }
    return am_pm;
}
SugarDateTime.getFormattedHour = SugarDateTime.prototype.getFormattedHour;

//mod.SugarDateTime.getFormattedDate = publ.getFormattedDate;

// return the javascript Date object given a vCal UTC string
SugarDateTime.prototype.parseUTCDate = function(date_string) {
    var match = /(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z/;
    if (((result = match.exec(date_string))) != null) {
        var new_date = new Date(Date.UTC(result[1], result[2] - 1, result[3], result[4], result[5], parseInt(result[6]) + time_offset));
        return new_date;
    }

}

SugarDateTime.parseUTCDate = SugarDateTime.prototype.parseUTCDate;

SugarDateTime.prototype.parseAdjustedDate = function(date_string, dst_start, dst_end, gmt_offset_secs) {

    var match = /(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})Z/;
    dst_start_parse = match.exec(dst_start);
    dst_end_parse = match.exec(dst_end);

    if (dst_start_parse == null || dst_end_parse == null) {
        var new_date = new Date(result[1], result[2] - 1, result[3], result[4], result[5], parseInt(result[6]));
        new_date = new Date(new_date.getTime() + gmt_offset_secs * 1000);
    } else {
        dst_start_obj = new Date(dst_start_parse[1], dst_start_parse[2] - 1, dst_start_parse[3], dst_start_parse[4], dst_start_parse[5], parseInt(dst_start_parse[6]));
        dst_end_obj = new Date(dst_end_parse[1], dst_end_parse[2] - 1, dst_end_parse[3], dst_end_parse[4], dst_end_parse[5], parseInt(dst_end_parse[6]));

        if (((result = match.exec(date_string))) != null) {
            var new_date = new Date(result[1], result[2] - 1, result[3], result[4], result[5], parseInt(result[6]));
            var event_ts = new_date.getTime();
            var dst_start_ts = dst_start_obj.getTime();
            var dst_end_ts = dst_end_obj.getTime();

            if (((event_ts >= dst_start_ts || event_ts < dst_end_ts) && dst_start_ts > dst_end_ts)
                    || (event_ts >= dst_start_ts && event_ts < dst_end_ts)) {
                new_date = new Date(new_date.getTime() + 60 * 60 * 1000);
            }

            new_date = new Date(new_date.getTime() + gmt_offset_secs * 1000);

        }
    }
    return new_date;
}

SugarDateTime.parseAdjustedDate = SugarDateTime.prototype.parseAdjustedDate;

// create a hash based on a date
SugarDateTime.prototype.getUTCHash = function(startdate) {
    var month = (startdate.getUTCMonth() < 10) ? "0" + startdate.getUTCMonth() : "" + startdate.getUTCMonth();
    var day = (startdate.getUTCDate() < 10) ? "0" + startdate.getUTCDate() : "" + startdate.getUTCDate();
    var hours = (startdate.getUTCHours() < 10) ? "0" + startdate.getUTCHours() : "" + startdate.getUTCHours();
    var minutes = (startdate.getUTCMinutes() < 10) ? "0" + startdate.getUTCMinutes() : "" + startdate.getUTCMinutes();
    return startdate.getUTCFullYear() + month + day + hours + minutes;
}

SugarDateTime.getUTCHash = SugarDateTime.prototype.getUTCHash;

