﻿
    function GoToNextPage(controller) {
        var pageNumber = GetCurrentPage(controller);
        ShowList(controller, pageNumber + 1);
    }
    
    function GoToPrevPage(controller) {
        var pageNumber = GetCurrentPage(controller);
        ShowList(controller, pageNumber - 1);
    }
    
    function GoToFirstPage(controller) {
        ShowList(controller, 1);
    }

    function GoToLastPage(controller) {
        ShowList(controller, 0);
    }
    
    function GetCurrentPage(controller)
    {
        var oSpan = document.getElementById(controller + "CurrentPage");
        if (oSpan)
            return parseInt(oSpan.firstChild.nodeValue);        
    }
     
    function ShowList(controller, pageNumber)
    {
        try
        {
            var sb = new StringBuilder();
            sb.append("Show").append(controller).append("List(").append(pageNumber).append(")");
            eval(sb.toString());
        }        
        catch(e)
        {
            var actionUrl = CreateActionUrl(controller, "ShowList");
            var showRecycledBin = IsRecycledBin();
            var url = CreateUrl(actionUrl, "pageNumber", pageNumber, "deleted", showRecycledBin, "filter", GetListFilter());
            Request.executeRefresh(url);
        }
    }

    function IsRecycledBin() {
        var oSelect = document.getElementById("RecycledBin");
        if (!oSelect) {
            return false;
        }
        return (oSelect.value == "0");
    }
    
    function CreateActionUrl(controller, action)
    {
        var template = GetControllerUrl(controller);
        return template.replace("_______", action);
    }
    
    function GetControllerUrl(controller)
    {
        var oHidden = document.getElementById(controller + "_Controller");
        if (oHidden == null)
        {
            alert(CONTROLLER_URL_NOT_FOUND);
            return null;
        }
        return oHidden.value;
    }

    function GetListFilter() {
        var oFilter = document.getElementById(FilterElementID);
        if (oFilter == null)
            return "";

        if (oFilter.className != "FilterActive")
            return "";

        return encodeURI(oFilter.value);
    }
    
    function GetStateValue(key)
    {
        var oHidden = document.getElementById(key);
        if (oHidden == null)
            alert(HIDDEN_NOT_FOUND + key);
        return oHidden.value;
    }

    function GetControllerValue(key) {
        var oHidden = document.getElementById(key);
        if (oHidden == null)
            alert(HIDDEN_NOT_FOUND + key);
        return oHidden.value;
    }
    
    function ShowGalleryList(pageNumber)
    {
        var actionUrl = CreateActionUrl("Gallery", "ShowList");
        var fileType = GetStateValue("Gallery_FileType");
        var deleted = IsRecycledBin();      
        var url = CreateUrl(actionUrl, "pageNumber", pageNumber, "selectedType", fileType, "deleted", deleted);        
        Request.executeRefresh(url);
    } 
    
    function ShowSmsList(pageNumber) {
        var actionUrl = CreateActionUrl("Sms", "ShowList");
        var folderType = GetStateValue("SelectedFolder");        
        var deleted = false;
        if (folderType.charAt(0) == "_") {
            deleted = true;
            folderType = folderType.substr(1);
        }
        var url = CreateUrl(actionUrl, "pageNumber", pageNumber, "folderType", folderType, "deleted", deleted);        
        Request.executeRefresh(url);
    } 
    
    function ShowHomeList(pageNumber)
    {
        var actionUrl = CreateActionUrl("Home", "ShowGalleryList");
        var url = CreateUrl(actionUrl, "pageNumber", pageNumber);        
        Request.executeRefresh(url, "", "HomeGalleryPlaceHolder");
    }
   
    function AjaxRedirectToLogin(sHtml) {
        if (sHtml.substr(0, 9) == "<!DOCTYPE") {
            var sUrl = CreateActionUrl("Authentication", "Logout");
            location.href = sUrl;
            return true;
        }
        return false;   
    }


var StringBuilder = function()
{
    this._parts = [];    
}    

function StringBuilder$append(text)
{
    this._parts[this._parts.length] = text;
    return this;
}

function StringBuilder$toString()
{
    return this._parts.join('');
}

StringBuilder.prototype = 
{
    append : StringBuilder$append,
    toString : StringBuilder$toString
}

var HttpRequest = function() {
    var _this = this;

    this.xmlHttp = null;
    this.callback = null;
    this.targetID = null;
    this.aborted = false;

    this.oldWaitState = null;

    this.listener = function _onReadyStateChange() {
        if (_this.xmlHttp.readyState === 4) {
            var html = _this.xmlHttp.responseText;

            // Mozilla workaround: when aborted Mozilla returns ""
            if (_this.aborted && html == "")
                return;

            _this.waitState(false);
            try { _this.xmlHttp.onreadystatechange = null; } catch (e) { }
            // Check for action cancelled
            if (_this.xmlHttp.status == 0)
                return;
            // Check for HttpError
            if (_this.xmlHttp.status !== 200) {
                alert(XML_HTTP_STATUS + _this.xmlHttp.status);
                document.body.innerHTML = html;
                return;
            }
            _this.callback(html);
        }
    }
}

function HttpRequest$execute(url, xml)
{
    this.ensureCanSend();
    
    this.xmlHttp = CreateXmlHttp(this.xmlHttp);
    
    if (xml == null)
        xml = "";
        
    this.waitState(true);

    this.xmlHttp.open("POST", url, true);
    this.xmlHttp.onreadystatechange = this.listener;
    this.xmlHttp.send(xml);
}

function HttpRequest$ensureCanSend()
{
    if (this.xmlHttp == null)
        return;
    var state = this.xmlHttp.readyState;
    if (state == 4 || state == 0) {
        this.aborted = false;
        return;
    }
    
    this.aborted = true;
    
    this.waitState(false);
}

function HttpRequest$executeCallback(callback, url, xml)
{
    if (eval("typeof(" + callback + ")") != "function")
    {
        alert(CALLBACK_NOT_FOUND + callback);
        return;
    }
    
    this.callback = eval(callback);
    this.execute(url, xml);
}

function HttpRequest$waitState(enable) {
    if (typeof (this.waitCallback) == "function") {
        var bContinue = this.waitCallback(enable);
        if ( ! bContinue)
            return;
    }
    
    if (enable)
    {
        this.oldWaitState = document.body.style.cursor;
        document.body.style.cursor = "wait";
    }
    else
        document.body.style.cursor = this.oldWaitState;
}

function HttpRequest$executeRefresh(url, xml, containerID)
{
    if (containerID == null)
        containerID = DefaultUpdatePanelID;
    
    this.targetID = containerID;
    this.callback = this.populateElement;
    this.waitCallback = null;
    
    this.execute(url, xml);
}

function HttpRequest$populateElement(html) {
    if (typeof (this.targetID) != "string")
    {
        alert(TARGET_ID_UNDEFINED);
        return;
    }
    // Check for redirect to login
    if (AjaxRedirectToLogin(html))
        return;
         
    var oContainer = document.getElementById(this.targetID);
    if (oContainer == null)
    {
        alert(ELEMENT_NOT_FOUND + this.targetID);
        return;
    }
    oContainer.innerHTML = html;
    InitUploadify();
}

HttpRequest.prototype = 
{
    execute : HttpRequest$execute,
    ensureCanSend : HttpRequest$ensureCanSend,
    executeCallback : HttpRequest$executeCallback,
    executeRefresh : HttpRequest$executeRefresh,
    populateElement: HttpRequest$populateElement,
    waitState: HttpRequest$waitState
}

function CreateXmlHttp(old) {
    if (old != null)
        return old;
        
    var xmlHttp = null;
    if (window.XMLHttpRequest)
    {
        // code for IE7, Firefox, Opera, etc.
        xmlHttp=new XMLHttpRequest();
    }
    else if (window.ActiveXObject)
    {
        // code for IE6, IE5
        xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    if (xmlHttp != null)
        return xmlHttp;        

    alert(XML_HTTP_NOT_SUPPORTED);
}

window.Request = new HttpRequest();

var UrlHelper = function ()
{
    this._queryString = null;    
}

function UrlHelper$populate()
{
    this._queryString = new Array ();
    var urlParts = location.href.split('?');
    if (urlParts.length != 2)
        return;
    var params = urlParts[1].split('&');
    for(var i=0; i < params.length; i++)
    {
        var paramParts = params[i].split('=');
        this._queryString[paramParts[0]] = unescape(paramParts[1]);
    }
    
}

function UrlHelper$getValue(paramName)
{
    if (this._queryString == null)
        this.populate();
    
    return this._queryString[paramName];
}

UrlHelper.prototype = 
{
    populate : UrlHelper$populate,
    getValue : UrlHelper$getValue
}

window.Url = new UrlHelper();

    
function CreateUrl()
{
    var sb = new StringBuilder ();
    sb.append(arguments[0]);
    
    if (arguments.length > 1)
        sb.append("?");
    else
        return sb.toString();
    
    var i = 1;
    while(true)
    {
        sb.append(arguments[i++]);
        sb.append("=");
        sb.append(arguments[i++]);
        
        if ( i < arguments.length)
            sb.append("&");
        else
            break;
    }
    
    return sb.toString();
}    

function GetAppRootUrl()
{
    var oHidden = document.getElementById("ApplicationRootUrl");
    if (!oHidden)
    {   
        alert(ROOT_URL_NOT_FOUND);
        return;
    }
    return oHidden.value;
}

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); };
String.prototype.parseInt = function() {
    var headZeroRemoved = this.replace(/^0+/g, '');
    var re = new RegExp("^\\d*$", "g"); // Mozilla bug: "test()" does not work with reg exp in canonical form (/xxx/y)
    var digitsOnly = re.test(headZeroRemoved);
    if (! digitsOnly)
        return NaN;
    return (headZeroRemoved == "") ? 0 : parseInt(headZeroRemoved);
};
String.prototype.compareDate = function(after, sSep) {
    var oFormat = CelleSync.DateTimeFormatIns;
    var date1 = oFormat.Parse(this);
    var date2 = oFormat.Parse(after);
    if (date1 == null || date2 == null)
        return null;
    var year = date1.getFullYear().compare(date2.getFullYear());
    if (year != 0)
        return year;
    var month = date1.getMonth().compare(date2.getMonth());
    if (month != 0)
        return month;

    return (date1.getDate().compare(date2.getDate())); // Day
}
String.prototype.compareTime = function(after, sSep) {
    var time1 = this.parseIntArray(sSep);
    var time2 = after.parseIntArray(sSep);
    if (time1.length != 2 || time2.length != 2)
        return null;
    var hour = time1[0].compare(time2[0]);
    if (hour != 0)
        return hour;
    return (time1[1].compare(time2[1])); // Minute
}
String.prototype.parseIntArray = function(sep) {
    var parts = this.split(sep);
    for(var i=0; i < parts.length; i++)
        parts[i] = parts[i].parseInt();
    return parts;
}
Number.prototype.compare = function(n2) {
    if (isNaN(this) || isNaN(n2))
        return null;
    if (this < n2) return -1;
    if (this == n2) return 0;
    return 1;
}
var DefaultUpdatePanelID = "MasterContentBox";
var FilterElementID = "txtFilter";

//var CONTROLLER_URL_NOT_FOUND = "Controller url not found";
//var XML_HTTP_NOT_SUPPORTED = "Your browser does not support XMLHttp. Cannot proceed";
//var TARGET_ID_UNDEFINED = "this.targetID is undefined";
//var TARGET_ID_UNDEFINED = "this.targetID is undefined";
//var ELEMENT_NOT_FOUND = "Element not found. ID: ";
//var XML_HTTP_STATUS = "XmlHttpStatus is ";
//var HIDDEN_NOT_FOUND = "Hidden element not found. ID: ";
//var CALLBACK_NOT_FOUND = "Callback not found: ";
//var FAILED_TO_ACCESS_OPENER = "Failed to access opener window. Check your security settings";
//var FAILED_TO_EXECUTE_CALLBACK = "Failed to execute callback: ";

//var MUST_SELECT_ITEMS = "Please select items you want by clicking checkboxes and then click this button.";
//var CONFIRM_DELETE_FILES = "Delete checked files?";
//var CONFIRM_DELETE_SMS = "Delete checked messages?";
//var CONFIRM_DELETE_CONTACTS = "Delete checked contacts?";
//var CONFIRM_DELETE_EVENT = "Are you sure you want to delete the event?";

//var SYNC_SMS_OK = "Your device will be automatically Synced in a few seconds";
//var SYNC_SMS_FAILED = "Failed to send sync request";