﻿function getQueryString(key) {
    var page = new PageQuery(window.location.search);
    var returnValue = page.getValue(key);

    if (returnValue == false) {
        return '';
    }
    else {
        return unescape(returnValue);
    }
}

function PageQuery(q) {
    if (q.length > 1) this.q = q.substring(1, q.length);
    else this.q = null;
    this.keyValuePairs = new Array();
    if (q) {
        for (var i = 0; i < this.q.split("&").length; i++) {
            this.keyValuePairs[i] = this.q.split("&")[i];
        }
    }
    this.getKeyValuePairs = function() { return this.keyValuePairs; }
    this.getValue = function(s) {
        for (var j = 0; j < this.keyValuePairs.length; j++) {
            if (this.keyValuePairs[j].split("=")[0] == s)
                return this.keyValuePairs[j].split("=")[1];
        }
        return false;
    }
    this.getParameters = function() {
        var a = new Array(this.getLength());
        for (var j = 0; j < this.keyValuePairs.length; j++) {
            a[j] = this.keyValuePairs[j].split("=")[0];
        }
        return a;
    }
    this.getLength = function() { return this.keyValuePairs.length; }
}

function setText(element, text) {
    if (typeof element.textContent != 'undefined') {
        element.textContent = text;
    }
    else if (typeof element.innerText != 'undefined') {
        element.innerText = text;
    }
}

function setHTML(element, text) {
    if (typeof element.textContent != 'undefined') {
        element.textContent = text;
    }
    else if (typeof element.innerHTML != 'undefined') {
        element.innerHTML = text;
    }
}

function selectListBoxByText(listBox, text) {
    listBox.selectedIndex = 0;

    var length = listBox.options.length;

    for (var i = 0; i < length; i++) {
        if (listBox.options[i].text == text) {
            listBox.selectedIndex = i;
            break;
        }
    }
}

function selectListBoxByValue(listBox, value) {
    listBox.selectedIndex = 0;

    var length = listBox.options.length;

    for (var i = 0; i < length; i++) {
        if (listBox.options[i].value == value) {
            listBox.selectedIndex = i;
            break;
        }
    }
}

//////////////////////////////////////////////////////////////////dropdown menu
$.fn.dropdownmenu = function (options) {

    options = $.extend({ speed: 250 }, options || {});

    this.each(function () {

        var root = this, zIndex = 1000000000;

        function getSubnav(ele) {
            if (ele.nodeName.toLowerCase() == 'li') {
                var subnav = $('> ul', ele);
                return subnav.length ? subnav[0] : null;
            } else {
                return ele;
            }
        }

        function getActuator(ele) {
            if (ele.nodeName.toLowerCase() == 'ul') {
                return $(ele).parents('li')[0];
            } else {
                return ele;
            }
        }

        function hide() {
            var subnav = getSubnav(this);
            if (!subnav) return;
            $.data(subnav, 'cancelHide', false);
            setTimeout(function () {
                if (!$.data(subnav, 'cancelHide')) {
                    $(subnav).slideUp(options.speed);
                }
            }, 500);
        }

        function show() {
            var subnav = getSubnav(this);
            if (!subnav) return;
            $.data(subnav, 'cancelHide', true);
            $(subnav).css({ zIndex: zIndex++ }).slideDown(options.speed);
            if (this.nodeName.toLowerCase() == 'ul') {
                var li = getActuator(this);
                $(li).addClass('hover');
                $('> a', li).addClass('hover');
            }
        }

        $('ul, li', this).hover(show, hide);
        $('li', this).hover(
      function () { $(this).addClass('hover'); $('> a', this).addClass('hover'); },
      function () { $(this).removeClass('hover'); $('> a', this).removeClass('hover'); });

    });

};


//////////////////////////////////////////////////////////////
; (function ($) {
    $.fn.jcalendar = function (options) {
        var opts = $.extend({}, $.fn.jcalendar.defaults, options);
        return this.each(function () {
            $this = $(this);
            var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
            $.fn.jcalendar.draw(o);
        });
    };

    /**
    * Get calendar's header (day names)
    * @param {Object} opts
    */
    $.fn.jcalendar.getHead = function (opts) {
        var html = [];
        for (var i = 0; i < opts.days.length; i++) {
            html.push('<td>' + opts.days[i] + '</td>');
        }
        return html.join('');
    };

    /**
    * Main function for drawing calendar
    * @param {Object} opts
    */
    $.fn.jcalendar.draw = function (opts) {
        var o = $.extend({}, this.defaults, opts);

        month = parseInt(o.month, 10);
        year = parseInt(o.year, 10);

        var today = new Date();
        var srcDate = opts.selectedDate;
        if (!isNaN(year)) {
            srcDate.setDate(1);
            srcDate.setFullYear(year);
        }
        if (!isNaN(month)) {
            srcDate.setDate(1);
            srcDate.setMonth(month);
        }
        var curDate = srcDate.getDate();
        var curMonth = srcDate.getMonth();
        var curYear = srcDate.getFullYear();

        var dates = [];
        var passeddates = '';
        var dayCount = new Date(curYear, curMonth + 1, 0).getDate();
        for (var i = 1; i <= dayCount; i++) {
            if (i == 1) {
                var tmpDate = new Date(curYear, curMonth, i);
                var myday = tmpDate.getDay();
                for (var t = 1 - myday; t < 1; t++) {
                    var tmpDate = new Date(curYear, curMonth, t);
                    dates.push(tmpDate);
                    passeddates += tmpDate.toLocaleString() + ';';
                }
            }

            var tmpDate = new Date(curYear, curMonth, i);

            if (tmpDate.getMonth() == curMonth && tmpDate.getFullYear() == curYear) {
                dates.push(tmpDate);
                passeddates += tmpDate.toLocaleString() + ';';
            }

            if (i == dayCount) {
                var myday = tmpDate.getDay();
                for (var t = 1; t < 7 - myday; t++) {
                    tmpDate = new Date(curYear, curMonth + 1, t);
                    dates.push(tmpDate);
                    passeddates += tmpDate.toLocaleString() + ';';
                }
            }
        }

        var theRoot = this;
        var theRootDollar = $this;

        if (opts.LocaleDisplay == 'en') {
            _processLayout(dates, null, theRoot, theRootDollar, o, today, curDate, curMonth, curYear);
            return;
        }

        $.ajax({
            type: "POST",
            url: "webservices/ZiWeiServices.asmx/GetChineseDays",
            data: "{WestDays: '" + passeddates + "'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) {
                var allChineseDates = response.d;
                _processLayout(dates, allChineseDates, theRoot, theRootDollar, o, today, curDate, curMonth, curYear);
            }
        });
    };

    function _processLayout(dates, allChineseDates, theRoot, theRootDollar, o, today, curDate, curMonth, curYear) {

        var table = $('<table cellspacing="0" border="0" class="cal_layout" style="width:' + o.tableWidth + '; border-collapse: collapse;"></table>');
        var str = '<tbody><tr>' + theRoot.getHead(o) + '</tr>', cl = '';
        var line = [];
        for (var j = 0; j < dates.length; j++) {
            var day = dates[j].getDay();
            var month = dates[j].getMonth();
            var year = dates[j].getFullYear();

            var date = dates[j].getDate();
            var rel = _formatLink(o.dateFormat, dates[j]);
            cl = '';
            if (date == today.getDate() && month == today.getMonth() && year == today.getFullYear()) {
                cl = ' class="curr"';
            } else if (day == 6 || day == 0) {
                cl = ' class="weekend"';
            }
            else if (date == curDate && month == curMonth && year == curYear) {
                cl = ' class="sel"';
            }
            var href = 'javascript:';
            if (o.linkFormat != null && o.linkFormat != undefined) {
                href = _formatLink(o.linkFormat, dates[j]);
            }
            if (allChineseDates != null) {
                line.push('<td' + cl + '><a href="' + href + '" rel="' + rel + '">' + date + '<br /><span>' + allChineseDates[j] + '</span></a></td>');
            }
            else {
                line.push('<td' + cl + '><a href="' + href + '" rel="' + rel + '">' + date + '</a></td>');
            }
            if (dates[j].getDay() == 6) {
                str += '<tr>' + line.join('') + '</tr>';
                line = [];
            } else if (j == (dates.length - 1)) {
                str += '<tr>' + line.join('') + '</tr>';
            }
        }
        str += '</tbody>';
        table.html(str);
        if (typeof o.onSelect == 'function') {
            table.find('a').click(function () {
                return o.onSelect($(this).attr('rel'));
            });
        }
        var y = '';
        if (o.showYear == true) {
            y = ' ' + curYear + ' ';
        }
        theRootDollar[0].innerHTML = '<span class="state" style="display:none;">' + curMonth + '.' + curYear + '</span><div class="monthName"><a href="#" class="cal_next">' + o.nextArrow + '</a><a href="#" class="cal_prev">' + o.prevArrow + '</a> ' + o.months[curMonth] + y + ' </div>';
        theRootDollar.append(table)
             .find('.monthName').width(theRootDollar.find('.cal_layout').width());
        var ddlyearID = theRootDollar.attr('id') + '_ddlyearscal';
        var ddlmonthID = theRootDollar.attr('id') + '_ddlmonthscal';
        theRootDollar.append('<select id="' + ddlyearID + '" style="width:70px;"></select><select id="' + ddlmonthID + '"></select>');

        for (var i = curYear - 145; i < curYear + 145; i++) {
            $("#" + ddlyearID).append('<option value="' + i + '">' + i + '</option>');
        }
        $("#" + ddlyearID).val(curYear).attr("selected", "selected");
        for (var i = 1; i < 13; i++) {
            $("#" + ddlmonthID).append('<option value="' + i + '">' + i + '</option>');
        }
        $('#' + ddlmonthID).val(curMonth + 1).attr("selected", "selected");
        $("#" + ddlyearID).change(function () {
            _selectChange(theRootDollar, o, $("#" + ddlyearID).val(), $("#" + ddlmonthID).val());
        });

        $("#" + ddlmonthID).change(function () {
            _selectChange(theRootDollar, o, $("#" + ddlyearID).val(), $("#" + ddlmonthID).val());
        });

        theRoot.next($this.find('.cal_next'), o);
        theRoot.prev($this.find('.cal_prev'), o);
    };

    /**
    * Format link
    * @param {String} format
    * @param {Object} objDate
    */
    function _formatLink(format, objDate) {
        var date = objDate.getDate();
        var month = objDate.getMonth() + 1;
        var year = objDate.getFullYear();
        if (format.indexOf('{%dd}') != -1) {
            date = _formatNum(date);
        }
        if (format.indexOf('{%mm}') != -1) {
            month = _formatNum(month);
        }
        if (format.indexOf('{%yy}') != -1) {
            year = year.toString().slice(2);
        }
        var link = format.replace(/{%d(d)?}/, date).replace(/{%m(m)?}/, month).replace(/{%yy(yy)?}/, year);
        return link;
    };

    /**
    * Format date for link's 'rel' attribute
    * @param {String} format
    * @param {Object} objDate
    */
    function _formatDate(format, objDate) {
        var date = objDate.getDate();
        var month = objDate.getMonth();
        var year = objDate.getFullYear();
        if (format.indexOf('{%dd}') != -1) {
            date = _formatNum(date);
        }
        if (format.indexOf('{%mm}') != -1) {
            month = _formatNum(month);
        }
        if (format.indexOf('{%yy}') != -1) {
            year = year.toString().slice(2);
        }
        month++;
        var link = format.replace(/{%d(d)?}/, date).replace(/{%m(m)?}/, month).replace(/{%yy(yy)?}/, year);
        return link;
    };

    /**
    * Show next month
    */
    $.fn.jcalendar.next = function (button, o) {
        this.change(button, 1, o);
    };

    /**
    * Show previous month
    * @param {Object} button
    */
    $.fn.jcalendar.prev = function (button, o) {
        this.change(button, -1, o);
    };

    /**
    * Switch to another month
    * @param {Object} button
    * @param {Integer} monthDelta
    */
    $.fn.jcalendar.change = function (button, monthDelta, o) {
        var opts = $.extend({}, $.fn.jcalendar.defaults, o);
        var _self = this;
        var parent = button.parent('.monthName').parent();
        button.click(function () {
            var state = _self.getState(parent);
            var d = new Date(state[1], state[0] + monthDelta, 1);
            opts.month = d.getMonth();
            opts.year = d.getFullYear();
            parent.jcalendar(opts);
            return false;
        });
    };

    function _selectChange(theRootDollar, opts, selectYear, selectedMonth) {
        var d = new Date(selectYear, selectedMonth - 1, 1);
        opts.month = d.getMonth();
        opts.year = d.getFullYear();
        theRootDollar.jcalendar(opts);
    }

    /**
    * Get current calendar's state (month and year)
    */
    $.fn.jcalendar.getState = function (div) {
        var st = div.find('.state')[0].innerHTML.split('.');
        return [parseInt(st[0], 10), parseInt(st[1], 10)];
    };

    /**
    * Format number (pad with zero)
    * @param {Integer} num
    */
    function _formatNum(num) {
        num = parseInt(num, 10);
        if (num < 10) {
            return '0' + num;
        }
        return num;
    };

    /**
    * Default options
    */
    $.fn.jcalendar.defaults = {
        /**
        * Names of week's days
        */
        days: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],

        /**
        * Month names
        */
        months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
                 'September', 'October', 'November', 'December'],

        /**
        * Link to be assigned for each link in cell:
        *   e.g.: http://snowcore.net/events/{%dd}-{%mm}-{%yyyy}
        * 
        * Possible values:
        *   {%dd} - date with leading zero
        *   {%d}  - date without leading zero
        *   {%mm} - month with leading zero
        *   {%m}  - month without leading zero
        *   {%yy} - yar (two digits)
        *   {%yyyy}  - full year (for digits)
        */
        linkFormat: null,

        LocaleDisplay: 'en',

        /**
        * Format for date in 'rel' attribute (onSelect callback function retrieves this value)
        * Formatting options are the same as for 'linkFormat' option
        * Default: mm.dd.yyyy ('{%dd}.{%mm}.{%yyyy}')
        */
        dateFormat: '{%dd}.{%mm}.{%yyyy}',

        selectedDate: new Date(),

        tableWidth: '168px',

        /**
        * Callback function, fires when user click on the cell
        * Function retrives one parameter - date
        * (in format that has been assigned by 'dateFormat' option):
        */
        onSelect: null,

        /**
        * When set to true, full year is displaying in the calendar caption
        */
        showYear: false,

        /**
        * Prev/Next arrows (you can also use &larr; and &rarr;)
        */
        prevArrow: '&laquo;',
        nextArrow: '&raquo;'
    };
})(jQuery);
